Files
client/node_modules/@vue/runtime-vapor/dist/runtime-vapor.esm-bundler.js
T

9343 lines
350 KiB
JavaScript
Raw Normal View History

2026-10-07 18:56:27 +02:00
/**
* @vue/runtime-vapor v3.6.0-rc.10
* (c) 2018-present Yuxi (Evan) You and Vue contributors
* @license MIT
**/
import { Comment as Comment$1, EffectScope, Fragment, NULL_DYNAMIC_COMPONENT, Static, TransitionPropsValidators, VaporSlot, VueElementBase, activate, baseApplyTranslation, baseEmit, baseNormalizePropsOptions, baseResolveTransitionHooks, callPendingCbs, callWithAsyncErrorHandling, callWithErrorHandling, checkTransitionMode, cloneVNode, createAppAPI, createAsyncComponentContext, createCanSetSetupRefChecker, createCommentVNode, createInternalObject, createVNode, currentInstance, currentInstance as currentInstance$1, deactivate, defaultPropGetter, devtoolsComponentAdded, endMeasure, ensureHydrationRenderer, ensureRenderer, ensureValidVNode, expose, filterModelListeners, flushOnAppMount, forceReflow, getAttributeMismatch, getComponentName, getContainerType, getFunctionalFallthrough, getInheritedScopeIds, getTransitionRawChildren, handleError, handleMovedChildren, hasCSSTransform, initFeatureFlags, invalidateMount, invokeDirectiveHook, invokeSlotFallback, invokeVNodeHook, isAsyncWrapper, isEmitListener, isFunctionalFallthroughKey, isHydrating, isHydratingEnabled, isKeepAlive, isMapEqual, isMismatchAllowed, isSetEqual, isTeleportDeferred, isTeleportDisabled, isTemplateNode, isTemplateRefKey, isUnchangedResourceProp, isVNode, isValidHtmlOrSvgAttribute, knownTemplateRefs, leaveCbKey, logMismatchError, markAsyncBoundary, matches, mergeProps, nextUid, normalizeContainer, normalizeRef, normalizeVNode, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onMounted, onScopeDispose, onUpdated, parseEventName, patchClass, patchStyle, performAsyncHydrate, performTransitionEnter, performTransitionLeave, popWarningContext, prepareTransitionLeave, prepareTransitionSwitch, pushWarningContext, queueJob, queuePostFlushCb, queuePostRenderEffect, rawVaporSlotKey, registerHMR, renderSlot, resetShapeFlag, resolveComponent, resolveCssVars, resolveDynamicComponent, resolvePropValue, resolveTeleportTarget, resolveTransitionChild, resolveTransitionProps, restoreCurrentInstance, setCurrentInstance, setCurrentRenderingInstance, setDevtoolsHook, setRef, setTransitionHooks, setVarsOnNode, shallowReactive, shallowRef, shouldSetAsProp, shouldSetAsPropForVueCE, shouldUpdateComponent, simpleSetCurrentInstance, startMeasure, toClassSet, toHandlers, toStyleMap, unregisterHMR, unsafeToTrustedHTML, useAsyncComponentState, useTransitionState, vModelCheckboxInit, vModelCheckboxUpdate, vModelGetValue, vModelSelectInit, vModelSetSelected, vModelTextInit, vModelTextUpdate, vShowHidden, vShowOriginalDisplay, validateProps, warn, warnExtraneousAttributes, warnPropMismatch, watch, withCtx, withKeys, withModifiers, xlinkNS } from "@vue/runtime-dom";
import { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, camelize, canSetValueDirectly, extend, extend as extend$1, getEscapedCssVarName, getGlobalThis, getSequence, hasChanged, hasOwn, includeBooleanAttr, invokeArrayFns, isArray, isForwardedSlot, isFunction, isModelListener, isObject, isOn, isPlainObject, isPromise, isReservedProp, isSpecialBooleanAttr, isString, isSymbol, looseEqual, normalizeClass, normalizeCssVarValue, normalizeStyle, parseStringStyle, remove as remove$1, slotInheritsFallback, slotNotifiesBoundary, stringifyStyle, toDisplayString } from "@vue/shared";
import { Dep, EffectScope as EffectScope$1, ReactiveEffect, activeSub, computed, effectScope, endBatch, getCurrentScope, isReactive, isReadonly, isRef, isShallow, markRaw, onEffectCleanup, onScopeDispose as onScopeDispose$1, proxyRefs, setActiveSub, setCurrentScope, shallowReactive as shallowReactive$1, shallowReadArray, shallowRef as shallowRef$1, startBatch, toRaw, toReactive, toReadonly, trackDep, traverse, triggerDep, unref, watch as watch$1 } from "@vue/reactivity";
//#region packages/runtime-vapor/src/insertionState.ts
let insertionParent;
let insertionAnchor;
let insertionIndex;
/**
* This function is called before a block type that requires insertion
* (component, slot outlet, if, for) is created.
*
* - `anchor` is a Node: insert before this template `<!>` placeholder during
* client render; during hydration the located placeholder unit is the
* block's hydration target.
* - `anchor` is a number: append; the value is the hydration start unit index
* (the count of preceding logical units), omitted by codegen when 0.
* - `anchor` absent: append with no preceding units.
*/
function setInsertionState(parent, anchor) {
insertionParent = parent;
if (typeof anchor === "number") {
insertionAnchor = void 0;
insertionIndex = anchor;
} else {
insertionAnchor = anchor;
insertionIndex = void 0;
}
}
function resetInsertionState() {
insertionParent = insertionAnchor = insertionIndex = void 0;
}
//#endregion
//#region packages/runtime-vapor/src/dom/node.ts
const SVG_NS = "http://www.w3.org/2000/svg";
const MATHML_NS = "http://www.w3.org/1998/Math/MathML";
/*@__NO_SIDE_EFFECTS__*/
function createElement(tagName, ns) {
return ns ? document.createElementNS(ns === 1 ? SVG_NS : MATHML_NS, tagName) : document.createElement(tagName);
}
let t;
function parseTemplate(html, ns) {
t = t || document.createElement("template");
if (ns) {
const tag = ns === 1 ? "svg" : "math";
t.innerHTML = `<${tag}>${html}</${tag}>`;
return /* @__PURE__ */ _child(/* @__PURE__ */ _child(t.content));
}
t.innerHTML = html;
return /* @__PURE__ */ _child(t.content);
}
/*@__NO_SIDE_EFFECTS__*/
function createTextNode(value = "") {
return document.createTextNode(value);
}
/*@__NO_SIDE_EFFECTS__*/
function createComment(data) {
return document.createComment(data);
}
/*@__NO_SIDE_EFFECTS__*/
function querySelector(selectors) {
return document.querySelector(selectors);
}
/* @__NO_SIDE_EFFECTS__ */
function parentNode(node) {
return node.parentNode;
}
/*@__NO_SIDE_EFFECTS__*/
function txt(node) {
if (isHydrating$1) {
let n = /* @__PURE__ */ _child(node);
if (!n) return node.appendChild(/* @__PURE__ */ createTextNode());
return n;
}
return /* @__PURE__ */ _child(node);
}
/*@__NO_SIDE_EFFECTS__*/
function child(node, isText) {
if (isHydrating$1) {
const n = locateChildByLogicalIndex(node, 0);
return isText ? resolveBlankTextTarget(n, node) : n;
}
return /* @__PURE__ */ _child(node);
}
/*@__NO_SIDE_EFFECTS__*/
function nthChild(node, i, isText) {
if (isHydrating$1) {
const n = locateChildByLogicalIndex(node, i);
return isText ? resolveBlankTextTarget(n, node) : n;
}
return node.childNodes[i];
}
/*@__NO_SIDE_EFFECTS__*/
function next(node, isText) {
if (isHydrating$1) {
let result = nextLogicalSibling(node);
const parent = node.parentNode;
if (isText) result = resolveBlankTextTarget(result, parent);
if (parent) updateLastLocatedLogicalChild(parent, node, result, 1);
return result;
}
return /* @__PURE__ */ _next(node);
}
/*@__NO_SIDE_EFFECTS__*/
function _child(node) {
return node.firstChild;
}
/*@__NO_SIDE_EFFECTS__*/
function _next(node) {
return node.nextSibling;
}
const cachedParents = [];
function setLastLocatedLogicalChild(parent, child, logicalIndex) {
if (parent.$llc === void 0) cachedParents.push(parent);
parent.$llc = child;
parent.$lli = logicalIndex;
}
function releaseLocatorCache() {
for (let i = 0; i < cachedParents.length; i++) cachedParents[i].$llc = void 0;
cachedParents.length = 0;
}
function locateChildByLogicalIndex(parent, logicalIndex) {
let child;
let fromIndex;
if (parent.$llc) {
child = parent.$llc;
fromIndex = parent.$lli;
} else {
child = skipUntrackedAnchors(parent.firstChild);
fromIndex = 0;
}
if (logicalIndex < fromIndex) {
child = skipUntrackedAnchors(parent.firstChild);
fromIndex = 0;
}
while (child) {
if (fromIndex === logicalIndex) {
setLastLocatedLogicalChild(parent, child, logicalIndex);
return child;
}
child = nextLogicalSibling(child);
fromIndex++;
}
return null;
}
function updateLastLocatedLogicalChild(parent, from, to, logicalIndexOffset = 0) {
const insertionParent = parent;
if (insertionParent.$llc === from) {
insertionParent.$llc = to;
insertionParent.$lli += logicalIndexOffset;
}
}
//#endregion
//#region packages/runtime-vapor/src/renderContext.ts
let currentRenderContext = {
slotOwner: null,
slotBoundary: null,
slotScopeIds: null,
suspense: null
};
function setRenderContext(ctx) {
const prev = currentRenderContext;
currentRenderContext = ctx;
return prev;
}
function withRenderContext(ctx, fn) {
if (ctx === currentRenderContext) return fn();
const prev = setRenderContext(ctx);
try {
return fn();
} finally {
currentRenderContext = prev;
}
}
function deriveRenderContext(base, slotOwner, slotBoundary, slotScopeIds, suspense) {
return slotOwner === base.slotOwner && slotBoundary === base.slotBoundary && slotScopeIds === base.slotScopeIds && suspense === base.suspense ? base : {
slotOwner,
slotBoundary,
slotScopeIds,
suspense
};
}
function deriveSlotOwner(base, slotOwner) {
return deriveRenderContext(base, slotOwner, base.slotBoundary, base.slotScopeIds, base.suspense);
}
function deriveSlotBoundary(base, slotBoundary) {
return deriveRenderContext(base, base.slotOwner, slotBoundary, base.slotScopeIds, base.suspense);
}
function deriveSlotScopeIds(base, slotScopeIds) {
return deriveRenderContext(base, base.slotOwner, base.slotBoundary, slotScopeIds, base.suspense);
}
function deriveSuspense(base, suspense) {
return deriveRenderContext(base, base.slotOwner, base.slotBoundary, base.slotScopeIds, suspense);
}
//#endregion
//#region packages/runtime-vapor/src/dom/scopeIdStamp.ts
function setElementScopeIds(el, scopeIds) {
for (let i = 0; i < scopeIds.length; i++) el.setAttribute(scopeIds[i], "");
}
function setElementScopeIdsDeep(el, scopeIds) {
setElementScopeIds(el, scopeIds);
let child = el.firstElementChild;
while (child) {
setElementScopeIdsDeep(child, scopeIds);
child = child.nextElementSibling;
}
}
/**
* Stamped-variant cache: ids are written once per (template prototype × id
* cell) and clones inherit them via cloneNode. Never stale because scope ids
* are compile-time constants; entries are freed with their cell (WeakMap key).
*/
const stampedTemplates = /* @__PURE__ */ new WeakMap();
function cloneStampedTemplate(prototype, scopeIds) {
if (prototype.nodeType !== 1) return prototype.cloneNode(true);
let variants = stampedTemplates.get(prototype);
if (!variants) stampedTemplates.set(prototype, variants = /* @__PURE__ */ new WeakMap());
let stamped = variants.get(scopeIds);
if (!stamped) {
stamped = prototype.cloneNode(true);
setElementScopeIdsDeep(stamped, scopeIds);
variants.set(scopeIds, stamped);
}
return stamped.cloneNode(true);
}
//#endregion
//#region packages/runtime-vapor/src/dom/hydration.ts
const START_TAG_RE = /^<([^\s/>]+)/;
let isHydratingEnabled$1 = false;
function setIsHydratingEnabled(value) {
isHydratingEnabled$1 = value;
}
let currentHydrationNode = null;
let isHydrating$1 = false;
function setIsHydrating(value) {
if (!isHydratingEnabled$1 && !isHydrating && !isHydratingEnabled) return false;
try {
return isHydrating$1;
} finally {
isHydrating$1 = value;
}
}
let deferredHydrationBoundaryDepth = 0;
function isInDeferredHydrationBoundary() {
return deferredHydrationBoundaryDepth > 0;
}
function withDeferredHydrationBoundary(fn) {
deferredHydrationBoundaryDepth++;
try {
return fn();
} finally {
deferredHydrationBoundaryDepth--;
}
}
function runWithoutHydration(fn) {
const prev = setIsHydrating(false);
try {
return fn();
} finally {
setIsHydrating(prev);
}
}
let isHydratingSlotFallback = false;
function withHydratingSlotFallback(fn) {
const prev = isHydratingSlotFallback;
isHydratingSlotFallback = true;
try {
runWithoutHydration(fn);
} finally {
isHydratingSlotFallback = prev;
}
}
let isOptimized$1 = false;
let hydrationDepth = 0;
let liveCursors = 0;
function performHydration(fn, setup, cleanup) {
if (!isOptimized$1) {
adoptTemplate = adoptTemplateImpl;
locateHydrationNode = locateHydrationNodeImpl;
parseAdoptTarget = parseAdoptTargetImpl;
Comment.prototype.$fe = void 0;
Node.prototype.$llc = void 0;
Node.prototype.$lli = void 0;
Node.prototype.$vha = 0;
Node.prototype.$rcn = void 0;
isOptimized$1 = true;
}
const prev = setIsHydrating(true);
const prevHydrationNode = currentHydrationNode;
currentHydrationNode = null;
hydrationDepth++;
try {
setup();
return fn();
} finally {
cleanup();
currentHydrationNode = prevHydrationNode;
setIsHydrating(prev);
if (--hydrationDepth === 0) {
releaseLocatorCache();
if (!!(process.env.NODE_ENV !== "production")) {
if (liveCursors > 0) warn(`${liveCursors} hydration cursor(s) were never exited. The enclosing scope's resume point is lost, so the cursor will drift. This is likely a Vue internal bug.`);
liveCursors = 0;
}
}
}
}
function withHydration(container, fn) {
const setup = () => setInsertionState(container);
const cleanup = () => resetInsertionState();
return performHydration(fn, setup, cleanup);
}
function hydrateNode(node, fn) {
const setup = () => setCurrentHydrationNode(node);
const cleanup = () => {};
return performHydration(fn, setup, cleanup);
}
let adoptTemplate;
let locateHydrationNode;
let parseAdoptTarget;
const isRangeStart = (node) => node.nodeType === 8 && (node.data === "[" || node.data === "(");
const isRangeEnd = (node) => node.nodeType === 8 && (node.data === "]" || node.data === ")");
const isComment = (node, data) => node.nodeType === 8 && node.data === data;
function createFragmentClaim() {
return { start: null };
}
/** Consume the fragment start under the cursor for `claim`. */
function claimFragmentStart(claim) {
const node = currentHydrationNode;
if (node && isRangeStart(node)) {
claim.start = node;
setCurrentHydrationNode(node.nextSibling);
}
}
function setCurrentHydrationNode(node) {
currentHydrationNode = skipUntrackedAnchors(node);
}
function advanceHydrationNode(node) {
let next = skipUntrackedAnchors(node.nextSibling);
if (next && currentHydrationNode === next) return;
while (!next) {
const parent = node.parentNode;
if (!parent) break;
node = parent;
next = skipUntrackedAnchors(node.nextSibling);
}
if (currentHydrationNode !== next) currentHydrationNode = next;
}
function enterHydrationCursor(claim, isBlankText) {
const cursor = captureHydrationCursor();
locateHydrationNode(claim, isBlankText);
cursor.start = currentHydrationNode;
return cursor;
}
/**
* Capture the outer resume cursor without locating a start node, for dynamic
* wrappers whose inner owner locates the local start later, after the selected
* inner path is known. This avoids consuming insertion state too early.
*/
function captureHydrationCursor() {
if (!!(process.env.NODE_ENV !== "production")) liveCursors++;
return {
start: null,
resume: insertionParent ? currentHydrationNode : void 0
};
}
function exitHydrationCursor(cursor) {
if (!cursor) return;
if (!!(process.env.NODE_ENV !== "production")) {
if (cursor.exited) {
warn(`Hydration cursor was exited twice. This is likely a Vue internal bug.`);
return;
}
cursor.exited = true;
liveCursors--;
}
if (cursor.resume !== void 0) setCurrentHydrationNode(cursor.resume);
}
/**
* Locate the first non-fragment-comment node and locate the next node
* while handling potential fragments.
*/
function adoptTemplateImpl(node, template, adoptChildren = false, ns, target = parseAdoptTargetImpl(template)) {
if (target.type !== 8) node = target.blank ? resolveBlankTextTarget(node, /* @__PURE__ */ parentNode(node)) : resolveHydrationTarget(node);
if (!matchesAdoptTarget(node, target)) node = handleMismatch(node, template, adoptChildren, ns);
advanceHydrationNode(node);
return node;
}
function nextLogicalSibling(node) {
return skipUntrackedAnchors(isRangeStart(node) ? locateEndAnchor(node).nextSibling : isComment(node, "teleport start") ? locateEndAnchor(node, "teleport start", "teleport end").nextSibling : node.nextSibling);
}
/** Advance past anchors that occupy no SSR logical position. */
function skipUntrackedAnchors(node) {
while (node !== null && node.$vha & 2) node = node.nextSibling;
return node;
}
function locateHydrationNodeImpl(claim, isBlankText) {
let node;
if (insertionAnchor) node = insertionAnchor;
else if (insertionParent) {
node = locateChildByLogicalIndex(insertionParent, insertionIndex || 0);
if (!node && isBlankText) {
node = resolveBlankTextTarget(null, insertionParent);
setLastLocatedLogicalChild(insertionParent, node, insertionIndex || 0);
}
} else node = currentHydrationNode;
if (!!(process.env.NODE_ENV !== "production") && !node) throw new Error("No current hydration node was found.\nthis is likely a Vue internal bug.");
resetInsertionState();
setCurrentHydrationNode(node);
if (claim) claimFragmentStart(claim);
}
/**
* The end anchor of the SSR fragment starting at `node`, or null when `node`
* is not a fragment start.
*/
function locateFragmentEnd(node) {
return node && isRangeStart(node) ? locateEndAnchor(node) : null;
}
function locateEndAnchor(node, open = node.data, close = open === "(" ? ")" : "]") {
if (node.$fe) return node.$fe;
const stack = [node];
while ((node = /* @__PURE__ */ _next(node)) && stack.length > 0) if (node.nodeType === 8) {
if (node.data === open) {
if (node.$fe) node = node.$fe;
else stack.push(node);
} else if (node.data === close) {
const matchingOpen = stack.pop();
matchingOpen.$fe = node;
if (stack.length === 0) return node;
}
}
return null;
}
/**
* The close marker of a claimed range once its content hydrated. The cursor
* normally rests on it, so only a mismatch pays for the walk from `start`.
*/
function locateClaimedEnd(start) {
const node = currentHydrationNode;
if (node && isComment(node, start.data === "(" ? ")" : "]") && !isClaimedAnchor(node)) return start.$fe = node;
return locateEndAnchor(start);
}
function handleMismatch(node, template, adoptChildren, ns) {
warnHydrationNodeMismatch(node, template);
if (isRangeStart(node)) removeFragmentNodes(node);
const shouldPreserveAnchor = isClaimedAnchor(node);
const container = /* @__PURE__ */ parentNode(node);
const next = shouldPreserveAnchor ? node : /* @__PURE__ */ _next(node);
if (!shouldPreserveAnchor) remove(node, container);
if (template[0] !== "<") {
const newNode = markRecreatedNode(/* @__PURE__ */ createTextNode(template));
container.insertBefore(newNode, next);
if (!shouldPreserveAnchor) updateLastLocatedLogicalChild(container, node, newNode);
return newNode;
}
const newNode = parseTemplate(template, ns).cloneNode(true);
markRecreatedNode(newNode);
if (newNode.nodeType === 1) {
const descendants = newNode.querySelectorAll("*");
for (let i = 0; i < descendants.length; i++) markRecreatedNode(descendants[i]);
const slotScopeIds = currentRenderContext.slotScopeIds;
if (slotScopeIds) setElementScopeIdsDeep(newNode, slotScopeIds);
}
if (adoptChildren && node.nodeType === 1 && !newNode.firstChild) {
let child = node.firstChild;
while (child) {
const nextChild = child.nextSibling;
newNode.appendChild(child);
child = nextChild;
}
}
container.insertBefore(newNode, next);
if (!shouldPreserveAnchor) updateLastLocatedLogicalChild(container, node, newNode);
return newNode;
}
function parseAdoptTargetImpl(template) {
let type;
let tag = null;
let tagUpper = null;
let blank = false;
if (template[0] !== "<") {
type = 3;
blank = template.trim() === "";
} else if (template[1] === "!") type = 8;
else {
type = 1;
const match = START_TAG_RE.exec(template);
if (match) {
tag = match[1].toLowerCase();
tagUpper = match[1].toUpperCase();
}
}
return {
type,
tag,
tagUpper,
blank
};
}
/**
* Whether a server-rendered node can be adopted for the given client
* template: the node type must match the template's expected type, and
* element tags must match exactly — a prefix check is not enough
* (e.g. a server `<i>` must not be adopted for a client `<ins>`).
* The uppercase identity compare handles HTML elements without allocating;
* the lowercase fallback covers case-preserving foreign elements (SVG/MathML).
*/
function matchesAdoptTarget(node, target) {
if (node.nodeType !== target.type) return false;
if (target.type !== 1) return true;
return !target.tag || node.tagName === target.tagUpper || node.tagName.toLowerCase() === target.tag;
}
function validateHydrationTarget(node, template) {
if (!matchesAdoptTarget(node, parseAdoptTargetImpl(template))) warnHydrationNodeMismatch(node, template);
}
function hydrateTextNode(node, expected) {
if (node.nodeType !== 3) return false;
const text = node;
if (text.data === expected) return true;
const parent = text.parentElement;
if (parent && !isMismatchAllowed(parent, 0)) {
(process.env.NODE_ENV !== "production" || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warnHydrationTextMismatch(text, expected);
logMismatchError();
}
text.data = expected;
return true;
}
function warnHydrationTextMismatch(node, expected) {
warn(`Hydration text mismatch in`, node.parentNode, `\n - rendered on server: ${JSON.stringify(node.data)}\n - expected on client: ${JSON.stringify(expected)}`);
}
function warnHydrationNodeMismatch(node, expected) {
if (!isMismatchAllowed(node.parentElement, 1)) {
(process.env.NODE_ENV !== "production" || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn(`Hydration node mismatch:\n- rendered on server:`, node, node.nodeType === 3 ? `(text)` : isRangeStart(node) ? `(start of fragment)` : ``, `\n- expected on client:`, expected);
logMismatchError();
}
}
function removeFragmentNodes(node, endAnchor) {
const parent = /* @__PURE__ */ parentNode(node);
if (!parent) return;
const end = endAnchor || locateEndAnchor(node);
while (true) {
const next = /* @__PURE__ */ _next(node);
if (next && next !== end) remove(next, parent);
else break;
}
}
function removeHydrationNode(node, close = null) {
const parent = /* @__PURE__ */ parentNode(node);
if (!parent) return;
if (isRangeStart(node)) {
const end = locateEndAnchor(node);
removeFragmentNodes(node, end || void 0);
const endParent = end && /* @__PURE__ */ parentNode(end);
if (end && end !== close && endParent) remove(end, endParent);
} else if (isComment(node, "teleport start")) {
const end = locateEndAnchor(node, "teleport start", "teleport end");
removeFragmentNodes(node, end || void 0);
const endParent = end && /* @__PURE__ */ parentNode(end);
if (end && end !== close && endParent) remove(end, endParent);
}
remove(node, parent);
}
/**
* Removes unclaimed server-rendered nodes and reports a children mismatch.
* Trims `node` alone by default, the rest of `container`'s child list when
* `container` is given, or the logical siblings up to `close` when leaving a
* hydration boundary (which also moves the cursor onto `close`). Range cleanup
* keeps reused hydration anchors in place.
*/
function cleanupHydrationTail(node, container, close = null) {
if (close) {
let cur = node;
let hasRemovableNode = false;
while (cur && cur !== close) {
if (!isClaimedAnchor(cur)) hasRemovableNode = true;
cur = nextLogicalSibling(cur);
}
if (!cur) return;
if (!hasRemovableNode) {
setCurrentHydrationNode(close);
return;
}
}
const mismatchContainer = container || node.parentElement;
if (mismatchContainer instanceof Element) warnHydrationChildrenMismatch(mismatchContainer);
if (!container && !close) {
removeHydrationNode(node);
return;
}
let current = node;
while (current && current !== close && (!container || current.parentNode === container)) {
const next = nextLogicalSibling(current);
if (!isClaimedAnchor(current)) removeHydrationNode(current, close);
current = next;
}
if (close) setCurrentHydrationNode(close);
}
/**
* Claim a node as some fragment's insertion anchor standing AT an SSR
* logical position. Claiming a previously untracked anchor promotes it into
* the position stream — a revived deferred branch does this when its runtime
* anchor takes over the logical unit the branch occupies. Use
* `claimUntrackedAnchor` for an anchor that must stay invisible to traversal.
*/
function claimAnchor(node) {
node.$vha = 1;
return node;
}
/**
* Claim a node as an anchor that holds no SSR logical position, so hydration
* traversal steps over it and inserting one mid-pass cannot shift the
* positions the server output defines. See `2`.
*/
function claimUntrackedAnchor(node) {
node.$vha = 3;
return node;
}
/**
* Whether some fragment owns this node as its insertion anchor, whatever its
* origin. Cleanup and mismatch recovery must leave it in place.
*/
function isClaimedAnchor(node) {
return !!node && !!(node.$vha & 1);
}
function markRecreatedNode(node) {
node.$rcn = 1;
return node;
}
function isRecreatedNode(node) {
return !!node && node.$rcn === 1;
}
/**
* SSR omits empty text nodes. Block owners consume their opening markers
* before template adoption. Preserve any remaining boundary or sibling while
* seeding the missing text at its logical position.
*/
function resolveBlankTextTarget(node, parent) {
node = skipUntrackedAnchors(node);
if (node && node.nodeType === 3) return node;
const text = /* @__PURE__ */ createTextNode();
parent.insertBefore(text, node);
if (node) updateLastLocatedLogicalChild(parent, node, text);
return text;
}
function resolveHydrationTarget(node) {
while (true) {
const flags = node.$vha;
if (flags) {
if (!(flags & 2)) return node;
} else if (!(isRangeStart(node) || isRangeEnd(node) || isComment(node, "teleport start") || isComment(node, "teleport end"))) return node;
const next = node.nextSibling;
if (!next) return node;
node = next;
}
}
function warnHydrationChildrenMismatch(container) {
if (container && !isMismatchAllowed(container, 1)) {
(process.env.NODE_ENV !== "production" || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn(`Hydration children mismatch on`, container, `\nServer rendered element contains more child nodes than client nodes.`);
logMismatchError();
}
}
function enterHydrationBoundary(close) {
return () => trimHydrationBoundary(close);
}
/** Trim the unclaimed SSR nodes left between the cursor and `close`. */
function trimHydrationBoundary(close) {
const node = currentHydrationNode;
if (close && node && node !== close && !(close.compareDocumentPosition(node) & 4)) cleanupHydrationTail(node, void 0, close);
}
//#endregion
//#region packages/runtime-vapor/src/vdomInteropState.ts
let isInteropEnabled = false;
function setInteropEnabled() {
isInteropEnabled = true;
}
const interopKey = Symbol(`interop`);
/**
* Carries the live VDOM slots ref on the raw-slots object handed to a vapor
* component mounted from VDOM. Replaces the old overloaded `_` key, which
* elsewhere means SlotFlags (vdom slots) or VaporSlotStability (slot
* functions).
*/
const interopSlotsKey = Symbol(`interopSlots`);
//#endregion
//#region packages/runtime-vapor/src/componentEmits.ts
/**
* The logic from core isn't too reusable so it's better to duplicate here
*/
function normalizeEmitsOptions(comp) {
const cached = comp.__emitsOptions;
if (cached) return cached;
const raw = comp.emits;
if (!raw) return null;
let normalized;
if (isArray(raw)) {
normalized = {};
for (const key of raw) normalized[key] = null;
} else normalized = raw;
return comp.__emitsOptions = normalized;
}
function emit(instance, event, ...rawArgs) {
const vnode = isInteropEnabled && instance.interopVNode;
baseEmit(instance, vnode ? vnode.props || EMPTY_OBJ : instance.rawValues, defaultPropGetter, event, ...rawArgs);
}
//#endregion
//#region packages/runtime-vapor/src/once.ts
/**
* Whether the code running now belongs to a v-once region: slot content or
* fallback rendered by a `<slot v-once>`, or a compiled v-once directive.
* While set, renderEffect runs its function once instead of creating an
* effect. Every component boundary resets it (Vapor setup, vdom mount), and
* deferred work captures it at creation. Call sites test `inOnce` first so
* the common path pays neither the closure nor the call.
*/
let inOnce = false;
function withOnce(fn, value = true) {
if (inOnce === value) return fn();
const prev = inOnce;
try {
inOnce = value;
return fn();
} finally {
inOnce = prev;
}
}
//#endregion
//#region packages/runtime-vapor/src/suspense.ts
let isSuspenseEnabled = false;
let currentUnmountSuspense;
function enableSuspense() {
isSuspenseEnabled = true;
}
function setCurrentUnmountSuspense(suspense) {
try {
return currentUnmountSuspense;
} finally {
currentUnmountSuspense = suspense;
}
}
/**
* Establishes `suspense` as the active unmount pass's boundary around `fn`.
* The single entry point for the ambient: unmountComponent and the interop
* vnode unmount re-enter through this when their explicit argument differs
* from the active pass.
*/
function runWithUnmountSuspense(suspense, fn) {
const prev = setCurrentUnmountSuspense(suspense);
try {
return fn();
} finally {
setCurrentUnmountSuspense(prev);
}
}
/**
* The effective boundary for a teardown reached without a parameter channel —
* scope-disposal callbacks and block removal: the active unmount pass's
* boundary when one is set, the caller's fallback otherwise.
*/
function resolveUnmountSuspense(fallback) {
return currentUnmountSuspense === void 0 ? fallback : currentUnmountSuspense;
}
//#endregion
//#region packages/runtime-vapor/src/renderEffect.ts
var RenderEffect = class extends ReactiveEffect {
constructor(render, noLifecycle = false) {
super(noLifecycle ? render : void 0);
this.render = render;
const instance = currentInstance;
if (isInteropEnabled && instance && !instance.vapor && !instance.effectCount) instance.effectCount = 1;
this.order = instance ? instance.effectCount++ : 0;
if (!!(process.env.NODE_ENV !== "production") && !this.subs && !isVaporComponent(instance)) warn("renderEffect called without active EffectScope or Vapor instance.");
if (!!(process.env.NODE_ENV !== "production") && instance && !noLifecycle) {
this.onTrack = instance.rtc ? (e) => invokeArrayFns(instance.rtc, e) : void 0;
this.onTrigger = instance.rtg ? (e) => invokeArrayFns(instance.rtg, e) : void 0;
}
this.i = instance;
this.job = void 0;
this.flags |= 128;
}
createJob() {
const job = () => {
if (!(this.flags & 256) && this.dirty) {
const deferred = isSuspenseEnabled && this.i && this.i.deferredKeepAliveUpdates;
if (deferred) {
if (isDeferredKeepAliveStateLive(deferred)) {
deferred.effects.push(job);
return;
}
settleDeferredKeepAliveUpdates(deferred, job);
return;
}
this.run();
}
};
if (this.i) job.i = this.i;
job.flags |= 2;
return this.job = job;
}
fn() {
const instance = this.i;
const scope = this.subs ? this.subs.sub : void 0;
const hasUpdateHooks = instance && (instance.bu || instance.u);
if (!!(process.env.NODE_ENV !== "production") && instance) startMeasure(instance, `renderEffect`);
const prev = setCurrentInstance(instance, scope);
try {
if (hasUpdateHooks && instance.isMounted && !instance.isUpdating) {
instance.isUpdating = true;
try {
instance.bu && invokeArrayFns(instance.bu);
this.render();
} catch (err) {
instance.isUpdating = false;
throw err;
}
let updateJob = this.updateJob;
if (!updateJob) updateJob = this.updateJob = () => {
instance.isUpdating = false;
instance.u && invokeArrayFns(instance.u);
};
queuePostRenderEffect(updateJob, void 0, instance.suspense);
} else this.render();
} finally {
restoreCurrentInstance(prev);
if (!!(process.env.NODE_ENV !== "production") && instance) endMeasure(instance, `renderEffect`);
}
}
notify() {
if (!(this.flags & 256)) queueJob(this.job || this.createJob(), this.i ? this.i.uid : void 0, false, this.order);
}
};
function renderEffect(fn, noLifecycle = false) {
if (inOnce) return fn();
new RenderEffect(fn, noLifecycle).run();
}
//#endregion
//#region packages/runtime-vapor/src/componentProps.ts
function resolveSource(source) {
return isFunction(source) ? resolveFunctionSource(source) : source;
}
function resolveFunctionSource(source) {
if (source._cache) return source._cache.value;
const parent = currentInstance && currentInstance.parent;
if (parent) {
const prev = setCurrentInstance(parent, getCurrentScope());
try {
source._cache = computed((oldValue) => {
const prevInner = setCurrentInstance(parent);
try {
return stabilizeDynamicSourceValue(oldValue, source());
} finally {
restoreCurrentInstance(prevInner);
}
});
onScopeDispose$1(() => source._cache = void 0);
} finally {
restoreCurrentInstance(prev);
}
return source._cache.value;
}
return source();
}
function snapshotRawProps(rawProps) {
const snapshot = Object.create(null);
for (const key in rawProps) if (key !== "$") snapshot[key] = freezeValue(key, readSource(rawProps[key]));
const dynamicSources = rawProps.$;
if (dynamicSources) {
const snapshotSources = [];
for (let i = 0; i < dynamicSources.length; i++) {
const source = dynamicSources[i];
const isDynamic = isFunction(source);
const resolved = readSource(source) || EMPTY_OBJ;
const value = Object.create(null);
for (const key in resolved) value[key] = freezeValue(key, isDynamic ? resolved[key] : readSource(resolved[key]));
snapshotSources[i] = value;
}
const symbols = Object.getOwnPropertySymbols(dynamicSources);
for (let i = 0; i < symbols.length; i++) snapshotSources[symbols[i]] = dynamicSources[symbols[i]];
snapshot.$ = snapshotSources;
}
return snapshot;
}
function readSource(source) {
return isFunction(source) ? source() : source;
}
function freezeValue(key, value) {
value = normalizePropValue(key, value);
return isFunction(value) ? () => value : value;
}
function normalizePropValue(key, value, prevValue) {
if (key === "class") return value && !isString(value) ? normalizeClass(value) : value;
return key === "style" && isObject(value) ? stabilizeDynamicSourceValue(prevValue, normalizeStyle([value])) : value;
}
function stabilizeDynamicSourceValue(oldValue, value) {
if (!isPlainObject(oldValue) || !isPlainObject(value)) return value;
const oldKeys = Object.keys(oldValue);
const newKeys = Object.keys(value);
if (oldKeys.length !== newKeys.length) return value;
for (let i = 0; i < newKeys.length; i++) {
const key = newKeys[i];
if (!hasOwn(oldValue, key) || !Object.is(oldValue[key], value[key])) return value;
}
return oldValue;
}
function getPropsProxyHandlers(comp) {
if (comp.__propsHandlers) return comp.__propsHandlers;
const propsOptions = normalizePropsOptions(comp)[0];
const emitsOptions = normalizeEmitsOptions(comp);
const isProp = propsOptions ? (key) => isString(key) && hasOwn(propsOptions, camelize(key)) : NO;
const isAttr = propsOptions || emitsOptions ? (key) => isString(key) && key !== "$" && !isReservedProp(key) && !isProp(key) && !isEmitListener(emitsOptions, key) : (key) => isString(key) && !isReservedProp(key);
const getProp = (instance, key) => {
if (key === "__v_isReactive" || key === "__v_isShallow") return true;
if (isProp(key)) {
trackPropsValue(instance, key);
return instance.propsValues[key];
}
};
const propsHandlers = propsOptions ? {
get: getProp,
has: (_, key) => isProp(key),
ownKeys: () => Object.keys(propsOptions),
getOwnPropertyDescriptor(target, key) {
if (isProp(key)) return {
configurable: true,
enumerable: true,
get: () => getProp(target, key)
};
}
} : null;
if (!!(process.env.NODE_ENV !== "production") && propsOptions) Object.assign(propsHandlers, {
set: propsSetDevTrap,
deleteProperty: propsDeleteDevTrap
});
const getAttr = (instance, key) => {
if (isAttr(key)) {
trackPropsValue(instance, key);
return instance.propsValues[key];
}
};
const hasAttr = (instance, key) => {
if (!isAttr(key)) return false;
trackPropsValue(instance, key);
return hasOwn(instance.propsValues, key);
};
const attrsHandlers = {
get: getAttr,
has: hasAttr,
ownKeys(target) {
trackPropsValue(target, ATTR_KEYS);
return Object.keys(target.propsValues).filter(isAttr);
},
getOwnPropertyDescriptor(target, key) {
if (hasAttr(target, key)) return {
configurable: true,
enumerable: true,
get: () => getAttr(target, key)
};
}
};
if (!!(process.env.NODE_ENV !== "production")) Object.assign(attrsHandlers, {
set: propsSetDevTrap,
deleteProperty: propsDeleteDevTrap
});
return comp.__propsHandlers = [propsHandlers, attrsHandlers];
}
function getAttrFromRawProps(rawProps, key) {
if (key === "$") return;
const dynamicSources = rawProps.$;
const isEvent = dynamicSources && isString(key) && isOn(key);
const merged = key === "class" || key === "style" || isEvent ? [] : void 0;
if (dynamicSources) {
let i = dynamicSources.length;
let source, isDynamic;
while (i--) {
source = dynamicSources[i];
isDynamic = isFunction(source);
source = isDynamic ? resolveFunctionSource(source) : source;
if (source && hasOwn(source, key)) {
const value = isDynamic ? source[key] : resolveSource(source[key]);
if (merged) merged.push(value);
else return value;
}
}
}
if (hasOwn(rawProps, key)) {
const value = resolveSource(rawProps[key]);
if (merged) merged.push(value);
else return value;
}
if (merged && merged.length) {
merged.reverse();
return isEvent ? merged.reduce(mergeEventHandlers) : merged;
}
}
function mergeEventHandlers(existing, incoming) {
if (!existing) return incoming;
return incoming && existing !== incoming && !(isArray(existing) && existing.includes(incoming)) ? [].concat(existing, incoming) : existing;
}
function hasAttrFromRawProps(rawProps, key) {
if (key === "$") return false;
const dynamicSources = rawProps.$;
if (dynamicSources) {
let i = dynamicSources.length;
while (i--) {
const source = resolveSource(dynamicSources[i]);
if (source && hasOwn(source, key)) return true;
}
}
return hasOwn(rawProps, key);
}
function getKeysFromRawProps(rawProps) {
const keys = [];
for (const key in rawProps) if (key !== "$") keys.push(key);
const dynamicSources = rawProps.$;
if (dynamicSources) {
let i = dynamicSources.length;
let source;
while (i--) {
source = isFunction(dynamicSources[i]) ? resolveFunctionSource(dynamicSources[i]) : dynamicSources[i];
for (const key in source) keys.push(key);
}
}
return Array.from(new Set(keys));
}
function normalizePropsOptions(comp) {
const cached = comp.__propsOptions;
if (cached) return cached;
const raw = comp.props;
if (!raw) return EMPTY_ARR;
const normalized = {};
const needCastKeys = [];
baseNormalizePropsOptions(raw, normalized, needCastKeys);
return comp.__propsOptions = [normalized, needCastKeys];
}
function resolveDefault(factory, instance) {
const prev = setCurrentInstance(instance);
try {
return factory.call(null, instance.props);
} finally {
restoreCurrentInstance(prev);
}
}
function hasFallthroughAttrs(comp, rawProps) {
if (rawProps) {
if (rawProps.$ || isInteropEnabled && rawProps[interopKey]) return true;
const propsOptions = comp.props ? normalizePropsOptions(comp)[0] : null;
for (const key in rawProps) if (!propsOptions || !hasOwn(propsOptions, camelize(key))) return true;
}
return false;
}
function resolveDynamicProps(props) {
const mergedRawProps = {};
for (const key in props) if (key !== "$") mergedRawProps[key] = resolveSource(props[key]);
if (props.$) for (const source of props.$) {
const isDynamic = isFunction(source);
const resolved = isDynamic ? resolveFunctionSource(source) : source;
for (const key in resolved) {
const value = isDynamic ? resolved[key] : resolveSource(source[key]);
if (key === "class" || key === "style") {
const existing = mergedRawProps[key];
mergedRawProps[key] = isArray(existing) ? [...existing, value] : [existing, value];
} else if (isOn(key)) mergedRawProps[key] = mergeEventHandlers(mergedRawProps[key], value);
else mergedRawProps[key] = value;
}
}
return mergedRawProps;
}
function getStaticBindingKeys(props) {
const keys = [];
for (const key in props) if (key !== "$" && isFunction(props[key])) keys.push(key);
if (props.$) {
for (const source of props.$) if (!isFunction(source)) {
for (const key in source) if (isFunction(source[key])) keys.push(key);
}
}
return keys;
}
function propsSetDevTrap(_, key) {
warn(`Attempt to mutate prop ${JSON.stringify(key)} failed. Props are readonly.`);
return true;
}
function propsDeleteDevTrap(_, key) {
warn(`Attempt to delete prop ${JSON.stringify(key)} failed. Props are readonly.`);
return true;
}
const rawPropsProxyHandlers = {
get: getAttrFromRawProps,
has: hasAttrFromRawProps,
ownKeys: getKeysFromRawProps,
getOwnPropertyDescriptor(target, key) {
if (hasAttrFromRawProps(target, key)) return {
configurable: true,
enumerable: true,
get: () => getAttrFromRawProps(target, key)
};
}
};
const RAW_VALUES_KEY = Symbol(!!(process.env.NODE_ENV !== "production") ? "Raw values" : "");
const ATTR_KEYS = Symbol(!!(process.env.NODE_ENV !== "production") ? "Attr keys" : "");
const INITIAL_RAW_VALUES = {};
function trackPropsValue(instance, key) {
if (!instance.hasDynamicProps || activeSub === void 0) return;
const deps = instance.propsDeps || (instance.propsDeps = /* @__PURE__ */ new Map());
let dep = deps.get(key);
if (!dep) deps.set(key, dep = new Dep(deps, key));
trackDep(dep, instance.propsValues, key);
}
function triggerPropsValue(instance, key, newValue, oldValue) {
const deps = instance.propsDeps;
if (deps) {
const dep = deps.get(key);
if (dep) triggerDep(dep, instance.propsValues, key, newValue, oldValue);
}
}
function trackRawValues(instance) {
trackPropsValue(instance, RAW_VALUES_KEY);
return instance.rawValues;
}
function initInputs(instance, once = false) {
const scope = instance.inputScope || instance.scope;
const prevEffect = instance.inputEffect;
if (prevEffect) prevEffect.stop();
const parent = instance.parent || instance;
const rawProps = instance.rawProps;
const cells = instance.slotSources;
const prev = setCurrentInstance(parent, scope);
try {
const dynamicSources = rawProps.$;
const isInterop = isInteropEnabled && !!rawProps[interopKey];
const canRebind = !!instance.inputScope;
const hasGetters = hasDynamicPropsSource(rawProps);
if (once || !cells && (isInterop || !canRebind && !hasGetters)) {
instance.hasDynamicProps = !once && isInterop;
deliverInputs(instance, isInterop ? rawProps : collectInputs(rawProps, cells), cells);
return;
}
instance.hasDynamicProps = canRebind || hasGetters;
const hasStaticKeys = !dynamicSources;
let hasDelivered = false;
const effect = new RenderEffect(() => {
const prevRawValues = instance.rawValues;
const prevInner = setCurrentInstance(parent, scope);
let rawValues;
let propsToUpdate;
try {
if (!hasDelivered || instance.hasDynamicProps) {
if (hasDelivered && hasStaticKeys) propsToUpdate = collectPropsToUpdate(rawProps, prevRawValues);
else {
rawValues = collectProps(rawProps, prevRawValues.style);
if (hasDelivered && stabilizeDynamicSourceValue(prevRawValues, rawValues) === prevRawValues) rawValues = void 0;
}
}
if (cells) collectSlotSources(cells);
} finally {
restoreCurrentInstance(prevInner);
}
if (effect.active) {
hasDelivered = false;
deliverInputs(instance, rawValues, cells, propsToUpdate);
hasDelivered = true;
}
}, true);
if (canRebind) instance.inputEffect = effect;
if (!prevEffect) {
effect.run();
if (!effect.deps && !canRebind) {
effect.stop();
instance.hasDynamicProps = false;
}
} else {
if (scope.flags & 256) effect.pause();
effect.notify();
}
} finally {
restoreCurrentInstance(prev);
}
}
function collectInputs(rawProps, cells) {
const prevSub = setActiveSub();
try {
const rawValues = collectProps(rawProps);
if (cells) collectSlotSources(cells);
return rawValues;
} finally {
setActiveSub(prevSub);
}
}
function deliverInputs(instance, rawValues, cells, propsToUpdate) {
const prevSub = setActiveSub();
startBatch();
try {
if (instance && (rawValues || propsToUpdate)) updateProps(instance, rawValues || instance.rawValues, propsToUpdate);
if (cells) commitSlotSources(cells);
} finally {
try {
endBatch();
} finally {
setActiveSub(prevSub);
}
}
}
function collectSlotSources(cells) {
for (let i = 0; i < cells.length; i++) {
const cell = cells[i];
cell.next = cell.source();
}
}
function commitSlotSources(cells) {
for (let i = 0; i < cells.length; i++) {
const cell = cells[i];
const next = stabilizeDynamicSourceValue(cell.committed, cell.next);
cell.next = void 0;
if (hasChanged(next, cell.committed)) {
cell.committed = next;
triggerDep(cell);
}
}
}
function hasDynamicPropsSource(rawProps) {
if (rawProps.$) return true;
for (const key in rawProps) if (isFunction(rawProps[key])) return true;
return false;
}
function collectProps(rawProps, prevStyle) {
const rawValues = Object.create(null);
const dynamicSources = rawProps.$ || EMPTY_ARR;
for (let i = -1; i < dynamicSources.length; i++) {
const source = i < 0 ? rawProps : dynamicSources[i];
const isDynamic = isFunction(source);
const resolved = isDynamic ? source() : source;
for (const key in resolved) {
if (i < 0 && key === "$") continue;
const value = isDynamic ? resolved[key] : readSource(resolved[key]);
if (!dynamicSources.length) rawValues[key] = value;
else if (key === "class") {
if (rawValues.class !== value) rawValues.class = normalizeClass([rawValues.class, value]);
} else if (key === "style") rawValues.style = normalizeStyle([rawValues.style, value]);
else if (isOn(key)) {
const existing = rawValues[key];
if (value && existing !== value && !(isArray(existing) && existing.includes(value))) rawValues[key] = existing ? [].concat(existing, value) : value;
else if (value == null && existing == null && !isModelListener(key)) rawValues[key] = value;
} else if (key !== "") rawValues[key] = value;
}
}
if (dynamicSources.length) {
if (rawValues.style) rawValues.style = stabilizeDynamicSourceValue(prevStyle, rawValues.style);
} else {
if (rawValues.class) rawValues.class = normalizePropValue("class", rawValues.class);
if (rawValues.style) rawValues.style = normalizePropValue("style", rawValues.style, prevStyle);
}
return rawValues;
}
function collectPropsToUpdate(rawProps, prevRawValues) {
let propsToUpdate;
for (const key in rawProps) {
const source = rawProps[key];
if (isFunction(source)) {
const prevValue = prevRawValues[key];
const value = normalizePropValue(key, source(), prevValue);
if (hasChanged(value, prevValue)) (propsToUpdate || (propsToUpdate = [])).push(key, value);
}
}
return propsToUpdate;
}
function updateProps(instance, rawValues, propsToUpdate) {
const propsValues = instance.propsValues;
const [options, needCastKeys] = normalizePropsOptions(instance.type);
const emitsOptions = normalizeEmitsOptions(instance.type);
const prevRawValues = instance.rawValues;
const isInitial = prevRawValues === INITIAL_RAW_VALUES;
if (propsToUpdate) for (let i = 0; i < propsToUpdate.length; i += 2) rawValues[propsToUpdate[i]] = propsToUpdate[i + 1];
else if (!isInitial) rawValues = stabilizeDynamicSourceValue(prevRawValues, rawValues);
instance.rawValues = rawValues;
if (propsToUpdate || !isInitial && rawValues !== prevRawValues) triggerPropsValue(instance, RAW_VALUES_KEY);
const vnode = isInteropEnabled && instance.interopVNode;
if (vnode && vnode.vi) vnode.props = rawValues;
const present = propsToUpdate || isInitial ? void 0 : Object.create(null);
let rawCastValues;
const keys = propsToUpdate || Object.keys(rawValues);
for (let i = 0; i < keys.length; i += propsToUpdate ? 2 : 1) {
let key = keys[i];
if (isReservedProp(key)) continue;
const value = rawValues[key];
const camelKey = camelize(key);
if (options && hasOwn(options, camelKey)) {
key = camelKey;
if (needCastKeys && needCastKeys.includes(key)) {
if (!rawCastValues) rawCastValues = Object.create(null);
rawCastValues[key] = value;
continue;
}
} else if (isEmitListener(emitsOptions, key)) continue;
if (present) present[key] = true;
setPropValue(instance, key, value, isInitial);
}
if (needCastKeys && (rawCastValues || !propsToUpdate)) for (let i = 0; i < needCastKeys.length; i++) {
const key = needCastKeys[i];
const isAbsent = !rawCastValues || !hasOwn(rawCastValues, key);
if (isAbsent && propsToUpdate) continue;
setPropValue(instance, key, resolvePropValue(options, key, isAbsent ? void 0 : rawCastValues[key], instance, resolveDefault, isAbsent), isInitial);
if (present) present[key] = true;
}
if (!propsToUpdate) {
for (const key in options) if (present ? !present[key] : !hasOwn(propsValues, key)) {
setPropValue(instance, key, resolvePropValue(options, key, void 0, instance, resolveDefault, true), isInitial);
if (present) present[key] = true;
}
if (present) {
for (const key in propsValues) if (!present[key]) {
const oldValue = propsValues[key];
delete propsValues[key];
triggerPropsValue(instance, key, void 0, oldValue);
triggerPropsValue(instance, ATTR_KEYS);
}
}
}
if (!!(process.env.NODE_ENV !== "production") && options) {
pushWarningContext(instance);
try {
validateProps(rawValues, instance.props, options);
} finally {
popWarningContext();
}
}
}
function setPropValue(instance, key, value, isInitial) {
const propsValues = instance.propsValues;
if (isInitial) {
propsValues[key] = value;
return;
}
const hadKey = hasOwn(propsValues, key);
const oldValue = propsValues[key];
propsValues[key] = value;
if (!hadKey) {
triggerPropsValue(instance, key, value);
triggerPropsValue(instance, ATTR_KEYS);
} else if (hasChanged(value, oldValue)) triggerPropsValue(instance, key, value, oldValue);
}
//#endregion
//#region packages/runtime-vapor/src/dom/event.ts
function addEventListener(el, event, handler, options) {
el.addEventListener(event, handler, options);
return () => el.removeEventListener(event, handler, options);
}
function on(el, event, handler, options) {
if (isArray(handler)) handler.forEach((fn) => on(el, event, fn, options));
else {
if (!handler) return;
el.addEventListener(event, createInvoker(handler), options);
}
}
function onBinding(el, event, handler, options) {
if (isArray(handler)) {
handler.forEach((fn) => onBinding(el, event, fn, options));
return;
}
if (!handler) return;
if (options && options.once) {
const firedKey = `$evtonce_${options.capture ? 1 : 0}_${event}`;
if (el[firedKey]) return;
const invoker = handler;
handler = (...args) => {
el[firedKey] = true;
return invoker(...args);
};
}
const cleanup = addEventListener(el, event, createInvoker(handler), options);
onEffectCleanup(cleanup);
}
/**
* A dynamic listener keeps one native listener per key across effect re-runs,
* like a vdom invoker. A root's own `on*` binding and the fallthrough one are
* two layers of it: the own handlers run first, then the fallthrough ones not
* already among them, so re-binding either layer keeps that order. #15635
*/
function setListener(el, key, value) {
const invokers = el.$vei || (el.$vei = {});
const invoker = invokers[key] || (invokers[key] = {
own: null,
attrs: null,
handlers: null,
remove: void 0,
fired: false
});
const layer = isApplyingFallthroughProps ? "attrs" : "own";
invoker[layer] = value;
if (composeHandlers(invoker).length) {
if (!invoker.remove && !invoker.fired) attachInvoker(el, key, invoker);
} else if (invoker.remove) {
invoker.remove();
invoker.remove = void 0;
}
onEffectCleanup(() => {
invoker[layer] = null;
invoker.handlers = null;
});
}
function composeHandlers(invoker) {
const { own, attrs } = invoker;
const handlers = invoker.handlers = [];
if (isArray(own)) {
for (const fn of own) if (fn) handlers.push(fn);
} else if (own) handlers.push(own);
if (attrs) {
const ownCount = handlers.length;
for (const fn of isArray(attrs) ? attrs : [attrs]) if (fn) {
const at = handlers.indexOf(fn);
if (at < 0 || at >= ownCount) handlers.push(fn);
}
}
return handlers;
}
function attachInvoker(el, key, invoker) {
const [event, options] = parseEventName(key);
const once = !!options && options.once;
const i = currentInstance;
invoker.remove = addEventListener(el, event, (e) => {
if (once) invoker.fired = true;
const handlers = invoker.handlers || composeHandlers(invoker);
if (handlers.length > 1) {
const originalStop = e.stopImmediatePropagation;
e.stopImmediatePropagation = () => {
originalStop.call(e);
e._stopped = true;
};
}
const args = [e];
for (const handler of handlers) {
if (e._stopped) break;
callWithAsyncErrorHandling(handler, i, 5, args);
}
}, options);
}
function delegate(el, event, handler) {
const key = `$evt${event}`;
const existing = el[key];
const invoker = createInvoker(handler);
if (existing) {
if (isArray(existing)) existing.push(invoker);
else el[key] = [existing, invoker];
} else el[key] = invoker;
}
/**
* Event delegation borrowed from solid
*/
const delegatedEvents = /*@__PURE__*/ Object.create(null);
const delegateEvents = (...names) => {
for (const name of names) if (!delegatedEvents[name]) {
delegatedEvents[name] = true;
document.addEventListener(name, delegatedEventHandler);
}
};
const delegatedEventHandler = (e) => {
let node = e.composedPath && e.composedPath()[0] || e.target;
if (e.target !== node) Object.defineProperty(e, "target", {
configurable: true,
value: node
});
Object.defineProperty(e, "currentTarget", {
configurable: true,
get() {
return node || document;
}
});
while (node !== null) {
const handlers = node[`$evt${e.type}`];
if (handlers) {
if (isArray(handlers)) {
for (const handler of handlers) if (!node.disabled) {
handler(e);
if (e.cancelBubble) return;
}
} else if (!node.disabled) {
handlers(e);
if (e.cancelBubble) return;
}
}
node = node.host && node.host !== node && node.host instanceof Node ? node.host : node.parentNode;
}
};
function withVaporModifiers(fn, modifiers) {
return createInvoker(typeof fn === "function" ? withModifiers(fn, modifiers) : fn);
}
function withVaporKeys(fn, modifiers) {
return createInvoker(typeof fn === "function" ? withKeys(fn, modifiers) : fn);
}
function createInvoker(handler) {
const i = currentInstance;
return (...args) => callWithAsyncErrorHandling(handler, i, 5, args);
}
//#endregion
//#region packages/runtime-vapor/src/transition.ts
let applyTransitionHooks;
let applyTransitionLeaveHooks;
let deferBranchUpdateDuringLeave;
let removeBranchWithLeave;
let isTransitionEnabled = false;
function registerTransitionHooks(applyHooks, applyLeaveHooks, deferBranchUpdate, removeBranch) {
isTransitionEnabled = true;
applyTransitionHooks = applyHooks;
applyTransitionLeaveHooks = applyLeaveHooks;
deferBranchUpdateDuringLeave = deferBranchUpdate;
removeBranchWithLeave = removeBranch;
}
const displayName = "VaporTransition";
function isVaporTransition(component) {
return component.displayName === displayName;
}
//#endregion
//#region packages/runtime-vapor/src/dom/prop.ts
const shouldSkipFallthroughKey = (el, key) => {
const instance = currentInstance;
return !isApplyingFallthroughProps && el.$root && instance.hasFallthrough && instance.type.inheritAttrs !== false && key in instance.attrs && (!shouldUseFunctionalFallthrough(instance.type) || isFunctionalFallthroughKey(key));
};
function setProp(el, key, value) {
if (key in el) setDOMProp(el, key, value);
else setAttr(el, key, value);
}
function setAttr(el, key, value, isSVG = false, forceHydrate = true) {
if (shouldSkipFallthroughKey(el, key)) return;
if (key === "true-value") el._trueValue = value;
else if (key === "false-value") el._falseValue = value;
if (isHydrating$1 && !isRecreatedNode(el)) {
(process.env.NODE_ENV !== "production" || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && attributeHasMismatch(el, key, value);
if (skipHydratedWrite(el, key, value, forceHydrate)) {
el[`$${key}`] = value;
return;
}
}
if (value !== el[`$${key}`]) {
el[`$${key}`] = value;
if (isSVG && key.startsWith("xlink:")) {
if (value != null) el.setAttributeNS(xlinkNS, key, value);
else el.removeAttributeNS(xlinkNS, key.slice(6, key.length));
} else {
const isBoolean = isSpecialBooleanAttr(key);
if (value == null || isBoolean && !includeBooleanAttr(value)) el.removeAttribute(key);
else el.setAttribute(key, isBoolean ? "" : isSymbol(value) ? String(value) : value);
}
}
}
function setDOMProp(el, key, value, forceHydrate = true, attrName) {
if (shouldSkipFallthroughKey(el, key)) return;
const cacheKey = `$p$${key}`;
if (isHydrating$1 && !isRecreatedNode(el)) {
(process.env.NODE_ENV !== "production" || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && attributeHasMismatch(el, key, value);
if (skipHydratedWrite(el, key, value, forceHydrate)) {
el[cacheKey] = value;
return;
}
}
if (value === el[cacheKey] && cacheKey in el) return;
el[cacheKey] = value;
let needRemove = false;
if (value === "" || value == null) {
const type = typeof el[key];
if (type === "boolean") value = includeBooleanAttr(value);
else if (value == null && type === "string") {
value = "";
needRemove = true;
} else if (type === "number") {
value = 0;
needRemove = true;
}
}
try {
el[key] = value;
} catch (e) {
if (!!(process.env.NODE_ENV !== "production") && !needRemove) warn(`Failed setting prop "${key}" on <${el.tagName.toLowerCase()}>: value ${value} is invalid.`, e);
}
needRemove && el.removeAttribute(attrName || key);
if ((key === "checked" || key === "selected") && !el.tagName.includes("-")) includeBooleanAttr(value) ? el.setAttribute(key, "") : el.removeAttribute(key);
}
function setClass(el, value, isSVG = false, isNormalized = false) {
if (el.$clsFlags !== void 0) el.$clsFlags = void 0;
if (el.$root) setClassIncremental(el, value, isNormalized);
else {
if (!isNormalized) value = normalizeClass(value);
if (isHydrating$1 && !isRecreatedNode(el)) {
(process.env.NODE_ENV !== "production" || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && classHasMismatch(el, value, false);
el.$cls = value;
return;
}
if (value !== el.$cls) {
el.$cls = value;
if (isTransitionEnabled) patchClass(el, value, isSVG);
else if (isSVG) el.setAttribute("class", value);
else el.className = value;
}
}
}
function setClassName(el, flags, cls, prefix = "", suffix = "") {
if (flags === el.$clsFlags) return;
let value = prefix;
if (isString(cls)) {
if (flags & 1) value += cls;
} else for (let i = 0, bit = 1; i < cls.length; i++, bit <<= 1) if (flags & bit) value += cls[i];
if (!prefix && value.charCodeAt(0) === 32) value = value.slice(1);
if (suffix) value = value ? `${value} ${suffix}` : suffix;
if (el.$root || isHydrating$1) setClass(el, value, false, true);
else {
el.$cls = value;
if (isTransitionEnabled) patchClass(el, value, false);
else el.className = value;
}
el.$clsFlags = flags;
}
function setClassIncremental(el, value, isNormalized = false) {
const cacheKey = isApplyingFallthroughProps ? "$clsi$" : "$clsi";
const normalizedValue = isNormalized ? value : normalizeClass(value);
if (isHydrating$1 && !isRecreatedNode(el)) {
(process.env.NODE_ENV !== "production" || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && classHasMismatch(el, normalizedValue, true);
el[cacheKey] = normalizedValue;
return;
}
const prev = el[cacheKey];
if ((value = el[cacheKey] = normalizedValue) !== prev) {
const nextList = value.split(/\s+/);
if (value) el.classList.add(...nextList);
if (prev) {
let kept;
for (const cls of prev.split(/\s+/)) if (!nextList.includes(cls) && !(kept || (kept = keptClasses(el))).includes(cls)) el.classList.remove(cls);
}
}
}
function keptClasses(el) {
const other = isApplyingFallthroughProps ? el.$clsi : el.$clsi$;
return other !== void 0 ? other.split(/\s+/) : el.$root.cls || EMPTY_ARR;
}
function shouldDeferCheckStyleMismatch(el) {
return hasCssVarsInOwnerChain(currentInstance) || hasCssVars(el.style);
}
function hasCssVarsInOwnerChain(instance) {
while (instance) {
if (instance.getCssVars) return true;
instance = instance.parent;
}
return false;
}
function hasCssVars(style) {
for (let i = 0; i < style.length; i++) if (style.item(i).startsWith("--")) return true;
return false;
}
function checkHydrationStyleMismatch(el, value, normalizedValue, isIncremental) {
if (shouldDeferCheckStyleMismatch(el)) {
const instance = currentInstance;
queuePostFlushCb(() => {
styleHasMismatch(el, value, normalizedValue, isIncremental, instance);
});
} else styleHasMismatch(el, value, normalizedValue, isIncremental);
}
function setStyle(el, value) {
if (isHydrating$1 && isReactive(value)) for (const key in value) value[key];
if (el.$root) setStyleIncremental(el, value);
else {
const normalizedValue = normalizeStyle(value);
if (isHydrating$1 && !isRecreatedNode(el)) {
if (!!(process.env.NODE_ENV !== "production") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) checkHydrationStyleMismatch(el, value, normalizedValue, false);
el.$sty = normalizedValue;
hydrateVShowDisplay(el, normalizedValue);
return;
}
patchStyle(el, el.$sty, el.$sty = normalizedValue);
}
}
function setStyleIncremental(el, value) {
const normalizedValue = isString(value) ? parseStringStyle(value) : normalizeStyle(value);
el[isApplyingFallthroughProps ? "$styi$" : "$styi"] = normalizedValue;
let next = normalizedValue;
if ("$styi$" in el) {
const base = el.$styi !== void 0 ? el.$styi : el.$root.sty;
next = base ? extend$1({}, base, el.$styi$) : el.$styi$ || {};
}
if (isHydrating$1 && !isRecreatedNode(el)) {
if ((!!(process.env.NODE_ENV !== "production") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !shouldSkipFallthroughKey(el, "style")) checkHydrationStyleMismatch(el, next, next, true);
el.$sty = next;
hydrateVShowDisplay(el, next);
return;
}
patchStyle(el, el.$sty, el.$sty = next);
}
function hydrateVShowDisplay(el, style) {
if (vShowOriginalDisplay in el) {
let display = isString(style) ? parseStringStyle(style).display : style && style.display;
if (isArray(display)) display = display[display.length - 1];
el[vShowOriginalDisplay] = display == null ? "" : String(display).replace(/\s*!important$/, "");
}
}
function setValue(el, value, forceHydrate = true) {
if (shouldSkipFallthroughKey(el, "value")) return;
el._value = value;
if (isHydrating$1 && !isRecreatedNode(el)) {
(process.env.NODE_ENV !== "production" || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && attributeHasMismatch(el, "value", isString(value) ? getClientText(el, value) : value);
if (skipHydratedWrite(el, "value", value, forceHydrate)) return;
}
const oldValue = el.tagName === "OPTION" ? el.getAttribute("value") : el.value;
const newValue = value == null ? "" : value;
if (oldValue !== newValue) el.value = newValue;
if (value == null) el.removeAttribute("value");
else el.setAttribute("value", isSymbol(newValue) ? String(newValue) : newValue);
}
/**
* Only called on text nodes!
* Compiler should also ensure value passed here is already converted by
* `toDisplayString`
*/
function setText(el, value) {
if (isHydrating$1 && !isRecreatedNode(el) && !isRecreatedNode(el.parentNode)) {
const clientText = getClientText(el.parentNode, value);
if (el.nodeValue == clientText) {
el.$txt = clientText;
return;
}
const parent = el.parentElement;
if (parent && !isMismatchAllowed(parent, 0)) {
(process.env.NODE_ENV !== "production" || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warnHydrationTextMismatch(el, value);
logMismatchError();
}
}
if (el.$txt !== value) el.nodeValue = el.$txt = value;
}
/**
* Used by setDynamicProps and `textContent` bindings, so need to guard with
* `toDisplayString`
*/
function setElementText(el, value, forceHydrate = true) {
value = toDisplayString(value);
if (isHydrating$1 && !isRecreatedNode(el)) {
let clientText = getClientText(el, value);
if (el.textContent === clientText) {
el.$txt = clientText;
return;
}
if (!isMismatchAllowed(el, 0)) {
(process.env.NODE_ENV !== "production" || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn(`Hydration text content mismatch on`, el, `\n - rendered on server: ${el.textContent}\n - expected on client: ${clientText}`);
logMismatchError();
}
if (skipHydratedWrite(el, "textContent", value, forceHydrate)) {
el.$txt = value;
return;
}
}
if (el.$txt !== value) el.textContent = el.$txt = value;
}
function setHtml(el, value, forceHydrate = true) {
value = value == null ? "" : unsafeToTrustedHTML(value);
if (isHydrating$1 && !isRecreatedNode(el) && skipHydratedWrite(el, "innerHTML", value, forceHydrate)) {
el.$html = value;
return;
}
if (el.$html !== value) el.innerHTML = el.$html = value;
}
function setDynamicProps(el, args, staticKeys, isSVG) {
patchDynamicProps(el, args.length > 1 ? mergeProps(...args) : args[0] || EMPTY_OBJ, isSVG, staticKeys);
}
function setDynamicEvents(el, events) {
patchDynamicProps(el, toHandlers(events, true));
}
function patchDynamicProps(el, props, isSVG, staticKeys) {
const cacheKey = `$dprops${isApplyingFallthroughProps ? "$" : ""}`;
const prevProps = el[cacheKey];
const nextProps = Object.create(null);
if (prevProps) {
for (const key in prevProps) if (!(key in props)) setDynamicProp(el, key, null, isSVG);
}
const hydratedKeys = isHydrating$1 ? staticKeys : void 0;
for (const key of Object.keys(props)) {
if (isReservedProp(key)) continue;
const value = props[key];
nextProps[key] = value;
if (prevProps && key in prevProps && !isOn(key) && (value == null || typeof value !== "object") && Object.is(prevProps[key], value)) continue;
setDynamicProp(el, key, value, isSVG, hydratedKeys && hydratedKeys.includes(key));
}
el[cacheKey] = nextProps;
}
/**
* @internal
*/
function setDynamicProp(el, key, value, isSVG = false, forceHydrate = false) {
if (key === "class") setClass(el, value, isSVG);
else if (key === "style") setStyle(el, value);
else if (isOn(key)) setListener(el, key, value);
else if (key[0] === "." ? (key = key.slice(1), forceHydrate = true) : key[0] === "^" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, value, isSVG)) {
if (key === "innerHTML") setHtml(el, value, forceHydrate);
else if (key === "textContent") setElementText(el, value, forceHydrate);
else if (key === "value" && canSetValueDirectly(el.tagName)) setValue(el, value, forceHydrate);
else setDOMProp(el, key, value, forceHydrate);
} else if (el._isVueCE && (shouldSetAsPropForVueCE(el, key) || el._def.__asyncLoader && (/[A-Z]/.test(key) || !isString(value)))) setDOMProp(el, camelize(key), value, forceHydrate, key);
else setAttr(el, key, value, isSVG, forceHydrate);
return value;
}
let isOptimized = false;
/**
* Optimize property lookup for cache properties on Element and Text nodes
*/
function optimizePropertyLookup() {
if (isOptimized) return;
isOptimized = true;
const proto = Element.prototype;
proto.$transition = void 0;
proto.$key = void 0;
proto.$evtclick = void 0;
proto.$vei = void 0;
proto.$root = false;
proto.$clsFlags = void 0;
proto.$cls = proto.$sty = "";
proto.$html = void 0;
Text.prototype.$txt = void 0;
}
function classHasMismatch(el, expected, isIncremental) {
const actual = el.getAttribute("class");
const actualClassSet = toClassSet(actual || "");
const expectedClassSet = toClassSet(expected);
let hasMismatch = false;
if (isIncremental) {
if (expected) hasMismatch = Array.from(expectedClassSet).some((cls) => !actualClassSet.has(cls));
} else hasMismatch = !isSetEqual(actualClassSet, expectedClassSet);
if (hasMismatch) {
if (warnPropMismatch(el, "class", 2, actual, expected)) {
logMismatchError();
return true;
}
}
return false;
}
function styleHasMismatch(el, value, normalizedValue, isIncremental, instance = currentInstance) {
const actual = el.getAttribute("style");
const actualStyleMap = toStyleMap(actual || "");
const expected = isString(value) ? value : stringifyStyle(normalizedValue);
const expectedStyleMap = toStyleMap(expected);
if (el[vShowHidden]) expectedStyleMap.set("display", "none");
if (instance) resolveCssVars$1(instance, el, expectedStyleMap);
let hasMismatch = false;
if (isIncremental) {
if (expected) hasMismatch = Array.from(expectedStyleMap.entries()).some(([key, val]) => actualStyleMap.get(key) !== val);
} else hasMismatch = !isMapEqual(actualStyleMap, expectedStyleMap);
if (hasMismatch) {
if (warnPropMismatch(el, "style", 3, actual, expected)) {
logMismatchError();
return true;
}
}
return false;
}
/**
* dev only
*/
function resolveCssVars$1(instance, block, expectedMap) {
if (!instance.isMounted) return;
const rootBlocks = normalizeBlock(instance);
if (instance.getCssVars && normalizeBlock(block).every((b) => rootBlocks.includes(b))) {
const cssVars = instance.getCssVars();
for (const key in cssVars) {
const value = normalizeCssVarValue(cssVars[key]);
expectedMap.set(`--${getEscapedCssVarName(key, false)}`, value);
}
}
if (normalizeBlock(block).every((b) => rootBlocks.includes(b)) && instance.parent) {
if (isVaporComponent(instance.parent)) resolveCssVars$1(instance.parent, instance.block, expectedMap);
else if (isInteropEnabled && instance.interopVNode) resolveCssVars(instance.parent, instance.interopVNode, expectedMap);
}
}
function attributeHasMismatch(el, key, value) {
if (isValidHtmlOrSvgAttribute(el, key)) {
const { actual, expected } = getAttributeMismatch(el, key, value);
if (actual !== expected) {
if (warnPropMismatch(el, key, 4, actual, expected)) {
logMismatchError();
return true;
}
}
}
return false;
}
function getClientText(el, value) {
if (value[0] === "\n" && (el.tagName === "PRE" || el.tagName === "TEXTAREA")) value = value.slice(1);
return value;
}
function skipHydratedWrite(el, key, value, forceHydrate) {
return !forceHydrate && !shouldForceHydrate(el, key) || isUnchangedResourceProp(el, key, value);
}
function shouldForceHydrate(el, key) {
const { tagName } = el;
return (tagName === "INPUT" || tagName === "OPTION") && (key.endsWith("value") || key === "indeterminate") || tagName.includes("-");
}
//#endregion
//#region packages/runtime-vapor/src/asyncComponentState.ts
let isAsyncComponentEnabled = false;
function enableAsyncComponent() {
isAsyncComponentEnabled = true;
}
//#endregion
//#region packages/runtime-vapor/src/slotBoundary.ts
function withSlotBoundary(boundary, fn) {
return withRenderContext(deriveSlotBoundary(currentRenderContext, boundary), fn);
}
function trackSlotBoundaryDirtying(fragment, onInvalid) {
const boundary = currentRenderContext.slotBoundary;
if (!boundary) return;
if (onInvalid) registerContentInvalid(boundary, onInvalid, fragment);
let prevValid;
(fragment.bu || (fragment.bu = [])).push(() => {
prevValid = isValidSlot(fragment);
});
(fragment.u || (fragment.u = [])).push(() => {
if (isValidSlot(fragment) !== prevValid) boundary.markDirty();
});
}
function registerContentInvalid(boundary, onInvalid, fragment) {
const callbacks = boundary.onContentInvalid || (boundary.onContentInvalid = []);
callbacks.push(onInvalid);
const unregister = () => {
const index = callbacks.indexOf(onInvalid);
if (index > -1) callbacks.splice(index, 1);
};
(fragment.bum || (fragment.bum = [])).push(unregister);
}
function hasSlotFallback(boundary) {
while (boundary) {
if (boundary.getFallback()) return true;
boundary = boundary.getParent();
}
return false;
}
//#endregion
//#region packages/runtime-vapor/src/helpers/setKey.ts
function setBlockKey(block, key) {
const frag = block;
frag.$key = key;
if (isInteropEnabled && frag.setKey) frag.setKey(key);
}
//#endregion
//#region \0@oxc-project+runtime@0.146.0/helpers/esm/typeof.js
function _typeof(o) {
"@babel/helpers - typeof";
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
return typeof o;
} : function(o) {
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
}, _typeof(o);
}
//#endregion
//#region \0@oxc-project+runtime@0.146.0/helpers/esm/toPrimitive.js
function toPrimitive(t, r) {
if ("object" != _typeof(t) || !t) return t;
var e = t[Symbol.toPrimitive];
if (void 0 !== e) {
var i = e.call(t, r || "default");
if ("object" != _typeof(i)) return i;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return ("string" === r ? String : Number)(t);
}
//#endregion
//#region \0@oxc-project+runtime@0.146.0/helpers/esm/toPropertyKey.js
function toPropertyKey(t) {
var i = toPrimitive(t, "string");
return "symbol" == _typeof(i) ? i : i + "";
}
//#endregion
//#region \0@oxc-project+runtime@0.146.0/helpers/esm/defineProperty.js
function _defineProperty(e, r, t) {
return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
value: t,
enumerable: !0,
configurable: !0,
writable: !0
}) : e[r] = t, e;
}
//#endregion
//#region \0@oxc-project+runtime@0.146.0/helpers/esm/objectSpread2.js
function ownKeys(e, r) {
var t = Object.keys(e);
if (Object.getOwnPropertySymbols) {
var o = Object.getOwnPropertySymbols(e);
r && (o = o.filter(function(r) {
return Object.getOwnPropertyDescriptor(e, r).enumerable;
})), t.push.apply(t, o);
}
return t;
}
function _objectSpread2(e) {
for (var r = 1; r < arguments.length; r++) {
var t = null != arguments[r] ? arguments[r] : {};
r % 2 ? ownKeys(Object(t), !0).forEach(function(r) {
_defineProperty(e, r, t[r]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r) {
Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
});
}
return e;
}
//#endregion
//#region packages/runtime-vapor/src/slotFragment.ts
function renderSlotFallback(boundary, scope) {
let result;
while (boundary) {
const current = boundary;
const localFallback = current.getFallback();
if (localFallback) {
let selected = false;
const onContentInvalid = [];
const getScopeIds = current.getScopeIds;
const render = getScopeIds ? () => renderWithSlotScopeIds(getScopeIds(), localFallback) : localFallback;
const adopt = isHydratingSlotFallback && current.adoptFallback;
if (adopt) current.adoptFallback = void 0;
const renderFallback = adopt ? () => adopt(render) : render;
const content = current.run(() => withSlotBoundary(_objectSpread2(_objectSpread2({}, current), {}, {
getFallback: () => void 0,
onContentInvalid,
markDirty: (force) => current.markDirty(!!force || !selected && hasSlotFallback(current.getParent()))
}), renderFallback), scope);
if (isValidSlot(content)) {
selected = true;
return {
block: content,
onContentInvalid,
adopted: !!adopt
};
}
result = {
block: content,
onContentInvalid,
adopted: !!adopt
};
}
boundary = current.getParent();
}
return result;
}
function beforeExpose(state, block) {
const bm = state.bm;
if (bm) for (let i = 0; i < bm.length; i++) bm[i](block);
}
/**
* The winning exposed branch for a slot host: the committed fallback while one
* is active, the resolved content otherwise. Every host's `syncNodes` points
* its exposed nodes here.
*/
function resolveExposedSlotNodes(state) {
return state.activeFallback || state.getContent();
}
function markSlotResolutionDirty(state, force = false) {
if (state.isDisposed()) return;
if (state.isReconciling || state.isBusy()) {
state.pendingRecheck = true;
state.pendingRecheckForce = state.pendingRecheckForce || force;
return;
}
recheckSlotResolution(state, force);
}
function invalidateExposedSlotContent(state) {
const callbacks = state.activeFallback ? state.activeFallbackInvalidCallbacks : state.boundary.onContentInvalid;
if (callbacks) for (let i = 0; i < callbacks.length; i++) callbacks[i]();
}
function clearSlotFallback(state, parentNode = state.getParentNode()) {
if (state.fallbackScope) {
state.fallbackScope.stop();
state.fallbackScope = void 0;
}
const fallback = state.activeFallback;
if (fallback) {
remove(fallback, state.fallbackInserted ? parentNode || void 0 : void 0);
state.activeFallback = null;
state.fallbackInserted = false;
}
state.activeFallbackInvalidCallbacks = void 0;
}
function leaveSlotFallback(state, hooks, afterLeave) {
const fallback = state.activeFallback;
if (!fallback || !applyTransitionLeaveHooks(fallback, hooks, afterLeave)) return false;
clearSlotFallback(state);
return true;
}
function renderFallbackInScope(state) {
const scope = new EffectScope$1(true);
let renderedFallback;
try {
renderedFallback = renderSlotFallback(state.boundary, scope);
} catch (err) {
scope.stop();
throw err;
}
if (!renderedFallback) {
scope.stop();
return;
}
return {
block: renderedFallback.block,
onContentInvalid: renderedFallback.onContentInvalid,
adopted: renderedFallback.adopted,
scope
};
}
function placeAdoptedFallback(state, parentNode, anchor) {
if (!state.fallbackInserted) return false;
const fallback = state.activeFallback;
if (isInteropEnabled && isInteropFragment(fallback)) fallback.insert(parentNode, anchor);
return true;
}
function insertActiveSlotFallback(state, moveType) {
const fallback = state.activeFallback;
if (isHydrating$1 || !fallback || !isValidSlot(fallback)) return;
const parentNode = state.getParentNode();
if (!parentNode || isHydratingSlotFallback && placeAdoptedFallback(state, parentNode, state.getAnchor())) return;
if (moveType === void 0) insert(fallback, parentNode, state.getAnchor());
else move(fallback, parentNode, state.getAnchor(), moveType);
state.fallbackInserted = true;
}
function commitSlotFallback(state, block, scope, onContentInvalid, detachContent, adopted) {
state.activeFallback = block;
state.activeFallbackInvalidCallbacks = onContentInvalid;
state.fallbackScope = scope;
state.fallbackInserted = isHydrating$1 || adopted;
if (isTransitionEnabled) {
if (state.$transition) {
if (!isArray(block)) setBlockKey(block, "_fb");
state.$transition = applyTransitionHooks(block, state.$transition, ownerFragment(state));
}
}
if (detachContent && !isHydrating$1) {
const parentNode = state.getParentNode();
const contentInvalidCallbacks = state.boundary.onContentInvalid;
if (contentInvalidCallbacks) for (let i = 0; i < contentInvalidCallbacks.length; i++) contentInvalidCallbacks[i]();
if (parentNode) removeAttachedNodes$1(state.getContent(), parentNode, false);
}
beforeExpose(state, block);
insertActiveSlotFallback(state);
}
function ownerFragment(state) {
const frag = state;
return frag.__vf ? frag : void 0;
}
function renderAndCommitSlotFallback(state, hadFallback) {
const result = renderFallbackInScope(state);
clearSlotFallback(state);
if (result) commitSlotFallback(state, result.block, result.scope, result.onContentInvalid, !hadFallback, result.adopted);
}
function disposeSlotResolution(state, parentNode) {
clearSlotFallback(state, parentNode || null);
state.pendingRecheck = false;
state.pendingRecheckForce = false;
state.lastNodesValid = void 0;
}
function recheckSlotResolution(state, force = false) {
if (state.isReconciling) {
state.pendingRecheck = true;
state.pendingRecheckForce = state.pendingRecheckForce || force;
return;
}
let nextForce = force || state.pendingRecheckForce;
do {
state.pendingRecheck = false;
state.pendingRecheckForce = false;
state.isReconciling = true;
try {
recheckSlotResolutionNow(state, nextForce);
} finally {
state.isReconciling = false;
}
if (!state.pendingRecheck) return;
nextForce = state.pendingRecheckForce;
} while (true);
}
function recheckSlotResolutionNow(state, force) {
var _state$lastNodesValid;
const fallback = state.activeFallback;
const fallbackValid = fallback ? isValidSlot(fallback) : false;
const contentValid = state.isContentValid();
const exposedValid = fallback ? fallbackValid : contentValid;
const prevNodesValid = (_state$lastNodesValid = state.lastNodesValid) !== null && _state$lastNodesValid !== void 0 ? _state$lastNodesValid : exposedValid;
if (!force && contentValid && !fallback && prevNodesValid) {
state.syncNodes();
state.lastNodesValid = true;
return;
}
if (contentValid || fallback && !hasSlotFallback(state.boundary)) {
clearSlotFallback(state);
if (fallback) {
const content = state.getContent();
beforeExpose(state, content);
if (!isHydrating$1) {
const parentNode = state.getParentNode();
if (parentNode) insert(content, parentNode, state.getAnchor());
}
}
} else if (fallback) {
if (prevNodesValid) {
if (!fallbackValid && hasSlotFallback(state.boundary.getParent())) renderAndCommitSlotFallback(state, true);
else if (force && fallbackValid) renderAndCommitSlotFallback(state, true);
} else if (fallbackValid) insertActiveSlotFallback(state);
else if (force) renderAndCommitSlotFallback(state, true);
} else renderAndCommitSlotFallback(state, false);
const nextFallback = state.activeFallback;
const nextNodesValid = contentValid && !nextFallback ? true : nextFallback ? nextFallback === fallback ? fallbackValid : isValidSlot(nextFallback) : state.isContentValid();
state.syncNodes();
state.lastNodesValid = nextNodesValid;
if (prevNodesValid !== nextNodesValid) state.notifyExposedValidityChange();
}
//#endregion
//#region packages/runtime-vapor/src/dom/hydrateFragment.ts
let currentSlotEndAnchor = null;
/** Locates the boundary's SSR range and consumes its opening marker. */
function withHydratingSlotBoundary(fn) {
const claim = createFragmentClaim();
locateHydrationNode(claim);
const prev = currentSlotEndAnchor;
const close = currentSlotEndAnchor = locateFragmentEnd(claim.start);
try {
return fn();
} finally {
currentSlotEndAnchor = prev;
if (close) trimHydrationBoundary(close);
}
}
/**
* Insert an anchor at a position resolved during the hydration pass. Untracked
* anchors hold no SSR logical position, so traversal steps over them and the
* insert can happen right away. `nextNode` may already have been trimmed by
* boundary cleanup, in which case the anchor is appended instead.
*/
function insertUntrackedAnchor(parentNode$1, nextNode, anchor) {
parentNode$1.insertBefore(anchor, nextNode && /* @__PURE__ */ parentNode(nextNode) === parentNode$1 ? nextNode : null);
}
/**
* Whether `node` can serve as `frag`'s anchor. Beyond the SSR candidates
* (`<!---->` and a fragment close), dev builds also accept a runtime anchor
* this fragment kind already created: those carry the fragment's debug label
* as their comment data, where prod uses unlabeled text nodes.
*/
function isReusableAnchorCandidate(node, frag) {
return !!node && (isComment(node, "") || isRangeEnd(node) || !!(process.env.NODE_ENV !== "production") && frag !== void 0 && (frag.__vf & 256 && isComment(node, "v-if") || frag.anchorLabel !== void 0 && isComment(node, frag.anchorLabel)));
}
function reuseOrCreateAfterAnchor(node, resetNodes) {
const parent = /* @__PURE__ */ parentNode(node);
return isClaimedAnchor(node) && parent ? {
kind: "create",
parent,
next: node.nextSibling,
resetNodes
} : {
kind: "reuse",
node,
resetNodes
};
}
function prepareDeferredHydrationAnchor(frag, hasRender) {
const isRevivingDeferredBranch = isInDeferredHydrationBoundary() && hasRender && !(frag.__vf & 4) && !isValidBlock(frag.nodes);
const reusingDeferredAnchor = isRevivingDeferredBranch && !!frag.anchor && !!frag.anchor.parentNode;
if (isRevivingDeferredBranch) {
let slotEndAnchor = null;
const anchor = frag.anchor || (currentHydrationNode === (slotEndAnchor = currentSlotEndAnchor) ? slotEndAnchor : null);
if (anchor) setCurrentHydrationNode(claimAnchor(anchor));
}
return reusingDeferredAnchor;
}
/** Rule 1: adopt the anchor createPlainElement injected for native children. */
function planReuseInjectedAnchor(frag) {
if (frag.__vf & 512 && isClaimedAnchor(currentHydrationNode) && /* @__PURE__ */ parentNode(currentHydrationNode)) return {
kind: "reuse",
node: currentHydrationNode
};
}
/** Rule 2: the fragment owns an SSR range; its close marker is the anchor. */
function planReuseOwnClose(frag) {
const close = frag.__vf & 4 ? currentSlotEndAnchor : frag.hydrationClaim && frag.hydrationClaim.start ? locateClaimedEnd(frag.hydrationClaim.start) : null;
if (close) return reuseOrCreateAfterAnchor(close);
}
/** Rule 3: the client rendered nothing and owns no range. */
function planEmptyBranch(frag) {
const flags = frag.__vf;
if (isReusableAnchorCandidate(currentHydrationNode, frag)) return reuseOrCreateAfterAnchor(currentHydrationNode);
if (!(flags & 512) && currentHydrationNode && isComment(currentHydrationNode, "teleport anchor")) {
const parentNode$2 = /* @__PURE__ */ parentNode(currentHydrationNode);
if (parentNode$2) return {
kind: "create",
parent: parentNode$2,
next: currentHydrationNode,
mark: currentHydrationNode
};
}
if (!(flags & 4) && currentHydrationNode && !isRangeEnd(currentHydrationNode)) {
const parentNode$3 = /* @__PURE__ */ parentNode(currentHydrationNode);
if (flags & 512 && parentNode$3) return {
kind: "create-cleanup",
parent: parentNode$3,
next: null,
cleanupStart: currentHydrationNode,
cleanupUntil: null,
cleanupContainer: parentNode$3
};
if (parentNode$3) {
const anchor = nextLogicalSibling(currentHydrationNode);
if (isReusableAnchorCandidate(anchor, frag) && /* @__PURE__ */ parentNode(anchor)) return reuseOrCreateAfterAnchor(anchor, true);
return planTrimFromCursor(parentNode$3, anchor);
}
}
}
/** Trim the unclaimed SSR range at the cursor, then create a fresh anchor. */
function planTrimFromCursor(parent, next) {
return {
kind: "create-cleanup",
parent,
next,
cleanupStart: currentHydrationNode,
cleanupUntil: next
};
}
/** Rule 4: the block is a bare runtime comment from earlier in this pass. */
function planRestartFromRuntimeComment(frag) {
if (isValidBlock(frag.nodes) || !(frag.nodes instanceof Comment)) return;
if (isReusableAnchorCandidate(frag.nodes, frag) && /* @__PURE__ */ parentNode(frag.nodes)) return reuseOrCreateAfterAnchor(frag.nodes, true);
if (!/* @__PURE__ */ parentNode(frag.nodes) && currentHydrationNode) {
const parentNode$4 = /* @__PURE__ */ parentNode(currentHydrationNode);
if (parentNode$4) return planTrimFromCursor(parentNode$4, nextLogicalSibling(currentHydrationNode));
}
}
/** Rule 5: derive the anchor position from the hydrated block itself. */
function planFromBlockBoundary(frag) {
const end = currentSlotEndAnchor;
if (end && currentHydrationNode === end && !isValidBlock(frag.nodes)) return {
kind: "create",
parent: end.parentNode,
next: end
};
const node = findBlockBoundary(frag.nodes);
return {
kind: "create",
parent: node.parentNode,
next: node.nextNode
};
}
function resolveDynamicAnchor(frag, isEmpty) {
return planReuseInjectedAnchor(frag) || planReuseOwnClose(frag) || (isEmpty ? planEmptyBranch(frag) : void 0) || planRestartFromRuntimeComment(frag) || planFromBlockBoundary(frag);
}
function executeAnchorPlan(frag, plan) {
let advanceAfterRestore = null;
let exitHydrationBoundary;
const createRuntimeAnchor = () => {
var _frag$anchorLabel;
return frag.anchor = claimUntrackedAnchor(!!(process.env.NODE_ENV !== "production") ? /* @__PURE__ */ createComment((_frag$anchorLabel = frag.anchorLabel) !== null && _frag$anchorLabel !== void 0 ? _frag$anchorLabel : "") : /* @__PURE__ */ createTextNode());
};
try {
switch (plan.kind) {
case "reuse":
if (plan.resetNodes) frag.nodes = EMPTY_BLOCK;
frag.anchor = claimAnchor(plan.node);
if (currentHydrationNode === frag.anchor) advanceHydrationNode(frag.anchor);
else {
exitHydrationBoundary = enterHydrationBoundary(frag.anchor);
advanceAfterRestore = frag.anchor;
}
break;
case "create":
if (plan.resetNodes) frag.nodes = EMPTY_BLOCK;
if (plan.mark) claimAnchor(plan.mark);
insertUntrackedAnchor(plan.parent, plan.next, createRuntimeAnchor());
break;
case "create-cleanup": {
frag.nodes = EMPTY_BLOCK;
const cleanupParent = /* @__PURE__ */ parentNode(plan.cleanupStart);
if (cleanupParent) updateLastLocatedLogicalChild(cleanupParent, plan.cleanupStart, plan.cleanupUntil, 1);
if (plan.cleanupUntil) exitHydrationBoundary = enterHydrationBoundary(plan.cleanupUntil);
else {
cleanupHydrationTail(plan.cleanupStart, plan.cleanupContainer);
setCurrentHydrationNode(null);
}
insertUntrackedAnchor(plan.parent, plan.next, createRuntimeAnchor());
break;
}
}
} finally {
exitHydrationBoundary && exitHydrationBoundary();
if (advanceAfterRestore && currentHydrationNode === advanceAfterRestore) advanceHydrationNode(advanceAfterRestore);
}
}
function hydrateDynamicFragmentAnchor(frag, isEmpty = false) {
executeAnchorPlan(frag, resolveDynamicAnchor(frag, isEmpty));
}
/**
* The hydrating half of `SlotFragment.updateSlot`. The range the server left
* says what it rendered, so nothing is tried and taken back:
* - `<!--(-->`: the fallback, with none of the content's output;
* - `<!--[--><!--]-->`: nothing;
* - anything else: the content.
*/
function hydrateSlotFragmentContent(frag, render, key, shouldForce) {
locateHydrationNode();
const open = currentHydrationNode;
const resolve = () => recheckSlotResolution(frag, shouldForce || frag.pendingRecheckForce);
if (open && isComment(open, "[") && open.nextSibling && isComment(open.nextSibling, "]")) {
const close = frag.anchor = claimAnchor(open.nextSibling);
runWithoutHydration(() => {
frag.updateContent(render, key);
resolve();
});
advanceHydrationNode(close);
} else if (open && isComment(open, "(")) {
const close = frag.anchor = claimAnchor(locateEndAnchor(open));
hydrateSlotFallbackRange({
first: open.nextSibling,
close,
boundary: frag.boundary
}, () => {
frag.updateContent(render, key);
resolve();
if (frag.activeFallback && !frag.fallbackInserted) frag.insert(close.parentNode, close);
});
advanceHydrationNode(close);
} else withHydratingSlotBoundary(() => {
frag.updateContent(render, key);
if (isValidSlot(frag.getContent())) {
resolve();
hydrateDynamicFragmentAnchor(frag, !isValidBlock(frag.nodes));
} else {
if (open) warnHydrationNodeMismatch(open, `slot fallback`);
frag.syncNodes();
hydrateDynamicFragmentAnchor(frag, true);
runWithoutHydration(resolve);
}
});
}
/**
* The nodes in the range are the fallback's: `createContent` runs the slot
* content without hydration and places it as on the client. The fallback is
* adopted from within it, by whichever slot on the boundary chain resolves it
* (see `renderSlotFallback`), and never moves.
*/
function hydrateSlotFallbackRange(range, createContent) {
const first = range.first;
const last = range.close.previousSibling;
if (first !== range.close) {
range.adopt = (render) => hydrateNode(first, render);
if (range.boundary) range.boundary.adoptFallback = range.adopt;
}
withHydratingSlotFallback(createContent);
const boundary = range.boundary;
if (boundary && boundary.adoptFallback) {
warnHydrationNodeMismatch(first, `slot content`);
boundary.adoptFallback = void 0;
removeFragmentNodes(first.previousSibling, last.nextSibling);
}
}
//#endregion
//#region packages/runtime-vapor/src/componentSlots.ts
const rawSlotsOwnerMap = /* @__PURE__ */ new WeakMap();
const rawSlotWrappersCache = /* @__PURE__ */ new WeakMap();
function normalizeRawSlots(rawSlots) {
if (!rawSlots) return rawSlots;
const normalized = isFunction(rawSlots) ? { default: rawSlots } : rawSlots;
if (!rawSlotsOwnerMap.has(normalized)) rawSlotsOwnerMap.set(normalized, getScopeOwner());
return normalized;
}
var SlotSourceCell = class extends Dep {
constructor(source) {
super();
this.source = source;
this.committed = void 0;
this.next = void 0;
}
get value() {
trackDep(this);
return this.committed;
}
};
/**
* A dynamic slot descriptor is the parent's expression, like a prop getter:
* replace each function source with a reader of the cell the input effect
* commits it to. Slot functions keep their closure semantics. Returns the
* isolated slots with their cells, or nothing when no source is a function.
*/
function isolateSlotSources(rawSlots) {
const dynamicSources = rawSlots.$;
if (!dynamicSources) return;
let count = 0;
for (let i = 0; i < dynamicSources.length; i++) if (isFunction(dynamicSources[i])) count++;
if (!count) return;
const cells = new Array(count);
const isolatedSources = dynamicSources.slice();
for (let i = 0, n = 0; i < dynamicSources.length; i++) {
const source = dynamicSources[i];
if (isFunction(source)) {
const cell = cells[n++] = new SlotSourceCell(source);
isolatedSources[i] = isolateSlotSource(cell);
}
}
const isolated = extend$1({}, rawSlots, { $: isolatedSources });
rawSlotsOwnerMap.set(isolated, rawSlotsOwnerMap.get(rawSlots) || null);
return [isolated, cells];
}
function isolateSlotSource(cell) {
const isolated = () => cell.value;
isolated._cache = cell;
return isolated;
}
function initSlots(instance) {
const isolated = isolateSlotSources(instance.rawSlots);
if (isolated) {
instance.rawSlots = isolated[0];
instance.slotSources = isolated[1];
instance.slots = new Proxy(isolated[0], dynamicSlotsProxyHandlers);
}
}
function withSlotOwner(slots, fn) {
const owner = rawSlotsOwnerMap.get(slots);
if (owner === void 0) return fn();
return withRenderContext(deriveSlotOwner(currentRenderContext, owner), fn);
}
function getOwnedSlot(slots, key, slot) {
if (!rawSlotsOwnerMap.has(slots)) return slot;
let wrappers = rawSlotWrappersCache.get(slots);
if (!wrappers) rawSlotWrappersCache.set(slots, wrappers = /* @__PURE__ */ new Map());
const cached = wrappers.get(key);
if (cached && cached.slot === slot) return cached.wrapped;
const wrapped = ((...args) => withSlotOwner(slots, () => slot(...args)));
wrapped._ = slot._;
wrappers.set(key, {
slot,
wrapped
});
return wrapped;
}
const dynamicSlotsProxyHandlers = {
get: getSlot,
has: (target, key) => !!getSlot(target, key),
getOwnPropertyDescriptor(target, key) {
const slot = getSlot(target, key);
if (slot) return {
configurable: true,
enumerable: true,
value: slot
};
},
ownKeys(target) {
const keys = new Set(Object.keys(target).filter((k) => k !== "$"));
const dynamicSources = target.$;
if (dynamicSources) for (const source of dynamicSources) if (isFunction(source)) {
const slot = withSlotOwner(target, () => resolveFunctionSource(source));
if (slot) {
if (isArray(slot)) for (const s of slot) keys.add(String(s.name));
else keys.add(String(slot.name));
}
} else for (const key of Object.keys(source)) keys.add(key);
return [...keys];
},
set: NO,
deleteProperty: NO
};
function getSlot(target, key) {
const slot = resolveSlot(target, key);
if (slot) return getOwnedSlot(target, key, isFunction(slot) ? slot : slot.fn);
}
function resolveSlot(target, key) {
if (key === "$") return;
const dynamicSources = target.$;
if (dynamicSources) {
let i = dynamicSources.length;
let source;
while (i--) {
source = dynamicSources[i];
if (isFunction(source)) {
const slot = withSlotOwner(target, () => resolveFunctionSource(source));
if (slot) {
if (isArray(slot)) {
for (let j = slot.length - 1; j >= 0; j--) if (String(slot[j].name) === key) return slot[j];
} else if (String(slot.name) === key) return slot;
}
} else if (hasOwn(source, key)) return source[key];
}
}
if (hasOwn(target, key)) return target[key];
}
/**
* Get the effective slot instance for accessing rawSlots and scopeId.
* Prefers the slot owner (if inside a slot), falls back to currentInstance.
*/
function getScopeOwner() {
return currentRenderContext.slotOwner || currentInstance;
}
function createSlot(name = "default", rawProps, fallback, flags = 0) {
const _insertionParent = insertionParent;
const _insertionAnchor = insertionAnchor;
if (!isHydrating$1) resetInsertionState();
let hydrationCursor = null;
const instance = getScopeOwner();
const rawSlots = instance.rawSlots;
const scopeId = !(flags & 1) && instance.type.__scopeId;
const outerSlotScopeIds = currentRenderContext.slotScopeIds;
const slotScopeIds = scopeId ? outerSlotScopeIds ? [...outerSlotScopeIds, `${scopeId}-s`] : [`${scopeId}-s`] : outerSlotScopeIds;
const once = !!(flags & 2);
const slotProps = rawProps ? new Proxy(once ? snapshotRawProps(rawProps) : rawProps, rawPropsProxyHandlers) : EMPTY_OBJ;
let fragment;
let isCustomElementSlot = false;
const interopSlotsSource = isInteropEnabled && rawSlots[interopSlotsKey];
if (interopSlotsSource) {
if (isHydrating$1) hydrationCursor = enterHydrationCursor();
fragment = withRenderContext(deriveSlotScopeIds(currentRenderContext, slotScopeIds), () => instance.appContext.vdom.slot(interopSlotsSource, name, slotProps, instance, {
fallback,
flags,
adoptAnchor: _insertionAnchor
}));
} else {
if (once && fallback) {
const originalFallback = fallback;
fallback = (...args) => withOnce(() => originalFallback(...args));
}
if (isHydrating$1) hydrationCursor = captureHydrationCursor();
const ce = instance.ce || isAsyncComponentEnabled && instance.parent && isAsyncWrapper(instance.parent) && instance.parent.ce;
isCustomElementSlot = !!(ce && ce._hasShadowRoot());
const slotFragment = !isCustomElementSlot && shouldUseSlotFragment(rawSlots, name, fallback, flags) ? new SlotFragment(flags, _insertionAnchor) : void 0;
let dynamicFragment;
if (slotFragment) {
slotFragment.ctx = deriveSlotScopeIds(slotFragment.ctx, slotScopeIds);
fragment = slotFragment;
} else {
dynamicFragment = new DynamicFragment(132, !!(process.env.NODE_ENV !== "production") ? "slot" : void 0, false, false, void 0, _insertionAnchor);
const ctx = dynamicFragment.ctx;
dynamicFragment.ctx = deriveRenderContext(ctx, ctx.slotOwner, null, slotScopeIds, ctx.suspense);
fragment = dynamicFragment;
}
const isDynamicName = isFunction(name);
const renderSlot = () => {
if (isCustomElementSlot) {
const el = /* @__PURE__ */ createElement("slot");
const ownScopeId = instance.type.__scopeId;
if (ownScopeId) el.setAttribute(ownScopeId, "");
if (outerSlotScopeIds) setElementScopeIds(el, outerSlotScopeIds);
const setSlotProps = () => {
const slotName = isFunction(name) ? name() : name;
setDynamicProps(el, [slotProps, slotName !== "default" ? { name: slotName } : {}]);
};
if (once) setSlotProps();
else renderEffect(setSlotProps);
if (fallback) {
const fallbackFn = fallback;
withRenderContext(dynamicFragment.ctx, () => {
const block = fallbackFn();
insert(block, el);
registerNestedVDOMCleanup(block);
});
}
fragment.nodes = el;
return;
}
const slotName = isFunction(name) ? name() : name;
const resolvedSlot = resolveSlot(rawSlots, slotName);
const slot = resolvedSlot ? getOwnedSlot(rawSlots, slotName, isFunction(resolvedSlot) ? resolvedSlot : resolvedSlot.fn) : void 0;
const render = slot ? getBoundSlot(slot) : void 0;
const key = resolvedSlot && !isFunction(resolvedSlot) && hasOwn(resolvedSlot, "key") ? resolvedSlot.key : render || fallback;
if (slotFragment) slotFragment.updateSlot(render, fallback, key);
else if (isHydrating$1) withHydratingSlotBoundary(() => dynamicFragment.update(render || fallback, key));
else dynamicFragment.update(render || fallback, key);
};
let cachedSlot;
let cachedBoundSlot;
const getBoundSlot = (slot) => {
if (slot !== cachedSlot) {
cachedSlot = slot;
cachedBoundSlot = () => renderWithSlotScopeIds(slotScopeIds, () => once ? withOnce(() => slot(slotProps)) : slot(slotProps));
}
return cachedBoundSlot;
};
if (!once && !isCustomElementSlot && (isDynamicName || rawSlots.$)) renderEffect(renderSlot);
else renderSlot();
}
if (isHydrating$1 && isInteropEnabled && isInteropFragment(fragment)) fragment.hydrate();
finishBlockCreation(fragment, fragment.anchor, hydrationCursor, _insertionParent, _insertionAnchor, isCustomElementSlot);
return fragment;
}
function shouldUseSlotFragment(rawSlots, name, fallback, flags) {
if (currentRenderContext.slotBoundary && isForwardedSlot(flags)) return true;
if (!fallback) return false;
if (rawSlots === EMPTY_OBJ) return false;
if (isFunction(name) || rawSlots.$) return true;
const slot = resolveSlot(rawSlots, name);
if (!slot) return false;
return (isFunction(slot) ? slot : slot.fn)._ === 1;
}
//#endregion
//#region packages/runtime-vapor/src/scopeId.ts
/**
* Catch-up for slot content DOM created outside the ambient window (eager
* template clones, hand-built elements). Shallow on purpose: element subtrees
* can contain mounted component internals, so descendants are left to the
* creation-time ambient. Interop fragments derive their ids through the vdom
* patch context and are skipped.
*/
function stampSlotContent(block, scopeIds) {
if (block instanceof Element) {
for (let i = 0; i < scopeIds.length; i++) if (!block.hasAttribute(scopeIds[i])) block.setAttribute(scopeIds[i], "");
} else if (isArray(block)) for (const b of block) stampSlotContent(b, scopeIds);
else if (isFragment(block) && !(isInteropEnabled && isInteropFragment(block)) && !(isSlotResolver(block) && block.activeFallback)) stampSlotContent(block.nodes, scopeIds);
}
function renderWithSlotScopeIds(scopeIds, render) {
const block = withRenderContext(deriveSlotScopeIds(currentRenderContext, scopeIds), render);
if (scopeIds && !isHydrating$1) stampSlotContent(block, scopeIds);
return block;
}
function getCurrentScopeId() {
const scopeOwner = getScopeOwner();
return scopeOwner ? scopeOwner.type.__scopeId : void 0;
}
function registerScopeIdOwner(instance, frag) {
const owners = frag.scopeIdOwners || (frag.scopeIdOwners = []);
if (!owners.includes(instance)) owners.push(instance);
}
function resolveScopeIdRoot(instance, onComponent) {
return getRootElement(instance.block, {
onDynamicFragment: (frag) => registerScopeIdOwner(instance, frag),
onComponent,
excludeSlotOutlets: true
});
}
function applyScopeIdOwners(owners) {
for (let i = 0; i < owners.length; i++) applyRootScopeIds(owners[i]);
}
let publishInteropScopeIds = null;
function setPublishInteropScopeIds(fn) {
publishInteropScopeIds = fn;
}
function pushOwnRootScopeIds(instance, ids) {
const { scopeId, slotScopeIds } = instance;
if (scopeId) (ids || (ids = [])).push(scopeId);
if (slotScopeIds) (ids || (ids = [])).push(...slotScopeIds);
return ids;
}
function hasOwnRootScopeIds(instance) {
return !!(instance.parent && (instance.scopeId || instance.slotScopeIds));
}
/**
* The instance's root-only ids, climbing the effective-root chain so the
* innermost owner's collection carries every ancestor's contribution.
* Assigned parent blocks ground the climb: a null parent block means an
* in-setup mount, where the mounting component is never the root.
*/
function collectRootScopeIds(instance) {
let ids = pushOwnRootScopeIds(instance, null);
let current = instance;
while (current.parent && isVaporComponent(current.parent) && isRootChainChild(current.parent, current)) {
current = current.parent;
ids = pushOwnRootScopeIds(current, ids);
}
return ids;
}
function isRootChainChild(parent, child) {
return parent.block === child || !!parent.block && getRootChainComponent(parent.block) === child;
}
/**
* Resolves the effective root, registers owners along the chain, and applies
* the instance's root-only ids: element roots are stamped, vnode-backed roots
* are published for core to apply at its own mount. When the chain crosses a
* nested component with its own root ids, the outer owner delegates — the
* innermost owner's collect climbs every ancestor, so one pre-insert
* application preserves both custom element connectedCallback timing and
* VDOM's innermost-first attribute order.
*/
function applyRootScopeIds(instance) {
let delegated = false;
const root = resolveScopeIdRoot(instance, (nested) => {
if (hasOwnRootScopeIds(nested)) delegated = true;
});
if (delegated) return;
const scopeIds = collectRootScopeIds(instance);
if (!scopeIds) return;
if (root) setElementScopeIds(root, scopeIds);
if (isInteropEnabled && publishInteropScopeIds) publishInteropScopeIds(instance.block, scopeIds);
}
function applyComponentScopeIds(instance) {
if (!hasOwnRootScopeIds(instance)) return;
applyRootScopeIds(instance);
}
/**
* Hydration counterpart of applyComponentScopeIds: hydrated roots already
* carry SSR scope attrs, so the walk only registers dynamic root tracking,
* publishes interop carriers, and stamps mismatch-recreated roots
* (client-built DOM without SSR attrs).
*/
function hydrateComponentScopeIds(instance) {
if (!hasOwnRootScopeIds(instance)) return;
const root = resolveScopeIdRoot(instance);
const stampRoot = root && isRecreatedNode(root) ? root : void 0;
const publish = isInteropEnabled && publishInteropScopeIds;
if (!stampRoot && !publish) return;
const scopeIds = collectRootScopeIds(instance);
if (!scopeIds) return;
if (stampRoot) setElementScopeIds(stampRoot, scopeIds);
if (publish) publish(instance.block, scopeIds);
}
//#endregion
//#region packages/runtime-vapor/src/keepAlive.ts
let isKeepAliveEnabled = false;
let currentCacheKey;
function enableKeepAlive() {
isKeepAliveEnabled = true;
}
function withKeepAliveEnabled(value) {
enableKeepAlive();
return value;
}
function getKeepAliveContext(instance) {
let owner = instance;
while (isAsyncComponentEnabled && owner && owner.vapor && isAsyncWrapper(owner)) owner = owner.parent;
return owner && owner.vapor && isKeepAlive(owner) ? owner.ctx : null;
}
function withCurrentCacheKey(key, fn) {
if (key === void 0) return fn();
const prev = currentCacheKey;
currentCacheKey = key;
try {
return fn();
} finally {
currentCacheKey = prev;
}
}
//#endregion
//#region packages/runtime-vapor/src/fragment.ts
var VaporFragment = class {
constructor(nodes, flags = 1) {
this.nodes = nodes;
this.__vf = flags;
}
};
var RenderContextFragment = class extends VaporFragment {
constructor(nodes, flags = 1) {
super(nodes, flags);
this.renderInstance = currentInstance;
this.ctx = currentRenderContext;
if (isKeepAliveEnabled) this.keepAliveCtx = getKeepAliveContext(currentInstance);
}
get slotBoundary() {
return this.ctx.slotBoundary;
}
get slotScopeIds() {
return this.ctx.slotScopeIds;
}
runWithRenderCtx(fn, scope) {
return runWithRenderCtx(this, fn, scope);
}
};
function runWithRenderCtx(fragment, fn, scope) {
if (scope === void 0 && currentInstance === fragment.renderInstance) return withRenderContext(fragment.ctx, fn);
const prevInstance = setCurrentInstance(fragment.renderInstance, scope);
try {
return withRenderContext(fragment.ctx, fn);
} finally {
restoreCurrentInstance(prevInstance);
}
}
/**
* The one construction point for a slot host's boundary context, shared by
* SlotFragment and both vdom-interop slot hosts. `run` always comes from the
* host fragment's render seam, and so does the id cell unless the boundary
* stands for an enclosing outlet; `getParent`, `getFallback` and `markDirty`
* stay host-specific (ownership caps, fallback sources and dirty batching
* differ per host).
*/
function createSlotBoundary(fragment, getParent, getFallback, markDirty, onContentInvalid, getScopeIds = () => fragment.slotScopeIds) {
return {
getParent,
getFallback,
run: (fn, scope) => runWithRenderCtx(fragment, fn, scope),
getScopeIds,
markDirty,
onContentInvalid
};
}
var ForFragment = class extends VaporFragment {
constructor(nodes, trackSlotBoundary, onInvalid) {
super(nodes, 8);
if (trackSlotBoundary) trackSlotBoundaryDirtying(this, onInvalid);
}
onReset(fn) {
(this.resetListeners || (this.resetListeners = [])).push(fn);
}
};
var ForBlock = class extends VaporFragment {
constructor(nodes, scope, item, key, index, renderKey) {
super(nodes, 16);
this.scope = scope;
this.itemRef = item;
this.keyRef = key;
this.indexRef = index;
this.key = renderKey;
}
};
var DynamicFragment = class extends RenderContextFragment {
constructor(flags = 0, anchorLabel, keyed = false, trackSlotBoundary = false, onInvalid, adoptAnchor) {
super(EMPTY_BLOCK, 2 | flags);
this.everUpdated = false;
if (keyed) this.keyed = true;
if (!!(process.env.NODE_ENV !== "production")) this.anchorLabel = anchorLabel;
if (!isHydrating$1) this.anchor = resolveFragmentAnchor(adoptAnchor, anchorLabel);
if (trackSlotBoundary) trackSlotBoundaryDirtying(this, onInvalid);
}
get autoHydrate() {
return true;
}
update(render, key = render, noScope = false, branchKey) {
const everUpdated = this.everUpdated;
this.everUpdated = true;
if (key === this.current) {
if (isHydrating$1 && this.autoHydrate) hydrateDynamicFragmentAnchor(this, true);
return;
}
const transition = isTransitionEnabled ? this.$transition : void 0;
const prevKey = this.current;
const wasMounted = prevKey !== void 0;
this.current = key;
const prevSub = setActiveSub();
let reusingDeferredAnchor = false;
try {
const parent = !isHydrating$1 ? this.getBranchParent() : null;
const isUpdate = wasMounted || everUpdated && !!parent;
if (isUpdate) {
const bu = this.bu;
if (bu) for (let i = 0; i < bu.length; i++) bu[i]();
}
if (transition && deferBranchUpdateDuringLeave(this, render, key, noScope, branchKey)) return;
let removePrevious;
if (wasMounted) {
const scope = this.scope;
const previous = this.nodes;
const removeBranch = () => remove(previous, parent || void 0);
let deferRemoval = false;
if (scope) {
if (this.keepAliveCtx) deferRemoval = this.keepAliveCtx.prepareBranchRemoval(this, scope, prevKey);
else scope.stop();
}
if (transition && removeBranchWithLeave(this, transition, parent, render, key, noScope, branchKey)) return;
if (deferRemoval) removePrevious = removeBranch;
else removeBranch();
}
reusingDeferredAnchor = isHydrating$1 ? prepareDeferredHydrationAnchor(this, !!render) : false;
this.renderBranch(render, transition && this.$transition, parent, key, noScope, isUpdate, removePrevious, branchKey);
} finally {
setActiveSub(prevSub);
}
if (isHydrating$1 && this.autoHydrate && !reusingDeferredAnchor) hydrateDynamicFragmentAnchor(this, render == null);
}
getBranchParent() {
return this.anchor.parentNode;
}
renderBranch(render, transition, parent, key, noScope, notifyUpdated, removePrevious, branchKey) {
this.branchKey = this.keyed ? key : branchKey;
if (render) {
const keepAliveCtx = isKeepAliveEnabled ? this.keepAliveCtx : null;
const useScope = !noScope || !!this.fallthrough;
if (keepAliveCtx) keepAliveCtx.runBranchRender(this, () => this.renderNodes(render, useScope, parent, transition), useScope, removePrevious);
else {
this.scope = useScope ? new EffectScope$1() : void 0;
this.renderNodes(render, useScope, parent, transition);
}
if (this.scopeIdOwners) applyScopeIdOwners(this.scopeIdOwners);
if (parent) {
insert(this.nodes, parent, this.anchor);
if (removePrevious && keepAliveCtx) keepAliveCtx.cacheBlock(this);
}
} else {
this.scope = void 0;
this.nodes = EMPTY_BLOCK;
if (removePrevious) removePrevious();
}
const u = this.u;
if (notifyUpdated && u) for (let i = 0; i < u.length; i++) u[i](this.nodes);
}
renderNodes(render, useScope, parent, transition) {
try {
this.nodes = this.runWithRenderCtx(() => {
const nodes = (useScope ? this.scope.run(render) : render()) || EMPTY_BLOCK;
if (parent && this.fallthrough) this.fallthrough(nodes);
const bm = this.bm;
if (bm) for (let i = 0; i < bm.length; i++) bm[i](nodes);
return nodes;
});
} finally {
if (isTransitionEnabled && transition) this.$transition = applyTransitionHooks(this.nodes, transition, this);
}
}
};
var SlotFragment = class extends DynamicFragment {
constructor(flags = 0, adoptAnchor) {
super(1156, !!(process.env.NODE_ENV !== "production") ? "slot" : void 0, false, false, void 0, adoptAnchor);
this.disposed = false;
this.activeFallback = null;
this.fallbackInserted = false;
this.pendingRecheck = false;
this.pendingRecheckForce = false;
this.isReconciling = false;
this.content = EMPTY_BLOCK;
this.isUpdating = false;
onScopeDispose$1(() => {
this.disposed = true;
if (this.fallbackScope) this.fallbackScope.stop();
}, true);
this.sharedFallback = !!(flags & 8);
this.inheritFallback = slotInheritsFallback(flags);
this.notifyParentBoundary = slotNotifiesBoundary(flags);
if (this.sharedFallback) {
if (this.slotBoundary) registerContentInvalid(this.slotBoundary, () => {
invalidateExposedSlotContent(this);
const anchor = this.anchor;
const parent = anchor.parentNode;
if (parent) {
removeAttachedNodes$1(this.content, parent);
if (this.activeFallback) removeAttachedNodes$1(this.activeFallback, parent);
removeNode(anchor, parent);
}
}, this);
}
}
get autoHydrate() {
return false;
}
renderBranch(render, transition, parent, key, noScope, notifyUpdated, removePrevious, branchKey) {
super.renderBranch(render, transition, parent, key, noScope, notifyUpdated, removePrevious, branchKey);
if (!this.isUpdating) {
this.content = this.nodes;
recheckSlotResolution(this, false);
}
}
get boundary() {
if (!this.ownBoundary) {
const parent = this.inheritFallback ? this.slotBoundary : null;
this.ownBoundary = createSlotBoundary(this, () => parent, () => this.localFallback, (force) => markSlotResolutionDirty(this, force));
}
return this.ownBoundary;
}
insert(parent, anchor, parentSuspense) {
this.disposed = false;
if (!(isHydratingSlotFallback && placeAdoptedFallback(this, parent, anchor))) insert(this.nodes, parent, anchor, parentSuspense);
if (this.activeFallback === this.nodes) this.fallbackInserted = true;
}
move(parent, anchor, moveType, parentComponent, parentSuspense) {
move(this.nodes, parent, anchor, moveType, parentComponent, parentSuspense);
if (this.activeFallback === this.nodes) this.fallbackInserted = true;
}
remove(parent) {
this.disposed = true;
if (this.fallbackScope) this.fallbackScope.stop();
const nodes = this.nodes;
remove(nodes, parent);
if (this.activeFallback === nodes) {
this.activeFallback = null;
this.fallbackInserted = false;
}
this.clearContentInvalid();
disposeSlotResolution(this, parent);
}
clearContentInvalid() {
const callbacks = this.ownBoundary && this.ownBoundary.onContentInvalid;
if (callbacks) callbacks.length = 0;
}
getBranchParent() {
return this.activeFallback ? null : super.getBranchParent();
}
updateContent(render, key) {
if (key !== this.current) this.clearContentInvalid();
this.nodes = this.content;
this.update(render, key);
this.content = this.nodes;
}
updateSlot(render, fallback, key = render || fallback) {
const prevLocalFallback = this.localFallback;
this.localFallback = fallback;
const boundary = this.boundary;
const contentCtx = this.contentCtx || (this.contentCtx = deriveSlotBoundary(this.ctx, boundary));
const slotRender = render ? () => withRenderContext(contentCtx, render) : () => EMPTY_BLOCK;
this.isUpdating = true;
this.pendingRecheck = false;
try {
const shouldForce = prevLocalFallback !== fallback;
if (isHydrating$1) hydrateSlotFragmentContent(this, slotRender, key, shouldForce);
else {
this.updateContent(slotRender, key);
recheckSlotResolution(this, shouldForce || this.pendingRecheckForce);
}
} finally {
this.pendingRecheck = false;
this.pendingRecheckForce = false;
this.isUpdating = false;
}
}
getContent() {
return this.content;
}
getParentNode() {
return this.anchor ? this.anchor.parentNode : null;
}
getAnchor() {
return this.anchor || null;
}
isBusy() {
return this.isUpdating;
}
isDisposed() {
return this.disposed;
}
isContentValid() {
return isValidSlot(this.content);
}
syncNodes() {
this.nodes = resolveExposedSlotNodes(this);
}
notifyExposedValidityChange() {
if (this.notifyParentBoundary && this.slotBoundary) this.slotBoundary.markDirty();
}
};
/**
* Adopt the template `<!>` placeholder passed through the insertion state as
* the fragment anchor instead of creating (and later inserting) a runtime
* anchor. Restricted to comments: adopting any other node would remove user
* DOM on removeFragment. Callers detect adoption by identity: the returned
* node is the adopted anchor iff it equals the passed one.
*/
function resolveFragmentAnchor(adopt, anchorLabel) {
if (adopt && adopt.nodeType === 8) {
if (!!(process.env.NODE_ENV !== "production") && anchorLabel) adopt.data = anchorLabel;
return claimUntrackedAnchor(adopt);
}
return claimUntrackedAnchor(!!(process.env.NODE_ENV !== "production") && anchorLabel ? /* @__PURE__ */ createComment(anchorLabel) : /* @__PURE__ */ createTextNode());
}
/**
* Whether a fragment adopted the captured insertion anchor — the template
* `<!>` placeholder — as its own, which means it rendered in place and the
* creator must skip its trailing insert. Unrelated to hydration's
* `isClaimedAnchor` / `skipUntrackedAnchors`, which are about anchor nodes
* marked during a hydration pass.
*
* The insertion anchor must be checked non-null: append inserts capture no
* anchor, and fragments without a client anchor (vdom interop slots, any
* fragment during hydration) would otherwise compare undefined === undefined
* and falsely skip their only insertion.
*/
function isAdoptedPlaceholder(fragmentAnchor, insertionAnchor) {
return !!insertionAnchor && fragmentAnchor === insertionAnchor;
}
/**
* Shared tail for every block-creating API (`createIf`, `createFor`,
* `createKeyedFragment`, `createDynamicComponent`, slot outlets): the block is
* built, now hand it over to the scope that asked for it.
*
* Client render: insert it at the captured insertion point, unless it adopted
* that point's `<!>` placeholder as its own anchor and therefore already
* rendered in place. Hydration: there is nothing to insert — the block adopted
* server nodes where they already stood — so hand back the cursor instead.
*
* Site-specific hydration work (claiming a leftover `<!---->`, advancing past
* an anchor, running an interop fragment's `hydrate()`) belongs *before* this
* call, guarded by `isHydrating`; keeping it out of here avoids allocating a
* callback on the client-render path, which never needs one.
*/
function finishBlockCreation(block, anchor, cursor, insertionParent, insertionAnchor, force) {
if (isHydrating$1) exitHydrationCursor(cursor);
else if (insertionParent && (force || !isAdoptedPlaceholder(anchor, insertionAnchor))) insert(block, insertionParent, insertionAnchor);
if (insertionParent) registerNestedVDOMCleanup(block);
}
function isFragment(val) {
return !!(val && val.__vf);
}
function isInteropFragment(val) {
return !!(val && val.__vf & 64);
}
function isSlotOutletFragment(val) {
return !!(val && val.__vf & 128);
}
function isDynamicFragment(val) {
return !!(val && val.__vf & 2);
}
/**
* The key a fragment hands to its branch root as default: a declared key
* (static key on a dynamic component) or the current branch key (keyed
* fragment, dynamic component `:key`, v-if branch index).
*/
function getFragmentKey(frag) {
var _frag$$key;
return (_frag$$key = frag.$key) !== null && _frag$$key !== void 0 ? _frag$$key : frag.branchKey;
}
function isForFragment(val) {
return !!(val && val.__vf & 8);
}
function isForBlock(val) {
return !!(val && val.__vf & 16);
}
function isVaporSlotOutlet(val) {
return !!(val && val.__vf & 4);
}
function isSlotResolver(val) {
return !!(val && val.__vf & 1024);
}
//#endregion
//#region packages/runtime-vapor/src/teleport.ts
let isTeleportEnabled = false;
function enableTeleport(value) {
isTeleportEnabled = true;
return value;
}
function isVaporTeleport(value) {
return !!(value && value.__isTeleport && value.__vapor);
}
function isTeleportFragment(value) {
return !!(value && value.__vf & 32);
}
//#endregion
//#region packages/runtime-vapor/src/block.ts
const EMPTY_BLOCK = EMPTY_ARR;
function isBlock(val) {
return val instanceof Node || isArray(val) || isVaporComponent(val) || isFragment(val);
}
function isValidBlock(block, componentAsValid = false) {
if (!block) return false;
else if (block instanceof Node) return !(block instanceof Comment) && !isClaimedAnchor(block);
else if (isVaporComponent(block)) return componentAsValid || isValidBlock(block.block, componentAsValid);
else if (isArray(block)) return block.length > 0 && block.some((block) => isValidBlock(block, componentAsValid));
else {
if (isInteropEnabled && block.isBlockValid) return block.isBlockValid(componentAsValid);
return isValidBlock(block.nodes, componentAsValid);
}
}
function isValidSlot(block) {
return isValidBlock(block, true);
}
function insert(block, parent, anchor = null, parentSuspense) {
if (block instanceof Node) {
insertNode(block, parent, anchor, parentSuspense);
return;
}
if (isVaporComponent(block)) {
if (block.isMounted && !block.isDeactivated) insert(block.block, parent, anchor, parentSuspense);
else mountComponent(block, parent, anchor);
} else if (isArray(block)) for (const b of block) insert(b, parent, anchor, parentSuspense);
else insertFragment(block, parent, anchor, parentSuspense);
}
function insertNode(block, parent, anchor = null, parentSuspense) {
if (!isHydrating$1) {
const transition = isTransitionEnabled && block instanceof Element ? block.$transition : void 0;
if (transition) {
const insert = () => parent.insertBefore(block, anchor);
if (isVShowMountEnter(block, transition)) {
transition.beforeEnter(block);
insert();
queuePostRenderEffect(() => transition.enter(block), void 0, parentSuspense);
} else performTransitionEnter(block, transition, insert, parentSuspense);
} else if (block !== anchor) parent.insertBefore(block, anchor);
}
}
function isVShowMountEnter(el, transition) {
return transition.persisted && !!el.$vshow && !el[vShowHidden];
}
function insertFragment(block, parent, anchor = null, parentSuspense) {
const blockAnchor = block.anchor;
if (blockAnchor) {
insertNode(blockAnchor, parent, anchor, parentSuspense);
anchor = blockAnchor;
}
if (block.insert) block.insert(parent, anchor, parentSuspense, block.$transition);
else insert(block.nodes, parent, anchor, parentSuspense);
}
function move(block, parent, anchor = null, moveType = 1, parentComponent, parentSuspense) {
if (block instanceof Node) {
if (isTransitionEnabled && block instanceof Element && block.$transition && moveType !== 2) {
if (moveType === 0) performTransitionEnter(block, block.$transition, () => parent.insertBefore(block, anchor), parentSuspense, true);
else performTransitionLeave(block, block.$transition, () => {
if (moveType === 1 && parentComponent && parentComponent.isUnmounted) block.remove();
else parent.insertBefore(block, anchor);
}, true, true);
} else parent.insertBefore(block, anchor);
} else if (isVaporComponent(block)) {
if (block.isMounted) move(block.block, parent, anchor, moveType, parentComponent, parentSuspense);
else mountComponent(block, parent, anchor);
} else if (isArray(block)) for (const b of block) move(b, parent, anchor, moveType, parentComponent, parentSuspense);
else {
if (block.anchor) {
move(block.anchor, parent, anchor, moveType, parentComponent, parentSuspense);
anchor = block.anchor;
}
if (block.move) block.move(parent, anchor, moveType, parentComponent, parentSuspense, block.$transition);
else move(block.nodes, parent, anchor, moveType, parentComponent, parentSuspense);
}
}
function remove(block, parent) {
if (block instanceof Node) removeNode(block, parent);
else if (isVaporComponent(block)) unmountComponent(block, parent, isSuspenseEnabled && isInteropEnabled ? resolveUnmountSuspense(block.suspense) : block.suspense);
else if (isArray(block)) for (let i = 0; i < block.length; i++) remove(block[i], parent);
else removeFragment(block, parent);
}
function removeAttachedNodes$1(block, parent, removeAnchors = true) {
if (block instanceof Node) {
if (block.parentNode === parent) removeNode(block, parent);
} else if (isVaporComponent(block)) {
if (block.block) removeAttachedNodes$1(block.block, parent, removeAnchors);
} else if (isArray(block)) for (let i = 0; i < block.length; i++) removeAttachedNodes$1(block[i], parent, removeAnchors);
else {
removeAttachedNodes$1(block.nodes, parent, removeAnchors);
const anchor = block.anchor;
if (removeAnchors && anchor && anchor.parentNode === parent) removeNode(anchor, parent);
}
}
function removeNode(block, parent) {
if (isTransitionEnabled && block.$transition && block instanceof Element) performTransitionLeave(block, block.$transition, () => parent && block.parentNode === parent && parent.removeChild(block));
else parent && parent.removeChild(block);
}
function removeFragment(block, parent) {
const bum = block.bum;
if (bum) for (let i = 0; i < bum.length; i++) bum[i]();
if (block.remove) block.remove(parent, block.$transition);
else remove(block.nodes, parent);
if (block.anchor) removeNode(block.anchor, parent);
if (block.scope) block.scope.stop();
}
/**
* Block removal doesn't descend into elements, so it never reaches a block
* mounted into one. Unmount the vdom components in its tree synchronously when
* its owner scope is disposed, as vdom does for an element's children.
*/
function registerNestedVDOMCleanup(block) {
if (isInteropEnabled && !(block instanceof Node)) onScopeDispose$1(() => unmountVDOM(block), true);
}
/**
* Unmounts the vdom components in a block tree whose DOM goes away without
* block removal.
*/
function unmountVDOM(block) {
if (!block || block instanceof Node) return;
if (isVaporComponent(block)) unmountVDOM(block.block);
else if (isArray(block)) for (let i = 0; i < block.length; i++) unmountVDOM(block[i]);
else if (isInteropFragment(block)) block.remove();
else unmountVDOM(block.nodes);
}
/**
* dev / test only
*/
function normalizeBlock(block) {
if (!!!(process.env.NODE_ENV !== "production") && true) throw new Error("normalizeBlock should not be used in production code paths");
const nodes = [];
if (block instanceof Node) nodes.push(block);
else if (isArray(block)) block.forEach((child) => nodes.push(...normalizeBlock(child)));
else if (isVaporComponent(block)) nodes.push(...normalizeBlock(block.block));
else if (isTeleportEnabled && isTeleportFragment(block)) nodes.push(block.placeholder, block.anchor);
else {
nodes.push(...normalizeBlock(block.nodes));
block.anchor && nodes.push(block.anchor);
}
return nodes;
}
/**
* First node of a block as it appears in its own container, or `undefined`
* when the block has no node there: an empty array of blocks, or a block
* whose content lives elsewhere (a teleport target) and has no marker left.
*/
function getBlockFirstNode(block) {
if (block instanceof Node) return block;
else if (isArray(block)) {
for (let i = 0; i < block.length; i++) {
const anchor = getBlockFirstNode(block[i]);
if (anchor) return anchor;
}
return;
} else if (isVaporComponent(block)) return getBlockFirstNode(getComponentPhysicalBlock(block));
else {
if (isTeleportEnabled && isTeleportFragment(block)) {
const marker = block.placeholder || block.anchor;
if (marker) return marker;
}
const nodes = block.nodes;
if (isValidBlock(nodes)) return getBlockFirstNode(nodes);
const node = getBlockFirstNode(nodes);
const anchor = block.anchor;
return node && (!anchor || node.parentNode === anchor.parentNode) ? node : anchor;
}
}
function findBlockBoundary(block) {
const boundaryBlock = isVaporComponent(block) ? getComponentPhysicalBlock(block) : block;
const lastChild = findLastChild(boundaryBlock);
let { parentNode, nextSibling: nextNode } = lastChild;
if (nextNode && isRangeEnd(nextNode) && isFragmentBlock(boundaryBlock) && !isRangeEnd(lastChild) && !(lastChild.nodeType === 3 && !lastChild.data)) nextNode = nextNode.nextSibling;
return {
parentNode,
nextNode
};
}
function findLastChild(node) {
if (node && node instanceof Node) return node;
else if (isArray(node)) return findLastChild(node[node.length - 1]);
else if (isVaporComponent(node)) return findLastChild(getComponentPhysicalBlock(node));
else {
if (node.anchor) return node.anchor;
return findLastChild(node.nodes);
}
}
function getComponentPhysicalBlock(instance) {
return isSuspenseEnabled && instance.pendingBlock || instance.block;
}
function isFragmentBlock(block) {
if (isArray(block)) return true;
else if (isVaporComponent(block)) return isFragmentBlock(getComponentPhysicalBlock(block));
else if (isFragment(block)) return isFragmentBlock(block.nodes);
return false;
}
//#endregion
//#region packages/runtime-vapor/src/helpers/useCssVars.ts
/**
* Css vars are root-inherited state: the owner writes its root chain before
* insertion, containers on that chain write the content they produce later
* (`bm` hooks; `u` for vdom-owned interop content), and teleports are written
* directly as outlets since their content leaves the chain.
*/
function useVaporCssVars(getter) {
const instance = currentInstance;
if (!!(process.env.NODE_ENV !== "production")) instance.getCssVars = getter;
let vars = EMPTY_OBJ;
const apply = instance.applyCssVars = (nodes) => {
if (!isHydrating$1) setVarsOnBlock(nodes, vars);
registerCssVarApply(nodes, apply);
};
const watchVars = () => watch(() => {
vars = extend$1({}, getter());
if (instance.ce) setVarsOnNode(instance.ce, vars);
else setVarsOnBlock(instance.block, vars);
const outlets = instance.cssVarOutlets;
if (outlets) for (let i = 0; i < outlets.length; i++) setVarsOnBlock(outlets[i].nodes, vars);
}, NOOP, { flush: "post" });
onBeforeMount(() => {
if (!instance.ce) registerCssVarApply(instance.block, apply);
});
if (isHydrating$1) onMounted(watchVars);
else onBeforeMount(watchVars);
}
function setVarsOnBlock(block, vars) {
if (block instanceof Node) setVarsOnNode(block, vars);
else if (isArray(block)) for (let i = 0; i < block.length; i++) setVarsOnBlock(block[i], vars);
else if (isVaporComponent(block)) setVarsOnBlock(block.block, vars);
else if (isFragment(block) && !(isTeleportEnabled && isTeleportFragment(block))) setVarsOnBlock(block.nodes, vars);
}
function registerCssVarApply(block, apply) {
if (isArray(block)) for (let i = 0; i < block.length; i++) registerCssVarApply(block[i], apply);
else if (isVaporComponent(block)) {
if (block.block) registerCssVarApply(block.block, apply);
else (block.bm || (block.bm = [])).push(() => apply(block.block));
} else if (isFragment(block) && !(isTeleportEnabled && isTeleportFragment(block))) {
const hooks = isInteropEnabled && isInteropFragment(block) ? block.u || (block.u = []) : isDynamicFragment(block) || isForFragment(block) ? block.bm || (block.bm = []) : void 0;
if (hooks && !hooks.includes(apply)) hooks.push(apply);
registerCssVarApply(block.nodes, apply);
}
}
function registerCssVarOutlet(owner, frag) {
(owner.cssVarOutlets || (owner.cssVarOutlets = [])).push(frag);
onScopeDispose(() => remove$1(owner.cssVarOutlets, frag), true);
}
function applyComponentCssVars(instance) {
let current = instance;
while (current && current.vapor) {
const owner = current;
if (owner.applyCssVars && !owner.ce) owner.applyCssVars(owner.block);
current = current.parent;
}
}
//#endregion
//#region packages/runtime-vapor/src/hmr.ts
function hmrRerender(instance) {
if (instance.isUnmounted) return;
if (!instance.type.render) {
let parent = instance.parent;
while (parent && !parent.vapor) parent = parent.parent;
if (parent) return parent.hmrRerender();
if (!instance.parent && !instance.ce) return instance.hmrReload(instance.type);
}
const { parentNode, nextNode: anchor } = findBlockBoundary(instance.block);
const parent = parentNode;
if (instance.renderScope) instance.renderScope.stop();
remove(instance.block, parent);
const prev = setCurrentInstance(instance);
pushWarningContext(instance);
try {
withRenderContext(deriveSlotScopeIds(currentRenderContext, null), () => {
runDevRender(instance);
applyComponentFallthrough(instance);
});
} finally {
popWarningContext();
restoreCurrentInstance(prev);
}
applyComponentScopeIds(instance);
applyComponentCssVars(instance);
insert(instance.block, parent, anchor);
}
function hmrReload(instance, newComp) {
const parentInstance = instance.parent;
if (parentInstance) {
parentInstance.hmrRerender();
return;
}
const { parentNode, nextNode: anchor } = findBlockBoundary(instance.block);
const parent = parentNode;
unmountComponent(instance, parent);
const prev = setCurrentInstance(parentInstance);
let newInstance;
try {
newInstance = createComponent(newComp, instance.rawProps, instance.rawSlots, instance.isSingleRoot, void 0, instance.appContext, true);
} finally {
restoreCurrentInstance(prev);
}
mountComponent(newInstance, parent, anchor);
const app = instance.appContext.app;
if (app && app._instance === instance) app._instance = newInstance;
}
//#endregion
//#region packages/runtime-vapor/src/component.ts
function useVdomInterop(component, appContext) {
return !!appContext.vdom && !component.__vapor;
}
function resolveFallthroughOwner(isSingleRoot) {
const instance = currentInstance;
if ((isSingleRoot || isTransitionEnabled && instance && isVaporTransition(instance.type)) && isVaporComponent(instance) && instance.type.inheritAttrs !== false && instance.hasFallthrough) return instance;
}
function createComponent(component, rawProps, rawSlots, isSingleRoot, once, appContext = currentInstance && currentInstance.appContext || emptyContext, managedMount = false, ce) {
const wasInOnce = inOnce;
if (wasInOnce && !managedMount) once = true;
const _insertionParent = insertionParent;
const _insertionAnchor = insertionAnchor;
let hydration = null;
let pendingAsyncHydration = false;
if (isHydrating$1) hydration = enterComponentHydration(component);
else resetInsertionState();
const prevCtx = currentRenderContext;
try {
if (isSuspenseEnabled && !prevCtx.suspense && currentInstance && currentInstance.suspense) setRenderContext(deriveSuspense(prevCtx, currentInstance.suspense));
const owner = resolveFallthroughOwner(isSingleRoot);
if (owner) {
const source = () => resolveFallthroughAttrs(owner);
if (rawProps && rawProps !== EMPTY_OBJ) {
const sources = rawProps.$;
rawProps = extend$1({}, rawProps, { $: sources ? sources.concat(source) : [source] });
} else rawProps = { $: [source] };
}
const key = (isKeepAliveEnabled || isTransitionEnabled) && rawProps ? resolveSource(rawProps.key) : void 0;
let keepAliveCtx = null;
if (isKeepAliveEnabled && currentInstance && currentInstance.vapor && isKeepAlive(currentInstance)) {
const ctx = currentInstance.ctx;
keepAliveCtx = ctx;
const cached = !managedMount && ctx.getCachedComponent(component, key);
if (cached) {
if (isVaporComponent(cached) && cached.inputScope) {
cached.rawProps = rawProps || EMPTY_OBJ;
initInputs(cached);
}
const scope = getCurrentScope();
if (isVaporComponent(cached) && cached.unmountScope !== scope) {
cached.unmountScope = scope;
registerUnmount(cached);
}
return cached;
}
}
let asyncBoundary = false;
if (isAsyncComponentEnabled && !isHydrating$1) {
const resolved = component.__asyncResolved;
if (resolved && !(isInteropEnabled && useVdomInterop(resolved, appContext))) {
component = resolved;
asyncBoundary = true;
}
}
if (isTeleportEnabled && isVaporTeleport(component)) {
const frag = component.process(rawProps, normalizeRawSlots(rawSlots), _insertionAnchor);
if (key !== void 0) frag.$key = key;
if (_insertionParent) {
onScopeDispose$1(() => frag.disposeTarget(), true);
registerNestedVDOMCleanup(frag);
} else onScopeDispose$1(() => frag.scheduleTargetDispose(), true);
if (!isHydrating$1) {
if (_insertionParent) insert(frag, _insertionParent, _insertionAnchor, currentRenderContext.suspense);
} else frag.hydrate();
return frag;
}
let inputScope;
if (keepAliveCtx && !once && !managedMount) inputScope = new EffectScope(true);
if (isInteropEnabled && useVdomInterop(component, appContext)) {
const frag = appContext.vdom.mount(component, currentInstance, rawProps, normalizeRawSlots(rawSlots), once, inputScope);
if (key !== void 0) {
frag.$key = key;
frag.setKey(key);
}
if (_insertionParent) registerNestedVDOMCleanup(frag);
if (!isHydrating$1) {
if (_insertionParent) insert(frag, _insertionParent, _insertionAnchor, currentRenderContext.suspense);
} else frag.hydrate();
return frag;
}
const instance = new VaporComponentInstance(component, rawProps, rawSlots, appContext, ce);
if (key !== void 0) instance.$key = key;
if (inputScope) {
instance.inputScope = inputScope;
instance.hasFallthrough = true;
}
if (asyncBoundary) markAsyncBoundary(instance);
if (isKeepAliveEnabled && !(isAsyncComponentEnabled && isAsyncWrapper(instance))) {
keepAliveCtx || (keepAliveCtx = getKeepAliveContext(currentInstance));
if (keepAliveCtx) keepAliveCtx.processShapeFlag(instance);
}
const outerCtx = currentRenderContext;
setRenderContext(deriveRenderContext(outerCtx, null, outerCtx.slotBoundary, null, outerCtx.suspense));
let hasWarningContext = false;
let hasInitMeasure = false;
try {
if (!!(process.env.NODE_ENV !== "production")) {
registerHMR(instance);
instance.isSingleRoot = isSingleRoot;
instance.hmrRerender = hmrRerender.bind(null, instance);
instance.hmrReload = hmrReload.bind(null, instance);
pushWarningContext(instance);
hasWarningContext = true;
startMeasure(instance, `init`);
hasInitMeasure = true;
instance.propsOptions = normalizePropsOptions(component);
instance.emitsOptions = normalizeEmitsOptions(component);
}
try {
initSlots(instance);
initInputs(instance, once);
} catch (error) {
if (!!(process.env.NODE_ENV !== "production")) unregisterHMR(instance);
instance.scope.stop();
if (inputScope) inputScope.stop();
throw error;
}
if (isHydrating$1 && isAsyncComponentEnabled && isAsyncWrapper(instance) && component.__asyncHydrate) {
const setup = () => setupComponent(instance, component);
component.__asyncHydrate(currentHydrationNode, instance, wasInOnce ? () => withOnce(setup, false) : setup);
} else {
if (wasInOnce) withOnce(() => setupComponent(instance, component), false);
else setupComponent(instance, component);
if (isHydrating$1 && isSuspenseEnabled && instance.suspense && instance.asyncDep) {
const pendingBlock = [];
const { claim, cursor } = hydration;
let node = claim && claim.start || cursor.start;
const hydrationNext = nextLogicalSibling(node);
do {
pendingBlock.push(node);
node = node.nextSibling;
} while (node !== hydrationNext);
instance.pendingBlock = pendingBlock.length === 1 ? pendingBlock[0] : pendingBlock;
advanceHydrationNode(pendingBlock[pendingBlock.length - 1]);
pendingAsyncHydration = true;
}
}
} finally {
if (!!(process.env.NODE_ENV !== "production")) {
if (hasWarningContext) popWarningContext();
if (hasInitMeasure) endMeasure(instance, "init");
}
}
if (keepAliveCtx) instance.unmountScope = getCurrentScope();
registerUnmount(instance);
if (_insertionParent) registerNestedVDOMCleanup(instance);
if (!managedMount && (_insertionParent || isHydrating$1)) mountComponent(instance, _insertionParent, _insertionAnchor);
return instance;
} finally {
setRenderContext(prevCtx);
if (hydration) exitComponentHydration(hydration, !pendingAsyncHydration);
}
}
/**
* Open a component's SSR range: locate its start and claim its markers.
* Shared by creation and by the deferred render of an async setup, which
* re-enters the range once setup has settled.
*/
function enterComponentHydration(component) {
const claim = component.__multiRoot ? createFragmentClaim() : void 0;
const cursor = enterHydrationCursor(claim);
const close = claim && claim.start ? locateEndAnchor(claim.start) : null;
if (close) claimAnchor(close);
return {
claim,
cursor,
close
};
}
/**
* Hand the cursor back; with `finalizeBoundary` the unclaimed tail of the
* range is trimmed first and the cursor moves past the close marker.
*/
function exitComponentHydration({ close, cursor }, finalizeBoundary) {
if (finalizeBoundary) {
trimHydrationBoundary(close);
if (close && currentHydrationNode === close) advanceHydrationNode(close);
}
exitHydrationCursor(cursor);
}
function setupComponent(instance, component) {
const prevInstance = setCurrentInstance(instance);
const prevSub = setActiveSub();
const setupFn = isFunction(component) ? component : component.setup;
const setupResult = setupFn ? callWithErrorHandling(setupFn, instance, 0, [instance.props, instance]) || EMPTY_OBJ : component.__cssModules || EMPTY_OBJ;
const isAsyncSetup = isPromise(setupResult);
if ((isAsyncSetup || instance.sp) && !(isAsyncComponentEnabled && isAsyncWrapper(instance))) markAsyncBoundary(instance);
if (isAsyncSetup) {
instance.asyncDep = setupResult;
if (!!(process.env.NODE_ENV !== "production") && !instance.suspense) {
var _getComponentName;
const name = (_getComponentName = getComponentName(component)) !== null && _getComponentName !== void 0 ? _getComponentName : "Anonymous";
warn(`Component <${name}>: setup function returned a promise, but no <Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered.`);
}
} else handleSetupResult(setupResult, component, instance);
setActiveSub(prevSub);
restoreCurrentInstance(prevInstance);
}
let isApplyingFallthroughProps = false;
function shouldUseFunctionalFallthrough(component) {
return isFunction(component) && !component.props && !(isTransitionEnabled && isVaporTransition(component));
}
/**
* The single source of truth for the attrs a component may fall through to
* its effective root — used both for the root element render effect and for
* forwarding into a root component's props. Functional components without
* declared props only pass class / style / event listeners; v-model
* listeners with a corresponding declared prop never fall through (the
* component handles the v-model itself — #1543, #1643, #1989). Never
* returns undefined so consumers can always diff away stale keys.
*/
function resolveFallthroughAttrs(instance) {
const attrs = shouldUseFunctionalFallthrough(instance.type) ? getFunctionalFallthrough(instance.attrs) || EMPTY_OBJ : instance.attrs;
const propsOptions = normalizePropsOptions(instance.type)[0];
if (propsOptions) {
for (const key in attrs) if (isModelListener(key)) return filterModelListeners(attrs, propsOptions);
}
return attrs;
}
function applyFallthroughProps(el, attrs) {
isApplyingFallthroughProps = true;
try {
patchDynamicProps(el, attrs);
} finally {
isApplyingFallthroughProps = false;
}
}
/**
* dev only
*/
function createDevSetupStateProxy(setupState) {
return new Proxy(setupState, { get(target, key, receiver) {
if (isString(key) && !key.startsWith("__v") && !hasOwn(toRaw(setupState), key)) warn(`Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`);
return Reflect.get(target, key, receiver);
} });
}
function callRender(render, instance, setupState) {
return callWithErrorHandling(render, instance, 1, [
setupState,
instance.props,
instance.emit,
instance.attrs,
instance.slots
]);
}
/**
* dev only
* Runs devRender with everything it creates owned by a fresh per-render
* scope, so HMR rerender can tear down one generation by stopping the
* scope - including components nested inside elements, which the block
* graph cannot reach.
*/
function runDevRender(instance) {
instance.accessedAttrs = instance.props === instance.attrs;
(instance.renderScope = new EffectScope()).run(() => devRender(instance));
}
/**
* dev only
*/
function devRender(instance) {
const prev = setCurrentRenderingInstance(instance);
try {
instance.block = (instance.type.render ? callRender(instance.type.render, instance, instance.setupState) : callWithErrorHandling(isFunction(instance.type) ? instance.type : instance.type.setup, instance, 0, [instance.props, {
slots: instance.slots,
attrs: instance.attrs,
emit: instance.emit,
expose: instance.expose
}])) || [];
} finally {
setCurrentRenderingInstance(prev);
}
}
const emptyContext = {
app: null,
config: {},
provides: /*@__PURE__*/ Object.create(null)
};
var VaporComponentInstance = class {
constructor(comp, rawProps, rawSlots, appContext, ce) {
this.effectCount = 0;
this.vapor = true;
this.uid = nextUid();
this.type = comp;
this.parent = currentInstance;
if (currentInstance) {
this.root = currentInstance.root;
this.appContext = currentInstance.appContext;
this.provides = currentInstance.provides;
this.ids = currentInstance.ids;
} else {
this.root = this;
this.appContext = appContext || emptyContext;
this.provides = Object.create(this.appContext.provides);
this.ids = [
"",
0,
0
];
}
this.block = null;
this.scope = new EffectScope(true);
this.emit = emit.bind(null, this);
this.expose = expose.bind(null, this);
this.refs = EMPTY_OBJ;
this.emitted = this.exposed = this.exposeProxy = this.propsDefaults = null;
this.suspense = null;
this.suspenseId = 0;
if (isSuspenseEnabled) {
const suspense = this.suspense = currentRenderContext.suspense;
this.suspenseId = suspense ? suspense.pendingId : 0;
}
this.asyncDep = null;
this.asyncResolved = false;
this.isMounted = this.isUnmounted = this.isUpdating = this.isDeactivated = false;
this.propsValues = Object.create(null);
this.rawValues = INITIAL_RAW_VALUES;
this.propsDeps = void 0;
this.hasDynamicProps = true;
this.rawProps = rawProps || EMPTY_OBJ;
this.hasFallthrough = !!ce || hasFallthroughAttrs(comp, this.rawProps);
const [propsHandlers, attrsHandlers] = getPropsProxyHandlers(comp);
this.attrs = new Proxy(this, attrsHandlers);
this.props = comp.props ? new Proxy(this, propsHandlers) : isFunction(comp) ? this.attrs : EMPTY_OBJ;
const normalizedRawSlots = normalizeRawSlots(rawSlots);
this.rawSlots = normalizedRawSlots || EMPTY_OBJ;
this.slots = normalizedRawSlots ? new Proxy(normalizedRawSlots, dynamicSlotsProxyHandlers) : EMPTY_OBJ;
this.scopeId = getCurrentScopeId();
this.slotScopeIds = currentRenderContext.slotScopeIds;
if (ce) ce(this);
if (!!(process.env.NODE_ENV !== "production")) {
if (this.props === this.attrs) this.accessedAttrs = true;
else {
const attrs = this.attrs;
const instance = this;
this.attrs = new Proxy(attrs, { get(target, key, receiver) {
instance.accessedAttrs = true;
return Reflect.get(target, key, receiver);
} });
}
}
}
rawKeys() {
const vnode = isInteropEnabled && this.interopVNode;
return Object.keys(vnode ? vnode.props || EMPTY_OBJ : this.rawValues);
}
};
function isVaporComponent(value) {
return value instanceof VaporComponentInstance;
}
/**
* Resolve an asset component by name before passing it to the fallback helper;
* a string passed directly to `createComponentWithFallback` is plain element
* fallback, not a component name.
*/
function createAssetComponent(name, rawProps, rawSlots, isSingleRoot, once, maybeSelfReference, ns, appContext) {
return createComponentWithFallback(resolveComponent(name, maybeSelfReference), rawProps, rawSlots, isSingleRoot, once, ns, appContext);
}
/**
* Used when a component cannot be resolved at compile time
* and needs rely on runtime resolution - where it might fallback to a plain
* element if the resolution fails.
*/
function createComponentWithFallback(comp, rawProps, rawSlots, isSingleRoot, once, ns, appContext) {
if (comp === NULL_DYNAMIC_COMPONENT) {
if (isHydrating$1 && currentHydrationNode) {
if (isReusableNullComponentAnchor(currentHydrationNode)) {
const node = currentHydrationNode;
if (isComment(node, "")) advanceHydrationNode(node);
return node;
}
const nextAnchor = nextLogicalSibling(currentHydrationNode);
if (nextAnchor && isReusableNullComponentAnchor(nextAnchor)) return nextAnchor;
}
return !!(process.env.NODE_ENV !== "production") ? /* @__PURE__ */ createComment("ndc") : /* @__PURE__ */ createTextNode("");
}
if (!isString(comp)) return createComponent(comp, rawProps, rawSlots, isSingleRoot, once, appContext);
return createPlainElement(comp, rawProps, rawSlots, isSingleRoot, once, ns);
}
function isReusableNullComponentAnchor(node) {
return isComment(node, "") || !!(process.env.NODE_ENV !== "production") && (isComment(node, "dynamic-component") || isComment(node, "async component") || isComment(node, "keyed"));
}
function createPlainElement(comp, rawProps, rawSlots, isSingleRoot, once, ns) {
rawSlots = normalizeRawSlots(rawSlots);
const _insertionParent = insertionParent;
const _insertionAnchor = insertionAnchor;
let hydrationCursor = null;
if (isHydrating$1) hydrationCursor = enterHydrationCursor();
else resetInsertionState();
const defaultSlot = rawSlots && getSlot(rawSlots, "default");
const hasDynamicSlots = !!rawSlots && !!rawSlots.$;
const adoptHydrationChildren = !!defaultSlot;
const hydrationTemplate = hasDynamicSlots && !defaultSlot ? `<${comp}><!></${comp}>` : `<${comp}/>`;
const el = isHydrating$1 ? adoptTemplate(currentHydrationNode, hydrationTemplate, adoptHydrationChildren, ns) : /* @__PURE__ */ createElement(comp, ns);
el.$root = isSingleRoot;
if ((isKeepAliveEnabled || isTransitionEnabled) && rawProps) {
const key = resolveSource(rawProps.key);
if (key !== void 0) el.$key = key;
}
if (!isHydrating$1 || isRecreatedNode(el)) {
const scopeId = getCurrentScopeId();
if (scopeId) el.setAttribute(scopeId, "");
const slotScopeIds = currentRenderContext.slotScopeIds;
if (slotScopeIds) setElementScopeIds(el, slotScopeIds);
}
if (rawProps) {
const isSVG = ns === 1;
const setFn = () => patchDynamicProps(el, resolveDynamicProps(rawProps), isSVG, isHydrating$1 ? getStaticBindingKeys(rawProps) : void 0);
if (once) setFn();
else renderEffect(setFn);
}
if (rawSlots) {
let nextNode = null;
if (isHydrating$1) {
nextNode = nextLogicalSibling(el);
let child = el.firstChild;
if (rawSlots.$ && !child) child = el.appendChild(claimAnchor(!!(process.env.NODE_ENV !== "production") ? /* @__PURE__ */ createComment("") : /* @__PURE__ */ createTextNode()));
setCurrentHydrationNode(child);
}
if (rawSlots.$) {
const frag = new DynamicFragment(512, !!(process.env.NODE_ENV !== "production") ? isHydrating$1 ? "" : "slot" : void 0);
if (isHydrating$1) locateHydrationNode();
renderEffect(() => frag.update(getSlot(rawSlots, "default")));
if (!isHydrating$1) insert(frag, el);
registerNestedVDOMCleanup(frag);
} else {
const slot = getSlot(rawSlots, "default");
if (slot) {
let end;
if (isHydrating$1) {
end = el.appendChild(claimAnchor(/* @__PURE__ */ createComment("nce")));
if (!currentHydrationNode) setCurrentHydrationNode(end);
}
const block = slot();
if (end) el.removeChild(end);
if (!isHydrating$1) insert(block, el);
registerNestedVDOMCleanup(block);
}
}
if (isHydrating$1) setCurrentHydrationNode(nextNode);
}
finishBlockCreation(el, void 0, hydrationCursor, _insertionParent, _insertionAnchor);
return el;
}
function mountComponent(instance, parent, anchor) {
if (isSuspenseEnabled && instance.suspense && instance.asyncDep && !instance.asyncResolved) {
if (instance.asyncDepRegistered) {
if (instance.pendingBlock) insert(instance.pendingBlock, parent, anchor);
else if (instance.block) insert(instance.block, parent, anchor);
if (isKeepAliveEnabled && instance.shapeFlag & 512) instance.isDeactivated = false;
return;
}
const suspense = instance.suspense;
const deferred = isKeepAliveEnabled && deferKeepAliveRenderEffects(instance);
const hydrating = isHydrating$1;
if (!hydrating) {
instance.block = /* @__PURE__ */ createComment("");
insert(instance.block, parent, anchor);
}
instance.asyncDepRegistered = true;
const component = instance.type;
let asyncSetupFinished = false;
const finishAsyncSetup = (setupResult) => {
if (asyncSetupFinished) return;
asyncSetupFinished = true;
instance.asyncResolved = true;
const handleResult = () => {
const prevInstance = setCurrentInstance(instance);
const prevSub = setActiveSub();
try {
handleSetupResult(setupResult, component, instance);
} finally {
setActiveSub(prevSub);
restoreCurrentInstance(prevInstance);
}
};
try {
const pendingBlock = hydrating ? instance.pendingBlock : instance.block;
const { parentNode, nextNode } = findBlockBoundary(pendingBlock);
const renderAndMount = () => {
handleResult();
mountComponent(instance, parentNode, nextNode);
};
if (hydrating) hydrateNode(getBlockFirstNode(pendingBlock), () => {
const hydration = enterComponentHydration(component);
try {
withDeferredHydrationBoundary(renderAndMount);
} finally {
exitComponentHydration(hydration, true);
}
});
else {
renderAndMount();
remove(pendingBlock, parentNode);
}
} finally {
if (hydrating) instance.pendingBlock = void 0;
}
};
suspense.registerDep(instance, (setupResult) => {
if (deferred) {
if (deferred.pendingRoot === instance) deferred.pendingRoot = void 0;
if (!deferred.flushQueued) {
deferred.flushQueued = true;
queuePostRenderEffect(deferred.flushJob, void 0, deferred.suspense);
}
}
finishAsyncSetup(setupResult);
});
if (deferred) {
const state = deferred;
instance.asyncDep.catch(NOOP).then((setupResult) => {
if (asyncSetupFinished) return;
if (!instance.isUnmounted && !suspense.isUnmounted && !suspense.pendingBranch) finishAsyncSetup(setupResult);
if (!state.flushQueued && state.pendingRoot === instance) settleDeferredKeepAliveUpdates(state);
});
}
return;
}
if (isKeepAliveEnabled && instance.shapeFlag & 512 && instance.isMounted) {
instance.parent.ctx.activate(instance, parent, anchor);
return;
}
const { root, type } = instance;
if (root && root.ce && root.ce._hasShadowRoot()) root.ce._injectChildStyle(type, instance.parent ? instance.parent.type : void 0);
if (!!(process.env.NODE_ENV !== "production")) startMeasure(instance, `mount`);
if (instance.bm) invokeArrayFns(instance.bm);
if (!isHydrating$1) {
applyComponentScopeIds(instance);
insert(instance.block, parent, anchor, instance.suspense);
} else hydrateComponentScopeIds(instance);
if (instance.m) queuePostRenderEffect(instance.m, void 0, instance.suspense);
if (isKeepAliveEnabled && instance.shapeFlag & 256 && instance.a) queuePostRenderEffect(instance.a, void 0, instance.suspense);
instance.isMounted = true;
if (!!(process.env.NODE_ENV !== "production")) endMeasure(instance, `mount`);
}
function registerUnmount(instance) {
const scope = instance.unmountScope;
onScopeDispose$1(() => {
if (scope && instance.unmountScope === scope) instance.unmountScope = void 0;
unmountComponent(instance, void 0, isInteropEnabled ? resolveUnmountSuspense(instance.suspense) : instance.suspense);
}, true);
}
function unmountComponent(instance, parentNode, parentSuspense = instance.suspense) {
if (isSuspenseEnabled && isInteropEnabled && currentUnmountSuspense !== parentSuspense) {
runWithUnmountSuspense(parentSuspense, () => unmountComponent(instance, parentNode, parentSuspense));
return;
}
if (isKeepAliveEnabled && instance.shapeFlag & 256 && instance.parent && instance.parent.vapor && instance.parent.ctx) {
if (parentNode) instance.parent.ctx.deactivate(instance, parentSuspense);
return;
}
const pendingAsyncSetup = !!instance.asyncDep && !instance.asyncResolved;
if (!instance.isUnmounted) {
const hasLifecycle = instance.isMounted || pendingAsyncSetup;
if (!!(process.env.NODE_ENV !== "production")) unregisterHMR(instance);
if (hasLifecycle) {
invalidateMount(instance.m);
invalidateMount(instance.a);
if (instance.bum) invokeArrayFns(instance.bum);
}
if (isKeepAliveEnabled) {
const inputScope = instance.inputScope;
if (inputScope) inputScope.stop();
}
instance.scope.stop();
if (hasLifecycle && instance.um) queuePostRenderEffect(instance.um, void 0, parentSuspense);
instance.isUnmounted = true;
}
if (isSuspenseEnabled && pendingAsyncSetup) {
if (instance.pendingBlock) {
if (parentNode) {
const pendingBlock = instance.pendingBlock;
const { parentNode: blockParent } = findBlockBoundary(pendingBlock);
if (blockParent) remove(pendingBlock, blockParent);
instance.pendingBlock = void 0;
}
} else if (instance.block instanceof Comment) {
const blockParent = instance.block.parentNode;
if (blockParent) remove(instance.block, blockParent);
}
} else if (parentNode) {
if (instance.block) remove(instance.block, parentNode);
}
}
function getExposed(instance) {
if (instance.exposed) return instance.exposeProxy || (instance.exposeProxy = new Proxy(markRaw(instance.exposed), {
get: (target, key) => unref(target[key]),
set: (target, key, value, receiver) => {
const oldValue = target[key];
if (isRef(oldValue) && !isRef(value)) {
oldValue.value = value;
return true;
}
return Reflect.set(target, key, value, receiver);
}
}));
}
function getRootElement(block, visitor) {
if (block instanceof Element) return block;
if (isVaporComponent(block)) {
if (visitor) {
if (visitor.onComponent && visitor.onComponent(block)) return;
if (visitor.stopAtComponent) return;
}
return getRootElement(block.block, visitor);
}
if (isFragment(block) && !(isTeleportEnabled && isTeleportFragment(block))) {
if (visitor) {
if (visitor.excludeSlotOutlets && isSlotOutletFragment(block)) return;
if (isDynamicFragment(block) && visitor.onDynamicFragment && visitor.onDynamicFragment(block)) return;
if (isInteropEnabled && visitor.onInteropFragment && isInteropFragment(block) && visitor.onInteropFragment(block)) return;
}
return getRootElement(block.nodes, visitor);
}
if (isArray(block)) {
const single = singleRootOf(block);
return single === void 0 ? void 0 : getRootElement(single, visitor);
}
}
function singleRootOf(nodes) {
let single;
let hasComment = false;
for (const b of nodes) {
if (b instanceof Comment) {
hasComment = true;
continue;
}
if (single !== void 0) return;
single = b;
}
return hasComment ? single : void 0;
}
/**
* Descends the same effective-root rules as getRootElement but stops at the
* first component instead of resolving an element. Used to verify `child`
* sits on `parent`'s root chain when the chain passes through fragments
* (where `parent.block === child` cannot see the link).
*/
function getRootChainComponent(block) {
while (true) {
if (isVaporComponent(block)) return block;
if (isFragment(block) && !(isTeleportEnabled && isTeleportFragment(block))) {
if (isSlotOutletFragment(block)) return;
block = block.nodes;
continue;
}
if (isArray(block)) {
const single = singleRootOf(block);
if (single === void 0) return;
block = single;
continue;
}
return;
}
}
function handleSetupResult(setupResult, component, instance) {
if (!!(process.env.NODE_ENV !== "production")) pushWarningContext(instance);
if (isBlock(setupResult)) instance.block = setupResult;
else if (isFunction(setupResult) && instance.asyncDep) instance.block = callWithErrorHandling(setupResult, instance, 1) || [];
else if (isFunction(component)) {
if (!!(process.env.NODE_ENV !== "production")) warn(`Functional vapor component must return a block directly.`);
instance.block = [];
} else if (!component.render) {
if (!!(process.env.NODE_ENV !== "production")) warn(`Vapor component setup() returned non-block value, and has no render function.`);
instance.block = [];
} else {
if (!!(process.env.NODE_ENV !== "production") || __VUE_PROD_DEVTOOLS__) instance.devtoolsRawSetupState = setupResult;
if (!!(process.env.NODE_ENV !== "production")) {
instance.setupState = createDevSetupStateProxy(proxyRefs(setupResult));
runDevRender(instance);
} else instance.block = callRender(component.render, instance, setupResult) || [];
}
applyComponentFallthrough(instance);
if (!!(process.env.NODE_ENV !== "production")) popWarningContext();
}
function applyComponentFallthrough(instance) {
if (instance.hasFallthrough && instance.type.inheritAttrs !== false) applyFallthroughAttrs(instance.block, instance, !!(process.env.NODE_ENV !== "production") ? instance.renderScope : void 0);
}
function applyFallthroughAttrs(block, instance, scope) {
const state = new FallthroughResolveState(scope);
const root = resolveFallthroughRoot(block, state);
const { fragments, innermost, hasSlotOutlet } = state;
if (fragments) for (const frag of fragments) registerDynamicFragmentFallthroughAttrs(frag, instance);
if (root && !hasSlotOutlet) {
let ownerScope = scope;
if (innermost) ownerScope = innermost.scope || (innermost.scope = state.parentScope ? state.parentScope.run(() => new EffectScope()) : new EffectScope());
const applyEffect = () => renderEffect(() => applyFallthroughProps(root, resolveFallthroughAttrs(instance)));
ownerScope ? ownerScope.run(applyEffect) : applyEffect();
} else if (!!(process.env.NODE_ENV !== "production")) {
const accessedAttrs = instance.accessedAttrs;
const fallthroughAttrs = resolveFallthroughAttrs(instance);
if (Object.keys(fallthroughAttrs).length && (hasSlotOutlet || fragments && state.hasNonSingleRoot || isTeleportEnabled && containsTeleportFragment(block) || !accessedAttrs && (block instanceof Text || isArray(block) && block.length))) warnExtraneousAttributes(instance.attrs);
}
}
var FallthroughResolveState = class {
constructor(parentScope) {
this.stopAtComponent = true;
this.parentScope = parentScope;
}
onDynamicFragment(frag) {
if (frag.__vf & 4) {
this.hasSlotOutlet = true;
return true;
}
(this.fragments || (this.fragments = [])).push(frag);
if (this.innermost && this.innermost.scope) this.parentScope = this.innermost.scope;
this.innermost = frag;
}
onInteropFragment(frag) {
if (isSlotOutletFragment(frag)) return this.hasSlotOutlet = true;
return !!frag.vnode;
}
};
function resolveFallthroughRoot(block, state) {
const root = getRootElement(block, state);
const { innermost } = state;
if (!!(process.env.NODE_ENV !== "production") && !root && innermost) {
const { nodes } = innermost;
state.hasNonSingleRoot = isArray(nodes) && nodes.some((child) => !(child instanceof Comment));
}
return root;
}
function containsTeleportFragment(block) {
if (isTeleportFragment(block)) return true;
if (isArray(block)) return block.some((child) => !(child instanceof Comment) && containsTeleportFragment(child));
return isFragment(block) && containsTeleportFragment(block.nodes);
}
function registerDynamicFragmentFallthroughAttrs(frag, instance) {
if (frag.fallthrough) return;
frag.fallthrough = (nodes) => applyFallthroughAttrs(nodes, instance, frag.scope);
}
/**
* A deferred state stays live while its async root is pending or its flush is
* queued for the same Suspense generation. The flush is requeued if that
* generation is discarded, so `flushQueued` cannot strand buffered updates.
*/
function isDeferredKeepAliveStateLive(state) {
const suspense = state.suspense;
if (suspense.isUnmounted || state.pendingId !== suspense.pendingId) return false;
if (state.flushQueued) return true;
const root = state.pendingRoot;
return !!root && !root.isUnmounted;
}
function settleDeferredKeepAliveUpdates(state, currentJob) {
const { effects, owners } = state;
state.effects = [];
state.owners = [];
state.pendingRoot = void 0;
for (let i = 0; i < owners.length; i++) if (owners[i].deferredKeepAliveUpdates === state) owners[i].deferredKeepAliveUpdates = void 0;
if (currentJob && !effects.includes(currentJob)) effects.push(currentJob);
if (effects.length > 1) effects.sort((a, b) => a.order - b.order);
for (let i = 0; i < effects.length; i++) {
const job = effects[i];
callWithErrorHandling(job, job.i, job.i ? 15 : 14);
}
}
function deferKeepAliveRenderEffects(instance) {
const suspense = instance.suspense;
const owners = [];
let keepAlive;
if (isHydrating$1) {
const owner = instance.parent;
if (owner && owner.vapor && isKeepAlive(owner) && owner.suspense === suspense) {
keepAlive = owner;
owners.push(keepAlive);
}
} else {
let child = instance;
let owner = instance.parent;
while (owner && owner.vapor && owner.suspense === suspense) {
const vaporOwner = owner;
let root = vaporOwner.block;
while (isDynamicFragment(root) && !(root.__vf & 4)) root = root.nodes;
if (root !== child) return;
owners.push(vaporOwner);
if (isKeepAlive(owner)) keepAlive = vaporOwner;
child = vaporOwner;
owner = vaporOwner.parent;
}
}
if (!keepAlive) return;
let deferred = keepAlive.deferredKeepAliveUpdates;
if (!deferred || deferred.suspense !== suspense || deferred.pendingId !== instance.suspenseId) {
const flushJob = () => {
state.flushQueued = false;
if (keepAlive.deferredKeepAliveUpdates !== state || state.pendingRoot) return;
settleDeferredKeepAliveUpdates(state);
};
flushJob.flags = 8;
const state = {
effects: [],
owners: [],
suspense,
pendingId: instance.suspenseId,
pendingRoot: instance,
flushQueued: false,
flushJob
};
deferred = state;
} else deferred.pendingRoot = instance;
for (let i = 0; i < owners.length; i++) {
const owner = owners[i];
if (owner.deferredKeepAliveUpdates !== deferred) {
owner.deferredKeepAliveUpdates = deferred;
deferred.owners.push(owner);
}
}
return deferred;
}
//#endregion
//#region packages/runtime-vapor/src/apiCreateApp.ts
let _createApp;
const rootInstances = /* @__PURE__ */ new WeakMap();
const mountApp = (app, container) => {
optimizePropertyLookup();
if (container.nodeType === 1) {
if (!!(process.env.NODE_ENV !== "production") && container.childNodes.length) warn("mount target container is not empty and will be cleared.");
container.textContent = "";
}
const instance = app._ceComponent || createComponent(app._component, app._props, null, false, false, app._context, true);
mountComponent(instance, container);
flushOnAppMount();
rootInstances.set(app, instance);
return instance;
};
let _hydrateApp;
const hydrateApp = (app, container) => {
if (!container.hasChildNodes()) {
(process.env.NODE_ENV !== "production" || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn("Attempting to hydrate existing markup but container is empty. Performing full mount instead.");
return mountApp(app, container);
}
optimizePropertyLookup();
let instance;
withHydration(container, () => {
instance = app._ceComponent || createComponent(app._component, app._props, null, false, false, app._context, true);
mountComponent(instance, container);
flushOnAppMount();
});
rootInstances.set(app, instance);
return instance;
};
const unmountApp = (app) => {
const instance = !!(process.env.NODE_ENV !== "production") && app._instance || rootInstances.get(app);
unmountComponent(instance, app._container);
flushOnAppMount(instance);
rootInstances.delete(app);
};
function prepareApp() {
initFeatureFlags();
const target = getGlobalThis();
target.__VUE__ = true;
if (!!(process.env.NODE_ENV !== "production") || __VUE_PROD_DEVTOOLS__) setDevtoolsHook(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target);
}
function postPrepareApp(app) {
app.vapor = true;
const mount = app.mount;
app.mount = (container, ...args) => {
container = normalizeContainer(container);
if (!container) return;
const proxy = mount(container, ...args);
if (container instanceof Element) {
container.removeAttribute("v-cloak");
container.setAttribute("data-v-app", "");
}
return proxy;
};
}
const createVaporApp = (comp, props) => {
prepareApp();
if (!_createApp) _createApp = createAppAPI(mountApp, unmountApp, getExposed);
const app = _createApp(comp, props);
postPrepareApp(app);
return app;
};
const createVaporSSRApp = (comp, props) => {
setIsHydratingEnabled(true);
prepareApp();
if (!_hydrateApp) _hydrateApp = createAppAPI(hydrateApp, unmountApp, getExposed);
const app = _hydrateApp(comp, props);
postPrepareApp(app);
return app;
};
//#endregion
//#region packages/runtime-vapor/src/apiDefineComponent.ts
/*@__NO_SIDE_EFFECTS__*/
function defineVaporComponent(comp, extraOptions) {
if (isFunction(comp)) return /*@__PURE__*/ (() => extend$1({ name: comp.name }, extraOptions, {
setup: comp,
__vapor: true
}))();
comp.__vapor = true;
return comp;
}
//#endregion
//#region packages/runtime-vapor/src/apiDefineAsyncComponent.ts
function defineVaporAsyncComponent(source) {
enableAsyncComponent();
const { load, getResolvedComp, setPendingRequest, source: { loadingComponent, errorComponent, delay, hydrate: hydrateStrategy, timeout, suspensible = true } } = createAsyncComponentContext(source);
return /* @__PURE__ */ defineVaporComponent({
name: "VaporAsyncComponentWrapper",
__asyncLoader: load,
__asyncHydrate(el, instance, hydrate) {
if (!isHydrating$1) return;
const endAnchor = isRangeStart(el) ? locateEndAnchor(el) : null;
let nodes;
if (endAnchor) {
const end = /* @__PURE__ */ _next(endAnchor);
const range = nodes = [el];
let cur = el;
while (true) {
let n = /* @__PURE__ */ _next(cur);
if (n && n !== end) range.push(cur = n);
else break;
}
} else nodes = el;
const prev = setCurrentInstance(instance);
try {
const frag = new DynamicFragment(0, !!(process.env.NODE_ENV !== "production") ? "async component" : void 0);
frag.nodes = nodes;
instance.block = frag;
} finally {
restoreCurrentInstance(prev);
}
instance.isMounted = true;
setCurrentHydrationNode(nextLogicalSibling(el));
performAsyncHydrate(el, instance, () => hydrateNode(el, () => withDeferredHydrationBoundary(hydrate)), getResolvedComp, load, hydrateStrategy, false);
},
get __asyncResolved() {
return getResolvedComp();
},
setup() {
const instance = currentInstance;
markAsyncBoundary(instance);
const placeholder = instance.block;
let frag;
if (isHydrating$1 && isDynamicFragment(placeholder)) {
frag = placeholder;
frag.nodes = EMPTY_BLOCK;
locateHydrationNode();
} else {
frag = new DynamicFragment(0, !!(process.env.NODE_ENV !== "production") ? "async component" : void 0);
if (isHydrating$1) locateHydrationNode();
}
let resolvedComp = getResolvedComp();
if (resolvedComp) {
frag.update(() => createInnerComp(resolvedComp, instance));
if (frag === placeholder) {
const u = frag.u;
if (u) u.forEach((hook) => hook(frag.nodes));
}
return frag;
}
const onError = (err) => {
setPendingRequest(null);
handleError(err, instance, 13, !errorComponent);
};
if (suspensible && instance.suspense) {
const renderBranch = (render) => {
if (!instance.isUnmounted) instance.scope.run(() => frag.update(render));
};
return load().then(() => {
resolvedComp = getResolvedComp();
if (resolvedComp) renderBranch(() => createInnerComp(resolvedComp, instance));
return frag;
}).catch((err) => {
onError(err);
if (errorComponent) renderBranch(() => createErrorComp(errorComponent, instance, () => err));
return frag;
});
}
const { loaded, error, delayed } = useAsyncComponentState(delay, timeout, onError, instance);
load().then(() => {
if (instance.isUnmounted) return;
loaded.value = true;
}).catch((err) => {
if (instance.isUnmounted) {
setPendingRequest(null);
return;
}
onError(err);
error.value = err;
});
renderEffect(() => {
resolvedComp = getResolvedComp();
let render;
let key;
if (loaded.value && resolvedComp) {
render = () => createInnerComp(resolvedComp, instance);
key = 1;
} else if (error.value && errorComponent) {
render = () => createErrorComp(errorComponent, instance, () => error.value);
key = 2;
} else if (loadingComponent && !delayed.value) {
render = () => createInnerComp(loadingComponent, instance);
key = 3;
}
frag.update(render, key);
if (isKeepAliveEnabled && frag.keepAliveCtx) frag.keepAliveCtx.cacheBlock();
});
return frag;
}
});
}
/**
* The block an async wrapper has settled on, or undefined while it is
* unresolved or (under deferred hydration) resolved but not set up yet.
* Consumers reading through the wrapper treat undefined as unresolved.
*/
function getAsyncWrapperInner(instance) {
const frag = instance.block;
if (isDynamicFragment(frag) && frag.current !== void 0 && instance.type.__asyncResolved) return frag.nodes;
}
function createErrorComp(comp, parent, getError) {
return createInnerComp(comp, parent, {
error: getError,
$: [() => trackRawValues(parent)]
}, {});
}
function createInnerComp(comp, parent, rawProps = { $: [() => trackRawValues(parent)] }, rawSlots = parent.rawSlots) {
const prevInstance = setCurrentInstance(parent);
try {
return createComponent(comp, rawProps, rawSlots, void 0, void 0, parent.appContext);
} finally {
restoreCurrentInstance(prevInstance);
}
}
//#endregion
//#region packages/runtime-vapor/src/components/Transition.ts
let registered = false;
const ensureTransitionHooksRegistered = () => {
if (!registered) {
registered = true;
registerTransitionHooks(applyTransitionHooksImpl, applyTransitionLeaveHooksImpl, deferBranchUpdateDuringLeaveImpl, removeBranchWithLeaveImpl);
}
};
const hydrateTransitionImpl = (suspense) => {
if (!currentHydrationNode || !isTemplateNode(currentHydrationNode)) return;
const templateNode = currentHydrationNode;
const { content, parentNode } = templateNode;
const { firstChild } = content;
if (firstChild) {
let transitionEl;
for (let node = firstChild; node; node = node.nextSibling) if (node instanceof Element) {
transitionEl = node;
break;
}
parentNode.insertBefore(content, templateNode);
parentNode.removeChild(templateNode);
updateLastLocatedLogicalChild(parentNode, templateNode, firstChild);
setCurrentHydrationNode(firstChild);
if (transitionEl instanceof HTMLElement || transitionEl instanceof SVGElement) {
const originalDisplay = transitionEl.style.display;
transitionEl.style.display = "none";
return (hooks) => {
hooks.beforeEnter(transitionEl);
transitionEl.style.display = originalDisplay;
queuePostRenderEffect(() => hooks.enter(transitionEl), void 0, suspense);
};
}
}
};
const decorate$1 = (t) => {
t.displayName = displayName;
t.props = TransitionPropsValidators;
t.__vapor = true;
return t;
};
const VaporTransition = /*@__PURE__*/ decorate$1((props, { slots, expose }) => {
expose();
ensureTransitionHooksRegistered();
const instance = currentInstance;
const performAppear = isHydrating$1 ? hydrateTransitionImpl(instance.suspense) : void 0;
const state = useTransitionState();
const { mode } = props;
process.env.NODE_ENV !== "production" && checkTransitionMode(mode);
const resolvedProps = computed(() => resolveTransitionProps(props));
const propsProxy = new Proxy({}, { get(_, key) {
return resolvedProps.value[key];
} });
const shouldPerformAppear = !!props.appear && !!performAppear;
if (instance.rawSlots.$) {
const frag = new DynamicFragment(0, !!(process.env.NODE_ENV !== "production") ? "transition" : void 0);
if (isHydrating$1) locateHydrationNode();
state.root = frag;
let isMounted = false;
renderEffect(() => {
if (!frag.$transition) frag.$transition = resolveTransitionHooks(frag, propsProxy, state, instance);
else frag.$transition.mode = resolvedProps.value.mode;
const prevNodes = frag.nodes;
frag.update(slots.default);
if (isMounted && frag.nodes === prevNodes && !state.isLeaving) frag.$transition = applyTransitionHooksImpl(frag.nodes, frag.$transition, void 0, true);
if (!isMounted && shouldPerformAppear) performAppear(frag.$transition);
isMounted = true;
});
return frag;
}
const children = slots.default && slots.default() || [];
state.root = children;
const hooks = {
__vapor: true,
state,
props: propsProxy,
instance
};
let isMounted = false;
renderEffect(() => {
const appliedHooks = applyTransitionHooksImpl(children, hooks, void 0, isMounted);
if (!isMounted) {
isMounted = true;
if (shouldPerformAppear) performAppear(appliedHooks);
}
});
return children;
});
const transitionTypeMap = /* @__PURE__ */ new WeakMap();
function getTransitionType(block) {
const type = transitionTypeMap.get(block);
if (type !== void 0) return type;
if (block instanceof Element) return block.localName;
if (isInteropEnabled && isFragment(block) && block.getTransitionType) {
const type = block.getTransitionType();
if (type !== void 0) return type;
}
return block;
}
function setTransitionType(block, type) {
transitionTypeMap.set(block, type);
}
function getLeavingNodesForType(state, block) {
const { leavingNodes } = state;
const type = getTransitionType(block);
let nodes = leavingNodes.get(type);
if (!nodes) {
nodes = Object.create(null);
leavingNodes.set(type, nodes);
}
return nodes;
}
function getLeaveElement(block) {
const el = getTransitionElement(block);
if (el) return el;
if (isFragment(block) && !isArray(block.nodes) && (block.nodes instanceof Element || isFragment(block.nodes))) return getLeaveElement(block.nodes);
}
const transitionKeys = /* @__PURE__ */ new WeakMap();
function getTransitionKey(block) {
return transitionKeys.get(block);
}
function setTransitionKey(block, key) {
transitionKeys.set(block, key);
}
const getTransitionHooksContext = (block, state) => {
const key = String(getTransitionKey(block));
const leavingNodes = getLeavingNodesForType(state, block);
return {
isLeaving: () => leavingNodes[key] === block,
setLeavingNodeCache: () => {
leavingNodes[key] = block;
},
unsetLeavingNodeCache: () => {
if (leavingNodes[key] === block) delete leavingNodes[key];
},
earlyRemove: () => {
const leavingNode = leavingNodes[key];
if (leavingNode && getTransitionKey(leavingNode) === getTransitionKey(block)) {
const el = getLeaveElement(leavingNode);
if (el && el[leaveCbKey]) el[leaveCbKey]();
}
}
};
};
function resolveTransitionHooks(block, props, state, instance) {
const context = getTransitionHooksContext(block, state);
const hooks = baseResolveTransitionHooks(context, props, state, instance);
hooks.__vapor = true;
hooks.persisted = hooks.persisted || !!state.persisted;
hooks.state = state;
hooks.props = props;
hooks.instance = instance;
return hooks;
}
function applyTransitionHooksImpl(block, hooks, owner, refresh = false) {
if (isArray(block)) {
block = block.filter((b) => !(b instanceof Comment));
if (block.length === 1) block = block[0];
else if (block.length === 0) return hooks;
}
if (hooks.applyGroup && (isForFragment(block) || isVaporSlotOutlet(block) || isVaporComponent(block) && isVaporSlotOutlet(block.block))) {
hooks.applyGroup(block, hooks.props, hooks.state, hooks.instance);
return hooks;
}
const fragments = [];
const child = resolveTransitionBlock(block, (fragment) => {
fragments.push(fragment);
if (refresh && fragment.$transition) hooks = fragment.$transition;
}, owner);
if (refresh && child && child.$transition) hooks = child.$transition;
if (!child) {
fragments.forEach((f) => f.$transition = hooks);
if (!!(process.env.NODE_ENV !== "production") && fragments.length === 0) warn("Transition component has no valid child element");
return hooks;
}
const { props, instance, state, delayedLeave } = hooks;
state.persisted = isPersistedRoot(state.root);
const resolvedHooks = resolveTransitionHooks(child, props, state, instance);
resolvedHooks.delayedLeave = delayedLeave;
child.$transition = resolvedHooks;
fragments.forEach((f) => f.$transition = resolvedHooks);
return resolvedHooks;
}
function isPersistedRoot(block) {
while (block) {
if (block.$vshow) return true;
if (isVaporComponent(block)) {
if (isVaporTransition(block.type)) return false;
block = isAsyncComponentEnabled && isAsyncWrapper(block) ? getAsyncWrapperInner(block) : block.block;
} else if (isArray(block)) block = block.find((b) => !(b instanceof Comment));
else if (isFragment(block) && (isVaporSlotOutlet(block) || !(isDynamicFragment(block) || isForFragment(block)))) block = block.nodes;
else return false;
}
return false;
}
function applyTransitionLeaveHooksImpl(block, enterHooks, afterLeaveCb) {
const leavingBlock = findTransitionBlock(block);
if (!leavingBlock) return false;
const { props, state, instance } = enterHooks;
const leavingHooks = resolveTransitionHooks(leavingBlock, props, state, instance);
leavingBlock.$transition = leavingHooks;
const { mode } = props;
if (mode === "out-in") {
state.isLeaving = true;
leavingHooks.afterLeave = () => {
state.isLeaving = false;
afterLeaveCb();
leavingBlock.$transition = void 0;
delete leavingHooks.afterLeave;
};
} else if (mode === "in-out") leavingHooks.delayLeave = (block, earlyRemove, delayedLeave) => {
const leavingNodes = getLeavingNodesForType(state, leavingBlock);
const leavingKey = String(getTransitionKey(leavingBlock));
leavingNodes[leavingKey] = leavingBlock;
const delayedLeaveCb = createDelayedLeave(leavingBlock, delayedLeave);
block[leaveCbKey] = () => {
delayedLeaveCb(true);
earlyRemove();
block[leaveCbKey] = void 0;
leavingBlock.$transition = void 0;
if (leavingNodes[leavingKey] === leavingBlock) delete leavingNodes[leavingKey];
};
enterHooks.delayedLeave = delayedLeaveCb;
};
return true;
}
function createDelayedLeave(block, leave) {
return (cancelled) => {
if (!leave) return;
const cb = leave;
const leavingBlock = block;
leave = block = void 0;
if (!cancelled) {
cb();
leavingBlock.$transition = void 0;
}
};
}
function deferBranchUpdateDuringLeaveImpl(frag, render, key, noScope, branchKey) {
if (!frag.$transition.state.isLeaving) return false;
const pending = frag.pending;
if (pending) {
pending.render = render;
pending.key = key;
pending.noScope = noScope;
pending.branchKey = branchKey;
} else frag.pending = {
render,
key,
noScope,
branchKey
};
return true;
}
function removeBranchWithLeaveImpl(frag, transition, parent, render, key, noScope, branchKey) {
const mode = transition.mode;
if (mode && !transition.persisted && (mode !== "in-out" || render) && (mode !== "out-in" || isValidBlock(frag.nodes))) {
const instance = currentInstance;
let enterHooks = transition;
if (mode === "in-out") enterHooks = frag.$transition = extend$1({}, transition);
applyTransitionLeaveHooksImpl(frag.nodes, enterHooks, () => {
if (transition.state.isUnmounting) return;
const prevInstance = setCurrentInstance(instance);
try {
const pending = frag.pending;
if (pending) {
frag.pending = void 0;
frag.renderBranch(pending.render, transition, parent, pending.key, pending.noScope, true, void 0, pending.branchKey);
} else frag.renderBranch(render, transition, parent, key, noScope, true, void 0, branchKey);
} finally {
restoreCurrentInstance(prevInstance);
}
});
if (mode === "out-in") {
parent && remove(frag.nodes, parent);
return true;
}
}
return false;
}
const ROOT_KEY_CONTEXT = { key: void 0 };
const keyContexts = /* @__PURE__ */ new WeakMap();
const KEY_CONTEXT_OWNER = 34;
function transitionTypeOf(block) {
return isAsyncComponentEnabled && block.type.__asyncResolved || block.type;
}
function withDefaultKey(ctx, key) {
return ctx.type || key == null ? ctx : { key };
}
function isUnresolvedAsyncWrapper(block) {
return isAsyncComponentEnabled && isAsyncWrapper(block) && getAsyncWrapperInner(block) === void 0;
}
function enterComponentKeyContext(ctx, block, unresolved = isUnresolvedAsyncWrapper(block)) {
var _block$$key;
if (ctx.type) return ctx;
return unresolved ? withDefaultKey(ctx, block.$key) : {
key: (_block$$key = block.$key) !== null && _block$$key !== void 0 ? _block$$key : ctx.key,
type: transitionTypeOf(block)
};
}
function enterFragmentKeyContext(frag, ctx, key = getFragmentKey(frag)) {
if (frag.__vf & KEY_CONTEXT_OWNER) keyContexts.set(frag, ctx);
return withDefaultKey(ctx, key);
}
function resolveChildIdentity(child, ctx) {
var _child$$key;
transitionKeys.set(child, ctx.type ? ctx.key : (_child$$key = child.$key) !== null && _child$$key !== void 0 ? _child$$key : ctx.key);
if (ctx.type) setTransitionType(child, ctx.type);
}
/**
* Resolve the transition child of `block` together with its identity.
* `owner` is the fragment whose content `block` is.
*/
function resolveTransitionBlock(block, onFragment, owner) {
const ctx = owner ? withDefaultKey(keyContexts.get(owner) || ROOT_KEY_CONTEXT, getFragmentKey(owner)) : ROOT_KEY_CONTEXT;
const children = [];
collectTransitionBlocks$1(block, onFragment, children, ctx);
return children[0];
}
/** Locate the transition child of `block` without touching its identity. */
function findTransitionBlock(block) {
const children = [];
collectTransitionBlocks$1(block, void 0, children, void 0);
return children[0];
}
function collectTransitionBlocks$1(block, onFragment, children, ctx) {
if (block instanceof Node) {
if (block instanceof Element) {
children.push(block);
if (ctx) resolveChildIdentity(block, ctx);
}
} else if (isVaporComponent(block)) collectComponentTransitionBlocks(block, onFragment, children, ctx);
else if (isArray(block)) collectArrayTransitionBlocks(block, onFragment, children, ctx);
else if (isFragment(block)) collectFragmentTransitionBlocks(block, onFragment, children, ctx);
}
function collectComponentTransitionBlocks(block, onFragment, children, ctx) {
if (isKeepAliveEnabled && isKeepAlive(block)) {
collectTransitionBlocks$1(block.block, onFragment, children, ctx);
return;
}
const async = isAsyncComponentEnabled && isAsyncWrapper(block);
const inner = async ? getAsyncWrapperInner(block) : void 0;
if (ctx) ctx = enterComponentKeyContext(ctx, block, async && inner === void 0);
if (async) {
if (inner === void 0) {
if (isFragment(block.block)) {
if (onFragment) onFragment(block.block);
if (ctx) keyContexts.set(block.block, ctx);
}
return;
}
collectTransitionBlocks$1(inner, onFragment, children, ctx);
return;
}
if (isVaporTransition(block.type)) return;
collectTransitionBlocks$1(block.block, onFragment, children, ctx);
}
function collectArrayTransitionBlocks(block, onFragment, children, ctx) {
let hasFound = false;
for (const c of block) {
if (c instanceof Comment) continue;
if (!!(process.env.NODE_ENV !== "production") && hasFound) {
warn("<transition> can only be used on a single element or component. Use <transition-group> for lists.");
break;
}
const nested = [];
collectTransitionBlocks$1(c, onFragment, nested, ctx);
if (nested.length) children.push(nested[0]);
hasFound = true;
if (!!!(process.env.NODE_ENV !== "production")) break;
}
}
function collectFragmentTransitionBlocks(block, onFragment, children, ctx) {
if (isInteropEnabled && block.hasVDOMContent && block.hasVDOMContent()) {
children.push(block);
if (ctx) {
resolveChildIdentity(block, ctx);
if (!ctx.type) {
const type = block.getTransitionType();
if (type !== void 0) setTransitionType(block, type);
}
}
return;
}
if (onFragment) onFragment(block);
collectTransitionBlocks$1(block.nodes, onFragment, children, ctx && enterFragmentKeyContext(block, ctx));
}
function setTransitionHooks$1(block, hooks) {
if (isVaporComponent(block)) {
block = findTransitionBlock(block.block);
if (!block) return;
}
block.$transition = hooks;
}
function isValidTransitionBlock(block) {
return block instanceof Element || !!(isInteropEnabled && isFragment(block) && block.hasVDOMContent && block.hasVDOMContent());
}
function getTransitionElement(block) {
if (block instanceof Element) return block;
if (isInteropEnabled && isFragment(block) && block.getTransitionElement) return block.getTransitionElement();
}
//#endregion
//#region packages/runtime-vapor/src/refCleanup.ts
/**
* Stores ref cleanup functions keyed by the element/component they are set on.
* Shared between apiTemplateRef.ts (writes) and KeepAlive deactivate (reads).
*/
const refCleanups = /* @__PURE__ */ new WeakMap();
function invalidatePendingRef(el) {
const c = refCleanups.get(el);
if (c && c.job) {
c.job.flags = c.job.flags | 4;
c.job = void 0;
}
}
/**
* Synchronously clear the ref for an element being deactivated by KeepAlive.
* In VDOM core, refs are cleared during unmount before the deactivation check.
* Since Vapor's KeepAlive retains scopes (skipping onScopeDispose), we need
* this explicit sync cleanup path.
*/
function unsetRef(el) {
invalidatePendingRef(el);
const c = refCleanups.get(el);
if (c) c.fn();
}
const VaporKeepAlive = /*@__PURE__*/ withKeepAliveEnabled(/* @__PURE__ */ defineVaporComponent({
name: "VaporKeepAlive",
__isKeepAlive: true,
props: {
include: [
String,
RegExp,
Array
],
exclude: [
String,
RegExp,
Array
],
max: [String, Number]
},
setup(props, { slots, expose }) {
let exposed;
expose(exposed);
if (!slots.default) return;
const keepAliveInstance = currentInstance;
const cache = /* @__PURE__ */ new Map();
const keys = /* @__PURE__ */ new Set();
const storageContainer = /* @__PURE__ */ createElement("div");
const keptAliveScopes = /* @__PURE__ */ new Map();
const resolveCacheKeyFromBlock = (block, interop, branchKey) => {
var _ref3, _$key;
if (interop && isInteropEnabled) {
var _ref, _ref2, _frag$$key;
const frag = block;
return (_ref = (_ref2 = (_frag$$key = frag.$key) !== null && _frag$$key !== void 0 ? _frag$$key : frag.vnode.key) !== null && _ref2 !== void 0 ? _ref2 : branchKey) !== null && _ref !== void 0 ? _ref : frag.vnode.type;
}
return (_ref3 = (_$key = block.$key) !== null && _$key !== void 0 ? _$key : branchKey) !== null && _ref3 !== void 0 ? _ref3 : block.type;
};
let current;
let rootFragment;
if (!!(process.env.NODE_ENV !== "production") || __VUE_PROD_DEVTOOLS__) {
keepAliveInstance.__v_cache = cache;
keepAliveInstance.__v_keptAliveScopes = keptAliveScopes;
}
const addCacheKey = (key) => {
const { max } = props;
keys.add(key);
if (max && keys.size > parseInt(max, 10)) pruneCacheEntry(keys.values().next().value);
};
const innerCacheBlock = (key, block, isCurrent) => {
if (cache.has(key)) {
if (isCurrent) {
keys.delete(key);
keys.add(key);
}
} else addCacheKey(key);
cache.set(key, block);
if (isCurrent) current = block;
};
const cacheBlock = (block = keepAliveInstance.block) => {
if (isDynamicFragment(block)) {
const transition = block.$transition;
if (transition && transition.mode === "out-in" && transition.state.isLeaving) return;
}
const [innerBlock, interop, branchKey] = getInnerBlock(block);
if (!innerBlock) return;
const cacheKey = resolveCacheKeyFromBlock(innerBlock, interop, branchKey);
if (!shouldCache(innerBlock, props, interop)) {
if (cache.has(cacheKey)) pruneCacheEntry(cacheKey);
return;
}
setShapeFlag(innerBlock, interop, cache.has(cacheKey));
const { currentBlock, currentKey } = getCurrentBlockState();
innerCacheBlock(cacheKey, innerBlock, currentBlock === innerBlock || currentKey === cacheKey);
};
const processShapeFlag = (block, requireKeptAlive = false) => {
const [innerBlock, interop, branchKey] = getInnerBlock(block);
if (!innerBlock || requireKeptAlive && !isKeptAlive(innerBlock, interop) || !shouldCache(innerBlock, props, interop)) return false;
const cacheKey = resolveCacheKeyFromBlock(innerBlock, interop, branchKey);
setShapeFlag(innerBlock, interop, cache.has(cacheKey));
return cacheKey;
};
const pruneCache = (filter) => {
cache.forEach((cached, key) => {
const instance = getInstanceFromCache(cached);
if (!instance) return;
const name = getComponentName(isAsyncWrapper(instance) ? instance.type.__asyncResolved || {} : instance.type);
if (name && !filter(name)) pruneCacheEntry(key);
});
};
const deleteScope = (key) => {
const scope = keptAliveScopes.get(key);
if (scope) {
keptAliveScopes.delete(key);
for (const [k, s] of keptAliveScopes) if (s === scope) {
keptAliveScopes.delete(k);
break;
}
}
return scope;
};
const cacheScope = (cacheKey, scopeLookupKey, scope) => {
const prevScope = keptAliveScopes.get(cacheKey);
if (prevScope && prevScope !== scope) {
const staleScope = deleteScope(cacheKey);
if (staleScope) staleScope.stop();
}
keptAliveScopes.set(cacheKey, scope);
if (scopeLookupKey !== cacheKey) keptAliveScopes.set(scopeLookupKey, scope);
};
const pruneCacheEntry = (key) => {
const cached = cache.get(key);
if (cached && (!current || cached !== current)) {
unsetShapeFlag(cached);
const parentNode = findBlockBoundary(cached).parentNode;
if (parentNode) remove(cached, parentNode);
} else if (current) unsetShapeFlag(current);
cache.delete(key);
keys.delete(key);
const scope = deleteScope(key);
if (scope) scope.stop();
};
watch(() => [props.include, props.exclude], ([include, exclude]) => {
include && pruneCache((name) => matches(include, name));
exclude && pruneCache((name) => !matches(exclude, name));
cacheBlock();
}, {
flush: "post",
deep: true
});
onMounted(cacheBlock);
onUpdated(cacheBlock);
const getCurrentBlockState = () => {
const block = keepAliveInstance.block;
const [currentBlock, interop, branchKey] = getInnerBlock(block);
return {
currentBlock,
interop,
currentKey: currentBlock && resolveCacheKeyFromBlock(currentBlock, interop, branchKey)
};
};
onBeforeUnmount(() => {
const { currentBlock, interop, currentKey } = getCurrentBlockState();
const deactivateCached = (cached) => {
unsetShapeFlag(cached);
const instance = getInstanceFromCache(cached);
if (instance) {
const da = instance.da;
da && queuePostRenderEffect(da, void 0, keepAliveInstance.suspense);
}
};
let matched = false;
cache.forEach((cached, key) => {
if (currentKey === key) {
matched = true;
deactivateCached(cached);
return;
}
unsetShapeFlag(cached);
const parentNode = findBlockBoundary(cached).parentNode;
remove(cached, parentNode || void 0);
});
if (!matched && currentBlock && isKeptAlive(currentBlock, interop)) deactivateCached(currentBlock);
keptAliveScopes.forEach((scope) => scope.stop());
keptAliveScopes.clear();
});
const keepAliveCtx = {
getStorageContainer: () => storageContainer,
getCachedComponent: (comp, key) => {
if (isInteropEnabled && isVNode(comp)) {
var _ref4, _comp$key;
return cache.get((_ref4 = (_comp$key = comp.key) !== null && _comp$key !== void 0 ? _comp$key : currentCacheKey) !== null && _ref4 !== void 0 ? _ref4 : comp.type);
}
const branchKey = key !== null && key !== void 0 ? key : currentCacheKey;
return branchKey != null ? cache.get(branchKey) : cache.get(comp) || cache.get(comp.__asyncResolved);
},
activate: (instance, parentNode, anchor, parentSuspense) => {
current = instance;
activate$1(instance, parentNode, anchor, parentSuspense);
},
deactivate: (instance, parentSuspense) => {
current = void 0;
deactivate$1(instance, storageContainer, parentSuspense);
},
prepareBranchRemoval(frag, scope, prevKey) {
if (frag !== rootFragment) {
scope.stop();
return false;
}
const fragKey = getFragmentKey(frag);
const cacheKey = withCurrentCacheKey(fragKey, () => processShapeFlag(frag.nodes, true));
if (cacheKey === false) {
scope.stop();
return false;
}
if (isDynamicFragment(frag.nodes)) {
scope.stop();
return true;
}
scope.pause();
cacheScope(cacheKey, fragKey !== null && fragKey !== void 0 ? fragKey : prevKey, scope);
return true;
},
runBranchRender(frag, fn, useScope, removePrevious) {
const fragKey = getFragmentKey(frag);
const cachedScope = useScope ? deleteScope(fragKey !== null && fragKey !== void 0 ? fragKey : frag.current) : void 0;
frag.scope = useScope ? cachedScope || new EffectScope$1() : void 0;
if (cachedScope) cachedScope.resume();
let incomingCacheKey = false;
const run = () => {
try {
fn();
} finally {
incomingCacheKey = processShapeFlag(frag.nodes);
}
};
try {
withCurrentCacheKey(fragKey, run);
if (removePrevious && incomingCacheKey !== false && !cache.has(incomingCacheKey)) addCacheKey(incomingCacheKey);
} finally {
if (removePrevious) removePrevious();
}
},
processShapeFlag,
cacheBlock
};
if (isInteropEnabled) keepAliveCtx.clearCurrent = (block) => {
if (current === block) current = void 0;
};
keepAliveInstance.ctx = keepAliveCtx;
let children = slots.default();
rootFragment = registerDynamicFragmentHooks(children, keepAliveCtx);
if (isArray(children)) {
children = children.filter((child) => !(child instanceof Comment));
if (children.length === 1) rootFragment = registerDynamicFragmentHooks(children[0], keepAliveCtx);
if (children.length > 1) {
if (!!(process.env.NODE_ENV !== "production")) warn(`KeepAlive should contain exactly one component child.`);
return children;
}
}
return children;
}
}));
function registerDynamicFragmentHooks(block, keepAliveCtx) {
if (!isDynamicFragment(block)) return;
(block.u || (block.u = [])).unshift(() => {
if (block.$transition && block.$transition.mode === "out-in") keepAliveCtx.cacheBlock(block);
});
return block;
}
const shouldCache = (block, props, interop = false) => {
const isAsync = isAsyncWrapper(interop ? block.vnode : block);
const type = interop && isInteropEnabled ? block.vnode.type : block.type;
if (isAsync && !type.__asyncResolved) return !props.include;
const { include, exclude } = props;
const name = getComponentName(isAsync ? type.__asyncResolved : type);
return !(include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name));
};
function setShapeFlag(block, interop, cached) {
if (interop && isInteropEnabled) {
if (cached) block.vnode.shapeFlag |= 512;
block.vnode.shapeFlag |= 256;
} else {
if (cached) block.shapeFlag |= 512;
block.shapeFlag |= 256;
}
}
const unsetShapeFlag = (cached) => {
if (isVaporComponent(cached)) {
resetShapeFlag(cached);
if (isAsyncComponentEnabled && isAsyncWrapper(cached)) {
const [inner] = getInnerBlock(cached.block);
if (inner && isVaporComponent(inner)) resetShapeFlag(inner);
}
} else if (isInteropEnabled) {
const vnode = cached.vnode;
resetShapeFlag(vnode);
if (isVaporComponent(vnode.component)) unsetShapeFlag(vnode.component);
}
};
function isKeptAlive(cached, interop) {
if (interop && isInteropEnabled && isInteropFragment(cached)) return !!(cached.vnode.shapeFlag & 256);
return !!(cached.shapeFlag & 256);
}
function getInnerBlock(block, branchKey = currentCacheKey) {
if (isVaporComponent(block)) return [
block,
false,
branchKey
];
else if (isInteropEnabled && isInteropFragment(block)) return [
block,
true,
branchKey
];
else if (isFragment(block)) {
var _getFragmentKey;
return getInnerBlock(block.nodes, (_getFragmentKey = getFragmentKey(block)) !== null && _getFragmentKey !== void 0 ? _getFragmentKey : branchKey);
}
return [
void 0,
false,
branchKey
];
}
function getInstanceFromCache(cached) {
if (isVaporComponent(cached)) return cached;
if (isInteropEnabled) return cached.vnode.component;
}
function activate$1(instance, parentNode, anchor, parentSuspense = instance.suspense) {
const inputScope = instance.inputScope;
if (inputScope) inputScope.resume();
move(instance, parentNode, anchor, 0, instance, parentSuspense);
queuePostRenderEffect(() => {
instance.isDeactivated = false;
if (instance.a) invokeArrayFns(instance.a);
}, void 0, parentSuspense);
if (!!(process.env.NODE_ENV !== "production") || __VUE_PROD_DEVTOOLS__) devtoolsComponentAdded(instance);
}
function deactivate$1(instance, container, parentSuspense = instance.suspense) {
const inputScope = instance.inputScope;
if (inputScope) inputScope.pause();
unsetRef(instance);
invalidateMount(instance.m);
invalidateMount(instance.a);
move(instance, container, null, 1, instance, parentSuspense);
queuePostRenderEffect(() => {
if (instance.da) invokeArrayFns(instance.da);
instance.isDeactivated = true;
}, void 0, parentSuspense);
if (!!(process.env.NODE_ENV !== "production") || __VUE_PROD_DEVTOOLS__) devtoolsComponentAdded(instance);
}
//#endregion
//#region packages/runtime-vapor/src/vdomInterop.ts
const EMPTY_VNODES = EMPTY_ARR;
function getRawTransitionChild(vnode) {
if (!vnode) return;
const children = getTransitionRawChildren([vnode]);
return children.length === 1 ? children[0] : void 0;
}
function isVaporTransitionHooks(hooks) {
return !!hooks && hooks.__vapor === true;
}
function getVaporInstance(vnode) {
return vnode.component;
}
function prepareInteropSlotTransition(frag, vnode, forwarded, previous, resumeAfterLeave, delayedLeaveSource) {
const transition = frag.$transition;
const instance = frag.renderInstance;
if (transition && !isVaporTransitionHooks(transition)) {
setTransitionHooks(vnode, transition);
return;
}
if (transition && transition.applyGroup) return;
if (!transition && !(forwarded && instance && isVaporTransition(instance.type))) return;
const branch = resolveTransitionChild([vnode], true);
if (!transition) return branch;
return prepareTransitionSwitch(previous, branch, transition.props, transition.state, transition.instance, resumeAfterLeave, delayedLeaveSource || transition) || createCommentVNode();
}
function getInteropTransitionType(vnode) {
const child = getRawTransitionChild(vnode);
return child && child.type;
}
function vnodeKeyOf(vnode) {
var _vnode$key;
return (_vnode$key = vnode.key) !== null && _vnode$key !== void 0 ? _vnode$key : void 0;
}
function getVNodeKey(vnode) {
const child = getRawTransitionChild(vnode);
return child && vnodeKeyOf(child);
}
function getInteropTransitionElement(vnode) {
if (!vnode) return;
const component = vnode.component;
if (isVaporComponent(component)) {
const block = component.block && findTransitionBlock(component.block);
return block && getTransitionElement(block);
}
if (vnode.el instanceof Element) return vnode.el;
if (component) return getInteropTransitionElement(component.subTree);
if (vnode.type === Fragment) {
const child = getRawTransitionChild(vnode);
if (child) return getInteropTransitionElement(child);
} else if (vnode.shapeFlag & 64 && isArray(vnode.children)) {
const child = resolveTransitionChild(vnode.children);
if (child) return getInteropTransitionElement(child);
}
}
function interopRawProps(vnode) {
const rawProps = {};
const props = vnode.props;
for (const key in props) if (!isReservedProp(key)) rawProps[key] = props[key];
rawProps[interopKey] = true;
return rawProps;
}
const vaporInteropImpl = {
applyCssVars(vnode, vars) {
setVarsOnBlock(vnode.vb || getVaporInstance(vnode).block, vars);
},
mount(vnode, container, anchor, parentComponent, parentSuspense) {
const selfAnchor = vnode.anchor = /* @__PURE__ */ createTextNode();
vnode.el = selfAnchor;
container.insertBefore(selfAnchor, anchor);
const prev = currentInstance;
simpleSetCurrentInstance(parentComponent);
const rawProps = interopRawProps(vnode);
const slotsRef = shallowRef(normalizeInteropSlots(vnode.children));
const rawSlots = createInteropRawSlots(slotsRef);
const prevCtx = currentRenderContext;
if (isSuspenseEnabled && parentSuspense) setRenderContext(deriveSuspense(prevCtx, parentSuspense));
const instance = vnode.component = createComponent(vnode.type, rawProps, rawSlots, void 0, void 0, parentComponent ? parentComponent.appContext : vnode.appContext, true);
instance.rawSlotsRef = slotsRef;
instance.emitsOptions = normalizeEmitsOptions(instance.type);
const vnodeHookState = ensureVNodeHookState(instance, vnode);
setInteropComponentScopeIds(instance, vnode);
if (parentComponent && isKeepAlive(parentComponent)) {
enableKeepAlive();
instance.shapeFlag = vnode.shapeFlag;
}
if (vnode.transition) {
ensureTransitionHooksRegistered();
(instance.bm || (instance.bm = [])).push(() => {
const transition = vnodeHookState.vnode.transition;
if (transition) setTransitionHooks$1(instance, transition);
});
}
setRenderContext(prevCtx);
const pendingSetup = isPendingInteropSetup(instance);
const rootEl = !pendingSetup && resolveInteropRootEl(instance);
if (rootEl) vnode.el = rootEl;
const asyncWrapper = isAsyncWrapper(vnode);
const vnodeHooks = asyncWrapper ? null : vnode.props;
if (pendingSetup || vnode.dirs || vnodeHooks && vnodeHooks.onVnodeBeforeMount) registerAfterInteropSetup(instance, pendingSetup, () => {
(instance.bm || (instance.bm = [])).push(() => {
const mountVNode = vnodeHookState.vnode;
const hooks = asyncWrapper ? null : mountVNode.props;
if (pendingSetup) {
const rootEl = resolveInteropRootEl(instance);
if (rootEl) mountVNode.el = rootEl;
const mountedHook = hooks && hooks.onVnodeMounted;
if (mountedHook) (instance.m || (instance.m = [])).push(() => invokeInteropVNodeHook(instance, mountedHook, mountVNode));
}
invokeInteropVNodeHook(instance, hooks && hooks.onVnodeBeforeMount, mountVNode);
if (!mountVNode.dirs) return;
const [owner, el] = resolveInteropDirsRoot(instance, vnodeHookState, instance, getInteropDirsOwner(vnodeHookState, instance, mountVNode));
if (el) {
mountInteropDirsRoot(instance, owner, el);
mountVNode.el = el;
} else if (!!(process.env.NODE_ENV !== "production") && !isPendingInteropDirsRoot(owner.comp)) warnNonElementRootDirs();
});
if (vnodeHookState.vnode.dirs) (instance.bum || (instance.bum = [])).push(() => unmountInteropDirs(instance, vnodeHookState, instance));
});
mountComponent(instance, container, selfAnchor);
if (!pendingSetup) queueInteropVNodeHook(instance, vnodeHooks && vnodeHooks.onVnodeMounted, vnode, parentSuspense);
simpleSetCurrentInstance(prev);
return instance;
},
update(n1, n2, shouldUpdate) {
n2.component = n1.component;
n2.el = n1.el;
n2.anchor = n1.anchor;
const instance = getVaporInstance(n2);
const vnodeHookState = ensureVNodeHookState(instance, n2);
if (shouldUpdate) {
const rootEl = getRootElement(instance);
if (rootEl) n2.el = rootEl;
if (n2.transition && instance.block) {
ensureTransitionHooksRegistered();
setTransitionHooks$1(instance, n2.transition);
}
updateInteropVNode(instance, vnodeHookState, n2, n1);
}
},
unmount(vnode, doRemove, parentSuspense) {
if (isSuspenseEnabled && currentUnmountSuspense !== parentSuspense) {
runWithUnmountSuspense(parentSuspense, () => vaporInteropImpl.unmount(vnode, doRemove, parentSuspense));
return;
}
const container = doRemove ? vnode.anchor.parentNode : void 0;
const instance = getVaporInstance(vnode);
let slotStartAnchor = null;
if (instance) {
const anchor = vnode.anchor;
const vnodeHooks = isAsyncWrapper(vnode) ? null : vnode.props;
invokeInteropVNodeHook(instance, vnodeHooks && vnodeHooks.onVnodeBeforeUnmount, vnode);
if (instance.block) {
unmountComponent(instance, container, parentSuspense);
if (!doRemove) {
const blockContainer = needsHostParentForRemove(instance.block) ? anchor && anchor.parentNode : void 0;
remove(instance.block, blockContainer);
}
} else {
unmountComponent(instance, container, parentSuspense);
if (!doRemove) instance.pendingBlock = void 0;
}
queueInteropVNodeHook(instance, vnodeHooks && vnodeHooks.onVnodeUnmounted, vnode, parentSuspense);
} else if (vnode.vb) {
const anchor = vnode.anchor;
if (vnode.el && vnode.el !== anchor && isRangeStart(vnode.el)) slotStartAnchor = vnode.el;
const blockContainer = container || (needsHostParentForRemove(vnode.vb) ? anchor && anchor.parentNode : void 0);
stopVaporSlotScope(vnode);
remove(vnode.vb, blockContainer);
}
if (doRemove) {
if (slotStartAnchor) {
const parent = slotStartAnchor.parentNode;
if (parent) remove(slotStartAnchor, parent);
}
const anchor = vnode.anchor;
const parent = anchor.parentNode;
if (parent) remove(anchor, parent);
}
},
/**
* vapor slot in vdom
*/
slot(n1, n2, container, anchor, parentComponent, parentSuspense, slotScopeIds) {
if (!n1) {
const slotBlock = renderVaporSlot(n2, parentComponent, parentSuspense, slotScopeIds);
const selfAnchor = (isFragment(slotBlock) ? slotBlock.anchor : void 0) || /* @__PURE__ */ createTextNode();
insert(n2.el = n2.anchor = selfAnchor, container, anchor);
insert(n2.vb = slotBlock, container, selfAnchor, parentSuspense);
} else if (!n1.vs || !n2.vs || !n1.vs.slot || !n2.vs.slot || n2.vs.slot !== n1.vs.slot) {
const selfAnchor = n1.anchor;
const parent = selfAnchor.parentNode;
const nextSibling = selfAnchor.nextSibling;
const rangeStartAnchor = n1.el && n1.el !== selfAnchor && isRangeStart(n1.el) ? n1.el : void 0;
const oldBlockOwnsAnchor = isFragment(n1.vb) && n1.vb.anchor === selfAnchor;
stopVaporSlotScope(n1);
remove(n1.vb, parent);
const slotBlock = renderVaporSlot(n2, parentComponent, parentSuspense, slotScopeIds);
let newAnchor = isFragment(slotBlock) ? slotBlock.anchor : void 0;
let insertAnchor = nextSibling;
if (newAnchor) {
if (!oldBlockOwnsAnchor) remove(selfAnchor, parent);
} else if (oldBlockOwnsAnchor) newAnchor = /* @__PURE__ */ createTextNode();
else {
newAnchor = selfAnchor;
insertAnchor = selfAnchor;
}
insert(n2.anchor = newAnchor, parent, insertAnchor);
n2.el = rangeStartAnchor || newAnchor;
insert(n2.vb = slotBlock, parent, newAnchor, parentSuspense);
} else {
const vs1 = n1.vs;
const vs2 = n2.vs;
n2.el = n1.el;
n2.anchor = n1.anchor;
n2.vb = n1.vb;
(vs2.ref = vs1.ref).value = n2.props;
vs2.scope = vs1.scope;
syncInteropVaporSlotState(n1, n2);
}
},
move(vnode, container, anchor, moveType, parentSuspense) {
const block = vnode.vb || vnode.component;
const pendingRangeOwnsFragmentStart = isVaporComponent(block) && !!block.pendingBlock;
if (vnode.el && vnode.el !== vnode.anchor && isRangeStart(vnode.el) && !pendingRangeOwnsFragmentStart) move(vnode.el, container, anchor, moveType, void 0, parentSuspense);
move(block, container, anchor, moveType, void 0, parentSuspense);
move(vnode.anchor, container, anchor, moveType, void 0, parentSuspense);
},
hydrate(vnode, node, container, anchor, parentComponent, parentSuspense) {
if (!isHydrating$1 && !isHydrating && !isHydratingEnabled) return node;
let instance;
hydrateNode(node, () => {
instance = this.mount(vnode, container, anchor, parentComponent, parentSuspense);
});
if (instance && instance.asyncDep && !instance.asyncResolved) vnode.el = node;
return anchor;
},
hydrateSlot(vnode, node, parentComponent, parentSuspense, slotScopeIds) {
if (!isHydrating$1 && !isHydrating && !isHydratingEnabled) return node;
const isFallbackRange = isComment(node, "(");
const close = isFallbackRange ? locateEndAnchor(node) : isRangeEnd(node) ? node : isRangeStart(node) && node.nextSibling && isRangeEnd(node.nextSibling) ? node.nextSibling : null;
if (close) {
const ownsRange = close !== node;
mountSlotWithoutHydration(vnode, ownsRange ? node : null, close, parentComponent, parentSuspense, slotScopeIds, isFallbackRange ? {
depth: 0,
first: node.nextSibling,
close
} : void 0);
return ownsRange ? close.nextSibling : close;
}
const container = /* @__PURE__ */ parentNode(node);
let createdAnchor = false;
let resumeNode = null;
hydrateNode(node, () => {
vnode.vb = renderVaporSlot(vnode, parentComponent, parentSuspense, slotScopeIds);
const fragmentAnchor = isFragment(vnode.vb) && vnode.vb.anchor;
let anchor = fragmentAnchor || currentHydrationNode;
const wrapped = isRangeStart(node) && isRangeEnd(anchor);
if (!fragmentAnchor && !wrapped) {
createdAnchor = true;
resumeNode = anchor && /* @__PURE__ */ parentNode(anchor) === container ? anchor : null;
anchor = /* @__PURE__ */ createTextNode();
container.insertBefore(anchor, resumeNode);
}
if (isRangeStart(node) && isRangeEnd(anchor)) {
vnode.el = node;
vnode.anchor = anchor;
} else vnode.anchor = vnode.el = anchor;
if (!!(process.env.NODE_ENV !== "production") && !vnode.anchor) throw new Error(`Failed to locate slot anchor. this is likely a Vue internal bug.`);
});
if (createdAnchor) return resumeNode;
return isRangeStart(node) ? vnode.anchor.nextSibling : vnode.anchor;
},
hydrateSlotOutlet(outlet, open, parentComponent, parentSuspense, slotScopeIds) {
if (!isHydrating$1 && !isHydrating && !isHydratingEnabled) return open.nextSibling;
return hydrateOutletFallback(outlet.children, open.nextSibling, locateEndAnchor(open), 0, parentComponent, parentSuspense, slotScopeIds);
},
attachSlotOutlet,
setTransitionHooks(component, hooks) {
ensureTransitionHooksRegistered();
setTransitionHooks$1(component, hooks);
},
activate(vnode, container, anchor, parentComponent, parentSuspense) {
const cached = parentComponent.ctx.getCachedComponent(vnode);
vnode.el = cached.el;
vnode.component = cached.component;
vnode.anchor = cached.anchor;
const instance = getVaporInstance(vnode);
const vnodeHookState = ensureVNodeHookState(instance, vnode);
const rootEl = getRootElement(instance);
if (rootEl) vnode.el = rootEl;
if (!!(process.env.NODE_ENV !== "production") && vnode.dirs && !rootEl) warnNonElementRootDirs();
if (shouldUpdateComponent(cached, vnode)) updateInteropVNode(instance, vnodeHookState, vnode, cached);
activate$1(instance, container, anchor, parentSuspense);
insert(vnode.anchor, container, anchor);
queueInteropVNodeHook(instance, vnode.props && vnode.props.onVnodeMounted, vnode, parentSuspense);
},
deactivate(vnode, container, parentSuspense) {
const instance = getVaporInstance(vnode);
deactivate$1(instance, container, parentSuspense);
insert(vnode.anchor, container);
queueInteropVNodeHook(instance, vnode.props && vnode.props.onVnodeUnmounted, vnode, parentSuspense);
}
};
const vaporSlotPropsProxyHandler = {
get(target, key) {
return target.value[key];
},
has(target, key) {
return key in target.value;
},
ownKeys(target) {
return Reflect.ownKeys(target.value);
},
getOwnPropertyDescriptor(target, key) {
if (key in target.value) return {
enumerable: true,
configurable: true
};
}
};
const vaporSlotWrappersCache = /* @__PURE__ */ new WeakMap();
const vaporSlotsProxyHandler = {
get(target, key) {
const slot = isString(key) && !isInternalSlotKey(key) ? getSlot(target, key) : target[key];
if (isFunction(slot)) {
slot[rawVaporSlotKey] = slot;
let wrappers = vaporSlotWrappersCache.get(target);
if (!wrappers) vaporSlotWrappersCache.set(target, wrappers = /* @__PURE__ */ new Map());
const cached = wrappers.get(key);
if (cached && cached.slot === slot) return cached.wrapped;
const wrapped = (props) => [renderSlot({ [key]: slot }, key, props)];
wrapped[rawVaporSlotKey] = slot;
wrapped._n = true;
wrappers.set(key, {
slot,
wrapped
});
return wrapped;
}
return slot;
},
ownKeys(target) {
return Array.from(dynamicSlotsProxyHandlers.ownKeys(target)).filter((key) => isString(key) && !isInternalSlotKey(key));
},
getOwnPropertyDescriptor(target, key) {
if (!isString(key) || isInternalSlotKey(key)) return;
return dynamicSlotsProxyHandlers.getOwnPropertyDescriptor(target, key);
}
};
let vdomHydrateNode;
function resolveVNodeRange(vnode) {
const { type, shapeFlag, el, anchor } = vnode;
if (shapeFlag & 64 && el && anchor && anchor !== el) return [el, anchor];
if ((type === Static || type === Fragment) && anchor) return el && anchor !== el ? [el, anchor] : [anchor, anchor];
if (shapeFlag & 6) {
const subTree = vnode.component && vnode.component.subTree;
if (subTree) return resolveVNodeRange(subTree);
}
}
function resolveVNodeNodes(vnode) {
if (vnode.component && isVaporComponent(vnode.component)) {
const block = vnode.component.block;
if (block) {
const anchor = vnode.anchor;
if (anchor) return [block, anchor];
return block;
}
}
if (vnode.type === VaporSlot && vnode.vb) {
const { el, anchor, vb } = vnode;
if (!anchor) return vb;
return el && el !== anchor && isRangeStart(el) ? [
el,
vb,
anchor
] : [vb, anchor];
}
const vnodeRange = resolveVNodeRange(vnode);
if (vnodeRange) {
const nodeRange = [];
let n = vnodeRange[0];
while (n) {
nodeRange.push(n);
if (n === vnodeRange[1]) break;
n = n.nextSibling;
}
return nodeRange;
}
if (vnode.shapeFlag & 6) {
const subTree = vnode.component && vnode.component.subTree;
if (subTree) return resolveVNodeNodes(subTree);
}
return vnode.el;
}
function removeAttachedNodes(block, parent) {
if (block instanceof Node) {
if (block.parentNode === parent) remove(block, parent);
} else if (isArray(block)) for (let i = 0; i < block.length; i++) removeAttachedNodes(block[i], parent);
}
function trackFragmentVNodeUpdates(frag, vnode, syncNodes) {
vnode.ibu = () => {
if (frag.bu) frag.bu.forEach((hook) => hook());
};
vnode.iu = () => {
syncNodes();
if (frag.u) frag.u.forEach((hook) => hook(frag.nodes));
};
}
/**
* Shared content cell for interop fragments. Hosts write the subset they
* own — do not read a field the host does not maintain (`valid` stays false
* where validity is derived live from the nodes; `nodes` stays EMPTY_BLOCK
* where the fragment's own `nodes` is the snapshot).
*
* `resolved` implements the optimistic-validity rule every interop fragment
* shares: nodes stay unresolved until the first sync (on insert / after
* patch), and validity reports true until then to keep a host boundary from
* mounting its fallback before the content exists. This keeps the common
* (valid) case free — an empty result is corrected later when the resolve
* path notifies the boundary to recheck; starting invalid would instead
* mount-then-teardown the fallback on every interop mount. Hydration starts
* resolved (SSR nodes exist).
*/
var InteropContentState = class {
constructor() {
this.nodes = EMPTY_BLOCK;
this.valid = false;
this.resolved = isHydrating$1;
}
};
function createVNodeFragment(vnode) {
const frag = createInteropFragment(EMPTY_BLOCK, vnode);
frag.$key = vnodeKeyOf(vnode);
const content = new InteropContentState();
const syncNodes = () => {
frag.nodes = resolveVNodeNodes(frag.vnode);
content.resolved = true;
};
frag.isBlockValid = (componentAsValid) => content.resolved ? isValidBlock(frag.nodes, componentAsValid) : true;
trackFragmentVNodeUpdates(frag, vnode, syncNodes);
return {
frag,
syncNodes
};
}
/**
* Mount a vnode as a dynamic component branch (`<component :is="vnode">`
* in a vapor template). The KeepAlive lookup, fallthrough and hydration of
* the vnode live here so the dynamic component only sees a block.
*/
function mountDynamicVNode(internals, vnode, parentComponent, isSingleRoot, rawProps, once) {
if (parentComponent && isKeepAlive(parentComponent)) {
const cached = parentComponent.ctx.getCachedComponent(vnode.type, vnode.key);
if (cached) {
if (cached.patchVNode) cached.patchVNode(vnode);
return cached;
}
}
if (once && rawProps) rawProps = snapshotRawProps(rawProps);
const owner = resolveFallthroughOwner(isSingleRoot);
if (owner) {
const source = () => resolveFallthroughAttrs(owner);
const sources = rawProps && rawProps.$;
rawProps = extend$1({}, rawProps, { $: sources ? sources.concat(source) : [source] });
}
const frag = mountVNode(internals, vnode, parentComponent, rawProps ? new Proxy(rawProps, rawPropsProxyHandlers) : void 0, once && !owner);
if (isHydrating$1) {
locateHydrationNode(shouldConsumeFragmentStart(vnode) ? createFragmentClaim() : void 0);
frag.hydrate();
}
return frag;
}
function shouldConsumeFragmentStart(vnode) {
if (vnode.type === Fragment) return false;
if (vnode.shapeFlag & 6) {
const type = vnode.type;
return !!type.__vapor && !type.__multiRoot;
}
return true;
}
/**
* Mount VNode in vapor
*/
function mountVNode(internals, vnode, parentComponent, extraProps, staticExtraProps) {
let suspense = currentRenderContext.suspense || parentComponent && parentComponent.suspense;
let baseVNode = vnode;
const withExtraProps = (base) => {
const cloned = cloneVNode(base, extraProps, true);
if (cloned.key !== base.key) {
var _base$key;
cloned.key = base.key;
cloned.props.key = (_base$key = base.key) !== null && _base$key !== void 0 ? _base$key : void 0;
}
return cloned;
};
if (extraProps) vnode = withExtraProps(baseVNode);
const { frag, syncNodes } = createVNodeFragment(vnode);
let isMounted = false;
let mountedParentNode;
let mountedAnchor = null;
let namespace;
let isUnmounted = false;
const unmount = (parentNode, transition) => {
if (isUnmounted) {
if (parentNode) {
removeAttachedNodes(resolveVNodeNodes(vnode), parentNode);
if (vnode.anchor && vnode.anchor.parentNode === parentNode) remove(vnode.anchor, parentNode);
}
return;
}
if (transition) setTransitionHooks(vnode, transition);
const parentSuspense = resolveUnmountSuspense(suspense);
if (vnode.shapeFlag & 256) {
const keepAliveCtx = parentComponent.ctx;
keepAliveCtx.clearCurrent(frag);
const storageContainer = keepAliveCtx.getStorageContainer();
if (vnode.type.__vapor) {
deactivate$1(vnode.component, storageContainer, parentSuspense);
insert(vnode.anchor, storageContainer);
} else deactivate(vnode, storageContainer, internals, parentComponent, parentSuspense);
} else {
isUnmounted = true;
internals.um(vnode, parentComponent, parentSuspense, !!parentNode);
}
if (vnode.anchor && parentNode && vnode.anchor.parentNode === parentNode) remove(vnode.anchor, parentNode);
};
frag.hydrate = () => {
if (!isHydrating$1) return;
hydrateVNode(vnode, parentComponent, frag.slotScopeIds, suspense);
isMounted = true;
const anchorNode = vnode.anchor || vnode.el;
if (anchorNode && anchorNode.parentNode) {
mountedParentNode = anchorNode.parentNode;
namespace = getContainerType(mountedParentNode);
}
syncNodes();
};
const place = (parentNode, anchor, parentSuspense, transition, moveType = 2) => {
if (isHydrating$1) return;
if (parentSuspense !== void 0) suspense = parentSuspense;
const operationSuspense = suspense;
if (vnode.shapeFlag & 512) {
if (vnode.type.__vapor) {
activate$1(vnode.component, parentNode, anchor, operationSuspense);
insert(vnode.anchor, parentNode, anchor);
} else activate(vnode, parentNode, anchor, internals, parentComponent, operationSuspense, void 0, false);
return;
} else {
const prev = currentInstance;
simpleSetCurrentInstance(null);
if (!isMounted) {
if (transition) setTransitionHooks(vnode, transition);
namespace = getContainerType(parentNode);
internals.p(null, vnode, parentNode, anchor, parentComponent, operationSuspense, namespace, frag.slotScopeIds);
isMounted = true;
} else {
if (transition && moveType !== 2) setTransitionHooks(vnode, transition);
internals.m(vnode, parentNode, anchor, moveType, parentComponent, operationSuspense);
}
simpleSetCurrentInstance(prev);
mountedParentNode = parentNode;
mountedAnchor = anchor;
}
syncNodes();
if (isMounted && frag.u) frag.u.forEach((hook) => hook(frag.nodes));
};
frag.insert = (parentNode, anchor, parentSuspense, transition) => place(parentNode, anchor, parentSuspense, transition);
frag.move = (parentNode, anchor, moveType, _parentComponent, parentSuspense, transition) => place(parentNode, anchor, parentSuspense, transition, moveType);
const update = () => {
const next = extraProps ? withExtraProps(baseVNode) : baseVNode;
if (!mountedParentNode) return;
const previous = vnode;
if (frag.$transition) setTransitionHooks(next, frag.$transition);
if (previous.vaporScopeIds) setVNodeVaporScopeIds(next, previous.vaporScopeIds);
next.shapeFlag |= previous.shapeFlag & 768;
vnode = next;
trackFragmentVNodeUpdates(frag, vnode, syncNodes);
frag.vnode = vnode;
frag.$key = vnodeKeyOf(vnode);
const prevInstance = currentInstance;
simpleSetCurrentInstance(null);
internals.p(previous, vnode, mountedParentNode, mountedAnchor, parentComponent, suspense, namespace, frag.slotScopeIds);
simpleSetCurrentInstance(prevInstance);
syncNodes();
};
frag.patchVNode = (next) => {
if (next.type !== baseVNode.type) return;
baseVNode = next;
const prevSub = setActiveSub();
try {
update();
} finally {
setActiveSub(prevSub);
}
};
if (extraProps && !staticExtraProps) renderEffect(update);
frag.remove = unmount;
return frag;
}
/**
* Mount vdom component in vapor
*/
function createVDOMComponent(internals, component, parentComponent, rawProps, rawSlots, once, inputScope) {
let suspense = currentRenderContext.suspense || parentComponent && parentComponent.suspense;
const useBridge = shouldUseRendererBridge(component);
const comp = useBridge ? ensureRendererBridge(component) : component;
let propsInstance;
let rawValues = EMPTY_OBJ;
let isMounted = false;
let cells;
const isolated = rawSlots && isolateSlotSources(rawSlots);
if (isolated) {
rawSlots = isolated[0];
cells = isolated[1];
}
let hasDynamicProps = !once && (!!cells || hasDynamicPropsSource(rawProps || EMPTY_OBJ));
if (hasDynamicProps) inputScope || (inputScope = effectScope(true));
const prevInstance = setCurrentInstance(parentComponent, inputScope);
let vnode;
try {
if (!hasDynamicProps) {
rawValues = collectInputs(rawProps || EMPTY_OBJ, cells);
if (cells) deliverInputs(void 0, void 0, cells);
} else {
const effect = new RenderEffect(() => {
const prevInner = setCurrentInstance(parentComponent, inputScope);
try {
rawValues = collectProps(rawProps || EMPTY_OBJ, rawValues.style);
if (cells) collectSlotSources(cells);
} finally {
restoreCurrentInstance(prevInner);
}
if (effect.active && (propsInstance || cells)) deliverInputs(propsInstance, rawValues, cells);
}, true);
effect.run();
if (!effect.deps) {
effect.stop();
hasDynamicProps = false;
}
}
vnode = createVNode(comp, rawValues);
} catch (error) {
if (inputScope) inputScope.stop();
throw error;
} finally {
restoreCurrentInstance(prevInstance);
}
const { frag, syncNodes } = createVNodeFragment(vnode);
frag.inputScope = inputScope;
onScopeDispose(() => {
if (!isMounted && inputScope) inputScope.stop();
}, true);
const keepAliveCtx = isKeepAliveEnabled ? getKeepAliveContext(parentComponent) : null;
if (keepAliveCtx) {
keepAliveCtx.processShapeFlag(frag);
if (component.__asyncLoader) {
let disposed = false;
onScopeDispose(() => disposed = true);
component.__asyncLoader().then(() => {
if (!disposed) keepAliveCtx.cacheBlock(frag);
}).catch(NOOP);
}
}
if (!once && component.__asyncLoader && rawSlots && rawSlots.$) renderEffect(() => {
dynamicSlotsProxyHandlers.ownKeys(rawSlots);
const instance = vnode.component;
if (instance && instance.isMounted) instance.update();
}, true);
vnode.vi = (instance) => {
const prev = currentInstance;
simpleSetCurrentInstance(parentComponent);
const wrapper = propsInstance = new VaporComponentInstance(useBridge ? comp : {
props: instance.propsOptions[0],
__propsOptions: instance.propsOptions
}, void 0, rawSlots, parentComponent ? parentComponent.appContext : void 0);
simpleSetCurrentInstance(prev);
wrapper.interopVNode = vnode;
wrapper.hasDynamicProps = hasDynamicProps;
instance.scope.run(() => {
onScopeDispose(() => {
if (inputScope) inputScope.stop();
wrapper.scope.stop();
});
});
try {
deliverInputs(wrapper, rawValues);
} catch (error) {
if (inputScope) inputScope.stop();
wrapper.scope.stop();
throw error;
}
const attrs = createInternalObject();
const isFilteredAttr = (key) => typeof key === "string" && (isReservedProp(key) || isEmitListener(instance.emitsOptions, key));
instance.attrs = new Proxy(attrs, {
get(_, key) {
if (isFilteredAttr(key)) return;
return wrapper.attrs[key];
},
has(_, key) {
return !isFilteredAttr(key) && key in wrapper.attrs;
},
ownKeys() {
return Reflect.ownKeys(wrapper.attrs).filter((key) => !isFilteredAttr(key));
},
getOwnPropertyDescriptor(_, key) {
if (!isFilteredAttr(key) && key in wrapper.attrs) return {
enumerable: true,
configurable: true
};
}
});
instance.props = vnode.shapeFlag & 2 && !comp.props ? instance.attrs : shallowReactive(wrapper.props);
instance.slots = wrapper.rawSlots === EMPTY_OBJ ? createInternalObject() : new Proxy(wrapper.rawSlots, vaporSlotsProxyHandler);
if (component.__asyncLoader && wrapper.rawSlots !== EMPTY_OBJ) {
vnode.children = instance.slots;
vnode.shapeFlag |= 32;
}
};
let rawRef;
let isUnmounted = false;
let isDomRemoved = false;
const removeDom = (parentNode) => {
if (!parentNode || isDomRemoved) return;
removeAttachedNodes(resolveVNodeNodes(vnode), parentNode);
isDomRemoved = true;
};
const unmount = (parentNode, transition) => {
if (isUnmounted) {
if (!transition) removeDom(parentNode);
return;
}
if (transition) setTransitionHooks(vnode, transition);
const parentSuspense = resolveUnmountSuspense(suspense);
if (vnode.shapeFlag & 256) {
if (rawRef) setRef(rawRef, null, null, vnode, true);
if (frag.inputScope) frag.inputScope.pause();
keepAliveCtx.clearCurrent(frag);
deactivate(vnode, keepAliveCtx.getStorageContainer(), internals, parentComponent, parentSuspense);
return;
}
isUnmounted = true;
isMounted = false;
if (inputScope) inputScope.stop();
internals.um(vnode, parentComponent, parentSuspense, !!parentNode);
if (!transition) removeDom(parentNode);
};
frag.hydrate = () => {
if (!isHydrating$1) return;
hydrateVNode(vnode, parentComponent, frag.slotScopeIds, suspense);
isMounted = true;
syncNodes();
};
vnode.scopeId = getCurrentScopeId() || null;
vnode.slotScopeIds = currentRenderContext.slotScopeIds;
const place = (parentNode, anchor, parentSuspense, transition, moveType = 2) => {
if (isHydrating$1) return;
if (parentSuspense !== void 0) suspense = parentSuspense;
const operationSuspense = suspense;
if (vnode.shapeFlag & 512) {
if (frag.inputScope) frag.inputScope.resume();
activate(vnode, parentNode, anchor, internals, parentComponent, operationSuspense, void 0, false);
} else {
const prev = currentInstance;
simpleSetCurrentInstance(null);
if (!isMounted) {
if (transition) setTransitionHooks(vnode, transition);
internals.mt(vnode, parentNode, anchor, parentComponent, operationSuspense, getContainerType(parentNode), false);
if (rawRef) setRef(rawRef, null, operationSuspense, vnode);
isMounted = true;
} else {
if (transition && moveType !== 2) setTransitionHooks(vnode, transition);
internals.m(vnode, parentNode, anchor, moveType, parentComponent, operationSuspense);
}
simpleSetCurrentInstance(prev);
}
syncNodes();
if (isMounted && frag.u) frag.u.forEach((hook) => hook(frag.nodes));
};
frag.insert = (parentNode, anchor, parentSuspense, transition) => place(parentNode, anchor, parentSuspense, transition);
frag.move = (parentNode, anchor, moveType, _parentComponent, parentSuspense, transition) => place(parentNode, anchor, parentSuspense, transition, moveType);
frag.remove = unmount;
frag.setRef = (instance, ref, refFor, refKey) => {
const oldRawRef = rawRef;
rawRef = normalizeRef({
ref,
ref_for: refFor,
ref_key: refKey
}, instance);
vnode.ref = rawRef;
if (isMounted) {
let target = vnode;
if ((component.__asyncResolved || oldRawRef === void 0 && isAsyncWrapper(vnode) && !(vnode.shapeFlag & 512)) && vnode.component.subTree.component) {
target = vnode.component.subTree;
target.ref = rawRef;
}
if (rawRef) setRef(rawRef, oldRawRef || null, suspense, target);
else if (oldRawRef) setRef(oldRawRef, null, null, target, true);
}
};
return frag;
}
const rendererBridgeCache = /* @__PURE__ */ new WeakMap();
/**
* Teleport/Suspense are renderer primitives (`__isTeleport` / `__isSuspense`),
* not regular components with their own render pipeline.
*
* We wrap them with a tiny functional bridge so they can pass through the
* interop component mount path while preserving built-in vnode semantics.
*/
function shouldUseRendererBridge(component) {
return !!(component.__isTeleport || component.__isSuspense);
}
function ensureRendererBridge(component) {
let bridge = rendererBridgeCache.get(component);
if (!bridge) rendererBridgeCache.set(component, bridge = (props, { slots }) => createVNode(component, props, slots));
return bridge;
}
function hasValidVNodeContent(vnode) {
return !!ensureValidVNode(vnode.type === Fragment && isArray(vnode.children) ? vnode.children : [vnode]);
}
function trackSlotVNodeUpdatesWithRefresh(vnode, refresh, beforeUpdate) {
const track = (node) => {
if (beforeUpdate) node.ibu = beforeUpdate;
node.iu = refresh;
if (node.type === Fragment && isArray(node.children)) node.children.forEach((child) => {
if (isVNode(child)) track(child);
});
};
track(vnode);
}
/**
* Construction point for the interop hosts' resolution state — the shared
* bookkeeping fields plus the host-specific hooks. (SlotFragment, the third
* host, implements SlotResolutionState directly as a class.)
*/
function createSlotResolutionState(boundary, hooks) {
return extend$1({
boundary,
activeFallback: null,
fallbackInserted: false,
pendingRecheck: false,
pendingRecheckForce: false,
isReconciling: false
}, hooks);
}
/**
* Exposes `$transition` through the outlet fragment so BaseTransition state
* stays on the fragment; hooks inherited from VDOM BaseTransition are
* filtered out on read because they belong to its own state machine.
* Enumerable + configurable to match an object-literal accessor pair.
*/
function installInteropTransitionAccessor(state, frag) {
Object.defineProperty(state, "$transition", {
enumerable: true,
configurable: true,
get() {
const transition = frag.$transition;
return transition && isVaporTransitionHooks(transition) ? transition : void 0;
},
set(transition) {
frag.$transition = transition;
}
});
}
function renderVDOMSlot(internals, slotsRef, name, props, parentComponent, options = EMPTY_OBJ) {
const { fallback, flags = 0, adoptAnchor } = options;
const once = !!(flags & 2);
const sharedFallback = !!(flags & 8);
const forwarded = isForwardedSlot(flags);
const inheritFallback = slotInheritsFallback(flags);
const notifiesBoundary = slotNotifiesBoundary(flags);
let suspense = currentRenderContext.suspense || parentComponent.suspense;
const frag = createInteropFragment(EMPTY_BLOCK, null, 128);
const slotBoundary = frag.slotBoundary;
const content = new InteropContentState();
const scope = effectScope();
let localFallback;
let rendered = null;
let isMounted = false;
let currentParentNode = null;
let slotNamespace;
let currentAnchor = null;
let sharedContentStorage;
let disposed = false;
let pendingInOutVNode;
let pendingOutIn;
let isContentUpdateRecheck = false;
let slotResolutionState;
frag.isBlockValid = (componentAsValid) => {
if (!content.resolved) return true;
return slotResolutionState.activeFallback ? isValidBlock(slotResolutionState.activeFallback, componentAsValid) : content.valid;
};
const parentBoundary = inheritFallback ? slotBoundary : null;
const boundary = createSlotBoundary(frag, () => parentBoundary, () => localFallback, (force) => markSlotResolutionDirty(slotResolutionState, force), [cleanupInvalidContent]);
const contentBoundary = forwarded || fallback ? boundary : null;
slotResolutionState = createSlotResolutionState(boundary, {
getContent: () => content.nodes,
getParentNode: () => currentParentNode,
getAnchor: () => currentAnchor,
isBusy: () => false,
isDisposed: () => disposed,
isContentValid: () => content.valid,
syncNodes: () => {
frag.nodes = resolveExposedSlotNodes(slotResolutionState);
},
notifyExposedValidityChange: () => {
if (notifiesBoundary && !isContentUpdateRecheck && slotBoundary) slotBoundary.markDirty();
}
});
installInteropTransitionAccessor(slotResolutionState, frag);
if (sharedFallback && slotBoundary) registerContentInvalid(slotBoundary, parkSharedContent, frag);
if (notifiesBoundary) trackSlotBoundaryDirtying(frag, sharedFallback ? void 0 : cleanupInvalidContent);
localFallback = fallback ? once ? () => withOnce(() => fallback(internals, parentComponent)) : () => fallback(internals, parentComponent) : void 0;
const place = (parentNode, anchor, parentSuspense, moveType) => {
if (isHydrating$1) return;
if (parentSuspense !== void 0) suspense = parentSuspense;
if (localFallback && !inheritFallback && !frag.anchor) {
frag.anchor = resolveFragmentAnchor(adoptAnchor, void 0);
if (frag.anchor !== adoptAnchor) parentNode.insertBefore(frag.anchor, anchor);
anchor = frag.anchor;
}
const sharedContentParked = !!sharedContentStorage;
currentParentNode = parentNode;
currentAnchor = anchor;
if (!isMounted) {
slotNamespace = getContainerType(parentNode);
scope.run(render);
isMounted = true;
} else {
if (sharedContentParked) {
insert(frag.nodes, parentNode, anchor, suspense);
sharedContentStorage = void 0;
if (slotResolutionState.activeFallback) slotResolutionState.fallbackInserted = true;
} else if (isVNode(rendered)) internals.m(rendered, parentNode, anchor, moveType === void 0 ? 2 : moveType, parentComponent, suspense);
else if (rendered) {
if (moveType === void 0) insert(rendered, parentNode, anchor, suspense);
else move(rendered, parentNode, anchor, moveType, void 0, suspense);
}
if (!sharedContentParked) insertActiveSlotFallback(slotResolutionState, moveType);
}
notifyUpdated();
};
frag.insert = (parentNode, anchor, parentSuspense) => place(parentNode, anchor, parentSuspense);
frag.move = (parentNode, anchor, moveType, _parentComponent, parentSuspense) => place(parentNode, anchor, parentSuspense, moveType);
frag.remove = (parentNode) => {
const storage = sharedContentStorage;
if (parentNode && !storage) currentParentNode = parentNode;
scope.stop();
disposed = true;
const leavingElement = pendingOutIn && pendingOutIn.leavingElement;
pendingOutIn = void 0;
const leave = leavingElement && leavingElement[leaveCbKey];
if (leave) leave(true);
if (rendered) removeRenderedContent(rendered, storage || parentNode);
disposeSlotResolution(slotResolutionState, storage || parentNode);
if (storage) {
const anchor = frag.anchor;
if (anchor && anchor.parentNode === storage) frag.anchor = void 0;
sharedContentStorage = void 0;
}
};
frag.hydrate = () => {
if (!isHydrating$1) return;
const open = currentHydrationNode;
if (open && isRangeEnd(open)) {
runWithoutHydration(() => place(open.parentNode, open, void 0));
return;
}
if (open && isComment(open, "(")) {
const close = frag.anchor = claimAnchor(locateEndAnchor(open));
hydrateSlotFallbackRange({
first: open.nextSibling,
close,
boundary
}, () => place(close.parentNode, close, void 0));
if (slotResolutionState.activeFallback) setVNode(null);
advanceHydrationNode(close);
return;
}
const hydrationParent = currentHydrationNode && currentHydrationNode.parentNode;
scope.run(render);
if (!currentParentNode) {
currentAnchor = currentSlotEndAnchor || currentHydrationNode;
currentParentNode = currentAnchor.parentNode;
}
slotNamespace = getContainerType(hydrationParent || currentParentNode);
if (content.valid && localFallback && !inheritFallback && !frag.anchor) {
const outletAnchor = claimUntrackedAnchor(/* @__PURE__ */ createTextNode());
insertUntrackedAnchor(currentParentNode, currentAnchor, outletAnchor);
frag.anchor = currentAnchor = outletAnchor;
}
isMounted = true;
};
return frag;
function cleanupInvalidContent() {
const pending = pendingInOutVNode;
if (pending) {
pendingInOutVNode = void 0;
const transition = slotResolutionState.$transition;
const fallback = slotResolutionState.activeFallback;
if (transition) prepareTransitionLeave(pending, fallback && isValidSlot(fallback) ? transition : void 0, transition.props, transition.state, transition.instance, NOOP);
internals.um(pending, parentComponent, resolveUnmountSuspense(suspense), true);
return;
}
if (currentParentNode) removeAttachedNodes(content.nodes, currentParentNode);
}
function parkSharedContent() {
if (!currentParentNode || sharedContentStorage) return;
invalidateExposedSlotContent(slotResolutionState);
const storage = document.createDocumentFragment();
let anchor = frag.anchor;
if (!anchor || anchor.parentNode !== currentParentNode) anchor = /* @__PURE__ */ createTextNode();
storage.appendChild(anchor);
insert(frag.nodes, storage, anchor, suspense);
sharedContentStorage = storage;
currentParentNode = storage;
currentAnchor = anchor;
}
function notifyUpdated() {
syncInteropRoot(parentComponent);
if (isMounted && frag.u) frag.u.forEach((hook) => hook(frag.nodes));
}
function notifyBeforeUpdate() {
if (isMounted && frag.bu) frag.bu.forEach((hook) => hook());
}
function recheckAfterContentUpdate(forceResolutionRecheck = false) {
isContentUpdateRecheck = true;
try {
recheckSlotResolution(slotResolutionState, forceResolutionRecheck);
} finally {
isContentUpdateRecheck = false;
}
}
function finishContentUpdate(forceResolutionRecheck = false) {
recheckAfterContentUpdate(forceResolutionRecheck);
notifyUpdated();
}
function patchSlotVNode(previous, next, slotScopeIds, valid) {
setVNode(next);
const refreshSlotVNode = () => {
const prevValid = content.valid;
const prevOutput = frag.nodes;
setRendered(next);
recheckAfterContentUpdate();
if (content.valid !== prevValid || !isSameResolvedOutput(prevOutput, frag.nodes)) notifyUpdated();
};
trackSlotVNodeUpdatesWithRefresh(next, refreshSlotVNode, notifyBeforeUpdate);
const prev = currentInstance;
simpleSetCurrentInstance(null);
internals.p(previous, next, currentParentNode, currentAnchor, parentComponent, suspense, slotNamespace, concatInteropScopeIds(frag.slotScopeIds, slotScopeIds));
simpleSetCurrentInstance(prev);
setRendered(next, valid);
finishContentUpdate();
}
function removeRenderedContent(renderedContent, parentNode) {
const contentDetached = !!slotResolutionState.activeFallback;
if (isVNode(renderedContent)) internals.um(renderedContent, parentComponent, resolveUnmountSuspense(suspense), !contentDetached && !!parentNode);
else remove(renderedContent, contentDetached ? void 0 : parentNode);
}
function resumeOutIn() {
queuePostFlushCb(() => {
const pending = pendingOutIn;
pendingOutIn = void 0;
if (!pending || disposed || !currentParentNode) return;
const pendingContent = pending.content;
if (isVNode(pendingContent)) {
const nextVNode = prepareInteropSlotTransition(frag, pendingContent, forwarded, void 0, NOOP) || pendingContent;
patchSlotVNode(pending.placeholder, nextVNode, pendingContent.slotScopeIds, pending.contentValid);
} else {
setVNode(null);
if (pending.placeholder) removeRenderedContent(pending.placeholder, currentParentNode);
if (pendingContent) insert(pendingContent, currentParentNode, currentAnchor, suspense);
setRendered(pendingContent || null, pending.contentValid);
finishContentUpdate();
}
});
}
function render() {
const prev = currentInstance;
simpleSetCurrentInstance(frag.renderInstance);
try {
once ? renderContent() : renderEffect(renderContent);
} finally {
simpleSetCurrentInstance(prev);
}
}
function renderContent() {
notifyBeforeUpdate();
withRenderContext(frag.ctx, () => withSlotBoundary(contentBoundary, () => {
const { content: slotContent, valid: slotContentValid } = resolveSlotContent();
if (isHydrating$1) {
hydrateContent(slotContent, slotContentValid);
return;
}
if (pendingOutIn) {
pendingOutIn.content = slotContent;
pendingOutIn.contentValid = slotContentValid;
return;
}
if (isVNode(slotContent)) {
applyVNodeContent(slotContent, slotContentValid);
return;
}
if (slotContent) {
applyBlockContent(slotContent, slotContentValid);
return;
}
applyEmptyContent();
}));
}
function resolveSlotContent() {
let slotContent;
let slotContentValid = false;
if (slotsRef.value) {
const renderContent = () => renderSlot(slotsRef.value, isFunction(name) ? name() : name, props);
slotContent = once ? withOnce(renderContent) : renderContent();
if (isVNode(slotContent)) slotContentValid = slotContent.type !== Fragment || hasValidVNodeContent(slotContent);
else if (slotContent) slotContentValid = isValidSlot(slotContent);
}
return {
content: slotContent,
valid: slotContentValid
};
}
function applyVNodeContent(slotContent, slotContentValid) {
const prevRendered = rendered;
const transition = slotResolutionState.$transition;
const mode = transition && transition.props.mode;
let delayedLeaveSource;
if (slotResolutionState.activeFallback && !slotContentValid) {
applyEmptyContent();
return;
}
if (slotResolutionState.activeFallback && slotContentValid && transition) {
if (mode === "out-in") {
const fallback = slotResolutionState.activeFallback;
const leavingBlock = fallback && findTransitionBlock(fallback);
pendingOutIn = {
content: slotContent,
placeholder: null,
contentValid: true,
leavingElement: leavingBlock && getTransitionElement(leavingBlock)
};
if (leaveSlotFallback(slotResolutionState, transition, resumeOutIn)) return;
pendingOutIn = void 0;
} else if (mode === "in-out") {
const enterHooks = extend$1({}, transition);
delete enterHooks.delayedLeave;
leaveSlotFallback(slotResolutionState, enterHooks, NOOP);
delayedLeaveSource = enterHooks;
}
}
const prevIsVNode = isVNode(prevRendered);
const prevVNode = prevIsVNode && (!slotResolutionState.activeFallback || content.valid) ? prevRendered : null;
if (prevVNode && !slotContentValid && transition && hasSlotFallback(boundary)) {
if (mode === "out-in") {
const placeholder = prepareInteropSlotTransition(frag, slotContent, forwarded, void 0, NOOP) || createCommentVNode();
if (prepareTransitionLeave(prevVNode, void 0, transition.props, transition.state, transition.instance, resumeOutIn)) {
suspendForOutIn(prevVNode, placeholder, slotContent, false);
return;
}
} else if (mode === "in-out") {
pendingInOutVNode = prevVNode;
setVNode(null);
setRendered(null);
finishContentUpdate();
return;
}
}
const transitionChild = prepareInteropSlotTransition(frag, slotContent, forwarded, prevVNode || void 0, resumeOutIn, delayedLeaveSource);
const nextVNode = transitionChild || slotContent;
if (prevVNode && transitionChild && transition && transition.state.isLeaving) {
suspendForOutIn(prevVNode, nextVNode, slotContent, slotContentValid);
return;
}
if (prevRendered && !prevIsVNode) removeRenderedContent(prevRendered, currentParentNode);
patchSlotVNode(prevVNode, nextVNode, slotContent.slotScopeIds, slotContentValid);
}
function applyBlockContent(slotContent, slotContentValid) {
setVNode(null);
const prevRendered = rendered;
if (prevRendered) removeRenderedContent(prevRendered, currentParentNode);
insert(slotContent, currentParentNode, currentAnchor, suspense);
setRendered(slotContent, slotContentValid);
finishContentUpdate();
}
function applyEmptyContent() {
if (rendered) removeRenderedContent(rendered, currentParentNode);
setVNode(null);
setRendered(null);
finishContentUpdate();
}
function setVNode(vnode) {
frag.vnode = vnode;
frag.$key = vnode ? getVNodeKey(vnode) : void 0;
}
/** Commit rendered output, deriving the content nodes and validity. */
function setRendered(renderedContent, knownValid) {
rendered = renderedContent;
if (isVNode(renderedContent)) {
content.nodes = resolveVNodeNodes(renderedContent);
content.valid = knownValid === void 0 ? hasValidVNodeContent(renderedContent) : knownValid;
} else if (renderedContent) {
content.nodes = renderedContent;
content.valid = knownValid === void 0 ? isValidSlot(renderedContent) : knownValid;
} else {
content.nodes = EMPTY_BLOCK;
content.valid = false;
}
content.resolved = true;
}
function suspendForOutIn(prevVNode, placeholder, slotContent, contentValid) {
pendingOutIn = {
content: slotContent,
placeholder,
contentValid,
leavingElement: getInteropTransitionElement(prevVNode)
};
setVNode(placeholder);
rendered = placeholder;
internals.p(prevVNode, placeholder, currentParentNode, currentAnchor, parentComponent, suspense, slotNamespace, null);
}
/**
* One-shot hydration claimer: adopts the SSR-rendered slot content instead
* of mounting. Runs only on the first render pass under an active hydration
* cursor; later passes take the CSR paths above.
*/
function hydrateContent(slotContent, slotContentValid) {
if (!isHydrating$1) return;
const hydratedContent = slotContent && (slotContentValid || !hasSlotFallback(boundary)) ? slotContent : void 0;
if (isVNode(hydratedContent)) {
const transitionChild = prepareInteropSlotTransition(frag, hydratedContent, forwarded, void 0, NOOP);
const hydrationVNode = transitionChild || hydratedContent;
setVNode(hydrationVNode);
const refreshSlotVNode = () => {
frag.nodes = resolveVNodeNodes(hydrationVNode);
notifyUpdated();
};
trackSlotVNodeUpdatesWithRefresh(hydrationVNode, refreshSlotVNode, notifyBeforeUpdate);
const hydrationParent = /* @__PURE__ */ parentNode(currentHydrationNode);
const close = transitionChild && locateFragmentEnd(currentHydrationNode);
if (close) setCurrentHydrationNode(currentHydrationNode.nextSibling);
hydrateVNode(hydrationVNode, parentComponent, concatInteropScopeIds(frag.slotScopeIds, hydrationVNode === hydratedContent ? null : hydratedContent.slotScopeIds), suspense);
if (close) {
frag.anchor = claimAnchor(close);
advanceHydrationNode(close);
}
currentParentNode = hydrationParent;
currentAnchor = internals.n(hydrationVNode);
setRendered(hydrationVNode, slotContentValid);
} else if (hydratedContent) {
setVNode(null);
setRendered(hydratedContent, slotContentValid);
} else {
setVNode(null);
setRendered(null);
}
finishContentUpdate(true);
}
}
function needsHostParentForRemove(block) {
if (isVaporComponent(block)) return isKeepAlive(block) || needsHostParentForRemove(block.block);
if (isArray(block)) return block.some(needsHostParentForRemove);
if (isFragment(block)) return needsHostParentForRemove(block.nodes);
return false;
}
const vaporInteropPlugin = (app) => {
enableSuspense();
setInteropEnabled();
setPublishInteropScopeIds(publishVaporScopeIds);
app._context.vapor = vaporInteropImpl;
const internals = ensureRenderer().internals;
app._context.vdom = {
mount: createVDOMComponent.bind(null, internals),
slot: renderVDOMSlot.bind(null, internals),
mountVNode: mountDynamicVNode.bind(null, internals)
};
const mount = app.mount;
app.mount = ((...args) => {
optimizePropertyLookup();
return mount(...args);
});
};
function hydrateVNode(vnode, parentComponent, slotScopeIds = null, parentSuspense = null) {
const node = currentHydrationNode;
if (!vdomHydrateNode) vdomHydrateNode = ensureHydrationRenderer().hydrateNode;
const prev = currentInstance;
simpleSetCurrentInstance(null);
const nextNode = vdomHydrateNode(node, vnode, parentComponent, parentSuspense, slotScopeIds, false);
simpleSetCurrentInstance(prev);
if (nextNode) setCurrentHydrationNode(nextNode);
else advanceHydrationNode(/* @__PURE__ */ parentNode(node));
}
function createFallback(state, depth, parentComponent) {
const internals = ensureRenderer().internals;
return () => {
const frag = createVNodeChildrenFragment(internals, () => {
const outlet = state.outletsRef.value[depth];
const children = outlet && invokeSlotFallback(outlet.fallback, outlet.owner);
return children == null ? EMPTY_VNODES : normalizeInteropSlotValue(children);
}, parentComponent);
if (isHydrating$1 && frag.hydrate) frag.hydrate();
return frag;
};
}
function mountSlotWithoutHydration(vnode, open, close, parentComponent, parentSuspense, slotScopeIds, fallbackRange) {
const container = /* @__PURE__ */ parentNode(close);
const mount = () => {
const block = vnode.vb = renderVaporSlot(vnode, parentComponent, parentSuspense, slotScopeIds, fallbackRange);
let anchor = close;
if (!open) {
anchor = isFragment(block) && block.anchor || /* @__PURE__ */ createTextNode();
insert(anchor, container, close);
}
vnode.el = open || anchor;
vnode.anchor = anchor;
insert(block, container, anchor, parentSuspense);
};
if (fallbackRange) hydrateSlotFallbackRange(fallbackRange, mount);
else runWithoutHydration(mount);
}
function hydrateOutletFallback(children, node, close, depth, parentComponent, parentSuspense, slotScopeIds) {
const container = /* @__PURE__ */ parentNode(node);
const internals = ensureRenderer().internals;
let next = node;
for (let i = 0; i < children.length; i++) {
const child = children[i];
if (child.vs) {
const outlets = child.vs.outlets;
mountSlotWithoutHydration(child, null, close, parentComponent, parentSuspense, slotScopeIds, {
depth: outlets && outlets[0].innerIds == null ? depth + 1 : depth,
first: node,
close
});
next = close;
} else if (child.type === Fragment && hasVaporSlot(child)) {
insert(child.el = /* @__PURE__ */ createTextNode(), container, next);
next = hydrateOutletFallback(child.children, node, close, child.vo ? depth + 1 : depth, parentComponent, parentSuspense, child.slotScopeIds ? concatInteropScopeIds(slotScopeIds, child.slotScopeIds) : slotScopeIds);
insert(child.anchor = /* @__PURE__ */ createTextNode(), container, next);
} else runWithoutHydration(() => internals.p(null, child, container, next, parentComponent, parentSuspense, getContainerType(container), slotScopeIds));
}
return next;
}
function hasVaporSlot(fragment) {
return fragment.children.some((child) => child.vs || child.type === Fragment && hasVaporSlot(child));
}
function attachSlotOutlet(content, fallback, owner) {
let slot = findLoneSlot(content, 0) ? loneSlot : null;
if (slot) {
if (slot.cacheIndex != null) slot = loneSlotIn[loneSlotAt] = cloneVNode(slot);
const vs = slot.vs;
const outlet = {
fallback,
owner,
innerIds: loneSlotInnerIds
};
vs.outlets = vs.outlets ? vs.outlets.concat(outlet) : [outlet];
}
loneSlot = loneSlotIn = null;
return !!slot;
}
let loneSlot = null;
let loneSlotIn = null;
let loneSlotAt = 0;
let loneSlotInnerIds = 0;
function findLoneSlot(vnodes, pathIds) {
for (let i = 0; i < vnodes.length; i++) {
const child = vnodes[i];
if (!isVNode(child)) return false;
if (child.vs) {
if (loneSlot) return false;
loneSlot = child;
loneSlotIn = vnodes;
loneSlotAt = i;
loneSlotInnerIds = pathIds;
} else if (child.type === Fragment) {
if (child.patchFlag > 0 && child.patchFlag & 384 || !findLoneSlot(child.children, pathIds + (child.slotScopeIds ? child.slotScopeIds.length : 0))) return false;
} else if (child.type !== Comment$1) return false;
}
return true;
}
function resolveInteropVaporSlotState(vnode) {
const slot = vnode.vs;
let state = slot.state;
if (!state) {
const outlets = slot.outlets || EMPTY_ARR;
state = {
outlets,
outletsRef: shallowRef(outlets)
};
slot.state = state;
}
return state;
}
function syncInteropVaporSlotState(n1, n2) {
const prevState = n1.vs.state;
if (!prevState) return;
n2.vs.state = prevState;
prevState.outletsRef.value = prevState.outlets = n2.vs.outlets || EMPTY_ARR;
}
function trackInteropFallbackChanges(scope, state, onChange) {
if (!scope) return;
let trackedDepth = state.outlets.length;
scope.run(() => {
renderEffect(() => {
const nextDepth = state.outletsRef.value.length;
if (nextDepth !== trackedDepth) {
trackedDepth = nextDepth;
onChange();
}
}, true);
});
}
function renderVaporSlot(vnode, parentComponent, parentSuspense, contextSlotScopeIds, fallbackRange) {
const prev = currentInstance;
const prevCtx = currentRenderContext;
simpleSetCurrentInstance(parentComponent);
if (isSuspenseEnabled && parentSuspense) setRenderContext(deriveSuspense(prevCtx, parentSuspense));
try {
if (!vnode.vs || !vnode.vs.slot) return EMPTY_BLOCK;
const slotState = resolveInteropVaporSlotState(vnode);
const frag = createInteropFragment(EMPTY_BLOCK, null, 128);
const inherited = getInheritedScopeIds(vnode, parentComponent, false);
frag.ctx = deriveSlotScopeIds(frag.ctx, getInteropVaporSlotScopeIds(contextSlotScopeIds, vnode.slotScopeIds, inherited));
const content = new InteropContentState();
frag.isBlockValid = (componentAsValid) => content.resolved ? isValidBlock(frag.nodes, componentAsValid) : true;
const slotBoundary = frag.slotBoundary;
let isResolvingContent = false;
let currentParentNode = null;
let currentAnchor = null;
let disposed = false;
let slotResolutionState;
let ownedSlotFragment;
let ownedSlotFragmentDirtyQueued = false;
let ownedSlotFragmentDirtyForce = false;
const onContentInvalid = [() => {
if (currentParentNode) removeAttachedNodes(content.nodes, currentParentNode);
}];
const markInteropSlotResolutionDirty = (force) => {
const target = ownedSlotFragment;
if (!target) {
markSlotResolutionDirty(slotResolutionState, force);
return;
}
ownedSlotFragmentDirtyForce = ownedSlotFragmentDirtyForce || !!force;
if (ownedSlotFragmentDirtyQueued) return;
ownedSlotFragmentDirtyQueued = true;
queuePostFlushCb(() => {
ownedSlotFragmentDirtyQueued = false;
const force = ownedSlotFragmentDirtyForce;
ownedSlotFragmentDirtyForce = false;
markSlotResolutionDirty(target, force);
});
};
const outletBoundaries = [];
const createOutletBoundary = (depth, onContentInvalid) => {
let fallback;
return createSlotBoundary(frag, () => getOutletBoundary(depth + 1), () => slotState.outlets[depth] ? fallback || (fallback = createFallback(slotState, depth, parentComponent)) : void 0, markInteropSlotResolutionDirty, onContentInvalid, () => {
const outlet = slotState.outlets[depth];
return outlet && outlet.innerIds != null ? getEnclosingOutletScopeIds(contextSlotScopeIds, outlet.innerIds, inherited) : frag.slotScopeIds;
});
};
const getOutletBoundary = (depth) => depth < slotState.outlets.length ? outletBoundaries[depth] || (outletBoundaries[depth] = createOutletBoundary(depth)) : slotBoundary;
const rootBoundary = outletBoundaries[0] = createOutletBoundary(0, onContentInvalid);
slotResolutionState = createSlotResolutionState(rootBoundary, {
getContent: () => content.nodes,
getParentNode: () => currentParentNode,
getAnchor: () => currentAnchor,
isBusy: () => isResolvingContent,
isDisposed: () => disposed,
isContentValid: () => isValidSlot(content.nodes),
syncNodes: () => {
frag.nodes = resolveExposedSlotNodes(slotResolutionState);
content.resolved = true;
},
notifyExposedValidityChange: () => {
if (slotBoundary) slotBoundary.markDirty();
}
});
const takePendingRecheck = () => {
const force = slotResolutionState.pendingRecheckForce;
slotResolutionState.pendingRecheck = false;
slotResolutionState.pendingRecheckForce = false;
return force;
};
const dispose = (parentNode) => {
if (disposed) return;
if (parentNode) currentParentNode = parentNode;
disposed = true;
disposeSlotResolution(slotResolutionState, parentNode);
currentParentNode = null;
currentAnchor = null;
};
try {
const hasInteropFallback = slotState.outlets.length > 0;
slotResolutionState.pendingRecheck = false;
slotResolutionState.pendingRecheckForce = false;
const finalizeResolvedContent = (resolvedContent) => {
if (hasInteropFallback && isSlotResolver(resolvedContent)) return resolvedContent;
content.nodes = resolvedContent || EMPTY_BLOCK;
recheckSlotResolution(slotResolutionState, takePendingRecheck());
return resolvedContent;
};
let resolvedContent;
const renderContent = () => resolvedContent = finalizeResolvedContent(withRenderContext(frag.ctx, () => withSlotBoundary(rootBoundary, () => invokeVaporSlot(vnode))));
isResolvingContent = true;
try {
if (fallbackRange) (fallbackRange.boundary = getOutletBoundary(fallbackRange.depth)).adoptFallback = fallbackRange.adopt;
if (isHydrating$1) withHydratingSlotBoundary(renderContent);
else renderContent();
} finally {
isResolvingContent = false;
}
if (hasInteropFallback && isSlotResolver(resolvedContent)) {
ownedSlotFragment = resolvedContent;
trackInteropFallbackChanges(vnode.vs.scope, slotState, () => markInteropSlotResolutionDirty());
dispose();
return resolvedContent;
}
slotResolutionState.pendingRecheck = false;
slotResolutionState.pendingRecheckForce = false;
frag.insert = (parentNode, anchor, parentSuspense) => {
currentParentNode = parentNode;
currentAnchor = anchor;
if (slotResolutionState.activeFallback) insertActiveSlotFallback(slotResolutionState);
else insert(frag.nodes, parentNode, anchor, parentSuspense);
};
frag.move = (parentNode, anchor, moveType, parentComponent, parentSuspense) => {
currentParentNode = parentNode;
currentAnchor = anchor;
if (slotResolutionState.activeFallback) insertActiveSlotFallback(slotResolutionState, moveType);
else move(frag.nodes, parentNode, anchor, moveType, parentComponent, parentSuspense);
};
frag.remove = (parentNode) => {
if (!slotResolutionState.activeFallback) remove(frag.nodes, parentNode);
dispose(parentNode);
};
trackInteropFallbackChanges(vnode.vs.scope, slotState, () => {
recheckSlotResolution(slotResolutionState, true);
});
if (isHydrating$1 && currentHydrationNode) {
currentAnchor = currentHydrationNode;
currentParentNode = currentAnchor.parentNode;
}
return frag;
} catch (e) {
dispose(currentParentNode || void 0);
stopVaporSlotScope(vnode);
throw e;
}
} finally {
setRenderContext(prevCtx);
simpleSetCurrentInstance(prev);
}
}
function stopVaporSlotScope(vnode) {
if (vnode.vs && vnode.vs.scope) {
vnode.vs.scope.stop();
vnode.vs.scope = void 0;
}
}
/**
* Slot functions can create renderEffects while evaluating their block.
* Those effects live in this dedicated scope so slot re-mount/unmount can
* dispose them immediately instead of waiting for the parent component.
*/
function invokeVaporSlot(vnode) {
const propsRef = vnode.vs.ref = shallowRef(vnode.props);
const scope = effectScope();
vnode.vs.scope = scope;
try {
const run = () => vnode.vs.slot(new Proxy(propsRef, vaporSlotPropsProxyHandler));
return inOnce ? withOnce(() => scope.run(run), false) : scope.run(run);
} catch (e) {
vnode.vs.scope = void 0;
scope.stop();
throw e;
}
}
function resolveInteropRootEl(instance) {
return getRootElement(instance, { onDynamicFragment: (frag) => registerInteropRootSync(instance, frag) });
}
function syncVNodeEl(vnode, instance) {
vnode.el = resolveInteropRootEl(instance) || vnode.anchor;
}
function syncInteropRoot(instance) {
const state = vnodeHookStateMap.get(instance);
if (!state) return;
syncVNodeEl(state.vnode, instance);
}
function invokeInteropDirsHook(instance, el, vnode, name, prevVNode = null) {
if (!vnode.dirs) return;
invokeDirectiveHook(vnode.el === el ? vnode : extend$1({}, vnode, { el }), prevVNode, instance.parent, name);
}
function queueInteropDirsJob(instance, job, suspense = instance.suspense) {
queuePostRenderEffect(job, void 0, suspense);
}
function warnNonElementRootDirs() {
warn("Runtime directive used on component with non-element root node. The directives will not function as intended.");
}
function getInteropDirsOwner(state, comp, vnode) {
const owners = state.dirsOwners || (state.dirsOwners = /* @__PURE__ */ new WeakMap());
let owner = owners.get(comp);
if (owner) owner.vnode = vnode;
else owners.set(comp, owner = {
comp,
vnode,
el: null,
carried: vnode,
updating: null,
patching: null,
pending: null
});
return owner;
}
function resolveInteropDirsRoot(instance, state, block, inherit) {
let owner = inherit;
const el = getRootElement(block, {
excludeSlotOutlets: true,
onDynamicFragment: (frag) => registerInteropDirsFragment(instance, state, frag, owner),
onComponent: (comp) => {
registerInteropDirsComponent(instance, state, comp);
owner = getInteropDirsOwner(state, comp, inherit.vnode);
}
});
return [owner, el];
}
function isPendingInteropSetup(comp) {
return isSuspenseEnabled && !!comp.asyncDep && !comp.asyncResolved;
}
function registerAfterInteropSetup(comp, pending, register) {
if (pending) (comp.bm || (comp.bm = [])).push(register);
else register();
}
function isPendingInteropDirsRoot(comp) {
if (isPendingInteropSetup(comp)) return true;
const block = comp.block;
return isAsyncComponentEnabled && isAsyncWrapper(comp) && isFragment(block) && block.nodes === EMPTY_BLOCK;
}
function innerInteropDirsOwner(state, comp, visit) {
const owners = state.dirsOwners;
let owner;
if (!owners) return;
getRootElement(comp, {
excludeSlotOutlets: true,
onComponent: (comp) => {
const next = owners.get(comp);
if (next) {
owner = next;
if (visit) visit(next);
}
}
});
return owner;
}
function settleInteropDirsReceived(instance, state) {
const received = state.dirsReceived;
if (!received) return;
state.dirsReceived = null;
const active = /* @__PURE__ */ new Set();
innerInteropDirsOwner(state, instance, (owner) => active.add(owner));
received.forEach(([owner, vnode]) => {
if (!active.has(owner)) owner.vnode = vnode;
});
}
function mountInteropDirsRoot(instance, owner, el) {
const vnode = owner.carried = owner.vnode;
owner.el = el;
invokeInteropDirsHook(instance, el, vnode, "created");
invokeInteropDirsHook(instance, el, vnode, "beforeMount");
queueInteropDirsJob(instance, () => invokeInteropDirsHook(instance, el, vnode, "mounted"));
}
function unmountInteropDirs(instance, state, comp) {
const owners = state.dirsOwners;
const owner = owners && owners.get(comp);
if (!owner) return;
owners.delete(comp);
if (owner.el) unmountInteropDirsRoot(instance, owner, resolveUnmountSuspense(instance.suspense));
}
function unmountInteropDirsRoot(instance, owner, suspense) {
const el = owner.el;
const vnode = owner.carried;
owner.el = null;
owner.updating = owner.pending = null;
invokeInteropDirsHook(instance, el, vnode, "beforeUnmount");
queueInteropDirsJob(instance, () => invokeInteropDirsHook(instance, el, vnode, "unmounted"), suspense);
}
function updateInteropDirs(instance, state, vnode, prevVNode) {
if (!state.dirsOwners) return;
settleInteropDirsReceived(instance, state);
const owner = innerInteropDirsOwner(state, instance, (owner) => {
if (owner.comp !== instance) (state.dirsReceived || (state.dirsReceived = [])).push([owner, owner.vnode]);
owner.vnode = vnode;
});
const el = owner && owner.el;
if (el) invokeInteropDirsHook(instance, el, vnode, "beforeUpdate", prevVNode);
queueInteropDirsJob(instance, () => {
settleInteropDirsReceived(instance, state);
if (!el || owner.el !== el || innerInteropDirsOwner(state, instance) !== owner) return;
owner.carried = vnode;
invokeInteropDirsHook(instance, el, vnode, "updated", prevVNode);
});
}
function isInteropDirsUpdating(state, owner) {
return !!owner.updating && innerInteropDirsOwner(state, owner.updating) === owner;
}
function beforeInteropDirsSelfUpdate(instance, state, source) {
const owners = state.dirsOwners;
const self = owners && owners.get(source);
if (!self) return;
if (state.pendingVNodeUpdate && (source === instance || isOnInteropRootChain(instance, source))) return;
const owner = self.el ? self : innerInteropDirsOwner(state, source);
if (!owner || !owner.el || isInteropDirsUpdating(state, owner)) return;
owner.updating = source;
self.patching = owner;
invokeInteropDirsHook(instance, owner.el, owner.vnode, "beforeUpdate", owner.pending || owner.carried);
}
function afterInteropDirsSelfUpdate(instance, state, source) {
const owners = state.dirsOwners;
const self = owners && owners.get(source);
const owner = self && self.patching;
if (!owner) return;
self.patching = null;
if (owner.updating !== source) return;
owner.updating = null;
if (owner.el && innerInteropDirsOwner(state, source) === owner) {
const prevVNode = owner.pending || owner.carried;
owner.pending = null;
owner.carried = owner.vnode;
invokeInteropDirsHook(instance, owner.el, owner.vnode, "updated", prevVNode);
}
}
function invokeInteropVNodeHook(instance, hook, vnode, prevVNode = null) {
if (hook) invokeVNodeHook(hook, instance.parent, vnode, prevVNode);
}
function queueInteropVNodeHook(instance, hook, vnode, suspense) {
if (hook) queuePostRenderEffect(() => invokeVNodeHook(hook, instance.parent, vnode), void 0, suspense);
}
function invokeInteropVNodeBeforeUpdate(instance, vnode, prevVNode) {
invokeInteropVNodeHook(instance, vnode.props && vnode.props.onVnodeBeforeUpdate, vnode, prevVNode);
if (vnode.ibu) vnode.ibu();
}
function invokeInteropVNodeUpdated(instance, vnode, prevVNode) {
invokeInteropVNodeHook(instance, vnode.props && vnode.props.onVnodeUpdated, vnode, prevVNode);
if (vnode.iu) vnode.iu();
}
function updateInteropVNode(instance, state, vnode, prevVNode) {
state.pendingVNodeUpdate = vnode;
const rawProps = instance.rawProps = interopRawProps(vnode);
const prevSub = setActiveSub();
startBatch();
try {
deliverInputs(instance, rawProps);
instance.rawSlotsRef.value = normalizeInteropSlots(vnode.children);
} finally {
try {
endBatch();
} finally {
setActiveSub(prevSub);
}
}
invokeInteropVNodeBeforeUpdate(instance, vnode, prevVNode);
updateInteropDirs(instance, state, vnode, prevVNode);
queuePostFlushCb(() => {
syncVNodeEl(vnode, instance);
if (state.pendingVNodeUpdate === vnode && !instance.isUpdating) state.pendingVNodeUpdate = null;
});
if (vnode.props && vnode.props.onVnodeUpdated || vnode.iu) queuePostRenderEffect(() => invokeInteropVNodeUpdated(instance, vnode, prevVNode), void 0, instance.suspense);
}
const vnodeHookStateMap = /* @__PURE__ */ new WeakMap();
function ensureVNodeHookState(instance, vnode) {
instance.interopVNode = vnode;
let state = vnodeHookStateMap.get(instance);
if (!state) {
state = {
vnode,
pendingVNodeUpdate: null,
dirsOwners: null,
dirsReceived: null
};
vnodeHookStateMap.set(instance, state);
(instance.bu || (instance.bu = [])).push(() => {
if (state.pendingVNodeUpdate) return;
invokeInteropVNodeBeforeUpdate(instance, state.vnode, state.vnode);
beforeInteropDirsSelfUpdate(instance, state, instance);
});
(instance.u || (instance.u = [])).unshift(() => {
syncInteropRoot(instance);
afterInteropDirsSelfUpdate(instance, state, instance);
});
instance.u.push(() => {
if (state.pendingVNodeUpdate) {
state.pendingVNodeUpdate = null;
return;
}
invokeInteropVNodeUpdated(instance, state.vnode, state.vnode);
});
} else state.vnode = vnode;
return state;
}
function createVNodeChildrenFragment(internals, render, parentComponent) {
let suspense = currentRenderContext.suspense || parentComponent && parentComponent.suspense;
const frag = createInteropFragment();
const content = new InteropContentState();
frag.isBlockValid = () => content.resolved ? content.valid : true;
let currentVNode = null;
let currentChildren = EMPTY_VNODES;
let currentParentNode = null;
let childrenNamespace;
let currentAnchor = null;
let isMounted = false;
let isRenderEffectStarted = false;
const scope = effectScope();
const cleanupInvalidContent = () => {
if (currentParentNode) removeAttachedNodes(frag.nodes, currentParentNode);
};
if (frag.slotBoundary) registerContentInvalid(frag.slotBoundary, cleanupInvalidContent, frag);
const syncResolvedNodes = (children = currentChildren) => {
const prevValid = content.resolved ? content.valid : true;
content.valid = !!ensureValidVNode(children);
if (children.length === 0) frag.nodes = EMPTY_BLOCK;
else if (children.length === 1) frag.nodes = resolveVNodeNodes(children[0]);
else frag.nodes = children.map(resolveVNodeNodes);
content.resolved = true;
return prevValid !== content.valid;
};
const syncResolvedNodesAndCleanup = (children = currentChildren) => {
const validityChanged = syncResolvedNodes(children);
if (!content.valid && frag.slotBoundary) {
cleanupInvalidContent();
currentVNode = null;
currentChildren = EMPTY_VNODES;
}
return validityChanged;
};
const notifyUpdated = (validityChanged = false) => {
if (validityChanged && frag.slotBoundary) frag.slotBoundary.markDirty();
if (isMounted && frag.u) frag.u.forEach((hook) => hook(frag.nodes));
};
const notifyBeforeUpdate = () => {
if (isMounted && frag.bu) frag.bu.forEach((hook) => hook());
};
const renderContent = () => {
const prev = currentInstance;
simpleSetCurrentInstance(parentComponent);
try {
renderEffect(() => {
withRenderContext(frag.ctx, () => {
const nextChildren = render();
notifyBeforeUpdate();
if (isHydrating$1) {
nextChildren.forEach((vnode) => hydrateVNode(vnode, parentComponent, frag.slotScopeIds, suspense));
currentChildren = nextChildren;
currentVNode = createVNode(Fragment, null, nextChildren);
currentParentNode = currentHydrationNode.parentNode;
childrenNamespace = getContainerType(currentParentNode);
currentAnchor = currentHydrationNode;
} else if (!isMounted) {
currentChildren = nextChildren;
currentVNode = createVNode(Fragment, null, nextChildren);
const wasResolved = content.resolved;
const validityChanged = syncResolvedNodes(nextChildren);
if (wasResolved) notifyUpdated(validityChanged);
return;
} else if (!currentVNode) {
currentChildren = nextChildren;
currentVNode = createVNode(Fragment, null, nextChildren);
trackSlotVNodeUpdatesWithRefresh(currentVNode, () => {
notifyUpdated(syncResolvedNodesAndCleanup(nextChildren));
}, notifyBeforeUpdate);
if (nextChildren.length) {
const prevInstance = currentInstance;
simpleSetCurrentInstance(null);
internals.mc(nextChildren, currentParentNode, currentAnchor, parentComponent, suspense, childrenNamespace, frag.slotScopeIds, false);
simpleSetCurrentInstance(prevInstance);
}
} else {
const nextVNode = createVNode(Fragment, null, nextChildren);
trackSlotVNodeUpdatesWithRefresh(nextVNode, () => {
notifyUpdated(syncResolvedNodesAndCleanup(nextChildren));
}, notifyBeforeUpdate);
const prevInstance = currentInstance;
simpleSetCurrentInstance(null);
internals.pc(currentVNode, nextVNode, currentParentNode, currentAnchor, parentComponent, suspense, childrenNamespace, frag.slotScopeIds, false);
simpleSetCurrentInstance(prevInstance);
currentChildren = nextChildren;
currentVNode = nextVNode;
}
const validityChanged = syncResolvedNodesAndCleanup();
if (isHydrating$1) {
if (isMounted && frag.u) frag.u.forEach((hook) => hook(frag.nodes));
} else notifyUpdated(validityChanged);
});
});
} finally {
simpleSetCurrentInstance(prev);
}
};
const startRenderEffect = () => {
if (isRenderEffectStarted) return;
isRenderEffectStarted = true;
scope.run(renderContent);
};
if (!isHydrating$1) startRenderEffect();
const place = (parentNode, anchor, parentSuspense, moveType = 2) => {
if (isHydrating$1) return;
if (parentSuspense !== void 0) suspense = parentSuspense;
currentParentNode = parentNode;
currentAnchor = anchor;
if (!isMounted) {
childrenNamespace = getContainerType(parentNode);
startRenderEffect();
if (currentVNode) trackSlotVNodeUpdatesWithRefresh(currentVNode, () => {
notifyUpdated(syncResolvedNodesAndCleanup(currentChildren));
}, notifyBeforeUpdate);
if (currentChildren.length) {
const prevInstance = currentInstance;
simpleSetCurrentInstance(null);
internals.mc(currentChildren, currentParentNode, currentAnchor, parentComponent, suspense, childrenNamespace, frag.slotScopeIds, false);
simpleSetCurrentInstance(prevInstance);
}
syncResolvedNodes();
isMounted = true;
} else if (!isHydratingSlotFallback) currentChildren.forEach((vnode) => {
internals.m(vnode, parentNode, anchor, moveType, parentComponent, suspense);
});
};
frag.insert = (parentNode, anchor, parentSuspense) => place(parentNode, anchor, parentSuspense);
frag.move = (parentNode, anchor, moveType, _parentComponent, parentSuspense) => place(parentNode, anchor, parentSuspense, moveType);
frag.remove = (parentNode) => {
scope.stop();
const parentSuspense = resolveUnmountSuspense(suspense);
currentChildren.forEach((vnode) => {
internals.um(vnode, parentComponent, parentSuspense, !!parentNode);
});
};
frag.hydrate = () => {
if (!isHydrating$1) return;
startRenderEffect();
isMounted = true;
};
return frag;
}
function isSameResolvedOutput(prev, next) {
return prev === next || isArray(prev) && isArray(next) && prev.length === next.length && prev.every((node, index) => node === next[index]);
}
function normalizeInteropSlots(rawSlots) {
if (rawSlots == null) return EMPTY_OBJ;
if (!isObject(rawSlots) || isArray(rawSlots) || isVNode(rawSlots)) return normalizeInteropDefaultSlot(rawSlots);
const normalized = createInternalObject();
for (const key in rawSlots) {
if (isInternalSlotKey(key)) continue;
const slot = rawSlots[key];
if (isFunction(slot)) normalized[key] = slot[rawVaporSlotKey] || slot._n ? slot : normalizeInteropSlot(slot, rawSlots._ctx);
else if (slot != null) normalized[key] = () => normalizeInteropSlotValue(slot);
}
[
"_",
"_ctx",
"$stable"
].forEach((key) => {
const descriptor = Object.getOwnPropertyDescriptor(rawSlots, key);
if (descriptor) Object.defineProperty(normalized, key, descriptor);
});
return normalized;
}
const interopSlotCache = /* @__PURE__ */ new WeakMap();
function normalizeInteropSlot(rawSlot, ctx) {
let cache = interopSlotCache.get(rawSlot);
if (!cache) interopSlotCache.set(rawSlot, cache = {});
if (ctx) {
let ctxCache = cache.ctx;
if (!ctxCache) cache.ctx = ctxCache = /* @__PURE__ */ new WeakMap();
const cached = ctxCache.get(ctx);
if (cached) return cached;
const normalized = createNormalizedInteropSlot(rawSlot, ctx);
ctxCache.set(ctx, normalized);
return normalized;
}
if (cache.noCtx) return cache.noCtx;
return cache.noCtx = createNormalizedInteropSlot(rawSlot, ctx);
}
function createNormalizedInteropSlot(rawSlot, ctx) {
const normalized = withCtx((...args) => normalizeInteropSlotValue(rawSlot(...args)), ctx);
normalized._c = false;
return normalized;
}
function normalizeInteropDefaultSlot(value) {
const normalized = createInternalObject();
const normalizedValue = normalizeInteropSlotValue(value);
normalized.default = () => normalizedValue;
return normalized;
}
function normalizeInteropSlotValue(value) {
return isArray(value) ? value.map((child) => normalizeVNode(child)) : [normalizeVNode(value)];
}
const isInternalSlotKey = (key) => key === "_" || key === "_ctx" || key === "$stable" || key === "$";
const interopSlotsSourceHandlers = {
get(target, key) {
const slots = target.value;
return slots && slots[key];
},
has(target, key) {
const slots = target.value;
return !!slots && key in slots;
},
ownKeys(target) {
const slots = target.value;
return slots ? Object.keys(slots).filter((key) => !isInternalSlotKey(key)) : EMPTY_ARR;
},
getOwnPropertyDescriptor(target, key) {
const slots = target.value;
const descriptor = slots && Object.getOwnPropertyDescriptor(slots, key);
if (descriptor && descriptor.enumerable && !isInternalSlotKey(key)) return {
enumerable: true,
configurable: true,
value: descriptor.value
};
}
};
function createInteropRawSlots(slotsRef) {
return {
$: [new Proxy(slotsRef, interopSlotsSourceHandlers)],
[interopSlotsKey]: slotsRef
};
}
const interopRootSyncFragmentMap = /* @__PURE__ */ new WeakMap();
function registerInteropRootSync(instance, frag) {
if (interopRootSyncFragmentMap.get(frag) === instance) return;
interopRootSyncFragmentMap.set(frag, instance);
(frag.u || (frag.u = [])).push(() => syncInteropRoot(instance));
}
const interopDirsProducers = /* @__PURE__ */ new WeakSet();
function registerInteropDirsFragment(instance, state, frag, inherit) {
registerInteropRootSync(instance, frag);
if (interopDirsProducers.has(frag)) return;
interopDirsProducers.add(frag);
let reactivated = null;
(frag.bu || (frag.bu = [])).push(() => {
if (inherit.el && inherit.el === getRootElement(frag.nodes)) unmountInteropDirsRoot(instance, inherit);
});
(frag.bm || (frag.bm = [])).push((nodes) => {
if (!inherit.vnode.dirs || !isOnInteropRootChain(inherit.comp, frag)) return;
const [owner, el] = resolveInteropDirsRoot(instance, state, nodes, inherit);
if (!el) return;
if (owner.el === el) {
if (!owner.pending) owner.pending = owner.carried;
reactivated = owner;
} else mountInteropDirsRoot(instance, owner, el);
});
(frag.u || (frag.u = [])).push(() => {
settleInteropDirsReceived(instance, state);
const owner = reactivated;
reactivated = null;
if (!owner || !owner.el || !owner.pending || isInteropDirsUpdating(state, owner)) return;
owner.updating = owner.comp;
owner.patching = owner;
invokeInteropDirsHook(instance, owner.el, owner.vnode, "beforeUpdate", owner.pending);
queueInteropDirsJob(instance, () => afterInteropDirsSelfUpdate(instance, state, owner.comp));
});
}
function registerInteropDirsComponent(instance, state, comp) {
if (comp === instance || interopDirsProducers.has(comp)) return;
interopDirsProducers.add(comp);
const pending = isPendingInteropSetup(comp);
registerAfterInteropSetup(comp, pending, () => {
(comp.bu || (comp.bu = [])).push(() => beforeInteropDirsSelfUpdate(instance, state, comp));
(comp.u || (comp.u = [])).unshift(() => afterInteropDirsSelfUpdate(instance, state, comp));
(comp.bum || (comp.bum = [])).push(() => unmountInteropDirs(instance, state, comp));
if (pending) (comp.bm || (comp.bm = [])).push(() => {
const owners = state.dirsOwners;
const owner = owners && owners.get(comp);
if (!owner || owner.el || !owner.vnode.dirs) return;
const [inner, el] = resolveInteropDirsRoot(instance, state, comp.block, owner);
if (el) mountInteropDirsRoot(instance, inner, el);
});
});
}
function isOnInteropRootChain(from, producer) {
let found = false;
getRootElement(from, {
excludeSlotOutlets: true,
onDynamicFragment: (frag) => frag === producer && (found = true),
onComponent: (comp) => comp === producer && (found = true)
});
return found;
}
/**
* Stores the vnode-derived root-only ids on the instance. Metadata only:
* mountComponent and dynamic branch renders apply them pre-insert to roots
* that mount afterwards; kept roots keep their mount-time ids (VDOM parity).
*/
function setInteropComponentScopeIds(instance, vnode) {
instance.scopeId = vnode.scopeId;
const inherited = getInheritedScopeIds(vnode, instance.parent);
instance.slotScopeIds = concatInteropScopeIds(vnode.slotScopeIds, inherited.length ? inherited : null);
}
function concatInteropScopeIds(base, own) {
return base ? own && own.length && own !== base ? base.concat(own) : base : own || null;
}
/**
* Publishes root-only ids onto the interop vnode backing a vapor component's
* effective root, for core to apply at its own pre-insertion mount. A nested
* component crossed during the descent re-collects canonically — its climb
* carries every ancestor's contribution — superseding the caller's subset.
*/
function publishVaporScopeIds(block, scopeIds) {
let currentScopeIds = scopeIds;
getRootElement(block, {
onComponent: (instance) => {
currentScopeIds = collectRootScopeIds(instance) || [];
},
onInteropFragment: (frag) => {
if (frag.vnode) {
setVNodeVaporScopeIds(frag.vnode, currentScopeIds);
return true;
}
},
excludeSlotOutlets: true
});
}
function setVNodeVaporScopeIds(vnode, scopeIds) {
vnode.vaporScopeIds = scopeIds;
if (vnode.ssContent) setVNodeVaporScopeIds(vnode.ssContent, scopeIds);
if (vnode.ssFallback) setVNodeVaporScopeIds(vnode.ssFallback, scopeIds);
}
function getInteropVaporSlotScopeIds(contextSlotScopeIds, own, inherited) {
return concatInteropScopeIds(concatInteropScopeIds(contextSlotScopeIds, own), inherited.length ? inherited : null);
}
function getEnclosingOutletScopeIds(context, innerIds, inherited) {
const kept = context && innerIds ? context.slice(0, -innerIds) : context;
return getInteropVaporSlotScopeIds(kept && kept.length ? kept : null, null, inherited);
}
function interopHasVDOMContent() {
return !!this.vnode;
}
function interopSetKey(key) {
if (this.vnode) this.vnode.key = key;
}
function interopGetTransitionType() {
return this.vnode ? getInteropTransitionType(this.vnode) : void 0;
}
function interopGetTransitionElement() {
return this.vnode ? getInteropTransitionElement(this.vnode) : void 0;
}
function createInteropFragment(nodes = EMPTY_BLOCK, vnode = null, extraFlags = 0) {
const frag = new RenderContextFragment(nodes, 64 | extraFlags);
frag.vnode = vnode;
frag.hasVDOMContent = interopHasVDOMContent;
frag.setKey = interopSetKey;
frag.getTransitionType = interopGetTransitionType;
frag.getTransitionElement = interopGetTransitionElement;
return frag;
}
//#endregion
//#region packages/runtime-vapor/src/components/Teleport.ts
const VaporTeleportImpl = {
name: "VaporTeleport",
__isTeleport: true,
__vapor: true,
process(props, slots, adoptAnchor) {
return new TeleportFragment(props, slots, adoptAnchor);
}
};
var TeleportFragment = class extends RenderContextFragment {
constructor(props, slots, adoptAnchor) {
super([], 32);
this.childrenInitialized = false;
this.childrenScope = getCurrentScope();
this.mountState = { location: 0 };
this.dispose = () => {
const scope = this.scope;
if (scope) {
this.scope = void 0;
scope.stop();
}
const mountState = this.mountState;
if (this.nodes && mountState.location === 1) {
remove(this.nodes, mountState.container);
this.nodes = [];
}
this.disposeTarget();
this.mountState = { location: 0 };
};
this.hydrate = () => {
if (!isHydrating$1) return;
const target = this.target = resolveTeleportTarget(this.resolvedProps, querySelector);
const disabled = isTeleportDisabled(this.resolvedProps);
this.placeholder = currentHydrationNode;
if (target) {
const targetNode = target._lpa || target.firstChild;
if (disabled) this.hydrateDisabledTeleport(target, targetNode);
else {
this.anchor = claimAnchor(locateTeleportEndAnchor(currentHydrationNode.nextSibling));
this.hydrateTargetAnchors(target, targetNode);
this.mountState = {
location: 2,
container: target,
anchor: this.targetAnchor || null
};
if (targetNode) setCurrentHydrationNode(targetNode.nextSibling);
if (!this.targetAnchor) this.mountChildren(target);
else this.initChildren();
}
} else if (disabled) this.hydrateDisabledTeleport(null, null);
else this.anchor = claimAnchor(locateTeleportEndAnchor(currentHydrationNode.nextSibling));
advanceHydrationNode(this.anchor);
};
this.rawSlots = slots;
this.anchor = isHydrating$1 ? void 0 : resolveFragmentAnchor(adoptAnchor, "teleport end");
const propsProxy = new Proxy(props, rawPropsProxyHandlers);
renderEffect(() => {
const prevTo = this.resolvedProps && this.resolvedProps.to;
const wasDisabled = this.isDisabled;
this.resolvedProps = extend$1({}, propsProxy);
this.isDisabled = isTeleportDisabled(this.resolvedProps);
if (wasDisabled !== this.isDisabled || !this.isDisabled && prevTo !== this.resolvedProps.to) this.handlePropsUpdate();
});
}
get parent() {
return this.anchor ? /* @__PURE__ */ parentNode(this.anchor) : null;
}
get scopeOwner() {
return this.ctx.slotOwner || this.renderInstance;
}
initChildren() {
const instance = this.renderInstance;
const prevInstance = setCurrentInstance(instance, this.childrenScope);
const prevUpdating = instance ? instance.isUpdating : false;
if (instance) instance.isUpdating = true;
try {
this.childrenInitialized = true;
renderEffect(() => withRenderContext(this.ctx, () => {
const prevScope = this.scope;
if (prevScope) prevScope.stop();
const scope = this.scope = new EffectScope$1();
this.handleChildrenUpdate(scope.run(() => this.rawSlots && this.rawSlots.default ? this.rawSlots.default() : []) || []);
}));
const owner = this.scopeOwner;
if (owner && owner.applyCssVars) registerCssVarOutlet(owner, this);
this.bindChildren(this.nodes);
} finally {
if (instance) instance.isUpdating = prevUpdating;
restoreCurrentInstance(prevInstance);
}
}
ensureChildrenInitialized() {
if (!this.childrenInitialized) this.initChildren();
}
bindChildren(block) {
const owner = this.scopeOwner;
if (owner && owner.applyCssVars) owner.applyCssVars(block);
}
handleChildrenUpdate(children) {
const mountState = this.mountState;
if (isHydrating$1 || !this.parent || mountState.location === 0) {
this.nodes = children;
return;
}
remove(this.nodes, mountState.container);
this.nodes = children;
this.bindChildren(children);
insert(children, mountState.container, mountState.anchor);
}
mount(parent, anchor, location) {
if (isTransitionEnabled && this.$transition && this.mountState.location === 0) applyTransitionHooks(this.nodes, this.$transition, this);
if (this.mountState.location !== 0) move(this.nodes, parent, anchor, 2);
else insert(this.nodes, parent, anchor);
this.mountState = {
location,
container: parent,
anchor
};
}
prepareTargetAnchors(target) {
if (!this.targetAnchor || /* @__PURE__ */ parentNode(this.targetAnchor) !== target) {
if (this.targetStart) remove(this.targetStart, /* @__PURE__ */ parentNode(this.targetStart));
if (this.targetAnchor) remove(this.targetAnchor, /* @__PURE__ */ parentNode(this.targetAnchor));
insert(this.targetStart = /* @__PURE__ */ createTextNode(""), target);
insert(this.targetAnchor = /* @__PURE__ */ createTextNode(""), target);
}
}
prepareTarget() {
const target = this.target = resolveTeleportTarget(this.resolvedProps, querySelector);
if (target) this.prepareTargetAnchors(target);
return target;
}
queueTargetUpdate() {
if (!this.mountToTargetJob || this.mountToTargetJob.flags & 4) this.mountToTargetJob = () => {
this.mountToTargetJob = void 0;
if (!this.anchor) return;
if (this.isDisabled) {
if (!this.targetAnchor) this.prepareTarget();
} else this.mountToTarget();
};
queuePostRenderEffect(this.mountToTargetJob, void 0, this.parentSuspense !== void 0 ? this.parentSuspense : isSuspenseEnabled && this.ctx.suspense || null);
}
mountToTarget() {
const target = this.prepareTarget();
if (target) {
this.ensureChildrenInitialized();
this.mount(target, this.targetAnchor, 2);
this.cancelMountToTarget();
} else if (!!(process.env.NODE_ENV !== "production")) warn(`Invalid Teleport target on ${this.targetAnchor ? "update" : "mount"}:`, target, `(${typeof target})`);
}
handlePropsUpdate() {
if (!this.parent || isHydrating$1) return;
if (this.isDisabled) {
this.ensureChildrenInitialized();
this.mount(this.parent, this.anchor, 1);
if (!this.targetAnchor) {
if (isTeleportDeferred(this.resolvedProps) || !this.parent.isConnected) this.queueTargetUpdate();
else this.prepareTarget();
}
} else if (isTeleportDeferred(this.resolvedProps) || !this.parent.isConnected) this.queueTargetUpdate();
else this.mountToTarget();
}
insert(container, anchor, parentSuspense) {
if (isHydrating$1) return;
if (parentSuspense !== void 0) this.parentSuspense = parentSuspense;
const wasMountedInTarget = this.mountState.location === 2;
if (!this.placeholder) this.placeholder = !!(process.env.NODE_ENV !== "production") ? /* @__PURE__ */ createComment("teleport start") : /* @__PURE__ */ createTextNode();
insert(this.placeholder, container, anchor);
insert(this.anchor, container, anchor);
if (!wasMountedInTarget) this.handlePropsUpdate();
}
move(container, anchor, _moveType, _parentComponent, parentSuspense) {
this.insert(container, anchor, parentSuspense);
}
cancelMountToTarget() {
if (this.mountToTargetJob) {
this.mountToTargetJob.flags |= 4;
this.mountToTargetJob = void 0;
}
}
disposeTarget() {
this.cancelMountToTarget();
const mountState = this.mountState;
if (this.nodes && mountState.location === 2) {
const targetParent = this.targetStart && /* @__PURE__ */ parentNode(this.targetStart) || this.targetAnchor && /* @__PURE__ */ parentNode(this.targetAnchor) || void 0;
remove(this.nodes, targetParent);
this.nodes = [];
this.mountState = { location: 0 };
}
if (this.targetStart) {
remove(this.targetStart, /* @__PURE__ */ parentNode(this.targetStart));
this.targetStart = void 0;
}
if (this.targetAnchor) {
remove(this.targetAnchor, /* @__PURE__ */ parentNode(this.targetAnchor));
this.targetAnchor = void 0;
}
this.target = void 0;
}
scheduleTargetDispose() {
this.cancelMountToTarget();
queuePostFlushCb(() => this.disposeTarget());
}
remove() {
this.dispose();
if (this.anchor) {
remove(this.anchor, /* @__PURE__ */ parentNode(this.anchor));
this.anchor = void 0;
}
if (this.placeholder) {
remove(this.placeholder, /* @__PURE__ */ parentNode(this.placeholder));
this.placeholder = void 0;
}
}
hydrateTargetAnchors(target, targetNode) {
if (!isHydrating$1) return;
let targetAnchor = targetNode;
while (targetAnchor) {
if (targetAnchor.nodeType === 8) {
if (targetAnchor.data === "teleport start anchor") this.targetStart = targetAnchor;
else if (targetAnchor.data === "teleport anchor") {
this.targetAnchor = claimAnchor(targetAnchor);
target._lpa = this.targetAnchor.nextSibling;
break;
}
}
targetAnchor = targetAnchor.nextSibling;
}
}
hydrateDisabledTeleport(target, targetNode) {
if (!isHydrating$1) return;
let nextNode = this.placeholder.nextSibling;
setCurrentHydrationNode(nextNode);
this.anchor = claimAnchor(locateTeleportEndAnchor(nextNode));
this.mountState = {
location: 1,
container: /* @__PURE__ */ parentNode(this.anchor),
anchor: this.anchor
};
if (target) this.hydrateTargetAnchors(target, targetNode);
else {
this.targetStart = targetNode;
this.targetAnchor = targetNode && targetNode.nextSibling;
}
this.initChildren();
}
mountChildren(target) {
if (!isHydrating$1) return;
target.appendChild(this.targetStart = /* @__PURE__ */ createTextNode(""));
target.appendChild(this.targetAnchor = claimAnchor(/* @__PURE__ */ createTextNode("")));
this.mountState = {
location: 2,
container: target,
anchor: this.targetAnchor
};
if (!isMismatchAllowed(target, 1)) {
if (!!(process.env.NODE_ENV !== "production") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) warn(`Hydration children mismatch on`, target, `\nServer rendered element contains fewer child nodes than client nodes.`);
logMismatchError();
}
runWithoutHydration(this.initChildren.bind(this));
}
};
const VaporTeleport = /*@__PURE__*/ enableTeleport(VaporTeleportImpl);
function locateTeleportEndAnchor(node = currentHydrationNode) {
let depth = 0;
while (node) {
if (isComment(node, "teleport start")) depth++;
else if (isComment(node, "teleport end")) {
if (depth === 0) return node;
else depth--;
}
node = node.nextSibling;
}
return null;
}
//#endregion
//#region packages/runtime-vapor/src/apiDefineCustomElement.ts
const vaporCustomElementHydrates = /* @__PURE__ */ new WeakMap();
/*@__NO_SIDE_EFFECTS__*/
function defineVaporCustomElement(options, extraOptions, _createApp, _hydrate) {
let Comp = /* @__PURE__ */ defineVaporComponent(options, extraOptions);
if (isPlainObject(Comp)) Comp = extend$1({}, Comp, extraOptions);
class VaporCustomElement extends VaporElement {
constructor(initialProps) {
super(Comp, initialProps, _createApp);
}
}
VaporCustomElement.def = Comp;
if (_hydrate) vaporCustomElementHydrates.set(VaporCustomElement, _hydrate);
return VaporCustomElement;
}
const defineVaporSSRCustomElement = ((options, extraOptions) => {
return /* @__PURE__ */ defineVaporCustomElement(options, extraOptions, createVaporSSRApp, withHydration);
});
var VaporElement = class extends VueElementBase {
constructor(def, props = {}, createAppFn = createVaporApp) {
super(def, shallowReactive$1(props), createAppFn);
}
_needsHydration() {
const hydrate = vaporCustomElementHydrates.get(this.constructor);
if (this.shadowRoot && hydrate) return true;
else if (!!(process.env.NODE_ENV !== "production") && this.shadowRoot) warn("Custom element has pre-rendered declarative shadow root but is not defined as hydratable. Use `defineVaporSSRCustomElement`.");
return false;
}
_mount(def) {
if ((!!(process.env.NODE_ENV !== "production") || __VUE_PROD_DEVTOOLS__) && !def.name) def.name = "VaporElement";
this._app = this._createApp(this._def);
this._inheritParentContext();
if (this._def.configureApp) this._def.configureApp(this._app);
const hydrate = vaporCustomElementHydrates.get(this.constructor);
if (this.shadowRoot && hydrate) hydrate(this._root, this._createComponent.bind(this));
else this._createComponent();
this._app.mount(this._root);
}
_update() {}
_unmount() {
if (this._app) this._app.unmount();
if (this._instance && this._instance.ce) this._instance.ce = void 0;
this._app = this._instance = null;
}
_createComponent() {
const ce = (instance) => {
this._app._ceComponent = this._instance = instance;
this._processInstance();
};
createComponent(this._def, { $: [() => this._props] }, this.shadowRoot ? void 0 : this._createSlots(), void 0, void 0, this._app._context, true, ce);
}
/**
* Only called when shadowRoot is false. The light DOM children parsed on
* connect become static slots, so `<slot/>` outlets render them in place
* through the normal slot pipeline instead of a native outlet that has to
* be replaced after mount.
*/
_createSlots() {
const parsed = this._slots;
if (!parsed) return;
const scopeId = this._def.__scopeId;
let slots;
for (const name in parsed) {
const nodes = parsed[name];
if (scopeId) {
const id = scopeId + "-s";
for (const n of nodes) if (n.nodeType === 1) {
n.setAttribute(id, "");
const walker = document.createTreeWalker(n, 1);
let child;
while (child = walker.nextNode()) child.setAttribute(id, "");
}
}
(slots || (slots = {}))[name] = () => nodes;
}
return slots;
}
};
//#endregion
//#region packages/runtime-vapor/src/dom/template.ts
function cloneTemplate(n) {
const scopeIds = currentRenderContext.slotScopeIds;
return scopeIds ? cloneStampedTemplate(n, scopeIds) : n.cloneNode(true);
}
/*@__NO_SIDE_EFFECTS__*/
function template(html, flags = 0, ns) {
const root = !!(flags & 1);
const isStatic = !!(flags & 2);
let node;
let adoptTarget;
let rootMeta;
const createRootMeta = () => {
let cls;
let sty;
let resolved = false;
const resolve = () => {
resolved = true;
if (html.includes(" class=") || html.includes(" style=")) {
const el = node || (node = parseTemplate(html, ns));
if (el.classList.length) cls = Array.from(el.classList);
const style = el.getAttribute("style");
if (style) sty = parseStringStyle(style);
}
};
return {
get cls() {
resolved || resolve();
return cls;
},
get sty() {
resolved || resolve();
return sty;
}
};
};
return () => {
let hydrationCursor = null;
if (insertionParent) {
if (isHydrating$1) hydrationCursor = enterHydrationCursor(void 0, (adoptTarget || (adoptTarget = parseAdoptTarget(html))).blank);
else resetInsertionState();
}
if (isHydrating$1) {
let adopted = null;
if (isStatic && !isComment(currentHydrationNode, "")) {
adopted = resolveHydrationTarget(currentHydrationNode);
if (html !== "") {
if (html[0] !== "<") {
if (!hydrateTextNode(adopted, html) && (!!(process.env.NODE_ENV !== "production") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__)) validateHydrationTarget(adopted, html);
} else if (!!(process.env.NODE_ENV !== "production") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) validateHydrationTarget(adopted, html);
}
if (!node && !html) node = adopted.cloneNode(true);
advanceHydrationNode(adopted);
} else adopted = adoptTemplate(currentHydrationNode, html, false, ns, adoptTarget || (adoptTarget = parseAdoptTarget(html)));
if (root) adopted.$root = rootMeta || (rootMeta = createRootMeta());
exitHydrationCursor(hydrationCursor);
return adopted;
}
if (!node && html[0] !== "<") return /* @__PURE__ */ createTextNode(html);
const ret = cloneTemplate(node || (node = parseTemplate(html, ns)));
if (root) ret.$root = rootMeta || (rootMeta = createRootMeta());
return ret;
};
}
//#endregion
//#region packages/runtime-vapor/src/apiCreateIf.ts
function createIf(condition, b1, b2, flags = 1) {
const _insertionParent = insertionParent;
const _insertionAnchor = insertionAnchor;
if (!isHydrating$1) resetInsertionState();
let hydrationCursor = null;
let branchShape;
let anchor;
let frag;
if (flags & 16) {
const ok = condition();
let claim;
if (isHydrating$1) {
branchShape = decodeIfShape(flags, ok);
claim = branchShape === 2 ? createFragmentClaim() : void 0;
hydrationCursor = enterHydrationCursor(claim);
}
frag = ok ? b1() : b2 ? b2() : [claimUntrackedAnchor(!!(process.env.NODE_ENV !== "production") ? /* @__PURE__ */ createComment("if") : /* @__PURE__ */ createTextNode())];
if (isHydrating$1 && claim && claim.start) advanceHydrationNode(locateEndAnchor(claim.start));
} else {
const index = flags >> 8;
const keyed = index > 0;
const keyBase = keyed ? (index - 1) * 2 : 0;
const trackSlotBoundary = !!(flags & 128);
const dynamicFragment = new DynamicFragment(256, !!(process.env.NODE_ENV !== "production") ? "if" : void 0, keyed, trackSlotBoundary, trackSlotBoundary ? () => {
const anchor = dynamicFragment.anchor;
const parent = anchor.parentNode;
if (parent) removeNode(anchor, parent);
} : void 0, _insertionAnchor);
anchor = dynamicFragment.anchor;
frag = dynamicFragment;
renderEffect(() => {
const ok = condition();
if (isHydrating$1) {
branchShape = decodeIfShape(flags, ok);
dynamicFragment.hydrationClaim = branchShape === 2 ? createFragmentClaim() : void 0;
hydrationCursor = enterHydrationCursor(dynamicFragment.hydrationClaim);
}
dynamicFragment.update(ok ? b1 : b2, keyed ? keyBase + (ok ? 0 : 1) : void 0, isNoScopeBranch(flags, ok));
});
}
if (isHydrating$1 && branchShape === 0 && hydrationCursor) {
const start = hydrationCursor.start;
if (start && currentHydrationNode === start && isComment(start, "")) advanceHydrationNode(start);
}
finishBlockCreation(frag, anchor, hydrationCursor, _insertionParent, _insertionAnchor);
return frag;
}
function decodeIfShape(shape, ok) {
return shape >> (ok ? 0 : 2) & 3;
}
function isNoScopeBranch(flags, ok) {
return !!(flags & (ok ? 32 : 64));
}
//#endregion
//#region packages/runtime-vapor/src/apiCreateFragment.ts
/**
* Create a dynamic fragment keyed by a reactive value for Vapor transitions.
* The fragment is re-rendered when the key changes to trigger enter/leave
* animations.
*
* Example:
* <VaporTransition>
* <h1 :key="count">{{ count }}</h1>
* </VaporTransition>
*/
function createKeyedFragment(key, render, trackSlotBoundary = false) {
const _insertionParent = insertionParent;
const _insertionAnchor = insertionAnchor;
if (!isHydrating$1) resetInsertionState();
const hydrationCursor = isHydrating$1 ? captureHydrationCursor() : null;
const frag = new DynamicFragment(0, !!(process.env.NODE_ENV !== "production") ? "keyed" : void 0, true, trackSlotBoundary, trackSlotBoundary ? () => {
const parent = frag.anchor.parentNode;
if (parent) removeNode(frag.anchor, parent);
} : void 0, _insertionAnchor);
if (isHydrating$1) locateHydrationNode();
renderEffect(() => frag.update(render, key()));
finishBlockCreation(frag, frag.anchor, hydrationCursor, _insertionParent, _insertionAnchor);
return frag;
}
//#endregion
//#region packages/runtime-vapor/src/apiCreateFor.ts
const createFor = (src, renderItem, getKey, flags = 0) => {
const _insertionParent = insertionParent;
const _insertionAnchor = insertionAnchor;
const _insertionIndex = insertionIndex;
let hydrationCursor = null;
let hydrationClaim;
if (isHydrating$1) {
hydrationClaim = createFragmentClaim();
hydrationCursor = enterHydrationCursor(hydrationClaim);
} else resetInsertionState();
let isMounted = false;
let oldBlocks = [];
let newBlocks;
let newKeys;
let parent;
let parentAnchor;
if (!isHydrating$1) {
parentAnchor = resolveFragmentAnchor(_insertionAnchor, "for");
if (parentAnchor === _insertionAnchor) parent = parentAnchor.parentNode;
}
const trackSlotBoundary = !!(flags & 32);
const frag = new ForFragment(oldBlocks, trackSlotBoundary, trackSlotBoundary ? () => {
const parent = parentAnchor.parentNode;
if (parent) removeNode(parentAnchor, parent);
} : void 0);
const instance = currentInstance$1;
const isComponent = !!(flags & 2);
const canUseFastRemove = !!(flags & 1) && !isComponent;
const isSingleNode = !!(flags & 8);
const isFragment = !!(flags & 16);
const wrappedRows = !!(flags & 64);
const ctx = currentRenderContext;
if (!!(process.env.NODE_ENV !== "production") && !instance) warn("createFor() can only be used inside setup()");
onScopeDispose$1(() => {
stopBlockScopes(oldBlocks);
if (newBlocks && newBlocks !== oldBlocks) stopBlockScopes(newBlocks);
oldBlocks = [];
newBlocks = [];
}, true);
const renderList = () => {
const source = normalizeSource(src());
const sourceKeys = source.keys;
const newLength = source.values.length;
const oldLength = oldBlocks.length;
newBlocks = new Array(newLength);
newKeys = void 0;
if (getKey) {
newKeys = new Array(newLength);
for (let i = 0; i < newLength; i++) {
const value = getItemValue(source, i);
newKeys[i] = sourceKeys ? getKey(value, sourceKeys[i], i) : getKey(value, i, void 0);
}
}
const prevSub = setActiveSub();
const wasMounted = isMounted;
if (wasMounted && frag.bu) for (let i = 0; i < frag.bu.length; i++) frag.bu[i]();
if (!wasMounted) {
isMounted = true;
if (isHydrating$1) hydrateList(source, newLength);
else mountAll(source, newLength);
} else {
parent = parentAnchor.parentNode;
if (!oldLength) mountAll(source, newLength);
else if (!newLength) {
if (frag.resetListeners) for (const fn of frag.resetListeners) fn();
const doRemove = !canUseFastRemove;
for (let i = 0; i < oldLength; i++) unmount(oldBlocks[i], doRemove);
if (canUseFastRemove) {
parent.textContent = "";
parent.appendChild(parentAnchor);
}
} else if (!getKey) {
const commonLength = Math.min(newLength, oldLength);
for (let i = 0; i < commonLength; i++) updateAt(newBlocks[i] = oldBlocks[i], source, i);
for (let i = oldLength; i < newLength; i++) mount(source, i, parentAnchor);
for (let i = newLength; i < oldLength; i++) unmount(oldBlocks[i]);
} else {
if (!!(process.env.NODE_ENV !== "production")) {
const keyToIndexMap = /* @__PURE__ */ new Map();
for (let i = 0; i < newLength; i++) {
const key = newKeys[i];
if (key != null) {
if (keyToIndexMap.has(key)) warn(`Duplicate keys found during update:`, JSON.stringify(key), `Make sure keys are unique.`);
keyToIndexMap.set(key, i);
}
}
}
const commonLength = Math.min(oldLength, newLength);
let endOffset = 0;
while (endOffset < commonLength) {
const index = newLength - endOffset - 1;
const key = newKeys[index];
const existingBlock = oldBlocks[oldLength - endOffset - 1];
if (existingBlock.key !== key) break;
updateAt(existingBlock, source, index);
newBlocks[index] = existingBlock;
endOffset++;
}
const e1 = commonLength - endOffset;
const e2 = oldLength - endOffset;
const e3 = newLength - endOffset;
const queuedIndices = [];
const oldKeyIndexMap = /* @__PURE__ */ new Map();
for (let i = 0; i < e1; i++) {
const currentKey = newKeys[i];
const oldBlock = oldBlocks[i];
if (oldBlock.key === currentKey) updateAt(newBlocks[i] = oldBlock, source, i);
else {
queuedIndices.push(i);
oldKeyIndexMap.set(oldBlock.key, i);
}
}
for (let i = e1; i < e2; i++) oldKeyIndexMap.set(oldBlocks[i].key, i);
for (let i = e1; i < e3; i++) queuedIndices.push(i);
let queuedLength = queuedIndices.length;
let sources = EMPTY_ARR;
let mountCounter = 0;
let pureInsert = false;
if (oldKeyIndexMap.size === 0) {
mountCounter = queuedLength;
pureInsert = true;
} else {
sources = new Array(queuedLength);
for (let q = queuedLength - 1; q >= 0; q--) {
const index = queuedIndices[q];
const key = newKeys[index];
const oldIndex = oldKeyIndexMap.get(key);
if (oldIndex !== void 0) {
oldKeyIndexMap.delete(key);
const reusedBlock = newBlocks[index] = oldBlocks[oldIndex];
updateAt(reusedBlock, source, index);
sources[q] = oldIndex + 1;
} else {
sources[q] = 0;
mountCounter++;
}
}
}
const useFastRemove = mountCounter === newLength;
if (useFastRemove && frag.resetListeners) for (const fn of frag.resetListeners) fn();
if (oldKeyIndexMap.size) for (const leftoverIndex of oldKeyIndexMap.values()) unmount(oldBlocks[leftoverIndex], !(useFastRemove && canUseFastRemove));
if (useFastRemove && canUseFastRemove) {
parent.textContent = "";
parent.appendChild(parentAnchor);
}
let sequence;
const hasReuse = mountCounter !== queuedLength;
if (hasReuse) {
sequence = planMoves(queuedIndices, sources, e2, e3);
queuedLength = queuedIndices.length;
}
const allKept = hasReuse && sequence === void 0;
let sequenceEnd = sequence ? sequence.length - 1 : -1;
let scanFrom = newLength;
let cachedAnchor;
for (let q = queuedLength - 1; q >= 0; q--) {
const index = queuedIndices[q];
let isKept = allKept && sources[q] !== 0;
if (sequenceEnd >= 0 && sequence[sequenceEnd] === q) {
sequenceEnd--;
isKept = sources[q] !== 0;
}
if (isKept) continue;
let anchorNode;
for (let i = index + 1; i < scanFrom; i++) {
const node = getBlockFirstNode(newBlocks[i].nodes);
if (node && node.parentNode === parent) {
anchorNode = node;
break;
}
}
if (anchorNode === void 0) {
if (cachedAnchor === void 0) cachedAnchor = parentAnchor;
anchorNode = cachedAnchor;
}
scanFrom = index + 1;
cachedAnchor = anchorNode;
if (pureInsert) {
for (let i = 0; i < queuedLength; i++) mount(source, queuedIndices[i], anchorNode);
break;
}
const block = newBlocks[index];
if (block !== void 0) move(block.nodes, parent, anchorNode, 2);
else mount(source, index, anchorNode);
}
}
}
oldBlocks = newBlocks;
frag.nodes = parentAnchor ? [newBlocks, parentAnchor] : [newBlocks];
if (wasMounted && frag.u) for (const fn of frag.u) fn(frag.nodes);
setActiveSub(prevSub);
};
const needKey = renderItem.length > 1;
const needIndex = renderItem.length > 2;
const insertForBlock = isSingleNode ? (block, anchor) => insertNode(block.nodes, parent, anchor) : isFragment ? (block, anchor) => insertFragment(block.nodes, parent, anchor) : (block, anchor) => insert(block.nodes, parent, anchor);
const removeForBlock = isSingleNode ? (block) => removeNode(block.nodes, parent) : isFragment ? (block) => removeFragment(block.nodes, parent) : (block) => remove(block.nodes, parent);
const mount = (source, idx, anchor) => {
const keys = source.keys;
const itemRef = shallowRef$1(getItemValue(source, idx));
const keyRef = needKey ? shallowRef$1(keys ? keys[idx] : idx) : void 0;
const indexRef = needIndex ? shallowRef$1(keys ? idx : void 0) : void 0;
let nodes;
const scope = new EffectScope$1(true);
const prevScope = setCurrentScope(scope);
let ok = false;
try {
nodes = renderItem(itemRef, keyRef, indexRef);
ok = true;
} finally {
setCurrentScope(prevScope);
if (!ok) scope.stop();
}
const block = newBlocks[idx] = new ForBlock(nodes, scope, itemRef, keyRef, indexRef, newKeys ? newKeys[idx] : void 0);
if (isTransitionEnabled && frag.$transition) {
const hooks = frag.$transition;
if (hooks.applyGroup) hooks.applyGroup(block, hooks.props, hooks.state, hooks.instance);
else applyTransitionHooks(block.nodes, hooks);
}
const bm = frag.bm;
if (bm) for (let i = 0; i < bm.length; i++) bm[i](block.nodes);
if (parent) insertForBlock(block, anchor);
return block;
};
const mountAll = (source, newLength) => {
for (let i = 0; i < newLength; i++) mount(source, i, parentAnchor);
};
const updateAt = (block, source, idx) => {
const keys = source.keys;
update(block, getItemValue(source, idx), keys ? keys[idx] : idx, keys ? idx : void 0);
};
function hydrateList(source, newLength) {
const claim = hydrationClaim;
let exitHydrationBoundary;
const reuseBoundaryClose = (close) => {
parentAnchor = claimAnchor(close);
exitHydrationBoundary = enterHydrationBoundary(parentAnchor);
};
try {
for (let i = 0; i < newLength; i++) {
const node = currentHydrationNode;
let nextNode = null;
if (isComment(node, "]")) nextNode = claimAnchor(node);
else if (wrappedRows && isComment(node, "[")) {
nextNode = nextLogicalSibling(node);
setCurrentHydrationNode(node.nextSibling);
}
mount(source, i, parentAnchor);
if (nextNode) setCurrentHydrationNode(nextNode);
}
if (claim.start) {
reuseBoundaryClose(locateClaimedEnd(claim.start));
if (_insertionParent) {
const idx = _insertionAnchor ? _insertionParent.$llc === _insertionAnchor ? _insertionParent.$lli : void 0 : _insertionIndex || 0;
if (idx !== void 0) setLastLocatedLogicalChild(_insertionParent, parentAnchor, idx);
}
} else {
const close = currentHydrationNode;
if (!!(process.env.NODE_ENV !== "production") && !isComment(close, "]")) throw new Error(`v-for fragment anchor node was not found. this is likely a Vue internal bug.`);
reuseBoundaryClose(close);
}
} finally {
exitHydrationBoundary && exitHydrationBoundary();
}
}
const update = ({ itemRef, keyRef, indexRef }, newItem, newKey, newIndex) => {
if (newItem !== itemRef.value) itemRef.value = newItem;
if (keyRef && newKey !== void 0 && newKey !== keyRef.value) keyRef.value = newKey;
if (indexRef && newIndex !== indexRef.value) indexRef.value = newIndex;
};
const unmount = (block, doRemove = true) => {
if (!isComponent) block.scope.stop();
if (doRemove) removeForBlock(block);
else if (isInteropEnabled) unmountVDOM(block);
if (isComponent) block.scope.stop();
};
if (flags & 4) renderList();
else renderEffect(() => {
if (!isMounted) return renderList();
withRenderContext(ctx, renderList);
});
if (isHydrating$1 && currentHydrationNode === parentAnchor) advanceHydrationNode(parentAnchor);
finishBlockCreation(frag, parentAnchor, hydrationCursor, _insertionParent, _insertionAnchor);
return frag;
};
/**
* Builds a key-indexed selector that activates only the opers registered with
* the key matching the current source value. Compared to letting each item
* subscribe directly, this keeps re-renders on source change O(2) instead of
* O(N) (only previous and new active item re-run).
*
* Selector cleanup follows the current scope. Per-item teardown is auto-wired
* via `onScopeDispose` so callers (typically v-for item scopes) don't need
* explicit deregistration. For bulk-reset hot paths, attach the selector to
* the v-for via `frag.onReset(selector.reset)` to skip the per-item Map ops.
*/
function createSelector(source) {
const operMap = /* @__PURE__ */ new Map();
let activeKey = source();
let activeOpers;
let pendingKey = activeKey;
let pending = false;
let generation = 0;
watch$1(source, (newValue) => {
pendingKey = newValue;
if (pending) return;
pending = true;
if (activeOpers !== void 0) for (const oper of activeOpers) oper();
queuePostFlushCb(() => {
pending = false;
activeKey = pendingKey;
activeOpers = operMap.get(activeKey);
if (activeOpers !== void 0) for (const oper of activeOpers) oper();
});
});
const register = (key, oper) => {
oper();
let opers = operMap.get(key);
if (opers !== void 0) opers.push(oper);
else {
opers = [oper];
operMap.set(key, opers);
if (key === activeKey) activeOpers = opers;
}
const myGen = generation;
onScopeDispose$1(() => {
if (myGen !== generation) return;
const list = operMap.get(key);
if (list === void 0) return;
if (list.length === 1) {
operMap.delete(key);
if (key === activeKey) activeOpers = void 0;
} else {
const idx = list.indexOf(oper);
if (idx !== -1) list.splice(idx, 1);
}
}, true);
};
register.reset = () => {
operMap.clear();
activeOpers = void 0;
generation++;
};
return register;
}
/**
* Decides which reused blocks may stay where they are: the longest increasing
* subsequence of their old indices is already in relative order, so only the
* blocks outside it need a DOM move. Returns that subsequence as indices into
* `sources`, or `undefined` when no reused block has to move at all.
*
* Two planners, picked by how dense the change is across the range it touches:
*
* - dense (the queued indices cover at least half of the range they span):
* pull the in-place matches in that range into the plan too and run an
* unbounded LIS, which is move-count minimal like vdom's. The range is at
* most `2 * queuedIndices.length` wide here, so this stays O(queued).
* - sparse (a couple of rows moved across an otherwise untouched list, e.g. a
* far swap): keep the in-place matches pinned, which costs nothing but
* bounds each segment's LIS by its stationary neighbours. Not minimal in
* general, but it never walks the untouched majority.
*
* Both arrays are expanded in place on the dense path.
*/
function planMoves(queuedIndices, sources, e2, e3) {
let queuedLength = queuedIndices.length;
const denseLength = e3 - queuedIndices[0];
const isDense = queuedLength * 2 >= denseLength;
let moved = false;
let maxSource = 0;
if (isDense) {
let read = queuedLength - 1;
queuedIndices.length = sources.length = denseLength;
for (let write = denseLength - 1, index = e3 - 1; write >= 0; write--, index--) {
if (read >= 0 && queuedIndices[read] === index) sources[write] = sources[read--];
else sources[write] = index + 1;
queuedIndices[write] = index;
}
queuedLength = denseLength;
for (let q = 0; q < queuedLength; q++) {
const value = sources[q];
if (value !== 0) {
if (value < maxSource) moved = true;
else maxSource = value;
}
}
} else {
let seg = 0;
while (seg < queuedLength) {
let segEnd = seg;
while (segEnd + 1 < queuedLength && queuedIndices[segEnd + 1] === queuedIndices[segEnd] + 1) segEnd++;
const lowerBound = queuedIndices[seg] - 1;
const nextIndex = queuedIndices[segEnd] + 1;
const upperBound = nextIndex < e3 ? nextIndex : e2;
for (let q = seg; q <= segEnd; q++) {
const value = sources[q];
const oldIndex = value - 1;
if (oldIndex <= lowerBound || oldIndex >= upperBound) sources[q] = 0;
else if (value < maxSource) moved = true;
else maxSource = value;
}
seg = segEnd + 1;
}
}
return moved ? getSequence(sources) : void 0;
}
function stopBlockScopes(blocks) {
for (let i = 0; i < blocks.length; i++) {
const block = blocks[i];
if (block) {
const scope = block.scope;
if (scope) scope.stop();
}
}
}
function isSameMapKey(a, b) {
return Object.is(a, b) || a === 0 && b === 0;
}
function createForSlots(rawSource, renderSlot, getName, getKey) {
let oldRecords = [];
const needKey = renderSlot.length > 1;
const needIndex = renderSlot.length > 2;
const update = (record, [item, key, index]) => {
if (!Object.is(record.itemRef.value, item)) record.itemRef.value = item;
if (record.keyRef && !Object.is(record.keyRef.value, key)) record.keyRef.value = key;
if (record.indexRef && !Object.is(record.indexRef.value, index)) record.indexRef.value = index;
};
return () => {
const source = normalizeSource(rawSource());
const sourceLength = source.values.length;
const names = new Array(sourceLength);
const identities = getKey ? new Array(sourceLength) : names;
const items = new Array(sourceLength);
let sameResolution = sourceLength === oldRecords.length;
for (let i = 0; i < sourceLength; i++) {
const item = items[i] = getItem(source, i);
const name = names[i] = String(getName(...item));
const identity = identities[i] = getKey ? getKey(...item) : name;
if (sameResolution && (!isSameMapKey(oldRecords[i].rawIdentity, identity) || oldRecords[i].name !== name)) sameResolution = false;
}
if (sameResolution) {
const prevSub = setActiveSub();
for (let i = sourceLength - 1; i >= 0; i--) update(oldRecords[i], items[i]);
setActiveSub(prevSub);
return oldRecords;
}
const oldByIdentity = /* @__PURE__ */ new Map();
for (let i = 0; i < oldRecords.length; i++) oldByIdentity.set(oldRecords[i].rawIdentity, oldRecords[i]);
const records = new Array(sourceLength);
const prevSub = setActiveSub();
for (let i = sourceLength - 1; i >= 0; i--) {
const slotItem = items[i];
const rawIdentity = identities[i];
let record = oldByIdentity.get(rawIdentity);
if (record) {
oldByIdentity.delete(rawIdentity);
update(record, slotItem);
record.name = names[i];
} else {
const [item, key, index] = slotItem;
const itemRef = shallowRef$1(item);
const keyRef = needKey ? shallowRef$1(key) : void 0;
const indexRef = needIndex ? shallowRef$1(index) : void 0;
record = {
rawIdentity,
itemRef,
keyRef,
indexRef,
name: names[i],
fn: renderSlot(itemRef, keyRef, indexRef),
key: itemRef
};
}
records[i] = record;
}
setActiveSub(prevSub);
oldRecords = records;
return records;
};
}
function normalizeSource(source) {
let values = source;
let needsWrap = false;
let isReadonlySource = false;
let keys;
if (isArray(source)) {
if (isReactive(source)) {
needsWrap = !isShallow(source);
values = shallowReadArray(source);
isReadonlySource = isReadonly(source);
}
} else if (isString(source)) values = source.split("");
else if (typeof source === "number") {
if (!!(process.env.NODE_ENV !== "production") && (!Number.isInteger(source) || source < 0)) {
warn(`The v-for range expects a positive integer value but got ${source}.`);
values = [];
} else {
values = new Array(source);
for (let i = 0; i < source; i++) values[i] = i + 1;
}
} else if (isObject(source)) {
if (source[Symbol.iterator]) values = Array.from(source);
else {
keys = Object.keys(source);
values = new Array(keys.length);
for (let i = 0, l = keys.length; i < l; i++) values[i] = source[keys[i]];
}
} else values = [];
return {
values,
needsWrap,
isReadonlySource,
keys
};
}
function getItemValue({ values, needsWrap, isReadonlySource }, idx) {
return needsWrap ? isReadonlySource ? toReadonly(toReactive(values[idx])) : toReactive(values[idx]) : values[idx];
}
function getItem(source, idx) {
const value = getItemValue(source, idx);
if (source.keys) return [
value,
source.keys[idx],
idx
];
else return [
value,
idx,
void 0
];
}
function getRestElement(val, keys) {
const res = {};
for (const key of Object.keys(val)) if (!keys.includes(key)) res[key] = val[key];
return res;
}
function getDefaultValue(val, getDefaultVal) {
return val === void 0 ? getDefaultVal() : val;
}
//#endregion
//#region packages/runtime-vapor/src/apiTemplateRef.ts
function getTemplateRefUpdateFragment(el) {
if (isDynamicFragment(el)) return el;
if (isAsyncComponentEnabled && isVaporComponent(el) && isAsyncWrapper(el)) return el.block;
}
/**
* Async/dynamic component targets swap their inner block on update, so the ref
* has to be re-applied after the fragment settles. Registration is idempotent
* per (el, owner) pair: `getTemplateRefUpdateFragment` reads the async
* wrapper's mutable `block`, so the resolved fragment is compared by identity
* rather than with a "registered once" flag.
*/
function registerFragmentRefUpdate(el, registeredFrag, reapply) {
const frag = getTemplateRefUpdateFragment(el);
if (frag && registeredFrag !== frag) {
if (isDynamicFragment(el)) {
let nestedFrag;
const onAsyncUpdate = () => {
const inner = frag.nodes;
if (isVaporComponent(inner) && inner.block === nestedFrag && !inner.isDeactivated && !inner.isUnmounted) reapply();
};
const onUpdate = () => {
nestedFrag = syncNestedAsyncRefUpdate(frag, nestedFrag, onAsyncUpdate);
reapply();
};
(frag.u || (frag.u = [])).push(onUpdate);
onScopeDispose$1(() => {
remove$1(frag.u, onUpdate);
if (nestedFrag) {
remove$1(nestedFrag.u, onAsyncUpdate);
nestedFrag = void 0;
}
});
nestedFrag = syncNestedAsyncRefUpdate(frag, void 0, onAsyncUpdate);
} else (frag.u || (frag.u = [])).push(() => {
if (isVaporComponent(el) && el.isDeactivated) return;
reapply();
});
return frag;
}
return registeredFrag;
}
function syncNestedAsyncRefUpdate(frag, registeredFrag, onUpdate) {
const inner = frag.nodes;
const next = isAsyncComponentEnabled && isVaporComponent(inner) && isAsyncWrapper(inner) && isDynamicFragment(inner.block) ? inner.block : void 0;
if (next !== registeredFrag) {
if (registeredFrag) remove$1(registeredFrag.u, onUpdate);
if (next) (next.u || (next.u = [])).push(onUpdate);
}
return next;
}
function ensureCleanup(el) {
let cleanupRef = refCleanups.get(el);
if (!cleanupRef) {
refCleanups.set(el, cleanupRef = { fn: NOOP });
onScopeDispose$1(() => {
invalidatePendingRef(el);
cleanupRef.fn();
refCleanups.delete(el);
});
}
return cleanupRef;
}
function createTemplateRefSetter() {
const instance = getScopeOwner();
const stateMap = /* @__PURE__ */ new WeakMap();
return (el, ref, refFor, refKey) => {
let state = stateMap.get(el);
if (!state) stateMap.set(el, state = {
ref,
suspense: currentRenderContext.suspense
});
setTemplateRefWithState(instance, el, state, ref, refFor, refKey);
};
}
function setTemplateRefWithState(instance, el, state, ref, refFor, refKey) {
state.ref = ref;
state.refFor = refFor;
state.refKey = refKey;
state.registeredFrag = registerFragmentRefUpdate(el, state.registeredFrag, () => {
setRef$1(instance, state.suspense, el, state.ref, state.oldRef, state.refFor, state.refKey, state.oldRefKey);
state.oldRef = state.ref;
state.oldRefKey = state.ref != null ? state.refKey : void 0;
});
setRef$1(instance, state.suspense, el, ref, state.oldRef, refFor, refKey, state.oldRefKey);
state.oldRef = ref;
state.oldRefKey = ref != null ? refKey : void 0;
}
/**
* Static refs never change value, so they need no old-ref tracking and no
* per-element state - only the fragment re-apply hook shared with the
* stateful path.
*/
function setStaticTemplateRef(el, ref, refFor, refKey) {
const instance = getScopeOwner();
const suspense = currentRenderContext.suspense;
setRef$1(instance, suspense, el, ref, void 0, refFor, refKey);
registerFragmentRefUpdate(el, void 0, () => {
setRef$1(instance, suspense, el, ref, ref, refFor, refKey);
});
}
function setTemplateRefBinding(el, getter, refFor, refKey) {
const instance = getScopeOwner();
let state;
renderEffect(() => {
const ref = getter();
if (!state) state = {
ref,
suspense: currentRenderContext.suspense
};
setTemplateRefWithState(instance, el, state, ref, refFor, refKey);
});
}
/**
* Function for handling a template ref
*/
function setRef$1(instance, suspense, el, ref, oldRef, refFor = false, refKey, oldRefKey) {
if (!instance || instance.isUnmounted) return;
const setupState = !!(process.env.NODE_ENV !== "production") ? instance.setupState || {} : null;
const refValue = getRefValue(el);
if (isInteropEnabled) {
const target = isFragment(el) && el.setRef ? el : refValue && isFragment(refValue) && refValue.setRef ? refValue : null;
if (target) {
target.setRef(instance, ref, refFor, refKey);
return;
}
}
const refs = instance.refs === EMPTY_OBJ ? instance.refs = {} : instance.refs;
const canSetSetupRef = !!(process.env.NODE_ENV !== "production") ? createCanSetSetupRefChecker(setupState, refs) : NO;
const canSetRef = (ref, key) => {
if (!!(process.env.NODE_ENV !== "production") && knownTemplateRefs.has(ref)) return false;
if (key && isTemplateRefKey(refs, key)) return false;
return true;
};
if (oldRef != null && oldRef !== ref) {
invalidatePendingRef(el);
if (isString(oldRef)) {
refs[oldRef] = null;
if (!!(process.env.NODE_ENV !== "production") && canSetSetupRef(oldRef)) setupState[oldRef] = null;
} else if (isRef(oldRef)) {
if (canSetRef(oldRef, oldRefKey)) oldRef.value = null;
if (oldRefKey) refs[oldRefKey] = null;
} else if (isFunction(oldRef) && isDynamicFragment(el)) callWithErrorHandling(oldRef, instance, 12, [null, refs]);
} else if (oldRef != null && isDynamicFragment(el)) {
if (isFunction(oldRef)) callWithErrorHandling(oldRef, instance, 12, [null, refs]);
else if (refFor) unsetRef(el);
}
if (ref == null) return;
if (isFunction(ref)) {
const invokeRefSetter = (value) => {
callWithErrorHandling(ref, instance, 12, [value, refs]);
};
invokeRefSetter(refValue);
ensureCleanup(el).fn = () => invokeRefSetter(null);
} else {
const _isString = isString(ref);
const _isRef = isRef(ref);
let existing;
if (_isString || _isRef) {
const doSet = () => {
if (refFor) {
if (refValue == null) return;
existing = _isString ? !!(process.env.NODE_ENV !== "production") && canSetSetupRef(ref) ? setupState[ref] : refs[ref] : canSetRef(ref) || !refKey ? ref.value : refs[refKey];
if (!isArray(existing)) {
existing = [refValue];
if (_isString) {
refs[ref] = existing;
if (!!(process.env.NODE_ENV !== "production") && canSetSetupRef(ref)) {
setupState[ref] = refs[ref];
existing = setupState[ref];
}
} else {
if (canSetRef(ref, refKey)) ref.value = existing;
if (refKey) refs[refKey] = existing;
}
} else if (!existing.includes(refValue)) existing.push(refValue);
} else if (_isString) {
refs[ref] = refValue;
if (!!(process.env.NODE_ENV !== "production") && canSetSetupRef(ref)) setupState[ref] = refValue;
} else if (_isRef) {
if (canSetRef(ref, refKey)) ref.value = refValue;
if (refKey) refs[refKey] = refValue;
} else if (!!(process.env.NODE_ENV !== "production")) warn("Invalid template ref type:", ref, `(${typeof ref})`);
};
const cleanup = ensureCleanup(el);
cleanup.fn = () => {
if (refFor) {
if (isArray(existing)) remove$1(existing, refValue);
} else if (_isString) {
refs[ref] = null;
if (!!(process.env.NODE_ENV !== "production") && canSetSetupRef(ref)) setupState[ref] = null;
} else if (_isRef) {
if (canSetRef(ref, refKey)) ref.value = null;
if (refKey) refs[refKey] = null;
}
};
invalidatePendingRef(el);
if (refValue != null) {
const job = () => {
doSet();
if (cleanup.job === job) cleanup.job = void 0;
};
cleanup.job = job;
queuePostRenderEffect(job, -1, suspense);
} else doSet();
} else if (!!(process.env.NODE_ENV !== "production")) warn("Invalid template ref type:", ref, `(${typeof ref})`);
}
}
const getRefValue = (el) => {
if (isVaporComponent(el)) {
if (isAsyncComponentEnabled && isAsyncWrapper(el)) {
const inner = getAsyncWrapperInner(el);
if (inner === void 0) return null;
return getRefValue(inner);
}
return getExposed(el) || el;
} else if (isTeleportEnabled && isTeleportFragment(el)) return null;
else if (isDynamicFragment(el)) {
if (isArray(el.nodes)) return null;
return getRefValue(el.nodes);
}
return el;
};
//#endregion
//#region packages/runtime-vapor/src/apiCreateDynamicComponent.ts
function createDynamicComponent(getter, rawProps, rawSlots, flags = 0, key) {
const isSingleRoot = !!(flags & 1);
const once = !!(flags & 2);
const slotRoot = !!(flags & 4);
const ns = flags & 8 ? 1 : flags & 16 ? 2 : void 0;
const _insertionParent = insertionParent;
const _insertionAnchor = insertionAnchor;
if (!isHydrating$1) resetInsertionState();
const normalizedRawSlots = normalizeRawSlots(rawSlots);
const scopeOwner = getScopeOwner();
let latestVNode;
let patchVNode;
const render = (value, resolved, appContext) => {
if (isBlock(value)) return value;
if (isInteropEnabled && appContext.vdom && isVNode(value)) {
const vnodeFrag = appContext.vdom.mountVNode(latestVNode || resolved, currentInstance, isSingleRoot, rawProps, once);
patchVNode = vnodeFrag.patchVNode;
return vnodeFrag;
}
return createComponentWithFallback(resolved, rawProps, normalizedRawSlots, isSingleRoot, once, ns, appContext);
};
if (once) {
const hydrationCursor = isHydrating$1 ? enterHydrationCursor() : null;
const value = getter();
const appContext = getAppContext();
const block = render(value, resolveValue(value, appContext, scopeOwner), appContext);
finishBlockCreation(block, void 0, hydrationCursor, _insertionParent, _insertionAnchor);
return block;
}
const hydrationCursor = isHydrating$1 ? captureHydrationCursor() : null;
const frag = new DynamicFragment(0, !!(process.env.NODE_ENV !== "production") ? "dynamic-component" : void 0, false, slotRoot, slotRoot ? () => {
const nodes = frag.nodes;
if (nodes instanceof Node) {
const parent = nodes.parentNode;
if (parent) removeNode(nodes, parent);
}
const anchorParent = frag.anchor.parentNode;
if (anchorParent) removeNode(frag.anchor, anchorParent);
} : void 0, _insertionAnchor);
if (isHydrating$1) locateHydrationNode();
let lastKey;
let lastBranch;
let branchToken;
renderEffect(() => {
const value = getter();
let userKey = key ? key() : void 0;
const appContext = getAppContext();
let resolved = resolveValue(value, appContext, scopeOwner);
if (resolved === NULL_DYNAMIC_COMPONENT) {
if (isInteropEnabled) latestVNode = patchVNode = void 0;
frag.update(void 0, resolved);
return;
}
let branchKey = resolved;
if (isInteropEnabled && isVNode(resolved)) {
if (key) {
if (resolved.key !== (userKey == null ? null : userKey)) resolved = cloneVNode(resolved, { key: userKey });
} else if (resolved.key != null) userKey = resolved.key;
latestVNode = resolved;
branchKey = resolved.type;
}
if (key || isInteropEnabled && userKey !== void 0) {
if (userKey !== lastKey || branchKey !== lastBranch) {
lastKey = userKey;
lastBranch = branchKey;
branchToken = {};
}
branchKey = branchToken;
}
if (branchKey === frag.current && !isHydrating$1) {
if (isInteropEnabled && patchVNode && isVNode(resolved)) patchVNode(resolved);
return;
}
if (isInteropEnabled) latestVNode = patchVNode = void 0;
frag.update(() => render(value, resolved, appContext), branchKey, false, userKey);
});
finishBlockCreation(frag, frag.anchor, hydrationCursor, _insertionParent, _insertionAnchor);
return frag;
}
function getAppContext() {
return currentInstance && currentInstance.appContext || emptyContext;
}
function resolveValue(value, appContext, scopeOwner) {
if (isBlock(value) || isInteropEnabled && appContext.vdom && isVNode(value)) return value;
const resolved = withScopeOwner(scopeOwner, () => resolveDynamicComponent(value));
const type = typeof resolved;
if (!resolved || type !== "string" && type !== "object" && type !== "function" && type !== "symbol") {
if (!!(process.env.NODE_ENV !== "production")) warn(`Invalid dynamic component type: ${String(resolved)} (${type})`);
return NULL_DYNAMIC_COMPONENT;
}
return resolved;
}
function withScopeOwner(owner, fn) {
const prev = setCurrentRenderingInstance(owner);
try {
return fn();
} finally {
setCurrentRenderingInstance(prev);
}
}
//#endregion
//#region packages/runtime-vapor/src/directives/vShow.ts
/**
* v-show is root-inherited state: it lands on the effective root element of
* `target`, and any producer on the root chain (dynamic fragment branch,
* interop subtree, pending async setup) can replace that root later. `apply`
* resolves the root through the shared chain walker and registers itself on
* every producer it passes, so a replacement root re-enters `apply` and
* registers the producers inside it in turn.
*/
function applyVShow(target, source) {
let value;
let transition;
let unresolved = false;
let slotRoot = false;
const visitor = {
onComponent(instance) {
if (isSuspenseEnabled && instance.asyncDep && !instance.asyncResolved) {
if (!instance.$vshow) (instance.bm || (instance.bm = [])).push(() => apply(instance.block));
unresolved = true;
mark(instance);
return true;
}
mark(instance);
},
onDynamicFragment(frag) {
if (isSlotOutletFragment(frag)) return slotRoot = true;
mark(frag);
register(frag.bm || (frag.bm = []), apply);
}
};
if (isInteropEnabled) visitor.onInteropFragment = (frag) => {
if (isSlotOutletFragment(frag)) return slotRoot = true;
mark(frag);
if (isTransitionEnabled && frag.$transition) transition = frag.$transition;
register(frag.u || (frag.u = []), apply);
if (!isValidBlock(frag.nodes)) unresolved = true;
};
const apply = (nodes) => {
transition = void 0;
unresolved = slotRoot = false;
const root = getRootElement(nodes, visitor);
if (root) setDisplay(root, value, transition);
else if (!!(process.env.NODE_ENV !== "production") && (slotRoot || !unresolved && isValidBlock(nodes))) warn("v-show used on component with non-single-element root node and will be ignored.");
};
renderEffect(() => {
value = source();
apply(target);
});
}
function mark(block) {
block.$vshow = true;
}
function register(hooks, hook) {
if (!hooks.includes(hook)) hooks.push(hook);
}
function setDisplay(el, value, transition) {
const hidden = !value;
if (!(vShowOriginalDisplay in el)) {
mark(el);
el[vShowOriginalDisplay] = el.style.display === "none" ? "" : el.style.display;
el[vShowHidden] = hidden;
writeDisplay(el, value);
return;
}
if (el[vShowHidden] === hidden) return;
el[vShowHidden] = hidden;
const $transition = isTransitionEnabled ? el.$transition || transition : void 0;
if ($transition) {
const prevSub = setActiveSub();
try {
if (value) {
$transition.beforeEnter(el);
el.style.display = el[vShowOriginalDisplay];
$transition.enter(el);
} else if (el.isConnected) $transition.leave(el, () => {
el.style.display = "none";
});
else el.style.display = "none";
} finally {
setActiveSub(prevSub);
}
} else writeDisplay(el, value);
}
function writeDisplay(el, value) {
if ((!!(process.env.NODE_ENV !== "production") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && isHydrating$1) {
const hidden = el.style.display === "none";
if (!value === hidden) return;
const expected = value ? el[vShowOriginalDisplay] : "none";
if (warnPropMismatch(el, "style", 3, `display: ${el.style.display}`, expected ? `display: ${expected}` : false)) logMismatchError();
}
el.style.display = value ? el[vShowOriginalDisplay] : "none";
}
//#endregion
//#region packages/runtime-vapor/src/directives/vModel.ts
function ensureMounted(cb) {
if (currentInstance.isMounted) cb();
else onMounted(inOnce ? () => withOnce(cb) : cb);
}
const applyTextModel = (el, get, set, { trim, number, lazy } = {}) => {
vModelTextInit(el, trim, number, lazy, set);
ensureMounted(() => {
let value;
renderEffect(() => {
vModelTextUpdate(el, value, value = get(), trim, number, lazy);
});
});
};
const applyCheckboxModel = (el, get, set) => {
vModelCheckboxInit(el, set);
ensureMounted(() => {
let value;
renderEffect(() => {
vModelCheckboxUpdate(el, value, traverse(value = get()));
});
});
};
const applyRadioModel = (el, get, set) => {
el.addEventListener("change", () => set(vModelGetValue(el)));
ensureMounted(() => {
let value;
renderEffect(() => {
if (value !== (value = get())) el.checked = looseEqual(value, vModelGetValue(el));
});
});
};
const applySelectModel = (el, get, set, modifiers) => {
vModelSelectInit(el, get(), modifiers && modifiers.number, set);
if (inOnce) {
ensureMounted(() => vModelSetSelected(el, get()));
return;
}
const instance = currentInstance;
const update = () => vModelSetSelected(el, get());
(instance.u || (instance.u = [])).unshift(update);
onScopeDispose$1(() => remove$1(instance.u, update));
ensureMounted(() => {
update();
renderEffect(() => traverse(get()));
});
};
const applyDynamicModel = (el, get, set, modifiers) => {
let apply = applyTextModel;
if (el.tagName === "SELECT") apply = applySelectModel;
else if (el.tagName === "TEXTAREA") apply = applyTextModel;
else if (el.type === "checkbox") apply = applyCheckboxModel;
else if (el.type === "radio") apply = applyRadioModel;
apply(el, get, set, modifiers);
};
//#endregion
//#region packages/runtime-vapor/src/directives/custom.ts
function withVaporDirectives(node, dirs) {
if (node instanceof Element) {
applyDirectivesToElement(node, dirs, currentInstance);
return;
}
const instance = currentInstance;
const once = inOnce;
let currentElement = null;
let directiveScope;
let disposed = false;
let pending = false;
let pendingSetups;
const visitor = {
onDynamicFragment: track,
onComponent(block) {
if (isSuspenseEnabled && block.asyncDep && !block.asyncResolved) {
pending = true;
if (!(pendingSetups || (pendingSetups = /* @__PURE__ */ new WeakSet())).has(block)) {
pendingSetups.add(block);
onBeforeMount(applyDirectives, block);
}
return true;
}
if (isAsyncComponentEnabled && isAsyncWrapper(block)) {
const inner = block.block;
if (isFragment(inner) && inner.nodes === EMPTY_BLOCK) pending = true;
}
},
excludeSlotOutlets: true
};
if (isInteropEnabled) visitor.onInteropFragment = (frag) => {
if (frag.nodes === EMPTY_BLOCK) pending = true;
track(frag);
};
function stopDirectiveScope() {
if (directiveScope) {
directiveScope.stop();
directiveScope = void 0;
}
}
function track(frag) {
const u = frag.u || (frag.u = []);
if (u.includes(applyDirectives)) return;
u.push(applyDirectives);
if (isDynamicFragment(frag)) (frag.bu || (frag.bu = [])).push(() => {
if (currentElement && getRootElement(frag.nodes) === currentElement) {
currentElement = null;
stopDirectiveScope();
}
});
}
function applyDirectives() {
if (disposed) return;
pending = false;
const element = getRootElement(node, visitor);
if (!element && pending) {
if (currentElement !== null) {
currentElement = null;
stopDirectiveScope();
}
return;
}
if (element === currentElement) return;
currentElement = element;
stopDirectiveScope();
if (!element) {
if (!!(process.env.NODE_ENV !== "production")) warn("Runtime directive used on component with non-element root node. The directives will not function as intended.");
return;
}
directiveScope = new EffectScope$1(true);
const prev = setCurrentInstance(instance, directiveScope);
try {
if (once) withOnce(() => applyDirectivesToElement(element, dirs, instance));
else applyDirectivesToElement(element, dirs, instance);
} finally {
restoreCurrentInstance(prev);
}
}
onScopeDispose(() => {
disposed = true;
stopDirectiveScope();
}, true);
applyDirectives();
}
function applyDirectivesToElement(element, dirs, instance) {
const hookCounts = !!(process.env.NODE_ENV !== "production") && instance ? countLifecycleHooks(instance) : null;
for (const [dir, value, argument, modifiers] of dirs) if (dir) {
if (!isFunction(dir)) {
if (!!(process.env.NODE_ENV !== "production")) warn(`Received a VDOM object directive` + (isObject(dir) ? ` (hooks: ${Object.keys(dir).join(", ")})` : ``) + " in a Vapor template. Vapor directives must be a function: (el, value, arg, modifiers) => cleanup.");
continue;
}
const ret = callWithErrorHandling(dir, instance, 8, [
element,
value,
argument,
modifiers
]);
if (ret) onScopeDispose(() => callWithErrorHandling(ret, instance, 8));
}
if (!!(process.env.NODE_ENV !== "production") && hookCounts) warnLifecycleHooks(instance, hookCounts);
}
const lifecycleHookNames = !!(process.env.NODE_ENV !== "production") ? {
bm: "onBeforeMount",
m: "onMounted",
bu: "onBeforeUpdate",
u: "onUpdated",
bum: "onBeforeUnmount",
um: "onUnmounted",
da: "onDeactivated",
a: "onActivated"
} : {};
function countLifecycleHooks(instance) {
const counts = [];
for (const key in lifecycleHookNames) {
const hooks = instance[key];
counts.push(hooks ? hooks.length : 0);
}
return counts;
}
function warnLifecycleHooks(instance, before) {
let i = 0;
for (const key in lifecycleHookNames) {
const hooks = instance[key];
if (hooks && hooks.length > before[i]) warn(`${lifecycleHookNames[key]}() was called inside a custom directive. Lifecycle hooks are not supported in Vapor directives: they attach to the component, not the element. Use watchPostEffect() for work that needs the element in the DOM, and return a cleanup function for teardown.`);
i++;
}
}
//#endregion
//#region packages/runtime-vapor/src/components/TransitionGroup.ts
const positionMap = /* @__PURE__ */ new WeakMap();
const newPositionMap = /* @__PURE__ */ new WeakMap();
const trackedTransitionGroupOwners = /* @__PURE__ */ new WeakSet();
const decorate = (t) => {
delete t.props.mode;
return t;
};
const VaporTransitionGroup = /*@__PURE__*/ decorate(/* @__PURE__ */ defineVaporComponent({
name: "VaporTransitionGroup",
props: /*@__PURE__*/ extend$1({}, TransitionPropsValidators, {
tag: String,
moveClass: String
}),
setup(props, { slots, expose }) {
expose();
if (!isTransitionEnabled) registerTransitionHooks(applyTransitionHooksImpl, () => false, () => false, () => false);
const instance = currentInstance;
const state = useTransitionState();
let cssTransitionProps;
const propsProxy = new Proxy({}, { get(_, key) {
return cssTransitionProps[key];
} });
let prevChildren = [];
let isUpdatePending = false;
let isUpdatedPending = false;
let slottedBlock = [];
const beforeUpdate = () => {
if (isUpdatePending) return;
isUpdatePending = true;
prevChildren = [];
const children = resolveTransitionBlocks(slottedBlock, void 0, void 0, true);
for (let i = 0; i < children.length; i++) {
const child = children[i];
const el = isValidTransitionBlock(child) && child.$transition ? getTransitionElement(child) : void 0;
if (el && !el[vShowHidden]) {
prevChildren.push(child);
positionMap.set(child, el.getBoundingClientRect());
}
}
};
const flushUpdated = () => {
isUpdatedPending = false;
if (!isUpdatePending) return;
isUpdatePending = false;
if (!prevChildren.length) return;
const moveClass = props.moveClass || `${props.name || "v"}-move`;
const firstChild = getFirstConnectedChild(prevChildren);
if (!!!(firstChild && hasCSSTransform(firstChild, firstChild.parentNode, moveClass))) {
prevChildren = [];
return;
}
prevChildren.forEach((child) => {
const el = getTransitionElement(child);
if (el) callPendingCbs(el);
});
prevChildren.forEach(recordPosition);
const movedChildren = prevChildren.filter(applyTranslation);
forceReflow(firstChild);
movedChildren.forEach((c) => handleMovedChildren(getTransitionElement(c), moveClass));
prevChildren = [];
};
const updated = () => {
if (!isUpdatePending || isUpdatedPending) return;
isUpdatedPending = true;
queuePostRenderEffect(flushUpdated, void 0, instance.suspense);
};
onBeforeUpdate(beforeUpdate);
onUpdated(updated);
const updateHooks = {
beforeUpdate,
updated
};
const tag = props.tag;
let close = null;
if (isHydrating$1) {
const claim = tag ? void 0 : createFragmentClaim();
locateHydrationNode(claim);
if (claim && claim.start) close = claimAnchor(locateEndAnchor(claim.start));
}
let isMounted = false;
renderEffect(() => {
cssTransitionProps = resolveTransitionProps(props);
if (isMounted) applyGroupTransitionHooks(slottedBlock, propsProxy, state, instance, updateHooks);
}, true);
const createContainer = () => tag ? isHydrating$1 ? adoptTemplate(currentHydrationNode, `<${tag}/>`) : /* @__PURE__ */ createElement(tag) : void 0;
const renderChildren = (slot, container, run = (render) => render()) => {
let nextNode = null;
if (isHydrating$1 && container) {
nextNode = nextLogicalSibling(container);
setCurrentHydrationNode(container.firstChild || container);
}
try {
run(() => {
const block = slot && slot() || [];
applyGroupTransitionHooks(block, propsProxy, state, instance, updateHooks);
slottedBlock = block;
if (container) {
if (!isHydrating$1) insert(block, container);
registerNestedVDOMCleanup(block);
return container;
}
return block;
});
if (isHydrating$1 && container && currentHydrationNode && currentHydrationNode.parentNode === container) cleanupHydrationTail(currentHydrationNode, container);
if (isHydrating$1 && close) {
trimHydrationBoundary(close);
if (currentHydrationNode === close) advanceHydrationNode(close);
close = null;
}
} finally {
if (isHydrating$1 && container) setCurrentHydrationNode(nextNode);
}
isMounted = true;
};
if (!instance.rawSlots.$) {
const container = createContainer();
renderChildren(slots.default, container);
return container || slottedBlock;
}
const frag = new DynamicFragment(0, !!(process.env.NODE_ENV !== "production") ? "transition-group" : void 0);
let currentSlot;
renderEffect(() => {
const slot = slots.default;
if (isMounted && slot === currentSlot) return;
renderChildren(slot, createContainer(), (render) => frag.update(render));
currentSlot = slot;
});
return frag;
}
}));
function resolveTransitionBlocks(block, onFragment, onUpdateOwner, collectOnly = false) {
const children = [];
if (collectOnly) {
collectTransitionBlocks(block, children, onFragment, onUpdateOwner);
return children;
}
const keys = /* @__PURE__ */ new Map();
collectTransitionBlocks(block, children, onFragment, onUpdateOwner, keys, ROOT_KEY_CONTEXT);
for (let i = 0; i < children.length; i++) setTransitionKey(children[i], keys.get(children[i]));
return children;
}
function collectTransitionBlocks(block, children, onFragment, onUpdateOwner, keys, ctx) {
if (block instanceof Node) {
if (block instanceof Element) {
children.push(block);
if (keys) keys.set(block, block.$key);
}
} else if (isVaporComponent(block)) {
const isRootSlot = block.block && isVaporSlotOutlet(block.block);
if (onUpdateOwner && !isRootSlot) onUpdateOwner(block);
const start = children.length;
collectTransitionBlocks(block.block, children, onFragment, isRootSlot ? onUpdateOwner : void 0, keys, ctx && (isRootSlot ? withDefaultKey(ctx, block.$key) : enterComponentKeyContext(ctx, block)));
if (keys) {
if (!isRootSlot) {
const t = transitionTypeOf(block);
for (let i = start; i < children.length; i++) setTransitionType(children[i], t);
}
resolveOwnerKey(children, start, block.$key, keys, !isRootSlot);
}
} else if (isArray(block)) for (let i = 0; i < block.length; i++) collectTransitionBlocks(block[i], children, onFragment, onUpdateOwner, keys, ctx);
else if (isFragment(block)) {
const isItem = isForBlock(block);
if (!isItem) {
if (onFragment) onFragment(block);
if (onUpdateOwner) onUpdateOwner(block);
}
if (isInteropEnabled && block.hasVDOMContent && block.hasVDOMContent()) {
children.push(block);
if (keys) keys.set(block, block.$key);
} else {
const key = isItem ? block.key : getFragmentKey(block);
const start = children.length;
collectTransitionBlocks(block.nodes, children, onFragment, onUpdateOwner, keys, ctx && enterFragmentKeyContext(block, ctx, key));
if (!keys) return;
if (!isItem) resolveOwnerKey(children, start, key, keys, false);
else if (key != null) {
if (children.length - start === 1) keys.set(children[start], key);
else for (let i = start; i < children.length; i++) keys.set(children[i], `${key}:${i - start}`);
}
}
}
}
function resolveOwnerKey(children, start, key, keys, final) {
if (children.length - start === 1) {
const child = children[start];
if (final || keys.get(child) == null) keys.set(child, key);
return;
}
if (key == null) return;
for (let i = start; i < children.length; i++) {
const child = children[i];
const inner = keys.get(child);
keys.set(child, String(key) + String(inner != null ? inner : i - start));
}
}
function applyGroupTransitionHooks(block, props, state, instance, updateHooks) {
const fragments = [];
const children = resolveTransitionBlocks(block, (frag) => fragments.push(frag), (owner) => trackTransitionGroupUpdate(owner, instance, updateHooks));
for (let i = 0; i < children.length; i++) {
const child = children[i];
if (isValidTransitionBlock(child)) {
if (getTransitionKey(child) != null) child.$transition = resolveTransitionHooks(child, props, state, instance);
else if (!!(process.env.NODE_ENV !== "production")) warn(`<transition-group> children must be keyed`);
}
}
fragments.forEach((frag) => {
const hooks = resolveTransitionHooks(frag, props, state, instance);
hooks.applyGroup = (block, props, state, instance) => applyGroupTransitionHooks(block, props, state, instance, updateHooks);
frag.$transition = hooks;
});
return children;
}
function trackTransitionGroupUpdate(owner, instance, updateHooks) {
if (trackedTransitionGroupOwners.has(owner)) return;
if (isFragment(owner)) {
trackedTransitionGroupOwners.add(owner);
(owner.bu || (owner.bu = [])).push(updateHooks.beforeUpdate);
(owner.u || (owner.u = [])).push(updateHooks.updated);
return;
}
if (!owner.hasDynamicProps) return;
trackedTransitionGroupOwners.add(owner);
const prevGroup = setCurrentInstance(instance, owner.scope);
try {
renderEffect(() => {
trackRawValues(owner);
});
} finally {
restoreCurrentInstance(prevGroup);
}
}
function recordPosition(c) {
const el = getTransitionElement(c);
if (el) newPositionMap.set(c, el.getBoundingClientRect());
}
function applyTranslation(c) {
const el = getTransitionElement(c);
if (el && baseApplyTranslation(positionMap.get(c), newPositionMap.get(c), el)) return c;
}
function getFirstConnectedChild(children) {
for (let i = 0; i < children.length; i++) {
const child = children[i];
const el = getTransitionElement(child);
if (el && el.isConnected) return el;
}
}
//#endregion
export { DynamicFragment, VaporElement, VaporFragment, VaporKeepAlive, VaporTeleport, VaporTransition, VaporTransitionGroup, applyCheckboxModel, applyDynamicModel, applyRadioModel, applySelectModel, applyTextModel, applyVShow, child, createAssetComponent, createComponent, createComponentWithFallback, createDynamicComponent, createFor, createForSlots, createIf, createInvoker, createKeyedFragment, createPlainElement, createSelector, createSlot, createTemplateRefSetter, createTextNode, createVaporApp, createVaporSSRApp, defineVaporAsyncComponent, defineVaporComponent, defineVaporCustomElement, defineVaporSSRCustomElement, delegate, delegateEvents, extend, getDefaultValue, getRestElement, insert, isFragment, isVaporComponent, next, nthChild, on, onBinding, remove, renderEffect, setAttr, setBlockKey, setClass, setClassName, setDOMProp, setDynamicEvents, setDynamicProps, setElementText, setHtml, setInsertionState, setListener, setProp, setStaticTemplateRef, setStyle, setTemplateRefBinding, setText, setValue, template, txt, useVaporCssVars, vaporInteropPlugin, withOnce, withVaporDirectives, withVaporKeys, withVaporModifiers };