diff --git a/packages/uni-api/src/service/context/canvas.ts b/packages/uni-api/src/service/context/canvas.ts index f8b7d5dcbecb86a1d30ea20171e54b188a499031..4e5a606bb6856b2d990fa876804eb75a97ffab86 100644 --- a/packages/uni-api/src/service/context/canvas.ts +++ b/packages/uni-api/src/service/context/canvas.ts @@ -27,7 +27,7 @@ import type { import { hasOwn } from '@vue/shared' -import { once } from '@dcloudio/uni-shared' +import { once, ON_ERROR } from '@dcloudio/uni-shared' import { getPageIdByVm, @@ -1036,7 +1036,7 @@ export const createCanvasContext = if (pageId) { return new CanvasContext(canvasId, pageId) } else { - UniServiceJSBridge.emit('onError', 'createCanvasContext:fail') + UniServiceJSBridge.emit(ON_ERROR, 'createCanvasContext:fail') } }, CreateCanvasContextProtocol diff --git a/packages/uni-app-plus/dist/uni-app-service.es.js b/packages/uni-app-plus/dist/uni-app-service.es.js index adaf7f75beead4021c5d052defbac154e04d1c60..6052999066534953580ba0bf41d63b25bd2544fa 100644 --- a/packages/uni-app-plus/dist/uni-app-service.es.js +++ b/packages/uni-app-plus/dist/uni-app-service.es.js @@ -1008,7 +1008,29 @@ var serviceContext = (function (vue) { const PRIMARY_COLOR = '#007aff'; const BACKGROUND_COLOR = '#f7f7f7'; // 背景色,如标题栏默认背景色 const SCHEME_RE = /^([a-z-]+:)?\/\//i; - const DATA_RE = /^data:.*,.*/; + const DATA_RE = /^data:.*,.*/; + // lifecycle + // App and Page + const ON_SHOW = 'onShow'; + const ON_HIDE = 'onHide'; + //App + const ON_LAUNCH = 'onLaunch'; + const ON_ERROR = 'onError'; + const ON_THEME_CHANGE = 'onThemeChange'; + //Page + const ON_LOAD = 'onLoad'; + const ON_READY = 'onReady'; + const ON_UNLOAD = 'onUnload'; + const ON_RESIZE = 'onResize'; + const ON_BACK_PRESS = 'onBackPress'; + const ON_PAGE_SCROLL = 'onPageScroll'; + const ON_TAB_ITEM_TAP = 'onTabItemTap'; + const ON_REACH_BOTTOM = 'onReachBottom'; + // navigationBar + const ON_NAVIGATION_BAR_BUTTON_TAP = 'onNavigationBarButtonTap'; + // framework + const ON_APP_ENTER_FOREGROUND = 'onAppEnterForeground'; + const ON_APP_ENTER_BACKGROUND = 'onAppEnterBackground'; const isObject = (val) => val !== null && typeof val === 'object'; class BaseFormatter { @@ -1761,8 +1783,14 @@ var serviceContext = (function (vue) { }); function initOn() { - UniServiceJSBridge.on('onAppEnterForeground', onAppEnterForeground); - UniServiceJSBridge.on('onAppEnterBackground', onAppEnterBackground); + const { on } = UniServiceJSBridge; + on(ON_RESIZE, onResize); + on(ON_APP_ENTER_FOREGROUND, onAppEnterForeground); + on(ON_APP_ENTER_BACKGROUND, onAppEnterBackground); + } + function onResize(res) { + invokeHook(getCurrentPage(), ON_RESIZE, res); + UniServiceJSBridge.invokeOnCallback('onWindowResize', res); // API } function onAppEnterForeground() { const page = getCurrentPage(); @@ -1774,15 +1802,15 @@ var serviceContext = (function (vue) { showOptions.path = page.$page.route; showOptions.query = page.$page.options; } - invokeHook(getApp(), 'onShow', showOptions); - invokeHook(page, 'onShow'); + invokeHook(getApp(), ON_SHOW, showOptions); + invokeHook(page, ON_SHOW); } function onAppEnterBackground() { - invokeHook(getApp(), 'onHide'); - invokeHook(getCurrentPage(), 'onHide'); + invokeHook(getApp(), ON_HIDE); + invokeHook(getCurrentPage(), ON_HIDE); } - const SUBSCRIBE_LIFECYCLE_HOOKS = ['onPageScroll', 'onReachBottom']; + const SUBSCRIBE_LIFECYCLE_HOOKS = [ON_PAGE_SCROLL, ON_REACH_BOTTOM]; function initSubscribe() { SUBSCRIBE_LIFECYCLE_HOOKS.forEach((name) => UniServiceJSBridge.subscribe(name, createPageEvent(name))); } @@ -3154,7 +3182,7 @@ var serviceContext = (function (vue) { return new CanvasContext(canvasId, pageId); } else { - UniServiceJSBridge.emit('onError', 'createCanvasContext:fail'); + UniServiceJSBridge.emit(ON_ERROR, 'createCanvasContext:fail'); } }, CreateCanvasContextProtocol); const canvasGetImageData = defineAsyncApi(API_CANVAS_GET_IMAGE_DATA, ({ canvasId, x, y, width, height }, { resolve, reject }) => { @@ -7829,8 +7857,8 @@ var serviceContext = (function (vue) { } }); if (publicThis.$mpType === 'page') { - invokeHook(publicThis, 'onLoad', instance.attrs.__pageQuery); - invokeHook(publicThis, 'onShow'); + invokeHook(publicThis, ON_LOAD, instance.attrs.__pageQuery); + invokeHook(publicThis, ON_SHOW); } } @@ -7847,7 +7875,7 @@ var serviceContext = (function (vue) { throw err; } { - invokeHook(app.$vm, 'onError', err); + invokeHook(app.$vm, ON_ERROR, err); } } @@ -8100,7 +8128,7 @@ var serviceContext = (function (vue) { openType: 'switchTab', from: 'tabBar', success() { - invokeHook('onTabItemTap', { + invokeHook(ON_TAB_ITEM_TAP, { index, text: item.text, pagePath: item.pagePath, @@ -8115,6 +8143,7 @@ var serviceContext = (function (vue) { } } + const EVENT_BACKBUTTON = 'backbutton'; function backbuttonListener() { uni.navigateBack({ from: 'backbutton', @@ -8126,24 +8155,24 @@ var serviceContext = (function (vue) { const weexGlobalEvent = weex.requireModule('globalEvent'); const emit = UniServiceJSBridge.emit; if (weex.config.preload) { - plus.key.addEventListener('backbutton', backbuttonListener); + plus.key.addEventListener(EVENT_BACKBUTTON, backbuttonListener); } else { plusGlobalEvent.addEventListener('splashclosed', () => { - plus.key.addEventListener('backbutton', backbuttonListener); + plus.key.addEventListener(EVENT_BACKBUTTON, backbuttonListener); }); } plusGlobalEvent.addEventListener('pause', () => { - emit('onAppEnterBackground'); + emit(ON_APP_ENTER_BACKGROUND); }); plusGlobalEvent.addEventListener('resume', () => { - emit('onAppEnterForeground'); + emit(ON_APP_ENTER_FOREGROUND); }); weexGlobalEvent.addEventListener('uistylechange', function (event) { const args = { theme: event.uistyle, }; - emit('onThemeChange', args); + emit(ON_THEME_CHANGE, args); }); plusGlobalEvent.addEventListener('plusMessage', subscribePlusMessage); // nvue webview post message @@ -8167,8 +8196,8 @@ var serviceContext = (function (vue) { query: {}, scene: 1001, }; - invokeHook(appVm, 'onLaunch', args); - invokeHook(appVm, 'onShow', args); + invokeHook(appVm, ON_LAUNCH, args); + invokeHook(appVm, ON_SHOW, args); } // 统一处理路径 @@ -8350,7 +8379,7 @@ var serviceContext = (function (vue) { function createTitleNViewBtnClick(index) { return function onClick(btn) { btn.index = index; - invokeHook('onNavigationBarButtonTap', btn); + invokeHook(ON_NAVIGATION_BAR_BUTTON_TAP, btn); }; } @@ -9236,7 +9265,7 @@ var serviceContext = (function (vue) { if (!page) { return reject(`getCurrentPages is empty`); } - if (invokeHook(page, 'onBackPress', { + if (invokeHook(page, ON_BACK_PRESS, { from: args.from, })) { return resolve(); @@ -9305,7 +9334,7 @@ var serviceContext = (function (vue) { .forEach((page) => removePage(page)); setStatusBarStyle(); // 前一个页面触发 onShow - invokeHook('onShow'); + invokeHook(ON_SHOW); }; const webview = plus.webview.getWebviewById(currentPage.$page.id + ''); if (!currentPage.__uniapp_webview) { @@ -9543,11 +9572,11 @@ var serviceContext = (function (vue) { initPageVm(pageVm, __pageInstance); addCurrentPage(initScope(__pageId, pageVm)); vue.onMounted(() => { - invokeHook(pageVm, 'onReady'); + invokeHook(pageVm, ON_READY); // TODO preloadSubPackages }); vue.onBeforeUnmount(() => { - invokeHook(pageVm, 'onUnload'); + invokeHook(pageVm, ON_UNLOAD); }); if (oldSetup) { return oldSetup(__pageQuery, ctx); @@ -9690,7 +9719,7 @@ var serviceContext = (function (vue) { function _navigateTo({ url, path, query, aniType, aniDuration, }) { // TODO eventChannel // 当前页面触发 onHide - invokeHook('onHide'); + invokeHook(ON_HIDE); return new Promise((resolve) => { showWebview(registerPage({ url, path, query, openType: 'navigateTo' }), aniType, aniDuration, () => { resolve(undefined); @@ -9869,7 +9898,7 @@ var serviceContext = (function (vue) { callOnHide = false; } if (currentPage && callOnHide) { - invokeHook(currentPage, 'onHide'); + invokeHook(currentPage, ON_HIDE); } return new Promise((resolve) => { if (tabBarPage) { @@ -9877,7 +9906,7 @@ var serviceContext = (function (vue) { webview.show('none'); // 等visible状态都切换完之后,再触发onShow,否则开发者在onShow里边 getCurrentPages 会不准确 if (callOnShow && !webview.__preload__) { - invokeHook(tabBarPage, 'onShow'); + invokeHook(tabBarPage, ON_SHOW); } resolve(undefined); } diff --git a/packages/uni-app-plus/dist/uni-app-view.umd.js b/packages/uni-app-plus/dist/uni-app-view.umd.js index 9fb18524645dda03538affe1de659629dd29a6fb..195dcc9b2e08c009c30fad94fba953fbed8d1eee 100644 --- a/packages/uni-app-plus/dist/uni-app-view.umd.js +++ b/packages/uni-app-plus/dist/uni-app-view.umd.js @@ -260,6 +260,8 @@ const PRIMARY_COLOR = "#007aff"; const SCHEME_RE = /^([a-z-]+:)?\/\//i; const DATA_RE = /^data:.*,.*/; + const ON_PAGE_SCROLL = "onPageScroll"; + const ON_REACH_BOTTOM = "onReachBottom"; const isObject = (val) => val !== null && typeof val === "object"; class BaseFormatter { constructor() { @@ -5395,6 +5397,7 @@ } return res; } + [ON_PAGE_SCROLL, ON_REACH_BOTTOM]; const VD_SYNC = "vdSync"; const ON_WEBVIEW_READY = "onWebviewReady"; const INVOKE_VIEW_API = "invokeViewApi"; @@ -15383,12 +15386,12 @@ const opts = {}; if (onPageScroll) { opts.onPageScroll = (scrollTop) => { - UniViewJSBridge.publishHandler("onPageScroll", { scrollTop }); + UniViewJSBridge.publishHandler(ON_PAGE_SCROLL, { scrollTop }); }; } if (onPageReachBottom) { opts.onReachBottomDistance = onReachBottomDistance; - opts.onReachBottom = () => UniViewJSBridge.publishHandler("onReachBottom"); + opts.onReachBottom = () => UniViewJSBridge.publishHandler(ON_REACH_BOTTOM); } requestAnimationFrame(() => document.addEventListener("scroll", createScrollListener(opts))); } diff --git a/packages/uni-app-plus/src/service/api/route/navigateBack.ts b/packages/uni-app-plus/src/service/api/route/navigateBack.ts index 9e610d221486acfbb6ce51194fb7d56bba858697..2c091352732a5242f6eb7ce7a9e3ad5954758d87 100644 --- a/packages/uni-app-plus/src/service/api/route/navigateBack.ts +++ b/packages/uni-app-plus/src/service/api/route/navigateBack.ts @@ -11,6 +11,7 @@ import { invokeHook, } from '@dcloudio/uni-core' import { useI18n } from '@dcloudio/uni-core' +import { ON_BACK_PRESS, ON_SHOW } from '@dcloudio/uni-shared' import { ComponentPublicInstance } from 'vue' import { ANI_CLOSE, ANI_DURATION } from '../../constants' import { removePage } from '../../framework/page/getCurrentPages' @@ -25,7 +26,7 @@ export const navigateBack = defineAsyncApi( return reject(`getCurrentPages is empty`) } if ( - invokeHook(page as ComponentPublicInstance, 'onBackPress', { + invokeHook(page as ComponentPublicInstance, ON_BACK_PRESS, { from: (args as any).from, }) ) { @@ -105,7 +106,7 @@ function back( .forEach((page) => removePage(page as ComponentPublicInstance)) setStatusBarStyle() // 前一个页面触发 onShow - invokeHook('onShow') + invokeHook(ON_SHOW) } const webview = plus.webview.getWebviewById(currentPage.$page.id + '') diff --git a/packages/uni-app-plus/src/service/api/route/navigateTo.ts b/packages/uni-app-plus/src/service/api/route/navigateTo.ts index 1cf237695e4548ca8d77ec41d1d948f72e01f147..bc12aa638a12a9c222aea0959ac4f007517f8fd2 100644 --- a/packages/uni-app-plus/src/service/api/route/navigateTo.ts +++ b/packages/uni-app-plus/src/service/api/route/navigateTo.ts @@ -1,4 +1,4 @@ -import { parseUrl } from '@dcloudio/uni-shared' +import { ON_HIDE, parseUrl } from '@dcloudio/uni-shared' import { getRouteMeta, invokeHook } from '@dcloudio/uni-core' import { API_NAVIGATE_TO, @@ -57,7 +57,7 @@ function _navigateTo({ }: NavigateToOptions): Promise { // TODO eventChannel // 当前页面触发 onHide - invokeHook('onHide') + invokeHook(ON_HIDE) return new Promise((resolve) => { showWebview( registerPage({ url, path, query, openType: 'navigateTo' }), diff --git a/packages/uni-app-plus/src/service/api/route/switchTab.ts b/packages/uni-app-plus/src/service/api/route/switchTab.ts index e1599f4a97bd96714526741f184a7a211d2816a0..f45a613db2b95576ffb0d4f4d5466f3ab571d2ac 100644 --- a/packages/uni-app-plus/src/service/api/route/switchTab.ts +++ b/packages/uni-app-plus/src/service/api/route/switchTab.ts @@ -6,7 +6,7 @@ import { SwitchTabProtocol, } from '@dcloudio/uni-api' import { invokeHook } from '@dcloudio/uni-core' -import { parseUrl } from '@dcloudio/uni-shared' +import { ON_HIDE, ON_SHOW, parseUrl } from '@dcloudio/uni-shared' import { ComponentPublicInstance } from 'vue' import { ANI_CLOSE, ANI_DURATION } from '../../constants' import tabBar from '../../framework/app/tabBar' @@ -101,7 +101,7 @@ function _switchTab({ callOnHide = false } if (currentPage && callOnHide) { - invokeHook(currentPage, 'onHide') + invokeHook(currentPage, ON_HIDE) } return new Promise((resolve) => { if (tabBarPage) { @@ -109,7 +109,7 @@ function _switchTab({ webview.show('none') // 等visible状态都切换完之后,再触发onShow,否则开发者在onShow里边 getCurrentPages 会不准确 if (callOnShow && !(webview as any).__preload__) { - invokeHook(tabBarPage, 'onShow') + invokeHook(tabBarPage, ON_SHOW) } resolve(undefined) } else { diff --git a/packages/uni-app-plus/src/service/framework/app/initAppLaunch.ts b/packages/uni-app-plus/src/service/framework/app/initAppLaunch.ts index 1983af8cf11370f94380fd396b7f995086c5af0e..3227e43a79da054af5ab56e5747eaef3058ec84e 100644 --- a/packages/uni-app-plus/src/service/framework/app/initAppLaunch.ts +++ b/packages/uni-app-plus/src/service/framework/app/initAppLaunch.ts @@ -1,4 +1,5 @@ import { invokeHook } from '@dcloudio/uni-core' +import { ON_LAUNCH, ON_SHOW } from '@dcloudio/uni-shared' import { ComponentPublicInstance } from 'vue' export function initAppLaunch(appVm: ComponentPublicInstance) { @@ -7,6 +8,6 @@ export function initAppLaunch(appVm: ComponentPublicInstance) { query: {}, scene: 1001, } - invokeHook(appVm, 'onLaunch', args) - invokeHook(appVm, 'onShow', args) + invokeHook(appVm, ON_LAUNCH, args) + invokeHook(appVm, ON_SHOW, args) } diff --git a/packages/uni-app-plus/src/service/framework/app/initGlobalEvent.ts b/packages/uni-app-plus/src/service/framework/app/initGlobalEvent.ts index ee4bc966f206b78f611627d65231800c12dc59a8..6d6b44f0d196833f2f88a97a0595f280c4a4147d 100644 --- a/packages/uni-app-plus/src/service/framework/app/initGlobalEvent.ts +++ b/packages/uni-app-plus/src/service/framework/app/initGlobalEvent.ts @@ -1,5 +1,10 @@ -import { formatLog } from '@dcloudio/uni-shared' -import { backbuttonListener } from './utils' +import { + formatLog, + ON_APP_ENTER_BACKGROUND, + ON_APP_ENTER_FOREGROUND, + ON_THEME_CHANGE, +} from '@dcloudio/uni-shared' +import { EVENT_BACKBUTTON, backbuttonListener } from './utils' export function initGlobalEvent() { const plusGlobalEvent = (plus as any).globalEvent @@ -7,19 +12,19 @@ export function initGlobalEvent() { const emit = UniServiceJSBridge.emit if (weex.config.preload) { - plus.key.addEventListener('backbutton', backbuttonListener) + plus.key.addEventListener(EVENT_BACKBUTTON, backbuttonListener) } else { plusGlobalEvent.addEventListener('splashclosed', () => { - plus.key.addEventListener('backbutton', backbuttonListener) + plus.key.addEventListener(EVENT_BACKBUTTON, backbuttonListener) }) } plusGlobalEvent.addEventListener('pause', () => { - emit('onAppEnterBackground') + emit(ON_APP_ENTER_BACKGROUND) }) plusGlobalEvent.addEventListener('resume', () => { - emit('onAppEnterForeground') + emit(ON_APP_ENTER_FOREGROUND) }) weexGlobalEvent.addEventListener( @@ -28,7 +33,7 @@ export function initGlobalEvent() { const args = { theme: event.uistyle, } - emit('onThemeChange', args) + emit(ON_THEME_CHANGE, args) } ) diff --git a/packages/uni-app-plus/src/service/framework/app/initTabBar.ts b/packages/uni-app-plus/src/service/framework/app/initTabBar.ts index 81cde8716cf178a785a88dd06a13f648fbdb34d7..539c58a1205b408b5f9abc547aee78f0e3f0fa8b 100644 --- a/packages/uni-app-plus/src/service/framework/app/initTabBar.ts +++ b/packages/uni-app-plus/src/service/framework/app/initTabBar.ts @@ -1,4 +1,5 @@ import { invokeHook } from '@dcloudio/uni-core' +import { ON_TAB_ITEM_TAP } from '@dcloudio/uni-shared' import tabBarInstance from './tabBar' export function initTabBar() { @@ -23,7 +24,7 @@ export function initTabBar() { openType: 'switchTab', from: 'tabBar', success() { - invokeHook('onTabItemTap', { + invokeHook(ON_TAB_ITEM_TAP, { index, text: item.text, pagePath: item.pagePath, diff --git a/packages/uni-app-plus/src/service/framework/app/utils.ts b/packages/uni-app-plus/src/service/framework/app/utils.ts index 894c066020911736b10dd795198a1a824a5ed038..0d9a11d20ce8c275182bdceb2c745c6dd8488610 100644 --- a/packages/uni-app-plus/src/service/framework/app/utils.ts +++ b/packages/uni-app-plus/src/service/framework/app/utils.ts @@ -1,3 +1,4 @@ +export const EVENT_BACKBUTTON = 'backbutton' export function backbuttonListener() { uni.navigateBack({ from: 'backbutton', diff --git a/packages/uni-app-plus/src/service/framework/page/setup.ts b/packages/uni-app-plus/src/service/framework/page/setup.ts index c49718c8f2306e8584daabff7f9bb98cdf5f5fbf..ba702146cd688992bb11cb4818c7638cce0f2265 100644 --- a/packages/uni-app-plus/src/service/framework/page/setup.ts +++ b/packages/uni-app-plus/src/service/framework/page/setup.ts @@ -1,5 +1,5 @@ import { initPageVm, invokeHook } from '@dcloudio/uni-core' -import { formatLog } from '@dcloudio/uni-shared' +import { formatLog, ON_READY, ON_UNLOAD } from '@dcloudio/uni-shared' import { ComponentPublicInstance, getCurrentInstance, @@ -24,11 +24,11 @@ export function setupPage(component: VuePageComponent) { initPageVm(pageVm, __pageInstance as Page.PageInstance['$page']) addCurrentPage(initScope(__pageId as number, pageVm)) onMounted(() => { - invokeHook(pageVm, 'onReady') + invokeHook(pageVm, ON_READY) // TODO preloadSubPackages }) onBeforeUnmount(() => { - invokeHook(pageVm, 'onUnload') + invokeHook(pageVm, ON_UNLOAD) }) if (oldSetup) { return oldSetup(__pageQuery as any, ctx) diff --git a/packages/uni-app-plus/src/service/framework/webview/init/event/index.ts b/packages/uni-app-plus/src/service/framework/webview/init/event/index.ts index 1a84d0646d7c3564754bb283011d893c76311318..53b70f430d1fa0b967bf432ea4aac0acce2e379a 100644 --- a/packages/uni-app-plus/src/service/framework/webview/init/event/index.ts +++ b/packages/uni-app-plus/src/service/framework/webview/init/event/index.ts @@ -1,13 +1,21 @@ +import { + ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED, + ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED, + ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED, + ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED, + ON_PULL_DOWN_REFRESH, +} from '@dcloudio/uni-shared' import { onWebviewClose } from './close' import { onWebviewPopGesture } from './popGesture' import { onWebviewResize } from './resize' const WEBVIEW_LISTENERS = { - pullToRefresh: 'onPullDownRefresh', - titleNViewSearchInputChanged: 'onNavigationBarSearchInputChanged', - titleNViewSearchInputConfirmed: 'onNavigationBarSearchInputConfirmed', - titleNViewSearchInputClicked: 'onNavigationBarSearchInputClicked', - titleNViewSearchInputFocusChanged: 'onNavigationBarSearchInputFocusChanged', + pullToRefresh: ON_PULL_DOWN_REFRESH, + titleNViewSearchInputChanged: ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED, + titleNViewSearchInputConfirmed: ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED, + titleNViewSearchInputClicked: ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED, + titleNViewSearchInputFocusChanged: + ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED, } as const export function initWebviewEvent(webview: PlusWebviewWebviewObject) { diff --git a/packages/uni-app-plus/src/service/framework/webview/init/event/popGesture.ts b/packages/uni-app-plus/src/service/framework/webview/init/event/popGesture.ts index 6b08d89c2c88209b0622e0eedffe2bcc1d607fbb..4f293c988e4f16eb7e9a04cd426350e5891f79f6 100644 --- a/packages/uni-app-plus/src/service/framework/webview/init/event/popGesture.ts +++ b/packages/uni-app-plus/src/service/framework/webview/init/event/popGesture.ts @@ -1,4 +1,5 @@ import { invokeHook } from '@dcloudio/uni-core' +import { ON_SHOW } from '@dcloudio/uni-shared' import { lastStatusBarStyle, setStatusBarStyle, @@ -24,7 +25,7 @@ export function onWebviewPopGesture(webview: PlusWebviewWebviewObject) { removeCurrentPage() setStatusBarStyle() // 触发前一个页面 onShow - invokeHook('onShow') + invokeHook(ON_SHOW) } }) } diff --git a/packages/uni-app-plus/src/service/framework/webview/init/event/resize.ts b/packages/uni-app-plus/src/service/framework/webview/init/event/resize.ts index e75fd19de7014c0428360b5b05e519f5c1b19d4f..9df1dc69c643d9d880633316a0b80d941a3a0a7d 100644 --- a/packages/uni-app-plus/src/service/framework/webview/init/event/resize.ts +++ b/packages/uni-app-plus/src/service/framework/webview/init/event/resize.ts @@ -1,6 +1,7 @@ -import { debounce } from '@dcloudio/uni-shared' +import { debounce, ON_RESIZE } from '@dcloudio/uni-shared' export function onWebviewResize(webview: PlusWebviewWebviewObject) { + const { emit } = UniServiceJSBridge const onResize = function ({ width, height, @@ -16,8 +17,7 @@ export function onWebviewResize(webview: PlusWebviewWebviewObject) { windowHeight: Math.ceil(height), }, } - UniServiceJSBridge.emit('onViewDidResize', res) // API - UniServiceJSBridge.emit('onResize', res, parseInt(webview.id!)) // Page lifecycle + emit(ON_RESIZE, res, parseInt(webview.id!)) // Page lifecycle } webview.addEventListener('resize' as any, debounce(onResize, 50)) } diff --git a/packages/uni-app-plus/src/service/framework/webview/style/titleNView.ts b/packages/uni-app-plus/src/service/framework/webview/style/titleNView.ts index e5e23482e0d13cdc932f44d3dd1981518d809f3e..30c498d716eaaf0c5f684909545beb25d5ec596c 100644 --- a/packages/uni-app-plus/src/service/framework/webview/style/titleNView.ts +++ b/packages/uni-app-plus/src/service/framework/webview/style/titleNView.ts @@ -1,5 +1,8 @@ import { isArray } from '@vue/shared' -import { BACKGROUND_COLOR } from '@dcloudio/uni-shared' +import { + BACKGROUND_COLOR, + ON_NAVIGATION_BAR_BUTTON_TAP, +} from '@dcloudio/uni-shared' import { isColor } from './utils' import { invokeHook } from '@dcloudio/uni-core' export function initTitleNView( @@ -59,6 +62,6 @@ function createTitleImageTags(titleImage: string) { function createTitleNViewBtnClick(index: number) { return function onClick(btn: UniApp.PageNavigationBarButton) { ;(btn as any).index = index - invokeHook('onNavigationBarButtonTap', btn) + invokeHook(ON_NAVIGATION_BAR_BUTTON_TAP, btn) } } diff --git a/packages/uni-app-plus/src/view/framework/dom/page.ts b/packages/uni-app-plus/src/view/framework/dom/page.ts index 6f6dfd40308645560bd26b6283e95305eaf1ae1f..578bb195585915d29622c81f74ed65cdb5ca65bc 100644 --- a/packages/uni-app-plus/src/view/framework/dom/page.ts +++ b/packages/uni-app-plus/src/view/framework/dom/page.ts @@ -4,7 +4,13 @@ import { disableScrollListener, updateCssVar, } from '@dcloudio/uni-core' -import { formatLog, PageCreateData, UniNodeJSON } from '@dcloudio/uni-shared' +import { + formatLog, + ON_PAGE_SCROLL, + ON_REACH_BOTTOM, + PageCreateData, + UniNodeJSON, +} from '@dcloudio/uni-shared' import { UniElement } from './elements/UniElement' import { UniNode } from './elements/UniNode' @@ -149,12 +155,12 @@ function initPageScroll( const opts: CreateScrollListenerOptions = {} if (onPageScroll) { opts.onPageScroll = (scrollTop) => { - UniViewJSBridge.publishHandler('onPageScroll', { scrollTop }) + UniViewJSBridge.publishHandler(ON_PAGE_SCROLL, { scrollTop }) } } if (onPageReachBottom) { opts.onReachBottomDistance = onReachBottomDistance - opts.onReachBottom = () => UniViewJSBridge.publishHandler('onReachBottom') + opts.onReachBottom = () => UniViewJSBridge.publishHandler(ON_REACH_BOTTOM) } // 避免监听太早,直接触发了 scroll requestAnimationFrame(() => diff --git a/packages/uni-app/dist/uni-app.cjs.js b/packages/uni-app/dist/uni-app.cjs.js index ccde103250df0c637ab76aff2f8da8b698ff16fd..231cb3dae11fb1ae8a1a7c9fd890b544f938e401 100644 --- a/packages/uni-app/dist/uni-app.cjs.js +++ b/packages/uni-app/dist/uni-app.cjs.js @@ -7,7 +7,34 @@ var shared = require('@vue/shared'); const sanitise = (val) => (val && JSON.parse(JSON.stringify(val))) || val; const UNI_SSR = '__uniSSR'; -const UNI_SSR_DATA = 'data'; +const UNI_SSR_DATA = 'data'; +// lifecycle +// App and Page +const ON_SHOW = 'onShow'; +const ON_HIDE = 'onHide'; +//App +const ON_LAUNCH = 'onLaunch'; +const ON_ERROR = 'onError'; +const ON_THEME_CHANGE = 'onThemeChange'; +const ON_PAGE_NOT_FOUND = 'onPageNotFound'; +const ON_UNHANDLE_REJECTION = 'onUnhandledRejection'; +const ON_READY = 'onReady'; +const ON_UNLOAD = 'onUnload'; +const ON_RESIZE = 'onResize'; +const ON_BACK_PRESS = 'onBackPress'; +const ON_PAGE_SCROLL = 'onPageScroll'; +const ON_TAB_ITEM_TAP = 'onTabItemTap'; +const ON_REACH_BOTTOM = 'onReachBottom'; +const ON_PULL_DOWN_REFRESH = 'onPullDownRefresh'; +const ON_SHARE_TIMELINE = 'onShareTimeline'; +const ON_ADD_TO_FAVORITES = 'onAddToFavorites'; +const ON_SHARE_APP_MESSAGE = 'onShareAppMessage'; +// navigationBar +const ON_NAVIGATION_BAR_BUTTON_TAP = 'onNavigationBarButtonTap'; +const ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED = 'onNavigationBarSearchInputClicked'; +const ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED = 'onNavigationBarSearchInputChanged'; +const ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED = 'onNavigationBarSearchInputConfirmed'; +const ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED = 'onNavigationBarSearchInputFocusChanged'; function assertKey(key, shallow = false) { if (!key) { @@ -81,32 +108,6 @@ function resolveEasycom(component, easycom) { } // @ts-ignore -// App and Page -const ON_SHOW = 'onShow'; -const ON_HIDE = 'onHide'; -//App -const ON_LAUNCH = 'onLaunch'; -const ON_ERROR = 'onError'; -const ON_THEME_CHANGE = 'onThemeChange'; -const ON_PAGE_NOT_FOUND = 'onPageNotFound'; -const ON_UNHANDLE_REJECTION = 'onUnhandledRejection'; -const ON_READY = 'onReady'; -const ON_UNLOAD = 'onUnload'; -const ON_RESIZE = 'onResize'; -const ON_BACK_PRESS = 'onBackPress'; -const ON_PAGE_SCROLL = 'onPageScroll'; -const ON_TAB_ITEM_TAP = 'onTabItemTap'; -const ON_REACH_BOTTOM = 'onReachBottom'; -const ON_PULL_DOWN_REFRESH = 'onPullDownRefresh'; -const ON_SHARE_TIMELINE = 'onShareTimeline'; -const ON_ADD_TO_FAVORITES = 'onAddToFavorites'; -const ON_SHARE_APP_MESSAGE = 'onShareAppMessage'; -// navigationBar -const ON_NAVIGATION_BAR_BUTTON_TAP = 'onNavigationBarButtonTap'; -const ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED = 'onNavigationBarSearchInputClicked'; -const ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED = 'onNavigationBarSearchInputChanged'; -const ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED = 'onNavigationBarSearchInputConfirmed'; -const ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED = 'onNavigationBarSearchInputFocusChanged'; const createHook = (lifecycle) => (hook, target = vue.getCurrentInstance()) => // post-create lifecycle registrations are noops during SSR !vue.isInSSRComponentSetup && vue.injectHook(lifecycle, hook, target); diff --git a/packages/uni-app/dist/uni-app.es.js b/packages/uni-app/dist/uni-app.es.js index 6fa0c73a2da4a300c84cfaddb2fe62948c470a47..8e81d83473bfbca91312f609174247c436fe3efa 100644 --- a/packages/uni-app/dist/uni-app.es.js +++ b/packages/uni-app/dist/uni-app.es.js @@ -4,7 +4,34 @@ import { hasOwn, isString } from '@vue/shared'; const sanitise = (val) => (val && JSON.parse(JSON.stringify(val))) || val; const UNI_SSR = '__uniSSR'; const UNI_SSR_DATA = 'data'; -const UNI_SSR_GLOBAL_DATA = 'globalData'; +const UNI_SSR_GLOBAL_DATA = 'globalData'; +// lifecycle +// App and Page +const ON_SHOW = 'onShow'; +const ON_HIDE = 'onHide'; +//App +const ON_LAUNCH = 'onLaunch'; +const ON_ERROR = 'onError'; +const ON_THEME_CHANGE = 'onThemeChange'; +const ON_PAGE_NOT_FOUND = 'onPageNotFound'; +const ON_UNHANDLE_REJECTION = 'onUnhandledRejection'; +const ON_READY = 'onReady'; +const ON_UNLOAD = 'onUnload'; +const ON_RESIZE = 'onResize'; +const ON_BACK_PRESS = 'onBackPress'; +const ON_PAGE_SCROLL = 'onPageScroll'; +const ON_TAB_ITEM_TAP = 'onTabItemTap'; +const ON_REACH_BOTTOM = 'onReachBottom'; +const ON_PULL_DOWN_REFRESH = 'onPullDownRefresh'; +const ON_SHARE_TIMELINE = 'onShareTimeline'; +const ON_ADD_TO_FAVORITES = 'onAddToFavorites'; +const ON_SHARE_APP_MESSAGE = 'onShareAppMessage'; +// navigationBar +const ON_NAVIGATION_BAR_BUTTON_TAP = 'onNavigationBarButtonTap'; +const ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED = 'onNavigationBarSearchInputClicked'; +const ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED = 'onNavigationBarSearchInputChanged'; +const ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED = 'onNavigationBarSearchInputConfirmed'; +const ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED = 'onNavigationBarSearchInputFocusChanged'; function getSSRDataType() { return getCurrentInstance() ? UNI_SSR_DATA : UNI_SSR_GLOBAL_DATA; @@ -49,32 +76,6 @@ function resolveEasycom(component, easycom) { } // @ts-ignore -// App and Page -const ON_SHOW = 'onShow'; -const ON_HIDE = 'onHide'; -//App -const ON_LAUNCH = 'onLaunch'; -const ON_ERROR = 'onError'; -const ON_THEME_CHANGE = 'onThemeChange'; -const ON_PAGE_NOT_FOUND = 'onPageNotFound'; -const ON_UNHANDLE_REJECTION = 'onUnhandledRejection'; -const ON_READY = 'onReady'; -const ON_UNLOAD = 'onUnload'; -const ON_RESIZE = 'onResize'; -const ON_BACK_PRESS = 'onBackPress'; -const ON_PAGE_SCROLL = 'onPageScroll'; -const ON_TAB_ITEM_TAP = 'onTabItemTap'; -const ON_REACH_BOTTOM = 'onReachBottom'; -const ON_PULL_DOWN_REFRESH = 'onPullDownRefresh'; -const ON_SHARE_TIMELINE = 'onShareTimeline'; -const ON_ADD_TO_FAVORITES = 'onAddToFavorites'; -const ON_SHARE_APP_MESSAGE = 'onShareAppMessage'; -// navigationBar -const ON_NAVIGATION_BAR_BUTTON_TAP = 'onNavigationBarButtonTap'; -const ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED = 'onNavigationBarSearchInputClicked'; -const ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED = 'onNavigationBarSearchInputChanged'; -const ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED = 'onNavigationBarSearchInputConfirmed'; -const ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED = 'onNavigationBarSearchInputFocusChanged'; const createHook = (lifecycle) => (hook, target = getCurrentInstance()) => // post-create lifecycle registrations are noops during SSR !isInSSRComponentSetup && injectHook(lifecycle, hook, target); diff --git a/packages/uni-app/src/apiLifecycle.ts b/packages/uni-app/src/apiLifecycle.ts index 9dcc82ba81603f855c2d9c9a7d977e3a3b3acddf..4a84083570e6e195aa0476c7d6715cd0323473e3 100644 --- a/packages/uni-app/src/apiLifecycle.ts +++ b/packages/uni-app/src/apiLifecycle.ts @@ -1,40 +1,33 @@ import { ComponentInternalInstance } from 'vue' // @ts-ignore import { isInSSRComponentSetup, injectHook, getCurrentInstance } from 'vue' -// App and Page -const ON_SHOW = 'onShow' -const ON_HIDE = 'onHide' -//App -const ON_LAUNCH = 'onLaunch' -const ON_ERROR = 'onError' -const ON_THEME_CHANGE = 'onThemeChange' -const ON_PAGE_NOT_FOUND = 'onPageNotFound' -const ON_UNHANDLE_REJECTION = 'onUnhandledRejection' -//Page -const ON_LOAD = 'onLoad' -const ON_READY = 'onReady' -const ON_UNLOAD = 'onUnload' -const ON_RESIZE = 'onResize' -const ON_BACK_PRESS = 'onBackPress' -const ON_PAGE_SCROLL = 'onPageScroll' -const ON_TAB_ITEM_TAP = 'onTabItemTap' -const ON_REACH_BOTTOM = 'onReachBottom' -const ON_PULL_DOWN_REFRESH = 'onPullDownRefresh' - -const ON_SHARE_TIMELINE = 'onShareTimeline' -const ON_ADD_TO_FAVORITES = 'onAddToFavorites' -const ON_SHARE_APP_MESSAGE = 'onShareAppMessage' -// navigationBar -const ON_NAVIGATION_BAR_BUTTON_TAP = 'onNavigationBarButtonTap' -const ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED = - 'onNavigationBarSearchInputClicked' -const ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED = - 'onNavigationBarSearchInputChanged' -const ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED = - 'onNavigationBarSearchInputConfirmed' -const ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED = - 'onNavigationBarSearchInputFocusChanged' +import { + ON_ADD_TO_FAVORITES, + ON_BACK_PRESS, + ON_ERROR, + ON_HIDE, + ON_LAUNCH, + ON_LOAD, + ON_NAVIGATION_BAR_BUTTON_TAP, + ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED, + ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED, + ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED, + ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED, + ON_PAGE_NOT_FOUND, + ON_PAGE_SCROLL, + ON_PULL_DOWN_REFRESH, + ON_REACH_BOTTOM, + ON_READY, + ON_RESIZE, + ON_SHARE_APP_MESSAGE, + ON_SHARE_TIMELINE, + ON_SHOW, + ON_TAB_ITEM_TAP, + ON_THEME_CHANGE, + ON_UNHANDLE_REJECTION, + ON_UNLOAD, +} from '@dcloudio/uni-shared' type UniLifecycleHooks = | typeof ON_SHOW diff --git a/packages/uni-app/tsconfig.json b/packages/uni-app/tsconfig.json index 778a1e5e5add90ed59efa40e7a66bb076597e365..2c31d8ea161ccc710cccd63e011598cebfc3c580 100644 --- a/packages/uni-app/tsconfig.json +++ b/packages/uni-app/tsconfig.json @@ -12,7 +12,10 @@ "resolveJsonModule": true, "esModuleInterop": true, "removeComments": false, - "lib": ["ESNext", "DOM"] + "lib": ["ESNext", "DOM"], + "paths": { + "@dcloudio/uni-shared": ["../uni-shared/src"] + } }, "include": ["src", "../global.d.ts", "../shims-uni-app.d.ts"] } diff --git a/packages/uni-core/src/service/init/on.ts b/packages/uni-core/src/service/init/on.ts index b7e6b021f80cca10a1612da554451ecaeeff9c87..4d32b61f057c1a50f14ad13502acc24fad361c9b 100644 --- a/packages/uni-core/src/service/init/on.ts +++ b/packages/uni-core/src/service/init/on.ts @@ -1,10 +1,24 @@ +import { + ON_APP_ENTER_BACKGROUND, + ON_APP_ENTER_FOREGROUND, + ON_HIDE, + ON_RESIZE, + ON_SHOW, +} from '@dcloudio/uni-shared' import { ComponentPublicInstance } from '@vue/runtime-core' import { invokeHook } from '../../helpers/hook' import { getCurrentPage } from '../../helpers/page' export function initOn() { - UniServiceJSBridge.on('onAppEnterForeground', onAppEnterForeground) - UniServiceJSBridge.on('onAppEnterBackground', onAppEnterBackground) + const { on } = UniServiceJSBridge + on(ON_RESIZE, onResize) + on(ON_APP_ENTER_FOREGROUND, onAppEnterForeground) + on(ON_APP_ENTER_BACKGROUND, onAppEnterBackground) +} + +function onResize(res: UniApp.WindowResizeResult) { + invokeHook(getCurrentPage() as ComponentPublicInstance, ON_RESIZE, res) + UniServiceJSBridge.invokeOnCallback('onWindowResize', res) // API } function onAppEnterForeground() { @@ -17,11 +31,11 @@ function onAppEnterForeground() { showOptions.path = page.$page.route showOptions.query = page.$page.options } - invokeHook(getApp() as ComponentPublicInstance, 'onShow', showOptions) - invokeHook(page as ComponentPublicInstance, 'onShow') + invokeHook(getApp() as ComponentPublicInstance, ON_SHOW, showOptions) + invokeHook(page as ComponentPublicInstance, ON_SHOW) } function onAppEnterBackground() { - invokeHook(getApp() as ComponentPublicInstance, 'onHide') - invokeHook(getCurrentPage() as ComponentPublicInstance, 'onHide') + invokeHook(getApp() as ComponentPublicInstance, ON_HIDE) + invokeHook(getCurrentPage() as ComponentPublicInstance, ON_HIDE) } diff --git a/packages/uni-core/src/service/init/subscribe.ts b/packages/uni-core/src/service/init/subscribe.ts index 9adfc0b2b13f654305c28de0fe7a20ae267452e7..59c06ecd99ffcf2af5fb71e435e7aa2e73930a91 100644 --- a/packages/uni-core/src/service/init/subscribe.ts +++ b/packages/uni-core/src/service/init/subscribe.ts @@ -1,7 +1,8 @@ +import { ON_PAGE_SCROLL, ON_REACH_BOTTOM } from '@dcloudio/uni-shared' import { getPageVmById } from '../../helpers/page' import { invokeHook } from '../../helpers/hook' -const SUBSCRIBE_LIFECYCLE_HOOKS = ['onPageScroll', 'onReachBottom'] +const SUBSCRIBE_LIFECYCLE_HOOKS = [ON_PAGE_SCROLL, ON_REACH_BOTTOM] export function initSubscribe() { SUBSCRIBE_LIFECYCLE_HOOKS.forEach((name) => diff --git a/packages/uni-h5/dist/uni-h5.cjs.js b/packages/uni-h5/dist/uni-h5.cjs.js index 4f6b09a7dda6ab2822c284ba8d97911df56453fb..07f30eab4948ef85611cc50cb6a7b9ed06979af7 100644 --- a/packages/uni-h5/dist/uni-h5.cjs.js +++ b/packages/uni-h5/dist/uni-h5.cjs.js @@ -6584,7 +6584,7 @@ function errorHandler(err, instance, info) { throw err; } { - invokeHook(app.$vm, "onError", err); + invokeHook(app.$vm, uniShared.ON_ERROR, err); } } function initApp$1(app) { @@ -7651,7 +7651,7 @@ var index$8 = /* @__PURE__ */ defineBuiltInComponent({ }; } }); -const onWebInvokeAppService = ({ name, arg }, pageId) => { +const onWebInvokeAppService = ({ name, arg }) => { if (name === "postMessage") ; else { diff --git a/packages/uni-h5/dist/uni-h5.es.js b/packages/uni-h5/dist/uni-h5.es.js index 03370a72d7203c6ffe7bae96f6d8e229e8ade2d7..4022daada31399884e7602be1f2b86f03bc30ed1 100644 --- a/packages/uni-h5/dist/uni-h5.es.js +++ b/packages/uni-h5/dist/uni-h5.es.js @@ -1,5 +1,5 @@ import { isFunction, extend, isString, hyphenate, isPlainObject, isArray, hasOwn, isObject, capitalize, toRawType, makeMap as makeMap$1, isPromise, invokeArrayFns as invokeArrayFns$1 } from "@vue/shared"; -import { once, formatLog, passive, initCustomDataset, invokeArrayFns, normalizeTarget, isBuiltInComponent, SCHEME_RE, DATA_RE, getCustomDataset, callOptions, PRIMARY_COLOR, removeLeadingSlash, getLen, debounce, NAVBAR_HEIGHT, parseQuery, ON_REACH_BOTTOM_DISTANCE, decodedQuery, WEB_INVOKE_APPSERVICE, updateElementStyle, parseUrl, addFont, scrollTo, RESPONSIVE_MIN_WIDTH, formatDateTime } from "@dcloudio/uni-shared"; +import { once, formatLog, passive, initCustomDataset, invokeArrayFns, normalizeTarget, isBuiltInComponent, ON_RESIZE, ON_APP_ENTER_FOREGROUND, ON_APP_ENTER_BACKGROUND, ON_SHOW, ON_HIDE, ON_PAGE_SCROLL, ON_REACH_BOTTOM, SCHEME_RE, DATA_RE, getCustomDataset, ON_ERROR, callOptions, PRIMARY_COLOR, removeLeadingSlash, getLen, debounce, NAVBAR_HEIGHT, parseQuery, ON_UNLOAD, ON_REACH_BOTTOM_DISTANCE, decodedQuery, WEB_INVOKE_APPSERVICE, ON_WEB_INVOKE_APP_SERVICE, updateElementStyle, ON_BACK_PRESS, parseUrl, addFont, scrollTo, RESPONSIVE_MIN_WIDTH, formatDateTime, ON_PULL_DOWN_REFRESH } from "@dcloudio/uni-shared"; import { openBlock, createBlock, mergeProps, createVNode, toDisplayString, withModifiers, getCurrentInstance, defineComponent, ref, provide, computed, watch, onUnmounted, inject, onBeforeUnmount, reactive, onActivated, onMounted, nextTick, onBeforeMount, withDirectives, vShow, shallowRef, watchEffect, isVNode, Fragment, markRaw, createTextVNode, injectHook, onBeforeActivate, onBeforeDeactivate, renderList, onDeactivated, createApp, Transition, withCtx, KeepAlive, resolveDynamicComponent, renderSlot } from "vue"; import { initVueI18n, LOCALE_EN, LOCALE_ES, LOCALE_FR, LOCALE_ZH_HANS, LOCALE_ZH_HANT } from "@dcloudio/uni-i18n"; import { useRoute, createRouter, createWebHistory, createWebHashHistory, useRouter, isNavigationFailure, RouterView } from "vue-router"; @@ -1337,8 +1337,14 @@ const ServiceJSBridge = /* @__PURE__ */ extend(initBridge("view"), { } }); function initOn() { - UniServiceJSBridge.on("onAppEnterForeground", onAppEnterForeground); - UniServiceJSBridge.on("onAppEnterBackground", onAppEnterBackground); + const { on: on2 } = UniServiceJSBridge; + on2(ON_RESIZE, onResize$1); + on2(ON_APP_ENTER_FOREGROUND, onAppEnterForeground); + on2(ON_APP_ENTER_BACKGROUND, onAppEnterBackground); +} +function onResize$1(res) { + invokeHook(getCurrentPage(), ON_RESIZE, res); + UniServiceJSBridge.invokeOnCallback("onWindowResize", res); } function onAppEnterForeground() { const page = getCurrentPage(); @@ -1350,14 +1356,14 @@ function onAppEnterForeground() { showOptions.path = page.$page.route; showOptions.query = page.$page.options; } - invokeHook(getApp(), "onShow", showOptions); - invokeHook(page, "onShow"); + invokeHook(getApp(), ON_SHOW, showOptions); + invokeHook(page, ON_SHOW); } function onAppEnterBackground() { - invokeHook(getApp(), "onHide"); - invokeHook(getCurrentPage(), "onHide"); + invokeHook(getApp(), ON_HIDE); + invokeHook(getCurrentPage(), ON_HIDE); } -const SUBSCRIBE_LIFECYCLE_HOOKS = ["onPageScroll", "onReachBottom"]; +const SUBSCRIBE_LIFECYCLE_HOOKS = [ON_PAGE_SCROLL, ON_REACH_BOTTOM]; function initSubscribe() { SUBSCRIBE_LIFECYCLE_HOOKS.forEach((name) => UniServiceJSBridge.subscribe(name, createPageEvent(name))); } @@ -3729,7 +3735,7 @@ const createCanvasContext = /* @__PURE__ */ defineSyncApi(API_CREATE_CANVAS_CONT if (pageId) { return new CanvasContext(canvasId, pageId); } else { - UniServiceJSBridge.emit("onError", "createCanvasContext:fail"); + UniServiceJSBridge.emit(ON_ERROR, "createCanvasContext:fail"); } }, CreateCanvasContextProtocol); const canvasGetImageData = /* @__PURE__ */ defineAsyncApi(API_CANVAS_GET_IMAGE_DATA, ({ canvasId, x, y, width, height }, { resolve, reject }) => { @@ -13080,7 +13086,7 @@ function errorHandler(err, instance2, info) { throw err; } { - invokeHook(app.$vm, "onError", err); + invokeHook(app.$vm, ON_ERROR, err); } } function initApp$1(app) { @@ -13263,7 +13269,7 @@ function removeRouteCache(routeKey) { function removePage(routeKey, removeRouteCaches = true) { const pageVm = currentPagesMap.get(routeKey); pageVm.$.__isUnload = true; - invokeHook(pageVm, "onUnload"); + invokeHook(pageVm, ON_UNLOAD); currentPagesMap.delete(routeKey); removeRouteCaches && removeRouteCache(routeKey); } @@ -13400,7 +13406,7 @@ function initPageScrollListener(instance2, pageMeta) { } if (onReachBottom) { opts.onReachBottomDistance = pageMeta.onReachBottomDistance || ON_REACH_BOTTOM_DISTANCE; - opts.onReachBottom = () => UniViewJSBridge.publishHandler("onReachBottom", {}, pageId); + opts.onReachBottom = () => UniViewJSBridge.publishHandler(ON_REACH_BOTTOM, {}, pageId); } curScrollListener = createScrollListener(opts); requestAnimationFrame(() => document.addEventListener("scroll", curScrollListener)); @@ -13408,10 +13414,10 @@ function initPageScrollListener(instance2, pageMeta) { function createOnPageScroll(pageId, onPageScroll, navigationBarTransparent) { return (scrollTop) => { if (onPageScroll) { - UniViewJSBridge.publishHandler("onPageScroll", { scrollTop }, pageId); + UniViewJSBridge.publishHandler(ON_PAGE_SCROLL, { scrollTop }, pageId); } if (navigationBarTransparent) { - UniViewJSBridge.emit(pageId + ".onPageScroll", { + UniViewJSBridge.emit(pageId + "." + ON_PAGE_SCROLL, { scrollTop }); } @@ -13558,18 +13564,9 @@ function setupApp(comp) { onBeforeMount(onLaunch); } onMounted(() => { - window.addEventListener("message", function(evt) { - if (isPlainObject(evt.data) && evt.data.type === WEB_INVOKE_APPSERVICE) { - UniServiceJSBridge.emit("onWebInvokeAppService", evt.data.data, evt.data.pageId); - } - }); - document.addEventListener("visibilitychange", function() { - if (document.visibilityState === "visible") { - UniServiceJSBridge.emit("onAppEnterForeground"); - } else { - UniServiceJSBridge.emit("onAppEnterBackground"); - } - }); + window.addEventListener("resize", debounce(onResize, 50)); + window.addEventListener("message", onMessage); + document.addEventListener("visibilitychange", onVisibilityChange); }); return route.query; }, @@ -13581,6 +13578,28 @@ function setupApp(comp) { } }); } +function onResize() { + const { windowWidth, windowHeight, screenWidth, screenHeight } = uni.getSystemInfoSync(); + const landscape = Math.abs(Number(window.orientation)) === 90; + const deviceOrientation = landscape ? "landscape" : "portrait"; + UniServiceJSBridge.emit(ON_RESIZE, { + deviceOrientation, + size: { + windowWidth, + windowHeight, + screenWidth, + screenHeight + } + }); +} +function onMessage(evt) { + if (isPlainObject(evt.data) && evt.data.type === WEB_INVOKE_APPSERVICE) { + UniServiceJSBridge.emit(ON_WEB_INVOKE_APP_SERVICE, evt.data.data, evt.data.pageId); + } +} +function onVisibilityChange() { + UniServiceJSBridge.emit(document.visibilityState === "visible" ? ON_APP_ENTER_FOREGROUND : ON_APP_ENTER_BACKGROUND); +} function formatTime(val) { val = val > 0 && val < Infinity ? val : 0; const h = Math.floor(val / 3600); @@ -14431,7 +14450,7 @@ var index$8 = /* @__PURE__ */ defineBuiltInComponent({ }; } }); -const onWebInvokeAppService = ({ name, arg }, pageId) => { +const onWebInvokeAppService = ({ name, arg }) => { if (name === "postMessage") ; else { @@ -17271,11 +17290,11 @@ const chooseLocation = /* @__PURE__ */ defineAsyncApi(API_CHOOSE_LOCATION, (args }, ChooseLocationProtocol); const navigateBack = /* @__PURE__ */ defineAsyncApi(API_NAVIGATE_BACK, ({ delta }, { resolve, reject }) => { let canBack = true; - if (invokeHook("onBackPress") === true) { + if (invokeHook(ON_BACK_PRESS) === true) { canBack = false; } if (!canBack) { - return reject("onBackPress"); + return reject(ON_BACK_PRESS); } getApp().$router.go(-delta); return resolve(); @@ -17335,7 +17354,7 @@ function removeNonTabBarPages() { } if (curTabBarPageVm.__isTabBar) { curTabBarPageVm.$.__isVisible = false; - invokeHook(curTabBarPageVm, "onHide"); + invokeHook(curTabBarPageVm, ON_HIDE); } } function getTabBarPageId(url) { @@ -18736,30 +18755,9 @@ function createRightWindowTsx(rightWindow, layoutState, windowState) { }, 8, ["data-show", "style"]), [[vShow, layoutState.showRightWindow || layoutState.apiShowRightWindow]]); } } -var tasks = []; -function onResize() { - tasks.push(setTimeout(() => { - tasks.forEach((task) => clearTimeout(task)); - tasks.length = 0; - const { windowWidth, windowHeight, screenWidth, screenHeight } = uni.getSystemInfoSync(); - var landscape = Math.abs(Number(window.orientation)) === 90; - var deviceOrientation = landscape ? "landscape" : "portrait"; - UniServiceJSBridge.invokeOnCallback(API_ON_WINDOW_RESIZE, { - deviceOrientation, - size: { - windowWidth, - windowHeight, - screenWidth, - screenHeight - } - }); - }, 20)); -} const onWindowResize = /* @__PURE__ */ defineOnApi(API_ON_WINDOW_RESIZE, () => { - window.addEventListener("resize", onResize); }); const offWindowResize = /* @__PURE__ */ defineOffApi(API_OFF_WINDOW_RESIZE, () => { - window.removeEventListener("resize", onResize); }); const showTopWindow = /* @__PURE__ */ defineAsyncApi("showTopWindow", (_, { resolve, reject }) => { const state2 = getLayoutState(); @@ -20963,7 +20961,7 @@ function usePageRefresh(refreshRef) { } refreshControllerElemStyle.transition = "-webkit-transform 0.2s"; refreshControllerElemStyle.transform = "translate3d(-50%, " + height + "px, 0)"; - invokeHook(id2, "onPullDownRefresh"); + invokeHook(id2, ON_PULL_DOWN_REFRESH); } function restoring(callback) { if (!refreshControllerElem) { diff --git a/packages/uni-h5/src/framework/components/page/page-refresh/index.ts b/packages/uni-h5/src/framework/components/page/page-refresh/index.ts index 5a5eb990e972351bfa7deba151352a277b657b2f..16c675f12e4d6b01eac358806650379b6022211d 100644 --- a/packages/uni-h5/src/framework/components/page/page-refresh/index.ts +++ b/packages/uni-h5/src/framework/components/page/page-refresh/index.ts @@ -6,6 +6,7 @@ import { } from '@dcloudio/uni-api' import { useSubscribe, withWebEvent } from '@dcloudio/uni-components' import { usePageMeta } from '../../../setup/provide' +import { ON_PULL_DOWN_REFRESH } from '@dcloudio/uni-shared' function processDeltaY( ev: TouchEvent, @@ -103,7 +104,7 @@ export function usePageRefresh(refreshRef: Ref) { return } - let rotate = deltaY / range + let rotate = deltaY / range! if (rotate > 1) { rotate = 1 @@ -111,7 +112,7 @@ export function usePageRefresh(refreshRef: Ref) { rotate = rotate * rotate * rotate } - const y = Math.round(deltaY / (range / height)) || 0 + const y = Math.round(deltaY / (range! / height!)) || 0 refreshInnerElemStyle.transform = 'rotate(' + 360 * rotate + 'deg)' refreshControllerElemStyle.clip = 'rect(' + (45 - y) + 'px,45px,45px,-5px)' @@ -162,8 +163,8 @@ export function usePageRefresh(refreshRef: Ref) { distance = deltaY - const isReached = deltaY >= range && state !== REACHED - const isPulling = deltaY < range && state !== PULLING + const isReached = deltaY >= range! && state !== REACHED + const isPulling = deltaY < range! && state !== PULLING if (isReached || isPulling) { removeClass() @@ -231,7 +232,7 @@ export function usePageRefresh(refreshRef: Ref) { refreshControllerElemStyle.transition = '-webkit-transform 0.2s' refreshControllerElemStyle.transform = 'translate3d(-50%, ' + height + 'px, 0)' - invokeHook(id!, 'onPullDownRefresh') + invokeHook(id!, ON_PULL_DOWN_REFRESH) } function restoring(callback: Function) { diff --git a/packages/uni-h5/src/framework/setup/index.ts b/packages/uni-h5/src/framework/setup/index.ts index e74f0c9b55f1f2c3520fe9bcc907c2b07ae60c4a..13cc44990099c89fe4442eb89109a19563ae3685 100644 --- a/packages/uni-h5/src/framework/setup/index.ts +++ b/packages/uni-h5/src/framework/setup/index.ts @@ -12,11 +12,23 @@ import { onBeforeMount, } from 'vue' import { useRouter } from 'vue-router' -import { decodedQuery, WEB_INVOKE_APPSERVICE } from '@dcloudio/uni-shared' +import { + debounce, + decodedQuery, + ON_APP_ENTER_BACKGROUND, + ON_APP_ENTER_FOREGROUND, + ON_RESIZE, + ON_WEB_INVOKE_APP_SERVICE, + WEB_INVOKE_APPSERVICE, +} from '@dcloudio/uni-shared' import { LayoutComponent } from '../..' import { initApp } from './app' import { initPage, onPageShow, onPageReady } from './page' import { usePageMeta, usePageRoute } from './provide' +import { + API_ON_WINDOW_RESIZE, + API_TYPE_ON_WINDOW_RESIZE, +} from '@dcloudio/uni-api' interface SetupComponentOptions { init: (vm: ComponentPublicInstance) => void @@ -122,30 +134,9 @@ export function setupApp(comp: any) { onBeforeMount(onLaunch) } onMounted(() => { - window.addEventListener( - 'message', - function (evt: { - data?: { type: string; data: any; pageId: number } - }) { - if ( - isPlainObject(evt.data) && - evt.data.type === WEB_INVOKE_APPSERVICE - ) { - UniServiceJSBridge.emit( - 'onWebInvokeAppService', - evt.data.data, - evt.data.pageId - ) - } - } - ) - document.addEventListener('visibilitychange', function () { - if (document.visibilityState === 'visible') { - UniServiceJSBridge.emit('onAppEnterForeground') - } else { - UniServiceJSBridge.emit('onAppEnterBackground') - } - }) + window.addEventListener('resize', debounce(onResize, 50)) + window.addEventListener('message', onMessage) + document.addEventListener('visibilitychange', onVisibilityChange) }) return route.query }, @@ -157,3 +148,37 @@ export function setupApp(comp: any) { }, }) } + +function onResize() { + const { windowWidth, windowHeight, screenWidth, screenHeight } = + uni.getSystemInfoSync() + const landscape = Math.abs(Number(window.orientation)) === 90 + const deviceOrientation = landscape ? 'landscape' : 'portrait' + UniServiceJSBridge.emit(ON_RESIZE, { + deviceOrientation, + size: { + windowWidth, + windowHeight, + screenWidth, + screenHeight, + }, + }) +} +function onMessage(evt: { + data?: { type: string; data: any; pageId: number } +}) { + if (isPlainObject(evt.data) && evt.data.type === WEB_INVOKE_APPSERVICE) { + UniServiceJSBridge.emit( + ON_WEB_INVOKE_APP_SERVICE, + evt.data.data, + evt.data.pageId + ) + } +} +function onVisibilityChange() { + UniServiceJSBridge.emit( + document.visibilityState === 'visible' + ? ON_APP_ENTER_FOREGROUND + : ON_APP_ENTER_BACKGROUND + ) +} diff --git a/packages/uni-h5/src/framework/setup/page.ts b/packages/uni-h5/src/framework/setup/page.ts index 825da8f0e10a7bd3af69aa74dc263cd2c7e6a47d..e5979b5d05cbcfd5ec41148f031d8f9f342ba2f9 100644 --- a/packages/uni-h5/src/framework/setup/page.ts +++ b/packages/uni-h5/src/framework/setup/page.ts @@ -15,7 +15,12 @@ import { initPageInternalInstance, initPageVm, } from '@dcloudio/uni-core' -import { ON_REACH_BOTTOM_DISTANCE } from '@dcloudio/uni-shared' +import { + ON_PAGE_SCROLL, + ON_REACH_BOTTOM, + ON_REACH_BOTTOM_DISTANCE, + ON_UNLOAD, +} from '@dcloudio/uni-shared' import { usePageMeta } from './provide' import { NavigateType } from '../../service/api/route/utils' import { updateCurPageCssVar } from '../../helpers/cssVar' @@ -63,7 +68,7 @@ function removeRouteCache(routeKey: string) { export function removePage(routeKey: string, removeRouteCaches = true) { const pageVm = currentPagesMap.get(routeKey) as ComponentPublicInstance pageVm.$.__isUnload = true - invokeHook(pageVm, 'onUnload') + invokeHook(pageVm, ON_UNLOAD) currentPagesMap.delete(routeKey) removeRouteCaches && removeRouteCache(routeKey) } @@ -244,7 +249,7 @@ function initPageScrollListener( opts.onReachBottomDistance = pageMeta.onReachBottomDistance || ON_REACH_BOTTOM_DISTANCE opts.onReachBottom = () => - UniViewJSBridge.publishHandler('onReachBottom', {}, pageId) + UniViewJSBridge.publishHandler(ON_REACH_BOTTOM, {}, pageId) } curScrollListener = createScrollListener(opts) // 避免监听太早,直接触发了 scroll @@ -260,10 +265,10 @@ function createOnPageScroll( ) { return (scrollTop: number) => { if (onPageScroll) { - UniViewJSBridge.publishHandler('onPageScroll', { scrollTop }, pageId) + UniViewJSBridge.publishHandler(ON_PAGE_SCROLL, { scrollTop }, pageId) } if (navigationBarTransparent) { - UniViewJSBridge.emit(pageId + '.onPageScroll', { + UniViewJSBridge.emit(pageId + '.' + ON_PAGE_SCROLL, { scrollTop, }) } diff --git a/packages/uni-h5/src/service/api/route/navigateBack.ts b/packages/uni-h5/src/service/api/route/navigateBack.ts index 045e19bf055df290d787ac1481327140a61c908f..0bea99a32c1c752260f31c7ae346a1360337dbb4 100644 --- a/packages/uni-h5/src/service/api/route/navigateBack.ts +++ b/packages/uni-h5/src/service/api/route/navigateBack.ts @@ -6,16 +6,17 @@ import { NavigateBackOptions, NavigateBackProtocol, } from '@dcloudio/uni-api' +import { ON_BACK_PRESS } from '@dcloudio/uni-shared' export const navigateBack = defineAsyncApi( API_NAVIGATE_BACK, ({ delta }, { resolve, reject }) => { let canBack = true - if (invokeHook('onBackPress') === true) { + if (invokeHook(ON_BACK_PRESS) === true) { canBack = false } if (!canBack) { - return reject('onBackPress') + return reject(ON_BACK_PRESS) } getApp().$router.go(-delta!) return resolve() diff --git a/packages/uni-h5/src/service/api/route/switchTab.ts b/packages/uni-h5/src/service/api/route/switchTab.ts index d008fe735ea23be8824334cdf94f7be8cffec874..7ced71eccfcd613c2fd4ba94b0c1dfde77651ffd 100644 --- a/packages/uni-h5/src/service/api/route/switchTab.ts +++ b/packages/uni-h5/src/service/api/route/switchTab.ts @@ -9,6 +9,7 @@ import { import { getCurrentPageVm, invokeHook } from '@dcloudio/uni-core' import { getCurrentPagesMap, removePage } from '../../../framework/setup/page' import { navigate } from './utils' +import { ON_HIDE } from '@dcloudio/uni-shared' function removeNonTabBarPages() { const curTabBarPageVm = getCurrentPageVm() @@ -27,7 +28,7 @@ function removeNonTabBarPages() { } if (curTabBarPageVm.__isTabBar) { curTabBarPageVm.$.__isVisible = false - invokeHook(curTabBarPageVm, 'onHide') + invokeHook(curTabBarPageVm, ON_HIDE) } } diff --git a/packages/uni-h5/src/service/api/ui/window.ts b/packages/uni-h5/src/service/api/ui/window.ts index 64df45cb4d0e54ad9b62c64c83dd4a777e9938e5..f1ab9cb404321bcf31a1e241ee7af3dc740160e8 100644 --- a/packages/uni-h5/src/service/api/ui/window.ts +++ b/packages/uni-h5/src/service/api/ui/window.ts @@ -12,54 +12,23 @@ import { } from '@dcloudio/uni-api' import { getLayoutState } from '../../../framework/components/layout' -var tasks: number[] = [] - -function onResize() { - tasks.push( - setTimeout(() => { - tasks.forEach((task) => clearTimeout(task)) - tasks.length = 0 - - const { windowWidth, windowHeight, screenWidth, screenHeight } = - uni.getSystemInfoSync() - var landscape = Math.abs(Number(window.orientation)) === 90 - var deviceOrientation = landscape ? 'landscape' : 'portrait' - - UniServiceJSBridge.invokeOnCallback( - API_ON_WINDOW_RESIZE, - { - // @ts-ignore - deviceOrientation, - size: { - windowWidth, - windowHeight, - screenWidth, - screenHeight, - }, - } - ) - }, 20) - ) -} - /** * 监听窗口大小变化 - * @param {*} callbackId */ export const onWindowResize = defineOnApi( API_ON_WINDOW_RESIZE, () => { - window.addEventListener('resize', onResize) + // 生命周期包括onResize,框架直接监听resize + // window.addEventListener('resize', onResize) } ) /** * 取消监听窗口大小变化 - * @param {*} callbackId */ export const offWindowResize = defineOffApi( API_OFF_WINDOW_RESIZE, () => { - window.removeEventListener('resize', onResize) + // window.removeEventListener('resize', onResize) } ) diff --git a/packages/uni-h5/src/service/onWebInvokeAppService.ts b/packages/uni-h5/src/service/onWebInvokeAppService.ts index ecc1230f85ad536c29cf859cb6f74da7af43d88e..e64b0e808665746c673a15e40559a35699d2f4e3 100644 --- a/packages/uni-h5/src/service/onWebInvokeAppService.ts +++ b/packages/uni-h5/src/service/onWebInvokeAppService.ts @@ -14,10 +14,7 @@ export type WebInvokeAppService = ( pageId: number | number[] ) => void -export const onWebInvokeAppService: WebInvokeAppService = ( - { name, arg }, - pageId -) => { +export const onWebInvokeAppService: WebInvokeAppService = ({ name, arg }) => { if (name === 'postMessage') { // TODO 小程序后退、组件销毁、分享时通知 } else { diff --git a/packages/uni-mp-alipay/src/runtime/createPage.ts b/packages/uni-mp-alipay/src/runtime/createPage.ts index 77954e97fef08d5e3bf80c7654d4fa9e6a16f26f..683016d219ec52de8f3c9fdb77890a26f7100f0d 100644 --- a/packages/uni-mp-alipay/src/runtime/createPage.ts +++ b/packages/uni-mp-alipay/src/runtime/createPage.ts @@ -10,7 +10,13 @@ import { initWxsCallMethods, } from '@dcloudio/uni-mp-core' -import { stringifyQuery } from '@dcloudio/uni-shared' +import { + ON_BACK_PRESS, + ON_LOAD, + ON_READY, + ON_UNLOAD, + stringifyQuery, +} from '@dcloudio/uni-shared' import { handleRef, @@ -33,23 +39,23 @@ export function createPage(vueOptions: ComponentOptions) { // 初始化 vue 实例 this.$vm = createVueComponent('page', this, vueOptions) initSpecialMethods(this) - this.$vm.$callHook('onLoad', query) + this.$vm.$callHook(ON_LOAD, query) }, onReady() { initChildVues(this) this.$vm.$callHook('mounted') - this.$vm.$callHook('onReady') + this.$vm.$callHook(ON_READY) }, onUnload() { if (this.$vm) { - this.$vm.$callHook('onUnload') + this.$vm.$callHook(ON_UNLOAD) $destroyComponent(this.$vm) } }, events: { // 支付宝小程序有些页面事件只能放在events下 onBack() { - this.$vm.$callHook('onBackPress') + this.$vm.$callHook(ON_BACK_PRESS) }, }, __r: handleRef, diff --git a/packages/uni-mp-alipay/src/runtime/util.ts b/packages/uni-mp-alipay/src/runtime/util.ts index 91657186ad630a9985e9f33df6842feacbf9591e..7fa5e04e62eeec6331f904764acb6531e015b3d6 100644 --- a/packages/uni-mp-alipay/src/runtime/util.ts +++ b/packages/uni-mp-alipay/src/runtime/util.ts @@ -16,6 +16,7 @@ import { import { handleLink as handleBaseLink } from '@dcloudio/uni-mp-weixin' import deepEqual from './deepEqual' +import { ON_READY } from '@dcloudio/uni-shared' type MPPageInstance = tinyapp.IPageInstance> export type MPComponentInstance = tinyapp.IComponentInstance< @@ -115,7 +116,7 @@ export function initChildVues( initChildVues(childMPInstance) childMPInstance.$vm.$callHook('mounted') - childMPInstance.$vm.$callHook('onReady') + childMPInstance.$vm.$callHook(ON_READY) }) } diff --git a/packages/uni-mp-baidu/src/runtime/parseAppOptions.ts b/packages/uni-mp-baidu/src/runtime/parseAppOptions.ts index 1c4bf5cec2ffe7962c9ea06a2f310fd4ef80d197..cfd6c7bc86c95dabcaf2de2555d16e4ecf1d327b 100644 --- a/packages/uni-mp-baidu/src/runtime/parseAppOptions.ts +++ b/packages/uni-mp-baidu/src/runtime/parseAppOptions.ts @@ -2,6 +2,7 @@ import { MiniProgramAppOptions, MiniProgramAppInstance, } from '@dcloudio/uni-mp-core' +import { ON_SHOW } from '@dcloudio/uni-shared' export function parse(appOptions: MiniProgramAppOptions) { // 百度 onShow 竟然会在 onLaunch 之前 @@ -9,6 +10,6 @@ export function parse(appOptions: MiniProgramAppOptions) { if (!this.$vm) { this.onLaunch(args) } - this.$vm!.$callHook('onShow', args) + this.$vm!.$callHook(ON_SHOW, args) } } diff --git a/packages/uni-mp-baidu/src/runtime/parseComponentOptions.ts b/packages/uni-mp-baidu/src/runtime/parseComponentOptions.ts index 24509ba3f58f860e29e59a3c682442505d25ad8c..800b4edb5b1fbedfddf619302e950d215597f813 100644 --- a/packages/uni-mp-baidu/src/runtime/parseComponentOptions.ts +++ b/packages/uni-mp-baidu/src/runtime/parseComponentOptions.ts @@ -1,6 +1,7 @@ import { hasOwn } from '@vue/shared' import { MPComponentInstance, MPComponentOptions } from '@dcloudio/uni-mp-core' +import { ON_LOAD, ON_SHOW } from '@dcloudio/uni-shared' export { handleLink, initLifetimes } from '@dcloudio/uni-mp-weixin' @@ -35,8 +36,8 @@ export function parse(componentOptions: MPComponentOptions) { const pageInstance = (this as any).pageinstance pageInstance.$vm = this.$vm if (hasOwn(pageInstance, '_$args')) { - this.$vm.$callHook('onLoad', pageInstance._$args) - this.$vm.$callHook('onShow') + this.$vm.$callHook(ON_LOAD, pageInstance._$args) + this.$vm.$callHook(ON_SHOW) delete pageInstance._$args } } else { diff --git a/packages/uni-mp-baidu/src/runtime/parsePageOptions.ts b/packages/uni-mp-baidu/src/runtime/parsePageOptions.ts index c932132587473c7d10a422c2a8a58df29ae961a4..bf63204a81394b106cd24012a5ee1f94d1732247 100644 --- a/packages/uni-mp-baidu/src/runtime/parsePageOptions.ts +++ b/packages/uni-mp-baidu/src/runtime/parsePageOptions.ts @@ -1,4 +1,5 @@ import { MPComponentOptions, MPComponentInstance } from '@dcloudio/uni-mp-core' +import { ON_LOAD, ON_SHOW } from '@dcloudio/uni-shared' import { parse as parseComponentOptions } from './parseComponentOptions' @@ -13,7 +14,7 @@ export function parse(pageOptions: MPComponentOptions) { // 纠正百度小程序生命周期methods:onShow在methods:onLoad之前触发的问题 methods.onShow = function onShow(this: MPComponentInstance) { if (this.$vm && this._$loaded) { - this.$vm.$callHook('onShow') + this.$vm.$callHook(ON_SHOW) } } @@ -21,8 +22,8 @@ export function parse(pageOptions: MPComponentOptions) { // 百度 onLoad 在 attached 之前触发,先存储 args, 在 attached 里边触发 onLoad if (this.$vm) { ;(this as any)._$loaded = true - this.$vm.$callHook('onLoad', args) - this.$vm.$callHook('onShow') + this.$vm.$callHook(ON_LOAD, args) + this.$vm.$callHook(ON_SHOW) } else { ;(this as any).pageinstance._$args = args } diff --git a/packages/uni-mp-core/src/runtime/app.ts b/packages/uni-mp-core/src/runtime/app.ts index 454ceaf0aad857e77b988f7b505dd8086951e5d1..bb7f6a4f472f0aa57cc6db6e319117a7e0f484f5 100644 --- a/packages/uni-mp-core/src/runtime/app.ts +++ b/packages/uni-mp-core/src/runtime/app.ts @@ -5,6 +5,15 @@ import { initBaseInstance } from './componentInstance' import { initHooks, initUnknownHooks } from './componentHooks' import App = WechatMiniprogram.App +import { + ON_ERROR, + ON_HIDE, + ON_LAUNCH, + ON_PAGE_NOT_FOUND, + ON_SHOW, + ON_THEME_CHANGE, + ON_UNHANDLE_REJECTION, +} from '@dcloudio/uni-shared' export interface CustomAppInstanceProperty extends Record { globalData: Record $vm?: ComponentPublicInstance @@ -14,12 +23,12 @@ export type MiniProgramAppOptions = App.Options export type MiniProgramAppInstance = App.Instance const HOOKS = [ - 'onShow', - 'onHide', - 'onError', - 'onThemeChange', - 'onPageNotFound', - 'onUnhandledRejection', + ON_SHOW, + ON_HIDE, + ON_ERROR, + ON_THEME_CHANGE, + ON_PAGE_NOT_FOUND, + ON_UNHANDLE_REJECTION, ] export interface ParseAppOptions { @@ -48,7 +57,7 @@ function parseApp( }) ctx.globalData = this.globalData - instance.$callHook('onLaunch', options) + instance.$callHook(ON_LAUNCH, options) }, } diff --git a/packages/uni-mp-core/src/runtime/componentHooks.ts b/packages/uni-mp-core/src/runtime/componentHooks.ts index 6957430c12f21fcabd808c08716f56fd48e7c972..6dd7f7f45586fd1eaeb032d3ff6b61083b7b8131 100644 --- a/packages/uni-mp-core/src/runtime/componentHooks.ts +++ b/packages/uni-mp-core/src/runtime/componentHooks.ts @@ -1,3 +1,15 @@ +import { + ON_ADD_TO_FAVORITES, + ON_HIDE, + ON_LOAD, + ON_PULL_DOWN_REFRESH, + ON_REACH_BOTTOM, + ON_READY, + ON_RESIZE, + ON_SHOW, + ON_TAB_ITEM_TAP, + ON_UNLOAD, +} from '@dcloudio/uni-shared' import { hasOwn, isFunction } from '@vue/shared' import { ComponentOptions } from 'vue' @@ -7,20 +19,18 @@ import { CustomAppInstanceProperty } from './app' import { CustomComponentInstanceProperty } from './component' export const PAGE_HOOKS = [ - 'onLoad', - 'onShow', + ON_LOAD, + ON_SHOW, + ON_HIDE, + ON_UNLOAD, + ON_RESIZE, + ON_TAB_ITEM_TAP, + ON_REACH_BOTTOM, + ON_PULL_DOWN_REFRESH, + ON_ADD_TO_FAVORITES, // 'onReady', // lifetimes.ready - 'onHide', - 'onUnload', - - 'onResize', // 'onPageScroll', // 影响性能,开发者手动注册 - 'onTabItemTap', - 'onReachBottom', - 'onPullDownRefresh', - // 'onShareTimeline', // 右上角菜单,开发者手动注册 - 'onAddToFavorites', // 'onShareAppMessage' // 右上角菜单,开发者手动注册 ] @@ -65,7 +75,7 @@ function initHook( } } -const EXCLUDE_HOOKS = ['onReady'] +const EXCLUDE_HOOKS = [ON_READY] export function initHooks( mpOptions: MiniProgramAppOptions | WechatMiniprogram.Component.MethodOption, diff --git a/packages/uni-mp-core/src/runtime/page.ts b/packages/uni-mp-core/src/runtime/page.ts index e09aaf26e0b470c05e32890bfada650b73cb5494..de1a275eea6ba1fc339efb55a7b73a9c86e97395 100644 --- a/packages/uni-mp-core/src/runtime/page.ts +++ b/packages/uni-mp-core/src/runtime/page.ts @@ -1,6 +1,6 @@ import { ComponentOptions } from 'vue' -import { stringifyQuery } from '@dcloudio/uni-shared' +import { ON_LOAD, stringifyQuery } from '@dcloudio/uni-shared' import { ParseComponentOptions, @@ -34,7 +34,7 @@ function parsePage( ;(this as any).$page = { fullPath: '/' + (this as any).route + stringifyQuery(query), } - return this.$vm && this.$vm.$callHook('onLoad', query) + return this.$vm && this.$vm.$callHook(ON_LOAD, query) } initHooks(methods, PAGE_HOOKS) diff --git a/packages/uni-mp-core/src/runtime/polyfill.ts b/packages/uni-mp-core/src/runtime/polyfill.ts index 60b7e028f11628dd4425770f925fd2732e8e2f91..5d79db9becbce02e026549a7505f390add529244 100644 --- a/packages/uni-mp-core/src/runtime/polyfill.ts +++ b/packages/uni-mp-core/src/runtime/polyfill.ts @@ -1,3 +1,4 @@ +import { ON_LOAD } from '@dcloudio/uni-shared' import { camelize } from '@vue/shared' import { MPComponentInstance } from './component' @@ -32,7 +33,7 @@ function initHook(name: 'onLoad' | 'created', options: Record) { } Page = function (options) { - initHook('onLoad', options) + initHook(ON_LOAD, options) return MPPage(options) } diff --git a/packages/uni-mp-toutiao/src/runtime/pageLifetimes.ts b/packages/uni-mp-toutiao/src/runtime/pageLifetimes.ts index 711376d46b4c263bdf2f242f0dec574275a8d285..04e18904b5b52a7c87360ee8b3c13ef8b0465375 100644 --- a/packages/uni-mp-toutiao/src/runtime/pageLifetimes.ts +++ b/packages/uni-mp-toutiao/src/runtime/pageLifetimes.ts @@ -9,6 +9,7 @@ import { $destroyComponent } from '@dcloudio/uni-mp-core' import { initLifetimes as initComponentLifetimes } from './componentLifetimes' import { instances } from './parseComponentOptions' +import { ON_READY } from '@dcloudio/uni-shared' export function initLifetimes(lifetimesOptions: CreateLifetimesOptions) { return extend(initComponentLifetimes(lifetimesOptions), { @@ -19,7 +20,7 @@ export function initLifetimes(lifetimesOptions: CreateLifetimesOptions) { } this.$vm.$callSyncHook('created') this.$vm.$callHook('mounted') - this.$vm.$callHook('onReady') + this.$vm.$callHook(ON_READY) } else { this.is && console.warn(this.is + ' is not ready') } diff --git a/packages/uni-mp-toutiao/src/runtime/parseComponentOptions.ts b/packages/uni-mp-toutiao/src/runtime/parseComponentOptions.ts index 4b03bb7132c1cbdb498898d49abea3df2df7cb22..38aeda0fc7bd401e8ef49df7d83fb3d1aa551b36 100644 --- a/packages/uni-mp-toutiao/src/runtime/parseComponentOptions.ts +++ b/packages/uni-mp-toutiao/src/runtime/parseComponentOptions.ts @@ -6,6 +6,7 @@ import { findVmByVueId } from '@dcloudio/uni-mp-core' import { initInjections, initProvide } from './apiInject' import { ParseComponentOptions } from 'packages/uni-mp-core/src/runtime/component' +import { ON_READY } from '@dcloudio/uni-shared' export { initLifetimes } from './componentLifetimes' @@ -78,7 +79,7 @@ export function handleLink( vm.$callSyncHook('created') vm.$callHook('mounted') - vm.$callHook('onReady') + vm.$callHook(ON_READY) } export function parse( diff --git a/packages/uni-mp-vue/dist/vue.runtime.esm.js b/packages/uni-mp-vue/dist/vue.runtime.esm.js deleted file mode 100644 index 776cd613c03334c6430c56ca0c3e0ccffd8b018e..0000000000000000000000000000000000000000 --- a/packages/uni-mp-vue/dist/vue.runtime.esm.js +++ /dev/null @@ -1,4135 +0,0 @@ -import { isFunction, isSymbol, extend, isMap, isObject, toRawType, def, isArray, isString, isPromise, toHandlerKey, remove, EMPTY_OBJ, camelize, capitalize, normalizeClass, normalizeStyle, isOn, NOOP, isGloballyWhitelisted, isIntegerKey, hasOwn, hasChanged, invokeArrayFns as invokeArrayFns$1, makeMap, isSet, NO, toNumber, hyphenate, isReservedProp, EMPTY_ARR, toTypeString } from '@vue/shared'; -export { camelize } from '@vue/shared'; -import { injectHook as injectHook$1 } from 'vue'; - -function applyOptions$1(options, instance, publicThis) { - Object.keys(options).forEach((name) => { - if (name.indexOf('on') === 0) { - const hook = options[name]; - if (isFunction(hook)) { - injectHook$1(name, hook.bind(publicThis), instance); - } - } - }); -} - -const invokeArrayFns = (fns, arg) => { - let ret; - for (let i = 0; i < fns.length; i++) { - ret = fns[i](arg); - } - return ret; -}; - -function set$2(target, key, val) { - return (target[key] = val); -} -function hasHook(name) { - const hooks = this.$[name]; - if (hooks && hooks.length) { - return true; - } - return false; -} -function callHook(name, args) { - const hooks = this.$[name]; - return hooks && invokeArrayFns(hooks, args); -} - -function errorHandler(err, instance, info) { - if (!instance) { - throw err; - } - const app = getApp(); - if (!app || !app.$vm) { - throw err; - } - { - app.$vm.$callHook('onError', err, info); - } -} - -function initApp(app) { - const appConfig = app._context.config; - if (isFunction(app._component.onError)) { - appConfig.errorHandler = errorHandler; - } - const globalProperties = appConfig.globalProperties; - { - // 小程序,待重构,不再挂靠全局 - globalProperties.$hasHook = hasHook; - globalProperties.$callHook = callHook; - } - if (__VUE_OPTIONS_API__) { - globalProperties.$set = set$2; - globalProperties.$applyOptions = applyOptions$1; - } -} - -var plugin = { - install(app) { - initApp(app); - const globalProperties = app._context.config.globalProperties; - const oldCallHook = globalProperties.$callHook; - globalProperties.$callHook = function callHook(name, args) { - if (name === 'mounted') { - oldCallHook.call(this, 'bm'); // beforeMount - this.$.isMounted = true; - name = 'm'; - } - return oldCallHook.call(this, name, args); - }; - const oldMount = app.mount; - app.mount = function mount(rootContainer) { - const instance = oldMount.call(app, rootContainer); - // @ts-ignore - createMiniProgramApp(instance); - return instance; - }; - }, -}; - -const targetMap = new WeakMap(); -const effectStack = []; -let activeEffect; -const ITERATE_KEY = Symbol((process.env.NODE_ENV !== 'production') ? 'iterate' : ''); -const MAP_KEY_ITERATE_KEY = Symbol((process.env.NODE_ENV !== 'production') ? 'Map key iterate' : ''); -function isEffect(fn) { - return fn && fn._isEffect === true; -} -function effect(fn, options = EMPTY_OBJ) { - if (isEffect(fn)) { - fn = fn.raw; - } - const effect = createReactiveEffect(fn, options); - if (!options.lazy) { - effect(); - } - return effect; -} -function stop(effect) { - if (effect.active) { - cleanup(effect); - if (effect.options.onStop) { - effect.options.onStop(); - } - effect.active = false; - } -} -let uid = 0; -function createReactiveEffect(fn, options) { - const effect = function reactiveEffect() { - if (!effect.active) { - return options.scheduler ? undefined : fn(); - } - if (!effectStack.includes(effect)) { - cleanup(effect); - try { - enableTracking(); - effectStack.push(effect); - activeEffect = effect; - return fn(); - } - finally { - effectStack.pop(); - resetTracking(); - activeEffect = effectStack[effectStack.length - 1]; - } - } - }; - effect.id = uid++; - effect.allowRecurse = !!options.allowRecurse; - effect._isEffect = true; - effect.active = true; - effect.raw = fn; - effect.deps = []; - effect.options = options; - return effect; -} -function cleanup(effect) { - const { deps } = effect; - if (deps.length) { - for (let i = 0; i < deps.length; i++) { - deps[i].delete(effect); - } - deps.length = 0; - } -} -let shouldTrack = true; -const trackStack = []; -function pauseTracking() { - trackStack.push(shouldTrack); - shouldTrack = false; -} -function enableTracking() { - trackStack.push(shouldTrack); - shouldTrack = true; -} -function resetTracking() { - const last = trackStack.pop(); - shouldTrack = last === undefined ? true : last; -} -function track(target, type, key) { - if (!shouldTrack || activeEffect === undefined) { - return; - } - let depsMap = targetMap.get(target); - if (!depsMap) { - targetMap.set(target, (depsMap = new Map())); - } - let dep = depsMap.get(key); - if (!dep) { - depsMap.set(key, (dep = new Set())); - } - if (!dep.has(activeEffect)) { - dep.add(activeEffect); - activeEffect.deps.push(dep); - if ((process.env.NODE_ENV !== 'production') && activeEffect.options.onTrack) { - activeEffect.options.onTrack({ - effect: activeEffect, - target, - type, - key - }); - } - } -} -function trigger(target, type, key, newValue, oldValue, oldTarget) { - const depsMap = targetMap.get(target); - if (!depsMap) { - // never been tracked - return; - } - const effects = new Set(); - const add = (effectsToAdd) => { - if (effectsToAdd) { - effectsToAdd.forEach(effect => { - if (effect !== activeEffect || effect.allowRecurse) { - effects.add(effect); - } - }); - } - }; - if (type === "clear" /* CLEAR */) { - // collection being cleared - // trigger all effects for target - depsMap.forEach(add); - } - else if (key === 'length' && isArray(target)) { - depsMap.forEach((dep, key) => { - if (key === 'length' || key >= newValue) { - add(dep); - } - }); - } - else { - // schedule runs for SET | ADD | DELETE - if (key !== void 0) { - add(depsMap.get(key)); - } - // also run for iteration key on ADD | DELETE | Map.SET - switch (type) { - case "add" /* ADD */: - if (!isArray(target)) { - add(depsMap.get(ITERATE_KEY)); - if (isMap(target)) { - add(depsMap.get(MAP_KEY_ITERATE_KEY)); - } - } - else if (isIntegerKey(key)) { - // new index added to array -> length changes - add(depsMap.get('length')); - } - break; - case "delete" /* DELETE */: - if (!isArray(target)) { - add(depsMap.get(ITERATE_KEY)); - if (isMap(target)) { - add(depsMap.get(MAP_KEY_ITERATE_KEY)); - } - } - break; - case "set" /* SET */: - if (isMap(target)) { - add(depsMap.get(ITERATE_KEY)); - } - break; - } - } - const run = (effect) => { - if ((process.env.NODE_ENV !== 'production') && effect.options.onTrigger) { - effect.options.onTrigger({ - effect, - target, - key, - type, - newValue, - oldValue, - oldTarget - }); - } - if (effect.options.scheduler) { - effect.options.scheduler(effect); - } - else { - effect(); - } - }; - effects.forEach(run); -} - -const isNonTrackableKeys = /*#__PURE__*/ makeMap(`__proto__,__v_isRef,__isVue`); -const builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol) - .map(key => Symbol[key]) - .filter(isSymbol)); -const get = /*#__PURE__*/ createGetter(); -const shallowGet = /*#__PURE__*/ createGetter(false, true); -const readonlyGet = /*#__PURE__*/ createGetter(true); -const shallowReadonlyGet = /*#__PURE__*/ createGetter(true, true); -const arrayInstrumentations = {}; -['includes', 'indexOf', 'lastIndexOf'].forEach(key => { - const method = Array.prototype[key]; - arrayInstrumentations[key] = function (...args) { - const arr = toRaw(this); - for (let i = 0, l = this.length; i < l; i++) { - track(arr, "get" /* GET */, i + ''); - } - // we run the method using the original args first (which may be reactive) - const res = method.apply(arr, args); - if (res === -1 || res === false) { - // if that didn't work, run it again using raw values. - return method.apply(arr, args.map(toRaw)); - } - else { - return res; - } - }; -}); -['push', 'pop', 'shift', 'unshift', 'splice'].forEach(key => { - const method = Array.prototype[key]; - arrayInstrumentations[key] = function (...args) { - pauseTracking(); - const res = method.apply(this, args); - resetTracking(); - return res; - }; -}); -function createGetter(isReadonly = false, shallow = false) { - return function get(target, key, receiver) { - if (key === "__v_isReactive" /* IS_REACTIVE */) { - return !isReadonly; - } - else if (key === "__v_isReadonly" /* IS_READONLY */) { - return isReadonly; - } - else if (key === "__v_raw" /* RAW */ && - receiver === - (isReadonly - ? shallow - ? shallowReadonlyMap - : readonlyMap - : shallow - ? shallowReactiveMap - : reactiveMap).get(target)) { - return target; - } - const targetIsArray = isArray(target); - if (!isReadonly && targetIsArray && hasOwn(arrayInstrumentations, key)) { - return Reflect.get(arrayInstrumentations, key, receiver); - } - const res = Reflect.get(target, key, receiver); - if (isSymbol(key) - ? builtInSymbols.has(key) - : isNonTrackableKeys(key)) { - return res; - } - if (!isReadonly) { - track(target, "get" /* GET */, key); - } - if (shallow) { - return res; - } - if (isRef(res)) { - // ref unwrapping - does not apply for Array + integer key. - const shouldUnwrap = !targetIsArray || !isIntegerKey(key); - return shouldUnwrap ? res.value : res; - } - if (isObject(res)) { - // Convert returned value into a proxy as well. we do the isObject check - // here to avoid invalid value warning. Also need to lazy access readonly - // and reactive here to avoid circular dependency. - return isReadonly ? readonly(res) : reactive(res); - } - return res; - }; -} -const set = /*#__PURE__*/ createSetter(); -const shallowSet = /*#__PURE__*/ createSetter(true); -function createSetter(shallow = false) { - return function set(target, key, value, receiver) { - const oldValue = target[key]; - if (!shallow) { - 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); - // don't trigger if target is something up in the prototype chain of original - if (target === toRaw(receiver)) { - if (!hadKey) { - trigger(target, "add" /* ADD */, key, value); - } - else if (hasChanged(value, oldValue)) { - trigger(target, "set" /* SET */, key, value, oldValue); - } - } - return result; - }; -} -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" /* DELETE */, key, undefined, oldValue); - } - return result; -} -function has(target, key) { - const result = Reflect.has(target, key); - if (!isSymbol(key) || !builtInSymbols.has(key)) { - track(target, "has" /* HAS */, key); - } - return result; -} -function ownKeys(target) { - track(target, "iterate" /* ITERATE */, isArray(target) ? 'length' : ITERATE_KEY); - return Reflect.ownKeys(target); -} -const mutableHandlers = { - get, - set, - deleteProperty, - has, - ownKeys -}; -const readonlyHandlers = { - get: readonlyGet, - set(target, key) { - if ((process.env.NODE_ENV !== 'production')) { - console.warn(`Set operation on key "${String(key)}" failed: target is readonly.`, target); - } - return true; - }, - deleteProperty(target, key) { - if ((process.env.NODE_ENV !== 'production')) { - console.warn(`Delete operation on key "${String(key)}" failed: target is readonly.`, target); - } - return true; - } -}; -const shallowReactiveHandlers = extend({}, mutableHandlers, { - get: shallowGet, - set: shallowSet -}); -// Props handlers are special in the sense that it should not unwrap top-level -// refs (in order to allow refs to be explicitly passed down), but should -// retain the reactivity of the normal readonly object. -const shallowReadonlyHandlers = extend({}, readonlyHandlers, { - get: shallowReadonlyGet -}); - -const toReactive = (value) => isObject(value) ? reactive(value) : value; -const toReadonly = (value) => isObject(value) ? readonly(value) : value; -const toShallow = (value) => value; -const getProto = (v) => Reflect.getPrototypeOf(v); -function get$1(target, key, isReadonly = false, isShallow = false) { - // #1772: readonly(reactive(Map)) should return readonly + reactive version - // of the value - target = target["__v_raw" /* RAW */]; - const rawTarget = toRaw(target); - const rawKey = toRaw(key); - if (key !== rawKey) { - !isReadonly && track(rawTarget, "get" /* GET */, key); - } - !isReadonly && track(rawTarget, "get" /* GET */, rawKey); - const { has } = getProto(rawTarget); - const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive; - if (has.call(rawTarget, key)) { - return wrap(target.get(key)); - } - else if (has.call(rawTarget, rawKey)) { - return wrap(target.get(rawKey)); - } -} -function has$1(key, isReadonly = false) { - const target = this["__v_raw" /* RAW */]; - const rawTarget = toRaw(target); - const rawKey = toRaw(key); - if (key !== rawKey) { - !isReadonly && track(rawTarget, "has" /* HAS */, key); - } - !isReadonly && track(rawTarget, "has" /* HAS */, rawKey); - return key === rawKey - ? target.has(key) - : target.has(key) || target.has(rawKey); -} -function size(target, isReadonly = false) { - target = target["__v_raw" /* RAW */]; - !isReadonly && track(toRaw(target), "iterate" /* ITERATE */, ITERATE_KEY); - return Reflect.get(target, 'size', target); -} -function add(value) { - 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" /* ADD */, value, value); - } - return this; -} -function set$1(key, value) { - value = toRaw(value); - const target = toRaw(this); - const { has, get } = getProto(target); - let hadKey = has.call(target, key); - if (!hadKey) { - key = toRaw(key); - hadKey = has.call(target, key); - } - else if ((process.env.NODE_ENV !== 'production')) { - checkIdentityKeys(target, has, key); - } - const oldValue = get.call(target, key); - target.set(key, value); - if (!hadKey) { - trigger(target, "add" /* ADD */, key, value); - } - else if (hasChanged(value, oldValue)) { - trigger(target, "set" /* SET */, key, value, oldValue); - } - return this; -} -function deleteEntry(key) { - const target = toRaw(this); - const { has, get } = getProto(target); - let hadKey = has.call(target, key); - if (!hadKey) { - key = toRaw(key); - hadKey = has.call(target, key); - } - else if ((process.env.NODE_ENV !== 'production')) { - checkIdentityKeys(target, has, key); - } - const oldValue = get ? get.call(target, key) : undefined; - // forward the operation before queueing reactions - const result = target.delete(key); - if (hadKey) { - trigger(target, "delete" /* DELETE */, key, undefined, oldValue); - } - return result; -} -function clear() { - const target = toRaw(this); - const hadItems = target.size !== 0; - const oldTarget = (process.env.NODE_ENV !== 'production') - ? isMap(target) - ? new Map(target) - : new Set(target) - : undefined; - // forward the operation before queueing reactions - const result = target.clear(); - if (hadItems) { - trigger(target, "clear" /* CLEAR */, undefined, undefined, oldTarget); - } - return result; -} -function createForEach(isReadonly, isShallow) { - return function forEach(callback, thisArg) { - const observed = this; - const target = observed["__v_raw" /* RAW */]; - const rawTarget = toRaw(target); - const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive; - !isReadonly && track(rawTarget, "iterate" /* ITERATE */, ITERATE_KEY); - return target.forEach((value, key) => { - // important: make sure the callback is - // 1. invoked with the reactive map as `this` and 3rd arg - // 2. the value received should be a corresponding reactive/readonly. - return callback.call(thisArg, wrap(value), wrap(key), observed); - }); - }; -} -function createIterableMethod(method, isReadonly, isShallow) { - return function (...args) { - const target = this["__v_raw" /* 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" /* ITERATE */, isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY); - // return a wrapped iterator which returns observed versions of the - // values emitted from the real iterator - return { - // iterator protocol - next() { - const { value, done } = innerIterator.next(); - return done - ? { value, done } - : { - value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), - done - }; - }, - // iterable protocol - [Symbol.iterator]() { - return this; - } - }; - }; -} -function createReadonlyMethod(type) { - return function (...args) { - if ((process.env.NODE_ENV !== 'production')) { - const key = args[0] ? `on key "${args[0]}" ` : ``; - console.warn(`${capitalize(type)} operation ${key}failed: target is readonly.`, toRaw(this)); - } - return type === "delete" /* DELETE */ ? false : this; - }; -} -const mutableInstrumentations = { - get(key) { - return get$1(this, key); - }, - get size() { - return size(this); - }, - has: has$1, - add, - set: set$1, - delete: deleteEntry, - clear, - forEach: createForEach(false, false) -}; -const shallowInstrumentations = { - get(key) { - return get$1(this, key, false, true); - }, - get size() { - return size(this); - }, - has: has$1, - add, - set: set$1, - delete: deleteEntry, - clear, - forEach: createForEach(false, true) -}; -const readonlyInstrumentations = { - get(key) { - return get$1(this, key, true); - }, - get size() { - return size(this, true); - }, - has(key) { - return has$1.call(this, key, true); - }, - add: createReadonlyMethod("add" /* ADD */), - set: createReadonlyMethod("set" /* SET */), - delete: createReadonlyMethod("delete" /* DELETE */), - clear: createReadonlyMethod("clear" /* CLEAR */), - forEach: createForEach(true, false) -}; -const shallowReadonlyInstrumentations = { - get(key) { - return get$1(this, key, true, true); - }, - get size() { - return size(this, true); - }, - has(key) { - return has$1.call(this, key, true); - }, - add: createReadonlyMethod("add" /* ADD */), - set: createReadonlyMethod("set" /* SET */), - delete: createReadonlyMethod("delete" /* DELETE */), - clear: createReadonlyMethod("clear" /* CLEAR */), - forEach: createForEach(true, true) -}; -const iteratorMethods = ['keys', 'values', 'entries', Symbol.iterator]; -iteratorMethods.forEach(method => { - mutableInstrumentations[method] = createIterableMethod(method, false, false); - readonlyInstrumentations[method] = createIterableMethod(method, true, false); - shallowInstrumentations[method] = createIterableMethod(method, false, true); - shallowReadonlyInstrumentations[method] = createIterableMethod(method, true, true); -}); -function createInstrumentationGetter(isReadonly, shallow) { - const instrumentations = shallow - ? isReadonly - ? shallowReadonlyInstrumentations - : shallowInstrumentations - : isReadonly - ? readonlyInstrumentations - : mutableInstrumentations; - return (target, key, receiver) => { - if (key === "__v_isReactive" /* IS_REACTIVE */) { - return !isReadonly; - } - else if (key === "__v_isReadonly" /* IS_READONLY */) { - return isReadonly; - } - else if (key === "__v_raw" /* RAW */) { - return target; - } - return Reflect.get(hasOwn(instrumentations, key) && key in target - ? instrumentations - : target, key, receiver); - }; -} -const mutableCollectionHandlers = { - get: createInstrumentationGetter(false, false) -}; -const shallowCollectionHandlers = { - get: createInstrumentationGetter(false, true) -}; -const readonlyCollectionHandlers = { - get: createInstrumentationGetter(true, false) -}; -const shallowReadonlyCollectionHandlers = { - get: createInstrumentationGetter(true, true) -}; -function checkIdentityKeys(target, has, key) { - const rawKey = toRaw(key); - if (rawKey !== key && has.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.`); - } -} - -const reactiveMap = new WeakMap(); -const shallowReactiveMap = new WeakMap(); -const readonlyMap = new WeakMap(); -const shallowReadonlyMap = new WeakMap(); -function targetTypeMap(rawType) { - switch (rawType) { - case 'Object': - case 'Array': - return 1 /* COMMON */; - case 'Map': - case 'Set': - case 'WeakMap': - case 'WeakSet': - return 2 /* COLLECTION */; - default: - return 0 /* INVALID */; - } -} -function getTargetType(value) { - return value["__v_skip" /* SKIP */] || !Object.isExtensible(value) - ? 0 /* INVALID */ - : targetTypeMap(toRawType(value)); -} -function reactive(target) { - // if trying to observe a readonly proxy, return the readonly version. - if (target && target["__v_isReadonly" /* IS_READONLY */]) { - return target; - } - return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap); -} -/** - * Return a shallowly-reactive copy of the original object, where only the root - * level properties are reactive. It also does not auto-unwrap refs (even at the - * root level). - */ -function shallowReactive(target) { - return createReactiveObject(target, false, shallowReactiveHandlers, shallowCollectionHandlers, shallowReactiveMap); -} -/** - * Creates a readonly copy of the original object. Note the returned copy is not - * made reactive, but `readonly` can be called on an already reactive object. - */ -function readonly(target) { - return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap); -} -/** - * Returns a reactive-copy of the original object, where only the root level - * properties are readonly, and does NOT unwrap refs nor recursively convert - * returned properties. - * This is used for creating the props proxy object for stateful components. - */ -function shallowReadonly(target) { - return createReactiveObject(target, true, shallowReadonlyHandlers, shallowReadonlyCollectionHandlers, shallowReadonlyMap); -} -function createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers, proxyMap) { - if (!isObject(target)) { - if ((process.env.NODE_ENV !== 'production')) { - console.warn(`value cannot be made reactive: ${String(target)}`); - } - return target; - } - // target is already a Proxy, return it. - // exception: calling readonly() on a reactive object - if (target["__v_raw" /* RAW */] && - !(isReadonly && target["__v_isReactive" /* IS_REACTIVE */])) { - return target; - } - // target already has corresponding Proxy - const existingProxy = proxyMap.get(target); - if (existingProxy) { - return existingProxy; - } - // only a whitelist of value types can be observed. - 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; -} -function isReactive(value) { - if (isReadonly(value)) { - return isReactive(value["__v_raw" /* RAW */]); - } - return !!(value && value["__v_isReactive" /* IS_REACTIVE */]); -} -function isReadonly(value) { - return !!(value && value["__v_isReadonly" /* IS_READONLY */]); -} -function isProxy(value) { - return isReactive(value) || isReadonly(value); -} -function toRaw(observed) { - return ((observed && toRaw(observed["__v_raw" /* RAW */])) || observed); -} -function markRaw(value) { - def(value, "__v_skip" /* SKIP */, true); - return value; -} - -const convert = (val) => isObject(val) ? reactive(val) : val; -function isRef(r) { - return Boolean(r && r.__v_isRef === true); -} -function ref(value) { - return createRef(value); -} -function shallowRef(value) { - return createRef(value, true); -} -class RefImpl { - constructor(_rawValue, _shallow = false) { - this._rawValue = _rawValue; - this._shallow = _shallow; - this.__v_isRef = true; - this._value = _shallow ? _rawValue : convert(_rawValue); - } - get value() { - track(toRaw(this), "get" /* GET */, 'value'); - return this._value; - } - set value(newVal) { - if (hasChanged(toRaw(newVal), this._rawValue)) { - this._rawValue = newVal; - this._value = this._shallow ? newVal : convert(newVal); - trigger(toRaw(this), "set" /* SET */, 'value', newVal); - } - } -} -function createRef(rawValue, shallow = false) { - if (isRef(rawValue)) { - return rawValue; - } - return new RefImpl(rawValue, shallow); -} -function triggerRef(ref) { - trigger(toRaw(ref), "set" /* SET */, 'value', (process.env.NODE_ENV !== 'production') ? ref.value : void 0); -} -function unref(ref) { - return isRef(ref) ? ref.value : ref; -} -const shallowUnwrapHandlers = { - 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); - } - } -}; -function proxyRefs(objectWithRefs) { - return isReactive(objectWithRefs) - ? objectWithRefs - : new Proxy(objectWithRefs, shallowUnwrapHandlers); -} -class CustomRefImpl { - constructor(factory) { - this.__v_isRef = true; - const { get, set } = factory(() => track(this, "get" /* GET */, 'value'), () => trigger(this, "set" /* SET */, 'value')); - this._get = get; - this._set = set; - } - get value() { - return this._get(); - } - set value(newVal) { - this._set(newVal); - } -} -function customRef(factory) { - return new CustomRefImpl(factory); -} -function toRefs(object) { - if ((process.env.NODE_ENV !== 'production') && !isProxy(object)) { - console.warn(`toRefs() expects a reactive object but received a plain one.`); - } - const ret = isArray(object) ? new Array(object.length) : {}; - for (const key in object) { - ret[key] = toRef(object, key); - } - return ret; -} -class ObjectRefImpl { - constructor(_object, _key) { - this._object = _object; - this._key = _key; - this.__v_isRef = true; - } - get value() { - return this._object[this._key]; - } - set value(newVal) { - this._object[this._key] = newVal; - } -} -function toRef(object, key) { - return isRef(object[key]) - ? object[key] - : new ObjectRefImpl(object, key); -} - -class ComputedRefImpl { - constructor(getter, _setter, isReadonly) { - this._setter = _setter; - this._dirty = true; - this.__v_isRef = true; - this.effect = effect(getter, { - lazy: true, - scheduler: () => { - if (!this._dirty) { - this._dirty = true; - trigger(toRaw(this), "set" /* SET */, 'value'); - } - } - }); - this["__v_isReadonly" /* IS_READONLY */] = isReadonly; - } - get value() { - // the computed ref may get wrapped by other proxies e.g. readonly() #3376 - const self = toRaw(this); - if (self._dirty) { - self._value = this.effect(); - self._dirty = false; - } - track(self, "get" /* GET */, 'value'); - return self._value; - } - set value(newValue) { - this._setter(newValue); - } -} -function computed(getterOrOptions) { - let getter; - let setter; - if (isFunction(getterOrOptions)) { - getter = getterOrOptions; - setter = (process.env.NODE_ENV !== 'production') - ? () => { - console.warn('Write operation failed: computed value is readonly'); - } - : NOOP; - } - else { - getter = getterOrOptions.get; - setter = getterOrOptions.set; - } - return new ComputedRefImpl(getter, setter, isFunction(getterOrOptions) || !getterOrOptions.set); -} - -const stack = []; -function pushWarningContext(vnode) { - stack.push(vnode); -} -function popWarningContext() { - stack.pop(); -} -function warn(msg, ...args) { - // avoid props formatting or warn handler tracking deps that might be mutated - // during patch, leading to infinite recursion. - 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 /* APP_WARN_HANDLER */, [ - msg + args.join(''), - instance && instance.proxy, - trace - .map(({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`) - .join('\n'), - trace - ]); - } - else { - const warnArgs = [`[Vue warn]: ${msg}`, ...args]; - /* istanbul ignore if */ - if (trace.length && - // avoid spamming console during tests - !false) { - warnArgs.push(`\n`, ...formatTrace(trace)); - } - console.warn(...warnArgs); - } - resetTracking(); -} -function getComponentTrace() { - let currentVNode = stack[stack.length - 1]; - if (!currentVNode) { - return []; - } - // we can't just use the stack because it will be incomplete during updates - // that did not start from the root. Re-construct the parent chain using - // instance parent pointers. - 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; -} -/* istanbul ignore next */ -function formatTrace(trace) { - const logs = []; - trace.forEach((entry, i) => { - logs.push(...(i === 0 ? [] : [`\n`]), ...formatTraceEntry(entry)); - }); - return logs; -} -function formatTraceEntry({ vnode, recurseCount }) { - 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]; -} -/* istanbul ignore next */ -function formatProps(props) { - 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; -} -/* istanbul ignore next */ -function formatProp(key, value, raw) { - 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]; - } -} - -const ErrorTypeStrings = { - ["bc" /* BEFORE_CREATE */]: 'beforeCreate hook', - ["c" /* CREATED */]: 'created hook', - ["bm" /* BEFORE_MOUNT */]: 'beforeMount hook', - ["m" /* MOUNTED */]: 'mounted hook', - ["bu" /* BEFORE_UPDATE */]: 'beforeUpdate hook', - ["u" /* UPDATED */]: 'updated', - ["bum" /* BEFORE_UNMOUNT */]: 'beforeUnmount hook', - ["um" /* UNMOUNTED */]: 'unmounted hook', - ["a" /* ACTIVATED */]: 'activated hook', - ["da" /* DEACTIVATED */]: 'deactivated hook', - ["ec" /* ERROR_CAPTURED */]: 'errorCaptured hook', - ["rtc" /* RENDER_TRACKED */]: 'renderTracked hook', - ["rtg" /* RENDER_TRIGGERED */]: 'renderTriggered hook', - [0 /* SETUP_FUNCTION */]: 'setup function', - [1 /* RENDER_FUNCTION */]: 'render function', - [2 /* WATCH_GETTER */]: 'watcher getter', - [3 /* WATCH_CALLBACK */]: 'watcher callback', - [4 /* WATCH_CLEANUP */]: 'watcher cleanup function', - [5 /* NATIVE_EVENT_HANDLER */]: 'native event handler', - [6 /* COMPONENT_EVENT_HANDLER */]: 'component event handler', - [7 /* VNODE_HOOK */]: 'vnode hook', - [8 /* DIRECTIVE_HOOK */]: 'directive hook', - [9 /* TRANSITION_HOOK */]: 'transition hook', - [10 /* APP_ERROR_HANDLER */]: 'app errorHandler', - [11 /* APP_WARN_HANDLER */]: 'app warnHandler', - [12 /* FUNCTION_REF */]: 'ref function', - [13 /* ASYNC_COMPONENT_LOADER */]: 'async component loader', - [14 /* SCHEDULER */]: 'scheduler flush. This is likely a Vue internals bug. ' + - 'Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/vue-next' -}; -function callWithErrorHandling(fn, instance, type, args) { - let res; - try { - res = args ? fn(...args) : fn(); - } - catch (err) { - handleError(err, instance, type); - } - return res; -} -function callWithAsyncErrorHandling(fn, instance, type, args) { - if (isFunction(fn)) { - const res = callWithErrorHandling(fn, instance, type, args); - if (res && isPromise(res)) { - res.catch(err => { - handleError(err, instance, type); - }); - } - return res; - } - const values = []; - for (let i = 0; i < fn.length; i++) { - values.push(callWithAsyncErrorHandling(fn[i], instance, type, args)); - } - return values; -} -function handleError(err, instance, type, throwInDev = true) { - const contextVNode = instance ? instance.vnode : null; - if (instance) { - let cur = instance.parent; - // the exposed instance is the render proxy to keep it consistent with 2.x - const exposedInstance = instance.proxy; - // in production the hook receives only the error code - const errorInfo = (process.env.NODE_ENV !== 'production') ? ErrorTypeStrings[type] || type : type; // fixed by xxxxxxx - while (cur) { - const errorCapturedHooks = cur.ec; - if (errorCapturedHooks) { - for (let i = 0; i < errorCapturedHooks.length; i++) { - if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) { - return; - } - } - } - cur = cur.parent; - } - // app-level handling - const appErrorHandler = instance.appContext.config.errorHandler; - if (appErrorHandler) { - callWithErrorHandling(appErrorHandler, null, 10 /* APP_ERROR_HANDLER */, [err, exposedInstance, errorInfo]); - return; - } - } - logError(err, type, contextVNode, throwInDev); -} -// fixed by xxxxxx -function logError(err, type, contextVNode, throwInDev = true) { - if ((process.env.NODE_ENV !== 'production')) { - const info = ErrorTypeStrings[type] || type; // fixed by xxxxxx - if (contextVNode) { - pushWarningContext(contextVNode); - } - warn(`Unhandled error${info ? ` during execution of ${info}` : ``}`); - if (contextVNode) { - popWarningContext(); - } - // crash in dev by default so it's more noticeable - if (throwInDev) { - throw err; - } - else { - console.error(err); - } - } - else { - // recover in prod to reduce the impact on end-user - console.error(err); - } -} - -let isFlushing = false; -let isFlushPending = false; -// fixed by xxxxxx -const queue = []; -let flushIndex = 0; -const pendingPreFlushCbs = []; -let activePreFlushCbs = null; -let preFlushIndex = 0; -const pendingPostFlushCbs = []; -let activePostFlushCbs = null; -let postFlushIndex = 0; -const resolvedPromise = Promise.resolve(); -let currentFlushPromise = null; -let currentPreFlushParentJob = null; -const RECURSION_LIMIT = 100; -function nextTick(fn) { - const p = currentFlushPromise || resolvedPromise; - return fn ? p.then(this ? fn.bind(this) : fn) : p; -} -// #2768 -// Use binary-search to find a suitable position in the queue, -// so that the queue maintains the increasing order of job's id, -// which can prevent the job from being skipped and also can avoid repeated patching. -function findInsertionIndex(job) { - // the start index should be `flushIndex + 1` - let start = flushIndex + 1; - let end = queue.length; - const jobId = getId(job); - while (start < end) { - const middle = (start + end) >>> 1; - const middleJobId = getId(queue[middle]); - middleJobId < jobId ? (start = middle + 1) : (end = middle); - } - return start; -} -function queueJob(job) { - // the dedupe search uses the startIndex argument of Array.includes() - // by default the search index includes the current job that is being run - // so it cannot recursively trigger itself again. - // if the job is a watch() callback, the search will start with a +1 index to - // allow it recursively trigger itself - it is the user's responsibility to - // ensure it doesn't end up in an infinite loop. - if ((!queue.length || - !queue.includes(job, isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex)) && - job !== currentPreFlushParentJob) { - const pos = findInsertionIndex(job); - if (pos > -1) { - queue.splice(pos, 0, job); - } - else { - queue.push(job); - } - queueFlush(); - } -} -function queueFlush() { - if (!isFlushing && !isFlushPending) { - isFlushPending = true; - currentFlushPromise = resolvedPromise.then(flushJobs); - } -} -function queueCb(cb, activeQueue, pendingQueue, index) { - if (!isArray(cb)) { - if (!activeQueue || - !activeQueue.includes(cb, cb.allowRecurse ? index + 1 : index)) { - pendingQueue.push(cb); - } - } - else { - // if cb is an array, it is a component lifecycle hook which can only be - // triggered by a job, which is already deduped in the main queue, so - // we can skip duplicate check here to improve perf - pendingQueue.push(...cb); - } - queueFlush(); -} -function queuePreFlushCb(cb) { - queueCb(cb, activePreFlushCbs, pendingPreFlushCbs, preFlushIndex); -} -function queuePostFlushCb(cb) { - queueCb(cb, activePostFlushCbs, pendingPostFlushCbs, postFlushIndex); -} -function flushPreFlushCbs(seen, parentJob = null) { - if (pendingPreFlushCbs.length) { - currentPreFlushParentJob = parentJob; - activePreFlushCbs = [...new Set(pendingPreFlushCbs)]; - pendingPreFlushCbs.length = 0; - if ((process.env.NODE_ENV !== 'production')) { - seen = seen || new Map(); - } - for (preFlushIndex = 0; preFlushIndex < activePreFlushCbs.length; preFlushIndex++) { - if ((process.env.NODE_ENV !== 'production')) { - checkRecursiveUpdates(seen, activePreFlushCbs[preFlushIndex]); - } - activePreFlushCbs[preFlushIndex](); - } - activePreFlushCbs = null; - preFlushIndex = 0; - currentPreFlushParentJob = null; - // recursively flush until it drains - flushPreFlushCbs(seen, parentJob); - } -} -function flushPostFlushCbs(seen) { - if (pendingPostFlushCbs.length) { - const deduped = [...new Set(pendingPostFlushCbs)]; - pendingPostFlushCbs.length = 0; - // #1947 already has active queue, nested flushPostFlushCbs call - if (activePostFlushCbs) { - activePostFlushCbs.push(...deduped); - return; - } - activePostFlushCbs = deduped; - if ((process.env.NODE_ENV !== 'production')) { - seen = seen || new Map(); - } - activePostFlushCbs.sort((a, b) => getId(a) - getId(b)); - for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) { - if ((process.env.NODE_ENV !== 'production')) { - checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex]); - } - activePostFlushCbs[postFlushIndex](); - } - activePostFlushCbs = null; - postFlushIndex = 0; - } -} -const getId = (job) => job.id == null ? Infinity : job.id; -function flushJobs(seen) { - isFlushPending = false; - isFlushing = true; - if ((process.env.NODE_ENV !== 'production')) { - seen = seen || new Map(); - } - flushPreFlushCbs(seen); - // Sort queue before flush. - // This ensures that: - // 1. Components are updated from parent to child. (because parent is always - // created before the child so its render effect will have smaller - // priority number) - // 2. If a component is unmounted during a parent component's update, - // its update can be skipped. - queue.sort((a, b) => getId(a) - getId(b)); - try { - for (flushIndex = 0; flushIndex < queue.length; flushIndex++) { - const job = queue[flushIndex]; - if (job) { - if ((process.env.NODE_ENV !== 'production')) { - checkRecursiveUpdates(seen, job); - } - callWithErrorHandling(job, null, 14 /* SCHEDULER */); - } - } - } - finally { - flushIndex = 0; - queue.length = 0; - flushPostFlushCbs(seen); - isFlushing = false; - currentFlushPromise = null; - // some postFlushCb queued jobs! - // keep flushing until it drains. - if (queue.length || pendingPostFlushCbs.length) { - flushJobs(seen); - } - } -} -function checkRecursiveUpdates(seen, fn) { - if (!seen.has(fn)) { - seen.set(fn, 1); - } - else { - const count = seen.get(fn); - if (count > RECURSION_LIMIT) { - throw new Error(`Maximum recursive updates exceeded. ` + - `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.`); - } - else { - seen.set(fn, count + 1); - } - } -} - -function emit(instance, event, ...rawArgs) { - const props = instance.vnode.props || EMPTY_OBJ; - if ((process.env.NODE_ENV !== 'production')) { - const { emitsOptions, propsOptions: [propsOptions] } = instance; - if (emitsOptions) { - if (!(event in emitsOptions)) { - 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:'); - // for v-model update:xxx events, apply modifiers on args - 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 => a.trim()); - } - else if (number) { - args = rawArgs.map(toNumber); - } - } - if ((process.env.NODE_ENV !== 'production') || false) ; - if ((process.env.NODE_ENV !== 'production')) { - 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}".`); - } - } - // convert handler name to camelCase. See issue #2249 - let handlerName = toHandlerKey(camelize(event)); - let handler = props[handlerName]; - // for v-model update:xxx events, also trigger kebab-case equivalent - // for props passed via kebab-case - if (!handler && isModelListener) { - handlerName = toHandlerKey(hyphenate(event)); - handler = props[handlerName]; - } - if (handler) { - callWithAsyncErrorHandling(handler, instance, 6 /* COMPONENT_EVENT_HANDLER */, args); - } - const onceHandler = props[handlerName + `Once`]; - if (onceHandler) { - if (!instance.emitted) { - (instance.emitted = {})[handlerName] = true; - } - else if (instance.emitted[handlerName]) { - return; - } - callWithAsyncErrorHandling(onceHandler, instance, 6 /* COMPONENT_EVENT_HANDLER */, args); - } -} -function normalizeEmitsOptions(comp, appContext, asMixin = false) { - if (!appContext.deopt && comp.__emits !== undefined) { - return comp.__emits; - } - const raw = comp.emits; - let normalized = {}; - // apply mixin/extends props - let hasExtends = false; - if (__VUE_OPTIONS_API__ && !isFunction(comp)) { - const extendEmits = (raw) => { - const normalizedFromExtend = normalizeEmitsOptions(raw, appContext, true); - if (normalizedFromExtend) { - hasExtends = true; - extend(normalized, normalizedFromExtend); - } - }; - if (!asMixin && appContext.mixins.length) { - appContext.mixins.forEach(extendEmits); - } - if (comp.extends) { - extendEmits(comp.extends); - } - if (comp.mixins) { - comp.mixins.forEach(extendEmits); - } - } - if (!raw && !hasExtends) { - return (comp.__emits = null); - } - if (isArray(raw)) { - raw.forEach(key => (normalized[key] = null)); - } - else { - extend(normalized, raw); - } - return (comp.__emits = normalized); -} -// Check if an incoming prop key is a declared emit event listener. -// e.g. With `emits: { click: null }`, props named `onClick` and `onclick` are -// both considered matched listeners. -function isEmitListener(options, key) { - 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)); -} - -let isRenderingCompiledSlot = 0; -const setCompiledSlotRendering = (n) => (isRenderingCompiledSlot += n); - -/** - * mark the current rendering instance for asset resolution (e.g. - * resolveComponent, resolveDirective) during render - */ -let currentRenderingInstance = null; -let currentScopeId = null; - -function markAttrsAccessed() { -} - -function initProps(instance, rawProps, isStateful, // result of bitwise flag comparison -isSSR = false) { - const props = {}; - const attrs = {}; - // def(attrs, InternalObjectKey, 1) // fixed by xxxxxx - def(attrs, '__vInternal', 1); - instance.propsDefaults = Object.create(null); - setFullProps(instance, rawProps, props, attrs); - // validation - if ((process.env.NODE_ENV !== 'production')) { - validateProps(rawProps || {}, props, instance); - } - if (isStateful) { - // stateful - instance.props = isSSR ? props : shallowReactive(props); - } - else { - if (!instance.type.props) { - // functional w/ optional props, props === attrs - instance.props = attrs; - } - else { - // functional w/ declared props - instance.props = props; - } - } - instance.attrs = attrs; -} -function setFullProps(instance, rawProps, props, attrs) { - const [options, needCastKeys] = instance.propsOptions; - if (rawProps) { - for (const key in rawProps) { - const value = rawProps[key]; - // key, ref are reserved and never passed down - if (isReservedProp(key)) { - continue; - } - // prop option names are camelized during normalization, so to support - // kebab -> camel conversion here we need to camelize the key. - let camelKey; - if (options && hasOwn(options, (camelKey = camelize(key)))) { - props[camelKey] = value; - } - else if (!isEmitListener(instance.emitsOptions, key)) { - // Any non-declared (either as a prop or an emitted event) props are put - // into a separate `attrs` object for spreading. Make sure to preserve - // original key casing - attrs[key] = value; - } - } - } - if (needCastKeys) { - const rawCurrentProps = toRaw(props); - for (let i = 0; i < needCastKeys.length; i++) { - const key = needCastKeys[i]; - props[key] = resolvePropValue(options, rawCurrentProps, key, rawCurrentProps[key], instance); - } - } -} -function resolvePropValue(options, props, key, value, instance) { - const opt = options[key]; - if (opt != null) { - const hasDefault = hasOwn(opt, 'default'); - // default values - if (hasDefault && value === undefined) { - const defaultValue = opt.default; - if (opt.type !== Function && isFunction(defaultValue)) { - const { propsDefaults } = instance; - if (key in propsDefaults) { - value = propsDefaults[key]; - } - else { - setCurrentInstance(instance); - value = propsDefaults[key] = defaultValue(props); - setCurrentInstance(null); - } - } - else { - value = defaultValue; - } - } - // boolean casting - if (opt[0 /* shouldCast */]) { - if (!hasOwn(props, key) && !hasDefault) { - value = false; - } - else if (opt[1 /* shouldCastTrue */] && - (value === '' || value === hyphenate(key))) { - value = true; - } - } - } - return value; -} -function normalizePropsOptions(comp, appContext, asMixin = false) { - if (!appContext.deopt && comp.__props) { - return comp.__props; - } - const raw = comp.props; - const normalized = {}; - const needCastKeys = []; - // apply mixin/extends props - let hasExtends = false; - if (__VUE_OPTIONS_API__ && !isFunction(comp)) { - const extendProps = (raw) => { - hasExtends = true; - const [props, keys] = normalizePropsOptions(raw, appContext, true); - extend(normalized, props); - if (keys) - needCastKeys.push(...keys); - }; - if (!asMixin && appContext.mixins.length) { - appContext.mixins.forEach(extendProps); - } - if (comp.extends) { - extendProps(comp.extends); - } - if (comp.mixins) { - comp.mixins.forEach(extendProps); - } - } - if (!raw && !hasExtends) { - return (comp.__props = EMPTY_ARR); - } - if (isArray(raw)) { - for (let i = 0; i < raw.length; i++) { - if ((process.env.NODE_ENV !== 'production') && !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 ((process.env.NODE_ENV !== 'production') && !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 } : 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 the prop needs boolean casting or default value - if (booleanIndex > -1 || hasOwn(prop, 'default')) { - needCastKeys.push(normalizedKey); - } - } - } - } - } - return (comp.__props = [normalized, needCastKeys]); -} -function validatePropName(key) { - if (key[0] !== '$') { - return true; - } - else if ((process.env.NODE_ENV !== 'production')) { - warn(`Invalid prop name: "${key}" is a reserved property.`); - } - return false; -} -// use function string name to check type constructors -// so that it works across vms / iframes. -function getType(ctor) { - const match = ctor && ctor.toString().match(/^\s*function (\w+)/); - return match ? match[1] : ''; -} -function isSameType(a, b) { - return getType(a) === getType(b); -} -function getTypeIndex(type, expectedTypes) { - if (isArray(expectedTypes)) { - for (let i = 0, len = expectedTypes.length; i < len; i++) { - if (isSameType(expectedTypes[i], type)) { - return i; - } - } - } - else if (isFunction(expectedTypes)) { - return isSameType(expectedTypes, type) ? 0 : -1; - } - return -1; -} -/** - * dev only - */ -function validateProps(rawProps, props, instance) { - 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))); - } -} -/** - * dev only - */ -function validateProp(name, value, prop, isAbsent) { - const { type, required, validator } = prop; - // required! - if (required && isAbsent) { - warn('Missing required prop: "' + name + '"'); - return; - } - // missing but optional - if (value == null && !prop.required) { - return; - } - // type check - if (type != null && type !== true) { - let isValid = false; - const types = isArray(type) ? type : [type]; - const expectedTypes = []; - // value is valid as long as one of the specified types match - 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; - } - } - // custom validator - if (validator && !validator(value)) { - warn('Invalid prop: custom validator check failed for prop "' + name + '".'); - } -} -const isSimpleType = /*#__PURE__*/ makeMap('String,Number,Boolean,Function,Symbol,BigInt'); -/** - * dev only - */ -function assertType(value, type) { - let valid; - const expectedType = getType(type); - if (isSimpleType(expectedType)) { - const t = typeof value; - valid = t === expectedType.toLowerCase(); - // for primitive wrapper objects - if (!valid && t === 'object') { - valid = value instanceof type; - } - } - else if (expectedType === 'Object') { - valid = isObject(value); - } - else if (expectedType === 'Array') { - valid = isArray(value); - } - else { - valid = value instanceof type; - } - return { - valid, - expectedType - }; -} -/** - * dev only - */ -function getInvalidTypeMessage(name, value, expectedTypes) { - 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); - // check if we need to specify expected value - if (expectedTypes.length === 1 && - isExplicable(expectedType) && - !isBoolean(expectedType, receivedType)) { - message += ` with value ${expectedValue}`; - } - message += `, got ${receivedType} `; - // check if we need to specify received value - if (isExplicable(receivedType)) { - message += `with value ${receivedValue}.`; - } - return message; -} -/** - * dev only - */ -function styleValue(value, type) { - if (type === 'String') { - return `"${value}"`; - } - else if (type === 'Number') { - return `${Number(value)}`; - } - else { - return `${value}`; - } -} -/** - * dev only - */ -function isExplicable(type) { - const explicitTypes = ['string', 'number', 'boolean']; - return explicitTypes.some(elem => type.toLowerCase() === elem); -} -/** - * dev only - */ -function isBoolean(...args) { - return args.some(elem => elem.toLowerCase() === 'boolean'); -} - -function injectHook(type, hook, target = currentInstance, prepend = false) { - if (target) { - const hooks = target[type] || (target[type] = []); - // cache the error handling wrapper for injected hooks so the same hook - // can be properly deduped by the scheduler. "__weh" stands for "with error - // handling". - const wrappedHook = hook.__weh || - (hook.__weh = (...args) => { - if (target.isUnmounted) { - return; - } - // disable tracking inside all lifecycle hooks - // since they can potentially be called inside effects. - pauseTracking(); - // Set currentInstance during hook invocation. - // This assumes the hook does not synchronously trigger other hooks, which - // can only be false when the user does something really funky. - setCurrentInstance(target); - const res = callWithAsyncErrorHandling(hook, target, type, args); - setCurrentInstance(null); - resetTracking(); - return res; - }); - if (prepend) { - hooks.unshift(wrappedHook); - } - else { - hooks.push(wrappedHook); - } - return wrappedHook; - } - else if ((process.env.NODE_ENV !== 'production')) { - 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().` + - (``)); - } -} -const createHook = (lifecycle) => (hook, target = currentInstance) => -// post-create lifecycle registrations are noops during SSR -!isInSSRComponentSetup && injectHook(lifecycle, hook, target); -const onBeforeMount = createHook("bm" /* BEFORE_MOUNT */); -const onMounted = createHook("m" /* MOUNTED */); -const onBeforeUpdate = createHook("bu" /* BEFORE_UPDATE */); -const onUpdated = createHook("u" /* UPDATED */); -const onBeforeUnmount = createHook("bum" /* BEFORE_UNMOUNT */); -const onUnmounted = createHook("um" /* UNMOUNTED */); -const onRenderTriggered = createHook("rtg" /* RENDER_TRIGGERED */); -const onRenderTracked = createHook("rtc" /* RENDER_TRACKED */); -const onErrorCaptured = (hook, target = currentInstance) => { - injectHook("ec" /* ERROR_CAPTURED */, hook, target); -}; - -// Simple effect. -function watchEffect(effect, options) { - return doWatch(effect, null, options); -} -// initial value for watchers to trigger on undefined initial values -const INITIAL_WATCHER_VALUE = {}; -// implementation -function watch(source, cb, options) { - if ((process.env.NODE_ENV !== 'production') && !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); -} -function doWatch(source, cb, { immediate, deep, flush, onTrack, onTrigger } = EMPTY_OBJ, instance = currentInstance) { - if ((process.env.NODE_ENV !== 'production') && !cb) { - if (immediate !== undefined) { - warn(`watch() "immediate" option is only respected when using the ` + - `watch(source, callback, options?) signature.`); - } - if (deep !== undefined) { - 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.`); - }; - let getter; - let forceTrigger = false; - if (isRef(source)) { - getter = () => source.value; - forceTrigger = !!source._shallow; - } - else if (isReactive(source)) { - getter = () => source; - deep = true; - } - else if (isArray(source)) { - 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 /* WATCH_GETTER */, [ - instance && instance.proxy - ]); - } - else { - (process.env.NODE_ENV !== 'production') && warnInvalidSource(s); - } - }); - } - else if (isFunction(source)) { - if (cb) { - // getter with cb - getter = () => callWithErrorHandling(source, instance, 2 /* WATCH_GETTER */, [ - instance && instance.proxy - ]); - } - else { - // no cb -> simple effect - getter = () => { - if (instance && instance.isUnmounted) { - return; - } - if (cleanup) { - cleanup(); - } - return callWithAsyncErrorHandling(source, instance, 3 /* WATCH_CALLBACK */, [onInvalidate]); - }; - } - } - else { - getter = NOOP; - (process.env.NODE_ENV !== 'production') && warnInvalidSource(source); - } - if (cb && deep) { - const baseGetter = getter; - getter = () => traverse(baseGetter()); - } - let cleanup; - let onInvalidate = (fn) => { - cleanup = runner.options.onStop = () => { - callWithErrorHandling(fn, instance, 4 /* WATCH_CLEANUP */); - }; - }; - let oldValue = isArray(source) ? [] : INITIAL_WATCHER_VALUE; - const job = () => { - if (!runner.active) { - return; - } - if (cb) { - // watch(source, cb) - const newValue = runner(); - if (deep || forceTrigger || hasChanged(newValue, oldValue)) { - // cleanup before running cb again - if (cleanup) { - cleanup(); - } - callWithAsyncErrorHandling(cb, instance, 3 /* WATCH_CALLBACK */, [ - newValue, - // pass undefined as the old value when it's changed for the first time - oldValue === INITIAL_WATCHER_VALUE ? undefined : oldValue, - onInvalidate - ]); - oldValue = newValue; - } - } - else { - // watchEffect - runner(); - } - }; - // important: mark the job as a watcher callback so that scheduler knows - // it is allowed to self-trigger (#1727) - job.allowRecurse = !!cb; - let scheduler; - if (flush === 'sync') { - scheduler = job; - } - else if (flush === 'post') { - scheduler = () => queuePostRenderEffect(job, instance && instance.suspense); - } - else { - // default: 'pre' - scheduler = () => { - if (!instance || instance.isMounted) { - queuePreFlushCb(job); - } - else { - // with 'pre' option, the first call must happen before - // the component is mounted so it is called synchronously. - job(); - } - }; - } - const runner = effect(getter, { - lazy: true, - onTrack, - onTrigger, - scheduler - }); - recordInstanceBoundEffect(runner, instance); - // initial run - if (cb) { - if (immediate) { - job(); - } - else { - oldValue = runner(); - } - } - else if (flush === 'post') { - queuePostRenderEffect(runner, instance && instance.suspense); - } - else { - runner(); - } - return () => { - stop(runner); - if (instance) { - remove(instance.effects, runner); - } - }; -} -// this.$watch -function instanceWatch(source, cb, options) { - const publicThis = this.proxy; - const getter = isString(source) - ? () => publicThis[source] - : source.bind(publicThis); - return doWatch(getter, cb.bind(publicThis), options, this); -} -function traverse(value, seen = new Set()) { - if (!isObject(value) || 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 { - for (const key in value) { - traverse(value[key], seen); - } - } - return value; -} - -const isKeepAlive = (vnode) => vnode.type.__isKeepAlive; -function onActivated(hook, target) { - registerKeepAliveHook(hook, "a" /* ACTIVATED */, target); -} -function onDeactivated(hook, target) { - registerKeepAliveHook(hook, "da" /* DEACTIVATED */, target); -} -function registerKeepAliveHook(hook, type, target = currentInstance) { - // cache the deactivate branch check wrapper for injected hooks so the same - // hook can be properly deduped by the scheduler. "__wdc" stands for "with - // deactivation check". - const wrappedHook = hook.__wdc || - (hook.__wdc = () => { - // only fire the hook if the target instance is NOT in a deactivated branch. - let current = target; - while (current) { - if (current.isDeactivated) { - return; - } - current = current.parent; - } - hook(); - }); - injectHook(type, wrappedHook, target); - // In addition to registering it on the target instance, we walk up the parent - // chain and register it on all ancestor instances that are keep-alive roots. - // This avoids the need to walk the entire component tree when invoking these - // hooks, and more importantly, avoids the need to track child components in - // arrays. - if (target) { - let current = target.parent; - while (current && current.parent) { - if (isKeepAlive(current.parent.vnode)) { - injectToKeepAliveRoot(wrappedHook, type, target, current); - } - current = current.parent; - } - } -} -function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) { - // injectHook wraps the original for error handling, so make sure to remove - // the wrapped version. - const injected = injectHook(type, hook, keepAliveRoot, true /* prepend */); - onUnmounted(() => { - remove(keepAliveRoot[type], injected); - }, target); -} - -/** -Runtime helper for applying directives to a vnode. Example usage: - -const comp = resolveComponent('comp') -const foo = resolveDirective('foo') -const bar = resolveDirective('bar') - -return withDirectives(h(comp), [ - [foo, this.x], - [bar, this.y] -]) -*/ -const isBuiltInDirective = /*#__PURE__*/ makeMap('bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text'); -function validateDirectiveName(name) { - if (isBuiltInDirective(name)) { - warn('Do not use built-in directive ids as custom directive id: ' + name); - } -} -/** - * Adds directives to a VNode. - */ -function withDirectives(vnode, directives) { - { - (process.env.NODE_ENV !== 'production') && warn(`withDirectives can only be used inside render functions.`); - return vnode; - } -} - -function createAppContext() { - return { - app: null, - config: { - isNativeTag: NO, - performance: false, - globalProperties: {}, - optionMergeStrategies: {}, - isCustomElement: NO, - errorHandler: undefined, - warnHandler: undefined - }, - mixins: [], - components: {}, - directives: {}, - provides: Object.create(null) - }; -} -let uid$1 = 0; -// fixed by xxxxxx -function createAppAPI() { - return function createApp(rootComponent, rootProps = null) { - if (rootProps != null && !isObject(rootProps)) { - (process.env.NODE_ENV !== 'production') && warn(`root props passed to app.mount() must be an object.`); - rootProps = null; - } - const context = createAppContext(); - const installedPlugins = new Set(); - // fixed by xxxxxx - // let isMounted = false - const app = (context.app = { - _uid: uid$1++, - _component: rootComponent, - _props: rootProps, - _container: null, - _context: context, - version, - get config() { - return context.config; - }, - set config(v) { - if ((process.env.NODE_ENV !== 'production')) { - warn(`app.config cannot be replaced. Modify individual options instead.`); - } - }, - use(plugin, ...options) { - if (installedPlugins.has(plugin)) { - (process.env.NODE_ENV !== 'production') && 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 if ((process.env.NODE_ENV !== 'production')) { - warn(`A plugin must either be a function or an object with an "install" ` + - `function.`); - } - return app; - }, - mixin(mixin) { - if (__VUE_OPTIONS_API__) { - if (!context.mixins.includes(mixin)) { - context.mixins.push(mixin); - // window mixin with props/emits de-optimizes props/emits - // normalization caching. - if (mixin.props || mixin.emits) { - context.deopt = true; - } - } - else if ((process.env.NODE_ENV !== 'production')) { - warn('Mixin has already been applied to target app' + - (mixin.name ? `: ${mixin.name}` : '')); - } - } - else if ((process.env.NODE_ENV !== 'production')) { - warn('Mixins are only available in builds supporting Options API'); - } - return app; - }, - component(name, component) { - if ((process.env.NODE_ENV !== 'production')) { - validateComponentName(name, context.config); - } - if (!component) { - return context.components[name]; - } - if ((process.env.NODE_ENV !== 'production') && context.components[name]) { - warn(`Component "${name}" has already been registered in target app.`); - } - context.components[name] = component; - return app; - }, - directive(name, directive) { - if ((process.env.NODE_ENV !== 'production')) { - validateDirectiveName(name); - } - if (!directive) { - return context.directives[name]; - } - if ((process.env.NODE_ENV !== 'production') && context.directives[name]) { - warn(`Directive "${name}" has already been registered in target app.`); - } - context.directives[name] = directive; - return app; - }, - // fixed by xxxxxx - mount() { }, - // fixed by xxxxxx - unmount() { }, - provide(key, value) { - if ((process.env.NODE_ENV !== 'production') && key in context.provides) { - warn(`App already provides property with key "${String(key)}". ` + - `It will be overwritten with the new value.`); - } - // TypeScript doesn't allow symbols as index type - // https://github.com/Microsoft/TypeScript/issues/24587 - context.provides[key] = value; - return app; - } - }); - return app; - }; -} - -// implementation, close to no-op -function defineComponent(options) { - return isFunction(options) ? { setup: options, name: options.name } : options; -} - -const queuePostRenderEffect = queuePostFlushCb; - -const isTeleport = (type) => type.__isTeleport; - -const COMPONENTS = 'components'; -const DIRECTIVES = 'directives'; -const NULL_DYNAMIC_COMPONENT = Symbol(); -/** - * @private - */ -function resolveDirective(name) { - return resolveAsset(DIRECTIVES, name); -} -// implementation -function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) { - const instance = currentInstance; - if (instance) { - const Component = instance.type; - // explicit self name has highest priority - if (type === COMPONENTS) { - const selfName = getComponentName(Component); - if (selfName && - (selfName === name || - selfName === camelize(name) || - selfName === capitalize(camelize(name)))) { - return Component; - } - } - const res = - // local registration - // check instance[type] first for components with mixin or extends. - resolve(instance[type] || Component[type], name) || - // window registration - resolve(instance.appContext[type], name); - if (!res && maybeSelfReference) { - // fallback to implicit self-reference - return Component; - } - if ((process.env.NODE_ENV !== 'production') && warnMissing && !res) { - warn(`Failed to resolve ${type.slice(0, -1)}: ${name}`); - } - return res; - } - else if ((process.env.NODE_ENV !== 'production')) { - warn(`resolve${capitalize(type.slice(0, -1))} ` + - `can only be used in render() or setup().`); - } -} -function resolve(registry, name) { - return (registry && - (registry[name] || - registry[camelize(name)] || - registry[capitalize(camelize(name))])); -} - -const Fragment = Symbol((process.env.NODE_ENV !== 'production') ? 'Fragment' : undefined); -const Text = Symbol((process.env.NODE_ENV !== 'production') ? 'Text' : undefined); -const Comment = Symbol((process.env.NODE_ENV !== 'production') ? 'Comment' : undefined); -Symbol((process.env.NODE_ENV !== 'production') ? 'Static' : undefined); -let currentBlock = null; -function isVNode(value) { - return value ? value.__v_isVNode === true : false; -} -const createVNodeWithArgsTransform = (...args) => { - return _createVNode(...(args)); -}; -const InternalObjectKey = `__vInternal`; -const normalizeKey = ({ key }) => key != null ? key : null; -const normalizeRef = ({ ref }) => { - return (ref != null - ? isString(ref) || isRef(ref) || isFunction(ref) - ? { i: currentRenderingInstance, r: ref } - : ref - : null); -}; -const createVNode = ((process.env.NODE_ENV !== 'production') - ? createVNodeWithArgsTransform - : _createVNode); -function _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) { - if (!type || type === NULL_DYNAMIC_COMPONENT) { - if ((process.env.NODE_ENV !== 'production') && !type) { - warn(`Invalid vnode type when creating vnode: ${type}.`); - } - type = Comment; - } - if (isVNode(type)) { - // createVNode receiving an existing vnode. This happens in cases like - // - // #2078 make sure to merge refs during the clone instead of overwriting it - const cloned = cloneVNode(type, props, true /* mergeRef: true */); - if (children) { - normalizeChildren(cloned, children); - } - return cloned; - } - // class component normalization. - if (isClassComponent(type)) { - type = type.__vccOpts; - } - // class & style normalization. - if (props) { - // for reactive or proxy objects, we need to clone it to enable mutation. - if (isProxy(props) || InternalObjectKey in props) { - props = extend({}, props); - } - let { class: klass, style } = props; - if (klass && !isString(klass)) { - props.class = normalizeClass(klass); - } - if (isObject(style)) { - // reactive state objects need to be cloned since they are likely to be - // mutated - if (isProxy(style) && !isArray(style)) { - style = extend({}, style); - } - props.style = normalizeStyle(style); - } - } - // encode the vnode type information into a bitmap - const shapeFlag = isString(type) - ? 1 /* ELEMENT */ - : isTeleport(type) - ? 64 /* TELEPORT */ - : isObject(type) - ? 4 /* STATEFUL_COMPONENT */ - : isFunction(type) - ? 2 /* FUNCTIONAL_COMPONENT */ - : 0; - if ((process.env.NODE_ENV !== 'production') && shapeFlag & 4 /* STATEFUL_COMPONENT */ && 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\`.`, `\nComponent that was made reactive: `, type); - } - const vnode = { - __v_isVNode: true, - ["__v_skip" /* SKIP */]: true, - type, - props, - key: props && normalizeKey(props), - ref: props && normalizeRef(props), - scopeId: currentScopeId, - slotScopeIds: null, - children: null, - 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 - }; - // validate key - if ((process.env.NODE_ENV !== 'production') && vnode.key !== vnode.key) { - warn(`VNode created with invalid key (NaN). VNode type:`, vnode.type); - } - normalizeChildren(vnode, children); - if (// 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. - (patchFlag > 0 || shapeFlag & 6 /* COMPONENT */) && - // 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. - patchFlag !== 32 /* HYDRATE_EVENTS */) { - currentBlock.push(vnode); - } - return vnode; -} -function cloneVNode(vnode, extraProps, mergeRef = false) { - // This is intentionally NOT using spread or extend to avoid the runtime - // key enumeration cost. - const { props, ref, patchFlag, children } = vnode; - const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props; - return { - __v_isVNode: true, - ["__v_skip" /* SKIP */]: true, - type: vnode.type, - props: mergedProps, - key: mergedProps && normalizeKey(mergedProps), - ref: extraProps && extraProps.ref - ? // #2078 in the case of - // 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: (process.env.NODE_ENV !== 'production') && patchFlag === -1 /* HOISTED */ && 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: perserve flag for fragments since they use the flag for children - // fast paths only. - patchFlag: extraProps && vnode.type !== Fragment - ? patchFlag === -1 // hoisted node - ? 16 /* FULL_PROPS */ - : patchFlag | 16 /* FULL_PROPS */ - : 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 - }; -} -/** - * Dev only, for HMR of hoisted vnodes reused in v-for - * https://github.com/vitejs/vite/issues/2022 - */ -function deepCloneVNode(vnode) { - const cloned = cloneVNode(vnode); - if (isArray(vnode.children)) { - cloned.children = vnode.children.map(deepCloneVNode); - } - return cloned; -} -/** - * @private - */ -function createTextVNode(text = ' ', flag = 0) { - return createVNode(Text, null, text, flag); -} -function normalizeChildren(vnode, children) { - let type = 0; - const { shapeFlag } = vnode; - if (children == null) { - children = null; - } - else if (isArray(children)) { - type = 16 /* ARRAY_CHILDREN */; - } - else if (typeof children === 'object') { - if (shapeFlag & 1 /* ELEMENT */ || shapeFlag & 64 /* TELEPORT */) { - // Normalize slot to plain children for plain element and Teleport - const slot = children.default; - if (slot) { - // _c marker is added by withCtx() indicating this is a compiled slot - slot._c && setCompiledSlotRendering(1); - normalizeChildren(vnode, slot()); - slot._c && setCompiledSlotRendering(-1); - } - return; - } - else { - type = 32 /* SLOTS_CHILDREN */; - const slotFlag = children._; - if (!slotFlag && !(InternalObjectKey in children)) { - children._ctx = currentRenderingInstance; - } - else if (slotFlag === 3 /* FORWARDED */ && currentRenderingInstance) { - // a child component receives forwarded slots from the parent. - // its slot type is determined by its parent's slot type. - if (currentRenderingInstance.vnode.patchFlag & 1024 /* DYNAMIC_SLOTS */) { - children._ = 2 /* DYNAMIC */; - vnode.patchFlag |= 1024 /* DYNAMIC_SLOTS */; - } - else { - children._ = 1 /* STABLE */; - } - } - } - } - else if (isFunction(children)) { - children = { default: children, _ctx: currentRenderingInstance }; - type = 32 /* SLOTS_CHILDREN */; - } - else { - children = String(children); - // force teleport children to array so it can be moved around - if (shapeFlag & 64 /* TELEPORT */) { - type = 16 /* ARRAY_CHILDREN */; - children = [createTextVNode(children)]; - } - else { - type = 8 /* TEXT_CHILDREN */; - } - } - vnode.children = children; - vnode.shapeFlag |= type; -} -function mergeProps(...args) { - const ret = extend({}, args[0]); - for (let i = 1; 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 (existing !== incoming) { - ret[key] = existing - ? [].concat(existing, toMerge[key]) - : incoming; - } - } - else if (key !== '') { - ret[key] = toMerge[key]; - } - } - } - return ret; -} - -function provide(key, value) { - if (!currentInstance) { - if ((process.env.NODE_ENV !== 'production')) { - warn(`provide() can only be used inside setup().`); - } - } - else { - let provides = currentInstance.provides; - // by default an instance inherits its parent's provides object - // but when it needs to provide values of its own, it creates its - // own provides object using parent provides object as prototype. - // this way in `inject` we can simply look up injections from direct - // parent and let the prototype chain do the work. - const parentProvides = currentInstance.parent && currentInstance.parent.provides; - if (parentProvides === provides) { - provides = currentInstance.provides = Object.create(parentProvides); - } - // TS doesn't allow symbol as index type - provides[key] = value; - } -} -function inject(key, defaultValue, treatDefaultAsFactory = false) { - // fallback to `currentRenderingInstance` so that this can be called in - // a functional component - const instance = currentInstance || currentRenderingInstance; - if (instance) { - // #2400 - // to support `app.use` plugins, - // fallback to appContext's `provides` if the intance is at root - const provides = instance.parent == null - ? instance.vnode.appContext && instance.vnode.appContext.provides - : instance.parent.provides; - if (provides && key in provides) { - // TS doesn't allow symbol as index type - return provides[key]; - } - else if (arguments.length > 1) { - return treatDefaultAsFactory && isFunction(defaultValue) - ? defaultValue() - : defaultValue; - } - else if ((process.env.NODE_ENV !== 'production')) { - warn(`injection "${String(key)}" not found.`); - } - } - else if ((process.env.NODE_ENV !== 'production')) { - warn(`inject() can only be used inside setup() or functional components.`); - } -} - -function createDuplicateChecker() { - const cache = Object.create(null); - return (type, key) => { - if (cache[key]) { - warn(`${type} property "${key}" is already defined in ${cache[key]}.`); - } - else { - cache[key] = type; - } - }; -} -let shouldCacheAccess = true; -function applyOptions(instance, options, deferredData = [], deferredWatch = [], deferredProvide = [], asMixin = false) { - const { - // composition - mixins, extends: extendsOptions, - // state - data: dataOptions, computed: computedOptions, methods, watch: watchOptions, provide: provideOptions, inject: injectOptions, - // assets - components, directives, - // lifecycle - beforeMount, mounted, beforeUpdate, updated, activated, deactivated, beforeDestroy, beforeUnmount, destroyed, unmounted, render, renderTracked, renderTriggered, errorCaptured, - // public API - expose } = options; - const publicThis = instance.proxy; - const ctx = instance.ctx; - const globalMixins = instance.appContext.mixins; - if (asMixin && render && instance.render === NOOP) { - instance.render = render; - } - // applyOptions is called non-as-mixin once per instance - if (!asMixin) { - shouldCacheAccess = false; - callSyncHook('beforeCreate', "bc" /* BEFORE_CREATE */, options, instance, globalMixins); - shouldCacheAccess = true; - // window mixins are applied first - applyMixins(instance, globalMixins, deferredData, deferredWatch, deferredProvide); - } - // extending a base component... - if (extendsOptions) { - applyOptions(instance, extendsOptions, deferredData, deferredWatch, deferredProvide, true); - } - // local mixins - if (mixins) { - applyMixins(instance, mixins, deferredData, deferredWatch, deferredProvide); - } - const checkDuplicateProperties = (process.env.NODE_ENV !== 'production') ? createDuplicateChecker() : null; - if ((process.env.NODE_ENV !== 'production')) { - const [propsOptions] = instance.propsOptions; - if (propsOptions) { - for (const key in propsOptions) { - checkDuplicateProperties("Props" /* PROPS */, key); - } - } - } - // options initialization order (to be consistent with Vue 2): - // - props (already done outside of this function) - // - inject - // - methods - // - data (deferred since it relies on `this` access) - // - computed - // - watch (deferred since it relies on `this` access) - // fixed by xxxxxx - if (!__VUE_CREATED_DEFERRED__ && injectOptions) { - if (isArray(injectOptions)) { - for (let i = 0; i < injectOptions.length; i++) { - const key = injectOptions[i]; - ctx[key] = inject(key); - if ((process.env.NODE_ENV !== 'production')) { - checkDuplicateProperties("Inject" /* INJECT */, key); - } - } - } - else { - for (const key in injectOptions) { - const opt = injectOptions[key]; - if (isObject(opt)) { - ctx[key] = inject(opt.from || key, opt.default, true /* treat default function as factory */); - } - else { - ctx[key] = inject(opt); - } - if ((process.env.NODE_ENV !== 'production')) { - checkDuplicateProperties("Inject" /* INJECT */, key); - } - } - } - } - if (methods) { - for (const key in methods) { - const methodHandler = methods[key]; - if (isFunction(methodHandler)) { - // In dev mode, we use the `createRenderContext` function to define methods to the proxy target, - // and those are read-only but reconfigurable, so it needs to be redefined here - if ((process.env.NODE_ENV !== 'production')) { - Object.defineProperty(ctx, key, { - value: methodHandler.bind(publicThis), - configurable: true, - enumerable: true, - writable: true - }); - } - else { - ctx[key] = methodHandler.bind(publicThis); - } - if ((process.env.NODE_ENV !== 'production')) { - checkDuplicateProperties("Methods" /* METHODS */, key); - } - } - else if ((process.env.NODE_ENV !== 'production')) { - warn(`Method "${key}" has type "${typeof methodHandler}" in the component definition. ` + - `Did you reference the function correctly?`); - } - } - } - if (!asMixin) { - if (deferredData.length) { - deferredData.forEach(dataFn => resolveData(instance, dataFn, publicThis)); - } - if (dataOptions) { - // @ts-ignore dataOptions is not fully type safe - resolveData(instance, dataOptions, publicThis); - } - if ((process.env.NODE_ENV !== 'production')) { - const rawData = toRaw(instance.data); - for (const key in rawData) { - checkDuplicateProperties("Data" /* DATA */, key); - // expose data on ctx during dev - if (key[0] !== '$' && key[0] !== '_') { - Object.defineProperty(ctx, key, { - configurable: true, - enumerable: true, - get: () => rawData[key], - set: NOOP - }); - } - } - } - } - else if (dataOptions) { - deferredData.push(dataOptions); - } - 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 ((process.env.NODE_ENV !== 'production') && get === NOOP) { - warn(`Computed property "${key}" has no getter.`); - } - const set = !isFunction(opt) && isFunction(opt.set) - ? opt.set.bind(publicThis) - : (process.env.NODE_ENV !== 'production') - ? () => { - warn(`Write operation failed: computed property "${key}" is readonly.`); - } - : NOOP; - const c = computed$1({ - get, - set - }); - Object.defineProperty(ctx, key, { - enumerable: true, - configurable: true, - get: () => c.value, - set: v => (c.value = v) - }); - if ((process.env.NODE_ENV !== 'production')) { - checkDuplicateProperties("Computed" /* COMPUTED */, key); - } - } - } - if (watchOptions) { - deferredWatch.push(watchOptions); - } - if (!asMixin && deferredWatch.length) { - deferredWatch.forEach(watchOptions => { - for (const key in watchOptions) { - createWatcher(watchOptions[key], ctx, publicThis, key); - } - }); - } - // fixed by xxxxxx - if (!__VUE_CREATED_DEFERRED__) { - if (provideOptions) { - deferredProvide.push(provideOptions); - } - if (!asMixin && deferredProvide.length) { - deferredProvide.forEach(provideOptions => { - const provides = isFunction(provideOptions) - ? provideOptions.call(publicThis) - : provideOptions; - Reflect.ownKeys(provides).forEach(key => { - provide(key, provides[key]); - }); - }); - } - } - // asset options. - // To reduce memory usage, only components with mixins or extends will have - // resolved asset registry attached to instance. - if (asMixin) { - if (components) { - extend(instance.components || - (instance.components = extend({}, instance.type.components)), components); - } - if (directives) { - extend(instance.directives || - (instance.directives = extend({}, instance.type.directives)), directives); - } - } - // fixed by xxxxxx - // lifecycle options - if (__VUE_CREATED_DEFERRED__) { - ctx.$callSyncHook = function (name) { - return callSyncHook(name, "c" /* CREATED */, options, instance, globalMixins); - }; - } - else if (!asMixin) { - callSyncHook('created', "c" /* CREATED */, options, instance, globalMixins); - } - if (beforeMount) { - onBeforeMount(beforeMount.bind(publicThis)); - } - if (mounted) { - onMounted(mounted.bind(publicThis)); - } - if (beforeUpdate) { - onBeforeUpdate(beforeUpdate.bind(publicThis)); - } - if (updated) { - onUpdated(updated.bind(publicThis)); - } - if (activated) { - onActivated(activated.bind(publicThis)); - } - if (deactivated) { - onDeactivated(deactivated.bind(publicThis)); - } - if (errorCaptured) { - onErrorCaptured(errorCaptured.bind(publicThis)); - } - if (renderTracked) { - onRenderTracked(renderTracked.bind(publicThis)); - } - if (renderTriggered) { - onRenderTriggered(renderTriggered.bind(publicThis)); - } - if ((process.env.NODE_ENV !== 'production') && beforeDestroy) { - warn(`\`beforeDestroy\` has been renamed to \`beforeUnmount\`.`); - } - if (beforeUnmount) { - onBeforeUnmount(beforeUnmount.bind(publicThis)); - } - if ((process.env.NODE_ENV !== 'production') && destroyed) { - warn(`\`destroyed\` has been renamed to \`unmounted\`.`); - } - if (unmounted) { - onUnmounted(unmounted.bind(publicThis)); - } - if (isArray(expose)) { - if (!asMixin) { - if (expose.length) { - const exposed = instance.exposed || (instance.exposed = proxyRefs({})); - expose.forEach(key => { - exposed[key] = toRef(publicThis, key); - }); - } - else if (!instance.exposed) { - instance.exposed = EMPTY_OBJ; - } - } - else if ((process.env.NODE_ENV !== 'production')) { - warn(`The \`expose\` option is ignored when used in mixins.`); - } - } - // fixed by xxxxxx - if (instance.ctx.$onApplyOptions) { - instance.ctx.$onApplyOptions(options, instance, publicThis); - } -} -function callSyncHook(name, type, options, instance, globalMixins) { - for (let i = 0; i < globalMixins.length; i++) { - callHookWithMixinAndExtends(name, type, globalMixins[i], instance); - } - callHookWithMixinAndExtends(name, type, options, instance); -} -function callHookWithMixinAndExtends(name, type, options, instance) { - const { extends: base, mixins } = options; - const selfHook = options[name]; - if (base) { - callHookWithMixinAndExtends(name, type, base, instance); - } - if (mixins) { - for (let i = 0; i < mixins.length; i++) { - callHookWithMixinAndExtends(name, type, mixins[i], instance); - } - } - if (selfHook) { - callWithAsyncErrorHandling(selfHook.bind(instance.proxy), instance, type); - } -} -function applyMixins(instance, mixins, deferredData, deferredWatch, deferredProvide) { - for (let i = 0; i < mixins.length; i++) { - applyOptions(instance, mixins[i], deferredData, deferredWatch, deferredProvide, true); - } -} -function resolveData(instance, dataFn, publicThis) { - if ((process.env.NODE_ENV !== 'production') && !isFunction(dataFn)) { - warn(`The data option must be a function. ` + - `Plain object usage is no longer supported.`); - } - shouldCacheAccess = false; - const data = dataFn.call(publicThis, publicThis); - shouldCacheAccess = true; - if ((process.env.NODE_ENV !== 'production') && 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() + .`); - } - if (!isObject(data)) { - (process.env.NODE_ENV !== 'production') && warn(`data() should return an object.`); - } - else if (instance.data === EMPTY_OBJ) { - instance.data = reactive(data); - } - else { - // existing data: this is a mixin or extends. - extend(instance.data, data); - } -} -function createWatcher(raw, ctx, publicThis, key) { - const getter = key.includes('.') - ? createPathGetter(publicThis, key) - : () => publicThis[key]; - if (isString(raw)) { - const handler = ctx[raw]; - if (isFunction(handler)) { - watch(getter, handler); - } - else if ((process.env.NODE_ENV !== 'production')) { - 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 if ((process.env.NODE_ENV !== 'production')) { - warn(`Invalid watch handler specified by key "${raw.handler}"`, handler); - } - } - } - else if ((process.env.NODE_ENV !== 'production')) { - warn(`Invalid watch option: "${key}"`, raw); - } -} -function createPathGetter(ctx, path) { - const segments = path.split('.'); - return () => { - let cur = ctx; - for (let i = 0; i < segments.length && cur; i++) { - cur = cur[segments[i]]; - } - return cur; - }; -} -function resolveMergedOptions(instance) { - const raw = instance.type; - const { __merged, mixins, extends: extendsOptions } = raw; - if (__merged) - return __merged; - const globalMixins = instance.appContext.mixins; - if (!globalMixins.length && !mixins && !extendsOptions) - return raw; - const options = {}; - globalMixins.forEach(m => mergeOptions(options, m, instance)); - mergeOptions(options, raw, instance); - return (raw.__merged = options); -} -function mergeOptions(to, from, instance) { - const strats = instance.appContext.config.optionMergeStrategies; - const { mixins, extends: extendsOptions } = from; - extendsOptions && mergeOptions(to, extendsOptions, instance); - mixins && - mixins.forEach((m) => mergeOptions(to, m, instance)); - for (const key in from) { - if (strats && hasOwn(strats, key)) { - to[key] = strats[key](to[key], from[key], instance.proxy, key); - } - else { - to[key] = from[key]; - } - } -} - -/** - * #2437 In Vue 3, functional components do not have a public instance proxy but - * they exist in the internal parent chain. For code that relies on traversing - * public $parent chains, skip functional ones and go to the parent instead. - */ -const getPublicInstance = (i) => { - if (!i) - return null; - if (isStatefulComponent(i)) - return i.exposed ? i.exposed : i.proxy; - return getPublicInstance(i.parent); -}; -const publicPropertiesMap = extend(Object.create(null), { - $: i => i, - $el: i => i.vnode.el, - $data: i => i.data, - $props: i => ((process.env.NODE_ENV !== 'production') ? shallowReadonly(i.props) : i.props), - $attrs: i => ((process.env.NODE_ENV !== 'production') ? shallowReadonly(i.attrs) : i.attrs), - $slots: i => ((process.env.NODE_ENV !== 'production') ? shallowReadonly(i.slots) : i.slots), - $refs: i => ((process.env.NODE_ENV !== 'production') ? shallowReadonly(i.refs) : i.refs), - $parent: i => getPublicInstance(i.parent), - $root: i => getPublicInstance(i.root), - $emit: i => i.emit, - $options: i => (__VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type), - $forceUpdate: i => () => queueJob(i.update), - // $nextTick: i => nextTick.bind(i.proxy!), // fixed by xxxxxx - $watch: i => (__VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP) -}); -const PublicInstanceProxyHandlers = { - get({ _: instance }, key) { - const { ctx, setupState, data, props, accessCache, type, appContext } = instance; - // let @vue/reactivity know it should never observe Vue public instances. - if (key === "__v_skip" /* SKIP */) { - return true; - } - // for internal formatters to know that this is a Vue instance - if ((process.env.NODE_ENV !== 'production') && key === '__isVue') { - return true; - } - // data / props / ctx - // This getter gets called for every property access on the render context - // during render and is a major hotspot. The most expensive part of this - // is the multiple hasOwn() calls. It's much faster to do a simple property - // access on a plain object, so we use an accessCache object (with null - // prototype) to memoize what access type a key corresponds to. - let normalizedProps; - if (key[0] !== '$') { - const n = accessCache[key]; - if (n !== undefined) { - switch (n) { - case 0 /* SETUP */: - return setupState[key]; - case 1 /* DATA */: - return data[key]; - case 3 /* CONTEXT */: - return ctx[key]; - case 2 /* PROPS */: - return props[key]; - // default: just fallthrough - } - } - else if (setupState !== EMPTY_OBJ && hasOwn(setupState, key)) { - accessCache[key] = 0 /* SETUP */; - return setupState[key]; - } - else if (data !== EMPTY_OBJ && hasOwn(data, key)) { - accessCache[key] = 1 /* 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] = 2 /* PROPS */; - return props[key]; - } - else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { - accessCache[key] = 3 /* CONTEXT */; - return ctx[key]; - } - else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) { - accessCache[key] = 4 /* OTHER */; - } - } - const publicGetter = publicPropertiesMap[key]; - let cssModule, globalProperties; - // public $xxx properties - if (publicGetter) { - if (key === '$attrs') { - track(instance, "get" /* GET */, key); - (process.env.NODE_ENV !== 'production') && markAttrsAccessed(); - } - 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)) { - // user may set custom properties to `this` that start with `$` - accessCache[key] = 3 /* CONTEXT */; - return ctx[key]; - } - else if ( - // window properties - ((globalProperties = appContext.config.globalProperties), - hasOwn(globalProperties, key))) { - return globalProperties[key]; - } - else if ((process.env.NODE_ENV !== 'production') && - 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 && - (key[0] === '$' || 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 (setupState !== EMPTY_OBJ && hasOwn(setupState, key)) { - setupState[key] = value; - } - else if (data !== EMPTY_OBJ && hasOwn(data, key)) { - data[key] = value; - } - else if (hasOwn(instance.props, key)) { - (process.env.NODE_ENV !== 'production') && - warn(`Attempting to mutate prop "${key}". Props are readonly.`, instance); - return false; - } - if (key[0] === '$' && key.slice(1) in instance) { - (process.env.NODE_ENV !== 'production') && - warn(`Attempting to mutate public property "${key}". ` + - `Properties starting with $ are reserved and readonly.`, instance); - return false; - } - else { - if ((process.env.NODE_ENV !== 'production') && key in instance.appContext.config.globalProperties) { - Object.defineProperty(ctx, key, { - enumerable: true, - configurable: true, - value - }); - } - else { - ctx[key] = value; - } - } - return true; - }, - has({ _: { data, setupState, accessCache, ctx, appContext, propsOptions } }, key) { - let normalizedProps; - return (accessCache[key] !== undefined || - (data !== EMPTY_OBJ && hasOwn(data, key)) || - (setupState !== EMPTY_OBJ && hasOwn(setupState, key)) || - ((normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key)) || - hasOwn(ctx, key) || - hasOwn(publicPropertiesMap, key) || - hasOwn(appContext.config.globalProperties, key)); - } -}; -if ((process.env.NODE_ENV !== 'production') && !false) { - 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); - }; -} -const RuntimeCompiledPublicInstanceProxyHandlers = extend({}, PublicInstanceProxyHandlers, { - get(target, key) { - // fast path for unscopables when using `with` block - if (key === Symbol.unscopables) { - return; - } - return PublicInstanceProxyHandlers.get(target, key, target); - }, - has(_, key) { - const has = key[0] !== '_' && !isGloballyWhitelisted(key); - if ((process.env.NODE_ENV !== 'production') && !has && PublicInstanceProxyHandlers.has(_, key)) { - warn(`Property ${JSON.stringify(key)} should not start with _ which is a reserved prefix for Vue internals.`); - } - return has; - } -}); -// In dev mode, the proxy target exposes the same properties as seen on `this` -// for easier console inspection. In prod mode it will be an empty object so -// these properties definitions can be skipped. -function createRenderContext(instance) { - const target = {}; - // expose internal instance for proxy handlers - Object.defineProperty(target, `_`, { - configurable: true, - enumerable: false, - get: () => instance - }); - // expose public properties - 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 - }); - }); - // expose window properties - const { globalProperties } = instance.appContext.config; - Object.keys(globalProperties).forEach(key => { - Object.defineProperty(target, key, { - configurable: true, - enumerable: false, - get: () => globalProperties[key], - set: NOOP - }); - }); - return target; -} -// dev only -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 - }); - }); - } -} -// dev only -function exposeSetupStateOnRenderContext(instance) { - const { ctx, setupState } = instance; - Object.keys(toRaw(setupState)).forEach(key => { - if (key[0] === '$' || key[0] === '_') { - warn(`setup() return property ${JSON.stringify(key)} should not start with "$" or "_" ` + - `which are reserved prefixes for Vue internals.`); - return; - } - Object.defineProperty(ctx, key, { - enumerable: true, - configurable: true, - get: () => setupState[key], - set: NOOP - }); - }); -} - -const emptyAppContext = createAppContext(); -let uid$2 = 0; -function createComponentInstance(vnode, parent, suspense) { - const type = vnode.type; - // inherit parent app context - or - if root, adopt from root vnode - const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext; - const instance = { - uid: uid$2++, - vnode, - type, - parent, - appContext, - root: null, - next: null, - subTree: null, - update: null, - render: null, - proxy: null, - exposed: null, - withProxy: null, - effects: null, - provides: parent ? parent.provides : Object.create(appContext.provides), - accessCache: null, - renderCache: [], - // local resovled assets - components: null, - directives: null, - // resolved props and emits options - propsOptions: normalizePropsOptions(type, appContext), - emitsOptions: normalizeEmitsOptions(type, appContext), - // emit - emit: null, - emitted: null, - // props default value - propsDefaults: EMPTY_OBJ, - // state - ctx: EMPTY_OBJ, - data: EMPTY_OBJ, - props: EMPTY_OBJ, - attrs: EMPTY_OBJ, - slots: EMPTY_OBJ, - refs: EMPTY_OBJ, - setupState: EMPTY_OBJ, - setupContext: 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 - }; - if ((process.env.NODE_ENV !== 'production')) { - instance.ctx = createRenderContext(instance); - } - else { - instance.ctx = { _: instance }; - } - instance.root = parent ? parent.root : instance; - instance.emit = emit.bind(null, instance); - return instance; -} -let currentInstance = null; -const getCurrentInstance = () => currentInstance || currentRenderingInstance; -const setCurrentInstance = (instance) => { - currentInstance = instance; -}; -const isBuiltInTag = /*#__PURE__*/ makeMap('slot,component'); -function validateComponentName(name, config) { - const appIsNativeTag = config.isNativeTag || NO; - if (isBuiltInTag(name) || appIsNativeTag(name)) { - warn('Do not use built-in or reserved HTML elements as component id: ' + name); - } -} -function isStatefulComponent(instance) { - return instance.vnode.shapeFlag & 4 /* STATEFUL_COMPONENT */; -} -let isInSSRComponentSetup = false; -function setupComponent(instance, isSSR = false) { - isInSSRComponentSetup = isSSR; - const { props /*, children*/ } = instance.vnode; - const isStateful = isStatefulComponent(instance); - initProps(instance, props, isStateful, isSSR); - // initSlots(instance, children) // fixed by xxxxxx - const setupResult = isStateful - ? setupStatefulComponent(instance, isSSR) - : undefined; - isInSSRComponentSetup = false; - return setupResult; -} -function setupStatefulComponent(instance, isSSR) { - const Component = instance.type; - if ((process.env.NODE_ENV !== 'production')) { - 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]); - } - } - } - // 0. create render proxy property access cache - instance.accessCache = Object.create(null); - // 1. create public instance / render proxy - // also mark it raw so it's never observed - instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers); - if ((process.env.NODE_ENV !== 'production')) { - exposePropsOnRenderContext(instance); - } - // 2. call setup() - const { setup } = Component; - if (setup) { - const setupContext = (instance.setupContext = - setup.length > 1 ? createSetupContext(instance) : null); - currentInstance = instance; - pauseTracking(); - const setupResult = callWithErrorHandling(setup, instance, 0 /* SETUP_FUNCTION */, [(process.env.NODE_ENV !== 'production') ? shallowReadonly(instance.props) : instance.props, setupContext]); - resetTracking(); - currentInstance = null; - if (isPromise(setupResult)) { - if (isSSR) { - // return the promise so server-renderer can wait on it - return setupResult - .then((resolvedResult) => { - handleSetupResult(instance, resolvedResult, isSSR); - }) - .catch(e => { - handleError(e, instance, 0 /* SETUP_FUNCTION */); - }); - } - else if ((process.env.NODE_ENV !== 'production')) { - warn(`setup() returned a Promise, but the version of Vue you are using ` + - `does not support it yet.`); - } - } - else { - handleSetupResult(instance, setupResult, isSSR); - } - } - else { - finishComponentSetup(instance, isSSR); - } -} -function handleSetupResult(instance, setupResult, isSSR) { - if (isFunction(setupResult)) { - // setup returned an inline render function - { - instance.render = setupResult; - } - } - else if (isObject(setupResult)) { - if ((process.env.NODE_ENV !== 'production') && isVNode(setupResult)) { - warn(`setup() should not return VNodes directly - ` + - `return a render function instead.`); - } - // setup returned bindings. - // assuming a render function compiled from template is present. - if ((process.env.NODE_ENV !== 'production') || false) { - instance.devtoolsRawSetupState = setupResult; - } - instance.setupState = proxyRefs(setupResult); - if ((process.env.NODE_ENV !== 'production')) { - exposeSetupStateOnRenderContext(instance); - } - } - else if ((process.env.NODE_ENV !== 'production') && setupResult !== undefined) { - warn(`setup() should return an object. Received: ${setupResult === null ? 'null' : typeof setupResult}`); - } - finishComponentSetup(instance, isSSR); -} -function finishComponentSetup(instance, isSSR) { - const Component = instance.type; - // template / render function normalization - if (!instance.render) { - instance.render = (Component.render || NOOP); - // for runtime-compiled render functions using `with` blocks, the render - // proxy used needs a different `has` handler which is more performant and - // also only allows a whitelist of globals to fallthrough. - if (instance.render._rc) { - instance.withProxy = new Proxy(instance.ctx, RuntimeCompiledPublicInstanceProxyHandlers); - } - } - // support for 2.x options - if (__VUE_OPTIONS_API__) { - currentInstance = instance; - pauseTracking(); - applyOptions(instance, Component); - resetTracking(); - currentInstance = null; - } - // warn missing template/render - // the runtime compilation of template in SSR is done by server-render - if ((process.env.NODE_ENV !== 'production') && !Component.render && instance.render === NOOP && !isSSR) { - /* istanbul ignore if */ - if (Component.template) { - warn(`Component provided template option but ` + - `runtime compilation is not supported in this build of Vue.` + - (` Configure your bundler to alias "vue" to "vue/dist/vue.esm-bundler.js".` - ) /* should not happen */); - } - else { - warn(`Component is missing template or render function.`); - } - } -} -const attrHandlers = { - get: (target, key) => { - if ((process.env.NODE_ENV !== 'production')) ; - return target[key]; - }, - set: () => { - warn(`setupContext.attrs is readonly.`); - return false; - }, - deleteProperty: () => { - warn(`setupContext.attrs is readonly.`); - return false; - } -}; -function createSetupContext(instance) { - const expose = exposed => { - if ((process.env.NODE_ENV !== 'production') && instance.exposed) { - warn(`expose() should be called only once per setup().`); - } - instance.exposed = proxyRefs(exposed); - }; - if ((process.env.NODE_ENV !== 'production')) { - // We use getters in dev in case libs like test-utils overwrite instance - // properties (overwrites should not be done in prod) - return Object.freeze({ - get attrs() { - return new Proxy(instance.attrs, attrHandlers); - }, - get slots() { - return shallowReadonly(instance.slots); - }, - get emit() { - return (event, ...args) => instance.emit(event, ...args); - }, - expose - }); - } - else { - return { - attrs: instance.attrs, - slots: instance.slots, - emit: instance.emit, - expose - }; - } -} -// record effects created during a component's setup() so that they can be -// stopped when the component unmounts -function recordInstanceBoundEffect(effect, instance = currentInstance) { - if (instance) { - (instance.effects || (instance.effects = [])).push(effect); - } -} -const classifyRE = /(?:^|[-_])(\w)/g; -const classify = (str) => str.replace(classifyRE, c => c.toUpperCase()).replace(/[-_]/g, ''); -function getComponentName(Component) { - return isFunction(Component) - ? Component.displayName || Component.name - : Component.name; -} -/* istanbul ignore next */ -function formatComponentName(instance, Component, isRoot = false) { - let name = getComponentName(Component); - if (!name && Component.__file) { - const match = Component.__file.match(/([^/\\]+)\.\w+$/); - if (match) { - name = match[1]; - } - } - if (!name && instance && instance.parent) { - // try to infer the name based on reverse resolution - const inferFromRegistry = (registry) => { - for (const key in registry) { - if (registry[key] === Component) { - return key; - } - } - }; - name = - inferFromRegistry(instance.components || - instance.parent.type.components) || inferFromRegistry(instance.appContext.components); - } - return name ? classify(name) : isRoot ? `App` : `Anonymous`; -} -function isClassComponent(value) { - return isFunction(value) && '__vccOpts' in value; -} - -function computed$1(getterOrOptions) { - const c = computed(getterOrOptions); - recordInstanceBoundEffect(c.effect); - return c; -} - -// implementation -function defineProps() { - if ((process.env.NODE_ENV !== 'production')) { - warn(`defineProps() is a compiler-hint helper that is only usable inside ` + - `