/******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 261); /******/ }) /************************************************************************/ /******/ ({ /***/ 0: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return classify; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return camelize; }); /* unused harmony export kebabize */ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return getComponentDisplayName; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "p", function() { return inDoc; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return UNDEFINED; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return INFINITY; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return NEGATIVE_INFINITY; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return NAN; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return SPECIAL_TOKENS; }); /* unused harmony export MAX_STRING_SIZE */ /* unused harmony export MAX_ARRAY_SIZE */ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "x", function() { return specialTokenToString; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "y", function() { return stringify; }); /* unused harmony export getCustomMapDetails */ /* unused harmony export reviveMap */ /* unused harmony export getCustomSetDetails */ /* unused harmony export reviveSet */ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "m", function() { return getComponentName; }); /* unused harmony export getCustomComponentDefinitionDetails */ /* unused harmony export getCustomFunctionDetails */ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "n", function() { return getCustomRefDetails; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "s", function() { return parse; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "q", function() { return isPlainObject; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "u", function() { return searchDeepInObject; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "w", function() { return sortByKey; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "v", function() { return set; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return get; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "o", function() { return has; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "t", function() { return scrollIntoView; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return focusInput; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "r", function() { return openInEditor; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return escape; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return copyToClipboard; }); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(23); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _transfer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(15); /* harmony import */ var _back__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(14); /* harmony import */ var _back_vuex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(10); /* harmony import */ var _back_router__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(13); /* harmony import */ var _shared_data__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3); /* harmony import */ var _env__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(1); function cached (fn) { const cache = Object.create(null) return function cachedFn (str) { const hit = cache[str] return hit || (cache[str] = fn(str)) } } const classifyRE = /(?:^|[-_/])(\w)/g const classify = cached((str) => { return str && str.replace(classifyRE, toUpper) }) const camelizeRE = /-(\w)/g const camelize = cached((str) => { return str.replace(camelizeRE, toUpper) }) const kebabizeRE = /([a-z0-9])([A-Z])/g const kebabize = cached((str) => { return str && str .replace(kebabizeRE, (_, lowerCaseCharacter, upperCaseLetter) => { return `${lowerCaseCharacter}-${upperCaseLetter}` }) .toLowerCase() }) function toUpper (_, c) { return c ? c.toUpperCase() : '' } function getComponentDisplayName (originalName, style = 'class') { switch (style) { case 'class': return classify(originalName) case 'kebab': return kebabize(originalName) case 'original': default: return originalName } } function inDoc (node) { if (!node) return false const doc = node.ownerDocument.documentElement const parent = node.parentNode return doc === node || doc === parent || !!(parent && parent.nodeType === 1 && (doc.contains(parent))) } /** * Stringify/parse data using CircularJSON. */ const UNDEFINED = '__vue_devtool_undefined__' const INFINITY = '__vue_devtool_infinity__' const NEGATIVE_INFINITY = '__vue_devtool_negative_infinity__' const NAN = '__vue_devtool_nan__' const SPECIAL_TOKENS = { 'true': true, 'false': false, 'undefined': UNDEFINED, 'null': null, '-Infinity': NEGATIVE_INFINITY, 'Infinity': INFINITY, 'NaN': NAN } const MAX_STRING_SIZE = 10000 const MAX_ARRAY_SIZE = 5000 function specialTokenToString (value) { if (value === null) { return 'null' } else if (value === UNDEFINED) { return 'undefined' } else if (value === NAN) { return 'NaN' } else if (value === INFINITY) { return 'Infinity' } else if (value === NEGATIVE_INFINITY) { return '-Infinity' } return false } /** * Needed to prevent stack overflow * while replacing complex objects * like components because we create * new objects with the CustomValue API * (.i.e `{ _custom: { ... } }`) */ class EncodeCache { constructor () { this.map = new Map() } /** * Returns a result unique to each input data * @param {*} data Input data * @param {*} factory Function used to create the unique result */ cache (data, factory) { const cached = this.map.get(data) if (cached) { return cached } else { const result = factory(data) this.map.set(data, result) return result } } clear () { this.map.clear() } } const encodeCache = new EncodeCache() function stringify (data) { // Create a fresh cache for each serialization encodeCache.clear() return _transfer__WEBPACK_IMPORTED_MODULE_1__[/* stringify */ "b"](data, replacer) } function replacer (key) { const val = this[key] const type = typeof val if (Array.isArray(val)) { const l = val.length if (l > MAX_ARRAY_SIZE) { return { _isArray: true, length: l, items: val.slice(0, MAX_ARRAY_SIZE) } } return val } else if (typeof val === 'string') { if (val.length > MAX_STRING_SIZE) { return val.substr(0, MAX_STRING_SIZE) + `... (${(val.length)} total length)` } else { return val } } else if (type === 'undefined') { return UNDEFINED } else if (val === Infinity) { return INFINITY } else if (val === -Infinity) { return NEGATIVE_INFINITY } else if (type === 'function') { return getCustomFunctionDetails(val) } else if (type === 'symbol') { return `[native Symbol ${Symbol.prototype.toString.call(val)}]` } else if (val !== null && type === 'object') { const proto = Object.prototype.toString.call(val) if (proto === '[object Map]') { return encodeCache.cache(val, () => getCustomMapDetails(val)) } else if (proto === '[object Set]') { return encodeCache.cache(val, () => getCustomSetDetails(val)) } else if (proto === '[object RegExp]') { // special handling of native type return `[native RegExp ${RegExp.prototype.toString.call(val)}]` } else if (proto === '[object Date]') { return `[native Date ${Date.prototype.toString.call(val)}]` } else if (proto === '[object Error]') { return `[native Error ${val.message}]` } else if (val.state && val._vm) { return encodeCache.cache(val, () => Object(_back_vuex__WEBPACK_IMPORTED_MODULE_3__[/* getCustomStoreDetails */ "a"])(val)) } else if (val.constructor && val.constructor.name === 'VueRouter') { return encodeCache.cache(val, () => Object(_back_router__WEBPACK_IMPORTED_MODULE_4__[/* getCustomRouterDetails */ "a"])(val)) } else if (val._isVue) { return encodeCache.cache(val, () => Object(_back__WEBPACK_IMPORTED_MODULE_2__[/* getCustomInstanceDetails */ "a"])(val)) } else if (typeof val.render === 'function') { return encodeCache.cache(val, () => getCustomComponentDefinitionDetails(val)) } else if (val.constructor && val.constructor.name === 'VNode') { return `[native VNode <${val.tag}>]` } } else if (Number.isNaN(val)) { return NAN } return sanitize(val) } function getCustomMapDetails (val) { const list = [] val.forEach( (value, key) => list.push({ key, value }) ) return { _custom: { type: 'map', display: 'Map', value: list, readOnly: true, fields: { abstract: true } } } } function reviveMap (val) { const result = new Map() const list = val._custom.value for (let i = 0; i < list.length; i++) { const { key, value } = list[i] result.set(key, reviver(null, value)) } return result } function getCustomSetDetails (val) { const list = Array.from(val) return { _custom: { type: 'set', display: `Set[${list.length}]`, value: list, readOnly: true } } } function reviveSet (val) { const result = new Set() const list = val._custom.value for (let i = 0; i < list.length; i++) { const value = list[i] result.add(reviver(null, value)) } return result } // Use a custom basename functions instead of the shimed version // because it doesn't work on Windows function basename (filename, ext) { return path__WEBPACK_IMPORTED_MODULE_0___default.a.basename( filename.replace(/^[a-zA-Z]:/, '').replace(/\\/g, '/'), ext ) } function getComponentName (options) { const name = options.name || options._componentTag if (name) { return name } const file = options.__file // injected by vue-loader if (file) { return classify(basename(file, '.vue')) } } function getCustomComponentDefinitionDetails (def) { let display = getComponentName(def) if (display) { if (def.name && def.__file) { display += ` (${def.__file})` } } else { display = 'Unknown Component' } return { _custom: { type: 'component-definition', display, tooltip: 'Component definition', ...def.__file ? { file: def.__file } : {} } } } function getCustomFunctionDetails (func) { let string = '' let matches = null try { string = Function.prototype.toString.call(func) matches = String.prototype.match.call(string, /\([\s\S]*?\)/) } catch (e) { // Func is probably a Proxy, which can break Function.prototype.toString() } // Trim any excess whitespace from the argument string const match = matches && matches[0] const args = typeof match === 'string' ? `(${match.substr(1, match.length - 2).split(',').map(a => a.trim()).join(', ')})` : '(?)' const name = typeof func.name === 'string' ? func.name : '' return { _custom: { type: 'function', display: `ƒ ${escape(name)}${args}` } } } function getCustomRefDetails (instance, key, ref) { let value if (Array.isArray(ref)) { value = ref.map((r) => getCustomRefDetails(instance, key, r)).map(data => data.value) } else { let name if (ref._isVue) { name = getComponentName(ref.$options) } else { name = ref.tagName.toLowerCase() } value = { _custom: { display: `<${name}` + (ref.id ? ` id="${ref.id}"` : '') + (ref.className ? ` class="${ref.className}"` : '') + '>', uid: instance.__VUE_DEVTOOLS_UID__, type: 'reference' } } } return { type: '$refs', key: key, value, editable: false } } function parse (data, revive) { return revive ? _transfer__WEBPACK_IMPORTED_MODULE_1__[/* parse */ "a"](data, reviver) : _transfer__WEBPACK_IMPORTED_MODULE_1__[/* parse */ "a"](data) } const specialTypeRE = /^\[native (\w+) (.*)\]$/ const symbolRE = /^\[native Symbol Symbol\((.*)\)\]$/ function reviver (key, val) { if (val === UNDEFINED) { return undefined } else if (val === INFINITY) { return Infinity } else if (val === NEGATIVE_INFINITY) { return -Infinity } else if (val === NAN) { return NaN } else if (val && val._custom) { if (val._custom.type === 'component') { return _back__WEBPACK_IMPORTED_MODULE_2__[/* instanceMap */ "d"].get(val._custom.id) } else if (val._custom.type === 'map') { return reviveMap(val) } else if (val._custom.type === 'set') { return reviveSet(val) } } else if (symbolRE.test(val)) { const [, string] = symbolRE.exec(val) return Symbol.for(string) } else if (specialTypeRE.test(val)) { const [, type, string] = specialTypeRE.exec(val) return new window[type](string) } else { return val } } /** * Sanitize data to be posted to the other side. * Since the message posted is sent with structured clone, * we need to filter out any types that might cause an error. * * @param {*} data * @return {*} */ function sanitize (data) { if ( !isPrimitive(data) && !Array.isArray(data) && !isPlainObject(data) ) { // handle types that will probably cause issues in // the structured clone return Object.prototype.toString.call(data) } else { return data } } function isPlainObject (obj) { return Object.prototype.toString.call(obj) === '[object Object]' } function isPrimitive (data) { if (data == null) { return true } const type = typeof data return ( type === 'string' || type === 'number' || type === 'boolean' ) } /** * Searches a key or value in the object, with a maximum deepness * @param {*} obj Search target * @param {string} searchTerm Search string * @returns {boolean} Search match */ function searchDeepInObject (obj, searchTerm) { const seen = new Map() const result = internalSearchObject(obj, searchTerm.toLowerCase(), seen, 0) seen.clear() return result } const SEARCH_MAX_DEPTH = 10 /** * Executes a search on each field of the provided object * @param {*} obj Search target * @param {string} searchTerm Search string * @param {Map} seen Map containing the search result to prevent stack overflow by walking on the same object multiple times * @param {number} depth Deep search depth level, which is capped to prevent performance issues * @returns {boolean} Search match */ function internalSearchObject (obj, searchTerm, seen, depth) { if (depth > SEARCH_MAX_DEPTH) { return false } let match = false const keys = Object.keys(obj) let key, value for (let i = 0; i < keys.length; i++) { key = keys[i] value = obj[key] match = internalSearchCheck(searchTerm, key, value, seen, depth + 1) if (match) { break } } return match } /** * Executes a search on each value of the provided array * @param {*} array Search target * @param {string} searchTerm Search string * @param {Map} seen Map containing the search result to prevent stack overflow by walking on the same object multiple times * @param {number} depth Deep search depth level, which is capped to prevent performance issues * @returns {boolean} Search match */ function internalSearchArray (array, searchTerm, seen, depth) { if (depth > SEARCH_MAX_DEPTH) { return false } let match = false let value for (let i = 0; i < array.length; i++) { value = array[i] match = internalSearchCheck(searchTerm, null, value, seen, depth + 1) if (match) { break } } return match } /** * Checks if the provided field matches the search terms * @param {string} searchTerm Search string * @param {string} key Field key (null if from array) * @param {*} value Field value * @param {Map} seen Map containing the search result to prevent stack overflow by walking on the same object multiple times * @param {number} depth Deep search depth level, which is capped to prevent performance issues * @returns {boolean} Search match */ function internalSearchCheck (searchTerm, key, value, seen, depth) { let match = false let result if (key === '_custom') { key = value.display value = value.value } (result = specialTokenToString(value)) && (value = result) if (key && compare(key, searchTerm)) { match = true seen.set(value, true) } else if (seen.has(value)) { match = seen.get(value) } else if (Array.isArray(value)) { seen.set(value, null) match = internalSearchArray(value, searchTerm, seen, depth) seen.set(value, match) } else if (isPlainObject(value)) { seen.set(value, null) match = internalSearchObject(value, searchTerm, seen, depth) seen.set(value, match) } else if (compare(value, searchTerm)) { match = true seen.set(value, true) } return match } /** * Compares two values * @param {*} value Mixed type value that will be cast to string * @param {string} searchTerm Search string * @returns {boolean} Search match */ function compare (value, searchTerm) { return ('' + value).toLowerCase().indexOf(searchTerm) !== -1 } function sortByKey (state) { return state && state.slice().sort((a, b) => { if (a.key < b.key) return -1 if (a.key > b.key) return 1 return 0 }) } function set (object, path, value, cb = null) { const sections = Array.isArray(path) ? path : path.split('.') while (sections.length > 1) { object = object[sections.shift()] } const field = sections[0] if (cb) { cb(object, field, value) } else { object[field] = value } } function get (object, path) { const sections = Array.isArray(path) ? path : path.split('.') for (let i = 0; i < sections.length; i++) { object = object[sections[i]] if (!object) { return undefined } } return object } function has (object, path, parent = false) { if (typeof object === 'undefined') { return false } const sections = Array.isArray(path) ? path : path.split('.') const size = !parent ? 1 : 2 while (object && sections.length > size) { object = object[sections.shift()] } return object != null && object.hasOwnProperty(sections[0]) } function scrollIntoView (scrollParent, el, center = true) { const parentTop = scrollParent.scrollTop const parentHeight = scrollParent.offsetHeight const elBounds = el.getBoundingClientRect() const parentBounds = scrollParent.getBoundingClientRect() const top = elBounds.top - parentBounds.top + scrollParent.scrollTop const height = el.offsetHeight if (center) { scrollParent.scrollTop = top + (height - parentHeight) / 2 } else if (top < parentTop) { scrollParent.scrollTop = top } else if (top + height > parentTop + parentHeight) { scrollParent.scrollTop = top - parentHeight + height } } function focusInput (el) { el.focus() el.setSelectionRange(0, el.value.length) } function openInEditor (file) { // Console display const fileName = file.replace(/\\/g, '\\\\') const src = `fetch('${_shared_data__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"].openInEditorHost}__open-in-editor?file=${encodeURI(file)}').then(response => { if (response.ok) { console.log('File ${fileName} opened in editor') } else { const msg = 'Opening component ${fileName} failed' const target = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : {} if (target.__VUE_DEVTOOLS_TOAST__) { target.__VUE_DEVTOOLS_TOAST__(msg, 'error') } else { console.log('%c' + msg, 'color:red') } console.log('Check the setup of your project, see https://github.com/vuejs/vue-devtools/blob/master/docs/open-in-editor.md') } })` if (_env__WEBPACK_IMPORTED_MODULE_6__[/* isChrome */ "c"]) { chrome.devtools.inspectedWindow.eval(src) } else { // eslint-disable-next-line no-eval eval(src) } } const ESC = { '<': '<', '>': '>', '"': '"', '&': '&' } function escape (s) { return s.replace(/[<>"&]/g, escapeChar) } function escapeChar (a) { return ESC[a] || a } function copyToClipboard (state) { if (typeof document === 'undefined') return const dummyTextArea = document.createElement('textarea') dummyTextArea.textContent = stringify(state) document.body.appendChild(dummyTextArea) dummyTextArea.select() document.execCommand('copy') document.body.removeChild(dummyTextArea) } /***/ }), /***/ 1: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return isBrowser; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return target; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return isChrome; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return isFirefox; }); /* unused harmony export isWindows */ /* unused harmony export isMac */ /* unused harmony export isLinux */ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return keys; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return initEnv; }); const isBrowser = typeof navigator !== 'undefined' const target = isBrowser ? window : typeof global !== 'undefined' ? global : {} const isChrome = typeof chrome !== 'undefined' && !!chrome.devtools const isFirefox = isBrowser && navigator.userAgent.indexOf('Firefox') > -1 const isWindows = isBrowser && navigator.platform.indexOf('Win') === 0 const isMac = isBrowser && navigator.platform === 'MacIntel' const isLinux = isBrowser && navigator.platform.indexOf('Linux') === 0 const keys = { ctrl: isMac ? '⌘' : 'Ctrl', shift: 'Shift', alt: isMac ? '⌥' : 'Alt', del: 'Del', enter: 'Enter', esc: 'Esc' } function initEnv (Vue) { if (Vue.prototype.hasOwnProperty('$isChrome')) return Object.defineProperties(Vue.prototype, { '$isChrome': { get: () => isChrome }, '$isFirefox': { get: () => isFirefox }, '$isWindows': { get: () => isWindows }, '$isMac': { get: () => isMac }, '$isLinux': { get: () => isLinux }, '$keys': { get: () => keys } }) if (isWindows) document.body.classList.add('platform-windows') if (isMac) document.body.classList.add('platform-mac') if (isLinux) document.body.classList.add('platform-linux') } /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(8))) /***/ }), /***/ 10: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return initVuexBackend; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return getCustomStoreDetails; }); /* harmony import */ var _utils_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0); /* harmony import */ var _utils_shared_data__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3); /* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); /* harmony import */ var _clone__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6); const isProd = "production" === 'production' class VuexBackend { constructor (hook, bridge, isLegacy) { bridge.send('vuex:init') this.hook = hook this.bridge = bridge this.isLegacy = isLegacy this.store = hook.store // Flush info from hook // (for example, modules registered before backend was created) this.earlyModules = hook.flushStoreModules() /** Initial store state */ this.initialState = this.hook.initialState /** Internal store vm for mutation replaying */ this.snapshotsVm = null /** Initial snapshot */ this.baseStateSnapshot = null /** Snapshot cache */ this.stateSnapshotCache = null /** Mutation history */ this.mutations = null /** Last replayed state */ this.lastState = null /** Currently registered dynamic modules */ this.registeredModules = {} /** All dynamic modules ever registered, useful for mutation replaying */ this.allTimeModules = {} /** Legacy base state */ this.legacyBaseSnapshot = null // First-time snapshot VM creation this.resetSnapshotsVm() // Initial setup this.reset() // Override dynamic module handling in vuex if (this.store.registerModule) { this.origRegisterModule = this.store.registerModule.bind(this.store) this.store.registerModule = (path, module, options) => { this.addModule(path, module, options) this.origRegisterModule(path, module, options) if (!isProd) console.log('register module', path) } this.origUnregisterModule = this.store.unregisterModule.bind(this.store) this.store.unregisterModule = (path) => { this.removeModule(path) this.origUnregisterModule(path) if (!isProd) console.log('unregister module', path) } } else { this.origRegisterModule = this.origUnregisterModule = () => {} } // Register modules that were added before backend was created this.earlyModules.forEach(({ path, module, options }) => { const moduleInfo = this.addModule(path, module, options) moduleInfo.early = true }) // deal with multiple backend injections hook.off('vuex:mutation') // application -> devtool hook.on('vuex:mutation', this.onMutation.bind(this)) // devtool -> application bridge.on('vuex:travel-to-state', this.onTravelToState.bind(this)) bridge.on('vuex:commit-all', this.onCommitAll.bind(this)) bridge.on('vuex:revert-all', this.onRevertAll.bind(this)) bridge.on('vuex:commit', this.onCommit.bind(this)) bridge.on('vuex:revert', this.onRevert.bind(this)) bridge.on('vuex:import-state', this.onImportState.bind(this)) bridge.on('vuex:inspect-state', this.onInspectState.bind(this)) bridge.on('vuex:edit-state', this.onEditState.bind(this)) } /** * Register a mutation record */ onMutation ({ type, payload }) { if (!_utils_shared_data__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"].recordVuex) return this.addMutation(type, payload) } /** * Time-travel to the state of a specific mutation (by index) */ onTravelToState ({ index, apply }) { const snapshot = this.replayMutations(index) const state = Object(_clone__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"])(this.lastState) this.bridge.send('vuex:inspected-state', { index, snapshot }) if (apply) { this.ensureRegisteredModules(this.mutations[index]) this.hook.emit('vuex:travel-to-state', state) } } onCommitAll () { this.reset(this.lastState) } onRevertAll () { this.reset() } /** * Reset the base state to a specific mutation (by index) * * ⚠️ State should be time-traveled to before executing this */ onCommit (index) { if (_utils_shared_data__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"].vuexNewBackend) { this.baseStateSnapshot = this.lastState } else { this.legacyBaseSnapshot = this.mutations[index].snapshot } this.resetSnapshotCache() this.mutations = this.mutations.slice(index + 1) this.mutations.forEach((mutation, index) => { mutation.index = index }) } /** * Removes mutations after a specific mutation (by index) * * ⚠️ State should be time-traveled to before executing this */ onRevert (index) { this.resetSnapshotCache() this.ensureRegisteredModules(this.mutations[index - 1]) this.mutations = this.mutations.slice(0, index) } /** * Parse and time-travel to a state */ onImportState (state) { const parsed = Object(_utils_util__WEBPACK_IMPORTED_MODULE_0__[/* parse */ "s"])(state, true) this.initialState = parsed this.hook.emit('vuex:travel-to-state', parsed) this.reset() this.bridge.send('vuex:init') this.onInspectState(-1) } /** * If the index is -1, sends the base state. * Else replays the mutations up to the mutation. */ onInspectState (index) { const snapshot = this.replayMutations(index) this.bridge.send('vuex:inspected-state', { index, snapshot }) } onEditState ({ index, value, path }) { let parsedValue if (value) { parsedValue = Object(_utils_util__WEBPACK_IMPORTED_MODULE_0__[/* parse */ "s"])(value, true) } this.store._committing = true Object(_utils_util__WEBPACK_IMPORTED_MODULE_0__[/* set */ "v"])(this.store.state, path, parsedValue) this.store._committing = false this.bridge.send('vuex:inspected-state', { index, snapshot: this.getStoreSnapshot() }) this.cacheStateSnapshot(index, true) } /** * Should be called when store structure changes, * for example when a dynamic module is registered */ resetSnapshotsVm (state) { this.snapshotsVm = new vue__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"]({ data: { $$state: state || {} }, computed: this.store._vm.$options.computed }) } /** * Reset vuex backend */ reset (stateSnapshot = null) { if (_utils_shared_data__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"].vuexNewBackend) { this.baseStateSnapshot = stateSnapshot || Object(_clone__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"])(this.initialState) } else { this.legacyBaseSnapshot = this.stringifyStore() } this.mutations = [] this.resetSnapshotCache() } resetSnapshotCache () { this.stateSnapshotCache = [ { index: -1, state: this.baseStateSnapshot, permanent: true } ] } /** * Handle adding a dynamic store module */ addModule (path, module, options) { if (typeof path === 'string') path = [path] let state if (options && options.preserveState) { state = Object(_utils_util__WEBPACK_IMPORTED_MODULE_0__[/* get */ "k"])(this.store.state, path) } if (!state) { state = typeof module.state === 'function' ? module.state() : module.state } if (!state) { state = {} } const fakeModule = { ...module } if (_utils_shared_data__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"].vuexNewBackend) { // Ensure all children state are cloned const replaceNestedStates = (nestedModule) => { if (nestedModule.modules) { Object.keys(nestedModule.modules).forEach(key => { const child = nestedModule.modules[key] let state = {} if (child.state) { state = typeof child.state === 'function' ? child.state() : child.state } child.state = Object(_clone__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"])(state) replaceNestedStates(child) }) } } replaceNestedStates(fakeModule) } const key = path.join('/') const moduleInfo = this.registeredModules[key] = this.allTimeModules[key] = { path, module: fakeModule, options: { ...options, preserveState: false }, state: _utils_shared_data__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"].vuexNewBackend ? Object(_clone__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"])(state) : null } if (_utils_shared_data__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"].recordVuex) { this.addMutation(`Register module: ${key}`, { path, module, options }, { registerModule: true }) } return moduleInfo } /** * Handle removing a dynamic store module */ removeModule (path) { if (typeof path === 'string') path = [path] delete this.registeredModules[path.join('/')] if (_utils_shared_data__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"].recordVuex) { this.addMutation(`Unregister module: ${path.join('/')}`, { path }, { unregisterModule: true }) } } /** * Make sure all (and only) the dynamic modules present at the moment of a mutation * are correctly registered in the store */ ensureRegisteredModules (mutation) { if (mutation) { mutation.registeredModules.forEach(m => { if (!Object.keys(this.registeredModules).sort((a, b) => a.length - b.length).includes(m)) { const data = this.allTimeModules[m] if (data) { const { path, module, options, state } = data this.origRegisterModule(path, { ...module, state: Object(_clone__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"])(state) }, options) this.registeredModules[path.join('/')] = data } } }) Object.keys(this.registeredModules).sort((a, b) => b.length - a.length).forEach(m => { if (!mutation.registeredModules.includes(m)) { this.origUnregisterModule(m.split('/')) delete this.registeredModules[m] } }) this.resetSnapshotsVm(this.store.state) } } /** * Check if the store as a specific dynamic module */ hasModule (path) { return !!this.store._modules.get(path) } stringifyStore () { return Object(_utils_util__WEBPACK_IMPORTED_MODULE_0__[/* stringify */ "y"])({ state: this.store.state, getters: getCatchedGetters(this.store), modules: Object.keys(this.store._modulesNamespaceMap || {}) .map(m => m.substr(0, m.length - 1)) .sort() }) } /** * Handle a new mutation commited to the store */ addMutation (type, payload, options = {}) { const index = this.mutations.length if (!_utils_shared_data__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"].vuexNewBackend) { options.snapshot = this.stringifyStore() } this.mutations.push({ type, payload: _utils_shared_data__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"].vuexNewBackend ? Object(_clone__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"])(payload) : null, index, handlers: this.store._mutations[type], registeredModules: Object.keys(this.registeredModules), ...options }) this.bridge.send('vuex:mutation', { mutation: { type: type, payload: Object(_utils_util__WEBPACK_IMPORTED_MODULE_0__[/* stringify */ "y"])(payload), index }, timestamp: Date.now(), options }) } /** * Replays mutations from the base state up to a specific index * to re-create what the vuex state should be at this point */ replayMutations (index) { if (!_utils_shared_data__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"].vuexNewBackend) { const snapshot = index === -1 ? this.legacyBaseSnapshot : this.mutations[index].snapshot this.lastState = Object(_utils_util__WEBPACK_IMPORTED_MODULE_0__[/* parse */ "s"])(snapshot, true).state return snapshot } const originalVm = this.store._vm const originalState = Object(_clone__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"])(this.store.state) this.store._vm = this.snapshotsVm let tempRemovedModules = [] let tempAddedModules = [] // If base state, we need to remove all dynamic registered modules // to prevent errors because their state is missing if (index === -1) { tempRemovedModules = Object.keys(this.registeredModules) tempRemovedModules.filter(m => this.hasModule(m.split('/'))).sort((a, b) => b.length - a.length).forEach(m => { this.origUnregisterModule(m.split('/')) if (!isProd) console.log('before replay unregister', m) }) } // Get most recent snapshot for target index // for faster replay let stateSnapshot for (let i = 0; i < this.stateSnapshotCache.length; i++) { const s = this.stateSnapshotCache[i] if (s.index > index) { break } else { stateSnapshot = s } } let resultState // Snapshot was already replayed if (stateSnapshot.index === index) { resultState = stateSnapshot.state const state = Object(_clone__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"])(stateSnapshot.state) this.resetSnapshotsVm(state) this.store.replaceState(state) } else { // Update state when using fake vm to properly temporarily remove modules this.resetSnapshotsVm(originalState) this.store.replaceState(originalState) // Temporarily remove modules if they where not present during first mutation being replayed const startMutation = this.mutations[stateSnapshot.index] if (startMutation) { tempRemovedModules = Object.keys(this.registeredModules).filter(m => !startMutation.registeredModules.includes(m)) } else { tempRemovedModules = Object.keys(this.registeredModules) } tempRemovedModules.filter(m => this.hasModule(m.split('/'))).sort((a, b) => b.length - a.length).forEach(m => { this.origUnregisterModule(m.split('/')) if (!isProd) console.log('before replay unregister', m) }) const state = Object(_clone__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"])(stateSnapshot.state) this.resetSnapshotsVm(state) this.store.replaceState(state) _utils_shared_data__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"].snapshotLoading = true // Replay mutations for (let i = stateSnapshot.index + 1; i <= index; i++) { const mutation = this.mutations[i] if (mutation.registerModule) { const key = mutation.payload.path.join('/') const moduleInfo = this.allTimeModules[key] tempAddedModules.push(key) this.origRegisterModule(moduleInfo.path, { ...moduleInfo.module, state: Object(_clone__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"])(moduleInfo.state) }, moduleInfo.options) this.resetSnapshotsVm(this.store.state) if (!isProd) console.log('replay register module', moduleInfo) } else if (mutation.unregisterModule && this.hasModule(mutation.payload.path)) { const path = mutation.payload.path const index = tempAddedModules.indexOf(path.join('/')) if (index !== -1) tempAddedModules.splice(index, 1) this.origUnregisterModule(path) this.resetSnapshotsVm(this.store.state) if (!isProd) console.log('replay unregister module', path) } else if (mutation.handlers) { this.store._committing = true try { let payload = mutation.payload if (this.isLegacy && !Array.isArray(payload)) { payload = [payload] } if (Array.isArray(mutation.handlers)) { if (this.isLegacy) { mutation.handlers.forEach(handler => handler(this.store.state, ...payload)) } else { mutation.handlers.forEach(handler => handler(payload)) } } else { if (this.isLegacy) { mutation.handlers(this.store.state, ...payload) } else { mutation.handlers(payload) } } } catch (e) { throw e } this.store._committing = false } // Optimization: periodically cache snapshots if (i === index || (i % _utils_shared_data__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"].cacheVuexSnapshotsEvery === 0)) { this.cacheStateSnapshot(i) } } // Send final state after replay resultState = Object(_clone__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"])(this.store.state) if (!isProd) console.log(`replayed ${index - stateSnapshot.index} mutation(s)`) } this.lastState = resultState const result = this.stringifyStore() // Restore user state tempAddedModules.sort((a, b) => b.length - a.length).forEach(m => { this.origUnregisterModule(m.split('/')) if (!isProd) console.log('after replay unregister', m) }) tempRemovedModules.sort((a, b) => a.length - b.length).forEach(m => { const { path, module, options, state } = this.registeredModules[m] this.origRegisterModule(path, { ...module, state: Object(_clone__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"])(state) }, options) if (!isProd) console.log('after replay register', m) }) this.store._vm = originalVm return result } cacheStateSnapshot (index, permanent = false) { this.removeCachedStateSnapshot(index) this.stateSnapshotCache.push({ index, state: Object(_clone__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"])(this.store.state), permanent }) if (!isProd) console.log('cached snapshot', index) // Delete old cached snapshots if (this.stateSnapshotCache.filter(s => !s.permanent).length > _utils_shared_data__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"].cacheVuexSnapshotsLimit) { const i = this.stateSnapshotCache.findIndex(s => !s.permanent) if (i !== -1) { if (!isProd) console.log('clean cached snapshot', this.stateSnapshotCache[i].index) this.stateSnapshotCache.splice(i, 1) } } } removeCachedStateSnapshot (index) { const i = this.stateSnapshotCache.findIndex(s => s.idex === index) if (i !== -1) this.stateSnapshotCache.splice(i, 1) } /** * Get the serialized state and getters from the store */ getStoreSnapshot (stateSnapshot = null) { let originalVm if (stateSnapshot) { originalVm = this.store._vm this.store._vm = this.snapshotsVm this.store.replaceState(Object(_clone__WEBPACK_IMPORTED_MODULE_3__[/* default */ "a"])(stateSnapshot)) } const result = this.stringifyStore() if (stateSnapshot) { // Restore user state this.store._vm = originalVm } return result } } function initVuexBackend (hook, bridge, isLegacy) { // eslint-disable-next-line no-new new VuexBackend(hook, bridge, isLegacy) } function getCatchedGetters (store) { const getters = {} const origGetters = store.getters || {} const keys = Object.keys(origGetters) for (let i = 0; i < keys.length; i++) { const key = keys[i] Object.defineProperty(getters, key, { enumerable: true, get: () => { try { return origGetters[key] } catch (e) { return e } } }) } return getters } function getCustomStoreDetails (store) { return { _custom: { type: 'store', display: 'Store', value: { state: store.state, getters: getCatchedGetters(store) }, fields: { abstract: true } } } } /***/ }), /***/ 13: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return initRouterBackend; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return getCustomRouterDetails; }); /* harmony import */ var _utils_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0); function initRouterBackend (Vue, bridge, rootInstances) { let recording = true const getSnapshot = () => { const routeChanges = [] rootInstances.forEach(instance => { const router = instance._router if (router && router.options && router.options.routes) { routeChanges.push(...router.options.routes) } }) return Object(_utils_util__WEBPACK_IMPORTED_MODULE_0__[/* stringify */ "y"])({ routeChanges }) } bridge.send('routes:init', getSnapshot()) bridge.on('router:toggle-recording', enabled => { recording = enabled }) rootInstances.forEach(instance => { const router = instance._router if (router) { router.afterEach((to, from) => { if (!recording) return bridge.send('router:changed', Object(_utils_util__WEBPACK_IMPORTED_MODULE_0__[/* stringify */ "y"])({ to, from, timestamp: Date.now() })) }) bridge.send('router:init', Object(_utils_util__WEBPACK_IMPORTED_MODULE_0__[/* stringify */ "y"])({ mode: router.mode, current: { from: router.history.current, to: router.history.current, timestamp: Date.now() } })) if (router.matcher && router.matcher.addRoutes) { const addRoutes = router.matcher.addRoutes router.matcher.addRoutes = function (routes) { routes.forEach((item) => { bridge.send('routes:changed', Object(_utils_util__WEBPACK_IMPORTED_MODULE_0__[/* stringify */ "y"])(item)) }) addRoutes.call(this, routes) } } } }) } function getCustomRouterDetails (router) { return { _custom: { type: 'router', display: 'VueRouter', value: { options: router.options, currentRoute: router.currentRoute }, fields: { abstract: true } } } } /***/ }), /***/ 14: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; // EXTERNAL MODULE: /home/akryum/Projects/vue-devtools/node_modules/@vue-devtools/shared-utils/src/util.js var util = __webpack_require__(0); // EXTERNAL MODULE: /home/akryum/Projects/vue-devtools/node_modules/@vue-devtools/shared-utils/src/shared-data.js var shared_data = __webpack_require__(3); // EXTERNAL MODULE: /home/akryum/Projects/vue-devtools/node_modules/@vue-devtools/shared-utils/src/env.js var env = __webpack_require__(1); // CONCATENATED MODULE: /home/akryum/Projects/vue-devtools/node_modules/@vue-devtools/app-backend/src/highlighter.js let overlay let overlayContent function init () { if (overlay || !env["b" /* isBrowser */]) return overlay = document.createElement('div') overlay.style.backgroundColor = 'rgba(104, 182, 255, 0.35)' overlay.style.position = 'fixed' overlay.style.zIndex = '99999999999999' overlay.style.pointerEvents = 'none' overlay.style.display = 'flex' overlay.style.alignItems = 'center' overlay.style.justifyContent = 'center' overlay.style.borderRadius = '3px' overlayContent = document.createElement('div') overlayContent.style.backgroundColor = 'rgba(104, 182, 255, 0.9)' overlayContent.style.fontFamily = 'monospace' overlayContent.style.fontSize = '11px' overlayContent.style.padding = '2px 3px' overlayContent.style.borderRadius = '3px' overlayContent.style.color = 'white' overlay.appendChild(overlayContent) } /** * Highlight an instance. * * @param {Vue} instance */ function highlight (instance) { if (!instance) return const rect = getInstanceOrVnodeRect(instance) if (!env["b" /* isBrowser */]) { // TODO: Highlight rect area. return } init() if (rect) { const content = [] let name = instance.fnContext ? Object(util["m" /* getComponentName */])(instance.fnOptions) : getInstanceName(instance) name = Object(util["l" /* getComponentDisplayName */])(name, shared_data["a" /* default */].componentNameStyle) if (name) { const pre = document.createElement('span') pre.style.opacity = '0.6' pre.innerText = '<' const text = document.createTextNode(name) const post = document.createElement('span') post.style.opacity = '0.6' post.innerText = '>' content.push(pre, text, post) } showOverlay(rect, content) } } /** * Remove highlight overlay. */ function unHighlight () { if (overlay && overlay.parentNode) { document.body.removeChild(overlay) } } /** * Get the client rect for an instance. * * @param {Vue|Vnode} instance * @return {Object} */ function getInstanceOrVnodeRect (instance) { const el = instance.$el || instance.elm if (!env["b" /* isBrowser */]) { // TODO: Find position from instance or a vnode (for functional components). return } if (!Object(util["p" /* inDoc */])(el)) { return } if (instance._isFragment) { return getFragmentRect(instance) } else if (el.nodeType === 1) { return el.getBoundingClientRect() } } /** * Highlight a fragment instance. * Loop over its node range and determine its bounding box. * * @param {Vue} instance * @return {Object} */ function getFragmentRect ({ _fragmentStart, _fragmentEnd }) { let top, bottom, left, right highlighter_util().mapNodeRange(_fragmentStart, _fragmentEnd, function (node) { let rect if (node.nodeType === 1 || node.getBoundingClientRect) { rect = node.getBoundingClientRect() } else if (node.nodeType === 3 && node.data.trim()) { rect = getTextRect(node) } if (rect) { if (!top || rect.top < top) { top = rect.top } if (!bottom || rect.bottom > bottom) { bottom = rect.bottom } if (!left || rect.left < left) { left = rect.left } if (!right || rect.right > right) { right = rect.right } } }) return { top, left, width: right - left, height: bottom - top } } let range /** * Get the bounding rect for a text node using a Range. * * @param {Text} node * @return {Rect} */ function getTextRect (node) { if (!env["b" /* isBrowser */]) return if (!range) range = document.createRange() range.selectNode(node) return range.getBoundingClientRect() } /** * Display the overlay with given rect. * * @param {Rect} */ function showOverlay ({ width = 0, height = 0, top = 0, left = 0 }, content = []) { if (!env["b" /* isBrowser */]) return overlay.style.width = ~~width + 'px' overlay.style.height = ~~height + 'px' overlay.style.top = ~~top + 'px' overlay.style.left = ~~left + 'px' overlayContent.innerHTML = '' content.forEach(child => overlayContent.appendChild(child)) document.body.appendChild(overlay) } /** * Get Vue's util */ function highlighter_util () { return env["f" /* target */].__VUE_DEVTOOLS_GLOBAL_HOOK__.Vue.util } // EXTERNAL MODULE: /home/akryum/Projects/vue-devtools/node_modules/@vue-devtools/app-backend/src/vuex.js var vuex = __webpack_require__(10); // CONCATENATED MODULE: /home/akryum/Projects/vue-devtools/node_modules/@vue-devtools/app-backend/src/events.js const internalRE = /^(?:pre-)?hook:/ function initEventsBackend (Vue, bridge) { let recording = true bridge.send('events:reset') bridge.on('events:toggle-recording', enabled => { recording = enabled }) function logEvent (vm, type, eventName, payload) { // The string check is important for compat with 1.x where the first // argument may be an object instead of a string. // this also ensures the event is only logged for direct $emit (source) // instead of by $dispatch/$broadcast if (typeof eventName === 'string' && !internalRE.test(eventName)) { bridge.send('event:triggered', Object(util["y" /* stringify */])({ eventName, type, payload, instanceId: vm._uid, instanceName: getInstanceName(vm._self || vm), timestamp: Date.now() })) } } function wrap (method) { const original = Vue.prototype[method] if (original) { Vue.prototype[method] = function (...args) { const res = original.apply(this, args) if (recording) { logEvent(this, method, args[0], args.slice(1)) } return res } } } wrap('$emit') wrap('$broadcast') wrap('$dispatch') } // EXTERNAL MODULE: /home/akryum/Projects/vue-devtools/node_modules/@vue-devtools/app-backend/src/router.js var router = __webpack_require__(13); // CONCATENATED MODULE: /home/akryum/Projects/vue-devtools/node_modules/@vue-devtools/app-backend/src/perf.js const COMPONENT_HOOKS = [ 'beforeCreate', 'created', 'beforeMount', 'mounted', 'beforeUpdate', 'updated', 'beforeDestroyed', 'destroyed' ] const RENDER_HOOKS = { beforeMount: { after: 'mountRender' }, mounted: { before: 'mountRender' }, beforeUpdate: { after: 'updateRender' }, updated: { before: 'updateRender' } } let perf_frames = 0 let frameTime let secondsTimer let perf_bridge let componentMetrics function initPerfBackend (Vue, _bridge, instanceMap) { perf_bridge = _bridge // Global mixin Vue.mixin({ beforeCreate () { applyHooks(this) } }) // Apply to existing components instanceMap.forEach(applyHooks) Object(shared_data["d" /* watch */])('recordPerf', value => { if (value) { startRecording() } else { stopRecording() } }) } function startRecording () { perf_frames = 0 frameTime = performance.now() secondsTimer = setInterval(frameInterval, 500) componentMetrics = {} requestAnimationFrame(perf_frame) } function stopRecording () { clearInterval(secondsTimer) } function perf_frame () { perf_frames++ if (shared_data["a" /* default */].recordPerf) { requestAnimationFrame(perf_frame) } } function frameInterval () { const metric = { type: 'fps', time: Date.now(), start: frameTime, end: frameTime = performance.now() } metric.value = Math.round(perf_frames / (metric.end - metric.start) * 1000) perf_frames = 0 perf_bridge.send('perf:add-metric', metric) } function applyHooks (vm) { if (vm.$options.$_devtoolsPerfHooks) return vm.$options.$_devtoolsPerfHooks = true const renderMetrics = {} COMPONENT_HOOKS.forEach(hook => { const renderHook = RENDER_HOOKS[hook] const handler = function () { if (shared_data["a" /* default */].recordPerf) { // Before const time = performance.now() if (renderHook && renderHook.before) { // Render hook ends before one hook const metric = renderMetrics[renderHook.before] if (metric) { metric.end = time addComponentMetric(vm.$options, renderHook.before, metric.start, metric.end) } } // After this.$once(`hook:${hook}`, () => { const newTime = performance.now() addComponentMetric(vm.$options, hook, time, newTime) if (renderHook && renderHook.after) { // Render hook starts after one hook renderMetrics[renderHook.after] = { start: newTime, end: 0 } } }) } } const currentValue = vm.$options[hook] if (Array.isArray(currentValue)) { vm.$options[hook] = [handler, ...currentValue] } else if (typeof currentValue === 'function') { vm.$options[hook] = [handler, currentValue] } else { vm.$options[hook] = [handler] } }) } function addComponentMetric (options, type, start, end) { const duration = end - start const name = Object(util["m" /* getComponentName */])(options) const metric = componentMetrics[name] = componentMetrics[name] || { id: name, hooks: {}, totalTime: 0 } const hook = metric.hooks[type] = metric.hooks[type] || { count: 0, totalTime: 0 } hook.count++ hook.totalTime += duration metric.totalTime += duration perf_bridge.send('perf:upsert-metric', { type: 'componentRender', data: metric }) } // CONCATENATED MODULE: /home/akryum/Projects/vue-devtools/node_modules/@vue-devtools/app-backend/src/utils.js function findRelatedComponent (el) { while (!el.__vue__ && el.parentElement) { el = el.parentElement } return el.__vue__ } // CONCATENATED MODULE: /home/akryum/Projects/vue-devtools/node_modules/@vue-devtools/app-backend/src/component-selector.js class component_selector_ComponentSelector { constructor (bridge, instanceMap) { const self = this self.bridge = bridge self.instanceMap = instanceMap self.bindMethods() bridge.on('start-component-selector', self.startSelecting) bridge.on('stop-component-selector', self.stopSelecting) } /** * Adds event listeners for mouseover and mouseup */ startSelecting () { if (!env["b" /* isBrowser */]) return window.addEventListener('mouseover', this.elementMouseOver, true) window.addEventListener('click', this.elementClicked, true) window.addEventListener('mouseout', this.cancelEvent, true) window.addEventListener('mouseenter', this.cancelEvent, true) window.addEventListener('mouseleave', this.cancelEvent, true) window.addEventListener('mousedown', this.cancelEvent, true) window.addEventListener('mouseup', this.cancelEvent, true) } /** * Removes event listeners */ stopSelecting () { if (!env["b" /* isBrowser */]) return window.removeEventListener('mouseover', this.elementMouseOver, true) window.removeEventListener('click', this.elementClicked, true) window.removeEventListener('mouseout', this.cancelEvent, true) window.removeEventListener('mouseenter', this.cancelEvent, true) window.removeEventListener('mouseleave', this.cancelEvent, true) window.removeEventListener('mousedown', this.cancelEvent, true) window.removeEventListener('mouseup', this.cancelEvent, true) unHighlight() } /** * Highlights a component on element mouse over * @param {MouseEvent} e */ elementMouseOver (e) { this.cancelEvent(e) const el = e.target if (el) { this.selectedInstance = findRelatedComponent(el) } unHighlight() if (this.selectedInstance) { highlight(this.selectedInstance) } } /** * Selects an instance in the component view * @param {MouseEvent} e */ elementClicked (e) { this.cancelEvent(e) if (this.selectedInstance) { this.bridge.send('inspect-instance', this.selectedInstance.__VUE_DEVTOOLS_UID__) } else { this.bridge.send('stop-component-selector') } this.stopSelecting() } /** * Cancel a mouse event * @param {MouseEvent} e */ cancelEvent (e) { e.stopImmediatePropagation() e.preventDefault() } /** * Bind class methods to the class scope to avoid rebind for event listeners */ bindMethods () { this.startSelecting = this.startSelecting.bind(this) this.stopSelecting = this.stopSelecting.bind(this) this.elementMouseOver = this.elementMouseOver.bind(this) this.elementClicked = this.elementClicked.bind(this) } } // CONCATENATED MODULE: /home/akryum/Projects/vue-devtools/node_modules/@vue-devtools/app-backend/src/index.js /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return src_instanceMap; }); /* unused harmony export functionalVnodeMap */ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return initBackend; }); /* unused harmony export findInstanceOrVnode */ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return getCustomInstanceDetails; }); /* unused harmony export reduceStateList */ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return getInstanceName; }); /* unused harmony export toast */ /* unused harmony export inspectInstance */ // This is the backend that is injected into the page that a Vue app lives in // when the Vue Devtools panel is activated. // hook should have been injected before this executes. const src_hook = env["f" /* target */].__VUE_DEVTOOLS_GLOBAL_HOOK__ const rootInstances = [] const propModes = ['default', 'sync', 'once'] const src_instanceMap = env["f" /* target */].__VUE_DEVTOOLS_INSTANCE_MAP__ = new Map() const functionalVnodeMap = env["f" /* target */].__VUE_DEVTOOLS_FUNCTIONAL_VNODE_MAP__ = new Map() const consoleBoundInstances = Array(5) let currentInspectedId let src_bridge let filter = '' let captureCount = 0 let isLegacy = false let rootUID = 0 let functionalIds = new Map() // Dedupe instances // Some instances may be both on a component and on a child abstract/functional component const captureIds = new Map() function initBackend (_bridge) { src_bridge = _bridge if (src_hook.Vue) { isLegacy = src_hook.Vue.version && src_hook.Vue.version.split('.')[0] === '1' connect(src_hook.Vue) } else { src_hook.once('init', connect) } initRightClick() } function connect (Vue) { Object(shared_data["c" /* init */])({ bridge: src_bridge, Vue }).then(() => { src_hook.currentTab = 'components' src_bridge.on('switch-tab', tab => { src_hook.currentTab = tab if (tab === 'components') { flush() } }) // the backend may get injected to the same page multiple times // if the user closes and reopens the devtools. // make sure there's only one flush listener. src_hook.off('flush') src_hook.on('flush', () => { if (src_hook.currentTab === 'components') { flush() } }) src_bridge.on('select-instance', id => { currentInspectedId = id const instance = findInstanceOrVnode(id) if (!instance) return if (!/:functional:/.test(id)) bindToConsole(instance) flush() src_bridge.send('instance-selected') }) src_bridge.on('scroll-to-instance', id => { const instance = findInstanceOrVnode(id) if (instance) { scrollIntoView(instance) highlight(instance) } }) src_bridge.on('filter-instances', _filter => { filter = _filter.toLowerCase() flush() }) src_bridge.on('refresh', scan) src_bridge.on('enter-instance', id => { const instance = findInstanceOrVnode(id) if (instance) highlight(instance) }) src_bridge.on('leave-instance', unHighlight) // eslint-disable-next-line no-new new component_selector_ComponentSelector(src_bridge, src_instanceMap) // Get the instance id that is targeted by context menu src_bridge.on('get-context-menu-target', () => { const instance = env["f" /* target */].__VUE_DEVTOOLS_CONTEXT_MENU_TARGET__ env["f" /* target */].__VUE_DEVTOOLS_CONTEXT_MENU_TARGET__ = null env["f" /* target */].__VUE_DEVTOOLS_CONTEXT_MENU_HAS_TARGET__ = false if (instance) { const id = instance.__VUE_DEVTOOLS_UID__ if (id) { return src_bridge.send('inspect-instance', id) } } toast('No Vue component was found', 'warn') }) src_bridge.on('set-instance-data', args => { setStateValue(args) flush() }) // vuex if (src_hook.store) { Object(vuex["b" /* initVuexBackend */])(src_hook, src_bridge, src_hook.store.commit === undefined) } else { src_hook.once('vuex:init', store => { Object(vuex["b" /* initVuexBackend */])(src_hook, src_bridge, store.commit === undefined) }) } src_hook.once('router:init', () => { Object(router["b" /* initRouterBackend */])(src_hook.Vue, src_bridge, rootInstances) }) // events initEventsBackend(Vue, src_bridge) env["f" /* target */].__VUE_DEVTOOLS_INSPECT__ = inspectInstance // User project devtools config if (env["f" /* target */].hasOwnProperty('VUE_DEVTOOLS_CONFIG')) { const config = env["f" /* target */].VUE_DEVTOOLS_CONFIG // Open in editor if (config.hasOwnProperty('openInEditorHost')) { shared_data["a" /* default */].openInEditorHost = config.openInEditorHost } } src_bridge.log('backend ready.') src_bridge.send('ready', Vue.version) src_bridge.on('log-detected-vue', () => { console.log( `%c vue-devtools %c Detected Vue v${Vue.version} %c`, 'background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff', 'background:#41b883 ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff', 'background:transparent' ) }) setTimeout(() => { scan() // perf initPerfBackend(Vue, src_bridge, src_instanceMap) }, 0) }) } function findInstanceOrVnode (id) { if (/:functional:/.test(id)) { const [refId] = id.split(':functional:') const map = functionalVnodeMap.get(refId) return map && map[id] } return src_instanceMap.get(id) } /** * Scan the page for root level Vue instances. */ function scan () { rootInstances.length = 0 let inFragment = false let currentFragment = null function processInstance (instance) { if (instance) { if (rootInstances.indexOf(instance.$root) === -1) { instance = instance.$root } if (instance._isFragment) { inFragment = true currentFragment = instance } // respect Vue.config.devtools option let baseVue = instance.constructor while (baseVue.super) { baseVue = baseVue.super } if (baseVue.config && baseVue.config.devtools) { // give a unique id to root instance so we can // 'namespace' its children if (typeof instance.__VUE_DEVTOOLS_ROOT_UID__ === 'undefined') { instance.__VUE_DEVTOOLS_ROOT_UID__ = ++rootUID } rootInstances.push(instance) } return true } } if (env["b" /* isBrowser */]) { walk(document, function (node) { if (inFragment) { if (node === currentFragment._fragmentEnd) { inFragment = false currentFragment = null } return true } let instance = node.__vue__ return processInstance(instance) }) } else { if (Array.isArray(env["f" /* target */].__VUE_ROOT_INSTANCES__)) { env["f" /* target */].__VUE_ROOT_INSTANCES__.map(processInstance) } } src_hook.emit('router:init') flush() } /** * DOM walk helper * * @param {NodeList} nodes * @param {Function} fn */ function walk (node, fn) { if (node.childNodes) { for (let i = 0, l = node.childNodes.length; i < l; i++) { const child = node.childNodes[i] const stop = fn(child) if (!stop) { walk(child, fn) } } } // also walk shadow DOM if (node.shadowRoot) { walk(node.shadowRoot, fn) } } /** * Called on every Vue.js batcher flush cycle. * Capture current component tree structure and the state * of the current inspected instance (if present) and * send it to the devtools. */ function flush () { let start functionalIds.clear() captureIds.clear() if (false) {} const payload = Object(util["y" /* stringify */])({ inspectedInstance: getInstanceDetails(currentInspectedId), instances: findQualifiedChildrenFromList(rootInstances) }) if (false) {} src_bridge.send('flush', payload) } /** * Iterate through an array of instances and flatten it into * an array of qualified instances. This is a depth-first * traversal - e.g. if an instance is not matched, we will * recursively go deeper until a qualified child is found. * * @param {Array} instances * @return {Array} */ function findQualifiedChildrenFromList (instances) { instances = instances .filter(child => !child._isBeingDestroyed) return !filter ? instances.map(capture) : Array.prototype.concat.apply([], instances.map(findQualifiedChildren)) } /** * Find qualified children from a single instance. * If the instance itself is qualified, just return itself. * This is ok because [].concat works in both cases. * * @param {Vue|Vnode} instance * @return {Vue|Array} */ function findQualifiedChildren (instance) { return isQualified(instance) ? capture(instance) : findQualifiedChildrenFromList(instance.$children).concat( instance._vnode && instance._vnode.children // Find functional components in recursively in non-functional vnodes. ? flatten(instance._vnode.children.filter(child => !child.componentInstance).map(captureChild)) // Filter qualified children. .filter(instance => isQualified(instance)) : [] ) } /** * Check if an instance is qualified. * * @param {Vue|Vnode} instance * @return {Boolean} */ function isQualified (instance) { const name = Object(util["g" /* classify */])(instance.name || getInstanceName(instance)).toLowerCase() return name.indexOf(filter) > -1 } function flatten (items) { return items.reduce((acc, item) => { if (item instanceof Array) acc.push(...flatten(item)) else if (item) acc.push(item) return acc }, []) } function captureChild (child) { if (child.fnContext && !child.componentInstance) { return capture(child) } else if (child.componentInstance) { if (!child.componentInstance._isBeingDestroyed) return capture(child.componentInstance) } else if (child.children) { return flatten(child.children.map(captureChild)) } } /** * Capture the meta information of an instance. (recursive) * * @param {Vue} instance * @return {Object} */ function capture (instance, index, list) { if (false) {} if (instance.$options && instance.$options.abstract && instance._vnode && instance._vnode.componentInstance) { instance = instance._vnode.componentInstance } // Functional component. if (instance.fnContext && !instance.componentInstance) { const contextUid = instance.fnContext.__VUE_DEVTOOLS_UID__ let id = functionalIds.get(contextUid) if (id == null) { id = 0 } else { id++ } functionalIds.set(contextUid, id) const functionalId = contextUid + ':functional:' + id markFunctional(functionalId, instance) return { id: functionalId, functional: true, name: getInstanceName(instance), renderKey: getRenderKey(instance.key), children: (instance.children ? instance.children.map( child => child.fnContext ? captureChild(child) : child.componentInstance ? capture(child.componentInstance) : undefined ) // router-view has both fnContext and componentInstance on vnode. : instance.componentInstance ? [capture(instance.componentInstance)] : []).filter(Boolean), inactive: false, isFragment: false // TODO: Check what is it for. } } // instance._uid is not reliable in devtools as there // may be 2 roots with same _uid which causes unexpected // behaviour instance.__VUE_DEVTOOLS_UID__ = getUniqueId(instance) // Dedupe if (captureIds.has(instance.__VUE_DEVTOOLS_UID__)) { return } else { captureIds.set(instance.__VUE_DEVTOOLS_UID__, undefined) } mark(instance) const name = getInstanceName(instance) const ret = { uid: instance._uid, id: instance.__VUE_DEVTOOLS_UID__, name, renderKey: getRenderKey(instance.$vnode ? instance.$vnode['key'] : null), inactive: !!instance._inactive, isFragment: !!instance._isFragment, children: instance.$children .filter(child => !child._isBeingDestroyed) .map(capture) .filter(Boolean) } if (instance._vnode && instance._vnode.children) { ret.children = ret.children.concat( flatten(instance._vnode.children.map(captureChild)) .filter(Boolean) ) } // record screen position to ensure correct ordering if ((!list || list.length > 1) && !instance._inactive) { const rect = getInstanceOrVnodeRect(instance) ret.top = rect ? rect.top : Infinity } else { ret.top = Infinity } // check if instance is available in console const consoleId = consoleBoundInstances.indexOf(instance.__VUE_DEVTOOLS_UID__) ret.consoleId = consoleId > -1 ? '$vm' + consoleId : null // check router view const isRouterView2 = instance.$vnode && instance.$vnode.data.routerView if (instance._routerView || isRouterView2) { ret.isRouterView = true if (!instance._inactive && instance.$route) { const matched = instance.$route.matched const depth = isRouterView2 ? instance.$vnode.data.routerViewDepth : instance._routerView.depth ret.matchedRouteSegment = matched && matched[depth] && (isRouterView2 ? matched[depth].path : matched[depth].handler.path) } } return ret } /** * Mark an instance as captured and store it in the instance map. * * @param {Vue} instance */ function mark (instance) { if (!src_instanceMap.has(instance.__VUE_DEVTOOLS_UID__)) { src_instanceMap.set(instance.__VUE_DEVTOOLS_UID__, instance) instance.$on('hook:beforeDestroy', function () { src_instanceMap.delete(instance.__VUE_DEVTOOLS_UID__) }) } } function markFunctional (id, vnode) { const refId = vnode.fnContext.__VUE_DEVTOOLS_UID__ if (!functionalVnodeMap.has(refId)) { functionalVnodeMap.set(refId, {}) vnode.fnContext.$on('hook:beforeDestroy', function () { functionalVnodeMap.delete(refId) }) } functionalVnodeMap.get(refId)[id] = vnode } /** * Get the detailed information of an inspected instance. * * @param {Number} id */ function getInstanceDetails (id) { const instance = src_instanceMap.get(id) if (!instance) { const vnode = findInstanceOrVnode(id) if (!vnode) return {} const data = { id, name: Object(util["m" /* getComponentName */])(vnode.fnOptions), file: vnode.fnOptions.__file || null, state: processProps({ $options: vnode.fnOptions, ...(vnode.devtoolsMeta && vnode.devtoolsMeta.renderContext.props) }), functional: true } return data } else { const data = { id: id, name: getInstanceName(instance), state: getInstanceState(instance) } let i if ((i = instance.$vnode) && (i = i.componentOptions) && (i = i.Ctor) && (i = i.options)) { data.file = i.__file || null } return data } } function getInstanceState (instance) { return processProps(instance).concat( processState(instance), processRefs(instance), processComputed(instance), processInjected(instance), processRouteContext(instance), processVuexGetters(instance), processFirebaseBindings(instance), processObservables(instance), processAttrs(instance) ) } function getCustomInstanceDetails (instance) { const state = getInstanceState(instance) return { _custom: { type: 'component', id: instance.__VUE_DEVTOOLS_UID__, display: getInstanceName(instance), tooltip: 'Component instance', value: reduceStateList(state), fields: { abstract: true } } } } function reduceStateList (list) { if (!list.length) { return undefined } return list.reduce((map, item) => { const key = item.type || 'data' const obj = map[key] = map[key] || {} obj[item.key] = item.value return map }, {}) } /** * Get the appropriate display name for an instance. * * @param {Vue} instance * @return {String} */ function getInstanceName (instance) { const name = Object(util["m" /* getComponentName */])(instance.$options || instance.fnOptions || {}) if (name) return name return instance.$root === instance ? 'Root' : 'Anonymous Component' } /** * Process the props of an instance. * Make sure return a plain object because window.postMessage() * will throw an Error if the passed object contains Functions. * * @param {Vue} instance * @return {Array} */ function processProps (instance) { let props if (isLegacy && (props = instance._props)) { // 1.x return Object.keys(props).map(key => { const prop = props[key] const options = prop.options return { type: 'props', key: prop.path, value: instance[prop.path], meta: options ? { type: options.type ? getPropType(options.type) : 'any', required: !!options.required, mode: propModes[prop.mode] } : {} } }) } else if ((props = instance.$options.props)) { // 2.0 const propsData = [] for (let key in props) { const prop = props[key] key = Object(util["f" /* camelize */])(key) propsData.push({ type: 'props', key, value: instance[key], meta: prop ? { type: prop.type ? getPropType(prop.type) : 'any', required: !!prop.required } : { type: 'invalid' }, editable: shared_data["a" /* default */].editableProps }) } return propsData } else { return [] } } function processAttrs (instance) { return Object.entries(instance.$attrs || {}).map(([key, value]) => { return { type: '$attrs', key, value } }) } /** * Convert prop type constructor to string. * * @param {Function} fn */ const fnTypeRE = /^(?:function|class) (\w+)/ function getPropType (type) { const match = type.toString().match(fnTypeRE) return typeof type === 'function' ? (match && match[1]) || 'any' : 'any' } /** * Process state, filtering out props and "clean" the result * with a JSON dance. This removes functions which can cause * errors during structured clone used by window.postMessage. * * @param {Vue} instance * @return {Array} */ function processState (instance) { const props = isLegacy ? instance._props : instance.$options.props const getters = instance.$options.vuex && instance.$options.vuex.getters return Object.keys(instance._data) .filter(key => ( !(props && key in props) && !(getters && key in getters) )) .map(key => ({ key, value: instance._data[key], editable: true })) } /** * Process refs * * @param {Vue} instance * @return {Array} */ function processRefs (instance) { return Object.keys(instance.$refs) .filter(key => instance.$refs[key]) .map(key => Object(util["n" /* getCustomRefDetails */])(instance, key, instance.$refs[key])) } /** * Process the computed properties of an instance. * * @param {Vue} instance * @return {Array} */ function processComputed (instance) { const computed = [] const defs = instance.$options.computed || {} // use for...in here because if 'computed' is not defined // on component, computed properties will be placed in prototype // and Object.keys does not include // properties from object's prototype for (const key in defs) { const def = defs[key] const type = typeof def === 'function' && def.vuex ? 'vuex bindings' : 'computed' // use try ... catch here because some computed properties may // throw error during its evaluation let computedProp = null try { computedProp = { type, key, value: instance[key] } } catch (e) { computedProp = { type, key, value: '(error during evaluation)' } } computed.push(computedProp) } return computed } /** * Process Vuex getters. * * @param {Vue} instance * @return {Array} */ function processInjected (instance) { const injected = instance.$options.inject if (injected) { return Object.keys(injected).map(key => { return { key, type: 'injected', value: instance[key] } }) } else { return [] } } /** * Process possible vue-router $route context * * @param {Vue} instance * @return {Array} */ function processRouteContext (instance) { try { const route = instance.$route if (route) { const { path, query, params } = route const value = { path, query, params } if (route.fullPath) value.fullPath = route.fullPath if (route.hash) value.hash = route.hash if (route.name) value.name = route.name if (route.meta) value.meta = route.meta return [{ key: '$route', value: { _custom: { type: 'router', abstract: true, value } } }] } } catch (e) { // Invalid $router } return [] } /** * Process Vuex getters. * * @param {Vue} instance * @return {Array} */ function processVuexGetters (instance) { const getters = instance.$options.vuex && instance.$options.vuex.getters if (getters) { return Object.keys(getters).map(key => { return { type: 'vuex getters', key, value: instance[key] } }) } else { return [] } } /** * Process Firebase bindings. * * @param {Vue} instance * @return {Array} */ function processFirebaseBindings (instance) { const refs = instance.$firebaseRefs if (refs) { return Object.keys(refs).map(key => { return { type: 'firebase bindings', key, value: instance[key] } }) } else { return [] } } /** * Process vue-rx observable bindings. * * @param {Vue} instance * @return {Array} */ function processObservables (instance) { const obs = instance.$observables if (obs) { return Object.keys(obs).map(key => { return { type: 'observables', key, value: instance[key] } }) } else { return [] } } /** * Sroll a node into view. * * @param {Vue} instance */ function scrollIntoView (instance) { const rect = getInstanceOrVnodeRect(instance) if (rect) { // TODO: Handle this for non-browser environments. window.scrollBy(0, rect.top + (rect.height - window.innerHeight) / 2) } } /** * Binds given instance in console as $vm0. * For compatibility reasons it also binds it as $vm. * * @param {Vue} instance */ function bindToConsole (instance) { if (!instance) return if (!env["b" /* isBrowser */]) return const id = instance.__VUE_DEVTOOLS_UID__ const index = consoleBoundInstances.indexOf(id) if (index > -1) { consoleBoundInstances.splice(index, 1) } else { consoleBoundInstances.pop() } consoleBoundInstances.unshift(id) for (let i = 0; i < 5; i++) { window['$vm' + i] = src_instanceMap.get(consoleBoundInstances[i]) } window.$vm = instance } /** * Returns a devtools unique id for instance. * @param {Vue} instance */ function getUniqueId (instance) { const rootVueId = instance.$root.__VUE_DEVTOOLS_ROOT_UID__ return `${rootVueId}:${instance._uid}` } function getRenderKey (value) { if (value == null) return const type = typeof value if (type === 'number') { return value } else if (type === 'string') { return `'${value}'` } else if (Array.isArray(value)) { return 'Array' } else { return 'Object' } } /** * Display a toast message. * @param {any} message HTML content */ function toast (message, type = 'normal') { const fn = env["f" /* target */].__VUE_DEVTOOLS_TOAST__ fn && fn(message, type) } function inspectInstance (instance) { const id = instance.__VUE_DEVTOOLS_UID__ id && src_bridge.send('inspect-instance', id) } function setStateValue ({ id, path, value, newKey, remove }) { const instance = src_instanceMap.get(id) if (instance) { try { let parsedValue if (value) { parsedValue = Object(util["s" /* parse */])(value, true) } const api = isLegacy ? { $set: src_hook.Vue.set, $delete: src_hook.Vue.delete } : instance const data = Object(util["o" /* has */])(instance._props, path, newKey) ? instance._props : instance._data Object(util["v" /* set */])(data, path, parsedValue, (obj, field, value) => { (remove || newKey) && api.$delete(obj, field) !remove && api.$set(obj, newKey || field, value) }) } catch (e) { console.error(e) } } } function initRightClick () { if (!env["b" /* isBrowser */]) return // Start recording context menu when Vue is detected // event if Vue devtools are not loaded yet document.addEventListener('contextmenu', event => { const el = event.target if (el) { // Search for parent that "is" a component instance const instance = findRelatedComponent(el) if (instance) { window.__VUE_DEVTOOLS_CONTEXT_MENU_HAS_TARGET__ = true window.__VUE_DEVTOOLS_CONTEXT_MENU_TARGET__ = instance return } } window.__VUE_DEVTOOLS_CONTEXT_MENU_HAS_TARGET__ = null window.__VUE_DEVTOOLS_CONTEXT_MENU_TARGET__ = null }) } /***/ }), /***/ 15: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return stringify; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return parse; }); /* unused harmony export stringifyStrict */ const MAX_SERIALIZED_SIZE = 512 * 1024 // 1MB function encode (data, replacer, list, seen) { let stored, key, value, i, l const seenIndex = seen.get(data) if (seenIndex != null) { return seenIndex } const index = list.length const proto = Object.prototype.toString.call(data) if (proto === '[object Object]') { stored = {} seen.set(data, index) list.push(stored) const keys = Object.keys(data) for (i = 0, l = keys.length; i < l; i++) { key = keys[i] value = data[key] if (replacer) value = replacer.call(data, key, value) stored[key] = encode(value, replacer, list, seen) } } else if (proto === '[object Array]') { stored = [] seen.set(data, index) list.push(stored) for (i = 0, l = data.length; i < l; i++) { value = data[i] if (replacer) value = replacer.call(data, i, value) stored[i] = encode(value, replacer, list, seen) } } else { list.push(data) } return index } function decode (list, reviver) { let i = list.length let j, k, data, key, value, proto while (i--) { data = list[i] proto = Object.prototype.toString.call(data) if (proto === '[object Object]') { const keys = Object.keys(data) for (j = 0, k = keys.length; j < k; j++) { key = keys[j] value = list[data[key]] if (reviver) value = reviver.call(data, key, value) data[key] = value } } else if (proto === '[object Array]') { for (j = 0, k = data.length; j < k; j++) { value = list[data[j]] if (reviver) value = reviver.call(data, j, value) data[j] = value } } } } function stringify (data, replacer, space) { let result try { result = arguments.length === 1 ? JSON.stringify(data) : JSON.stringify(data, replacer, space) } catch (e) { result = stringifyStrict(data, replacer, space) } if (result.length > MAX_SERIALIZED_SIZE) { const chunkCount = Math.ceil(result.length / MAX_SERIALIZED_SIZE) const chunks = [] for (let i = 0; i < chunkCount; i++) { chunks.push(result.slice(i * MAX_SERIALIZED_SIZE, (i + 1) * MAX_SERIALIZED_SIZE)) } return chunks } return result } function parse (data, reviver) { if (Array.isArray(data)) { data = data.join('') } const hasCircular = /^\s/.test(data) if (!hasCircular) { return arguments.length === 1 ? JSON.parse(data) : JSON.parse(data, reviver) } else { const list = JSON.parse(data) decode(list, reviver) return list[0] } } function stringifyStrict (data, replacer, space) { const list = [] encode(data, replacer, list, new Map()) return space ? ' ' + JSON.stringify(list, null, space) : ' ' + JSON.stringify(list) } /***/ }), /***/ 19: /***/ (function(module, exports) { // shim for using process in browser var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it // don't break things. But we need to wrap it in a try catch in case it is // wrapped in strict mode code which doesn't define any globals. It's inside a // function because try/catches deoptimize in certain engines. var cachedSetTimeout; var cachedClearTimeout; function defaultSetTimout() { throw new Error('setTimeout has not been defined'); } function defaultClearTimeout () { throw new Error('clearTimeout has not been defined'); } (function () { try { if (typeof setTimeout === 'function') { cachedSetTimeout = setTimeout; } else { cachedSetTimeout = defaultSetTimout; } } catch (e) { cachedSetTimeout = defaultSetTimout; } try { if (typeof clearTimeout === 'function') { cachedClearTimeout = clearTimeout; } else { cachedClearTimeout = defaultClearTimeout; } } catch (e) { cachedClearTimeout = defaultClearTimeout; } } ()) function runTimeout(fun) { if (cachedSetTimeout === setTimeout) { //normal enviroments in sane situations return setTimeout(fun, 0); } // if setTimeout wasn't available but was latter defined if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { cachedSetTimeout = setTimeout; return setTimeout(fun, 0); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedSetTimeout(fun, 0); } catch(e){ try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedSetTimeout.call(null, fun, 0); } catch(e){ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error return cachedSetTimeout.call(this, fun, 0); } } } function runClearTimeout(marker) { if (cachedClearTimeout === clearTimeout) { //normal enviroments in sane situations return clearTimeout(marker); } // if clearTimeout wasn't available but was latter defined if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { cachedClearTimeout = clearTimeout; return clearTimeout(marker); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedClearTimeout(marker); } catch (e){ try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedClearTimeout.call(null, marker); } catch (e){ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. // Some versions of I.E. have different rules for clearTimeout vs setTimeout return cachedClearTimeout.call(this, marker); } } } var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { if (!draining || !currentQueue) { return; } draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); } else { queueIndex = -1; } if (queue.length) { drainQueue(); } } function drainQueue() { if (draining) { return; } var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; while(len) { currentQueue = queue; queue = []; while (++queueIndex < len) { if (currentQueue) { currentQueue[queueIndex].run(); } } queueIndex = -1; len = queue.length; } currentQueue = null; draining = false; runClearTimeout(timeout); } process.nextTick = function (fun) { var args = new Array(arguments.length - 1); if (arguments.length > 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { runTimeout(drainQueue); } }; // v8 likes predictible objects function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; // empty string to avoid regexp issues process.versions = {}; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.prependListener = noop; process.prependOnceListener = noop; process.listeners = function (name) { return [] } process.binding = function (name) { throw new Error('process.binding is not supported'); }; process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function() { return 0; }; /***/ }), /***/ 23: /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(process) {// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1, // backported and transplited with Babel, with backwards-compat fixes // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. // resolves . and .. elements in a path array with directory names there // must be no slashes, empty elements, or device names (c:\) in the array // (so also no leading and trailing slashes - it does not distinguish // relative and absolute paths) function normalizeArray(parts, allowAboveRoot) { // if the path tries to go above the root, `up` ends up > 0 var up = 0; for (var i = parts.length - 1; i >= 0; i--) { var last = parts[i]; if (last === '.') { parts.splice(i, 1); } else if (last === '..') { parts.splice(i, 1); up++; } else if (up) { parts.splice(i, 1); up--; } } // if the path is allowed to go above the root, restore leading ..s if (allowAboveRoot) { for (; up--; up) { parts.unshift('..'); } } return parts; } // path.resolve([from ...], to) // posix version exports.resolve = function() { var resolvedPath = '', resolvedAbsolute = false; for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { var path = (i >= 0) ? arguments[i] : process.cwd(); // Skip empty and invalid entries if (typeof path !== 'string') { throw new TypeError('Arguments to path.resolve must be strings'); } else if (!path) { continue; } resolvedPath = path + '/' + resolvedPath; resolvedAbsolute = path.charAt(0) === '/'; } // At this point the path should be resolved to a full absolute path, but // handle relative paths to be safe (might happen when process.cwd() fails) // Normalize the path resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { return !!p; }), !resolvedAbsolute).join('/'); return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; }; // path.normalize(path) // posix version exports.normalize = function(path) { var isAbsolute = exports.isAbsolute(path), trailingSlash = substr(path, -1) === '/'; // Normalize the path path = normalizeArray(filter(path.split('/'), function(p) { return !!p; }), !isAbsolute).join('/'); if (!path && !isAbsolute) { path = '.'; } if (path && trailingSlash) { path += '/'; } return (isAbsolute ? '/' : '') + path; }; // posix version exports.isAbsolute = function(path) { return path.charAt(0) === '/'; }; // posix version exports.join = function() { var paths = Array.prototype.slice.call(arguments, 0); return exports.normalize(filter(paths, function(p, index) { if (typeof p !== 'string') { throw new TypeError('Arguments to path.join must be strings'); } return p; }).join('/')); }; // path.relative(from, to) // posix version exports.relative = function(from, to) { from = exports.resolve(from).substr(1); to = exports.resolve(to).substr(1); function trim(arr) { var start = 0; for (; start < arr.length; start++) { if (arr[start] !== '') break; } var end = arr.length - 1; for (; end >= 0; end--) { if (arr[end] !== '') break; } if (start > end) return []; return arr.slice(start, end - start + 1); } var fromParts = trim(from.split('/')); var toParts = trim(to.split('/')); var length = Math.min(fromParts.length, toParts.length); var samePartsLength = length; for (var i = 0; i < length; i++) { if (fromParts[i] !== toParts[i]) { samePartsLength = i; break; } } var outputParts = []; for (var i = samePartsLength; i < fromParts.length; i++) { outputParts.push('..'); } outputParts = outputParts.concat(toParts.slice(samePartsLength)); return outputParts.join('/'); }; exports.sep = '/'; exports.delimiter = ':'; exports.dirname = function (path) { if (typeof path !== 'string') path = path + ''; if (path.length === 0) return '.'; var code = path.charCodeAt(0); var hasRoot = code === 47 /*/*/; var end = -1; var matchedSlash = true; for (var i = path.length - 1; i >= 1; --i) { code = path.charCodeAt(i); if (code === 47 /*/*/) { if (!matchedSlash) { end = i; break; } } else { // We saw the first non-path separator matchedSlash = false; } } if (end === -1) return hasRoot ? '/' : '.'; if (hasRoot && end === 1) { // return '//'; // Backwards-compat fix: return '/'; } return path.slice(0, end); }; function basename(path) { if (typeof path !== 'string') path = path + ''; var start = 0; var end = -1; var matchedSlash = true; var i; for (i = path.length - 1; i >= 0; --i) { if (path.charCodeAt(i) === 47 /*/*/) { // If we reached a path separator that was not part of a set of path // separators at the end of the string, stop now if (!matchedSlash) { start = i + 1; break; } } else if (end === -1) { // We saw the first non-path separator, mark this as the end of our // path component matchedSlash = false; end = i + 1; } } if (end === -1) return ''; return path.slice(start, end); } // Uses a mixed approach for backwards-compatibility, as ext behavior changed // in new Node.js versions, so only basename() above is backported here exports.basename = function (path, ext) { var f = basename(path); if (ext && f.substr(-1 * ext.length) === ext) { f = f.substr(0, f.length - ext.length); } return f; }; exports.extname = function (path) { if (typeof path !== 'string') path = path + ''; var startDot = -1; var startPart = 0; var end = -1; var matchedSlash = true; // Track the state of characters (if any) we see before our first dot and // after any path separator we find var preDotState = 0; for (var i = path.length - 1; i >= 0; --i) { var code = path.charCodeAt(i); if (code === 47 /*/*/) { // If we reached a path separator that was not part of a set of path // separators at the end of the string, stop now if (!matchedSlash) { startPart = i + 1; break; } continue; } if (end === -1) { // We saw the first non-path separator, mark this as the end of our // extension matchedSlash = false; end = i + 1; } if (code === 46 /*.*/) { // If this is our first dot, mark it as the start of our extension if (startDot === -1) startDot = i; else if (preDotState !== 1) preDotState = 1; } else if (startDot !== -1) { // We saw a non-dot and non-path separator before our dot, so we should // have a good chance at having a non-empty extension preDotState = -1; } } if (startDot === -1 || end === -1 || // We saw a non-dot character immediately before the dot preDotState === 0 || // The (right-most) trimmed path component is exactly '..' preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) { return ''; } return path.slice(startDot, end); }; function filter (xs, f) { if (xs.filter) return xs.filter(f); var res = []; for (var i = 0; i < xs.length; i++) { if (f(xs[i], i, xs)) res.push(xs[i]); } return res; } // String.prototype.substr - negative index don't work in IE8 var substr = 'ab'.substr(-1) === 'b' ? function (str, start, len) { return str.substr(start, len) } : function (str, start, len) { if (start < 0) start = str.length + start; return str.substr(start, len); } ; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(19))) /***/ }), /***/ 24: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Bridge; }); /* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25); /* harmony import */ var events__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_0__); const BATCH_DURATION = 100 class Bridge extends events__WEBPACK_IMPORTED_MODULE_0__["EventEmitter"] { constructor (wall) { super() this.setMaxListeners(Infinity) this.wall = wall wall.listen(messages => { if (Array.isArray(messages)) { messages.forEach(message => this._emit(message)) } else { this._emit(messages) } }) this._batchingQueue = [] this._sendingQueue = [] this._receivingQueue = [] this._sending = false this._time = null } /** * Send an event. * * @param {String} event * @param {*} payload */ send (event, payload) { if (Array.isArray(payload)) { const lastIndex = payload.length - 1 payload.forEach((chunk, index) => { this._send({ event, _chunk: chunk, last: index === lastIndex }) }) this._flush() } else if (this._time === null) { this._send([{ event, payload }]) this._time = Date.now() } else { this._batchingQueue.push({ event, payload }) const now = Date.now() if (now - this._time > BATCH_DURATION) { this._flush() } else { this._timer = setTimeout(() => this._flush(), BATCH_DURATION) } } } /** * Log a message to the devtools background page. * * @param {String} message */ log (message) { this.send('log', message) } _flush () { if (this._batchingQueue.length) this._send(this._batchingQueue) clearTimeout(this._timer) this._batchingQueue = [] this._time = null } _emit (message) { if (typeof message === 'string') { this.emit(message) } else if (message._chunk) { this._receivingQueue.push(message._chunk) if (message.last) { this.emit(message.event, this._receivingQueue) this._receivingQueue = [] } } else { this.emit(message.event, message.payload) } } _send (messages) { this._sendingQueue.push(messages) this._nextSend() } _nextSend () { if (!this._sendingQueue.length || this._sending) return this._sending = true const messages = this._sendingQueue.shift() try { this.wall.send(messages) } catch (err) { if (err.message === 'Message length exceeded maximum allowed length.') { this._sendingQueue.splice(0, 0, messages.map(message => [message])) } } this._sending = false requestAnimationFrame(() => this._nextSend()) } } /***/ }), /***/ 25: /***/ (function(module, exports, __webpack_require__) { "use strict"; // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. var R = typeof Reflect === 'object' ? Reflect : null var ReflectApply = R && typeof R.apply === 'function' ? R.apply : function ReflectApply(target, receiver, args) { return Function.prototype.apply.call(target, receiver, args); } var ReflectOwnKeys if (R && typeof R.ownKeys === 'function') { ReflectOwnKeys = R.ownKeys } else if (Object.getOwnPropertySymbols) { ReflectOwnKeys = function ReflectOwnKeys(target) { return Object.getOwnPropertyNames(target) .concat(Object.getOwnPropertySymbols(target)); }; } else { ReflectOwnKeys = function ReflectOwnKeys(target) { return Object.getOwnPropertyNames(target); }; } function ProcessEmitWarning(warning) { if (console && console.warn) console.warn(warning); } var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { return value !== value; } function EventEmitter() { EventEmitter.init.call(this); } module.exports = EventEmitter; // Backwards-compat with node 0.10.x EventEmitter.EventEmitter = EventEmitter; EventEmitter.prototype._events = undefined; EventEmitter.prototype._eventsCount = 0; EventEmitter.prototype._maxListeners = undefined; // By default EventEmitters will print a warning if more than 10 listeners are // added to it. This is a useful default which helps finding memory leaks. var defaultMaxListeners = 10; Object.defineProperty(EventEmitter, 'defaultMaxListeners', { enumerable: true, get: function() { return defaultMaxListeners; }, set: function(arg) { if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); } defaultMaxListeners = arg; } }); EventEmitter.init = function() { if (this._events === undefined || this._events === Object.getPrototypeOf(this)._events) { this._events = Object.create(null); this._eventsCount = 0; } this._maxListeners = this._maxListeners || undefined; }; // Obviously not all Emitters should be limited to 10. This function allows // that to be increased. Set to zero for unlimited. EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); } this._maxListeners = n; return this; }; function $getMaxListeners(that) { if (that._maxListeners === undefined) return EventEmitter.defaultMaxListeners; return that._maxListeners; } EventEmitter.prototype.getMaxListeners = function getMaxListeners() { return $getMaxListeners(this); }; EventEmitter.prototype.emit = function emit(type) { var args = []; for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); var doError = (type === 'error'); var events = this._events; if (events !== undefined) doError = (doError && events.error === undefined); else if (!doError) return false; // If there is no 'error' event listener then throw. if (doError) { var er; if (args.length > 0) er = args[0]; if (er instanceof Error) { // Note: The comments on the `throw` lines are intentional, they show // up in Node's output if this results in an unhandled exception. throw er; // Unhandled 'error' event } // At least give some kind of context to the user var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); err.context = er; throw err; // Unhandled 'error' event } var handler = events[type]; if (handler === undefined) return false; if (typeof handler === 'function') { ReflectApply(handler, this, args); } else { var len = handler.length; var listeners = arrayClone(handler, len); for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args); } return true; }; function _addListener(target, type, listener, prepend) { var m; var events; var existing; if (typeof listener !== 'function') { throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); } events = target._events; if (events === undefined) { events = target._events = Object.create(null); target._eventsCount = 0; } else { // To avoid recursion in the case that type === "newListener"! Before // adding it to the listeners, first emit "newListener". if (events.newListener !== undefined) { target.emit('newListener', type, listener.listener ? listener.listener : listener); // Re-assign `events` because a newListener handler could have caused the // this._events to be assigned to a new object events = target._events; } existing = events[type]; } if (existing === undefined) { // Optimize the case of one listener. Don't need the extra array object. existing = events[type] = listener; ++target._eventsCount; } else { if (typeof existing === 'function') { // Adding the second element, need to change to array. existing = events[type] = prepend ? [listener, existing] : [existing, listener]; // If we've already got an array, just append. } else if (prepend) { existing.unshift(listener); } else { existing.push(listener); } // Check for listener leak m = $getMaxListeners(target); if (m > 0 && existing.length > m && !existing.warned) { existing.warned = true; // No error code for this since it is a Warning // eslint-disable-next-line no-restricted-syntax var w = new Error('Possible EventEmitter memory leak detected. ' + existing.length + ' ' + String(type) + ' listeners ' + 'added. Use emitter.setMaxListeners() to ' + 'increase limit'); w.name = 'MaxListenersExceededWarning'; w.emitter = target; w.type = type; w.count = existing.length; ProcessEmitWarning(w); } } return target; } EventEmitter.prototype.addListener = function addListener(type, listener) { return _addListener(this, type, listener, false); }; EventEmitter.prototype.on = EventEmitter.prototype.addListener; EventEmitter.prototype.prependListener = function prependListener(type, listener) { return _addListener(this, type, listener, true); }; function onceWrapper() { var args = []; for (var i = 0; i < arguments.length; i++) args.push(arguments[i]); if (!this.fired) { this.target.removeListener(this.type, this.wrapFn); this.fired = true; ReflectApply(this.listener, this.target, args); } } function _onceWrap(target, type, listener) { var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; var wrapped = onceWrapper.bind(state); wrapped.listener = listener; state.wrapFn = wrapped; return wrapped; } EventEmitter.prototype.once = function once(type, listener) { if (typeof listener !== 'function') { throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); } this.on(type, _onceWrap(this, type, listener)); return this; }; EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) { if (typeof listener !== 'function') { throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); } this.prependListener(type, _onceWrap(this, type, listener)); return this; }; // Emits a 'removeListener' event if and only if the listener was removed. EventEmitter.prototype.removeListener = function removeListener(type, listener) { var list, events, position, i, originalListener; if (typeof listener !== 'function') { throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); } events = this._events; if (events === undefined) return this; list = events[type]; if (list === undefined) return this; if (list === listener || list.listener === listener) { if (--this._eventsCount === 0) this._events = Object.create(null); else { delete events[type]; if (events.removeListener) this.emit('removeListener', type, list.listener || listener); } } else if (typeof list !== 'function') { position = -1; for (i = list.length - 1; i >= 0; i--) { if (list[i] === listener || list[i].listener === listener) { originalListener = list[i].listener; position = i; break; } } if (position < 0) return this; if (position === 0) list.shift(); else { spliceOne(list, position); } if (list.length === 1) events[type] = list[0]; if (events.removeListener !== undefined) this.emit('removeListener', type, originalListener || listener); } return this; }; EventEmitter.prototype.off = EventEmitter.prototype.removeListener; EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) { var listeners, events, i; events = this._events; if (events === undefined) return this; // not listening for removeListener, no need to emit if (events.removeListener === undefined) { if (arguments.length === 0) { this._events = Object.create(null); this._eventsCount = 0; } else if (events[type] !== undefined) { if (--this._eventsCount === 0) this._events = Object.create(null); else delete events[type]; } return this; } // emit removeListener for all listeners on all events if (arguments.length === 0) { var keys = Object.keys(events); var key; for (i = 0; i < keys.length; ++i) { key = keys[i]; if (key === 'removeListener') continue; this.removeAllListeners(key); } this.removeAllListeners('removeListener'); this._events = Object.create(null); this._eventsCount = 0; return this; } listeners = events[type]; if (typeof listeners === 'function') { this.removeListener(type, listeners); } else if (listeners !== undefined) { // LIFO order for (i = listeners.length - 1; i >= 0; i--) { this.removeListener(type, listeners[i]); } } return this; }; function _listeners(target, type, unwrap) { var events = target._events; if (events === undefined) return []; var evlistener = events[type]; if (evlistener === undefined) return []; if (typeof evlistener === 'function') return unwrap ? [evlistener.listener || evlistener] : [evlistener]; return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); } EventEmitter.prototype.listeners = function listeners(type) { return _listeners(this, type, true); }; EventEmitter.prototype.rawListeners = function rawListeners(type) { return _listeners(this, type, false); }; EventEmitter.listenerCount = function(emitter, type) { if (typeof emitter.listenerCount === 'function') { return emitter.listenerCount(type); } else { return listenerCount.call(emitter, type); } }; EventEmitter.prototype.listenerCount = listenerCount; function listenerCount(type) { var events = this._events; if (events !== undefined) { var evlistener = events[type]; if (typeof evlistener === 'function') { return 1; } else if (evlistener !== undefined) { return evlistener.length; } } return 0; } EventEmitter.prototype.eventNames = function eventNames() { return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; }; function arrayClone(arr, n) { var copy = new Array(n); for (var i = 0; i < n; ++i) copy[i] = arr[i]; return copy; } function spliceOne(list, index) { for (; index + 1 < list.length; index++) list[index] = list[index + 1]; list.pop(); } function unwrapListeners(arr) { var ret = new Array(arr.length); for (var i = 0; i < ret.length; ++i) { ret[i] = arr[i].listener || arr[i]; } return ret; } /***/ }), /***/ 261: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _back__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(14); /* harmony import */ var _utils_bridge__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(24); // this is injected to the app page when the panel is activated. window.addEventListener('message', handshake) function sendListening () { window.postMessage({ source: 'vue-devtools-backend-injection', payload: 'listening' }, '*') } sendListening() function handshake (e) { if (e.data.source === 'vue-devtools-proxy' && e.data.payload === 'init') { window.removeEventListener('message', handshake) var listeners = [] var bridge = new _utils_bridge__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"]({ listen (fn) { var listener = evt => { if (evt.data.source === 'vue-devtools-proxy' && evt.data.payload) { fn(evt.data.payload) } } window.addEventListener('message', listener) listeners.push(listener) }, send (data) { // if (process.env.NODE_ENV !== 'production') { // console.log('[chrome] backend -> devtools', data) // } window.postMessage({ source: 'vue-devtools-backend', payload: data }, '*') } }) bridge.on('shutdown', () => { listeners.forEach(l => { window.removeEventListener('message', l) }) listeners = [] }) Object(_back__WEBPACK_IMPORTED_MODULE_0__[/* initBackend */ "c"])(bridge) } else { sendListening() } } /***/ }), /***/ 3: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return init; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return destroy; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return watch; }); /* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9); // Initial state const internalSharedData = { openInEditorHost: '/', componentNameStyle: 'class', theme: 'auto', displayDensity: 'low', timeFormat: 'default', recordVuex: true, cacheVuexSnapshotsEvery: 50, cacheVuexSnapshotsLimit: 10, snapshotLoading: false, recordPerf: false, editableProps: false, logDetected: true, vuexNewBackend: false, vuexAutoload: false, vuexGroupGettersByModule: true } const persisted = [ 'componentNameStyle', 'theme', 'displayDensity', 'recordVuex', 'editableProps', 'logDetected', 'vuexNewBackend', 'vuexAutoload', 'vuexGroupGettersByModule', 'timeFormat' ] // ---- INTERNALS ---- // let Vue let bridge // List of fields to persist to storage (disabled if 'false') // This should be unique to each shared data client to prevent conflicts let persist = false // For reactivity, we wrap the data in a Vue instance let vm let initRetryInterval let initRetryCount = 0 function init (params) { return new Promise((resolve, reject) => { // Mandatory params bridge = params.bridge Vue = params.Vue persist = !!params.persist if (persist) { if (false) {} // Load persisted fields persisted.forEach(key => { const value = _storage__WEBPACK_IMPORTED_MODULE_0__[/* get */ "a"](`shared-data:${key}`) if (value !== null) { internalSharedData[key] = value } }) bridge.on('shared-data:load', () => { // Send all fields Object.keys(internalSharedData).forEach(key => { sendValue(key, internalSharedData[key]) }) bridge.send('shared-data:load-complete') }) bridge.on('shared-data:init-complete', () => { if (false) {} clearInterval(initRetryInterval) resolve() }) bridge.send('shared-data:master-init-waiting') // In case backend init is executed after frontend bridge.on('shared-data:slave-init-waiting', () => { bridge.send('shared-data:master-init-waiting') }) initRetryCount = 0 initRetryInterval = setInterval(() => { if (false) {} bridge.send('shared-data:master-init-waiting') initRetryCount++ if (initRetryCount > 30) { clearInterval(initRetryInterval) console.error('[shared data] Master init failed') } }, 2000) } else { if (false) {} bridge.on('shared-data:master-init-waiting', () => { if (false) {} // Load all persisted shared data bridge.send('shared-data:load') bridge.once('shared-data:load-complete', () => { if (false) {} bridge.send('shared-data:init-complete') resolve() }) }) bridge.send('shared-data:slave-init-waiting') } // Wrapper Vue instance vm = new Vue({ data: internalSharedData }) // Update value from other shared data clients bridge.on('shared-data:set', ({ key, value }) => { setValue(key, value) }) }) } function destroy () { bridge.removeAllListeners('shared-data:set') vm.$destroy() } function setValue (key, value) { // Storage if (persist && persisted.includes(key)) { _storage__WEBPACK_IMPORTED_MODULE_0__[/* set */ "c"](`shared-data:${key}`, value) } vm[key] = value // Validate Proxy set trap return true } function sendValue (key, value) { bridge && bridge.send('shared-data:set', { key, value }) } function watch (...args) { vm.$watch(...args) } const proxy = {} Object.keys(internalSharedData).forEach(key => { Object.defineProperty(proxy, key, { configurable: false, get: () => vm && vm.$data[key], set: (value) => { sendValue(key, value) setValue(key, value) } }) }) /* harmony default export */ __webpack_exports__["a"] = (proxy); /***/ }), /***/ 4: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global, setImmediate) {/*! * Vue.js v2.6.10 * (c) 2014-2019 Evan You * Released under the MIT License. */ /* */ var emptyObject = Object.freeze({}); // These helpers produce better VM code in JS engines due to their // explicitness and function inlining. function isUndef (v) { return v === undefined || v === null } function isDef (v) { return v !== undefined && v !== null } function isTrue (v) { return v === true } function isFalse (v) { return v === false } /** * Check if value is primitive. */ function isPrimitive (value) { return ( typeof value === 'string' || typeof value === 'number' || // $flow-disable-line typeof value === 'symbol' || typeof value === 'boolean' ) } /** * Quick object check - this is primarily used to tell * Objects from primitive values when we know the value * is a JSON-compliant type. */ function isObject (obj) { return obj !== null && typeof obj === 'object' } /** * Get the raw type string of a value, e.g., [object Object]. */ var _toString = Object.prototype.toString; function toRawType (value) { return _toString.call(value).slice(8, -1) } /** * Strict object type check. Only returns true * for plain JavaScript objects. */ function isPlainObject (obj) { return _toString.call(obj) === '[object Object]' } function isRegExp (v) { return _toString.call(v) === '[object RegExp]' } /** * Check if val is a valid array index. */ function isValidArrayIndex (val) { var n = parseFloat(String(val)); return n >= 0 && Math.floor(n) === n && isFinite(val) } function isPromise (val) { return ( isDef(val) && typeof val.then === 'function' && typeof val.catch === 'function' ) } /** * Convert a value to a string that is actually rendered. */ function toString (val) { return val == null ? '' : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString) ? JSON.stringify(val, null, 2) : String(val) } /** * Convert an input value to a number for persistence. * If the conversion fails, return original string. */ function toNumber (val) { var n = parseFloat(val); return isNaN(n) ? val : n } /** * Make a map and return a function for checking if a key * is in that map. */ function makeMap ( str, expectsLowerCase ) { var map = Object.create(null); var list = str.split(','); for (var i = 0; i < list.length; i++) { map[list[i]] = true; } return expectsLowerCase ? function (val) { return map[val.toLowerCase()]; } : function (val) { return map[val]; } } /** * Check if a tag is a built-in tag. */ var isBuiltInTag = makeMap('slot,component', true); /** * Check if an attribute is a reserved attribute. */ var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is'); /** * Remove an item from an array. */ function remove (arr, item) { if (arr.length) { var index = arr.indexOf(item); if (index > -1) { return arr.splice(index, 1) } } } /** * Check whether an object has the property. */ var hasOwnProperty = Object.prototype.hasOwnProperty; function hasOwn (obj, key) { return hasOwnProperty.call(obj, key) } /** * Create a cached version of a pure function. */ function cached (fn) { var cache = Object.create(null); return (function cachedFn (str) { var hit = cache[str]; return hit || (cache[str] = fn(str)) }) } /** * Camelize a hyphen-delimited string. */ var camelizeRE = /-(\w)/g; var camelize = cached(function (str) { return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; }) }); /** * Capitalize a string. */ var capitalize = cached(function (str) { return str.charAt(0).toUpperCase() + str.slice(1) }); /** * Hyphenate a camelCase string. */ var hyphenateRE = /\B([A-Z])/g; var hyphenate = cached(function (str) { return str.replace(hyphenateRE, '-$1').toLowerCase() }); /** * Simple bind polyfill for environments that do not support it, * e.g., PhantomJS 1.x. Technically, we don't need this anymore * since native bind is now performant enough in most browsers. * But removing it would mean breaking code that was able to run in * PhantomJS 1.x, so this must be kept for backward compatibility. */ /* istanbul ignore next */ function polyfillBind (fn, ctx) { function boundFn (a) { var l = arguments.length; return l ? l > 1 ? fn.apply(ctx, arguments) : fn.call(ctx, a) : fn.call(ctx) } boundFn._length = fn.length; return boundFn } function nativeBind (fn, ctx) { return fn.bind(ctx) } var bind = Function.prototype.bind ? nativeBind : polyfillBind; /** * Convert an Array-like object to a real Array. */ function toArray (list, start) { start = start || 0; var i = list.length - start; var ret = new Array(i); while (i--) { ret[i] = list[i + start]; } return ret } /** * Mix properties into target object. */ function extend (to, _from) { for (var key in _from) { to[key] = _from[key]; } return to } /** * Merge an Array of Objects into a single Object. */ function toObject (arr) { var res = {}; for (var i = 0; i < arr.length; i++) { if (arr[i]) { extend(res, arr[i]); } } return res } /* eslint-disable no-unused-vars */ /** * Perform no operation. * Stubbing args to make Flow happy without leaving useless transpiled code * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/). */ function noop (a, b, c) {} /** * Always return false. */ var no = function (a, b, c) { return false; }; /* eslint-enable no-unused-vars */ /** * Return the same value. */ var identity = function (_) { return _; }; /** * Check if two values are loosely equal - that is, * if they are plain objects, do they have the same shape? */ function looseEqual (a, b) { if (a === b) { return true } var isObjectA = isObject(a); var isObjectB = isObject(b); if (isObjectA && isObjectB) { try { var isArrayA = Array.isArray(a); var isArrayB = Array.isArray(b); if (isArrayA && isArrayB) { return a.length === b.length && a.every(function (e, i) { return looseEqual(e, b[i]) }) } else if (a instanceof Date && b instanceof Date) { return a.getTime() === b.getTime() } else if (!isArrayA && !isArrayB) { var keysA = Object.keys(a); var keysB = Object.keys(b); return keysA.length === keysB.length && keysA.every(function (key) { return looseEqual(a[key], b[key]) }) } else { /* istanbul ignore next */ return false } } catch (e) { /* istanbul ignore next */ return false } } else if (!isObjectA && !isObjectB) { return String(a) === String(b) } else { return false } } /** * Return the first index at which a loosely equal value can be * found in the array (if value is a plain object, the array must * contain an object of the same shape), or -1 if it is not present. */ function looseIndexOf (arr, val) { for (var i = 0; i < arr.length; i++) { if (looseEqual(arr[i], val)) { return i } } return -1 } /** * Ensure a function is called only once. */ function once (fn) { var called = false; return function () { if (!called) { called = true; fn.apply(this, arguments); } } } var SSR_ATTR = 'data-server-rendered'; var ASSET_TYPES = [ 'component', 'directive', 'filter' ]; var LIFECYCLE_HOOKS = [ 'beforeCreate', 'created', 'beforeMount', 'mounted', 'beforeUpdate', 'updated', 'beforeDestroy', 'destroyed', 'activated', 'deactivated', 'errorCaptured', 'serverPrefetch' ]; /* */ var config = ({ /** * Option merge strategies (used in core/util/options) */ // $flow-disable-line optionMergeStrategies: Object.create(null), /** * Whether to suppress warnings. */ silent: false, /** * Show production mode tip message on boot? */ productionTip: "production" !== 'production', /** * Whether to enable devtools */ devtools: "production" !== 'production', /** * Whether to record perf */ performance: false, /** * Error handler for watcher errors */ errorHandler: null, /** * Warn handler for watcher warns */ warnHandler: null, /** * Ignore certain custom elements */ ignoredElements: [], /** * Custom user key aliases for v-on */ // $flow-disable-line keyCodes: Object.create(null), /** * Check if a tag is reserved so that it cannot be registered as a * component. This is platform-dependent and may be overwritten. */ isReservedTag: no, /** * Check if an attribute is reserved so that it cannot be used as a component * prop. This is platform-dependent and may be overwritten. */ isReservedAttr: no, /** * Check if a tag is an unknown element. * Platform-dependent. */ isUnknownElement: no, /** * Get the namespace of an element */ getTagNamespace: noop, /** * Parse the real tag name for the specific platform. */ parsePlatformTagName: identity, /** * Check if an attribute must be bound using property, e.g. value * Platform-dependent. */ mustUseProp: no, /** * Perform updates asynchronously. Intended to be used by Vue Test Utils * This will significantly reduce performance if set to false. */ async: true, /** * Exposed for legacy reasons */ _lifecycleHooks: LIFECYCLE_HOOKS }); /* */ /** * unicode letters used for parsing html tags, component names and property paths. * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname * skipping \u10000-\uEFFFF due to it freezing up PhantomJS */ var unicodeRegExp = /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/; /** * Check if a string starts with $ or _ */ function isReserved (str) { var c = (str + '').charCodeAt(0); return c === 0x24 || c === 0x5F } /** * Define a property. */ function def (obj, key, val, enumerable) { Object.defineProperty(obj, key, { value: val, enumerable: !!enumerable, writable: true, configurable: true }); } /** * Parse simple path. */ var bailRE = new RegExp(("[^" + (unicodeRegExp.source) + ".$_\\d]")); function parsePath (path) { if (bailRE.test(path)) { return } var segments = path.split('.'); return function (obj) { for (var i = 0; i < segments.length; i++) { if (!obj) { return } obj = obj[segments[i]]; } return obj } } /* */ // can we use __proto__? var hasProto = '__proto__' in {}; // Browser environment sniffing var inBrowser = typeof window !== 'undefined'; var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform; var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase(); var UA = inBrowser && window.navigator.userAgent.toLowerCase(); var isIE = UA && /msie|trident/.test(UA); var isIE9 = UA && UA.indexOf('msie 9.0') > 0; var isEdge = UA && UA.indexOf('edge/') > 0; var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android'); var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios'); var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge; var isPhantomJS = UA && /phantomjs/.test(UA); var isFF = UA && UA.match(/firefox\/(\d+)/); // Firefox has a "watch" function on Object.prototype... var nativeWatch = ({}).watch; 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'] && global['process'].env.VUE_ENV === 'server'; } else { _isServer = false; } } return _isServer }; // detect devtools var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; /* istanbul ignore next */ function isNative (Ctor) { return typeof Ctor === 'function' && /native code/.test(Ctor.toString()) } var hasSymbol = typeof Symbol !== 'undefined' && isNative(Symbol) && typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys); var _Set; /* istanbul ignore if */ // $flow-disable-line if (typeof Set !== 'undefined' && isNative(Set)) { // use native Set when available. _Set = Set; } else { // a non-standard Set polyfill that only works with primitive keys. _Set = /*@__PURE__*/(function () { function Set () { this.set = Object.create(null); } Set.prototype.has = function has (key) { return this.set[key] === true }; Set.prototype.add = function add (key) { this.set[key] = true; }; Set.prototype.clear = function clear () { this.set = Object.create(null); }; return Set; }()); } /* */ var warn = noop; var tip = noop; var generateComponentTrace = (noop); // work around flow check var formatComponentName = (noop); if (false) { var repeat, classify, classifyRE, hasConsole; } /* */ 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(); if (false) {} for (var i = 0, l = subs.length; i < l; i++) { subs[i].update(); } }; // The current target watcher being evaluated. // This is globally unique because only one watcher // can be evaluated at a time. Dep.target = null; var targetStack = []; function pushTarget (target) { targetStack.push(target); Dep.target = target; } function popTarget () { targetStack.pop(); Dep.target = targetStack[targetStack.length - 1]; } /* */ var VNode = function VNode ( tag, data, children, text, elm, context, componentOptions, asyncFactory ) { this.tag = tag; this.data = data; this.children = children; this.text = text; this.elm = elm; this.ns = undefined; this.context = context; this.fnContext = undefined; this.fnOptions = undefined; this.fnScopeId = undefined; this.key = data && data.key; this.componentOptions = componentOptions; this.componentInstance = undefined; this.parent = undefined; this.raw = false; this.isStatic = false; this.isRootInsert = true; this.isComment = false; this.isCloned = false; this.isOnce = false; this.asyncFactory = asyncFactory; this.asyncMeta = undefined; this.isAsyncPlaceholder = false; }; var prototypeAccessors = { child: { configurable: true } }; // DEPRECATED: alias for componentInstance for backwards compat. /* istanbul ignore next */ prototypeAccessors.child.get = function () { return this.componentInstance }; Object.defineProperties( VNode.prototype, prototypeAccessors ); var createEmptyVNode = function (text) { if ( text === void 0 ) text = ''; var node = new VNode(); node.text = text; node.isComment = true; return node }; function createTextVNode (val) { return new VNode(undefined, undefined, undefined, String(val)) } // optimized shallow clone // used for static nodes and slot nodes because they may be reused across // multiple renders, cloning them avoids errors when DOM manipulations rely // on their elm reference. function cloneVNode (vnode) { var cloned = new VNode( vnode.tag, vnode.data, // #7975 // clone children array to avoid mutating original in case of cloning // a child. vnode.children && vnode.children.slice(), vnode.text, vnode.elm, vnode.context, vnode.componentOptions, vnode.asyncFactory ); cloned.ns = vnode.ns; cloned.isStatic = vnode.isStatic; cloned.key = vnode.key; cloned.isComment = vnode.isComment; cloned.fnContext = vnode.fnContext; cloned.fnOptions = vnode.fnOptions; cloned.fnScopeId = vnode.fnScopeId; cloned.asyncMeta = vnode.asyncMeta; cloned.isCloned = true; return cloned } /* * not type checking this file because flow doesn't play well with * dynamically accessing methods on Array prototype */ var arrayProto = Array.prototype; var arrayMethods = Object.create(arrayProto); var methodsToPatch = [ 'push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse' ]; /** * Intercept mutating methods and emit events */ methodsToPatch.forEach(function (method) { // cache original method var original = arrayProto[method]; def(arrayMethods, method, function mutator () { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; var result = original.apply(this, args); var ob = this.__ob__; var inserted; switch (method) { case 'push': case 'unshift': inserted = args; break case 'splice': inserted = args.slice(2); break } if (inserted) { ob.observeArray(inserted); } // notify change ob.dep.notify(); return result }); }); /* */ var arrayKeys = Object.getOwnPropertyNames(arrayMethods); /** * In some cases we may want to disable observation inside a component's * update computation. */ var shouldObserve = true; function toggleObserving (value) { shouldObserve = value; } /** * Observer class that is attached to each observed * object. Once attached, the observer converts the target * object's property keys into getter/setters that * collect dependencies and dispatch updates. */ var Observer = function Observer (value) { this.value = value; this.dep = new Dep(); this.vmCount = 0; def(value, '__ob__', this); if (Array.isArray(value)) { if (hasProto) { protoAugment(value, arrayMethods); } else { copyAugment(value, arrayMethods, arrayKeys); } this.observeArray(value); } else { this.walk(value); } }; /** * Walk through all properties and convert them into * getter/setters. This method should only be called when * value type is Object. */ Observer.prototype.walk = function walk (obj) { var keys = Object.keys(obj); for (var i = 0; i < keys.length; i++) { defineReactive$$1(obj, keys[i]); } }; /** * Observe a list of Array items. */ Observer.prototype.observeArray = function observeArray (items) { for (var i = 0, l = items.length; i < l; i++) { observe(items[i]); } }; // helpers /** * Augment a target Object or Array by intercepting * the prototype chain using __proto__ */ function protoAugment (target, src) { /* eslint-disable no-proto */ target.__proto__ = src; /* eslint-enable no-proto */ } /** * Augment a target Object or Array by defining * hidden properties. */ /* istanbul ignore next */ function copyAugment (target, src, keys) { for (var i = 0, l = keys.length; i < l; i++) { var key = keys[i]; def(target, key, src[key]); } } /** * Attempt to create an observer instance for a value, * returns the new observer if successfully observed, * or the existing observer if the value already has one. */ function observe (value, asRootData) { if (!isObject(value) || value instanceof VNode) { return } var ob; if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) { ob = value.__ob__; } else if ( shouldObserve && !isServerRendering() && (Array.isArray(value) || isPlainObject(value)) && Object.isExtensible(value) && !value._isVue ) { ob = new Observer(value); } if (asRootData && ob) { ob.vmCount++; } return ob } /** * Define a reactive property on an Object. */ function defineReactive$$1 ( obj, key, val, customSetter, shallow ) { var dep = new Dep(); var property = Object.getOwnPropertyDescriptor(obj, key); if (property && property.configurable === false) { return } // cater for pre-defined getter/setters var getter = property && property.get; var setter = property && property.set; if ((!getter || setter) && arguments.length === 2) { val = obj[key]; } var childOb = !shallow && observe(val); Object.defineProperty(obj, key, { enumerable: true, configurable: true, get: function reactiveGetter () { var value = getter ? getter.call(obj) : val; if (Dep.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 (false) {} // #7981: for accessor properties without setter if (getter && !setter) { return } if (setter) { setter.call(obj, newVal); } else { val = newVal; } childOb = !shallow && observe(newVal); dep.notify(); } }); } /** * Set a property on an object. Adds the new property and * triggers change notification if the property doesn't * already exist. */ function set (target, key, val) { if (false ) {} 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)) { false && false; return val } if (!ob) { target[key] = val; return val } defineReactive$$1(ob.value, key, val); ob.dep.notify(); return val } /** * Delete a property and trigger change if necessary. */ function del (target, key) { if (false ) {} if (Array.isArray(target) && isValidArrayIndex(key)) { target.splice(key, 1); return } var ob = (target).__ob__; if (target._isVue || (ob && ob.vmCount)) { false && false; 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 */ if (false) {} /** * Helper that recursively merges two data objects together. */ function mergeData (to, from) { if (!from) { return to } var key, toVal, fromVal; var keys = hasSymbol ? Reflect.ownKeys(from) : Object.keys(from); for (var i = 0; i < keys.length; i++) { key = keys[i]; // in case the object is already observed... if (key === '__ob__') { continue } toVal = to[key]; fromVal = from[key]; if (!hasOwn(to, key)) { set(to, key, fromVal); } else if ( toVal !== fromVal && isPlainObject(toVal) && isPlainObject(fromVal) ) { mergeData(toVal, fromVal); } } return to } /** * Data */ function mergeDataOrFn ( parentVal, childVal, vm ) { if (!vm) { // in a Vue.extend merge, both should be functions if (!childVal) { return parentVal } if (!parentVal) { return childVal } // when parentVal & childVal are both present, // we need to return a function that returns the // merged result of both functions... no need to // check if parentVal is a function here because // it has to be a function to pass previous merges. return function mergedDataFn () { return mergeData( typeof childVal === 'function' ? childVal.call(this, this) : childVal, typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal ) } } else { return function mergedInstanceDataFn () { // instance merge var instanceData = typeof childVal === 'function' ? childVal.call(vm, vm) : childVal; var defaultData = typeof parentVal === 'function' ? parentVal.call(vm, vm) : parentVal; if (instanceData) { return mergeData(instanceData, defaultData) } else { return defaultData } } } } strats.data = function ( parentVal, childVal, vm ) { if (!vm) { if (childVal && typeof childVal !== 'function') { false && false; return parentVal } return mergeDataOrFn(parentVal, childVal) } return mergeDataOrFn(parentVal, childVal, vm) }; /** * Hooks and props are merged as arrays. */ function mergeHook ( parentVal, childVal ) { var res = childVal ? parentVal ? parentVal.concat(childVal) : Array.isArray(childVal) ? childVal : [childVal] : parentVal; return res ? dedupeHooks(res) : res } function dedupeHooks (hooks) { var res = []; for (var i = 0; i < hooks.length; i++) { if (res.indexOf(hooks[i]) === -1) { res.push(hooks[i]); } } return res } LIFECYCLE_HOOKS.forEach(function (hook) { strats[hook] = mergeHook; }); /** * Assets * * When a vm is present (instance creation), we need to do * a three-way merge between constructor options, instance * options and parent options. */ function mergeAssets ( parentVal, childVal, vm, key ) { var res = Object.create(parentVal || null); if (childVal) { false && false; return extend(res, childVal) } else { return res } } ASSET_TYPES.forEach(function (type) { strats[type + 's'] = mergeAssets; }); /** * Watchers. * * Watchers hashes should not overwrite one * another, so we merge them as arrays. */ strats.watch = function ( parentVal, childVal, vm, key ) { // work around Firefox's Object.prototype.watch... if (parentVal === nativeWatch) { parentVal = undefined; } if (childVal === nativeWatch) { childVal = undefined; } /* istanbul ignore if */ if (!childVal) { return Object.create(parentVal || null) } if (false) {} if (!parentVal) { return childVal } var ret = {}; extend(ret, parentVal); for (var key$1 in childVal) { var parent = ret[key$1]; var child = childVal[key$1]; if (parent && !Array.isArray(parent)) { parent = [parent]; } ret[key$1] = parent ? parent.concat(child) : Array.isArray(child) ? child : [child]; } return ret }; /** * Other object hashes. */ strats.props = strats.methods = strats.inject = strats.computed = function ( parentVal, childVal, vm, key ) { if (childVal && "production" !== 'production') { assertObjectType(key, childVal, vm); } if (!parentVal) { return childVal } var ret = Object.create(null); extend(ret, parentVal); if (childVal) { extend(ret, childVal); } return ret }; strats.provide = mergeDataOrFn; /** * Default strategy. */ var defaultStrat = function (parentVal, childVal) { return childVal === undefined ? parentVal : childVal }; /** * Validate component names */ function checkComponents (options) { for (var key in options.components) { validateComponentName(key); } } function validateComponentName (name) { if (!new RegExp(("^[a-zA-Z][\\-\\.0-9_" + (unicodeRegExp.source) + "]*$")).test(name)) { warn( 'Invalid component name: "' + name + '". Component names ' + 'should conform to valid custom element name in html5 specification.' ); } 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 if (false) {} } } else if (isPlainObject(props)) { for (var key in props) { val = props[key]; name = camelize(key); res[name] = isPlainObject(val) ? val : { type: val }; } } else if (false) {} 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 if (false) {} } /** * Normalize raw function directives into object format. */ function normalizeDirectives (options) { var dirs = options.directives; if (dirs) { for (var key in dirs) { var def$$1 = dirs[key]; if (typeof def$$1 === 'function') { dirs[key] = { bind: def$$1, update: def$$1 }; } } } } function assertObjectType (name, value, vm) { if (!isPlainObject(value)) { warn( "Invalid value for option \"" + name + "\": expected an Object, " + "but got " + (toRawType(value)) + ".", vm ); } } /** * Merge two option objects into a new one. * Core utility used in both instantiation and inheritance. */ function mergeOptions ( parent, child, vm ) { if (false) {} if (typeof child === 'function') { child = child.options; } normalizeProps(child, vm); normalizeInject(child, vm); normalizeDirectives(child); // Apply extends and mixins on the child options, // but only if it is a raw options object that isn't // the result of another mergeOptions call. // Only merged options has the _base property. if (!child._base) { if (child.extends) { parent = mergeOptions(parent, child.extends, vm); } if (child.mixins) { for (var i = 0, l = child.mixins.length; i < l; i++) { parent = mergeOptions(parent, child.mixins[i], vm); } } } var options = {}; var key; for (key in parent) { mergeField(key); } for (key in child) { if (!hasOwn(parent, key)) { mergeField(key); } } function mergeField (key) { var strat = strats[key] || defaultStrat; options[key] = strat(parent[key], child[key], vm, key); } return options } /** * Resolve an asset. * This function is used because child instances need access * to assets defined in its ancestor chain. */ function resolveAsset ( options, type, id, warnMissing ) { /* istanbul ignore if */ if (typeof id !== 'string') { return } var assets = options[type]; // check local registration variations first if (hasOwn(assets, id)) { return assets[id] } var camelizedId = camelize(id); if (hasOwn(assets, camelizedId)) { return assets[camelizedId] } var PascalCaseId = capitalize(camelizedId); if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] } // fallback to prototype chain var res = assets[id] || assets[camelizedId] || assets[PascalCaseId]; if (false) {} 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); } if ( false ) {} 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 (false) {} // 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( getInvalidTypeMessage(name, value, expectedTypes), 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 getInvalidTypeMessage (name, value, expectedTypes) { var message = "Invalid prop: type check failed for prop \"" + name + "\"." + " Expected " + (expectedTypes.map(capitalize).join(', ')); var expectedType = expectedTypes[0]; var receivedType = toRawType(value); var expectedValue = styleValue(value, expectedType); var receivedValue = styleValue(value, receivedType); // check if we need to specify expected value if (expectedTypes.length === 1 && isExplicable(expectedType) && !isBoolean(expectedType, receivedType)) { message += " with value " + expectedValue; } message += ", got " + receivedType + " "; // check if we need to specify received value if (isExplicable(receivedType)) { message += "with value " + receivedValue + "."; } return message } function styleValue (value, type) { if (type === 'String') { return ("\"" + value + "\"") } else if (type === 'Number') { return ("" + (Number(value))) } else { return ("" + value) } } function isExplicable (value) { var explicitTypes = ['string', 'number', 'boolean']; return explicitTypes.some(function (elem) { return value.toLowerCase() === elem; }) } function isBoolean () { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; }) } /* */ function handleError (err, vm, info) { // Deactivate deps tracking while processing error handler to avoid possible infinite rendering. // See: https://github.com/vuejs/vuex/issues/1505 pushTarget(); try { if (vm) { var cur = vm; while ((cur = cur.$parent)) { var hooks = cur.$options.errorCaptured; if (hooks) { for (var i = 0; i < hooks.length; i++) { try { var capture = hooks[i].call(cur, err, vm, info) === false; if (capture) { return } } catch (e) { globalHandleError(e, cur, 'errorCaptured hook'); } } } } } globalHandleError(err, vm, info); } finally { popTarget(); } } function invokeWithErrorHandling ( handler, context, args, vm, info ) { var res; try { res = args ? handler.apply(context, args) : handler.call(context); if (res && !res._isVue && isPromise(res) && !res._handled) { res.catch(function (e) { return handleError(e, vm, info + " (Promise/async)"); }); // issue #9511 // avoid catch triggering multiple times when nested calls res._handled = true; } } catch (e) { handleError(e, vm, info); } return res } function globalHandleError (err, vm, info) { if (config.errorHandler) { try { return config.errorHandler.call(null, err, vm, info) } catch (e) { // if the user intentionally throws the original error in the handler, // do not log it twice if (e !== err) { logError(e, null, 'config.errorHandler'); } } } logError(err, vm, info); } function logError (err, vm, info) { if (false) {} /* istanbul ignore else */ if ((inBrowser || inWeex) && typeof console !== 'undefined') { console.error(err); } else { throw err } } /* */ var isUsingMicroTask = false; var callbacks = []; var pending = false; function flushCallbacks () { pending = false; var copies = callbacks.slice(0); callbacks.length = 0; for (var i = 0; i < copies.length; i++) { copies[i](); } } // Here we have async deferring wrappers using microtasks. // In 2.5 we used (macro) tasks (in combination with microtasks). // However, it has subtle problems when state is changed right before repaint // (e.g. #6813, out-in transitions). // Also, using (macro) tasks in event handler would cause some weird behaviors // that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109). // So we now use microtasks everywhere, again. // A major drawback of this tradeoff is that there are some scenarios // where microtasks have too high a priority and fire in between supposedly // sequential events (e.g. #4521, #6690, which have workarounds) // or even between bubbling of the same event (#6566). var timerFunc; // The nextTick behavior leverages the microtask queue, which can be accessed // via either native Promise.then or MutationObserver. // MutationObserver has wider support, however it is seriously bugged in // UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It // completely stops working after triggering a few times... so, if native // Promise is available, we will use it: /* istanbul ignore next, $flow-disable-line */ if (typeof Promise !== 'undefined' && isNative(Promise)) { var p = Promise.resolve(); timerFunc = 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); } }; isUsingMicroTask = true; } else if (!isIE && typeof MutationObserver !== 'undefined' && ( isNative(MutationObserver) || // PhantomJS and iOS 7.x MutationObserver.toString() === '[object MutationObserverConstructor]' )) { // Use MutationObserver where native Promise is not available, // e.g. PhantomJS, iOS7, Android 4.4 // (#6466 MutationObserver is unreliable in IE11) var counter = 1; var observer = new MutationObserver(flushCallbacks); var textNode = document.createTextNode(String(counter)); observer.observe(textNode, { characterData: true }); timerFunc = function () { counter = (counter + 1) % 2; textNode.data = String(counter); }; isUsingMicroTask = true; } else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) { // Fallback to setImmediate. // Techinically it leverages the (macro) task queue, // but it is still a better choice than setTimeout. timerFunc = function () { setImmediate(flushCallbacks); }; } else { // Fallback to setTimeout. timerFunc = function () { setTimeout(flushCallbacks, 0); }; } function nextTick (cb, ctx) { var _resolve; callbacks.push(function () { if (cb) { try { cb.call(ctx); } catch (e) { handleError(e, ctx, 'nextTick'); } } else if (_resolve) { _resolve(ctx); } }); if (!pending) { pending = true; timerFunc(); } // $flow-disable-line if (!cb && typeof Promise !== 'undefined') { return new Promise(function (resolve) { _resolve = resolve; }) } } /* */ /* not type checking this file because flow doesn't play well with Proxy */ var initProxy; if (false) { var getHandler, hasHandler, isBuiltInModifier, hasProxy, warnReservedPrefix, warnNonPresent, allowedGlobals; } /* */ 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 mark; var measure; if (false) { var perf; } /* */ var normalizeEvent = cached(function (name) { var passive = name.charAt(0) === '&'; name = passive ? name.slice(1) : name; var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first name = once$$1 ? name.slice(1) : name; var capture = name.charAt(0) === '!'; name = capture ? name.slice(1) : name; return { name: name, once: once$$1, capture: capture, passive: passive } }); function createFnInvoker (fns, vm) { function invoker () { var arguments$1 = arguments; var fns = invoker.fns; if (Array.isArray(fns)) { var cloned = fns.slice(); for (var i = 0; i < cloned.length; i++) { invokeWithErrorHandling(cloned[i], null, arguments$1, vm, "v-on handler"); } } else { // return handler return value for single handlers return invokeWithErrorHandling(fns, null, arguments, vm, "v-on handler") } } invoker.fns = fns; return invoker } function updateListeners ( on, oldOn, add, remove$$1, createOnceHandler, vm ) { var name, def$$1, cur, old, event; for (name in on) { def$$1 = cur = on[name]; old = oldOn[name]; event = normalizeEvent(name); if (isUndef(cur)) { false && false; } else if (isUndef(old)) { if (isUndef(cur.fns)) { cur = on[name] = createFnInvoker(cur, vm); } if (isTrue(event.once)) { cur = on[name] = createOnceHandler(event.name, cur, event.capture); } add(event.name, cur, event.capture, event.passive, event.params); } else if (cur !== old) { old.fns = cur; on[name] = old; } } for (name in oldOn) { if (isUndef(on[name])) { event = normalizeEvent(name); remove$$1(event.name, oldOn[name], event.capture); } } } /* */ function mergeVNodeHook (def, hookKey, hook) { if (def instanceof VNode) { def = def.data.hook || (def.data.hook = {}); } var invoker; var oldHook = def[hookKey]; function wrappedHook () { hook.apply(this, arguments); // important: remove merged hook to ensure it's called only once // and prevent memory leak remove(invoker.fns, wrappedHook); } if (isUndef(oldHook)) { // no existing hook invoker = createFnInvoker([wrappedHook]); } else { /* istanbul ignore if */ if (isDef(oldHook.fns) && isTrue(oldHook.merged)) { // already a merged invoker invoker = oldHook; invoker.fns.push(wrappedHook); } else { // existing plain hook invoker = createFnInvoker([oldHook, wrappedHook]); } } invoker.merged = true; def[hookKey] = invoker; } /* */ 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); if (false) { var keyInLowerCase; } 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. 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.