Showing preview only (610K chars total). Download the full file or copy to clipboard to get everything.
Repository: whinc/web-console
Branch: master
Commit: 207247e3144c
Files: 97
Total size: 557.2 KB
Directory structure:
gitextract_hjfdfrq1/
├── .babelrc
├── .eslintrc
├── .gitignore
├── .npmignore
├── .npmrc
├── .postcssrc
├── CHANGELOG.md
├── cypress.json
├── docs/
│ ├── depoly.md
│ ├── plugin.md
│ └── snapshot.md
├── gulpfile.js
├── jest.config.js
├── package.json
├── public/
│ ├── index.html
│ ├── index_cdn.html
│ ├── style_import1.css
│ ├── style_import2.css
│ ├── style_link.css
│ ├── test_application.js
│ ├── test_console.js
│ ├── test_network.js
│ ├── test_plugin.js
│ └── vue.js
├── readme.md
├── src/
│ ├── App.vue
│ ├── components/
│ │ ├── VFootBar.vue
│ │ ├── VHighlightView.vue
│ │ ├── VIcon.vue
│ │ ├── VJSONViewer/
│ │ │ ├── JSONTextBlock.vue
│ │ │ ├── JSONTextInlineBlock.vue
│ │ │ ├── VJSONViewer.vue
│ │ │ └── index.js
│ │ ├── VTabBar.vue
│ │ ├── VTabBarItem.vue
│ │ └── index.js
│ ├── constants/
│ │ ├── PanelType.js
│ │ └── index.js
│ ├── main.js
│ ├── panels/
│ │ ├── application/
│ │ │ ├── ApplicationPanel.vue
│ │ │ ├── TabStorage.vue
│ │ │ └── XStorage.js
│ │ ├── console/
│ │ │ ├── ConsolePanel.vue
│ │ │ ├── Message.vue
│ │ │ ├── TextBlock.vue
│ │ │ └── TextInlineBlock.vue
│ │ ├── element/
│ │ │ ├── BoxModel.vue
│ │ │ ├── ElementPanel.vue
│ │ │ ├── NodeLink.vue
│ │ │ ├── NodeView.vue
│ │ │ ├── StyleColorValue.vue
│ │ │ ├── StyleProperty.vue
│ │ │ ├── StyleRule.vue
│ │ │ ├── TabComputed.vue
│ │ │ ├── TabStyles.vue
│ │ │ └── Tag.vue
│ │ ├── index.js
│ │ ├── network/
│ │ │ ├── HttpStatus.js
│ │ │ ├── NetworkPanel.vue
│ │ │ ├── NetworkRequest.vue
│ │ │ ├── RequestType.js
│ │ │ ├── TabHeaders.vue
│ │ │ ├── TabPreview.vue
│ │ │ └── TabResponse.vue
│ │ └── settings/
│ │ └── SettingsPanel.vue
│ ├── plugins/
│ │ ├── Plugin.js
│ │ ├── index.js
│ │ ├── pluginEvents.js
│ │ └── pluginManager.js
│ ├── polyfill.js
│ ├── styles/
│ │ ├── _global.scss
│ │ ├── _mixins.scss
│ │ ├── _triangles.scss
│ │ └── _variables.scss
│ └── utils/
│ ├── EventBus.js
│ ├── Logger.js
│ ├── TaskScheduler.js
│ ├── consoleHooks.js
│ ├── filters.js
│ ├── index.js
│ ├── miscs.js
│ └── style.js
├── tests/
│ ├── api/
│ │ ├── data/
│ │ │ ├── response.css
│ │ │ ├── response.html
│ │ │ ├── response.js
│ │ │ ├── response.json
│ │ │ └── response.txt
│ │ └── index.js
│ ├── e2e/
│ │ ├── .eslintrc
│ │ ├── plugins/
│ │ │ └── index.js
│ │ ├── specs/
│ │ │ └── test.js
│ │ └── support/
│ │ ├── commands.js
│ │ └── index.js
│ └── unit/
│ ├── .eslintrc
│ └── HelloWorld.spec.js
├── tsconfig.json
└── vue.config.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .babelrc
================================================
{
"presets": [
"@vue/app"
],
"plugins": [
[
"component",
{
"libraryName": "mint-ui",
"style": true
}
]
]
}
================================================
FILE: .eslintrc
================================================
{
"root": true,
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"env": {
"browser": true,
"node": true
},
"globals": {
},
"rules": {
"no-console": "off",
"no-case-declarations": "off"
}
}
================================================
FILE: .gitignore
================================================
.DS_Store
node_modules
/dist
/demo
/tests/e2e/videos/
/tests/e2e/screenshots/
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
================================================
FILE: .npmignore
================================================
*
*/
!dist/*.js
!package*.json
================================================
FILE: .npmrc
================================================
git-tag-version=false
================================================
FILE: .postcssrc
================================================
{
"plugins": {
"autoprefixer": {}
}
}
================================================
FILE: CHANGELOG.md
================================================
## [0.7.2](https://github.com/whinc/web-console/compare/v0.7.1...v0.7.2) (2019-04-23)
### Bug Fixes
- **console:** 修复打印多个参数时,它们之间没有空白符分割的问题 ([2292733](https://github.com/whinc/web-console/commit/2292733))
## [0.7.1](https://github.com/whinc/web-console/compare/v0.7.0...v0.7.1) (2019-04-23)
### Bug Fixes
- 修复 activeTab 失效问题 ([c785e38](https://github.com/whinc/web-console/commit/c785e38))
# [0.7.0](https://github.com/whinc/web-console/compare/v0.6.2...v0.7.0) (2019-04-23)
### Bug Fixes
- **plugin:** 修复 onWebConsoleShow 触发两次的问题;修复插件面板高度被改变的 bug ([bd88ddd](https://github.com/whinc/web-console/commit/bd88ddd))
- **plugin:** 修复插件生命周期未触发问题和插件重复问题 ([7c89fd6](https://github.com/whinc/web-console/commit/7c89fd6))
- 修复 lint 告警 ([82aedb5](https://github.com/whinc/web-console/commit/82aedb5))
### Features
- **plugin:** 初步支持插件的注册,展示,部分生命周期方法 ([513b530](https://github.com/whinc/web-console/commit/513b530))
- **plugin:** 增加插件获取当前设置的方法;增加插件首次加载设置的周期方法 ([0f5d129](https://github.com/whinc/web-console/commit/0f5d129))
- **plugin:** 增强插件支持 ([342a499](https://github.com/whinc/web-console/commit/342a499))
- **plugin:** 新增几种内置组件暴露给插件使用 ([a17c840](https://github.com/whinc/web-console/commit/a17c840))
- 更新在线 demo ([3275f42](https://github.com/whinc/web-console/commit/3275f42))
## [0.6.2](https://github.com/whinc/web-console/compare/v0.6.1...v0.6.2) (2019-03-26)
### Bug Fixes
- **network:** 修复部分情况下请求参数未展示的 bug ([edeff31](https://github.com/whinc/web-console/commit/edeff31))
## [0.6.1](https://github.com/whinc/web-console/compare/v0.6.0...v0.6.1) (2019-03-24)
### Bug Fixes
- **network:** 修复样式 ([f815474](https://github.com/whinc/web-console/commit/f815474))
# [0.6.0](https://github.com/whinc/web-console/compare/v0.5.0...v0.6.0) (2019-03-24)
### Bug Fixes
- **network:** 修复 fetch 请求参数为 Request 时的异常 ([e4739b6](https://github.com/whinc/web-console/commit/e4739b6))
- **network:** 修复请求状态展示错误 ([74f53b6](https://github.com/whinc/web-console/commit/74f53b6))
### Features
- **network:** 初步支持 fetch 请求 ([5e64f03](https://github.com/whinc/web-console/commit/5e64f03))
- **settings:** 支持设置"显示/隐藏"网络请求类型 ([b70cad5](https://github.com/whinc/web-console/commit/b70cad5))
# [0.5.0](https://github.com/whinc/web-console/compare/v0.4.7...v0.5.0) (2019-03-16)
### Bug Fixes
- 修复 lint 警告 ([e21046e](https://github.com/whinc/web-console/commit/e21046e))
### Features
- **console:** 增加搜索日志 ([8c90bac](https://github.com/whinc/web-console/commit/8c90bac))
## [0.4.7](https://github.com/whinc/web-console/compare/v0.4.6...v0.4.7) (2019-03-07)
### Bug Fixes
- 修复 vue-infinite-scroll 插件与宿主环境冲突,导致宿主引入该插件后无效的问题 ([8a89a15](https://github.com/whinc/web-console/commit/8a89a15))
## [0.4.6](https://github.com/whinc/web-console/compare/v0.4.4...v0.4.6) (2019-03-04)
### Bug Fixes
- 修复 PC 端滚动条覆盖面板右边缘的问题 ([bd03c0c](https://github.com/whinc/web-console/commit/bd03c0c))
- **application:** 输入框设置高度撑破父元素的问题 ([dbbfa9c](https://github.com/whinc/web-console/commit/dbbfa9c))
- **console:** 将输出内容对齐到每行的顶部 ([85a0c5f](https://github.com/whinc/web-console/commit/85a0c5f))
- **element:** 修复<br>标签不换行导致的 element 面板中盒模型样式坍塌问题 ([1a6cd8b](https://github.com/whinc/web-console/commit/1a6cd8b))
### Reverts
- px 单位转 vw 单位 ([93c52b8](https://github.com/whinc/web-console/commit/93c52b8))
## [0.4.4](https://github.com/whinc/web-console/compare/v0.4.2...v0.4.4) (2019-03-01)
### Bug Fixes
- **console:** 修复打印多参数时参数之间无空白符分隔的问题 ([7c7c525](https://github.com/whinc/web-console/commit/7c7c525))
### Features
- **settings:** 增加反馈入口 ([26984b9](https://github.com/whinc/web-console/commit/26984b9))
## [0.4.2](https://github.com/whinc/web-console/compare/v0.4.1...v0.4.2) (2019-02-26)
### Features
- **console:** 处理未捕获的异常(error 和 unhandledrejection 事件) ([04e7da5](https://github.com/whinc/web-console/commit/04e7da5))
## [0.4.1](https://github.com/whinc/web-console/compare/v0.4.0-beta.2...v0.4.1) (2019-02-21)
### Bug Fixes
- **console:** 修复 Symbole 作为对象 key 时,打印对象报错的问题 ([27ff599](https://github.com/whinc/web-console/commit/27ff599))
- **console:** 修复打印数组时末尾多出一个逗号 ([5b5e04d](https://github.com/whinc/web-console/commit/5b5e04d))
### Features
- **console:** log 格式输出支持 %c 占位符 ([0ba036d](https://github.com/whinc/web-console/commit/0ba036d))
# [0.4.0-beta.2](https://github.com/whinc/web-console/compare/v0.4.0-beta.1...v0.4.0-beta.2) (2019-02-18)
### Bug Fixes
- **element:** 修复 Element.prototype.getAttributeNames 的兼容性问题 ([92b0355](https://github.com/whinc/web-console/commit/92b0355))
# [0.4.0-beta.1](https://github.com/whinc/web-console/compare/v0.3.0-beta.6...v0.4.0-beta.1) (2019-02-16)
### Bug Fixes
- **application:** 修复选中行没有高亮颜色的 bug ([33a4633](https://github.com/whinc/web-console/commit/33a4633))
### Features
- **element:** 展示元素计算属性的继承值 ([072fbf2](https://github.com/whinc/web-console/commit/072fbf2))
- **element:** 计算属性面板的颜色值增加颜色小方块展示 ([65987d2](https://github.com/whinc/web-console/commit/65987d2))
# [0.3.0-beta.6](https://github.com/whinc/web-console/compare/v0.3.0-beta.5...v0.3.0-beta.6) (2019-02-01)
### Bug Fixes
- 去除 ios 默认的 tap 高亮效果 ([873c02c](https://github.com/whinc/web-console/commit/873c02c))
- 无法复制文本的问题 ([a224c2e](https://github.com/whinc/web-console/commit/a224c2e))
- **components:** 修复 TabBar 组件子项超出宽度部分不可见的问题 ([56b7c40](https://github.com/whinc/web-console/commit/56b7c40))
- **console:** 优化消息换行展示 ([ed0567a](https://github.com/whinc/web-console/commit/ed0567a))
- **console:** 修复 Element.prototype.scrollTo 兼容性问题 ([70d3410](https://github.com/whinc/web-console/commit/70d3410))
- **console:** 修复数组包含非数字下标时的展示问题 ([0e9de4f](https://github.com/whinc/web-console/commit/0e9de4f))
- **element:** 修复审查分组选择器匹配元素时报错问题 ([fb43814](https://github.com/whinc/web-console/commit/fb43814))
- **element:** 修复样式被宿主样式覆盖的 bug ([3e218ba](https://github.com/whinc/web-console/commit/3e218ba))
- **element:** 禁止审查 doctype 元素 ([bc7cea6](https://github.com/whinc/web-console/commit/bc7cea6))
- **element:** 隐藏 dom paths 的滚动条 ([e13e27b](https://github.com/whinc/web-console/commit/e13e27b))
### Features
- **element:** dom path 紧凑展示时优先展示元素 id ([24e631f](https://github.com/whinc/web-console/commit/24e631f))
- **element:** 元素审查的 computed 面板增加盒模型 ([883ac26](https://github.com/whinc/web-console/commit/883ac26))
- **element:** 元素审查面板新增计算样式 ([ce87971](https://github.com/whinc/web-console/commit/ce87971))
- **element:** 审查元素的 styles 面板增加盒模型 ([fd83e9a](https://github.com/whinc/web-console/commit/fd83e9a))
- **element:** 支持属性值中颜色值预览 ([8acb299](https://github.com/whinc/web-console/commit/8acb299))
- **element:** 支持显示 doctype 元素 ([47f862d](https://github.com/whinc/web-console/commit/47f862d))
- **element:** 新增 DOM 路径 ([4d41b3c](https://github.com/whinc/web-console/commit/4d41b3c))
- **element:** 新增属性缩写形式折叠展开 ([02b952d](https://github.com/whinc/web-console/commit/02b952d))
- **element:** 美化元素审查面板样式 ([e5309b3](https://github.com/whinc/web-console/commit/e5309b3))
- **element:** 计算样式增加获取继承样式的方法 ([6934b5a](https://github.com/whinc/web-console/commit/6934b5a))
- **element:** 选中底部 dom paths 时 dom tree 自动滚动到可视区域 ([22d6b1e](https://github.com/whinc/web-console/commit/22d6b1e))
# [0.3.0-beta.5](https://github.com/whinc/web-console/compare/v0.3.0-beta.4...v0.3.0-beta.5) (2018-12-06)
### Features
- **application:** 调整底部清除和刷新范围;删除存储数据增加二次确认弹窗 ([1953419](https://github.com/whinc/web-console/commit/1953419))
- **element:** 支持审查元素样式 ([26344f6](https://github.com/whinc/web-console/commit/26344f6))
- **settings:** 增加 CHANGELOG ([7e92468](https://github.com/whinc/web-console/commit/7e92468))
### Performance Improvements
- **console:** 提升批量打印日志时的显示性能 ([776891e](https://github.com/whinc/web-console/commit/776891e))
# [0.3.0-beta.4](https://github.com/whinc/web-console/compare/v0.3.0-beta.3...v0.3.0-beta.4) (2018-12-03)
### Bug Fixes
- **network:** 修复底部隐藏按钮失效问题 ([a0d2269](https://github.com/whinc/web-console/commit/a0d2269))
### Features
- **application:** 支持折叠工具栏 ([ca20bfd](https://github.com/whinc/web-console/commit/ca20bfd))
- **application:** 新增刷新全部和清除全部快捷按钮 ([fd4e4b4](https://github.com/whinc/web-console/commit/fd4e4b4))
# [0.3.0-beta.3](https://github.com/whinc/web-console/compare/v0.3.0-beta.2...v0.3.0-beta.3) (2018-12-03)
### Bug Fixes
- **element:** 修复同时选中开始和结束标签的问题 ([6a0cb15](https://github.com/whinc/web-console/commit/6a0cb15))
- **settings:** 移除 input 的 appearance 样式 ([fa9a0fe](https://github.com/whinc/web-console/commit/fa9a0fe))
- **settings:** 移除 About 页标题地下多出的横线 ([14e8cde](https://github.com/whinc/web-console/commit/14e8cde))
### Features
- **application:** 增加底部隐藏按钮 ([5eb10fe](https://github.com/whinc/web-console/commit/5eb10fe))
- **element:** 优化元素选中态样式;支持指定 DOM 树展开深度 ([76bb6d3](https://github.com/whinc/web-console/commit/76bb6d3))
- **element:** 增加元素审查面板 ([03e82f8](https://github.com/whinc/web-console/commit/03e82f8))
- **element:** 支持无内容标签的正确显示 ([cd31e3e](https://github.com/whinc/web-console/commit/cd31e3e))
- **element:** 节点显式过长时自动换行 ([aa89681](https://github.com/whinc/web-console/commit/aa89681))
# [0.3.0-beta.2](https://github.com/whinc/web-console/compare/v0.3.0-beta.1...v0.3.0-beta.2) (2018-11-29)
### Bug Fixes
- **settings:** 移除 input 的 appearance 样式 ([c7a25b1](https://github.com/whinc/web-console/commit/c7a25b1))
### Features
- **element:** 元素增加折叠展开箭头 ([d000198](https://github.com/whinc/web-console/commit/d000198))
- **element:** 支持显式 html 结构 ([fbac371](https://github.com/whinc/web-console/commit/fbac371))
# [0.3.0-beta.1](https://github.com/whinc/web-console/compare/0.3.0-beta.1...v0.3.0-beta.1) (2018-11-24)
### Bug Fixes
- **application:** 分页加载边界条件判断错误 ([0f18ca1](https://github.com/whinc/web-console/commit/0f18ca1))
- **application:** 删除后自动选中下一项 ([3007755](https://github.com/whinc/web-console/commit/3007755))
- **application:** 删除并重新写入 cookie 不更新 ([477c0fa](https://github.com/whinc/web-console/commit/477c0fa))
- **application:** 移除 IOS 输入框边框;弹窗可见时阻止 IOS 上缩放行为 ([31c50ec](https://github.com/whinc/web-console/commit/31c50ec))
### Performance Improvements
- **application:** 优化修改和删除操作的性能 ([c376187](https://github.com/whinc/web-console/commit/c376187))
- **application:** 大幅提升展示大量(1W+)storage 和 cookie 的性能 ([66b8c45](https://github.com/whinc/web-console/commit/66b8c45))
# [0.3.0-beta.0](https://github.com/whinc/web-console/compare/v0.2.0-rc.15...v0.3.0-beta.0) (2018-11-20)
### Bug Fixes
- **application:** cookie 操作 ([01dc531](https://github.com/whinc/web-console/commit/01dc531))
- **application:** 异常 ([bf80d3b](https://github.com/whinc/web-console/commit/bf80d3b))
- **application:** 样式问题 ([c41b07c](https://github.com/whinc/web-console/commit/c41b07c))
- **network:** 解决 ios 上网络面板无法滚动问题 ([a3d39a6](https://github.com/whinc/web-console/commit/a3d39a6))
### Features
- **application:** localStorage 和 sessionStorage 支持编辑、新增 ([3cef20c](https://github.com/whinc/web-console/commit/3cef20c))
- **application:** 优化编辑状态样式 ([10e7727](https://github.com/whinc/web-console/commit/10e7727))
- **application:** 固定表头滚动表内容 ([9624ea3](https://github.com/whinc/web-console/commit/9624ea3))
- **application:** 增加 value 的过滤 ([84eddef](https://github.com/whinc/web-console/commit/84eddef))
- **application:** 增加对 cookie 的编辑和新增操作 ([273af90](https://github.com/whinc/web-console/commit/273af90))
- **application:** 新增 localStorage 和 sessionStorage ([292f863](https://github.com/whinc/web-console/commit/292f863))
- **application:** 美化 cookie 面板 ([4deefb9](https://github.com/whinc/web-console/commit/4deefb9))
- **application:** 表格增加奇偶行色差 ([e8996e8](https://github.com/whinc/web-console/commit/e8996e8))
- **console:** 增加最大消息数量限制 ([d69e15c](https://github.com/whinc/web-console/commit/d69e15c))
### Performance Improvements
- 用 v-if 替换部分 v-show 提高性能 ([1ec40f2](https://github.com/whinc/web-console/commit/1ec40f2))
- **application:** 优化保存性能 ([802c87f](https://github.com/whinc/web-console/commit/802c87f))
- **application:** 提高巨量(1w+)storage 条目的展示性能 ([258568d](https://github.com/whinc/web-console/commit/258568d))
- **console:** 优化短期内批量打印日志造成的 UI 假死现象 ([53be149](https://github.com/whinc/web-console/commit/53be149))
# [0.2.0-rc.15](https://github.com/whinc/web-console/compare/v0.2.0-rc.14...v0.2.0-rc.15) (2018-11-08)
# [0.2.0-rc.14](https://github.com/whinc/web-console/compare/v0.2.0-rc.13...v0.2.0-rc.14) (2018-11-08)
### Bug Fixes
- **console:** ios 上滚动失效 ([c282ad5](https://github.com/whinc/web-console/commit/c282ad5))
- **console:** 美化 safari 上输出的错误堆栈信息 ([4634cfa](https://github.com/whinc/web-console/commit/4634cfa))
- **settings:** ios 上图标展示过大 ([66f7beb](https://github.com/whinc/web-console/commit/66f7beb))
### Features
- **console:** 增加时间戳 ([ec6752c](https://github.com/whinc/web-console/commit/ec6752c))
- **settings:** 增加设置面板 ([89c4492](https://github.com/whinc/web-console/commit/89c4492))
- **settings:** 增加设置项持久化 ([1f542bc](https://github.com/whinc/web-console/commit/1f542bc))
# [0.2.0-rc.13](https://github.com/whinc/web-console/compare/v0.2.0-rc.12...v0.2.0-rc.13) (2018-11-06)
### Bug Fixes
- **console:** 循环打印错误日志 ([a570170](https://github.com/whinc/web-console/commit/a570170))
### Features
- **console:** 缩略展示长字符串 ([a7af920](https://github.com/whinc/web-console/commit/a7af920))
# [0.2.0-rc.12](https://github.com/whinc/web-console/compare/v0.2.0-rc.11...v0.2.0-rc.12) (2018-11-05)
### Features
- **application:** 实现 cookie 的展示、删除、过滤、刷新 ([0a26517](https://github.com/whinc/web-console/commit/0a26517))
# [0.2.0-rc.11](https://github.com/whinc/web-console/compare/v0.2.0-rc.10...v0.2.0-rc.11) (2018-10-31)
### Features
- 增加设置(展示版本信息) ([6ab8caa](https://github.com/whinc/web-console/commit/6ab8caa))
# [0.2.0-rc.10](https://github.com/whinc/web-console/compare/v0.2.0-rc.9...v0.2.0-rc.10) (2018-10-30)
### Bug Fixes
- **console:** 保留消息换行符 ([2d75a7c](https://github.com/whinc/web-console/commit/2d75a7c))
- **console:** 数组展示 ([8b8faa0](https://github.com/whinc/web-console/commit/8b8faa0))
### Features
- **application:** 增加 cookie 展示 ([4df4f8c](https://github.com/whinc/web-console/commit/4df4f8c))
- **application:** 新增 Application 面板 ([91daa76](https://github.com/whinc/web-console/commit/91daa76))
- **application:** 新增 cookie/localStorage/sessionStorage 的 UI ([aac507d](https://github.com/whinc/web-console/commit/aac507d))
- **console:** 打印 Error 对象堆栈信息 ([599206b](https://github.com/whinc/web-console/commit/599206b))
- **console:** 输出日志时可自动定位到最新位置 ([2509392](https://github.com/whinc/web-console/commit/2509392))
# [0.2.0-rc.9](https://github.com/whinc/web-console/compare/v0.2.0-rc.7...v0.2.0-rc.9) (2018-10-26)
### Performance Improvements
- **console:** 提升面板切换性能 ([a068d6c](https://github.com/whinc/web-console/commit/a068d6c))
# [0.2.0-rc.7](https://github.com/whinc/web-console/compare/v0.2.0-rc.6...v0.2.0-rc.7) (2018-10-09)
# [0.2.0-rc.6](https://github.com/whinc/web-console/compare/v0.2.0-rc.5...v0.2.0-rc.6) (2018-10-09)
### Features
- **network:** 响应数据增加语法高亮 ([dcc3df7](https://github.com/whinc/web-console/commit/dcc3df7))
- **network:** 增加 JSON 数据预览 ([a099205](https://github.com/whinc/web-console/commit/a099205))
- **network:** 增加响应数据预览 ([0bb4e95](https://github.com/whinc/web-console/commit/0bb4e95))
- **network:** 支持预览 gif/jpg/svg/txt ([72fcd52](https://github.com/whinc/web-console/commit/72fcd52))
# [0.2.0-rc.5](https://github.com/whinc/web-console/compare/v0.2.0-rc.4...v0.2.0-rc.5) (2018-09-14)
### Bug Fixes
- 修复触摸滚动穿透问题 ([f017338](https://github.com/whinc/web-console/commit/f017338))
# [0.2.0-rc.4](https://github.com/whinc/web-console/compare/v0.2.0-rc.3...v0.2.0-rc.4) (2018-09-11)
### Bug Fixes
- **network:** response 数据超出边界时无法滚动查看 ([4111487](https://github.com/whinc/web-console/commit/4111487))
# [0.2.0-rc.3](https://github.com/whinc/web-console/compare/v0.2.0-rc.2...v0.2.0-rc.3) (2018-09-10)
### Bug Fixes
- **console:** 未正确识别占位符 %c 导致的显示问题 ([c740d16](https://github.com/whinc/web-console/commit/c740d16))
- 面板可见时悬浮按钮未隐藏 ([41f8af5](https://github.com/whinc/web-console/commit/41f8af5))
# [0.2.0-rc.2](https://github.com/whinc/web-console/compare/v0.2.0-rc.1...v0.2.0-rc.2) (2018-09-08)
# [0.2.0-rc.1](https://github.com/whinc/web-console/compare/v0.1.5...v0.2.0-rc.1) (2018-09-08)
### Bug Fixes
- 对象展示问题 ([0eb0a14](https://github.com/whinc/web-console/commit/0eb0a14))
- 测试用例报错 ([f2ad431](https://github.com/whinc/web-console/commit/f2ad431))
- **console:** 修复字符串显式时没有引号包裹;修复字符串很长时没有自动换行的问题 ([42b27c2](https://github.com/whinc/web-console/commit/42b27c2))
- 移除同名文件 ([3c86612](https://github.com/whinc/web-console/commit/3c86612))
- **console:** get 访问器的计算结果没有展开 ([64fc61e](https://github.com/whinc/web-console/commit/64fc61e))
- **console:** vue 向原始日志数据中添加额外属性的问题 ([ef0424b](https://github.com/whinc/web-console/commit/ef0424b))
- **console:** 使日志每行内容垂直居中 ([5d95035](https://github.com/whinc/web-console/commit/5d95035))
- **console:** 多参数打印空格问题 ([9b90a00](https://github.com/whinc/web-console/commit/9b90a00))
- **console:** 对象的折叠展开态 ([0c59572](https://github.com/whinc/web-console/commit/0c59572))
- **console:** 属性名和值过长时导致属性名未对齐;Symb 和转符串拼接时报错 ([0e6c192](https://github.com/whinc/web-console/commit/0e6c192))
- **console:** 打印对象时丢失不可枚举和 symbol 属性 ([f3901ef](https://github.com/whinc/web-console/commit/f3901ef))
- **console:** 打印的对象属性键换行导致不易阅读的问题 ([53f018a](https://github.com/whinc/web-console/commit/53f018a))
- **console:** 样式错误显式为斜体 ([83f24ca](https://github.com/whinc/web-console/commit/83f24ca))
- **console:** 计算属性结果没有高亮 ([a769a41](https://github.com/whinc/web-console/commit/a769a41))
- **network:** 状态码 ([d39e2c2](https://github.com/whinc/web-console/commit/d39e2c2))
### Features
- **cosole:** 增加多参数高亮展示;增加 console 面板内部错误处理; ([0b13707](https://github.com/whinc/web-console/commit/0b13707))
- **network:** 优化网络请求 Headers 的展示 ([fe26231](https://github.com/whinc/web-console/commit/fe26231))
- **network:** 增加对 POST 中 JSON 数据格式的展示 ([2b25641](https://github.com/whinc/web-console/commit/2b25641))
- **network:** 增加接口测试代码;解决 onreadystatechange 事件注册时机问题 ([2822d35](https://github.com/whinc/web-console/commit/2822d35))
- **network:** 增加清除;优化行高;补充测试用例 ([ceff5e7](https://github.com/whinc/web-console/commit/ceff5e7))
- **network:** 增加请求头、查询参数和 POST 数据展示 ([4075a9f](https://github.com/whinc/web-console/commit/4075a9f))
- **network:** 请求头信息分类展示 ([6fdb205](https://github.com/whinc/web-console/commit/6fdb205))
- **network:** 错误状态码高亮展示 ([78e78ac](https://github.com/whinc/web-console/commit/78e78ac))
- 入口浮标支持滑动、图标样式 ([01bee17](https://github.com/whinc/web-console/commit/01bee17))
## [0.1.5](https://github.com/whinc/web-console/compare/v0.1.4...v0.1.5) (2018-06-20)
## [0.1.4](https://github.com/whinc/web-console/compare/v0.1.3...v0.1.4) (2018-06-20)
## [0.1.3](https://github.com/whinc/web-console/compare/v0.1.2...v0.1.3) (2018-06-20)
## [0.1.2](https://github.com/whinc/web-console/compare/v0.1.1...v0.1.2) (2018-06-12)
## [0.1.1](https://github.com/whinc/web-console/compare/1dfc2f0...v0.1.1) (2018-06-12)
### Bug Fixes
- **build:** 修复 npm run serve 问题 ([93162f9](https://github.com/whinc/web-console/commit/93162f9))
- **build:** 修复构建问题 ([a3eb6a2](https://github.com/whinc/web-console/commit/a3eb6a2))
- **demo:** 修正日志打印接口调用 ([83882a9](https://github.com/whinc/web-console/commit/83882a9))
- **network:** 修复手机上无法滚动 ([919c618](https://github.com/whinc/web-console/commit/919c618))
### Features
- **console:** 增加 clear 和 hide 两个操作 ([f0238a4](https://github.com/whinc/web-console/commit/f0238a4))
- **console:** 增加日志消息分类展示 ([f17a653](https://github.com/whinc/web-console/commit/f17a653))
- **ConsolePanel:** 美化日志输出样式 ([1dfc2f0](https://github.com/whinc/web-console/commit/1dfc2f0))
- **network:** 内容超出时变为 scroll ([d4efd7f](https://github.com/whinc/web-console/commit/d4efd7f))
- **network:** 初步实现对 XMLHttpRequest 的请求的拦截显示 ([bfc8f72](https://github.com/whinc/web-console/commit/bfc8f72))
- WebConsole 支持初始化参数;增加测试用例 ([9974f00](https://github.com/whinc/web-console/commit/9974f00))
- **network:** 增加样式 ([dbf58f8](https://github.com/whinc/web-console/commit/dbf58f8))
- **network:** 展示请求响应头和数据 ([3469c9f](https://github.com/whinc/web-console/commit/3469c9f))
- **network:** 显示请求的 response 内容 ([d3c759e](https://github.com/whinc/web-console/commit/d3c759e))
- 导出全局的 WebConsole 变量 ([a0282a4](https://github.com/whinc/web-console/commit/a0282a4))
- 面板的 Tab 栏替换成自定义组件 ([37f6923](https://github.com/whinc/web-console/commit/37f6923))
================================================
FILE: cypress.json
================================================
{
"pluginsFile": "tests/e2e/plugins/index.js"
}
================================================
FILE: docs/depoly.md
================================================
## 部署
发布到 npm 仓库:
```bash
npm run semantic-release
```
更新 github.io 在线示例:
```bash
npm run depoly
```
本地调试
```js
const script = document.createElement("script");
script.src = "http://localhost:8081/app.js";
script.onload = function() {
new window.WebConsole();
};
document.body.appendChild(script);
```
================================================
FILE: docs/plugin.md
================================================
# web-console 插件开发
通过插件可以增强 web-console 的能力,扩大使用场景。web-console 插件基于 Vue 组件开发,提供了丰富的 API、生命周期方法、内置组件、自定义偏好设置,同时提供了一个初始的插件开发项目模板方便开发、测试和发布。
## 一个简单的插件示例
下面是一个简单的插件示例。
首先,创建一个文件 MyPlugin.js 用于定义插件。
```js
export default function(WebConsole, options) {
return new WebConsole.Plugin({
id: "myPlugin",
name: "我的插件",
component: {
render(h) {
return h("h1", null, "这是我的第一个插件");
}
}
});
}
```
然后通过`WebConsole.use()`方法注册插件,当 web-console 运行起来后,插件会自动加载到主面板。
```js
// 使用插件
import WebConsole from "@whinc/web-console";
import MyPlugin from "my-plugin";
WebConsole.use(MyPlugin);
new WebConsole();
```
运行截图如下:

## 创建插件
web-console 插件是一个返回`WebConsole.Plugin`实例的函数,函数的第一个参数是`WebConsole`对象,第二个参数是传递给插件的参数。
```js
function MyPlugin(WebConsole, options) {
return new WebConsole.Plugin({
/*...*/
});
}
```
`WebConsole.Plugin`类是所有插件的基类,返回的插件实例必须继承自它,它的构造函数接受一个配置参数,支持的字段及取值如下:
| 字段 | 类型 | 必填 | 备注 |
| --------- | ------------ | ----- | ------------------------------------ |
| id | string | true | 不能与已安装的插件 id 相同 |
| name | string | false | 插件名称,用于显示,缺省时与 id 相同 |
| component | VueComponent | true | 插件主面板,是一个 Vue 组件 |
| settings | Object | false | 增加到设置面板的设置项 |
> 参数配置中的 component 注入了一些 web-console 组件,可以直接使用。(后续补充关于这些内置组件的文档)
## 注册插件
通过`WebConsole.use()`方法注册插件。
```js
WebConsole.use(MyPlugin, {/*...*/})
new WebConsole(})
```
> 注意:插件必须在 WebConsole 实例化之前注册,否则不生效。
## 插件生命周期
目前插件支持如下生命周期方法,这些插件方法在`component`所赋值的组件中可用。
| 生命周期方法 | 执行时机 | 备注 |
| --------------------------------------------------- | ---------------------------- | ----------------------------- |
| `onWebConsoleReady(hostProxy)` | 主面板首次渲染完成时 | 可访问 DOM 和配置,仅执行一次 |
| `onWebConsoleShow(hostProxy)` | 主面板从不可见变为**可见**时 | |
| `onWebConsoleHide(hostProxy)` | 主面板从可见变为**不可见**时 |
| `onWebConsoleTabChanged(hostProxy, newTab, oldTab)` | 切换不同子面板时 |
| `onWebConsoleSettingsLoaded(hostProxy, settings)` | 偏好设置首次加载时 |
| `onWebConsoleSettingsChanged(hostProxy, settings)` | 偏好设置变化时 |
使用示例:
```js
export default function(WebConsole, options) {
return new WebConsole.Plugin({
id: "myPlugin",
name: "我的插件",
component: {
render(h) {
return h("h1", null, "这是我的第一个插件");
},
methods: {
onWebConsoleShow() {
console.log("Show");
},
onWebConsoleHide() {
console.log("Hide");
}
}
}
});
}
```
## 插件偏好设置
web-console 有一个集中的偏好设置界面(点击主面板右上角的齿轮进入),插件可以在其中添加自己的偏好设置项,添加方式是在创建插件时指定`settings`属性,该属性接受一个数组,数组每个元素是一个设置描述对象。
支持的设置描述对象如下(还会支持更多):
```js
// 复选框
{
type: 'checkbox',
desc: '是否开启',
name: 'isOpen',
value: false
}
// 下拉选择框
{
type: "select",
desc: "选择颜色",
name: 'color',
value: 'red',
options: [
{ text: "红色", value: 'red' },
{ text: "绿色", value: 'green' },
{ text: "蓝色", value: 'blue' },
]
}
```
使用示例:
```js
export default function(WebConsole, options) {
return new WebConsole.Plugin({
id: "myPlugin",
name: "我的插件",
component: {
render(h) {
return h("h1", null, "这是我的第一个插件");
},
methods: {
onWebConsoleSettingsLoaded(hostProxy, settings) {
console.log("加载设置:", settings);
},
onWebConsoleSettingsChanged(hostProxy, settings) {
console.log("设置变化:", settings);
}
}
},
settings: [
{
type: "checkbox",
desc: "是否选中",
name: "isChecked",
value: false
}
]
});
}
```
运行截图:


================================================
FILE: docs/snapshot.md
================================================
# Element 面板



# Console 面板

# Network 面板

# Application 面板

================================================
FILE: gulpfile.js
================================================
const pkgInfo = require("./package.json");
const child_process = require("child_process");
const process = require("process");
var gulp = require("gulp");
gulp.task("default", function(cb) {
// 将你的默认的任务代码放在这
});
let version = "prerelease";
gulp.task("version", cb => {
const oldVersion = pkgInfo.version;
console.log(oldVersion);
console.log(process.argv, ";", process.argv0);
child_process.exec("npm version " + version, (err, stdout, stderr) => {
if (err) cb(err);
console.log(stdout);
});
});
================================================
FILE: jest.config.js
================================================
module.exports = {
moduleFileExtensions: [
'js',
'jsx',
'json',
'vue'
],
transform: {
'^.+\\.vue$': 'vue-jest',
'^.+\\.jsx?$': 'babel-jest'
},
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1'
},
snapshotSerializers: [
'jest-serializer-vue'
]
}
================================================
FILE: package.json
================================================
{
"name": "@whinc/web-console",
"version": "0.7.2",
"author": "whincwu@163.com",
"license": "MIT",
"keywords": [
"console",
"vConsole",
"web-console",
"webConsole",
"log"
],
"repository": "https://github.com/whinc/web-console",
"main": "dist/web-console.umd.min.js",
"scripts": {
"serve": "vue-cli-service serve",
"build:lib": "vue-cli-service build --target lib --name web-console --dest dist src/main.js",
"depoly:lib": "npm run lint && npm run build:lib && cross-env NPM_TOKEN=$NPM_TOKEN semantic-release && npm run changelog",
"build:demo": "vue-cli-service build --target app --dest demo",
"depoly:demo": "npm run build:demo && npx gh-pages -d demo",
"lint": "vue-cli-service lint src/**/*.js",
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0",
"report": "vue-cli-service build --report",
"test:unit": "vue-cli-service test:unit",
"test:api": "cd ./tests/api && nodemon index.js",
"e2e": "vue-cli-service e2e"
},
"dependencies": {
"cookie_js": "^1.2.2",
"highlight.js": "^9.14.2",
"lodash.clonedeep": "^4.5.0",
"mint-ui": "^2.2.13",
"specificity": "^0.4.1",
"url-search-params": "^1.1.0",
"vue": "^2.5.22",
"vue-infinite-scroll": "^2.0.2"
},
"devDependencies": {
"@commitlint/cli": "^7.5.0",
"@commitlint/config-conventional": "^7.5.0",
"@vue/cli-plugin-babel": "^3.4.1",
"@vue/cli-plugin-e2e-cypress": "^3.4.1",
"@vue/cli-plugin-eslint": "^3.4.1",
"@vue/cli-plugin-unit-jest": "^3.5.1",
"@vue/cli-service": "^3.4.1",
"@vue/test-utils": "^1.0.0-beta.28",
"babel-core": "^7.0.0-0",
"babel-jest": "^22.4.4",
"babel-plugin-component": "^1.1.1",
"conventional-changelog-angular": "^5.0.3",
"conventional-changelog-cli": "^2.0.12",
"cross-env": "^5.2.0",
"cz-conventional-changelog": "^2.1.0",
"gh-pages": "^1.2.0",
"gulp": "^4.0.0",
"husky": "^1.3.1",
"i": "^0.3.6",
"node-sass": "^4.11.0",
"nodemon": "^1.18.9",
"prettier": "1.14.2",
"pretty-quick": "^1.10.0",
"sass-loader": "^6.0.6",
"semantic-release": "^15.13.3",
"semantic-release-cli": "^4.1.1",
"vue-template-compiler": "^2.5.22"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
],
"husky": {
"hooks": {
"pre-commit": "pretty-quick --staged",
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
}
},
"prettier": {
"printWidth": 120
},
"commitlint": {
"extends": [
"@commitlint/config-conventional"
]
},
"release": {
"ci": false,
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
"@semantic-release/npm"
]
}
}
================================================
FILE: public/index.html
================================================
<!DOCTYPE html>
<!-- <!DOCTYPE html> -->
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="shortcut icon" href="<%= webpackConfig.output.publicPath %>favicon.ico">
<title>web-console</title>
<style>
/* CSSImportRule */
@import url('style_import1.css');
/* CSSStyleRule */
#element {
color: red;
/* 样式缩写形式 */
font: 1em "Fira Sans", sans-serif;
font-size: 15px;
font-weight: bold;
/* 样式缩写形式 */
border: 1px dotted blue;
border-left: 1px solid red;
padding: 5px;
padding-left: 10px;
/* 不同形式的颜色写法 */
color: black;
color: rgb(0, 0, 0);
color: #000;
background-color: #000;
border-bottom-color: #000;
border-top-color: #000;
border-right-color: #000;
border-left-color: #000;
border-color:#F00;
caret-color: #000;
outline-color: #000;
text-decoration-color: #000;
background: #000;
color:inherit;
color: darkmagenta
;
}
/* 测试分组选择器 */
.xyz, .zyx, #element, .other {
border: 1px solid red;
}
/* 测试宿主页和浏览器设置默认样式 */
div, span, p {
/* 会覆盖 conole 面板 %c 占位符的设置的继承样式 */
/* color: black; */
}
/* CSSKeyframesRule */
@keyframes out {
0% { }
100% { opacity: 0; }
}
/* parent element style */
#parent {
/* 可继承 */
color: gold;
/* 不可继承 */
border-right-width: 1px;
}
#parent2 {
color: brown;
/* 不可继承 */
border-right-width: 2px;
}
/* 测试盒模型 */
.box-model {
display: none;
margin: 99999999999999999999px;
border: 88888888888888888888px solid red;
padding: 77777777777777777777px;
width: 666px;
height: 666px;
}
.box-model2 {
display: none;
position: relative;
left: 10px;
top: 20px;
margin-left: 1px;
padding-left: 2px;
border-left: 3px;
width: -10px;
height: 0px;
}
.box-model3 {
display: none;
position: absolute;
left: 10px;
top: 20px;
width: 0px;
height: 10px;
}
</style>
<link rel="stylesheet" href="style_link.css">
<link rel="stylesheet" href="./mint-ui.min.css">
<style>
#app {
height: 100%;
overflow-y: scroll;
}
#app .mint-button {
width: 100%;
margin-bottom: 15px;
}
</style>
<link rel="stylesheet" href="./HelloPlugin.css">
</head>
<body>
<!-- 测试 element 面板 -->
<div id="parent" class="a b" style="color: red">
<div id="parent2" class="c d" style="color: red">
<div id="element"
class="xyz zyx"
style="display: none"
data-a="a"
>
<div>
<!-- 测试不同类型节点 -->
hello
world
<span>b</span>
<!-- 无内容标签测试 -->
<input>
<input/>
<input></input>
</div>
1
<div>
2
<div>
3
<div>
4
<div>
5
<div>
6
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 测试盒模型 -->
<div class="box-model"></div>
<div class="box-model2"></div>
<div class="box-model3"></div>
</div>
<!-- import Vue before Mint UI -->
<script src="./vue.js"></script>
<div id="app">
<h1>WebConsole</h1>
<div v-if="isDev">
<h2>Console Test</h2>
<mt-button type="primary" @click="$console.testLogLevel">打印不同级别日志</mt-button>
<mt-button type="primary" @click="$console.testLogParams()">打印多参数</mt-button>
<mt-button type="primary" @click="$console.testFormat()">打印格式化</mt-button>
<mt-button type="primary" @click="$console.testObject()">打印对象</mt-button>
<mt-button type="primary" @click="$console.testException()">触发异常</mt-button>
<h2>Network Test</h2>
<mt-button type="primary" @click="$network.testXMLHttpRequest()">测试 XHR 请求</mt-button>
<mt-button type="primary" @click="$network.testFetch()">测试 fetch 请求</mt-button>
<mt-button type="primary" @click="$network.testHTTPStatus()">测试 HTTP 状态码</mt-button>
<mt-button type="primary" @click="$network.testResponseData()">测试响应数据</mt-button>
<h3>query string & body</h3>
<mt-button type="primary" @click="$network.testRequestParams('get')">get</mt-button>
<mt-button type="primary" @click="$network.testRequestParams('post:raw')">post:raw</mt-button>
<mt-button type="primary" @click="$network.testRequestParams('post:raw:text')">post:raw:text</mt-button>
<mt-button type="primary" @click="$network.testRequestParams('post:raw:json')">post:raw:json</mt-button>
<mt-button type="primary" @click="$network.testRequestParams('post:form-data')">post:form-data</mt-button>
<mt-button type="primary" @click="$network.testRequestParams('post:x-www-form-urlencoded')">post:x-www-form-urlencoded</mt-button>
<h2>Application Test</h2>
<mt-button type="primary" @click="$application.testWriteCookie(1000)">测试 Cookie</mt-button>
<mt-button type="primary" @click="$application.testWriteLocalStorage(1000)">测试 LocalStorage</mt-button>
<mt-button type="primary" @click="$application.testWriteSessionStorage(1000)">测试 SessionStorage</mt-button>
<h2>Other</h2>
<mt-button type="primary" @click="performanceTest(50)">日志性能测试</mt-button>
<mt-button type="primary" @click="pluginTest">测试插件</mt-button>
</div>
<div v-else>
<mt-button type="primary" @click="onClickLog('level_log')">普通日志(log)</mt-button>
<mt-button type="primary" @click="onClickLog('level_info')">信息日志(info)</mt-button>
<mt-button type="primary" @click="onClickLog('level_debug')">调试日志(debug)</mt-button>
<mt-button type="primary" @click="onClickLog('level_warn')">警告日志(warn)</mt-button>
<mt-button type="danger" @click="onClickLog('level_error')">报错日志(error)</mt-button>
<h2></h2>
<mt-button type="primary" @click="onClickLog('object')">打印对象</mt-button>
<mt-button type="danger" @click="onClickLog('error')">打印错误</mt-button>
<h2></h2>
<mt-button type="primary" @click="onClickRequest('xhr')">发起 XMLHttpRequest 请求</mt-button>
<mt-button type="primary" @click="onClickRequest('fetch')">发起 fetch 请求</mt-button>
</div>
<p>
<mt-switch v-model='isDev'>切换</mt-switch>
</p>
</div>
<!-- import JavaScript -->
<script src="./mint-ui.min.js"></script>
<script src="./test_console.js"></script>
<script src="./test_network.js"></script>
<script src="./test_application.js"></script>
<script src="./test_plugin.js"></script>
<script type="text/javascript">
var isDev = !!localStorage.getItem('web-console:isDev')
new Vue({
el: "#app",
data: function() {
return {
isDev: isDev
};
},
computed: {
$network () {
return window.$network
},
$console () {
return window.$console
},
$application () {
return window.$application
}
},
mounted: function() {
this.launchWebConsole();
},
methods: {
pluginTest () {
localStorage.setItem('plugin', 'enable')
location.reload()
},
performanceTest (n) {
if (n <= 0) return
this.$console.testFormat()
// this.$network.testHTTPStatus()
var that = this
that.performanceTest(n - 1)
// setTimeout(function () {
// that.performanceTest(n - 1)
// }, 10)
},
launchWebConsole: function() {
var self = this;
if (window.WebConsole) {
// 测试 web-console 加载完毕前的日志输出
// console.error(new Error('hello'))
// 测试日志数量
// new Array(11).fill(0).forEach((v, i) => console.log(i))
if (localStorage.getItem('plugin') === 'enable') {
window.$plugins.forEach(plugin => WebConsole.use(plugin))
}
window.webConsole = new WebConsole({
activeTab: isDev ? 'network' : 'console',
panelVisible: isDev ? true : false,
entryStyle: 'button'
});
if (isDev) {
// this.$network.testRequestParams()
}
// self.$network.testFetchApi()
// this.$console.testFormat()
// this.$network.testHTTPStatus()
// this.$network.testRequestParams()
// this.$network.testResponseData()
// this.$console.testIntervalLog()
} else {
setTimeout(function() {
self.launchWebConsole();
}, 200);
}
},
onClickLog: function(type) {
switch (type) {
case "level_log":
console.log("log");
break;
case "level_info":
console.info("info");
break;
case "level_debug":
console.debug("debug");
break;
case "level_warn":
console.warn("warn");
break;
case "level_error":
console.error("error");
break;
case "object":
console.log({a: 100, b: [1, 2], c: true});
break;
case "error":
console.error(new Error('你触发了一个错误'));
break;
}
this.$toast({message: '已打印,请打开 Console 面板查看'})
},
onClickRequest(type) {
var nodeDocsApi = "https://nodejs.org/dist/latest-v8.x/docs/api/index.json";
if (type === 'xhr') {
var xhr = new window.XMLHttpRequest();
xhr.open("GET", nodeDocsApi);
xhr.send();
this.$toast({message: '已发送,请打开 Network 面板查看'})
} else if (type === 'fetch') {
if (typeof window.fetch === 'function') {
window.fetch(nodeDocsApi)
this.$toast({message: '已发送,请打开 Network 面板查看'})
} else {
this.$toast({message: '您的浏览器不支持 fetch 请求'})
}
} else {
}
}
}
});
function ajax(options) {
options = options || {};
var url = options.url;
var method = options.method || "GET";
var xhr = new window.XMLHttpRequest();
xhr.onreadystatechange = function() {
console.log("readyState:", this.readyState);
};
xhr.open(method, url);
xhr.send();
}
// 测试log格式化输出
function testLogFormat(value, format) {
console.log("console.log(%" + format + ", %s)", JSON.stringify(value));
console.log(format, value);
}
</script>
<!-- <script src="https://unpkg.com/@whinc/web-console"></script> -->
<!-- <script src="http://res.wx.qq.com/mmbizwap/zh_CN/htmledition/js/vconsole/3.0.0/vconsole.min.js"></script> -->
<script>
if (window.VConsole) {
window._vConsole = new window.VConsole();
}
</script>
<!-- built files will be auto injected -->
</body>
</html>
================================================
FILE: public/index_cdn.html
================================================
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>测试CDN下载</title>
</head>
<body>
<script src="https://unpkg.com/vue"></script>
<script src="https://unpkg.com/@whinc/web-console"></script>
<script>
new WebConsole()
</script>
</body>
</html>
================================================
FILE: public/style_import1.css
================================================
@import url("style_import2.css");
/* 测试元素审查 */
#element {
border-color: green;
}
.xyz {
border: 2px dashed blue;
padding: 2px;
}
================================================
FILE: public/style_import2.css
================================================
/* 测试元素审查 */
#element {
border-color: yellow;
}
.xyz {
border: 3px dotted yellow;
padding: 3px;
}
================================================
FILE: public/style_link.css
================================================
/* 测试元素审查 */
#element {
background-color: white;
}
.xyz {
border: 1px solid red;
padding: 1px;
}
================================================
FILE: public/test_application.js
================================================
window.$application = (function() {
function testWriteCookie(n = 1) {
for (var i = 0; i < n; ++i) {
const obj = { timestamp: Date.now() };
document.cookie = i + "=" + JSON.stringify(obj);
}
}
function testWriteLocalStorage(n = 1) {
for (var i = 0; i < n; ++i) {
const obj = { timestamp: Date.now() };
window.localStorage.setItem(i, JSON.stringify(obj));
}
}
function testWriteSessionStorage(n = 1) {
for (var i = 0; i < n; ++i) {
const obj = { timestamp: Date.now() };
window.sessionStorage.setItem(i, JSON.stringify(obj));
}
}
return {
testWriteCookie,
testWriteSessionStorage,
testWriteLocalStorage
};
})();
================================================
FILE: public/test_console.js
================================================
window.$console = (function() {
function testLogLevel() {
console.log("log");
console.info("info");
console.debug("debug");
console.warn("warn");
console.error("error");
}
function testLogParams() {
console.log(100, true, undefined, null, { a: 100 });
}
// 测试log格式化输出
function testLogFormat(value, format) {
console.log("console.log(%" + format + ", %s)", JSON.stringify(value));
console.log(format, value);
}
function testIntervalLog(interval = 1000) {
console.log(Date.now());
setTimeout(testIntervalLog.bind(null, arguments), interval);
}
function testException() {
// 测试直接输出 Error 对象
console.error(new ReferenceError("reference error"));
// 测试未捕获的全局异常
setTimeout(function() {
throw new Error("This is a uncaught exception");
});
// 测试未处理的 rejected Promise
Promise.reject("uncaught rejected promise");
}
// 打印对象
function testObject() {
let obj2 = {
// 测试数值类型
a: 1,
a5: { a: 1, b: 2, c: { a: 1, b: 2 } },
// 测试数组
a3: [1, 2],
a4: [1, 2, [1, 2, [1, 2, 3], 3], 3],
// 测试属性值很长时的展示
a1: "10101010101010101010101010101010101010101010101001010101",
a2: 10101010101010101010110101010101010110101011010101011010101,
// 测试字符串类型
b: "b",
// 测试转义字符展示
b1: '"b1"',
c: true,
d: undefined,
e: null,
f: Symbol(),
g: {
a: 1,
f1: () => {
return 1;
},
f2: function() {
return 2;
},
b: "b",
c: {
a: 1,
b: "b"
},
d: undefined,
e: null
},
[Symbol()]: 10,
[Symbol("age")]: 28,
f1: function() {},
f2: () => {},
f3: function say() {},
Z: "Z",
M: "m",
z: "z",
// 测试排序规则
__a: "public __a",
_a: "public _a",
$a: "public $a"
};
Object.defineProperties(obj2, {
// value
h: {
enumerable: true,
configurable: true,
value: 10,
writable: false
},
// value
i: {
enumerable: false,
configurable: false,
value: 10,
writable: true
},
// getter and setter
j: {
get: () => {
return Math.random() + "";
},
set: v => {}
},
J: {
get: () => {
return "" + Math.random();
},
set: v => {}
},
// only getter
k: {
get: function() {
return {
a: 1,
b: "b"
};
}
},
K: {
get: function() {
return [
{
a: 1,
b: "b"
}
];
}
},
// only setter
l: {
set: function(v) {}
},
[Symbol("a")]: {
value: "1",
enumerable: false
},
// 测试属性排序规则
__b: {
value: "private __b",
enumerable: false
},
_b: {
value: "private _b",
enumerable: false
},
$b: {
value: "private $b",
enumerable: false
}
});
Object.defineProperties(obj2.g, {
h: {
enumerable: true,
configurable: true,
value: 10
},
i: {
enumerable: false,
configurable: false,
value: 10
},
j: {
get: () => {
return Math.random();
},
set: v => {}
},
k: {
get: function() {
return Math.random();
},
set: function() {}
}
});
Object.defineProperties(obj2.g.c, {
c: {
enumerable: false,
configurable: false,
value: 10
},
d: {
get: function() {
return Math.random();
},
set: function() {}
}
});
console.log("对象全属性:", obj2);
console.log("三种函数:", {
f1: function() {},
f2: () => {},
f3: function say() {}
});
var arr = [];
arr["10"] = "10";
arr["29"] = "29";
arr[" "] = " "; // 0x20
arr[" "] = " ";
arr[" a"] = " a";
arr[" a"] = " a"; // 空白符处理
arr["!"] = "!"; // 0x21
arr["0"] = "0"; // 0x30
arr["1"] = "1"; // 0x31
arr["2"] = "2"; // 0x31
arr[":"] = ":"; // 0x3A
arr["A"] = "A"; // 0x41
arr["B"] = "B"; // 0x42
arr["["] = "["; // 0x5B
arr["a"] = "a"; // 0x61
arr["b"] = "b"; // 0x62
arr["{"] = "{"; // 0x7B
console.log("数组 key 排序:", arr);
const thumbObj = {
extra: `{"num_total":300,"num_left":157,"discount":"{\"create_time\":1531970051000,\"discount_data\":\"[{\\\"amount_min\\\":\\\"100\\\",\\\"amount_cut\\\":\\\"10\\\"},{\\\"amount_min\\\":\\\"200\\\",\\\"amount_cut\\\":\\\"25\\\"},{\\\"amount_min\\\":\\\"300\\\",\\\"amount_cut\\\":\\\"50\\\"}]\",\"discount_id\":3,\"discount_name\":\"满减-yanger\",\"discount_prod\":\"[\\\"WM-180101001\\\",\\\"WM-180101002\\\",\\\"WM-180101004\\\",\\\"WM-180101006\\\",\\\"WM-180101008\\\",\\\"WM-180525102\\\",\\\"WM-180101017\\\"]\",\"discount_provider\":\"0\",\"discount_status\":\"1\",\"discount_type\":\"1\",\"update_time\":1540458898000}"}`,
isChange: false
};
const thumbObj2 = [
`{"num_total":300,"num_left":157,"discount":"{\"create_time\":1531970051000,\"discount_data\":\"[{\\\"amount_min\\\":\\\"100\\\",\\\"amount_cut\\\":\\\"10\\\"},{\\\"amount_min\\\":\\\"200\\\",\\\"amount_cut\\\":\\\"25\\\"},{\\\"amount_min\\\":\\\"300\\\",\\\"amount_cut\\\":\\\"50\\\"}]\",\"discount_id\":3,\"discount_name\":\"满减-yanger\",\"discount_prod\":\"[\\\"WM-180101001\\\",\\\"WM-180101002\\\",\\\"WM-180101004\\\",\\\"WM-180101006\\\",\\\"WM-180101008\\\",\\\"WM-180525102\\\",\\\"WM-180101017\\\"]\",\"discount_provider\":\"0\",\"discount_status\":\"1\",\"discount_type\":\"1\",\"update_time\":1540458898000}"}`
];
thumbObj2.push(thumbObj);
console.log("测试对象缩略信息:", thumbObj, thumbObj2);
}
// 格式化输出
function testFormat() {
var numInt = 1;
var numFloat = 1.23;
var str = "hello";
var obj = {
a: 1,
b: 2,
c: {
d: 3
}
};
var arr = [1, 2, [3, obj]];
// 测试占位符的支持类型
testLogFormat(numInt, "%i");
testLogFormat(numFloat, "%i");
testLogFormat(numInt, "%d");
testLogFormat(numFloat, "%d");
testLogFormat(numInt, "%f");
testLogFormat(numFloat, "%f");
testLogFormat(obj, "%s");
testLogFormat(obj, "%o");
testLogFormat(arr, "%o");
testLogFormat(obj, "%O");
testLogFormat(arr, "%O");
// 测试占位符缺少对应的参数
console.log('console.log("-%s%i%d%f%o%O%c-")');
console.log("-%s%i%d%f%o%O%c-");
/* 测试占位符之间的空白符 */
// 期望输出 "a1b2c 3"
console.log("a%sb%sc", 1, 2, 3);
// 测试参数多余占位符
console.log('console.log("-%s-", 99, {a: "1"})');
console.log("-%s-", 99, { a: 1 });
// 测试占位符和参数的高亮
console.log("console.log('%s-%s-%s-%s-%s-%s-%s', 100, true, null, undefined, '100', {}, [])");
console.log("%s-%s-%s-%s-%s-%s-%s", 100, true, null, undefined, "100", {}, []);
// 测试占位符 %c 的展示
console.log(
`%c111 222 %c 333 %c %c %O %o %i %f %s %%`,
"color: white; background-color: rgba(0, 116, 217, 0.69); padding: 2px 5px; border-radius: 2px",
"color: #0074D9",
"",
"color: white; background-color: rgba(255, 65, 54, 0.69); padding: 2px 5px; margin-right: 5px; border-radius: 2px",
{ a: 444 },
{ b: 555 },
666,
777,
"888"
);
}
return {
testLogLevel: testLogLevel,
testLogParams: testLogParams,
testFormat: testFormat,
testException: testException,
testIntervalLog: testIntervalLog,
testObject: testObject
};
})();
================================================
FILE: public/test_network.js
================================================
window.$network = (function() {
var baseURL = "http://localhost:8090";
var nodeApi = "https://nodejs.org/dist/latest-v8.x/docs/api/index.json";
function testXMLHttpRequest() {}
function testFetch() {
if (typeof window.fetch !== "function") {
console.warn("current browser version don't support fetch api");
return;
}
var url = baseURL + "/get_status/" + 200;
// 不带选项
var options = {
method: "GET",
headers: {
"Content-Type": "text/plain"
}
};
fetch(url);
fetch(url, options);
fetch(new Request(url));
fetch(new Request(url, options));
fetch(new Request(url, options), {
headers: {
"Content-Type": "text/html"
}
});
}
// 测试 HTTP 状态码
function testHTTPStatus() {
request({ url: nodeApi });
[100, 200, 300, 400, 500].forEach(function(status) {
request({ url: baseURL + "/get_status/" + status });
});
}
/**
* 测试请求参数
*/
function testRequestParams(type = "get") {
var email = "xx@yy.com";
var password = "zz";
switch (type) {
case "get":
// GET
request({ url: baseURL + "/get?email=" + email + "&password=" + password + "&a=&b" });
break;
case "post:raw":
request({
url: baseURL + "/post",
method: "POST",
data: "hello"
});
break;
case "post:raw:text":
request({
url: baseURL + "/post",
method: "POST",
requestHeaders: {
"Content-Type": "text/plain"
},
data: "hello"
});
break;
case "post:raw:json":
request({
url: baseURL + "/post",
method: "POST",
requestHeaders: {
"Content-Type": "application/json;charset=UTF-8"
},
data: '{"email": aa}'
});
break;
case "post:x-www-form-urlencoded":
request({
url: baseURL + "/post",
method: "POST",
requestHeaders: {
"Content-Type": "application/x-www-form-urlencoded"
},
data: "email=" + encodeURIComponent(email) + "&password=" + encodeURIComponent(password)
});
break;
case "post:form-data":
var formData = new FormData();
formData.append("email", email);
formData.append("password", password);
request({
url: baseURL + "/post",
method: "POST",
data: formData
});
break;
}
}
// 测试响应数据类型
// 参考 http://devdocs.io/http/basics_of_http/mime_types
function testResponseData() {
const mimeTypeList = [
"application/json",
"application/javascript",
"text/css",
"text/plain",
"text/html",
"image/jpeg",
"image/png",
"image/gif",
"image/svg+xml"
];
mimeTypeList.forEach(mimeType => {
request({ url: baseURL + "/get_data/?mime_type=" + encodeURIComponent(mimeType) });
});
}
return {
testHTTPStatus: testHTTPStatus,
testResponseData: testResponseData,
testRequestParams: testRequestParams,
testFetch: testFetch,
testXMLHttpRequest: testXMLHttpRequest
};
})();
function request(options) {
options = options || {};
var url = options.url;
var method = options.method || "GET";
var data = options.data || null;
var requestHeaders = options.requestHeaders || {};
/* XMLHttpRequest */
var xhr = new window.XMLHttpRequest();
xhr.onreadystatechange = function() {
// console.log("readyState:", this.readyState);
if (this.readyState === XMLHttpRequest.DONE) {
// console.log(this.getResponseHeader("content-type"));
// console.log(this.response);
}
};
xhr.open(method, url);
Object.keys(requestHeaders).forEach(key => {
xhr.setRequestHeader(key, requestHeaders[key]);
});
xhr.send(data);
/* fetch */
if (typeof window.fetch === "function") {
fetch(url, {
method: method,
body: data,
headers: requestHeaders
});
} else {
console.warn('current brwoser don\'t support "fetch"');
}
}
================================================
FILE: public/test_plugin.js
================================================
function plugin1(WebConsole) {
return new WebConsole.Plugin({
id: "plugin1",
name: "插件1",
component: function() {
var plugin = this;
var tag = plugin.toString();
return {
data: function() {
return {
text: "plugin1 panel",
activeTab: "A"
};
},
methods: {
onWebConsoleReady: function(hostProxy) {
this.hostProxy = hostProxy;
console.log(tag, "onWebConsoleReady");
},
onWebConsoleShow: function(hostProxy) {
console.log(tag, "onWebConsoleShow");
},
onWebConsoleHide: function(hostProxy) {
console.log(tag, "onWebConsoleHide");
},
onWebConsoleTabChanged: function(hostProxy, newVal, oldVal) {
console.log(tag, "onWebConsoleTabChanged", newVal);
},
onWebConsoleSettingsLoaded: function(hostProxy, settings) {
console.log(tag, "onWebConsoleSettingsLoaded", settings);
},
onWebConsoleSettingsChanged: function(hostProxy, settings) {
console.log(tag, "onWebConsoleSettingsChanged", settings);
},
hidePanel: function() {
this.hostProxy.hidePanel();
},
printSettings: function() {
console.log("settings:", this.hostProxy.getSettings());
}
},
render: function(h) {
var vm = this;
return h(
"div",
{
style: {
display: "flex",
"flex-direction": "column"
}
},
[
h(
"div",
{
style: {
flex: "1"
}
},
[
h(
"button",
{
on: {
click: this.hidePanel
}
},
"hide panel"
),
h(
"button",
{
style: {
"margin-left": "10px"
},
on: {
click: this.printSettings
}
},
"print settings"
),
h(
"div",
{
style: {
"margin-top": "20px",
display: "flex",
"flex-direction": "row"
}
},
["setting", "close", "refresh", "ban", "edit", "save", "add", "cancel", "expand", "collapse"].map(
name =>
h("VIcon", {
style: {
"margin-left": "10px",
width: "20px",
height: "20px"
},
props: {
name: name
}
})
)
)
]
),
h("VJSONViewer", {
props: {
value: { a: 1, b: "2", c: { a: 1, b: "2" } }
}
}),
h("VHighlightView", {
props: {
code: "var a = 1;\nvar b 2;\nconsole.log('a + b =', a + b)",
language: "javascript"
}
}),
h(
"VTabBar",
{
props: {
value: vm.activeTab,
equalWidth: true
},
on: {
input: function(id) {
vm.activeTab = id;
}
}
},
[
h("VTabBarItem", { props: { id: "A" } }, "Tab1"),
h("VTabBarItem", { props: { id: "B" } }, "Tab2"),
h("VTabBarItem", { props: { id: "C" } }, "Tab3"),
h("VTabBarItem", { props: { id: "D" } }, "Tab4")
]
),
h("v-foot-bar", {
props: {
buttons: [
{
text: "Hide",
click: function() {
vm.hostProxy.hidePanel();
}
}
]
}
}) // v-foot-bar
]
); // div
}
};
},
settings: [
{
type: "checkbox",
name: "plugin0",
value: false,
desc: "test plugin0"
}
]
});
}
function plugin2(WebConsole) {
return new WebConsole.Plugin({
id: "plugin2",
name: "插件2",
component: {
data: function() {
return {
text: "plugin2 panel"
};
},
render: function(h) {
return h("div", {}, this.text);
}
},
settings: function() {
return [
{
type: "checkbox",
name: this.id,
value: false,
desc: "test " + this.id
}
];
}
});
}
window.$plugins = [plugin1, plugin2];
================================================
FILE: public/vue.js
================================================
/*!
* Vue.js v2.5.17
* (c) 2014-2018 Evan You
* Released under the MIT License.
*/
(function(global, factory) {
typeof exports === "object" && typeof module !== "undefined"
? (module.exports = factory())
: typeof define === "function" && define.amd
? define(factory)
: (global.Vue = factory());
})(this, function() {
"use strict";
/* */
var emptyObject = Object.freeze({});
// these helpers produces 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);
}
/**
* Convert a value to a string that is actually rendered.
*/
function toString(val) {
return val == null ? "" : typeof val === "object" ? JSON.stringify(val, null, 2) : String(val);
}
/**
* Convert a 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 a 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 the 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 more performant in most browsers, but removing it would be breaking for
* code that was able to run in PhantomJS 1.x, so this must be kept for
* backwards 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;
}
/**
* 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;
};
/**
* Return same value
*/
var identity = function(_) {
return _;
};
/**
* Generate a static keys string from compiler modules.
*/
function genStaticKeys(modules) {
return modules
.reduce(function(keys, m) {
return keys.concat(m.staticKeys || []);
}, [])
.join(",");
}
/**
* 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 (!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;
}
}
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"
];
/* */
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: "development" !== "production",
/**
* Whether to enable devtools
*/
devtools: "development" !== "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,
/**
* Exposed for legacy reasons
*/
_lifecycleHooks: LIFECYCLE_HOOKS
};
/* */
/**
* 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 = /[^\w.$]/;
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;
// Firefox has a "watch" function on Object.prototype...
var nativeWatch = {}.watch;
var supportsPassive = false;
if (inBrowser) {
try {
var opts = {};
Object.defineProperty(opts, "passive", {
get: function get() {
/* istanbul ignore next */
supportsPassive = true;
}
}); // 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"].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; // $flow-disable-line
/* istanbul ignore if */ 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 = (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 tip = noop;
var generateComponentTrace = noop; // work around flow check
var formatComponentName = noop;
{
var hasConsole = typeof console !== "undefined";
var classifyRE = /(?:^|[-_])(\w)/g;
var classify = function(str) {
return str
.replace(classifyRE, function(c) {
return c.toUpperCase();
})
.replace(/[-_]/g, "");
};
warn = function(msg, vm) {
var trace = vm ? generateComponentTrace(vm) : "";
if (config.warnHandler) {
config.warnHandler.call(null, msg, vm, trace);
} else if (hasConsole && !config.silent) {
console.error("[Vue warn]: " + msg + trace);
}
};
tip = function(msg, vm) {
if (hasConsole && !config.silent) {
console.warn("[Vue tip]: " + msg + (vm ? generateComponentTrace(vm) : ""));
}
};
formatComponentName = function(vm, includeFile) {
if (vm.$root === vm) {
return "<Root>";
}
var options =
typeof vm === "function" && vm.cid != null
? vm.options
: vm._isVue
? vm.$options || vm.constructor.options
: vm || {};
var name = options.name || options._componentTag;
var file = options.__file;
if (!name && file) {
var match = file.match(/([^/\\]+)\.vue$/);
name = match && match[1];
}
return (name ? "<" + classify(name) + ">" : "<Anonymous>") + (file && includeFile !== false ? " at " + file : "");
};
var repeat = function(str, n) {
var res = "";
while (n) {
if (n % 2 === 1) {
res += str;
}
if (n > 1) {
str += str;
}
n >>= 1;
}
return res;
};
generateComponentTrace = function(vm) {
if (vm._isVue && vm.$parent) {
var tree = [];
var currentRecursiveSequence = 0;
while (vm) {
if (tree.length > 0) {
var last = tree[tree.length - 1];
if (last.constructor === vm.constructor) {
currentRecursiveSequence++;
vm = vm.$parent;
continue;
} else if (currentRecursiveSequence > 0) {
tree[tree.length - 1] = [last, currentRecursiveSequence];
currentRecursiveSequence = 0;
}
}
tree.push(vm);
vm = vm.$parent;
}
return (
"\n\nfound in\n\n" +
tree
.map(function(vm, i) {
return (
"" +
(i === 0 ? "---> " : repeat(" ", 5 + i * 2)) +
(Array.isArray(vm)
? formatComponentName(vm[0]) + "... (" + vm[1] + " recursive calls)"
: formatComponentName(vm))
);
})
.join("\n")
);
} else {
return "\n\n(found in " + formatComponentName(vm) + ")";
}
};
}
/* */
var uid = 0;
/**
* A dep is an observable that can have multiple
* directives subscribing to it.
*/
var Dep = function Dep() {
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.target) {
Dep.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 there could be only one
// watcher being evaluated at any time.
Dep.target = null;
var targetStack = [];
function pushTarget(_target) {
if (Dep.target) {
targetStack.push(Dep.target);
}
Dep.target = _target;
}
function popTarget() {
Dep.target = targetStack.pop();
}
/* */
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,
vnode.children,
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.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)) {
var augment = hasProto ? protoAugment : copyAugment;
augment(value, arrayMethods, arrayKeys);
this.observeArray(value);
} else {
this.walk(value);
}
};
/**
* Walk through each property 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(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 an target Object or Array by intercepting
* the prototype chain using __proto__
*/
function protoAugment(target, src, keys) {
/* eslint-disable no-proto */
target.__proto__ = src;
/* eslint-enable no-proto */
}
/**
* Augment an 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(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;
if (!getter && arguments.length === 2) {
val = obj[key];
}
var setter = property && property.set;
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.target) {
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;
}
/* eslint-enable no-self-compare */
if ("development" !== "production" && customSetter) {
customSetter();
}
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 ("development" !== "production" && (isUndef(target) || isPrimitive(target))) {
warn("Cannot set reactive property on undefined, null, or primitive value: " + target);
}
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)) {
"development" !== "production" &&
warn(
"Avoid adding reactive properties to a Vue instance or its root $data " +
"at runtime - declare it upfront in the data option."
);
return val;
}
if (!ob) {
target[key] = val;
return val;
}
defineReactive(ob.value, key, val);
ob.dep.notify();
return val;
}
/**
* Delete a property and trigger change if necessary.
*/
function del(target, key) {
if ("development" !== "production" && (isUndef(target) || isPrimitive(target))) {
warn("Cannot delete reactive property on undefined, null, or primitive value: " + target);
}
if (Array.isArray(target) && isValidArrayIndex(key)) {
target.splice(key, 1);
return;
}
var ob = target.__ob__;
if (target._isVue || (ob && ob.vmCount)) {
"development" !== "production" &&
warn("Avoid deleting properties on a Vue instance or its root $data " + "- just set it to null.");
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;
/**
* Options with restrictions
*/
{
strats.el = strats.propsData = function(parent, child, vm, key) {
if (!vm) {
warn('option "' + key + '" can only be used during instance ' + "creation with the `new` keyword.");
}
return defaultStrat(parent, child);
};
}
/**
* Helper that recursively merges two data objects together.
*/
function mergeData(to, from) {
if (!from) {
return to;
}
var key, toVal, fromVal;
var keys = Object.keys(from);
for (var i = 0; i < keys.length; i++) {
key = keys[i];
toVal = to[key];
fromVal = from[key];
if (!hasOwn(to, key)) {
set(to, key, fromVal);
} else if (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") {
"development" !== "production" &&
warn(
'The "data" option should be a function ' +
"that returns a per-instance value in component " +
"definitions.",
vm
);
return parentVal;
}
return mergeDataOrFn(parentVal, childVal);
}
return mergeDataOrFn(parentVal, childVal, vm);
};
/**
* Hooks and props are merged as arrays.
*/
function mergeHook(parentVal, childVal) {
return childVal
? parentVal
? parentVal.concat(childVal)
: Array.isArray(childVal)
? childVal
: [childVal]
: parentVal;
}
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) {
"development" !== "production" && assertObjectType(key, childVal, vm);
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);
}
{
assertObjectType(key, childVal, vm);
}
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 && "development" !== "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;
};
/**
* Validate component names
*/
function checkComponents(options) {
for (var key in options.components) {
validateComponentName(key);
}
}
function validateComponentName(name) {
if (!/^[a-zA-Z][\w-]*$/.test(name)) {
warn(
'Invalid component name: "' +
name +
'". Component names ' +
"can only contain alphanumeric characters and the hyphen, " +
"and must start with a letter."
);
}
if (isBuiltInTag(name) || config.isReservedTag(name)) {
warn("Do not use built-in or reserved HTML elements as component " + "id: " + name);
}
}
/**
* 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 {
warn("props must be strings when using array syntax.");
}
}
} else if (isPlainObject(props)) {
for (var key in props) {
val = props[key];
name = camelize(key);
res[name] = isPlainObject(val) ? val : { type: val };
}
} else {
warn(
'Invalid value for option "props": expected an Array or an Object, ' + "but got " + toRawType(props) + ".",
vm
);
}
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 };
}
} else {
warn(
'Invalid value for option "inject": expected an Array or an Object, ' + "but got " + toRawType(inject) + ".",
vm
);
}
}
/**
* Normalize raw function directives into object format.
*/
function normalizeDirectives(options) {
var dirs = options.directives;
if (dirs) {
for (var key in dirs) {
var def = dirs[key];
if (typeof def === "function") {
dirs[key] = { bind: def, update: def };
}
}
}
}
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) {
{
checkComponents(child);
}
if (typeof child === "function") {
child = child.options;
}
normalizeProps(child, vm);
normalizeInject(child, vm);
normalizeDirectives(child);
var extendsFrom = child.extends;
if (extendsFrom) {
parent = mergeOptions(parent, extendsFrom, 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];
if ("development" !== "production" && warnMissing && !res) {
warn("Failed to resolve " + type.slice(0, -1) + ": " + id, options);
}
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);
}
{
assertProp(prop, key, value, vm, absent);
}
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;
// warn against non-factory defaults for Object & Array
if ("development" !== "production" && isObject(def)) {
warn(
'Invalid default value for prop "' +
key +
'": ' +
"Props with type Object/Array must use a factory function " +
"to return the default value.",
vm
);
}
// 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;
}
/**
* Assert whether a prop is valid.
*/
function assertProp(prop, name, value, vm, absent) {
if (prop.required && absent) {
warn('Missing required prop: "' + name + '"', vm);
return;
}
if (value == null && !prop.required) {
return;
}
var type = prop.type;
var valid = !type || type === true;
var expectedTypes = [];
if (type) {
if (!Array.isArray(type)) {
type = [type];
}
for (var i = 0; i < type.length && !valid; i++) {
var assertedType = assertType(value, type[i]);
expectedTypes.push(assertedType.expectedType || "");
valid = assertedType.valid;
}
}
if (!valid) {
warn(
'Invalid prop: type check failed for prop "' +
name +
'".' +
" Expected " +
expectedTypes.map(capitalize).join(", ") +
", got " +
toRawType(value) +
".",
vm
);
return;
}
var validator = prop.validator;
if (validator) {
if (!validator(value)) {
warn('Invalid prop: custom validator check failed for prop "' + name + '".', vm);
}
}
}
var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;
function assertType(value, type) {
var valid;
var expectedType = getType(type);
if (simpleCheckRE.test(expectedType)) {
var t = typeof value;
valid = t === expectedType.toLowerCase();
// for primitive wrapper objects
if (!valid && t === "object") {
valid = value instanceof type;
}
} else if (expectedType === "Object") {
valid = isPlainObject(value);
} else if (expectedType === "Array") {
valid = Array.isArray(value);
} else {
valid = value instanceof type;
}
return {
valid: valid,
expectedType: expectedType
};
}
/**
* 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) {
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);
}
function globalHandleError(err, vm, info) {
if (config.errorHandler) {
try {
return config.errorHandler.call(null, err, vm, info);
} catch (e) {
logError(e, null, "config.errorHandler");
}
}
logError(err, vm, info);
}
function logError(err, vm, info) {
{
warn("Error in " + info + ': "' + err.toString() + '"', vm);
}
/* istanbul ignore else */
if ((inBrowser || inWeex) && typeof console !== "undefined") {
console.error(err);
} else {
throw err;
}
}
/* */
/* globals MessageChannel */
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 both microtasks and (macro) tasks.
// In < 2.4 we used microtasks everywhere, but there are some scenarios where
// microtasks have too high a priority and fire in between supposedly
// sequential events (e.g. #4521, #6690) or even between bubbling of the same
// event (#6566). However, using (macro) tasks everywhere also has subtle problems
// when state is changed right before repaint (e.g. #6813, out-in transitions).
// Here we use microtask by default, but expose a way to force (macro) task when
// needed (e.g. in event handlers attached by v-on).
var microTimerFunc;
var macroTimerFunc;
var useMacroTask = false;
// Determine (macro) task defer implementation.
// Technically setImmediate should be the ideal choice, but it's only available
// in IE. The only polyfill that consistently queues the callback after all DOM
// events triggered in the same loop is by using MessageChannel.
/* istanbul ignore if */
if (typeof setImmediate !== "undefined" && isNative(setImmediate)) {
macroTimerFunc = function() {
setImmediate(flushCallbacks);
};
} else if (
typeof MessageChannel !== "undefined" &&
(isNative(MessageChannel) ||
// PhantomJS
MessageChannel.toString() === "[object MessageChannelConstructor]")
) {
var channel = new MessageChannel();
var port = channel.port2;
channel.port1.onmessage = flushCallbacks;
macroTimerFunc = function() {
port.postMessage(1);
};
} else {
/* istanbul ignore next */
macroTimerFunc = function() {
setTimeout(flushCallbacks, 0);
};
}
// Determine microtask defer implementation.
/* istanbul ignore next, $flow-disable-line */
if (typeof Promise !== "undefined" && isNative(Promise)) {
var p = Promise.resolve();
microTimerFunc = function() {
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);
}
};
} else {
// fallback to macro
microTimerFunc = macroTimerFunc;
}
/**
* Wrap a function so that if any code inside triggers state change,
* the changes are queued using a (macro) task instead of a microtask.
*/
function withMacroTask(fn) {
return (
fn._withTask ||
(fn._withTask = function() {
useMacroTask = true;
var res = fn.apply(null, arguments);
useMacroTask = false;
return res;
})
);
}
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;
if (useMacroTask) {
macroTimerFunc();
} else {
microTimerFunc();
}
}
// $flow-disable-line
if (!cb && typeof Promise !== "undefined") {
return new Promise(function(resolve) {
_resolve = resolve;
});
}
}
/* */
var mark;
var measure;
{
var perf = inBrowser && window.performance;
/* istanbul ignore if */
if (perf && perf.mark && perf.measure && perf.clearMarks && perf.clearMeasures) {
mark = function(tag) {
return perf.mark(tag);
};
measure = function(name, startTag, endTag) {
perf.measure(name, startTag, endTag);
perf.clearMarks(startTag);
perf.clearMarks(endTag);
perf.clearMeasures(name);
};
}
}
/* not type checking this file because flow doesn't play well with Proxy */
var initProxy;
{
var allowedGlobals = makeMap(
"Infinity,undefined,NaN,isFinite,isNaN," +
"parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent," +
"Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl," +
"require" // for Webpack/Browserify
);
var warnNonPresent = function(target, key) {
warn(
'Property or method "' +
key +
'" is not defined on the instance but ' +
"referenced during render. Make sure that this property is reactive, " +
"either in the data option, or for class-based components, by " +
"initializing the property. " +
"See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.",
target
);
};
var hasProxy = typeof Proxy !== "undefined" && isNative(Proxy);
if (hasProxy) {
var isBuiltInModifier = makeMap("stop,prevent,self,ctrl,shift,alt,meta,exact");
config.keyCodes = new Proxy(config.keyCodes, {
set: function set(target, key, value) {
if (isBuiltInModifier(key)) {
warn("Avoid overwriting built-in modifier in config.keyCodes: ." + key);
return false;
} else {
target[key] = value;
return true;
}
}
});
}
var hasHandler = {
has: function has(target, key) {
var has = key in target;
var isAllowed = allowedGlobals(key) || key.charAt(0) === "_";
if (!has && !isAllowed) {
warnNonPresent(target, key);
}
return has || !isAllowed;
}
};
var getHandler = {
get: function get(target, key) {
if (typeof key === "string" && !(key in target)) {
warnNonPresent(target, key);
}
return target[key];
}
};
initProxy = function initProxy(vm) {
if (hasProxy) {
// determine which proxy handler to use
var options = vm.$options;
var handlers = options.render && options.render._withStripped ? getHandler : hasHandler;
vm._renderProxy = new Proxy(vm, handlers);
} else {
vm._renderProxy = vm;
}
};
}
/* */
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) {
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++) {
cloned[i].apply(null, arguments$1);
}
} else {
// return handler return value for single handlers
return fns.apply(null, arguments);
}
}
invoker.fns = fns;
return invoker;
}
function updateListeners(on, oldOn, add, remove$$1, vm) {
var name, def, cur, old, event;
for (name in on) {
def = cur = on[name];
old = oldOn[name];
event = normalizeEvent(name);
/* istanbul ignore if */
if (isUndef(cur)) {
"development" !== "production" &&
warn('Invalid handler for event "' + event.name + '": got ' + String(cur), vm);
} else if (isUndef(old)) {
if (isUndef(cur.fns)) {
cur = on[name] = createFnInvoker(cur);
}
add(event.name, cur, event.once, 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;
}
/* */
function extractPropsFromVNodeData(data, Ctor, tag) {
// 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)) {
return;
}
var res = {};
var attrs = data.attrs;
var props = data.props;
if (isDef(attrs) || isDef(props)) {
for (var key in propOptions) {
var altKey = hyphenate(key);
{
var keyInLowerCase = key.toLowerCase();
if (key !== keyInLowerCase && attrs && hasOwn(attrs, keyInLowerCase)) {
tip(
'Prop "' +
keyInLowerCase +
'" is passed to component ' +
formatComponentName(tag || Ctor) +
", but the declared prop name is" +
' "' +
key +
'". ' +
"Note that HTML attributes are case-insensitive and camelCased " +
"props need to use their kebab-case equivalents when using in-DOM " +
'templates. You should probably use "' +
altKey +
'" instead of "' +
key +
'".'
);
}
}
checkProp(res, props, key, altKey, true) || checkProp(res, attrs, key, altKey, false);
}
}
return res;
}
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<VNode>. 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. <template>, <slot>, v-for, or when the children is provided by user
// with hand-written render functions / JSX. In such cases a full normalization
// is needed to cater to all possible types of children values.
function normalizeChildren(children) {
return isPrimitive(children)
? [createTextVNode(children)]
: Array.isArray(children)
? normalizeArrayChildren(children)
: undefined;
}
function isTextNode(node) {
return isDef(node) && isDef(node.text) && isFalse(node.isComment);
}
function normalizeArrayChildren(children, nestedIndex) {
var res = [];
var i, c, lastIndex, last;
for (i = 0; i < children.length; i++) {
c = children[i];
if (isUndef(c) || typeof c === "boolean") {
continue;
}
lastIndex = res.length - 1;
last = res[lastIndex];
// nested
if (Array.isArray(c)) {
if (c.length > 0) {
c = normalizeArrayChildren(c, (nestedIndex || "") + "_" + i);
// merge adjacent text nodes
if (isTextNode(c[0]) && isTextNode(last)) {
res[lastIndex] = createTextVNode(last.text + c[0].text);
c.shift();
}
res.push.apply(res, c);
}
} else if (isPrimitive(c)) {
if (isTextNode(last)) {
// merge adjacent text nodes
// this is necessary for SSR hydration because text nodes are
// essentially merged when rendered to HTML strings
res[lastIndex] = createTextVNode(last.text + c);
} else if (c !== "") {
// convert primitive to vnode
res.push(createTextVNode(c));
}
} else {
if (isTextNode(c) && isTextNode(last)) {
// merge adjacent text nodes
res[lastIndex] = createTextVNode(last.text + c.text);
} else {
// default key for nested array children (likely generated by v-for)
if (isTrue(children._isVList) && isDef(c.tag) && isUndef(c.key) && isDef(nestedIndex)) {
c.key = "__vlist" + nestedIndex + "_" + i + "__";
}
res.push(c);
}
}
}
return res;
}
/* */
function ensureCtor(comp, base) {
if (comp.__esModule || (hasSymbol && comp[Symbol.toStringTag] === "Module")) {
comp = comp.default;
}
return isObject(comp) ? base.extend(comp) : comp;
}
function createAsyncPlaceholder(factory, data, context, children, tag) {
var node = createEmptyVNode();
node.asyncFactory = factory;
node.asyncMeta = { data: data, context: context, children: children, tag: tag };
return node;
}
function resolveAsyncComponent(factory, baseCtor, context) {
if (isTrue(factory.error) && isDef(factory.errorComp)) {
return factory.errorComp;
}
if (isDef(factory.resolved)) {
return factory.resolved;
}
if (isTrue(factory.loading) && isDef(factory.loadingComp)) {
return factory.loadingComp;
}
if (isDef(factory.contexts)) {
// already pending
factory.contexts.push(context);
} else {
var contexts = (factory.contexts = [context]);
var sync = true;
var forceRender = function() {
for (var i = 0, l = contexts.length; i < l; i++) {
contexts[i].$forceUpdate();
}
};
var resolve = once(function(res) {
// cache resolved
factory.resolved = ensureCtor(res, baseCtor);
// invoke callbacks only if this is not a synchronous resolve
// (async resolves are shimmed as synchronous during SSR)
if (!sync) {
forceRender();
}
});
var reject = once(function(reason) {
"development" !== "production" &&
warn("Failed to resolve async component: " + String(factory) + (reason ? "\nReason: " + reason : ""));
if (isDef(factory.errorComp)) {
factory.error = true;
forceRender();
}
});
var res = factory(resolve, reject);
if (isObject(res)) {
if (typeof res.then === "function") {
// () => Promise
if (isUndef(factory.resolved)) {
res.then(resolve, reject);
}
} else if (isDef(res.component) && typeof res.component.then === "function") {
res.component.then(resolve, reject);
if (isDef(res.error)) {
factory.errorComp = ensureCtor(res.error, baseCtor);
}
if (isDef(res.loading)) {
factory.loadingComp = ensureCtor(res.loading, baseCtor);
if (res.delay === 0) {
factory.loading = true;
} else {
setTimeout(function() {
if (isUndef(factory.resolved) && isUndef(factory.error)) {
factory.loading = true;
forceRender();
}
}, res.delay || 200);
}
}
if (isDef(res.timeout)) {
setTimeout(function() {
if (isUndef(factory.resolved)) {
reject("timeout (" + res.timeout + "ms)");
}
}, res.timeout);
}
}
}
sync = false;
// return in case resolved synchronously
return factory.loading ? factory.loadingComp : factory.resolved;
}
}
/* */
function isAsyncPlaceholder(node) {
return node.isComment && node.asyncFactory;
}
/* */
function getFirstComponentChild(children) {
if (Array.isArray(children)) {
for (var i = 0; i < children.length; i++) {
var c = children[i];
if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {
return c;
}
}
}
}
/* */
/* */
function initEvents(vm) {
vm._events = Object.create(null);
vm._hasHookEvent = false;
// init parent attached events
var listeners = vm.$options._parentListeners;
if (listeners) {
updateComponentListeners(vm, listeners);
}
}
var target;
function add(event, fn, once) {
if (once) {
target.$once(event, fn);
} else {
target.$on(event, fn);
}
}
function remove$1(event, fn) {
target.$off(event, fn);
}
function updateComponentListeners(vm, listeners, oldListeners) {
target = vm;
updateListeners(listeners, oldListeners || {}, add, remove$1, vm);
target = undefined;
}
function eventsMixin(Vue) {
var hookRE = /^hook:/;
Vue.prototype.$on = function(event, fn) {
var this$1 = this;
var vm = this;
if (Array.isArray(event)) {
for (var i = 0, l = event.length; i < l; i++) {
this$1.$on(event[i], fn);
}
} else {
(vm._events[event] || (vm._events[event] = [])).push(fn);
// optimize hook:event cost by using a boolean flag marked at registration
// instead of a hash lookup
if (hookRE.test(event)) {
vm._hasHookEvent = true;
}
}
return vm;
};
Vue.prototype.$once = function(event, fn) {
var vm = this;
function on() {
vm.$off(event, on);
fn.apply(vm, arguments);
}
on.fn = fn;
vm.$on(event, on);
return vm;
};
Vue.prototype.$off = function(event, fn) {
var this$1 = this;
var vm = this;
// all
if (!arguments.length) {
vm._events = Object.create(null);
return vm;
}
// array of events
if (Array.isArray(event)) {
for (var i = 0, l = event.length; i < l; i++) {
this$1.$off(event[i], fn);
}
return vm;
}
// specific event
var cbs = vm._events[event];
if (!cbs) {
return vm;
}
if (!fn) {
vm._events[event] = null;
return vm;
}
if (fn) {
// specific handler
var cb;
var i$1 = cbs.length;
while (i$1--) {
cb = cbs[i$1];
if (cb === fn || cb.fn === fn) {
cbs.splice(i$1, 1);
break;
}
}
}
return vm;
};
Vue.prototype.$emit = function(event) {
var vm = this;
{
var lowerCaseEvent = event.toLowerCase();
if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
tip(
'Event "' +
lowerCaseEvent +
'" is emitted in component ' +
formatComponentName(vm) +
' but the handler is registered for "' +
event +
'". ' +
"Note that HTML attributes are case-insensitive and you cannot use " +
"v-on to listen to camelCase events when using in-DOM templates. " +
'You should probably use "' +
hyphenate(event) +
'" instead of "' +
event +
'".'
);
}
}
var cbs = vm._events[event];
if (cbs) {
cbs = cbs.length > 1 ? toArray(cbs) : cbs;
var args = toArray(arguments, 1);
for (var i = 0, l = cbs.length; i < l; i++) {
try {
cbs[i].apply(vm, args);
} catch (e) {
handleError(e, vm, 'event handler for "' + event + '"');
}
}
}
return vm;
};
}
/* */
/**
* Runtime helper for resolving raw children VNodes into a slot object.
*/
function resolveSlots(children, context) {
var slots = {};
if (!children) {
return slots;
}
for (var i = 0, l = children.length; i < l; i++) {
var child = children[i];
var data = child.data;
// remove slot attribute if the node is resolved as a Vue slot node
if (data && data.attrs && data.attrs.slot) {
delete data.attrs.slot;
}
// named slots should only be respected if the vnode was rendered in the
// same context.
if ((child.context === context || child.fnContext === context) && data && data.slot != null) {
var name = data.slot;
var slot = slots[name] || (slots[name] = []);
if (child.tag === "template") {
slot.push.apply(slot, child.children || []);
} else {
slot.push(child);
}
} else {
(slots.default || (slots.default = [])).push(child);
}
}
// ignore slots that contains only whitespace
for (var name$1 in slots) {
if (slots[name$1].every(isWhitespace)) {
delete slots[name$1];
}
}
return slots;
}
function isWhitespace(node) {
return (node.isComment && !node.asyncFactory) || node.text === " ";
}
function resolveScopedSlots(
fns, // see flow/vnode
res
) {
res = res || {};
for (var i = 0; i < fns.length; i++) {
if (Array.isArray(fns[i])) {
resolveScopedSlots(fns[i], res);
} else {
res[fns[i].key] = fns[i].fn;
}
}
return res;
}
/* */
var activeInstance = null;
var isUpdatingChildComponent = false;
function initLifecycle(vm) {
var options = vm.$options;
// locate first non-abstract parent
var parent = options.parent;
if (parent && !options.abstract) {
while (parent.$options.abstract && parent.$parent) {
parent = parent.$parent;
}
parent.$children.push(vm);
}
vm.$parent = parent;
vm.$root = parent ? parent.$root : vm;
vm.$children = [];
vm.$refs = {};
vm._watcher = null;
vm._inactive = null;
vm._directInactive = false;
vm._isMounted = false;
vm._isDestroyed = false;
vm._isBeingDestroyed = false;
}
function lifecycleMixin(Vue) {
Vue.prototype._update = function(vnode, hydrating) {
var vm = this;
if (vm._isMounted) {
callHook(vm, "beforeUpdate");
}
var prevEl = vm.$el;
var prevVnode = vm._vnode;
var prevActiveInstance = activeInstance;
activeInstance = vm;
vm._vnode = vnode;
// Vue.prototype.__patch__ is injected in entry points
// based on the rendering backend used.
if (!prevVnode) {
// initial render
vm.$el = vm.__patch__(
vm.$el,
vnode,
hydrating,
false /* removeOnly */,
vm.$options._parentElm,
vm.$options._refElm
);
// no need for the ref nodes after initial patch
// this prevents keeping a detached DOM tree in memory (#5851)
vm.$options._parentElm = vm.$options._refElm = null;
} else {
// updates
vm.$el = vm.__patch__(prevVnode, vnode);
}
activeInstance = prevActiveInstance;
// update __vue__ reference
if (prevEl) {
prevEl.__vue__ = null;
}
if (vm.$el) {
vm.$el.__vue__ = vm;
}
// if parent is an HOC, update its $el as well
if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {
vm.$parent.$el = vm.$el;
}
// updated hook is called by the scheduler to ensure that children are
// updated in a parent's updated hook.
};
Vue.prototype.$forceUpdate = function() {
var vm = this;
if (vm._watcher) {
vm._watcher.update();
}
};
Vue.prototype.$destroy = function() {
var vm = this;
if (vm._isBeingDestroyed) {
return;
}
callHook(vm, "beforeDestroy");
vm._isBeingDestroyed = true;
// remove self from parent
var parent = vm.$parent;
if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {
remove(parent.$children, vm);
}
// teardown watchers
if (vm._watcher) {
vm._watcher.teardown();
}
var i = vm._watchers.length;
while (i--) {
vm._watchers[i].teardown();
}
// remove reference from data ob
// frozen object may not have observer.
if (vm._data.__ob__) {
vm._data.__ob__.vmCount--;
}
// call the last hook...
vm._isDestroyed = true;
// invoke destroy hooks on current rendered tree
vm.__patch__(vm._vnode, null);
// fire destroyed hook
callHook(vm, "destroyed");
// turn off all instance listeners.
vm.$off();
// remove __vue__ reference
if (vm.$el) {
vm.$el.__vue__ = null;
}
// release circular reference (#6759)
if (vm.$vnode) {
vm.$vnode.parent = null;
}
};
}
function mountComponent(vm, el, hydrating) {
vm.$el = el;
if (!vm.$options.render) {
vm.$options.render = createEmptyVNode;
{
/* istanbul ignore if */
if ((vm.$options.template && vm.$options.template.charAt(0) !== "#") || vm.$options.el || el) {
warn(
"You are using the runtime-only build of Vue where the template " +
"compiler is not available. Either pre-compile the templates into " +
"render functions, or use the compiler-included build.",
vm
);
} else {
warn("Failed to mount component: template or render function not defined.", vm);
}
}
}
callHook(vm, "beforeMount");
var updateComponent;
/* istanbul ignore if */
if ("development" !== "production" && config.performance && mark) {
updateComponent = function() {
var name = vm._name;
var id = vm._uid;
var startTag = "vue-perf-start:" + id;
var endTag = "vue-perf-end:" + id;
mark(startTag);
var vnode = vm._render();
mark(endTag);
measure("vue " + name + " render", startTag, endTag);
mark(startTag);
vm._update(vnode, hydrating);
mark(endTag);
measure("vue " + name + " patch", startTag, endTag);
};
} else {
updateComponent = function() {
vm._update(vm._render(), hydrating);
};
}
// we set this to vm._watcher inside the watcher's constructor
// since the watcher's initial patch may call $forceUpdate (e.g. inside child
// component's mounted hook), which relies on vm._watcher being already defined
new Watcher(vm, updateComponent, noop, null, true /* isRenderWatcher */);
hydrating = false;
// manually mounted instance, call mounted on self
// mounted is called for render-created child components in its inserted hook
if (vm.$vnode == null) {
vm._isMounted = true;
callHook(vm, "mounted");
}
return vm;
}
function updateChildComponent(vm, propsData, listeners, parentVnode, renderChildren) {
{
isUpdatingChildComponent = true;
}
// determine whether component has slot children
// we need to do this before overwriting $options._renderChildren
var hasChildren = !!(
renderChildren || // has new static slots
vm.$options._renderChildren || // has old static slots
parentVnode.data.scopedSlots || // has new scoped slots
vm.$scopedSlots !== emptyObject
); // has old scoped slots
vm.$options._parentVnode = parentVnode;
vm.$vnode = parentVnode; // update vm's placeholder node without re-render
if (vm._vnode) {
// update child tree's parent
vm._vnode.parent = parentVnode;
}
vm.$options._renderChildren = renderChildren;
// update $attrs and $listeners hash
// these are also reactive so they may trigger child update if the child
// used them during render
vm.$attrs = parentVnode.data.attrs || emptyObject;
vm.$listeners = listeners || emptyObject;
// update props
if (propsData && vm.$options.props) {
toggleObserving(false);
var props = vm._props;
var propKeys = vm.$options._propKeys || [];
for (var i = 0; i < propKeys.length; i++) {
var key = propKeys[i];
var propOptions = vm.$options.props; // wtf flow?
props[key] = validateProp(key, propOptions, propsData, vm);
}
toggleObserving(true);
// keep a copy of raw propsData
vm.$options.propsData = propsData;
}
// update listeners
listeners = listeners || emptyObject;
var oldListeners = vm.$options._parentListeners;
vm.$options._parentListeners = listeners;
updateComponentListeners(vm, listeners, oldListeners);
// resolve slots + force update if has children
if (hasChildren) {
vm.$slots = resolveSlots(renderChildren, parentVnode.context);
vm.$forceUpdate();
}
{
isUpdatingChildComponent = false;
}
}
function isInInactiveTree(vm) {
while (vm && (vm = vm.$parent)) {
if (vm._inactive) {
return true;
}
}
return false;
}
function activateChildComponent(vm, direct) {
if (direct) {
vm._directInactive = false;
if (isInInactiveTree(vm)) {
return;
}
} else if (vm._directInactive) {
return;
}
if (vm._inactive || vm._inactive === null) {
vm._inactive = false;
for (var i = 0; i < vm.$children.length; i++) {
activateChildComponent(vm.$children[i]);
}
callHook(vm, "activated");
}
}
function deactivateChildComponent(vm, direct) {
if (direct) {
vm._directInactive = true;
if (isInInactiveTree(vm)) {
return;
}
}
if (!vm._inactive) {
vm._inactive = true;
for (var i = 0; i < vm.$children.length; i++) {
deactivateChildComponent(vm.$children[i]);
}
callHook(vm, "deactivated");
}
}
function callHook(vm, hook) {
// #7573 disable dep collection when invoking lifecycle hooks
pushTarget();
var handlers = vm.$options[hook];
if (handlers) {
for (var i = 0, j = handlers.length; i < j; i++) {
try {
handlers[i].call(vm);
} catch (e) {
handleError(e, vm, hook + " hook");
}
}
}
if (vm._hasHookEvent) {
vm.$emit("hook:" + hook);
}
popTarget();
}
/* */
var MAX_UPDATE_COUNT = 100;
var queue = [];
var activatedChildren = [];
var has = {};
var circular = {};
var waiting = false;
var flushing = false;
var index = 0;
/**
* Reset the scheduler's state.
*/
function resetSchedulerState() {
index = queue.length = activatedChildren.length = 0;
has = {};
{
circular = {};
}
waiting = flushing = false;
}
/**
* Flush both queues and run the watchers.
*/
function flushSchedulerQueue() {
flushing = true;
var watcher, id;
// Sort queue before flush.
// This ensures that:
// 1. Components are updated from parent to child. (because parent is always
// created before the child)
// 2. A component's user watchers are run before its render watcher (because
// user watchers are created before the render watcher)
// 3. If a component is destroyed during a parent component's watcher run,
// its watchers can be skipped.
queue.sort(function(a, b) {
return a.id - b.id;
});
// do not cache length because more watchers might be pushed
// as we run existing watchers
for (index = 0; index < queue.length; index++) {
watcher = queue[index];
id = watcher.id;
has[id] = null;
watcher.run();
// in dev build, check and stop circular updates.
if ("development" !== "production" && has[id] != null) {
circular[id] = (circular[id] || 0) + 1;
if (circular[id] > MAX_UPDATE_COUNT) {
warn(
"You may have an infinite update loop " +
(watcher.user
? 'in watcher with expression "' + watcher.expression + '"'
: "in a component render function."),
watcher.vm
);
break;
}
}
}
// keep copies of post queues before resetting state
var activatedQueue = activatedChildren.slice();
var updatedQueue = queue.slice();
resetSchedulerState();
// call component updated and activated hooks
callActivatedHooks(activatedQueue);
callUpdatedHooks(updatedQueue);
// devtool hook
/* istanbul ignore if */
if (devtools && config.devtools) {
devtools.emit("flush");
}
}
function callUpdatedHooks(queue) {
var i = queue.length;
while (i--) {
var watcher = queue[i];
var vm = watcher.vm;
if (vm._watcher === watcher && vm._isMounted) {
callHook(vm, "updated");
}
}
}
/**
* Queue a kept-alive component that was activated during patch.
* The queue will be processed after the entire tree has been patched.
*/
function queueActivatedComponent(vm) {
// setting _inactive to false here so that a render function can
// rely on checking whether it's in an inactive tree (e.g. router-view)
vm._inactive = false;
activatedChildren.push(vm);
}
function callActivatedHooks(queue) {
for (var i = 0; i < queue.length; i++) {
queue[i]._inactive = true;
activateChildComponent(queue[i], true /* true */);
}
}
/**
* Push a watcher into the watcher queue.
* Jobs with duplicate IDs will be skipped unless it's
* pushed when the queue is being flushed.
*/
function queueWatcher(watcher) {
var id = watcher.id;
if (has[id] == null) {
has[id] = true;
if (!flushing) {
queue.push(watcher);
} else {
// if already flushing, splice the watcher based on its id
// if already past its id, it will be run next immediately.
var i = queue.length - 1;
while (i > index && queue[i].id > watcher.id) {
i--;
}
queue.splice(i + 1, 0, watcher);
}
// queue the flush
if (!waiting) {
waiting = true;
nextTick(flushSchedulerQueue);
}
}
}
/* */
var uid$1 = 0;
/**
* A watcher parses an expression, collects dependencies,
* and fires callback when the expression value changes.
* This is used for both the $watch() api and directives.
*/
var Watcher = function Watcher(vm, expOrFn, cb, options, isRenderWatcher) {
this.vm = vm;
if (isRenderWatcher) {
vm._watcher = this;
}
vm._watchers.push(this);
// options
if (options) {
this.deep = !!options.deep;
this.user = !!options.user;
this.lazy = !!options.lazy;
this.sync = !!options.sync;
} else {
this.deep = this.user = this.lazy = this.sync = false;
}
this.cb = cb;
this.id = ++uid$1; // uid for batching
this.active = true;
this.dirty = this.lazy; // for lazy watchers
this.deps = [];
this.newDeps = [];
this.depIds = new _Set();
this.newDepIds = new _Set();
this.expression = expOrFn.toString();
// parse expression for getter
if (typeof expOrFn === "function") {
this.getter = expOrFn;
} else {
this.getter = parsePath(expOrFn);
if (!this.getter) {
this.getter = function() {};
"development" !== "production" &&
warn(
'Failed watching path: "' +
expOrFn +
'" ' +
"Watcher only accepts simple dot-delimited paths. " +
"For full control, use a function instead.",
vm
);
}
}
this.value = this.lazy ? undefined : this.get();
};
/**
* Evaluate the getter, and re-collect dependencies.
*/
Watcher.prototype.get = function get() {
pushTarget(this);
var value;
var vm = this.vm;
try {
value = this.getter.call(vm, vm);
} catch (e) {
if (this.user) {
handleError(e, vm, 'getter for watcher "' + this.expression + '"');
} else {
throw e;
}
} finally {
// "touch" every property so they are all tracked as
// dependencies for deep watching
if (this.deep) {
traverse(value);
}
popTarget();
this.cleanupDeps();
}
return value;
};
/**
* Add a dependency to this directive.
*/
Watcher.prototype.addDep = function addDep(dep) {
var id = dep.id;
if (!this.newDepIds.has(id)) {
this.newDepIds.add(id);
this.newDeps.push(dep);
if (!this.depIds.has(id)) {
dep.addSub(this);
}
}
};
/**
* Clean up for dependency collection.
*/
Watcher.prototype.cleanupDeps = function cleanupDeps() {
var this$1 = this;
var i = this.deps.length;
while (i--) {
var dep = this$1.deps[i];
if (!this$1.newDepIds.has(dep.id)) {
dep.removeSub(this$1);
}
}
var tmp = this.depIds;
this.depIds = this.newDepIds;
this.newDepIds = tmp;
this.newDepIds.clear();
tmp = this.deps;
this.deps = this.newDeps;
this.newDeps = tmp;
this.newDeps.length = 0;
};
/**
* Subscriber interface.
* Will be called when a dependency changes.
*/
Watcher.prototype.update = function update() {
/* istanbul ignore else */
if (this.lazy) {
this.dirty = true;
} else if (this.sync) {
this.run();
} else {
queueWatcher(this);
}
};
/**
* Scheduler job interface.
* Will be called by the scheduler.
*/
Watcher.prototype.run = function run() {
if (this.active) {
var value = this.get();
if (
value !== this.value ||
// Deep watchers and watchers on Object/Arrays should fire even
// when the value is the same, because the value may
// have mutated.
isObject(value) ||
this.deep
) {
// set new value
var oldValue = this.value;
this.value = value;
if (this.user) {
try {
this.cb.call(this.vm, value, oldValue);
} catch (e) {
handleError(e, this.vm, 'callback for watcher "' + this.expression + '"');
}
} else {
this.cb.call(this.vm, value, oldValue);
}
}
}
};
/**
* Evaluate the value of the watcher.
* This only gets called for lazy watchers.
*/
Watcher.prototype.evaluate = function evaluate() {
this.value = this.get();
this.dirty = false;
};
/**
* Depend on all deps collected by this watcher.
*/
Watcher.prototype.depend = function depend() {
var this$1 = this;
var i = this.deps.length;
while (i--) {
this$1.deps[i].depend();
}
};
/**
* Remove self from all dependencies' subscriber list.
*/
Watcher.prototype.teardown = function teardown() {
var this$1 = this;
if (this.active) {
// remove self from vm's watcher list
// this is a somewhat expensive operation so we skip it
// if the vm is being destroyed.
if (!this.vm._isBeingDestroyed) {
remove(this.vm._watchers, this);
}
var i = this.deps.length;
while (i--) {
this$1.deps[i].removeSub(this$1);
}
this.active = false;
}
};
/* */
var sharedPropertyDefinition = {
enumerable: true,
configurable: true,
get: noop,
set: noop
};
function proxy(target, sourceKey, key) {
sharedPropertyDefinition.get = function proxyGetter() {
return this[sourceKey][key];
};
sharedPropertyDefinition.set = function proxySetter(val) {
this[sourceKey][key] = val;
};
Object.defineProperty(target, key, sharedPropertyDefinition);
}
function initState(vm) {
vm._watchers = [];
var opts = vm.$options;
if (opts.props) {
initProps(vm, opts.props);
}
if (opts.methods) {
initMethods(vm, opts.methods);
}
if (opts.data) {
initData(vm);
} else {
observe((vm._data = {}), true /* asRootData */);
}
if (opts.computed) {
initComputed(vm, opts.computed);
}
if (opts.watch && opts.watch !== nativeWatch) {
initWatch(vm, opts.watch);
}
}
function initProps(vm, propsOptions) {
var propsData = vm.$options.propsData || {};
var props = (vm._props = {});
// cache prop keys so that future props updates can iterate using Array
// instead of dynamic object key enumeration.
var keys = (vm.$options._propKeys = []);
var isRoot = !vm.$parent;
// root instance props should be converted
if (!isRoot) {
toggleObserving(false);
}
var loop = function(key) {
keys.push(key);
var value = validateProp(key, propsOptions, propsData, vm);
/* istanbul ignore else */
{
var hyphenatedKey = hyphenate(key);
if (isReservedAttribute(hyphenatedKey) || config.isReservedAttr(hyphenatedKey)) {
warn('"' + hyphenatedKey + '" is a reserved attribute and cannot be used as component prop.', vm);
}
defineReactive(props, key, value, function() {
if (vm.$parent && !isUpdatingChildComponent) {
warn(
"Avoid mutating a prop directly since the value will be " +
"overwritten whenever the parent component re-renders. " +
"Instead, use a data or computed property based on the prop's " +
'value. Prop being mutated: "' +
key +
'"',
vm
);
}
});
}
// static props are already proxied on the component's prototype
// during Vue.extend(). We only need to proxy props defined at
// instantiation here.
if (!(key in vm)) {
proxy(vm, "_props", key);
}
};
for (var key in propsOptions) loop(key);
toggleObserving(true);
}
function initData(vm) {
var data = vm.$options.data;
data = vm._data = typeof data === "function" ? getData(data, vm) : data || {};
if (!isPlainObject(data)) {
data = {};
"development" !== "production" &&
warn(
"data functions should return an object:\n" +
"https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function",
vm
);
}
// proxy data on instance
var keys = Object.keys(data);
var props = vm.$options.props;
var methods = vm.$options.methods;
var i = keys.length;
while (i--) {
var key = keys[i];
{
if (methods && hasOwn(methods, key)) {
warn('Method "' + key + '" has already been defined as a data property.', vm);
}
}
if (props && hasOwn(props, key)) {
"development" !== "production" &&
warn(
'The data property "' + key + '" is already declared as a prop. ' + "Use prop default value instead.",
vm
);
} else if (!isReserved(key)) {
proxy(vm, "_data", key);
}
}
// observe data
observe(data, true /* asRootData */);
}
function getData(data, vm) {
// #7573 disable dep collection when invoking data getters
pushTarget();
try {
return data.call(vm, vm);
} catch (e) {
handleError(e, vm, "data()");
return {};
} finally {
popTarget();
}
}
var computedWatcherOptions = { lazy: true };
function initComputed(vm, computed) {
// $flow-disable-line
var watchers = (vm._computedWatchers = Object.create(null));
// computed properties are just getters during SSR
var isSSR = isServerRendering();
for (var key in computed) {
var userDef = computed[key];
var getter = typeof userDef === "function" ? userDef : userDef.get;
if ("development" !== "production" && getter == null) {
warn('Getter is missing for computed property "' + key + '".', vm);
}
if (!isSSR) {
// create internal watcher for the computed property.
watchers[key] = new Watcher(vm, getter || noop, noop, computedWatcherOptions);
}
// component-defined computed properties are already defined on the
// component prototype. We only need to define computed properties defined
// at instantiation here.
if (!(key in vm)) {
defineComputed(vm, key, userDef);
} 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) {
warn('The computed property "' + key + '" is already defined as a prop.', vm);
}
}
}
}
function defineComputed(target, key, userDef) {
var shouldCache = !isServerRendering();
if (typeof userDef === "function") {
sharedPropertyDefinition.get = shouldCache ? createComputedGetter(key) : userDef;
sharedPropertyDefinition.set = noop;
} else {
sharedPropertyDefinition.get = userDef.get
? shouldCache && userDef.cache !== false
? createComputedGetter(key)
: userDef.get
: noop;
sharedPropertyDefinition.set = userDef.set ? userDef.set : noop;
}
if ("development" !== "production" && sharedPropertyDefinition.set === noop) {
sharedPropertyDefinition.set = function() {
warn('Computed property "' + key + '" was assigned to but it has no setter.', this);
};
}
Object.defineProperty(target, key, sharedPropertyDefinition);
}
function createComputedGetter(key) {
return function computedGetter() {
var watcher = this._computedWatchers && this._computedWatchers[key];
if (watcher) {
if (watcher.dirty) {
watcher.evaluate();
}
if (Dep.target) {
watcher.depend();
}
return watcher.value;
}
};
}
function initMethods(vm, methods) {
var props = vm.$options.props;
for (var key in methods) {
{
if (methods[key] == null) {
warn(
'Method "' +
key +
'" has an undefined value in the component definition. ' +
"Did you reference the function correctly?",
vm
);
}
if (props && hasOwn(props, key)) {
warn('Method "' + key + '" has already been defined as a prop.', vm);
}
if (key in vm && isReserved(key)) {
warn(
'Method "' +
key +
'" conflicts with an existing Vue instance method. ' +
"Avoid defining component methods that start with _ or $."
);
}
}
vm[key] = methods[key] == null ? noop : bind(methods[key], vm);
}
}
function initWatch(vm, watch) {
for (var key in watch) {
var handler = watch[key];
if (Array.isArray(handler)) {
for (var i = 0; i < handler.length; i++) {
createWatcher(vm, key, handler[i]);
}
} else {
createWatcher(vm, key, handler);
}
}
}
function createWatcher(vm, expOrFn, handler, options) {
if (isPlainObject(handler)) {
options = handler;
handler = handler.handler;
}
if (typeof handler === "string") {
handler = vm[handler];
}
return vm.$watch(expOrFn, handler, options);
}
function stateMixin(Vue) {
// flow somehow has problems with directly declared definition object
// when using Object.defineProperty, so we have to procedurally build up
// the object here.
var dataDef = {};
dataDef.get = function() {
return this._data;
};
var propsDef = {};
propsDef.get = function() {
return this._props;
};
{
dataDef.set = function(newData) {
warn("Avoid replacing instance root $data. " + "Use nested data properties instead.", this);
};
propsDef.set = function() {
warn("$props is readonly.", this);
};
}
Object.defineProperty(Vue.prototype, "$data", dataDef);
Object.defineProperty(Vue.prototype, "$props", propsDef);
Vue.prototype.$set = set;
Vue.prototype.$delete = del;
Vue.prototype.$watch = function(expOrFn, cb, options) {
var vm = this;
if (isPlainObject(cb)) {
return createWatcher(vm, expOrFn, cb, options);
}
options = options || {};
options.user = true;
var watcher = new Watcher(vm, expOrFn, cb, options);
if (options.immediate) {
cb.call(vm, watcher.value);
}
return function unwatchFn() {
watcher.teardown();
};
};
}
/* */
function initProvide(vm) {
var provide = vm.$options.provide;
if (provide) {
vm._provided = typeof provide === "function" ? provide.call(vm) : provide;
}
}
function initInjections(vm) {
var result = resolveInject(vm.$options.inject, vm);
if (result) {
toggleObserving(false);
Object.keys(result).forEach(function(key) {
/* istanbul ignore else */
{
defineReactive(vm, key, result[key], function() {
warn(
"Avoid mutating an injected value directly since the changes will be " +
"overwritten whenever the provided component re-renders. " +
'injection being mutated: "' +
key +
'"',
vm
);
});
}
});
toggleObserving(true);
}
}
function resolveInject(inject, vm) {
if (inject) {
// inject is :any because flow is not smart enough to figure out cached
var result = Object.create(null);
var keys = hasSymbol
? Reflect.ownKeys(inject).filter(function(key) {
/* istanbul ignore next */
return Object.getOwnPropertyDescriptor(inject, key).enumerable;
})
: Object.keys(inject);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
var provideKey = inject[key].from;
var source = vm;
while (source) {
if (source._provided && hasOwn(source._provided, provideKey)) {
result[key] = source._provided[provideKey];
break;
}
source = source.$parent;
}
if (!source) {
if ("default" in inject[key]) {
var provideDefault = inject[key].default;
result[key] = typeof provideDefault === "function" ? provideDefault.call(vm) : provideDefault;
} else {
warn('Injection "' + key + '" not found', vm);
}
}
}
return result;
}
}
/* */
/**
* Runtime helper for rendering v-for lists.
*/
function renderList(val, render) {
var ret, i, l, keys, key;
if (Array.isArray(val) || typeof val === "string") {
ret = new Array(val.length);
for (i = 0, l = val.length; i < l; i++) {
ret[i] = render(val[i], i);
}
} else if (typeof val === "number") {
ret = new Array(val);
for (i = 0; i < val; i++) {
ret[i] = render(i + 1, i);
}
} else if (isObject(val)) {
keys = Object.keys(val);
ret = new Array(keys.length);
for (i = 0, l = keys.length; i < l; i++) {
key = keys[i];
ret[i] = render(val[key], key, i);
}
}
if (isDef(ret)) {
ret._isVList = true;
}
return ret;
}
/* */
/**
* Runtime helper for rendering <slot>
*/
function renderSlot(name, fallback, props, bindObject) {
var scopedSlotFn = this.$scopedSlots[name];
var nodes;
if (scopedSlotFn) {
// scoped slot
props = props || {};
if (bindObject) {
if ("development" !== "production" && !isObject(bindObject)) {
warn("slot v-bind without argument expects an Object", this);
}
props = extend(extend({}, bindObject), props);
}
nodes = scopedSlotFn(props) || fallback;
} else {
var slotNodes = this.$slots[name];
// warn duplicate slot usage
if (slotNodes) {
if ("development" !== "production" && slotNodes._rendered) {
warn(
'Duplicate presence of slot "' +
name +
'" found in the same render tree ' +
"- this will likely cause render errors.",
this
);
}
slotNodes._rendered = true;
}
nodes = slotNodes || fallback;
}
var target = props && props.slot;
if (target) {
return this.$createElement("template", { slot: target }, nodes);
} else {
return nodes;
}
}
/* */
/**
* Runtime helper for resolving filters
*/
function resolveFilter(id) {
return resolveAsset(this.$options, "filters", id, true) || identity;
}
/* */
function isKeyNotMatch(expect, actual) {
if (Array.isArray(expect)) {
return expect.indexOf(actual) === -1;
} else {
return expect !== actual;
}
}
/**
* Runtime helper for checking keyCodes from config.
* exposed as Vue.prototype._k
* passing in eventKeyName as last argument separately for backwards compat
*/
function checkKeyCodes(eventKeyCode, key, builtInKeyCode, eventKeyName, builtInKeyName) {
var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;
if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {
return isKeyNotMatch(builtInKeyName, eventKeyName);
} else if (mappedKeyCode) {
return isKeyNotMatch(mappedKeyCode, eventKeyCode);
} else if (eventKeyName) {
return hyphenate(eventKeyName) !== key;
}
}
/* */
/**
* Runtime helper for merging v-bind="object" into a VNode's data.
*/
function bindObjectProps(data, tag, value, asProp, isSync) {
if (value) {
if (!isObject(value)) {
"development" !== "production" && warn("v-bind without argument expects an Object or Array value", this);
} else {
if (Array.isArray(value)) {
value = toObject(value);
}
var hash;
var loop = function(key) {
if (key === "class" || key === "style" || isReservedAttribute(key)) {
hash = data;
} else {
var type = data.attrs && data.attrs.type;
hash =
asProp || config.mustUseProp(tag, type, key)
? data.domProps || (data.domProps = {})
: data.attrs || (data.attrs = {});
}
if (!(key in hash)) {
hash[key] = value[key];
if (isSync) {
var on = data.on || (data.on = {});
on["update:" + key] = function($event) {
value[key] = $event;
};
}
}
};
for (var key in value) loop(key);
}
}
return data;
}
/* */
/**
* Runtime helper for rendering static trees.
*/
function renderStatic(index, isInFor) {
var cached = this._staticTrees || (this._staticTrees = []);
var tree = cached[index];
// if has already-rendered static tree and not inside v-for,
// we can reuse the same tree.
if (tree && !isInFor) {
return tree;
}
// otherwise, render a fresh tree.
tree = cached[index] = this.$options.staticRenderFns[index].call(
this._renderProxy,
null,
this // for render fns generated for functional component templates
);
markStatic(tree, "__static__" + index, false);
return tree;
}
/**
* Runtime helper for v-once.
* Effectively it means marking the node as static with a unique key.
*/
function markOnce(tree, index, key) {
markStatic(tree, "__once__" + index + (key ? "_" + key : ""), true);
return tree;
}
function markStatic(tree, key, isOnce) {
if (Array.isArray(tree)) {
for (var i = 0; i < tree.length; i++) {
if (tree[i] && typeof tree[i] !== "string") {
markStaticNode(tree[i], key + "_" + i, isOnce);
}
}
} else {
markStaticNode(tree, key, isOnce);
}
}
function markStaticNode(node, key, isOnce) {
node.isStatic = true;
node.key = key;
node.isOnce = isOnce;
}
/* */
function bindObjectListeners(data, value) {
if (value) {
if (!isPlainObject(value)) {
"development" !== "production" && warn("v-on without argument expects an Object value", this);
} else {
var on = (data.on = data.on ? extend({}, data.on) : {});
for (var key in value) {
var existing = on[key];
var ours = value[key];
on[key] = existing ? [].concat(existing, ours) : ours;
}
}
}
return data;
}
/* */
function installRenderHelpers(target) {
target._o = markOnce;
target._n = toNumber;
target._s = toString;
target._l = renderList;
target._t = renderSlot;
target._q = looseEqual;
target._i = looseIndexOf;
target._m = renderStatic;
target._f = resolveFilter;
target._k = checkKeyCodes;
target._b = bindObjectProps;
target._v = createTextVNode;
target._e = createEmptyVNode;
target._u = resolveScopedSlots;
target._g = bindObjectListeners;
}
/* */
function FunctionalRenderContext(data, props, children, parent, Ctor) {
var options = Ctor.options;
// ensure the createElement function in functional components
// gets a unique context - this is necessary for correct named slot check
var contextVm;
if (hasOwn(parent, "_uid")) {
contextVm = Object.create(parent);
// $flow-disable-line
contextVm._original = parent;
} else {
// the context vm passed in is a functional context as well.
// in this case we want to make sure we are able to get a hold to the
// real context instance.
contextVm = parent;
// $flow-disable-line
parent = parent._original;
}
var isCompiled = isTrue(options._compiled);
var needNormalization = !isCompiled;
this.data = data;
this.props = props;
this.children = children;
this.parent = parent;
this.listeners = data.on || emptyObject;
this.injections = resolveInject(options.inject, parent);
this.slots = function() {
return resolveSlots(children, parent);
};
// support for compiled functional template
if (isCompiled) {
// exposing $options for renderStatic()
this.$options = options;
// pre-resolve slots for renderSlot()
this.$slots = this.slots();
this.$scopedSlots = data.scopedSlots || emptyObject;
}
if (options._scopeId) {
this._c = function(a, b, c, d) {
var vnode = createElement(contextVm, a, b, c, d, needNormalization);
if (vnode && !Array.isArray(vnode)) {
vnode.fnScopeId = options._scopeId;
vnode.fnContext = parent;
}
return vnode;
};
} else {
this._c = function(a, b, c, d) {
return createElement(contextVm, a, b, c, d, needNormalization);
};
}
}
installRenderHelpers(FunctionalRenderContext.prototype);
function createFunctionalComponent(Ctor, propsData, data, contextVm, children) {
var options = Ctor.options;
var props = {};
var propOptions = options.props;
if (isDef(propOptions)) {
for (var key in propOptions) {
props[key] = validateProp(key, propOptions, propsData || emptyObject);
}
} else {
if (isDef(data.attrs)) {
mergeProps(props, data.attrs);
}
if (isDef(data.props)) {
mergeProps(props, data.props);
}
}
var renderContext = new FunctionalRenderContext(data, props, children, contextVm, Ctor);
var vnode = options.render.call(null, renderContext._c, renderContext);
if (vnode instanceof VNode) {
return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options);
} else if (Array.isArray(vnode)) {
var vnodes = normalizeChildren(vnode) || [];
var res = new Array(vnodes.length);
for (var i = 0; i < vnodes.length; i++) {
res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options);
}
return res;
}
}
function cloneAndMarkFunctionalResult(vnode, data, contextVm, options) {
// #7817 clone node before setting fnContext, otherwise if the node is reused
// (e.g. it was from a cached normal slot) the fnContext causes named slots
// that should not be matched to match.
var clone = cloneVNode(vnode);
clone.fnContext = contextVm;
clone.fnOptions = options;
if (data.slot) {
(clone.data || (clone.data = {})).slot = data.slot;
}
return clone;
}
function mergeProps(to, from) {
for (var key in from) {
to[camelize(key)] = from[key];
}
}
/* */
// Register the component hook to weex native render engine.
// The hook will be triggered by native, not javascript.
// Updates the state of the component to weex native render engine.
/* */
// https://github.com/Hanks10100/weex-native-directive/tree/master/component
// listening on native callback
/* */
/* */
// inline hooks to be invoked on component VNodes during patch
var componentVNodeHooks = {
init: function init(vnode, hydrating, parentElm, refElm) {
if (vnode.componentInstance && !vnode.componentInstance._isDestroyed && vnode.data.keepAlive) {
// kept-alive components, treat as a patch
var mountedNode = vnode; // work around flow
componentVNodeHooks.prepatch(mountedNode, mountedNode);
} else {
var child = (vnode.componentInstance = createComponentInstanceForVnode(
vnode,
activeInstance,
parentElm,
refElm
));
child.$mount(hydrating ? vnode.elm : undefined, hydrating);
}
},
prepatch: function prepatch(oldVnode, vnode) {
var options = vnode.componentOptions;
var child = (vnode.componentInstance = oldVnode.componentInstance);
updateChildComponent(
child,
options.propsData, // updated props
options.listeners, // updated listeners
vnode, // new parent vnode
options.children // new children
);
},
insert: function insert(vnode) {
var context = vnode.context;
var componentInstance = vnode.componentInstance;
if (!componentInstance._isMounted) {
componentInstance._isMounted = true;
callHook(componentInstance, "mounted");
}
if (vnode.data.keepAlive) {
if (context._isMounted) {
// vue-router#1212
// During updates, a kept-alive component's child components may
// change, so directly walking the tree here may call activated hooks
// on incorrect children. Instead we push them into a queue which will
// be processed after the whole patch process ended.
queueActivatedComponent(componentInstance);
} else {
activateChildComponent(componentInstance, true /* direct */);
}
}
},
destroy: function destroy(vnode) {
var componentInstance = vnode.componentInstance;
if (!componentInstance._isDestroyed) {
if (!vnode.data.keepAlive) {
componentInstance.$destroy();
} else {
deactivateChildComponent(componentInstance, true /* direct */);
}
}
}
};
var hooksToMerge = Object.keys(componentVNodeHooks);
function createComponent(Ctor, data, context, children, tag) {
if (isUndef(Ctor)) {
return;
}
var baseCtor = context.$options._base;
// plain options object: turn it into a constructor
if (isObject(Ctor)) {
Ctor = baseCtor.extend(Ctor);
}
// if at this stage it's not a constructor or an async component factory,
// reject.
if (typeof Ctor !== "function") {
{
warn("Invalid Component definition: " + String(Ctor), context);
}
return;
}
// async component
var asyncFactory;
if (isUndef(Ctor.cid)) {
asyncFactory = Ctor;
Ctor = resolveAsyncComponent(asyncFactory, baseCtor, context);
if (Ctor === undefined) {
// return a placeholder node for async component, which is rendered
// as a comment node but preserves all the raw information for the node.
// the information will be used for async server-rendering and hydration.
return createAsyncPlaceholder(asyncFactory, data, context, children, tag);
}
}
data = data || {};
// resolve constructor options in case global mixins are applied after
// component constructor creation
resolveConstructorOptions(Ctor);
// transform component v-model data into props & events
if (isDef(data.model)) {
transformModel(Ctor.options, data);
}
// extract props
var propsData = extractPropsFromVNodeData(data, Ctor, tag);
// functional component
if (isTrue(Ctor.options.functional)) {
return createFunctionalComponent(Ctor, propsData, data, context, children);
}
// extract listeners, since these needs to be treated as
// child component listeners instead of DOM listeners
var listeners = data.on;
// replace with listeners with .native modifier
// so it gets processed during parent component patch.
data.on = data.nativeOn;
if (isTrue(Ctor.options.abstract)) {
// abstract components do not keep anything
// other than props & listeners & slot
// work around flow
var slot = data.slot;
data = {};
if (slot) {
data.slot = slot;
}
}
// install component management hooks onto the placeholder node
installComponentHooks(data);
// return a placeholder vnode
var name = Ctor.options.name || tag;
var vnode = new VNode(
"vue-component-" + Ctor.cid + (name ? "-" + name : ""),
data,
undefined,
undefined,
undefined,
context,
{ Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },
asyncFactory
);
// Weex specific: invoke recycle-list optimized @render function for
// extracting cell-slot template.
// https://github.com/Hanks10100/weex-native-directive/tree/master/component
/* istanbul ignore if */
return vnode;
}
function createComponentInstanceForVnode(
vnode, // we know it's MountedComponentVNode but flow doesn't
parent, // activeInstance in lifecycle state
parentElm,
refElm
) {
var options = {
_isComponent: true,
parent: parent,
_parentVnode: vnode,
_parentElm: parentElm || null,
_refElm: refElm || null
};
// check inline-template render functions
var inlineTemplate = vnode.data.inlineTemplate;
if (isDef(inlineTemplate)) {
options.render = inlineTemplate.render;
options.staticRenderFns = inlineTemplate.staticRenderFns;
}
return new vnode.componentOptions.Ctor(options);
}
function installComponentHooks(data) {
var hooks = data.hook || (data.hook = {});
for (var i = 0; i < hooksToMerge.length; i++) {
var key = hooksToMerge[i];
hooks[key] = componentVNodeHooks[key];
}
}
// transform component v-model info (value and callback) into
// prop and event handler respectively.
function transformModel(options, data) {
var prop = (options.model && options.model.prop) || "value";
var event = (options.model && options.model.event) || "input";
(data.props || (data.props = {}))[prop] = data.model.value;
var on = data.on || (data.on = {});
if (isDef(on[event])) {
on[event] = [data.model.callback].concat(on[event]);
} else {
on[event] = data.model.callback;
}
}
/* */
var SIMPLE_NORMALIZE = 1;
var ALWAYS_NORMALIZE = 2;
// wrapper function for providing a more flexible interface
// without getting yelled at by flow
function createElement(context, tag, data, children, normalizationType, alwaysNormalize) {
if (Array.isArray(data) || isPrimitive(data)) {
normalizationType = children;
children = data;
data = undefined;
}
if (isTrue(alwaysNormalize)) {
normalizationType = ALWAYS_NORMALIZE;
}
return _createElement(context, tag, data, children, normalizationType);
}
function _createElement(context, tag, data, children, normalizationType) {
if (isDef(data) && isDef(data.__ob__)) {
"development" !== "production" &&
warn(
"Avoid using observed data object as vnode data: " +
JSON.stringify(data) +
"\n" +
"Always create fresh vnode data objects in each render!",
context
);
return createEmptyVNode();
}
// object syntax in v-bind
if (isDef(data) && isDef(data.is)) {
tag = data.is;
}
if (!tag) {
// in case of component :is set to falsy value
return createEmptyVNode();
}
// warn against non-primitive key
if ("development" !== "production" && isDef(data) && isDef(data.key) && !isPrimitive(data.key)) {
{
warn("Avoid using non-primitive value as key, " + "use string/number value instead.", context);
}
}
// support single function children as default scoped slot
if (Array.isArray(children) && typeof children[0] === "function") {
data = data || {};
data.scopedSlots = { default: children[0] };
children.length = 0;
}
if (normalizationType === ALWAYS_NORMALIZE) {
children = normalizeChildren(children);
} else if (normalizationType === SIMPLE_NORMALIZE) {
children = simpleNormalizeChildren(children);
}
var vnode, ns;
if (typeof tag === "string") {
var Ctor;
ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);
if (config.isReservedTag(tag)) {
// platform built-in elements
vnode = new VNode(config.parsePlatformTagName(tag), data, children, undefined, undefined, context);
} else if (isDef((Ctor = resolveAsset(context.$options, "components", tag)))) {
// component
vnode = createComponent(Ctor, data, context, children, tag);
} else {
// unknown or unlisted namespaced elements
// check at runtime because it may get assigned a namespace when its
// parent normalizes children
vnode = new VNode(tag, data, children, undefined, undefined, context);
}
} else {
// direct component options / constructor
vnode = createComponent(tag, data, context, children);
}
if (Array.isArray(vnode)) {
return vnode;
} else if (isDef(vnode)) {
if (isDef(ns)) {
applyNS(vnode, ns);
}
if (isDef(data)) {
registerDeepBindings(data);
}
return vnode;
} else {
return createEmptyVNode();
}
}
function applyNS(vnode, ns, force) {
vnode.ns = ns;
if (vnode.tag === "foreignObject") {
// use default namespace inside foreignObject
ns = undefined;
force = true;
}
if (isDef(vnode.children)) {
for (var i = 0, l = vnode.children.length; i < l; i++) {
var child = vnode.children[i];
if (isDef(child.tag) && (isUndef(child.ns) || (isTrue(force) && child.tag !== "svg"))) {
applyNS(child, ns, force);
}
}
}
}
// ref #5318
// necessary to ensure parent re-render when deep bindings like :style and
// :class are used on slot nodes
function registerDeepBindings(data) {
if (isObject(data.style)) {
traverse(data.style);
}
if (isObject(data.class)) {
traverse(data.class);
}
}
/* */
function initRender(vm) {
vm._vnode = null; // the root of the child tree
vm._staticTrees = null; // v-once cached trees
var options = vm.$options;
var parentVnode = (vm.$vnode = options._parentVnode); // the placeholder node in parent tree
var renderContext = parentVnode && parentVnode.context;
vm.$slots = resolveSlots(options._renderChildren, renderContext);
vm.$scopedSlots = emptyObject;
// bind the createElement fn to this instance
// so that we get proper render context inside it.
// args order: tag, data, children, normalizationType, alwaysNormalize
// internal version is used by render functions compiled from templates
vm._c = function(a, b, c, d) {
return createElement(vm, a, b, c, d, false);
};
// normalization is always applied for the public version, used in
// user-written render functions.
vm.$createElement = function(a, b, c, d) {
return createElement(vm, a, b, c, d, true);
};
// $attrs & $listeners are exposed for easier HOC creation.
// they need to be reactive so that HOCs using them are always updated
var parentData = parentVnode && parentVnode.data;
/* istanbul ignore else */
{
defineReactive(
vm,
"$attrs",
(parentData && parentData.attrs) || emptyObject,
function() {
!isUpdatingChildComponent && warn("$attrs is readonly.", vm);
},
true
);
defineReactive(
vm,
"$listeners",
options._parentListeners || emptyObject,
function() {
!isUpdatingChildComponent && warn("$listeners is readonly.", vm);
},
true
);
}
}
function renderMixin(Vue) {
// install runtime convenience helpers
installRenderHelpers(Vue.prototype);
Vue.prototype.$nextTick = function(fn) {
return nextTick(fn, this);
};
Vue.prototype._render = function() {
var vm = this;
var ref = vm.$options;
var render = ref.render;
var _parentVnode = ref._parentVnode;
// reset _rendered flag on slots for duplicate slot check
{
for (var key in vm.$slots) {
// $flow-disable-line
vm.$slots[key]._rendered = false;
}
}
if (_parentVnode) {
vm.$scopedSlots = _parentVnode.data.scopedSlots || emptyObject;
}
// set parent vnode. this allows render functions to have access
// to the data on the placeholder node.
vm.$vnode = _parentVnode;
// render self
var vnode;
try {
vnode = render.call(vm._renderProxy, vm.$createElement);
} catch (e) {
handleError(e, vm, "render");
// return error render result,
// or previous vnode to prevent render error causing blank component
/* istanbul ignore else */
{
if (vm.$options.renderError) {
try {
vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);
} catch (e) {
handleError(e, vm, "renderError");
vnode = vm._vnode;
}
} else {
vnode = vm._vnode;
}
}
}
// return empty vnode in case the render function errored out
if (!(vnode instanceof VNode)) {
if ("development" !== "production" && Array.isArray(vnode)) {
warn(
"Multiple root nodes returned from render function. Render function " + "should return a single root node.",
vm
);
}
vnode = createEmptyVNode();
}
// set parent
vnode.parent = _parentVnode;
return vnode;
};
}
/* */
var uid$3 = 0;
function initMixin(Vue) {
Vue.prototype._init = function(options) {
var vm = this;
// a uid
vm._uid = uid$3++;
var startTag, endTag;
/* istanbul ignore if */
if ("development" !== "production" && config.performance && mark) {
startTag = "vue-perf-start:" + vm._uid;
endTag = "vue-perf-end:" + vm._uid;
mark(startTag);
}
// a flag to avoid this being observed
vm._isVue = true;
// merge options
if (options && options._isComponent) {
// optimize internal component instantiation
// since dynamic options merging is pretty slow, and none of the
// internal component options needs special treatment.
initInternalComponent(vm, options);
} else {
vm.$options = mergeOptions(resolveConstructorOptions(vm.constructor), options || {}, vm);
}
/* istanbul ignore else */
{
initProxy(vm);
}
// expose real self
vm._self = vm;
initLifecycle(vm);
initEvents(vm);
initRender(vm);
callHook(vm, "beforeCreate");
initInjections(vm); // resolve injections before data/props
initState(vm);
initProvide(vm); // resolve provide after data/props
callHook(vm, "created");
/* istanbul ignore if */
if ("development" !== "production" && config.performance && mark) {
vm._name = formatComponentName(vm, false);
mark(endTag);
measure("vue " + vm._name + " init", startTag, endTag);
}
if (vm.$options.el) {
vm.$mount(vm.$options.el);
}
};
}
function initInternalComponent(vm, options) {
var opts = (vm.$options = Object.create(vm.constructor.options));
// doing this because it's faster than dynamic enumeration.
var parentVnode = options._parentVnode;
opts.parent = options.parent;
opts._parentVnode = parentVnode;
opts._parentElm = options._parentElm;
opts._refElm = options._refElm;
var vnodeComponentOptions = parentVnode.componentOptions;
opts.propsData = vnodeComponentOptions.propsData;
opts._parentListeners = vnodeComponentOptions.listeners;
opts._renderChildren = vnodeComponentOptions.children;
opts._componentTag = vnodeComponentOptions.tag;
if (options.render) {
opts.render = options.render;
opts.staticRenderFns = options.staticRenderFns;
}
}
function resolveConstructorOptions(Ctor) {
var options = Ctor.options;
if (Ctor.super) {
var superOptions = resolveConstructorOptions(Ctor.super);
var cachedSuperOptions = Ctor.superOptions;
if (superOptions !== cachedSuperOptions) {
// super option changed,
// need to resolve new options.
Ctor.superOptions = superOptions;
// check if there are any late-modified/attached options (#4976)
var modifiedOptions = resolveModifiedOptions(Ctor);
// update base extend options
if (modifiedOptions) {
extend(Ctor.extendOptions, modifiedOptions);
}
options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);
if (options.name) {
options.components[options.name] = Ctor;
}
}
}
return options;
}
function resolveModifiedOptions(Ctor) {
var modified;
var latest = Ctor.options;
var extended = Ctor.extendOptions;
var sealed = Ctor.sealedOptions;
for (var key in latest) {
if (latest[key] !== sealed[key]) {
if (!modified) {
modified = {};
}
modified[key] = dedupe(latest[key], extended[key], sealed[key]);
}
}
return modified;
}
function dedupe(latest, extended, sealed) {
// compare latest and sealed to ensure lifecycle hooks won't be duplicated
// between merges
if (Array.isArray(latest)) {
var res = [];
sealed = Array.isArray(sealed) ? sealed : [sealed];
extended = Array.isArray(extended) ? extended : [extended];
for (var i = 0; i < latest.length; i++) {
// push original options and not sealed options to exclude duplicated options
if (extended.indexOf(latest[i]) >= 0 || sealed.indexOf(latest[i]) < 0) {
res.push(latest[i]);
}
}
return res;
} else {
return latest;
}
}
function Vue(options) {
if ("development" !== "production" && !(this instanceof Vue)) {
warn("Vue is a constructor and should be called with the `new` keyword");
}
this._init(options);
}
initMixin(Vue);
stateMixin(Vue);
eventsMixin(Vue);
lifecycleMixin(Vue);
renderMixin(Vue);
/* */
function initUse(Vue) {
Vue.use = function(plugin) {
var installedPlugins = this._installedPlugins || (this._installedPlugins = []);
if (installedPlugins.indexOf(plugin) > -1) {
return this;
}
// additional parameters
var args = toArray(arguments, 1);
args.unshift(this);
if (typeof plugin.install === "function") {
plugin.install.apply(plugin, args);
} else if (typeof plugin === "function") {
plugin.apply(null, args);
}
installedPlugins.push(plugin);
return this;
};
}
/* */
function initMixin$1(Vue) {
Vue.mixin = function(mixin) {
this.options = mergeOptions(this.options, mixin);
return this;
};
}
/* */
function initExtend(Vue) {
/**
* Each instance constructor, including Vue, has a unique
* cid. This enables us to create wrapped "child
* constructors" for prototypal inheritance and cache them.
*/
Vue.cid = 0;
var cid = 1;
/**
* Class inheritance
*/
Vue.extend = function(extendOptions) {
extendOptions = extendOptions || {};
var Super = this;
var SuperId = Super.cid;
var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});
if (cachedCtors[SuperId]) {
return cachedCtors[SuperId];
}
var name = extendOptions.name || Super.options.name;
if ("development" !== "production" && name) {
validateComponentName(name);
}
var Sub = function VueComponent(options) {
this._init(options);
};
Sub.prototype = Object.create(Super.prototype);
Sub.prototype.constructor = Sub;
Sub.cid = cid++;
Sub.options = mergeOptions(Super.options, extendOptions);
Sub["super"] = Super;
// For props and computed properties, we define the proxy getters on
// the Vue instances at extension time, on the extended prototype. This
// avoids Object.defineProperty calls for each instance created.
if (Sub.options.props) {
initProps$1(Sub);
}
if (Sub.options.computed) {
initComputed$1(Sub);
}
// allow further extension/mixin/plugin usage
Sub.extend = Super.extend;
Sub.mixin = Super.mixin;
Sub.use = Super.use;
// create asset registers, so extended classes
// can have their private assets too.
ASSET_TYPES.forEach(function(type) {
Sub[type] = Super[type];
});
// enable recursive self-lookup
if (name) {
Sub.options.components[name] = Sub;
}
// keep a reference to the super options at extension time.
// later at instantiation we can check if Super's options have
// been updated.
Sub.superOptions = Super.options;
Sub.extendOptions = extendOptions;
Sub.sealedOptions = extend({}, Sub.options);
// cache constructor
cachedCtors[SuperId] = Sub;
return Sub;
};
}
function initProps$1(Comp) {
var props = Comp.options.props;
for (var key in props) {
proxy(Comp.prototype, "_props", key);
}
}
function initComputed$1(Comp) {
var computed = Comp.options.computed;
for (var key in computed) {
defineComputed(Comp.prototype, key, computed[key]);
}
}
/* */
function initAssetRegisters(Vue) {
/**
* Create asset registration methods.
*/
ASSET_TYPES.forEach(function(type) {
Vue[type] = function(id, definition) {
if (!definition) {
return this.options[type + "s"][id];
} else {
/* istanbul ignore if */
if ("development" !== "production" && type === "component") {
validateComponentName(id);
}
if (type === "component" && isPlainObject(definition)) {
definition.name = definition.name || id;
definition = this.options._base.extend(definition);
}
if (type === "directive" && typeof definition === "function") {
definition = { bind: definition, update: definition };
}
this.options[type + "s"][id] = definition;
return definition;
}
};
});
}
/* */
function getComponentName(opts) {
return opts && (opts.Ctor.options.name || opts.tag);
}
function matches(pattern, name) {
if (Array.isArray(pattern)) {
return pattern.indexOf(name) > -1;
} else if (typeof pattern === "string") {
return pattern.split(",").indexOf(name) > -1;
} else if (isRegExp(pattern)) {
return pattern.test(name);
}
/* istanbul ignore next */
return false;
}
function pruneCache(keepAliveInstance, filter) {
var cache = keepAliveInstance.cache;
var keys = keepAliveInstance.keys;
var _vnode = keepAliveInstance._vnode;
for (var key in cache) {
var cachedNode = cache[key];
if (cachedNode) {
var name = getComponentName(cachedNode.componentOptions);
if (name && !filter(name)) {
pruneCacheEntry(cache, key, keys, _vnode);
}
}
}
}
function pruneCacheEntry(cache, key, keys, current) {
var cached$$1 = cache[key];
if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {
cached$$1.componentInstance.$destroy();
}
cache[key] = null;
remove(keys, key);
}
var patternTypes = [String, RegExp, Array];
var KeepAlive = {
name: "keep-alive",
abstract: true,
props: {
include: patternTypes,
exclude: patternTypes,
max: [String, Number]
},
created: function created() {
this.cache = Object.create(null);
this.keys = [];
},
destroyed: function destroyed() {
var this$1 = this;
for (var key in this$1.cache) {
pruneCacheEntry(this$1.cache, key, this$1.keys);
}
},
mounted: function mounted() {
var this$1 = this;
this.$watch("include", function(val) {
pruneCache(this$1, function(name) {
return matches(val, name);
});
});
this.$watch("exclude", function(val) {
pruneCache(this$1, function(name) {
return !matches(val, name);
});
});
},
render: function render() {
var slot = this.$slots.default;
var vnode = getFirstComponentChild(slot);
var componentOptions = vnode && vnode.componentOptions;
if (componentOptions) {
// check pattern
var name = getComponentName(componentOptions);
var ref = this;
var include = ref.include;
var exclude = ref.exclude;
if (
// not included
(include && (!name || !matches(include, name))) ||
// excluded
(exclude && name && matches(exclude, name))
) {
return vnode;
}
var ref$1 = this;
var cache = ref$1.cache;
var keys = ref$1.keys;
var key =
vnode.key == null
? // same constructor may get registered as different local components
// so cid alone is not enough (#3269)
componentOptions.Ctor.cid + (componentOptions.tag ? "::" + componentOptions.tag : "")
: vnode.key;
if (cache[key]) {
vnode.componentInstance = cache[key].componentInstance;
// make current key freshest
remove(keys, key);
keys.push(key);
} else {
cache[key] = vnode;
keys.push(key);
// prune oldest entry
if (this.max && keys.length > parseInt(this.max)) {
pruneCacheEntry(cache, keys[0], keys, this._vnode);
}
}
vnode.data.keepAlive = true;
}
return vnode || (slot && slot[0]);
}
};
var builtInComponents = {
KeepAlive: KeepAlive
};
/* */
function initGlobalAPI(Vue) {
// config
var configDef = {};
configDef.get = function() {
return config;
};
{
configDef.set = function() {
warn("Do not replace the Vue.config object, set individual fields instead.");
};
}
Object.defineProperty(Vue, "config", configDef);
// exposed util methods.
// NOTE: these are not considered part of the public API - avoid relying on
// them unless you are aware of the risk.
Vue.util = {
warn: warn,
extend: extend,
mergeOptions: mergeOptions,
defineReactive: defineReactive
};
Vue.set = set;
Vue.delete = del;
Vue.nextTick = nextTick;
Vue.options = Object.create(null);
ASSET_TYPES.forEach(function(type) {
Vue.options[type + "s"] = Object.create(null);
});
// this is used to identify the "base" constructor to extend all plain-object
// components with in Weex's multi-instance scenarios.
Vue.options._base = Vue;
extend(Vue.options.components, builtInComponents);
initUse(Vue);
initMixin$1(Vue);
initExtend(Vue);
initAssetRegisters(Vue);
}
initGlobalAPI(Vue);
Object.defineProperty(Vue.prototype, "$isServer", {
get: isServerRendering
});
Object.defineProperty(Vue.prototype, "$ssrContext", {
get: function get() {
/* istanbul ignore next */
return this.$vnode && this.$vnode.ssrContext;
}
});
// expose FunctionalRenderContext for ssr runtime helper installation
Object.defineProperty(Vue, "FunctionalRenderContext", {
value: FunctionalRenderContext
});
Vue.version = "2.5.17";
/* */
// these are reserved for web because they are directly compiled away
// during template compilation
var isReservedAttr = makeMap("style,class");
// attributes that should be using props for binding
var acceptValue = makeMap("input,textarea,option,select,progress");
var mustUseProp = function(tag, type, attr) {
return (
(attr === "value" && acceptValue(tag) && type !== "button") ||
(attr === "selected" && tag === "option") ||
(attr === "checked" && tag === "input") ||
(attr === "muted" && tag === "video")
);
};
var isEnumeratedAttr = makeMap("contenteditable,draggable,spellcheck");
var isBooleanAttr = makeMap(
"allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare," +
"default,defaultchecked,defaultmuted,defaultselected,defer,disabled," +
"enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple," +
"muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly," +
"required,reversed,scoped,seamless,selected,sortable,translate," +
"truespeed,typemustmatch,visible"
);
var xlinkNS = "http://www.w3.org/1999/xlink";
var isXlink = function(name) {
return name.charAt(5) === ":" && name.slice(0, 5) === "xlink";
};
var getXlinkProp = function(name) {
return isXlink(name) ? name.slice(6, name.length) : "";
};
var isFalsyAttrValue = function(val) {
return val == null || val === false;
};
/* */
function genClassForVnode(vnode) {
var data = vnode.data;
var parentNode = vnode;
var childNode = vnode;
while (isDef(childNode.componentInstance)) {
childNode = childNode.componentInstance._vnode;
if (childNode && childNode.data) {
data = mergeClassData(childNode.data, data);
}
}
while (isDef((parentNode = parentNode.parent))) {
if (parentNode && parentN
gitextract_hjfdfrq1/ ├── .babelrc ├── .eslintrc ├── .gitignore ├── .npmignore ├── .npmrc ├── .postcssrc ├── CHANGELOG.md ├── cypress.json ├── docs/ │ ├── depoly.md │ ├── plugin.md │ └── snapshot.md ├── gulpfile.js ├── jest.config.js ├── package.json ├── public/ │ ├── index.html │ ├── index_cdn.html │ ├── style_import1.css │ ├── style_import2.css │ ├── style_link.css │ ├── test_application.js │ ├── test_console.js │ ├── test_network.js │ ├── test_plugin.js │ └── vue.js ├── readme.md ├── src/ │ ├── App.vue │ ├── components/ │ │ ├── VFootBar.vue │ │ ├── VHighlightView.vue │ │ ├── VIcon.vue │ │ ├── VJSONViewer/ │ │ │ ├── JSONTextBlock.vue │ │ │ ├── JSONTextInlineBlock.vue │ │ │ ├── VJSONViewer.vue │ │ │ └── index.js │ │ ├── VTabBar.vue │ │ ├── VTabBarItem.vue │ │ └── index.js │ ├── constants/ │ │ ├── PanelType.js │ │ └── index.js │ ├── main.js │ ├── panels/ │ │ ├── application/ │ │ │ ├── ApplicationPanel.vue │ │ │ ├── TabStorage.vue │ │ │ └── XStorage.js │ │ ├── console/ │ │ │ ├── ConsolePanel.vue │ │ │ ├── Message.vue │ │ │ ├── TextBlock.vue │ │ │ └── TextInlineBlock.vue │ │ ├── element/ │ │ │ ├── BoxModel.vue │ │ │ ├── ElementPanel.vue │ │ │ ├── NodeLink.vue │ │ │ ├── NodeView.vue │ │ │ ├── StyleColorValue.vue │ │ │ ├── StyleProperty.vue │ │ │ ├── StyleRule.vue │ │ │ ├── TabComputed.vue │ │ │ ├── TabStyles.vue │ │ │ └── Tag.vue │ │ ├── index.js │ │ ├── network/ │ │ │ ├── HttpStatus.js │ │ │ ├── NetworkPanel.vue │ │ │ ├── NetworkRequest.vue │ │ │ ├── RequestType.js │ │ │ ├── TabHeaders.vue │ │ │ ├── TabPreview.vue │ │ │ └── TabResponse.vue │ │ └── settings/ │ │ └── SettingsPanel.vue │ ├── plugins/ │ │ ├── Plugin.js │ │ ├── index.js │ │ ├── pluginEvents.js │ │ └── pluginManager.js │ ├── polyfill.js │ ├── styles/ │ │ ├── _global.scss │ │ ├── _mixins.scss │ │ ├── _triangles.scss │ │ └── _variables.scss │ └── utils/ │ ├── EventBus.js │ ├── Logger.js │ ├── TaskScheduler.js │ ├── consoleHooks.js │ ├── filters.js │ ├── index.js │ ├── miscs.js │ └── style.js ├── tests/ │ ├── api/ │ │ ├── data/ │ │ │ ├── response.css │ │ │ ├── response.html │ │ │ ├── response.js │ │ │ ├── response.json │ │ │ └── response.txt │ │ └── index.js │ ├── e2e/ │ │ ├── .eslintrc │ │ ├── plugins/ │ │ │ └── index.js │ │ ├── specs/ │ │ │ └── test.js │ │ └── support/ │ │ ├── commands.js │ │ └── index.js │ └── unit/ │ ├── .eslintrc │ └── HelloWorld.spec.js ├── tsconfig.json └── vue.config.js
SYMBOL INDEX (435 symbols across 15 files)
FILE: public/test_application.js
function testWriteCookie (line 2) | function testWriteCookie(n = 1) {
function testWriteLocalStorage (line 9) | function testWriteLocalStorage(n = 1) {
function testWriteSessionStorage (line 16) | function testWriteSessionStorage(n = 1) {
FILE: public/test_console.js
function testLogLevel (line 2) | function testLogLevel() {
function testLogParams (line 10) | function testLogParams() {
function testLogFormat (line 15) | function testLogFormat(value, format) {
function testIntervalLog (line 20) | function testIntervalLog(interval = 1000) {
function testException (line 25) | function testException() {
function testObject (line 39) | function testObject() {
function testFormat (line 231) | function testFormat() {
FILE: public/test_network.js
function testXMLHttpRequest (line 5) | function testXMLHttpRequest() {}
function testFetch (line 7) | function testFetch() {
function testHTTPStatus (line 36) | function testHTTPStatus() {
function testRequestParams (line 46) | function testRequestParams(type = "get") {
function testResponseData (line 108) | function testResponseData() {
function request (line 135) | function request(options) {
FILE: public/test_plugin.js
function plugin1 (line 1) | function plugin1(WebConsole) {
function plugin2 (line 166) | function plugin2(WebConsole) {
FILE: public/vue.js
function isUndef (line 21) | function isUndef(v) {
function isDef (line 25) | function isDef(v) {
function isTrue (line 29) | function isTrue(v) {
function isFalse (line 33) | function isFalse(v) {
function isPrimitive (line 40) | function isPrimitive(value) {
function isObject (line 55) | function isObject(obj) {
function toRawType (line 64) | function toRawType(value) {
function isPlainObject (line 72) | function isPlainObject(obj) {
function isRegExp (line 76) | function isRegExp(v) {
function isValidArrayIndex (line 83) | function isValidArrayIndex(val) {
function toString (line 91) | function toString(val) {
function toNumber (line 99) | function toNumber(val) {
function makeMap (line 108) | function makeMap(str, expectsLowerCase) {
function remove (line 136) | function remove(arr, item) {
function hasOwn (line 149) | function hasOwn(obj, key) {
function cached (line 156) | function cached(fn) {
function polyfillBind (line 198) | function polyfillBind(fn, ctx) {
function nativeBind (line 208) | function nativeBind(fn, ctx) {
function toArray (line 217) | function toArray(list, start) {
function extend (line 230) | function extend(to, _from) {
function toObject (line 240) | function toObject(arr) {
function noop (line 255) | function noop(a, b, c) {}
function genStaticKeys (line 274) | function genStaticKeys(modules) {
function looseEqual (line 286) | function looseEqual(a, b) {
function looseIndexOf (line 327) | function looseIndexOf(arr, val) {
function once (line 339) | function once(fn) {
function isReserved (line 462) | function isReserved(str) {
function def (line 470) | function def(obj, key, val, enumerable) {
function parsePath (line 483) | function parsePath(path) {
function isNative (line 554) | function isNative(Ctor) {
function Set (line 568) | function Set() {
function pushTarget (line 733) | function pushTarget(_target) {
function popTarget (line 740) | function popTarget() {
function createTextVNode (line 791) | function createTextVNode(val) {
function cloneVNode (line 799) | function cloneVNode(vnode) {
function toggleObserving (line 873) | function toggleObserving(value) {
function protoAugment (line 924) | function protoAugment(target, src, keys) {
function copyAugment (line 935) | function copyAugment(target, src, keys) {
function observe (line 947) | function observe(value, asRootData) {
function defineReactive (line 972) | function defineReactive(obj, key, val, customSetter, shallow) {
function set (line 1030) | function set(target, key, val) {
function del (line 1064) | function del(target, key) {
function dependArray (line 1092) | function dependArray(value) {
function mergeData (line 1126) | function mergeData(to, from) {
function mergeDataOrFn (line 1148) | function mergeDataOrFn(parentVal, childVal, vm) {
function mergeHook (line 1204) | function mergeHook(parentVal, childVal) {
function mergeAssets (line 1225) | function mergeAssets(parentVal, childVal, vm, key) {
function checkComponents (line 1305) | function checkComponents(options) {
function validateComponentName (line 1311) | function validateComponentName(name) {
function normalizeProps (line 1330) | function normalizeProps(options, vm) {
function normalizeInject (line 1366) | function normalizeInject(options, vm) {
function normalizeDirectives (line 1392) | function normalizeDirectives(options) {
function assertObjectType (line 1404) | function assertObjectType(name, value, vm) {
function mergeOptions (line 1414) | function mergeOptions(parent, child, vm) {
function resolveAsset (line 1457) | function resolveAsset(options, type, id, warnMissing) {
function validateProp (line 1485) | function validateProp(key, propOptions, propsData, vm) {
function getPropDefaultValue (line 1522) | function getPropDefaultValue(vm, prop, key) {
function assertProp (line 1552) | function assertProp(prop, name, value, vm, absent) {
function assertType (line 1597) | function assertType(value, type) {
function getType (line 1625) | function getType(fn) {
function isSameType (line 1630) | function isSameType(a, b) {
function getTypeIndex (line 1634) | function getTypeIndex(type, expectedTypes) {
function handleError (line 1648) | function handleError(err, vm, info) {
function globalHandleError (line 1670) | function globalHandleError(err, vm, info) {
function logError (line 1681) | function logError(err, vm, info) {
function flushCallbacks (line 1699) | function flushCallbacks() {
function withMacroTask (line 1772) | function withMacroTask(fn) {
function nextTick (line 1784) | function nextTick(cb, ctx) {
function traverse (line 1917) | function traverse(val) {
function _traverse (line 1922) | function _traverse(val, seen) {
function createFnInvoker (line 1966) | function createFnInvoker(fns) {
function updateListeners (line 1985) | function updateListeners(on, oldOn, add, remove$$1, vm) {
function mergeVNodeHook (line 2015) | function mergeVNodeHook(def, hookKey, hook) {
function extractPropsFromVNodeData (line 2050) | function extractPropsFromVNodeData(data, Ctor, tag) {
function checkProp (line 2092) | function checkProp(res, hash, key, altKey, preserve) {
function simpleNormalizeChildren (line 2125) | function simpleNormalizeChildren(children) {
function normalizeChildren (line 2138) | function normalizeChildren(children) {
function isTextNode (line 2146) | function isTextNode(node) {
function normalizeArrayChildren (line 2150) | function normalizeArrayChildren(children, nestedIndex) {
function ensureCtor (line 2199) | function ensureCtor(comp, base) {
function createAsyncPlaceholder (line 2206) | function createAsyncPlaceholder(factory, data, context, children, tag) {
function resolveAsyncComponent (line 2213) | function resolveAsyncComponent(factory, baseCtor, context) {
function isAsyncPlaceholder (line 2305) | function isAsyncPlaceholder(node) {
function getFirstComponentChild (line 2311) | function getFirstComponentChild(children) {
function initEvents (line 2326) | function initEvents(vm) {
function add (line 2338) | function add(event, fn, once) {
function remove$1 (line 2346) | function remove$1(event, fn) {
function updateComponentListeners (line 2350) | function updateComponentListeners(vm, listeners, oldListeners) {
function eventsMixin (line 2356) | function eventsMixin(Vue) {
function resolveSlots (line 2472) | function resolveSlots(children, context) {
function isWhitespace (line 2507) | function isWhitespace(node) {
function resolveScopedSlots (line 2511) | function resolveScopedSlots(
function initLifecycle (line 2531) | function initLifecycle(vm) {
function lifecycleMixin (line 2557) | function lifecycleMixin(Vue) {
function mountComponent (line 2654) | function mountComponent(vm, el, hydrating) {
function updateChildComponent (line 2714) | function updateChildComponent(vm, propsData, listeners, parentVnode, ren...
function isInInactiveTree (line 2775) | function isInInactiveTree(vm) {
function activateChildComponent (line 2784) | function activateChildComponent(vm, direct) {
function deactivateChildComponent (line 2802) | function deactivateChildComponent(vm, direct) {
function callHook (line 2818) | function callHook(vm, hook) {
function resetSchedulerState (line 2852) | function resetSchedulerState() {
function flushSchedulerQueue (line 2864) | function flushSchedulerQueue() {
function callUpdatedHooks (line 2920) | function callUpdatedHooks(queue) {
function queueActivatedComponent (line 2935) | function queueActivatedComponent(vm) {
function callActivatedHooks (line 2942) | function callActivatedHooks(queue) {
function queueWatcher (line 2954) | function queueWatcher(watcher) {
function proxy (line 3192) | function proxy(target, sourceKey, key) {
function initState (line 3202) | function initState(vm) {
function initProps (line 3224) | function initProps(vm, propsOptions) {
function initData (line 3270) | function initData(vm) {
function getData (line 3308) | function getData(data, vm) {
function initComputed (line 3323) | function initComputed(vm, computed) {
function defineComputed (line 3356) | function defineComputed(target, key, userDef) {
function createComputedGetter (line 3377) | function createComputedGetter(key) {
function initMethods (line 3392) | function initMethods(vm, methods) {
function initWatch (line 3421) | function initWatch(vm, watch) {
function createWatcher (line 3434) | function createWatcher(vm, expOrFn, handler, options) {
function stateMixin (line 3445) | function stateMixin(Vue) {
function initProvide (line 3490) | function initProvide(vm) {
function initInjections (line 3497) | function initInjections(vm) {
function resolveInject (line 3520) | function resolveInject(inject, vm) {
function renderList (line 3560) | function renderList(val, render) {
function renderSlot (line 3591) | function renderSlot(name, fallback, props, bindObject) {
function resolveFilter (line 3635) | function resolveFilter(id) {
function isKeyNotMatch (line 3641) | function isKeyNotMatch(expect, actual) {
function checkKeyCodes (line 3654) | function checkKeyCodes(eventKeyCode, key, builtInKeyCode, eventKeyName, ...
function bindObjectProps (line 3670) | function bindObjectProps(data, tag, value, asProp, isSync) {
function renderStatic (line 3712) | function renderStatic(index, isInFor) {
function markOnce (line 3734) | function markOnce(tree, index, key) {
function markStatic (line 3739) | function markStatic(tree, key, isOnce) {
function markStaticNode (line 3751) | function markStaticNode(node, key, isOnce) {
function bindObjectListeners (line 3759) | function bindObjectListeners(data, value) {
function installRenderHelpers (line 3777) | function installRenderHelpers(target) {
function FunctionalRenderContext (line 3797) | function FunctionalRenderContext(data, props, children, parent, Ctor) {
function createFunctionalComponent (line 3854) | function createFunctionalComponent(Ctor, propsData, data, contextVm, chi...
function cloneAndMarkFunctionalResult (line 3887) | function cloneAndMarkFunctionalResult(vnode, data, contextVm, options) {
function mergeProps (line 3900) | function mergeProps(to, from) {
function createComponent (line 3988) | function createComponent(Ctor, data, context, children, tag) {
function createComponentInstanceForVnode (line 4083) | function createComponentInstanceForVnode(
function installComponentHooks (line 4105) | function installComponentHooks(data) {
function transformModel (line 4115) | function transformModel(options, data) {
function createElement (line 4134) | function createElement(context, tag, data, children, normalizationType, ...
function _createElement (line 4146) | function _createElement(context, tag, data, children, normalizationType) {
function applyNS (line 4218) | function applyNS(vnode, ns, force) {
function registerDeepBindings (line 4238) | function registerDeepBindings(data) {
function initRender (line 4249) | function initRender(vm) {
function renderMixin (line 4297) | function renderMixin(Vue) {
function initMixin (line 4368) | function initMixin(Vue) {
function initInternalComponent (line 4421) | function initInternalComponent(vm, options) {
function resolveConstructorOptions (line 4442) | function resolveConstructorOptions(Ctor) {
function resolveModifiedOptions (line 4466) | function resolveModifiedOptions(Ctor) {
function dedupe (line 4482) | function dedupe(latest, extended, sealed) {
function Vue (line 4501) | function Vue(options) {
function initUse (line 4516) | function initUse(Vue) {
function initMixin$1 (line 4538) | function initMixin$1(Vue) {
function initExtend (line 4547) | function initExtend(Vue) {
function initProps$1 (line 4620) | function initProps$1(Comp) {
function initComputed$1 (line 4627) | function initComputed$1(Comp) {
function initAssetRegisters (line 4636) | function initAssetRegisters(Vue) {
function getComponentName (line 4665) | function getComponentName(opts) {
function matches (line 4669) | function matches(pattern, name) {
function pruneCache (line 4681) | function pruneCache(keepAliveInstance, filter) {
function pruneCacheEntry (line 4696) | function pruneCacheEntry(cache, key, keys, current) {
function initGlobalAPI (line 4799) | function initGlobalAPI(Vue) {
function genClassForVnode (line 4907) | function genClassForVnode(vnode) {
function mergeClassData (line 4925) | function mergeClassData(child, parent) {
function renderClass (line 4932) | function renderClass(staticClass, dynamicClass) {
function concat (line 4940) | function concat(a, b) {
function stringifyClass (line 4944) | function stringifyClass(value) {
function stringifyArray (line 4958) | function stringifyArray(value) {
function stringifyObject (line 4972) | function stringifyObject(value) {
function getTagNamespace (line 5023) | function getTagNamespace(tag) {
function isUnknownElement (line 5035) | function isUnknownElement(tag) {
function query (line 5065) | function query(el) {
function createElement$1 (line 5080) | function createElement$1(tagName, vnode) {
function createElementNS (line 5092) | function createElementNS(namespace, tagName) {
function createTextNode (line 5096) | function createTextNode(text) {
function createComment (line 5100) | function createComment(text) {
function insertBefore (line 5104) | function insertBefore(parentNode, newNode, referenceNode) {
function removeChild (line 5108) | function removeChild(node, child) {
function appendChild (line 5112) | function appendChild(node, child) {
function parentNode (line 5116) | function parentNode(node) {
function nextSibling (line 5120) | function nextSibling(node) {
function tagName (line 5124) | function tagName(node) {
function setTextContent (line 5128) | function setTextContent(node, text) {
function setStyleScope (line 5132) | function setStyleScope(node, scopeId) {
function registerRef (line 5168) | function registerRef(vnode, isRemoval) {
function sameVnode (line 5213) | function sameVnode(a, b) {
function sameInputType (line 5221) | function sameInputType(a, b) {
function createKeyToOldIdx (line 5231) | function createKeyToOldIdx(children, beginIdx, endIdx) {
function createPatchFunction (line 5243) | function createPatchFunction(backend) {
function updateDirectives (line 5971) | function updateDirectives(oldVnode, vnode) {
function _update (line 5977) | function _update(oldVnode, vnode) {
function normalizeDirectives$1 (line 6039) | function normalizeDirectives$1(dirs, vm) {
function getRawDirName (line 6059) | function getRawDirName(dir) {
function callHook$1 (line 6063) | function callHook$1(dir, hook, vnode, oldVnode, isDestroy) {
function updateAttrs (line 6078) | function updateAttrs(oldVnode, vnode) {
function setAttr (line 6119) | function setAttr(el, key, value) {
function baseSetAttr (line 6146) | function baseSetAttr(el, key, value) {
function updateClass (line 6174) | function updateClass(oldVnode, vnode) {
function parseFilters (line 6210) | function parseFilters(exp) {
function wrapFilter (line 6323) | function wrapFilter(exp, filter) {
function baseWarn (line 6337) | function baseWarn(msg) {
function pluckModuleFunction (line 6341) | function pluckModuleFunction(modules, key) {
function addProp (line 6353) | function addProp(el, name, value) {
function addAttr (line 6358) | function addAttr(el, name, value) {
function addRawAttr (line 6364) | function addRawAttr(el, name, value) {
function addDirective (line 6369) | function addDirective(el, name, rawName, value, arg, modifiers) {
function addHandler (line 6380) | function addHandler(el, name, value, modifiers, important, warn) {
function getBindingAttr (line 6443) | function getBindingAttr(el, name, getStatic) {
function getAndRemoveAttr (line 6459) | function getAndRemoveAttr(el, name, removeFromMap) {
function genComponentModel (line 6481) | function genComponentModel(el, value, modifiers) {
function genAssignmentCode (line 6515) | function genAssignmentCode(value, assignment) {
function parseModel (line 6546) | function parseModel(val) {
function next (line 6586) | function next() {
function eof (line 6590) | function eof() {
function isStringStart (line 6594) | function isStringStart(chr) {
function parseBracket (line 6598) | function parseBracket(chr) {
function parseString (line 6620) | function parseString(chr) {
function model (line 6639) | function model(el, dir, _warn) {
function genCheckboxModel (line 6694) | function genCheckboxModel(el, value, modifiers) {
function genRadioModel (line 6743) | function genRadioModel(el, value, modifiers) {
function genSelect (line 6751) | function genSelect(el, value, modifiers) {
function genDefaultModel (line 6767) | function genDefaultModel(el, value, modifiers) {
function normalizeEvents (line 6820) | function normalizeEvents(on) {
function createOnceHandler (line 6839) | function createOnceHandler(handler, event, capture) {
function add$1 (line 6849) | function add$1(event, handler, once$$1, capture, passive) {
function remove$2 (line 6857) | function remove$2(event, handler, capture, _target) {
function updateDOMListeners (line 6861) | function updateDOMListeners(oldVnode, vnode) {
function updateDOMProps (line 6880) | function updateDOMProps(oldVnode, vnode) {
function shouldUpdateValue (line 6934) | function shouldUpdateValue(elm, checkVal) {
function isNotInFocusAndDirty (line 6941) | function isNotInFocusAndDirty(elm, checkVal) {
function isDirtyWithModifiers (line 6953) | function isDirtyWithModifiers(elm, newVal) {
function normalizeStyleData (line 6992) | function normalizeStyleData(data) {
function normalizeStyleBinding (line 7000) | function normalizeStyleBinding(bindingStyle) {
function getStyle (line 7014) | function getStyle(vnode, checkChild) {
function updateStyle (line 7084) | function updateStyle(oldVnode, vnode) {
function addClass (line 7134) | function addClass(el, cls) {
function removeClass (line 7161) | function removeClass(el, cls) {
function resolveTransition (line 7196) | function resolveTransition(def) {
function nextFrame (line 7254) | function nextFrame(fn) {
function addTransitionClass (line 7260) | function addTransitionClass(el, cls) {
function removeTransitionClass (line 7268) | function removeTransitionClass(el, cls) {
function whenTransitionEnds (line 7275) | function whenTransitionEnds(el, expectedType, cb) {
function getTransitionInfo (line 7306) | function getTransitionInfo(el, expectedType) {
function getTimeout (line 7345) | function getTimeout(delays, durations) {
function toMs (line 7359) | function toMs(s) {
function enter (line 7365) | function enter(vnode, toggleDisplay) {
function leave (line 7495) | function leave(vnode, rm) {
function checkDuration (line 7596) | function checkDuration(val, name, vnode) {
function isValidDuration (line 7610) | function isValidDuration(val) {
function getHookArgumentsLength (line 7620) | function getHookArgumentsLength(fn) {
function _enter (line 7633) | function _enter(_, vnode) {
function setSelected (line 7739) | function setSelected(el, binding, vm) {
function actuallySetSelected (line 7749) | function actuallySetSelected(el, binding, vm) {
function hasNoMatchingOption (line 7786) | function hasNoMatchingOption(value, options) {
function getValue (line 7792) | function getValue(option) {
function onCompositionStart (line 7796) | function onCompositionStart(e) {
function onCompositionEnd (line 7800) | function onCompositionEnd(e) {
function trigger (line 7809) | function trigger(el, type) {
function locateNode (line 7818) | function locateNode(vnode) {
function getRealChild (line 7904) | function getRealChild(vnode) {
function extractTransitionData (line 7913) | function extractTransitionData(comp) {
function placeholder (line 7929) | function placeholder(h, rawChild) {
function hasParentTransition (line 7937) | function hasParentTransition(vnode) {
function isSameChild (line 7945) | function isSameChild(child, oldChild) {
function callPendingCbs (line 8222) | function callPendingCbs(c) {
function recordPosition (line 8233) | function recordPosition(c) {
function applyTranslation (line 8237) | function applyTranslation(c) {
function parseText (line 8317) | function parseText(text, delimiters) {
function transformNode (line 8351) | function transformNode(el, options) {
function genData (line 8376) | function genData(el) {
function transformNode$1 (line 8395) | function transformNode$1(el, options) {
function genData$1 (line 8422) | function genData$1(el) {
function decodeAttr (line 8522) | function decodeAttr(value, shouldDecodeNewlines) {
function parseHTML (line 8529) | function parseHTML(html, options) {
function createASTElement (line 8816) | function createASTElement(tag, attrs, parent) {
function parse (line 8830) | function parse(template, options) {
function processPre (line 9057) | function processPre(el) {
function processRawAttrs (line 9063) | function processRawAttrs(el) {
function processElement (line 9079) | function processElement(element, options) {
function processKey (line 9095) | function processKey(el) {
function processRef (line 9105) | function processRef(el) {
function processFor (line 9113) | function processFor(el) {
function parseFor (line 9125) | function parseFor(exp) {
function processIf (line 9146) | function processIf(el) {
function processIfConditions (line 9165) | function processIfConditions(el, parent) {
function findPrevElement (line 9184) | function findPrevElement(children) {
function addIfCondition (line 9198) | function addIfCondition(el, condition) {
function processOnce (line 9205) | function processOnce(el) {
function processSlot (line 9212) | function processSlot(el) {
function processComponent (line 9263) | function processComponent(el) {
function processAttrs (line 9273) | function processAttrs(el) {
function checkInFor (line 9356) | function checkInFor(el) {
function parseModifiers (line 9367) | function parseModifiers(name) {
function makeAttrsMap (line 9378) | function makeAttrsMap(attrs) {
function isTextTag (line 9390) | function isTextTag(el) {
function isForbiddenTag (line 9394) | function isForbiddenTag(el) {
function guardIESVGBug (line 9402) | function guardIESVGBug(attrs) {
function checkForAliasModel (line 9414) | function checkForAliasModel(el, value) {
function preTransformNode (line 9446) | function preTransformNode(el, options) {
function cloneASTElement (line 9508) | function cloneASTElement(el) {
function text (line 9520) | function text(el, dir) {
function html (line 9528) | function html(el, dir) {
function optimize (line 9573) | function optimize(root, options) {
function genStaticKeys$1 (line 9585) | function genStaticKeys$1(keys) {
function markStatic$1 (line 9589) | function markStatic$1(node) {
function markStaticRoots (line 9617) | function markStaticRoots(node, isInFor) {
function isStatic (line 9644) | function isStatic(node) {
function isDirectChildOfTemplateFor (line 9665) | function isDirectChildOfTemplateFor(node) {
function genHandlers (line 9730) | function genHandlers(events, isNative, warn) {
function genHandler (line 9738) | function genHandler(name, handler) {
function genKeyFilter (line 9808) | function genKeyFilter(keys) {
function genFilterCode (line 9812) | function genFilterCode(key) {
function on (line 9834) | function on(el, dir) {
function bind$1 (line 9845) | function bind$1(el, dir) {
function generate (line 9886) | function generate(ast, options) {
function genElement (line 9895) | function genElement(el, state) {
function genStatic (line 9928) | function genStatic(el, state) {
function genOnce (line 9935) | function genOnce(el, state) {
function genIf (line 9959) | function genIf(el, state, altGen, altEmpty) {
function genIfConditions (line 9964) | function genIfConditions(conditions, state, altGen, altEmpty) {
function genFor (line 9989) | function genFor(el, state, altGen, altHelper) {
function genData$2 (line 10033) | function genData$2(el, state) {
function genDirectives (line 10120) | function genDirectives(el, state) {
function genInlineTemplate (line 10156) | function genInlineTemplate(el, state) {
function genScopedSlots (line 10177) | function genScopedSlots(slots, state) {
function genScopedSlot (line 10189) | function genScopedSlot(key, el, state) {
function genForScopedSlot (line 10207) | function genForScopedSlot(key, el, state) {
function genChildren (line 10228) | function genChildren(el, state, checkSkip, altGenElement, altGenNode) {
function getNormalizationType (line 10255) | function getNormalizationType(children, maybeComponent) {
function needsNormalization (line 10285) | function needsNormalization(el) {
function genNode (line 10289) | function genNode(node, state) {
function genText (line 10300) | function genText(text) {
function genComment (line 10310) | function genComment(comment) {
function genSlot (line 10314) | function genSlot(el, state) {
function genComponent (line 10341) | function genComponent(componentName, el, state) {
function genProps (line 10346) | function genProps(props) {
function transformSpecialNewlines (line 10359) | function transformSpecialNewlines(text) {
function detectErrors (line 10388) | function detectErrors(ast) {
function checkNode (line 10396) | function checkNode(node, errors) {
function checkEvent (line 10422) | function checkEvent(exp, text, errors) {
function checkFor (line 10437) | function checkFor(node, text, errors) {
function checkIdentifier (line 10444) | function checkIdentifier(ident, type, text, errors) {
function checkExpression (line 10454) | function checkExpression(exp, text, errors) {
function createFunction (line 10485) | function createFunction(code, errors) {
function createCompileToFunctionFn (line 10494) | function createCompileToFunctionFn(compile) {
function createCompilerCreator (line 10587) | function createCompilerCreator(baseCompile) {
function getShouldDecode (line 10657) | function getShouldDecode(href) {
function getOuterHTML (line 10745) | function getOuterHTML(el) {
FILE: src/constants/PanelType.js
method text (line 10) | text(type) {
FILE: src/main.js
method bind (line 28) | bind(el) {
class WebConsole (line 64) | class WebConsole {
method use (line 66) | static use(pluginCreator, options) {
method constructor (line 80) | constructor(options) {
method _processOptions (line 91) | _processOptions(options) {
method _load (line 112) | _load(options = {}) {
FILE: src/panels/application/XStorage.js
class CookieStorage (line 6) | class CookieStorage {
method constructor (line 7) | constructor() {
method refresh (line 12) | refresh() {
method length (line 17) | get length() {
method key (line 21) | key(n) {
method getItem (line 25) | getItem(key) {
method setItem (line 29) | setItem(key, value) {
method removeItem (line 34) | removeItem(key) {
method clear (line 39) | clear() {
class XStorage (line 66) | class XStorage {
method PAGE_SIZE (line 68) | static get PAGE_SIZE() {
method constructor (line 72) | constructor(type) {
method setFilter (line 93) | setFilter(filter) {
method refresh (line 107) | refresh() {
method loadItems (line 119) | loadItems(startIndex, pageSize = XStorage.PAGE_SIZE) {
method loadMoreItems (line 124) | loadMoreItems() {
method hasMore (line 131) | hasMore() {
method length (line 135) | get length() {
method getItem (line 139) | getItem(key) {
method setItem (line 143) | setItem(key, value) {
method removeItem (line 171) | removeItem(key) {
method clear (line 191) | clear() {
method _refreshDataSource (line 199) | _refreshDataSource() {
method _refreshFilteredDataSource (line 214) | _refreshFilteredDataSource() {
FILE: src/plugins/Plugin.js
class Plugin (line 8) | class Plugin {
method constructor (line 9) | constructor({ id, name, settings, component }) {
method __init__ (line 16) | __init__(pluginMgr) {
method toString (line 72) | toString() {
FILE: src/plugins/pluginManager.js
class PluginManager (line 7) | class PluginManager extends EventBus {
method constructor (line 8) | constructor(...args) {
method hostProxy (line 22) | get hostProxy() {
method addPlugin (line 36) | addPlugin(plugin) {
method getPlugins (line 56) | getPlugins() {
method updateSettings (line 60) | updateSettings(settings) {
method getSettings (line 64) | getSettings() {
method hasPlugin (line 68) | hasPlugin(pluginId) {
method toString (line 72) | toString() {
FILE: src/utils/EventBus.js
class EventBus (line 5) | class EventBus {
method constructor (line 6) | constructor(events = {}) {
method emit (line 12) | emit(eventName, ...args) {
method on (line 22) | on(eventName, callback) {
FILE: src/utils/Logger.js
class Logger (line 12) | class Logger {
method constructor (line 13) | constructor(prefix) {
method error (line 17) | error(...args) {
method warn (line 27) | warn(...args) {
method log (line 37) | log(...args) {
FILE: src/utils/TaskScheduler.js
class TaskScheduler (line 26) | class TaskScheduler {
method constructor (line 27) | constructor({ interval = 200, taskBundleSize = 100 } = {}) {
method length (line 35) | get length() {
method add (line 39) | add(task) {
method addAndStart (line 45) | addAndStart(task) {
method start (line 57) | start({ immediate = true } = {}) {
method stop (line 62) | stop() {
method _shiftTaskBunlde (line 71) | _shiftTaskBunlde() {
method _runTask (line 80) | _runTask(immediate = false) {
FILE: src/utils/style.js
function getMatchedCSSRules (line 53) | function getMatchedCSSRules(el, styleSheets = [].slice.call(document.sty...
function compareCSSRule (line 105) | function compareCSSRule(a, b) {
function findMaxSpecificity (line 120) | function findMaxSpecificity(selector) {
function getColorRegExp (line 140) | function getColorRegExp() {
FILE: tests/api/data/response.js
function sayHello (line 1) | function sayHello(params) {
Condensed preview — 97 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (628K chars).
[
{
"path": ".babelrc",
"chars": 160,
"preview": "{\n \"presets\": [\n \"@vue/app\"\n ],\n \"plugins\": [\n [\n \"component\",\n {\n \"libraryName\": \"mint-ui\",\n "
},
{
"path": ".eslintrc",
"chars": 242,
"preview": "{\n \"root\": true,\n \"extends\": [\n \"plugin:vue/essential\",\n \"eslint:recommended\"\n ],\n \"env\": {\n \"browser\": tru"
},
{
"path": ".gitignore",
"chars": 258,
"preview": ".DS_Store\nnode_modules\n/dist\n/demo\n\n/tests/e2e/videos/\n/tests/e2e/screenshots/\n\n# local env files\n.env.local\n.env.*.loca"
},
{
"path": ".npmignore",
"chars": 30,
"preview": "*\n*/\n!dist/*.js\n!package*.json"
},
{
"path": ".npmrc",
"chars": 21,
"preview": "git-tag-version=false"
},
{
"path": ".postcssrc",
"chars": 45,
"preview": "{\n \"plugins\": {\n \"autoprefixer\": {}\n }\n}"
},
{
"path": "CHANGELOG.md",
"chars": 20263,
"preview": "## [0.7.2](https://github.com/whinc/web-console/compare/v0.7.1...v0.7.2) (2019-04-23)\n\n### Bug Fixes\n\n- **console:** 修复打"
},
{
"path": "cypress.json",
"chars": 50,
"preview": "{\n \"pluginsFile\": \"tests/e2e/plugins/index.js\"\n}\n"
},
{
"path": "docs/depoly.md",
"chars": 310,
"preview": "## 部署\n\n发布到 npm 仓库:\n\n```bash\nnpm run semantic-release\n```\n\n更新 github.io 在线示例:\n\n```bash\nnpm run depoly\n```\n\n本地调试\n\n```js\nco"
},
{
"path": "docs/plugin.md",
"chars": 3886,
"preview": "# web-console 插件开发\n\n通过插件可以增强 web-console 的能力,扩大使用场景。web-console 插件基于 Vue 组件开发,提供了丰富的 API、生命周期方法、内置组件、自定义偏好设置,同时提供了一个初始的插"
},
{
"path": "docs/snapshot.md",
"chars": 273,
"preview": "# Element 面板\n\n\n\n\n\n\n\n# "
},
{
"path": "gulpfile.js",
"chars": 519,
"preview": "const pkgInfo = require(\"./package.json\");\nconst child_process = require(\"child_process\");\nconst process = require(\"proc"
},
{
"path": "jest.config.js",
"chars": 294,
"preview": "module.exports = {\n moduleFileExtensions: [\n 'js',\n 'jsx',\n 'json',\n 'vue'\n ],\n transform: {\n '^.+\\\\.v"
},
{
"path": "package.json",
"chars": 2777,
"preview": "{\n \"name\": \"@whinc/web-console\",\n \"version\": \"0.7.2\",\n \"author\": \"whincwu@163.com\",\n \"license\": \"MIT\",\n \"keywords\":"
},
{
"path": "public/index.html",
"chars": 11937,
"preview": "<!DOCTYPE html>\n<!-- <!DOCTYPE html> -->\n<html>\n <head>\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n <"
},
{
"path": "public/index_cdn.html",
"chars": 388,
"preview": "<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\""
},
{
"path": "public/style_import1.css",
"chars": 136,
"preview": "@import url(\"style_import2.css\");\n\n/* 测试元素审查 */\n#element {\n border-color: green;\n}\n.xyz {\n border: 2px dashed blue;\n "
},
{
"path": "public/style_import2.css",
"chars": 104,
"preview": "/* 测试元素审查 */\n#element {\n border-color: yellow;\n}\n.xyz {\n border: 3px dotted yellow;\n padding: 3px;\n}\n"
},
{
"path": "public/style_link.css",
"chars": 103,
"preview": "/* 测试元素审查 */\n#element {\n background-color: white;\n}\n.xyz {\n border: 1px solid red;\n padding: 1px;\n}\n"
},
{
"path": "public/test_application.js",
"chars": 701,
"preview": "window.$application = (function() {\n function testWriteCookie(n = 1) {\n for (var i = 0; i < n; ++i) {\n const ob"
},
{
"path": "public/test_console.js",
"chars": 7700,
"preview": "window.$console = (function() {\n function testLogLevel() {\n console.log(\"log\");\n console.info(\"info\");\n consol"
},
{
"path": "public/test_network.js",
"chars": 4130,
"preview": "window.$network = (function() {\n var baseURL = \"http://localhost:8090\";\n var nodeApi = \"https://nodejs.org/dist/latest"
},
{
"path": "public/test_plugin.js",
"chars": 5457,
"preview": "function plugin1(WebConsole) {\n return new WebConsole.Plugin({\n id: \"plugin1\",\n name: \"插件1\",\n component: funct"
},
{
"path": "public/vue.js",
"chars": 309065,
"preview": "/*!\n * Vue.js v2.5.17\n * (c) 2014-2018 Evan You\n * Released under the MIT License.\n */\n(function(global, factory) {\n ty"
},
{
"path": "readme.md",
"chars": 2966,
"preview": "# web-console\r\n\r\n\r\n in buttons\">\n <button :key=\"index + btn.text\""
},
{
"path": "src/components/VHighlightView.vue",
"chars": 3661,
"preview": "<template>\n <div class=\"v-highlight-view\">\n <code class=\"source-code hljs\" :class=\"language\" v-html=\"codeHtml\"></cod"
},
{
"path": "src/components/VIcon.vue",
"chars": 1879,
"preview": "<template>\n <span class=\"icon\" :class=\"'icon--' + name\" @click=\"!disable && $emit('click')\">\n <img v-if=\"name === 's"
},
{
"path": "src/components/VJSONViewer/JSONTextBlock.vue",
"chars": 5899,
"preview": "<template>\n <div class=\"json-text-block\">\n <!-- name/value -->\n <!-- @click.stop 避免事件冒泡到上一级 TextBlock -->\n <di"
},
{
"path": "src/components/VJSONViewer/JSONTextInlineBlock.vue",
"chars": 3451,
"preview": "<template>\n <!-- 数组类型 -->\n <span v-if=\"isArray\" class=\"json-text-inline-block\">\n <span>[</span>\n <span v-for=\"(v"
},
{
"path": "src/components/VJSONViewer/VJSONViewer.vue",
"chars": 705,
"preview": "<template>\n <div class=\"source-code v-json-viewer\">\n <JSONTextBlock :descriptor=\"descriptor\" initialUnfold />\n </di"
},
{
"path": "src/components/VJSONViewer/index.js",
"chars": 45,
"preview": "export { default } from \"./VJSONViewer.vue\";\n"
},
{
"path": "src/components/VTabBar.vue",
"chars": 1328,
"preview": "<template>\n <div class=\"v-tab-bar\" :class=\"{'show-bottom-border': showBottomBorder}\">\n <div class=\"item-container g-"
},
{
"path": "src/components/VTabBarItem.vue",
"chars": 1368,
"preview": "<template>\n <div class=\"v-tab-bar-item\" :class=\"{'equal-width': $parent.equalWidth}\">\n <div class=\"tab-item\" :class="
},
{
"path": "src/components/index.js",
"chars": 316,
"preview": "export { default as VTabBar } from \"./VTabBar\";\nexport { default as VTabBarItem } from \"./VTabBarItem\";\nexport { default"
},
{
"path": "src/constants/PanelType.js",
"chars": 547,
"preview": "export default Object.freeze(\n Object.setPrototypeOf(\n {\n ELEMENT: \"element\",\n CONSOLE: \"console\",\n A"
},
{
"path": "src/constants/index.js",
"chars": 52,
"preview": "export { default as PanelType } from \"./PanelType\";\n"
},
{
"path": "src/main.js",
"chars": 4136,
"preview": "import Vue from \"vue\";\nimport App from \"./App.vue\";\nimport \"./polyfill\";\nimport { consoleHooks, filters, isFunction } fr"
},
{
"path": "src/panels/application/ApplicationPanel.vue",
"chars": 3293,
"preview": "<template>\n <div class=\"application-panel\">\n <div class=\"head\">\n <VTabBar class=\"head__tabbar\" v-model=\"activeT"
},
{
"path": "src/panels/application/TabStorage.vue",
"chars": 8823,
"preview": "<template>\n <div class=\"tab-storage\">\n <div v-show=\"isToolbarExpanded\" class=\"tab-storage__head toolbar\">\n <VIc"
},
{
"path": "src/panels/application/XStorage.js",
"chars": 5120,
"preview": "import { Logger, cloneDeep } from \"@/utils\";\nimport { cookie } from \"cookie_js\";\n\nconst logger = new Logger(\"XStorage\");"
},
{
"path": "src/panels/console/ConsolePanel.vue",
"chars": 7953,
"preview": "<template>\n <div class=\"console-panel\">\n <div class=\"head\">\n <VTabBar v-model=\"activeType\" :equalWidth=\"true\">\n"
},
{
"path": "src/panels/console/Message.vue",
"chars": 10855,
"preview": "<template>\r\n <div v-if=\"isMatched\" class=\"message source-code g-hide-scrollbar\" :class=\"[message.type]\">\r\n <div v-if"
},
{
"path": "src/panels/console/TextBlock.vue",
"chars": 11610,
"preview": "<template>\n <div class=\"text-block\">\n <!-- name/value -->\n <!-- @click.stop 避免事件冒泡到上一级 TextBlock -->\n <div cla"
},
{
"path": "src/panels/console/TextInlineBlock.vue",
"chars": 6572,
"preview": "<template>\n <!-- 函数 -->\n <span v-if=\"isFunction\" class=\"text-inline-block function-type\">\n <template v-if=\"deepth ="
},
{
"path": "src/panels/element/BoxModel.vue",
"chars": 4196,
"preview": "<template>\n <div class=\"box-model\">\n <div class=\"box\" :class=\"{'box--position': isPositionVisible}\">\n <template"
},
{
"path": "src/panels/element/ElementPanel.vue",
"chars": 6280,
"preview": "<template>\n <div class=\"element-panel\">\n <!-- 使用 v-show 避免销毁组件 -->\n <div v-show=\"!isStylePanelVisible\" class=\"dom"
},
{
"path": "src/panels/element/NodeLink.vue",
"chars": 2096,
"preview": "<template>\n <span class=\"node-link\" :class=\"{'selected': selected}\" @click=\"$emit('click')\">\n <template v-if=\"el.nod"
},
{
"path": "src/panels/element/NodeView.vue",
"chars": 6795,
"preview": "<template>\n <!-- 为了尽量减少标签的使用,会有重复属性分散在多个同级标签中 -->\n <div v-if=\"el && el.nodeType === Node.ELEMENT_NODE\" class=\"node ele"
},
{
"path": "src/panels/element/StyleColorValue.vue",
"chars": 536,
"preview": "<template>\n <span class=\"style-color-value\">\n <span class=\"color-box\" :style=\"{'background-color': color}\"></span>\n "
},
{
"path": "src/panels/element/StyleProperty.vue",
"chars": 3154,
"preview": "<template>\n <div class=\"style-property\">\n <div class=\"style-property__item\" @click=\"isExpand = !isExpand\">\n <!-"
},
{
"path": "src/panels/element/StyleRule.vue",
"chars": 4533,
"preview": "<template>\n <div class=\"css-rule\">\n <div class=\"css-rule__start\">\n <span class=\"css-rule__selector\" :class=\"{'c"
},
{
"path": "src/panels/element/TabComputed.vue",
"chars": 7628,
"preview": "<template>\n <div class=\"tab-computed\" v-prevent-bkg-scroll>\n <div class=\"box-model-container\">\n <BoxModel v-if="
},
{
"path": "src/panels/element/TabStyles.vue",
"chars": 3941,
"preview": "<template>\n <div class=\"tab-style source-code\" v-prevent-bkg-scroll>\n <div v-for=\"(styleSheet, i) in displayStyleShe"
},
{
"path": "src/panels/element/Tag.vue",
"chars": 2593,
"preview": "<template>\n <!-- 不要换行,否则内容前后多出空白符 -->\n <span v-if=\"type === 'start'\" class=\"tag tag--start\" @click=\"$emit('click')\">\n "
},
{
"path": "src/panels/index.js",
"chars": 357,
"preview": "export { default as SettingsPanel } from \"./settings/SettingsPanel.vue\";\nexport { default as NetworkPanel } from \"./netw"
},
{
"path": "src/panels/network/HttpStatus.js",
"chars": 1792,
"preview": "export default {\n \"100\": \"Continue\",\n \"101\": \"Switching Protocols\",\n \"102\": \"Processing\",\n \"200\": \"OK\",\n \"201\": \"Cr"
},
{
"path": "src/panels/network/NetworkPanel.vue",
"chars": 12721,
"preview": "<template>\n <div class=\"network-panel\">\n <div class=\"head\">\n <span class=\"cell cell--long\" :style=\"{'max-width'"
},
{
"path": "src/panels/network/NetworkRequest.vue",
"chars": 3015,
"preview": "<template>\n <div class=\"request\">\n <div class=\"row\" @click=\"$emit('click')\" :class=\"{selected: isSelected, even: isE"
},
{
"path": "src/panels/network/RequestType.js",
"chars": 74,
"preview": "// 请求类型\nexport default Object.freeze({\n XHR: \"xhr\",\n FETCH: \"fetch\"\n});\n"
},
{
"path": "src/panels/network/TabHeaders.vue",
"chars": 6285,
"preview": "<template>\n <div class=\"tab-headers\">\n <div class=\"section\">\n <div class=\"header\">\n <div class=\"title\">G"
},
{
"path": "src/panels/network/TabPreview.vue",
"chars": 2308,
"preview": "<template>\n <div class=\"tab-preview\">\n <div v-if=\"isImage\" class=\"image-container\">\n <img :src=\"requestInfo.url"
},
{
"path": "src/panels/network/TabResponse.vue",
"chars": 1329,
"preview": "<template>\n <div class=\"tab-response\">\n <VHighlightView\n v-if=\"isTextData\"\n class=\"data\"\n :language=\""
},
{
"path": "src/panels/settings/SettingsPanel.vue",
"chars": 9702,
"preview": "<template>\n <div v-if=\"value\" class=\"settings-panel\">\n <div class=\"toolbar\">\n <VIcon @click=\"onClickClose\" name"
},
{
"path": "src/plugins/Plugin.js",
"chars": 2139,
"preview": "/**\n * 插件基类\n */\nimport { isFunction } from \"@/utils\";\nimport { VFootBar, VIcon, VTabBar, VTabBarItem, VHighlightView, VJ"
},
{
"path": "src/plugins/index.js",
"chars": 164,
"preview": "export { default as pluginManager } from \"./pluginManager\";\nexport { default as pluginEvents } from \"./pluginEvents\";\nex"
},
{
"path": "src/plugins/pluginEvents.js",
"chars": 391,
"preview": "/**\n * 插件事件\n *\n * 约定:事件名称与插件的生命周期方法同名\n */\nexport default Object.freeze({\n // 插件 DOM 已渲染\n WEB_CONSOLE_READY: \"onWebCons"
},
{
"path": "src/plugins/pluginManager.js",
"chars": 1570,
"preview": "/**\n * 插件管理\n */\nimport { eventBus, EventBus } from \"@/utils\";\nimport Plugin from \"./Plugin\";\n\nclass PluginManager extend"
},
{
"path": "src/polyfill.js",
"chars": 830,
"preview": "if (Element.prototype.matches === undefined) {\n Element.prototype.matches =\n Element.prototype.matchesSelector ||\n "
},
{
"path": "src/styles/_global.scss",
"chars": 1407,
"preview": "@import \"variables\";\n\n// 全局样式\n.web-console {\n font-size: $primary-font-size;\n font-family: $font-family;\n -webkit-fon"
},
{
"path": "src/styles/_mixins.scss",
"chars": 870,
"preview": "// 隐藏滚动条(刷新后生效)\n@mixin hide-scrollbar {\n &::-webkit-scrollbar {\n display: none;\n overflow: -moz-scrollbars-none;\n"
},
{
"path": "src/styles/_triangles.scss",
"chars": 650,
"preview": "@mixin triangles-collapse($border-width: 4px, $color: black) {\n display: inline-block;\n content: \"\";\n width: 0;\n hei"
},
{
"path": "src/styles/_variables.scss",
"chars": 1154,
"preview": "/* web-console UI structure */\n$panel-height: 75vh;\n\n$footbar-height: 40px;\n\n$tabbar-height: 40px;\n\n$list-row-height: 38"
},
{
"path": "src/utils/EventBus.js",
"chars": 1316,
"preview": "import Vue from \"vue\";\nimport Logger from \"./Logger\";\n\nconst logger = new Logger(\"[EventBus]\");\nclass EventBus {\n const"
},
{
"path": "src/utils/Logger.js",
"chars": 913,
"preview": "import { isDev, isString } from \"./miscs\";\n\n/* 原始的 console 方法 */\nconst _error = window.console.error;\nconst _log = wind"
},
{
"path": "src/utils/TaskScheduler.js",
"chars": 2261,
"preview": "import { isFunction } from \"./miscs\";\n// import Logger from \"./Logger\";\n\n// const logger = new Logger(\"[TaskScheduler]\")"
},
{
"path": "src/utils/consoleHooks.js",
"chars": 1297,
"preview": "import { uuid, createStack } from \"./miscs\";\n\n// hook console\n// install 前的 console 接口\nconst originConsole = {};\n// inst"
},
{
"path": "src/utils/filters.js",
"chars": 134,
"preview": "export default {\n lowerCase: input => {\n if (typeof input !== \"string\") return input;\n else return input.toLowerC"
},
{
"path": "src/utils/index.js",
"chars": 341,
"preview": "export { default as Style } from \"./style\";\nexport { default as filters } from \"./filters\";\nexport { default as Logger }"
},
{
"path": "src/utils/miscs.js",
"chars": 2424,
"preview": "export { default as cloneDeep } from \"lodash.clonedeep\";\n\nexport const isNull = v => v === null;\nexport const isUndefine"
},
{
"path": "src/utils/style.js",
"chars": 6482,
"preview": "/**\n * 处理 CSS 样式的工具方法\n */\nimport { compare } from \"specificity\";\nimport Logger from \"./Logger\";\n\nconst logger = new Logg"
},
{
"path": "tests/api/data/response.css",
"chars": 71,
"preview": "@import \"aa\";\n\n.aa {\n color: red;\n background: rgb(50%, 50%, 50%);\n}\n"
},
{
"path": "tests/api/data/response.html",
"chars": 286,
"preview": "<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\""
},
{
"path": "tests/api/data/response.js",
"chars": 370,
"preview": "function sayHello(params) {\n console.log(params);\n Array.prototype.every.call(this, 1, 2);\n var a = {\n 1: 100,\n "
},
{
"path": "tests/api/data/response.json",
"chars": 192,
"preview": "{\n \"a\": 1,\n \"b\": true,\n \"c\": \"c\",\n \"d\": [1.23, true, \"c\", { \"a\": 1, \"b\": 2 }],\n \"e\": {\n \"a\": 1,\n \"b\": true,\n "
},
{
"path": "tests/api/data/response.txt",
"chars": 15,
"preview": "plain text data"
},
{
"path": "tests/api/index.js",
"chars": 3626,
"preview": "var http = require(\"http\");\nvar fs = require(\"fs\");\nconst url = require(\"url\");\n\nconst routes = {\n \"/get_data\": functio"
},
{
"path": "tests/e2e/.eslintrc",
"chars": 138,
"preview": "{\n \"plugins\": [\n \"cypress\"\n ],\n \"env\": {\n \"mocha\": true,\n \"cypress/globals\": true\n },\n \"rules\": {\n \"str"
},
{
"path": "tests/e2e/plugins/index.js",
"chars": 356,
"preview": "// https://docs.cypress.io/guides/guides/plugins-guide.html\n\nmodule.exports = (on, config) => {\n return Object.assign({"
},
{
"path": "tests/e2e/specs/test.js",
"chars": 206,
"preview": "// https://docs.cypress.io/api/introduction/api.html\n\ndescribe('My First Test', () => {\n it('Visits the Kitchen Sink', "
},
{
"path": "tests/e2e/support/commands.js",
"chars": 841,
"preview": "// ***********************************************\n// This example commands.js shows you how to\n// create various custom"
},
{
"path": "tests/e2e/support/index.js",
"chars": 670,
"preview": "// ***********************************************************\n// This example support/index.js is processed and\n// load"
},
{
"path": "tests/unit/.eslintrc",
"chars": 100,
"preview": "{\n \"env\": {\n \"jest\": true\n },\n \"rules\": {\n \"import/no-extraneous-dependencies\": \"off\"\n }\n}"
},
{
"path": "tests/unit/HelloWorld.spec.js",
"chars": 329,
"preview": "import { shallow } from '@vue/test-utils'\nimport HelloWorld from '@/components/HelloWorld.vue'\n\ndescribe('HelloWorld.vue"
},
{
"path": "tsconfig.json",
"chars": 118,
"preview": "{\n \"compilerOptions\": {\n \"baseUrl\": \".\",\n \"paths\": {\n \"@\": [\"./src\"],\n \"@/*\": [\"./src/*\"]\n }\n }\n}"
},
{
"path": "vue.config.js",
"chars": 639,
"preview": "const path = require(\"path\");\n\n/** 以 VUE_APP_* 开头的环境变量会替换代码中相应的变量 */\nconst npmPkg = require(\"./package.json\");\nprocess.e"
}
]
About this extraction
This page contains the full source code of the whinc/web-console GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 97 files (557.2 KB), approximately 156.6k tokens, and a symbol index with 435 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.