2023-07-24 11:13:08 +08:00
function makeMap ( str , expectsLowerCase ) {
2023-09-06 09:51:55 +08:00
const map = /* @__PURE__ */ Object . create ( null ) ;
const list = str . split ( "," ) ;
for ( let i = 0 ; i < list . length ; i ++ ) {
map [ list [ i ] ] = true ;
}
return expectsLowerCase ? ( val ) => ! ! map [ val . toLowerCase ( ) ] : ( val ) => ! ! map [ val ] ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const EMPTY _OBJ = Object . freeze ( { } ) ;
const EMPTY _ARR = Object . freeze ( [ ] ) ;
const NOOP = ( ) => {
} ;
const NO = ( ) => false ;
const onRE = /^on[^a-z]/ ;
const isOn = ( key ) => onRE . test ( key ) ;
const isModelListener = ( key ) => key . startsWith ( "onUpdate:" ) ;
const extend = Object . assign ;
const remove = ( arr , el ) => {
const i = arr . indexOf ( el ) ;
if ( i > - 1 ) {
arr . splice ( i , 1 ) ;
}
} ;
const hasOwnProperty$1 = Object . prototype . hasOwnProperty ;
const hasOwn = ( val , key ) => hasOwnProperty$1 . call ( val , key ) ;
const isArray = Array . isArray ;
const isMap = ( val ) => toTypeString ( val ) === "[object Map]" ;
const isSet = ( val ) => toTypeString ( val ) === "[object Set]" ;
const isDate = ( val ) => toTypeString ( val ) === "[object Date]" ;
const isRegExp = ( val ) => toTypeString ( val ) === "[object RegExp]" ;
const isFunction = ( val ) => typeof val === "function" ;
const isString = ( val ) => typeof val === "string" ;
const isSymbol = ( val ) => typeof val === "symbol" ;
const isObject = ( val ) => val !== null && typeof val === "object" ;
const isPromise = ( val ) => {
return isObject ( val ) && isFunction ( val . then ) && isFunction ( val . catch ) ;
} ;
const objectToString = Object . prototype . toString ;
const toTypeString = ( value ) => objectToString . call ( value ) ;
const toRawType = ( value ) => {
return toTypeString ( value ) . slice ( 8 , - 1 ) ;
} ;
const isPlainObject = ( val ) => toTypeString ( val ) === "[object Object]" ;
const isIntegerKey = ( key ) => isString ( key ) && key !== "NaN" && key [ 0 ] !== "-" && "" + parseInt ( key , 10 ) === key ;
const isReservedProp = /* @__PURE__ */ makeMap (
// the leading comma is intentional so empty string "" is also included
",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"
) ;
const isBuiltInDirective = /* @__PURE__ */ makeMap (
"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"
) ;
const cacheStringFunction = ( fn ) => {
const cache = /* @__PURE__ */ Object . create ( null ) ;
return ( str ) => {
const hit = cache [ str ] ;
return hit || ( cache [ str ] = fn ( str ) ) ;
} ;
} ;
const camelizeRE = /-(\w)/g ;
const camelize = cacheStringFunction ( ( str ) => {
return str . replace ( camelizeRE , ( _ , c ) => c ? c . toUpperCase ( ) : "" ) ;
} ) ;
const hyphenateRE = /\B([A-Z])/g ;
const hyphenate = cacheStringFunction (
( str ) => str . replace ( hyphenateRE , "-$1" ) . toLowerCase ( )
) ;
const capitalize = cacheStringFunction (
( str ) => str . charAt ( 0 ) . toUpperCase ( ) + str . slice ( 1 )
) ;
const toHandlerKey = cacheStringFunction (
( str ) => str ? ` on ${ capitalize ( str ) } ` : ` `
) ;
const hasChanged = ( value , oldValue ) => ! Object . is ( value , oldValue ) ;
const invokeArrayFns = ( fns , arg ) => {
for ( let i = 0 ; i < fns . length ; i ++ ) {
fns [ i ] ( arg ) ;
}
} ;
const def = ( obj , key , value ) => {
Object . defineProperty ( obj , key , {
configurable : true ,
enumerable : false ,
value
} ) ;
} ;
const looseToNumber = ( val ) => {
const n = parseFloat ( val ) ;
return isNaN ( n ) ? val : n ;
} ;
const toNumber = ( val ) => {
const n = isString ( val ) ? Number ( val ) : NaN ;
return isNaN ( n ) ? val : n ;
} ;
let _globalThis ;
const getGlobalThis = ( ) => {
return _globalThis || ( _globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : { } ) ;
} ;
const GLOBALS _WHITE _LISTED = "Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console" ;
const isGloballyWhitelisted = /* @__PURE__ */ makeMap ( GLOBALS _WHITE _LISTED ) ;
2023-07-24 11:13:08 +08:00
function normalizeStyle ( value ) {
2023-09-06 09:51:55 +08:00
if ( isArray ( value ) ) {
const res = { } ;
for ( let i = 0 ; i < value . length ; i ++ ) {
const item = value [ i ] ;
const normalized = isString ( item ) ? parseStringStyle ( item ) : normalizeStyle ( item ) ;
if ( normalized ) {
for ( const key in normalized ) {
res [ key ] = normalized [ key ] ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return res ;
} else if ( isString ( value ) ) {
return value ;
} else if ( isObject ( value ) ) {
return value ;
}
2023-07-24 11:13:08 +08:00
}
const listDelimiterRE = /;(?![^(]*\))/g ;
const propertyDelimiterRE = /:([^]+)/ ;
2023-09-06 09:51:55 +08:00
const styleCommentRE = /\/\*[^]*?\*\//g ;
2023-07-24 11:13:08 +08:00
function parseStringStyle ( cssText ) {
2023-09-06 09:51:55 +08:00
const ret = { } ;
cssText . replace ( styleCommentRE , "" ) . split ( listDelimiterRE ) . forEach ( ( item ) => {
if ( item ) {
const tmp = item . split ( propertyDelimiterRE ) ;
tmp . length > 1 && ( ret [ tmp [ 0 ] . trim ( ) ] = tmp [ 1 ] . trim ( ) ) ;
}
} ) ;
return ret ;
2023-07-24 11:13:08 +08:00
}
function normalizeClass ( value ) {
2023-09-06 09:51:55 +08:00
let res = "" ;
if ( isString ( value ) ) {
res = value ;
} else if ( isArray ( value ) ) {
for ( let i = 0 ; i < value . length ; i ++ ) {
const normalized = normalizeClass ( value [ i ] ) ;
if ( normalized ) {
res += normalized + " " ;
}
}
} else if ( isObject ( value ) ) {
for ( const name in value ) {
if ( value [ name ] ) {
res += name + " " ;
}
}
}
return res . trim ( ) ;
2023-07-24 11:13:08 +08:00
}
function normalizeProps ( props ) {
2023-09-06 09:51:55 +08:00
if ( ! props )
return null ;
let { class : klass , style } = props ;
if ( klass && ! isString ( klass ) ) {
props . class = normalizeClass ( klass ) ;
}
if ( style ) {
props . style = normalizeStyle ( style ) ;
}
return props ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const HTML _TAGS = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot" ;
const SVG _TAGS = "svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view" ;
const isHTMLTag = /* @__PURE__ */ makeMap ( HTML _TAGS ) ;
const isSVGTag = /* @__PURE__ */ makeMap ( SVG _TAGS ) ;
2023-07-24 11:13:08 +08:00
const specialBooleanAttrs = ` itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly ` ;
2023-09-06 09:51:55 +08:00
const isSpecialBooleanAttr = /* @__PURE__ */ makeMap ( specialBooleanAttrs ) ;
2023-07-24 11:13:08 +08:00
function includeBooleanAttr ( value ) {
2023-09-06 09:51:55 +08:00
return ! ! value || value === "" ;
2023-07-24 11:13:08 +08:00
}
function looseCompareArrays ( a , b ) {
2023-09-06 09:51:55 +08:00
if ( a . length !== b . length )
return false ;
let equal = true ;
for ( let i = 0 ; equal && i < a . length ; i ++ ) {
equal = looseEqual ( a [ i ] , b [ i ] ) ;
}
return equal ;
2023-07-24 11:13:08 +08:00
}
function looseEqual ( a , b ) {
2023-09-06 09:51:55 +08:00
if ( a === b )
return true ;
let aValidType = isDate ( a ) ;
let bValidType = isDate ( b ) ;
if ( aValidType || bValidType ) {
return aValidType && bValidType ? a . getTime ( ) === b . getTime ( ) : false ;
}
aValidType = isSymbol ( a ) ;
bValidType = isSymbol ( b ) ;
if ( aValidType || bValidType ) {
return a === b ;
}
aValidType = isArray ( a ) ;
bValidType = isArray ( b ) ;
if ( aValidType || bValidType ) {
return aValidType && bValidType ? looseCompareArrays ( a , b ) : false ;
}
aValidType = isObject ( a ) ;
bValidType = isObject ( b ) ;
if ( aValidType || bValidType ) {
if ( ! aValidType || ! bValidType ) {
return false ;
}
const aKeysCount = Object . keys ( a ) . length ;
const bKeysCount = Object . keys ( b ) . length ;
if ( aKeysCount !== bKeysCount ) {
return false ;
}
for ( const key in a ) {
const aHasKey = a . hasOwnProperty ( key ) ;
const bHasKey = b . hasOwnProperty ( key ) ;
if ( aHasKey && ! bHasKey || ! aHasKey && bHasKey || ! looseEqual ( a [ key ] , b [ key ] ) ) {
return false ;
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
return String ( a ) === String ( b ) ;
2023-07-24 11:13:08 +08:00
}
function looseIndexOf ( arr , val ) {
2023-09-06 09:51:55 +08:00
return arr . findIndex ( ( item ) => looseEqual ( item , val ) ) ;
2023-07-24 11:13:08 +08:00
}
const toDisplayString = ( val ) => {
2023-09-06 09:51:55 +08:00
return isString ( val ) ? val : val == null ? "" : isArray ( val ) || isObject ( val ) && ( val . toString === objectToString || ! isFunction ( val . toString ) ) ? JSON . stringify ( val , replacer , 2 ) : String ( val ) ;
2023-07-24 11:13:08 +08:00
} ;
const replacer = ( _key , val ) => {
2023-09-06 09:51:55 +08:00
if ( val && val . _ _v _isRef ) {
return replacer ( _key , val . value ) ;
} else if ( isMap ( val ) ) {
return {
[ ` Map( ${ val . size } ) ` ] : [ ... val . entries ( ) ] . reduce ( ( entries , [ key , val2 ] ) => {
entries [ ` ${ key } => ` ] = val2 ;
return entries ;
} , { } )
} ;
} else if ( isSet ( val ) ) {
return {
[ ` Set( ${ val . size } ) ` ] : [ ... val . values ( ) ]
} ;
} else if ( isObject ( val ) && ! isArray ( val ) && ! isPlainObject ( val ) ) {
return String ( val ) ;
}
return val ;
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
function warn$1 ( msg , ... args ) {
console . warn ( ` [Vue warn] ${ msg } ` , ... args ) ;
2023-07-24 11:13:08 +08:00
}
let activeEffectScope ;
class EffectScope {
2023-09-06 09:51:55 +08:00
constructor ( detached = false ) {
this . detached = detached ;
2023-07-24 11:13:08 +08:00
/ * *
* @ internal
* /
2023-09-06 09:51:55 +08:00
this . _active = true ;
2023-07-24 11:13:08 +08:00
/ * *
* @ internal
* /
2023-09-06 09:51:55 +08:00
this . effects = [ ] ;
/ * *
* @ internal
* /
this . cleanups = [ ] ;
this . parent = activeEffectScope ;
if ( ! detached && activeEffectScope ) {
this . index = ( activeEffectScope . scopes || ( activeEffectScope . scopes = [ ] ) ) . push (
this
) - 1 ;
}
}
get active ( ) {
return this . _active ;
}
run ( fn ) {
if ( this . _active ) {
const currentEffectScope = activeEffectScope ;
try {
activeEffectScope = this ;
return fn ( ) ;
} finally {
activeEffectScope = currentEffectScope ;
}
} else {
warn$1 ( ` cannot run an inactive effect scope. ` ) ;
}
}
/ * *
* This should only be called on non - detached scopes
* @ internal
* /
on ( ) {
activeEffectScope = this ;
}
/ * *
* This should only be called on non - detached scopes
* @ internal
* /
off ( ) {
activeEffectScope = this . parent ;
}
stop ( fromParent ) {
if ( this . _active ) {
let i , l ;
for ( i = 0 , l = this . effects . length ; i < l ; i ++ ) {
this . effects [ i ] . stop ( ) ;
}
for ( i = 0 , l = this . cleanups . length ; i < l ; i ++ ) {
this . cleanups [ i ] ( ) ;
}
if ( this . scopes ) {
for ( i = 0 , l = this . scopes . length ; i < l ; i ++ ) {
this . scopes [ i ] . stop ( true ) ;
}
}
if ( ! this . detached && this . parent && ! fromParent ) {
const last = this . parent . scopes . pop ( ) ;
if ( last && last !== this ) {
this . parent . scopes [ this . index ] = last ;
last . index = this . index ;
}
}
this . parent = void 0 ;
this . _active = false ;
}
}
2023-07-24 11:13:08 +08:00
}
function effectScope ( detached ) {
2023-09-06 09:51:55 +08:00
return new EffectScope ( detached ) ;
2023-07-24 11:13:08 +08:00
}
function recordEffectScope ( effect , scope = activeEffectScope ) {
2023-09-06 09:51:55 +08:00
if ( scope && scope . active ) {
scope . effects . push ( effect ) ;
}
2023-07-24 11:13:08 +08:00
}
function getCurrentScope ( ) {
2023-09-06 09:51:55 +08:00
return activeEffectScope ;
2023-07-24 11:13:08 +08:00
}
function onScopeDispose ( fn ) {
2023-09-06 09:51:55 +08:00
if ( activeEffectScope ) {
activeEffectScope . cleanups . push ( fn ) ;
} else {
warn$1 (
` onScopeDispose() is called when there is no active effect scope to be associated with. `
) ;
}
2023-07-24 11:13:08 +08:00
}
const createDep = ( effects ) => {
2023-09-06 09:51:55 +08:00
const dep = new Set ( effects ) ;
dep . w = 0 ;
dep . n = 0 ;
return dep ;
2023-07-24 11:13:08 +08:00
} ;
const wasTracked = ( dep ) => ( dep . w & trackOpBit ) > 0 ;
const newTracked = ( dep ) => ( dep . n & trackOpBit ) > 0 ;
const initDepMarkers = ( { deps } ) => {
2023-09-06 09:51:55 +08:00
if ( deps . length ) {
for ( let i = 0 ; i < deps . length ; i ++ ) {
deps [ i ] . w |= trackOpBit ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
} ;
const finalizeDepMarkers = ( effect ) => {
2023-09-06 09:51:55 +08:00
const { deps } = effect ;
if ( deps . length ) {
let ptr = 0 ;
for ( let i = 0 ; i < deps . length ; i ++ ) {
const dep = deps [ i ] ;
if ( wasTracked ( dep ) && ! newTracked ( dep ) ) {
dep . delete ( effect ) ;
} else {
deps [ ptr ++ ] = dep ;
}
dep . w &= ~ trackOpBit ;
dep . n &= ~ trackOpBit ;
}
deps . length = ptr ;
}
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
const targetMap = /* @__PURE__ */ new WeakMap ( ) ;
2023-07-24 11:13:08 +08:00
let effectTrackDepth = 0 ;
let trackOpBit = 1 ;
const maxMarkerBits = 30 ;
let activeEffect ;
2023-09-06 09:51:55 +08:00
const ITERATE _KEY = Symbol ( "iterate" ) ;
const MAP _KEY _ITERATE _KEY = Symbol ( "Map key iterate" ) ;
2023-07-24 11:13:08 +08:00
class ReactiveEffect {
2023-09-06 09:51:55 +08:00
constructor ( fn , scheduler = null , scope ) {
this . fn = fn ;
this . scheduler = scheduler ;
this . active = true ;
this . deps = [ ] ;
this . parent = void 0 ;
recordEffectScope ( this , scope ) ;
}
run ( ) {
if ( ! this . active ) {
return this . fn ( ) ;
}
let parent = activeEffect ;
let lastShouldTrack = shouldTrack ;
while ( parent ) {
if ( parent === this ) {
return ;
}
parent = parent . parent ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
try {
this . parent = activeEffect ;
activeEffect = this ;
shouldTrack = true ;
trackOpBit = 1 << ++ effectTrackDepth ;
if ( effectTrackDepth <= maxMarkerBits ) {
initDepMarkers ( this ) ;
} else {
cleanupEffect ( this ) ;
}
return this . fn ( ) ;
} finally {
if ( effectTrackDepth <= maxMarkerBits ) {
finalizeDepMarkers ( this ) ;
}
trackOpBit = 1 << -- effectTrackDepth ;
activeEffect = this . parent ;
shouldTrack = lastShouldTrack ;
this . parent = void 0 ;
if ( this . deferStop ) {
this . stop ( ) ;
}
}
}
stop ( ) {
if ( activeEffect === this ) {
this . deferStop = true ;
} else if ( this . active ) {
cleanupEffect ( this ) ;
if ( this . onStop ) {
this . onStop ( ) ;
}
this . active = false ;
}
}
}
function cleanupEffect ( effect2 ) {
const { deps } = effect2 ;
if ( deps . length ) {
for ( let i = 0 ; i < deps . length ; i ++ ) {
deps [ i ] . delete ( effect2 ) ;
}
deps . length = 0 ;
}
2023-07-24 11:13:08 +08:00
}
function effect ( fn , options ) {
2023-09-06 09:51:55 +08:00
if ( fn . effect ) {
fn = fn . effect . fn ;
}
const _effect = new ReactiveEffect ( fn ) ;
if ( options ) {
extend ( _effect , options ) ;
if ( options . scope )
recordEffectScope ( _effect , options . scope ) ;
}
if ( ! options || ! options . lazy ) {
_effect . run ( ) ;
}
const runner = _effect . run . bind ( _effect ) ;
runner . effect = _effect ;
return runner ;
2023-07-24 11:13:08 +08:00
}
function stop ( runner ) {
2023-09-06 09:51:55 +08:00
runner . effect . stop ( ) ;
2023-07-24 11:13:08 +08:00
}
let shouldTrack = true ;
const trackStack = [ ] ;
function pauseTracking ( ) {
2023-09-06 09:51:55 +08:00
trackStack . push ( shouldTrack ) ;
shouldTrack = false ;
2023-07-24 11:13:08 +08:00
}
function resetTracking ( ) {
2023-09-06 09:51:55 +08:00
const last = trackStack . pop ( ) ;
shouldTrack = last === void 0 ? true : last ;
2023-07-24 11:13:08 +08:00
}
function track ( target , type , key ) {
2023-09-06 09:51:55 +08:00
if ( shouldTrack && activeEffect ) {
let depsMap = targetMap . get ( target ) ;
if ( ! depsMap ) {
targetMap . set ( target , depsMap = /* @__PURE__ */ new Map ( ) ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
let dep = depsMap . get ( key ) ;
if ( ! dep ) {
depsMap . set ( key , dep = createDep ( ) ) ;
}
const eventInfo = { effect : activeEffect , target , type , key } ;
trackEffects ( dep , eventInfo ) ;
}
2023-07-24 11:13:08 +08:00
}
function trackEffects ( dep , debuggerEventExtraInfo ) {
2023-09-06 09:51:55 +08:00
let shouldTrack2 = false ;
if ( effectTrackDepth <= maxMarkerBits ) {
if ( ! newTracked ( dep ) ) {
dep . n |= trackOpBit ;
shouldTrack2 = ! wasTracked ( dep ) ;
}
} else {
shouldTrack2 = ! dep . has ( activeEffect ) ;
}
if ( shouldTrack2 ) {
dep . add ( activeEffect ) ;
activeEffect . deps . push ( dep ) ;
if ( activeEffect . onTrack ) {
activeEffect . onTrack (
extend (
{
effect : activeEffect
} ,
debuggerEventExtraInfo
)
) ;
}
}
2023-07-24 11:13:08 +08:00
}
function trigger ( target , type , key , newValue , oldValue , oldTarget ) {
2023-09-06 09:51:55 +08:00
const depsMap = targetMap . get ( target ) ;
if ( ! depsMap ) {
return ;
}
let deps = [ ] ;
if ( type === "clear" ) {
deps = [ ... depsMap . values ( ) ] ;
} else if ( key === "length" && isArray ( target ) ) {
const newLength = Number ( newValue ) ;
depsMap . forEach ( ( dep , key2 ) => {
if ( key2 === "length" || key2 >= newLength ) {
deps . push ( dep ) ;
}
} ) ;
} else {
if ( key !== void 0 ) {
deps . push ( depsMap . get ( key ) ) ;
}
switch ( type ) {
case "add" :
if ( ! isArray ( target ) ) {
deps . push ( depsMap . get ( ITERATE _KEY ) ) ;
if ( isMap ( target ) ) {
deps . push ( depsMap . get ( MAP _KEY _ITERATE _KEY ) ) ;
}
} else if ( isIntegerKey ( key ) ) {
deps . push ( depsMap . get ( "length" ) ) ;
}
break ;
case "delete" :
if ( ! isArray ( target ) ) {
deps . push ( depsMap . get ( ITERATE _KEY ) ) ;
if ( isMap ( target ) ) {
deps . push ( depsMap . get ( MAP _KEY _ITERATE _KEY ) ) ;
}
}
break ;
case "set" :
if ( isMap ( target ) ) {
deps . push ( depsMap . get ( ITERATE _KEY ) ) ;
}
break ;
}
}
const eventInfo = { target , type , key , newValue , oldValue , oldTarget } ;
if ( deps . length === 1 ) {
if ( deps [ 0 ] ) {
{
triggerEffects ( deps [ 0 ] , eventInfo ) ;
}
}
} else {
const effects = [ ] ;
for ( const dep of deps ) {
if ( dep ) {
effects . push ( ... dep ) ;
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
{
triggerEffects ( createDep ( effects ) , eventInfo ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
function triggerEffects ( dep , debuggerEventExtraInfo ) {
2023-09-06 09:51:55 +08:00
const effects = isArray ( dep ) ? dep : [ ... dep ] ;
for ( const effect2 of effects ) {
if ( effect2 . computed ) {
triggerEffect ( effect2 , debuggerEventExtraInfo ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
for ( const effect2 of effects ) {
if ( ! effect2 . computed ) {
triggerEffect ( effect2 , debuggerEventExtraInfo ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function triggerEffect ( effect2 , debuggerEventExtraInfo ) {
if ( effect2 !== activeEffect || effect2 . allowRecurse ) {
if ( effect2 . onTrigger ) {
effect2 . onTrigger ( extend ( { effect : effect2 } , debuggerEventExtraInfo ) ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( effect2 . scheduler ) {
effect2 . scheduler ( ) ;
} else {
effect2 . run ( ) ;
}
}
}
function getDepFromReactive ( object , key ) {
var _a ;
return ( _a = targetMap . get ( object ) ) == null ? void 0 : _a . get ( key ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const isNonTrackableKeys = /* @__PURE__ */ makeMap ( ` __proto__,__v_isRef,__isVue ` ) ;
2023-07-24 11:13:08 +08:00
const builtInSymbols = new Set (
2023-09-06 09:51:55 +08:00
/* @__PURE__ */ Object . getOwnPropertyNames ( Symbol ) . filter ( ( key ) => key !== "arguments" && key !== "caller" ) . map ( ( key ) => Symbol [ key ] ) . filter ( isSymbol )
) ;
const get$1 = /* @__PURE__ */ createGetter ( ) ;
const shallowGet = /* @__PURE__ */ createGetter ( false , true ) ;
const readonlyGet = /* @__PURE__ */ createGetter ( true ) ;
const shallowReadonlyGet = /* @__PURE__ */ createGetter ( true , true ) ;
const arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations ( ) ;
2023-07-24 11:13:08 +08:00
function createArrayInstrumentations ( ) {
2023-09-06 09:51:55 +08:00
const instrumentations = { } ;
[ "includes" , "indexOf" , "lastIndexOf" ] . forEach ( ( key ) => {
instrumentations [ key ] = function ( ... args ) {
const arr = toRaw ( this ) ;
for ( let i = 0 , l = this . length ; i < l ; i ++ ) {
track ( arr , "get" , i + "" ) ;
}
const res = arr [ key ] ( ... args ) ;
if ( res === - 1 || res === false ) {
return arr [ key ] ( ... args . map ( toRaw ) ) ;
} else {
2023-07-24 11:13:08 +08:00
return res ;
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
} ) ;
[ "push" , "pop" , "shift" , "unshift" , "splice" ] . forEach ( ( key ) => {
instrumentations [ key ] = function ( ... args ) {
pauseTracking ( ) ;
const res = toRaw ( this ) [ key ] . apply ( this , args ) ;
resetTracking ( ) ;
return res ;
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
} ) ;
return instrumentations ;
}
function hasOwnProperty ( key ) {
const obj = toRaw ( this ) ;
track ( obj , "has" , key ) ;
return obj . hasOwnProperty ( key ) ;
}
function createGetter ( isReadonly2 = false , shallow = false ) {
return function get2 ( target , key , receiver ) {
if ( key === "__v_isReactive" ) {
return ! isReadonly2 ;
} else if ( key === "__v_isReadonly" ) {
return isReadonly2 ;
} else if ( key === "__v_isShallow" ) {
return shallow ;
} else if ( key === "__v_raw" && receiver === ( isReadonly2 ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap ) . get ( target ) ) {
return target ;
}
const targetIsArray = isArray ( target ) ;
if ( ! isReadonly2 ) {
if ( targetIsArray && hasOwn ( arrayInstrumentations , key ) ) {
return Reflect . get ( arrayInstrumentations , key , receiver ) ;
}
if ( key === "hasOwnProperty" ) {
return hasOwnProperty ;
}
}
const res = Reflect . get ( target , key , receiver ) ;
if ( isSymbol ( key ) ? builtInSymbols . has ( key ) : isNonTrackableKeys ( key ) ) {
return res ;
}
if ( ! isReadonly2 ) {
track ( target , "get" , key ) ;
}
if ( shallow ) {
return res ;
}
if ( isRef ( res ) ) {
return targetIsArray && isIntegerKey ( key ) ? res : res . value ;
}
if ( isObject ( res ) ) {
return isReadonly2 ? readonly ( res ) : reactive ( res ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return res ;
} ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const set$1 = /* @__PURE__ */ createSetter ( ) ;
const shallowSet = /* @__PURE__ */ createSetter ( true ) ;
function createSetter ( shallow = false ) {
return function set2 ( target , key , value , receiver ) {
let oldValue = target [ key ] ;
if ( isReadonly ( oldValue ) && isRef ( oldValue ) && ! isRef ( value ) ) {
return false ;
}
if ( ! shallow ) {
if ( ! isShallow ( value ) && ! isReadonly ( value ) ) {
oldValue = toRaw ( oldValue ) ;
value = toRaw ( value ) ;
}
if ( ! isArray ( target ) && isRef ( oldValue ) && ! isRef ( value ) ) {
oldValue . value = value ;
return true ;
}
}
const hadKey = isArray ( target ) && isIntegerKey ( key ) ? Number ( key ) < target . length : hasOwn ( target , key ) ;
const result = Reflect . set ( target , key , value , receiver ) ;
if ( target === toRaw ( receiver ) ) {
if ( ! hadKey ) {
trigger ( target , "add" , key , value ) ;
} else if ( hasChanged ( value , oldValue ) ) {
trigger ( target , "set" , key , value , oldValue ) ;
}
2023-07-24 11:13:08 +08:00
}
return result ;
2023-09-06 09:51:55 +08:00
} ;
}
function deleteProperty ( target , key ) {
const hadKey = hasOwn ( target , key ) ;
const oldValue = target [ key ] ;
const result = Reflect . deleteProperty ( target , key ) ;
if ( result && hadKey ) {
trigger ( target , "delete" , key , void 0 , oldValue ) ;
}
return result ;
}
function has$1 ( target , key ) {
const result = Reflect . has ( target , key ) ;
if ( ! isSymbol ( key ) || ! builtInSymbols . has ( key ) ) {
track ( target , "has" , key ) ;
}
return result ;
2023-07-24 11:13:08 +08:00
}
function ownKeys ( target ) {
2023-09-06 09:51:55 +08:00
track ( target , "iterate" , isArray ( target ) ? "length" : ITERATE _KEY ) ;
return Reflect . ownKeys ( target ) ;
2023-07-24 11:13:08 +08:00
}
const mutableHandlers = {
2023-09-06 09:51:55 +08:00
get : get$1 ,
set : set$1 ,
deleteProperty ,
has : has$1 ,
ownKeys
2023-07-24 11:13:08 +08:00
} ;
const readonlyHandlers = {
2023-09-06 09:51:55 +08:00
get : readonlyGet ,
set ( target , key ) {
{
warn$1 (
` Set operation on key " ${ String ( key ) } " failed: target is readonly. ` ,
target
) ;
}
return true ;
} ,
deleteProperty ( target , key ) {
{
warn$1 (
` Delete operation on key " ${ String ( key ) } " failed: target is readonly. ` ,
target
) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return true ;
}
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
const shallowReactiveHandlers = /* @__PURE__ */ extend (
{ } ,
mutableHandlers ,
{
2023-07-24 11:13:08 +08:00
get : shallowGet ,
set : shallowSet
2023-09-06 09:51:55 +08:00
}
) ;
const shallowReadonlyHandlers = /* @__PURE__ */ extend (
{ } ,
readonlyHandlers ,
{
2023-07-24 11:13:08 +08:00
get : shallowReadonlyGet
2023-09-06 09:51:55 +08:00
}
) ;
2023-07-24 11:13:08 +08:00
const toShallow = ( value ) => value ;
const getProto = ( v ) => Reflect . getPrototypeOf ( v ) ;
2023-09-06 09:51:55 +08:00
function get ( target , key , isReadonly = false , isShallow = false ) {
target = target [ "__v_raw" ] ;
const rawTarget = toRaw ( target ) ;
const rawKey = toRaw ( key ) ;
if ( ! isReadonly ) {
if ( key !== rawKey ) {
track ( rawTarget , "get" , key ) ;
}
track ( rawTarget , "get" , rawKey ) ;
}
const { has : has2 } = getProto ( rawTarget ) ;
const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive ;
if ( has2 . call ( rawTarget , key ) ) {
return wrap ( target . get ( key ) ) ;
} else if ( has2 . call ( rawTarget , rawKey ) ) {
return wrap ( target . get ( rawKey ) ) ;
} else if ( target !== rawTarget ) {
target . get ( key ) ;
}
}
function has ( key , isReadonly = false ) {
const target = this [ "__v_raw" ] ;
const rawTarget = toRaw ( target ) ;
const rawKey = toRaw ( key ) ;
if ( ! isReadonly ) {
if ( key !== rawKey ) {
track ( rawTarget , "has" , key ) ;
}
track ( rawTarget , "has" , rawKey ) ;
}
return key === rawKey ? target . has ( key ) : target . has ( key ) || target . has ( rawKey ) ;
2023-07-24 11:13:08 +08:00
}
function size ( target , isReadonly = false ) {
2023-09-06 09:51:55 +08:00
target = target [ "__v_raw" ] ;
! isReadonly && track ( toRaw ( target ) , "iterate" , ITERATE _KEY ) ;
return Reflect . get ( target , "size" , target ) ;
2023-07-24 11:13:08 +08:00
}
function add ( value ) {
2023-09-06 09:51:55 +08:00
value = toRaw ( value ) ;
const target = toRaw ( this ) ;
const proto = getProto ( target ) ;
const hadKey = proto . has . call ( target , value ) ;
if ( ! hadKey ) {
target . add ( value ) ;
trigger ( target , "add" , value , value ) ;
}
return this ;
}
function set ( key , value ) {
value = toRaw ( value ) ;
const target = toRaw ( this ) ;
const { has : has2 , get : get2 } = getProto ( target ) ;
let hadKey = has2 . call ( target , key ) ;
if ( ! hadKey ) {
key = toRaw ( key ) ;
hadKey = has2 . call ( target , key ) ;
} else {
checkIdentityKeys ( target , has2 , key ) ;
}
const oldValue = get2 . call ( target , key ) ;
target . set ( key , value ) ;
if ( ! hadKey ) {
trigger ( target , "add" , key , value ) ;
} else if ( hasChanged ( value , oldValue ) ) {
trigger ( target , "set" , key , value , oldValue ) ;
}
return this ;
2023-07-24 11:13:08 +08:00
}
function deleteEntry ( key ) {
2023-09-06 09:51:55 +08:00
const target = toRaw ( this ) ;
const { has : has2 , get : get2 } = getProto ( target ) ;
let hadKey = has2 . call ( target , key ) ;
if ( ! hadKey ) {
key = toRaw ( key ) ;
hadKey = has2 . call ( target , key ) ;
} else {
checkIdentityKeys ( target , has2 , key ) ;
}
const oldValue = get2 ? get2 . call ( target , key ) : void 0 ;
const result = target . delete ( key ) ;
if ( hadKey ) {
trigger ( target , "delete" , key , void 0 , oldValue ) ;
}
return result ;
2023-07-24 11:13:08 +08:00
}
function clear ( ) {
2023-09-06 09:51:55 +08:00
const target = toRaw ( this ) ;
const hadItems = target . size !== 0 ;
const oldTarget = isMap ( target ) ? new Map ( target ) : new Set ( target ) ;
const result = target . clear ( ) ;
if ( hadItems ) {
trigger ( target , "clear" , void 0 , void 0 , oldTarget ) ;
}
return result ;
2023-07-24 11:13:08 +08:00
}
function createForEach ( isReadonly , isShallow ) {
2023-09-06 09:51:55 +08:00
return function forEach ( callback , thisArg ) {
const observed = this ;
const target = observed [ "__v_raw" ] ;
const rawTarget = toRaw ( target ) ;
const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive ;
! isReadonly && track ( rawTarget , "iterate" , ITERATE _KEY ) ;
return target . forEach ( ( value , key ) => {
return callback . call ( thisArg , wrap ( value ) , wrap ( key ) , observed ) ;
} ) ;
} ;
2023-07-24 11:13:08 +08:00
}
function createIterableMethod ( method , isReadonly , isShallow ) {
2023-09-06 09:51:55 +08:00
return function ( ... args ) {
const target = this [ "__v_raw" ] ;
const rawTarget = toRaw ( target ) ;
const targetIsMap = isMap ( rawTarget ) ;
const isPair = method === "entries" || method === Symbol . iterator && targetIsMap ;
const isKeyOnly = method === "keys" && targetIsMap ;
const innerIterator = target [ method ] ( ... args ) ;
const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive ;
! isReadonly && track (
rawTarget ,
"iterate" ,
isKeyOnly ? MAP _KEY _ITERATE _KEY : ITERATE _KEY
) ;
return {
// iterator protocol
next ( ) {
const { value , done } = innerIterator . next ( ) ;
return done ? { value , done } : {
value : isPair ? [ wrap ( value [ 0 ] ) , wrap ( value [ 1 ] ) ] : wrap ( value ) ,
done
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
} ,
// iterable protocol
[ Symbol . iterator ] ( ) {
return this ;
}
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
} ;
2023-07-24 11:13:08 +08:00
}
function createReadonlyMethod ( type ) {
2023-09-06 09:51:55 +08:00
return function ( ... args ) {
{
const key = args [ 0 ] ? ` on key " ${ args [ 0 ] } " ` : ` ` ;
console . warn (
` ${ capitalize ( type ) } operation ${ key } failed: target is readonly. ` ,
toRaw ( this )
) ;
}
return type === "delete" ? false : this ;
} ;
2023-07-24 11:13:08 +08:00
}
function createInstrumentations ( ) {
2023-09-06 09:51:55 +08:00
const mutableInstrumentations2 = {
get ( key ) {
return get ( this , key ) ;
} ,
get size ( ) {
return size ( this ) ;
} ,
has ,
add ,
set ,
delete : deleteEntry ,
clear ,
forEach : createForEach ( false , false )
} ;
const shallowInstrumentations2 = {
get ( key ) {
return get ( this , key , false , true ) ;
} ,
get size ( ) {
return size ( this ) ;
} ,
has ,
add ,
set ,
delete : deleteEntry ,
clear ,
forEach : createForEach ( false , true )
} ;
const readonlyInstrumentations2 = {
get ( key ) {
return get ( this , key , true ) ;
} ,
get size ( ) {
return size ( this , true ) ;
} ,
has ( key ) {
return has . call ( this , key , true ) ;
} ,
add : createReadonlyMethod ( "add" ) ,
set : createReadonlyMethod ( "set" ) ,
delete : createReadonlyMethod ( "delete" ) ,
clear : createReadonlyMethod ( "clear" ) ,
forEach : createForEach ( true , false )
} ;
const shallowReadonlyInstrumentations2 = {
get ( key ) {
return get ( this , key , true , true ) ;
} ,
get size ( ) {
return size ( this , true ) ;
} ,
has ( key ) {
return has . call ( this , key , true ) ;
} ,
add : createReadonlyMethod ( "add" ) ,
set : createReadonlyMethod ( "set" ) ,
delete : createReadonlyMethod ( "delete" ) ,
clear : createReadonlyMethod ( "clear" ) ,
forEach : createForEach ( true , true )
} ;
const iteratorMethods = [ "keys" , "values" , "entries" , Symbol . iterator ] ;
iteratorMethods . forEach ( ( method ) => {
mutableInstrumentations2 [ method ] = createIterableMethod (
method ,
false ,
false
) ;
readonlyInstrumentations2 [ method ] = createIterableMethod (
method ,
true ,
false
) ;
shallowInstrumentations2 [ method ] = createIterableMethod (
method ,
false ,
true
) ;
shallowReadonlyInstrumentations2 [ method ] = createIterableMethod (
method ,
true ,
true
) ;
} ) ;
return [
mutableInstrumentations2 ,
readonlyInstrumentations2 ,
shallowInstrumentations2 ,
shallowReadonlyInstrumentations2
] ;
}
const [
mutableInstrumentations ,
readonlyInstrumentations ,
shallowInstrumentations ,
shallowReadonlyInstrumentations
] = /* @__PURE__ */ createInstrumentations ( ) ;
2023-07-24 11:13:08 +08:00
function createInstrumentationGetter ( isReadonly , shallow ) {
2023-09-06 09:51:55 +08:00
const instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations ;
return ( target , key , receiver ) => {
if ( key === "__v_isReactive" ) {
return ! isReadonly ;
} else if ( key === "__v_isReadonly" ) {
return isReadonly ;
} else if ( key === "__v_raw" ) {
return target ;
}
return Reflect . get (
hasOwn ( instrumentations , key ) && key in target ? instrumentations : target ,
key ,
receiver
) ;
} ;
2023-07-24 11:13:08 +08:00
}
const mutableCollectionHandlers = {
2023-09-06 09:51:55 +08:00
get : /* @__PURE__ */ createInstrumentationGetter ( false , false )
2023-07-24 11:13:08 +08:00
} ;
const shallowCollectionHandlers = {
2023-09-06 09:51:55 +08:00
get : /* @__PURE__ */ createInstrumentationGetter ( false , true )
2023-07-24 11:13:08 +08:00
} ;
const readonlyCollectionHandlers = {
2023-09-06 09:51:55 +08:00
get : /* @__PURE__ */ createInstrumentationGetter ( true , false )
2023-07-24 11:13:08 +08:00
} ;
const shallowReadonlyCollectionHandlers = {
2023-09-06 09:51:55 +08:00
get : /* @__PURE__ */ createInstrumentationGetter ( true , true )
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
function checkIdentityKeys ( target , has2 , key ) {
const rawKey = toRaw ( key ) ;
if ( rawKey !== key && has2 . call ( target , rawKey ) ) {
const type = toRawType ( target ) ;
console . warn (
` Reactive ${ type } contains both the raw and reactive versions of the same object ${ type === ` Map ` ? ` as keys ` : ` ` } , which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible. `
) ;
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const reactiveMap = /* @__PURE__ */ new WeakMap ( ) ;
const shallowReactiveMap = /* @__PURE__ */ new WeakMap ( ) ;
const readonlyMap = /* @__PURE__ */ new WeakMap ( ) ;
const shallowReadonlyMap = /* @__PURE__ */ new WeakMap ( ) ;
2023-07-24 11:13:08 +08:00
function targetTypeMap ( rawType ) {
2023-09-06 09:51:55 +08:00
switch ( rawType ) {
case "Object" :
case "Array" :
return 1 /* COMMON */ ;
case "Map" :
case "Set" :
case "WeakMap" :
case "WeakSet" :
return 2 /* COLLECTION */ ;
default :
return 0 /* INVALID */ ;
}
2023-07-24 11:13:08 +08:00
}
function getTargetType ( value ) {
2023-09-06 09:51:55 +08:00
return value [ "__v_skip" ] || ! Object . isExtensible ( value ) ? 0 /* INVALID */ : targetTypeMap ( toRawType ( value ) ) ;
2023-07-24 11:13:08 +08:00
}
function reactive ( target ) {
2023-09-06 09:51:55 +08:00
if ( isReadonly ( target ) ) {
return target ;
}
return createReactiveObject (
target ,
false ,
mutableHandlers ,
mutableCollectionHandlers ,
reactiveMap
) ;
2023-07-24 11:13:08 +08:00
}
function shallowReactive ( target ) {
2023-09-06 09:51:55 +08:00
return createReactiveObject (
target ,
false ,
shallowReactiveHandlers ,
shallowCollectionHandlers ,
shallowReactiveMap
) ;
2023-07-24 11:13:08 +08:00
}
function readonly ( target ) {
2023-09-06 09:51:55 +08:00
return createReactiveObject (
target ,
true ,
readonlyHandlers ,
readonlyCollectionHandlers ,
readonlyMap
) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function shallowReadonly ( target ) {
return createReactiveObject (
target ,
true ,
shallowReadonlyHandlers ,
shallowReadonlyCollectionHandlers ,
shallowReadonlyMap
) ;
}
function createReactiveObject ( target , isReadonly2 , baseHandlers , collectionHandlers , proxyMap ) {
if ( ! isObject ( target ) ) {
{
console . warn ( ` value cannot be made reactive: ${ String ( target ) } ` ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return target ;
}
if ( target [ "__v_raw" ] && ! ( isReadonly2 && target [ "__v_isReactive" ] ) ) {
return target ;
}
const existingProxy = proxyMap . get ( target ) ;
if ( existingProxy ) {
return existingProxy ;
}
const targetType = getTargetType ( target ) ;
if ( targetType === 0 /* INVALID */ ) {
return target ;
}
const proxy = new Proxy (
target ,
targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers
) ;
proxyMap . set ( target , proxy ) ;
return proxy ;
2023-07-24 11:13:08 +08:00
}
function isReactive ( value ) {
2023-09-06 09:51:55 +08:00
if ( isReadonly ( value ) ) {
return isReactive ( value [ "__v_raw" ] ) ;
}
return ! ! ( value && value [ "__v_isReactive" ] ) ;
2023-07-24 11:13:08 +08:00
}
function isReadonly ( value ) {
2023-09-06 09:51:55 +08:00
return ! ! ( value && value [ "__v_isReadonly" ] ) ;
2023-07-24 11:13:08 +08:00
}
function isShallow ( value ) {
2023-09-06 09:51:55 +08:00
return ! ! ( value && value [ "__v_isShallow" ] ) ;
2023-07-24 11:13:08 +08:00
}
function isProxy ( value ) {
2023-09-06 09:51:55 +08:00
return isReactive ( value ) || isReadonly ( value ) ;
2023-07-24 11:13:08 +08:00
}
function toRaw ( observed ) {
2023-09-06 09:51:55 +08:00
const raw = observed && observed [ "__v_raw" ] ;
return raw ? toRaw ( raw ) : observed ;
2023-07-24 11:13:08 +08:00
}
function markRaw ( value ) {
2023-09-06 09:51:55 +08:00
def ( value , "__v_skip" , true ) ;
return value ;
2023-07-24 11:13:08 +08:00
}
const toReactive = ( value ) => isObject ( value ) ? reactive ( value ) : value ;
const toReadonly = ( value ) => isObject ( value ) ? readonly ( value ) : value ;
2023-09-06 09:51:55 +08:00
function trackRefValue ( ref2 ) {
if ( shouldTrack && activeEffect ) {
ref2 = toRaw ( ref2 ) ;
{
trackEffects ( ref2 . dep || ( ref2 . dep = createDep ( ) ) , {
target : ref2 ,
type : "get" ,
key : "value"
} ) ;
}
}
}
function triggerRefValue ( ref2 , newVal ) {
ref2 = toRaw ( ref2 ) ;
const dep = ref2 . dep ;
if ( dep ) {
{
triggerEffects ( dep , {
target : ref2 ,
type : "set" ,
key : "value" ,
newValue : newVal
} ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
function isRef ( r ) {
2023-09-06 09:51:55 +08:00
return ! ! ( r && r . _ _v _isRef === true ) ;
2023-07-24 11:13:08 +08:00
}
function ref ( value ) {
2023-09-06 09:51:55 +08:00
return createRef ( value , false ) ;
2023-07-24 11:13:08 +08:00
}
function shallowRef ( value ) {
2023-09-06 09:51:55 +08:00
return createRef ( value , true ) ;
2023-07-24 11:13:08 +08:00
}
function createRef ( rawValue , shallow ) {
2023-09-06 09:51:55 +08:00
if ( isRef ( rawValue ) ) {
return rawValue ;
}
return new RefImpl ( rawValue , shallow ) ;
2023-07-24 11:13:08 +08:00
}
class RefImpl {
2023-09-06 09:51:55 +08:00
constructor ( value , _ _v _isShallow ) {
this . _ _v _isShallow = _ _v _isShallow ;
this . dep = void 0 ;
this . _ _v _isRef = true ;
this . _rawValue = _ _v _isShallow ? value : toRaw ( value ) ;
this . _value = _ _v _isShallow ? value : toReactive ( value ) ;
}
get value ( ) {
trackRefValue ( this ) ;
return this . _value ;
}
set value ( newVal ) {
const useDirectValue = this . _ _v _isShallow || isShallow ( newVal ) || isReadonly ( newVal ) ;
newVal = useDirectValue ? newVal : toRaw ( newVal ) ;
if ( hasChanged ( newVal , this . _rawValue ) ) {
this . _rawValue = newVal ;
this . _value = useDirectValue ? newVal : toReactive ( newVal ) ;
triggerRefValue ( this , newVal ) ;
}
}
}
function triggerRef ( ref2 ) {
triggerRefValue ( ref2 , ref2 . value ) ;
}
function unref ( ref2 ) {
return isRef ( ref2 ) ? ref2 . value : ref2 ;
}
function toValue ( source ) {
return isFunction ( source ) ? source ( ) : unref ( source ) ;
2023-07-24 11:13:08 +08:00
}
const shallowUnwrapHandlers = {
2023-09-06 09:51:55 +08:00
get : ( target , key , receiver ) => unref ( Reflect . get ( target , key , receiver ) ) ,
set : ( target , key , value , receiver ) => {
const oldValue = target [ key ] ;
if ( isRef ( oldValue ) && ! isRef ( value ) ) {
oldValue . value = value ;
return true ;
} else {
return Reflect . set ( target , key , value , receiver ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
} ;
function proxyRefs ( objectWithRefs ) {
2023-09-06 09:51:55 +08:00
return isReactive ( objectWithRefs ) ? objectWithRefs : new Proxy ( objectWithRefs , shallowUnwrapHandlers ) ;
2023-07-24 11:13:08 +08:00
}
class CustomRefImpl {
2023-09-06 09:51:55 +08:00
constructor ( factory ) {
this . dep = void 0 ;
this . _ _v _isRef = true ;
const { get , set } = factory (
( ) => trackRefValue ( this ) ,
( ) => triggerRefValue ( this )
) ;
this . _get = get ;
this . _set = set ;
}
get value ( ) {
return this . _get ( ) ;
}
set value ( newVal ) {
this . _set ( newVal ) ;
}
2023-07-24 11:13:08 +08:00
}
function customRef ( factory ) {
2023-09-06 09:51:55 +08:00
return new CustomRefImpl ( factory ) ;
2023-07-24 11:13:08 +08:00
}
function toRefs ( object ) {
2023-09-06 09:51:55 +08:00
if ( ! isProxy ( object ) ) {
console . warn ( ` toRefs() expects a reactive object but received a plain one. ` ) ;
}
const ret = isArray ( object ) ? new Array ( object . length ) : { } ;
for ( const key in object ) {
ret [ key ] = propertyToRef ( object , key ) ;
}
return ret ;
2023-07-24 11:13:08 +08:00
}
class ObjectRefImpl {
2023-09-06 09:51:55 +08:00
constructor ( _object , _key , _defaultValue ) {
this . _object = _object ;
this . _key = _key ;
this . _defaultValue = _defaultValue ;
this . _ _v _isRef = true ;
}
get value ( ) {
const val = this . _object [ this . _key ] ;
return val === void 0 ? this . _defaultValue : val ;
}
set value ( newVal ) {
this . _object [ this . _key ] = newVal ;
}
get dep ( ) {
return getDepFromReactive ( toRaw ( this . _object ) , this . _key ) ;
}
}
class GetterRefImpl {
constructor ( _getter ) {
this . _getter = _getter ;
this . _ _v _isRef = true ;
this . _ _v _isReadonly = true ;
}
get value ( ) {
return this . _getter ( ) ;
}
}
function toRef ( source , key , defaultValue ) {
if ( isRef ( source ) ) {
return source ;
} else if ( isFunction ( source ) ) {
return new GetterRefImpl ( source ) ;
} else if ( isObject ( source ) && arguments . length > 1 ) {
return propertyToRef ( source , key , defaultValue ) ;
} else {
return ref ( source ) ;
}
}
function propertyToRef ( source , key , defaultValue ) {
const val = source [ key ] ;
return isRef ( val ) ? val : new ObjectRefImpl (
source ,
key ,
defaultValue
) ;
2023-07-24 11:13:08 +08:00
}
class ComputedRefImpl {
2023-09-06 09:51:55 +08:00
constructor ( getter , _setter , isReadonly , isSSR ) {
this . _setter = _setter ;
this . dep = void 0 ;
this . _ _v _isRef = true ;
this [ "__v_isReadonly" ] = false ;
this . _dirty = true ;
this . effect = new ReactiveEffect ( getter , ( ) => {
if ( ! this . _dirty ) {
2023-07-24 11:13:08 +08:00
this . _dirty = true ;
2023-09-06 09:51:55 +08:00
triggerRefValue ( this ) ;
}
} ) ;
this . effect . computed = this ;
this . effect . active = this . _cacheable = ! isSSR ;
this [ "__v_isReadonly" ] = isReadonly ;
}
get value ( ) {
const self = toRaw ( this ) ;
trackRefValue ( self ) ;
if ( self . _dirty || ! self . _cacheable ) {
self . _dirty = false ;
self . _value = self . effect . run ( ) ;
}
return self . _value ;
}
set value ( newValue ) {
this . _setter ( newValue ) ;
}
}
function computed$1 ( getterOrOptions , debugOptions , isSSR = false ) {
let getter ;
let setter ;
const onlyGetter = isFunction ( getterOrOptions ) ;
if ( onlyGetter ) {
getter = getterOrOptions ;
setter = ( ) => {
console . warn ( "Write operation failed: computed value is readonly" ) ;
} ;
} else {
getter = getterOrOptions . get ;
setter = getterOrOptions . set ;
}
const cRef = new ComputedRefImpl ( getter , setter , onlyGetter || ! setter , isSSR ) ;
if ( debugOptions && ! isSSR ) {
cRef . effect . onTrack = debugOptions . onTrack ;
cRef . effect . onTrigger = debugOptions . onTrigger ;
}
return cRef ;
2023-07-24 11:13:08 +08:00
}
const stack = [ ] ;
function pushWarningContext ( vnode ) {
2023-09-06 09:51:55 +08:00
stack . push ( vnode ) ;
2023-07-24 11:13:08 +08:00
}
function popWarningContext ( ) {
2023-09-06 09:51:55 +08:00
stack . pop ( ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function warn ( msg , ... args ) {
pauseTracking ( ) ;
const instance = stack . length ? stack [ stack . length - 1 ] . component : null ;
const appWarnHandler = instance && instance . appContext . config . warnHandler ;
const trace = getComponentTrace ( ) ;
if ( appWarnHandler ) {
callWithErrorHandling (
appWarnHandler ,
instance ,
11 ,
[
msg + args . join ( "" ) ,
instance && instance . proxy ,
trace . map (
( { vnode } ) => ` at < ${ formatComponentName ( instance , vnode . type ) } > `
) . join ( "\n" ) ,
trace
]
) ;
} else {
const warnArgs = [ ` [Vue warn]: ${ msg } ` , ... args ] ;
if ( trace . length && // avoid spamming console during tests
true ) {
warnArgs . push ( `
` , ...formatTrace(trace));
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
console . warn ( ... warnArgs ) ;
}
resetTracking ( ) ;
2023-07-24 11:13:08 +08:00
}
function getComponentTrace ( ) {
2023-09-06 09:51:55 +08:00
let currentVNode = stack [ stack . length - 1 ] ;
if ( ! currentVNode ) {
return [ ] ;
}
const normalizedStack = [ ] ;
while ( currentVNode ) {
const last = normalizedStack [ 0 ] ;
if ( last && last . vnode === currentVNode ) {
last . recurseCount ++ ;
} else {
normalizedStack . push ( {
vnode : currentVNode ,
recurseCount : 0
} ) ;
}
const parentInstance = currentVNode . component && currentVNode . component . parent ;
currentVNode = parentInstance && parentInstance . vnode ;
}
return normalizedStack ;
2023-07-24 11:13:08 +08:00
}
function formatTrace ( trace ) {
2023-09-06 09:51:55 +08:00
const logs = [ ] ;
trace . forEach ( ( entry , i ) => {
logs . push ( ... i === 0 ? [ ] : [ `
` ], ...formatTraceEntry(entry));
} ) ;
return logs ;
2023-07-24 11:13:08 +08:00
}
function formatTraceEntry ( { vnode , recurseCount } ) {
2023-09-06 09:51:55 +08:00
const postfix = recurseCount > 0 ? ` ... ( ${ recurseCount } recursive calls) ` : ` ` ;
const isRoot = vnode . component ? vnode . component . parent == null : false ;
const open = ` at < ${ formatComponentName (
vnode . component ,
vnode . type ,
isRoot
) } ` ;
const close = ` > ` + postfix ;
return vnode . props ? [ open , ... formatProps ( vnode . props ) , close ] : [ open + close ] ;
}
2023-07-24 11:13:08 +08:00
function formatProps ( props ) {
2023-09-06 09:51:55 +08:00
const res = [ ] ;
const keys = Object . keys ( props ) ;
keys . slice ( 0 , 3 ) . forEach ( ( key ) => {
res . push ( ... formatProp ( key , props [ key ] ) ) ;
} ) ;
if ( keys . length > 3 ) {
res . push ( ` ... ` ) ;
}
return res ;
2023-07-24 11:13:08 +08:00
}
function formatProp ( key , value , raw ) {
2023-09-06 09:51:55 +08:00
if ( isString ( value ) ) {
value = JSON . stringify ( value ) ;
return raw ? value : [ ` ${ key } = ${ value } ` ] ;
} else if ( typeof value === "number" || typeof value === "boolean" || value == null ) {
return raw ? value : [ ` ${ key } = ${ value } ` ] ;
} else if ( isRef ( value ) ) {
value = formatProp ( key , toRaw ( value . value ) , true ) ;
return raw ? value : [ ` ${ key } =Ref< ` , value , ` > ` ] ;
} else if ( isFunction ( value ) ) {
return [ ` ${ key } =fn ${ value . name ? ` < ${ value . name } > ` : ` ` } ` ] ;
} else {
value = toRaw ( value ) ;
return raw ? value : [ ` ${ key } = ` , value ] ;
}
}
function assertNumber ( val , type ) {
if ( val === void 0 ) {
return ;
} else if ( typeof val !== "number" ) {
warn ( ` ${ type } is not a valid number - got ${ JSON . stringify ( val ) } . ` ) ;
} else if ( isNaN ( val ) ) {
warn ( ` ${ type } is NaN - the duration expression might be incorrect. ` ) ;
}
2023-07-24 11:13:08 +08:00
}
const ErrorTypeStrings = {
2023-09-06 09:51:55 +08:00
[ "sp" ] : "serverPrefetch hook" ,
[ "bc" ] : "beforeCreate hook" ,
[ "c" ] : "created hook" ,
[ "bm" ] : "beforeMount hook" ,
[ "m" ] : "mounted hook" ,
[ "bu" ] : "beforeUpdate hook" ,
[ "u" ] : "updated" ,
[ "bum" ] : "beforeUnmount hook" ,
[ "um" ] : "unmounted hook" ,
[ "a" ] : "activated hook" ,
[ "da" ] : "deactivated hook" ,
[ "ec" ] : "errorCaptured hook" ,
[ "rtc" ] : "renderTracked hook" ,
[ "rtg" ] : "renderTriggered hook" ,
[ 0 ] : "setup function" ,
[ 1 ] : "render function" ,
[ 2 ] : "watcher getter" ,
[ 3 ] : "watcher callback" ,
[ 4 ] : "watcher cleanup function" ,
[ 5 ] : "native event handler" ,
[ 6 ] : "component event handler" ,
[ 7 ] : "vnode hook" ,
[ 8 ] : "directive hook" ,
[ 9 ] : "transition hook" ,
[ 10 ] : "app errorHandler" ,
[ 11 ] : "app warnHandler" ,
[ 12 ] : "ref function" ,
[ 13 ] : "async component loader" ,
[ 14 ] : "scheduler flush. This is likely a Vue internals bug. Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/core"
2023-07-24 11:13:08 +08:00
} ;
function callWithErrorHandling ( fn , instance , type , args ) {
2023-09-06 09:51:55 +08:00
let res ;
try {
res = args ? fn ( ... args ) : fn ( ) ;
} catch ( err ) {
handleError ( err , instance , type ) ;
}
return res ;
2023-07-24 11:13:08 +08:00
}
function callWithAsyncErrorHandling ( fn , instance , type , args ) {
2023-09-06 09:51:55 +08:00
if ( isFunction ( fn ) ) {
const res = callWithErrorHandling ( fn , instance , type , args ) ;
if ( res && isPromise ( res ) ) {
res . catch ( ( err ) => {
handleError ( err , instance , type ) ;
} ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return res ;
}
const values = [ ] ;
for ( let i = 0 ; i < fn . length ; i ++ ) {
values . push ( callWithAsyncErrorHandling ( fn [ i ] , instance , type , args ) ) ;
}
return values ;
2023-07-24 11:13:08 +08:00
}
function handleError ( err , instance , type , throwInDev = true ) {
2023-09-06 09:51:55 +08:00
const contextVNode = instance ? instance . vnode : null ;
if ( instance ) {
let cur = instance . parent ;
const exposedInstance = instance . proxy ;
const errorInfo = ErrorTypeStrings [ type ] ;
while ( cur ) {
const errorCapturedHooks = cur . ec ;
if ( errorCapturedHooks ) {
for ( let i = 0 ; i < errorCapturedHooks . length ; i ++ ) {
if ( errorCapturedHooks [ i ] ( err , exposedInstance , errorInfo ) === false ) {
2023-07-24 11:13:08 +08:00
return ;
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
cur = cur . parent ;
}
const appErrorHandler = instance . appContext . config . errorHandler ;
if ( appErrorHandler ) {
callWithErrorHandling (
appErrorHandler ,
null ,
10 ,
[ err , exposedInstance , errorInfo ]
) ;
return ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
logError ( err , type , contextVNode , throwInDev ) ;
2023-07-24 11:13:08 +08:00
}
function logError ( err , type , contextVNode , throwInDev = true ) {
2023-09-06 09:51:55 +08:00
{
const info = ErrorTypeStrings [ type ] ;
if ( contextVNode ) {
pushWarningContext ( contextVNode ) ;
}
warn ( ` Unhandled error ${ info ? ` during execution of ${ info } ` : ` ` } ` ) ;
if ( contextVNode ) {
popWarningContext ( ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( throwInDev ) {
throw err ;
} else {
console . error ( err ) ;
}
}
2023-07-24 11:13:08 +08:00
}
let isFlushing = false ;
let isFlushPending = false ;
const queue = [ ] ;
let flushIndex = 0 ;
const pendingPostFlushCbs = [ ] ;
let activePostFlushCbs = null ;
let postFlushIndex = 0 ;
2023-09-06 09:51:55 +08:00
const resolvedPromise = /* @__PURE__ */ Promise . resolve ( ) ;
2023-07-24 11:13:08 +08:00
let currentFlushPromise = null ;
const RECURSION _LIMIT = 100 ;
function nextTick ( fn ) {
2023-09-06 09:51:55 +08:00
const p = currentFlushPromise || resolvedPromise ;
return fn ? p . then ( this ? fn . bind ( this ) : fn ) : p ;
2023-07-24 11:13:08 +08:00
}
function findInsertionIndex ( id ) {
2023-09-06 09:51:55 +08:00
let start = flushIndex + 1 ;
let end = queue . length ;
while ( start < end ) {
const middle = start + end >>> 1 ;
const middleJobId = getId ( queue [ middle ] ) ;
middleJobId < id ? start = middle + 1 : end = middle ;
}
return start ;
2023-07-24 11:13:08 +08:00
}
function queueJob ( job ) {
2023-09-06 09:51:55 +08:00
if ( ! queue . length || ! queue . includes (
job ,
isFlushing && job . allowRecurse ? flushIndex + 1 : flushIndex
) ) {
if ( job . id == null ) {
queue . push ( job ) ;
} else {
queue . splice ( findInsertionIndex ( job . id ) , 0 , job ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
queueFlush ( ) ;
}
2023-07-24 11:13:08 +08:00
}
function queueFlush ( ) {
2023-09-06 09:51:55 +08:00
if ( ! isFlushing && ! isFlushPending ) {
isFlushPending = true ;
currentFlushPromise = resolvedPromise . then ( flushJobs ) ;
}
2023-07-24 11:13:08 +08:00
}
function invalidateJob ( job ) {
2023-09-06 09:51:55 +08:00
const i = queue . indexOf ( job ) ;
if ( i > flushIndex ) {
queue . splice ( i , 1 ) ;
}
2023-07-24 11:13:08 +08:00
}
function queuePostFlushCb ( cb ) {
2023-09-06 09:51:55 +08:00
if ( ! isArray ( cb ) ) {
if ( ! activePostFlushCbs || ! activePostFlushCbs . includes (
cb ,
cb . allowRecurse ? postFlushIndex + 1 : postFlushIndex
) ) {
pendingPostFlushCbs . push ( cb ) ;
}
} else {
pendingPostFlushCbs . push ( ... cb ) ;
}
queueFlush ( ) ;
}
function flushPreFlushCbs ( seen , i = isFlushing ? flushIndex + 1 : 0 ) {
{
seen = seen || /* @__PURE__ */ new Map ( ) ;
}
for ( ; i < queue . length ; i ++ ) {
const cb = queue [ i ] ;
if ( cb && cb . pre ) {
if ( checkRecursiveUpdates ( seen , cb ) ) {
continue ;
}
queue . splice ( i , 1 ) ;
i -- ;
cb ( ) ;
}
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function flushPostFlushCbs ( seen ) {
if ( pendingPostFlushCbs . length ) {
const deduped = [ ... new Set ( pendingPostFlushCbs ) ] ;
pendingPostFlushCbs . length = 0 ;
if ( activePostFlushCbs ) {
activePostFlushCbs . push ( ... deduped ) ;
return ;
}
activePostFlushCbs = deduped ;
2023-07-24 11:13:08 +08:00
{
2023-09-06 09:51:55 +08:00
seen = seen || /* @__PURE__ */ new Map ( ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
activePostFlushCbs . sort ( ( a , b ) => getId ( a ) - getId ( b ) ) ;
for ( postFlushIndex = 0 ; postFlushIndex < activePostFlushCbs . length ; postFlushIndex ++ ) {
if ( checkRecursiveUpdates ( seen , activePostFlushCbs [ postFlushIndex ] ) ) {
continue ;
}
activePostFlushCbs [ postFlushIndex ] ( ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
activePostFlushCbs = null ;
postFlushIndex = 0 ;
}
2023-07-24 11:13:08 +08:00
}
const getId = ( job ) => job . id == null ? Infinity : job . id ;
const comparator = ( a , b ) => {
2023-09-06 09:51:55 +08:00
const diff = getId ( a ) - getId ( b ) ;
if ( diff === 0 ) {
if ( a . pre && ! b . pre )
return - 1 ;
if ( b . pre && ! a . pre )
return 1 ;
}
return diff ;
2023-07-24 11:13:08 +08:00
} ;
function flushJobs ( seen ) {
2023-09-06 09:51:55 +08:00
isFlushPending = false ;
isFlushing = true ;
{
seen = seen || /* @__PURE__ */ new Map ( ) ;
}
queue . sort ( comparator ) ;
const check = ( job ) => checkRecursiveUpdates ( seen , job ) ;
try {
for ( flushIndex = 0 ; flushIndex < queue . length ; flushIndex ++ ) {
const job = queue [ flushIndex ] ;
if ( job && job . active !== false ) {
if ( check ( job ) ) {
continue ;
}
callWithErrorHandling ( job , null , 14 ) ;
}
}
} finally {
flushIndex = 0 ;
queue . length = 0 ;
flushPostFlushCbs ( seen ) ;
isFlushing = false ;
currentFlushPromise = null ;
if ( queue . length || pendingPostFlushCbs . length ) {
flushJobs ( seen ) ;
}
}
2023-07-24 11:13:08 +08:00
}
function checkRecursiveUpdates ( seen , fn ) {
2023-09-06 09:51:55 +08:00
if ( ! seen . has ( fn ) ) {
seen . set ( fn , 1 ) ;
} else {
const count = seen . get ( fn ) ;
if ( count > RECURSION _LIMIT ) {
const instance = fn . ownerInstance ;
const componentName = instance && getComponentName ( instance . type ) ;
warn (
` Maximum recursive updates exceeded ${ componentName ? ` in component < ${ componentName } > ` : ` ` } . This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function. `
) ;
return true ;
} else {
seen . set ( fn , count + 1 ) ;
}
}
2023-07-24 11:13:08 +08:00
}
let isHmrUpdating = false ;
2023-09-06 09:51:55 +08:00
const hmrDirtyComponents = /* @__PURE__ */ new Set ( ) ;
2023-07-24 11:13:08 +08:00
{
2023-09-06 09:51:55 +08:00
getGlobalThis ( ) . _ _VUE _HMR _RUNTIME _ _ = {
createRecord : tryWrap ( createRecord ) ,
rerender : tryWrap ( rerender ) ,
reload : tryWrap ( reload )
} ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const map = /* @__PURE__ */ new Map ( ) ;
2023-07-24 11:13:08 +08:00
function registerHMR ( instance ) {
2023-09-06 09:51:55 +08:00
const id = instance . type . _ _hmrId ;
let record = map . get ( id ) ;
if ( ! record ) {
createRecord ( id , instance . type ) ;
record = map . get ( id ) ;
}
record . instances . add ( instance ) ;
2023-07-24 11:13:08 +08:00
}
function unregisterHMR ( instance ) {
2023-09-06 09:51:55 +08:00
map . get ( instance . type . _ _hmrId ) . instances . delete ( instance ) ;
2023-07-24 11:13:08 +08:00
}
function createRecord ( id , initialDef ) {
2023-09-06 09:51:55 +08:00
if ( map . has ( id ) ) {
return false ;
}
map . set ( id , {
initialDef : normalizeClassComponent ( initialDef ) ,
instances : /* @__PURE__ */ new Set ( )
} ) ;
return true ;
2023-07-24 11:13:08 +08:00
}
function normalizeClassComponent ( component ) {
2023-09-06 09:51:55 +08:00
return isClassComponent ( component ) ? component . _ _vccOpts : component ;
2023-07-24 11:13:08 +08:00
}
function rerender ( id , newRender ) {
2023-09-06 09:51:55 +08:00
const record = map . get ( id ) ;
if ( ! record ) {
return ;
}
record . initialDef . render = newRender ;
[ ... record . instances ] . forEach ( ( instance ) => {
if ( newRender ) {
instance . render = newRender ;
normalizeClassComponent ( instance . type ) . render = newRender ;
}
instance . renderCache = [ ] ;
isHmrUpdating = true ;
instance . update ( ) ;
isHmrUpdating = false ;
} ) ;
2023-07-24 11:13:08 +08:00
}
function reload ( id , newComp ) {
2023-09-06 09:51:55 +08:00
const record = map . get ( id ) ;
if ( ! record )
return ;
newComp = normalizeClassComponent ( newComp ) ;
updateComponentDef ( record . initialDef , newComp ) ;
const instances = [ ... record . instances ] ;
for ( const instance of instances ) {
const oldComp = normalizeClassComponent ( instance . type ) ;
if ( ! hmrDirtyComponents . has ( oldComp ) ) {
if ( oldComp !== record . initialDef ) {
updateComponentDef ( oldComp , newComp ) ;
}
hmrDirtyComponents . add ( oldComp ) ;
}
instance . appContext . propsCache . delete ( instance . type ) ;
instance . appContext . emitsCache . delete ( instance . type ) ;
instance . appContext . optionsCache . delete ( instance . type ) ;
if ( instance . ceReload ) {
hmrDirtyComponents . add ( oldComp ) ;
instance . ceReload ( newComp . styles ) ;
hmrDirtyComponents . delete ( oldComp ) ;
} else if ( instance . parent ) {
queueJob ( instance . parent . update ) ;
} else if ( instance . appContext . reload ) {
instance . appContext . reload ( ) ;
} else if ( typeof window !== "undefined" ) {
window . location . reload ( ) ;
} else {
console . warn (
"[HMR] Root or manually mounted instance modified. Full reload required."
) ;
}
}
queuePostFlushCb ( ( ) => {
2023-07-24 11:13:08 +08:00
for ( const instance of instances ) {
2023-09-06 09:51:55 +08:00
hmrDirtyComponents . delete (
normalizeClassComponent ( instance . type )
) ;
}
} ) ;
2023-07-24 11:13:08 +08:00
}
function updateComponentDef ( oldComp , newComp ) {
2023-09-06 09:51:55 +08:00
extend ( oldComp , newComp ) ;
for ( const key in oldComp ) {
if ( key !== "__file" && ! ( key in newComp ) ) {
delete oldComp [ key ] ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
function tryWrap ( fn ) {
2023-09-06 09:51:55 +08:00
return ( id , arg ) => {
try {
return fn ( id , arg ) ;
} catch ( e ) {
console . error ( e ) ;
console . warn (
` [HMR] Something went wrong during Vue component hot-reload. Full reload required. `
) ;
}
} ;
2023-07-24 11:13:08 +08:00
}
let devtools ;
let buffer = [ ] ;
let devtoolsNotInstalled = false ;
2023-09-06 09:51:55 +08:00
function emit$1 ( event , ... args ) {
if ( devtools ) {
devtools . emit ( event , ... args ) ;
} else if ( ! devtoolsNotInstalled ) {
buffer . push ( { event , args } ) ;
}
2023-07-24 11:13:08 +08:00
}
function setDevtoolsHook ( hook , target ) {
2023-09-06 09:51:55 +08:00
var _a , _b ;
devtools = hook ;
if ( devtools ) {
devtools . enabled = true ;
buffer . forEach ( ( { event , args } ) => devtools . emit ( event , ... args ) ) ;
buffer = [ ] ;
} else if (
2023-07-24 11:13:08 +08:00
// handle late devtools injection - only do this if we are in an actual
// browser environment to avoid the timer handle stalling test runner exit
// (#4815)
2023-09-06 09:51:55 +08:00
typeof window !== "undefined" && // some envs mock window but not fully
window . HTMLElement && // also exclude jsdom
! ( ( _b = ( _a = window . navigator ) == null ? void 0 : _a . userAgent ) == null ? void 0 : _b . includes ( "jsdom" ) )
) {
const replay = target . _ _VUE _DEVTOOLS _HOOK _REPLAY _ _ = target . _ _VUE _DEVTOOLS _HOOK _REPLAY _ _ || [ ] ;
replay . push ( ( newHook ) => {
setDevtoolsHook ( newHook , target ) ;
} ) ;
setTimeout ( ( ) => {
if ( ! devtools ) {
target . _ _VUE _DEVTOOLS _HOOK _REPLAY _ _ = null ;
2023-07-24 11:13:08 +08:00
devtoolsNotInstalled = true ;
buffer = [ ] ;
2023-09-06 09:51:55 +08:00
}
} , 3e3 ) ;
} else {
devtoolsNotInstalled = true ;
buffer = [ ] ;
}
2023-07-24 11:13:08 +08:00
}
function devtoolsInitApp ( app , version ) {
2023-09-06 09:51:55 +08:00
emit$1 ( "app:init" /* APP_INIT */ , app , version , {
Fragment ,
Text ,
Comment ,
Static
} ) ;
2023-07-24 11:13:08 +08:00
}
function devtoolsUnmountApp ( app ) {
2023-09-06 09:51:55 +08:00
emit$1 ( "app:unmount" /* APP_UNMOUNT */ , app ) ;
}
const devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook (
"component:added" /* COMPONENT_ADDED */
) ;
const devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook ( "component:updated" /* COMPONENT_UPDATED */ ) ;
const _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook (
"component:removed" /* COMPONENT_REMOVED */
) ;
2023-07-24 11:13:08 +08:00
const devtoolsComponentRemoved = ( component ) => {
2023-09-06 09:51:55 +08:00
if ( devtools && typeof devtools . cleanupBuffer === "function" && // remove the component if it wasn't buffered
! devtools . cleanupBuffer ( component ) ) {
_devtoolsComponentRemoved ( component ) ;
}
2023-07-24 11:13:08 +08:00
} ;
function createDevtoolsComponentHook ( hook ) {
2023-09-06 09:51:55 +08:00
return ( component ) => {
emit$1 (
hook ,
component . appContext . app ,
component . uid ,
component . parent ? component . parent . uid : void 0 ,
component
) ;
} ;
}
const devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook (
"perf:start" /* PERFORMANCE_START */
) ;
const devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook (
"perf:end" /* PERFORMANCE_END */
) ;
2023-07-24 11:13:08 +08:00
function createDevtoolsPerformanceHook ( hook ) {
2023-09-06 09:51:55 +08:00
return ( component , type , time ) => {
emit$1 ( hook , component . appContext . app , component . uid , component , type , time ) ;
} ;
2023-07-24 11:13:08 +08:00
}
function devtoolsComponentEmit ( component , event , params ) {
2023-09-06 09:51:55 +08:00
emit$1 (
"component:emit" /* COMPONENT_EMIT */ ,
component . appContext . app ,
component ,
event ,
params
) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function emit ( instance , event , ... rawArgs ) {
if ( instance . isUnmounted )
return ;
const props = instance . vnode . props || EMPTY _OBJ ;
{
const {
emitsOptions ,
propsOptions : [ propsOptions ]
} = instance ;
if ( emitsOptions ) {
if ( ! ( event in emitsOptions ) && true ) {
if ( ! propsOptions || ! ( toHandlerKey ( event ) in propsOptions ) ) {
warn (
` Component emitted event " ${ event } " but it is neither declared in the emits option nor as an " ${ toHandlerKey ( event ) } " prop. `
) ;
}
} else {
const validator = emitsOptions [ event ] ;
if ( isFunction ( validator ) ) {
const isValid = validator ( ... rawArgs ) ;
if ( ! isValid ) {
warn (
` Invalid event arguments: event validation failed for event " ${ event } ". `
) ;
}
}
}
}
}
let args = rawArgs ;
const isModelListener = event . startsWith ( "update:" ) ;
const modelArg = isModelListener && event . slice ( 7 ) ;
if ( modelArg && modelArg in props ) {
const modifiersKey = ` ${ modelArg === "modelValue" ? "model" : modelArg } Modifiers ` ;
const { number , trim } = props [ modifiersKey ] || EMPTY _OBJ ;
if ( trim ) {
args = rawArgs . map ( ( a ) => isString ( a ) ? a . trim ( ) : a ) ;
}
if ( number ) {
args = rawArgs . map ( looseToNumber ) ;
}
}
{
devtoolsComponentEmit ( instance , event , args ) ;
}
{
const lowerCaseEvent = event . toLowerCase ( ) ;
if ( lowerCaseEvent !== event && props [ toHandlerKey ( lowerCaseEvent ) ] ) {
warn (
` Event " ${ lowerCaseEvent } " is emitted in component ${ formatComponentName (
instance ,
instance . type
) } but the handler is registered for "${event}" . Note that HTML attributes are case - insensitive and you cannot use v - on to listen to camelCase events when using in - DOM templates . You should probably use "${hyphenate(event)}" instead of "${event}" . `
) ;
}
}
let handlerName ;
let handler = props [ handlerName = toHandlerKey ( event ) ] || // also try camelCase event handler (#2249)
props [ handlerName = toHandlerKey ( camelize ( event ) ) ] ;
if ( ! handler && isModelListener ) {
handler = props [ handlerName = toHandlerKey ( hyphenate ( event ) ) ] ;
}
if ( handler ) {
callWithAsyncErrorHandling (
handler ,
instance ,
6 ,
args
) ;
}
const onceHandler = props [ handlerName + ` Once ` ] ;
if ( onceHandler ) {
if ( ! instance . emitted ) {
instance . emitted = { } ;
} else if ( instance . emitted [ handlerName ] ) {
return ;
}
instance . emitted [ handlerName ] = true ;
callWithAsyncErrorHandling (
onceHandler ,
instance ,
6 ,
args
) ;
}
2023-07-24 11:13:08 +08:00
}
function normalizeEmitsOptions ( comp , appContext , asMixin = false ) {
2023-09-06 09:51:55 +08:00
const cache = appContext . emitsCache ;
const cached = cache . get ( comp ) ;
if ( cached !== void 0 ) {
return cached ;
}
const raw = comp . emits ;
let normalized = { } ;
let hasExtends = false ;
if ( ! isFunction ( comp ) ) {
const extendEmits = ( raw2 ) => {
const normalizedFromExtend = normalizeEmitsOptions ( raw2 , appContext , true ) ;
if ( normalizedFromExtend ) {
hasExtends = true ;
extend ( normalized , normalizedFromExtend ) ;
}
} ;
if ( ! asMixin && appContext . mixins . length ) {
appContext . mixins . forEach ( extendEmits ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( comp . extends ) {
extendEmits ( comp . extends ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( comp . mixins ) {
comp . mixins . forEach ( extendEmits ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
if ( ! raw && ! hasExtends ) {
2023-07-24 11:13:08 +08:00
if ( isObject ( comp ) ) {
2023-09-06 09:51:55 +08:00
cache . set ( comp , null ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return null ;
}
if ( isArray ( raw ) ) {
raw . forEach ( ( key ) => normalized [ key ] = null ) ;
} else {
extend ( normalized , raw ) ;
}
if ( isObject ( comp ) ) {
cache . set ( comp , normalized ) ;
}
return normalized ;
2023-07-24 11:13:08 +08:00
}
function isEmitListener ( options , key ) {
2023-09-06 09:51:55 +08:00
if ( ! options || ! isOn ( key ) ) {
return false ;
}
key = key . slice ( 2 ) . replace ( /Once$/ , "" ) ;
return hasOwn ( options , key [ 0 ] . toLowerCase ( ) + key . slice ( 1 ) ) || hasOwn ( options , hyphenate ( key ) ) || hasOwn ( options , key ) ;
2023-07-24 11:13:08 +08:00
}
let currentRenderingInstance = null ;
let currentScopeId = null ;
function setCurrentRenderingInstance ( instance ) {
2023-09-06 09:51:55 +08:00
const prev = currentRenderingInstance ;
currentRenderingInstance = instance ;
currentScopeId = instance && instance . type . _ _scopeId || null ;
return prev ;
}
2023-07-24 11:13:08 +08:00
function pushScopeId ( id ) {
2023-09-06 09:51:55 +08:00
currentScopeId = id ;
2023-07-24 11:13:08 +08:00
}
function popScopeId ( ) {
2023-09-06 09:51:55 +08:00
currentScopeId = null ;
2023-07-24 11:13:08 +08:00
}
const withScopeId = ( _id ) => withCtx ;
2023-09-06 09:51:55 +08:00
function withCtx ( fn , ctx = currentRenderingInstance , isNonScopedSlot ) {
if ( ! ctx )
return fn ;
if ( fn . _n ) {
return fn ;
}
const renderFnWithContext = ( ... args ) => {
if ( renderFnWithContext . _d ) {
setBlockTracking ( - 1 ) ;
}
const prevInstance = setCurrentRenderingInstance ( ctx ) ;
let res ;
try {
res = fn ( ... args ) ;
} finally {
setCurrentRenderingInstance ( prevInstance ) ;
if ( renderFnWithContext . _d ) {
setBlockTracking ( 1 ) ;
}
}
{
devtoolsComponentUpdated ( ctx ) ;
}
return res ;
} ;
renderFnWithContext . _n = true ;
renderFnWithContext . _c = true ;
renderFnWithContext . _d = true ;
return renderFnWithContext ;
2023-07-24 11:13:08 +08:00
}
let accessedAttrs = false ;
function markAttrsAccessed ( ) {
2023-09-06 09:51:55 +08:00
accessedAttrs = true ;
2023-07-24 11:13:08 +08:00
}
function renderComponentRoot ( instance ) {
2023-09-06 09:51:55 +08:00
const {
type : Component ,
vnode ,
proxy ,
withProxy ,
props ,
propsOptions : [ propsOptions ] ,
slots ,
attrs ,
emit ,
render ,
renderCache ,
data ,
setupState ,
ctx ,
inheritAttrs
} = instance ;
let result ;
let fallthroughAttrs ;
const prev = setCurrentRenderingInstance ( instance ) ;
{
accessedAttrs = false ;
}
try {
if ( vnode . shapeFlag & 4 ) {
const proxyToUse = withProxy || proxy ;
result = normalizeVNode (
render . call (
proxyToUse ,
proxyToUse ,
renderCache ,
props ,
setupState ,
data ,
ctx
)
) ;
fallthroughAttrs = attrs ;
} else {
const render2 = Component ;
if ( attrs === props ) {
markAttrsAccessed ( ) ;
}
result = normalizeVNode (
render2 . length > 1 ? render2 (
props ,
true ? {
get attrs ( ) {
markAttrsAccessed ( ) ;
return attrs ;
} ,
slots ,
emit
} : { attrs , slots , emit }
) : render2 (
props ,
null
/* we know it doesn't need it */
)
) ;
fallthroughAttrs = Component . props ? attrs : getFunctionalFallthrough ( attrs ) ;
}
} catch ( err ) {
blockStack . length = 0 ;
handleError ( err , instance , 1 ) ;
result = createVNode ( Comment ) ;
}
let root = result ;
let setRoot = void 0 ;
if ( result . patchFlag > 0 && result . patchFlag & 2048 ) {
[ root , setRoot ] = getChildRoot ( result ) ;
}
if ( fallthroughAttrs && inheritAttrs !== false ) {
const keys = Object . keys ( fallthroughAttrs ) ;
const { shapeFlag } = root ;
if ( keys . length ) {
if ( shapeFlag & ( 1 | 6 ) ) {
if ( propsOptions && keys . some ( isModelListener ) ) {
fallthroughAttrs = filterModelListeners (
fallthroughAttrs ,
propsOptions
) ;
}
root = cloneVNode ( root , fallthroughAttrs ) ;
} else if ( ! accessedAttrs && root . type !== Comment ) {
const allAttrs = Object . keys ( attrs ) ;
const eventAttrs = [ ] ;
const extraAttrs = [ ] ;
for ( let i = 0 , l = allAttrs . length ; i < l ; i ++ ) {
const key = allAttrs [ i ] ;
if ( isOn ( key ) ) {
if ( ! isModelListener ( key ) ) {
eventAttrs . push ( key [ 2 ] . toLowerCase ( ) + key . slice ( 3 ) ) ;
}
} else {
extraAttrs . push ( key ) ;
}
}
if ( extraAttrs . length ) {
warn (
` Extraneous non-props attributes ( ${ extraAttrs . join ( ", " ) } ) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. `
) ;
}
if ( eventAttrs . length ) {
warn (
` Extraneous non-emits event listeners ( ${ eventAttrs . join ( ", " ) } ) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the "emits" option. `
) ;
}
}
}
}
if ( vnode . dirs ) {
if ( ! isElementRoot ( root ) ) {
warn (
` Runtime directive used on component with non-element root node. The directives will not function as intended. `
) ;
}
root = cloneVNode ( root ) ;
root . dirs = root . dirs ? root . dirs . concat ( vnode . dirs ) : vnode . dirs ;
}
if ( vnode . transition ) {
if ( ! isElementRoot ( root ) ) {
warn (
` Component inside <Transition> renders non-element root node that cannot be animated. `
) ;
}
root . transition = vnode . transition ;
}
if ( setRoot ) {
setRoot ( root ) ;
} else {
result = root ;
}
setCurrentRenderingInstance ( prev ) ;
return result ;
2023-07-24 11:13:08 +08:00
}
const getChildRoot = ( vnode ) => {
2023-09-06 09:51:55 +08:00
const rawChildren = vnode . children ;
const dynamicChildren = vnode . dynamicChildren ;
const childRoot = filterSingleRoot ( rawChildren ) ;
if ( ! childRoot ) {
return [ vnode , void 0 ] ;
}
const index = rawChildren . indexOf ( childRoot ) ;
const dynamicIndex = dynamicChildren ? dynamicChildren . indexOf ( childRoot ) : - 1 ;
const setRoot = ( updatedRoot ) => {
rawChildren [ index ] = updatedRoot ;
if ( dynamicChildren ) {
if ( dynamicIndex > - 1 ) {
dynamicChildren [ dynamicIndex ] = updatedRoot ;
} else if ( updatedRoot . patchFlag > 0 ) {
vnode . dynamicChildren = [ ... dynamicChildren , updatedRoot ] ;
}
}
} ;
return [ normalizeVNode ( childRoot ) , setRoot ] ;
2023-07-24 11:13:08 +08:00
} ;
function filterSingleRoot ( children ) {
2023-09-06 09:51:55 +08:00
let singleRoot ;
for ( let i = 0 ; i < children . length ; i ++ ) {
const child = children [ i ] ;
if ( isVNode ( child ) ) {
if ( child . type !== Comment || child . children === "v-if" ) {
if ( singleRoot ) {
return ;
} else {
singleRoot = child ;
}
}
} else {
return ;
}
}
return singleRoot ;
2023-07-24 11:13:08 +08:00
}
const getFunctionalFallthrough = ( attrs ) => {
2023-09-06 09:51:55 +08:00
let res ;
for ( const key in attrs ) {
if ( key === "class" || key === "style" || isOn ( key ) ) {
( res || ( res = { } ) ) [ key ] = attrs [ key ] ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
return res ;
2023-07-24 11:13:08 +08:00
} ;
const filterModelListeners = ( attrs , props ) => {
2023-09-06 09:51:55 +08:00
const res = { } ;
for ( const key in attrs ) {
if ( ! isModelListener ( key ) || ! ( key . slice ( 9 ) in props ) ) {
res [ key ] = attrs [ key ] ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
return res ;
2023-07-24 11:13:08 +08:00
} ;
const isElementRoot = ( vnode ) => {
2023-09-06 09:51:55 +08:00
return vnode . shapeFlag & ( 6 | 1 ) || vnode . type === Comment ;
2023-07-24 11:13:08 +08:00
} ;
function shouldUpdateComponent ( prevVNode , nextVNode , optimized ) {
2023-09-06 09:51:55 +08:00
const { props : prevProps , children : prevChildren , component } = prevVNode ;
const { props : nextProps , children : nextChildren , patchFlag } = nextVNode ;
const emits = component . emitsOptions ;
if ( ( prevChildren || nextChildren ) && isHmrUpdating ) {
return true ;
}
if ( nextVNode . dirs || nextVNode . transition ) {
return true ;
}
if ( optimized && patchFlag >= 0 ) {
if ( patchFlag & 1024 ) {
return true ;
}
if ( patchFlag & 16 ) {
if ( ! prevProps ) {
return ! ! nextProps ;
}
return hasPropsChanged ( prevProps , nextProps , emits ) ;
} else if ( patchFlag & 8 ) {
const dynamicProps = nextVNode . dynamicProps ;
for ( let i = 0 ; i < dynamicProps . length ; i ++ ) {
const key = dynamicProps [ i ] ;
if ( nextProps [ key ] !== prevProps [ key ] && ! isEmitListener ( emits , key ) ) {
return true ;
}
}
}
} else {
if ( prevChildren || nextChildren ) {
if ( ! nextChildren || ! nextChildren . $stable ) {
2023-07-24 11:13:08 +08:00
return true ;
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( prevProps === nextProps ) {
return false ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( ! prevProps ) {
return ! ! nextProps ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( ! nextProps ) {
return true ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return hasPropsChanged ( prevProps , nextProps , emits ) ;
}
return false ;
2023-07-24 11:13:08 +08:00
}
function hasPropsChanged ( prevProps , nextProps , emitsOptions ) {
2023-09-06 09:51:55 +08:00
const nextKeys = Object . keys ( nextProps ) ;
if ( nextKeys . length !== Object . keys ( prevProps ) . length ) {
return true ;
}
for ( let i = 0 ; i < nextKeys . length ; i ++ ) {
const key = nextKeys [ i ] ;
if ( nextProps [ key ] !== prevProps [ key ] && ! isEmitListener ( emitsOptions , key ) ) {
return true ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
return false ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function updateHOCHostEl ( { vnode , parent } , el ) {
while ( parent && parent . subTree === vnode ) {
( vnode = parent . vnode ) . el = el ;
parent = parent . parent ;
}
2023-07-24 11:13:08 +08:00
}
const isSuspense = ( type ) => type . _ _isSuspense ;
const SuspenseImpl = {
2023-09-06 09:51:55 +08:00
name : "Suspense" ,
// In order to make Suspense tree-shakable, we need to avoid importing it
// directly in the renderer. The renderer checks for the __isSuspense flag
// on a vnode's type and calls the `process` method, passing in renderer
// internals.
_ _isSuspense : true ,
process ( n1 , n2 , container , anchor , parentComponent , parentSuspense , isSVG , slotScopeIds , optimized , rendererInternals ) {
if ( n1 == null ) {
mountSuspense (
n2 ,
container ,
anchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized ,
rendererInternals
) ;
} else {
patchSuspense (
n1 ,
n2 ,
container ,
anchor ,
parentComponent ,
isSVG ,
slotScopeIds ,
optimized ,
rendererInternals
) ;
}
} ,
hydrate : hydrateSuspense ,
create : createSuspenseBoundary ,
normalize : normalizeSuspenseChildren
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
const Suspense = SuspenseImpl ;
2023-07-24 11:13:08 +08:00
function triggerEvent ( vnode , name ) {
2023-09-06 09:51:55 +08:00
const eventListener = vnode . props && vnode . props [ name ] ;
if ( isFunction ( eventListener ) ) {
eventListener ( ) ;
}
2023-07-24 11:13:08 +08:00
}
function mountSuspense ( vnode , container , anchor , parentComponent , parentSuspense , isSVG , slotScopeIds , optimized , rendererInternals ) {
2023-09-06 09:51:55 +08:00
const {
p : patch ,
o : { createElement }
} = rendererInternals ;
const hiddenContainer = createElement ( "div" ) ;
const suspense = vnode . suspense = createSuspenseBoundary (
vnode ,
parentSuspense ,
parentComponent ,
container ,
hiddenContainer ,
anchor ,
isSVG ,
slotScopeIds ,
optimized ,
rendererInternals
) ;
patch (
null ,
suspense . pendingBranch = vnode . ssContent ,
hiddenContainer ,
null ,
parentComponent ,
suspense ,
isSVG ,
slotScopeIds
) ;
if ( suspense . deps > 0 ) {
triggerEvent ( vnode , "onPending" ) ;
triggerEvent ( vnode , "onFallback" ) ;
patch (
null ,
vnode . ssFallback ,
container ,
anchor ,
parentComponent ,
null ,
// fallback tree will not have suspense context
isSVG ,
slotScopeIds
) ;
setActiveBranch ( suspense , vnode . ssFallback ) ;
} else {
suspense . resolve ( false , true ) ;
}
2023-07-24 11:13:08 +08:00
}
function patchSuspense ( n1 , n2 , container , anchor , parentComponent , isSVG , slotScopeIds , optimized , { p : patch , um : unmount , o : { createElement } } ) {
2023-09-06 09:51:55 +08:00
const suspense = n2 . suspense = n1 . suspense ;
suspense . vnode = n2 ;
n2 . el = n1 . el ;
const newBranch = n2 . ssContent ;
const newFallback = n2 . ssFallback ;
const { activeBranch , pendingBranch , isInFallback , isHydrating } = suspense ;
if ( pendingBranch ) {
suspense . pendingBranch = newBranch ;
if ( isSameVNodeType ( newBranch , pendingBranch ) ) {
patch (
pendingBranch ,
newBranch ,
suspense . hiddenContainer ,
null ,
parentComponent ,
suspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
if ( suspense . deps <= 0 ) {
suspense . resolve ( ) ;
} else if ( isInFallback ) {
patch (
activeBranch ,
newFallback ,
container ,
anchor ,
parentComponent ,
null ,
// fallback tree will not have suspense context
isSVG ,
slotScopeIds ,
optimized
) ;
setActiveBranch ( suspense , newFallback ) ;
}
} else {
suspense . pendingId ++ ;
if ( isHydrating ) {
suspense . isHydrating = false ;
suspense . activeBranch = pendingBranch ;
} else {
unmount ( pendingBranch , parentComponent , suspense ) ;
}
suspense . deps = 0 ;
suspense . effects . length = 0 ;
suspense . hiddenContainer = createElement ( "div" ) ;
if ( isInFallback ) {
patch (
null ,
newBranch ,
suspense . hiddenContainer ,
null ,
parentComponent ,
suspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
if ( suspense . deps <= 0 ) {
suspense . resolve ( ) ;
} else {
patch (
activeBranch ,
newFallback ,
container ,
anchor ,
parentComponent ,
null ,
// fallback tree will not have suspense context
isSVG ,
slotScopeIds ,
optimized
) ;
setActiveBranch ( suspense , newFallback ) ;
}
} else if ( activeBranch && isSameVNodeType ( newBranch , activeBranch ) ) {
patch (
activeBranch ,
newBranch ,
container ,
anchor ,
parentComponent ,
suspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
suspense . resolve ( true ) ;
} else {
patch (
null ,
newBranch ,
suspense . hiddenContainer ,
null ,
parentComponent ,
suspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
if ( suspense . deps <= 0 ) {
suspense . resolve ( ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} else {
if ( activeBranch && isSameVNodeType ( newBranch , activeBranch ) ) {
patch (
activeBranch ,
newBranch ,
container ,
anchor ,
parentComponent ,
suspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
setActiveBranch ( suspense , newBranch ) ;
} else {
triggerEvent ( n2 , "onPending" ) ;
suspense . pendingBranch = newBranch ;
suspense . pendingId ++ ;
patch (
null ,
newBranch ,
suspense . hiddenContainer ,
null ,
parentComponent ,
suspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
if ( suspense . deps <= 0 ) {
suspense . resolve ( ) ;
} else {
const { timeout , pendingId } = suspense ;
if ( timeout > 0 ) {
setTimeout ( ( ) => {
if ( suspense . pendingId === pendingId ) {
suspense . fallback ( newFallback ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} , timeout ) ;
} else if ( timeout === 0 ) {
suspense . fallback ( newFallback ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
let hasWarned = false ;
2023-09-06 09:51:55 +08:00
function createSuspenseBoundary ( vnode , parentSuspense , parentComponent , container , hiddenContainer , anchor , isSVG , slotScopeIds , optimized , rendererInternals , isHydrating = false ) {
if ( ! hasWarned ) {
hasWarned = true ;
console [ console . info ? "info" : "log" ] (
` <Suspense> is an experimental feature and its API will likely change. `
) ;
}
const {
p : patch ,
m : move ,
um : unmount ,
n : next ,
o : { parentNode , remove }
} = rendererInternals ;
let parentSuspenseId ;
const isSuspensible = isVNodeSuspensible ( vnode ) ;
if ( isSuspensible ) {
if ( parentSuspense == null ? void 0 : parentSuspense . pendingBranch ) {
parentSuspenseId = parentSuspense . pendingId ;
parentSuspense . deps ++ ;
}
}
const timeout = vnode . props ? toNumber ( vnode . props . timeout ) : void 0 ;
{
assertNumber ( timeout , ` Suspense timeout ` ) ;
}
const suspense = {
vnode ,
parent : parentSuspense ,
parentComponent ,
isSVG ,
container ,
hiddenContainer ,
anchor ,
deps : 0 ,
pendingId : 0 ,
timeout : typeof timeout === "number" ? timeout : - 1 ,
activeBranch : null ,
pendingBranch : null ,
isInFallback : true ,
isHydrating ,
isUnmounted : false ,
effects : [ ] ,
resolve ( resume = false , sync = false ) {
{
if ( ! resume && ! suspense . pendingBranch ) {
throw new Error (
` suspense.resolve() is called without a pending branch. `
) ;
}
if ( suspense . isUnmounted ) {
throw new Error (
` suspense.resolve() is called on an already unmounted suspense boundary. `
) ;
}
}
const {
vnode : vnode2 ,
activeBranch ,
pendingBranch ,
pendingId ,
effects ,
parentComponent : parentComponent2 ,
container : container2
} = suspense ;
if ( suspense . isHydrating ) {
suspense . isHydrating = false ;
} else if ( ! resume ) {
const delayEnter = activeBranch && pendingBranch . transition && pendingBranch . transition . mode === "out-in" ;
if ( delayEnter ) {
activeBranch . transition . afterLeave = ( ) => {
if ( pendingId === suspense . pendingId ) {
move ( pendingBranch , container2 , anchor2 , 0 ) ;
}
} ;
}
let { anchor : anchor2 } = suspense ;
if ( activeBranch ) {
anchor2 = next ( activeBranch ) ;
unmount ( activeBranch , parentComponent2 , suspense , true ) ;
}
if ( ! delayEnter ) {
move ( pendingBranch , container2 , anchor2 , 0 ) ;
}
}
setActiveBranch ( suspense , pendingBranch ) ;
suspense . pendingBranch = null ;
suspense . isInFallback = false ;
let parent = suspense . parent ;
let hasUnresolvedAncestor = false ;
while ( parent ) {
if ( parent . pendingBranch ) {
parent . effects . push ( ... effects ) ;
hasUnresolvedAncestor = true ;
break ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
parent = parent . parent ;
}
if ( ! hasUnresolvedAncestor ) {
queuePostFlushCb ( effects ) ;
}
suspense . effects = [ ] ;
if ( isSuspensible ) {
if ( parentSuspense && parentSuspense . pendingBranch && parentSuspenseId === parentSuspense . pendingId ) {
parentSuspense . deps -- ;
if ( parentSuspense . deps === 0 && ! sync ) {
parentSuspense . resolve ( ) ;
}
}
}
triggerEvent ( vnode2 , "onResolve" ) ;
} ,
fallback ( fallbackVNode ) {
if ( ! suspense . pendingBranch ) {
return ;
}
const { vnode : vnode2 , activeBranch , parentComponent : parentComponent2 , container : container2 , isSVG : isSVG2 } = suspense ;
triggerEvent ( vnode2 , "onFallback" ) ;
const anchor2 = next ( activeBranch ) ;
const mountFallback = ( ) => {
if ( ! suspense . isInFallback ) {
return ;
}
patch (
null ,
fallbackVNode ,
container2 ,
anchor2 ,
parentComponent2 ,
null ,
// fallback tree will not have suspense context
isSVG2 ,
slotScopeIds ,
optimized
) ;
setActiveBranch ( suspense , fallbackVNode ) ;
} ;
const delayEnter = fallbackVNode . transition && fallbackVNode . transition . mode === "out-in" ;
if ( delayEnter ) {
activeBranch . transition . afterLeave = mountFallback ;
}
suspense . isInFallback = true ;
unmount (
activeBranch ,
parentComponent2 ,
null ,
// no suspense so unmount hooks fire now
true
// shouldRemove
) ;
if ( ! delayEnter ) {
mountFallback ( ) ;
}
} ,
move ( container2 , anchor2 , type ) {
suspense . activeBranch && move ( suspense . activeBranch , container2 , anchor2 , type ) ;
suspense . container = container2 ;
} ,
next ( ) {
return suspense . activeBranch && next ( suspense . activeBranch ) ;
} ,
registerDep ( instance , setupRenderEffect ) {
const isInPendingSuspense = ! ! suspense . pendingBranch ;
if ( isInPendingSuspense ) {
suspense . deps ++ ;
}
const hydratedEl = instance . vnode . el ;
instance . asyncDep . catch ( ( err ) => {
handleError ( err , instance , 0 ) ;
} ) . then ( ( asyncSetupResult ) => {
if ( instance . isUnmounted || suspense . isUnmounted || suspense . pendingId !== instance . suspenseId ) {
return ;
}
instance . asyncResolved = true ;
const { vnode : vnode2 } = instance ;
{
pushWarningContext ( vnode2 ) ;
}
handleSetupResult ( instance , asyncSetupResult , false ) ;
if ( hydratedEl ) {
vnode2 . el = hydratedEl ;
}
const placeholder = ! hydratedEl && instance . subTree . el ;
setupRenderEffect (
instance ,
vnode2 ,
// component may have been moved before resolve.
// if this is not a hydration, instance.subTree will be the comment
// placeholder.
parentNode ( hydratedEl || instance . subTree . el ) ,
// anchor will not be used if this is hydration, so only need to
// consider the comment placeholder case.
hydratedEl ? null : next ( instance . subTree ) ,
suspense ,
isSVG ,
optimized
) ;
if ( placeholder ) {
remove ( placeholder ) ;
}
updateHOCHostEl ( instance , vnode2 . el ) ;
{
popWarningContext ( ) ;
}
if ( isInPendingSuspense && -- suspense . deps === 0 ) {
suspense . resolve ( ) ;
}
} ) ;
} ,
unmount ( parentSuspense2 , doRemove ) {
suspense . isUnmounted = true ;
if ( suspense . activeBranch ) {
unmount (
suspense . activeBranch ,
parentComponent ,
parentSuspense2 ,
doRemove
) ;
}
if ( suspense . pendingBranch ) {
unmount (
suspense . pendingBranch ,
parentComponent ,
parentSuspense2 ,
doRemove
) ;
}
}
} ;
return suspense ;
2023-07-24 11:13:08 +08:00
}
function hydrateSuspense ( node , vnode , parentComponent , parentSuspense , isSVG , slotScopeIds , optimized , rendererInternals , hydrateNode ) {
2023-09-06 09:51:55 +08:00
const suspense = vnode . suspense = createSuspenseBoundary (
vnode ,
parentSuspense ,
parentComponent ,
node . parentNode ,
document . createElement ( "div" ) ,
null ,
isSVG ,
slotScopeIds ,
optimized ,
rendererInternals ,
true
/* hydrating */
) ;
const result = hydrateNode (
node ,
suspense . pendingBranch = vnode . ssContent ,
parentComponent ,
suspense ,
slotScopeIds ,
optimized
) ;
if ( suspense . deps === 0 ) {
suspense . resolve ( false , true ) ;
}
return result ;
2023-07-24 11:13:08 +08:00
}
function normalizeSuspenseChildren ( vnode ) {
2023-09-06 09:51:55 +08:00
const { shapeFlag , children } = vnode ;
const isSlotChildren = shapeFlag & 32 ;
vnode . ssContent = normalizeSuspenseSlot (
isSlotChildren ? children . default : children
) ;
vnode . ssFallback = isSlotChildren ? normalizeSuspenseSlot ( children . fallback ) : createVNode ( Comment ) ;
2023-07-24 11:13:08 +08:00
}
function normalizeSuspenseSlot ( s ) {
2023-09-06 09:51:55 +08:00
let block ;
if ( isFunction ( s ) ) {
const trackBlock = isBlockTreeEnabled && s . _c ;
if ( trackBlock ) {
s . _d = false ;
openBlock ( ) ;
}
s = s ( ) ;
if ( trackBlock ) {
s . _d = true ;
block = currentBlock ;
closeBlock ( ) ;
}
}
if ( isArray ( s ) ) {
const singleChild = filterSingleRoot ( s ) ;
if ( ! singleChild ) {
warn ( ` <Suspense> slots expect a single root node. ` ) ;
}
s = singleChild ;
}
s = normalizeVNode ( s ) ;
if ( block && ! s . dynamicChildren ) {
s . dynamicChildren = block . filter ( ( c ) => c !== s ) ;
}
return s ;
2023-07-24 11:13:08 +08:00
}
function queueEffectWithSuspense ( fn , suspense ) {
2023-09-06 09:51:55 +08:00
if ( suspense && suspense . pendingBranch ) {
if ( isArray ( fn ) ) {
suspense . effects . push ( ... fn ) ;
} else {
suspense . effects . push ( fn ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} else {
queuePostFlushCb ( fn ) ;
}
2023-07-24 11:13:08 +08:00
}
function setActiveBranch ( suspense , branch ) {
2023-09-06 09:51:55 +08:00
suspense . activeBranch = branch ;
const { vnode , parentComponent } = suspense ;
const el = vnode . el = branch . el ;
if ( parentComponent && parentComponent . subTree === vnode ) {
parentComponent . vnode . el = el ;
updateHOCHostEl ( parentComponent , el ) ;
}
}
function isVNodeSuspensible ( vnode ) {
var _a ;
return ( ( _a = vnode . props ) == null ? void 0 : _a . suspensible ) != null && vnode . props . suspensible !== false ;
2023-07-24 11:13:08 +08:00
}
function watchEffect ( effect , options ) {
2023-09-06 09:51:55 +08:00
return doWatch ( effect , null , options ) ;
2023-07-24 11:13:08 +08:00
}
function watchPostEffect ( effect , options ) {
2023-09-06 09:51:55 +08:00
return doWatch (
effect ,
null ,
extend ( { } , options , { flush : "post" } )
) ;
2023-07-24 11:13:08 +08:00
}
function watchSyncEffect ( effect , options ) {
2023-09-06 09:51:55 +08:00
return doWatch (
effect ,
null ,
extend ( { } , options , { flush : "sync" } )
) ;
2023-07-24 11:13:08 +08:00
}
const INITIAL _WATCHER _VALUE = { } ;
function watch ( source , cb , options ) {
2023-09-06 09:51:55 +08:00
if ( ! isFunction ( cb ) ) {
warn (
` \` watch(fn, options?) \` signature has been moved to a separate API. Use \` watchEffect(fn, options?) \` instead. \` watch \` now only supports \` watch(source, cb, options?) signature. `
) ;
}
return doWatch ( source , cb , options ) ;
2023-07-24 11:13:08 +08:00
}
function doWatch ( source , cb , { immediate , deep , flush , onTrack , onTrigger } = EMPTY _OBJ ) {
2023-09-06 09:51:55 +08:00
var _a ;
if ( ! cb ) {
if ( immediate !== void 0 ) {
warn (
` watch() "immediate" option is only respected when using the watch(source, callback, options?) signature. `
) ;
}
if ( deep !== void 0 ) {
warn (
` watch() "deep" option is only respected when using the watch(source, callback, options?) signature. `
) ;
}
}
const warnInvalidSource = ( s ) => {
warn (
` Invalid watch source: ` ,
s ,
` A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types. `
) ;
} ;
const instance = getCurrentScope ( ) === ( ( _a = currentInstance ) == null ? void 0 : _a . scope ) ? currentInstance : null ;
let getter ;
let forceTrigger = false ;
let isMultiSource = false ;
if ( isRef ( source ) ) {
getter = ( ) => source . value ;
forceTrigger = isShallow ( source ) ;
} else if ( isReactive ( source ) ) {
getter = ( ) => source ;
deep = true ;
} else if ( isArray ( source ) ) {
isMultiSource = true ;
forceTrigger = source . some ( ( s ) => isReactive ( s ) || isShallow ( s ) ) ;
getter = ( ) => source . map ( ( s ) => {
if ( isRef ( s ) ) {
return s . value ;
} else if ( isReactive ( s ) ) {
return traverse ( s ) ;
} else if ( isFunction ( s ) ) {
return callWithErrorHandling ( s , instance , 2 ) ;
} else {
warnInvalidSource ( s ) ;
}
} ) ;
} else if ( isFunction ( source ) ) {
if ( cb ) {
getter = ( ) => callWithErrorHandling ( source , instance , 2 ) ;
} else {
getter = ( ) => {
if ( instance && instance . isUnmounted ) {
return ;
}
if ( cleanup ) {
cleanup ( ) ;
}
return callWithAsyncErrorHandling (
source ,
instance ,
3 ,
[ onCleanup ]
) ;
} ;
}
} else {
getter = NOOP ;
warnInvalidSource ( source ) ;
}
if ( cb && deep ) {
const baseGetter = getter ;
getter = ( ) => traverse ( baseGetter ( ) ) ;
}
let cleanup ;
let onCleanup = ( fn ) => {
cleanup = effect . onStop = ( ) => {
callWithErrorHandling ( fn , instance , 4 ) ;
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
} ;
let oldValue = isMultiSource ? new Array ( source . length ) . fill ( INITIAL _WATCHER _VALUE ) : INITIAL _WATCHER _VALUE ;
const job = ( ) => {
if ( ! effect . active ) {
return ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( cb ) {
const newValue = effect . run ( ) ;
if ( deep || forceTrigger || ( isMultiSource ? newValue . some (
( v , i ) => hasChanged ( v , oldValue [ i ] )
) : hasChanged ( newValue , oldValue ) ) || false ) {
if ( cleanup ) {
cleanup ( ) ;
}
callWithAsyncErrorHandling ( cb , instance , 3 , [
newValue ,
// pass undefined as the old value when it's changed for the first time
oldValue === INITIAL _WATCHER _VALUE ? void 0 : isMultiSource && oldValue [ 0 ] === INITIAL _WATCHER _VALUE ? [ ] : oldValue ,
onCleanup
] ) ;
oldValue = newValue ;
}
} else {
effect . run ( ) ;
}
} ;
job . allowRecurse = ! ! cb ;
let scheduler ;
if ( flush === "sync" ) {
scheduler = job ;
} else if ( flush === "post" ) {
scheduler = ( ) => queuePostRenderEffect ( job , instance && instance . suspense ) ;
} else {
job . pre = true ;
if ( instance )
job . id = instance . uid ;
scheduler = ( ) => queueJob ( job ) ;
}
const effect = new ReactiveEffect ( getter , scheduler ) ;
{
effect . onTrack = onTrack ;
effect . onTrigger = onTrigger ;
}
if ( cb ) {
if ( immediate ) {
job ( ) ;
} else {
oldValue = effect . run ( ) ;
}
} else if ( flush === "post" ) {
queuePostRenderEffect (
effect . run . bind ( effect ) ,
instance && instance . suspense
) ;
} else {
effect . run ( ) ;
}
const unwatch = ( ) => {
effect . stop ( ) ;
if ( instance && instance . scope ) {
remove ( instance . scope . effects , effect ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} ;
return unwatch ;
2023-07-24 11:13:08 +08:00
}
function instanceWatch ( source , value , options ) {
2023-09-06 09:51:55 +08:00
const publicThis = this . proxy ;
const getter = isString ( source ) ? source . includes ( "." ) ? createPathGetter ( publicThis , source ) : ( ) => publicThis [ source ] : source . bind ( publicThis , publicThis ) ;
let cb ;
if ( isFunction ( value ) ) {
cb = value ;
} else {
cb = value . handler ;
options = value ;
}
const cur = currentInstance ;
setCurrentInstance ( this ) ;
const res = doWatch ( getter , cb . bind ( publicThis ) , options ) ;
if ( cur ) {
setCurrentInstance ( cur ) ;
} else {
unsetCurrentInstance ( ) ;
}
return res ;
2023-07-24 11:13:08 +08:00
}
function createPathGetter ( ctx , path ) {
2023-09-06 09:51:55 +08:00
const segments = path . split ( "." ) ;
return ( ) => {
let cur = ctx ;
for ( let i = 0 ; i < segments . length && cur ; i ++ ) {
cur = cur [ segments [ i ] ] ;
}
return cur ;
} ;
2023-07-24 11:13:08 +08:00
}
function traverse ( value , seen ) {
2023-09-06 09:51:55 +08:00
if ( ! isObject ( value ) || value [ "__v_skip" ] ) {
return value ;
}
seen = seen || /* @__PURE__ */ new Set ( ) ;
if ( seen . has ( value ) ) {
return value ;
}
seen . add ( value ) ;
if ( isRef ( value ) ) {
traverse ( value . value , seen ) ;
} else if ( isArray ( value ) ) {
for ( let i = 0 ; i < value . length ; i ++ ) {
traverse ( value [ i ] , seen ) ;
}
} else if ( isSet ( value ) || isMap ( value ) ) {
value . forEach ( ( v ) => {
traverse ( v , seen ) ;
} ) ;
} else if ( isPlainObject ( value ) ) {
for ( const key in value ) {
traverse ( value [ key ] , seen ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
return value ;
}
function validateDirectiveName ( name ) {
if ( isBuiltInDirective ( name ) ) {
warn ( "Do not use built-in directive ids as custom directive id: " + name ) ;
}
}
function withDirectives ( vnode , directives ) {
const internalInstance = currentRenderingInstance ;
if ( internalInstance === null ) {
warn ( ` withDirectives can only be used inside render functions. ` ) ;
return vnode ;
}
const instance = getExposeProxy ( internalInstance ) || internalInstance . proxy ;
const bindings = vnode . dirs || ( vnode . dirs = [ ] ) ;
for ( let i = 0 ; i < directives . length ; i ++ ) {
let [ dir , value , arg , modifiers = EMPTY _OBJ ] = directives [ i ] ;
if ( dir ) {
if ( isFunction ( dir ) ) {
dir = {
mounted : dir ,
updated : dir
} ;
}
if ( dir . deep ) {
traverse ( value ) ;
}
bindings . push ( {
dir ,
instance ,
value ,
oldValue : void 0 ,
arg ,
modifiers
} ) ;
}
}
return vnode ;
}
function invokeDirectiveHook ( vnode , prevVNode , instance , name ) {
const bindings = vnode . dirs ;
const oldBindings = prevVNode && prevVNode . dirs ;
for ( let i = 0 ; i < bindings . length ; i ++ ) {
const binding = bindings [ i ] ;
if ( oldBindings ) {
binding . oldValue = oldBindings [ i ] . value ;
}
let hook = binding . dir [ name ] ;
if ( hook ) {
pauseTracking ( ) ;
callWithAsyncErrorHandling ( hook , instance , 8 , [
vnode . el ,
binding ,
vnode ,
prevVNode
] ) ;
resetTracking ( ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
function useTransitionState ( ) {
2023-09-06 09:51:55 +08:00
const state = {
isMounted : false ,
isLeaving : false ,
isUnmounting : false ,
leavingVNodes : /* @__PURE__ */ new Map ( )
} ;
onMounted ( ( ) => {
state . isMounted = true ;
} ) ;
onBeforeUnmount ( ( ) => {
state . isUnmounting = true ;
} ) ;
return state ;
2023-07-24 11:13:08 +08:00
}
const TransitionHookValidator = [ Function , Array ] ;
2023-09-06 09:51:55 +08:00
const BaseTransitionPropsValidators = {
mode : String ,
appear : Boolean ,
persisted : Boolean ,
// enter
onBeforeEnter : TransitionHookValidator ,
onEnter : TransitionHookValidator ,
onAfterEnter : TransitionHookValidator ,
onEnterCancelled : TransitionHookValidator ,
// leave
onBeforeLeave : TransitionHookValidator ,
onLeave : TransitionHookValidator ,
onAfterLeave : TransitionHookValidator ,
onLeaveCancelled : TransitionHookValidator ,
// appear
onBeforeAppear : TransitionHookValidator ,
onAppear : TransitionHookValidator ,
onAfterAppear : TransitionHookValidator ,
onAppearCancelled : TransitionHookValidator
} ;
2023-07-24 11:13:08 +08:00
const BaseTransitionImpl = {
2023-09-06 09:51:55 +08:00
name : ` BaseTransition ` ,
props : BaseTransitionPropsValidators ,
setup ( props , { slots } ) {
const instance = getCurrentInstance ( ) ;
const state = useTransitionState ( ) ;
let prevTransitionKey ;
return ( ) => {
const children = slots . default && getTransitionRawChildren ( slots . default ( ) , true ) ;
if ( ! children || ! children . length ) {
return ;
}
let child = children [ 0 ] ;
if ( children . length > 1 ) {
let hasFound = false ;
for ( const c of children ) {
if ( c . type !== Comment ) {
if ( hasFound ) {
warn (
"<transition> can only be used on a single element or component. Use <transition-group> for lists."
) ;
break ;
}
child = c ;
hasFound = true ;
}
}
}
const rawProps = toRaw ( props ) ;
const { mode } = rawProps ;
if ( mode && mode !== "in-out" && mode !== "out-in" && mode !== "default" ) {
warn ( ` invalid <transition> mode: ${ mode } ` ) ;
}
if ( state . isLeaving ) {
return emptyPlaceholder ( child ) ;
}
const innerChild = getKeepAliveChild ( child ) ;
if ( ! innerChild ) {
return emptyPlaceholder ( child ) ;
}
const enterHooks = resolveTransitionHooks (
innerChild ,
rawProps ,
state ,
instance
) ;
setTransitionHooks ( innerChild , enterHooks ) ;
const oldChild = instance . subTree ;
const oldInnerChild = oldChild && getKeepAliveChild ( oldChild ) ;
let transitionKeyChanged = false ;
const { getTransitionKey } = innerChild . type ;
if ( getTransitionKey ) {
const key = getTransitionKey ( ) ;
if ( prevTransitionKey === void 0 ) {
prevTransitionKey = key ;
} else if ( key !== prevTransitionKey ) {
prevTransitionKey = key ;
transitionKeyChanged = true ;
}
}
if ( oldInnerChild && oldInnerChild . type !== Comment && ( ! isSameVNodeType ( innerChild , oldInnerChild ) || transitionKeyChanged ) ) {
const leavingHooks = resolveTransitionHooks (
oldInnerChild ,
rawProps ,
state ,
instance
) ;
setTransitionHooks ( oldInnerChild , leavingHooks ) ;
if ( mode === "out-in" ) {
state . isLeaving = true ;
leavingHooks . afterLeave = ( ) => {
state . isLeaving = false ;
if ( instance . update . active !== false ) {
instance . update ( ) ;
}
} ;
return emptyPlaceholder ( child ) ;
} else if ( mode === "in-out" && innerChild . type !== Comment ) {
leavingHooks . delayLeave = ( el , earlyRemove , delayedLeave ) => {
const leavingVNodesCache = getLeavingNodesForType (
state ,
oldInnerChild
) ;
leavingVNodesCache [ String ( oldInnerChild . key ) ] = oldInnerChild ;
el . _leaveCb = ( ) => {
earlyRemove ( ) ;
el . _leaveCb = void 0 ;
delete enterHooks . delayedLeave ;
} ;
enterHooks . delayedLeave = delayedLeave ;
} ;
}
}
return child ;
} ;
}
2023-07-24 11:13:08 +08:00
} ;
const BaseTransition = BaseTransitionImpl ;
function getLeavingNodesForType ( state , vnode ) {
2023-09-06 09:51:55 +08:00
const { leavingVNodes } = state ;
let leavingVNodesCache = leavingVNodes . get ( vnode . type ) ;
if ( ! leavingVNodesCache ) {
leavingVNodesCache = /* @__PURE__ */ Object . create ( null ) ;
leavingVNodes . set ( vnode . type , leavingVNodesCache ) ;
}
return leavingVNodesCache ;
2023-07-24 11:13:08 +08:00
}
function resolveTransitionHooks ( vnode , props , state , instance ) {
2023-09-06 09:51:55 +08:00
const {
appear ,
mode ,
persisted = false ,
onBeforeEnter ,
onEnter ,
onAfterEnter ,
onEnterCancelled ,
onBeforeLeave ,
onLeave ,
onAfterLeave ,
onLeaveCancelled ,
onBeforeAppear ,
onAppear ,
onAfterAppear ,
onAppearCancelled
} = props ;
const key = String ( vnode . key ) ;
const leavingVNodesCache = getLeavingNodesForType ( state , vnode ) ;
const callHook = ( hook , args ) => {
hook && callWithAsyncErrorHandling (
hook ,
instance ,
9 ,
args
) ;
} ;
const callAsyncHook = ( hook , args ) => {
const done = args [ 1 ] ;
callHook ( hook , args ) ;
if ( isArray ( hook ) ) {
if ( hook . every ( ( hook2 ) => hook2 . length <= 1 ) )
done ( ) ;
} else if ( hook . length <= 1 ) {
done ( ) ;
}
} ;
const hooks = {
mode ,
persisted ,
beforeEnter ( el ) {
let hook = onBeforeEnter ;
if ( ! state . isMounted ) {
if ( appear ) {
hook = onBeforeAppear || onBeforeEnter ;
} else {
return ;
}
}
if ( el . _leaveCb ) {
el . _leaveCb (
true
/* cancelled */
) ;
}
const leavingVNode = leavingVNodesCache [ key ] ;
if ( leavingVNode && isSameVNodeType ( vnode , leavingVNode ) && leavingVNode . el . _leaveCb ) {
leavingVNode . el . _leaveCb ( ) ;
}
callHook ( hook , [ el ] ) ;
} ,
enter ( el ) {
let hook = onEnter ;
let afterHook = onAfterEnter ;
let cancelHook = onEnterCancelled ;
if ( ! state . isMounted ) {
if ( appear ) {
hook = onAppear || onEnter ;
afterHook = onAfterAppear || onAfterEnter ;
cancelHook = onAppearCancelled || onEnterCancelled ;
} else {
return ;
}
}
let called = false ;
const done = el . _enterCb = ( cancelled ) => {
if ( called )
return ;
called = true ;
if ( cancelled ) {
callHook ( cancelHook , [ el ] ) ;
} else {
callHook ( afterHook , [ el ] ) ;
}
if ( hooks . delayedLeave ) {
hooks . delayedLeave ( ) ;
}
el . _enterCb = void 0 ;
} ;
if ( hook ) {
callAsyncHook ( hook , [ el , done ] ) ;
} else {
done ( ) ;
}
} ,
leave ( el , remove ) {
const key2 = String ( vnode . key ) ;
if ( el . _enterCb ) {
el . _enterCb (
true
/* cancelled */
) ;
}
if ( state . isUnmounting ) {
return remove ( ) ;
}
callHook ( onBeforeLeave , [ el ] ) ;
let called = false ;
const done = el . _leaveCb = ( cancelled ) => {
if ( called )
return ;
called = true ;
remove ( ) ;
if ( cancelled ) {
callHook ( onLeaveCancelled , [ el ] ) ;
} else {
callHook ( onAfterLeave , [ el ] ) ;
}
el . _leaveCb = void 0 ;
if ( leavingVNodesCache [ key2 ] === vnode ) {
delete leavingVNodesCache [ key2 ] ;
}
} ;
leavingVNodesCache [ key2 ] = vnode ;
if ( onLeave ) {
callAsyncHook ( onLeave , [ el , done ] ) ;
} else {
done ( ) ;
}
} ,
clone ( vnode2 ) {
return resolveTransitionHooks ( vnode2 , props , state , instance ) ;
}
} ;
return hooks ;
2023-07-24 11:13:08 +08:00
}
function emptyPlaceholder ( vnode ) {
2023-09-06 09:51:55 +08:00
if ( isKeepAlive ( vnode ) ) {
vnode = cloneVNode ( vnode ) ;
vnode . children = null ;
return vnode ;
}
2023-07-24 11:13:08 +08:00
}
function getKeepAliveChild ( vnode ) {
2023-09-06 09:51:55 +08:00
return isKeepAlive ( vnode ) ? vnode . children ? vnode . children [ 0 ] : void 0 : vnode ;
2023-07-24 11:13:08 +08:00
}
function setTransitionHooks ( vnode , hooks ) {
2023-09-06 09:51:55 +08:00
if ( vnode . shapeFlag & 6 && vnode . component ) {
setTransitionHooks ( vnode . component . subTree , hooks ) ;
} else if ( vnode . shapeFlag & 128 ) {
vnode . ssContent . transition = hooks . clone ( vnode . ssContent ) ;
vnode . ssFallback . transition = hooks . clone ( vnode . ssFallback ) ;
} else {
vnode . transition = hooks ;
}
2023-07-24 11:13:08 +08:00
}
function getTransitionRawChildren ( children , keepComment = false , parentKey ) {
2023-09-06 09:51:55 +08:00
let ret = [ ] ;
let keyedFragmentCount = 0 ;
for ( let i = 0 ; i < children . length ; i ++ ) {
let child = children [ i ] ;
const key = parentKey == null ? child . key : String ( parentKey ) + String ( child . key != null ? child . key : i ) ;
if ( child . type === Fragment ) {
if ( child . patchFlag & 128 )
keyedFragmentCount ++ ;
ret = ret . concat (
getTransitionRawChildren ( child . children , keepComment , key )
) ;
} else if ( keepComment || child . type !== Comment ) {
ret . push ( key != null ? cloneVNode ( child , { key } ) : child ) ;
}
}
if ( keyedFragmentCount > 1 ) {
for ( let i = 0 ; i < ret . length ; i ++ ) {
ret [ i ] . patchFlag = - 2 ;
}
}
return ret ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function defineComponent ( options , extraOptions ) {
return isFunction ( options ) ? (
// #8326: extend call and options.name access are considered side-effects
// by Rollup, so we have to wrap it in a pure-annotated IIFE.
/* @__PURE__ */ ( ( ) => extend ( { name : options . name } , extraOptions , { setup : options } ) ) ( )
) : options ;
2023-07-24 11:13:08 +08:00
}
const isAsyncWrapper = ( i ) => ! ! i . type . _ _asyncLoader ;
function defineAsyncComponent ( source ) {
2023-09-06 09:51:55 +08:00
if ( isFunction ( source ) ) {
source = { loader : source } ;
}
const {
loader ,
loadingComponent ,
errorComponent ,
delay = 200 ,
timeout ,
// undefined = never times out
suspensible = true ,
onError : userOnError
} = source ;
let pendingRequest = null ;
let resolvedComp ;
let retries = 0 ;
const retry = ( ) => {
retries ++ ;
pendingRequest = null ;
return load ( ) ;
} ;
const load = ( ) => {
let thisRequest ;
return pendingRequest || ( thisRequest = pendingRequest = loader ( ) . catch ( ( err ) => {
err = err instanceof Error ? err : new Error ( String ( err ) ) ;
if ( userOnError ) {
return new Promise ( ( resolve , reject ) => {
const userRetry = ( ) => resolve ( retry ( ) ) ;
const userFail = ( ) => reject ( err ) ;
userOnError ( err , userRetry , userFail , retries + 1 ) ;
} ) ;
} else {
throw err ;
}
} ) . then ( ( comp ) => {
if ( thisRequest !== pendingRequest && pendingRequest ) {
return pendingRequest ;
}
if ( ! comp ) {
warn (
` Async component loader resolved to undefined. If you are using retry(), make sure to return its return value. `
) ;
}
if ( comp && ( comp . _ _esModule || comp [ Symbol . toStringTag ] === "Module" ) ) {
comp = comp . default ;
}
if ( comp && ! isObject ( comp ) && ! isFunction ( comp ) ) {
throw new Error ( ` Invalid async component load result: ${ comp } ` ) ;
}
resolvedComp = comp ;
return comp ;
} ) ) ;
} ;
return defineComponent ( {
name : "AsyncComponentWrapper" ,
_ _asyncLoader : load ,
get _ _asyncResolved ( ) {
return resolvedComp ;
} ,
setup ( ) {
const instance = currentInstance ;
if ( resolvedComp ) {
return ( ) => createInnerComp ( resolvedComp , instance ) ;
}
const onError = ( err ) => {
2023-07-24 11:13:08 +08:00
pendingRequest = null ;
2023-09-06 09:51:55 +08:00
handleError (
err ,
instance ,
13 ,
! errorComponent
/* do not throw in dev if user provided error component */
) ;
} ;
if ( suspensible && instance . suspense || false ) {
return load ( ) . then ( ( comp ) => {
return ( ) => createInnerComp ( comp , instance ) ;
} ) . catch ( ( err ) => {
onError ( err ) ;
return ( ) => errorComponent ? createVNode ( errorComponent , {
error : err
} ) : null ;
} ) ;
}
const loaded = ref ( false ) ;
const error = ref ( ) ;
const delayed = ref ( ! ! delay ) ;
if ( delay ) {
setTimeout ( ( ) => {
delayed . value = false ;
} , delay ) ;
}
if ( timeout != null ) {
setTimeout ( ( ) => {
if ( ! loaded . value && ! error . value ) {
const err = new Error (
` Async component timed out after ${ timeout } ms. `
) ;
onError ( err ) ;
error . value = err ;
}
} , timeout ) ;
}
load ( ) . then ( ( ) => {
loaded . value = true ;
if ( instance . parent && isKeepAlive ( instance . parent . vnode ) ) {
queueJob ( instance . parent . update ) ;
}
} ) . catch ( ( err ) => {
onError ( err ) ;
error . value = err ;
} ) ;
return ( ) => {
if ( loaded . value && resolvedComp ) {
return createInnerComp ( resolvedComp , instance ) ;
} else if ( error . value && errorComponent ) {
return createVNode ( errorComponent , {
error : error . value
} ) ;
} else if ( loadingComponent && ! delayed . value ) {
return createVNode ( loadingComponent ) ;
}
} ;
}
} ) ;
2023-07-24 11:13:08 +08:00
}
function createInnerComp ( comp , parent ) {
2023-09-06 09:51:55 +08:00
const { ref : ref2 , props , children , ce } = parent . vnode ;
const vnode = createVNode ( comp , props , children ) ;
vnode . ref = ref2 ;
vnode . ce = ce ;
delete parent . vnode . ce ;
return vnode ;
2023-07-24 11:13:08 +08:00
}
const isKeepAlive = ( vnode ) => vnode . type . _ _isKeepAlive ;
const KeepAliveImpl = {
2023-09-06 09:51:55 +08:00
name : ` KeepAlive ` ,
// Marker for special handling inside the renderer. We are not using a ===
// check directly on KeepAlive in the renderer, because importing it directly
// would prevent it from being tree-shaken.
_ _isKeepAlive : true ,
props : {
include : [ String , RegExp , Array ] ,
exclude : [ String , RegExp , Array ] ,
max : [ String , Number ]
} ,
setup ( props , { slots } ) {
const instance = getCurrentInstance ( ) ;
const sharedContext = instance . ctx ;
const cache = /* @__PURE__ */ new Map ( ) ;
const keys = /* @__PURE__ */ new Set ( ) ;
let current = null ;
{
instance . _ _v _cache = cache ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const parentSuspense = instance . suspense ;
const {
renderer : {
p : patch ,
m : move ,
um : _unmount ,
o : { createElement }
}
} = sharedContext ;
const storageContainer = createElement ( "div" ) ;
sharedContext . activate = ( vnode , container , anchor , isSVG , optimized ) => {
const instance2 = vnode . component ;
move ( vnode , container , anchor , 0 , parentSuspense ) ;
patch (
instance2 . vnode ,
vnode ,
container ,
anchor ,
instance2 ,
parentSuspense ,
isSVG ,
vnode . slotScopeIds ,
optimized
) ;
queuePostRenderEffect ( ( ) => {
instance2 . isDeactivated = false ;
if ( instance2 . a ) {
invokeArrayFns ( instance2 . a ) ;
}
const vnodeHook = vnode . props && vnode . props . onVnodeMounted ;
if ( vnodeHook ) {
invokeVNodeHook ( vnodeHook , instance2 . parent , vnode ) ;
}
} , parentSuspense ) ;
{
devtoolsComponentAdded ( instance2 ) ;
}
} ;
sharedContext . deactivate = ( vnode ) => {
const instance2 = vnode . component ;
move ( vnode , storageContainer , null , 1 , parentSuspense ) ;
queuePostRenderEffect ( ( ) => {
if ( instance2 . da ) {
invokeArrayFns ( instance2 . da ) ;
}
const vnodeHook = vnode . props && vnode . props . onVnodeUnmounted ;
if ( vnodeHook ) {
invokeVNodeHook ( vnodeHook , instance2 . parent , vnode ) ;
}
instance2 . isDeactivated = true ;
} , parentSuspense ) ;
{
devtoolsComponentAdded ( instance2 ) ;
}
} ;
function unmount ( vnode ) {
resetShapeFlag ( vnode ) ;
_unmount ( vnode , instance , parentSuspense , true ) ;
}
function pruneCache ( filter ) {
cache . forEach ( ( vnode , key ) => {
const name = getComponentName ( vnode . type ) ;
if ( name && ( ! filter || ! filter ( name ) ) ) {
pruneCacheEntry ( key ) ;
}
} ) ;
}
function pruneCacheEntry ( key ) {
const cached = cache . get ( key ) ;
if ( ! current || ! isSameVNodeType ( cached , current ) ) {
unmount ( cached ) ;
} else if ( current ) {
resetShapeFlag ( current ) ;
}
cache . delete ( key ) ;
keys . delete ( key ) ;
}
watch (
( ) => [ props . include , props . exclude ] ,
( [ include , exclude ] ) => {
include && pruneCache ( ( name ) => matches ( include , name ) ) ;
exclude && pruneCache ( ( name ) => ! matches ( exclude , name ) ) ;
} ,
// prune post-render after `current` has been updated
{ flush : "post" , deep : true }
) ;
let pendingCacheKey = null ;
const cacheSubtree = ( ) => {
if ( pendingCacheKey != null ) {
cache . set ( pendingCacheKey , getInnerChild ( instance . subTree ) ) ;
}
} ;
onMounted ( cacheSubtree ) ;
onUpdated ( cacheSubtree ) ;
onBeforeUnmount ( ( ) => {
cache . forEach ( ( cached ) => {
const { subTree , suspense } = instance ;
const vnode = getInnerChild ( subTree ) ;
if ( cached . type === vnode . type && cached . key === vnode . key ) {
resetShapeFlag ( vnode ) ;
const da = vnode . component . da ;
da && queuePostRenderEffect ( da , suspense ) ;
return ;
}
unmount ( cached ) ;
} ) ;
} ) ;
return ( ) => {
pendingCacheKey = null ;
if ( ! slots . default ) {
return null ;
}
const children = slots . default ( ) ;
const rawVNode = children [ 0 ] ;
if ( children . length > 1 ) {
{
warn ( ` KeepAlive should contain exactly one component child. ` ) ;
}
current = null ;
return children ;
} else if ( ! isVNode ( rawVNode ) || ! ( rawVNode . shapeFlag & 4 ) && ! ( rawVNode . shapeFlag & 128 ) ) {
current = null ;
return rawVNode ;
}
let vnode = getInnerChild ( rawVNode ) ;
const comp = vnode . type ;
const name = getComponentName (
isAsyncWrapper ( vnode ) ? vnode . type . _ _asyncResolved || { } : comp
) ;
const { include , exclude , max } = props ;
if ( include && ( ! name || ! matches ( include , name ) ) || exclude && name && matches ( exclude , name ) ) {
current = vnode ;
return rawVNode ;
}
const key = vnode . key == null ? comp : vnode . key ;
const cachedVNode = cache . get ( key ) ;
if ( vnode . el ) {
vnode = cloneVNode ( vnode ) ;
if ( rawVNode . shapeFlag & 128 ) {
rawVNode . ssContent = vnode ;
}
}
pendingCacheKey = key ;
if ( cachedVNode ) {
vnode . el = cachedVNode . el ;
vnode . component = cachedVNode . component ;
if ( vnode . transition ) {
setTransitionHooks ( vnode , vnode . transition ) ;
}
vnode . shapeFlag |= 512 ;
keys . delete ( key ) ;
keys . add ( key ) ;
} else {
keys . add ( key ) ;
if ( max && keys . size > parseInt ( max , 10 ) ) {
pruneCacheEntry ( keys . values ( ) . next ( ) . value ) ;
}
}
vnode . shapeFlag |= 256 ;
current = vnode ;
return isSuspense ( rawVNode . type ) ? rawVNode : vnode ;
} ;
}
2023-07-24 11:13:08 +08:00
} ;
const KeepAlive = KeepAliveImpl ;
function matches ( pattern , name ) {
2023-09-06 09:51:55 +08:00
if ( isArray ( pattern ) ) {
return pattern . some ( ( p ) => matches ( p , name ) ) ;
} else if ( isString ( pattern ) ) {
return pattern . split ( "," ) . includes ( name ) ;
} else if ( isRegExp ( pattern ) ) {
return pattern . test ( name ) ;
}
return false ;
2023-07-24 11:13:08 +08:00
}
function onActivated ( hook , target ) {
2023-09-06 09:51:55 +08:00
registerKeepAliveHook ( hook , "a" , target ) ;
2023-07-24 11:13:08 +08:00
}
function onDeactivated ( hook , target ) {
2023-09-06 09:51:55 +08:00
registerKeepAliveHook ( hook , "da" , target ) ;
2023-07-24 11:13:08 +08:00
}
function registerKeepAliveHook ( hook , type , target = currentInstance ) {
2023-09-06 09:51:55 +08:00
const wrappedHook = hook . _ _wdc || ( hook . _ _wdc = ( ) => {
let current = target ;
while ( current ) {
if ( current . isDeactivated ) {
return ;
}
current = current . parent ;
}
return hook ( ) ;
} ) ;
injectHook ( type , wrappedHook , target ) ;
if ( target ) {
let current = target . parent ;
while ( current && current . parent ) {
if ( isKeepAlive ( current . parent . vnode ) ) {
injectToKeepAliveRoot ( wrappedHook , type , target , current ) ;
}
current = current . parent ;
}
}
2023-07-24 11:13:08 +08:00
}
function injectToKeepAliveRoot ( hook , type , target , keepAliveRoot ) {
2023-09-06 09:51:55 +08:00
const injected = injectHook (
type ,
hook ,
keepAliveRoot ,
true
/* prepend */
) ;
onUnmounted ( ( ) => {
remove ( keepAliveRoot [ type ] , injected ) ;
} , target ) ;
2023-07-24 11:13:08 +08:00
}
function resetShapeFlag ( vnode ) {
2023-09-06 09:51:55 +08:00
vnode . shapeFlag &= ~ 256 ;
vnode . shapeFlag &= ~ 512 ;
2023-07-24 11:13:08 +08:00
}
function getInnerChild ( vnode ) {
2023-09-06 09:51:55 +08:00
return vnode . shapeFlag & 128 ? vnode . ssContent : vnode ;
2023-07-24 11:13:08 +08:00
}
function injectHook ( type , hook , target = currentInstance , prepend = false ) {
2023-09-06 09:51:55 +08:00
if ( target ) {
const hooks = target [ type ] || ( target [ type ] = [ ] ) ;
const wrappedHook = hook . _ _weh || ( hook . _ _weh = ( ... args ) => {
if ( target . isUnmounted ) {
return ;
}
pauseTracking ( ) ;
setCurrentInstance ( target ) ;
const res = callWithAsyncErrorHandling ( hook , target , type , args ) ;
unsetCurrentInstance ( ) ;
resetTracking ( ) ;
return res ;
} ) ;
if ( prepend ) {
hooks . unshift ( wrappedHook ) ;
} else {
hooks . push ( wrappedHook ) ;
}
return wrappedHook ;
} else {
const apiName = toHandlerKey ( ErrorTypeStrings [ type ] . replace ( / hook$/ , "" ) ) ;
warn (
` ${ apiName } is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup(). ` + ( ` If you are using async setup(), make sure to register lifecycle hooks before the first await statement. ` )
) ;
}
}
const createHook = ( lifecycle ) => ( hook , target = currentInstance ) => (
// post-create lifecycle registrations are noops during SSR (except for serverPrefetch)
( ! isInSSRComponentSetup || lifecycle === "sp" ) && injectHook ( lifecycle , ( ... args ) => hook ( ... args ) , target )
) ;
const onBeforeMount = createHook ( "bm" ) ;
const onMounted = createHook ( "m" ) ;
const onBeforeUpdate = createHook ( "bu" ) ;
const onUpdated = createHook ( "u" ) ;
const onBeforeUnmount = createHook ( "bum" ) ;
const onUnmounted = createHook ( "um" ) ;
const onServerPrefetch = createHook ( "sp" ) ;
const onRenderTriggered = createHook (
"rtg"
) ;
const onRenderTracked = createHook (
"rtc"
) ;
2023-07-24 11:13:08 +08:00
function onErrorCaptured ( hook , target = currentInstance ) {
2023-09-06 09:51:55 +08:00
injectHook ( "ec" , hook , target ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const COMPONENTS = "components" ;
const DIRECTIVES = "directives" ;
2023-07-24 11:13:08 +08:00
function resolveComponent ( name , maybeSelfReference ) {
2023-09-06 09:51:55 +08:00
return resolveAsset ( COMPONENTS , name , true , maybeSelfReference ) || name ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const NULL _DYNAMIC _COMPONENT = Symbol . for ( "v-ndc" ) ;
2023-07-24 11:13:08 +08:00
function resolveDynamicComponent ( component ) {
2023-09-06 09:51:55 +08:00
if ( isString ( component ) ) {
return resolveAsset ( COMPONENTS , component , false ) || component ;
} else {
return component || NULL _DYNAMIC _COMPONENT ;
}
2023-07-24 11:13:08 +08:00
}
function resolveDirective ( name ) {
2023-09-06 09:51:55 +08:00
return resolveAsset ( DIRECTIVES , name ) ;
2023-07-24 11:13:08 +08:00
}
function resolveAsset ( type , name , warnMissing = true , maybeSelfReference = false ) {
2023-09-06 09:51:55 +08:00
const instance = currentRenderingInstance || currentInstance ;
if ( instance ) {
const Component = instance . type ;
if ( type === COMPONENTS ) {
const selfName = getComponentName (
Component ,
false
/* do not include inferred name to avoid breaking existing code */
) ;
if ( selfName && ( selfName === name || selfName === camelize ( name ) || selfName === capitalize ( camelize ( name ) ) ) ) {
return Component ;
}
}
const res = (
// local registration
// check instance[type] first which is resolved for options API
resolve ( instance [ type ] || Component [ type ] , name ) || // global registration
resolve ( instance . appContext [ type ] , name )
) ;
if ( ! res && maybeSelfReference ) {
return Component ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( warnMissing && ! res ) {
const extra = type === COMPONENTS ? `
If this is a native custom element , make sure to exclude it from component resolution via compilerOptions . isCustomElement . ` : ` ` ;
warn ( ` Failed to resolve ${ type . slice ( 0 , - 1 ) } : ${ name } ${ extra } ` ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return res ;
} else {
warn (
` resolve ${ capitalize ( type . slice ( 0 , - 1 ) ) } can only be used in render() or setup(). `
) ;
}
2023-07-24 11:13:08 +08:00
}
function resolve ( registry , name ) {
2023-09-06 09:51:55 +08:00
return registry && ( registry [ name ] || registry [ camelize ( name ) ] || registry [ capitalize ( camelize ( name ) ) ] ) ;
2023-07-24 11:13:08 +08:00
}
function renderList ( source , renderItem , cache , index ) {
2023-09-06 09:51:55 +08:00
let ret ;
const cached = cache && cache [ index ] ;
if ( isArray ( source ) || isString ( source ) ) {
ret = new Array ( source . length ) ;
for ( let i = 0 , l = source . length ; i < l ; i ++ ) {
ret [ i ] = renderItem ( source [ i ] , i , void 0 , cached && cached [ i ] ) ;
}
} else if ( typeof source === "number" ) {
if ( ! Number . isInteger ( source ) ) {
warn ( ` The v-for range expect an integer value but got ${ source } . ` ) ;
}
ret = new Array ( source ) ;
for ( let i = 0 ; i < source ; i ++ ) {
ret [ i ] = renderItem ( i + 1 , i , void 0 , cached && cached [ i ] ) ;
}
} else if ( isObject ( source ) ) {
if ( source [ Symbol . iterator ] ) {
ret = Array . from (
source ,
( item , i ) => renderItem ( item , i , void 0 , cached && cached [ i ] )
) ;
} else {
const keys = Object . keys ( source ) ;
ret = new Array ( keys . length ) ;
for ( let i = 0 , l = keys . length ; i < l ; i ++ ) {
const key = keys [ i ] ;
ret [ i ] = renderItem ( source [ key ] , key , i , cached && cached [ i ] ) ;
}
}
} else {
ret = [ ] ;
}
if ( cache ) {
cache [ index ] = ret ;
}
return ret ;
2023-07-24 11:13:08 +08:00
}
function createSlots ( slots , dynamicSlots ) {
2023-09-06 09:51:55 +08:00
for ( let i = 0 ; i < dynamicSlots . length ; i ++ ) {
const slot = dynamicSlots [ i ] ;
if ( isArray ( slot ) ) {
for ( let j = 0 ; j < slot . length ; j ++ ) {
slots [ slot [ j ] . name ] = slot [ j ] . fn ;
}
} else if ( slot ) {
slots [ slot . name ] = slot . key ? ( ... args ) => {
const res = slot . fn ( ... args ) ;
if ( res )
res . key = slot . key ;
return res ;
} : slot . fn ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
return slots ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function renderSlot ( slots , name , props = { } , fallback , noSlotted ) {
if ( currentRenderingInstance . isCE || currentRenderingInstance . parent && isAsyncWrapper ( currentRenderingInstance . parent ) && currentRenderingInstance . parent . isCE ) {
if ( name !== "default" )
props . name = name ;
return createVNode ( "slot" , props , fallback && fallback ( ) ) ;
}
let slot = slots [ name ] ;
if ( slot && slot . length > 1 ) {
warn (
` SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $ dynamic-slots in the parent template. `
) ;
slot = ( ) => [ ] ;
}
if ( slot && slot . _c ) {
slot . _d = false ;
}
openBlock ( ) ;
const validSlotContent = slot && ensureValidVNode ( slot ( props ) ) ;
const rendered = createBlock (
Fragment ,
{
key : props . key || // slot content array of a dynamic conditional slot may have a branch
// key attached in the `createSlots` helper, respect that
validSlotContent && validSlotContent . key || ` _ ${ name } `
} ,
validSlotContent || ( fallback ? fallback ( ) : [ ] ) ,
validSlotContent && slots . _ === 1 ? 64 : - 2
) ;
if ( ! noSlotted && rendered . scopeId ) {
rendered . slotScopeIds = [ rendered . scopeId + "-s" ] ;
}
if ( slot && slot . _c ) {
slot . _d = true ;
}
return rendered ;
2023-07-24 11:13:08 +08:00
}
function ensureValidVNode ( vnodes ) {
2023-09-06 09:51:55 +08:00
return vnodes . some ( ( child ) => {
if ( ! isVNode ( child ) )
return true ;
if ( child . type === Comment )
return false ;
if ( child . type === Fragment && ! ensureValidVNode ( child . children ) )
return false ;
return true ;
} ) ? vnodes : null ;
2023-07-24 11:13:08 +08:00
}
function toHandlers ( obj , preserveCaseIfNecessary ) {
2023-09-06 09:51:55 +08:00
const ret = { } ;
if ( ! isObject ( obj ) ) {
warn ( ` v-on with no argument expects an object value. ` ) ;
2023-07-24 11:13:08 +08:00
return ret ;
2023-09-06 09:51:55 +08:00
}
for ( const key in obj ) {
ret [ preserveCaseIfNecessary && /[A-Z]/ . test ( key ) ? ` on: ${ key } ` : toHandlerKey ( key ) ] = obj [ key ] ;
}
return ret ;
2023-07-24 11:13:08 +08:00
}
const getPublicInstance = ( i ) => {
2023-09-06 09:51:55 +08:00
if ( ! i )
return null ;
if ( isStatefulComponent ( i ) )
return getExposeProxy ( i ) || i . proxy ;
return getPublicInstance ( i . parent ) ;
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
const publicPropertiesMap = (
// Move PURE marker to new line to workaround compiler discarding it
// due to type annotation
/* @__PURE__ */ extend ( /* @__PURE__ */ Object . create ( null ) , {
$ : ( i ) => i ,
$el : ( i ) => i . vnode . el ,
$data : ( i ) => i . data ,
$props : ( i ) => shallowReadonly ( i . props ) ,
$attrs : ( i ) => shallowReadonly ( i . attrs ) ,
$slots : ( i ) => shallowReadonly ( i . slots ) ,
$refs : ( i ) => shallowReadonly ( i . refs ) ,
$parent : ( i ) => getPublicInstance ( i . parent ) ,
$root : ( i ) => getPublicInstance ( i . root ) ,
$emit : ( i ) => i . emit ,
$options : ( i ) => resolveMergedOptions ( i ) ,
$forceUpdate : ( i ) => i . f || ( i . f = ( ) => queueJob ( i . update ) ) ,
$nextTick : ( i ) => i . n || ( i . n = nextTick . bind ( i . proxy ) ) ,
$watch : ( i ) => instanceWatch . bind ( i )
} )
) ;
const isReservedPrefix = ( key ) => key === "_" || key === "$" ;
2023-07-24 11:13:08 +08:00
const hasSetupBinding = ( state , key ) => state !== EMPTY _OBJ && ! state . _ _isScriptSetup && hasOwn ( state , key ) ;
const PublicInstanceProxyHandlers = {
2023-09-06 09:51:55 +08:00
get ( { _ : instance } , key ) {
const { ctx , setupState , data , props , accessCache , type , appContext } = instance ;
if ( key === "__isVue" ) {
return true ;
}
let normalizedProps ;
if ( key [ 0 ] !== "$" ) {
const n = accessCache [ key ] ;
if ( n !== void 0 ) {
switch ( n ) {
case 1 /* SETUP */ :
return setupState [ key ] ;
case 2 /* DATA */ :
return data [ key ] ;
case 4 /* CONTEXT */ :
2023-07-24 11:13:08 +08:00
return ctx [ key ] ;
2023-09-06 09:51:55 +08:00
case 3 /* PROPS */ :
return props [ key ] ;
}
} else if ( hasSetupBinding ( setupState , key ) ) {
accessCache [ key ] = 1 /* SETUP */ ;
return setupState [ key ] ;
} else if ( data !== EMPTY _OBJ && hasOwn ( data , key ) ) {
accessCache [ key ] = 2 /* DATA */ ;
return data [ key ] ;
} else if (
// only cache other properties when instance has declared (thus stable)
// props
( normalizedProps = instance . propsOptions [ 0 ] ) && hasOwn ( normalizedProps , key )
) {
accessCache [ key ] = 3 /* PROPS */ ;
return props [ key ] ;
} else if ( ctx !== EMPTY _OBJ && hasOwn ( ctx , key ) ) {
accessCache [ key ] = 4 /* CONTEXT */ ;
return ctx [ key ] ;
} else if ( shouldCacheAccess ) {
accessCache [ key ] = 0 /* OTHER */ ;
}
}
const publicGetter = publicPropertiesMap [ key ] ;
let cssModule , globalProperties ;
if ( publicGetter ) {
if ( key === "$attrs" ) {
track ( instance , "get" , key ) ;
markAttrsAccessed ( ) ;
} else if ( key === "$slots" ) {
track ( instance , "get" , key ) ;
}
return publicGetter ( instance ) ;
} else if (
// css module (injected by vue-loader)
( cssModule = type . _ _cssModules ) && ( cssModule = cssModule [ key ] )
) {
return cssModule ;
} else if ( ctx !== EMPTY _OBJ && hasOwn ( ctx , key ) ) {
accessCache [ key ] = 4 /* CONTEXT */ ;
return ctx [ key ] ;
} else if (
// global properties
globalProperties = appContext . config . globalProperties , hasOwn ( globalProperties , key )
) {
{
return globalProperties [ key ] ;
}
} else if ( currentRenderingInstance && ( ! isString ( key ) || // #1091 avoid internal isRef/isVNode checks on component instance leading
// to infinite warning loop
key . indexOf ( "__v" ) !== 0 ) ) {
if ( data !== EMPTY _OBJ && isReservedPrefix ( key [ 0 ] ) && hasOwn ( data , key ) ) {
warn (
` Property ${ JSON . stringify (
key
) } must be accessed via $data because it starts with a reserved character ( "$" or "_" ) and is not proxied on the render context . `
) ;
} else if ( instance === currentRenderingInstance ) {
warn (
` Property ${ JSON . stringify ( key ) } was accessed during render but is not defined on instance. `
) ;
}
}
} ,
set ( { _ : instance } , key , value ) {
const { data , setupState , ctx } = instance ;
if ( hasSetupBinding ( setupState , key ) ) {
setupState [ key ] = value ;
return true ;
} else if ( setupState . _ _isScriptSetup && hasOwn ( setupState , key ) ) {
warn ( ` Cannot mutate <script setup> binding " ${ key } " from Options API. ` ) ;
return false ;
} else if ( data !== EMPTY _OBJ && hasOwn ( data , key ) ) {
data [ key ] = value ;
return true ;
} else if ( hasOwn ( instance . props , key ) ) {
warn ( ` Attempting to mutate prop " ${ key } ". Props are readonly. ` ) ;
return false ;
}
if ( key [ 0 ] === "$" && key . slice ( 1 ) in instance ) {
warn (
` Attempting to mutate public property " ${ key } ". Properties starting with $ are reserved and readonly. `
) ;
return false ;
} else {
if ( key in instance . appContext . config . globalProperties ) {
Object . defineProperty ( ctx , key , {
enumerable : true ,
configurable : true ,
value
} ) ;
} else {
ctx [ key ] = value ;
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return true ;
} ,
has ( {
_ : { data , setupState , accessCache , ctx , appContext , propsOptions }
} , key ) {
let normalizedProps ;
return ! ! accessCache [ key ] || data !== EMPTY _OBJ && hasOwn ( data , key ) || hasSetupBinding ( setupState , key ) || ( normalizedProps = propsOptions [ 0 ] ) && hasOwn ( normalizedProps , key ) || hasOwn ( ctx , key ) || hasOwn ( publicPropertiesMap , key ) || hasOwn ( appContext . config . globalProperties , key ) ;
} ,
defineProperty ( target , key , descriptor ) {
if ( descriptor . get != null ) {
target . _ . accessCache [ key ] = 0 ;
} else if ( hasOwn ( descriptor , "value" ) ) {
this . set ( target , key , descriptor . value , null ) ;
}
return Reflect . defineProperty ( target , key , descriptor ) ;
}
2023-07-24 11:13:08 +08:00
} ;
{
2023-09-06 09:51:55 +08:00
PublicInstanceProxyHandlers . ownKeys = ( target ) => {
warn (
` Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead. `
) ;
return Reflect . ownKeys ( target ) ;
} ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const RuntimeCompiledPublicInstanceProxyHandlers = /* @__PURE__ */ extend (
{ } ,
PublicInstanceProxyHandlers ,
{
2023-07-24 11:13:08 +08:00
get ( target , key ) {
2023-09-06 09:51:55 +08:00
if ( key === Symbol . unscopables ) {
return ;
}
return PublicInstanceProxyHandlers . get ( target , key , target ) ;
2023-07-24 11:13:08 +08:00
} ,
has ( _ , key ) {
2023-09-06 09:51:55 +08:00
const has = key [ 0 ] !== "_" && ! isGloballyWhitelisted ( key ) ;
if ( ! has && PublicInstanceProxyHandlers . has ( _ , key ) ) {
warn (
` Property ${ JSON . stringify (
key
) } should not start with _ which is a reserved prefix for Vue internals . `
) ;
}
return has ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
) ;
2023-07-24 11:13:08 +08:00
function createDevRenderContext ( instance ) {
2023-09-06 09:51:55 +08:00
const target = { } ;
Object . defineProperty ( target , ` _ ` , {
configurable : true ,
enumerable : false ,
get : ( ) => instance
} ) ;
Object . keys ( publicPropertiesMap ) . forEach ( ( key ) => {
Object . defineProperty ( target , key , {
configurable : true ,
enumerable : false ,
get : ( ) => publicPropertiesMap [ key ] ( instance ) ,
// intercepted by the proxy so no need for implementation,
// but needed to prevent set errors
set : NOOP
} ) ;
} ) ;
return target ;
}
function exposePropsOnRenderContext ( instance ) {
const {
ctx ,
propsOptions : [ propsOptions ]
} = instance ;
if ( propsOptions ) {
Object . keys ( propsOptions ) . forEach ( ( key ) => {
Object . defineProperty ( ctx , key , {
enumerable : true ,
2023-07-24 11:13:08 +08:00
configurable : true ,
2023-09-06 09:51:55 +08:00
get : ( ) => instance . props [ key ] ,
set : NOOP
} ) ;
2023-07-24 11:13:08 +08:00
} ) ;
2023-09-06 09:51:55 +08:00
}
}
function exposeSetupStateOnRenderContext ( instance ) {
const { ctx , setupState } = instance ;
Object . keys ( toRaw ( setupState ) ) . forEach ( ( key ) => {
if ( ! setupState . _ _isScriptSetup ) {
if ( isReservedPrefix ( key [ 0 ] ) ) {
warn (
` setup() return property ${ JSON . stringify (
key
) } should not start with "$" or "_" which are reserved prefixes for Vue internals . `
) ;
return ;
}
Object . defineProperty ( ctx , key , {
enumerable : true ,
configurable : true ,
get : ( ) => setupState [ key ] ,
set : NOOP
} ) ;
}
} ) ;
}
const warnRuntimeUsage = ( method ) => warn (
` ${ method } () is a compiler-hint helper that is only usable inside <script setup> of a single file component. Its arguments should be compiled away and passing it at runtime has no effect. `
) ;
function defineProps ( ) {
{
warnRuntimeUsage ( ` defineProps ` ) ;
}
return null ;
}
function defineEmits ( ) {
{
warnRuntimeUsage ( ` defineEmits ` ) ;
}
return null ;
}
function defineExpose ( exposed ) {
{
warnRuntimeUsage ( ` defineExpose ` ) ;
}
}
function defineOptions ( options ) {
{
warnRuntimeUsage ( ` defineOptions ` ) ;
}
}
function defineSlots ( ) {
{
warnRuntimeUsage ( ` defineSlots ` ) ;
}
return null ;
}
function defineModel ( ) {
{
warnRuntimeUsage ( "defineModel" ) ;
}
}
function withDefaults ( props , defaults ) {
{
warnRuntimeUsage ( ` withDefaults ` ) ;
}
return null ;
}
function useSlots ( ) {
return getContext ( ) . slots ;
}
function useAttrs ( ) {
return getContext ( ) . attrs ;
}
function useModel ( props , name , options ) {
const i = getCurrentInstance ( ) ;
if ( ! i ) {
warn ( ` useModel() called without active instance. ` ) ;
return ref ( ) ;
}
if ( ! i . propsOptions [ 0 ] [ name ] ) {
warn ( ` useModel() called with prop " ${ name } " which is not declared. ` ) ;
return ref ( ) ;
}
if ( options && options . local ) {
const proxy = ref ( props [ name ] ) ;
watch (
( ) => props [ name ] ,
( v ) => proxy . value = v
) ;
watch ( proxy , ( value ) => {
if ( value !== props [ name ] ) {
i . emit ( ` update: ${ name } ` , value ) ;
}
2023-07-24 11:13:08 +08:00
} ) ;
2023-09-06 09:51:55 +08:00
return proxy ;
} else {
return {
_ _v _isRef : true ,
get value ( ) {
return props [ name ] ;
} ,
set value ( value ) {
i . emit ( ` update: ${ name } ` , value ) ;
}
} ;
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function getContext ( ) {
const i = getCurrentInstance ( ) ;
if ( ! i ) {
warn ( ` useContext() called without active instance. ` ) ;
}
return i . setupContext || ( i . setupContext = createSetupContext ( i ) ) ;
}
function normalizePropsOrEmits ( props ) {
return isArray ( props ) ? props . reduce (
( normalized , p ) => ( normalized [ p ] = null , normalized ) ,
{ }
) : props ;
}
function mergeDefaults ( raw , defaults ) {
const props = normalizePropsOrEmits ( raw ) ;
for ( const key in defaults ) {
if ( key . startsWith ( "__skip" ) )
continue ;
let opt = props [ key ] ;
if ( opt ) {
if ( isArray ( opt ) || isFunction ( opt ) ) {
opt = props [ key ] = { type : opt , default : defaults [ key ] } ;
} else {
opt . default = defaults [ key ] ;
}
} else if ( opt === null ) {
opt = props [ key ] = { default : defaults [ key ] } ;
} else {
warn ( ` props default key " ${ key } " has no corresponding declaration. ` ) ;
}
if ( opt && defaults [ ` __skip_ ${ key } ` ] ) {
opt . skipFactory = true ;
}
}
return props ;
}
function mergeModels ( a , b ) {
if ( ! a || ! b )
return a || b ;
if ( isArray ( a ) && isArray ( b ) )
return a . concat ( b ) ;
return extend ( { } , normalizePropsOrEmits ( a ) , normalizePropsOrEmits ( b ) ) ;
}
function createPropsRestProxy ( props , excludedKeys ) {
const ret = { } ;
for ( const key in props ) {
if ( ! excludedKeys . includes ( key ) ) {
Object . defineProperty ( ret , key , {
enumerable : true ,
get : ( ) => props [ key ]
} ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
return ret ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function withAsyncContext ( getAwaitable ) {
const ctx = getCurrentInstance ( ) ;
if ( ! ctx ) {
warn (
` withAsyncContext called without active current instance. This is likely a bug. `
) ;
}
let awaitable = getAwaitable ( ) ;
unsetCurrentInstance ( ) ;
if ( isPromise ( awaitable ) ) {
awaitable = awaitable . catch ( ( e ) => {
setCurrentInstance ( ctx ) ;
throw e ;
2023-07-24 11:13:08 +08:00
} ) ;
2023-09-06 09:51:55 +08:00
}
return [ awaitable , ( ) => setCurrentInstance ( ctx ) ] ;
2023-07-24 11:13:08 +08:00
}
function createDuplicateChecker ( ) {
2023-09-06 09:51:55 +08:00
const cache = /* @__PURE__ */ Object . create ( null ) ;
return ( type , key ) => {
if ( cache [ key ] ) {
warn ( ` ${ type } property " ${ key } " is already defined in ${ cache [ key ] } . ` ) ;
} else {
cache [ key ] = type ;
}
} ;
2023-07-24 11:13:08 +08:00
}
let shouldCacheAccess = true ;
function applyOptions ( instance ) {
2023-09-06 09:51:55 +08:00
const options = resolveMergedOptions ( instance ) ;
const publicThis = instance . proxy ;
const ctx = instance . ctx ;
shouldCacheAccess = false ;
if ( options . beforeCreate ) {
callHook$1 ( options . beforeCreate , instance , "bc" ) ;
}
const {
2023-07-24 11:13:08 +08:00
// state
2023-09-06 09:51:55 +08:00
data : dataOptions ,
computed : computedOptions ,
methods ,
watch : watchOptions ,
provide : provideOptions ,
inject : injectOptions ,
2023-07-24 11:13:08 +08:00
// lifecycle
2023-09-06 09:51:55 +08:00
created ,
beforeMount ,
mounted ,
beforeUpdate ,
updated ,
activated ,
deactivated ,
beforeDestroy ,
beforeUnmount ,
destroyed ,
unmounted ,
render ,
renderTracked ,
renderTriggered ,
errorCaptured ,
serverPrefetch ,
2023-07-24 11:13:08 +08:00
// public API
2023-09-06 09:51:55 +08:00
expose ,
inheritAttrs ,
2023-07-24 11:13:08 +08:00
// assets
2023-09-06 09:51:55 +08:00
components ,
directives ,
filters
} = options ;
const checkDuplicateProperties = createDuplicateChecker ( ) ;
{
const [ propsOptions ] = instance . propsOptions ;
if ( propsOptions ) {
for ( const key in propsOptions ) {
checkDuplicateProperties ( "Props" /* PROPS */ , key ) ;
}
}
}
if ( injectOptions ) {
resolveInjections ( injectOptions , ctx , checkDuplicateProperties ) ;
}
if ( methods ) {
for ( const key in methods ) {
const methodHandler = methods [ key ] ;
if ( isFunction ( methodHandler ) ) {
{
Object . defineProperty ( ctx , key , {
value : methodHandler . bind ( publicThis ) ,
configurable : true ,
enumerable : true ,
writable : true
} ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
{
checkDuplicateProperties ( "Methods" /* METHODS */ , key ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} else {
warn (
` Method " ${ key } " has type " ${ typeof methodHandler } " in the component definition. Did you reference the function correctly? `
) ;
}
}
}
if ( dataOptions ) {
if ( ! isFunction ( dataOptions ) ) {
warn (
` The data option must be a function. Plain object usage is no longer supported. `
) ;
}
const data = dataOptions . call ( publicThis , publicThis ) ;
if ( isPromise ( data ) ) {
warn (
` data() returned a Promise - note data() cannot be async; If you intend to perform data fetching before component renders, use async setup() + <Suspense>. `
) ;
}
if ( ! isObject ( data ) ) {
warn ( ` data() should return an object. ` ) ;
} else {
instance . data = reactive ( data ) ;
{
for ( const key in data ) {
checkDuplicateProperties ( "Data" /* DATA */ , key ) ;
if ( ! isReservedPrefix ( key [ 0 ] ) ) {
2023-07-24 11:13:08 +08:00
Object . defineProperty ( ctx , key , {
2023-09-06 09:51:55 +08:00
configurable : true ,
enumerable : true ,
get : ( ) => data [ key ] ,
set : NOOP
2023-07-24 11:13:08 +08:00
} ) ;
2023-09-06 09:51:55 +08:00
}
}
}
}
}
shouldCacheAccess = true ;
if ( computedOptions ) {
for ( const key in computedOptions ) {
const opt = computedOptions [ key ] ;
const get = isFunction ( opt ) ? opt . bind ( publicThis , publicThis ) : isFunction ( opt . get ) ? opt . get . bind ( publicThis , publicThis ) : NOOP ;
if ( get === NOOP ) {
warn ( ` Computed property " ${ key } " has no getter. ` ) ;
}
const set = ! isFunction ( opt ) && isFunction ( opt . set ) ? opt . set . bind ( publicThis ) : ( ) => {
warn (
` Write operation failed: computed property " ${ key } " is readonly. `
) ;
} ;
const c = computed ( {
get ,
set
} ) ;
Object . defineProperty ( ctx , key , {
enumerable : true ,
configurable : true ,
get : ( ) => c . value ,
set : ( v ) => c . value = v
} ) ;
{
checkDuplicateProperties ( "Computed" /* COMPUTED */ , key ) ;
}
}
}
if ( watchOptions ) {
for ( const key in watchOptions ) {
createWatcher ( watchOptions [ key ] , ctx , publicThis , key ) ;
}
}
if ( provideOptions ) {
const provides = isFunction ( provideOptions ) ? provideOptions . call ( publicThis ) : provideOptions ;
Reflect . ownKeys ( provides ) . forEach ( ( key ) => {
provide ( key , provides [ key ] ) ;
} ) ;
}
if ( created ) {
callHook$1 ( created , instance , "c" ) ;
}
function registerLifecycleHook ( register , hook ) {
if ( isArray ( hook ) ) {
hook . forEach ( ( _hook ) => register ( _hook . bind ( publicThis ) ) ) ;
} else if ( hook ) {
register ( hook . bind ( publicThis ) ) ;
}
}
registerLifecycleHook ( onBeforeMount , beforeMount ) ;
registerLifecycleHook ( onMounted , mounted ) ;
registerLifecycleHook ( onBeforeUpdate , beforeUpdate ) ;
registerLifecycleHook ( onUpdated , updated ) ;
registerLifecycleHook ( onActivated , activated ) ;
registerLifecycleHook ( onDeactivated , deactivated ) ;
registerLifecycleHook ( onErrorCaptured , errorCaptured ) ;
registerLifecycleHook ( onRenderTracked , renderTracked ) ;
registerLifecycleHook ( onRenderTriggered , renderTriggered ) ;
registerLifecycleHook ( onBeforeUnmount , beforeUnmount ) ;
registerLifecycleHook ( onUnmounted , unmounted ) ;
registerLifecycleHook ( onServerPrefetch , serverPrefetch ) ;
if ( isArray ( expose ) ) {
if ( expose . length ) {
const exposed = instance . exposed || ( instance . exposed = { } ) ;
expose . forEach ( ( key ) => {
Object . defineProperty ( exposed , key , {
get : ( ) => publicThis [ key ] ,
set : ( val ) => publicThis [ key ] = val
2023-07-24 11:13:08 +08:00
} ) ;
2023-09-06 09:51:55 +08:00
} ) ;
} else if ( ! instance . exposed ) {
instance . exposed = { } ;
}
}
if ( render && instance . render === NOOP ) {
instance . render = render ;
}
if ( inheritAttrs != null ) {
instance . inheritAttrs = inheritAttrs ;
}
if ( components )
instance . components = components ;
if ( directives )
instance . directives = directives ;
}
function resolveInjections ( injectOptions , ctx , checkDuplicateProperties = NOOP ) {
if ( isArray ( injectOptions ) ) {
injectOptions = normalizeInject ( injectOptions ) ;
}
for ( const key in injectOptions ) {
const opt = injectOptions [ key ] ;
let injected ;
if ( isObject ( opt ) ) {
if ( "default" in opt ) {
injected = inject (
opt . from || key ,
opt . default ,
true
/* treat default function as factory */
) ;
} else {
injected = inject ( opt . from || key ) ;
}
} else {
injected = inject ( opt ) ;
}
if ( isRef ( injected ) ) {
Object . defineProperty ( ctx , key , {
enumerable : true ,
configurable : true ,
get : ( ) => injected . value ,
set : ( v ) => injected . value = v
} ) ;
} else {
ctx [ key ] = injected ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
{
checkDuplicateProperties ( "Inject" /* INJECT */ , key ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function callHook$1 ( hook , instance , type ) {
callWithAsyncErrorHandling (
isArray ( hook ) ? hook . map ( ( h ) => h . bind ( instance . proxy ) ) : hook . bind ( instance . proxy ) ,
instance ,
type
) ;
2023-07-24 11:13:08 +08:00
}
function createWatcher ( raw , ctx , publicThis , key ) {
2023-09-06 09:51:55 +08:00
const getter = key . includes ( "." ) ? createPathGetter ( publicThis , key ) : ( ) => publicThis [ key ] ;
if ( isString ( raw ) ) {
const handler = ctx [ raw ] ;
if ( isFunction ( handler ) ) {
watch ( getter , handler ) ;
} else {
warn ( ` Invalid watch handler specified by key " ${ raw } " ` , handler ) ;
}
} else if ( isFunction ( raw ) ) {
watch ( getter , raw . bind ( publicThis ) ) ;
} else if ( isObject ( raw ) ) {
if ( isArray ( raw ) ) {
raw . forEach ( ( r ) => createWatcher ( r , ctx , publicThis , key ) ) ;
} else {
const handler = isFunction ( raw . handler ) ? raw . handler . bind ( publicThis ) : ctx [ raw . handler ] ;
if ( isFunction ( handler ) ) {
watch ( getter , handler , raw ) ;
} else {
warn ( ` Invalid watch handler specified by key " ${ raw . handler } " ` , handler ) ;
}
}
} else {
warn ( ` Invalid watch option: " ${ key } " ` , raw ) ;
}
2023-07-24 11:13:08 +08:00
}
function resolveMergedOptions ( instance ) {
2023-09-06 09:51:55 +08:00
const base = instance . type ;
const { mixins , extends : extendsOptions } = base ;
const {
mixins : globalMixins ,
optionsCache : cache ,
config : { optionMergeStrategies }
} = instance . appContext ;
const cached = cache . get ( base ) ;
let resolved ;
if ( cached ) {
resolved = cached ;
} else if ( ! globalMixins . length && ! mixins && ! extendsOptions ) {
{
resolved = base ;
}
} else {
resolved = { } ;
if ( globalMixins . length ) {
globalMixins . forEach (
( m ) => mergeOptions ( resolved , m , optionMergeStrategies , true )
) ;
}
mergeOptions ( resolved , base , optionMergeStrategies ) ;
}
if ( isObject ( base ) ) {
cache . set ( base , resolved ) ;
}
return resolved ;
2023-07-24 11:13:08 +08:00
}
function mergeOptions ( to , from , strats , asMixin = false ) {
2023-09-06 09:51:55 +08:00
const { mixins , extends : extendsOptions } = from ;
if ( extendsOptions ) {
mergeOptions ( to , extendsOptions , strats , true ) ;
}
if ( mixins ) {
mixins . forEach (
( m ) => mergeOptions ( to , m , strats , true )
) ;
}
for ( const key in from ) {
if ( asMixin && key === "expose" ) {
warn (
` "expose" option is ignored when declared in mixins or extends. It should only be declared in the base component itself. `
) ;
} else {
const strat = internalOptionMergeStrats [ key ] || strats && strats [ key ] ;
to [ key ] = strat ? strat ( to [ key ] , from [ key ] ) : from [ key ] ;
}
}
return to ;
2023-07-24 11:13:08 +08:00
}
const internalOptionMergeStrats = {
2023-09-06 09:51:55 +08:00
data : mergeDataFn ,
props : mergeEmitsOrPropsOptions ,
emits : mergeEmitsOrPropsOptions ,
// objects
methods : mergeObjectOptions ,
computed : mergeObjectOptions ,
// lifecycle
beforeCreate : mergeAsArray ,
created : mergeAsArray ,
beforeMount : mergeAsArray ,
mounted : mergeAsArray ,
beforeUpdate : mergeAsArray ,
updated : mergeAsArray ,
beforeDestroy : mergeAsArray ,
beforeUnmount : mergeAsArray ,
destroyed : mergeAsArray ,
unmounted : mergeAsArray ,
activated : mergeAsArray ,
deactivated : mergeAsArray ,
errorCaptured : mergeAsArray ,
serverPrefetch : mergeAsArray ,
// assets
components : mergeObjectOptions ,
directives : mergeObjectOptions ,
// watch
watch : mergeWatchOptions ,
// provide / inject
provide : mergeDataFn ,
inject : mergeInject
2023-07-24 11:13:08 +08:00
} ;
function mergeDataFn ( to , from ) {
2023-09-06 09:51:55 +08:00
if ( ! from ) {
return to ;
}
if ( ! to ) {
return from ;
}
return function mergedDataFn ( ) {
return ( extend ) (
isFunction ( to ) ? to . call ( this , this ) : to ,
isFunction ( from ) ? from . call ( this , this ) : from
) ;
} ;
2023-07-24 11:13:08 +08:00
}
function mergeInject ( to , from ) {
2023-09-06 09:51:55 +08:00
return mergeObjectOptions ( normalizeInject ( to ) , normalizeInject ( from ) ) ;
2023-07-24 11:13:08 +08:00
}
function normalizeInject ( raw ) {
2023-09-06 09:51:55 +08:00
if ( isArray ( raw ) ) {
const res = { } ;
for ( let i = 0 ; i < raw . length ; i ++ ) {
res [ raw [ i ] ] = raw [ i ] ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return res ;
}
return raw ;
2023-07-24 11:13:08 +08:00
}
function mergeAsArray ( to , from ) {
2023-09-06 09:51:55 +08:00
return to ? [ ... new Set ( [ ] . concat ( to , from ) ) ] : from ;
2023-07-24 11:13:08 +08:00
}
function mergeObjectOptions ( to , from ) {
2023-09-06 09:51:55 +08:00
return to ? extend ( /* @__PURE__ */ Object . create ( null ) , to , from ) : from ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function mergeEmitsOrPropsOptions ( to , from ) {
if ( to ) {
if ( isArray ( to ) && isArray ( from ) ) {
return [ ... /* @__PURE__ */ new Set ( [ ... to , ... from ] ) ] ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return extend (
/* @__PURE__ */ Object . create ( null ) ,
normalizePropsOrEmits ( to ) ,
normalizePropsOrEmits ( from != null ? from : { } )
) ;
} else {
return from ;
}
}
function mergeWatchOptions ( to , from ) {
if ( ! to )
return from ;
if ( ! from )
return to ;
const merged = extend ( /* @__PURE__ */ Object . create ( null ) , to ) ;
for ( const key in from ) {
merged [ key ] = mergeAsArray ( to [ key ] , from [ key ] ) ;
}
return merged ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function createAppContext ( ) {
return {
app : null ,
config : {
isNativeTag : NO ,
performance : false ,
globalProperties : { } ,
optionMergeStrategies : { } ,
errorHandler : void 0 ,
warnHandler : void 0 ,
compilerOptions : { }
} ,
mixins : [ ] ,
components : { } ,
directives : { } ,
provides : /* @__PURE__ */ Object . create ( null ) ,
optionsCache : /* @__PURE__ */ new WeakMap ( ) ,
propsCache : /* @__PURE__ */ new WeakMap ( ) ,
emitsCache : /* @__PURE__ */ new WeakMap ( )
} ;
}
let uid$1 = 0 ;
function createAppAPI ( render , hydrate ) {
return function createApp ( rootComponent , rootProps = null ) {
if ( ! isFunction ( rootComponent ) ) {
rootComponent = extend ( { } , rootComponent ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( rootProps != null && ! isObject ( rootProps ) ) {
warn ( ` root props passed to app.mount() must be an object. ` ) ;
rootProps = null ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const context = createAppContext ( ) ;
{
Object . defineProperty ( context . config , "unwrapInjectedRef" , {
get ( ) {
return true ;
} ,
set ( ) {
warn (
` app.config.unwrapInjectedRef has been deprecated. 3.3 now alawys unwraps injected refs in Options API. `
) ;
}
} ) ;
}
const installedPlugins = /* @__PURE__ */ new Set ( ) ;
let isMounted = false ;
const app = context . app = {
_uid : uid$1 ++ ,
_component : rootComponent ,
_props : rootProps ,
_container : null ,
_context : context ,
_instance : null ,
version ,
get config ( ) {
return context . config ;
} ,
set config ( v ) {
{
warn (
` app.config cannot be replaced. Modify individual options instead. `
) ;
}
} ,
use ( plugin , ... options ) {
if ( installedPlugins . has ( plugin ) ) {
warn ( ` Plugin has already been applied to target app. ` ) ;
} else if ( plugin && isFunction ( plugin . install ) ) {
installedPlugins . add ( plugin ) ;
plugin . install ( app , ... options ) ;
} else if ( isFunction ( plugin ) ) {
installedPlugins . add ( plugin ) ;
plugin ( app , ... options ) ;
} else {
warn (
` A plugin must either be a function or an object with an "install" function. `
) ;
}
return app ;
} ,
mixin ( mixin ) {
{
if ( ! context . mixins . includes ( mixin ) ) {
context . mixins . push ( mixin ) ;
} else {
warn (
"Mixin has already been applied to target app" + ( mixin . name ? ` : ${ mixin . name } ` : "" )
) ;
}
}
return app ;
} ,
component ( name , component ) {
{
validateComponentName ( name , context . config ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( ! component ) {
return context . components [ name ] ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( context . components [ name ] ) {
warn ( ` Component " ${ name } " has already been registered in target app. ` ) ;
}
context . components [ name ] = component ;
return app ;
} ,
directive ( name , directive ) {
{
validateDirectiveName ( name ) ;
}
if ( ! directive ) {
return context . directives [ name ] ;
}
if ( context . directives [ name ] ) {
warn ( ` Directive " ${ name } " has already been registered in target app. ` ) ;
}
context . directives [ name ] = directive ;
return app ;
} ,
mount ( rootContainer , isHydrate , isSVG ) {
if ( ! isMounted ) {
if ( rootContainer . _ _vue _app _ _ ) {
warn (
` There is already an app instance mounted on the host container.
If you want to mount another app on the same host container , you need to unmount the previous app by calling \ ` app.unmount() \` first. `
) ;
}
const vnode = createVNode (
rootComponent ,
rootProps
) ;
vnode . appContext = context ;
{
context . reload = ( ) => {
render ( cloneVNode ( vnode ) , rootContainer , isSVG ) ;
} ;
}
if ( isHydrate && hydrate ) {
hydrate ( vnode , rootContainer ) ;
} else {
render ( vnode , rootContainer , isSVG ) ;
}
isMounted = true ;
app . _container = rootContainer ;
rootContainer . _ _vue _app _ _ = app ;
{
app . _instance = vnode . component ;
devtoolsInitApp ( app , version ) ;
}
return getExposeProxy ( vnode . component ) || vnode . component . proxy ;
} else {
warn (
` App has already been mounted.
If you want to remount the same app , move your app creation logic into a factory function and create fresh app instances for each mount - e . g . \ ` const createMyApp = () => createApp(App) \` `
) ;
}
} ,
unmount ( ) {
if ( isMounted ) {
render ( null , app . _container ) ;
{
app . _instance = null ;
devtoolsUnmountApp ( app ) ;
}
delete app . _container . _ _vue _app _ _ ;
} else {
warn ( ` Cannot unmount an app that is not mounted. ` ) ;
}
} ,
provide ( key , value ) {
if ( key in context . provides ) {
warn (
` App already provides property with key " ${ String ( key ) } ". It will be overwritten with the new value. `
) ;
}
context . provides [ key ] = value ;
return app ;
} ,
runWithContext ( fn ) {
currentApp = app ;
try {
return fn ( ) ;
} finally {
currentApp = null ;
}
}
} ;
return app ;
} ;
}
let currentApp = null ;
function provide ( key , value ) {
if ( ! currentInstance ) {
{
warn ( ` provide() can only be used inside setup(). ` ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} else {
let provides = currentInstance . provides ;
const parentProvides = currentInstance . parent && currentInstance . parent . provides ;
if ( parentProvides === provides ) {
provides = currentInstance . provides = Object . create ( parentProvides ) ;
}
provides [ key ] = value ;
}
}
function inject ( key , defaultValue , treatDefaultAsFactory = false ) {
const instance = currentInstance || currentRenderingInstance ;
if ( instance || currentApp ) {
const provides = instance ? instance . parent == null ? instance . vnode . appContext && instance . vnode . appContext . provides : instance . parent . provides : currentApp . _context . provides ;
if ( provides && key in provides ) {
return provides [ key ] ;
} else if ( arguments . length > 1 ) {
return treatDefaultAsFactory && isFunction ( defaultValue ) ? defaultValue . call ( instance && instance . proxy ) : defaultValue ;
} else {
warn ( ` injection " ${ String ( key ) } " not found. ` ) ;
}
} else {
warn ( ` inject() can only be used inside setup() or functional components. ` ) ;
}
}
function hasInjectionContext ( ) {
return ! ! ( currentInstance || currentRenderingInstance || currentApp ) ;
}
function initProps ( instance , rawProps , isStateful , isSSR = false ) {
const props = { } ;
const attrs = { } ;
def ( attrs , InternalObjectKey , 1 ) ;
instance . propsDefaults = /* @__PURE__ */ Object . create ( null ) ;
setFullProps ( instance , rawProps , props , attrs ) ;
for ( const key in instance . propsOptions [ 0 ] ) {
if ( ! ( key in props ) ) {
props [ key ] = void 0 ;
}
}
{
validateProps ( rawProps || { } , props , instance ) ;
}
if ( isStateful ) {
instance . props = isSSR ? props : shallowReactive ( props ) ;
} else {
if ( ! instance . type . props ) {
instance . props = attrs ;
} else {
instance . props = props ;
}
}
instance . attrs = attrs ;
2023-07-24 11:13:08 +08:00
}
function isInHmrContext ( instance ) {
2023-09-06 09:51:55 +08:00
while ( instance ) {
if ( instance . type . _ _hmrId )
return true ;
instance = instance . parent ;
}
2023-07-24 11:13:08 +08:00
}
function updateProps ( instance , rawProps , rawPrevProps , optimized ) {
2023-09-06 09:51:55 +08:00
const {
props ,
attrs ,
vnode : { patchFlag }
} = instance ;
const rawCurrentProps = toRaw ( props ) ;
const [ options ] = instance . propsOptions ;
let hasAttrsChanged = false ;
if (
2023-07-24 11:13:08 +08:00
// always force full diff in dev
// - #1942 if hmr is enabled with sfc component
// - vite#872 non-sfc component used by sfc component
2023-09-06 09:51:55 +08:00
! isInHmrContext ( instance ) && ( optimized || patchFlag > 0 ) && ! ( patchFlag & 16 )
) {
if ( patchFlag & 8 ) {
const propsToUpdate = instance . vnode . dynamicProps ;
for ( let i = 0 ; i < propsToUpdate . length ; i ++ ) {
let key = propsToUpdate [ i ] ;
if ( isEmitListener ( instance . emitsOptions , key ) ) {
continue ;
}
const value = rawProps [ key ] ;
if ( options ) {
if ( hasOwn ( attrs , key ) ) {
if ( value !== attrs [ key ] ) {
attrs [ key ] = value ;
hasAttrsChanged = true ;
}
} else {
const camelizedKey = camelize ( key ) ;
props [ camelizedKey ] = resolvePropValue (
options ,
rawCurrentProps ,
camelizedKey ,
value ,
instance ,
false
/* isAbsent */
) ;
}
} else {
if ( value !== attrs [ key ] ) {
attrs [ key ] = value ;
2023-07-24 11:13:08 +08:00
hasAttrsChanged = true ;
2023-09-06 09:51:55 +08:00
}
}
}
}
} else {
if ( setFullProps ( instance , rawProps , props , attrs ) ) {
hasAttrsChanged = true ;
}
let kebabKey ;
for ( const key in rawCurrentProps ) {
if ( ! rawProps || // for camelCase
! hasOwn ( rawProps , key ) && // it's possible the original props was passed in as kebab-case
// and converted to camelCase (#955)
( ( kebabKey = hyphenate ( key ) ) === key || ! hasOwn ( rawProps , kebabKey ) ) ) {
if ( options ) {
if ( rawPrevProps && // for camelCase
( rawPrevProps [ key ] !== void 0 || // for kebab-case
rawPrevProps [ kebabKey ] !== void 0 ) ) {
props [ key ] = resolvePropValue (
options ,
rawCurrentProps ,
key ,
void 0 ,
instance ,
true
/* isAbsent */
) ;
}
} else {
delete props [ key ] ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( attrs !== rawCurrentProps ) {
for ( const key in attrs ) {
if ( ! rawProps || ! hasOwn ( rawProps , key ) && true ) {
delete attrs [ key ] ;
hasAttrsChanged = true ;
}
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
if ( hasAttrsChanged ) {
trigger ( instance , "set" , "$attrs" ) ;
}
{
validateProps ( rawProps || { } , props , instance ) ;
}
2023-07-24 11:13:08 +08:00
}
function setFullProps ( instance , rawProps , props , attrs ) {
2023-09-06 09:51:55 +08:00
const [ options , needCastKeys ] = instance . propsOptions ;
let hasAttrsChanged = false ;
let rawCastValues ;
if ( rawProps ) {
for ( let key in rawProps ) {
if ( isReservedProp ( key ) ) {
continue ;
}
const value = rawProps [ key ] ;
let camelKey ;
if ( options && hasOwn ( options , camelKey = camelize ( key ) ) ) {
if ( ! needCastKeys || ! needCastKeys . includes ( camelKey ) ) {
props [ camelKey ] = value ;
} else {
( rawCastValues || ( rawCastValues = { } ) ) [ camelKey ] = value ;
}
} else if ( ! isEmitListener ( instance . emitsOptions , key ) ) {
if ( ! ( key in attrs ) || value !== attrs [ key ] ) {
attrs [ key ] = value ;
hasAttrsChanged = true ;
}
}
}
}
if ( needCastKeys ) {
const rawCurrentProps = toRaw ( props ) ;
const castValues = rawCastValues || EMPTY _OBJ ;
for ( let i = 0 ; i < needCastKeys . length ; i ++ ) {
const key = needCastKeys [ i ] ;
props [ key ] = resolvePropValue (
options ,
rawCurrentProps ,
key ,
castValues [ key ] ,
instance ,
! hasOwn ( castValues , key )
) ;
}
}
return hasAttrsChanged ;
2023-07-24 11:13:08 +08:00
}
function resolvePropValue ( options , props , key , value , instance , isAbsent ) {
2023-09-06 09:51:55 +08:00
const opt = options [ key ] ;
if ( opt != null ) {
const hasDefault = hasOwn ( opt , "default" ) ;
if ( hasDefault && value === void 0 ) {
const defaultValue = opt . default ;
if ( opt . type !== Function && ! opt . skipFactory && isFunction ( defaultValue ) ) {
const { propsDefaults } = instance ;
if ( key in propsDefaults ) {
value = propsDefaults [ key ] ;
} else {
setCurrentInstance ( instance ) ;
value = propsDefaults [ key ] = defaultValue . call (
null ,
props
) ;
unsetCurrentInstance ( ) ;
}
} else {
value = defaultValue ;
}
}
if ( opt [ 0 /* shouldCast */ ] ) {
if ( isAbsent && ! hasDefault ) {
value = false ;
} else if ( opt [ 1 /* shouldCastTrue */ ] && ( value === "" || value === hyphenate ( key ) ) ) {
value = true ;
}
}
}
return value ;
2023-07-24 11:13:08 +08:00
}
function normalizePropsOptions ( comp , appContext , asMixin = false ) {
2023-09-06 09:51:55 +08:00
const cache = appContext . propsCache ;
const cached = cache . get ( comp ) ;
if ( cached ) {
return cached ;
}
const raw = comp . props ;
const normalized = { } ;
const needCastKeys = [ ] ;
let hasExtends = false ;
if ( ! isFunction ( comp ) ) {
const extendProps = ( raw2 ) => {
hasExtends = true ;
const [ props , keys ] = normalizePropsOptions ( raw2 , appContext , true ) ;
extend ( normalized , props ) ;
if ( keys )
needCastKeys . push ( ... keys ) ;
} ;
if ( ! asMixin && appContext . mixins . length ) {
appContext . mixins . forEach ( extendProps ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( comp . extends ) {
extendProps ( comp . extends ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( comp . mixins ) {
comp . mixins . forEach ( extendProps ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
if ( ! raw && ! hasExtends ) {
2023-07-24 11:13:08 +08:00
if ( isObject ( comp ) ) {
2023-09-06 09:51:55 +08:00
cache . set ( comp , EMPTY _ARR ) ;
}
return EMPTY _ARR ;
}
if ( isArray ( raw ) ) {
for ( let i = 0 ; i < raw . length ; i ++ ) {
if ( ! isString ( raw [ i ] ) ) {
warn ( ` props must be strings when using array syntax. ` , raw [ i ] ) ;
}
const normalizedKey = camelize ( raw [ i ] ) ;
if ( validatePropName ( normalizedKey ) ) {
normalized [ normalizedKey ] = EMPTY _OBJ ;
}
}
} else if ( raw ) {
if ( ! isObject ( raw ) ) {
warn ( ` invalid props options ` , raw ) ;
}
for ( const key in raw ) {
const normalizedKey = camelize ( key ) ;
if ( validatePropName ( normalizedKey ) ) {
const opt = raw [ key ] ;
const prop = normalized [ normalizedKey ] = isArray ( opt ) || isFunction ( opt ) ? { type : opt } : extend ( { } , opt ) ;
if ( prop ) {
const booleanIndex = getTypeIndex ( Boolean , prop . type ) ;
const stringIndex = getTypeIndex ( String , prop . type ) ;
prop [ 0 /* shouldCast */ ] = booleanIndex > - 1 ;
prop [ 1 /* shouldCastTrue */ ] = stringIndex < 0 || booleanIndex < stringIndex ;
if ( booleanIndex > - 1 || hasOwn ( prop , "default" ) ) {
needCastKeys . push ( normalizedKey ) ;
}
}
}
}
}
const res = [ normalized , needCastKeys ] ;
if ( isObject ( comp ) ) {
cache . set ( comp , res ) ;
}
return res ;
2023-07-24 11:13:08 +08:00
}
function validatePropName ( key ) {
2023-09-06 09:51:55 +08:00
if ( key [ 0 ] !== "$" ) {
return true ;
} else {
warn ( ` Invalid prop name: " ${ key } " is a reserved property. ` ) ;
}
return false ;
2023-07-24 11:13:08 +08:00
}
function getType ( ctor ) {
2023-09-06 09:51:55 +08:00
const match = ctor && ctor . toString ( ) . match ( /^\s*(function|class) (\w+)/ ) ;
return match ? match [ 2 ] : ctor === null ? "null" : "" ;
2023-07-24 11:13:08 +08:00
}
function isSameType ( a , b ) {
2023-09-06 09:51:55 +08:00
return getType ( a ) === getType ( b ) ;
2023-07-24 11:13:08 +08:00
}
function getTypeIndex ( type , expectedTypes ) {
2023-09-06 09:51:55 +08:00
if ( isArray ( expectedTypes ) ) {
return expectedTypes . findIndex ( ( t ) => isSameType ( t , type ) ) ;
} else if ( isFunction ( expectedTypes ) ) {
return isSameType ( expectedTypes , type ) ? 0 : - 1 ;
}
return - 1 ;
2023-07-24 11:13:08 +08:00
}
function validateProps ( rawProps , props , instance ) {
2023-09-06 09:51:55 +08:00
const resolvedValues = toRaw ( props ) ;
const options = instance . propsOptions [ 0 ] ;
for ( const key in options ) {
let opt = options [ key ] ;
if ( opt == null )
continue ;
validateProp (
key ,
resolvedValues [ key ] ,
opt ,
! hasOwn ( rawProps , key ) && ! hasOwn ( rawProps , hyphenate ( key ) )
) ;
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function validateProp ( name , value , prop , isAbsent ) {
const { type , required , validator , skipCheck } = prop ;
if ( required && isAbsent ) {
warn ( 'Missing required prop: "' + name + '"' ) ;
return ;
}
if ( value == null && ! required ) {
return ;
}
if ( type != null && type !== true && ! skipCheck ) {
let isValid = false ;
const types = isArray ( type ) ? type : [ type ] ;
const expectedTypes = [ ] ;
for ( let i = 0 ; i < types . length && ! isValid ; i ++ ) {
const { valid , expectedType } = assertType ( value , types [ i ] ) ;
expectedTypes . push ( expectedType || "" ) ;
isValid = valid ;
}
if ( ! isValid ) {
warn ( getInvalidTypeMessage ( name , value , expectedTypes ) ) ;
return ;
}
}
if ( validator && ! validator ( value ) ) {
warn ( 'Invalid prop: custom validator check failed for prop "' + name + '".' ) ;
}
}
const isSimpleType = /* @__PURE__ */ makeMap (
"String,Number,Boolean,Function,Symbol,BigInt"
) ;
2023-07-24 11:13:08 +08:00
function assertType ( value , type ) {
2023-09-06 09:51:55 +08:00
let valid ;
const expectedType = getType ( type ) ;
if ( isSimpleType ( expectedType ) ) {
const t = typeof value ;
valid = t === expectedType . toLowerCase ( ) ;
if ( ! valid && t === "object" ) {
valid = value instanceof type ;
}
} else if ( expectedType === "Object" ) {
valid = isObject ( value ) ;
} else if ( expectedType === "Array" ) {
valid = isArray ( value ) ;
} else if ( expectedType === "null" ) {
valid = value === null ;
} else {
valid = value instanceof type ;
}
return {
valid ,
expectedType
} ;
2023-07-24 11:13:08 +08:00
}
function getInvalidTypeMessage ( name , value , expectedTypes ) {
2023-09-06 09:51:55 +08:00
let message = ` Invalid prop: type check failed for prop " ${ name } ". Expected ${ expectedTypes . map ( capitalize ) . join ( " | " ) } ` ;
const expectedType = expectedTypes [ 0 ] ;
const receivedType = toRawType ( value ) ;
const expectedValue = styleValue ( value , expectedType ) ;
const receivedValue = styleValue ( value , receivedType ) ;
if ( expectedTypes . length === 1 && isExplicable ( expectedType ) && ! isBoolean ( expectedType , receivedType ) ) {
message += ` with value ${ expectedValue } ` ;
}
message += ` , got ${ receivedType } ` ;
if ( isExplicable ( receivedType ) ) {
message += ` with value ${ receivedValue } . ` ;
}
return message ;
}
2023-07-24 11:13:08 +08:00
function styleValue ( value , type ) {
2023-09-06 09:51:55 +08:00
if ( type === "String" ) {
return ` " ${ value } " ` ;
} else if ( type === "Number" ) {
return ` ${ Number ( value ) } ` ;
} else {
return ` ${ value } ` ;
}
2023-07-24 11:13:08 +08:00
}
function isExplicable ( type ) {
2023-09-06 09:51:55 +08:00
const explicitTypes = [ "string" , "number" , "boolean" ] ;
return explicitTypes . some ( ( elem ) => type . toLowerCase ( ) === elem ) ;
2023-07-24 11:13:08 +08:00
}
function isBoolean ( ... args ) {
2023-09-06 09:51:55 +08:00
return args . some ( ( elem ) => elem . toLowerCase ( ) === "boolean" ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const isInternalKey = ( key ) => key [ 0 ] === "_" || key === "$stable" ;
const normalizeSlotValue = ( value ) => isArray ( value ) ? value . map ( normalizeVNode ) : [ normalizeVNode ( value ) ] ;
2023-07-24 11:13:08 +08:00
const normalizeSlot = ( key , rawSlot , ctx ) => {
2023-09-06 09:51:55 +08:00
if ( rawSlot . _n ) {
return rawSlot ;
}
const normalized = withCtx ( ( ... args ) => {
if ( currentInstance ) {
warn (
` Slot " ${ key } " invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead. `
) ;
}
return normalizeSlotValue ( rawSlot ( ... args ) ) ;
} , ctx ) ;
normalized . _c = false ;
return normalized ;
2023-07-24 11:13:08 +08:00
} ;
const normalizeObjectSlots = ( rawSlots , slots , instance ) => {
2023-09-06 09:51:55 +08:00
const ctx = rawSlots . _ctx ;
for ( const key in rawSlots ) {
if ( isInternalKey ( key ) )
continue ;
const value = rawSlots [ key ] ;
if ( isFunction ( value ) ) {
slots [ key ] = normalizeSlot ( key , value , ctx ) ;
} else if ( value != null ) {
{
warn (
` Non-function value encountered for slot " ${ key } ". Prefer function slots for better performance. `
) ;
}
const normalized = normalizeSlotValue ( value ) ;
slots [ key ] = ( ) => normalized ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
} ;
const normalizeVNodeSlots = ( instance , children ) => {
2023-09-06 09:51:55 +08:00
if ( ! isKeepAlive ( instance . vnode ) && true ) {
warn (
` Non-function value encountered for default slot. Prefer function slots for better performance. `
) ;
}
const normalized = normalizeSlotValue ( children ) ;
instance . slots . default = ( ) => normalized ;
2023-07-24 11:13:08 +08:00
} ;
const initSlots = ( instance , children ) => {
2023-09-06 09:51:55 +08:00
if ( instance . vnode . shapeFlag & 32 ) {
const type = children . _ ;
if ( type ) {
instance . slots = toRaw ( children ) ;
def ( children , "_" , type ) ;
} else {
normalizeObjectSlots (
children ,
instance . slots = { } ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} else {
instance . slots = { } ;
if ( children ) {
normalizeVNodeSlots ( instance , children ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
def ( instance . slots , InternalObjectKey , 1 ) ;
2023-07-24 11:13:08 +08:00
} ;
const updateSlots = ( instance , children , optimized ) => {
2023-09-06 09:51:55 +08:00
const { vnode , slots } = instance ;
let needDeletionCheck = true ;
let deletionComparisonTarget = EMPTY _OBJ ;
if ( vnode . shapeFlag & 32 ) {
const type = children . _ ;
if ( type ) {
if ( isHmrUpdating ) {
extend ( slots , children ) ;
trigger ( instance , "set" , "$slots" ) ;
} else if ( optimized && type === 1 ) {
needDeletionCheck = false ;
} else {
extend ( slots , children ) ;
if ( ! optimized && type === 1 ) {
delete slots . _ ;
}
}
} else {
needDeletionCheck = ! children . $stable ;
normalizeObjectSlots ( children , slots ) ;
}
deletionComparisonTarget = children ;
} else if ( children ) {
normalizeVNodeSlots ( instance , children ) ;
deletionComparisonTarget = { default : 1 } ;
}
if ( needDeletionCheck ) {
for ( const key in slots ) {
if ( ! isInternalKey ( key ) && ! ( key in deletionComparisonTarget ) ) {
delete slots [ key ] ;
}
}
}
2023-07-24 11:13:08 +08:00
} ;
function setRef ( rawRef , oldRawRef , parentSuspense , vnode , isUnmount = false ) {
2023-09-06 09:51:55 +08:00
if ( isArray ( rawRef ) ) {
rawRef . forEach (
( r , i ) => setRef (
r ,
oldRawRef && ( isArray ( oldRawRef ) ? oldRawRef [ i ] : oldRawRef ) ,
parentSuspense ,
vnode ,
isUnmount
)
) ;
return ;
}
if ( isAsyncWrapper ( vnode ) && ! isUnmount ) {
return ;
}
const refValue = vnode . shapeFlag & 4 ? getExposeProxy ( vnode . component ) || vnode . component . proxy : vnode . el ;
const value = isUnmount ? null : refValue ;
const { i : owner , r : ref } = rawRef ;
if ( ! owner ) {
warn (
` Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function. `
) ;
return ;
}
const oldRef = oldRawRef && oldRawRef . r ;
const refs = owner . refs === EMPTY _OBJ ? owner . refs = { } : owner . refs ;
const setupState = owner . setupState ;
if ( oldRef != null && oldRef !== ref ) {
if ( isString ( oldRef ) ) {
refs [ oldRef ] = null ;
if ( hasOwn ( setupState , oldRef ) ) {
setupState [ oldRef ] = null ;
}
} else if ( isRef ( oldRef ) ) {
oldRef . value = null ;
}
}
if ( isFunction ( ref ) ) {
callWithErrorHandling ( ref , owner , 12 , [ value , refs ] ) ;
} else {
const _isString = isString ( ref ) ;
const _isRef = isRef ( ref ) ;
if ( _isString || _isRef ) {
const doSet = ( ) => {
if ( rawRef . f ) {
const existing = _isString ? hasOwn ( setupState , ref ) ? setupState [ ref ] : refs [ ref ] : ref . value ;
if ( isUnmount ) {
isArray ( existing ) && remove ( existing , refValue ) ;
} else {
if ( ! isArray ( existing ) ) {
if ( _isString ) {
refs [ ref ] = [ refValue ] ;
if ( hasOwn ( setupState , ref ) ) {
setupState [ ref ] = refs [ ref ] ;
}
} else {
ref . value = [ refValue ] ;
if ( rawRef . k )
refs [ rawRef . k ] = ref . value ;
}
} else if ( ! existing . includes ( refValue ) ) {
existing . push ( refValue ) ;
}
}
} else if ( _isString ) {
refs [ ref ] = value ;
if ( hasOwn ( setupState , ref ) ) {
setupState [ ref ] = value ;
}
} else if ( _isRef ) {
ref . value = value ;
if ( rawRef . k )
refs [ rawRef . k ] = value ;
} else {
warn ( "Invalid template ref type:" , ref , ` ( ${ typeof ref } ) ` ) ;
}
} ;
if ( value ) {
doSet . id = - 1 ;
queuePostRenderEffect ( doSet , parentSuspense ) ;
} else {
doSet ( ) ;
}
} else {
warn ( "Invalid template ref type:" , ref , ` ( ${ typeof ref } ) ` ) ;
}
}
2023-07-24 11:13:08 +08:00
}
let hasMismatch = false ;
2023-09-06 09:51:55 +08:00
const isSVGContainer = ( container ) => / svg / . test ( container . namespaceURI ) && container . tagName !== "foreignObject" ;
const isComment = ( node ) => node . nodeType === 8 /* COMMENT */ ;
2023-07-24 11:13:08 +08:00
function createHydrationFunctions ( rendererInternals ) {
2023-09-06 09:51:55 +08:00
const {
mt : mountComponent ,
p : patch ,
o : {
patchProp ,
createText ,
nextSibling ,
parentNode ,
remove ,
insert ,
createComment
}
} = rendererInternals ;
const hydrate = ( vnode , container ) => {
if ( ! container . hasChildNodes ( ) ) {
warn (
` Attempting to hydrate existing markup but container is empty. Performing full mount instead. `
) ;
patch ( null , vnode , container ) ;
flushPostFlushCbs ( ) ;
container . _vnode = vnode ;
return ;
}
hasMismatch = false ;
hydrateNode ( container . firstChild , vnode , null , null , null ) ;
flushPostFlushCbs ( ) ;
container . _vnode = vnode ;
if ( hasMismatch && true ) {
console . error ( ` Hydration completed but contains mismatches. ` ) ;
}
} ;
const hydrateNode = ( node , vnode , parentComponent , parentSuspense , slotScopeIds , optimized = false ) => {
const isFragmentStart = isComment ( node ) && node . data === "[" ;
const onMismatch = ( ) => handleMismatch (
node ,
vnode ,
parentComponent ,
parentSuspense ,
slotScopeIds ,
isFragmentStart
) ;
const { type , ref , shapeFlag , patchFlag } = vnode ;
let domType = node . nodeType ;
vnode . el = node ;
if ( patchFlag === - 2 ) {
optimized = false ;
vnode . dynamicChildren = null ;
}
let nextNode = null ;
switch ( type ) {
case Text :
if ( domType !== 3 /* TEXT */ ) {
if ( vnode . children === "" ) {
insert ( vnode . el = createText ( "" ) , parentNode ( node ) , node ) ;
nextNode = node ;
} else {
nextNode = onMismatch ( ) ;
}
} else {
if ( node . data !== vnode . children ) {
2023-07-24 11:13:08 +08:00
hasMismatch = true ;
2023-09-06 09:51:55 +08:00
warn (
` Hydration text mismatch:
- Client : $ { JSON . stringify ( node . data ) }
- Server : $ { JSON . stringify ( vnode . children ) } `
) ;
node . data = vnode . children ;
}
nextNode = nextSibling ( node ) ;
}
break ;
case Comment :
if ( domType !== 8 /* COMMENT */ || isFragmentStart ) {
nextNode = onMismatch ( ) ;
} else {
nextNode = nextSibling ( node ) ;
}
break ;
case Static :
if ( isFragmentStart ) {
node = nextSibling ( node ) ;
domType = node . nodeType ;
}
if ( domType === 1 /* ELEMENT */ || domType === 3 /* TEXT */ ) {
nextNode = node ;
const needToAdoptContent = ! vnode . children . length ;
for ( let i = 0 ; i < vnode . staticCount ; i ++ ) {
if ( needToAdoptContent )
vnode . children += nextNode . nodeType === 1 /* ELEMENT */ ? nextNode . outerHTML : nextNode . data ;
if ( i === vnode . staticCount - 1 ) {
vnode . anchor = nextNode ;
}
nextNode = nextSibling ( nextNode ) ;
}
return isFragmentStart ? nextSibling ( nextNode ) : nextNode ;
} else {
onMismatch ( ) ;
}
break ;
case Fragment :
if ( ! isFragmentStart ) {
nextNode = onMismatch ( ) ;
} else {
nextNode = hydrateFragment (
node ,
vnode ,
parentComponent ,
parentSuspense ,
slotScopeIds ,
optimized
) ;
}
break ;
default :
if ( shapeFlag & 1 ) {
if ( domType !== 1 /* ELEMENT */ || vnode . type . toLowerCase ( ) !== node . tagName . toLowerCase ( ) ) {
nextNode = onMismatch ( ) ;
} else {
nextNode = hydrateElement (
node ,
vnode ,
parentComponent ,
parentSuspense ,
slotScopeIds ,
optimized
) ;
}
} else if ( shapeFlag & 6 ) {
vnode . slotScopeIds = slotScopeIds ;
const container = parentNode ( node ) ;
mountComponent (
vnode ,
container ,
null ,
parentComponent ,
parentSuspense ,
isSVGContainer ( container ) ,
optimized
) ;
nextNode = isFragmentStart ? locateClosingAsyncAnchor ( node ) : nextSibling ( node ) ;
if ( nextNode && isComment ( nextNode ) && nextNode . data === "teleport end" ) {
nextNode = nextSibling ( nextNode ) ;
}
if ( isAsyncWrapper ( vnode ) ) {
let subTree ;
if ( isFragmentStart ) {
subTree = createVNode ( Fragment ) ;
subTree . anchor = nextNode ? nextNode . previousSibling : container . lastChild ;
} else {
subTree = node . nodeType === 3 ? createTextVNode ( "" ) : createVNode ( "div" ) ;
}
subTree . el = node ;
vnode . component . subTree = subTree ;
}
} else if ( shapeFlag & 64 ) {
if ( domType !== 8 /* COMMENT */ ) {
nextNode = onMismatch ( ) ;
} else {
nextNode = vnode . type . hydrate (
node ,
vnode ,
parentComponent ,
parentSuspense ,
slotScopeIds ,
optimized ,
rendererInternals ,
hydrateChildren
) ;
}
} else if ( shapeFlag & 128 ) {
nextNode = vnode . type . hydrate (
node ,
vnode ,
parentComponent ,
parentSuspense ,
isSVGContainer ( parentNode ( node ) ) ,
slotScopeIds ,
optimized ,
rendererInternals ,
hydrateNode
) ;
} else {
warn ( "Invalid HostVNode type:" , type , ` ( ${ typeof type } ) ` ) ;
}
}
if ( ref != null ) {
setRef ( ref , null , parentSuspense , vnode ) ;
}
return nextNode ;
} ;
const hydrateElement = ( el , vnode , parentComponent , parentSuspense , slotScopeIds , optimized ) => {
optimized = optimized || ! ! vnode . dynamicChildren ;
const { type , props , patchFlag , shapeFlag , dirs } = vnode ;
const forcePatchValue = type === "input" && dirs || type === "option" ;
{
if ( dirs ) {
invokeDirectiveHook ( vnode , null , parentComponent , "created" ) ;
}
if ( props ) {
if ( forcePatchValue || ! optimized || patchFlag & ( 16 | 32 ) ) {
for ( const key in props ) {
if ( forcePatchValue && key . endsWith ( "value" ) || isOn ( key ) && ! isReservedProp ( key ) ) {
patchProp (
el ,
key ,
null ,
props [ key ] ,
false ,
void 0 ,
parentComponent
) ;
}
}
} else if ( props . onClick ) {
patchProp (
el ,
"onClick" ,
null ,
props . onClick ,
false ,
void 0 ,
parentComponent
) ;
}
}
let vnodeHooks ;
if ( vnodeHooks = props && props . onVnodeBeforeMount ) {
invokeVNodeHook ( vnodeHooks , parentComponent , vnode ) ;
}
if ( dirs ) {
invokeDirectiveHook ( vnode , null , parentComponent , "beforeMount" ) ;
}
if ( ( vnodeHooks = props && props . onVnodeMounted ) || dirs ) {
queueEffectWithSuspense ( ( ) => {
vnodeHooks && invokeVNodeHook ( vnodeHooks , parentComponent , vnode ) ;
dirs && invokeDirectiveHook ( vnode , null , parentComponent , "mounted" ) ;
} , parentSuspense ) ;
}
if ( shapeFlag & 16 && // skip if element has innerHTML / textContent
! ( props && ( props . innerHTML || props . textContent ) ) ) {
let next = hydrateChildren (
el . firstChild ,
vnode ,
el ,
parentComponent ,
parentSuspense ,
slotScopeIds ,
optimized
) ;
let hasWarned = false ;
while ( next ) {
hasMismatch = true ;
if ( ! hasWarned ) {
warn (
` Hydration children mismatch in < ${ vnode . type } >: server rendered element contains more child nodes than client vdom. `
) ;
hasWarned = true ;
}
const cur = next ;
next = next . nextSibling ;
remove ( cur ) ;
}
} else if ( shapeFlag & 8 ) {
if ( el . textContent !== vnode . children ) {
hasMismatch = true ;
warn (
` Hydration text content mismatch in < ${ vnode . type } >:
- Client : $ { el . textContent }
- Server : $ { vnode . children } `
) ;
el . textContent = vnode . children ;
}
}
}
return el . nextSibling ;
} ;
const hydrateChildren = ( node , parentVNode , container , parentComponent , parentSuspense , slotScopeIds , optimized ) => {
optimized = optimized || ! ! parentVNode . dynamicChildren ;
const children = parentVNode . children ;
const l = children . length ;
let hasWarned = false ;
for ( let i = 0 ; i < l ; i ++ ) {
const vnode = optimized ? children [ i ] : children [ i ] = normalizeVNode ( children [ i ] ) ;
if ( node ) {
node = hydrateNode (
node ,
vnode ,
parentComponent ,
parentSuspense ,
slotScopeIds ,
optimized
) ;
} else if ( vnode . type === Text && ! vnode . children ) {
continue ;
} else {
2023-07-24 11:13:08 +08:00
hasMismatch = true ;
2023-09-06 09:51:55 +08:00
if ( ! hasWarned ) {
warn (
` Hydration children mismatch in < ${ container . tagName . toLowerCase ( ) } >: server rendered element contains fewer child nodes than client vdom. `
) ;
hasWarned = true ;
}
patch (
null ,
vnode ,
container ,
null ,
parentComponent ,
parentSuspense ,
isSVGContainer ( container ) ,
slotScopeIds
) ;
}
}
return node ;
} ;
const hydrateFragment = ( node , vnode , parentComponent , parentSuspense , slotScopeIds , optimized ) => {
const { slotScopeIds : fragmentSlotScopeIds } = vnode ;
if ( fragmentSlotScopeIds ) {
slotScopeIds = slotScopeIds ? slotScopeIds . concat ( fragmentSlotScopeIds ) : fragmentSlotScopeIds ;
}
const container = parentNode ( node ) ;
const next = hydrateChildren (
nextSibling ( node ) ,
vnode ,
container ,
parentComponent ,
parentSuspense ,
slotScopeIds ,
optimized
) ;
if ( next && isComment ( next ) && next . data === "]" ) {
return nextSibling ( vnode . anchor = next ) ;
} else {
hasMismatch = true ;
insert ( vnode . anchor = createComment ( ` ] ` ) , container , next ) ;
return next ;
}
} ;
const handleMismatch = ( node , vnode , parentComponent , parentSuspense , slotScopeIds , isFragment ) => {
hasMismatch = true ;
warn (
` Hydration node mismatch:
- Client vnode : ` ,
vnode . type ,
`
- Server rendered DOM : ` ,
node ,
node . nodeType === 3 /* TEXT */ ? ` (text) ` : isComment ( node ) && node . data === "[" ? ` (start of fragment) ` : ` `
) ;
vnode . el = null ;
if ( isFragment ) {
const end = locateClosingAsyncAnchor ( node ) ;
while ( true ) {
const next2 = nextSibling ( node ) ;
if ( next2 && next2 !== end ) {
remove ( next2 ) ;
} else {
break ;
}
}
}
const next = nextSibling ( node ) ;
const container = parentNode ( node ) ;
remove ( node ) ;
patch (
null ,
vnode ,
container ,
next ,
parentComponent ,
parentSuspense ,
isSVGContainer ( container ) ,
slotScopeIds
) ;
return next ;
} ;
const locateClosingAsyncAnchor = ( node ) => {
let match = 0 ;
while ( node ) {
node = nextSibling ( node ) ;
if ( node && isComment ( node ) ) {
if ( node . data === "[" )
match ++ ;
if ( node . data === "]" ) {
if ( match === 0 ) {
return nextSibling ( node ) ;
} else {
match -- ;
}
}
}
}
return node ;
} ;
return [ hydrate , hydrateNode ] ;
2023-07-24 11:13:08 +08:00
}
let supported ;
let perf ;
function startMeasure ( instance , type ) {
2023-09-06 09:51:55 +08:00
if ( instance . appContext . config . performance && isSupported ( ) ) {
perf . mark ( ` vue- ${ type } - ${ instance . uid } ` ) ;
}
{
devtoolsPerfStart ( instance , type , isSupported ( ) ? perf . now ( ) : Date . now ( ) ) ;
}
2023-07-24 11:13:08 +08:00
}
function endMeasure ( instance , type ) {
2023-09-06 09:51:55 +08:00
if ( instance . appContext . config . performance && isSupported ( ) ) {
const startTag = ` vue- ${ type } - ${ instance . uid } ` ;
const endTag = startTag + ` :end ` ;
perf . mark ( endTag ) ;
perf . measure (
` < ${ formatComponentName ( instance , instance . type ) } > ${ type } ` ,
startTag ,
endTag
) ;
perf . clearMarks ( startTag ) ;
perf . clearMarks ( endTag ) ;
}
{
devtoolsPerfEnd ( instance , type , isSupported ( ) ? perf . now ( ) : Date . now ( ) ) ;
}
2023-07-24 11:13:08 +08:00
}
function isSupported ( ) {
2023-09-06 09:51:55 +08:00
if ( supported !== void 0 ) {
2023-07-24 11:13:08 +08:00
return supported ;
2023-09-06 09:51:55 +08:00
}
if ( typeof window !== "undefined" && window . performance ) {
supported = true ;
perf = window . performance ;
} else {
supported = false ;
}
return supported ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const queuePostRenderEffect = queueEffectWithSuspense ;
2023-07-24 11:13:08 +08:00
function createRenderer ( options ) {
2023-09-06 09:51:55 +08:00
return baseCreateRenderer ( options ) ;
2023-07-24 11:13:08 +08:00
}
function createHydrationRenderer ( options ) {
2023-09-06 09:51:55 +08:00
return baseCreateRenderer ( options , createHydrationFunctions ) ;
2023-07-24 11:13:08 +08:00
}
function baseCreateRenderer ( options , createHydrationFns ) {
2023-09-06 09:51:55 +08:00
const target = getGlobalThis ( ) ;
target . _ _VUE _ _ = true ;
{
setDevtoolsHook ( target . _ _VUE _DEVTOOLS _GLOBAL _HOOK _ _ , target ) ;
}
const {
insert : hostInsert ,
remove : hostRemove ,
patchProp : hostPatchProp ,
createElement : hostCreateElement ,
createText : hostCreateText ,
createComment : hostCreateComment ,
setText : hostSetText ,
setElementText : hostSetElementText ,
parentNode : hostParentNode ,
nextSibling : hostNextSibling ,
setScopeId : hostSetScopeId = NOOP ,
insertStaticContent : hostInsertStaticContent
} = options ;
const patch = ( n1 , n2 , container , anchor = null , parentComponent = null , parentSuspense = null , isSVG = false , slotScopeIds = null , optimized = isHmrUpdating ? false : ! ! n2 . dynamicChildren ) => {
if ( n1 === n2 ) {
return ;
}
if ( n1 && ! isSameVNodeType ( n1 , n2 ) ) {
anchor = getNextHostNode ( n1 ) ;
unmount ( n1 , parentComponent , parentSuspense , true ) ;
n1 = null ;
}
if ( n2 . patchFlag === - 2 ) {
optimized = false ;
n2 . dynamicChildren = null ;
}
const { type , ref , shapeFlag } = n2 ;
switch ( type ) {
case Text :
processText ( n1 , n2 , container , anchor ) ;
break ;
case Comment :
processCommentNode ( n1 , n2 , container , anchor ) ;
break ;
case Static :
2023-07-24 11:13:08 +08:00
if ( n1 == null ) {
2023-09-06 09:51:55 +08:00
mountStaticNode ( n2 , container , anchor , isSVG ) ;
} else {
patchStaticNode ( n1 , n2 , container , isSVG ) ;
}
break ;
case Fragment :
processFragment (
n1 ,
n2 ,
container ,
anchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
break ;
default :
if ( shapeFlag & 1 ) {
processElement (
n1 ,
n2 ,
container ,
anchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
} else if ( shapeFlag & 6 ) {
processComponent (
n1 ,
n2 ,
container ,
anchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
} else if ( shapeFlag & 64 ) {
type . process (
n1 ,
n2 ,
container ,
anchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized ,
internals
) ;
} else if ( shapeFlag & 128 ) {
type . process (
n1 ,
n2 ,
container ,
anchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized ,
internals
) ;
} else {
warn ( "Invalid VNode type:" , type , ` ( ${ typeof type } ) ` ) ;
}
}
if ( ref != null && parentComponent ) {
setRef ( ref , n1 && n1 . ref , parentSuspense , n2 || n1 , ! n2 ) ;
}
} ;
const processText = ( n1 , n2 , container , anchor ) => {
if ( n1 == null ) {
hostInsert (
n2 . el = hostCreateText ( n2 . children ) ,
container ,
anchor
) ;
} else {
const el = n2 . el = n1 . el ;
if ( n2 . children !== n1 . children ) {
hostSetText ( el , n2 . children ) ;
}
}
} ;
const processCommentNode = ( n1 , n2 , container , anchor ) => {
if ( n1 == null ) {
hostInsert (
n2 . el = hostCreateComment ( n2 . children || "" ) ,
container ,
anchor
) ;
} else {
n2 . el = n1 . el ;
}
} ;
const mountStaticNode = ( n2 , container , anchor , isSVG ) => {
[ n2 . el , n2 . anchor ] = hostInsertStaticContent (
n2 . children ,
container ,
anchor ,
isSVG ,
n2 . el ,
n2 . anchor
) ;
} ;
const patchStaticNode = ( n1 , n2 , container , isSVG ) => {
if ( n2 . children !== n1 . children ) {
const anchor = hostNextSibling ( n1 . anchor ) ;
removeStaticNode ( n1 ) ;
[ n2 . el , n2 . anchor ] = hostInsertStaticContent (
n2 . children ,
container ,
anchor ,
isSVG
) ;
} else {
n2 . el = n1 . el ;
n2 . anchor = n1 . anchor ;
}
} ;
const moveStaticNode = ( { el , anchor } , container , nextSibling ) => {
let next ;
while ( el && el !== anchor ) {
next = hostNextSibling ( el ) ;
hostInsert ( el , container , nextSibling ) ;
el = next ;
}
hostInsert ( anchor , container , nextSibling ) ;
} ;
const removeStaticNode = ( { el , anchor } ) => {
let next ;
while ( el && el !== anchor ) {
next = hostNextSibling ( el ) ;
hostRemove ( el ) ;
el = next ;
}
hostRemove ( anchor ) ;
} ;
const processElement = ( n1 , n2 , container , anchor , parentComponent , parentSuspense , isSVG , slotScopeIds , optimized ) => {
isSVG = isSVG || n2 . type === "svg" ;
if ( n1 == null ) {
mountElement (
n2 ,
container ,
anchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
} else {
patchElement (
n1 ,
n2 ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
}
} ;
const mountElement = ( vnode , container , anchor , parentComponent , parentSuspense , isSVG , slotScopeIds , optimized ) => {
let el ;
let vnodeHook ;
const { type , props , shapeFlag , transition , dirs } = vnode ;
el = vnode . el = hostCreateElement (
vnode . type ,
isSVG ,
props && props . is ,
props
) ;
if ( shapeFlag & 8 ) {
hostSetElementText ( el , vnode . children ) ;
} else if ( shapeFlag & 16 ) {
mountChildren (
vnode . children ,
el ,
null ,
parentComponent ,
parentSuspense ,
isSVG && type !== "foreignObject" ,
slotScopeIds ,
optimized
) ;
}
if ( dirs ) {
invokeDirectiveHook ( vnode , null , parentComponent , "created" ) ;
}
setScopeId ( el , vnode , vnode . scopeId , slotScopeIds , parentComponent ) ;
if ( props ) {
for ( const key in props ) {
if ( key !== "value" && ! isReservedProp ( key ) ) {
hostPatchProp (
el ,
key ,
null ,
props [ key ] ,
isSVG ,
vnode . children ,
parentComponent ,
parentSuspense ,
unmountChildren
) ;
}
}
if ( "value" in props ) {
hostPatchProp ( el , "value" , null , props . value ) ;
}
if ( vnodeHook = props . onVnodeBeforeMount ) {
invokeVNodeHook ( vnodeHook , parentComponent , vnode ) ;
}
}
{
Object . defineProperty ( el , "__vnode" , {
value : vnode ,
enumerable : false
} ) ;
Object . defineProperty ( el , "__vueParentComponent" , {
value : parentComponent ,
enumerable : false
} ) ;
}
if ( dirs ) {
invokeDirectiveHook ( vnode , null , parentComponent , "beforeMount" ) ;
}
const needCallTransitionHooks = ( ! parentSuspense || parentSuspense && ! parentSuspense . pendingBranch ) && transition && ! transition . persisted ;
if ( needCallTransitionHooks ) {
transition . beforeEnter ( el ) ;
}
hostInsert ( el , container , anchor ) ;
if ( ( vnodeHook = props && props . onVnodeMounted ) || needCallTransitionHooks || dirs ) {
queuePostRenderEffect ( ( ) => {
vnodeHook && invokeVNodeHook ( vnodeHook , parentComponent , vnode ) ;
needCallTransitionHooks && transition . enter ( el ) ;
dirs && invokeDirectiveHook ( vnode , null , parentComponent , "mounted" ) ;
} , parentSuspense ) ;
}
} ;
const setScopeId = ( el , vnode , scopeId , slotScopeIds , parentComponent ) => {
if ( scopeId ) {
hostSetScopeId ( el , scopeId ) ;
}
if ( slotScopeIds ) {
for ( let i = 0 ; i < slotScopeIds . length ; i ++ ) {
hostSetScopeId ( el , slotScopeIds [ i ] ) ;
}
}
if ( parentComponent ) {
let subTree = parentComponent . subTree ;
if ( subTree . patchFlag > 0 && subTree . patchFlag & 2048 ) {
subTree = filterSingleRoot ( subTree . children ) || subTree ;
}
if ( vnode === subTree ) {
const parentVNode = parentComponent . vnode ;
setScopeId (
el ,
parentVNode ,
parentVNode . scopeId ,
parentVNode . slotScopeIds ,
parentComponent . parent
) ;
}
}
} ;
const mountChildren = ( children , container , anchor , parentComponent , parentSuspense , isSVG , slotScopeIds , optimized , start = 0 ) => {
for ( let i = start ; i < children . length ; i ++ ) {
const child = children [ i ] = optimized ? cloneIfMounted ( children [ i ] ) : normalizeVNode ( children [ i ] ) ;
patch (
null ,
child ,
container ,
anchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
}
} ;
const patchElement = ( n1 , n2 , parentComponent , parentSuspense , isSVG , slotScopeIds , optimized ) => {
const el = n2 . el = n1 . el ;
let { patchFlag , dynamicChildren , dirs } = n2 ;
patchFlag |= n1 . patchFlag & 16 ;
const oldProps = n1 . props || EMPTY _OBJ ;
const newProps = n2 . props || EMPTY _OBJ ;
let vnodeHook ;
parentComponent && toggleRecurse ( parentComponent , false ) ;
if ( vnodeHook = newProps . onVnodeBeforeUpdate ) {
invokeVNodeHook ( vnodeHook , parentComponent , n2 , n1 ) ;
}
if ( dirs ) {
invokeDirectiveHook ( n2 , n1 , parentComponent , "beforeUpdate" ) ;
}
parentComponent && toggleRecurse ( parentComponent , true ) ;
if ( isHmrUpdating ) {
patchFlag = 0 ;
optimized = false ;
dynamicChildren = null ;
}
const areChildrenSVG = isSVG && n2 . type !== "foreignObject" ;
if ( dynamicChildren ) {
patchBlockChildren (
n1 . dynamicChildren ,
dynamicChildren ,
el ,
parentComponent ,
parentSuspense ,
areChildrenSVG ,
slotScopeIds
) ;
{
traverseStaticChildren ( n1 , n2 ) ;
}
} else if ( ! optimized ) {
patchChildren (
n1 ,
n2 ,
el ,
null ,
parentComponent ,
parentSuspense ,
areChildrenSVG ,
slotScopeIds ,
false
) ;
}
if ( patchFlag > 0 ) {
if ( patchFlag & 16 ) {
patchProps (
el ,
n2 ,
oldProps ,
newProps ,
parentComponent ,
parentSuspense ,
isSVG
) ;
} else {
if ( patchFlag & 2 ) {
if ( oldProps . class !== newProps . class ) {
hostPatchProp ( el , "class" , null , newProps . class , isSVG ) ;
}
}
if ( patchFlag & 4 ) {
hostPatchProp ( el , "style" , oldProps . style , newProps . style , isSVG ) ;
}
if ( patchFlag & 8 ) {
const propsToUpdate = n2 . dynamicProps ;
for ( let i = 0 ; i < propsToUpdate . length ; i ++ ) {
const key = propsToUpdate [ i ] ;
const prev = oldProps [ key ] ;
const next = newProps [ key ] ;
if ( next !== prev || key === "value" ) {
hostPatchProp (
el ,
key ,
prev ,
next ,
isSVG ,
n1 . children ,
parentComponent ,
parentSuspense ,
unmountChildren
) ;
}
}
}
}
if ( patchFlag & 1 ) {
if ( n1 . children !== n2 . children ) {
hostSetElementText ( el , n2 . children ) ;
}
}
} else if ( ! optimized && dynamicChildren == null ) {
patchProps (
el ,
n2 ,
oldProps ,
newProps ,
parentComponent ,
parentSuspense ,
isSVG
) ;
}
if ( ( vnodeHook = newProps . onVnodeUpdated ) || dirs ) {
queuePostRenderEffect ( ( ) => {
vnodeHook && invokeVNodeHook ( vnodeHook , parentComponent , n2 , n1 ) ;
dirs && invokeDirectiveHook ( n2 , n1 , parentComponent , "updated" ) ;
} , parentSuspense ) ;
}
} ;
const patchBlockChildren = ( oldChildren , newChildren , fallbackContainer , parentComponent , parentSuspense , isSVG , slotScopeIds ) => {
for ( let i = 0 ; i < newChildren . length ; i ++ ) {
const oldVNode = oldChildren [ i ] ;
const newVNode = newChildren [ i ] ;
const container = (
// oldVNode may be an errored async setup() component inside Suspense
// which will not have a mounted element
oldVNode . el && // - In the case of a Fragment, we need to provide the actual parent
// of the Fragment itself so it can move its children.
( oldVNode . type === Fragment || // - In the case of different nodes, there is going to be a replacement
// which also requires the correct parent container
! isSameVNodeType ( oldVNode , newVNode ) || // - In the case of a component, it could contain anything.
oldVNode . shapeFlag & ( 6 | 64 ) ) ? hostParentNode ( oldVNode . el ) : (
// In other cases, the parent container is not actually used so we
// just pass the block element here to avoid a DOM parentNode call.
fallbackContainer
)
) ;
patch (
oldVNode ,
newVNode ,
container ,
null ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
true
) ;
}
} ;
const patchProps = ( el , vnode , oldProps , newProps , parentComponent , parentSuspense , isSVG ) => {
if ( oldProps !== newProps ) {
if ( oldProps !== EMPTY _OBJ ) {
for ( const key in oldProps ) {
if ( ! isReservedProp ( key ) && ! ( key in newProps ) ) {
hostPatchProp (
el ,
key ,
oldProps [ key ] ,
null ,
isSVG ,
vnode . children ,
parentComponent ,
parentSuspense ,
unmountChildren
) ;
}
}
}
for ( const key in newProps ) {
if ( isReservedProp ( key ) )
continue ;
const next = newProps [ key ] ;
const prev = oldProps [ key ] ;
if ( next !== prev && key !== "value" ) {
hostPatchProp (
el ,
key ,
prev ,
next ,
isSVG ,
vnode . children ,
parentComponent ,
parentSuspense ,
unmountChildren
) ;
}
}
if ( "value" in newProps ) {
hostPatchProp ( el , "value" , oldProps . value , newProps . value ) ;
}
}
} ;
const processFragment = ( n1 , n2 , container , anchor , parentComponent , parentSuspense , isSVG , slotScopeIds , optimized ) => {
const fragmentStartAnchor = n2 . el = n1 ? n1 . el : hostCreateText ( "" ) ;
const fragmentEndAnchor = n2 . anchor = n1 ? n1 . anchor : hostCreateText ( "" ) ;
let { patchFlag , dynamicChildren , slotScopeIds : fragmentSlotScopeIds } = n2 ;
if (
// #5523 dev root fragment may inherit directives
isHmrUpdating || patchFlag & 2048
) {
patchFlag = 0 ;
optimized = false ;
dynamicChildren = null ;
}
if ( fragmentSlotScopeIds ) {
slotScopeIds = slotScopeIds ? slotScopeIds . concat ( fragmentSlotScopeIds ) : fragmentSlotScopeIds ;
}
if ( n1 == null ) {
hostInsert ( fragmentStartAnchor , container , anchor ) ;
hostInsert ( fragmentEndAnchor , container , anchor ) ;
mountChildren (
n2 . children ,
container ,
fragmentEndAnchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
} else {
if ( patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result
// of renderSlot() with no valid children
n1 . dynamicChildren ) {
patchBlockChildren (
n1 . dynamicChildren ,
dynamicChildren ,
container ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds
) ;
{
traverseStaticChildren ( n1 , n2 ) ;
}
} else {
patchChildren (
n1 ,
n2 ,
container ,
fragmentEndAnchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
}
}
} ;
const processComponent = ( n1 , n2 , container , anchor , parentComponent , parentSuspense , isSVG , slotScopeIds , optimized ) => {
n2 . slotScopeIds = slotScopeIds ;
if ( n1 == null ) {
if ( n2 . shapeFlag & 512 ) {
parentComponent . ctx . activate (
n2 ,
container ,
anchor ,
isSVG ,
optimized
) ;
} else {
mountComponent (
n2 ,
container ,
anchor ,
parentComponent ,
parentSuspense ,
isSVG ,
optimized
) ;
}
} else {
updateComponent ( n1 , n2 , optimized ) ;
}
} ;
const mountComponent = ( initialVNode , container , anchor , parentComponent , parentSuspense , isSVG , optimized ) => {
const instance = ( initialVNode . component = createComponentInstance (
initialVNode ,
parentComponent ,
parentSuspense
) ) ;
if ( instance . type . _ _hmrId ) {
registerHMR ( instance ) ;
}
{
pushWarningContext ( initialVNode ) ;
startMeasure ( instance , ` mount ` ) ;
}
if ( isKeepAlive ( initialVNode ) ) {
instance . ctx . renderer = internals ;
}
{
{
startMeasure ( instance , ` init ` ) ;
}
setupComponent ( instance ) ;
{
endMeasure ( instance , ` init ` ) ;
}
}
if ( instance . asyncDep ) {
parentSuspense && parentSuspense . registerDep ( instance , setupRenderEffect ) ;
if ( ! initialVNode . el ) {
const placeholder = instance . subTree = createVNode ( Comment ) ;
processCommentNode ( null , placeholder , container , anchor ) ;
}
return ;
}
setupRenderEffect (
instance ,
initialVNode ,
container ,
anchor ,
parentSuspense ,
isSVG ,
optimized
) ;
{
popWarningContext ( ) ;
endMeasure ( instance , ` mount ` ) ;
}
} ;
const updateComponent = ( n1 , n2 , optimized ) => {
const instance = n2 . component = n1 . component ;
if ( shouldUpdateComponent ( n1 , n2 , optimized ) ) {
if ( instance . asyncDep && ! instance . asyncResolved ) {
{
pushWarningContext ( n2 ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
updateComponentPreRender ( instance , n2 , optimized ) ;
{
popWarningContext ( ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return ;
} else {
instance . next = n2 ;
invalidateJob ( instance . update ) ;
instance . update ( ) ;
}
} else {
n2 . el = n1 . el ;
instance . vnode = n2 ;
}
} ;
const setupRenderEffect = ( instance , initialVNode , container , anchor , parentSuspense , isSVG , optimized ) => {
const componentUpdateFn = ( ) => {
if ( ! instance . isMounted ) {
2023-07-24 11:13:08 +08:00
let vnodeHook ;
2023-09-06 09:51:55 +08:00
const { el , props } = initialVNode ;
const { bm , m , parent } = instance ;
const isAsyncWrapperVNode = isAsyncWrapper ( initialVNode ) ;
toggleRecurse ( instance , false ) ;
if ( bm ) {
invokeArrayFns ( bm ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( ! isAsyncWrapperVNode && ( vnodeHook = props && props . onVnodeBeforeMount ) ) {
invokeVNodeHook ( vnodeHook , parent , initialVNode ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
toggleRecurse ( instance , true ) ;
if ( el && hydrateNode ) {
const hydrateSubTree = ( ) => {
{
startMeasure ( instance , ` render ` ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
instance . subTree = renderComponentRoot ( instance ) ;
{
endMeasure ( instance , ` render ` ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
{
startMeasure ( instance , ` hydrate ` ) ;
}
hydrateNode (
el ,
instance . subTree ,
instance ,
parentSuspense ,
null
) ;
{
endMeasure ( instance , ` hydrate ` ) ;
}
} ;
if ( isAsyncWrapperVNode ) {
initialVNode . type . _ _asyncLoader ( ) . then (
// note: we are moving the render call into an async callback,
// which means it won't track dependencies - but it's ok because
// a server-rendered async wrapper is already in resolved state
// and it will never need to change.
( ) => ! instance . isUnmounted && hydrateSubTree ( )
) ;
} else {
hydrateSubTree ( ) ;
}
} else {
{
startMeasure ( instance , ` render ` ) ;
}
const subTree = instance . subTree = renderComponentRoot ( instance ) ;
{
endMeasure ( instance , ` render ` ) ;
}
{
startMeasure ( instance , ` patch ` ) ;
}
patch (
null ,
subTree ,
container ,
anchor ,
instance ,
parentSuspense ,
isSVG
) ;
{
endMeasure ( instance , ` patch ` ) ;
}
initialVNode . el = subTree . el ;
}
if ( m ) {
queuePostRenderEffect ( m , parentSuspense ) ;
}
if ( ! isAsyncWrapperVNode && ( vnodeHook = props && props . onVnodeMounted ) ) {
const scopedInitialVNode = initialVNode ;
queuePostRenderEffect (
( ) => invokeVNodeHook ( vnodeHook , parent , scopedInitialVNode ) ,
parentSuspense
) ;
}
if ( initialVNode . shapeFlag & 256 || parent && isAsyncWrapper ( parent . vnode ) && parent . vnode . shapeFlag & 256 ) {
instance . a && queuePostRenderEffect ( instance . a , parentSuspense ) ;
}
instance . isMounted = true ;
2023-07-24 11:13:08 +08:00
{
2023-09-06 09:51:55 +08:00
devtoolsComponentAdded ( instance ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
initialVNode = container = anchor = null ;
} else {
let { next , bu , u , parent , vnode } = instance ;
let originNext = next ;
2023-07-24 11:13:08 +08:00
let vnodeHook ;
2023-09-06 09:51:55 +08:00
{
pushWarningContext ( next || instance . vnode ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
toggleRecurse ( instance , false ) ;
if ( next ) {
next . el = vnode . el ;
updateComponentPreRender ( instance , next , optimized ) ;
} else {
next = vnode ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( bu ) {
invokeArrayFns ( bu ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( vnodeHook = next . props && next . props . onVnodeBeforeUpdate ) {
invokeVNodeHook ( vnodeHook , parent , next , vnode ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
toggleRecurse ( instance , true ) ;
2023-07-24 11:13:08 +08:00
{
2023-09-06 09:51:55 +08:00
startMeasure ( instance , ` render ` ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const nextTree = renderComponentRoot ( instance ) ;
2023-07-24 11:13:08 +08:00
{
2023-09-06 09:51:55 +08:00
endMeasure ( instance , ` render ` ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const prevTree = instance . subTree ;
instance . subTree = nextTree ;
2023-07-24 11:13:08 +08:00
{
2023-09-06 09:51:55 +08:00
startMeasure ( instance , ` patch ` ) ;
}
patch (
prevTree ,
nextTree ,
// parent may have changed if it's in a teleport
hostParentNode ( prevTree . el ) ,
// anchor may have changed if it's in a fragment
getNextHostNode ( prevTree ) ,
instance ,
parentSuspense ,
isSVG
) ;
2023-07-24 11:13:08 +08:00
{
2023-09-06 09:51:55 +08:00
endMeasure ( instance , ` patch ` ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
next . el = nextTree . el ;
if ( originNext === null ) {
updateHOCHostEl ( instance , nextTree . el ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( u ) {
queuePostRenderEffect ( u , parentSuspense ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( vnodeHook = next . props && next . props . onVnodeUpdated ) {
queuePostRenderEffect (
( ) => invokeVNodeHook ( vnodeHook , parent , next , vnode ) ,
parentSuspense
) ;
2023-07-24 11:13:08 +08:00
}
{
2023-09-06 09:51:55 +08:00
devtoolsComponentUpdated ( instance ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
{
popWarningContext ( ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
const effect = instance . effect = new ReactiveEffect (
componentUpdateFn ,
( ) => queueJob ( update ) ,
instance . scope
// track it in component's effect scope
) ;
const update = instance . update = ( ) => effect . run ( ) ;
update . id = instance . uid ;
toggleRecurse ( instance , true ) ;
{
effect . onTrack = instance . rtc ? ( e ) => invokeArrayFns ( instance . rtc , e ) : void 0 ;
effect . onTrigger = instance . rtg ? ( e ) => invokeArrayFns ( instance . rtg , e ) : void 0 ;
update . ownerInstance = instance ;
}
update ( ) ;
} ;
const updateComponentPreRender = ( instance , nextVNode , optimized ) => {
nextVNode . component = instance ;
const prevProps = instance . vnode . props ;
instance . vnode = nextVNode ;
instance . next = null ;
updateProps ( instance , nextVNode . props , prevProps , optimized ) ;
updateSlots ( instance , nextVNode . children , optimized ) ;
pauseTracking ( ) ;
flushPreFlushCbs ( ) ;
resetTracking ( ) ;
} ;
const patchChildren = ( n1 , n2 , container , anchor , parentComponent , parentSuspense , isSVG , slotScopeIds , optimized = false ) => {
const c1 = n1 && n1 . children ;
const prevShapeFlag = n1 ? n1 . shapeFlag : 0 ;
const c2 = n2 . children ;
const { patchFlag , shapeFlag } = n2 ;
if ( patchFlag > 0 ) {
if ( patchFlag & 128 ) {
patchKeyedChildren (
c1 ,
c2 ,
container ,
anchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
return ;
} else if ( patchFlag & 256 ) {
patchUnkeyedChildren (
c1 ,
c2 ,
container ,
anchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
return ;
}
}
if ( shapeFlag & 8 ) {
if ( prevShapeFlag & 16 ) {
unmountChildren ( c1 , parentComponent , parentSuspense ) ;
}
if ( c2 !== c1 ) {
hostSetElementText ( container , c2 ) ;
}
} else {
if ( prevShapeFlag & 16 ) {
if ( shapeFlag & 16 ) {
patchKeyedChildren (
c1 ,
c2 ,
container ,
anchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
} else {
unmountChildren ( c1 , parentComponent , parentSuspense , true ) ;
}
} else {
if ( prevShapeFlag & 8 ) {
hostSetElementText ( container , "" ) ;
}
if ( shapeFlag & 16 ) {
mountChildren (
c2 ,
container ,
anchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
}
}
}
} ;
const patchUnkeyedChildren = ( c1 , c2 , container , anchor , parentComponent , parentSuspense , isSVG , slotScopeIds , optimized ) => {
c1 = c1 || EMPTY _ARR ;
c2 = c2 || EMPTY _ARR ;
const oldLength = c1 . length ;
const newLength = c2 . length ;
const commonLength = Math . min ( oldLength , newLength ) ;
let i ;
for ( i = 0 ; i < commonLength ; i ++ ) {
const nextChild = c2 [ i ] = optimized ? cloneIfMounted ( c2 [ i ] ) : normalizeVNode ( c2 [ i ] ) ;
patch (
c1 [ i ] ,
nextChild ,
container ,
null ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( oldLength > newLength ) {
unmountChildren (
c1 ,
parentComponent ,
parentSuspense ,
true ,
false ,
commonLength
) ;
} else {
mountChildren (
c2 ,
container ,
anchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized ,
commonLength
) ;
}
} ;
const patchKeyedChildren = ( c1 , c2 , container , parentAnchor , parentComponent , parentSuspense , isSVG , slotScopeIds , optimized ) => {
let i = 0 ;
const l2 = c2 . length ;
let e1 = c1 . length - 1 ;
let e2 = l2 - 1 ;
while ( i <= e1 && i <= e2 ) {
const n1 = c1 [ i ] ;
const n2 = c2 [ i ] = optimized ? cloneIfMounted ( c2 [ i ] ) : normalizeVNode ( c2 [ i ] ) ;
if ( isSameVNodeType ( n1 , n2 ) ) {
patch (
n1 ,
n2 ,
container ,
null ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
} else {
break ;
}
i ++ ;
}
while ( i <= e1 && i <= e2 ) {
const n1 = c1 [ e1 ] ;
const n2 = c2 [ e2 ] = optimized ? cloneIfMounted ( c2 [ e2 ] ) : normalizeVNode ( c2 [ e2 ] ) ;
if ( isSameVNodeType ( n1 , n2 ) ) {
patch (
n1 ,
n2 ,
container ,
null ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
} else {
break ;
}
e1 -- ;
e2 -- ;
}
if ( i > e1 ) {
if ( i <= e2 ) {
const nextPos = e2 + 1 ;
const anchor = nextPos < l2 ? c2 [ nextPos ] . el : parentAnchor ;
while ( i <= e2 ) {
patch (
null ,
c2 [ i ] = optimized ? cloneIfMounted ( c2 [ i ] ) : normalizeVNode ( c2 [ i ] ) ,
container ,
anchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
i ++ ;
}
}
} else if ( i > e2 ) {
while ( i <= e1 ) {
unmount ( c1 [ i ] , parentComponent , parentSuspense , true ) ;
i ++ ;
}
} else {
const s1 = i ;
const s2 = i ;
const keyToNewIndexMap = /* @__PURE__ */ new Map ( ) ;
for ( i = s2 ; i <= e2 ; i ++ ) {
const nextChild = c2 [ i ] = optimized ? cloneIfMounted ( c2 [ i ] ) : normalizeVNode ( c2 [ i ] ) ;
if ( nextChild . key != null ) {
if ( keyToNewIndexMap . has ( nextChild . key ) ) {
warn (
` Duplicate keys found during update: ` ,
JSON . stringify ( nextChild . key ) ,
` Make sure keys are unique. `
) ;
}
keyToNewIndexMap . set ( nextChild . key , i ) ;
}
}
let j ;
let patched = 0 ;
const toBePatched = e2 - s2 + 1 ;
let moved = false ;
let maxNewIndexSoFar = 0 ;
const newIndexToOldIndexMap = new Array ( toBePatched ) ;
for ( i = 0 ; i < toBePatched ; i ++ )
newIndexToOldIndexMap [ i ] = 0 ;
for ( i = s1 ; i <= e1 ; i ++ ) {
const prevChild = c1 [ i ] ;
if ( patched >= toBePatched ) {
unmount ( prevChild , parentComponent , parentSuspense , true ) ;
continue ;
}
let newIndex ;
if ( prevChild . key != null ) {
newIndex = keyToNewIndexMap . get ( prevChild . key ) ;
} else {
for ( j = s2 ; j <= e2 ; j ++ ) {
if ( newIndexToOldIndexMap [ j - s2 ] === 0 && isSameVNodeType ( prevChild , c2 [ j ] ) ) {
newIndex = j ;
break ;
}
}
}
if ( newIndex === void 0 ) {
unmount ( prevChild , parentComponent , parentSuspense , true ) ;
} else {
newIndexToOldIndexMap [ newIndex - s2 ] = i + 1 ;
if ( newIndex >= maxNewIndexSoFar ) {
maxNewIndexSoFar = newIndex ;
} else {
moved = true ;
}
patch (
prevChild ,
c2 [ newIndex ] ,
container ,
null ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
patched ++ ;
}
}
const increasingNewIndexSequence = moved ? getSequence ( newIndexToOldIndexMap ) : EMPTY _ARR ;
j = increasingNewIndexSequence . length - 1 ;
for ( i = toBePatched - 1 ; i >= 0 ; i -- ) {
const nextIndex = s2 + i ;
const nextChild = c2 [ nextIndex ] ;
const anchor = nextIndex + 1 < l2 ? c2 [ nextIndex + 1 ] . el : parentAnchor ;
if ( newIndexToOldIndexMap [ i ] === 0 ) {
patch (
null ,
nextChild ,
container ,
anchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
} else if ( moved ) {
if ( j < 0 || i !== increasingNewIndexSequence [ j ] ) {
move ( nextChild , container , anchor , 2 ) ;
} else {
j -- ;
}
}
}
}
} ;
const move = ( vnode , container , anchor , moveType , parentSuspense = null ) => {
const { el , type , transition , children , shapeFlag } = vnode ;
if ( shapeFlag & 6 ) {
move ( vnode . component . subTree , container , anchor , moveType ) ;
return ;
}
if ( shapeFlag & 128 ) {
vnode . suspense . move ( container , anchor , moveType ) ;
return ;
}
if ( shapeFlag & 64 ) {
type . move ( vnode , container , anchor , internals ) ;
return ;
}
if ( type === Fragment ) {
hostInsert ( el , container , anchor ) ;
for ( let i = 0 ; i < children . length ; i ++ ) {
move ( children [ i ] , container , anchor , moveType ) ;
}
hostInsert ( vnode . anchor , container , anchor ) ;
return ;
}
if ( type === Static ) {
moveStaticNode ( vnode , container , anchor ) ;
return ;
}
const needTransition = moveType !== 2 && shapeFlag & 1 && transition ;
if ( needTransition ) {
if ( moveType === 0 ) {
transition . beforeEnter ( el ) ;
hostInsert ( el , container , anchor ) ;
queuePostRenderEffect ( ( ) => transition . enter ( el ) , parentSuspense ) ;
} else {
const { leave , delayLeave , afterLeave } = transition ;
const remove2 = ( ) => hostInsert ( el , container , anchor ) ;
const performLeave = ( ) => {
leave ( el , ( ) => {
remove2 ( ) ;
afterLeave && afterLeave ( ) ;
} ) ;
} ;
if ( delayLeave ) {
delayLeave ( el , remove2 , performLeave ) ;
} else {
performLeave ( ) ;
}
}
} else {
hostInsert ( el , container , anchor ) ;
}
} ;
const unmount = ( vnode , parentComponent , parentSuspense , doRemove = false , optimized = false ) => {
const {
type ,
props ,
ref ,
children ,
dynamicChildren ,
shapeFlag ,
patchFlag ,
dirs
} = vnode ;
if ( ref != null ) {
setRef ( ref , null , parentSuspense , vnode , true ) ;
}
if ( shapeFlag & 256 ) {
parentComponent . ctx . deactivate ( vnode ) ;
return ;
}
const shouldInvokeDirs = shapeFlag & 1 && dirs ;
const shouldInvokeVnodeHook = ! isAsyncWrapper ( vnode ) ;
let vnodeHook ;
if ( shouldInvokeVnodeHook && ( vnodeHook = props && props . onVnodeBeforeUnmount ) ) {
invokeVNodeHook ( vnodeHook , parentComponent , vnode ) ;
}
if ( shapeFlag & 6 ) {
unmountComponent ( vnode . component , parentSuspense , doRemove ) ;
} else {
if ( shapeFlag & 128 ) {
vnode . suspense . unmount ( parentSuspense , doRemove ) ;
return ;
}
if ( shouldInvokeDirs ) {
invokeDirectiveHook ( vnode , null , parentComponent , "beforeUnmount" ) ;
}
if ( shapeFlag & 64 ) {
vnode . type . remove (
vnode ,
parentComponent ,
parentSuspense ,
optimized ,
internals ,
doRemove
) ;
} else if ( dynamicChildren && // #1153: fast path should not be taken for non-stable (v-for) fragments
( type !== Fragment || patchFlag > 0 && patchFlag & 64 ) ) {
unmountChildren (
dynamicChildren ,
parentComponent ,
parentSuspense ,
false ,
true
) ;
} else if ( type === Fragment && patchFlag & ( 128 | 256 ) || ! optimized && shapeFlag & 16 ) {
unmountChildren ( children , parentComponent , parentSuspense ) ;
}
if ( doRemove ) {
remove ( vnode ) ;
}
}
if ( shouldInvokeVnodeHook && ( vnodeHook = props && props . onVnodeUnmounted ) || shouldInvokeDirs ) {
queuePostRenderEffect ( ( ) => {
vnodeHook && invokeVNodeHook ( vnodeHook , parentComponent , vnode ) ;
shouldInvokeDirs && invokeDirectiveHook ( vnode , null , parentComponent , "unmounted" ) ;
} , parentSuspense ) ;
}
} ;
const remove = ( vnode ) => {
const { type , el , anchor , transition } = vnode ;
if ( type === Fragment ) {
if ( vnode . patchFlag > 0 && vnode . patchFlag & 2048 && transition && ! transition . persisted ) {
vnode . children . forEach ( ( child ) => {
if ( child . type === Comment ) {
hostRemove ( child . el ) ;
} else {
remove ( child ) ;
}
} ) ;
} else {
removeFragment ( el , anchor ) ;
}
return ;
}
if ( type === Static ) {
removeStaticNode ( vnode ) ;
return ;
}
const performRemove = ( ) => {
hostRemove ( el ) ;
if ( transition && ! transition . persisted && transition . afterLeave ) {
transition . afterLeave ( ) ;
}
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
if ( vnode . shapeFlag & 1 && transition && ! transition . persisted ) {
const { leave , delayLeave } = transition ;
const performLeave = ( ) => leave ( el , performRemove ) ;
if ( delayLeave ) {
delayLeave ( vnode . el , performRemove , performLeave ) ;
} else {
performLeave ( ) ;
}
} else {
performRemove ( ) ;
}
} ;
const removeFragment = ( cur , end ) => {
let next ;
while ( cur !== end ) {
next = hostNextSibling ( cur ) ;
hostRemove ( cur ) ;
cur = next ;
}
hostRemove ( end ) ;
} ;
const unmountComponent = ( instance , parentSuspense , doRemove ) => {
if ( instance . type . _ _hmrId ) {
unregisterHMR ( instance ) ;
}
const { bum , scope , update , subTree , um } = instance ;
if ( bum ) {
invokeArrayFns ( bum ) ;
}
scope . stop ( ) ;
if ( update ) {
update . active = false ;
unmount ( subTree , instance , parentSuspense , doRemove ) ;
}
if ( um ) {
queuePostRenderEffect ( um , parentSuspense ) ;
}
queuePostRenderEffect ( ( ) => {
instance . isUnmounted = true ;
} , parentSuspense ) ;
if ( parentSuspense && parentSuspense . pendingBranch && ! parentSuspense . isUnmounted && instance . asyncDep && ! instance . asyncResolved && instance . suspenseId === parentSuspense . pendingId ) {
parentSuspense . deps -- ;
if ( parentSuspense . deps === 0 ) {
parentSuspense . resolve ( ) ;
}
}
{
devtoolsComponentRemoved ( instance ) ;
}
} ;
const unmountChildren = ( children , parentComponent , parentSuspense , doRemove = false , optimized = false , start = 0 ) => {
for ( let i = start ; i < children . length ; i ++ ) {
unmount ( children [ i ] , parentComponent , parentSuspense , doRemove , optimized ) ;
}
} ;
const getNextHostNode = ( vnode ) => {
if ( vnode . shapeFlag & 6 ) {
return getNextHostNode ( vnode . component . subTree ) ;
}
if ( vnode . shapeFlag & 128 ) {
return vnode . suspense . next ( ) ;
}
return hostNextSibling ( vnode . anchor || vnode . el ) ;
} ;
const render = ( vnode , container , isSVG ) => {
if ( vnode == null ) {
if ( container . _vnode ) {
unmount ( container . _vnode , null , null , true ) ;
}
} else {
patch ( container . _vnode || null , vnode , container , null , null , null , isSVG ) ;
}
flushPreFlushCbs ( ) ;
flushPostFlushCbs ( ) ;
container . _vnode = vnode ;
} ;
const internals = {
p : patch ,
um : unmount ,
m : move ,
r : remove ,
mt : mountComponent ,
mc : mountChildren ,
pc : patchChildren ,
pbc : patchBlockChildren ,
n : getNextHostNode ,
o : options
} ;
let hydrate ;
let hydrateNode ;
if ( createHydrationFns ) {
[ hydrate , hydrateNode ] = createHydrationFns (
internals
) ;
}
return {
render ,
hydrate ,
createApp : createAppAPI ( render , hydrate )
} ;
2023-07-24 11:13:08 +08:00
}
function toggleRecurse ( { effect , update } , allowed ) {
2023-09-06 09:51:55 +08:00
effect . allowRecurse = update . allowRecurse = allowed ;
}
2023-07-24 11:13:08 +08:00
function traverseStaticChildren ( n1 , n2 , shallow = false ) {
2023-09-06 09:51:55 +08:00
const ch1 = n1 . children ;
const ch2 = n2 . children ;
if ( isArray ( ch1 ) && isArray ( ch2 ) ) {
for ( let i = 0 ; i < ch1 . length ; i ++ ) {
const c1 = ch1 [ i ] ;
let c2 = ch2 [ i ] ;
if ( c2 . shapeFlag & 1 && ! c2 . dynamicChildren ) {
if ( c2 . patchFlag <= 0 || c2 . patchFlag === 32 ) {
c2 = ch2 [ i ] = cloneIfMounted ( ch2 [ i ] ) ;
c2 . el = c1 . el ;
}
if ( ! shallow )
traverseStaticChildren ( c1 , c2 ) ;
}
if ( c2 . type === Text ) {
c2 . el = c1 . el ;
}
if ( c2 . type === Comment && ! c2 . el ) {
c2 . el = c1 . el ;
}
}
}
2023-07-24 11:13:08 +08:00
}
function getSequence ( arr ) {
2023-09-06 09:51:55 +08:00
const p = arr . slice ( ) ;
const result = [ 0 ] ;
let i , j , u , v , c ;
const len = arr . length ;
for ( i = 0 ; i < len ; i ++ ) {
const arrI = arr [ i ] ;
if ( arrI !== 0 ) {
j = result [ result . length - 1 ] ;
if ( arr [ j ] < arrI ) {
p [ i ] = j ;
result . push ( i ) ;
continue ;
}
u = 0 ;
v = result . length - 1 ;
while ( u < v ) {
c = u + v >> 1 ;
if ( arr [ result [ c ] ] < arrI ) {
u = c + 1 ;
} else {
v = c ;
}
}
if ( arrI < arr [ result [ u ] ] ) {
if ( u > 0 ) {
p [ i ] = result [ u - 1 ] ;
}
result [ u ] = i ;
}
}
}
u = result . length ;
v = result [ u - 1 ] ;
while ( u -- > 0 ) {
result [ u ] = v ;
v = p [ v ] ;
}
return result ;
2023-07-24 11:13:08 +08:00
}
const isTeleport = ( type ) => type . _ _isTeleport ;
2023-09-06 09:51:55 +08:00
const isTeleportDisabled = ( props ) => props && ( props . disabled || props . disabled === "" ) ;
const isTargetSVG = ( target ) => typeof SVGElement !== "undefined" && target instanceof SVGElement ;
2023-07-24 11:13:08 +08:00
const resolveTarget = ( props , select ) => {
2023-09-06 09:51:55 +08:00
const targetSelector = props && props . to ;
if ( isString ( targetSelector ) ) {
if ( ! select ) {
warn (
` Current renderer does not support string target for Teleports. (missing querySelector renderer option) `
) ;
return null ;
} else {
const target = select ( targetSelector ) ;
if ( ! target ) {
warn (
` Failed to locate Teleport target with selector " ${ targetSelector } ". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree. `
) ;
}
return target ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} else {
if ( ! targetSelector && ! isTeleportDisabled ( props ) ) {
warn ( ` Invalid Teleport target: ${ targetSelector } ` ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return targetSelector ;
}
2023-07-24 11:13:08 +08:00
} ;
const TeleportImpl = {
2023-09-06 09:51:55 +08:00
_ _isTeleport : true ,
process ( n1 , n2 , container , anchor , parentComponent , parentSuspense , isSVG , slotScopeIds , optimized , internals ) {
const {
mc : mountChildren ,
pc : patchChildren ,
pbc : patchBlockChildren ,
o : { insert , querySelector , createText , createComment }
} = internals ;
const disabled = isTeleportDisabled ( n2 . props ) ;
let { shapeFlag , children , dynamicChildren } = n2 ;
if ( isHmrUpdating ) {
optimized = false ;
dynamicChildren = null ;
}
if ( n1 == null ) {
const placeholder = n2 . el = createComment ( "teleport start" ) ;
const mainAnchor = n2 . anchor = createComment ( "teleport end" ) ;
insert ( placeholder , container , anchor ) ;
insert ( mainAnchor , container , anchor ) ;
const target = n2 . target = resolveTarget ( n2 . props , querySelector ) ;
const targetAnchor = n2 . targetAnchor = createText ( "" ) ;
if ( target ) {
insert ( targetAnchor , target ) ;
isSVG = isSVG || isTargetSVG ( target ) ;
} else if ( ! disabled ) {
warn ( "Invalid Teleport target on mount:" , target , ` ( ${ typeof target } ) ` ) ;
}
const mount = ( container2 , anchor2 ) => {
if ( shapeFlag & 16 ) {
mountChildren (
children ,
container2 ,
anchor2 ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
}
} ;
if ( disabled ) {
mount ( container , mainAnchor ) ;
} else if ( target ) {
mount ( target , targetAnchor ) ;
}
} else {
n2 . el = n1 . el ;
const mainAnchor = n2 . anchor = n1 . anchor ;
const target = n2 . target = n1 . target ;
const targetAnchor = n2 . targetAnchor = n1 . targetAnchor ;
const wasDisabled = isTeleportDisabled ( n1 . props ) ;
const currentContainer = wasDisabled ? container : target ;
const currentAnchor = wasDisabled ? mainAnchor : targetAnchor ;
isSVG = isSVG || isTargetSVG ( target ) ;
if ( dynamicChildren ) {
patchBlockChildren (
n1 . dynamicChildren ,
dynamicChildren ,
currentContainer ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds
) ;
traverseStaticChildren ( n1 , n2 , true ) ;
} else if ( ! optimized ) {
patchChildren (
n1 ,
n2 ,
currentContainer ,
currentAnchor ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
false
) ;
}
if ( disabled ) {
if ( ! wasDisabled ) {
moveTeleport (
n2 ,
container ,
mainAnchor ,
internals ,
1
) ;
}
} else {
if ( ( n2 . props && n2 . props . to ) !== ( n1 . props && n1 . props . to ) ) {
const nextTarget = n2 . target = resolveTarget (
n2 . props ,
querySelector
) ;
if ( nextTarget ) {
moveTeleport (
n2 ,
nextTarget ,
null ,
internals ,
0
) ;
} else {
warn (
"Invalid Teleport target on update:" ,
target ,
` ( ${ typeof target } ) `
) ;
}
} else if ( wasDisabled ) {
moveTeleport (
n2 ,
target ,
targetAnchor ,
internals ,
1
) ;
}
}
}
updateCssVars ( n2 ) ;
} ,
remove ( vnode , parentComponent , parentSuspense , optimized , { um : unmount , o : { remove : hostRemove } } , doRemove ) {
const { shapeFlag , children , anchor , targetAnchor , target , props } = vnode ;
2023-07-24 11:13:08 +08:00
if ( target ) {
2023-09-06 09:51:55 +08:00
hostRemove ( targetAnchor ) ;
}
if ( doRemove || ! isTeleportDisabled ( props ) ) {
hostRemove ( anchor ) ;
if ( shapeFlag & 16 ) {
for ( let i = 0 ; i < children . length ; i ++ ) {
const child = children [ i ] ;
unmount (
child ,
parentComponent ,
parentSuspense ,
true ,
! ! child . dynamicChildren
) ;
}
}
}
} ,
move : moveTeleport ,
hydrate : hydrateTeleport
} ;
function moveTeleport ( vnode , container , parentAnchor , { o : { insert } , m : move } , moveType = 2 ) {
if ( moveType === 0 ) {
insert ( vnode . targetAnchor , container , parentAnchor ) ;
}
const { el , anchor , shapeFlag , children , props } = vnode ;
const isReorder = moveType === 2 ;
if ( isReorder ) {
insert ( el , container , parentAnchor ) ;
}
if ( ! isReorder || isTeleportDisabled ( props ) ) {
if ( shapeFlag & 16 ) {
for ( let i = 0 ; i < children . length ; i ++ ) {
move (
children [ i ] ,
container ,
parentAnchor ,
2
) ;
}
}
}
if ( isReorder ) {
insert ( anchor , container , parentAnchor ) ;
}
}
function hydrateTeleport ( node , vnode , parentComponent , parentSuspense , slotScopeIds , optimized , {
o : { nextSibling , parentNode , querySelector }
} , hydrateChildren ) {
const target = vnode . target = resolveTarget (
vnode . props ,
querySelector
) ;
if ( target ) {
const targetNode = target . _lpa || target . firstChild ;
if ( vnode . shapeFlag & 16 ) {
if ( isTeleportDisabled ( vnode . props ) ) {
vnode . anchor = hydrateChildren (
nextSibling ( node ) ,
vnode ,
parentNode ( node ) ,
parentComponent ,
parentSuspense ,
slotScopeIds ,
optimized
) ;
vnode . targetAnchor = targetNode ;
} else {
vnode . anchor = nextSibling ( node ) ;
let targetAnchor = targetNode ;
while ( targetAnchor ) {
targetAnchor = nextSibling ( targetAnchor ) ;
if ( targetAnchor && targetAnchor . nodeType === 8 && targetAnchor . data === "teleport anchor" ) {
vnode . targetAnchor = targetAnchor ;
target . _lpa = vnode . targetAnchor && nextSibling ( vnode . targetAnchor ) ;
break ;
}
}
hydrateChildren (
targetNode ,
vnode ,
target ,
parentComponent ,
parentSuspense ,
slotScopeIds ,
optimized
) ;
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
updateCssVars ( vnode ) ;
}
return vnode . anchor && nextSibling ( vnode . anchor ) ;
2023-07-24 11:13:08 +08:00
}
const Teleport = TeleportImpl ;
function updateCssVars ( vnode ) {
2023-09-06 09:51:55 +08:00
const ctx = vnode . ctx ;
if ( ctx && ctx . ut ) {
let node = vnode . children [ 0 ] . el ;
while ( node !== vnode . targetAnchor ) {
if ( node . nodeType === 1 )
node . setAttribute ( "data-v-owner" , ctx . uid ) ;
node = node . nextSibling ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
ctx . ut ( ) ;
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const Fragment = Symbol . for ( "v-fgt" ) ;
const Text = Symbol . for ( "v-txt" ) ;
const Comment = Symbol . for ( "v-cmt" ) ;
const Static = Symbol . for ( "v-stc" ) ;
2023-07-24 11:13:08 +08:00
const blockStack = [ ] ;
let currentBlock = null ;
function openBlock ( disableTracking = false ) {
2023-09-06 09:51:55 +08:00
blockStack . push ( currentBlock = disableTracking ? null : [ ] ) ;
2023-07-24 11:13:08 +08:00
}
function closeBlock ( ) {
2023-09-06 09:51:55 +08:00
blockStack . pop ( ) ;
currentBlock = blockStack [ blockStack . length - 1 ] || null ;
2023-07-24 11:13:08 +08:00
}
let isBlockTreeEnabled = 1 ;
function setBlockTracking ( value ) {
2023-09-06 09:51:55 +08:00
isBlockTreeEnabled += value ;
2023-07-24 11:13:08 +08:00
}
function setupBlock ( vnode ) {
2023-09-06 09:51:55 +08:00
vnode . dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || EMPTY _ARR : null ;
closeBlock ( ) ;
if ( isBlockTreeEnabled > 0 && currentBlock ) {
currentBlock . push ( vnode ) ;
}
return vnode ;
2023-07-24 11:13:08 +08:00
}
function createElementBlock ( type , props , children , patchFlag , dynamicProps , shapeFlag ) {
2023-09-06 09:51:55 +08:00
return setupBlock (
createBaseVNode (
type ,
props ,
children ,
patchFlag ,
dynamicProps ,
shapeFlag ,
true
/* isBlock */
)
) ;
}
2023-07-24 11:13:08 +08:00
function createBlock ( type , props , children , patchFlag , dynamicProps ) {
2023-09-06 09:51:55 +08:00
return setupBlock (
createVNode (
type ,
props ,
children ,
patchFlag ,
dynamicProps ,
true
/* isBlock: prevent a block from tracking itself */
)
) ;
2023-07-24 11:13:08 +08:00
}
function isVNode ( value ) {
2023-09-06 09:51:55 +08:00
return value ? value . _ _v _isVNode === true : false ;
2023-07-24 11:13:08 +08:00
}
function isSameVNodeType ( n1 , n2 ) {
2023-09-06 09:51:55 +08:00
if ( n2 . shapeFlag & 6 && hmrDirtyComponents . has ( n2 . type ) ) {
n1 . shapeFlag &= ~ 256 ;
n2 . shapeFlag &= ~ 512 ;
return false ;
}
return n1 . type === n2 . type && n1 . key === n2 . key ;
2023-07-24 11:13:08 +08:00
}
let vnodeArgsTransformer ;
function transformVNodeArgs ( transformer ) {
2023-09-06 09:51:55 +08:00
vnodeArgsTransformer = transformer ;
2023-07-24 11:13:08 +08:00
}
const createVNodeWithArgsTransform = ( ... args ) => {
2023-09-06 09:51:55 +08:00
return _createVNode (
... vnodeArgsTransformer ? vnodeArgsTransformer ( args , currentRenderingInstance ) : args
) ;
2023-07-24 11:13:08 +08:00
} ;
const InternalObjectKey = ` __vInternal ` ;
const normalizeKey = ( { key } ) => key != null ? key : null ;
2023-09-06 09:51:55 +08:00
const normalizeRef = ( {
ref ,
ref _key ,
ref _for
} ) => {
if ( typeof ref === "number" ) {
ref = "" + ref ;
}
return ref != null ? isString ( ref ) || isRef ( ref ) || isFunction ( ref ) ? { i : currentRenderingInstance , r : ref , k : ref _key , f : ! ! ref _for } : ref : null ;
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
function createBaseVNode ( type , props = null , children = null , patchFlag = 0 , dynamicProps = null , shapeFlag = type === Fragment ? 0 : 1 , isBlockNode = false , needFullChildrenNormalization = false ) {
const vnode = {
_ _v _isVNode : true ,
_ _v _skip : true ,
type ,
props ,
key : props && normalizeKey ( props ) ,
ref : props && normalizeRef ( props ) ,
scopeId : currentScopeId ,
slotScopeIds : null ,
children ,
component : null ,
suspense : null ,
ssContent : null ,
ssFallback : null ,
dirs : null ,
transition : null ,
el : null ,
anchor : null ,
target : null ,
targetAnchor : null ,
staticCount : 0 ,
shapeFlag ,
patchFlag ,
dynamicProps ,
dynamicChildren : null ,
appContext : null ,
ctx : currentRenderingInstance
} ;
if ( needFullChildrenNormalization ) {
normalizeChildren ( vnode , children ) ;
if ( shapeFlag & 128 ) {
type . normalize ( vnode ) ;
}
} else if ( children ) {
vnode . shapeFlag |= isString ( children ) ? 8 : 16 ;
}
if ( vnode . key !== vnode . key ) {
warn ( ` VNode created with invalid key (NaN). VNode type: ` , vnode . type ) ;
}
if ( isBlockTreeEnabled > 0 && // avoid a block node from tracking itself
! isBlockNode && // has current parent block
currentBlock && // presence of a patch flag indicates this node needs patching on updates.
// component nodes also should always be patched, because even if the
// component doesn't need to update, it needs to persist the instance on to
// the next vnode so that it can be properly unmounted later.
( vnode . patchFlag > 0 || shapeFlag & 6 ) && // the EVENTS flag is only for hydration and if it is the only flag, the
// vnode should not be considered dynamic due to handler caching.
vnode . patchFlag !== 32 ) {
currentBlock . push ( vnode ) ;
}
return vnode ;
}
const createVNode = createVNodeWithArgsTransform ;
2023-07-24 11:13:08 +08:00
function _createVNode ( type , props = null , children = null , patchFlag = 0 , dynamicProps = null , isBlockNode = false ) {
2023-09-06 09:51:55 +08:00
if ( ! type || type === NULL _DYNAMIC _COMPONENT ) {
if ( ! type ) {
warn ( ` Invalid vnode type when creating vnode: ${ type } . ` ) ;
}
type = Comment ;
}
if ( isVNode ( type ) ) {
const cloned = cloneVNode (
type ,
props ,
true
/* mergeRef: true */
) ;
if ( children ) {
normalizeChildren ( cloned , children ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( isBlockTreeEnabled > 0 && ! isBlockNode && currentBlock ) {
if ( cloned . shapeFlag & 6 ) {
currentBlock [ currentBlock . indexOf ( type ) ] = cloned ;
} else {
currentBlock . push ( cloned ) ;
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
cloned . patchFlag |= - 2 ;
return cloned ;
}
if ( isClassComponent ( type ) ) {
type = type . _ _vccOpts ;
}
if ( props ) {
props = guardReactiveProps ( props ) ;
let { class : klass , style } = props ;
if ( klass && ! isString ( klass ) ) {
props . class = normalizeClass ( klass ) ;
}
if ( isObject ( style ) ) {
if ( isProxy ( style ) && ! isArray ( style ) ) {
style = extend ( { } , style ) ;
}
props . style = normalizeStyle ( style ) ;
}
}
const shapeFlag = isString ( type ) ? 1 : isSuspense ( type ) ? 128 : isTeleport ( type ) ? 64 : isObject ( type ) ? 4 : isFunction ( type ) ? 2 : 0 ;
if ( shapeFlag & 4 && isProxy ( type ) ) {
type = toRaw ( type ) ;
warn (
` Vue received a Component which was made a reactive object. This can lead to unnecessary performance overhead, and should be avoided by marking the component with \` markRaw \` or using \` shallowRef \` instead of \` ref \` . ` ,
`
Component that was made reactive : ` ,
type
) ;
}
return createBaseVNode (
type ,
props ,
children ,
patchFlag ,
dynamicProps ,
shapeFlag ,
isBlockNode ,
true
) ;
2023-07-24 11:13:08 +08:00
}
function guardReactiveProps ( props ) {
2023-09-06 09:51:55 +08:00
if ( ! props )
return null ;
return isProxy ( props ) || InternalObjectKey in props ? extend ( { } , props ) : props ;
2023-07-24 11:13:08 +08:00
}
function cloneVNode ( vnode , extraProps , mergeRef = false ) {
2023-09-06 09:51:55 +08:00
const { props , ref , patchFlag , children } = vnode ;
const mergedProps = extraProps ? mergeProps ( props || { } , extraProps ) : props ;
const cloned = {
_ _v _isVNode : true ,
_ _v _skip : true ,
type : vnode . type ,
props : mergedProps ,
key : mergedProps && normalizeKey ( mergedProps ) ,
ref : extraProps && extraProps . ref ? (
// #2078 in the case of <component :is="vnode" ref="extra"/>
// if the vnode itself already has a ref, cloneVNode will need to merge
// the refs so the single vnode can be set on multiple refs
mergeRef && ref ? isArray ( ref ) ? ref . concat ( normalizeRef ( extraProps ) ) : [ ref , normalizeRef ( extraProps ) ] : normalizeRef ( extraProps )
) : ref ,
scopeId : vnode . scopeId ,
slotScopeIds : vnode . slotScopeIds ,
children : patchFlag === - 1 && isArray ( children ) ? children . map ( deepCloneVNode ) : children ,
target : vnode . target ,
targetAnchor : vnode . targetAnchor ,
staticCount : vnode . staticCount ,
shapeFlag : vnode . shapeFlag ,
// if the vnode is cloned with extra props, we can no longer assume its
// existing patch flag to be reliable and need to add the FULL_PROPS flag.
// note: preserve flag for fragments since they use the flag for children
// fast paths only.
patchFlag : extraProps && vnode . type !== Fragment ? patchFlag === - 1 ? 16 : patchFlag | 16 : patchFlag ,
dynamicProps : vnode . dynamicProps ,
dynamicChildren : vnode . dynamicChildren ,
appContext : vnode . appContext ,
dirs : vnode . dirs ,
transition : vnode . transition ,
// These should technically only be non-null on mounted VNodes. However,
// they *should* be copied for kept-alive vnodes. So we just always copy
// them since them being non-null during a mount doesn't affect the logic as
// they will simply be overwritten.
component : vnode . component ,
suspense : vnode . suspense ,
ssContent : vnode . ssContent && cloneVNode ( vnode . ssContent ) ,
ssFallback : vnode . ssFallback && cloneVNode ( vnode . ssFallback ) ,
el : vnode . el ,
anchor : vnode . anchor ,
ctx : vnode . ctx ,
ce : vnode . ce
} ;
return cloned ;
2023-07-24 11:13:08 +08:00
}
function deepCloneVNode ( vnode ) {
2023-09-06 09:51:55 +08:00
const cloned = cloneVNode ( vnode ) ;
if ( isArray ( vnode . children ) ) {
cloned . children = vnode . children . map ( deepCloneVNode ) ;
}
return cloned ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function createTextVNode ( text = " " , flag = 0 ) {
return createVNode ( Text , null , text , flag ) ;
2023-07-24 11:13:08 +08:00
}
function createStaticVNode ( content , numberOfNodes ) {
2023-09-06 09:51:55 +08:00
const vnode = createVNode ( Static , null , content ) ;
vnode . staticCount = numberOfNodes ;
return vnode ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function createCommentVNode ( text = "" , asBlock = false ) {
return asBlock ? ( openBlock ( ) , createBlock ( Comment , null , text ) ) : createVNode ( Comment , null , text ) ;
2023-07-24 11:13:08 +08:00
}
function normalizeVNode ( child ) {
2023-09-06 09:51:55 +08:00
if ( child == null || typeof child === "boolean" ) {
return createVNode ( Comment ) ;
} else if ( isArray ( child ) ) {
return createVNode (
Fragment ,
null ,
// #3666, avoid reference pollution when reusing vnode
child . slice ( )
) ;
} else if ( typeof child === "object" ) {
return cloneIfMounted ( child ) ;
} else {
return createVNode ( Text , null , String ( child ) ) ;
}
2023-07-24 11:13:08 +08:00
}
function cloneIfMounted ( child ) {
2023-09-06 09:51:55 +08:00
return child . el === null && child . patchFlag !== - 1 || child . memo ? child : cloneVNode ( child ) ;
2023-07-24 11:13:08 +08:00
}
function normalizeChildren ( vnode , children ) {
2023-09-06 09:51:55 +08:00
let type = 0 ;
const { shapeFlag } = vnode ;
if ( children == null ) {
children = null ;
} else if ( isArray ( children ) ) {
type = 16 ;
} else if ( typeof children === "object" ) {
if ( shapeFlag & ( 1 | 64 ) ) {
const slot = children . default ;
if ( slot ) {
slot . _c && ( slot . _d = false ) ;
normalizeChildren ( vnode , slot ( ) ) ;
slot . _c && ( slot . _d = true ) ;
}
return ;
} else {
type = 32 ;
const slotFlag = children . _ ;
if ( ! slotFlag && ! ( InternalObjectKey in children ) ) {
children . _ctx = currentRenderingInstance ;
} else if ( slotFlag === 3 && currentRenderingInstance ) {
if ( currentRenderingInstance . slots . _ === 1 ) {
children . _ = 1 ;
} else {
children . _ = 2 ;
vnode . patchFlag |= 1024 ;
}
}
}
} else if ( isFunction ( children ) ) {
children = { default : children , _ctx : currentRenderingInstance } ;
type = 32 ;
} else {
children = String ( children ) ;
if ( shapeFlag & 64 ) {
type = 16 ;
children = [ createTextVNode ( children ) ] ;
} else {
type = 8 ;
}
}
vnode . children = children ;
vnode . shapeFlag |= type ;
2023-07-24 11:13:08 +08:00
}
function mergeProps ( ... args ) {
2023-09-06 09:51:55 +08:00
const ret = { } ;
for ( let i = 0 ; i < args . length ; i ++ ) {
const toMerge = args [ i ] ;
for ( const key in toMerge ) {
if ( key === "class" ) {
if ( ret . class !== toMerge . class ) {
ret . class = normalizeClass ( [ ret . class , toMerge . class ] ) ;
}
} else if ( key === "style" ) {
ret . style = normalizeStyle ( [ ret . style , toMerge . style ] ) ;
} else if ( isOn ( key ) ) {
const existing = ret [ key ] ;
const incoming = toMerge [ key ] ;
if ( incoming && existing !== incoming && ! ( isArray ( existing ) && existing . includes ( incoming ) ) ) {
ret [ key ] = existing ? [ ] . concat ( existing , incoming ) : incoming ;
}
} else if ( key !== "" ) {
ret [ key ] = toMerge [ key ] ;
}
}
}
return ret ;
2023-07-24 11:13:08 +08:00
}
function invokeVNodeHook ( hook , instance , vnode , prevVNode = null ) {
2023-09-06 09:51:55 +08:00
callWithAsyncErrorHandling ( hook , instance , 7 , [
vnode ,
prevVNode
] ) ;
2023-07-24 11:13:08 +08:00
}
const emptyAppContext = createAppContext ( ) ;
2023-09-06 09:51:55 +08:00
let uid = 0 ;
2023-07-24 11:13:08 +08:00
function createComponentInstance ( vnode , parent , suspense ) {
2023-09-06 09:51:55 +08:00
const type = vnode . type ;
const appContext = ( parent ? parent . appContext : vnode . appContext ) || emptyAppContext ;
const instance = {
uid : uid ++ ,
vnode ,
type ,
parent ,
appContext ,
root : null ,
// to be immediately set
next : null ,
subTree : null ,
// will be set synchronously right after creation
effect : null ,
update : null ,
// will be set synchronously right after creation
scope : new EffectScope (
true
/* detached */
) ,
render : null ,
proxy : null ,
exposed : null ,
exposeProxy : null ,
withProxy : null ,
provides : parent ? parent . provides : Object . create ( appContext . provides ) ,
accessCache : null ,
renderCache : [ ] ,
// local resolved assets
components : null ,
directives : null ,
// resolved props and emits options
propsOptions : normalizePropsOptions ( type , appContext ) ,
emitsOptions : normalizeEmitsOptions ( type , appContext ) ,
// emit
emit : null ,
// to be set immediately
emitted : null ,
// props default value
propsDefaults : EMPTY _OBJ ,
// inheritAttrs
inheritAttrs : type . inheritAttrs ,
// state
ctx : EMPTY _OBJ ,
data : EMPTY _OBJ ,
props : EMPTY _OBJ ,
attrs : EMPTY _OBJ ,
slots : EMPTY _OBJ ,
refs : EMPTY _OBJ ,
setupState : EMPTY _OBJ ,
setupContext : null ,
attrsProxy : null ,
slotsProxy : null ,
// suspense related
suspense ,
suspenseId : suspense ? suspense . pendingId : 0 ,
asyncDep : null ,
asyncResolved : false ,
// lifecycle hooks
// not using enums here because it results in computed properties
isMounted : false ,
isUnmounted : false ,
isDeactivated : false ,
bc : null ,
c : null ,
bm : null ,
m : null ,
bu : null ,
u : null ,
um : null ,
bum : null ,
da : null ,
a : null ,
rtg : null ,
rtc : null ,
ec : null ,
sp : null
} ;
{
instance . ctx = createDevRenderContext ( instance ) ;
}
instance . root = parent ? parent . root : instance ;
instance . emit = emit . bind ( null , instance ) ;
if ( vnode . ce ) {
vnode . ce ( instance ) ;
}
return instance ;
2023-07-24 11:13:08 +08:00
}
let currentInstance = null ;
const getCurrentInstance = ( ) => currentInstance || currentRenderingInstance ;
2023-09-06 09:51:55 +08:00
let internalSetCurrentInstance ;
{
internalSetCurrentInstance = ( i ) => {
currentInstance = i ;
} ;
}
2023-07-24 11:13:08 +08:00
const setCurrentInstance = ( instance ) => {
2023-09-06 09:51:55 +08:00
internalSetCurrentInstance ( instance ) ;
instance . scope . on ( ) ;
2023-07-24 11:13:08 +08:00
} ;
const unsetCurrentInstance = ( ) => {
2023-09-06 09:51:55 +08:00
currentInstance && currentInstance . scope . off ( ) ;
internalSetCurrentInstance ( null ) ;
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
const isBuiltInTag = /* @__PURE__ */ makeMap ( "slot,component" ) ;
2023-07-24 11:13:08 +08:00
function validateComponentName ( name , config ) {
2023-09-06 09:51:55 +08:00
const appIsNativeTag = config . isNativeTag || NO ;
if ( isBuiltInTag ( name ) || appIsNativeTag ( name ) ) {
warn (
"Do not use built-in or reserved HTML elements as component id: " + name
) ;
}
2023-07-24 11:13:08 +08:00
}
function isStatefulComponent ( instance ) {
2023-09-06 09:51:55 +08:00
return instance . vnode . shapeFlag & 4 ;
2023-07-24 11:13:08 +08:00
}
let isInSSRComponentSetup = false ;
function setupComponent ( instance , isSSR = false ) {
2023-09-06 09:51:55 +08:00
isInSSRComponentSetup = isSSR ;
const { props , children } = instance . vnode ;
const isStateful = isStatefulComponent ( instance ) ;
initProps ( instance , props , isStateful , isSSR ) ;
initSlots ( instance , children ) ;
const setupResult = isStateful ? setupStatefulComponent ( instance , isSSR ) : void 0 ;
isInSSRComponentSetup = false ;
return setupResult ;
2023-07-24 11:13:08 +08:00
}
function setupStatefulComponent ( instance , isSSR ) {
2023-09-06 09:51:55 +08:00
var _a ;
const Component = instance . type ;
{
if ( Component . name ) {
validateComponentName ( Component . name , instance . appContext . config ) ;
}
if ( Component . components ) {
const names = Object . keys ( Component . components ) ;
for ( let i = 0 ; i < names . length ; i ++ ) {
validateComponentName ( names [ i ] , instance . appContext . config ) ;
}
}
if ( Component . directives ) {
const names = Object . keys ( Component . directives ) ;
for ( let i = 0 ; i < names . length ; i ++ ) {
validateDirectiveName ( names [ i ] ) ;
}
}
if ( Component . compilerOptions && isRuntimeOnly ( ) ) {
warn (
` "compilerOptions" is only supported when using a build of Vue that includes the runtime compiler. Since you are using a runtime-only build, the options should be passed via your build tool config instead. `
) ;
}
}
instance . accessCache = /* @__PURE__ */ Object . create ( null ) ;
instance . proxy = markRaw ( new Proxy ( instance . ctx , PublicInstanceProxyHandlers ) ) ;
{
exposePropsOnRenderContext ( instance ) ;
}
const { setup } = Component ;
if ( setup ) {
const setupContext = instance . setupContext = setup . length > 1 ? createSetupContext ( instance ) : null ;
setCurrentInstance ( instance ) ;
pauseTracking ( ) ;
const setupResult = callWithErrorHandling (
setup ,
instance ,
0 ,
[ shallowReadonly ( instance . props ) , setupContext ]
) ;
resetTracking ( ) ;
unsetCurrentInstance ( ) ;
if ( isPromise ( setupResult ) ) {
setupResult . then ( unsetCurrentInstance , unsetCurrentInstance ) ;
if ( isSSR ) {
return setupResult . then ( ( resolvedResult ) => {
handleSetupResult ( instance , resolvedResult , isSSR ) ;
} ) . catch ( ( e ) => {
handleError ( e , instance , 0 ) ;
} ) ;
} else {
instance . asyncDep = setupResult ;
if ( ! instance . suspense ) {
const name = ( _a = Component . name ) != null ? _a : "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 ( instance , setupResult , isSSR ) ;
}
} else {
2023-07-24 11:13:08 +08:00
finishComponentSetup ( instance , isSSR ) ;
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function handleSetupResult ( instance , setupResult , isSSR ) {
if ( isFunction ( setupResult ) ) {
2023-07-24 11:13:08 +08:00
{
2023-09-06 09:51:55 +08:00
instance . render = setupResult ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} else if ( isObject ( setupResult ) ) {
if ( isVNode ( setupResult ) ) {
warn (
` setup() should not return VNodes directly - return a render function instead. `
) ;
2023-07-24 11:13:08 +08:00
}
{
2023-09-06 09:51:55 +08:00
instance . devtoolsRawSetupState = setupResult ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
instance . setupState = proxyRefs ( setupResult ) ;
2023-07-24 11:13:08 +08:00
{
2023-09-06 09:51:55 +08:00
exposeSetupStateOnRenderContext ( instance ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} else if ( setupResult !== void 0 ) {
warn (
` setup() should return an object. Received: ${ setupResult === null ? "null" : typeof setupResult } `
) ;
}
finishComponentSetup ( instance , isSSR ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
let compile$1 ;
let installWithProxy ;
function registerRuntimeCompiler ( _compile ) {
compile$1 = _compile ;
installWithProxy = ( i ) => {
if ( i . render . _rc ) {
i . withProxy = new Proxy ( i . ctx , RuntimeCompiledPublicInstanceProxyHandlers ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const isRuntimeOnly = ( ) => ! compile$1 ;
function finishComponentSetup ( instance , isSSR , skipOptions ) {
const Component = instance . type ;
if ( ! instance . render ) {
if ( ! isSSR && compile$1 && ! Component . render ) {
const template = Component . template || resolveMergedOptions ( instance ) . template ;
if ( template ) {
{
startMeasure ( instance , ` compile ` ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const { isCustomElement , compilerOptions } = instance . appContext . config ;
const { delimiters , compilerOptions : componentCompilerOptions } = Component ;
const finalCompilerOptions = extend (
extend (
{
isCustomElement ,
delimiters
} ,
compilerOptions
) ,
componentCompilerOptions
) ;
Component . render = compile$1 ( template , finalCompilerOptions ) ;
{
endMeasure ( instance , ` compile ` ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
instance . render = Component . render || NOOP ;
if ( installWithProxy ) {
installWithProxy ( instance ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
{
setCurrentInstance ( instance ) ;
pauseTracking ( ) ;
applyOptions ( instance ) ;
resetTracking ( ) ;
2023-07-24 11:13:08 +08:00
unsetCurrentInstance ( ) ;
2023-09-06 09:51:55 +08:00
}
if ( ! Component . render && instance . render === NOOP && ! isSSR ) {
if ( ! compile$1 && Component . template ) {
warn (
` Component provided template option but runtime compilation is not supported in this build of Vue. ` + ( ` Use "vue.esm-browser.js" instead. ` )
/* should not happen */
) ;
} else {
warn ( ` Component is missing template or render function. ` ) ;
}
}
}
function getAttrsProxy ( instance ) {
return instance . attrsProxy || ( instance . attrsProxy = new Proxy (
instance . attrs ,
{
get ( target , key ) {
markAttrsAccessed ( ) ;
track ( instance , "get" , "$attrs" ) ;
return target [ key ] ;
} ,
set ( ) {
warn ( ` setupContext.attrs is readonly. ` ) ;
return false ;
} ,
deleteProperty ( ) {
warn ( ` setupContext.attrs is readonly. ` ) ;
return false ;
}
}
) ) ;
}
function getSlotsProxy ( instance ) {
return instance . slotsProxy || ( instance . slotsProxy = new Proxy ( instance . slots , {
get ( target , key ) {
track ( instance , "get" , "$slots" ) ;
return target [ key ] ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} ) ) ;
}
function createSetupContext ( instance ) {
const expose = ( exposed ) => {
{
if ( instance . exposed ) {
warn ( ` expose() should be called only once per setup(). ` ) ;
}
if ( exposed != null ) {
let exposedType = typeof exposed ;
if ( exposedType === "object" ) {
if ( isArray ( exposed ) ) {
exposedType = "array" ;
} else if ( isRef ( exposed ) ) {
exposedType = "ref" ;
}
}
if ( exposedType !== "object" ) {
warn (
` expose() should be passed a plain object, received ${ exposedType } . `
) ;
}
}
}
instance . exposed = exposed || { } ;
} ;
{
return Object . freeze ( {
get attrs ( ) {
return getAttrsProxy ( instance ) ;
} ,
get slots ( ) {
return getSlotsProxy ( instance ) ;
} ,
get emit ( ) {
return ( event , ... args ) => instance . emit ( event , ... args ) ;
} ,
expose
} ) ;
}
}
function getExposeProxy ( instance ) {
if ( instance . exposed ) {
return instance . exposeProxy || ( instance . exposeProxy = new Proxy ( proxyRefs ( markRaw ( instance . exposed ) ) , {
get ( target , key ) {
if ( key in target ) {
return target [ key ] ;
} else if ( key in publicPropertiesMap ) {
return publicPropertiesMap [ key ] ( instance ) ;
}
} ,
has ( target , key ) {
return key in target || key in publicPropertiesMap ;
}
} ) ) ;
}
}
const classifyRE = /(?:^|[-_])(\w)/g ;
const classify = ( str ) => str . replace ( classifyRE , ( c ) => c . toUpperCase ( ) ) . replace ( /[-_]/g , "" ) ;
function getComponentName ( Component , includeInferred = true ) {
return isFunction ( Component ) ? Component . displayName || Component . name : Component . name || includeInferred && Component . _ _name ;
}
function formatComponentName ( instance , Component , isRoot = false ) {
let name = getComponentName ( Component ) ;
if ( ! name && Component . _ _file ) {
const match = Component . _ _file . match ( /([^/\\]+)\.\w+$/ ) ;
if ( match ) {
name = match [ 1 ] ;
}
}
if ( ! name && instance && instance . parent ) {
const inferFromRegistry = ( registry ) => {
for ( const key in registry ) {
if ( registry [ key ] === Component ) {
return key ;
}
}
} ;
name = inferFromRegistry (
instance . components || instance . parent . type . components
) || inferFromRegistry ( instance . appContext . components ) ;
}
return name ? classify ( name ) : isRoot ? ` App ` : ` Anonymous ` ;
}
function isClassComponent ( value ) {
return isFunction ( value ) && "__vccOpts" in value ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const computed = ( getterOrOptions , debugOptions ) => {
return computed$1 ( getterOrOptions , debugOptions , isInSSRComponentSetup ) ;
} ;
2023-07-24 11:13:08 +08:00
function h ( type , propsOrChildren , children ) {
2023-09-06 09:51:55 +08:00
const l = arguments . length ;
if ( l === 2 ) {
if ( isObject ( propsOrChildren ) && ! isArray ( propsOrChildren ) ) {
if ( isVNode ( propsOrChildren ) ) {
return createVNode ( type , null , [ propsOrChildren ] ) ;
}
return createVNode ( type , propsOrChildren ) ;
} else {
return createVNode ( type , null , propsOrChildren ) ;
}
} else {
if ( l > 3 ) {
children = Array . prototype . slice . call ( arguments , 2 ) ;
} else if ( l === 3 && isVNode ( children ) ) {
children = [ children ] ;
}
return createVNode ( type , propsOrChildren , children ) ;
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const ssrContextKey = Symbol . for ( "v-scx" ) ;
2023-07-24 11:13:08 +08:00
const useSSRContext = ( ) => {
2023-09-06 09:51:55 +08:00
{
const ctx = inject ( ssrContextKey ) ;
if ( ! ctx ) {
warn (
` Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build. `
) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return ctx ;
}
2023-07-24 11:13:08 +08:00
} ;
function initCustomFormatter ( ) {
2023-09-06 09:51:55 +08:00
if ( typeof window === "undefined" ) {
return ;
}
const vueStyle = { style : "color:#3ba776" } ;
const numberStyle = { style : "color:#0b1bc9" } ;
const stringStyle = { style : "color:#b62e24" } ;
const keywordStyle = { style : "color:#9d288c" } ;
const formatter = {
header ( obj ) {
if ( ! isObject ( obj ) ) {
return null ;
}
if ( obj . _ _isVue ) {
return [ "div" , vueStyle , ` VueInstance ` ] ;
} else if ( isRef ( obj ) ) {
return [
"div" ,
{ } ,
[ "span" , vueStyle , genRefFlag ( obj ) ] ,
"<" ,
formatValue ( obj . value ) ,
` > `
] ;
} else if ( isReactive ( obj ) ) {
return [
"div" ,
{ } ,
[ "span" , vueStyle , isShallow ( obj ) ? "ShallowReactive" : "Reactive" ] ,
"<" ,
formatValue ( obj ) ,
` > ${ isReadonly ( obj ) ? ` (readonly) ` : ` ` } `
] ;
} else if ( isReadonly ( obj ) ) {
return [
"div" ,
{ } ,
[ "span" , vueStyle , isShallow ( obj ) ? "ShallowReadonly" : "Readonly" ] ,
"<" ,
formatValue ( obj ) ,
">"
] ;
}
return null ;
} ,
hasBody ( obj ) {
return obj && obj . _ _isVue ;
} ,
body ( obj ) {
if ( obj && obj . _ _isVue ) {
2023-07-24 11:13:08 +08:00
return [
2023-09-06 09:51:55 +08:00
"div" ,
{ } ,
... formatInstance ( obj . $ )
2023-07-24 11:13:08 +08:00
] ;
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} ;
function formatInstance ( instance ) {
const blocks = [ ] ;
if ( instance . type . props && instance . props ) {
blocks . push ( createInstanceBlock ( "props" , toRaw ( instance . props ) ) ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( instance . setupState !== EMPTY _OBJ ) {
blocks . push ( createInstanceBlock ( "setup" , instance . setupState ) ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( instance . data !== EMPTY _OBJ ) {
blocks . push ( createInstanceBlock ( "data" , toRaw ( instance . data ) ) ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const computed = extractKeys ( instance , "computed" ) ;
if ( computed ) {
blocks . push ( createInstanceBlock ( "computed" , computed ) ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const injected = extractKeys ( instance , "inject" ) ;
if ( injected ) {
blocks . push ( createInstanceBlock ( "injected" , injected ) ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
blocks . push ( [
"div" ,
{ } ,
[
"span" ,
{
style : keywordStyle . style + ";opacity:0.66"
} ,
"$ (internal): "
] ,
[ "object" , { object : instance } ]
] ) ;
return blocks ;
}
function createInstanceBlock ( type , target ) {
target = extend ( { } , target ) ;
if ( ! Object . keys ( target ) . length ) {
return [ "span" , { } ] ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return [
"div" ,
{ style : "line-height:1.25em;margin-bottom:0.6em" } ,
[
"div" ,
{
style : "color:#476582"
} ,
type
] ,
[
"div" ,
{
style : "padding-left:1.25em"
} ,
... Object . keys ( target ) . map ( ( key ) => {
return [
"div" ,
{ } ,
[ "span" , keywordStyle , key + ": " ] ,
formatValue ( target [ key ] , false )
] ;
} )
]
] ;
}
function formatValue ( v , asRaw = true ) {
if ( typeof v === "number" ) {
return [ "span" , numberStyle , v ] ;
} else if ( typeof v === "string" ) {
return [ "span" , stringStyle , JSON . stringify ( v ) ] ;
} else if ( typeof v === "boolean" ) {
return [ "span" , keywordStyle , v ] ;
} else if ( isObject ( v ) ) {
return [ "object" , { object : asRaw ? toRaw ( v ) : v } ] ;
} else {
return [ "span" , stringStyle , String ( v ) ] ;
}
}
function extractKeys ( instance , type ) {
const Comp = instance . type ;
if ( isFunction ( Comp ) ) {
return ;
}
const extracted = { } ;
for ( const key in instance . ctx ) {
if ( isKeyOfType ( Comp , key , type ) ) {
extracted [ key ] = instance . ctx [ key ] ;
}
}
return extracted ;
}
function isKeyOfType ( Comp , key , type ) {
const opts = Comp [ type ] ;
if ( isArray ( opts ) && opts . includes ( key ) || isObject ( opts ) && key in opts ) {
return true ;
}
if ( Comp . extends && isKeyOfType ( Comp . extends , key , type ) ) {
return true ;
}
if ( Comp . mixins && Comp . mixins . some ( ( m ) => isKeyOfType ( m , key , type ) ) ) {
return true ;
}
}
function genRefFlag ( v ) {
if ( isShallow ( v ) ) {
return ` ShallowRef ` ;
}
if ( v . effect ) {
return ` ComputedRef ` ;
}
return ` Ref ` ;
}
if ( window . devtoolsFormatters ) {
window . devtoolsFormatters . push ( formatter ) ;
} else {
window . devtoolsFormatters = [ formatter ] ;
}
2023-07-24 11:13:08 +08:00
}
function withMemo ( memo , render , cache , index ) {
2023-09-06 09:51:55 +08:00
const cached = cache [ index ] ;
if ( cached && isMemoSame ( cached , memo ) ) {
return cached ;
}
const ret = render ( ) ;
ret . memo = memo . slice ( ) ;
return cache [ index ] = ret ;
2023-07-24 11:13:08 +08:00
}
function isMemoSame ( cached , memo ) {
2023-09-06 09:51:55 +08:00
const prev = cached . memo ;
if ( prev . length != memo . length ) {
return false ;
}
for ( let i = 0 ; i < prev . length ; i ++ ) {
if ( hasChanged ( prev [ i ] , memo [ i ] ) ) {
return false ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
if ( isBlockTreeEnabled > 0 && currentBlock ) {
currentBlock . push ( cached ) ;
}
return true ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const version = "3.3.4" ;
const ssrUtils = null ;
2023-07-24 11:13:08 +08:00
const resolveFilter = null ;
2023-09-06 09:51:55 +08:00
const compatUtils = null ;
2023-07-24 11:13:08 +08:00
2023-09-06 09:51:55 +08:00
const svgNS = "http://www.w3.org/2000/svg" ;
const doc = typeof document !== "undefined" ? document : null ;
const templateContainer = doc && /* @__PURE__ */ doc . createElement ( "template" ) ;
2023-07-24 11:13:08 +08:00
const nodeOps = {
2023-09-06 09:51:55 +08:00
insert : ( child , parent , anchor ) => {
parent . insertBefore ( child , anchor || null ) ;
} ,
remove : ( child ) => {
const parent = child . parentNode ;
if ( parent ) {
parent . removeChild ( child ) ;
}
} ,
createElement : ( tag , isSVG , is , props ) => {
const el = isSVG ? doc . createElementNS ( svgNS , tag ) : doc . createElement ( tag , is ? { is } : void 0 ) ;
if ( tag === "select" && props && props . multiple != null ) {
el . setAttribute ( "multiple" , props . multiple ) ;
}
return el ;
} ,
createText : ( text ) => doc . createTextNode ( text ) ,
createComment : ( text ) => doc . createComment ( text ) ,
setText : ( node , text ) => {
node . nodeValue = text ;
} ,
setElementText : ( el , text ) => {
el . textContent = text ;
} ,
parentNode : ( node ) => node . parentNode ,
nextSibling : ( node ) => node . nextSibling ,
querySelector : ( selector ) => doc . querySelector ( selector ) ,
setScopeId ( el , id ) {
el . setAttribute ( id , "" ) ;
} ,
// __UNSAFE__
// Reason: innerHTML.
// Static content here can only come from compiled templates.
// As long as the user only uses trusted templates, this is safe.
insertStaticContent ( content , parent , anchor , isSVG , start , end ) {
const before = anchor ? anchor . previousSibling : parent . lastChild ;
if ( start && ( start === end || start . nextSibling ) ) {
while ( true ) {
parent . insertBefore ( start . cloneNode ( true ) , anchor ) ;
if ( start === end || ! ( start = start . nextSibling ) )
break ;
}
} else {
templateContainer . innerHTML = isSVG ? ` <svg> ${ content } </svg> ` : content ;
const template = templateContainer . content ;
if ( isSVG ) {
const wrapper = template . firstChild ;
while ( wrapper . firstChild ) {
template . appendChild ( wrapper . firstChild ) ;
}
template . removeChild ( wrapper ) ;
}
parent . insertBefore ( template , anchor ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return [
// first
before ? before . nextSibling : parent . firstChild ,
// last
anchor ? anchor . previousSibling : parent . lastChild
] ;
}
2023-07-24 11:13:08 +08:00
} ;
function patchClass ( el , value , isSVG ) {
2023-09-06 09:51:55 +08:00
const transitionClasses = el . _vtc ;
if ( transitionClasses ) {
value = ( value ? [ value , ... transitionClasses ] : [ ... transitionClasses ] ) . join ( " " ) ;
}
if ( value == null ) {
el . removeAttribute ( "class" ) ;
} else if ( isSVG ) {
el . setAttribute ( "class" , value ) ;
} else {
el . className = value ;
}
2023-07-24 11:13:08 +08:00
}
function patchStyle ( el , prev , next ) {
2023-09-06 09:51:55 +08:00
const style = el . style ;
const isCssString = isString ( next ) ;
if ( next && ! isCssString ) {
if ( prev && ! isString ( prev ) ) {
for ( const key in prev ) {
if ( next [ key ] == null ) {
setStyle ( style , key , "" ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
for ( const key in next ) {
setStyle ( style , key , next [ key ] ) ;
}
} else {
const currentDisplay = style . display ;
if ( isCssString ) {
if ( prev !== next ) {
style . cssText = next ;
}
} else if ( prev ) {
el . removeAttribute ( "style" ) ;
}
if ( "_vod" in el ) {
style . display = currentDisplay ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
const semicolonRE = /[^\\];\s*$/ ;
const importantRE = /\s*!important$/ ;
function setStyle ( style , name , val ) {
2023-09-06 09:51:55 +08:00
if ( isArray ( val ) ) {
val . forEach ( ( v ) => setStyle ( style , name , v ) ) ;
} else {
if ( val == null )
val = "" ;
{
if ( semicolonRE . test ( val ) ) {
warn (
` Unexpected semicolon at the end of ' ${ name } ' style value: ' ${ val } ' `
) ;
}
}
if ( name . startsWith ( "--" ) ) {
style . setProperty ( name , val ) ;
} else {
const prefixed = autoPrefix ( style , name ) ;
if ( importantRE . test ( val ) ) {
style . setProperty (
hyphenate ( prefixed ) ,
val . replace ( importantRE , "" ) ,
"important"
) ;
} else {
style [ prefixed ] = val ;
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const prefixes = [ "Webkit" , "Moz" , "ms" ] ;
2023-07-24 11:13:08 +08:00
const prefixCache = { } ;
function autoPrefix ( style , rawName ) {
2023-09-06 09:51:55 +08:00
const cached = prefixCache [ rawName ] ;
if ( cached ) {
return cached ;
}
let name = camelize ( rawName ) ;
if ( name !== "filter" && name in style ) {
return prefixCache [ rawName ] = name ;
}
name = capitalize ( name ) ;
for ( let i = 0 ; i < prefixes . length ; i ++ ) {
const prefixed = prefixes [ i ] + name ;
if ( prefixed in style ) {
return prefixCache [ rawName ] = prefixed ;
}
}
return rawName ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const xlinkNS = "http://www.w3.org/1999/xlink" ;
2023-07-24 11:13:08 +08:00
function patchAttr ( el , key , value , isSVG , instance ) {
2023-09-06 09:51:55 +08:00
if ( isSVG && key . startsWith ( "xlink:" ) ) {
if ( value == null ) {
el . removeAttributeNS ( xlinkNS , key . slice ( 6 , key . length ) ) ;
} else {
el . setAttributeNS ( xlinkNS , key , value ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} else {
const isBoolean = isSpecialBooleanAttr ( key ) ;
if ( value == null || isBoolean && ! includeBooleanAttr ( value ) ) {
el . removeAttribute ( key ) ;
} else {
el . setAttribute ( key , isBoolean ? "" : value ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function patchDOMProp ( el , key , value , prevChildren , parentComponent , parentSuspense , unmountChildren ) {
if ( key === "innerHTML" || key === "textContent" ) {
if ( prevChildren ) {
unmountChildren ( prevChildren , parentComponent , parentSuspense ) ;
}
el [ key ] = value == null ? "" : value ;
return ;
}
const tag = el . tagName ;
if ( key === "value" && tag !== "PROGRESS" && // custom elements may use _value internally
! tag . includes ( "-" ) ) {
el . _value = value ;
const oldValue = tag === "OPTION" ? el . getAttribute ( "value" ) : el . value ;
const newValue = value == null ? "" : value ;
if ( oldValue !== newValue ) {
el . value = newValue ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( value == null ) {
el . removeAttribute ( key ) ;
}
return ;
}
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 ( ! needRemove ) {
warn (
` Failed setting prop " ${ key } " on < ${ tag . toLowerCase ( ) } >: value ${ value } is invalid. ` ,
e
) ;
}
}
needRemove && el . removeAttribute ( key ) ;
2023-07-24 11:13:08 +08:00
}
function addEventListener ( el , event , handler , options ) {
2023-09-06 09:51:55 +08:00
el . addEventListener ( event , handler , options ) ;
2023-07-24 11:13:08 +08:00
}
function removeEventListener ( el , event , handler , options ) {
2023-09-06 09:51:55 +08:00
el . removeEventListener ( event , handler , options ) ;
2023-07-24 11:13:08 +08:00
}
function patchEvent ( el , rawName , prevValue , nextValue , instance = null ) {
2023-09-06 09:51:55 +08:00
const invokers = el . _vei || ( el . _vei = { } ) ;
const existingInvoker = invokers [ rawName ] ;
if ( nextValue && existingInvoker ) {
existingInvoker . value = nextValue ;
} else {
const [ name , options ] = parseName ( rawName ) ;
if ( nextValue ) {
const invoker = invokers [ rawName ] = createInvoker ( nextValue , instance ) ;
addEventListener ( el , name , invoker , options ) ;
} else if ( existingInvoker ) {
removeEventListener ( el , name , existingInvoker , options ) ;
invokers [ rawName ] = void 0 ;
}
}
2023-07-24 11:13:08 +08:00
}
const optionsModifierRE = /(?:Once|Passive|Capture)$/ ;
function parseName ( name ) {
2023-09-06 09:51:55 +08:00
let options ;
if ( optionsModifierRE . test ( name ) ) {
options = { } ;
let m ;
while ( m = name . match ( optionsModifierRE ) ) {
name = name . slice ( 0 , name . length - m [ 0 ] . length ) ;
options [ m [ 0 ] . toLowerCase ( ) ] = true ;
}
}
const event = name [ 2 ] === ":" ? name . slice ( 3 ) : hyphenate ( name . slice ( 2 ) ) ;
return [ event , options ] ;
2023-07-24 11:13:08 +08:00
}
let cachedNow = 0 ;
2023-09-06 09:51:55 +08:00
const p = /* @__PURE__ */ Promise . resolve ( ) ;
const getNow = ( ) => cachedNow || ( p . then ( ( ) => cachedNow = 0 ) , cachedNow = Date . now ( ) ) ;
2023-07-24 11:13:08 +08:00
function createInvoker ( initialValue , instance ) {
2023-09-06 09:51:55 +08:00
const invoker = ( e ) => {
if ( ! e . _vts ) {
e . _vts = Date . now ( ) ;
} else if ( e . _vts <= invoker . attached ) {
return ;
}
callWithAsyncErrorHandling (
patchStopImmediatePropagation ( e , invoker . value ) ,
instance ,
5 ,
[ e ]
) ;
} ;
invoker . value = initialValue ;
invoker . attached = getNow ( ) ;
return invoker ;
2023-07-24 11:13:08 +08:00
}
function patchStopImmediatePropagation ( e , value ) {
2023-09-06 09:51:55 +08:00
if ( isArray ( value ) ) {
const originalStop = e . stopImmediatePropagation ;
e . stopImmediatePropagation = ( ) => {
originalStop . call ( e ) ;
e . _stopped = true ;
} ;
return value . map ( ( fn ) => ( e2 ) => ! e2 . _stopped && fn && fn ( e2 ) ) ;
} else {
return value ;
}
2023-07-24 11:13:08 +08:00
}
const nativeOnRE = /^on[a-z]/ ;
const patchProp = ( el , key , prevValue , nextValue , isSVG = false , prevChildren , parentComponent , parentSuspense , unmountChildren ) => {
2023-09-06 09:51:55 +08:00
if ( key === "class" ) {
patchClass ( el , nextValue , isSVG ) ;
} else if ( key === "style" ) {
patchStyle ( el , prevValue , nextValue ) ;
} else if ( isOn ( key ) ) {
if ( ! isModelListener ( key ) ) {
patchEvent ( el , key , prevValue , nextValue , parentComponent ) ;
}
} else if ( key [ 0 ] === "." ? ( key = key . slice ( 1 ) , true ) : key [ 0 ] === "^" ? ( key = key . slice ( 1 ) , false ) : shouldSetAsProp ( el , key , nextValue , isSVG ) ) {
patchDOMProp (
el ,
key ,
nextValue ,
prevChildren ,
parentComponent ,
parentSuspense ,
unmountChildren
) ;
} else {
if ( key === "true-value" ) {
el . _trueValue = nextValue ;
} else if ( key === "false-value" ) {
el . _falseValue = nextValue ;
}
patchAttr ( el , key , nextValue , isSVG ) ;
}
2023-07-24 11:13:08 +08:00
} ;
function shouldSetAsProp ( el , key , value , isSVG ) {
2023-09-06 09:51:55 +08:00
if ( isSVG ) {
if ( key === "innerHTML" || key === "textContent" ) {
return true ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
if ( key in el && nativeOnRE . test ( key ) && isFunction ( value ) ) {
return true ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return false ;
}
if ( key === "spellcheck" || key === "draggable" || key === "translate" ) {
return false ;
}
if ( key === "form" ) {
return false ;
}
if ( key === "list" && el . tagName === "INPUT" ) {
return false ;
}
if ( key === "type" && el . tagName === "TEXTAREA" ) {
return false ;
}
if ( nativeOnRE . test ( key ) && isString ( value ) ) {
return false ;
}
return key in el ;
}
function defineCustomElement ( options , hydrate2 ) {
const Comp = defineComponent ( options ) ;
class VueCustomElement extends VueElement {
constructor ( initialProps ) {
super ( Comp , initialProps , hydrate2 ) ;
}
}
VueCustomElement . def = Comp ;
return VueCustomElement ;
}
const defineSSRCustomElement = ( options ) => {
return defineCustomElement ( options , hydrate ) ;
} ;
const BaseClass = typeof HTMLElement !== "undefined" ? HTMLElement : class {
} ;
class VueElement extends BaseClass {
constructor ( _def , _props = { } , hydrate2 ) {
super ( ) ;
this . _def = _def ;
this . _props = _props ;
2023-07-24 11:13:08 +08:00
/ * *
* @ internal
* /
2023-09-06 09:51:55 +08:00
this . _instance = null ;
this . _connected = false ;
this . _resolved = false ;
this . _numberProps = null ;
if ( this . shadowRoot && hydrate2 ) {
hydrate2 ( this . _createVNode ( ) , this . shadowRoot ) ;
} else {
if ( this . shadowRoot ) {
warn (
` Custom element has pre-rendered declarative shadow root but is not defined as hydratable. Use \` defineSSRCustomElement \` . `
) ;
}
this . attachShadow ( { mode : "open" } ) ;
if ( ! this . _def . _ _asyncLoader ) {
this . _resolveProps ( this . _def ) ;
}
}
}
connectedCallback ( ) {
this . _connected = true ;
if ( ! this . _instance ) {
if ( this . _resolved ) {
this . _update ( ) ;
} else {
this . _resolveDef ( ) ;
}
}
}
disconnectedCallback ( ) {
this . _connected = false ;
nextTick ( ( ) => {
if ( ! this . _connected ) {
render ( null , this . shadowRoot ) ;
this . _instance = null ;
}
} ) ;
}
/ * *
* resolve inner component definition ( handle possible async component )
* /
_resolveDef ( ) {
this . _resolved = true ;
for ( let i = 0 ; i < this . attributes . length ; i ++ ) {
this . _setAttr ( this . attributes [ i ] . name ) ;
}
new MutationObserver ( ( mutations ) => {
for ( const m of mutations ) {
this . _setAttr ( m . attributeName ) ;
}
} ) . observe ( this , { attributes : true } ) ;
const resolve = ( def , isAsync = false ) => {
const { props , styles } = def ;
let numberProps ;
if ( props && ! isArray ( props ) ) {
for ( const key in props ) {
const opt = props [ key ] ;
if ( opt === Number || opt && opt . type === Number ) {
if ( key in this . _props ) {
this . _props [ key ] = toNumber ( this . _props [ key ] ) ;
}
( numberProps || ( numberProps = /* @__PURE__ */ Object . create ( null ) ) ) [ camelize ( key ) ] = true ;
}
}
}
this . _numberProps = numberProps ;
if ( isAsync ) {
this . _resolveProps ( def ) ;
}
this . _applyStyles ( styles ) ;
this . _update ( ) ;
} ;
const asyncDef = this . _def . _ _asyncLoader ;
if ( asyncDef ) {
asyncDef ( ) . then ( ( def ) => resolve ( def , true ) ) ;
} else {
resolve ( this . _def ) ;
}
}
_resolveProps ( def ) {
const { props } = def ;
const declaredPropKeys = isArray ( props ) ? props : Object . keys ( props || { } ) ;
for ( const key of Object . keys ( this ) ) {
if ( key [ 0 ] !== "_" && declaredPropKeys . includes ( key ) ) {
this . _setProp ( key , this [ key ] , true , false ) ;
}
}
for ( const key of declaredPropKeys . map ( camelize ) ) {
Object . defineProperty ( this , key , {
get ( ) {
return this . _getProp ( key ) ;
} ,
set ( val ) {
this . _setProp ( key , val ) ;
}
} ) ;
}
}
_setAttr ( key ) {
let value = this . getAttribute ( key ) ;
const camelKey = camelize ( key ) ;
if ( this . _numberProps && this . _numberProps [ camelKey ] ) {
value = toNumber ( value ) ;
}
this . _setProp ( camelKey , value , false ) ;
}
/ * *
* @ internal
* /
_getProp ( key ) {
return this . _props [ key ] ;
}
/ * *
* @ internal
* /
_setProp ( key , val , shouldReflect = true , shouldUpdate = true ) {
if ( val !== this . _props [ key ] ) {
this . _props [ key ] = val ;
if ( shouldUpdate && this . _instance ) {
this . _update ( ) ;
}
if ( shouldReflect ) {
if ( val === true ) {
this . setAttribute ( hyphenate ( key ) , "" ) ;
} else if ( typeof val === "string" || typeof val === "number" ) {
this . setAttribute ( hyphenate ( key ) , val + "" ) ;
} else if ( ! val ) {
this . removeAttribute ( hyphenate ( key ) ) ;
}
}
}
}
_update ( ) {
render ( this . _createVNode ( ) , this . shadowRoot ) ;
}
_createVNode ( ) {
const vnode = createVNode ( this . _def , extend ( { } , this . _props ) ) ;
if ( ! this . _instance ) {
vnode . ce = ( instance ) => {
this . _instance = instance ;
instance . isCE = true ;
{
instance . ceReload = ( newStyles ) => {
if ( this . _styles ) {
this . _styles . forEach ( ( s ) => this . shadowRoot . removeChild ( s ) ) ;
this . _styles . length = 0 ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
this . _applyStyles ( newStyles ) ;
this . _instance = null ;
this . _update ( ) ;
} ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const dispatch = ( event , args ) => {
this . dispatchEvent (
new CustomEvent ( event , {
detail : args
} )
) ;
} ;
instance . emit = ( event , ... args ) => {
dispatch ( event , args ) ;
if ( hyphenate ( event ) !== event ) {
dispatch ( hyphenate ( event ) , args ) ;
}
} ;
let parent = this ;
while ( parent = parent && ( parent . parentNode || parent . host ) ) {
if ( parent instanceof VueElement ) {
instance . parent = parent . _instance ;
instance . provides = parent . _instance . provides ;
break ;
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return vnode ;
}
_applyStyles ( styles ) {
if ( styles ) {
styles . forEach ( ( css ) => {
const s = document . createElement ( "style" ) ;
s . textContent = css ;
this . shadowRoot . appendChild ( s ) ;
{
( this . _styles || ( this . _styles = [ ] ) ) . push ( s ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
function useCssModule ( name = "$style" ) {
{
2023-07-24 11:13:08 +08:00
const instance = getCurrentInstance ( ) ;
if ( ! instance ) {
2023-09-06 09:51:55 +08:00
warn ( ` useCssModule must be called inside setup() ` ) ;
return EMPTY _OBJ ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const modules = instance . type . _ _cssModules ;
if ( ! modules ) {
warn ( ` Current instance does not have CSS modules injected. ` ) ;
return EMPTY _OBJ ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const mod = modules [ name ] ;
if ( ! mod ) {
warn ( ` Current instance does not have CSS module named " ${ name } ". ` ) ;
return EMPTY _OBJ ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return mod ;
}
}
function useCssVars ( getter ) {
const instance = getCurrentInstance ( ) ;
if ( ! instance ) {
warn ( ` useCssVars is called without current active component instance. ` ) ;
return ;
}
const updateTeleports = instance . ut = ( vars = getter ( instance . proxy ) ) => {
Array . from (
document . querySelectorAll ( ` [data-v-owner=" ${ instance . uid } "] ` )
) . forEach ( ( node ) => setVarsOnNode ( node , vars ) ) ;
} ;
const setVars = ( ) => {
const vars = getter ( instance . proxy ) ;
setVarsOnVNode ( instance . subTree , vars ) ;
updateTeleports ( vars ) ;
} ;
watchPostEffect ( setVars ) ;
onMounted ( ( ) => {
const ob = new MutationObserver ( setVars ) ;
ob . observe ( instance . subTree . el . parentNode , { childList : true } ) ;
onUnmounted ( ( ) => ob . disconnect ( ) ) ;
} ) ;
}
function setVarsOnVNode ( vnode , vars ) {
if ( vnode . shapeFlag & 128 ) {
const suspense = vnode . suspense ;
vnode = suspense . activeBranch ;
if ( suspense . pendingBranch && ! suspense . isHydrating ) {
suspense . effects . push ( ( ) => {
setVarsOnVNode ( suspense . activeBranch , vars ) ;
} ) ;
}
}
while ( vnode . component ) {
vnode = vnode . component . subTree ;
}
if ( vnode . shapeFlag & 1 && vnode . el ) {
setVarsOnNode ( vnode . el , vars ) ;
} else if ( vnode . type === Fragment ) {
vnode . children . forEach ( ( c ) => setVarsOnVNode ( c , vars ) ) ;
} else if ( vnode . type === Static ) {
let { el , anchor } = vnode ;
while ( el ) {
setVarsOnNode ( el , vars ) ;
if ( el === anchor )
break ;
el = el . nextSibling ;
}
}
2023-07-24 11:13:08 +08:00
}
function setVarsOnNode ( el , vars ) {
2023-09-06 09:51:55 +08:00
if ( el . nodeType === 1 ) {
const style = el . style ;
for ( const key in vars ) {
style . setProperty ( ` -- ${ key } ` , vars [ key ] ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const TRANSITION = "transition" ;
const ANIMATION = "animation" ;
2023-07-24 11:13:08 +08:00
const Transition = ( props , { slots } ) => h ( BaseTransition , resolveTransitionProps ( props ) , slots ) ;
2023-09-06 09:51:55 +08:00
Transition . displayName = "Transition" ;
2023-07-24 11:13:08 +08:00
const DOMTransitionPropsValidators = {
2023-09-06 09:51:55 +08:00
name : String ,
type : String ,
css : {
type : Boolean ,
default : true
} ,
duration : [ String , Number , Object ] ,
enterFromClass : String ,
enterActiveClass : String ,
enterToClass : String ,
appearFromClass : String ,
appearActiveClass : String ,
appearToClass : String ,
leaveFromClass : String ,
leaveActiveClass : String ,
leaveToClass : String
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
const TransitionPropsValidators = Transition . props = /* @__PURE__ */ extend (
{ } ,
BaseTransitionPropsValidators ,
DOMTransitionPropsValidators
) ;
const callHook = ( hook , args = [ ] ) => {
if ( isArray ( hook ) ) {
hook . forEach ( ( h2 ) => h2 ( ... args ) ) ;
} else if ( hook ) {
hook ( ... args ) ;
}
2023-07-24 11:13:08 +08:00
} ;
const hasExplicitCallback = ( hook ) => {
2023-09-06 09:51:55 +08:00
return hook ? isArray ( hook ) ? hook . some ( ( h2 ) => h2 . length > 1 ) : hook . length > 1 : false ;
2023-07-24 11:13:08 +08:00
} ;
function resolveTransitionProps ( rawProps ) {
2023-09-06 09:51:55 +08:00
const baseProps = { } ;
for ( const key in rawProps ) {
if ( ! ( key in DOMTransitionPropsValidators ) ) {
baseProps [ key ] = rawProps [ key ] ;
}
}
if ( rawProps . css === false ) {
return baseProps ;
}
const {
name = "v" ,
type ,
duration ,
enterFromClass = ` ${ name } -enter-from ` ,
enterActiveClass = ` ${ name } -enter-active ` ,
enterToClass = ` ${ name } -enter-to ` ,
appearFromClass = enterFromClass ,
appearActiveClass = enterActiveClass ,
appearToClass = enterToClass ,
leaveFromClass = ` ${ name } -leave-from ` ,
leaveActiveClass = ` ${ name } -leave-active ` ,
leaveToClass = ` ${ name } -leave-to `
} = rawProps ;
const durations = normalizeDuration ( duration ) ;
const enterDuration = durations && durations [ 0 ] ;
const leaveDuration = durations && durations [ 1 ] ;
const {
onBeforeEnter ,
onEnter ,
onEnterCancelled ,
onLeave ,
onLeaveCancelled ,
onBeforeAppear = onBeforeEnter ,
onAppear = onEnter ,
onAppearCancelled = onEnterCancelled
} = baseProps ;
const finishEnter = ( el , isAppear , done ) => {
removeTransitionClass ( el , isAppear ? appearToClass : enterToClass ) ;
removeTransitionClass ( el , isAppear ? appearActiveClass : enterActiveClass ) ;
done && done ( ) ;
} ;
const finishLeave = ( el , done ) => {
el . _isLeaving = false ;
removeTransitionClass ( el , leaveFromClass ) ;
removeTransitionClass ( el , leaveToClass ) ;
removeTransitionClass ( el , leaveActiveClass ) ;
done && done ( ) ;
} ;
const makeEnterHook = ( isAppear ) => {
return ( el , done ) => {
const hook = isAppear ? onAppear : onEnter ;
const resolve = ( ) => finishEnter ( el , isAppear , done ) ;
callHook ( hook , [ el , resolve ] ) ;
nextFrame ( ( ) => {
removeTransitionClass ( el , isAppear ? appearFromClass : enterFromClass ) ;
addTransitionClass ( el , isAppear ? appearToClass : enterToClass ) ;
if ( ! hasExplicitCallback ( hook ) ) {
whenTransitionEnds ( el , type , enterDuration , resolve ) ;
}
} ) ;
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
} ;
return extend ( baseProps , {
onBeforeEnter ( el ) {
callHook ( onBeforeEnter , [ el ] ) ;
addTransitionClass ( el , enterFromClass ) ;
addTransitionClass ( el , enterActiveClass ) ;
} ,
onBeforeAppear ( el ) {
callHook ( onBeforeAppear , [ el ] ) ;
addTransitionClass ( el , appearFromClass ) ;
addTransitionClass ( el , appearActiveClass ) ;
} ,
onEnter : makeEnterHook ( false ) ,
onAppear : makeEnterHook ( true ) ,
onLeave ( el , done ) {
el . _isLeaving = true ;
const resolve = ( ) => finishLeave ( el , done ) ;
addTransitionClass ( el , leaveFromClass ) ;
forceReflow ( ) ;
addTransitionClass ( el , leaveActiveClass ) ;
nextFrame ( ( ) => {
if ( ! el . _isLeaving ) {
return ;
}
2023-07-24 11:13:08 +08:00
removeTransitionClass ( el , leaveFromClass ) ;
2023-09-06 09:51:55 +08:00
addTransitionClass ( el , leaveToClass ) ;
if ( ! hasExplicitCallback ( onLeave ) ) {
whenTransitionEnds ( el , type , leaveDuration , resolve ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
} ) ;
callHook ( onLeave , [ el , resolve ] ) ;
} ,
onEnterCancelled ( el ) {
finishEnter ( el , false ) ;
callHook ( onEnterCancelled , [ el ] ) ;
} ,
onAppearCancelled ( el ) {
finishEnter ( el , true ) ;
callHook ( onAppearCancelled , [ el ] ) ;
} ,
onLeaveCancelled ( el ) {
finishLeave ( el ) ;
callHook ( onLeaveCancelled , [ el ] ) ;
}
} ) ;
2023-07-24 11:13:08 +08:00
}
function normalizeDuration ( duration ) {
2023-09-06 09:51:55 +08:00
if ( duration == null ) {
return null ;
} else if ( isObject ( duration ) ) {
return [ NumberOf ( duration . enter ) , NumberOf ( duration . leave ) ] ;
} else {
const n = NumberOf ( duration ) ;
return [ n , n ] ;
}
2023-07-24 11:13:08 +08:00
}
function NumberOf ( val ) {
2023-09-06 09:51:55 +08:00
const res = toNumber ( val ) ;
{
assertNumber ( res , "<transition> explicit duration" ) ;
}
return res ;
2023-07-24 11:13:08 +08:00
}
function addTransitionClass ( el , cls ) {
2023-09-06 09:51:55 +08:00
cls . split ( /\s+/ ) . forEach ( ( c ) => c && el . classList . add ( c ) ) ;
( el . _vtc || ( el . _vtc = /* @__PURE__ */ new Set ( ) ) ) . add ( cls ) ;
2023-07-24 11:13:08 +08:00
}
function removeTransitionClass ( el , cls ) {
2023-09-06 09:51:55 +08:00
cls . split ( /\s+/ ) . forEach ( ( c ) => c && el . classList . remove ( c ) ) ;
const { _vtc } = el ;
if ( _vtc ) {
_vtc . delete ( cls ) ;
if ( ! _vtc . size ) {
el . _vtc = void 0 ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
function nextFrame ( cb ) {
2023-09-06 09:51:55 +08:00
requestAnimationFrame ( ( ) => {
requestAnimationFrame ( cb ) ;
} ) ;
2023-07-24 11:13:08 +08:00
}
let endId = 0 ;
function whenTransitionEnds ( el , expectedType , explicitTimeout , resolve ) {
2023-09-06 09:51:55 +08:00
const id = el . _endId = ++ endId ;
const resolveIfNotStale = ( ) => {
if ( id === el . _endId ) {
resolve ( ) ;
}
} ;
if ( explicitTimeout ) {
return setTimeout ( resolveIfNotStale , explicitTimeout ) ;
}
const { type , timeout , propCount } = getTransitionInfo ( el , expectedType ) ;
if ( ! type ) {
return resolve ( ) ;
}
const endEvent = type + "end" ;
let ended = 0 ;
const end = ( ) => {
el . removeEventListener ( endEvent , onEnd ) ;
resolveIfNotStale ( ) ;
} ;
const onEnd = ( e ) => {
if ( e . target === el && ++ ended >= propCount ) {
end ( ) ;
}
} ;
setTimeout ( ( ) => {
if ( ended < propCount ) {
end ( ) ;
}
} , timeout + 1 ) ;
el . addEventListener ( endEvent , onEnd ) ;
2023-07-24 11:13:08 +08:00
}
function getTransitionInfo ( el , expectedType ) {
2023-09-06 09:51:55 +08:00
const styles = window . getComputedStyle ( el ) ;
const getStyleProperties = ( key ) => ( styles [ key ] || "" ) . split ( ", " ) ;
const transitionDelays = getStyleProperties ( ` ${ TRANSITION } Delay ` ) ;
const transitionDurations = getStyleProperties ( ` ${ TRANSITION } Duration ` ) ;
const transitionTimeout = getTimeout ( transitionDelays , transitionDurations ) ;
const animationDelays = getStyleProperties ( ` ${ ANIMATION } Delay ` ) ;
const animationDurations = getStyleProperties ( ` ${ ANIMATION } Duration ` ) ;
const animationTimeout = getTimeout ( animationDelays , animationDurations ) ;
let type = null ;
let timeout = 0 ;
let propCount = 0 ;
if ( expectedType === TRANSITION ) {
if ( transitionTimeout > 0 ) {
type = TRANSITION ;
timeout = transitionTimeout ;
propCount = transitionDurations . length ;
}
} else if ( expectedType === ANIMATION ) {
if ( animationTimeout > 0 ) {
type = ANIMATION ;
timeout = animationTimeout ;
propCount = animationDurations . length ;
}
} else {
timeout = Math . max ( transitionTimeout , animationTimeout ) ;
type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION : ANIMATION : null ;
propCount = type ? type === TRANSITION ? transitionDurations . length : animationDurations . length : 0 ;
}
const hasTransform = type === TRANSITION && /\b(transform|all)(,|$)/ . test (
getStyleProperties ( ` ${ TRANSITION } Property ` ) . toString ( )
) ;
return {
type ,
timeout ,
propCount ,
hasTransform
} ;
2023-07-24 11:13:08 +08:00
}
function getTimeout ( delays , durations ) {
2023-09-06 09:51:55 +08:00
while ( delays . length < durations . length ) {
delays = delays . concat ( delays ) ;
}
return Math . max ( ... durations . map ( ( d , i ) => toMs ( d ) + toMs ( delays [ i ] ) ) ) ;
2023-07-24 11:13:08 +08:00
}
function toMs ( s ) {
2023-09-06 09:51:55 +08:00
return Number ( s . slice ( 0 , - 1 ) . replace ( "," , "." ) ) * 1e3 ;
2023-07-24 11:13:08 +08:00
}
function forceReflow ( ) {
2023-09-06 09:51:55 +08:00
return document . body . offsetHeight ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const positionMap = /* @__PURE__ */ new WeakMap ( ) ;
const newPositionMap = /* @__PURE__ */ new WeakMap ( ) ;
2023-07-24 11:13:08 +08:00
const TransitionGroupImpl = {
2023-09-06 09:51:55 +08:00
name : "TransitionGroup" ,
props : /* @__PURE__ */ extend ( { } , TransitionPropsValidators , {
tag : String ,
moveClass : String
} ) ,
setup ( props , { slots } ) {
const instance = getCurrentInstance ( ) ;
const state = useTransitionState ( ) ;
let prevChildren ;
let children ;
onUpdated ( ( ) => {
if ( ! prevChildren . length ) {
return ;
}
const moveClass = props . moveClass || ` ${ props . name || "v" } -move ` ;
if ( ! hasCSSTransform (
prevChildren [ 0 ] . el ,
instance . vnode . el ,
moveClass
) ) {
return ;
}
prevChildren . forEach ( callPendingCbs ) ;
prevChildren . forEach ( recordPosition ) ;
const movedChildren = prevChildren . filter ( applyTranslation ) ;
forceReflow ( ) ;
movedChildren . forEach ( ( c ) => {
const el = c . el ;
const style = el . style ;
addTransitionClass ( el , moveClass ) ;
style . transform = style . webkitTransform = style . transitionDuration = "" ;
const cb = el . _moveCb = ( e ) => {
if ( e && e . target !== el ) {
return ;
}
if ( ! e || /transform$/ . test ( e . propertyName ) ) {
el . removeEventListener ( "transitionend" , cb ) ;
el . _moveCb = null ;
removeTransitionClass ( el , moveClass ) ;
}
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
el . addEventListener ( "transitionend" , cb ) ;
} ) ;
} ) ;
return ( ) => {
const rawProps = toRaw ( props ) ;
const cssTransitionProps = resolveTransitionProps ( rawProps ) ;
let tag = rawProps . tag || Fragment ;
prevChildren = children ;
children = slots . default ? getTransitionRawChildren ( slots . default ( ) ) : [ ] ;
for ( let i = 0 ; i < children . length ; i ++ ) {
const child = children [ i ] ;
if ( child . key != null ) {
setTransitionHooks (
child ,
resolveTransitionHooks ( child , cssTransitionProps , state , instance )
) ;
} else {
warn ( ` <TransitionGroup> children must be keyed. ` ) ;
}
}
if ( prevChildren ) {
for ( let i = 0 ; i < prevChildren . length ; i ++ ) {
const child = prevChildren [ i ] ;
setTransitionHooks (
child ,
resolveTransitionHooks ( child , cssTransitionProps , state , instance )
) ;
positionMap . set ( child , child . el . getBoundingClientRect ( ) ) ;
}
}
return createVNode ( tag , null , children ) ;
} ;
}
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
const removeMode = ( props ) => delete props . mode ;
/* @__PURE__ */ removeMode ( TransitionGroupImpl . props ) ;
2023-07-24 11:13:08 +08:00
const TransitionGroup = TransitionGroupImpl ;
function callPendingCbs ( c ) {
2023-09-06 09:51:55 +08:00
const el = c . el ;
if ( el . _moveCb ) {
el . _moveCb ( ) ;
}
if ( el . _enterCb ) {
el . _enterCb ( ) ;
}
2023-07-24 11:13:08 +08:00
}
function recordPosition ( c ) {
2023-09-06 09:51:55 +08:00
newPositionMap . set ( c , c . el . getBoundingClientRect ( ) ) ;
2023-07-24 11:13:08 +08:00
}
function applyTranslation ( c ) {
2023-09-06 09:51:55 +08:00
const oldPos = positionMap . get ( c ) ;
const newPos = newPositionMap . get ( c ) ;
const dx = oldPos . left - newPos . left ;
const dy = oldPos . top - newPos . top ;
if ( dx || dy ) {
const s = c . el . style ;
s . transform = s . webkitTransform = ` translate( ${ dx } px, ${ dy } px) ` ;
s . transitionDuration = "0s" ;
return c ;
}
2023-07-24 11:13:08 +08:00
}
function hasCSSTransform ( el , root , moveClass ) {
2023-09-06 09:51:55 +08:00
const clone = el . cloneNode ( ) ;
if ( el . _vtc ) {
el . _vtc . forEach ( ( cls ) => {
cls . split ( /\s+/ ) . forEach ( ( c ) => c && clone . classList . remove ( c ) ) ;
} ) ;
}
moveClass . split ( /\s+/ ) . forEach ( ( c ) => c && clone . classList . add ( c ) ) ;
clone . style . display = "none" ;
const container = root . nodeType === 1 ? root : root . parentNode ;
container . appendChild ( clone ) ;
const { hasTransform } = getTransitionInfo ( clone ) ;
container . removeChild ( clone ) ;
return hasTransform ;
2023-07-24 11:13:08 +08:00
}
const getModelAssigner = ( vnode ) => {
2023-09-06 09:51:55 +08:00
const fn = vnode . props [ "onUpdate:modelValue" ] || false ;
return isArray ( fn ) ? ( value ) => invokeArrayFns ( fn , value ) : fn ;
2023-07-24 11:13:08 +08:00
} ;
function onCompositionStart ( e ) {
2023-09-06 09:51:55 +08:00
e . target . composing = true ;
2023-07-24 11:13:08 +08:00
}
function onCompositionEnd ( e ) {
2023-09-06 09:51:55 +08:00
const target = e . target ;
if ( target . composing ) {
target . composing = false ;
target . dispatchEvent ( new Event ( "input" ) ) ;
}
2023-07-24 11:13:08 +08:00
}
const vModelText = {
2023-09-06 09:51:55 +08:00
created ( el , { modifiers : { lazy , trim , number } } , vnode ) {
el . _assign = getModelAssigner ( vnode ) ;
const castToNumber = number || vnode . props && vnode . props . type === "number" ;
addEventListener ( el , lazy ? "change" : "input" , ( e ) => {
if ( e . target . composing )
return ;
let domValue = el . value ;
if ( trim ) {
domValue = domValue . trim ( ) ;
}
if ( castToNumber ) {
domValue = looseToNumber ( domValue ) ;
}
el . _assign ( domValue ) ;
} ) ;
if ( trim ) {
addEventListener ( el , "change" , ( ) => {
el . value = el . value . trim ( ) ;
} ) ;
}
if ( ! lazy ) {
addEventListener ( el , "compositionstart" , onCompositionStart ) ;
addEventListener ( el , "compositionend" , onCompositionEnd ) ;
addEventListener ( el , "change" , onCompositionEnd ) ;
}
} ,
// set value on mounted so it's after min/max for type="range"
mounted ( el , { value } ) {
el . value = value == null ? "" : value ;
} ,
beforeUpdate ( el , { value , modifiers : { lazy , trim , number } } , vnode ) {
el . _assign = getModelAssigner ( vnode ) ;
if ( el . composing )
return ;
if ( document . activeElement === el && el . type !== "range" ) {
if ( lazy ) {
return ;
}
if ( trim && el . value . trim ( ) === value ) {
return ;
}
if ( ( number || el . type === "number" ) && looseToNumber ( el . value ) === value ) {
return ;
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const newValue = value == null ? "" : value ;
if ( el . value !== newValue ) {
el . value = newValue ;
}
}
2023-07-24 11:13:08 +08:00
} ;
const vModelCheckbox = {
2023-09-06 09:51:55 +08:00
// #4096 array checkboxes need to be deep traversed
deep : true ,
created ( el , _ , vnode ) {
el . _assign = getModelAssigner ( vnode ) ;
addEventListener ( el , "change" , ( ) => {
const modelValue = el . _modelValue ;
const elementValue = getValue ( el ) ;
const checked = el . checked ;
const assign = el . _assign ;
if ( isArray ( modelValue ) ) {
const index = looseIndexOf ( modelValue , elementValue ) ;
const found = index !== - 1 ;
if ( checked && ! found ) {
assign ( modelValue . concat ( elementValue ) ) ;
} else if ( ! checked && found ) {
const filtered = [ ... modelValue ] ;
filtered . splice ( index , 1 ) ;
assign ( filtered ) ;
}
} else if ( isSet ( modelValue ) ) {
const cloned = new Set ( modelValue ) ;
if ( checked ) {
cloned . add ( elementValue ) ;
} else {
cloned . delete ( elementValue ) ;
}
assign ( cloned ) ;
} else {
assign ( getCheckboxValue ( el , checked ) ) ;
}
} ) ;
} ,
// set initial checked on mount to wait for true-value/false-value
mounted : setChecked ,
beforeUpdate ( el , binding , vnode ) {
el . _assign = getModelAssigner ( vnode ) ;
setChecked ( el , binding , vnode ) ;
}
2023-07-24 11:13:08 +08:00
} ;
function setChecked ( el , { value , oldValue } , vnode ) {
2023-09-06 09:51:55 +08:00
el . _modelValue = value ;
if ( isArray ( value ) ) {
el . checked = looseIndexOf ( value , vnode . props . value ) > - 1 ;
} else if ( isSet ( value ) ) {
el . checked = value . has ( vnode . props . value ) ;
} else if ( value !== oldValue ) {
el . checked = looseEqual ( value , getCheckboxValue ( el , true ) ) ;
}
2023-07-24 11:13:08 +08:00
}
const vModelRadio = {
2023-09-06 09:51:55 +08:00
created ( el , { value } , vnode ) {
el . checked = looseEqual ( value , vnode . props . value ) ;
el . _assign = getModelAssigner ( vnode ) ;
addEventListener ( el , "change" , ( ) => {
el . _assign ( getValue ( el ) ) ;
} ) ;
} ,
beforeUpdate ( el , { value , oldValue } , vnode ) {
el . _assign = getModelAssigner ( vnode ) ;
if ( value !== oldValue ) {
el . checked = looseEqual ( value , vnode . props . value ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
} ;
const vModelSelect = {
2023-09-06 09:51:55 +08:00
// <select multiple> value need to be deep traversed
deep : true ,
created ( el , { value , modifiers : { number } } , vnode ) {
const isSetModel = isSet ( value ) ;
addEventListener ( el , "change" , ( ) => {
const selectedVal = Array . prototype . filter . call ( el . options , ( o ) => o . selected ) . map (
( o ) => number ? looseToNumber ( getValue ( o ) ) : getValue ( o )
) ;
el . _assign (
el . multiple ? isSetModel ? new Set ( selectedVal ) : selectedVal : selectedVal [ 0 ]
) ;
} ) ;
el . _assign = getModelAssigner ( vnode ) ;
} ,
// set value in mounted & updated because <select> relies on its children
// <option>s.
mounted ( el , { value } ) {
setSelected ( el , value ) ;
} ,
beforeUpdate ( el , _binding , vnode ) {
el . _assign = getModelAssigner ( vnode ) ;
} ,
updated ( el , { value } ) {
setSelected ( el , value ) ;
}
2023-07-24 11:13:08 +08:00
} ;
function setSelected ( el , value ) {
2023-09-06 09:51:55 +08:00
const isMultiple = el . multiple ;
if ( isMultiple && ! isArray ( value ) && ! isSet ( value ) ) {
warn (
` <select multiple v-model> expects an Array or Set value for its binding, but got ${ Object . prototype . toString . call ( value ) . slice ( 8 , - 1 ) } . `
) ;
return ;
}
for ( let i = 0 , l = el . options . length ; i < l ; i ++ ) {
const option = el . options [ i ] ;
const optionValue = getValue ( option ) ;
if ( isMultiple ) {
if ( isArray ( value ) ) {
option . selected = looseIndexOf ( value , optionValue ) > - 1 ;
} else {
option . selected = value . has ( optionValue ) ;
}
} else {
if ( looseEqual ( getValue ( option ) , value ) ) {
if ( el . selectedIndex !== i )
el . selectedIndex = i ;
2023-07-24 11:13:08 +08:00
return ;
2023-09-06 09:51:55 +08:00
}
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
}
if ( ! isMultiple && el . selectedIndex !== - 1 ) {
el . selectedIndex = - 1 ;
}
2023-07-24 11:13:08 +08:00
}
function getValue ( el ) {
2023-09-06 09:51:55 +08:00
return "_value" in el ? el . _value : el . value ;
2023-07-24 11:13:08 +08:00
}
function getCheckboxValue ( el , checked ) {
2023-09-06 09:51:55 +08:00
const key = checked ? "_trueValue" : "_falseValue" ;
return key in el ? el [ key ] : checked ;
2023-07-24 11:13:08 +08:00
}
const vModelDynamic = {
2023-09-06 09:51:55 +08:00
created ( el , binding , vnode ) {
callModelHook ( el , binding , vnode , null , "created" ) ;
} ,
mounted ( el , binding , vnode ) {
callModelHook ( el , binding , vnode , null , "mounted" ) ;
} ,
beforeUpdate ( el , binding , vnode , prevVNode ) {
callModelHook ( el , binding , vnode , prevVNode , "beforeUpdate" ) ;
} ,
updated ( el , binding , vnode , prevVNode ) {
callModelHook ( el , binding , vnode , prevVNode , "updated" ) ;
}
2023-07-24 11:13:08 +08:00
} ;
function resolveDynamicModel ( tagName , type ) {
2023-09-06 09:51:55 +08:00
switch ( tagName ) {
case "SELECT" :
return vModelSelect ;
case "TEXTAREA" :
return vModelText ;
default :
switch ( type ) {
case "checkbox" :
return vModelCheckbox ;
case "radio" :
return vModelRadio ;
2023-07-24 11:13:08 +08:00
default :
2023-09-06 09:51:55 +08:00
return vModelText ;
}
}
2023-07-24 11:13:08 +08:00
}
function callModelHook ( el , binding , vnode , prevVNode , hook ) {
2023-09-06 09:51:55 +08:00
const modelToUse = resolveDynamicModel (
el . tagName ,
vnode . props && vnode . props . type
) ;
const fn = modelToUse [ hook ] ;
fn && fn ( el , binding , vnode , prevVNode ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const systemModifiers = [ "ctrl" , "shift" , "alt" , "meta" ] ;
2023-07-24 11:13:08 +08:00
const modifierGuards = {
2023-09-06 09:51:55 +08:00
stop : ( e ) => e . stopPropagation ( ) ,
prevent : ( e ) => e . preventDefault ( ) ,
self : ( e ) => e . target !== e . currentTarget ,
ctrl : ( e ) => ! e . ctrlKey ,
shift : ( e ) => ! e . shiftKey ,
alt : ( e ) => ! e . altKey ,
meta : ( e ) => ! e . metaKey ,
left : ( e ) => "button" in e && e . button !== 0 ,
middle : ( e ) => "button" in e && e . button !== 1 ,
right : ( e ) => "button" in e && e . button !== 2 ,
exact : ( e , modifiers ) => systemModifiers . some ( ( m ) => e [ ` ${ m } Key ` ] && ! modifiers . includes ( m ) )
2023-07-24 11:13:08 +08:00
} ;
const withModifiers = ( fn , modifiers ) => {
2023-09-06 09:51:55 +08:00
return ( event , ... args ) => {
for ( let i = 0 ; i < modifiers . length ; i ++ ) {
const guard = modifierGuards [ modifiers [ i ] ] ;
if ( guard && guard ( event , modifiers ) )
return ;
}
return fn ( event , ... args ) ;
} ;
2023-07-24 11:13:08 +08:00
} ;
const keyNames = {
2023-09-06 09:51:55 +08:00
esc : "escape" ,
space : " " ,
up : "arrow-up" ,
left : "arrow-left" ,
right : "arrow-right" ,
down : "arrow-down" ,
delete : "backspace"
2023-07-24 11:13:08 +08:00
} ;
const withKeys = ( fn , modifiers ) => {
2023-09-06 09:51:55 +08:00
return ( event ) => {
if ( ! ( "key" in event ) ) {
return ;
}
const eventKey = hyphenate ( event . key ) ;
if ( modifiers . some ( ( k ) => k === eventKey || keyNames [ k ] === eventKey ) ) {
return fn ( event ) ;
}
} ;
2023-07-24 11:13:08 +08:00
} ;
const vShow = {
2023-09-06 09:51:55 +08:00
beforeMount ( el , { value } , { transition } ) {
el . _vod = el . style . display === "none" ? "" : el . style . display ;
if ( transition && value ) {
transition . beforeEnter ( el ) ;
} else {
setDisplay ( el , value ) ;
}
} ,
mounted ( el , { value } , { transition } ) {
if ( transition && value ) {
transition . enter ( el ) ;
}
} ,
updated ( el , { value , oldValue } , { transition } ) {
if ( ! value === ! oldValue )
return ;
if ( transition ) {
if ( value ) {
transition . beforeEnter ( el ) ;
setDisplay ( el , true ) ;
transition . enter ( el ) ;
} else {
transition . leave ( el , ( ) => {
setDisplay ( el , false ) ;
} ) ;
}
} else {
setDisplay ( el , value ) ;
}
} ,
beforeUnmount ( el , { value } ) {
setDisplay ( el , value ) ;
}
2023-07-24 11:13:08 +08:00
} ;
function setDisplay ( el , value ) {
2023-09-06 09:51:55 +08:00
el . style . display = value ? el . _vod : "none" ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const rendererOptions = /* @__PURE__ */ extend ( { patchProp } , nodeOps ) ;
2023-07-24 11:13:08 +08:00
let renderer ;
let enabledHydration = false ;
function ensureRenderer ( ) {
2023-09-06 09:51:55 +08:00
return renderer || ( renderer = createRenderer ( rendererOptions ) ) ;
2023-07-24 11:13:08 +08:00
}
function ensureHydrationRenderer ( ) {
2023-09-06 09:51:55 +08:00
renderer = enabledHydration ? renderer : createHydrationRenderer ( rendererOptions ) ;
enabledHydration = true ;
return renderer ;
}
const render = ( ... args ) => {
ensureRenderer ( ) . render ( ... args ) ;
} ;
const hydrate = ( ... args ) => {
ensureHydrationRenderer ( ) . hydrate ( ... args ) ;
} ;
const createApp = ( ... args ) => {
const app = ensureRenderer ( ) . createApp ( ... args ) ;
{
injectNativeTagCheck ( app ) ;
injectCompilerOptionsCheck ( app ) ;
}
const { mount } = app ;
app . mount = ( containerOrSelector ) => {
const container = normalizeContainer ( containerOrSelector ) ;
if ( ! container )
return ;
const component = app . _component ;
if ( ! isFunction ( component ) && ! component . render && ! component . template ) {
component . template = container . innerHTML ;
}
container . innerHTML = "" ;
const proxy = mount ( container , false , container instanceof SVGElement ) ;
if ( container instanceof Element ) {
container . removeAttribute ( "v-cloak" ) ;
container . setAttribute ( "data-v-app" , "" ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return proxy ;
} ;
return app ;
} ;
const createSSRApp = ( ... args ) => {
const app = ensureHydrationRenderer ( ) . createApp ( ... args ) ;
{
injectNativeTagCheck ( app ) ;
injectCompilerOptionsCheck ( app ) ;
}
const { mount } = app ;
app . mount = ( containerOrSelector ) => {
const container = normalizeContainer ( containerOrSelector ) ;
if ( container ) {
return mount ( container , true , container instanceof SVGElement ) ;
}
} ;
return app ;
} ;
2023-07-24 11:13:08 +08:00
function injectNativeTagCheck ( app ) {
2023-09-06 09:51:55 +08:00
Object . defineProperty ( app . config , "isNativeTag" , {
value : ( tag ) => isHTMLTag ( tag ) || isSVGTag ( tag ) ,
writable : false
} ) ;
2023-07-24 11:13:08 +08:00
}
function injectCompilerOptionsCheck ( app ) {
2023-09-06 09:51:55 +08:00
if ( isRuntimeOnly ( ) ) {
const isCustomElement = app . config . isCustomElement ;
Object . defineProperty ( app . config , "isCustomElement" , {
get ( ) {
return isCustomElement ;
} ,
set ( ) {
warn (
` The \` isCustomElement \` config option is deprecated. Use \` compilerOptions.isCustomElement \` instead. `
) ;
}
} ) ;
const compilerOptions = app . config . compilerOptions ;
const msg = ` The \` compilerOptions \` config option is only respected when using a build of Vue.js that includes the runtime compiler (aka "full build"). Since you are using the runtime-only build, \` compilerOptions \` must be passed to \` @vue/compiler-dom \` in the build setup instead.
- For vue - loader : pass it via vue - loader ' s \ ` compilerOptions \` loader option.
- For vue - cli : see https : //cli.vuejs.org/guide/webpack.html#modifying-options-of-a-loader
- For vite : pass it via @ vitejs / plugin - vue options . See https : //github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#example-for-passing-options-to-vuecompiler-sfc`;
Object . defineProperty ( app . config , "compilerOptions" , {
get ( ) {
warn ( msg ) ;
return compilerOptions ;
} ,
set ( ) {
warn ( msg ) ;
}
} ) ;
}
2023-07-24 11:13:08 +08:00
}
function normalizeContainer ( container ) {
2023-09-06 09:51:55 +08:00
if ( isString ( container ) ) {
const res = document . querySelector ( container ) ;
if ( ! res ) {
warn (
` Failed to mount app: mount target selector " ${ container } " returned null. `
) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
return res ;
}
if ( window . ShadowRoot && container instanceof window . ShadowRoot && container . mode === "closed" ) {
warn (
` mounting on a ShadowRoot with \` {mode: "closed"} \` may lead to unpredictable bugs `
) ;
}
return container ;
2023-07-24 11:13:08 +08:00
}
const initDirectivesForSSR = NOOP ;
function initDev ( ) {
2023-09-06 09:51:55 +08:00
{
2023-07-24 11:13:08 +08:00
{
2023-09-06 09:51:55 +08:00
console . info (
` You are running a development build of Vue.
Make sure to use the production build ( * . prod . js ) when deploying for production . `
) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
initCustomFormatter ( ) ;
}
2023-07-24 11:13:08 +08:00
}
{
2023-09-06 09:51:55 +08:00
initDev ( ) ;
2023-07-24 11:13:08 +08:00
}
2023-09-06 09:51:55 +08:00
const compile = ( ) => {
{
warn (
` Runtime compilation is not supported in this build of Vue. ` + ( ` Use "vue.esm-browser.js" instead. ` )
/* should not happen */
) ;
}
2023-07-24 11:13:08 +08:00
} ;
2023-09-06 09:51:55 +08:00
export { BaseTransition , BaseTransitionPropsValidators , Comment , EffectScope , Fragment , KeepAlive , ReactiveEffect , Static , Suspense , Teleport , Text , Transition , TransitionGroup , VueElement , assertNumber , callWithAsyncErrorHandling , callWithErrorHandling , camelize , capitalize , cloneVNode , compatUtils , compile , computed , createApp , createBlock , createCommentVNode , createElementBlock , createBaseVNode as createElementVNode , createHydrationRenderer , createPropsRestProxy , createRenderer , createSSRApp , createSlots , createStaticVNode , createTextVNode , createVNode , customRef , defineAsyncComponent , defineComponent , defineCustomElement , defineEmits , defineExpose , defineModel , defineOptions , defineProps , defineSSRCustomElement , defineSlots , devtools , effect , effectScope , getCurrentInstance , getCurrentScope , getTransitionRawChildren , guardReactiveProps , h , handleError , hasInjectionContext , hydrate , initCustomFormatter , initDirectivesForSSR , inject , isMemoSame , isProxy , isReactive , isReadonly , isRef , isRuntimeOnly , isShallow , isVNode , markRaw , mergeDefaults , mergeModels , mergeProps , nextTick , normalizeClass , normalizeProps , normalizeStyle , onActivated , onBeforeMount , onBeforeUnmount , onBeforeUpdate , onDeactivated , onErrorCaptured , onMounted , onRenderTracked , onRenderTriggered , onScopeDispose , onServerPrefetch , onUnmounted , onUpdated , openBlock , popScopeId , provide , proxyRefs , pushScopeId , queuePostFlushCb , reactive , readonly , ref , registerRuntimeCompiler , render , renderList , renderSlot , resolveComponent , resolveDirective , resolveDynamicComponent , resolveFilter , resolveTransitionHooks , setBlockTracking , setDevtoolsHook , setTransitionHooks , shallowReactive , shallowReadonly , shallowRef , ssrContextKey , ssrUtils , stop , toDisplayString , toHandlerKey , toHandlers , toRaw , toRef , toRefs , toValue , transformVNodeArgs , triggerRef , unref , useAttrs , useCssModule , useCssVars , useModel , useSSRContext , useSlots , useTransitionState , vModelCheckbox , vModelDynamic , vModelRadio , vModelSelect , vModelText , vShow , version , warn , watch , watchEffect , watchPostEffect , watchSyncEffect , withAsyncContext , withCtx , withDefaults , withDirectives , withKeys , withMemo , withModifiers , withScopeId } ;