2023-07-24 03:13:08 +00:00
function makeMap ( str , expectsLowerCase ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 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 ;
} ;
let _globalThis ;
const getGlobalThis = ( ) => {
return _globalThis || ( _globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : { } ) ;
} ;
2023-07-24 03:13:08 +00:00
function normalizeStyle ( value ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
return res ;
} else if ( isString ( value ) ) {
return value ;
} else if ( isObject ( value ) ) {
return value ;
}
2023-07-24 03:13:08 +00:00
}
const listDelimiterRE = /;(?![^(]*\))/g ;
const propertyDelimiterRE = /:([^]+)/ ;
2023-09-06 01:51:55 +00:00
const styleCommentRE = /\/\*[^]*?\*\//g ;
2023-07-24 03:13:08 +00:00
function parseStringStyle ( cssText ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function stringifyStyle ( styles ) {
2023-09-06 01:51:55 +00:00
let ret = "" ;
if ( ! styles || isString ( styles ) ) {
2023-07-24 03:13:08 +00:00
return ret ;
2023-09-06 01:51:55 +00:00
}
for ( const key in styles ) {
const value = styles [ key ] ;
const normalizedKey = key . startsWith ( ` -- ` ) ? key : hyphenate ( key ) ;
if ( isString ( value ) || typeof value === "number" ) {
ret += ` ${ normalizedKey } : ${ value } ; ` ;
}
}
return ret ;
2023-07-24 03:13:08 +00:00
}
function normalizeClass ( value ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 VOID _TAGS = "area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr" ;
const isHTMLTag = /* @__PURE__ */ makeMap ( HTML _TAGS ) ;
const isSVGTag = /* @__PURE__ */ makeMap ( SVG _TAGS ) ;
const isVoidTag = /* @__PURE__ */ makeMap ( VOID _TAGS ) ;
2023-07-24 03:13:08 +00:00
const specialBooleanAttrs = ` itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly ` ;
2023-09-06 01:51:55 +00:00
const isSpecialBooleanAttr = /* @__PURE__ */ makeMap ( specialBooleanAttrs ) ;
const isBooleanAttr = /* @__PURE__ */ makeMap (
specialBooleanAttrs + ` ,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected `
) ;
2023-07-24 03:13:08 +00:00
function includeBooleanAttr ( value ) {
2023-09-06 01:51:55 +00:00
return ! ! value || value === "" ;
2023-07-24 03:13:08 +00:00
}
const unsafeAttrCharRE = /[>/="'\u0009\u000a\u000c\u0020]/ ;
const attrValidationCache = { } ;
function isSSRSafeAttrName ( name ) {
2023-09-06 01:51:55 +00:00
if ( attrValidationCache . hasOwnProperty ( name ) ) {
return attrValidationCache [ name ] ;
}
const isUnsafe = unsafeAttrCharRE . test ( name ) ;
if ( isUnsafe ) {
console . error ( ` unsafe attribute name: ${ name } ` ) ;
}
return attrValidationCache [ name ] = ! isUnsafe ;
2023-07-24 03:13:08 +00:00
}
const propsToAttrMap = {
2023-09-06 01:51:55 +00:00
acceptCharset : "accept-charset" ,
className : "class" ,
htmlFor : "for" ,
httpEquiv : "http-equiv"
2023-07-24 03:13:08 +00:00
} ;
const escapeRE = /["'&<>]/ ;
function escapeHtml ( string ) {
2023-09-06 01:51:55 +00:00
const str = "" + string ;
const match = escapeRE . exec ( str ) ;
if ( ! match ) {
return str ;
}
let html = "" ;
let escaped ;
let index ;
let lastIndex = 0 ;
for ( index = match . index ; index < str . length ; index ++ ) {
switch ( str . charCodeAt ( index ) ) {
case 34 :
escaped = """ ;
break ;
case 38 :
escaped = "&" ;
break ;
case 39 :
escaped = "'" ;
break ;
case 60 :
escaped = "<" ;
break ;
case 62 :
escaped = ">" ;
break ;
default :
continue ;
}
if ( lastIndex !== index ) {
html += str . slice ( lastIndex , index ) ;
}
lastIndex = index + 1 ;
html += escaped ;
}
return lastIndex !== index ? html + str . slice ( lastIndex , index ) : html ;
2023-07-24 03:13:08 +00:00
}
const commentStripRE = /^-?>|<!--|-->|--!>|<!-$/g ;
function escapeHtmlComment ( src ) {
2023-09-06 01:51:55 +00:00
return src . replace ( commentStripRE , "" ) ;
2023-07-24 03:13:08 +00:00
}
function looseCompareArrays ( a , b ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function looseEqual ( a , b ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
return String ( a ) === String ( b ) ;
2023-07-24 03:13:08 +00:00
}
function looseIndexOf ( arr , val ) {
2023-09-06 01:51:55 +00:00
return arr . findIndex ( ( item ) => looseEqual ( item , val ) ) ;
2023-07-24 03:13:08 +00:00
}
const toDisplayString = ( val ) => {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
} ;
const replacer = ( _key , val ) => {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
} ;
2023-09-06 01:51:55 +00:00
function warn$1 ( msg , ... args ) {
console . warn ( ` [Vue warn] ${ msg } ` , ... args ) ;
2023-07-24 03:13:08 +00:00
}
let activeEffectScope ;
class EffectScope {
2023-09-06 01:51:55 +00:00
constructor ( detached = false ) {
this . detached = detached ;
2023-07-24 03:13:08 +00:00
/ * *
* @ internal
* /
2023-09-06 01:51:55 +00:00
this . _active = true ;
2023-07-24 03:13:08 +00:00
/ * *
* @ internal
* /
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function recordEffectScope ( effect , scope = activeEffectScope ) {
2023-09-06 01:51:55 +00:00
if ( scope && scope . active ) {
scope . effects . push ( effect ) ;
}
}
function getCurrentScope ( ) {
return activeEffectScope ;
2023-07-24 03:13:08 +00:00
}
const createDep = ( effects ) => {
2023-09-06 01:51:55 +00:00
const dep = new Set ( effects ) ;
dep . w = 0 ;
dep . n = 0 ;
return dep ;
2023-07-24 03:13:08 +00:00
} ;
const wasTracked = ( dep ) => ( dep . w & trackOpBit ) > 0 ;
const newTracked = ( dep ) => ( dep . n & trackOpBit ) > 0 ;
const initDepMarkers = ( { deps } ) => {
2023-09-06 01:51:55 +00:00
if ( deps . length ) {
for ( let i = 0 ; i < deps . length ; i ++ ) {
deps [ i ] . w |= trackOpBit ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
} ;
const finalizeDepMarkers = ( effect ) => {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
} ;
2023-09-06 01:51:55 +00:00
const targetMap = /* @__PURE__ */ new WeakMap ( ) ;
2023-07-24 03:13:08 +00:00
let effectTrackDepth = 0 ;
let trackOpBit = 1 ;
const maxMarkerBits = 30 ;
let activeEffect ;
2023-09-06 01:51:55 +00:00
const ITERATE _KEY = Symbol ( "iterate" ) ;
const MAP _KEY _ITERATE _KEY = Symbol ( "Map key iterate" ) ;
2023-07-24 03:13:08 +00:00
class ReactiveEffect {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
let shouldTrack = true ;
const trackStack = [ ] ;
function pauseTracking ( ) {
2023-09-06 01:51:55 +00:00
trackStack . push ( shouldTrack ) ;
shouldTrack = false ;
2023-07-24 03:13:08 +00:00
}
function resetTracking ( ) {
2023-09-06 01:51:55 +00:00
const last = trackStack . pop ( ) ;
shouldTrack = last === void 0 ? true : last ;
2023-07-24 03:13:08 +00:00
}
function track ( target , type , key ) {
2023-09-06 01:51:55 +00:00
if ( shouldTrack && activeEffect ) {
let depsMap = targetMap . get ( target ) ;
if ( ! depsMap ) {
targetMap . set ( target , depsMap = /* @__PURE__ */ new Map ( ) ) ;
}
let dep = depsMap . get ( key ) ;
if ( ! dep ) {
depsMap . set ( key , dep = createDep ( ) ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const eventInfo = { effect : activeEffect , target , type , key } ;
trackEffects ( dep , eventInfo ) ;
}
2023-07-24 03:13:08 +00:00
}
function trackEffects ( dep , debuggerEventExtraInfo ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function trigger ( target , type , key , newValue , oldValue , oldTarget ) {
2023-09-06 01:51:55 +00: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 ) ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
{
triggerEffects ( createDep ( effects ) , eventInfo ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
}
function triggerEffects ( dep , debuggerEventExtraInfo ) {
2023-09-06 01:51:55 +00:00
const effects = isArray ( dep ) ? dep : [ ... dep ] ;
for ( const effect2 of effects ) {
if ( effect2 . computed ) {
triggerEffect ( effect2 , debuggerEventExtraInfo ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
for ( const effect2 of effects ) {
if ( ! effect2 . computed ) {
triggerEffect ( effect2 , debuggerEventExtraInfo ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
function triggerEffect ( effect2 , debuggerEventExtraInfo ) {
if ( effect2 !== activeEffect || effect2 . allowRecurse ) {
if ( effect2 . onTrigger ) {
effect2 . onTrigger ( extend ( { effect : effect2 } , debuggerEventExtraInfo ) ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( effect2 . scheduler ) {
effect2 . scheduler ( ) ;
} else {
effect2 . run ( ) ;
}
}
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const isNonTrackableKeys = /* @__PURE__ */ makeMap ( ` __proto__,__v_isRef,__isVue ` ) ;
2023-07-24 03:13:08 +00:00
const builtInSymbols = new Set (
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
function createArrayInstrumentations ( ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
return res ;
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
} ;
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
} ;
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
return res ;
} ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
return result ;
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function ownKeys ( target ) {
2023-09-06 01:51:55 +00:00
track ( target , "iterate" , isArray ( target ) ? "length" : ITERATE _KEY ) ;
return Reflect . ownKeys ( target ) ;
2023-07-24 03:13:08 +00:00
}
const mutableHandlers = {
2023-09-06 01:51:55 +00:00
get : get$1 ,
set : set$1 ,
deleteProperty ,
has : has$1 ,
ownKeys
2023-07-24 03:13:08 +00:00
} ;
const readonlyHandlers = {
2023-09-06 01:51:55 +00:00
get : readonlyGet ,
set ( target , key ) {
{
warn$1 (
` Set operation on key " ${ String ( key ) } " failed: target is readonly. ` ,
target
) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
return true ;
} ,
deleteProperty ( target , key ) {
{
warn$1 (
` Delete operation on key " ${ String ( key ) } " failed: target is readonly. ` ,
target
) ;
}
return true ;
}
2023-07-24 03:13:08 +00:00
} ;
2023-09-06 01:51:55 +00:00
const shallowReactiveHandlers = /* @__PURE__ */ extend (
{ } ,
mutableHandlers ,
{
2023-07-24 03:13:08 +00:00
get : shallowGet ,
set : shallowSet
2023-09-06 01:51:55 +00:00
}
) ;
const shallowReadonlyHandlers = /* @__PURE__ */ extend (
{ } ,
readonlyHandlers ,
{
2023-07-24 03:13:08 +00:00
get : shallowReadonlyGet
2023-09-06 01:51:55 +00:00
}
) ;
2023-07-24 03:13:08 +00:00
const toShallow = ( value ) => value ;
const getProto = ( v ) => Reflect . getPrototypeOf ( v ) ;
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function size ( target , isReadonly = false ) {
2023-09-06 01:51:55 +00:00
target = target [ "__v_raw" ] ;
! isReadonly && track ( toRaw ( target ) , "iterate" , ITERATE _KEY ) ;
return Reflect . get ( target , "size" , target ) ;
2023-07-24 03:13:08 +00:00
}
function add ( value ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function deleteEntry ( key ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function clear ( ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function createForEach ( isReadonly , isShallow ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function createIterableMethod ( method , isReadonly , isShallow ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
} ;
2023-09-06 01:51:55 +00:00
} ,
// iterable protocol
[ Symbol . iterator ] ( ) {
return this ;
}
2023-07-24 03:13:08 +00:00
} ;
2023-09-06 01:51:55 +00:00
} ;
2023-07-24 03:13:08 +00:00
}
function createReadonlyMethod ( type ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function createInstrumentations ( ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
function createInstrumentationGetter ( isReadonly , shallow ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
const mutableCollectionHandlers = {
2023-09-06 01:51:55 +00:00
get : /* @__PURE__ */ createInstrumentationGetter ( false , false )
2023-07-24 03:13:08 +00:00
} ;
const shallowCollectionHandlers = {
2023-09-06 01:51:55 +00:00
get : /* @__PURE__ */ createInstrumentationGetter ( false , true )
2023-07-24 03:13:08 +00:00
} ;
const readonlyCollectionHandlers = {
2023-09-06 01:51:55 +00:00
get : /* @__PURE__ */ createInstrumentationGetter ( true , false )
2023-07-24 03:13:08 +00:00
} ;
const shallowReadonlyCollectionHandlers = {
2023-09-06 01:51:55 +00:00
get : /* @__PURE__ */ createInstrumentationGetter ( true , true )
2023-07-24 03:13:08 +00:00
} ;
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const reactiveMap = /* @__PURE__ */ new WeakMap ( ) ;
const shallowReactiveMap = /* @__PURE__ */ new WeakMap ( ) ;
const readonlyMap = /* @__PURE__ */ new WeakMap ( ) ;
const shallowReadonlyMap = /* @__PURE__ */ new WeakMap ( ) ;
2023-07-24 03:13:08 +00:00
function targetTypeMap ( rawType ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function getTargetType ( value ) {
2023-09-06 01:51:55 +00:00
return value [ "__v_skip" ] || ! Object . isExtensible ( value ) ? 0 /* INVALID */ : targetTypeMap ( toRawType ( value ) ) ;
2023-07-24 03:13:08 +00:00
}
function reactive ( target ) {
2023-09-06 01:51:55 +00:00
if ( isReadonly ( target ) ) {
return target ;
}
return createReactiveObject (
target ,
false ,
mutableHandlers ,
mutableCollectionHandlers ,
reactiveMap
) ;
2023-07-24 03:13:08 +00:00
}
function shallowReactive ( target ) {
2023-09-06 01:51:55 +00:00
return createReactiveObject (
target ,
false ,
shallowReactiveHandlers ,
shallowCollectionHandlers ,
shallowReactiveMap
) ;
2023-07-24 03:13:08 +00:00
}
function readonly ( target ) {
2023-09-06 01:51:55 +00:00
return createReactiveObject (
target ,
true ,
readonlyHandlers ,
readonlyCollectionHandlers ,
readonlyMap
) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 ) } ` ) ;
}
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 03:13:08 +00:00
}
function isReactive ( value ) {
2023-09-06 01:51:55 +00:00
if ( isReadonly ( value ) ) {
return isReactive ( value [ "__v_raw" ] ) ;
}
return ! ! ( value && value [ "__v_isReactive" ] ) ;
2023-07-24 03:13:08 +00:00
}
function isReadonly ( value ) {
2023-09-06 01:51:55 +00:00
return ! ! ( value && value [ "__v_isReadonly" ] ) ;
2023-07-24 03:13:08 +00:00
}
function isShallow ( value ) {
2023-09-06 01:51:55 +00:00
return ! ! ( value && value [ "__v_isShallow" ] ) ;
2023-07-24 03:13:08 +00:00
}
function isProxy ( value ) {
2023-09-06 01:51:55 +00:00
return isReactive ( value ) || isReadonly ( value ) ;
2023-07-24 03:13:08 +00:00
}
function toRaw ( observed ) {
2023-09-06 01:51:55 +00:00
const raw = observed && observed [ "__v_raw" ] ;
return raw ? toRaw ( raw ) : observed ;
2023-07-24 03:13:08 +00:00
}
function markRaw ( value ) {
2023-09-06 01:51:55 +00:00
def ( value , "__v_skip" , true ) ;
return value ;
2023-07-24 03:13:08 +00:00
}
const toReactive = ( value ) => isObject ( value ) ? reactive ( value ) : value ;
const toReadonly = ( value ) => isObject ( value ) ? readonly ( value ) : value ;
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
}
function isRef ( r ) {
2023-09-06 01:51:55 +00:00
return ! ! ( r && r . _ _v _isRef === true ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
function unref ( ref2 ) {
return isRef ( ref2 ) ? ref2 . value : ref2 ;
2023-07-24 03:13:08 +00:00
}
const shallowUnwrapHandlers = {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
} ;
function proxyRefs ( objectWithRefs ) {
2023-09-06 01:51:55 +00:00
return isReactive ( objectWithRefs ) ? objectWithRefs : new Proxy ( objectWithRefs , shallowUnwrapHandlers ) ;
2023-07-24 03:13:08 +00:00
}
class ComputedRefImpl {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
this . _dirty = true ;
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
const stack = [ ] ;
function pushWarningContext ( vnode ) {
2023-09-06 01:51:55 +00:00
stack . push ( vnode ) ;
2023-07-24 03:13:08 +00:00
}
function popWarningContext ( ) {
2023-09-06 01:51:55 +00:00
stack . pop ( ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
console . warn ( ... warnArgs ) ;
}
resetTracking ( ) ;
2023-07-24 03:13:08 +00:00
}
function getComponentTrace ( ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function formatTrace ( trace ) {
2023-09-06 01:51:55 +00:00
const logs = [ ] ;
trace . forEach ( ( entry , i ) => {
logs . push ( ... i === 0 ? [ ] : [ `
` ], ...formatTraceEntry(entry));
} ) ;
return logs ;
2023-07-24 03:13:08 +00:00
}
function formatTraceEntry ( { vnode , recurseCount } ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
function formatProps ( props ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function formatProp ( key , value , raw ) {
2023-09-06 01:51:55 +00: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 ] ;
}
2023-07-24 03:13:08 +00:00
}
const ErrorTypeStrings = {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
} ;
function callWithErrorHandling ( fn , instance , type , args ) {
2023-09-06 01:51:55 +00:00
let res ;
try {
res = args ? fn ( ... args ) : fn ( ) ;
} catch ( err ) {
handleError ( err , instance , type ) ;
}
return res ;
2023-07-24 03:13:08 +00:00
}
function callWithAsyncErrorHandling ( fn , instance , type , args ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function handleError ( err , instance , type , throwInDev = true ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
return ;
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
cur = cur . parent ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const appErrorHandler = instance . appContext . config . errorHandler ;
if ( appErrorHandler ) {
callWithErrorHandling (
appErrorHandler ,
null ,
10 ,
[ err , exposedInstance , errorInfo ]
) ;
return ;
}
}
logError ( err , type , contextVNode , throwInDev ) ;
2023-07-24 03:13:08 +00:00
}
function logError ( err , type , contextVNode , throwInDev = true ) {
2023-09-06 01:51:55 +00:00
{
const info = ErrorTypeStrings [ type ] ;
if ( contextVNode ) {
pushWarningContext ( contextVNode ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
warn ( ` Unhandled error ${ info ? ` during execution of ${ info } ` : ` ` } ` ) ;
if ( contextVNode ) {
popWarningContext ( ) ;
}
if ( throwInDev ) {
throw err ;
} else {
console . error ( err ) ;
}
}
2023-07-24 03:13:08 +00:00
}
let isFlushing = false ;
let isFlushPending = false ;
const queue = [ ] ;
let flushIndex = 0 ;
const pendingPostFlushCbs = [ ] ;
let activePostFlushCbs = null ;
let postFlushIndex = 0 ;
2023-09-06 01:51:55 +00:00
const resolvedPromise = /* @__PURE__ */ Promise . resolve ( ) ;
2023-07-24 03:13:08 +00:00
let currentFlushPromise = null ;
const RECURSION _LIMIT = 100 ;
function nextTick ( fn ) {
2023-09-06 01:51:55 +00:00
const p = currentFlushPromise || resolvedPromise ;
return fn ? p . then ( this ? fn . bind ( this ) : fn ) : p ;
2023-07-24 03:13:08 +00:00
}
function findInsertionIndex ( id ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function queueJob ( job ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
queueFlush ( ) ;
}
2023-07-24 03:13:08 +00:00
}
function queueFlush ( ) {
2023-09-06 01:51:55 +00:00
if ( ! isFlushing && ! isFlushPending ) {
isFlushPending = true ;
currentFlushPromise = resolvedPromise . then ( flushJobs ) ;
}
2023-07-24 03:13:08 +00:00
}
function invalidateJob ( job ) {
2023-09-06 01:51:55 +00:00
const i = queue . indexOf ( job ) ;
if ( i > flushIndex ) {
queue . splice ( i , 1 ) ;
}
2023-07-24 03:13:08 +00:00
}
function queuePostFlushCb ( cb ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
{
2023-09-06 01:51:55 +00:00
seen = seen || /* @__PURE__ */ new Map ( ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
activePostFlushCbs = null ;
postFlushIndex = 0 ;
}
2023-07-24 03:13:08 +00:00
}
const getId = ( job ) => job . id == null ? Infinity : job . id ;
const comparator = ( a , b ) => {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
} ;
function flushJobs ( seen ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function checkRecursiveUpdates ( seen , fn ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
let isHmrUpdating = false ;
2023-09-06 01:51:55 +00:00
const hmrDirtyComponents = /* @__PURE__ */ new Set ( ) ;
2023-07-24 03:13:08 +00:00
{
2023-09-06 01:51:55 +00:00
getGlobalThis ( ) . _ _VUE _HMR _RUNTIME _ _ = {
createRecord : tryWrap ( createRecord ) ,
rerender : tryWrap ( rerender ) ,
reload : tryWrap ( reload )
} ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const map = /* @__PURE__ */ new Map ( ) ;
2023-07-24 03:13:08 +00:00
function registerHMR ( instance ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function unregisterHMR ( instance ) {
2023-09-06 01:51:55 +00:00
map . get ( instance . type . _ _hmrId ) . instances . delete ( instance ) ;
2023-07-24 03:13:08 +00:00
}
function createRecord ( id , initialDef ) {
2023-09-06 01:51:55 +00:00
if ( map . has ( id ) ) {
return false ;
}
map . set ( id , {
initialDef : normalizeClassComponent ( initialDef ) ,
instances : /* @__PURE__ */ new Set ( )
} ) ;
return true ;
2023-07-24 03:13:08 +00:00
}
function normalizeClassComponent ( component ) {
2023-09-06 01:51:55 +00:00
return isClassComponent ( component ) ? component . _ _vccOpts : component ;
2023-07-24 03:13:08 +00:00
}
function rerender ( id , newRender ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function reload ( id , newComp ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
for ( const instance of instances ) {
2023-09-06 01:51:55 +00:00
hmrDirtyComponents . delete (
normalizeClassComponent ( instance . type )
) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
} ) ;
2023-07-24 03:13:08 +00:00
}
function updateComponentDef ( oldComp , newComp ) {
2023-09-06 01:51:55 +00:00
extend ( oldComp , newComp ) ;
for ( const key in oldComp ) {
if ( key !== "__file" && ! ( key in newComp ) ) {
delete oldComp [ key ] ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
}
function tryWrap ( fn ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
let devtools ;
let buffer = [ ] ;
let devtoolsNotInstalled = false ;
2023-09-06 01:51:55 +00:00
function emit$1 ( event , ... args ) {
if ( devtools ) {
devtools . emit ( event , ... args ) ;
} else if ( ! devtoolsNotInstalled ) {
buffer . push ( { event , args } ) ;
}
2023-07-24 03:13:08 +00:00
}
function setDevtoolsHook ( hook , target ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00: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 01:51:55 +00: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 03:13:08 +00:00
devtoolsNotInstalled = true ;
buffer = [ ] ;
2023-09-06 01:51:55 +00:00
}
} , 3e3 ) ;
} else {
devtoolsNotInstalled = true ;
buffer = [ ] ;
}
2023-07-24 03:13:08 +00:00
}
function devtoolsInitApp ( app , version ) {
2023-09-06 01:51:55 +00:00
emit$1 ( "app:init" /* APP_INIT */ , app , version , {
Fragment ,
Text ,
Comment ,
Static
} ) ;
2023-07-24 03:13:08 +00:00
}
function devtoolsUnmountApp ( app ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
const devtoolsComponentRemoved = ( component ) => {
2023-09-06 01:51:55 +00:00
if ( devtools && typeof devtools . cleanupBuffer === "function" && // remove the component if it wasn't buffered
! devtools . cleanupBuffer ( component ) ) {
_devtoolsComponentRemoved ( component ) ;
}
2023-07-24 03:13:08 +00:00
} ;
function createDevtoolsComponentHook ( hook ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
function createDevtoolsPerformanceHook ( hook ) {
2023-09-06 01:51:55 +00:00
return ( component , type , time ) => {
emit$1 ( hook , component . appContext . app , component . uid , component , type , time ) ;
} ;
2023-07-24 03:13:08 +00:00
}
function devtoolsComponentEmit ( component , event , params ) {
2023-09-06 01:51:55 +00:00
emit$1 (
"component:emit" /* COMPONENT_EMIT */ ,
component . appContext . app ,
component ,
event ,
params
) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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
) ;
}
}
function normalizeEmitsOptions ( comp , appContext , asMixin = false ) {
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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( comp . extends ) {
extendEmits ( comp . extends ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( comp . mixins ) {
comp . mixins . forEach ( extendEmits ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
if ( ! raw && ! hasExtends ) {
2023-07-24 03:13:08 +00:00
if ( isObject ( comp ) ) {
2023-09-06 01:51:55 +00:00
cache . set ( comp , null ) ;
}
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 03:13:08 +00:00
}
function isEmitListener ( options , key ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
let currentRenderingInstance = null ;
let currentScopeId = null ;
2023-09-06 01:51:55 +00:00
function setCurrentRenderingInstance$1 ( instance ) {
const prev = currentRenderingInstance ;
currentRenderingInstance = instance ;
currentScopeId = instance && instance . type . _ _scopeId || null ;
return prev ;
}
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$1 ( ctx ) ;
let res ;
try {
res = fn ( ... args ) ;
} finally {
setCurrentRenderingInstance$1 ( prevInstance ) ;
if ( renderFnWithContext . _d ) {
setBlockTracking ( 1 ) ;
}
}
{
devtoolsComponentUpdated ( ctx ) ;
}
return res ;
} ;
renderFnWithContext . _n = true ;
renderFnWithContext . _c = true ;
renderFnWithContext . _d = true ;
return renderFnWithContext ;
2023-07-24 03:13:08 +00:00
}
let accessedAttrs = false ;
function markAttrsAccessed ( ) {
2023-09-06 01:51:55 +00:00
accessedAttrs = true ;
}
function renderComponentRoot$1 ( instance ) {
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$1 ( instance ) ;
{
accessedAttrs = false ;
}
try {
if ( vnode . shapeFlag & 4 ) {
const proxyToUse = withProxy || proxy ;
result = normalizeVNode$1 (
render . call (
proxyToUse ,
proxyToUse ,
renderCache ,
props ,
setupState ,
data ,
ctx
)
) ;
fallthroughAttrs = attrs ;
} else {
const render2 = Component ;
if ( attrs === props ) {
markAttrsAccessed ( ) ;
}
result = normalizeVNode$1 (
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 ) {
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$1 ( prev ) ;
return result ;
2023-07-24 03:13:08 +00:00
}
const getChildRoot = ( vnode ) => {
2023-09-06 01:51:55 +00: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$1 ( childRoot ) , setRoot ] ;
2023-07-24 03:13:08 +00:00
} ;
function filterSingleRoot ( children ) {
2023-09-06 01:51:55 +00:00
let singleRoot ;
for ( let i = 0 ; i < children . length ; i ++ ) {
const child = children [ i ] ;
if ( isVNode$2 ( child ) ) {
if ( child . type !== Comment || child . children === "v-if" ) {
if ( singleRoot ) {
return ;
} else {
singleRoot = child ;
}
}
} else {
return ;
}
}
return singleRoot ;
2023-07-24 03:13:08 +00:00
}
const getFunctionalFallthrough = ( attrs ) => {
2023-09-06 01:51:55 +00:00
let res ;
for ( const key in attrs ) {
if ( key === "class" || key === "style" || isOn ( key ) ) {
( res || ( res = { } ) ) [ key ] = attrs [ key ] ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
return res ;
2023-07-24 03:13:08 +00:00
} ;
const filterModelListeners = ( attrs , props ) => {
2023-09-06 01:51:55 +00:00
const res = { } ;
for ( const key in attrs ) {
if ( ! isModelListener ( key ) || ! ( key . slice ( 9 ) in props ) ) {
res [ key ] = attrs [ key ] ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
return res ;
2023-07-24 03:13:08 +00:00
} ;
const isElementRoot = ( vnode ) => {
2023-09-06 01:51:55 +00:00
return vnode . shapeFlag & ( 6 | 1 ) || vnode . type === Comment ;
2023-07-24 03:13:08 +00:00
} ;
function shouldUpdateComponent ( prevVNode , nextVNode , optimized ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
return true ;
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( prevProps === nextProps ) {
return false ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( ! prevProps ) {
return ! ! nextProps ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( ! nextProps ) {
return true ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
return hasPropsChanged ( prevProps , nextProps , emits ) ;
}
return false ;
2023-07-24 03:13:08 +00:00
}
function hasPropsChanged ( prevProps , nextProps , emitsOptions ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
return false ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
function updateHOCHostEl ( { vnode , parent } , el ) {
while ( parent && parent . subTree === vnode ) {
( vnode = parent . vnode ) . el = el ;
parent = parent . parent ;
}
2023-07-24 03:13:08 +00:00
}
const isSuspense = ( type ) => type . _ _isSuspense ;
function queueEffectWithSuspense ( fn , suspense ) {
2023-09-06 01:51:55 +00:00
if ( suspense && suspense . pendingBranch ) {
if ( isArray ( fn ) ) {
suspense . effects . push ( ... fn ) ;
} else {
suspense . effects . push ( fn ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
} else {
queuePostFlushCb ( fn ) ;
}
2023-07-24 03:13:08 +00:00
}
const INITIAL _WATCHER _VALUE = { } ;
function watch ( source , cb , options ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function doWatch ( source , cb , { immediate , deep , flush , onTrack , onTrigger } = EMPTY _OBJ ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
} ;
2023-09-06 01:51:55 +00:00
} ;
let ssrCleanup ;
if ( isInSSRComponentSetup ) {
onCleanup = NOOP ;
if ( ! cb ) {
getter ( ) ;
} else if ( immediate ) {
callWithAsyncErrorHandling ( cb , instance , 3 , [
getter ( ) ,
isMultiSource ? [ ] : void 0 ,
onCleanup
] ) ;
}
if ( flush === "sync" ) {
const ctx = useSSRContext ( ) ;
ssrCleanup = ctx . _ _watcherHandles || ( ctx . _ _watcherHandles = [ ] ) ;
} else {
return NOOP ;
}
}
let oldValue = isMultiSource ? new Array ( source . length ) . fill ( INITIAL _WATCHER _VALUE ) : INITIAL _WATCHER _VALUE ;
const job = ( ) => {
if ( ! effect . active ) {
return ;
2023-07-24 03:13:08 +00:00
}
if ( cb ) {
2023-09-06 01:51:55 +00:00
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 ) ;
}
} ;
if ( ssrCleanup )
ssrCleanup . push ( unwatch ) ;
return unwatch ;
2023-07-24 03:13:08 +00:00
}
function instanceWatch ( source , value , options ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function createPathGetter ( ctx , path ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function traverse ( value , seen ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
return value ;
}
function validateDirectiveName ( name ) {
if ( isBuiltInDirective ( name ) ) {
warn ( "Do not use built-in directive ids as custom directive id: " + name ) ;
}
}
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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
}
const isAsyncWrapper = ( i ) => ! ! i . type . _ _asyncLoader ;
const isKeepAlive = ( vnode ) => vnode . type . _ _isKeepAlive ;
function onActivated ( hook , target ) {
2023-09-06 01:51:55 +00:00
registerKeepAliveHook ( hook , "a" , target ) ;
2023-07-24 03:13:08 +00:00
}
function onDeactivated ( hook , target ) {
2023-09-06 01:51:55 +00:00
registerKeepAliveHook ( hook , "da" , target ) ;
2023-07-24 03:13:08 +00:00
}
function registerKeepAliveHook ( hook , type , target = currentInstance ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function injectToKeepAliveRoot ( hook , type , target , keepAliveRoot ) {
2023-09-06 01:51:55 +00:00
const injected = injectHook (
type ,
hook ,
keepAliveRoot ,
true
/* prepend */
) ;
onUnmounted ( ( ) => {
remove ( keepAliveRoot [ type ] , injected ) ;
} , target ) ;
2023-07-24 03:13:08 +00:00
}
function injectHook ( type , hook , target = currentInstance , prepend = false ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
function onErrorCaptured ( hook , target = currentInstance ) {
2023-09-06 01:51:55 +00:00
injectHook ( "ec" , hook , target ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const NULL _DYNAMIC _COMPONENT = Symbol . for ( "v-ndc" ) ;
2023-07-24 03:13:08 +00:00
2023-09-06 01:51:55 +00:00
const getPublicInstance = ( i ) => {
if ( ! i )
return null ;
if ( isStatefulComponent ( i ) )
return getExposeProxy ( i ) || i . proxy ;
return getPublicInstance ( i . parent ) ;
} ;
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 === "$" ;
const hasSetupBinding = ( state , key ) => state !== EMPTY _OBJ && ! state . _ _isScriptSetup && hasOwn ( state , key ) ;
const PublicInstanceProxyHandlers = {
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 */ :
return ctx [ key ] ;
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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 ) ;
}
} ;
{
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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
function createDevRenderContext ( instance ) {
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 ,
configurable : true ,
get : ( ) => instance . props [ key ] ,
set : NOOP
} ) ;
} ) ;
}
}
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
} ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
} ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
function normalizePropsOrEmits ( props ) {
return isArray ( props ) ? props . reduce (
( normalized , p ) => ( normalized [ p ] = null , normalized ) ,
{ }
) : props ;
}
2023-07-24 03:13:08 +00:00
function createDuplicateChecker ( ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
let shouldCacheAccess = true ;
function applyOptions ( instance ) {
2023-09-06 01:51:55 +00:00
const options = resolveMergedOptions ( instance ) ;
const publicThis = instance . proxy ;
const ctx = instance . ctx ;
shouldCacheAccess = false ;
if ( options . beforeCreate ) {
callHook ( options . beforeCreate , instance , "bc" ) ;
}
const {
2023-07-24 03:13:08 +00:00
// state
2023-09-06 01:51:55 +00:00
data : dataOptions ,
computed : computedOptions ,
methods ,
watch : watchOptions ,
provide : provideOptions ,
inject : injectOptions ,
2023-07-24 03:13:08 +00:00
// lifecycle
2023-09-06 01:51:55 +00:00
created ,
beforeMount ,
mounted ,
beforeUpdate ,
updated ,
activated ,
deactivated ,
beforeDestroy ,
beforeUnmount ,
destroyed ,
unmounted ,
render ,
renderTracked ,
renderTriggered ,
errorCaptured ,
serverPrefetch ,
2023-07-24 03:13:08 +00:00
// public API
2023-09-06 01:51:55 +00:00
expose ,
inheritAttrs ,
2023-07-24 03:13:08 +00:00
// assets
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
{
checkDuplicateProperties ( "Methods" /* METHODS */ , key ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
Object . defineProperty ( ctx , key , {
2023-09-06 01:51:55 +00:00
configurable : true ,
enumerable : true ,
get : ( ) => data [ key ] ,
set : NOOP
2023-07-24 03:13:08 +00:00
} ) ;
2023-09-06 01:51:55 +00: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 ( 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 03:13:08 +00:00
} ) ;
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
{
checkDuplicateProperties ( "Inject" /* INJECT */ , key ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
}
function callHook ( hook , instance , type ) {
2023-09-06 01:51:55 +00:00
callWithAsyncErrorHandling (
isArray ( hook ) ? hook . map ( ( h ) => h . bind ( instance . proxy ) ) : hook . bind ( instance . proxy ) ,
instance ,
type
) ;
2023-07-24 03:13:08 +00:00
}
function createWatcher ( raw , ctx , publicThis , key ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function resolveMergedOptions ( instance ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function mergeOptions ( to , from , strats , asMixin = false ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
const internalOptionMergeStrats = {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
} ;
function mergeDataFn ( to , from ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function mergeInject ( to , from ) {
2023-09-06 01:51:55 +00:00
return mergeObjectOptions ( normalizeInject ( to ) , normalizeInject ( from ) ) ;
2023-07-24 03:13:08 +00:00
}
function normalizeInject ( raw ) {
2023-09-06 01:51:55 +00:00
if ( isArray ( raw ) ) {
const res = { } ;
for ( let i = 0 ; i < raw . length ; i ++ ) {
res [ raw [ i ] ] = raw [ i ] ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
return res ;
}
return raw ;
2023-07-24 03:13:08 +00:00
}
function mergeAsArray ( to , from ) {
2023-09-06 01:51:55 +00:00
return to ? [ ... new Set ( [ ] . concat ( to , from ) ) ] : from ;
2023-07-24 03:13:08 +00:00
}
function mergeObjectOptions ( to , from ) {
2023-09-06 01:51:55 +00:00
return to ? extend ( /* @__PURE__ */ Object . create ( null ) , to , from ) : from ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
function mergeEmitsOrPropsOptions ( to , from ) {
if ( to ) {
if ( isArray ( to ) && isArray ( from ) ) {
return [ ... /* @__PURE__ */ new Set ( [ ... to , ... from ] ) ] ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( rootProps != null && ! isObject ( rootProps ) ) {
warn ( ` root props passed to app.mount() must be an object. ` ) ;
rootProps = null ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 ) ;
}
if ( ! component ) {
return context . components [ name ] ;
}
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 ] ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
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 ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
} ;
return app ;
} ;
}
let currentApp = null ;
function provide ( key , value ) {
if ( ! currentInstance ) {
{
warn ( ` provide() can only be used inside setup(). ` ) ;
}
} else {
let provides = currentInstance . provides ;
const parentProvides = currentInstance . parent && currentInstance . parent . provides ;
if ( parentProvides === provides ) {
provides = currentInstance . provides = Object . create ( parentProvides ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
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 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 03:13:08 +00:00
}
function isInHmrContext ( instance ) {
2023-09-06 01:51:55 +00:00
while ( instance ) {
if ( instance . type . _ _hmrId )
return true ;
instance = instance . parent ;
}
2023-07-24 03:13:08 +00:00
}
function updateProps ( instance , rawProps , rawPrevProps , optimized ) {
2023-09-06 01:51:55 +00:00
const {
props ,
attrs ,
vnode : { patchFlag }
} = instance ;
const rawCurrentProps = toRaw ( props ) ;
const [ options ] = instance . propsOptions ;
let hasAttrsChanged = false ;
if (
2023-07-24 03:13:08 +00: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 01:51:55 +00: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 03:13:08 +00:00
hasAttrsChanged = true ;
2023-09-06 01:51:55 +00: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 ] ;
}
}
}
if ( attrs !== rawCurrentProps ) {
for ( const key in attrs ) {
if ( ! rawProps || ! hasOwn ( rawProps , key ) && true ) {
delete attrs [ key ] ;
hasAttrsChanged = true ;
}
}
}
}
if ( hasAttrsChanged ) {
trigger ( instance , "set" , "$attrs" ) ;
}
{
validateProps ( rawProps || { } , props , instance ) ;
}
2023-07-24 03:13:08 +00:00
}
function setFullProps ( instance , rawProps , props , attrs ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function resolvePropValue ( options , props , key , value , instance , isAbsent ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function normalizePropsOptions ( comp , appContext , asMixin = false ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( comp . extends ) {
extendProps ( comp . extends ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( comp . mixins ) {
comp . mixins . forEach ( extendProps ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
if ( ! raw && ! hasExtends ) {
2023-07-24 03:13:08 +00:00
if ( isObject ( comp ) ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function validatePropName ( key ) {
2023-09-06 01:51:55 +00:00
if ( key [ 0 ] !== "$" ) {
return true ;
} else {
warn ( ` Invalid prop name: " ${ key } " is a reserved property. ` ) ;
}
return false ;
2023-07-24 03:13:08 +00:00
}
function getType ( ctor ) {
2023-09-06 01:51:55 +00:00
const match = ctor && ctor . toString ( ) . match ( /^\s*(function|class) (\w+)/ ) ;
return match ? match [ 2 ] : ctor === null ? "null" : "" ;
2023-07-24 03:13:08 +00:00
}
function isSameType ( a , b ) {
2023-09-06 01:51:55 +00:00
return getType ( a ) === getType ( b ) ;
2023-07-24 03:13:08 +00:00
}
function getTypeIndex ( type , expectedTypes ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function validateProps ( rawProps , props , instance ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
function assertType ( value , type ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function getInvalidTypeMessage ( name , value , expectedTypes ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
function styleValue ( value , type ) {
2023-09-06 01:51:55 +00:00
if ( type === "String" ) {
return ` " ${ value } " ` ;
} else if ( type === "Number" ) {
return ` ${ Number ( value ) } ` ;
} else {
return ` ${ value } ` ;
}
2023-07-24 03:13:08 +00:00
}
function isExplicable ( type ) {
2023-09-06 01:51:55 +00:00
const explicitTypes = [ "string" , "number" , "boolean" ] ;
return explicitTypes . some ( ( elem ) => type . toLowerCase ( ) === elem ) ;
2023-07-24 03:13:08 +00:00
}
function isBoolean ( ... args ) {
2023-09-06 01:51:55 +00:00
return args . some ( ( elem ) => elem . toLowerCase ( ) === "boolean" ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const isInternalKey = ( key ) => key [ 0 ] === "_" || key === "$stable" ;
const normalizeSlotValue = ( value ) => isArray ( value ) ? value . map ( normalizeVNode$1 ) : [ normalizeVNode$1 ( value ) ] ;
2023-07-24 03:13:08 +00:00
const normalizeSlot = ( key , rawSlot , ctx ) => {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
} ;
const normalizeObjectSlots = ( rawSlots , slots , instance ) => {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
} ;
const normalizeVNodeSlots = ( instance , children ) => {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
} ;
const initSlots = ( instance , children ) => {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
} else {
instance . slots = { } ;
if ( children ) {
normalizeVNodeSlots ( instance , children ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
def ( instance . slots , InternalObjectKey , 1 ) ;
2023-07-24 03:13:08 +00:00
} ;
const updateSlots = ( instance , children , optimized ) => {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
} ;
function setRef ( rawRef , oldRawRef , parentSuspense , vnode , isUnmount = false ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
let supported ;
let perf ;
function startMeasure ( instance , type ) {
2023-09-06 01:51:55 +00:00
if ( instance . appContext . config . performance && isSupported ( ) ) {
perf . mark ( ` vue- ${ type } - ${ instance . uid } ` ) ;
}
{
devtoolsPerfStart ( instance , type , isSupported ( ) ? perf . now ( ) : Date . now ( ) ) ;
}
2023-07-24 03:13:08 +00:00
}
function endMeasure ( instance , type ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function isSupported ( ) {
2023-09-06 01:51:55 +00:00
if ( supported !== void 0 ) {
2023-07-24 03:13:08 +00:00
return supported ;
2023-09-06 01:51:55 +00:00
}
if ( typeof window !== "undefined" && window . performance ) {
supported = true ;
perf = window . performance ;
} else {
supported = false ;
}
return supported ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const queuePostRenderEffect = queueEffectWithSuspense ;
2023-07-24 03:13:08 +00:00
function createRenderer ( options ) {
2023-09-06 01:51:55 +00:00
return baseCreateRenderer ( options ) ;
2023-07-24 03:13:08 +00:00
}
function baseCreateRenderer ( options , createHydrationFns ) {
2023-09-06 01:51:55 +00: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 :
if ( n1 == null ) {
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 ) ;
}
}
2023-07-24 03:13:08 +00:00
{
2023-09-06 01:51:55 +00:00
Object . defineProperty ( el , "__vnode" , {
value : vnode ,
enumerable : false
} ) ;
Object . defineProperty ( el , "__vueParentComponent" , {
value : parentComponent ,
enumerable : false
} ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
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$1 ( 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$1 (
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$1 ( 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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
updateComponentPreRender ( instance , n2 , optimized ) ;
{
popWarningContext ( ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
let vnodeHook ;
2023-09-06 01:51:55 +00:00
const { el , props } = initialVNode ;
const { bm , m , parent } = instance ;
const isAsyncWrapperVNode = isAsyncWrapper ( initialVNode ) ;
toggleRecurse ( instance , false ) ;
if ( bm ) {
invokeArrayFns ( bm ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( ! isAsyncWrapperVNode && ( vnodeHook = props && props . onVnodeBeforeMount ) ) {
invokeVNodeHook ( vnodeHook , parent , initialVNode ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
toggleRecurse ( instance , true ) ;
if ( el && hydrateNode ) {
const hydrateSubTree = ( ) => {
{
startMeasure ( instance , ` render ` ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
instance . subTree = renderComponentRoot$1 ( instance ) ;
{
endMeasure ( instance , ` render ` ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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$1 ( 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 03:13:08 +00:00
{
2023-09-06 01:51:55 +00:00
devtoolsComponentAdded ( instance ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
initialVNode = container = anchor = null ;
} else {
let { next , bu , u , parent , vnode } = instance ;
let originNext = next ;
2023-07-24 03:13:08 +00:00
let vnodeHook ;
2023-09-06 01:51:55 +00:00
{
pushWarningContext ( next || instance . vnode ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
toggleRecurse ( instance , false ) ;
if ( next ) {
next . el = vnode . el ;
updateComponentPreRender ( instance , next , optimized ) ;
} else {
next = vnode ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( bu ) {
invokeArrayFns ( bu ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( vnodeHook = next . props && next . props . onVnodeBeforeUpdate ) {
invokeVNodeHook ( vnodeHook , parent , next , vnode ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
toggleRecurse ( instance , true ) ;
2023-07-24 03:13:08 +00:00
{
2023-09-06 01:51:55 +00:00
startMeasure ( instance , ` render ` ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const nextTree = renderComponentRoot$1 ( instance ) ;
2023-07-24 03:13:08 +00:00
{
2023-09-06 01:51:55 +00:00
endMeasure ( instance , ` render ` ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const prevTree = instance . subTree ;
instance . subTree = nextTree ;
2023-07-24 03:13:08 +00:00
{
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
{
2023-09-06 01:51:55 +00:00
endMeasure ( instance , ` patch ` ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
next . el = nextTree . el ;
if ( originNext === null ) {
updateHOCHostEl ( instance , nextTree . el ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( u ) {
queuePostRenderEffect ( u , parentSuspense ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( vnodeHook = next . props && next . props . onVnodeUpdated ) {
queuePostRenderEffect (
( ) => invokeVNodeHook ( vnodeHook , parent , next , vnode ) ,
parentSuspense
) ;
2023-07-24 03:13:08 +00:00
}
{
2023-09-06 01:51:55 +00:00
devtoolsComponentUpdated ( instance ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
{
popWarningContext ( ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
} ;
2023-09-06 01:51:55 +00: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$1 ( c2 [ i ] ) ;
patch (
c1 [ i ] ,
nextChild ,
container ,
null ,
parentComponent ,
parentSuspense ,
isSVG ,
slotScopeIds ,
optimized
) ;
}
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$1 ( 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$1 ( 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$1 ( 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$1 ( 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 03:13:08 +00:00
} ;
2023-09-06 01:51:55 +00: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 ( ) ;
}
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
{
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 03:13:08 +00:00
}
function toggleRecurse ( { effect , update } , allowed ) {
2023-09-06 01:51:55 +00:00
effect . allowRecurse = update . allowRecurse = allowed ;
}
2023-07-24 03:13:08 +00:00
function traverseStaticChildren ( n1 , n2 , shallow = false ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function getSequence ( arr ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
const isTeleport = ( type ) => type . _ _isTeleport ;
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
let currentBlock = null ;
let isBlockTreeEnabled = 1 ;
function setBlockTracking ( value ) {
2023-09-06 01:51:55 +00:00
isBlockTreeEnabled += value ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
function isVNode$2 ( value ) {
return value ? value . _ _v _isVNode === true : false ;
2023-07-24 03:13:08 +00:00
}
function isSameVNodeType ( n1 , n2 ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
const createVNodeWithArgsTransform = ( ... args ) => {
2023-09-06 01:51:55 +00:00
return _createVNode (
... args
) ;
2023-07-24 03:13:08 +00:00
} ;
const InternalObjectKey = ` __vInternal ` ;
const normalizeKey = ( { key } ) => key != null ? key : null ;
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
} ;
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
function _createVNode ( type , props = null , children = null , patchFlag = 0 , dynamicProps = null , isBlockNode = false ) {
2023-09-06 01:51:55 +00:00
if ( ! type || type === NULL _DYNAMIC _COMPONENT ) {
if ( ! type ) {
warn ( ` Invalid vnode type when creating vnode: ${ type } . ` ) ;
}
type = Comment ;
}
if ( isVNode$2 ( type ) ) {
const cloned = cloneVNode (
type ,
props ,
true
/* mergeRef: true */
) ;
if ( children ) {
normalizeChildren ( cloned , children ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( isBlockTreeEnabled > 0 && ! isBlockNode && currentBlock ) {
if ( cloned . shapeFlag & 6 ) {
currentBlock [ currentBlock . indexOf ( type ) ] = cloned ;
} else {
currentBlock . push ( cloned ) ;
}
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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
) ;
}
function guardReactiveProps ( props ) {
if ( ! props )
return null ;
return isProxy ( props ) || InternalObjectKey in props ? extend ( { } , props ) : props ;
}
function cloneVNode ( vnode , extraProps , mergeRef = false ) {
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 ;
}
function deepCloneVNode ( vnode ) {
const cloned = cloneVNode ( vnode ) ;
if ( isArray ( vnode . children ) ) {
cloned . children = vnode . children . map ( deepCloneVNode ) ;
}
return cloned ;
}
function createTextVNode ( text = " " , flag = 0 ) {
return createVNode ( Text , null , text , flag ) ;
}
function normalizeVNode$1 ( child ) {
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 03:13:08 +00:00
}
function cloneIfMounted ( child ) {
2023-09-06 01:51:55 +00:00
return child . el === null && child . patchFlag !== - 1 || child . memo ? child : cloneVNode ( child ) ;
2023-07-24 03:13:08 +00:00
}
function normalizeChildren ( vnode , children ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function mergeProps ( ... args ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function invokeVNodeHook ( hook , instance , vnode , prevVNode = null ) {
2023-09-06 01:51:55 +00:00
callWithAsyncErrorHandling ( hook , instance , 7 , [
vnode ,
prevVNode
] ) ;
2023-07-24 03:13:08 +00:00
}
const emptyAppContext = createAppContext ( ) ;
2023-09-06 01:51:55 +00:00
let uid = 0 ;
function createComponentInstance$1 ( vnode , parent , suspense ) {
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 03:13:08 +00:00
}
let currentInstance = null ;
2023-09-06 01:51:55 +00:00
let internalSetCurrentInstance ;
let globalCurrentInstanceSetters ;
let settersKey = "__VUE_INSTANCE_SETTERS__" ;
{
if ( ! ( globalCurrentInstanceSetters = getGlobalThis ( ) [ settersKey ] ) ) {
globalCurrentInstanceSetters = getGlobalThis ( ) [ settersKey ] = [ ] ;
}
globalCurrentInstanceSetters . push ( ( i ) => currentInstance = i ) ;
internalSetCurrentInstance = ( instance ) => {
if ( globalCurrentInstanceSetters . length > 1 ) {
globalCurrentInstanceSetters . forEach ( ( s ) => s ( instance ) ) ;
} else {
globalCurrentInstanceSetters [ 0 ] ( instance ) ;
}
} ;
}
2023-07-24 03:13:08 +00:00
const setCurrentInstance = ( instance ) => {
2023-09-06 01:51:55 +00:00
internalSetCurrentInstance ( instance ) ;
instance . scope . on ( ) ;
2023-07-24 03:13:08 +00:00
} ;
const unsetCurrentInstance = ( ) => {
2023-09-06 01:51:55 +00:00
currentInstance && currentInstance . scope . off ( ) ;
internalSetCurrentInstance ( null ) ;
2023-07-24 03:13:08 +00:00
} ;
2023-09-06 01:51:55 +00:00
const isBuiltInTag = /* @__PURE__ */ makeMap ( "slot,component" ) ;
2023-07-24 03:13:08 +00:00
function validateComponentName ( name , config ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function isStatefulComponent ( instance ) {
2023-09-06 01:51:55 +00:00
return instance . vnode . shapeFlag & 4 ;
2023-07-24 03:13:08 +00:00
}
let isInSSRComponentSetup = false ;
2023-09-06 01:51:55 +00:00
function setupComponent$1 ( instance , isSSR = false ) {
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 03:13:08 +00:00
}
function setupStatefulComponent ( instance , isSSR ) {
2023-09-06 01:51:55 +00: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 {
finishComponentSetup ( instance , isSSR ) ;
}
2023-07-24 03:13:08 +00:00
}
function handleSetupResult ( instance , setupResult , isSSR ) {
2023-09-06 01:51:55 +00:00
if ( isFunction ( setupResult ) ) {
if ( instance . type . _ _ssrInlineRender ) {
instance . ssrRender = setupResult ;
} else {
instance . render = setupResult ;
}
} else if ( isObject ( setupResult ) ) {
if ( isVNode$2 ( setupResult ) ) {
warn (
` setup() should not return VNodes directly - return a render function instead. `
) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
{
instance . devtoolsRawSetupState = setupResult ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
instance . setupState = proxyRefs ( setupResult ) ;
{
exposeSetupStateOnRenderContext ( instance ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
} else if ( setupResult !== void 0 ) {
warn (
` setup() should return an object. Received: ${ setupResult === null ? "null" : typeof setupResult } `
) ;
}
finishComponentSetup ( instance , isSSR ) ;
2023-07-24 03:13:08 +00:00
}
let compile ;
const isRuntimeOnly = ( ) => ! compile ;
function finishComponentSetup ( instance , isSSR , skipOptions ) {
2023-09-06 01:51:55 +00:00
const Component = instance . type ;
if ( ! instance . render ) {
if ( ! isSSR && compile && ! Component . render ) {
const template = Component . template || resolveMergedOptions ( instance ) . template ;
if ( template ) {
{
startMeasure ( instance , ` compile ` ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const { isCustomElement , compilerOptions } = instance . appContext . config ;
const { delimiters , compilerOptions : componentCompilerOptions } = Component ;
const finalCompilerOptions = extend (
extend (
{
isCustomElement ,
delimiters
} ,
compilerOptions
) ,
componentCompilerOptions
) ;
Component . render = compile ( template , finalCompilerOptions ) ;
{
endMeasure ( instance , ` compile ` ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
instance . render = Component . render || NOOP ;
}
{
setCurrentInstance ( instance ) ;
pauseTracking ( ) ;
applyOptions ( instance ) ;
resetTracking ( ) ;
unsetCurrentInstance ( ) ;
}
if ( ! Component . render && instance . render === NOOP && ! isSSR ) {
if ( 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 ;
}
}
) ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
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 03:13:08 +00:00
}
function createSetupContext ( instance ) {
2023-09-06 01:51:55 +00:00
const expose = ( exposed ) => {
2023-07-24 03:13:08 +00:00
{
2023-09-06 01:51:55 +00:00
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
} ) ;
}
2023-07-24 03:13:08 +00:00
}
function getExposeProxy ( instance ) {
2023-09-06 01:51:55 +00:00
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 ;
}
} ) ) ;
}
2023-07-24 03:13:08 +00:00
}
const classifyRE = /(?:^|[-_])(\w)/g ;
2023-09-06 01:51:55 +00:00
const classify = ( str ) => str . replace ( classifyRE , ( c ) => c . toUpperCase ( ) ) . replace ( /[-_]/g , "" ) ;
2023-07-24 03:13:08 +00:00
function getComponentName ( Component , includeInferred = true ) {
2023-09-06 01:51:55 +00:00
return isFunction ( Component ) ? Component . displayName || Component . name : Component . name || includeInferred && Component . _ _name ;
2023-07-24 03:13:08 +00:00
}
function formatComponentName ( instance , Component , isRoot = false ) {
2023-09-06 01:51:55 +00:00
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 ` ;
2023-07-24 03:13:08 +00:00
}
function isClassComponent ( value ) {
2023-09-06 01:51:55 +00:00
return isFunction ( value ) && "__vccOpts" in value ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const computed = ( getterOrOptions , debugOptions ) => {
return computed$1 ( getterOrOptions , debugOptions , isInSSRComponentSetup ) ;
} ;
2023-07-24 03:13:08 +00:00
2023-09-06 01:51:55 +00:00
const ssrContextKey = Symbol . for ( "v-scx" ) ;
2023-07-24 03:13:08 +00:00
const useSSRContext = ( ) => {
2023-09-06 01:51:55 +00:00
{
const ctx = inject ( ssrContextKey ) ;
if ( ! ctx ) {
warn (
` Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build. `
) ;
}
return ctx ;
}
2023-07-24 03:13:08 +00:00
} ;
2023-09-06 01:51:55 +00:00
const version = "3.3.4" ;
2023-07-24 03:13:08 +00:00
const _ssrUtils = {
2023-09-06 01:51:55 +00:00
createComponentInstance : createComponentInstance$1 ,
setupComponent : setupComponent$1 ,
renderComponentRoot : renderComponentRoot$1 ,
setCurrentRenderingInstance : setCurrentRenderingInstance$1 ,
isVNode : isVNode$2 ,
normalizeVNode : normalizeVNode$1
2023-07-24 03:13:08 +00:00
} ;
2023-09-06 01:51:55 +00:00
const ssrUtils = _ssrUtils ;
2023-07-24 03:13:08 +00:00
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
const nodeOps = {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
return [
// first
before ? before . nextSibling : parent . firstChild ,
// last
anchor ? anchor . previousSibling : parent . lastChild
] ;
}
2023-07-24 03:13:08 +00:00
} ;
function patchClass ( el , value , isSVG ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function patchStyle ( el , prev , next ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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" ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( "_vod" in el ) {
style . display = currentDisplay ;
}
}
2023-07-24 03:13:08 +00:00
}
const semicolonRE = /[^\\];\s*$/ ;
const importantRE = /\s*!important$/ ;
function setStyle ( style , name , val ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const prefixes = [ "Webkit" , "Moz" , "ms" ] ;
2023-07-24 03:13:08 +00:00
const prefixCache = { } ;
function autoPrefix ( style , rawName ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const xlinkNS = "http://www.w3.org/1999/xlink" ;
2023-07-24 03:13:08 +00:00
function patchAttr ( el , key , value , isSVG , instance ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
} else {
const isBoolean = isSpecialBooleanAttr ( key ) ;
if ( value == null || isBoolean && ! includeBooleanAttr ( value ) ) {
el . removeAttribute ( key ) ;
} else {
el . setAttribute ( key , isBoolean ? "" : value ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function addEventListener ( el , event , handler , options ) {
2023-09-06 01:51:55 +00:00
el . addEventListener ( event , handler , options ) ;
2023-07-24 03:13:08 +00:00
}
function removeEventListener ( el , event , handler , options ) {
2023-09-06 01:51:55 +00:00
el . removeEventListener ( event , handler , options ) ;
2023-07-24 03:13:08 +00:00
}
function patchEvent ( el , rawName , prevValue , nextValue , instance = null ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
const optionsModifierRE = /(?:Once|Passive|Capture)$/ ;
function parseName ( name ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
let cachedNow = 0 ;
2023-09-06 01:51:55 +00:00
const p = /* @__PURE__ */ Promise . resolve ( ) ;
const getNow = ( ) => cachedNow || ( p . then ( ( ) => cachedNow = 0 ) , cachedNow = Date . now ( ) ) ;
2023-07-24 03:13:08 +00:00
function createInvoker ( initialValue , instance ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
function patchStopImmediatePropagation ( e , value ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
const nativeOnRE = /^on[a-z]/ ;
const patchProp = ( el , key , prevValue , nextValue , isSVG = false , prevChildren , parentComponent , parentSuspense , unmountChildren ) => {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
} ;
function shouldSetAsProp ( el , key , value , isSVG ) {
2023-09-06 01:51:55 +00:00
if ( isSVG ) {
if ( key === "innerHTML" || key === "textContent" ) {
return true ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
if ( key in el && nativeOnRE . test ( key ) && isFunction ( value ) ) {
return true ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 ;
}
const getModelAssigner = ( vnode ) => {
const fn = vnode . props [ "onUpdate:modelValue" ] || false ;
return isArray ( fn ) ? ( value ) => invokeArrayFns ( fn , value ) : fn ;
} ;
function onCompositionStart ( e ) {
e . target . composing = true ;
}
function onCompositionEnd ( e ) {
const target = e . target ;
if ( target . composing ) {
target . composing = false ;
target . dispatchEvent ( new Event ( "input" ) ) ;
}
}
const vModelText = {
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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const newValue = value == null ? "" : value ;
if ( el . value !== newValue ) {
el . value = newValue ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
} ;
function initVModelForSSR ( ) {
vModelText . getSSRProps = ( { value } ) => ( { value } ) ;
}
const vShow = {
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 ) ;
}
} ;
function setDisplay ( el , value ) {
el . style . display = value ? el . _vod : "none" ;
}
function initVShowForSSR ( ) {
vShow . getSSRProps = ( { value } ) => {
if ( ! value ) {
return { style : { display : "none" } } ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
} ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const rendererOptions = /* @__PURE__ */ extend ( { patchProp } , nodeOps ) ;
2023-07-24 03:13:08 +00:00
let renderer ;
function ensureRenderer ( ) {
2023-09-06 01:51:55 +00:00
return renderer || ( renderer = createRenderer ( rendererOptions ) ) ;
}
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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
return proxy ;
} ;
return app ;
} ;
2023-07-24 03:13:08 +00:00
function injectNativeTagCheck ( app ) {
2023-09-06 01:51:55 +00:00
Object . defineProperty ( app . config , "isNativeTag" , {
value : ( tag ) => isHTMLTag ( tag ) || isSVGTag ( tag ) ,
writable : false
} ) ;
2023-07-24 03:13:08 +00:00
}
function injectCompilerOptionsCheck ( app ) {
2023-09-06 01:51:55 +00:00
{
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 03:13:08 +00:00
}
function normalizeContainer ( container ) {
2023-09-06 01:51:55 +00: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 03:13:08 +00:00
}
2023-09-06 01:51:55 +00: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 ;
}
let ssrDirectiveInitialized = false ;
const initDirectivesForSSR = ( ) => {
if ( ! ssrDirectiveInitialized ) {
ssrDirectiveInitialized = true ;
initVModelForSSR ( ) ;
initVShowForSSR ( ) ;
}
} ;
2023-07-24 03:13:08 +00:00
2023-09-06 01:51:55 +00:00
const shouldIgnoreProp = makeMap (
` ,key,ref,innerHTML,textContent,ref_key,ref_for `
) ;
2023-07-24 03:13:08 +00:00
function ssrRenderAttrs ( props , tag ) {
2023-09-06 01:51:55 +00:00
let ret = "" ;
for ( const key in props ) {
if ( shouldIgnoreProp ( key ) || isOn ( key ) || tag === "textarea" && key === "value" ) {
continue ;
}
const value = props [ key ] ;
if ( key === "class" ) {
ret += ` class=" ${ ssrRenderClass ( value ) } " ` ;
} else if ( key === "style" ) {
ret += ` style=" ${ ssrRenderStyle ( value ) } " ` ;
} else {
ret += ssrRenderDynamicAttr ( key , value , tag ) ;
}
}
return ret ;
2023-07-24 03:13:08 +00:00
}
function ssrRenderDynamicAttr ( key , value , tag ) {
2023-09-06 01:51:55 +00:00
if ( ! isRenderableValue ( value ) ) {
return ` ` ;
}
const attrKey = tag && ( tag . indexOf ( "-" ) > 0 || isSVGTag ( tag ) ) ? key : propsToAttrMap [ key ] || key . toLowerCase ( ) ;
if ( isBooleanAttr ( attrKey ) ) {
return includeBooleanAttr ( value ) ? ` ${ attrKey } ` : ` ` ;
} else if ( isSSRSafeAttrName ( attrKey ) ) {
return value === "" ? ` ${ attrKey } ` : ` ${ attrKey } =" ${ escapeHtml ( value ) } " ` ;
} else {
console . warn (
` [@vue/server-renderer] Skipped rendering unsafe attribute name: ${ attrKey } `
) ;
return ` ` ;
}
2023-07-24 03:13:08 +00:00
}
function ssrRenderAttr ( key , value ) {
2023-09-06 01:51:55 +00:00
if ( ! isRenderableValue ( value ) ) {
return ` ` ;
}
return ` ${ key } =" ${ escapeHtml ( value ) } " ` ;
2023-07-24 03:13:08 +00:00
}
function isRenderableValue ( value ) {
2023-09-06 01:51:55 +00:00
if ( value == null ) {
return false ;
}
const type = typeof value ;
return type === "string" || type === "number" || type === "boolean" ;
2023-07-24 03:13:08 +00:00
}
function ssrRenderClass ( raw ) {
2023-09-06 01:51:55 +00:00
return escapeHtml ( normalizeClass ( raw ) ) ;
2023-07-24 03:13:08 +00:00
}
function ssrRenderStyle ( raw ) {
2023-09-06 01:51:55 +00:00
if ( ! raw ) {
return "" ;
}
if ( isString ( raw ) ) {
return escapeHtml ( raw ) ;
}
const styles = normalizeStyle ( raw ) ;
return escapeHtml ( stringifyStyle ( styles ) ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
function ssrRenderComponent ( comp , props = null , children = null , parentComponent = null , slotScopeId ) {
return renderComponentVNode (
createVNode ( comp , props , children ) ,
parentComponent ,
slotScopeId
) ;
}
function ssrRenderSlot ( slots , slotName , slotProps , fallbackRenderFn , push , parentComponent , slotScopeId ) {
push ( ` <!--[--> ` ) ;
ssrRenderSlotInner (
slots ,
slotName ,
slotProps ,
fallbackRenderFn ,
push ,
parentComponent ,
slotScopeId
) ;
push ( ` <!--]--> ` ) ;
}
function ssrRenderSlotInner ( slots , slotName , slotProps , fallbackRenderFn , push , parentComponent , slotScopeId , transition ) {
const slotFn = slots [ slotName ] ;
if ( slotFn ) {
const slotBuffer = [ ] ;
const bufferedPush = ( item ) => {
slotBuffer . push ( item ) ;
} ;
const ret = slotFn (
slotProps ,
bufferedPush ,
parentComponent ,
slotScopeId ? " " + slotScopeId : ""
) ;
if ( isArray ( ret ) ) {
renderVNodeChildren ( push , ret , parentComponent , slotScopeId ) ;
} else {
let isEmptySlot = true ;
if ( transition ) {
isEmptySlot = false ;
} else {
for ( let i = 0 ; i < slotBuffer . length ; i ++ ) {
if ( ! isComment ( slotBuffer [ i ] ) ) {
isEmptySlot = false ;
break ;
}
}
}
if ( isEmptySlot ) {
if ( fallbackRenderFn ) {
fallbackRenderFn ( ) ;
}
} else {
for ( let i = 0 ; i < slotBuffer . length ; i ++ ) {
push ( slotBuffer [ i ] ) ;
}
}
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
} else if ( fallbackRenderFn ) {
fallbackRenderFn ( ) ;
}
}
const commentTestRE = / ^ < ! - - . * - - > $ / s ;
const commentRE = /<!--[^]*?-->/gm ;
function isComment ( item ) {
if ( typeof item !== "string" || ! commentTestRE . test ( item ) )
return false ;
if ( item . length <= 8 )
return true ;
return ! item . replace ( commentRE , "" ) . trim ( ) ;
2023-07-24 03:13:08 +00:00
}
function ssrRenderTeleport ( parentPush , contentRenderFn , target , disabled , parentComponent ) {
2023-09-06 01:51:55 +00:00
parentPush ( "<!--teleport start-->" ) ;
const context = parentComponent . appContext . provides [ ssrContextKey ] ;
const teleportBuffers = context . _ _teleportBuffers || ( context . _ _teleportBuffers = { } ) ;
const targetBuffer = teleportBuffers [ target ] || ( teleportBuffers [ target ] = [ ] ) ;
const bufferIndex = targetBuffer . length ;
let teleportContent ;
if ( disabled ) {
contentRenderFn ( parentPush ) ;
teleportContent = ` <!--teleport anchor--> ` ;
} else {
const { getBuffer , push } = createBuffer ( ) ;
contentRenderFn ( push ) ;
push ( ` <!--teleport anchor--> ` ) ;
teleportContent = getBuffer ( ) ;
}
targetBuffer . splice ( bufferIndex , 0 , teleportContent ) ;
parentPush ( "<!--teleport end-->" ) ;
}
function ssrInterpolate ( value ) {
return escapeHtml ( toDisplayString ( value ) ) ;
}
function ssrRenderList ( source , renderItem ) {
if ( isArray ( source ) || isString ( source ) ) {
for ( let i = 0 , l = source . length ; i < l ; i ++ ) {
renderItem ( source [ i ] , i ) ;
}
} else if ( typeof source === "number" ) {
if ( ! Number . isInteger ( source ) ) {
warn ( ` The v-for range expect an integer value but got ${ source } . ` ) ;
return ;
}
for ( let i = 0 ; i < source ; i ++ ) {
renderItem ( i + 1 , i ) ;
}
} else if ( isObject ( source ) ) {
if ( source [ Symbol . iterator ] ) {
const arr = Array . from ( source ) ;
for ( let i = 0 , l = arr . length ; i < l ; i ++ ) {
renderItem ( arr [ i ] , i ) ;
}
} else {
const keys = Object . keys ( source ) ;
for ( let i = 0 , l = keys . length ; i < l ; i ++ ) {
const key = keys [ i ] ;
renderItem ( source [ key ] , key , i ) ;
}
}
}
}
async function ssrRenderSuspense ( push , { default : renderContent } ) {
if ( renderContent ) {
renderContent ( ) ;
} else {
push ( ` <!----> ` ) ;
}
}
function ssrGetDirectiveProps ( instance , dir , value , arg , modifiers = { } ) {
if ( typeof dir !== "function" && dir . getSSRProps ) {
return dir . getSSRProps (
{
dir ,
instance ,
value ,
oldValue : void 0 ,
arg ,
modifiers
} ,
null
) || { } ;
}
return { } ;
}
const ssrLooseEqual = looseEqual ;
function ssrLooseContain ( arr , value ) {
return looseIndexOf ( arr , value ) > - 1 ;
}
function ssrRenderDynamicModel ( type , model , value ) {
switch ( type ) {
case "radio" :
return looseEqual ( model , value ) ? " checked" : "" ;
case "checkbox" :
return ( isArray ( model ) ? ssrLooseContain ( model , value ) : model ) ? " checked" : "" ;
default :
return ssrRenderAttr ( "value" , model ) ;
}
}
function ssrGetDynamicModelProps ( existingProps = { } , model ) {
const { type , value } = existingProps ;
switch ( type ) {
case "radio" :
return looseEqual ( model , value ) ? { checked : true } : null ;
case "checkbox" :
return ( isArray ( model ) ? ssrLooseContain ( model , value ) : model ) ? { checked : true } : null ;
default :
return { value : model } ;
}
}
function ssrCompile ( template , instance ) {
{
throw new Error (
` On-the-fly template compilation is not supported in the ESM build of @vue/server-renderer. All templates must be pre-compiled into render functions. `
) ;
}
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const {
createComponentInstance ,
setCurrentRenderingInstance ,
setupComponent ,
renderComponentRoot ,
normalizeVNode
} = ssrUtils ;
2023-07-24 03:13:08 +00:00
function createBuffer ( ) {
2023-09-06 01:51:55 +00:00
let appendable = false ;
const buffer = [ ] ;
return {
getBuffer ( ) {
return buffer ;
} ,
push ( item ) {
const isStringItem = isString ( item ) ;
if ( appendable && isStringItem ) {
buffer [ buffer . length - 1 ] += item ;
} else {
buffer . push ( item ) ;
}
appendable = isStringItem ;
if ( isPromise ( item ) || isArray ( item ) && item . hasAsync ) {
buffer . hasAsync = true ;
}
}
} ;
2023-07-24 03:13:08 +00:00
}
function renderComponentVNode ( vnode , parentComponent = null , slotScopeId ) {
2023-09-06 01:51:55 +00:00
const instance = createComponentInstance ( vnode , parentComponent , null ) ;
const res = setupComponent (
instance ,
true
/* isSSR */
) ;
const hasAsyncSetup = isPromise ( res ) ;
const prefetches = instance . sp ;
if ( hasAsyncSetup || prefetches ) {
let p = hasAsyncSetup ? res : Promise . resolve ( ) ;
if ( prefetches ) {
p = p . then (
( ) => Promise . all ( prefetches . map ( ( prefetch ) => prefetch . call ( instance . proxy ) ) )
) . catch ( ( ) => {
} ) ;
}
return p . then ( ( ) => renderComponentSubTree ( instance , slotScopeId ) ) ;
} else {
return renderComponentSubTree ( instance , slotScopeId ) ;
}
2023-07-24 03:13:08 +00:00
}
function renderComponentSubTree ( instance , slotScopeId ) {
2023-09-06 01:51:55 +00:00
const comp = instance . type ;
const { getBuffer , push } = createBuffer ( ) ;
if ( isFunction ( comp ) ) {
let root = renderComponentRoot ( instance ) ;
if ( ! comp . props ) {
for ( const key in instance . attrs ) {
if ( key . startsWith ( ` data-v- ` ) ) {
( root . props || ( root . props = { } ) ) [ key ] = ` ` ;
}
}
}
renderVNode ( push , instance . subTree = root , instance , slotScopeId ) ;
} else {
if ( ( ! instance . render || instance . render === NOOP ) && ! instance . ssrRender && ! comp . ssrRender && isString ( comp . template ) ) {
comp . ssrRender = ssrCompile ( comp . template ) ;
}
for ( const e of instance . scope . effects ) {
if ( e . computed )
e . computed . _cacheable = true ;
}
const ssrRender = instance . ssrRender || comp . ssrRender ;
if ( ssrRender ) {
let attrs = instance . inheritAttrs !== false ? instance . attrs : void 0 ;
let hasCloned = false ;
let cur = instance ;
while ( true ) {
const scopeId = cur . vnode . scopeId ;
if ( scopeId ) {
if ( ! hasCloned ) {
attrs = { ... attrs } ;
hasCloned = true ;
}
attrs [ scopeId ] = "" ;
}
const parent = cur . parent ;
if ( parent && parent . subTree && parent . subTree === cur . vnode ) {
cur = parent ;
} else {
break ;
}
}
if ( slotScopeId ) {
if ( ! hasCloned )
attrs = { ... attrs } ;
attrs [ slotScopeId . trim ( ) ] = "" ;
}
const prev = setCurrentRenderingInstance ( instance ) ;
try {
ssrRender (
instance . proxy ,
push ,
instance ,
attrs ,
// compiler-optimized bindings
instance . props ,
instance . setupState ,
instance . data ,
instance . ctx
) ;
} finally {
setCurrentRenderingInstance ( prev ) ;
}
} else if ( instance . render && instance . render !== NOOP ) {
renderVNode (
push ,
instance . subTree = renderComponentRoot ( instance ) ,
instance ,
slotScopeId
) ;
} else {
const componentName = comp . name || comp . _ _file || ` <Anonymous> ` ;
warn ( ` Component ${ componentName } is missing template or render function. ` ) ;
push ( ` <!----> ` ) ;
}
}
return getBuffer ( ) ;
2023-07-24 03:13:08 +00:00
}
function renderVNode ( push , vnode , parentComponent , slotScopeId ) {
2023-09-06 01:51:55 +00:00
const { type , shapeFlag , children } = vnode ;
switch ( type ) {
case Text :
push ( escapeHtml ( children ) ) ;
break ;
case Comment :
push (
children ? ` <!-- ${ escapeHtmlComment ( children ) } --> ` : ` <!----> `
) ;
break ;
case Static :
push ( children ) ;
break ;
case Fragment :
if ( vnode . slotScopeIds ) {
slotScopeId = ( slotScopeId ? slotScopeId + " " : "" ) + vnode . slotScopeIds . join ( " " ) ;
}
push ( ` <!--[--> ` ) ;
renderVNodeChildren (
push ,
children ,
parentComponent ,
slotScopeId
) ;
push ( ` <!--]--> ` ) ;
break ;
default :
if ( shapeFlag & 1 ) {
renderElementVNode ( push , vnode , parentComponent , slotScopeId ) ;
} else if ( shapeFlag & 6 ) {
push ( renderComponentVNode ( vnode , parentComponent , slotScopeId ) ) ;
} else if ( shapeFlag & 64 ) {
renderTeleportVNode ( push , vnode , parentComponent , slotScopeId ) ;
} else if ( shapeFlag & 128 ) {
renderVNode ( push , vnode . ssContent , parentComponent , slotScopeId ) ;
} else {
warn (
"[@vue/server-renderer] Invalid VNode type:" ,
type ,
` ( ${ typeof type } ) `
) ;
}
}
2023-07-24 03:13:08 +00:00
}
function renderVNodeChildren ( push , children , parentComponent , slotScopeId ) {
2023-09-06 01:51:55 +00:00
for ( let i = 0 ; i < children . length ; i ++ ) {
renderVNode ( push , normalizeVNode ( children [ i ] ) , parentComponent , slotScopeId ) ;
}
2023-07-24 03:13:08 +00:00
}
function renderElementVNode ( push , vnode , parentComponent , slotScopeId ) {
2023-09-06 01:51:55 +00:00
const tag = vnode . type ;
let { props , children , shapeFlag , scopeId , dirs } = vnode ;
let openTag = ` < ${ tag } ` ;
if ( dirs ) {
props = applySSRDirectives ( vnode , props , dirs ) ;
}
if ( props ) {
openTag += ssrRenderAttrs ( props , tag ) ;
}
if ( scopeId ) {
openTag += ` ${ scopeId } ` ;
}
let curParent = parentComponent ;
let curVnode = vnode ;
while ( curParent && curVnode === curParent . subTree ) {
curVnode = curParent . vnode ;
if ( curVnode . scopeId ) {
openTag += ` ${ curVnode . scopeId } ` ;
}
curParent = curParent . parent ;
}
if ( slotScopeId ) {
openTag += ` ${ slotScopeId } ` ;
}
push ( openTag + ` > ` ) ;
if ( ! isVoidTag ( tag ) ) {
let hasChildrenOverride = false ;
2023-07-24 03:13:08 +00:00
if ( props ) {
2023-09-06 01:51:55 +00:00
if ( props . innerHTML ) {
hasChildrenOverride = true ;
push ( props . innerHTML ) ;
} else if ( props . textContent ) {
hasChildrenOverride = true ;
push ( escapeHtml ( props . textContent ) ) ;
} else if ( tag === "textarea" && props . value ) {
hasChildrenOverride = true ;
push ( escapeHtml ( props . value ) ) ;
}
}
if ( ! hasChildrenOverride ) {
if ( shapeFlag & 8 ) {
push ( escapeHtml ( children ) ) ;
} else if ( shapeFlag & 16 ) {
renderVNodeChildren (
push ,
children ,
parentComponent ,
slotScopeId
) ;
}
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
push ( ` </ ${ tag } > ` ) ;
}
2023-07-24 03:13:08 +00:00
}
function applySSRDirectives ( vnode , rawProps , dirs ) {
2023-09-06 01:51:55 +00:00
const toMerge = [ ] ;
for ( let i = 0 ; i < dirs . length ; i ++ ) {
const binding = dirs [ i ] ;
const {
dir : { getSSRProps }
} = binding ;
if ( getSSRProps ) {
const props = getSSRProps ( binding , vnode ) ;
if ( props )
toMerge . push ( props ) ;
}
}
return mergeProps ( rawProps || { } , ... toMerge ) ;
2023-07-24 03:13:08 +00:00
}
function renderTeleportVNode ( push , vnode , parentComponent , slotScopeId ) {
2023-09-06 01:51:55 +00:00
const target = vnode . props && vnode . props . to ;
const disabled = vnode . props && vnode . props . disabled ;
if ( ! target ) {
if ( ! disabled ) {
warn ( ` [@vue/server-renderer] Teleport is missing target prop. ` ) ;
}
return [ ] ;
}
if ( ! isString ( target ) ) {
warn (
` [@vue/server-renderer] Teleport target must be a query selector string. `
) ;
return [ ] ;
}
ssrRenderTeleport (
push ,
( push2 ) => {
renderVNodeChildren (
push2 ,
vnode . children ,
parentComponent ,
slotScopeId
) ;
} ,
target ,
disabled || disabled === "" ,
parentComponent
) ;
2023-07-24 03:13:08 +00:00
}
const { isVNode : isVNode$1 } = ssrUtils ;
2023-09-06 01:51:55 +00:00
async function unrollBuffer$1 ( buffer ) {
if ( buffer . hasAsync ) {
let ret = "" ;
2023-07-24 03:13:08 +00:00
for ( let i = 0 ; i < buffer . length ; i ++ ) {
2023-09-06 01:51:55 +00:00
let item = buffer [ i ] ;
if ( isPromise ( item ) ) {
item = await item ;
}
if ( isString ( item ) ) {
ret += item ;
} else {
ret += await unrollBuffer$1 ( item ) ;
}
2023-07-24 03:13:08 +00:00
}
return ret ;
2023-09-06 01:51:55 +00:00
} else {
return unrollBufferSync$1 ( buffer ) ;
}
}
function unrollBufferSync$1 ( buffer ) {
let ret = "" ;
for ( let i = 0 ; i < buffer . length ; i ++ ) {
let item = buffer [ i ] ;
if ( isString ( item ) ) {
ret += item ;
} else {
ret += unrollBufferSync$1 ( item ) ;
}
}
return ret ;
2023-07-24 03:13:08 +00:00
}
async function renderToString ( input , context = { } ) {
2023-09-06 01:51:55 +00:00
if ( isVNode$1 ( input ) ) {
return renderToString ( createApp ( { render : ( ) => input } ) , context ) ;
}
const vnode = createVNode ( input . _component , input . _props ) ;
vnode . appContext = input . _context ;
input . provide ( ssrContextKey , context ) ;
const buffer = await renderComponentVNode ( vnode ) ;
const result = await unrollBuffer$1 ( buffer ) ;
await resolveTeleports ( context ) ;
if ( context . _ _watcherHandles ) {
for ( const unwatch of context . _ _watcherHandles ) {
unwatch ( ) ;
}
}
return result ;
2023-07-24 03:13:08 +00:00
}
async function resolveTeleports ( context ) {
2023-09-06 01:51:55 +00:00
if ( context . _ _teleportBuffers ) {
context . teleports = context . teleports || { } ;
for ( const key in context . _ _teleportBuffers ) {
context . teleports [ key ] = await unrollBuffer$1 (
await Promise . all ( [ context . _ _teleportBuffers [ key ] ] )
) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
}
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
const { isVNode } = ssrUtils ;
async function unrollBuffer ( buffer , stream ) {
if ( buffer . hasAsync ) {
2023-07-24 03:13:08 +00:00
for ( let i = 0 ; i < buffer . length ; i ++ ) {
2023-09-06 01:51:55 +00:00
let item = buffer [ i ] ;
if ( isPromise ( item ) ) {
item = await item ;
}
if ( isString ( item ) ) {
stream . push ( item ) ;
} else {
await unrollBuffer ( item , stream ) ;
}
}
} else {
unrollBufferSync ( buffer , stream ) ;
}
}
function unrollBufferSync ( buffer , stream ) {
for ( let i = 0 ; i < buffer . length ; i ++ ) {
let item = buffer [ i ] ;
if ( isString ( item ) ) {
stream . push ( item ) ;
} else {
unrollBufferSync ( item , stream ) ;
}
}
2023-07-24 03:13:08 +00:00
}
function renderToSimpleStream ( input , context , stream ) {
2023-09-06 01:51:55 +00:00
if ( isVNode ( input ) ) {
return renderToSimpleStream (
createApp ( { render : ( ) => input } ) ,
context ,
stream
) ;
}
const vnode = createVNode ( input . _component , input . _props ) ;
vnode . appContext = input . _context ;
input . provide ( ssrContextKey , context ) ;
Promise . resolve ( renderComponentVNode ( vnode ) ) . then ( ( buffer ) => unrollBuffer ( buffer , stream ) ) . then ( ( ) => resolveTeleports ( context ) ) . then ( ( ) => {
if ( context . _ _watcherHandles ) {
for ( const unwatch of context . _ _watcherHandles ) {
unwatch ( ) ;
}
}
} ) . then ( ( ) => stream . push ( null ) ) . catch ( ( error ) => {
stream . destroy ( error ) ;
} ) ;
return stream ;
2023-07-24 03:13:08 +00:00
}
function renderToStream ( input , context = { } ) {
2023-09-06 01:51:55 +00:00
console . warn (
` [@vue/server-renderer] renderToStream is deprecated - use renderToNodeStream instead. `
) ;
return renderToNodeStream ( input , context ) ;
2023-07-24 03:13:08 +00:00
}
function renderToNodeStream ( input , context = { } ) {
2023-09-06 01:51:55 +00:00
{
throw new Error (
` ESM build of renderToStream() does not support renderToNodeStream(). Use pipeToNodeWritable() with an existing Node.js Writable stream instance instead. `
) ;
}
2023-07-24 03:13:08 +00:00
}
function pipeToNodeWritable ( input , context = { } , writable ) {
2023-09-06 01:51:55 +00:00
renderToSimpleStream ( input , context , {
push ( content ) {
if ( content != null ) {
writable . write ( content ) ;
} else {
writable . end ( ) ;
}
} ,
destroy ( err ) {
writable . destroy ( err ) ;
}
} ) ;
2023-07-24 03:13:08 +00:00
}
function renderToWebStream ( input , context = { } ) {
2023-09-06 01:51:55 +00:00
if ( typeof ReadableStream !== "function" ) {
throw new Error (
` ReadableStream constructor is not available in the global scope. If the target environment does support web streams, consider using pipeToWebWritable() with an existing WritableStream instance instead. `
) ;
}
const encoder = new TextEncoder ( ) ;
let cancelled = false ;
return new ReadableStream ( {
start ( controller ) {
renderToSimpleStream ( input , context , {
push ( content ) {
if ( cancelled )
return ;
if ( content != null ) {
controller . enqueue ( encoder . encode ( content ) ) ;
} else {
controller . close ( ) ;
}
2023-07-24 03:13:08 +00:00
} ,
destroy ( err ) {
2023-09-06 01:51:55 +00:00
controller . error ( err ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
} ) ;
} ,
cancel ( ) {
cancelled = true ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
} ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
function pipeToWebWritable ( input , context = { } , writable ) {
const writer = writable . getWriter ( ) ;
const encoder = new TextEncoder ( ) ;
let hasReady = false ;
try {
hasReady = isPromise ( writer . ready ) ;
} catch ( e ) {
}
renderToSimpleStream ( input , context , {
async push ( content ) {
if ( hasReady ) {
await writer . ready ;
}
if ( content != null ) {
return writer . write ( encoder . encode ( content ) ) ;
} else {
return writer . close ( ) ;
}
} ,
destroy ( err ) {
console . log ( err ) ;
writer . close ( ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
} ) ;
2023-07-24 03:13:08 +00:00
}
2023-09-06 01:51:55 +00:00
initDirectivesForSSR ( ) ;
2023-07-24 03:13:08 +00:00
export { pipeToNodeWritable , pipeToWebWritable , renderToNodeStream , renderToSimpleStream , renderToStream , renderToString , renderToWebStream , ssrGetDirectiveProps , ssrGetDynamicModelProps , includeBooleanAttr as ssrIncludeBooleanAttr , ssrInterpolate , ssrLooseContain , ssrLooseEqual , ssrRenderAttr , ssrRenderAttrs , ssrRenderClass , ssrRenderComponent , ssrRenderDynamicAttr , ssrRenderDynamicModel , ssrRenderList , ssrRenderSlot , ssrRenderSlotInner , ssrRenderStyle , ssrRenderSuspense , ssrRenderTeleport , renderVNode as ssrRenderVNode } ;