diff --git a/.eslintignore b/.eslintignore index 05bd6fa0654c61f85269711b3cd94e4378170470..0005864c6d47ef95b3e44266537d634aff23d32d 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,3 +3,5 @@ src/platforms/app-plus-nvue/runtime build/rollup-plugin-require-context packages/*/packages packages/*/template/**/* +qh-api.js +touch-emulator.js diff --git a/.gitignore b/.gitignore index 7a3e1957fd8bc61075b9a680c04da301e4ca39f9..f3e869b07dd5061f666c78d6ae0caa5b3f3220a1 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ unpackage/ .vscode/ .idea .DS_Store +!packages/uni-app-plus/dist diff --git a/check-version.js b/check-version.js index 2ed36d6a737d060445a1f9685501e4e3e912f3f0..508706f978e5be6d68a6f9222d1088f91802b7d7 100644 --- a/check-version.js +++ b/check-version.js @@ -5,7 +5,7 @@ const request = require('request') const registry = 'https://registry.npmjs.org/@dcloudio/' -const pkgs = fs.readdirSync(path.resolve(__dirname, 'packages')) +const pkgs = fs.readdirSync(path.resolve(__dirname, 'packages')).filter(pkg => pkg.indexOf('.') !== 0) const tag = process.argv[2] || 'alpha' diff --git a/dist-tag-latest.js b/dist-tag-latest.js index e3759ca9f440fde4d00bd14dec304018db760ff9..a3a3e7a259c2d8f026b7f6a5b3c943b9218200ea 100644 --- a/dist-tag-latest.js +++ b/dist-tag-latest.js @@ -2,7 +2,7 @@ const fs = require('fs') const path = require('path') const shellExec = require('shell-exec') -const pkgs = fs.readdirSync(path.resolve(__dirname, 'packages')) +const pkgs = fs.readdirSync(path.resolve(__dirname, 'packages')).filter(pkg => pkg.indexOf('.') !== 0) const version = process.argv[2] if (!version) { diff --git a/docs/collocation/manifest.md b/docs/collocation/manifest.md index 6cbea301121d621ec527c71a223ffcbcb4a95933..6b4dd6cc9ec6414c622dac2c3b5d38dc95a20cc0 100644 --- a/docs/collocation/manifest.md +++ b/docs/collocation/manifest.md @@ -11,7 +11,7 @@ |versionCode|String||版本号,例如:36|| |transformPx|Boolean|true|是否转换项目的px,为true时将px转换为rpx,为false时,px为传统的实际像素|| |networkTimeout|Object||网络超时时间,[详见](/collocation/manifest?id=networktimeout)|| -|debug|Boolean|false|是否开启 debug 模式,开启后调试信息以 ``info`` 的形式给出,其信息有页面的注册,页面路由,数据更新,事件触发等|| +|debug|Boolean|false|是否开启 debug 模式,开启后调试信息以 ``info`` 的形式给出,其信息有页面的注册,页面路由,数据更新,事件触发等|| |uniStatistics|Object||[是否开启 uni 统计,全局配置](/collocation/manifest?id=uniStatistics)|2.2.3+| |app-plus|Object||[App 特有配置](/collocation/manifest?id=app-plus)|| |h5|Object||[H5 特有配置](/collocation/manifest?id=h5)|| @@ -38,13 +38,13 @@ |connectSocket|Number|否|60000|uni.connectSocket 的超时时间,单位毫秒。| |uploadFile|Number|否|60000|uni.uploadFile 的超时时间,单位毫秒。| |downloadFile|Number|否|60000|uni.downloadFile 的超时时间,单位毫秒。| - -自`HBuilderX 2.5.10`起,上述默认超时时间由6秒改为60秒,对齐微信小程序平台。 - - -### uniStatistics -uni 统计配置项 - + +自`HBuilderX 2.5.10`起,上述默认超时时间由6秒改为60秒,对齐微信小程序平台。 + + +### uniStatistics +uni 统计配置项 + |属性|类型|必填|默认值|说明| |--|--|--|--|--| |enable|Boolean|是|true|是否开启uni统计| @@ -61,8 +61,8 @@ uni 统计配置项 |renderer|String|可不加载基于 webview 的运行框架,减少包体积、提升启动速度。可选值 `native`| App-nvue 2.2.0+| |compilerVersion|Number|编译器版本,可选值:2、3 默认 2 [详见](https://ask.dcloud.net.cn/article/36599)|HBuilderX alpha 2.4.4+或HBuilderX 2.5.0+| |nvueLaunchMode|Number|Nvue 首页启动模式,在 compilerVersion 值为 3 时生效,可选值:normal、fast 默认 normal(HBuilderX alpha 2.4.4-2.4.9 固定为 fast) [详见](https://ask.dcloud.net.cn/article/36749)|2.5.0+| -|nvue|Object|nvue 页面布局初始配置,[详见](/collocation/manifest?id=nvue)|2.0.3+| -|uniStatistics|Object|[App 是否开启 uni 统计,配置方法同全局配置](/collocation/manifest?id=uniStatistics)|2.2.3+| +|nvue|Object|nvue 页面布局初始配置,[详见](/collocation/manifest?id=nvue)|2.0.3+| +|uniStatistics|Object|[App 是否开启 uni 统计,配置方法同全局配置](/collocation/manifest?id=uniStatistics)|2.2.3+| PS:这里只列出了核心部分,更多内容请参考 [完整的 manifest.json](/collocation/manifest?id=完整-manifestjson)。 @@ -223,7 +223,7 @@ H5平台是SPA单页应用,普通的SEO信息即加meta字段只能在,自 |loading|String|AsyncLoading|页面 js 加载时使用的组件(需注册为全局组件)| |error|String|AsyncError|页面 js 加载失败时使用的组件(需注册为全局组件)| |delay|Number|200|展示 loading 加载组件的延时时间(页面 js 若在 delay 时间内加载完成,则不会显示 loading 组件)| -|timeout|Number|3000|页面 js 加载超时时间(超时后展示 error 对应的组件)| +|timeout|Number|60000|页面 js 加载超时时间(超时后展示 error 对应的组件)| #### devServer |属性|类型|默认值|说明| @@ -317,7 +317,7 @@ Tips:关于摇树优化(treeShaking)原理及优化结果,参考:[http |workers|String|Worker 代码放置的目录。 [详见](https://developers.weixin.qq.com/miniprogram/dev/framework/workers.html)| |optimization|Object| 对微信小程序的优化配置 | |cloudfunctionRoot|String| 配置云开发目录,参考[setting](/collocation/manifest?id=cloudfunctionRoot)| -|uniStatistics|Object|[微信小程序是否开启 uni 统计,配置方法同全局配置](/collocation/manifest?id=uniStatistics)|| +|uniStatistics|Object|[微信小程序是否开启 uni 统计,配置方法同全局配置](/collocation/manifest?id=uniStatistics)|| #### setting @@ -372,12 +372,12 @@ Tips:关于摇树优化(treeShaking)原理及优化结果,参考:[http |属性 |类型 |说明 | |:- |:- |:- | -|usingComponents |Boolean| 是否启用自定义组件模式,`v2.0+`,默认为false,[编译模式区别详情](https://ask.dcloud.net.cn/article/35843) | +|usingComponents |Boolean| 是否启用自定义组件模式,`v2.0+`,默认为false,[编译模式区别详情](https://ask.dcloud.net.cn/article/35843) | |plugins |Object |使用到的插件,[详见](https://opendocs.alipay.com/mini/plugin/plugin-usage) | |component2 |Boolean| 是否启用 `component2` 编译,默认为false,[查看详情](https://docs.alipay.com/mini/framework/custom-component-overview) | |axmlStrictCheck |Boolean| 是否启用 `axml` 严格语法检查,默认为false | |enableParallelLoader |Boolean| 是否启用多进程编译,默认为false | -|enableDistFileMinify |Boolean| 是否压缩编译产物(仅在真机预览/真机调试时生效),默认为false | +|enableDistFileMinify |Boolean| 是否压缩编译产物(仅在真机预览/真机调试时生效),默认为false | |uniStatistics |Object |[支付宝小程序是否开启 uni 统计,配置方法同全局配置](/collocation/manifest?id=uniStatistics) | **注意** @@ -392,7 +392,7 @@ Tips:关于摇树优化(treeShaking)原理及优化结果,参考:[http |usingComponents|Boolean| 是否启用自定义组件模式,`v2.0+`,默认为false,[编译模式区别详情](https://ask.dcloud.net.cn/article/35843)| |requiredBackgroundModes|Array|小程序需要在后台使用的能力,目前支持背景音频播放,"requiredBackgroundModes": ["audio"],[详见](https://smartprogram.baidu.com/docs/develop/tutorial/process/#requiredBackgroundModes) | |prefetches|Array|预请求的所有url的列表,[详见](https://smartprogram.baidu.com/docs/develop/tutorial/process/#prefetches) | -|optimization|Object| 对百度小程序的优化配置 | +|optimization|Object| 对百度小程序的优化配置 | |uniStatistics|Object|[百度小程序是否开启 uni 统计,配置方法同全局配置](/collocation/manifest?id=uniStatistics)| #### optimization @@ -410,7 +410,7 @@ Tips:关于摇树优化(treeShaking)原理及优化结果,参考:[http |appid|String|头条小程序的 AppID,登录 [https://developer.toutiao.com/](https://developer.toutiao.com/) 申请| |setting|Object|头条小程序项目设置,参考[头条小程序项目设置](/collocation/manifest?id=mp-toutiao-setting)| |usingComponents|Boolean| 是否启用自定义组件模式,`v2.0+`,默认为false,[编译模式区别详情](https://ask.dcloud.net.cn/article/35843)| -|navigateToMiniProgramAppIdList |Array|需要跳转的小程序列表,[详见](https://developer.toutiao.com/dev/cn/mini-app/develop/framework/basic-reference/general-configuration) | +|navigateToMiniProgramAppIdList |Array|需要跳转的小程序列表,[详见](https://developer.toutiao.com/dev/cn/mini-app/develop/framework/basic-reference/general-configuration) | |uniStatistics|Object|[头条小程序是否开启 uni 统计,配置方法同全局配置](/collocation/manifest?id=uniStatistics)| #### 头条小程序项目设置@mp-toutiao-setting @@ -432,7 +432,7 @@ Tips:关于摇树优化(treeShaking)原理及优化结果,参考:[http |permission |Object |小程序接口权限相关设置,比如申请位置权限必须填此处[详见](https://q.qq.com/wiki/develop/miniprogram/frame/dispose.html#permission) | |workers |String |Worker 代码放置的目录。 [详见](https://q.qq.com/wiki/develop/miniprogram/frame/dispose.html#workers) | |groupIdList |String Array |需要打开群资料卡的群号列表,详见button的open-type | -|optimization|Object| 对QQ小程序的优化配置 | +|optimization|Object| 对QQ小程序的优化配置 | |uniStatistics|Object|[QQ小程序是否开启 uni 统计,配置方法同全局配置](/collocation/manifest?id=uniStatistics)| #### optimization @@ -475,10 +475,10 @@ mp-qq只支持自定义组件模式,不存在usingComponents配置 "name": "应用名称,如uni-app", "description": "应用描述", "versionName": "1.0.0", - "versionCode": "100", - // 是否全局关闭uni统计 - "uniStatistics": { - "enable": false//全局关闭 + "versionCode": "100", + // 是否全局关闭uni统计 + "uniStatistics": { + "enable": false//全局关闭 }, // app-plus 节点是 App 特有配置,推荐在 HBuilderX 的 manifest.json 可视化界面操作完成配置。 "app-plus": { @@ -759,9 +759,9 @@ mp-qq只支持自定义组件模式,不存在usingComponents配置 "quickapp": {}, // 微信小程序特有配置 "mp-weixin": { - "appid": "wx开头的微信小程序appid", - "uniStatistics": { - "enable": false//仅微信小程序关闭uni统计 + "appid": "wx开头的微信小程序appid", + "uniStatistics": { + "enable": false//仅微信小程序关闭uni统计 }, }, // 百度小程序特有配置 diff --git a/lerna.json b/lerna.json index 710b21dc4319b912853506b6a172808b747e8d77..424d9618a4adb18af37cbe1c0cd6a613dc71eb40 100644 --- a/lerna.json +++ b/lerna.json @@ -12,5 +12,5 @@ "message": "chore(release): publish %s" } }, - "version": "2.0.0-alpha-25720200116004" + "version": "2.0.0-alpha-26420200309002" } diff --git a/lib/apis.js b/lib/apis.js index 775a4f72deef4fba53bb62b63c8ae8a61867f7ec..dfd43bb600d7b1b59993ad1a4a9fcaf3717d56f4 100644 --- a/lib/apis.js +++ b/lib/apis.js @@ -59,7 +59,8 @@ const media = [ 'saveVideoToPhotosAlbum', 'createVideoContext', 'createCameraContext', - 'createLivePlayerContext' + 'createLivePlayerContext', + 'createLivePusherContext' ] const device = [ @@ -186,6 +187,7 @@ const third = [ 'checkSession', 'getUserInfo', 'share', + 'shareWithSystem', 'showShareMenu', 'hideShareMenu', 'requestPayment', @@ -201,6 +203,10 @@ const third = [ 'setPageMeta' ] +const ad = [ + 'createRewardedVideoAd' +] + const apis = [ ...base, ...network, @@ -214,7 +220,8 @@ const apis = [ ...event, ...file, ...canvas, - ...third + ...third, + ...ad ] module.exports = apis diff --git a/lib/modules.json b/lib/modules.json index 2592668e20512f7989d9960264610c1f4c872ea7..41e31237c7810c1bf0a722067ca8032024081aa6 100644 --- a/lib/modules.json +++ b/lib/modules.json @@ -66,7 +66,8 @@ "uni.saveVideoToPhotosAlbum": true, "uni.createVideoContext": true, "uni.createCameraContext": true, - "uni.createLivePlayerContext": true + "uni.createLivePlayerContext": true, + "uni.createLivePusherContext": true } }, { "name": "device", @@ -206,4 +207,10 @@ "uni.base64ToArrayBuffer": true, "uni.arrayBufferToBase64": true } +}, { + "name": "ad", + "title": "广告", + "apiList": { + "uni.createRewardedVideoAd": true + } }] diff --git a/package.json b/package.json index 60dc32c04724e6686c3d5071f8a5e9ef4faa9035..be975b27174bcf0bb8d27afd5e09e75209caca96 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,8 @@ "build:mp-weixin": "cross-env UNI_PLATFORM=mp-weixin rollup -c build/rollup.config.mp.js", "build:mp-baidu": "cross-env UNI_PLATFORM=mp-baidu rollup -c build/rollup.config.mp.js", "build:mp-alipay": "cross-env UNI_PLATFORM=mp-alipay rollup -c build/rollup.config.mp.js", - "build:mp-toutiao": "cross-env UNI_PLATFORM=mp-toutiao rollup -c build/rollup.config.mp.js", - "build:mp-weixin:mp": "npm run lint && cross-env UNI_PLATFORM=mp-weixin UNI_MP=true rollup -c build/rollup.config.mp.js", + "build:mp-toutiao": "cross-env UNI_PLATFORM=mp-toutiao rollup -c build/rollup.config.mp.js", + "build:mp-weixin:mp": "npm run lint && cross-env UNI_PLATFORM=mp-weixin UNI_MP=true rollup -c build/rollup.config.mp.js", "build:mp-weixin:wxs": "rollup -c build/rollup.config.wxs.js", "build:runtime": "npm run lint && npm run build:mp-weixin && npm run build:mp-qq && npm run build:mp-alipay && npm run build:mp-baidu && npm run build:mp-toutiao && npm run build:app-plus", "build:stat": "npm run lint && rollup -c build/rollup.config.stat.js", @@ -30,7 +30,7 @@ "test:unit": "cross-env NODE_ENV=test UNI_PLATFORM=h5 mocha-webpack --require tests/unit/setup.js --webpack-config build/webpack.config.test.js tests/unit/**/*.spec.js", "release": "npm run lint:cli && lerna publish --force-publish=*", "release:alpha": "npm run lint:cli && lerna publish --force-publish=* --npm-tag=alpha", - "release:next": "npm run lint:cli && lerna publish --force-publish=* --npm-tag=next", + "release:next": "npm run lint:cli && lerna publish --force-publish=* --npm-tag=next", "release:v3": "npm run lint:cli && lerna publish --no-git-tag-version --force-publish=* --npm-tag=v3" }, "dependencies": { @@ -105,6 +105,7 @@ "my": true, "swan": true, "tt": true, + "qh": true, "weex": true, "__id__": true, "__uniConfig": true, diff --git a/packages/uni-app-plus-nvue/package.json b/packages/uni-app-plus-nvue/package.json index 9b04409d74dde061d17122212e1d7a7cb6ac8026..bb6c07c3cb6bbbff2d164f625ef1a0ddc3574c38 100644 --- a/packages/uni-app-plus-nvue/package.json +++ b/packages/uni-app-plus-nvue/package.json @@ -1,6 +1,6 @@ { "name": "@dcloudio/uni-app-plus-nvue", - "version": "2.0.0-alpha-25720200116004", + "version": "2.0.0-alpha-26420200309002", "description": "uni-app app-plus-nvue", "main": "dist/index.js", "repository": { diff --git a/packages/uni-app-plus/dist/index.js b/packages/uni-app-plus/dist/index.js index b7e6b6352ca0412e9a44fc6630441e92ca3c5c91..7aa090e0814b67627c7b3a8e56d1fc3cf341a8c2 100644 --- a/packages/uni-app-plus/dist/index.js +++ b/packages/uni-app-plus/dist/index.js @@ -1314,7 +1314,8 @@ function parseBaseComponent (vueComponentOptions, { const options = { multipleSlots: true, - addGlobalClass: true + addGlobalClass: true, + ...(vueOptions.options || {}) }; const componentOptions = { @@ -1359,7 +1360,7 @@ function parseBaseComponent (vueComponentOptions, { } }, detached () { - this.$vm.$destroy(); + this.$vm && this.$vm.$destroy(); } }, pageLifetimes: { diff --git a/packages/uni-app-plus/dist/index.v3.js b/packages/uni-app-plus/dist/index.v3.js index 6e96a1a735bf21e57bd036d459757d2daa6426ec..1cfcffbc0e97cdb2289e596d407a25010b8f0087 100644 --- a/packages/uni-app-plus/dist/index.v3.js +++ b/packages/uni-app-plus/dist/index.v3.js @@ -71,7 +71,8 @@ var serviceContext = (function () { 'saveVideoToPhotosAlbum', 'createVideoContext', 'createCameraContext', - 'createLivePlayerContext' + 'createLivePlayerContext', + 'createLivePusherContext' ]; const device = [ @@ -198,6 +199,7 @@ var serviceContext = (function () { 'checkSession', 'getUserInfo', 'share', + 'shareWithSystem', 'showShareMenu', 'hideShareMenu', 'requestPayment', @@ -213,6 +215,10 @@ var serviceContext = (function () { 'setPageMeta' ]; + const ad = [ + 'createRewardedVideoAd' + ]; + const apis = [ ...base, ...network, @@ -226,7 +232,8 @@ var serviceContext = (function () { ...event, ...file, ...canvas, - ...third + ...third, + ...ad ]; var apis_1 = apis; @@ -292,10 +299,6 @@ var serviceContext = (function () { return ('' + str).replace(/[^\x00-\xff]/g, '**').length } - function guid () { - return Math.floor(4294967296 * (1 + Math.random())).toString(16).slice(1) - } - function debounce (fn, delay) { let timeout; return function () { @@ -305,6 +308,17 @@ var serviceContext = (function () { } } + const encodeReserveRE = /[!'()*]/g; + const encodeReserveReplacer = c => '%' + c.charCodeAt(0).toString(16); + const commaRE = /%2C/g; + + // fixed encodeURIComponent which is more conformant to RFC3986: + // - escapes [!'()*] + // - preserve commas + const encode = str => encodeURIComponent(str) + .replace(encodeReserveRE, encodeReserveReplacer) + .replace(commaRE, ','); + const decode = decodeURIComponent; function parseQuery (query) { @@ -333,6 +347,38 @@ var serviceContext = (function () { }); return res + } + + function stringifyQuery (obj, encodeStr = encode) { + const res = obj ? Object.keys(obj).map(key => { + const val = obj[key]; + + if (val === undefined) { + return '' + } + + if (val === null) { + return encodeStr(key) + } + + if (Array.isArray(val)) { + const result = []; + val.forEach(val2 => { + if (val2 === undefined) { + return + } + if (val2 === null) { + result.push(encodeStr(key)); + } else { + result.push(encodeStr(key) + '=' + encodeStr(val2)); + } + }); + return result.join('&') + } + + return encodeStr(key) + '=' + encodeStr(val) + }).filter(x => x.length > 0).join('&') : null; + return res ? `?${res}` : '' } let id = 0; @@ -1282,9 +1328,9 @@ var serviceContext = (function () { ARRAYBUFFER: 'arraybuffer' }; - const encode = encodeURIComponent; + const encode$1 = encodeURIComponent; - function stringifyQuery (url, data) { + function stringifyQuery$1 (url, data) { let str = url.split('#'); const hash = str[1] || ''; str = str[0].split('?'); @@ -1299,9 +1345,9 @@ var serviceContext = (function () { for (let key in data) { if (data.hasOwnProperty(key)) { if (isPlainObject(data[key])) { - query[encode(key)] = encode(JSON.stringify(data[key])); + query[encode$1(key)] = encode$1(JSON.stringify(data[key])); } else { - query[encode(key)] = encode(data[key]); + query[encode$1(key)] = encode$1(data[key]); } } } @@ -1332,7 +1378,7 @@ var serviceContext = (function () { isPlainObject(params.data) && Object.keys(params.data).length ) { // 将 method,data 校验提前,保证 url 校验时,method,data 已被格式化 - params.url = stringifyQuery(value, params.data); + params.url = stringifyQuery$1(value, params.data); } } }, @@ -1423,21 +1469,26 @@ var serviceContext = (function () { closeSocket: closeSocket }); + // App端可以只使用files不传filePath和name + const uploadFile = { url: { type: String, required: true }, + files: { + type: Array + }, filePath: { type: String, - required: true, validator (value, params) { - params.type = getRealPath(value); + if (value) { + params.type = getRealPath(value); + } } }, name: { - type: String, - required: true + type: String }, header: { type: Object, @@ -2327,8 +2378,13 @@ var serviceContext = (function () { res.errMsg = apiName + ':ok'; } else if (res.errMsg.indexOf(':cancel') !== -1) { res.errMsg = apiName + ':cancel'; - } else if (res.errMsg.indexOf(':fail') !== -1) { - res.errMsg = apiName + ':fail' + res.errMsg.substr(res.errMsg.indexOf(' ')); + } else if (res.errMsg.indexOf(':fail') !== -1) { + let errDetail = ''; + let spaceIndex = res.errMsg.indexOf(' '); + if (spaceIndex > -1) { + errDetail = res.errMsg.substr(spaceIndex); + } + res.errMsg = apiName + ':fail' + errDetail; } const errMsg = res.errMsg; @@ -3531,6 +3587,84 @@ var serviceContext = (function () { : operateVideoPlayer(videoId, pageVm, type, data); } + class LivePusherContext { + constructor (id, ctx) { + this.id = id; + this.ctx = ctx; + } + + start (cbs) { + return invokeVmMethodWithoutArgs(this.ctx, 'start', cbs) + } + + stop (cbs) { + return invokeVmMethodWithoutArgs(this.ctx, 'stop', cbs) + } + + pause (cbs) { + return invokeVmMethodWithoutArgs(this.ctx, 'pause', cbs) + } + + resume (cbs) { + return invokeVmMethodWithoutArgs(this.ctx, 'resume', cbs) + } + + switchCamera (cbs) { + return invokeVmMethodWithoutArgs(this.ctx, 'switchCamera', cbs) + } + + snapshot (cbs) { + return invokeVmMethodWithoutArgs(this.ctx, 'snapshot', cbs) + } + + toggleTorch (cbs) { + return invokeVmMethodWithoutArgs(this.ctx, 'toggleTorch', cbs) + } + + playBGM (args) { + return invokeVmMethod(this.ctx, 'playBGM', args) + } + + stopBGM (cbs) { + return invokeVmMethodWithoutArgs(this.ctx, 'stopBGM', cbs) + } + + pauseBGM (cbs) { + return invokeVmMethodWithoutArgs(this.ctx, 'pauseBGM', cbs) + } + + resumeBGM (cbs) { + return invokeVmMethodWithoutArgs(this.ctx, 'resumeBGM', cbs) + } + + setBGMVolume (cbs) { + return invokeVmMethod(this.ctx, 'setBGMVolume', cbs) + } + + startPreview (cbs) { + return invokeVmMethodWithoutArgs(this.ctx, 'startPreview', cbs) + } + + stopPreview (args) { + return invokeVmMethodWithoutArgs(this.ctx, 'stopPreview', args) + } + } + + function createLivePusherContext (id, vm) { + if (!vm) { + return console.warn('uni.createLivePusherContext 必须传入第二个参数,即当前 vm 对象(this)') + } + const elm = findElmById(id, vm); + if (!elm) { + return console.warn('Can not find `' + id + '`') + } + return new LivePusherContext(id, elm) + } + + function createLivePusherContext$1 (id, vm) { + return createLivePusherContext(id, vm) + } + let watchAccelerationId = false; let isWatchAcceleration = false; @@ -4872,7 +5006,9 @@ var serviceContext = (function () { tabBar && tabBar.showTabBar({ animation }); - } + } + + let maskClickCallback = []; var tabBar$1 = { id: '0', @@ -4884,7 +5020,12 @@ var serviceContext = (function () { tabBar = requireNativePlugin('uni-tabview'); } catch (error) { console.log(`uni.requireNativePlugin("uni-tabview") error ${error}`); - } + } + tabBar.onMaskClick(() => { + maskClickCallback.forEach((callback) => { + callback(); + }); + }); tabBar && tabBar.onClick(({ index }) => { clickCallback(config.list[index], index); }); @@ -4950,8 +5091,12 @@ var serviceContext = (function () { color: mask }); }, - addEventListener (name, callback) { - tabBar.onMaskClick(callback); + addEventListener (name, callback) { + maskClickCallback.push(callback); + }, + removeEventListener (name, callback) { + let callbackIndex = maskClickCallback.indexOf(callback); + maskClickCallback.splice(callbackIndex, 1); } }; @@ -6232,7 +6377,7 @@ var serviceContext = (function () { statusCode: 0, errMsg: 'timeout' }); - }, timeout); + }, (timeout + 200));// TODO +200 发消息到原生层有时间开销,以后考虑由原生层回调超时 } const options = { method, @@ -6483,7 +6628,7 @@ var serviceContext = (function () { } for (const name in formData) { if (formData.hasOwnProperty(name)) { - uploader.addData(name, formData[name]); + uploader.addData(name, String(formData[name])); } } if (files && files.length) { @@ -7024,6 +7169,39 @@ var serviceContext = (function () { }); } ); + } + + function shareWithSystem (params, callbackId, method = 'shareWithSystem') { + let { + type, + imageUrl, + summary: content, + href + } = params; + type = type || 'text'; + const allowedTypes = ['text', 'image']; + if (allowedTypes.indexOf(type) < 0) { + invoke$1(callbackId, { + errMsg: method + ':fail:分享参数 type 不正确' + }); + } + if (typeof imageUrl === 'string' && imageUrl) { + imageUrl = getRealPath$1(imageUrl); + } + plus.share.sendWithSystem({ + type, + pictures: imageUrl ? [imageUrl] : [], + content, + href + }, function (res) { + invoke$1(callbackId, { + errMsg: method + ':ok' + }); + }, function (err) { + invoke$1(callbackId, { + errMsg: method + ':fail:' + err.message + }); + }); } function restoreGlobal ( @@ -7429,6 +7607,10 @@ var serviceContext = (function () { delete webviewStyle.popGesture; } + if (routeOptions.meta.isQuit) { // 退出 + webviewStyle.popGesture = plus.os.name === 'iOS' ? 'appback' : 'none'; + } + // TODO 下拉刷新 if (path && routeOptions.meta.isNVue) { @@ -7697,7 +7879,22 @@ var serviceContext = (function () { preloadWebview = webview; } - function createWebview (path, routeOptions) { + function noop$1 (str) { + return str + } + + function getDebugRefresh (path, query, routeOptions) { + const queryString = query ? stringifyQuery(query, noop$1) : ''; + return { + isTab: routeOptions.meta.isTabBar, + arguments: JSON.stringify({ + path: path.substr(1), + query: queryString ? queryString.substr(1) : queryString + }) + } + } + + function createWebview (path, routeOptions, query) { if (routeOptions.meta.isNVue) { const webviewId = id$1++; const webviewStyle = parseWebviewStyle( @@ -7705,6 +7902,7 @@ var serviceContext = (function () { path, routeOptions ); + webviewStyle.debugRefresh = getDebugRefresh(path, query, routeOptions); if (process.env.NODE_ENV !== 'production') { console.log(`[uni-app] createWebview`, webviewId, path, webviewStyle); } @@ -7719,7 +7917,7 @@ var serviceContext = (function () { return webview } - function initWebview (webview, routeOptions, url = '') { + function initWebview (webview, routeOptions, path, query) { // 首页或非 nvue 页面 if (webview.id === '1' || !routeOptions.meta.isNVue) { const webviewStyle = parseWebviewStyle( @@ -7727,17 +7925,7 @@ var serviceContext = (function () { '', routeOptions ); - if (url) { - const part = url.split('?'); - webviewStyle.debugRefresh = { - isTab: routeOptions.meta.isTabBar, - arguments: JSON.stringify({ - path: part[0].substr(1), - query: part[1] || '' - }) - }; - } - + webviewStyle.debugRefresh = getDebugRefresh(path, query, routeOptions); if (process.env.NODE_ENV !== 'production') { console.log(`[uni-app] updateWebview`, webviewStyle); } @@ -7933,7 +8121,7 @@ var serviceContext = (function () { /** * 首页需要主动registerPage,二级页面路由跳转时registerPage */ - function registerPage ({ + function registerPage ({ url, path, query, @@ -7955,7 +8143,7 @@ var serviceContext = (function () { } if (!webview) { - webview = createWebview(path, routeOptions); + webview = createWebview(path, routeOptions, query); } else { webview = plus.webview.getWebviewById(webview.id); webview.nvue = routeOptions.meta.isNVue; @@ -7973,7 +8161,7 @@ var serviceContext = (function () { console.log(`[uni-app] registerPage`, path, webview.id); } - initWebview(webview, routeOptions, url); + initWebview(webview, routeOptions, path, query); const route = path.slice(1); @@ -8229,6 +8417,9 @@ var serviceContext = (function () { // 查找当前 tabBarPage,且设置 visible getCurrentPages(true).forEach(page => { if (('/' + page.route) === path) { + if (!page.$page.meta.visible) { + page.$vm.__call_hook('onShow'); + } page.$page.meta.visible = true; tabBarPage = page; } else { @@ -8239,7 +8430,6 @@ var serviceContext = (function () { }); if (tabBarPage) { - tabBarPage.$vm.__call_hook('onShow'); tabBarPage.$getAppWebview().show('none'); } else { return showWebview(registerPage({ @@ -8791,6 +8981,98 @@ var serviceContext = (function () { : requestComponentInfo(pageVm, queue, callback); } + const eventNames = [ + 'load', + 'close', + 'error' + ]; + + const ERROR_CODE_LIST = [-5001, -5002, -5003, -5004, -5005, -5006]; + + class RewardedVideoAd { + constructor (adpid) { + this._options = { + adpid: adpid + }; + + const _callbacks = this._callbacks = {}; + eventNames.forEach(item => { + _callbacks[item] = []; + const name = item[0].toUpperCase() + item.substr(1); + this[`on${name}`] = function (callback) { + _callbacks[item].push(callback); + }; + }); + + this._isLoad = false; + this._adError = ''; + this._loadPromiseResolve = null; + this._loadPromiseReject = null; + const rewardAd = this._rewardAd = plus.ad.createRewardedVideoAd(this._options); + rewardAd.onLoad((e) => { + this._isLoad = true; + this._dispatchEvent('load', {}); + if (this._loadPromiseResolve != null) { + this._loadPromiseResolve(); + this._loadPromiseResolve = null; + } + }); + rewardAd.onClose((e) => { + this._loadAd(); + this._dispatchEvent('close', { isEnded: e.isEnded }); + }); + rewardAd.onError((e) => { + const { code, message } = e; + const data = { code: code, errMsg: message }; + this._adError = message; + this._dispatchEvent('error', data); + if ((code === -5005 || ERROR_CODE_LIST.index(code) === -1) && this._loadPromiseReject != null) { + this._loadPromiseReject(data); + this._loadPromiseReject = null; + } + }); + this._loadAd(); + } + load () { + return new Promise((resolve, reject) => { + if (this._isLoad) { + resolve(); + return + } + this._loadPromiseResolve = resolve; + this._loadPromiseReject = reject; + this._loadAd(); + }) + } + show () { + return new Promise((resolve, reject) => { + if (this._isLoad) { + this._rewardAd.show(); + resolve(); + } else { + reject(new Error(this._adError)); + } + }) + } + _loadAd () { + this._isLoad = false; + this._rewardAd.load(); + } + _dispatchEvent (name, data) { + this._callbacks[name].forEach(callback => { + if (typeof callback === 'function') { + callback(data || {}); + } + }); + } + } + + function createRewardedVideoAd ({ + adpid = '' + } = {}) { + return new RewardedVideoAd(adpid) + } + var api = /*#__PURE__*/Object.freeze({ @@ -8814,6 +9096,7 @@ var serviceContext = (function () { base64ToTempFilePath: base64ToTempFilePath, operateMapPlayer: operateMapPlayer$2, operateVideoPlayer: operateVideoPlayer$2, + createLivePusherContext: createLivePusherContext$1, enableAccelerometer: enableAccelerometer, addPhoneContact: addPhoneContact, openBluetoothAdapter: openBluetoothAdapter, @@ -8895,6 +9178,7 @@ var serviceContext = (function () { requireNativePlugin: requireNativePlugin$1, shareAppMessageDirectly: shareAppMessageDirectly, share: share, + shareWithSystem: shareWithSystem, restoreGlobal: restoreGlobal, getSubNVueById: getSubNVueById, getCurrentSubNVue: getCurrentSubNVue, @@ -8920,7 +9204,8 @@ var serviceContext = (function () { setTabBarStyle: setTabBarStyle$2, hideTabBar: hideTabBar$2, showTabBar: showTabBar$2, - requestComponentInfo: requestComponentInfo$2 + requestComponentInfo: requestComponentInfo$2, + createRewardedVideoAd: createRewardedVideoAd }); var platformApi = Object.assign(Object.create(null), api, eventApis); @@ -8956,7 +9241,7 @@ var serviceContext = (function () { return page && page.$page.id } - const eventNames = [ + const eventNames$1 = [ 'canplay', 'play', 'pause', @@ -9021,7 +9306,7 @@ var serviceContext = (function () { this.id = id; this._callbacks = {}; this._options = {}; - eventNames.forEach(name => { + eventNames$1.forEach(name => { this._callbacks[name.toLowerCase()] = []; }); props.forEach(item => { @@ -9075,7 +9360,7 @@ var serviceContext = (function () { } } - eventNames.forEach(item => { + eventNames$1.forEach(item => { const name = item[0].toUpperCase() + item.substr(1); item = item.toLowerCase(); InnerAudioContext.prototype[`on${name}`] = function (callback) { @@ -9140,7 +9425,7 @@ var serviceContext = (function () { createInnerAudioContext: createInnerAudioContext }); - const eventNames$1 = [ + const eventNames$2 = [ 'canplay', 'play', 'pause', @@ -9153,7 +9438,7 @@ var serviceContext = (function () { 'waiting' ]; const callbacks$4 = {}; - eventNames$1.forEach(name => { + eventNames$2.forEach(name => { callbacks$4[name] = []; }); @@ -9256,7 +9541,7 @@ var serviceContext = (function () { this._operate('stop'); } seek (position) { - this._operate('play', { + this._operate('seek', { currentTime: position }); } @@ -9267,7 +9552,7 @@ var serviceContext = (function () { } } - eventNames$1.forEach(item => { + eventNames$2.forEach(item => { const name = item[0].toUpperCase() + item.substr(1); BackgroundAudioManager.prototype[`on${name}`] = function (callback) { callbacks$4[item].push(callback); @@ -10161,7 +10446,7 @@ var serviceContext = (function () { callback.invoke(callbackId, data); }); - const methods = ['getCenterLocation', 'translateMarker', 'getScale', 'getRegion']; + const methods = ['getCenterLocation', 'getScale', 'getRegion']; class MapContext { constructor (id, pageVm) { @@ -10175,11 +10460,15 @@ var serviceContext = (function () { includePoints (args) { operateMapPlayer$3(this.id, this.pageVm, 'includePoints', args); + } + + translateMarker (args) { + operateMapPlayer$3(this.id, this.pageVm, 'translateMarker', args); } } - MapContext.prototype.$getAppMap = function() { - return plus.maps.getMapById(this.pageVm.$page.id + '-map-' + this.id); + MapContext.prototype.$getAppMap = function () { + return plus.maps.getMapById(this.pageVm.$page.id + '-map-' + this.id) }; methods.forEach(function (method) { @@ -10705,7 +10994,17 @@ var serviceContext = (function () { } } - function request$1 (args, callbackId) { + function request$1 (args, callbackId) { + let contentType; + for (const name in args.header) { + if (name.toLowerCase() === 'content-type') { + contentType = args.header[name]; + break + } + } + if (args.method !== 'GET' && contentType.indexOf('application/json') === 0 && isPlainObject(args.data)) { + args.data = JSON.stringify(args.data); + } const { requestTaskId } = invokeMethod('createRequestTask', args); @@ -10996,6 +11295,23 @@ var serviceContext = (function () { const STORAGE_DATA_TYPE = '__TYPE'; const STORAGE_KEYS = 'uni-storage-keys'; + function parseValue (value) { + const types = ['object', 'string', 'number', 'boolean', 'undefined']; + try { + const object = typeof value === 'string' ? JSON.parse(value) : value; + const type = object.type; + if (types.indexOf(type) >= 0) { + const keys = Object.keys(object); + // eslint-disable-next-line valid-typeof + if (keys.length === 2 && 'data' in object && typeof object.data === type) { + return object.data + } else if (keys.length === 1) { + return '' + } + } + } catch (error) { } + } + function setStorage$1 ({ key, data @@ -11006,6 +11322,11 @@ var serviceContext = (function () { data: data }); try { + if (type === 'string' && parseValue(value) !== undefined) { + localStorage.setItem(key + STORAGE_DATA_TYPE, type); + } else { + localStorage.removeItem(key + STORAGE_DATA_TYPE); + } localStorage.setItem(key, value); } catch (error) { return { @@ -11035,22 +11356,26 @@ var serviceContext = (function () { } } let data = value; - try { - const object = JSON.parse(value); - // 兼容App端历史格式 - const type = localStorage.getItem(key + STORAGE_DATA_TYPE); - if (!type) { - const keys = Object.keys(object); - if (keys.length === 2 && 'type' in object && 'data' in object) { - data = object.data; - } else if (keys.length === 1 && 'type' in object) { - data = ''; + const typeOrigin = localStorage.getItem(key + STORAGE_DATA_TYPE) || ''; + const type = typeOrigin.toLowerCase(); + if (type !== 'string' || (typeOrigin === 'String' && value === '{"type":"undefined"}')) { + try { + // 兼容H5和V3初期历史格式 + let object = JSON.parse(value); + const result = parseValue(object); + if (result !== undefined) { + data = result; + } else if (type) { + // 兼容App端历史格式 + data = object; + if (typeof object === 'string') { + object = JSON.parse(object); + // eslint-disable-next-line valid-typeof + data = typeof object === (type === 'null' ? 'object' : type) ? object : data; + } } - } else if (type !== 'String') { - data = object; - data = typeof data === 'string' ? JSON.parse(data) : data; - } - } catch (error) { } + } catch (error) { } + } return { data, errMsg: 'getStorage:ok' @@ -12074,10 +12399,6 @@ var serviceContext = (function () { __uniConfig.tabBar.selected = 0; const selected = __uniConfig.tabBar.list.findIndex(page => page.pagePath === __uniConfig.entryPagePath); - if (selected !== -1) { - // 取当前 tab 索引值 - __uniConfig.tabBar.selected = selected; - } tabBar$1.init(__uniConfig.tabBar, (item, index) => { uni.switchTab({ @@ -12093,22 +12414,36 @@ var serviceContext = (function () { } }); }); - } - function initEntryPage () { - const argsJsonStr = plus.runtime.arguments; - if (!argsJsonStr) { - return + if (selected !== -1) { + // 取当前 tab 索引值 + __uniConfig.tabBar.selected = selected; + selected !== 0 && tabBar$1.switchTab(__uniConfig.entryPagePath); } + } + function initEntryPage () { let entryPagePath; let entryPageQuery; - try { - const args = JSON.parse(argsJsonStr); - entryPagePath = args.path || args.pathName; - entryPageQuery = (args.query ? ('?' + args.query) : ''); - } catch (e) {} + const weexPlus = weex.requireModule('plus'); + + if (weexPlus.getRedirectInfo) { + const info = weexPlus.getRedirectInfo() || {}; + entryPagePath = info.path; + entryPageQuery = info.query ? ('?' + info.query) : ''; + } else { + const argsJsonStr = plus.runtime.arguments; + if (!argsJsonStr) { + return + } + try { + const args = JSON.parse(argsJsonStr); + entryPagePath = args.path || args.pathName; + entryPageQuery = args.query ? ('?' + args.query) : ''; + } catch (e) {} + } + if (!entryPagePath || entryPagePath === __uniConfig.entryPagePath) { return } @@ -12135,8 +12470,8 @@ var serviceContext = (function () { if (process.env.NODE_ENV !== 'production') { console.log(`[uni-app] registerApp`); } - - appCtx = appVm; + + appCtx = appVm; appCtx.$vm = appVm; Object.assign(appCtx, defaultApp); // 拷贝默认实现 @@ -12230,7 +12565,7 @@ var serviceContext = (function () { function initVue (Vue) { Vue.config.errorHandler = function (err) { - const app = getApp(); + const app = typeof getApp === 'function' && getApp(); if (app && hasLifecycleHook(app.$options, 'onError')) { app.__call_hook('onError', err); } else { @@ -12750,7 +13085,11 @@ var serviceContext = (function () { this._$vdomSync = new VDomSync(this.$options.pageId, this.$options.pagePath, this); } if (this._$vd) { - this._$id = guid(); + if (!this.$parent) { + this._$id = '-1'; + } else { + this._$id = this.$parent._$id + ',' + this.$vnode.data.attrs._i; + } this._$vd.addVm(this); this._$vdMountedData = Object.create(null); this._$setData(MOUNTED_DATA, this._$vdMountedData); @@ -12986,7 +13325,8 @@ var serviceContext = (function () { onPageReachBottom, onReachBottomDistance, statusbarHeight, - windowTop: windowOptions.titleNView && windowOptions.titleNView.type === 'float' ? (statusbarHeight + TITLEBAR_HEIGHT) : 0, + windowTop: windowOptions.titleNView && windowOptions.titleNView.type === 'float' ? (statusbarHeight + + TITLEBAR_HEIGHT) : 0, windowBottom: (tabBar$1.indexOf(route) >= 0 && tabBar$1.cover) ? tabBar$1.height : 0 } } @@ -12999,6 +13339,11 @@ var serviceContext = (function () { // TODO 临时解决方案,service 层也注入 wxs (适用于工具类) const options = this.$options; + // 自动挂载 $store + if (options.store && !Vue.prototype.$store) { + Vue.prototype.$store = options.store; + } + const wxs = options.wxs; if (wxs) { Object.keys(wxs).forEach(module => { @@ -13070,16 +13415,18 @@ var serviceContext = (function () { Vue.prototype.$nextTick = function nextTick (cb) { const renderWatcher = this._watcher; + const callback = typeof cb === 'function'; if ( renderWatcher && this._$queue.find(watcher => renderWatcher === watcher) ) { - vdSyncCallbacks.push(cb.bind(this)); + const result = new Promise((resolve) => { + vdSyncCallbacks.push(callback ? cb.bind(this) : resolve); + }); + return callback ? result : undefined } else { // $nextTick bind vm context - Vue.nextTick(() => { - cb.call(this); - }); + return Vue.nextTick(callback ? () => cb.call(this) : undefined) } }; } diff --git a/packages/uni-app-plus/dist/service.runtime.esm.js b/packages/uni-app-plus/dist/service.runtime.esm.dev.js similarity index 97% rename from packages/uni-app-plus/dist/service.runtime.esm.js rename to packages/uni-app-plus/dist/service.runtime.esm.dev.js index 569e529b581e66e9ccc6971db5419190f5c7a04c..da90af3a62fb853c5446037481a0e0e7a1ba71d2 100644 --- a/packages/uni-app-plus/dist/service.runtime.esm.js +++ b/packages/uni-app-plus/dist/service.runtime.esm.dev.js @@ -377,12 +377,12 @@ var config = ({ /** * Show production mode tip message on boot? */ - productionTip: process.env.NODE_ENV !== 'production', + productionTip: "development" !== 'production', /** * Whether to enable devtools */ - devtools: process.env.NODE_ENV !== 'production', + devtools: "development" !== 'production', /** * Whether to record perf @@ -596,7 +596,7 @@ var tip = noop; var generateComponentTrace = (noop); // work around flow check var formatComponentName = (noop); -if (process.env.NODE_ENV !== 'production') { +{ var hasConsole = typeof console !== 'undefined'; var classifyRE = /(?:^|[-_])(\w)/g; var classify = function (str) { return str @@ -719,7 +719,7 @@ Dep.prototype.depend = function depend () { Dep.prototype.notify = function notify () { // stabilize the subscriber list first var subs = this.subs.slice(); - if (process.env.NODE_ENV !== 'production' && !config.async) { + if (!config.async) { // subs aren't sorted in scheduler if not running async // we need to sort them now to make sure they fire in correct // order @@ -1043,7 +1043,7 @@ function defineReactive$$1 ( return } /* eslint-enable no-self-compare */ - if (process.env.NODE_ENV !== 'production' && customSetter) { + if (customSetter) { customSetter(); } // #7981: for accessor properties without setter @@ -1065,8 +1065,7 @@ function defineReactive$$1 ( * already exist. */ function set (target, key, val) { - if (process.env.NODE_ENV !== 'production' && - (isUndef(target) || isPrimitive(target)) + if (isUndef(target) || isPrimitive(target) ) { warn(("Cannot set reactive property on undefined, null, or primitive value: " + ((target)))); } @@ -1081,7 +1080,7 @@ function set (target, key, val) { } var ob = (target).__ob__; if (target._isVue || (ob && ob.vmCount)) { - process.env.NODE_ENV !== 'production' && warn( + warn( 'Avoid adding reactive properties to a Vue instance or its root $data ' + 'at runtime - declare it upfront in the data option.' ); @@ -1100,8 +1099,7 @@ function set (target, key, val) { * Delete a property and trigger change if necessary. */ function del (target, key) { - if (process.env.NODE_ENV !== 'production' && - (isUndef(target) || isPrimitive(target)) + if (isUndef(target) || isPrimitive(target) ) { warn(("Cannot delete reactive property on undefined, null, or primitive value: " + ((target)))); } @@ -1111,7 +1109,7 @@ function del (target, key) { } var ob = (target).__ob__; if (target._isVue || (ob && ob.vmCount)) { - process.env.NODE_ENV !== 'production' && warn( + warn( 'Avoid deleting properties on a Vue instance or its root $data ' + '- just set it to null.' ); @@ -1153,7 +1151,7 @@ var strats = config.optionMergeStrategies; /** * Options with restrictions */ -if (process.env.NODE_ENV !== 'production') { +{ strats.el = strats.propsData = function (parent, child, vm, key) { if (!vm) { warn( @@ -1247,7 +1245,7 @@ strats.data = function ( ) { if (!vm) { if (childVal && typeof childVal !== 'function') { - process.env.NODE_ENV !== 'production' && warn( + warn( 'The "data" option should be a function ' + 'that returns a per-instance value in component ' + 'definitions.', @@ -1310,7 +1308,7 @@ function mergeAssets ( ) { var res = Object.create(parentVal || null); if (childVal) { - process.env.NODE_ENV !== 'production' && assertObjectType(key, childVal, vm); + assertObjectType(key, childVal, vm); return extend(res, childVal) } else { return res @@ -1338,7 +1336,7 @@ strats.watch = function ( if (childVal === nativeWatch) { childVal = undefined; } /* istanbul ignore if */ if (!childVal) { return Object.create(parentVal || null) } - if (process.env.NODE_ENV !== 'production') { + { assertObjectType(key, childVal, vm); } if (!parentVal) { return childVal } @@ -1369,7 +1367,7 @@ strats.computed = function ( vm, key ) { - if (childVal && process.env.NODE_ENV !== 'production') { + if (childVal && "development" !== 'production') { assertObjectType(key, childVal, vm); } if (!parentVal) { return childVal } @@ -1429,7 +1427,7 @@ function normalizeProps (options, vm) { if (typeof val === 'string') { name = camelize(val); res[name] = { type: null }; - } else if (process.env.NODE_ENV !== 'production') { + } else { warn('props must be strings when using array syntax.'); } } @@ -1441,7 +1439,7 @@ function normalizeProps (options, vm) { ? val : { type: val }; } - } else if (process.env.NODE_ENV !== 'production') { + } else { warn( "Invalid value for option \"props\": expected an Array or an Object, " + "but got " + (toRawType(props)) + ".", @@ -1469,7 +1467,7 @@ function normalizeInject (options, vm) { ? extend({ from: key }, val) : { from: val }; } - } else if (process.env.NODE_ENV !== 'production') { + } else { warn( "Invalid value for option \"inject\": expected an Array or an Object, " + "but got " + (toRawType(inject)) + ".", @@ -1512,7 +1510,7 @@ function mergeOptions ( child, vm ) { - if (process.env.NODE_ENV !== 'production') { + { checkComponents(child); } @@ -1580,7 +1578,7 @@ function resolveAsset ( if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] } // fallback to prototype chain var res = assets[id] || assets[camelizedId] || assets[PascalCaseId]; - if (process.env.NODE_ENV !== 'production' && warnMissing && !res) { + if (warnMissing && !res) { warn( 'Failed to resolve ' + type.slice(0, -1) + ': ' + id, options @@ -1626,11 +1624,7 @@ function validateProp ( observe(value); toggleObserving(prevShouldObserve); } - if ( - process.env.NODE_ENV !== 'production' && - // skip validation for weex recycle-list child component props - !(false) - ) { + { assertProp(prop, key, value, vm, absent); } return value @@ -1646,7 +1640,7 @@ function getPropDefaultValue (vm, prop, key) { } var def = prop.default; // warn against non-factory defaults for Object & Array - if (process.env.NODE_ENV !== 'production' && isObject(def)) { + if (isObject(def)) { warn( 'Invalid default value for prop "' + key + '": ' + 'Props with type Object/Array must use a factory function ' + @@ -1882,7 +1876,7 @@ function globalHandleError (err, vm, info) { } function logError (err, vm, info) { - if (process.env.NODE_ENV !== 'production') { + { warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm); } /* istanbul ignore else */ @@ -2006,7 +2000,7 @@ function nextTick (cb, ctx) { var initProxy; -if (process.env.NODE_ENV !== 'production') { +{ var allowedGlobals = makeMap( 'Infinity,undefined,NaN,isFinite,isNaN,' + 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' + @@ -2130,7 +2124,7 @@ function _traverse (val, seen) { var mark; var measure; -if (process.env.NODE_ENV !== 'production') { +{ var perf = inBrowser && window.performance; /* istanbul ignore if */ if ( @@ -2200,7 +2194,7 @@ function updateListeners ( old = oldOn[name]; event = normalizeEvent(name); if (isUndef(cur)) { - process.env.NODE_ENV !== 'production' && warn( + warn( "Invalid handler for event \"" + (event.name) + "\": got " + String(cur), vm ); @@ -2311,7 +2305,7 @@ function extractPropsFromVNodeData ( if (isDef(attrs) || isDef(props)) { for (var key in propOptions) { var altKey = hyphenate(key); - if (process.env.NODE_ENV !== 'production') { + { var keyInLowerCase = key.toLowerCase(); if ( key !== keyInLowerCase && @@ -2464,7 +2458,7 @@ function initInjections (vm) { toggleObserving(false); Object.keys(result).forEach(function (key) { /* istanbul ignore else */ - if (process.env.NODE_ENV !== 'production') { + { defineReactive$$1(vm, key, result[key], function () { warn( "Avoid mutating an injected value directly since the changes will be " + @@ -2473,8 +2467,6 @@ function initInjections (vm) { vm ); }); - } else { - defineReactive$$1(vm, key, result[key]); } }); toggleObserving(true); @@ -2508,7 +2500,7 @@ function resolveInject (inject, vm) { result[key] = typeof provideDefault === 'function' ? provideDefault.call(vm) : provideDefault; - } else if (process.env.NODE_ENV !== 'production') { + } else { warn(("Injection \"" + key + "\" not found"), vm); } } @@ -2711,7 +2703,7 @@ function renderSlot ( if (scopedSlotFn) { // scoped slot props = props || {}; if (bindObject) { - if (process.env.NODE_ENV !== 'production' && !isObject(bindObject)) { + if (!isObject(bindObject)) { warn( 'slot v-bind without argument expects an Object', this @@ -2788,7 +2780,7 @@ function bindObjectProps ( ) { if (value) { if (!isObject(value)) { - process.env.NODE_ENV !== 'production' && warn( + warn( 'v-bind without argument expects an Object or Array value', this ); @@ -2896,7 +2888,7 @@ function markStaticNode (node, key, isOnce) { function bindObjectListeners (data, value) { if (value) { if (!isPlainObject(value)) { - process.env.NODE_ENV !== 'production' && warn( + warn( 'v-on without argument expects an Object value', this ); @@ -2947,7 +2939,7 @@ function bindDynamicKeys (baseObj, values) { var key = values[i]; if (typeof key === 'string' && key) { baseObj[values[i]] = values[i + 1]; - } else if (process.env.NODE_ENV !== 'production' && key !== '' && key !== null) { + } else if (key !== '' && key !== null) { // null is a special value for explicitly removing a binding warn( ("Invalid value for dynamic directive argument (expected string or null): " + key), @@ -3113,7 +3105,7 @@ function cloneAndMarkFunctionalResult (vnode, data, contextVm, options, renderCo var clone = cloneVNode(vnode); clone.fnContext = contextVm; clone.fnOptions = options; - if (process.env.NODE_ENV !== 'production') { + { (clone.devtoolsMeta = clone.devtoolsMeta || {}).renderContext = renderContext; } if (data.slot) { @@ -3231,7 +3223,7 @@ function createComponent ( // if at this stage it's not a constructor or an async component factory, // reject. if (typeof Ctor !== 'function') { - if (process.env.NODE_ENV !== 'production') { + { warn(("Invalid Component definition: " + (String(Ctor))), context); } return @@ -3405,7 +3397,7 @@ function _createElement ( normalizationType ) { if (isDef(data) && isDef((data).__ob__)) { - process.env.NODE_ENV !== 'production' && warn( + warn( "Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" + 'Always create fresh vnode data objects in each render!', context @@ -3421,8 +3413,7 @@ function _createElement ( return createEmptyVNode() } // warn against non-primitive key - if (process.env.NODE_ENV !== 'production' && - isDef(data) && isDef(data.key) && !isPrimitive(data.key) + if (isDef(data) && isDef(data.key) && !isPrimitive(data.key) ) { { warn( @@ -3451,7 +3442,7 @@ function _createElement ( ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag); if (config.isReservedTag(tag)) { // platform built-in elements - if (process.env.NODE_ENV !== 'production' && isDef(data) && isDef(data.nativeOn)) { + if (isDef(data) && isDef(data.nativeOn)) { warn( ("The .native modifier for v-on is only valid on components but it was used on <" + tag + ">."), context @@ -3542,16 +3533,13 @@ function initRender (vm) { var parentData = parentVnode && parentVnode.data; /* istanbul ignore else */ - if (process.env.NODE_ENV !== 'production') { + { defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () { !isUpdatingChildComponent && warn("$attrs is readonly.", vm); }, true); defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, function () { !isUpdatingChildComponent && warn("$listeners is readonly.", vm); }, true); - } else { - defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, null, true); - defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, null, true); } } @@ -3595,7 +3583,7 @@ function renderMixin (Vue) { // return error render result, // or previous vnode to prevent render error causing blank component /* istanbul ignore else */ - if (process.env.NODE_ENV !== 'production' && vm.$options.renderError) { + if (vm.$options.renderError) { try { vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e); } catch (e) { @@ -3614,7 +3602,7 @@ function renderMixin (Vue) { } // return empty vnode in case the render function errored out if (!(vnode instanceof VNode)) { - if (process.env.NODE_ENV !== 'production' && Array.isArray(vnode)) { + if (Array.isArray(vnode)) { warn( 'Multiple root nodes returned from render function. Render function ' + 'should return a single root node.', @@ -3717,7 +3705,7 @@ function resolveAsyncComponent ( }); var reject = once(function (reason) { - process.env.NODE_ENV !== 'production' && warn( + warn( "Failed to resolve async component: " + (String(factory)) + (reason ? ("\nReason: " + reason) : '') ); @@ -3762,9 +3750,7 @@ function resolveAsyncComponent ( timerTimeout = null; if (isUndef(factory.resolved)) { reject( - process.env.NODE_ENV !== 'production' - ? ("timeout (" + (res.timeout) + "ms)") - : null + "timeout (" + (res.timeout) + "ms)" ); } }, res.timeout); @@ -3911,7 +3897,7 @@ function eventsMixin (Vue) { Vue.prototype.$emit = function (event) { var vm = this; - if (process.env.NODE_ENV !== 'production') { + { var lowerCaseEvent = event.toLowerCase(); if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) { tip( @@ -4066,7 +4052,7 @@ function mountComponent ( vm.$el = el; if (!vm.$options.render) { vm.$options.render = createEmptyVNode; - if (process.env.NODE_ENV !== 'production') { + { /* istanbul ignore if */ if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') || vm.$options.el || el) { @@ -4088,7 +4074,7 @@ function mountComponent ( var updateComponent; /* istanbul ignore if */ - if (process.env.NODE_ENV !== 'production' && config.performance && mark) { + if (config.performance && mark) { updateComponent = function () { var name = vm._name; var id = vm._uid; @@ -4146,7 +4132,7 @@ function updateChildComponent ( parentVnode, renderChildren ) { - if (process.env.NODE_ENV !== 'production') { + { isUpdatingChildComponent = true; } @@ -4217,7 +4203,7 @@ function updateChildComponent ( vm.$forceUpdate(); } - if (process.env.NODE_ENV !== 'production') { + { isUpdatingChildComponent = false; } } @@ -4297,7 +4283,7 @@ var index = 0; function resetSchedulerState () { index = queue.length = activatedChildren.length = 0; has = {}; - if (process.env.NODE_ENV !== 'production') { + { circular = {}; } waiting = flushing = false; @@ -4363,7 +4349,7 @@ function flushSchedulerQueue () { has[id] = null; watcher.run(); // in dev build, check and stop circular updates. - if (process.env.NODE_ENV !== 'production' && has[id] != null) { + if (has[id] != null) { circular[id] = (circular[id] || 0) + 1; if (circular[id] > MAX_UPDATE_COUNT) { warn( @@ -4454,7 +4440,7 @@ function queueWatcher (watcher) { if (!waiting) { waiting = true; - if (process.env.NODE_ENV !== 'production' && !config.async) { + if (!config.async) { flushSchedulerQueue(); return } @@ -4504,9 +4490,7 @@ var Watcher = function Watcher ( this.newDeps = []; this.depIds = new _Set(); this.newDepIds = new _Set(); - this.expression = process.env.NODE_ENV !== 'production' - ? expOrFn.toString() - : ''; + this.expression = expOrFn.toString(); // parse expression for getter if (typeof expOrFn === 'function') { this.getter = expOrFn; @@ -4514,7 +4498,7 @@ var Watcher = function Watcher ( this.getter = parsePath(expOrFn); if (!this.getter) { this.getter = noop; - process.env.NODE_ENV !== 'production' && warn( + warn( "Failed watching path: \"" + expOrFn + "\" " + 'Watcher only accepts simple dot-delimited paths. ' + 'For full control, use a function instead.', @@ -4723,7 +4707,7 @@ function initProps (vm, propsOptions) { keys.push(key); var value = validateProp(key, propsOptions, propsData, vm); /* istanbul ignore else */ - if (process.env.NODE_ENV !== 'production') { + { var hyphenatedKey = hyphenate(key); if (isReservedAttribute(hyphenatedKey) || config.isReservedAttr(hyphenatedKey)) { @@ -4743,8 +4727,6 @@ function initProps (vm, propsOptions) { ); } }); - } else { - defineReactive$$1(props, key, value); } // static props are already proxied on the component's prototype // during Vue.extend(). We only need to proxy props defined at @@ -4765,7 +4747,7 @@ function initData (vm) { : data || {}; if (!isPlainObject(data)) { data = {}; - process.env.NODE_ENV !== 'production' && warn( + warn( 'data functions should return an object:\n' + 'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function', vm @@ -4778,7 +4760,7 @@ function initData (vm) { var i = keys.length; while (i--) { var key = keys[i]; - if (process.env.NODE_ENV !== 'production') { + { if (methods && hasOwn(methods, key)) { warn( ("Method \"" + key + "\" has already been defined as a data property."), @@ -4787,7 +4769,7 @@ function initData (vm) { } } if (props && hasOwn(props, key)) { - process.env.NODE_ENV !== 'production' && warn( + warn( "The data property \"" + key + "\" is already declared as a prop. " + "Use prop default value instead.", vm @@ -4824,7 +4806,7 @@ function initComputed (vm, computed) { for (var key in computed) { var userDef = computed[key]; var getter = typeof userDef === 'function' ? userDef : userDef.get; - if (process.env.NODE_ENV !== 'production' && getter == null) { + if (getter == null) { warn( ("Getter is missing for computed property \"" + key + "\"."), vm @@ -4846,7 +4828,7 @@ function initComputed (vm, computed) { // at instantiation here. if (!(key in vm)) { defineComputed(vm, key, userDef); - } else if (process.env.NODE_ENV !== 'production') { + } else { if (key in vm.$data) { warn(("The computed property \"" + key + "\" is already defined in data."), vm); } else if (vm.$options.props && key in vm.$options.props) { @@ -4875,8 +4857,7 @@ function defineComputed ( : noop; sharedPropertyDefinition.set = userDef.set || noop; } - if (process.env.NODE_ENV !== 'production' && - sharedPropertyDefinition.set === noop) { + if (sharedPropertyDefinition.set === noop) { sharedPropertyDefinition.set = function () { warn( ("Computed property \"" + key + "\" was assigned to but it has no setter."), @@ -4911,7 +4892,7 @@ function createGetterInvoker(fn) { function initMethods (vm, methods) { var props = vm.$options.props; for (var key in methods) { - if (process.env.NODE_ENV !== 'production') { + { if (typeof methods[key] !== 'function') { warn( "Method \"" + key + "\" has type \"" + (typeof methods[key]) + "\" in the component definition. " + @@ -4973,7 +4954,7 @@ function stateMixin (Vue) { dataDef.get = function () { return this._data }; var propsDef = {}; propsDef.get = function () { return this._props }; - if (process.env.NODE_ENV !== 'production') { + { dataDef.set = function () { warn( 'Avoid replacing instance root $data. ' + @@ -5028,7 +5009,7 @@ function initMixin (Vue) { var startTag, endTag; /* istanbul ignore if */ - if (process.env.NODE_ENV !== 'production' && config.performance && mark) { + if (config.performance && mark) { startTag = "vue-perf-start:" + (vm._uid); endTag = "vue-perf-end:" + (vm._uid); mark(startTag); @@ -5050,10 +5031,8 @@ function initMixin (Vue) { ); } /* istanbul ignore else */ - if (process.env.NODE_ENV !== 'production') { + { initProxy(vm); - } else { - vm._renderProxy = vm; } // expose real self vm._self = vm; @@ -5067,7 +5046,7 @@ function initMixin (Vue) { callHook(vm, 'created'); /* istanbul ignore if */ - if (process.env.NODE_ENV !== 'production' && config.performance && mark) { + if (config.performance && mark) { vm._name = formatComponentName(vm, false); mark(endTag); measure(("vue " + (vm._name) + " init"), startTag, endTag); @@ -5136,8 +5115,7 @@ function resolveModifiedOptions (Ctor) { } function Vue (options) { - if (process.env.NODE_ENV !== 'production' && - !(this instanceof Vue) + if (!(this instanceof Vue) ) { warn('Vue is a constructor and should be called with the `new` keyword'); } @@ -5205,7 +5183,7 @@ function initExtend (Vue) { } var name = extendOptions.name || Super.options.name; - if (process.env.NODE_ENV !== 'production' && name) { + if (name) { validateComponentName(name); } @@ -5288,7 +5266,7 @@ function initAssetRegisters (Vue) { return this.options[type + 's'][id] } else { /* istanbul ignore if */ - if (process.env.NODE_ENV !== 'production' && type === 'component') { + if (type === 'component') { validateComponentName(id); } if (type === 'component' && isPlainObject(definition)) { @@ -5445,7 +5423,7 @@ function initGlobalAPI (Vue) { // config var configDef = {}; configDef.get = function () { return config; }; - if (process.env.NODE_ENV !== 'production') { + { configDef.set = function () { warn( 'Do not replace the Vue.config object, set individual fields instead.' @@ -5639,8 +5617,10 @@ function insertBefore() { } -function removeChild() { - +function removeChild(node, child) { + if (child && child._$vd) { + child._$vd.removeElement(child); + } } function appendChild() { @@ -5883,7 +5863,7 @@ function createPatchFunction (backend) { var children = vnode.children; var tag = vnode.tag; if (isDef(tag)) { - if (process.env.NODE_ENV !== 'production') { + { if (data && data.pre) { creatingElmInVPre++; } @@ -5911,7 +5891,7 @@ function createPatchFunction (backend) { insert(parentElm, vnode.elm, refElm); } - if (process.env.NODE_ENV !== 'production' && data && data.pre) { + if (data && data.pre) { creatingElmInVPre--; } } else if (isTrue(vnode.isComment)) { @@ -5999,7 +5979,7 @@ function createPatchFunction (backend) { function createChildren (vnode, children, insertedVnodeQueue) { if (Array.isArray(children)) { - if (process.env.NODE_ENV !== 'production') { + { checkDuplicateKeys(children); } for (var i = 0; i < children.length; ++i) { @@ -6090,7 +6070,7 @@ function createPatchFunction (backend) { function removeAndInvokeRemoveHook (vnode, rm) { if (isDef(rm) || isDef(vnode.data)) { - var i; + var i, children; var listeners = cbs.remove.length + 1; if (isDef(rm)) { // we have a recursively passed down rm callback @@ -6103,6 +6083,14 @@ function createPatchFunction (backend) { // recursively invoke hooks on child component root node if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) { removeAndInvokeRemoveHook(i, rm); + } else if (isDef(children = vnode.children)) { + // app-plus service 层 elm 暂未实现父子关系维护,移除父 elm 时,导致子 elm 还存留(影响了事件查找) + // 暂时使用 vnode 的 children 递归 rm 掉子 elm + for (i = 0; i < children.length; i++) { + if (children[i].tag) { + removeAndInvokeRemoveHook(children[i]); + } + } } for (i = 0; i < cbs.remove.length; ++i) { cbs.remove[i](vnode, rm); @@ -6133,7 +6121,7 @@ function createPatchFunction (backend) { // during leaving transitions var canMove = !removeOnly; - if (process.env.NODE_ENV !== 'production') { + { checkDuplicateKeys(newCh); } @@ -6271,7 +6259,7 @@ function createPatchFunction (backend) { if (isDef(oldCh) && isDef(ch)) { if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); } } else if (isDef(ch)) { - if (process.env.NODE_ENV !== 'production') { + { checkDuplicateKeys(ch); } if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); } @@ -6322,7 +6310,7 @@ function createPatchFunction (backend) { return true } // assert node match - if (process.env.NODE_ENV !== 'production') { + { if (!assertNodeMatch(elm, vnode, inVPre)) { return false } @@ -6345,8 +6333,7 @@ function createPatchFunction (backend) { if (isDef(i = data) && isDef(i = i.domProps) && isDef(i = i.innerHTML)) { if (i !== elm.innerHTML) { /* istanbul ignore if */ - if (process.env.NODE_ENV !== 'production' && - typeof console !== 'undefined' && + if (typeof console !== 'undefined' && !hydrationBailed ) { hydrationBailed = true; @@ -6371,8 +6358,7 @@ function createPatchFunction (backend) { // longer than the virtual children list. if (!childrenMatch || childNode) { /* istanbul ignore if */ - if (process.env.NODE_ENV !== 'production' && - typeof console !== 'undefined' && + if (typeof console !== 'undefined' && !hydrationBailed ) { hydrationBailed = true; @@ -6446,7 +6432,7 @@ function createPatchFunction (backend) { if (hydrate(oldVnode, vnode, insertedVnodeQueue)) { invokeInsertHook(vnode, insertedVnodeQueue, true); return oldVnode - } else if (process.env.NODE_ENV !== 'production') { + } else { warn( 'The client-side rendered virtual DOM tree is not matching ' + 'server-rendered content. This is likely caused by incorrect ' + @@ -6785,6 +6771,9 @@ function remove$2 ( capture, _target ) { + if (!handler) { + return + } (_target || target$1).removeEventListener( name, handler._wrapper || handler diff --git a/packages/uni-app-plus/dist/service.runtime.esm.prod.js b/packages/uni-app-plus/dist/service.runtime.esm.prod.js new file mode 100644 index 0000000000000000000000000000000000000000..e81f2f4b0c0527b3daff8aa99878437a602b14e1 --- /dev/null +++ b/packages/uni-app-plus/dist/service.runtime.esm.prod.js @@ -0,0 +1,6109 @@ +export default function vueFactory (exports, SharedObject) { + +/* */ + +var emptyObject = Object.freeze({}); + +// These helpers produce better VM code in JS engines due to their +// explicitness and function inlining. +function isUndef (v) { + return v === undefined || v === null +} + +function isDef (v) { + return v !== undefined && v !== null +} + +function isTrue (v) { + return v === true +} + +function isFalse (v) { + return v === false +} + +/** + * Check if value is primitive. + */ +function isPrimitive (value) { + return ( + typeof value === 'string' || + typeof value === 'number' || + // $flow-disable-line + typeof value === 'symbol' || + typeof value === 'boolean' + ) +} + +/** + * Quick object check - this is primarily used to tell + * Objects from primitive values when we know the value + * is a JSON-compliant type. + */ +function isObject (obj) { + return obj !== null && typeof obj === 'object' +} + +/** + * Get the raw type string of a value, e.g., [object Object]. + */ +var _toString = Object.prototype.toString; + +function toRawType (value) { + return _toString.call(value).slice(8, -1) +} + +/** + * Strict object type check. Only returns true + * for plain JavaScript objects. + */ +function isPlainObject (obj) { + return _toString.call(obj) === '[object Object]' +} + +function isRegExp (v) { + return _toString.call(v) === '[object RegExp]' +} + +/** + * Check if val is a valid array index. + */ +function isValidArrayIndex (val) { + var n = parseFloat(String(val)); + return n >= 0 && Math.floor(n) === n && isFinite(val) +} + +function isPromise (val) { + return ( + isDef(val) && + typeof val.then === 'function' && + typeof val.catch === 'function' + ) +} + +/** + * Convert a value to a string that is actually rendered. + */ +function toString (val) { + return val == null + ? '' + : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString) + ? JSON.stringify(val, null, 2) + : String(val) +} + +/** + * Convert an input value to a number for persistence. + * If the conversion fails, return original string. + */ +function toNumber (val) { + var n = parseFloat(val); + return isNaN(n) ? val : n +} + +/** + * Make a map and return a function for checking if a key + * is in that map. + */ +function makeMap ( + str, + expectsLowerCase +) { + var map = Object.create(null); + var list = str.split(','); + for (var i = 0; i < list.length; i++) { + map[list[i]] = true; + } + return expectsLowerCase + ? function (val) { return map[val.toLowerCase()]; } + : function (val) { return map[val]; } +} + +/** + * Check if a tag is a built-in tag. + */ +var isBuiltInTag = makeMap('slot,component', true); + +/** + * Check if an attribute is a reserved attribute. + */ +var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is'); + +/** + * Remove an item from an array. + */ +function remove (arr, item) { + if (arr.length) { + var index = arr.indexOf(item); + if (index > -1) { + return arr.splice(index, 1) + } + } +} + +/** + * Check whether an object has the property. + */ +var hasOwnProperty = Object.prototype.hasOwnProperty; +function hasOwn (obj, key) { + return hasOwnProperty.call(obj, key) +} + +/** + * Create a cached version of a pure function. + */ +function cached (fn) { + var cache = Object.create(null); + return (function cachedFn (str) { + var hit = cache[str]; + return hit || (cache[str] = fn(str)) + }) +} + +/** + * Camelize a hyphen-delimited string. + */ +var camelizeRE = /-(\w)/g; +var camelize = cached(function (str) { + return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; }) +}); + +/** + * Capitalize a string. + */ +var capitalize = cached(function (str) { + return str.charAt(0).toUpperCase() + str.slice(1) +}); + +/** + * Hyphenate a camelCase string. + */ +var hyphenateRE = /\B([A-Z])/g; +var hyphenate = cached(function (str) { + return str.replace(hyphenateRE, '-$1').toLowerCase() +}); + +/** + * Simple bind polyfill for environments that do not support it, + * e.g., PhantomJS 1.x. Technically, we don't need this anymore + * since native bind is now performant enough in most browsers. + * But removing it would mean breaking code that was able to run in + * PhantomJS 1.x, so this must be kept for backward compatibility. + */ + +/* istanbul ignore next */ +function polyfillBind (fn, ctx) { + function boundFn (a) { + var l = arguments.length; + return l + ? l > 1 + ? fn.apply(ctx, arguments) + : fn.call(ctx, a) + : fn.call(ctx) + } + + boundFn._length = fn.length; + return boundFn +} + +function nativeBind (fn, ctx) { + return fn.bind(ctx) +} + +var bind = Function.prototype.bind + ? nativeBind + : polyfillBind; + +/** + * Convert an Array-like object to a real Array. + */ +function toArray (list, start) { + start = start || 0; + var i = list.length - start; + var ret = new Array(i); + while (i--) { + ret[i] = list[i + start]; + } + return ret +} + +/** + * Mix properties into target object. + */ +function extend (to, _from) { + for (var key in _from) { + to[key] = _from[key]; + } + return to +} + +/** + * Merge an Array of Objects into a single Object. + */ +function toObject (arr) { + var res = {}; + for (var i = 0; i < arr.length; i++) { + if (arr[i]) { + extend(res, arr[i]); + } + } + return res +} + +/* eslint-disable no-unused-vars */ + +/** + * Perform no operation. + * Stubbing args to make Flow happy without leaving useless transpiled code + * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/). + */ +function noop (a, b, c) {} + +/** + * Always return false. + */ +var no = function (a, b, c) { return false; }; + +/* eslint-enable no-unused-vars */ + +/** + * Return the same value. + */ +var identity = function (_) { return _; }; + +/** + * Check if two values are loosely equal - that is, + * if they are plain objects, do they have the same shape? + */ +function looseEqual (a, b) { + if (a === b) { return true } + var isObjectA = isObject(a); + var isObjectB = isObject(b); + if (isObjectA && isObjectB) { + try { + var isArrayA = Array.isArray(a); + var isArrayB = Array.isArray(b); + if (isArrayA && isArrayB) { + return a.length === b.length && a.every(function (e, i) { + return looseEqual(e, b[i]) + }) + } else if (a instanceof Date && b instanceof Date) { + return a.getTime() === b.getTime() + } else if (!isArrayA && !isArrayB) { + var keysA = Object.keys(a); + var keysB = Object.keys(b); + return keysA.length === keysB.length && keysA.every(function (key) { + return looseEqual(a[key], b[key]) + }) + } else { + /* istanbul ignore next */ + return false + } + } catch (e) { + /* istanbul ignore next */ + return false + } + } else if (!isObjectA && !isObjectB) { + return String(a) === String(b) + } else { + return false + } +} + +/** + * Return the first index at which a loosely equal value can be + * found in the array (if value is a plain object, the array must + * contain an object of the same shape), or -1 if it is not present. + */ +function looseIndexOf (arr, val) { + for (var i = 0; i < arr.length; i++) { + if (looseEqual(arr[i], val)) { return i } + } + return -1 +} + +/** + * Ensure a function is called only once. + */ +function once (fn) { + var called = false; + return function () { + if (!called) { + called = true; + fn.apply(this, arguments); + } + } +} + +var SSR_ATTR = 'data-server-rendered'; + +var ASSET_TYPES = [ + 'component', + 'directive', + 'filter' +]; + +var LIFECYCLE_HOOKS = [ + 'beforeCreate', + 'created', + 'beforeMount', + 'mounted', + 'beforeUpdate', + 'updated', + 'beforeDestroy', + 'destroyed', + 'activated', + 'deactivated', + 'errorCaptured', + 'serverPrefetch' +]; + +/* */ + + + +var config = ({ + /** + * Option merge strategies (used in core/util/options) + */ + // $flow-disable-line + optionMergeStrategies: Object.create(null), + + /** + * Whether to suppress warnings. + */ + silent: false, + + /** + * Show production mode tip message on boot? + */ + productionTip: "production" !== 'production', + + /** + * Whether to enable devtools + */ + devtools: "production" !== 'production', + + /** + * Whether to record perf + */ + performance: false, + + /** + * Error handler for watcher errors + */ + errorHandler: null, + + /** + * Warn handler for watcher warns + */ + warnHandler: null, + + /** + * Ignore certain custom elements + */ + ignoredElements: [], + + /** + * Custom user key aliases for v-on + */ + // $flow-disable-line + keyCodes: Object.create(null), + + /** + * Check if a tag is reserved so that it cannot be registered as a + * component. This is platform-dependent and may be overwritten. + */ + isReservedTag: no, + + /** + * Check if an attribute is reserved so that it cannot be used as a component + * prop. This is platform-dependent and may be overwritten. + */ + isReservedAttr: no, + + /** + * Check if a tag is an unknown element. + * Platform-dependent. + */ + isUnknownElement: no, + + /** + * Get the namespace of an element + */ + getTagNamespace: noop, + + /** + * Parse the real tag name for the specific platform. + */ + parsePlatformTagName: identity, + + /** + * Check if an attribute must be bound using property, e.g. value + * Platform-dependent. + */ + mustUseProp: no, + + /** + * Perform updates asynchronously. Intended to be used by Vue Test Utils + * This will significantly reduce performance if set to false. + */ + async: true, + + /** + * Exposed for legacy reasons + */ + _lifecycleHooks: LIFECYCLE_HOOKS +}); + +/* */ + +/** + * unicode letters used for parsing html tags, component names and property paths. + * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname + * skipping \u10000-\uEFFFF due to it freezing up PhantomJS + */ +var unicodeRegExp = /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/; + +/** + * Check if a string starts with $ or _ + */ +function isReserved (str) { + var c = (str + '').charCodeAt(0); + return c === 0x24 || c === 0x5F +} + +/** + * Define a property. + */ +function def (obj, key, val, enumerable) { + Object.defineProperty(obj, key, { + value: val, + enumerable: !!enumerable, + writable: true, + configurable: true + }); +} + +/** + * Parse simple path. + */ +var bailRE = new RegExp(("[^" + (unicodeRegExp.source) + ".$_\\d]")); +function parsePath (path) { + if (bailRE.test(path)) { + return + } + var segments = path.split('.'); + return function (obj) { + for (var i = 0; i < segments.length; i++) { + if (!obj) { return } + obj = obj[segments[i]]; + } + return obj + } +} + +/* */ + +// can we use __proto__? +var hasProto = '__proto__' in {}; + +// Browser environment sniffing +var inBrowser = typeof window !== 'undefined'; +var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform; +var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase(); +var UA = inBrowser && window.navigator.userAgent.toLowerCase(); +var isIE = UA && /msie|trident/.test(UA); +var isIE9 = UA && UA.indexOf('msie 9.0') > 0; +var isEdge = UA && UA.indexOf('edge/') > 0; +var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android'); +var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios'); +var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge; +var isPhantomJS = UA && /phantomjs/.test(UA); +var isFF = UA && UA.match(/firefox\/(\d+)/); + +// Firefox has a "watch" function on Object.prototype... +var nativeWatch = ({}).watch; +if (inBrowser) { + try { + var opts = {}; + Object.defineProperty(opts, 'passive', ({ + get: function get () { + } + })); // https://github.com/facebook/flow/issues/285 + window.addEventListener('test-passive', null, opts); + } catch (e) {} +} + +// this needs to be lazy-evaled because vue may be required before +// vue-server-renderer can set VUE_ENV +var _isServer; +var isServerRendering = function () { + if (_isServer === undefined) { + /* istanbul ignore if */ + if (!inBrowser && !inWeex && typeof global !== 'undefined') { + // detect presence of vue-server-renderer and avoid + // Webpack shimming the process + _isServer = global['process'] && global['process'].env.VUE_ENV === 'server'; + } else { + _isServer = false; + } + } + return _isServer +}; + +// detect devtools +var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; + +/* istanbul ignore next */ +function isNative (Ctor) { + return typeof Ctor === 'function' && /native code/.test(Ctor.toString()) +} + +var hasSymbol = + typeof Symbol !== 'undefined' && isNative(Symbol) && + typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys); + +var _Set; +/* istanbul ignore if */ // $flow-disable-line +if (typeof Set !== 'undefined' && isNative(Set)) { + // use native Set when available. + _Set = Set; +} else { + // a non-standard Set polyfill that only works with primitive keys. + _Set = /*@__PURE__*/(function () { + function Set () { + this.set = Object.create(null); + } + Set.prototype.has = function has (key) { + return this.set[key] === true + }; + Set.prototype.add = function add (key) { + this.set[key] = true; + }; + Set.prototype.clear = function clear () { + this.set = Object.create(null); + }; + + return Set; + }()); +} + +/* */ + +var warn = noop; + +/* */ + +var uid = 0; + +/** + * A dep is an observable that can have multiple + * directives subscribing to it. + */ +var Dep = function Dep () { + // fixed by xxxxxx (nvue vuex) + /* eslint-disable no-undef */ + if(typeof SharedObject !== 'undefined'){ + this.id = SharedObject.uid++; + } else { + this.id = uid++; + } + this.subs = []; +}; + +Dep.prototype.addSub = function addSub (sub) { + this.subs.push(sub); +}; + +Dep.prototype.removeSub = function removeSub (sub) { + remove(this.subs, sub); +}; + +Dep.prototype.depend = function depend () { + if (Dep.SharedObject.target) { // fixed by xxxxxx + Dep.SharedObject.target.addDep(this); + } +}; + +Dep.prototype.notify = function notify () { + // stabilize the subscriber list first + var subs = this.subs.slice(); + for (var i = 0, l = subs.length; i < l; i++) { + subs[i].update(); + } +}; + +// The current target watcher being evaluated. +// This is globally unique because only one watcher +// can be evaluated at a time. +// fixed by xxxxxx (nvue shared vuex) +/* eslint-disable no-undef */ +Dep.SharedObject = typeof SharedObject !== 'undefined' ? SharedObject : {}; +Dep.SharedObject.target = null; +Dep.SharedObject.targetStack = []; + +function pushTarget (target) { + Dep.SharedObject.targetStack.push(target); + Dep.SharedObject.target = target; +} + +function popTarget () { + Dep.SharedObject.targetStack.pop(); + Dep.SharedObject.target = Dep.SharedObject.targetStack[Dep.SharedObject.targetStack.length - 1]; +} + +/* */ + +var VNode = function VNode ( + tag, + data, + children, + text, + elm, + context, + componentOptions, + asyncFactory +) { + this.tag = tag; + this.data = data; + this.children = children; + this.text = text; + this.elm = elm; + this.ns = undefined; + this.context = context; + this.fnContext = undefined; + this.fnOptions = undefined; + this.fnScopeId = undefined; + this.key = data && data.key; + this.componentOptions = componentOptions; + this.componentInstance = undefined; + this.parent = undefined; + this.raw = false; + this.isStatic = false; + this.isRootInsert = true; + this.isComment = false; + this.isCloned = false; + this.isOnce = false; + this.asyncFactory = asyncFactory; + this.asyncMeta = undefined; + this.isAsyncPlaceholder = false; +}; + +var prototypeAccessors = { child: { configurable: true } }; + +// DEPRECATED: alias for componentInstance for backwards compat. +/* istanbul ignore next */ +prototypeAccessors.child.get = function () { + return this.componentInstance +}; + +Object.defineProperties( VNode.prototype, prototypeAccessors ); + +var createEmptyVNode = function (text) { + if ( text === void 0 ) text = ''; + + var node = new VNode(); + node.text = text; + node.isComment = true; + return node +}; + +function createTextVNode (val) { + return new VNode(undefined, undefined, undefined, String(val)) +} + +// optimized shallow clone +// used for static nodes and slot nodes because they may be reused across +// multiple renders, cloning them avoids errors when DOM manipulations rely +// on their elm reference. +function cloneVNode (vnode) { + var cloned = new VNode( + vnode.tag, + vnode.data, + // #7975 + // clone children array to avoid mutating original in case of cloning + // a child. + vnode.children && vnode.children.slice(), + vnode.text, + vnode.elm, + vnode.context, + vnode.componentOptions, + vnode.asyncFactory + ); + cloned.ns = vnode.ns; + cloned.isStatic = vnode.isStatic; + cloned.key = vnode.key; + cloned.isComment = vnode.isComment; + cloned.fnContext = vnode.fnContext; + cloned.fnOptions = vnode.fnOptions; + cloned.fnScopeId = vnode.fnScopeId; + cloned.asyncMeta = vnode.asyncMeta; + cloned.isCloned = true; + return cloned +} + +/* + * not type checking this file because flow doesn't play well with + * dynamically accessing methods on Array prototype + */ + +var arrayProto = Array.prototype; +var arrayMethods = Object.create(arrayProto); + +var methodsToPatch = [ + 'push', + 'pop', + 'shift', + 'unshift', + 'splice', + 'sort', + 'reverse' +]; + +/** + * Intercept mutating methods and emit events + */ +methodsToPatch.forEach(function (method) { + // cache original method + var original = arrayProto[method]; + def(arrayMethods, method, function mutator () { + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + + var result = original.apply(this, args); + var ob = this.__ob__; + var inserted; + switch (method) { + case 'push': + case 'unshift': + inserted = args; + break + case 'splice': + inserted = args.slice(2); + break + } + if (inserted) { ob.observeArray(inserted); } + // notify change + ob.dep.notify(); + return result + }); +}); + +/* */ + +var arrayKeys = Object.getOwnPropertyNames(arrayMethods); + +/** + * In some cases we may want to disable observation inside a component's + * update computation. + */ +var shouldObserve = true; + +function toggleObserving (value) { + shouldObserve = value; +} + +/** + * Observer class that is attached to each observed + * object. Once attached, the observer converts the target + * object's property keys into getter/setters that + * collect dependencies and dispatch updates. + */ +var Observer = function Observer (value) { + this.value = value; + this.dep = new Dep(); + this.vmCount = 0; + def(value, '__ob__', this); + if (Array.isArray(value)) { + if (hasProto) { + protoAugment(value, arrayMethods); + } else { + copyAugment(value, arrayMethods, arrayKeys); + } + this.observeArray(value); + } else { + this.walk(value); + } +}; + +/** + * Walk through all properties and convert them into + * getter/setters. This method should only be called when + * value type is Object. + */ +Observer.prototype.walk = function walk (obj) { + var keys = Object.keys(obj); + for (var i = 0; i < keys.length; i++) { + defineReactive$$1(obj, keys[i]); + } +}; + +/** + * Observe a list of Array items. + */ +Observer.prototype.observeArray = function observeArray (items) { + for (var i = 0, l = items.length; i < l; i++) { + observe(items[i]); + } +}; + +// helpers + +/** + * Augment a target Object or Array by intercepting + * the prototype chain using __proto__ + */ +function protoAugment (target, src) { + /* eslint-disable no-proto */ + target.__proto__ = src; + /* eslint-enable no-proto */ +} + +/** + * Augment a target Object or Array by defining + * hidden properties. + */ +/* istanbul ignore next */ +function copyAugment (target, src, keys) { + for (var i = 0, l = keys.length; i < l; i++) { + var key = keys[i]; + def(target, key, src[key]); + } +} + +/** + * Attempt to create an observer instance for a value, + * returns the new observer if successfully observed, + * or the existing observer if the value already has one. + */ +function observe (value, asRootData) { + if (!isObject(value) || value instanceof VNode) { + return + } + var ob; + if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) { + ob = value.__ob__; + } else if ( + shouldObserve && + !isServerRendering() && + (Array.isArray(value) || isPlainObject(value)) && + Object.isExtensible(value) && + !value._isVue + ) { + ob = new Observer(value); + } + if (asRootData && ob) { + ob.vmCount++; + } + return ob +} + +/** + * Define a reactive property on an Object. + */ +function defineReactive$$1 ( + obj, + key, + val, + customSetter, + shallow +) { + var dep = new Dep(); + + var property = Object.getOwnPropertyDescriptor(obj, key); + if (property && property.configurable === false) { + return + } + + // cater for pre-defined getter/setters + var getter = property && property.get; + var setter = property && property.set; + if ((!getter || setter) && arguments.length === 2) { + val = obj[key]; + } + + var childOb = !shallow && observe(val); + Object.defineProperty(obj, key, { + enumerable: true, + configurable: true, + get: function reactiveGetter () { + var value = getter ? getter.call(obj) : val; + if (Dep.SharedObject.target) { // fixed by xxxxxx + dep.depend(); + if (childOb) { + childOb.dep.depend(); + if (Array.isArray(value)) { + dependArray(value); + } + } + } + return value + }, + set: function reactiveSetter (newVal) { + var value = getter ? getter.call(obj) : val; + /* eslint-disable no-self-compare */ + if (newVal === value || (newVal !== newVal && value !== value)) { + return + } + // #7981: for accessor properties without setter + if (getter && !setter) { return } + if (setter) { + setter.call(obj, newVal); + } else { + val = newVal; + } + childOb = !shallow && observe(newVal); + dep.notify(); + } + }); +} + +/** + * Set a property on an object. Adds the new property and + * triggers change notification if the property doesn't + * already exist. + */ +function set (target, key, val) { + if (Array.isArray(target) && isValidArrayIndex(key)) { + target.length = Math.max(target.length, key); + target.splice(key, 1, val); + return val + } + if (key in target && !(key in Object.prototype)) { + target[key] = val; + return val + } + var ob = (target).__ob__; + if (target._isVue || (ob && ob.vmCount)) { + return val + } + if (!ob) { + target[key] = val; + return val + } + defineReactive$$1(ob.value, key, val); + ob.dep.notify(); + return val +} + +/** + * Delete a property and trigger change if necessary. + */ +function del (target, key) { + if (Array.isArray(target) && isValidArrayIndex(key)) { + target.splice(key, 1); + return + } + var ob = (target).__ob__; + if (target._isVue || (ob && ob.vmCount)) { + return + } + if (!hasOwn(target, key)) { + return + } + delete target[key]; + if (!ob) { + return + } + ob.dep.notify(); +} + +/** + * Collect dependencies on array elements when the array is touched, since + * we cannot intercept array element access like property getters. + */ +function dependArray (value) { + for (var e = (void 0), i = 0, l = value.length; i < l; i++) { + e = value[i]; + e && e.__ob__ && e.__ob__.dep.depend(); + if (Array.isArray(e)) { + dependArray(e); + } + } +} + +/* */ + +/** + * Option overwriting strategies are functions that handle + * how to merge a parent option value and a child option + * value into the final value. + */ +var strats = config.optionMergeStrategies; + +/** + * Helper that recursively merges two data objects together. + */ +function mergeData (to, from) { + if (!from) { return to } + var key, toVal, fromVal; + + var keys = hasSymbol + ? Reflect.ownKeys(from) + : Object.keys(from); + + for (var i = 0; i < keys.length; i++) { + key = keys[i]; + // in case the object is already observed... + if (key === '__ob__') { continue } + toVal = to[key]; + fromVal = from[key]; + if (!hasOwn(to, key)) { + set(to, key, fromVal); + } else if ( + toVal !== fromVal && + isPlainObject(toVal) && + isPlainObject(fromVal) + ) { + mergeData(toVal, fromVal); + } + } + return to +} + +/** + * Data + */ +function mergeDataOrFn ( + parentVal, + childVal, + vm +) { + if (!vm) { + // in a Vue.extend merge, both should be functions + if (!childVal) { + return parentVal + } + if (!parentVal) { + return childVal + } + // when parentVal & childVal are both present, + // we need to return a function that returns the + // merged result of both functions... no need to + // check if parentVal is a function here because + // it has to be a function to pass previous merges. + return function mergedDataFn () { + return mergeData( + typeof childVal === 'function' ? childVal.call(this, this) : childVal, + typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal + ) + } + } else { + return function mergedInstanceDataFn () { + // instance merge + var instanceData = typeof childVal === 'function' + ? childVal.call(vm, vm) + : childVal; + var defaultData = typeof parentVal === 'function' + ? parentVal.call(vm, vm) + : parentVal; + if (instanceData) { + return mergeData(instanceData, defaultData) + } else { + return defaultData + } + } + } +} + +strats.data = function ( + parentVal, + childVal, + vm +) { + if (!vm) { + if (childVal && typeof childVal !== 'function') { + + return parentVal + } + return mergeDataOrFn(parentVal, childVal) + } + + return mergeDataOrFn(parentVal, childVal, vm) +}; + +/** + * Hooks and props are merged as arrays. + */ +function mergeHook ( + parentVal, + childVal +) { + var res = childVal + ? parentVal + ? parentVal.concat(childVal) + : Array.isArray(childVal) + ? childVal + : [childVal] + : parentVal; + return res + ? dedupeHooks(res) + : res +} + +function dedupeHooks (hooks) { + var res = []; + for (var i = 0; i < hooks.length; i++) { + if (res.indexOf(hooks[i]) === -1) { + res.push(hooks[i]); + } + } + return res +} + +LIFECYCLE_HOOKS.forEach(function (hook) { + strats[hook] = mergeHook; +}); + +/** + * Assets + * + * When a vm is present (instance creation), we need to do + * a three-way merge between constructor options, instance + * options and parent options. + */ +function mergeAssets ( + parentVal, + childVal, + vm, + key +) { + var res = Object.create(parentVal || null); + if (childVal) { + return extend(res, childVal) + } else { + return res + } +} + +ASSET_TYPES.forEach(function (type) { + strats[type + 's'] = mergeAssets; +}); + +/** + * Watchers. + * + * Watchers hashes should not overwrite one + * another, so we merge them as arrays. + */ +strats.watch = function ( + parentVal, + childVal, + vm, + key +) { + // work around Firefox's Object.prototype.watch... + if (parentVal === nativeWatch) { parentVal = undefined; } + if (childVal === nativeWatch) { childVal = undefined; } + /* istanbul ignore if */ + if (!childVal) { return Object.create(parentVal || null) } + if (!parentVal) { return childVal } + var ret = {}; + extend(ret, parentVal); + for (var key$1 in childVal) { + var parent = ret[key$1]; + var child = childVal[key$1]; + if (parent && !Array.isArray(parent)) { + parent = [parent]; + } + ret[key$1] = parent + ? parent.concat(child) + : Array.isArray(child) ? child : [child]; + } + return ret +}; + +/** + * Other object hashes. + */ +strats.props = +strats.methods = +strats.inject = +strats.computed = function ( + parentVal, + childVal, + vm, + key +) { + if (childVal && "production" !== 'production') { + assertObjectType(key, childVal, vm); + } + if (!parentVal) { return childVal } + var ret = Object.create(null); + extend(ret, parentVal); + if (childVal) { extend(ret, childVal); } + return ret +}; +strats.provide = mergeDataOrFn; + +/** + * Default strategy. + */ +var defaultStrat = function (parentVal, childVal) { + return childVal === undefined + ? parentVal + : childVal +}; + +/** + * Ensure all props option syntax are normalized into the + * Object-based format. + */ +function normalizeProps (options, vm) { + var props = options.props; + if (!props) { return } + var res = {}; + var i, val, name; + if (Array.isArray(props)) { + i = props.length; + while (i--) { + val = props[i]; + if (typeof val === 'string') { + name = camelize(val); + res[name] = { type: null }; + } + } + } else if (isPlainObject(props)) { + for (var key in props) { + val = props[key]; + name = camelize(key); + res[name] = isPlainObject(val) + ? val + : { type: val }; + } + } + options.props = res; +} + +/** + * Normalize all injections into Object-based format + */ +function normalizeInject (options, vm) { + var inject = options.inject; + if (!inject) { return } + var normalized = options.inject = {}; + if (Array.isArray(inject)) { + for (var i = 0; i < inject.length; i++) { + normalized[inject[i]] = { from: inject[i] }; + } + } else if (isPlainObject(inject)) { + for (var key in inject) { + var val = inject[key]; + normalized[key] = isPlainObject(val) + ? extend({ from: key }, val) + : { from: val }; + } + } +} + +/** + * Normalize raw function directives into object format. + */ +function normalizeDirectives (options) { + var dirs = options.directives; + if (dirs) { + for (var key in dirs) { + var def$$1 = dirs[key]; + if (typeof def$$1 === 'function') { + dirs[key] = { bind: def$$1, update: def$$1 }; + } + } + } +} + +function assertObjectType (name, value, vm) { + if (!isPlainObject(value)) { + warn( + "Invalid value for option \"" + name + "\": expected an Object, " + + "but got " + (toRawType(value)) + ".", + vm + ); + } +} + +/** + * Merge two option objects into a new one. + * Core utility used in both instantiation and inheritance. + */ +function mergeOptions ( + parent, + child, + vm +) { + + if (typeof child === 'function') { + child = child.options; + } + + normalizeProps(child, vm); + normalizeInject(child, vm); + normalizeDirectives(child); + + // Apply extends and mixins on the child options, + // but only if it is a raw options object that isn't + // the result of another mergeOptions call. + // Only merged options has the _base property. + if (!child._base) { + if (child.extends) { + parent = mergeOptions(parent, child.extends, vm); + } + if (child.mixins) { + for (var i = 0, l = child.mixins.length; i < l; i++) { + parent = mergeOptions(parent, child.mixins[i], vm); + } + } + } + + var options = {}; + var key; + for (key in parent) { + mergeField(key); + } + for (key in child) { + if (!hasOwn(parent, key)) { + mergeField(key); + } + } + function mergeField (key) { + var strat = strats[key] || defaultStrat; + options[key] = strat(parent[key], child[key], vm, key); + } + return options +} + +/** + * Resolve an asset. + * This function is used because child instances need access + * to assets defined in its ancestor chain. + */ +function resolveAsset ( + options, + type, + id, + warnMissing +) { + /* istanbul ignore if */ + if (typeof id !== 'string') { + return + } + var assets = options[type]; + // check local registration variations first + if (hasOwn(assets, id)) { return assets[id] } + var camelizedId = camelize(id); + if (hasOwn(assets, camelizedId)) { return assets[camelizedId] } + var PascalCaseId = capitalize(camelizedId); + if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] } + // fallback to prototype chain + var res = assets[id] || assets[camelizedId] || assets[PascalCaseId]; + return res +} + +/* */ + + + +function validateProp ( + key, + propOptions, + propsData, + vm +) { + var prop = propOptions[key]; + var absent = !hasOwn(propsData, key); + var value = propsData[key]; + // boolean casting + var booleanIndex = getTypeIndex(Boolean, prop.type); + if (booleanIndex > -1) { + if (absent && !hasOwn(prop, 'default')) { + value = false; + } else if (value === '' || value === hyphenate(key)) { + // only cast empty string / same name to boolean if + // boolean has higher priority + var stringIndex = getTypeIndex(String, prop.type); + if (stringIndex < 0 || booleanIndex < stringIndex) { + value = true; + } + } + } + // check default value + if (value === undefined) { + value = getPropDefaultValue(vm, prop, key); + // since the default value is a fresh copy, + // make sure to observe it. + var prevShouldObserve = shouldObserve; + toggleObserving(true); + observe(value); + toggleObserving(prevShouldObserve); + } + return value +} + +/** + * Get the default value of a prop. + */ +function getPropDefaultValue (vm, prop, key) { + // no default, return undefined + if (!hasOwn(prop, 'default')) { + return undefined + } + var def = prop.default; + // the raw prop value was also undefined from previous render, + // return previous default value to avoid unnecessary watcher trigger + if (vm && vm.$options.propsData && + vm.$options.propsData[key] === undefined && + vm._props[key] !== undefined + ) { + return vm._props[key] + } + // call factory function for non-Function types + // a value is Function if its prototype is function even across different execution context + return typeof def === 'function' && getType(prop.type) !== 'Function' + ? def.call(vm) + : def +} + +/** + * Use function string name to check built-in types, + * because a simple equality check will fail when running + * across different vms / iframes. + */ +function getType (fn) { + var match = fn && fn.toString().match(/^\s*function (\w+)/); + return match ? match[1] : '' +} + +function isSameType (a, b) { + return getType(a) === getType(b) +} + +function getTypeIndex (type, expectedTypes) { + if (!Array.isArray(expectedTypes)) { + return isSameType(expectedTypes, type) ? 0 : -1 + } + for (var i = 0, len = expectedTypes.length; i < len; i++) { + if (isSameType(expectedTypes[i], type)) { + return i + } + } + return -1 +} + +/* */ + +function handleError (err, vm, info) { + // Deactivate deps tracking while processing error handler to avoid possible infinite rendering. + // See: https://github.com/vuejs/vuex/issues/1505 + pushTarget(); + try { + if (vm) { + var cur = vm; + while ((cur = cur.$parent)) { + var hooks = cur.$options.errorCaptured; + if (hooks) { + for (var i = 0; i < hooks.length; i++) { + try { + var capture = hooks[i].call(cur, err, vm, info) === false; + if (capture) { return } + } catch (e) { + globalHandleError(e, cur, 'errorCaptured hook'); + } + } + } + } + } + globalHandleError(err, vm, info); + } finally { + popTarget(); + } +} + +function invokeWithErrorHandling ( + handler, + context, + args, + vm, + info +) { + var res; + try { + res = args ? handler.apply(context, args) : handler.call(context); + if (res && !res._isVue && isPromise(res) && !res._handled) { + res.catch(function (e) { return handleError(e, vm, info + " (Promise/async)"); }); + // issue #9511 + // avoid catch triggering multiple times when nested calls + res._handled = true; + } + } catch (e) { + handleError(e, vm, info); + } + return res +} + +function globalHandleError (err, vm, info) { + if (config.errorHandler) { + try { + return config.errorHandler.call(null, err, vm, info) + } catch (e) { + // if the user intentionally throws the original error in the handler, + // do not log it twice + if (e !== err) { + logError(e, null, 'config.errorHandler'); + } + } + } + logError(err, vm, info); +} + +function logError (err, vm, info) { + /* istanbul ignore else */ + if ((inBrowser || inWeex) && typeof console !== 'undefined') { + console.error(err); + } else { + throw err + } +} + +/* */ + +var callbacks = []; +var pending = false; + +function flushCallbacks () { + pending = false; + var copies = callbacks.slice(0); + callbacks.length = 0; + for (var i = 0; i < copies.length; i++) { + copies[i](); + } +} + +// Here we have async deferring wrappers using microtasks. +// In 2.5 we used (macro) tasks (in combination with microtasks). +// However, it has subtle problems when state is changed right before repaint +// (e.g. #6813, out-in transitions). +// Also, using (macro) tasks in event handler would cause some weird behaviors +// that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109). +// So we now use microtasks everywhere, again. +// A major drawback of this tradeoff is that there are some scenarios +// where microtasks have too high a priority and fire in between supposedly +// sequential events (e.g. #4521, #6690, which have workarounds) +// or even between bubbling of the same event (#6566). +// fixed by xxxxxx app-plus 平台 Promise 执行顺序不一致,导致各种乱七八糟的 Bug,统一使用 setTimeout +var timerFunc = function () { + setTimeout(flushCallbacks, 0); +}; + +// The nextTick behavior leverages the microtask queue, which can be accessed +// via either native Promise.then or MutationObserver. +// MutationObserver has wider support, however it is seriously bugged in +// UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It +// completely stops working after triggering a few times... so, if native +// Promise is available, we will use it: +/* istanbul ignore next, $flow-disable-line */ +// if (typeof Promise !== 'undefined' && isNative(Promise)) { +// const p = Promise.resolve() +// timerFunc = () => { +// p.then(flushCallbacks) +// // In problematic UIWebViews, Promise.then doesn't completely break, but +// // it can get stuck in a weird state where callbacks are pushed into the +// // microtask queue but the queue isn't being flushed, until the browser +// // needs to do some other work, e.g. handle a timer. Therefore we can +// // "force" the microtask queue to be flushed by adding an empty timer. +// if (isIOS) setTimeout(noop) +// } +// isUsingMicroTask = true +// } else if (!isIE && typeof MutationObserver !== 'undefined' && ( +// isNative(MutationObserver) || +// // PhantomJS and iOS 7.x +// MutationObserver.toString() === '[object MutationObserverConstructor]' +// )) { +// // Use MutationObserver where native Promise is not available, +// // e.g. PhantomJS, iOS7, Android 4.4 +// // (#6466 MutationObserver is unreliable in IE11) +// let counter = 1 +// const observer = new MutationObserver(flushCallbacks) +// const textNode = document.createTextNode(String(counter)) +// observer.observe(textNode, { +// characterData: true +// }) +// timerFunc = () => { +// counter = (counter + 1) % 2 +// textNode.data = String(counter) +// } +// isUsingMicroTask = true +// } else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) { +// // Fallback to setImmediate. +// // Technically it leverages the (macro) task queue, +// // but it is still a better choice than setTimeout. +// timerFunc = () => { +// setImmediate(flushCallbacks) +// } +// } else { +// // Fallback to setTimeout. +// timerFunc = () => { +// setTimeout(flushCallbacks, 0) +// } +// } + +function nextTick (cb, ctx) { + var _resolve; + callbacks.push(function () { + if (cb) { + try { + cb.call(ctx); + } catch (e) { + handleError(e, ctx, 'nextTick'); + } + } else if (_resolve) { + _resolve(ctx); + } + }); + if (!pending) { + pending = true; + timerFunc(); + } + // $flow-disable-line + if (!cb && typeof Promise !== 'undefined') { + return new Promise(function (resolve) { + _resolve = resolve; + }) + } +} + +/* */ + +/* not type checking this file because flow doesn't play well with Proxy */ + +/* */ + +var seenObjects = new _Set(); + +/** + * Recursively traverse an object to evoke all converted + * getters, so that every nested property inside the object + * is collected as a "deep" dependency. + */ +function traverse (val) { + _traverse(val, seenObjects); + seenObjects.clear(); +} + +function _traverse (val, seen) { + var i, keys; + var isA = Array.isArray(val); + if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) { + return + } + if (val.__ob__) { + var depId = val.__ob__.dep.id; + if (seen.has(depId)) { + return + } + seen.add(depId); + } + if (isA) { + i = val.length; + while (i--) { _traverse(val[i], seen); } + } else { + keys = Object.keys(val); + i = keys.length; + while (i--) { _traverse(val[keys[i]], seen); } + } +} + +/* */ + +var normalizeEvent = cached(function (name) { + var passive = name.charAt(0) === '&'; + name = passive ? name.slice(1) : name; + var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first + name = once$$1 ? name.slice(1) : name; + var capture = name.charAt(0) === '!'; + name = capture ? name.slice(1) : name; + return { + name: name, + once: once$$1, + capture: capture, + passive: passive + } +}); + +function createFnInvoker (fns, vm) { + function invoker () { + var arguments$1 = arguments; + + var fns = invoker.fns; + if (Array.isArray(fns)) { + var cloned = fns.slice(); + for (var i = 0; i < cloned.length; i++) { + invokeWithErrorHandling(cloned[i], null, arguments$1, vm, "v-on handler"); + } + } else { + // return handler return value for single handlers + return invokeWithErrorHandling(fns, null, arguments, vm, "v-on handler") + } + } + invoker.fns = fns; + return invoker +} + +function updateListeners ( + on, + oldOn, + add, + remove$$1, + createOnceHandler, + vm +) { + var name, def$$1, cur, old, event; + for (name in on) { + def$$1 = cur = on[name]; + old = oldOn[name]; + event = normalizeEvent(name); + if (isUndef(cur)) ; else if (isUndef(old)) { + if (isUndef(cur.fns)) { + cur = on[name] = createFnInvoker(cur, vm); + } + if (isTrue(event.once)) { + cur = on[name] = createOnceHandler(event.name, cur, event.capture); + } + add(event.name, cur, event.capture, event.passive, event.params); + } else if (cur !== old) { + old.fns = cur; + on[name] = old; + } + } + for (name in oldOn) { + if (isUndef(on[name])) { + event = normalizeEvent(name); + remove$$1(event.name, oldOn[name], event.capture); + } + } +} + +/* */ + +function mergeVNodeHook (def, hookKey, hook) { + if (def instanceof VNode) { + def = def.data.hook || (def.data.hook = {}); + } + var invoker; + var oldHook = def[hookKey]; + + function wrappedHook () { + hook.apply(this, arguments); + // important: remove merged hook to ensure it's called only once + // and prevent memory leak + remove(invoker.fns, wrappedHook); + } + + if (isUndef(oldHook)) { + // no existing hook + invoker = createFnInvoker([wrappedHook]); + } else { + /* istanbul ignore if */ + if (isDef(oldHook.fns) && isTrue(oldHook.merged)) { + // already a merged invoker + invoker = oldHook; + invoker.fns.push(wrappedHook); + } else { + // existing plain hook + invoker = createFnInvoker([oldHook, wrappedHook]); + } + } + + invoker.merged = true; + def[hookKey] = invoker; +} + +/* */ + +// fixed by xxxxxx (mp properties) +function extractPropertiesFromVNodeData(data, Ctor, res, context) { + var propOptions = Ctor.options.mpOptions && Ctor.options.mpOptions.properties; + if (isUndef(propOptions)) { + return res + } + var externalClasses = Ctor.options.mpOptions.externalClasses || []; + var attrs = data.attrs; + var props = data.props; + if (isDef(attrs) || isDef(props)) { + for (var key in propOptions) { + var altKey = hyphenate(key); + var result = checkProp(res, props, key, altKey, true) || + checkProp(res, attrs, key, altKey, false); + // externalClass + if ( + result && + res[key] && + externalClasses.indexOf(altKey) !== -1 && + context[camelize(res[key])] + ) { + // 赋值 externalClass 真正的值(模板里 externalClass 的值可能是字符串) + res[key] = context[camelize(res[key])]; + } + } + } + return res +} + +function extractPropsFromVNodeData ( + data, + Ctor, + tag, + context// fixed by xxxxxx +) { + // we are only extracting raw values here. + // validation and default values are handled in the child + // component itself. + var propOptions = Ctor.options.props; + if (isUndef(propOptions)) { + // fixed by xxxxxx + return extractPropertiesFromVNodeData(data, Ctor, {}, context) + } + var res = {}; + var attrs = data.attrs; + var props = data.props; + if (isDef(attrs) || isDef(props)) { + for (var key in propOptions) { + var altKey = hyphenate(key); + checkProp(res, props, key, altKey, true) || + checkProp(res, attrs, key, altKey, false); + } + } + // fixed by xxxxxx + return extractPropertiesFromVNodeData(data, Ctor, res, context) +} + +function checkProp ( + res, + hash, + key, + altKey, + preserve +) { + if (isDef(hash)) { + if (hasOwn(hash, key)) { + res[key] = hash[key]; + if (!preserve) { + delete hash[key]; + } + return true + } else if (hasOwn(hash, altKey)) { + res[key] = hash[altKey]; + if (!preserve) { + delete hash[altKey]; + } + return true + } + } + return false +} + +/* */ + +// The template compiler attempts to minimize the need for normalization by +// statically analyzing the template at compile time. +// +// For plain HTML markup, normalization can be completely skipped because the +// generated render function is guaranteed to return Array. There are +// two cases where extra normalization is needed: + +// 1. When the children contains components - because a functional component +// may return an Array instead of a single root. In this case, just a simple +// normalization is needed - if any child is an Array, we flatten the whole +// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep +// because functional components already normalize their own children. +function simpleNormalizeChildren (children) { + for (var i = 0; i < children.length; i++) { + if (Array.isArray(children[i])) { + return Array.prototype.concat.apply([], children) + } + } + return children +} + +// 2. When the children contains constructs that always generated nested Arrays, +// e.g.