From 2afaf4507127b8190c2e1aee8e35bdce3a29235b Mon Sep 17 00:00:00 2001 From: windy <1374721899@qq.com> Date: Fri, 10 Dec 2021 15:41:34 +0800 Subject: [PATCH 01/46] =?UTF-8?q?KERNEL-9882=20=E5=9F=BA=E7=A1=80=E8=89=B2?= =?UTF-8?q?=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/less/lib/colors.less | 53 -------------------- src/less/lib/constant.less | 99 ++++++++++++++++++++++++++++++++------ 2 files changed, 84 insertions(+), 68 deletions(-) diff --git a/src/less/lib/colors.less b/src/less/lib/colors.less index 81f9e5197..6ce390b70 100644 --- a/src/less/lib/colors.less +++ b/src/less/lib/colors.less @@ -126,56 +126,3 @@ @color-bi-border-warning: @border-color-warning; //边框提亮 @color-bi-border-highlight: @border-color-highlight; - -//颜色百分比 -//green -@color-bi-green-80: fade(@font-color-success, 80); -@color-bi-green-60: fade(@font-color-success, 60); -@color-bi-green-40: fade(@font-color-success, 40); -@color-bi-green-30: fade(@font-color-success, 30); -@color-bi-green-20: fade(@font-color-success, 20); -@color-bi-green-10: fade(@font-color-success, 10); -@color-bi-green-5: fade(@font-color-success, 5); - -//blue -@color-bi-blue-80: fade(@font-color-highlight, 80); -@color-bi-blue-60: fade(@font-color-highlight, 60); -@color-bi-blue-40: fade(@font-color-highlight, 40); -@color-bi-blue-30: fade(@font-color-highlight, 30); -@color-bi-blue-20: fade(@font-color-highlight, 20); -@color-bi-blue-10: fade(@font-color-highlight, 10); -@color-bi-blue-5: fade(@font-color-highlight, 5); - -//light-blue -@color-bi-light-blue-80: fade(@font-color-light-highlight, 80); -@color-bi-light-blue-60: fade(@font-color-light-highlight, 60); -@color-bi-light-blue-40: fade(@font-color-light-highlight, 40); -@color-bi-light-blue-30: fade(@font-color-light-highlight, 30); -@color-bi-light-blue-20: fade(@font-color-light-highlight, 20); -@color-bi-light-blue-10: fade(@font-color-light-highlight, 10); -@color-bi-light-blue-5: fade(@font-color-light-highlight, 5); - -// orange -@color-bi-orange-80: fade(@font-color-warning, 80); -@color-bi-orange-60: fade(@font-color-warning, 60); -@color-bi-orange-40: fade(@font-color-warning, 40); -@color-bi-orange-30: fade(@font-color-warning, 30); -@color-bi-orange-20: fade(@font-color-warning, 20); -@color-bi-orange-10: fade(@font-color-warning, 10); -@color-bi-orange-5: fade(@font-color-warning, 5); - -// red -@color-bi-red-80: fade(@font-color-negative, 80); -@color-bi-red-60: fade(@font-color-negative, 60); -@color-bi-red-40: fade(@font-color-negative, 40); -@color-bi-red-30: fade(@font-color-negative, 30); -@color-bi-red-20: fade(@font-color-negative, 20); -@color-bi-red-10: fade(@font-color-negative, 10); -@color-bi-red-5: fade(@font-color-negative, 5); - -// yellow -@color-bi-yellow-80: fade(@font-color-yellow, 90); -@color-bi-yellow-60: fade(@font-color-yellow, 60); -@color-bi-yellow-40: fade(@font-color-yellow, 40); -@color-bi-yellow-20: fade(@font-color-yellow, 20); -@color-bi-yellow-5: fade(@font-color-yellow, 5); diff --git a/src/less/lib/constant.less b/src/less/lib/constant.less index 4d99501bf..ecea10f85 100644 --- a/src/less/lib/constant.less +++ b/src/less/lib/constant.less @@ -20,6 +20,75 @@ @opacity-15: 0.15; @opacity-20: 0.2; +//色板 +//green +@color-bi-green-100: #13cd66; +@color-bi-green-80: fade(@color-bi-green-100, 80); +@color-bi-green-60: fade(@color-bi-green-100, 60); +@color-bi-green-40: fade(@color-bi-green-100, 40); +@color-bi-green-30: fade(@color-bi-green-100, 30); +@color-bi-green-20: fade(@color-bi-green-100, 20); +@color-bi-green-10: fade(@color-bi-green-100, 10); +@color-bi-green-5: fade(@color-bi-green-100, 5); + +//cyan +@color-bi-green-100: #13cd66; +@color-bi-green-80: fade(@color-bi-green-100, 80); +@color-bi-green-60: fade(@color-bi-green-100, 60); +@color-bi-green-40: fade(@color-bi-green-100, 40); +@color-bi-green-30: fade(@color-bi-green-100, 30); +@color-bi-green-20: fade(@color-bi-green-100, 20); +@color-bi-green-10: fade(@color-bi-green-100, 10); +@color-bi-green-5: fade(@color-bi-green-100, 5); + +//blue +@color-bi-blue-100: #3685f2; +@color-bi-blue-80: fade(@color-bi-blue-100, 80); +@color-bi-blue-60: fade(@color-bi-blue-100, 60); +@color-bi-blue-40: fade(@color-bi-blue-100, 40); +@color-bi-blue-30: fade(@color-bi-blue-100, 30); +@color-bi-blue-20: fade(@color-bi-blue-100, 20); +@color-bi-blue-10: fade(@color-bi-blue-100, 10); +@color-bi-blue-5: fade(@color-bi-blue-100, 5); + +//light-blue +@color-bi-light-blue-100: #eaf2fd; +@color-bi-light-blue-80: fade(@color-bi-light-blue-100, 80); +@color-bi-light-blue-60: fade(@color-bi-light-blue-100, 60); +@color-bi-light-blue-40: fade(@color-bi-light-blue-100, 40); +@color-bi-light-blue-30: fade(@color-bi-light-blue-100, 30); +@color-bi-light-blue-20: fade(@color-bi-light-blue-100, 20); +@color-bi-light-blue-10: fade(@color-bi-light-blue-100, 10); +@color-bi-light-blue-5: fade(@color-bi-light-blue-100, 5); + +// orange +@color-bi-orange-100: #faaa39; +@color-bi-orange-80: fade(@color-bi-orange-100, 80); +@color-bi-orange-60: fade(@color-bi-orange-100, 60); +@color-bi-orange-40: fade(@color-bi-orange-100, 40); +@color-bi-orange-30: fade(@color-bi-orange-100, 30); +@color-bi-orange-20: fade(@color-bi-orange-100, 20); +@color-bi-orange-10: fade(@color-bi-orange-100, 10); +@color-bi-orange-5: fade(@color-bi-orange-100, 5); + +// red +@color-bi-red-100: #e65251; +@color-bi-red-80: fade(@color-bi-red-100, 80); +@color-bi-red-60: fade(@color-bi-red-100, 60); +@color-bi-red-40: fade(@color-bi-red-100, 40); +@color-bi-red-30: fade(@color-bi-red-100, 30); +@color-bi-red-20: fade(@color-bi-red-100, 20); +@color-bi-red-10: fade(@color-bi-red-100, 10); +@color-bi-red-5: fade(@color-bi-red-100, 5); + +// yellow +@font-color-yellow-100: #ffc101; +@color-bi-yellow-80: fade(@font-color-yellow-100, 90); +@color-bi-yellow-60: fade(@font-color-yellow-100, 60); +@color-bi-yellow-40: fade(@font-color-yellow-100, 40); +@color-bi-yellow-20: fade(@font-color-yellow-100, 20); +@color-bi-yellow-5: fade(@font-color-yellow-100, 5); + //font color @font-color-black: #232e40; @font-color-normal: #3d4d66; @@ -35,15 +104,15 @@ @font-color-gray: #999999; @font-color-white: #ffffff; @font-color-white-theme-dark: #20263b; -@font-color-light-highlight: #eaf2fd; +@font-color-light-highlight: @color-bi-light-blue-100; @font-color-medium-highlight: #d7e7fc; -@font-color-highlight: #3685f2; +@font-color-highlight: @color-bi-blue-100; @font-color-blue: #23beef; @font-color-light-blue: #e9f8fd; -@font-color-success: #13cd66; -@font-color-warning: #faaa39; -@font-color-negative: #e65251; -@font-color-yellow: #ffc101; +@font-color-success: @color-bi-green-100; +@font-color-warning: @color-bi-orange-100; +@font-color-negative: @color-bi-red-100; +@font-color-yellow: @font-color-yellow-100; //background color @background-color-black: #232E40; @@ -54,9 +123,9 @@ @background-color-default-theme-dark: #20263b; @background-color-normal: #f7f8fa; @background-color-normal-theme-dark: #191b2b; -@background-color-light-highlight: #eaf2fd; +@background-color-light-highlight: @color-bi-light-blue-100; @background-color-medium-highlight: #d7e7fc; -@background-color-highlight: #3685f2; +@background-color-highlight: @color-bi-blue-100; @background-color-blue: #23beef; @background-color-light-blue: #e9f8fd; @background-color-dark: #d4dadd; @@ -70,15 +139,15 @@ @background-color-disabled-theme-dark: #292f45; @background-color-light-disabled: #9ea6b2; @background-color-light-disabled-theme-dark: #878d9f; -@background-color-yellow: #ffc101; +@background-color-yellow: @font-color-yellow-100; -@background-color-negative: #e65251; +@background-color-negative: @color-bi-red-100; @background-color-light-negative: #ffecec; @background-color-dark-negative: #3A2940; @background-color-light-warning: #feeed7; -@background-color-warning: #faaa39; +@background-color-warning: @color-bi-orange-100; -@background-color-dark-success: #13cd66; +@background-color-dark-success: @color-bi-green-100; @background-color-light-success: #e1f4e7; @background-color-normal-success: #647185; @@ -93,11 +162,11 @@ @border-color-dark-gray-line-theme-dark: #606479; @border-color-dark-line: #9ea6b2; @border-color-dark-line-theme-dark: #878d9f; -@border-color-highlight: #3685f2; +@border-color-highlight: @color-bi-blue-100; -@border-color-success: #13cd66; +@border-color-success: @color-bi-green-100; @border-color-warning: #fbb03b; -@border-color-negative: #e65251; +@border-color-negative: @color-bi-red-100; @border-color-light-negative: #f4cbcb; @border-color-normal-success: #647185; From 3e0ec8eed0b8eb8c90f21c31f276cfeb4239c31f Mon Sep 17 00:00:00 2001 From: windy <1374721899@qq.com> Date: Fri, 10 Dec 2021 16:47:21 +0800 Subject: [PATCH 02/46] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0proxy.js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/fix/fix.proxy.js | 3619 +++++++++++++++++++++-------------------- 1 file changed, 1813 insertions(+), 1806 deletions(-) diff --git a/dist/fix/fix.proxy.js b/dist/fix/fix.proxy.js index 513db8d93..78a241383 100644 --- a/dist/fix/fix.proxy.js +++ b/dist/fix/fix.proxy.js @@ -1,2035 +1,2042 @@ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Fix = {})); + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Fix = {})); }(this, (function (exports) { 'use strict'; - function _typeof(obj) { - "@babel/helpers - typeof"; - - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function (obj) { - return typeof obj; - }; - } else { - _typeof = function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; - } - - return _typeof(obj); - } - - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; - } - - function _defineProperty(obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - - return obj; - } - - var EMPTY_OBJ = Object.freeze({}); - Object.freeze([]); - var extend = Object.assign; - var hasOwnProperty = Object.prototype.hasOwnProperty; - - var hasOwn = function hasOwn(val, key) { - return hasOwnProperty.call(val, key); + function _typeof(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + var EMPTY_OBJ = Object.freeze({}); + Object.freeze([]); + var extend = Object.assign; + var hasOwnProperty = Object.prototype.hasOwnProperty; + + var hasOwn = function hasOwn(val, key) { + return hasOwnProperty.call(val, key); + }; + + var isArray = Array.isArray; + + var isMap$1 = function isMap(val) { + return toTypeString$1(val) === "[object Map]"; + }; + + var isFunction = function isFunction(val) { + return typeof val === "function"; + }; + + var isString = function isString(val) { + return typeof val === "string"; + }; + + var isSymbol = function isSymbol(val) { + return _typeof(val) === "symbol"; + }; + + var isObject = function isObject(val) { + return val !== null && _typeof(val) === "object"; + }; + + var objectToString$1 = Object.prototype.toString; + + var toTypeString$1 = function toTypeString(value) { + return objectToString$1.call(value); + }; + + var toRawType = function toRawType(value) { + return (// extract "RawType" from strings like "[object RawType]" + toTypeString$1(value).slice(8, -1) + ); + }; + + var isIntegerKey = function isIntegerKey(key) { + return isString(key) && key !== "NaN" && key[0] !== "-" && "".concat(parseInt(key, 10)) === key; + }; + + var cacheStringFunction = function cacheStringFunction(fn) { + var cache = Object.create(null); + return function (str) { + var hit = cache[str]; + return hit || (cache[str] = fn(str)); }; + }; + /** + * @private + */ - var isArray = Array.isArray; - var isMap$1 = function isMap(val) { - return toTypeString$1(val) === "[object Map]"; - }; - - var isFunction = function isFunction(val) { - return typeof val === "function"; - }; + var capitalize = cacheStringFunction(function (str) { + return str.charAt(0).toUpperCase() + str.slice(1); + }); // compare whether a value has changed, accounting for NaN. - var isString = function isString(val) { - return typeof val === "string"; - }; + var hasChanged$1 = function hasChanged(value, oldValue) { + return value !== oldValue && (value === value || oldValue === oldValue); + }; - var isSymbol = function isSymbol(val) { - return _typeof(val) === "symbol"; - }; + var targetMap = new WeakMap(); + var effectStack = []; + var activeEffect; + var ITERATE_KEY = Symbol("iterate"); + var MAP_KEY_ITERATE_KEY = Symbol("Map key iterate"); - var isObject = function isObject(val) { - return val !== null && _typeof(val) === "object"; - }; + function isEffect(fn) { + return fn && fn._isEffect === true; + } - var objectToString$1 = Object.prototype.toString; + function effect(fn) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : EMPTY_OBJ; - var toTypeString$1 = function toTypeString(value) { - return objectToString$1.call(value); - }; - - var toRawType = function toRawType(value) { - return (// extract "RawType" from strings like "[object RawType]" - toTypeString$1(value).slice(8, -1) - ); - }; + if (isEffect(fn)) { + fn = fn.raw; + } - var isIntegerKey = function isIntegerKey(key) { - return isString(key) && key !== "NaN" && key[0] !== "-" && "".concat(parseInt(key, 10)) === key; - }; - - var cacheStringFunction = function cacheStringFunction(fn) { - var cache = Object.create(null); - return function (str) { - var hit = cache[str]; - return hit || (cache[str] = fn(str)); - }; - }; - /** - * @private - */ + var effect = createReactiveEffect(fn, options); + if (!options.lazy) { + effect(); + } - var capitalize = cacheStringFunction(function (str) { - return str.charAt(0).toUpperCase() + str.slice(1); - }); // compare whether a value has changed, accounting for NaN. + return effect; + } - var hasChanged$1 = function hasChanged(value, oldValue) { - return value !== oldValue && (value === value || oldValue === oldValue); - }; + function stop(effect) { + if (effect.active) { + cleanup(effect); - var targetMap = new WeakMap(); - var effectStack = []; - var activeEffect; - var ITERATE_KEY = Symbol("iterate"); - var MAP_KEY_ITERATE_KEY = Symbol("Map key iterate"); + if (effect.options.onStop) { + effect.options.onStop(); + } - function isEffect(fn) { - return fn && fn._isEffect === true; + effect.active = false; } + } - function effect(fn) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : EMPTY_OBJ; + var uid$1 = 0; - if (isEffect(fn)) { - fn = fn.raw; - } + function createReactiveEffect(fn, options) { + var effect = function reactiveEffect() { + if (!effect.active) { + return options.scheduler ? undefined : fn(); + } - var effect = createReactiveEffect(fn, options); + if (!effectStack.includes(effect)) { + cleanup(effect); - if (!options.lazy) { - effect(); + try { + enableTracking(); + effectStack.push(effect); + activeEffect = effect; + return fn(); + } finally { + effectStack.pop(); + resetTracking(); + activeEffect = effectStack[effectStack.length - 1]; } + } + }; - return effect; - } + effect.id = uid$1++; + effect.allowRecurse = !!options.allowRecurse; + effect._isEffect = true; + effect.active = true; + effect.raw = fn; + effect.deps = []; + effect.options = options; + return effect; + } - function stop(effect) { - if (effect.active) { - cleanup(effect); + function cleanup(effect) { + var deps = effect.deps; - if (effect.options.onStop) { - effect.options.onStop(); - } + if (deps.length) { + for (var i = 0; i < deps.length; i++) { + deps[i].delete(effect); + } - effect.active = false; - } + deps.length = 0; } + } - var uid$1 = 0; + var shouldTrack = true; + var trackStack = []; - function createReactiveEffect(fn, options) { - var effect = function reactiveEffect() { - if (!effect.active) { - return options.scheduler ? undefined : fn(); - } + function pauseTracking() { + trackStack.push(shouldTrack); + shouldTrack = false; + } - if (!effectStack.includes(effect)) { - cleanup(effect); - - try { - enableTracking(); - effectStack.push(effect); - activeEffect = effect; - return fn(); - } finally { - effectStack.pop(); - resetTracking(); - activeEffect = effectStack[effectStack.length - 1]; - } - } - }; + function enableTracking() { + trackStack.push(shouldTrack); + shouldTrack = true; + } - effect.id = uid$1++; - effect.allowRecurse = !!options.allowRecurse; - effect._isEffect = true; - effect.active = true; - effect.raw = fn; - effect.deps = []; - effect.options = options; - return effect; - } + function resetTracking() { + var last = trackStack.pop(); + shouldTrack = last === undefined ? true : last; + } - function cleanup(effect) { - var deps = effect.deps; - - if (deps.length) { - for (var i = 0; i < deps.length; i++) { - deps[i].delete(effect); - } - - deps.length = 0; - } + function track(target, type, key) { + if (!shouldTrack || activeEffect === undefined) { + return; } - var shouldTrack = true; - var trackStack = []; + var depsMap = targetMap.get(target); - function pauseTracking() { - trackStack.push(shouldTrack); - shouldTrack = false; + if (!depsMap) { + targetMap.set(target, depsMap = new Map()); } - function enableTracking() { - trackStack.push(shouldTrack); - shouldTrack = true; - } + var dep = depsMap.get(key); - function resetTracking() { - var last = trackStack.pop(); - shouldTrack = last === undefined ? true : last; + if (!dep) { + depsMap.set(key, dep = new Set()); } - function track(target, type, key) { - if (!shouldTrack || activeEffect === undefined) { - return; - } - - var depsMap = targetMap.get(target); - - if (!depsMap) { - targetMap.set(target, depsMap = new Map()); - } - - var dep = depsMap.get(key); - - if (!dep) { - depsMap.set(key, dep = new Set()); - } + if (!dep.has(activeEffect)) { + dep.add(activeEffect); + activeEffect.deps.push(dep); - if (!dep.has(activeEffect)) { - dep.add(activeEffect); - activeEffect.deps.push(dep); - - if (activeEffect.options.onTrack) { - activeEffect.options.onTrack({ - effect: activeEffect, - target: target, - type: type, - key: key - }); - } - } + if (activeEffect.options.onTrack) { + activeEffect.options.onTrack({ + effect: activeEffect, + target: target, + type: type, + key: key + }); + } } + } - function trigger(target, type, key, newValue, oldValue, oldTarget) { - var depsMap = targetMap.get(target); - - if (!depsMap) { - // never been tracked - return; - } - - var effects = new Set(); - - var add = function add(effectsToAdd) { - if (effectsToAdd) { - effectsToAdd.forEach(function (effect) { - if (effect !== activeEffect || effect.allowRecurse) { - effects.add(effect); - } - }); - } - }; - - if (type === "clear" - /* CLEAR */ - ) { - // collection being cleared - // trigger all effects for target - depsMap.forEach(add); - } else if (key === "length" && isArray(target)) { - depsMap.forEach(function (dep, key) { - if (key === "length" || key >= newValue) { - add(dep); - } - }); - } else { - // schedule runs for SET | ADD | DELETE - if (key !== void 0) { - add(depsMap.get(key)); - } // also run for iteration key on ADD | DELETE | Map.SET - - - switch (type) { - case "add" - /* ADD */ - : - if (!isArray(target)) { - add(depsMap.get(ITERATE_KEY)); - - if (isMap$1(target)) { - add(depsMap.get(MAP_KEY_ITERATE_KEY)); - } - } else if (isIntegerKey(key)) { - // new index added to array -> length changes - add(depsMap.get("length")); - } - - break; - - case "delete" - /* DELETE */ - : - if (!isArray(target)) { - add(depsMap.get(ITERATE_KEY)); - - if (isMap$1(target)) { - add(depsMap.get(MAP_KEY_ITERATE_KEY)); - } - } - - break; - - case "set" - /* SET */ - : - if (isMap$1(target)) { - add(depsMap.get(ITERATE_KEY)); - } - - break; - } - } - - var run = function run(effect) { - if (effect.options.onTrigger) { - effect.options.onTrigger({ - effect: effect, - target: target, - key: key, - type: type, - newValue: newValue, - oldValue: oldValue, - oldTarget: oldTarget - }); - } - - if (effect.options.scheduler) { - effect.options.scheduler(effect); - } else { - effect(); - } - }; + function trigger(target, type, key, newValue, oldValue, oldTarget) { + var depsMap = targetMap.get(target); - effects.forEach(run); + if (!depsMap) { + // never been tracked + return; } - var builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol).map(function (key) { - return Symbol[key]; - }).filter(isSymbol)); - var get = /* #__PURE__*/createGetter(); - var shallowGet = /* #__PURE__*/createGetter(false, true); - var readonlyGet = /* #__PURE__*/createGetter(true); - var shallowReadonlyGet = /* #__PURE__*/createGetter(true, true); - var arrayInstrumentations = {}; - ["includes", "indexOf", "lastIndexOf"].forEach(function (key) { - var method = Array.prototype[key]; - - arrayInstrumentations[key] = function () { - var arr = toRaw(this); - - for (var i = 0, l = this.length; i < l; i++) { - track(arr, "get" - /* GET */ - , "".concat(i)); - } // we run the method using the original args first (which may be reactive) - - - for (var _len = arguments.length, args = new Array(_len), _key2 = 0; _key2 < _len; _key2++) { - args[_key2] = arguments[_key2]; - } - - var res = method.apply(arr, args); - - if (res === -1 || res === false) { - // if that didn't work, run it again using raw values. - return method.apply(arr, args.map(toRaw)); - } else { - return res; - } - }; - }); - ["push", "pop", "shift", "unshift", "splice"].forEach(function (key) { - var method = Array.prototype[key]; - - arrayInstrumentations[key] = function () { - pauseTracking(); - - for (var _len2 = arguments.length, args = new Array(_len2), _key3 = 0; _key3 < _len2; _key3++) { - args[_key3] = arguments[_key3]; - } + var effects = new Set(); - var res = method.apply(this, args); - resetTracking(); - return res; - }; - }); - - function createGetter() { - var isReadonly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var shallow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - return function get(target, key, receiver) { - if (key === "__v_isReactive" - /* IS_REACTIVE */ - ) { - return !isReadonly; - } else if (key === "__v_isReadonly" - /* IS_READONLY */ - ) { - return isReadonly; - } else if (key === "__v_raw" - /* RAW */ - && receiver === (isReadonly ? readonlyMap : reactiveMap).get(target)) { - return target; - } - - var targetIsArray = isArray(target); + var add = function add(effectsToAdd) { + if (effectsToAdd) { + effectsToAdd.forEach(function (effect) { + if (effect !== activeEffect || effect.allowRecurse) { + effects.add(effect); + } + }); + } + }; - if (targetIsArray && hasOwn(arrayInstrumentations, key)) { - return Reflect.get(arrayInstrumentations, key, receiver); + if (type === "clear" + /* CLEAR */ + ) { + // collection being cleared + // trigger all effects for target + depsMap.forEach(add); + } else if (key === "length" && isArray(target)) { + depsMap.forEach(function (dep, key) { + if (key === "length" || key >= newValue) { + add(dep); + } + }); + } else { + // schedule runs for SET | ADD | DELETE + if (key !== void 0) { + add(depsMap.get(key)); + } // also run for iteration key on ADD | DELETE | Map.SET + + + switch (type) { + case "add" + /* ADD */ + : + if (!isArray(target)) { + add(depsMap.get(ITERATE_KEY)); + + if (isMap$1(target)) { + add(depsMap.get(MAP_KEY_ITERATE_KEY)); } + } else if (isIntegerKey(key)) { + // new index added to array -> length changes + add(depsMap.get("length")); + } - var res = Reflect.get(target, key, receiver); + break; - if (isSymbol(key) ? builtInSymbols.has(key) : key === "__proto__" || key === "__v_isRef") { - return res; - } - - if (!isReadonly) { - track(target, "get" - /* GET */ - , key); - } + case "delete" + /* DELETE */ + : + if (!isArray(target)) { + add(depsMap.get(ITERATE_KEY)); - if (shallow) { - return res; + if (isMap$1(target)) { + add(depsMap.get(MAP_KEY_ITERATE_KEY)); } + } + + break; + + case "set" + /* SET */ + : + if (isMap$1(target)) { + add(depsMap.get(ITERATE_KEY)); + } + + break; + } + } + + var run = function run(effect) { + if (effect.options.onTrigger) { + effect.options.onTrigger({ + effect: effect, + target: target, + key: key, + type: type, + newValue: newValue, + oldValue: oldValue, + oldTarget: oldTarget + }); + } - if (isRef(res)) { - // ref unwrapping - does not apply for Array + integer key. - var shouldUnwrap = !targetIsArray || !isIntegerKey(key); - return shouldUnwrap ? res.value : res; - } + if (effect.options.scheduler) { + effect.options.scheduler(effect); + } else { + effect(); + } + }; - if (isObject(res)) { - // Convert returned value into a proxy as well. we do the isObject check - // here to avoid invalid value warning. Also need to lazy access readonly - // and reactive here to avoid circular dependency. - return isReadonly ? readonly(res) : reactive(res); - } + effects.forEach(run); + } + + var builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol).map(function (key) { + return Symbol[key]; + }).filter(isSymbol)); + var get = /* #__PURE__*/createGetter(); + var shallowGet = /* #__PURE__*/createGetter(false, true); + var readonlyGet = /* #__PURE__*/createGetter(true); + var shallowReadonlyGet = /* #__PURE__*/createGetter(true, true); + var arrayInstrumentations = {}; + ["includes", "indexOf", "lastIndexOf"].forEach(function (key) { + var method = Array.prototype[key]; + + arrayInstrumentations[key] = function () { + var arr = toRaw(this); + + for (var i = 0, l = this.length; i < l; i++) { + track(arr, "get" + /* GET */ + , "".concat(i)); + } // we run the method using the original args first (which may be reactive) + + + for (var _len = arguments.length, args = new Array(_len), _key2 = 0; _key2 < _len; _key2++) { + args[_key2] = arguments[_key2]; + } + + var res = method.apply(arr, args); + + if (res === -1 || res === false) { + // if that didn't work, run it again using raw values. + return method.apply(arr, args.map(toRaw)); + } else { + return res; + } + }; + }); + ["push", "pop", "shift", "unshift", "splice"].forEach(function (key) { + var method = Array.prototype[key]; - return res; - }; - } + arrayInstrumentations[key] = function () { + pauseTracking(); - var set$1 = /* #__PURE__*/createSetter(); - var shallowSet = /* #__PURE__*/createSetter(true); + for (var _len2 = arguments.length, args = new Array(_len2), _key3 = 0; _key3 < _len2; _key3++) { + args[_key3] = arguments[_key3]; + } - function createSetter() { - var shallow = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - return function set(target, key, value, receiver) { - var oldValue = target[key]; + var res = method.apply(this, args); + resetTracking(); + return res; + }; + }); + + function createGetter() { + var isReadonly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var shallow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + return function get(target, key, receiver) { + if (key === "__v_isReactive" + /* IS_REACTIVE */ + ) { + return !isReadonly; + } else if (key === "__v_isReadonly" + /* IS_READONLY */ + ) { + return isReadonly; + } else if (key === "__v_raw" + /* RAW */ + && receiver === (isReadonly ? readonlyMap : reactiveMap).get(target)) { + return target; + } + + var targetIsArray = isArray(target); + + if (targetIsArray && hasOwn(arrayInstrumentations, key)) { + return Reflect.get(arrayInstrumentations, key, receiver); + } + + var res = Reflect.get(target, key, receiver); + + if (isSymbol(key) ? builtInSymbols.has(key) : key === "__proto__" || key === "__v_isRef") { + return res; + } + + if (!isReadonly) { + track(target, "get" + /* GET */ + , key); + } + + if (shallow) { + return res; + } + + if (isRef(res)) { + // ref unwrapping - does not apply for Array + integer key. + var shouldUnwrap = !targetIsArray || !isIntegerKey(key); + return shouldUnwrap ? res.value : res; + } + + if (isObject(res)) { + // Convert returned value into a proxy as well. we do the isObject check + // here to avoid invalid value warning. Also need to lazy access readonly + // and reactive here to avoid circular dependency. + return isReadonly ? readonly(res) : reactive(res); + } + + return res; + }; + } - if (!shallow) { - value = toRaw(value); + var set$1 = /* #__PURE__*/createSetter(); + var shallowSet = /* #__PURE__*/createSetter(true); - if (!isArray(target) && isRef(oldValue) && !isRef(value)) { - oldValue.value = value; - return true; - } - } + function createSetter() { + var shallow = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + return function set(target, key, value, receiver) { + var oldValue = target[key]; - var hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key); - var result = Reflect.set(target, key, value, receiver); // don't trigger if target is something up in the prototype chain of original - - if (target === toRaw(receiver)) { - if (!hadKey) { - trigger(target, "add" - /* ADD */ - , key, value); - } else if (hasChanged$1(value, oldValue) || key === "length") { - trigger(target, "set" - /* SET */ - , key, value, oldValue); - } - } + if (!shallow) { + value = toRaw(value); - return result; - }; - } + if (!isArray(target) && isRef(oldValue) && !isRef(value)) { + oldValue.value = value; + return true; + } + } - function deleteProperty(target, key) { - var hadKey = hasOwn(target, key); - var oldValue = target[key]; - var result = Reflect.deleteProperty(target, key); + var hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key); + var result = Reflect.set(target, key, value, receiver); // don't trigger if target is something up in the prototype chain of original - if (result && hadKey) { - trigger(target, "delete" - /* DELETE */ - , key, undefined, oldValue); + if (target === toRaw(receiver)) { + if (!hadKey) { + trigger(target, "add" + /* ADD */ + , key, value); + } else if (hasChanged$1(value, oldValue) || key === "length") { + trigger(target, "set" + /* SET */ + , key, value, oldValue); } + } - return result; + return result; + }; + } + + function deleteProperty(target, key) { + var hadKey = hasOwn(target, key); + var oldValue = target[key]; + var result = Reflect.deleteProperty(target, key); + + if (result && hadKey) { + trigger(target, "delete" + /* DELETE */ + , key, undefined, oldValue); + } + + return result; + } + + function has$1(target, key) { + var result = Reflect.has(target, key); + + if (!isSymbol(key) || !builtInSymbols.has(key)) { + track(target, "has" + /* HAS */ + , key); + } + + return result; + } + + function ownKeys(target) { + track(target, "iterate" + /* ITERATE */ + , isArray(target) ? "length" : ITERATE_KEY); + return Reflect.ownKeys(target); + } + + var mutableHandlers = { + get: get, + set: set$1, + deleteProperty: deleteProperty, + has: has$1, + ownKeys: ownKeys + }; + var readonlyHandlers = { + get: readonlyGet, + set: function set(target, key) { + { + console.warn("Set operation on key \"".concat(String(key), "\" failed: target is readonly."), target); + } + return true; + }, + deleteProperty: function deleteProperty(target, key) { + { + console.warn("Delete operation on key \"".concat(String(key), "\" failed: target is readonly."), target); + } + return true; + } + }; + extend({}, mutableHandlers, { + get: shallowGet, + set: shallowSet + }); // Props handlers are special in the sense that it should not unwrap top-level + // refs (in order to allow refs to be explicitly passed down), but should + // retain the reactivity of the normal readonly object. + + extend({}, readonlyHandlers, { + get: shallowReadonlyGet + }); + + var toReactive = function toReactive(value) { + return isObject(value) ? reactive(value) : value; + }; + + var toReadonly = function toReadonly(value) { + return isObject(value) ? readonly(value) : value; + }; + + var toShallow = function toShallow(value) { + return value; + }; + + var getProto = function getProto(v) { + return Reflect.getPrototypeOf(v); + }; + + function get$1(target, key) { + var isReadonly = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var isShallow = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + // #1772: readonly(reactive(Map)) should return readonly + reactive version + // of the value + target = target["__v_raw" + /* RAW */ + ]; + var rawTarget = toRaw(target); + var rawKey = toRaw(key); + + if (key !== rawKey) { + !isReadonly && track(rawTarget, "get" + /* GET */ + , key); + } + + !isReadonly && track(rawTarget, "get" + /* GET */ + , rawKey); + + var _getProto = getProto(rawTarget), + has = _getProto.has; + + var wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive; + + if (has.call(rawTarget, key)) { + return wrap(target.get(key)); + } else if (has.call(rawTarget, rawKey)) { + return wrap(target.get(rawKey)); + } + } + + function has$1$1(key) { + var isReadonly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var target = this["__v_raw" + /* RAW */ + ]; + var rawTarget = toRaw(target); + var rawKey = toRaw(key); + + if (key !== rawKey) { + !isReadonly && track(rawTarget, "has" + /* HAS */ + , key); + } + + !isReadonly && track(rawTarget, "has" + /* HAS */ + , rawKey); + return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); + } + + function size(target) { + var isReadonly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + target = target["__v_raw" + /* RAW */ + ]; + !isReadonly && track(toRaw(target), "iterate" + /* ITERATE */ + , ITERATE_KEY); + return Reflect.get(target, "size", target); + } + + function add(value) { + value = toRaw(value); + var target = toRaw(this); + var proto = getProto(target); + var hadKey = proto.has.call(target, value); + var result = target.add(value); + + if (!hadKey) { + trigger(target, "add" + /* ADD */ + , value, value); + } + + return result; + } + + function set$1$1(key, value) { + value = toRaw(value); + var target = toRaw(this); + + var _getProto2 = getProto(target), + has = _getProto2.has, + get = _getProto2.get; + + var hadKey = has.call(target, key); + + if (!hadKey) { + key = toRaw(key); + hadKey = has.call(target, key); + } else { + checkIdentityKeys(target, has, key); + } + + var oldValue = get.call(target, key); + var result = target.set(key, value); + + if (!hadKey) { + trigger(target, "add" + /* ADD */ + , key, value); + } else if (hasChanged$1(value, oldValue) || key === "length") { + trigger(target, "set" + /* SET */ + , key, value, oldValue); } - function has$1(target, key) { - var result = Reflect.has(target, key); + return result; + } - if (!isSymbol(key) || !builtInSymbols.has(key)) { - track(target, "has" - /* HAS */ - , key); - } + function deleteEntry(key) { + var target = toRaw(this); - return result; - } + var _getProto3 = getProto(target), + has = _getProto3.has, + get = _getProto3.get; - function ownKeys(target) { - track(target, "iterate" - /* ITERATE */ - , isArray(target) ? "length" : ITERATE_KEY); - return Reflect.ownKeys(target); - } + var hadKey = has.call(target, key); + + if (!hadKey) { + key = toRaw(key); + hadKey = has.call(target, key); + } else { + checkIdentityKeys(target, has, key); + } + + var oldValue = get ? get.call(target, key) : undefined; // forward the operation before queueing reactions + + var result = target.delete(key); + + if (hadKey) { + trigger(target, "delete" + /* DELETE */ + , key, undefined, oldValue); + } + + return result; + } + + function clear() { + var target = toRaw(this); + var hadItems = target.size !== 0; + var oldTarget = isMap$1(target) ? new Map(target) : new Set(target); // forward the operation before queueing reactions + + var result = target.clear(); + + if (hadItems) { + trigger(target, "clear" + /* CLEAR */ + , undefined, undefined, oldTarget); + } + + return result; + } - var mutableHandlers = { - get: get, - set: set$1, - deleteProperty: deleteProperty, - has: has$1, - ownKeys: ownKeys - }; - var readonlyHandlers = { - get: readonlyGet, - set: function set(target, key) { - { - console.warn("Set operation on key \"".concat(String(key), "\" failed: target is readonly."), target); - } - return true; - }, - deleteProperty: function deleteProperty(target, key) { - { - console.warn("Delete operation on key \"".concat(String(key), "\" failed: target is readonly."), target); - } - return true; - } + function createForEach(isReadonly, isShallow) { + return function forEach(callback, thisArg) { + var observed = this; + var target = observed["__v_raw" + /* RAW */ + ]; + var rawTarget = toRaw(target); + var wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive; + !isReadonly && track(rawTarget, "iterate" + /* ITERATE */ + , ITERATE_KEY); + return target.forEach(function (value, key) { + return (// important: make sure the callback is + // 1. invoked with the reactive map as `this` and 3rd arg + // 2. the value received should be a corresponding reactive/readonly. + callback.call(thisArg, wrap(value), wrap(key), observed) + ); + }); }; - extend({}, mutableHandlers, { - get: shallowGet, - set: shallowSet - }); // Props handlers are special in the sense that it should not unwrap top-level - // refs (in order to allow refs to be explicitly passed down), but should - // retain the reactivity of the normal readonly object. - - extend({}, readonlyHandlers, { - get: shallowReadonlyGet - }); - - var toReactive = function toReactive(value) { - return isObject(value) ? reactive(value) : value; + } + + function createIterableMethod(method, isReadonly, isShallow) { + return function () { + var target = this["__v_raw" + /* RAW */ + ]; + var rawTarget = toRaw(target); + var targetIsMap = isMap$1(rawTarget); + var isPair = method === "entries" || method === Symbol.iterator && targetIsMap; + var isKeyOnly = method === "keys" && targetIsMap; + var innerIterator = target[method].apply(target, arguments); + var wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive; + !isReadonly && track(rawTarget, "iterate" + /* ITERATE */ + , isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY); // return a wrapped iterator which returns observed versions of the + // values emitted from the real iterator + + return _defineProperty({ + // iterator protocol + next: function next() { + var _innerIterator$next = innerIterator.next(), + value = _innerIterator$next.value, + done = _innerIterator$next.done; + + return done ? { + value: value, + done: done + } : { + value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), + done: done + }; + } + }, Symbol.iterator, function () { + return this; + }); }; - - var toReadonly = function toReadonly(value) { - return isObject(value) ? readonly(value) : value; + } + + function createReadonlyMethod(type) { + return function () { + { + var key = (arguments.length <= 0 ? undefined : arguments[0]) ? "on key \"".concat(arguments.length <= 0 ? undefined : arguments[0], "\" ") : ""; + console.warn("".concat(capitalize(type), " operation ").concat(key, "failed: target is readonly."), toRaw(this)); + } + return type === "delete" + /* DELETE */ + ? false : this; }; - - var toShallow = function toShallow(value) { - return value; + } + + var mutableInstrumentations = { + get: function get(key) { + return get$1(this, key); + }, + + get size() { + return size(this); + }, + + has: has$1$1, + add: add, + set: set$1$1, + delete: deleteEntry, + clear: clear, + forEach: createForEach(false, false) + }; + var shallowInstrumentations = { + get: function get(key) { + return get$1(this, key, false, true); + }, + + get size() { + return size(this); + }, + + has: has$1$1, + add: add, + set: set$1$1, + delete: deleteEntry, + clear: clear, + forEach: createForEach(false, true) + }; + var readonlyInstrumentations = { + get: function get(key) { + return get$1(this, key, true); + }, + + get size() { + return size(this, true); + }, + + has: function has(key) { + return has$1$1.call(this, key, true); + }, + add: createReadonlyMethod("add" + /* ADD */ + ), + set: createReadonlyMethod("set" + /* SET */ + ), + delete: createReadonlyMethod("delete" + /* DELETE */ + ), + clear: createReadonlyMethod("clear" + /* CLEAR */ + ), + forEach: createForEach(true, false) + }; + var iteratorMethods = ["keys", "values", "entries", Symbol.iterator]; + iteratorMethods.forEach(function (method) { + mutableInstrumentations[method] = createIterableMethod(method, false, false); + readonlyInstrumentations[method] = createIterableMethod(method, true, false); + shallowInstrumentations[method] = createIterableMethod(method, false, true); + }); + + function createInstrumentationGetter(isReadonly, shallow) { + var instrumentations = shallow ? shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations; + return function (target, key, receiver) { + if (key === "__v_isReactive" + /* IS_REACTIVE */ + ) { + return !isReadonly; + } else if (key === "__v_isReadonly" + /* IS_READONLY */ + ) { + return isReadonly; + } else if (key === "__v_raw" + /* RAW */ + ) { + return target; + } + + return Reflect.get(hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver); }; - - var getProto = function getProto(v) { - return Reflect.getPrototypeOf(v); + } + + var mutableCollectionHandlers = { + get: createInstrumentationGetter(false, false) + }; + var readonlyCollectionHandlers = { + get: createInstrumentationGetter(true, false) + }; + + function checkIdentityKeys(target, has, key) { + var rawKey = toRaw(key); + + if (rawKey !== key && has.call(target, rawKey)) { + var type = toRawType(target); + console.warn("Reactive ".concat(type, " contains both the raw and reactive ") + "versions of the same object".concat(type === "Map" ? " as keys" : "", ", ") + "which can lead to inconsistencies. " + "Avoid differentiating between the raw and reactive versions " + "of an object and only use the reactive version if possible."); + } + } + + var reactiveMap = new WeakMap(); + var readonlyMap = new WeakMap(); + + function targetTypeMap(rawType) { + switch (rawType) { + case "Object": + case "Array": + return 1; + + case "Map": + case "Set": + case "WeakMap": + case "WeakSet": + return 2; + + default: + return 0; + } + } + + function getTargetType(value) { + return value["__v_skip" + /* SKIP */ + ] || !Object.isExtensible(value) ? 0 + /* INVALID */ + : targetTypeMap(toRawType(value)); + } + + function reactive(target) { + // if trying to observe a readonly proxy, return the readonly version. + if (target && target["__v_isReadonly" + /* IS_READONLY */ + ]) { + return target; + } + + return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers); + } // Return a reactive-copy of the original object, where only the root level + + function readonly(target) { + return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers); + } // Return a reactive-copy of the original object, where only the root level + + function createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers) { + if (!isObject(target)) { + { + console.warn("value cannot be made reactive: ".concat(String(target))); + } + return target; + } // target is already a Proxy, return it. + // exception: calling readonly() on a reactive object + + + if (target["__v_raw" + /* RAW */ + ] && !(isReadonly && target["__v_isReactive" + /* IS_REACTIVE */ + ])) { + return target; + } // target already has corresponding Proxy + + + var proxyMap = isReadonly ? readonlyMap : reactiveMap; + var existingProxy = proxyMap.get(target); + + if (existingProxy) { + return existingProxy; + } // only a whitelist of value types can be observed. + + + var targetType = getTargetType(target); + + if (targetType === 0 + /* INVALID */ + ) { + return target; + } + + var proxy = new Proxy(target, targetType === 2 + /* COLLECTION */ + ? collectionHandlers : baseHandlers); + proxyMap.set(target, proxy); + return proxy; + } + + function isReactive(value) { + if (isReadonly(value)) { + return isReactive(value["__v_raw" + /* RAW */ + ]); + } + + return !!(value && value["__v_isReactive" + /* IS_REACTIVE */ + ]); + } + + function isReadonly(value) { + return !!(value && value["__v_isReadonly" + /* IS_READONLY */ + ]); + } + + function toRaw(observed) { + return observed && toRaw(observed["__v_raw" + /* RAW */ + ]) || observed; + } + + function isRef(r) { + return Boolean(r && r.__v_isRef === true); + } + + var ComputedRefImpl = /*#__PURE__*/function () { + function ComputedRefImpl(getter, _setter, isReadonly) { + var _this2 = this; + + _classCallCheck(this, ComputedRefImpl); + + this._setter = _setter; + this._dirty = true; + this.__v_isRef = true; + this.effect = effect(getter, { + lazy: true, + scheduler: function scheduler() { + if (!_this2._dirty) { + _this2._dirty = true; + trigger(toRaw(_this2), "set" + /* SET */ + , "value"); + } + } + }); + this["__v_isReadonly" + /* IS_READONLY */ + ] = isReadonly; + } + + _createClass(ComputedRefImpl, [{ + key: "value", + get: function get() { + if (this._dirty) { + this._value = this.effect(); + this._dirty = false; + } + + track(toRaw(this), "get" + /* GET */ + , "value"); + return this._value; + }, + set: function set(newValue) { + this._setter(newValue); + } + }]); + + return ComputedRefImpl; + }(); + + function computed(getterOrOptions) { + var getter; + var setter; + + if (isFunction(getterOrOptions)) { + getter = getterOrOptions; + + setter = function setter() { + console.warn("Write operation failed: computed value is readonly"); + }; + } else { + getter = getterOrOptions.get; + setter = getterOrOptions.set; + } + + return new ComputedRefImpl(getter, setter, isFunction(getterOrOptions) || !getterOrOptions.set); + } + + function noop() {} + function isNative(Ctor) { + return typeof Ctor === "function" && /native code/.test(Ctor.toString()); + } + var isIE = function isIE() { + if (typeof navigator === "undefined") { + return false; + } + + return /(msie|trident)/i.test(navigator.userAgent.toLowerCase()); + }; + var getIEVersion = function getIEVersion() { + var version = 0; + + if (typeof navigator === "undefined") { + return false; + } + + var agent = navigator.userAgent.toLowerCase(); + var v1 = agent.match(/(?:msie\s([\w.]+))/); + var v2 = agent.match(/(?:trident.*rv:([\w.]+))/); + + if (v1 && v2 && v1[1] && v2[1]) { + version = Math.max(v1[1] * 1, v2[1] * 1); + } else if (v1 && v1[1]) { + version = v1[1] * 1; + } else if (v2 && v2[1]) { + version = v2[1] * 1; + } else { + version = 0; + } + + return version; + }; + isIE() && getIEVersion() < 9; + var _toString = Object.prototype.toString; + function isPlainObject(obj) { + return _toString.call(obj) === "[object Object]"; + } + var bailRE = /[^\w.$]/; + function parsePath(path) { + if (bailRE.test(path)) { + return; + } + + var segments = path.split("."); + return function (obj) { + for (var i = 0; i < segments.length; i++) { + if (!obj) return; + obj = obj[segments[i]]; + } + + return obj; }; - - function get$1(target, key) { - var isReadonly = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - var isShallow = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; - // #1772: readonly(reactive(Map)) should return readonly + reactive version - // of the value - target = target["__v_raw" - /* RAW */ - ]; - var rawTarget = toRaw(target); - var rawKey = toRaw(key); - - if (key !== rawKey) { - !isReadonly && track(rawTarget, "get" - /* GET */ - , key); + } + var nextTick = function () { + var callbacks = []; + var pending = false; + var timerFunc; + + function nextTickHandler() { + pending = false; + var copies = callbacks.slice(0); + callbacks.length = 0; + + for (var i = 0; i < copies.length; i++) { + copies[i](); + } + } // An asynchronous deferring mechanism. + // In pre 2.4, we used to use microtasks (Promise/MutationObserver) + // but microtasks actually has too high a priority and fires in between + // supposedly sequential events (e.g. #4521, #6690) or even between + // bubbling of the same event (#6566). Technically setImmediate should be + // the ideal choice, but it's not available everywhere; and the only polyfill + // that consistently queues the callback after all DOM events triggered in the + // same loop is by using MessageChannel. + + /* istanbul ignore if */ + + + if (typeof setImmediate !== "undefined" && isNative(setImmediate)) { + timerFunc = function timerFunc() { + setImmediate(nextTickHandler); + }; + } else if (typeof MessageChannel !== "undefined" && (isNative(MessageChannel) || // PhantomJS + MessageChannel.toString() === "[object MessageChannelConstructor]")) { + var channel = new MessageChannel(); + var port = channel.port2; + channel.port1.onmessage = nextTickHandler; + + timerFunc = function timerFunc() { + port.postMessage(1); + }; + } else if (typeof Promise !== "undefined" && isNative(Promise)) { + /* istanbul ignore next */ + // use microtask in non-DOM environments, e.g. Weex + var p = Promise.resolve(); + + timerFunc = function timerFunc() { + p.then(nextTickHandler); + }; + } else { + // fallback to setTimeout + timerFunc = function timerFunc() { + setTimeout(nextTickHandler, 0); + }; + } + + return function queueNextTick(cb, ctx) { + var _resolve; + + callbacks.push(function () { + if (cb) { + try { + cb.call(ctx); + } catch (e) { + console.error(e); + } + } else if (_resolve) { + _resolve(ctx); } + }); - !isReadonly && track(rawTarget, "get" - /* GET */ - , rawKey); + if (!pending) { + pending = true; + timerFunc(); + } // $flow-disable-line - var _getProto = getProto(rawTarget), - has = _getProto.has; - var wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive; + if (!cb && typeof Promise !== "undefined") { + return new Promise(function (resolve) { + _resolve = resolve; + }); + } + }; + }(); + + var mixinInjection = {}; + function getMixins(type) { + return mixinInjection[type]; + } + function mixin(xtype, cls) { + mixinInjection[xtype] = _.cloneDeep(cls); + } + + var queue = []; + var has = {}; + var waiting = false; + var flushing = false; + var index = 0; + + function resetSchedulerState() { + index = queue.length = 0; + has = {}; + waiting = flushing = false; + } + + function flushSchedulerQueue() { + flushing = true; + var watcher; + var id; + var options; // Sort queue before flush. + // This ensures that: + // 1. Components are updated from parent to child. (because parent is always + // created before the child) + // 2. A component's user watchers are run before its render watcher (because + // user watchers are created before the render watcher) + // 3. If a component is destroyed during a parent component's watcher run, + // its watchers can be skipped. + + queue.sort(function (a, b) { + return a.id - b.id; + }); // do not cache length because more watchers might be pushed + // as we run existing watchers + + for (index = 0; index < queue.length; index++) { + watcher = queue[index].watcher; + options = queue[index].options; + id = watcher.id; + has[id] = null; + watcher(options); + } + + resetSchedulerState(); + } + + function queueWatcher(watcher, options) { + var id = watcher.id; + + if (has[id] == null) { + has[id] = true; + + if (!flushing) { + queue.push({ + watcher: watcher, + options: options + }); + } else { + // if already flushing, splice the watcher based on its id + // if already past its id, it will be run next immediately. + var i = queue.length - 1; - if (has.call(rawTarget, key)) { - return wrap(target.get(key)); - } else if (has.call(rawTarget, rawKey)) { - return wrap(target.get(rawKey)); + while (i > index && queue[i].watcher.id > watcher.id) { + i--; } - } - function has$1$1(key) { - var isReadonly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - var target = this["__v_raw" - /* RAW */ - ]; - var rawTarget = toRaw(target); - var rawKey = toRaw(key); + queue.splice(i + 1, 0, { + watcher: watcher, + options: options + }); + } // queue the flush - if (key !== rawKey) { - !isReadonly && track(rawTarget, "has" - /* HAS */ - , key); - } - !isReadonly && track(rawTarget, "has" - /* HAS */ - , rawKey); - return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); + if (!waiting) { + waiting = true; + nextTick(flushSchedulerQueue); + } } + } - function size(target) { - var isReadonly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - target = target["__v_raw" - /* RAW */ - ]; - !isReadonly && track(toRaw(target), "iterate" - /* ITERATE */ - , ITERATE_KEY); - return Reflect.get(target, "size", target); + function innerWatch(source, cb, options) { + if (!_.isFunction(cb)) { + console.warn("`watch(fn, options?)` signature has been moved to a separate API. " + "Use `watchEffect(fn, options?)` instead. `watch` now only " + "supports `watch(source, cb, options?) signature."); } - function add(value) { - value = toRaw(value); - var target = toRaw(this); - var proto = getProto(target); - var hadKey = proto.has.call(target, value); - var result = target.add(value); + return doWatch(source, cb, options); + } + var INITIAL_WATCHER_VALUE = {}; + var objectToString = Object.prototype.toString; - if (!hadKey) { - trigger(target, "add" - /* ADD */ - , value, value); - } + var toTypeString = function toTypeString(value) { + return objectToString.call(value); + }; - return result; - } + var isMap = function isMap(val) { + return toTypeString(val) === "[object Map]"; + }; - function set$1$1(key, value) { - value = toRaw(value); - var target = toRaw(this); + var isSet = function isSet(val) { + return toTypeString(val) === "[object Set]"; + }; - var _getProto2 = getProto(target), - has = _getProto2.has, - get = _getProto2.get; + var hasChanged = function hasChanged(value, oldValue) { + return value !== oldValue && (value === value || oldValue === oldValue); + }; - var hadKey = has.call(target, key); + var uid = 0; - if (!hadKey) { - key = toRaw(key); - hadKey = has.call(target, key); - } else { - checkIdentityKeys(target, has, key); - } + function doWatch(source, cb, options, instance) { + options = options || {}; + var _options = options, + immediate = _options.immediate, + deep = _options.deep, + sync = _options.sync, + onTrack = _options.onTrack, + onTrigger = _options.onTrigger; - var oldValue = get.call(target, key); - var result = target.set(key, value); + if (!cb) { + if (immediate !== undefined) { + console.warn("watch() \"immediate\" option is only respected when using the " + "watch(source, callback, options?) signature."); + } - if (!hadKey) { - trigger(target, "add" - /* ADD */ - , key, value); - } else if (hasChanged$1(value, oldValue) || key === "length") { - trigger(target, "set" - /* SET */ - , key, value, oldValue); - } - - return result; - } - - function deleteEntry(key) { - var target = toRaw(this); - - var _getProto3 = getProto(target), - has = _getProto3.has, - get = _getProto3.get; - - var hadKey = has.call(target, key); - - if (!hadKey) { - key = toRaw(key); - hadKey = has.call(target, key); - } else { - checkIdentityKeys(target, has, key); - } - - var oldValue = get ? get.call(target, key) : undefined; // forward the operation before queueing reactions - - var result = target.delete(key); - - if (hadKey) { - trigger(target, "delete" - /* DELETE */ - , key, undefined, oldValue); - } - - return result; + if (deep !== undefined) { + console.warn("watch() \"deep\" option is only respected when using the " + "watch(source, callback, options?) signature."); + } } - function clear() { - var target = toRaw(this); - var hadItems = target.size !== 0; - var oldTarget = isMap$1(target) ? new Map(target) : new Set(target); // forward the operation before queueing reactions - - var result = target.clear(); - - if (hadItems) { - trigger(target, "clear" - /* CLEAR */ - , undefined, undefined, oldTarget); - } + var warnInvalidSource = function warnInvalidSource(s) { + console.warn("Invalid watch source: ", s, "A watch source can only be a getter/effect function, a ref, " + "a reactive object, or an array of these types."); + }; - return result; - } - - function createForEach(isReadonly, isShallow) { - return function forEach(callback, thisArg) { - var observed = this; - var target = observed["__v_raw" - /* RAW */ - ]; - var rawTarget = toRaw(target); - var wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive; - !isReadonly && track(rawTarget, "iterate" - /* ITERATE */ - , ITERATE_KEY); - return target.forEach(function (value, key) { - return (// important: make sure the callback is - // 1. invoked with the reactive map as `this` and 3rd arg - // 2. the value received should be a corresponding reactive/readonly. - callback.call(thisArg, wrap(value), wrap(key), observed) - ); - }); + var getter; + var forceTrigger = false; + + if (isRef(source)) { + getter = function getter() { + return source.value; + }; + + forceTrigger = !!source._shallow; + } else if (isReactive(source)) { + getter = function getter() { + return source; + }; + + deep = true; + } else if (_.isArray(source)) { + getter = function getter() { + return source.map(function (s) { + if (isRef(s)) { + return s.value; + } else if (isReactive(s)) { + return traverse(s); + } else if (_.isFunction(s)) { + return s.call(instance); + } else { + warnInvalidSource(s); + } + }); + }; + } else if (_.isFunction(source)) { + if (cb) { + // getter with cb + getter = function getter() { + return source.call(instance); }; - } + } else { + // no cb -> simple effect + getter = function getter() { + if (instance && instance.isUnmounted) { + return; + } - function createIterableMethod(method, isReadonly, isShallow) { - return function () { - var target = this["__v_raw" - /* RAW */ - ]; - var rawTarget = toRaw(target); - var targetIsMap = isMap$1(rawTarget); - var isPair = method === "entries" || method === Symbol.iterator && targetIsMap; - var isKeyOnly = method === "keys" && targetIsMap; - var innerIterator = target[method].apply(target, arguments); - var wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive; - !isReadonly && track(rawTarget, "iterate" - /* ITERATE */ - , isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY); // return a wrapped iterator which returns observed versions of the - // values emitted from the real iterator - - return _defineProperty({ - // iterator protocol - next: function next() { - var _innerIterator$next = innerIterator.next(), - value = _innerIterator$next.value, - done = _innerIterator$next.done; - - return done ? { - value: value, - done: done - } : { - value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), - done: done - }; - } - }, Symbol.iterator, function () { - return this; - }); - }; - } + if (cleanup) { + cleanup(); + } - function createReadonlyMethod(type) { - return function () { - { - var key = (arguments.length <= 0 ? undefined : arguments[0]) ? "on key \"".concat(arguments.length <= 0 ? undefined : arguments[0], "\" ") : ""; - console.warn("".concat(capitalize(type), " operation ").concat(key, "failed: target is readonly."), toRaw(this)); - } - return type === "delete" - /* DELETE */ - ? false : this; + return source.call(instance, onInvalidate); }; + } + } else { + getter = function getter() {}; + + warnInvalidSource(source); } - var mutableInstrumentations = { - get: function get(key) { - return get$1(this, key); - }, + if (cb && deep) { + var baseGetter = getter; - get size() { - return size(this); - }, - - has: has$1$1, - add: add, - set: set$1$1, - delete: deleteEntry, - clear: clear, - forEach: createForEach(false, false) - }; - var shallowInstrumentations = { - get: function get(key) { - return get$1(this, key, false, true); - }, + getter = function getter() { + return traverse(baseGetter()); + }; + } - get size() { - return size(this); - }, + var cleanup; - has: has$1$1, - add: add, - set: set$1$1, - delete: deleteEntry, - clear: clear, - forEach: createForEach(false, true) + var onInvalidate = function onInvalidate(fn) { + cleanup = runner.options.onStop = function () { + fn.call(instance); + }; }; - var readonlyInstrumentations = { - get: function get(key) { - return get$1(this, key, true); - }, - get size() { - return size(this, true); - }, - - has: function has(key) { - return has$1$1.call(this, key, true); - }, - add: createReadonlyMethod("add" - /* ADD */ - ), - set: createReadonlyMethod("set" - /* SET */ - ), - delete: createReadonlyMethod("delete" - /* DELETE */ - ), - clear: createReadonlyMethod("clear" - /* CLEAR */ - ), - forEach: createForEach(true, false) + var oldValue = _.isArray(source) ? [] : INITIAL_WATCHER_VALUE; + + var job = function job() { + if (!runner.active) { + return; + } + + if (cb) { + // watch(source, cb) + var newValue = runner(); + + if (deep || forceTrigger || hasChanged(newValue, oldValue)) { + // cleanup before running cb again + if (cleanup) { + cleanup(); + } + + cb.apply(instance, [newValue, // pass undefined as the old value when it's changed for the first time + oldValue === INITIAL_WATCHER_VALUE ? undefined : oldValue, onInvalidate]); + oldValue = newValue; + } + } else { + // watchEffect + runner(); + } + }; // important: mark the job as a watcher callback so that scheduler knows + // it is allowed to self-trigger (#1727) + + + job.allowRecurse = !!cb; + job.id = ++uid; + var scheduler; + + if (sync === true) { + scheduler = job; + } else { + scheduler = function scheduler() { + return queueWatcher(job); + }; + } + + var runner = effect(function () { + try { + return getter(); + } catch (e) {// 吞掉异常 + } + }, { + lazy: true, + onTrack: onTrack, + onTrigger: onTrigger, + scheduler: scheduler + }); // initial run + + if (cb) { + if (immediate) { + job(); + } else { + oldValue = runner(); + } + } else { + runner(); + } + + return function () { + stop(runner); }; - var iteratorMethods = ["keys", "values", "entries", Symbol.iterator]; - iteratorMethods.forEach(function (method) { - mutableInstrumentations[method] = createIterableMethod(method, false, false); - readonlyInstrumentations[method] = createIterableMethod(method, true, false); - shallowInstrumentations[method] = createIterableMethod(method, false, true); - }); + } - function createInstrumentationGetter(isReadonly, shallow) { - var instrumentations = shallow ? shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations; - return function (target, key, receiver) { - if (key === "__v_isReactive" - /* IS_REACTIVE */ - ) { - return !isReadonly; - } else if (key === "__v_isReadonly" - /* IS_READONLY */ - ) { - return isReadonly; - } else if (key === "__v_raw" - /* RAW */ - ) { - return target; - } + function traverse(value) { + var seen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Set(); - return Reflect.get(hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver); - }; + if (!_.isObject(value) || seen.has(value)) { + return value; } - var mutableCollectionHandlers = { - get: createInstrumentationGetter(false, false) - }; - var readonlyCollectionHandlers = { - get: createInstrumentationGetter(true, false) - }; - - function checkIdentityKeys(target, has, key) { - var rawKey = toRaw(key); + seen.add(value); - if (rawKey !== key && has.call(target, rawKey)) { - var type = toRawType(target); - console.warn("Reactive ".concat(type, " contains both the raw and reactive ") + "versions of the same object".concat(type === "Map" ? " as keys" : "", ", ") + "which can lead to inconsistencies. " + "Avoid differentiating between the raw and reactive versions " + "of an object and only use the reactive version if possible."); - } + if (isRef(value)) { + traverse(value.value, seen); + } else if (_.isArray(value)) { + for (var i = 0; i < value.length; i++) { + traverse(value[i], seen); + } + } else if (isSet(value) || isMap(value)) { + value.forEach(function (v) { + traverse(v, seen); + }); + } else { + for (var key in value) { + traverse(value[key], seen); + } } - var reactiveMap = new WeakMap(); - var readonlyMap = new WeakMap(); - - function targetTypeMap(rawType) { - switch (rawType) { - case "Object": - case "Array": - return 1; + return value; + } - case "Map": - case "Set": - case "WeakMap": - case "WeakSet": - return 2; + var falsy; + var operators = { + "||": falsy, + "&&": falsy, + "(": falsy, + ")": falsy + }; - default: - return 0; - } - } + function runBinaryFunction(binarys) { + var expr = ""; - function getTargetType(value) { - return value["__v_skip" - /* SKIP */ - ] || !Object.isExtensible(value) ? 0 - /* INVALID */ - : targetTypeMap(toRawType(value)); + for (var i = 0, len = binarys.length; i < len; i++) { + if (_.isBoolean(binarys[i]) || _.has(operators, binarys[i])) { + expr += binarys[i]; + } else { + expr += "false"; + } } - function reactive(target) { - // if trying to observe a readonly proxy, return the readonly version. - if (target && target["__v_isReadonly" - /* IS_READONLY */ - ]) { - return target; - } - - return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers); - } // Return a reactive-copy of the original object, where only the root level + return new Function("return " + expr)(); + } - function readonly(target) { - return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers); - } // Return a reactive-copy of the original object, where only the root level + function watchExp(model, exp) { + var getter = parsePath(exp); + var result = getter.call(model, model); - function createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers) { - if (!isObject(target)) { - { - console.warn("value cannot be made reactive: ".concat(String(target))); - } - return target; - } // target is already a Proxy, return it. - // exception: calling readonly() on a reactive object - - - if (target["__v_raw" - /* RAW */ - ] && !(isReadonly && target["__v_isReactive" - /* IS_REACTIVE */ - ])) { - return target; - } // target already has corresponding Proxy - - - var proxyMap = isReadonly ? readonlyMap : reactiveMap; - var existingProxy = proxyMap.get(target); - - if (existingProxy) { - return existingProxy; - } // only a whitelist of value types can be observed. - - - var targetType = getTargetType(target); - - if (targetType === 0 - /* INVALID */ - ) { - return target; - } - - var proxy = new Proxy(target, targetType === 2 - /* COLLECTION */ - ? collectionHandlers : baseHandlers); - proxyMap.set(target, proxy); - return proxy; + if (_.isArray(result)) { + return result.concat(); } - function isReactive(value) { - if (isReadonly(value)) { - return isReactive(value["__v_raw" - /* RAW */ - ]); - } + return result; + } - return !!(value && value["__v_isReactive" - /* IS_REACTIVE */ - ]); + function watch(model, expOrFn, cb, options) { + if (isPlainObject(cb)) { + options = cb; + cb = cb.handler; } - function isReadonly(value) { - return !!(value && value["__v_isReadonly" - /* IS_READONLY */ - ]); + if (typeof cb === "string") { + cb = model[cb]; } - function toRaw(observed) { - return observed && toRaw(observed["__v_raw" - /* RAW */ - ]) || observed; - } + options = options || {}; + options.user = true; + var exps; - function isRef(r) { - return Boolean(r && r.__v_isRef === true); + if (_.isFunction(expOrFn) || !(exps = expOrFn.match(/[a-zA-Z0-9_.*]+|[|][|]|[&][&]|[(]|[)]/g)) || exps.length === 1 && !/\*/.test(expOrFn)) { + var watcher = innerWatch(_.isFunction(expOrFn) ? expOrFn : function () { + return watchExp(model, expOrFn); + }, cb, options); + return function unwatchFn() { + watcher(); + }; } - var ComputedRefImpl = /*#__PURE__*/function () { - function ComputedRefImpl(getter, _setter, isReadonly) { - var _this2 = this; + var watchers = []; + var fns = exps.slice(); + var complete = false, + running = false; - _classCallCheck(this, ComputedRefImpl); + var callback = function callback(index, newValue, oldValue, attrs) { + if (complete === true) { + return; + } - this._setter = _setter; - this._dirty = true; - this.__v_isRef = true; - this.effect = effect(getter, { - lazy: true, - scheduler: function scheduler() { - if (!_this2._dirty) { - _this2._dirty = true; - trigger(toRaw(_this2), "set" - /* SET */ - , "value"); - } - } - }); - this["__v_isReadonly" - /* IS_READONLY */ - ] = isReadonly; - } - - _createClass(ComputedRefImpl, [{ - key: "value", - get: function get() { - if (this._dirty) { - this._value = this.effect(); - this._dirty = false; - } - - track(toRaw(this), "get" - /* GET */ - , "value"); - return this._value; - }, - set: function set(newValue) { - this._setter(newValue); - } - }]); - - return ComputedRefImpl; - }(); + fns[index] = true; - function computed(getterOrOptions) { - var getter; - var setter; + if (runBinaryFunction(fns)) { + complete = true; + cb(newValue, oldValue, attrs); + } - if (isFunction(getterOrOptions)) { - getter = getterOrOptions; - - setter = function setter() { - console.warn("Write operation failed: computed value is readonly"); - }; - } else { - getter = getterOrOptions.get; - setter = getterOrOptions.set; - } - - return new ComputedRefImpl(getter, setter, isFunction(getterOrOptions) || !getterOrOptions.set); - } - - function noop() {} - function isNative(Ctor) { - return typeof Ctor === "function" && /native code/.test(Ctor.toString()); - } - var isIE = function isIE() { - if (typeof navigator === "undefined") { - return false; + if (options && options.sync) { + complete = false; + running = false; + fns = exps.slice(); + } else { + if (!running) { + running = true; + nextTick(function () { + complete = false; + running = false; + fns = exps.slice(); + }); } - - return /(msie|trident)/i.test(navigator.userAgent.toLowerCase()); + } }; - var getIEVersion = function getIEVersion() { - var version = 0; - if (typeof navigator === "undefined") { - return false; - } - - var agent = navigator.userAgent.toLowerCase(); - var v1 = agent.match(/(?:msie\s([\w.]+))/); - var v2 = agent.match(/(?:trident.*rv:([\w.]+))/); - - if (v1 && v2 && v1[1] && v2[1]) { - version = Math.max(v1[1] * 1, v2[1] * 1); - } else if (v1 && v1[1]) { - version = v1[1] * 1; - } else if (v2 && v2[1]) { - version = v2[1] * 1; - } else { - version = 0; - } - - return version; - }; - isIE() && getIEVersion() < 9; - var _toString = Object.prototype.toString; - function isPlainObject(obj) { - return _toString.call(obj) === "[object Object]"; - } - var bailRE = /[^\w.$]/; - function parsePath(path) { - if (bailRE.test(path)) { + _.each(exps, function (exp, i) { + if (_.has(operators, exp)) { + return; + } //a.**形式 + + + if (/^[1-9a-zA-Z.]+\*\*$/.test(exp) || exp === "**") { + exp = exp.replace(".**", ""); + var getter = exp === "**" ? function (m) { + return m; + } : parsePath(exp); + watchers.push(innerWatch(function () { + return getter.call(model, model); + }, function (newValue, oldValue) { + callback(i, newValue, oldValue, _.extend({ + index: i + })); + }, _.extend({ + deep: true + }, options))); + return; + } + + if (/^(\*\*\.)+[1-9a-zA-Z]+(\.\*\*$)/.test(exp)) { + throw new Error("not support"); + } //含有*的情况,如a.*,如*.a,*.*.a,a.*.a + + + if (/\*/.test(exp)) { + // eslint-disable-next-line no-inner-declarations + var travers = function travers(root, deps, parent, key, res) { + if (deps.length === paths.length) { + root !== undefined && res.push({ + parent: parent, + k: key + }); return; - } - - var segments = path.split("."); - return function (obj) { - for (var i = 0; i < segments.length; i++) { - if (!obj) return; - obj = obj[segments[i]]; + } + + if (root) { + if (paths[deps.length] === "*") { + // 遍历所有节点 + for (var k in root) { + travers(root[k], deps.concat([k]), root, k, res); + } + } else { + var nextKey = paths[deps.length]; + travers(root[nextKey], deps.concat([nextKey]), root, nextKey, res); } - - return obj; + } }; - } - var nextTick = function () { - var callbacks = []; - var pending = false; - var timerFunc; - function nextTickHandler() { - pending = false; - var copies = callbacks.slice(0); - callbacks.length = 0; - - for (var i = 0; i < copies.length; i++) { - copies[i](); - } - } // An asynchronous deferring mechanism. - // In pre 2.4, we used to use microtasks (Promise/MutationObserver) - // but microtasks actually has too high a priority and fires in between - // supposedly sequential events (e.g. #4521, #6690) or even between - // bubbling of the same event (#6566). Technically setImmediate should be - // the ideal choice, but it's not available everywhere; and the only polyfill - // that consistently queues the callback after all DOM events triggered in the - // same loop is by using MessageChannel. - - /* istanbul ignore if */ - - - if (typeof setImmediate !== "undefined" && isNative(setImmediate)) { - timerFunc = function timerFunc() { - setImmediate(nextTickHandler); - }; - } else if (typeof MessageChannel !== "undefined" && (isNative(MessageChannel) || // PhantomJS - MessageChannel.toString() === "[object MessageChannelConstructor]")) { - var channel = new MessageChannel(); - var port = channel.port2; - channel.port1.onmessage = nextTickHandler; - - timerFunc = function timerFunc() { - port.postMessage(1); - }; - } else if (typeof Promise !== "undefined" && isNative(Promise)) { - /* istanbul ignore next */ - // use microtask in non-DOM environments, e.g. Weex - var p = Promise.resolve(); - - timerFunc = function timerFunc() { - p.then(nextTickHandler); - }; - } else { - // fallback to setTimeout - timerFunc = function timerFunc() { - setTimeout(nextTickHandler, 0); - }; - } - - return function queueNextTick(cb, ctx) { - var _resolve; - - callbacks.push(function () { - if (cb) { - try { - cb.call(ctx); - } catch (e) { - console.error(e); - } - } else if (_resolve) { - _resolve(ctx); - } - }); - - if (!pending) { - pending = true; - timerFunc(); - } // $flow-disable-line + //先获取到能获取到的对象 + var paths = exp.split("."); + var prePaths = []; + for (var _i = 0, len = paths.length; _i < len; _i++) { + if (paths[_i] === "*") { + break; + } - if (!cb && typeof Promise !== "undefined") { - return new Promise(function (resolve) { - _resolve = resolve; - }); - } - }; - }(); - - var mixinInjection = {}; - function getMixins(type) { - return mixinInjection[type]; - } - function mixin(xtype, cls) { - mixinInjection[xtype] = _.cloneDeep(cls); - } - - var queue = []; - var activatedChildren = []; - var has = {}; - var waiting = false; - var flushing = false; - var index = 0; - - function resetSchedulerState() { - index = queue.length = activatedChildren.length = 0; - has = {}; - waiting = flushing = false; - } - - function flushSchedulerQueue() { - flushing = true; - var watcher; - var id; - var options; // Sort queue before flush. - // This ensures that: - // 1. Components are updated from parent to child. (because parent is always - // created before the child) - // 2. A component's user watchers are run before its render watcher (because - // user watchers are created before the render watcher) - // 3. If a component is destroyed during a parent component's watcher run, - // its watchers can be skipped. - - queue.sort(function (a, b) { - return a.id - b.id; - }); // do not cache length because more watchers might be pushed - // as we run existing watchers - - for (index = 0; index < queue.length; index++) { - watcher = queue[index].watcher; - options = queue[index].options; - id = watcher.id; - has[id] = null; - watcher(options); + prePaths[_i] = paths[_i]; } - resetSchedulerState(); - } - - function queueWatcher(watcher, options) { - var id = watcher.id; - - if (has[id] == null) { - has[id] = true; + var v; - if (!flushing) { - queue.push({ - watcher: watcher, - options: options - }); - } else { - // if already flushing, splice the watcher based on its id - // if already past its id, it will be run next immediately. - var i = queue.length - 1; + if (prePaths.length > 0) { + var _getter = parsePath(prePaths.join(".")); - while (i > index && queue[i].watcher.id > watcher.id) { - i--; - } - - queue.splice(i + 1, 0, { - watcher: watcher, - options: options - }); - } // queue the flush - - - if (!waiting) { - waiting = true; - nextTick(flushSchedulerQueue); - } - } - } - - function innerWatch(source, cb, options) { - if (!_.isFunction(cb)) { - console.warn("`watch(fn, options?)` signature has been moved to a separate API. " + "Use `watchEffect(fn, options?)` instead. `watch` now only " + "supports `watch(source, cb, options?) signature."); - } - - return doWatch(source, cb, options); - } - var INITIAL_WATCHER_VALUE = {}; - var objectToString = Object.prototype.toString; - - var toTypeString = function toTypeString(value) { - return objectToString.call(value); - }; - - var isMap = function isMap(val) { - return toTypeString(val) === "[object Map]"; - }; - - var isSet = function isSet(val) { - return toTypeString(val) === "[object Set]"; - }; - - var hasChanged = function hasChanged(value, oldValue) { - return value !== oldValue && (value === value || oldValue === oldValue); - }; - - var uid = 0; - - function doWatch(source, cb, options, instance) { - options = options || {}; - var _options = options, - immediate = _options.immediate, - deep = _options.deep, - sync = _options.sync, - onTrack = _options.onTrack, - onTrigger = _options.onTrigger; - - if (!cb) { - if (immediate !== undefined) { - console.warn("watch() \"immediate\" option is only respected when using the " + "watch(source, callback, options?) signature."); - } - - if (deep !== undefined) { - console.warn("watch() \"deep\" option is only respected when using the " + "watch(source, callback, options?) signature."); - } - } - - var warnInvalidSource = function warnInvalidSource(s) { - console.warn("Invalid watch source: ", s, "A watch source can only be a getter/effect function, a ref, " + "a reactive object, or an array of these types."); - }; - - var getter; - var forceTrigger = false; - - if (isRef(source)) { - getter = function getter() { - return source.value; - }; - - forceTrigger = !!source._shallow; - } else if (isReactive(source)) { - getter = function getter() { - return source; - }; - - deep = true; - } else if (_.isArray(source)) { - getter = function getter() { - return source.map(function (s) { - if (isRef(s)) { - return s.value; - } else if (isReactive(s)) { - return traverse(s); - } else if (_.isFunction(s)) { - return s.call(instance); - } else { - warnInvalidSource(s); - } - }); - }; - } else if (_.isFunction(source)) { - if (cb) { - // getter with cb - getter = function getter() { - return source.call(instance); - }; - } else { - // no cb -> simple effect - getter = function getter() { - if (instance && instance.isUnmounted) { - return; - } - - if (cleanup) { - cleanup(); - } - - return source.call(instance, onInvalidate); - }; - } + v = _getter.call(model, model); } else { - getter = function getter() {}; - - warnInvalidSource(source); + v = model; } - if (cb && deep) { - var baseGetter = getter; - - getter = function getter() { - return traverse(baseGetter()); - }; - } - - var cleanup; - - var onInvalidate = function onInvalidate(fn) { - cleanup = runner.options.onStop = function () { - fn.call(instance); - }; - }; - - var oldValue = _.isArray(source) ? [] : INITIAL_WATCHER_VALUE; - - var job = function job() { - if (!runner.active) { - return; - } + paths = paths.slice(prePaths.length); + var changes = []; + watchers.push(innerWatch(function () { + var routes = []; + travers(v, [], v, null, routes); - if (cb) { - // watch(source, cb) - var newValue = runner(); + for (var _i2 = 0, _len = routes.length; _i2 < _len; _i2++) { + var _routes$_i = routes[_i2], + parent = _routes$_i.parent, + k = _routes$_i.k; - if (deep || forceTrigger || hasChanged(newValue, oldValue)) { - // cleanup before running cb again - if (cleanup) { - cleanup(); - } + for (var j = 0, l = changes.length; j < l; j++) { + var _changes$j = changes[j], + target = _changes$j.target, + key = _changes$j.key; - cb.apply(instance, [newValue, // pass undefined as the old value when it's changed for the first time - oldValue === INITIAL_WATCHER_VALUE ? undefined : oldValue, onInvalidate]); - oldValue = newValue; - } - } else { - // watchEffect - runner(); + if (target === toRaw(parent) && key === k) { + return true; + } } - }; // important: mark the job as a watcher callback so that scheduler knows - // it is allowed to self-trigger (#1727) + } + }, function (newValue) { + changes = []; + if (newValue === true) { + callback(i, undefined, undefined, _.extend({ + index: i + })); + } + }, BI.extend({}, options, { + deep: true, + onTrigger: function onTrigger(_ref) { + var target = _ref.target, + key = _ref.key; + changes.push({ + target: target, + key: key + }); + } + }))); + return; + } + + watchers.push(innerWatch(function () { + return watchExp(model, exp); + }, function (newValue, oldValue) { + callback(i, newValue, oldValue, _.extend({ + index: i + })); + }, options)); + }); - job.allowRecurse = !!cb; - job.id = ++uid; - var scheduler; + return watchers; + } - if (sync === true) { - scheduler = job; - } else { - scheduler = function scheduler() { - return queueWatcher(job); - }; - } + var REACTIVE = true; - var runner = effect(getter, { - lazy: true, - onTrack: onTrack, - onTrigger: onTrigger, - scheduler: scheduler - }); // initial run + function initState(vm, state) { + if (state) { + vm.$$state = REACTIVE ? reactive(state) : state; + } + } - if (cb) { - if (immediate) { - job(); - } else { - oldValue = runner(); - } - } else { - runner(); - } + function initComputed(vm, c) { + var $$computed = vm.$$computed = {}; - return function () { - stop(runner); - }; + for (var key in c) { + $$computed[key] = computed(_.bind(c[key], vm)); } + } - function traverse(value) { - var seen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Set(); - - if (!_.isObject(value) || seen.has(value)) { - return value; - } + function initWatch(vm, watch) { + vm._watchers || (vm._watchers = []); - seen.add(value); + for (var key in watch) { + var handler = watch[key]; - if (isRef(value)) { - traverse(value.value, seen); - } else if (_.isArray(value)) { - for (var i = 0; i < value.length; i++) { - traverse(value[i], seen); - } - } else if (isSet(value) || isMap(value)) { - value.forEach(function (v) { - traverse(v, seen); - }); - } else { - for (var key in value) { - traverse(value[key], seen); - } + if (_.isArray(handler)) { + for (var i = 0; i < handler.length; i++) { + vm._watchers.push(createWatcher(vm, key, handler[i])); } - - return value; + } else { + vm._watchers.push(createWatcher(vm, key, handler)); + } } + } - var falsy; - var operators = { - "||": falsy, - "&&": falsy, - "(": falsy, - ")": falsy - }; + function createWatcher(vm, keyOrFn, cb, options) { + if (isPlainObject(cb)) { + options = cb; + cb = cb.handler; + } - function runBinaryFunction(binarys) { - var expr = ""; + if (typeof cb === "string") { + cb = vm[cb]; + } - for (var i = 0, len = binarys.length; i < len; i++) { - if (_.isBoolean(binarys[i]) || _.has(operators, binarys[i])) { - expr += binarys[i]; - } else { - expr += "false"; - } - } + return watch(vm.model, keyOrFn, _.bind(cb, vm), options); + } - return new Function("return " + expr)(); + function initMethods(vm, methods) { + for (var key in methods) { + vm[key] = methods[key] == null ? noop : _.bind(methods[key], vm); } + } - function watchExp(model, exp) { - var getter = parsePath(exp); - var result = getter.call(model, model); + function initMixins(vm, mixins) { + mixins = (mixins || []).slice(0); - if (_.isArray(result)) { - return result.concat(); - } + _.each(mixins.reverse(), function (mixinType) { + var mixin = getMixins(mixinType); - return result; - } + for (var key in mixin) { + if (typeof mixin[key] !== "function") continue; + if (_.has(vm, key)) continue; + vm[key] = _.bind(mixin[key], vm); + } + }); + } - function watch(model, expOrFn, cb, options) { - if (isPlainObject(cb)) { - options = cb; - cb = cb.handler; - } + function defineProps(vm) { + vm.model = new Proxy({}, { + get: function get(target, key) { + if (vm.$$computed && key in vm.$$computed) { + try { + return vm.$$computed[key].value; + } catch (e) {// 吞掉异常 + } - if (typeof cb === "string") { - cb = model[cb]; + return; } - options = options || {}; - options.user = true; - var exps; - - if (_.isFunction(expOrFn) || !(exps = expOrFn.match(/[a-zA-Z0-9_.*]+|[|][|]|[&][&]|[(]|[)]/g)) || exps.length === 1 && !/\*/.test(expOrFn)) { - var watcher = innerWatch(_.isFunction(expOrFn) ? expOrFn : function () { - return watchExp(model, expOrFn); - }, cb, options); - return function unwatchFn() { - watcher(); - }; + if (vm.$$state && key in vm.$$state) { + return vm.$$state[key]; } - var watchers = []; - var fns = exps.slice(); - var complete = false, - running = false; - - var callback = function callback(index, newValue, oldValue, attrs) { - if (complete === true) { - return; - } - - fns[index] = true; - - if (runBinaryFunction(fns)) { - complete = true; - cb(newValue, oldValue, attrs); - } - - if (options && options.sync) { - complete = false; - running = false; - fns = exps.slice(); - } else { - if (!running) { - running = true; - nextTick(function () { - complete = false; - running = false; - fns = exps.slice(); - }); - } - } - }; - - _.each(exps, function (exp, i) { - if (_.has(operators, exp)) { - return; - } //a.**形式 - - - if (/^[1-9a-zA-Z.]+\*\*$/.test(exp) || exp === "**") { - exp = exp.replace(".**", ""); - var getter = exp === "**" ? function (m) { - return m; - } : parsePath(exp); - var v = getter.call(model, model); - watchers.push(innerWatch(v, function (newValue, oldValue) { - callback(i, newValue, oldValue, _.extend({ - index: i - })); - })); - return; - } - - if (/^(\*\*\.)+[1-9a-zA-Z]+(\.\*\*$)/.test(exp)) { - throw new Error("not support"); - } //含有*的情况,如a.*,如*.a,*.*.a,a.*.a - - - if (/\*/.test(exp)) { - // eslint-disable-next-line no-inner-declarations - var travers = function travers(root, deps, parent, key, res) { - if (deps.length === paths.length) { - root !== undefined && res.push({ - parent: parent, - k: key - }); - return; - } - - if (root) { - if (paths[deps.length] === "*") { - // 遍历所有节点 - for (var k in root) { - travers(root[k], deps.concat([k]), root, k, res); - } - } else { - var nextKey = paths[deps.length]; - travers(root[nextKey], deps.concat([nextKey]), root, nextKey, res); - } - } - }; - - //先获取到能获取到的对象 - var paths = exp.split("."); - var prePaths = []; - - for (var _i = 0, len = paths.length; _i < len; _i++) { - if (paths[_i] === "*") { - break; - } - - prePaths[_i] = paths[_i]; - } - - var _v; - - if (prePaths.length > 0) { - var _getter = parsePath(prePaths.join(".")); - - _v = _getter.call(model, model); - } else { - _v = model; - } - - paths = paths.slice(prePaths.length); - var changes = []; - watchers.push(innerWatch(function () { - var routes = []; - travers(_v, [], _v, null, routes); - - for (var _i2 = 0, _len = routes.length; _i2 < _len; _i2++) { - var _routes$_i = routes[_i2], - parent = _routes$_i.parent, - k = _routes$_i.k; - - for (var j = 0, l = changes.length; j < l; j++) { - var _changes$j = changes[j], - target = _changes$j.target, - key = _changes$j.key; - - if (target === toRaw(parent) && key === k) { - return true; - } - } - } - }, function (newValue) { - changes = []; - - if (newValue === true) { - callback(i, undefined, undefined, _.extend({ - index: i - })); - } - }, { - deep: true, - onTrigger: function onTrigger(_ref) { - var target = _ref.target, - key = _ref.key; - changes.push({ - target: target, - key: key - }); - } - })); - return; - } - - watchers.push(innerWatch(function () { - return watchExp(model, exp); - }, function (newValue, oldValue) { - callback(i, newValue, oldValue, _.extend({ - index: i - })); - })); - }); - - return watchers; - } + var p = vm._parent; - var REACTIVE = true; + while (p) { + if (p.$$context && key in p.$$context) { + return p.$$context[key]; + } - function initState(vm, state) { - if (state) { - vm.$$state = REACTIVE ? reactive(state) : state; + p = p._parent; } - } - - function initComputed(vm, c) { - var $$computed = vm.$$computed = {}; - - for (var key in c) { - $$computed[key] = computed(_.bind(c[key], vm)); + }, + set: function set(target, key, value) { + if (vm.$$state && key in vm.$$state) { + vm.$$state[key] = value; + return true; } - } - function initWatch(vm, watch) { - vm._watchers || (vm._watchers = []); - - for (var key in watch) { - var handler = watch[key]; + var p = vm._parent; - if (_.isArray(handler)) { - for (var i = 0; i < handler.length; i++) { - vm._watchers.push(createWatcher(vm, key, handler[i])); - } - } else { - vm._watchers.push(createWatcher(vm, key, handler)); - } - } - } + while (p) { + if (p.$$context && key in p.$$context) { + p.$$context[key] = value; + return true; + } - function createWatcher(vm, keyOrFn, cb, options) { - if (isPlainObject(cb)) { - options = cb; - cb = cb.handler; + p = p._parent; } - if (typeof cb === "string") { - cb = vm[cb]; + return true; + } + }); + } + + function defineContext(vm, keys) { + var props = {}; + + var _loop = function _loop(i, len) { + var key = keys[i]; + props[key] = { + enumerable: true, + configurable: true, + get: function get() { + return vm.model[key]; + }, + set: function set(val) { + return vm.model[key] = val; } + }; + }; - return watch(vm.model, keyOrFn, _.bind(cb, vm), options); + for (var i = 0, len = keys.length; i < len; i++) { + _loop(i); } - function initMethods(vm, methods) { - for (var key in methods) { - vm[key] = methods[key] == null ? noop : _.bind(methods[key], vm); - } - } + vm.$$context = Object.defineProperties({}, props); + } - function initMixins(vm, mixins) { - mixins = (mixins || []).slice(0); + function getInjectValue(vm, key) { + var p = vm._parent; - _.each(mixins.reverse(), function (mixinType) { - var mixin = getMixins(mixinType); + while (p) { + if (p.$$context && key in p.$$context) { + return p.$$context[key]; + } - for (var key in mixin) { - if (typeof mixin[key] !== "function") continue; - if (_.has(vm, key)) continue; - vm[key] = _.bind(mixin[key], vm); - } - }); + p = p._parent; } + } - function defineProps(vm) { - vm.model = new Proxy({}, { - get: function get(target, key) { - if (vm.$$computed && key in vm.$$computed) { - try { - return vm.$$computed[key].value; - } catch (e) {// 吞掉异常 - } - - return; - } - - if (vm.$$state && key in vm.$$state) { - return vm.$$state[key]; - } - - var p = vm._parent; - - while (p) { - if (p.$$context && key in p.$$context) { - return p.$$context[key]; - } - - p = p._parent; - } - }, - set: function set(target, key, value) { - if (vm.$$state && key in vm.$$state) { - vm.$$state[key] = value; - return true; - } - - var p = vm._parent; - - while (p) { - if (p.$$context && key in p.$$context) { - p.$$context[key] = value; - return true; - } + function getInjectValues(vm) { + var inject = vm.inject || []; + var result = {}; - p = p._parent; - } + _.each(inject, function (key) { + result[key] = getInjectValue(vm, key); + }); - return true; - } + return result; + } + + var Model = /*#__PURE__*/function () { + function Model() { + _classCallCheck(this, Model); + } + + _createClass(Model, [{ + key: "_constructor", + value: function _constructor(options, destroyHandler) { + this.options = options || {}; + this._parent = Model.target; + var state = _.isFunction(this.state) ? this.state() : this.state; + var computed = this.computed; + var context = this.context; + var inject = this.inject; + var childContext = this.childContext; + var watch = this.watch; + var actions = this.actions; + + _.keys(state).concat(_.keys(computed)).concat(inject || []).concat(context || []); + + var mixins = this.mixins; + defineProps(this); + childContext && defineContext(this, childContext); + initMixins(this, mixins); + this.init(); + initState(this, _.extend(getInjectValues(this), state)); + initComputed(this, computed); + REACTIVE && initWatch(this, watch); + initMethods(this, actions); + this.created && this.created(); + this._destroyHandler = destroyHandler; + } + }, { + key: "_init", + value: function _init() {} + }, { + key: "init", + value: function init() { + this._init(); + } + }, { + key: "destroy", + value: function destroy() { + _.each(this._watchers, function (unwatches) { + unwatches = _.isArray(unwatches) ? unwatches : [unwatches]; + + _.each(unwatches, function (unwatch) { + unwatch(); + }); }); - } - function defineContext(vm, keys) { - var props = {}; - - var _loop = function _loop(i, len) { - var key = keys[i]; - props[key] = { - enumerable: true, - configurable: true, - get: function get() { - return vm.model[key]; - }, - set: function set(val) { - return vm.model[key] = val; - } - }; - }; - - for (var i = 0, len = keys.length; i < len; i++) { - _loop(i); - } - - vm.$$context = Object.defineProperties({}, props); - } - - function getInjectValue(vm, key) { - var p = vm._parent; - - while (p) { - if (p.$$context && key in p.$$context) { - return p.$$context[key]; - } + this._watchers && (this._watchers = []); + this.destroyed && this.destroyed(); + this.$$computed = null; + this.$$state = null; + this._destroyHandler && this._destroyHandler(); + } + }]); - p = p._parent; - } + return Model; + }(); + function set(target, key, val) { + if (_.isArray(target)) { + target.length = Math.max(target.length, key); + target.splice(key, 1, val); + return val; } - function getInjectValues(vm) { - var inject = vm.inject || []; - var result = {}; - - _.each(inject, function (key) { - result[key] = getInjectValue(vm, key); - }); - - return result; + target[key] = val; + } + function del(target, key) { + if (_.isArray(target)) { + target.splice(key, 1); + return; } - var Model = /*#__PURE__*/function () { - function Model() { - _classCallCheck(this, Model); - } - - _createClass(Model, [{ - key: "_constructor", - value: function _constructor(options, destroyHandler) { - this.options = options || {}; - this._parent = Model.target; - var state = _.isFunction(this.state) ? this.state() : this.state; - var computed = this.computed; - var context = this.context; - var inject = this.inject; - var childContext = this.childContext; - var watch = this.watch; - var actions = this.actions; - - _.keys(state).concat(_.keys(computed)).concat(inject || []).concat(context || []); - - var mixins = this.mixins; - defineProps(this); - childContext && defineContext(this, childContext); - initMixins(this, mixins); - this.init(); - initState(this, _.extend(getInjectValues(this), state)); - initComputed(this, computed); - REACTIVE && initWatch(this, watch); - initMethods(this, actions); - this.created && this.created(); - this._destroyHandler = destroyHandler; - } - }, { - key: "_init", - value: function _init() {} - }, { - key: "init", - value: function init() { - this._init(); - } - }, { - key: "destroy", - value: function destroy() { - _.each(this._watchers, function (unwatches) { - unwatches = _.isArray(unwatches) ? unwatches : [unwatches]; - - _.each(unwatches, function (unwatch) { - unwatch(); - }); - }); - - this._watchers && (this._watchers = []); - this.destroyed && this.destroyed(); - this.$$computed = null; - this.$$state = null; - this._destroyHandler && this._destroyHandler(); - } - }]); - - return Model; - }(); - function set(target, key, val) { - if (_.isArray(target)) { - target.length = Math.max(target.length, key); - target.splice(key, 1, val); - return val; - } - - target[key] = val; + if (!_.has(target, key)) { + return; } - function del(target, key) { - if (_.isArray(target)) { - target.splice(key, 1); - return; - } - if (!_.has(target, key)) { - return; - } + delete target[key]; + } + function define(model) { + return REACTIVE ? reactive(model) : model; + } + function config(options) { + options || (options = {}); - delete target[key]; - } - function define(model) { - return REACTIVE ? reactive(model) : model; + if ("reactive" in options) { + REACTIVE = options.reactive; } - function config(options) { - options || (options = {}); + } - if ("reactive" in options) { - REACTIVE = options.reactive; - } - } + function toJSON(model) { + var result; - function toJSON(model) { - var result; + if (_.isArray(model)) { + result = []; - if (_.isArray(model)) { - result = []; + for (var i = 0, len = model.length; i < len; i++) { + result[i] = toJSON(model[i]); + } + } else if (model && isPlainObject(model)) { + result = {}; - for (var i = 0, len = model.length; i < len; i++) { - result[i] = toJSON(model[i]); - } - } else if (model && isPlainObject(model)) { - result = {}; - - for (var key in model) { - result[key] = toJSON(model[key]); - } - } else { - result = model; - } - - return result; + for (var key in model) { + result[key] = toJSON(model[key]); + } + } else { + result = model; } - var version = "3.0"; + return result; + } + + var version = "3.0"; - exports.Model = Model; - exports.config = config; - exports.define = define; - exports.del = del; - exports.mixin = mixin; - exports.set = set; - exports.toJSON = toJSON; - exports.version = version; - exports.watch = watch; + exports.Model = Model; + exports.config = config; + exports.define = define; + exports.del = del; + exports.mixin = mixin; + exports.set = set; + exports.toJSON = toJSON; + exports.version = version; + exports.watch = watch; - Object.defineProperty(exports, '__esModule', { value: true }); + Object.defineProperty(exports, '__esModule', { value: true }); }))); From 41d2d5015bd666e1d0f77ba269e88f41f47909e6 Mon Sep 17 00:00:00 2001 From: windy <1374721899@qq.com> Date: Mon, 13 Dec 2021 14:50:11 +0800 Subject: [PATCH 03/46] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0fix.proxy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/fix/fix.proxy.js | 1125 ++++++++++++++++++++++++++++------------- 1 file changed, 775 insertions(+), 350 deletions(-) diff --git a/dist/fix/fix.proxy.js b/dist/fix/fix.proxy.js index 78a241383..ad14e65ab 100644 --- a/dist/fix/fix.proxy.js +++ b/dist/fix/fix.proxy.js @@ -57,7 +57,161 @@ return obj; } - var EMPTY_OBJ = Object.freeze({}); + function _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); + } + + function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); + } + + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return _arrayLikeToArray(arr); + } + + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + + function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); + } + + function _iterableToArrayLimit(arr, i) { + var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; + + if (_i == null) return; + var _arr = []; + var _n = true; + var _d = false; + + var _s, _e; + + try { + for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + + return arr2; + } + + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + function _createForOfIteratorHelper(o, allowArrayLike) { + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; + + if (!it) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + + var F = function () {}; + + return { + s: F, + n: function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }, + e: function (e) { + throw e; + }, + f: F + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + var normalCompletion = true, + didErr = false, + err; + return { + s: function () { + it = it.call(o); + }, + n: function () { + var step = it.next(); + normalCompletion = step.done; + return step; + }, + e: function (e) { + didErr = true; + err = e; + }, + f: function () { + try { + if (!normalCompletion && it.return != null) it.return(); + } finally { + if (didErr) throw err; + } + } + }; + } + + /** + * Make a map and return a function for checking if a key + * is in that map. + * IMPORTANT: all calls of this function must be prefixed with + * \/\*#\_\_PURE\_\_\*\/ + * So that rollup can tree-shake them if necessary. + */ + 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]; + }; + } + + Object.freeze({}); Object.freeze([]); var extend = Object.assign; var hasOwnProperty = Object.prototype.hasOwnProperty; @@ -69,23 +223,23 @@ var isArray = Array.isArray; var isMap$1 = function isMap(val) { - return toTypeString$1(val) === "[object Map]"; + return toTypeString$1(val) === '[object Map]'; }; var isFunction = function isFunction(val) { - return typeof val === "function"; + return typeof val === 'function'; }; var isString = function isString(val) { - return typeof val === "string"; + return typeof val === 'string'; }; var isSymbol = function isSymbol(val) { - return _typeof(val) === "symbol"; + return _typeof(val) === 'symbol'; }; var isObject = function isObject(val) { - return val !== null && _typeof(val) === "object"; + return val !== null && _typeof(val) === 'object'; }; var objectToString$1 = Object.prototype.toString; @@ -95,13 +249,12 @@ }; var toRawType = function toRawType(value) { - return (// extract "RawType" from strings like "[object RawType]" - toTypeString$1(value).slice(8, -1) - ); + // extract "RawType" from strings like "[object RawType]" + return toTypeString$1(value).slice(8, -1); }; var isIntegerKey = function isIntegerKey(key) { - return isString(key) && key !== "NaN" && key[0] !== "-" && "".concat(parseInt(key, 10)) === key; + return isString(key) && key !== 'NaN' && key[0] !== '-' && '' + parseInt(key, 10) === key; }; var cacheStringFunction = function cacheStringFunction(fn) { @@ -121,82 +274,150 @@ }); // compare whether a value has changed, accounting for NaN. var hasChanged$1 = function hasChanged(value, oldValue) { - return value !== oldValue && (value === value || oldValue === oldValue); + return !Object.is(value, oldValue); }; - var targetMap = new WeakMap(); - var effectStack = []; - var activeEffect; - var ITERATE_KEY = Symbol("iterate"); - var MAP_KEY_ITERATE_KEY = Symbol("Map key iterate"); + var activeEffectScope; + + function recordEffectScope(effect, scope) { + scope = scope || activeEffectScope; - function isEffect(fn) { - return fn && fn._isEffect === true; + if (scope && scope.active) { + scope.effects.push(effect); + } } - function effect(fn) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : EMPTY_OBJ; + var createDep = function createDep(effects) { + var dep = new Set(effects); + dep.w = 0; + dep.n = 0; + return dep; + }; - if (isEffect(fn)) { - fn = fn.raw; - } + var wasTracked = function wasTracked(dep) { + return (dep.w & trackOpBit) > 0; + }; + + var newTracked = function newTracked(dep) { + return (dep.n & trackOpBit) > 0; + }; - var effect = createReactiveEffect(fn, options); + var initDepMarkers = function initDepMarkers(_ref) { + var deps = _ref.deps; - if (!options.lazy) { - effect(); + if (deps.length) { + for (var i = 0; i < deps.length; i++) { + deps[i].w |= trackOpBit; // set was tracked + } } + }; - return effect; - } + var finalizeDepMarkers = function finalizeDepMarkers(effect) { + var deps = effect.deps; - function stop(effect) { - if (effect.active) { - cleanup(effect); + if (deps.length) { + var ptr = 0; + + for (var i = 0; i < deps.length; i++) { + var dep = deps[i]; + + if (wasTracked(dep) && !newTracked(dep)) { + dep.delete(effect); + } else { + deps[ptr++] = dep; + } // clear bits - if (effect.options.onStop) { - effect.options.onStop(); + + dep.w &= ~trackOpBit; + dep.n &= ~trackOpBit; } - effect.active = false; + deps.length = ptr; } - } + }; + + var targetMap = new WeakMap(); // The number of effects currently being tracked recursively. + + var effectTrackDepth = 0; + var trackOpBit = 1; + /** + * The bitwise track markers support at most 30 levels of recursion. + * This value is chosen to enable modern JS engines to use a SMI on all platforms. + * When recursion depth is greater, fall back to using a full cleanup. + */ + + var maxMarkerBits = 30; + var effectStack = []; + var activeEffect; + var ITERATE_KEY = Symbol('iterate'); + var MAP_KEY_ITERATE_KEY = Symbol('Map key iterate'); - var uid$1 = 0; + var ReactiveEffect = /*#__PURE__*/function () { + function ReactiveEffect(fn) { + var scheduler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + var scope = arguments.length > 2 ? arguments[2] : undefined; + + _classCallCheck(this, ReactiveEffect); + + this.fn = fn; + this.scheduler = scheduler; + this.active = true; + this.deps = []; + recordEffectScope(this, scope); + } + + _createClass(ReactiveEffect, [{ + key: "run", + value: function run() { + if (!this.active) { + return this.fn(); + } + + if (!effectStack.includes(this)) { + try { + effectStack.push(activeEffect = this); + enableTracking(); + trackOpBit = 1 << ++effectTrackDepth; + + if (effectTrackDepth <= maxMarkerBits) { + initDepMarkers(this); + } else { + cleanupEffect(this); + } - function createReactiveEffect(fn, options) { - var effect = function reactiveEffect() { - if (!effect.active) { - return options.scheduler ? undefined : fn(); + return this.fn(); + } finally { + if (effectTrackDepth <= maxMarkerBits) { + finalizeDepMarkers(this); + } + + trackOpBit = 1 << --effectTrackDepth; + resetTracking(); + effectStack.pop(); + var n = effectStack.length; + activeEffect = n > 0 ? effectStack[n - 1] : undefined; + } + } } + }, { + key: "stop", + value: function stop() { + if (this.active) { + cleanupEffect(this); - if (!effectStack.includes(effect)) { - cleanup(effect); + if (this.onStop) { + this.onStop(); + } - try { - enableTracking(); - effectStack.push(effect); - activeEffect = effect; - return fn(); - } finally { - effectStack.pop(); - resetTracking(); - activeEffect = effectStack[effectStack.length - 1]; + this.active = false; } } - }; + }]); - effect.id = uid$1++; - effect.allowRecurse = !!options.allowRecurse; - effect._isEffect = true; - effect.active = true; - effect.raw = fn; - effect.deps = []; - effect.options = options; - return effect; - } + return ReactiveEffect; + }(); - function cleanup(effect) { + function cleanupEffect(effect) { var deps = effect.deps; if (deps.length) { @@ -208,6 +429,32 @@ } } + function effect(fn, options) { + if (fn.effect) { + fn = fn.effect.fn; + } + + var _effect = new ReactiveEffect(fn); + + if (options) { + extend(_effect, options); + if (options.scope) recordEffectScope(_effect, options.scope); + } + + if (!options || !options.lazy) { + _effect.run(); + } + + var runner = _effect.run.bind(_effect); + + runner.effect = _effect; + return runner; + } + + function stop(runner) { + runner.effect.stop(); + } + var shouldTrack = true; var trackStack = []; @@ -227,7 +474,7 @@ } function track(target, type, key) { - if (!shouldTrack || activeEffect === undefined) { + if (!isTracking()) { return; } @@ -240,20 +487,44 @@ var dep = depsMap.get(key); if (!dep) { - depsMap.set(key, dep = new Set()); + depsMap.set(key, dep = createDep()); } - if (!dep.has(activeEffect)) { + var eventInfo = { + effect: activeEffect, + target: target, + type: type, + key: key + }; + trackEffects(dep, eventInfo); + } + + function isTracking() { + return shouldTrack && activeEffect !== undefined; + } + + function trackEffects(dep, debuggerEventExtraInfo) { + var shouldTrack = false; + + if (effectTrackDepth <= maxMarkerBits) { + if (!newTracked(dep)) { + dep.n |= trackOpBit; // set newly tracked + + shouldTrack = !wasTracked(dep); + } + } else { + // Full cleanup mode. + shouldTrack = !dep.has(activeEffect); + } + + if (shouldTrack) { dep.add(activeEffect); activeEffect.deps.push(dep); - if (activeEffect.options.onTrack) { - activeEffect.options.onTrack({ - effect: activeEffect, - target: target, - type: type, - key: key - }); + if (activeEffect.onTrack) { + activeEffect.onTrack(Object.assign({ + effect: activeEffect + }, debuggerEventExtraInfo)); } } } @@ -266,34 +537,24 @@ return; } - var effects = new Set(); - - var add = function add(effectsToAdd) { - if (effectsToAdd) { - effectsToAdd.forEach(function (effect) { - if (effect !== activeEffect || effect.allowRecurse) { - effects.add(effect); - } - }); - } - }; + var deps = []; if (type === "clear" /* CLEAR */ ) { // collection being cleared // trigger all effects for target - depsMap.forEach(add); - } else if (key === "length" && isArray(target)) { + deps = _toConsumableArray(depsMap.values()); + } else if (key === 'length' && isArray(target)) { depsMap.forEach(function (dep, key) { - if (key === "length" || key >= newValue) { - add(dep); + if (key === 'length' || key >= newValue) { + deps.push(dep); } }); } else { // schedule runs for SET | ADD | DELETE if (key !== void 0) { - add(depsMap.get(key)); + deps.push(depsMap.get(key)); } // also run for iteration key on ADD | DELETE | Map.SET @@ -302,14 +563,14 @@ /* ADD */ : if (!isArray(target)) { - add(depsMap.get(ITERATE_KEY)); + deps.push(depsMap.get(ITERATE_KEY)); if (isMap$1(target)) { - add(depsMap.get(MAP_KEY_ITERATE_KEY)); + deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); } } else if (isIntegerKey(key)) { // new index added to array -> length changes - add(depsMap.get("length")); + deps.push(depsMap.get('length')); } break; @@ -318,10 +579,10 @@ /* DELETE */ : if (!isArray(target)) { - add(depsMap.get(ITERATE_KEY)); + deps.push(depsMap.get(ITERATE_KEY)); if (isMap$1(target)) { - add(depsMap.get(MAP_KEY_ITERATE_KEY)); + deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); } } @@ -331,86 +592,134 @@ /* SET */ : if (isMap$1(target)) { - add(depsMap.get(ITERATE_KEY)); + deps.push(depsMap.get(ITERATE_KEY)); } break; } } - var run = function run(effect) { - if (effect.options.onTrigger) { - effect.options.onTrigger({ - effect: effect, - target: target, - key: key, - type: type, - newValue: newValue, - oldValue: oldValue, - oldTarget: oldTarget - }); + var eventInfo = { + target: target, + type: type, + key: key, + newValue: newValue, + oldValue: oldValue, + oldTarget: oldTarget + }; + + if (deps.length === 1) { + if (deps[0]) { + { + triggerEffects(deps[0], eventInfo); + } } + } else { + var effects = []; - if (effect.options.scheduler) { - effect.options.scheduler(effect); - } else { - effect(); + var _iterator = _createForOfIteratorHelper(deps), + _step; + + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var dep = _step.value; + + if (dep) { + effects.push.apply(effects, _toConsumableArray(dep)); + } + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); } - }; - effects.forEach(run); + { + triggerEffects(createDep(effects), eventInfo); + } + } + } + + function triggerEffects(dep, debuggerEventExtraInfo) { + // spread into array for stabilization + var _iterator2 = _createForOfIteratorHelper(isArray(dep) ? dep : _toConsumableArray(dep)), + _step2; + + try { + for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { + var _effect2 = _step2.value; + + if (_effect2 !== activeEffect || _effect2.allowRecurse) { + if (_effect2.onTrigger) { + _effect2.onTrigger(extend({ + effect: _effect2 + }, debuggerEventExtraInfo)); + } + + if (_effect2.scheduler) { + _effect2.scheduler(); + } else { + _effect2.run(); + } + } + } + } catch (err) { + _iterator2.e(err); + } finally { + _iterator2.f(); + } } + var isNonTrackableKeys = /*#__PURE__*/makeMap("__proto__,__v_isRef,__isVue"); var builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol).map(function (key) { return Symbol[key]; }).filter(isSymbol)); - var get = /* #__PURE__*/createGetter(); - var shallowGet = /* #__PURE__*/createGetter(false, true); - var readonlyGet = /* #__PURE__*/createGetter(true); - var shallowReadonlyGet = /* #__PURE__*/createGetter(true, true); - var arrayInstrumentations = {}; - ["includes", "indexOf", "lastIndexOf"].forEach(function (key) { - var method = Array.prototype[key]; - - arrayInstrumentations[key] = function () { - var arr = toRaw(this); - - for (var i = 0, l = this.length; i < l; i++) { - track(arr, "get" - /* GET */ - , "".concat(i)); - } // we run the method using the original args first (which may be reactive) + var get = /*#__PURE__*/createGetter(); + var readonlyGet = /*#__PURE__*/createGetter(true); + var arrayInstrumentations = /*#__PURE__*/createArrayInstrumentations(); + function createArrayInstrumentations() { + var instrumentations = {}; + ['includes', 'indexOf', 'lastIndexOf'].forEach(function (key) { + instrumentations[key] = function () { + var arr = toRaw(this); - for (var _len = arguments.length, args = new Array(_len), _key2 = 0; _key2 < _len; _key2++) { - args[_key2] = arguments[_key2]; - } + for (var i = 0, l = this.length; i < l; i++) { + track(arr, "get" + /* GET */ + , i + ''); + } // we run the method using the original args first (which may be reactive) - var res = method.apply(arr, args); - if (res === -1 || res === false) { - // if that didn't work, run it again using raw values. - return method.apply(arr, args.map(toRaw)); - } else { - return res; - } - }; - }); - ["push", "pop", "shift", "unshift", "splice"].forEach(function (key) { - var method = Array.prototype[key]; + for (var _len2 = arguments.length, args = new Array(_len2), _key3 = 0; _key3 < _len2; _key3++) { + args[_key3] = arguments[_key3]; + } - arrayInstrumentations[key] = function () { - pauseTracking(); + var res = arr[key].apply(arr, args); - for (var _len2 = arguments.length, args = new Array(_len2), _key3 = 0; _key3 < _len2; _key3++) { - args[_key3] = arguments[_key3]; - } + if (res === -1 || res === false) { + // if that didn't work, run it again using raw values. + return arr[key].apply(arr, _toConsumableArray(args.map(toRaw))); + } else { + return res; + } + }; + }); + ['push', 'pop', 'shift', 'unshift', 'splice'].forEach(function (key) { + instrumentations[key] = function () { + pauseTracking(); - var res = method.apply(this, args); - resetTracking(); - return res; - }; - }); + for (var _len3 = arguments.length, args = new Array(_len3), _key4 = 0; _key4 < _len3; _key4++) { + args[_key4] = arguments[_key4]; + } + + var res = toRaw(this)[key].apply(this, args); + resetTracking(); + return res; + }; + }); + return instrumentations; + } function createGetter() { var isReadonly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; @@ -426,19 +735,19 @@ return isReadonly; } else if (key === "__v_raw" /* RAW */ - && receiver === (isReadonly ? readonlyMap : reactiveMap).get(target)) { + && receiver === (isReadonly ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) { return target; } var targetIsArray = isArray(target); - if (targetIsArray && hasOwn(arrayInstrumentations, key)) { + if (!isReadonly && targetIsArray && hasOwn(arrayInstrumentations, key)) { return Reflect.get(arrayInstrumentations, key, receiver); } var res = Reflect.get(target, key, receiver); - if (isSymbol(key) ? builtInSymbols.has(key) : key === "__proto__" || key === "__v_isRef") { + if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { return res; } @@ -469,16 +778,16 @@ }; } - var set$1 = /* #__PURE__*/createSetter(); - var shallowSet = /* #__PURE__*/createSetter(true); + var set$1 = /*#__PURE__*/createSetter(); function createSetter() { var shallow = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; return function set(target, key, value, receiver) { var oldValue = target[key]; - if (!shallow) { + if (!shallow && !isReadonly(value)) { value = toRaw(value); + oldValue = toRaw(oldValue); if (!isArray(target) && isRef(oldValue) && !isRef(value)) { oldValue.value = value; @@ -494,7 +803,7 @@ trigger(target, "add" /* ADD */ , key, value); - } else if (hasChanged$1(value, oldValue) || key === "length") { + } else if (hasChanged$1(value, oldValue)) { trigger(target, "set" /* SET */ , key, value, oldValue); @@ -534,7 +843,7 @@ function ownKeys(target) { track(target, "iterate" /* ITERATE */ - , isArray(target) ? "length" : ITERATE_KEY); + , isArray(target) ? 'length' : ITERATE_KEY); return Reflect.ownKeys(target); } @@ -560,24 +869,6 @@ return true; } }; - extend({}, mutableHandlers, { - get: shallowGet, - set: shallowSet - }); // Props handlers are special in the sense that it should not unwrap top-level - // refs (in order to allow refs to be explicitly passed down), but should - // retain the reactivity of the normal readonly object. - - extend({}, readonlyHandlers, { - get: shallowReadonlyGet - }); - - var toReactive = function toReactive(value) { - return isObject(value) ? reactive(value) : value; - }; - - var toReadonly = function toReadonly(value) { - return isObject(value) ? readonly(value) : value; - }; var toShallow = function toShallow(value) { return value; @@ -611,12 +902,16 @@ var _getProto = getProto(rawTarget), has = _getProto.has; - var wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive; + var wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive; if (has.call(rawTarget, key)) { return wrap(target.get(key)); } else if (has.call(rawTarget, rawKey)) { return wrap(target.get(rawKey)); + } else if (target !== rawTarget) { + // #3602 readonly(reactive(Map)) + // ensure that the nested reactive `Map` can do tracking for itself + target.get(key); } } @@ -648,7 +943,7 @@ !isReadonly && track(toRaw(target), "iterate" /* ITERATE */ , ITERATE_KEY); - return Reflect.get(target, "size", target); + return Reflect.get(target, 'size', target); } function add(value) { @@ -656,15 +951,15 @@ var target = toRaw(this); var proto = getProto(target); var hadKey = proto.has.call(target, value); - var result = target.add(value); if (!hadKey) { + target.add(value); trigger(target, "add" /* ADD */ , value, value); } - return result; + return this; } function set$1$1(key, value) { @@ -685,19 +980,19 @@ } var oldValue = get.call(target, key); - var result = target.set(key, value); + target.set(key, value); if (!hadKey) { trigger(target, "add" /* ADD */ , key, value); - } else if (hasChanged$1(value, oldValue) || key === "length") { + } else if (hasChanged$1(value, oldValue)) { trigger(target, "set" /* SET */ , key, value, oldValue); } - return result; + return this; } function deleteEntry(key) { @@ -752,16 +1047,15 @@ /* RAW */ ]; var rawTarget = toRaw(target); - var wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive; + var wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive; !isReadonly && track(rawTarget, "iterate" /* ITERATE */ , ITERATE_KEY); return target.forEach(function (value, key) { - return (// important: make sure the callback is - // 1. invoked with the reactive map as `this` and 3rd arg - // 2. the value received should be a corresponding reactive/readonly. - callback.call(thisArg, wrap(value), wrap(key), observed) - ); + // important: make sure the callback is + // 1. invoked with the reactive map as `this` and 3rd arg + // 2. the value received should be a corresponding reactive/readonly. + return callback.call(thisArg, wrap(value), wrap(key), observed); }); }; } @@ -773,10 +1067,10 @@ ]; var rawTarget = toRaw(target); var targetIsMap = isMap$1(rawTarget); - var isPair = method === "entries" || method === Symbol.iterator && targetIsMap; - var isKeyOnly = method === "keys" && targetIsMap; + var isPair = method === 'entries' || method === Symbol.iterator && targetIsMap; + var isKeyOnly = method === 'keys' && targetIsMap; var innerIterator = target[method].apply(target, arguments); - var wrap = isReadonly ? toReadonly : isShallow ? toShallow : toReactive; + var wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive; !isReadonly && track(rawTarget, "iterate" /* ITERATE */ , isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY); // return a wrapped iterator which returns observed versions of the @@ -815,73 +1109,110 @@ }; } - var mutableInstrumentations = { - get: function get(key) { - return get$1(this, key); - }, + function createInstrumentations() { + var mutableInstrumentations = { + get: function get(key) { + return get$1(this, key); + }, - get size() { - return size(this); - }, + get size() { + return size(this); + }, - has: has$1$1, - add: add, - set: set$1$1, - delete: deleteEntry, - clear: clear, - forEach: createForEach(false, false) - }; - var shallowInstrumentations = { - get: function get(key) { - return get$1(this, key, false, true); - }, + has: has$1$1, + add: add, + set: set$1$1, + delete: deleteEntry, + clear: clear, + forEach: createForEach(false, false) + }; + var shallowInstrumentations = { + get: function get(key) { + return get$1(this, key, false, true); + }, - get size() { - return size(this); - }, + get size() { + return size(this); + }, - has: has$1$1, - add: add, - set: set$1$1, - delete: deleteEntry, - clear: clear, - forEach: createForEach(false, true) - }; - var readonlyInstrumentations = { - get: function get(key) { - return get$1(this, key, true); - }, + has: has$1$1, + add: add, + set: set$1$1, + delete: deleteEntry, + clear: clear, + forEach: createForEach(false, true) + }; + var readonlyInstrumentations = { + get: function get(key) { + return get$1(this, key, true); + }, - get size() { - return size(this, true); - }, + get size() { + return size(this, true); + }, - has: function has(key) { - return has$1$1.call(this, key, true); - }, - add: createReadonlyMethod("add" - /* ADD */ - ), - set: createReadonlyMethod("set" - /* SET */ - ), - delete: createReadonlyMethod("delete" - /* DELETE */ - ), - clear: createReadonlyMethod("clear" - /* CLEAR */ - ), - forEach: createForEach(true, false) - }; - var iteratorMethods = ["keys", "values", "entries", Symbol.iterator]; - iteratorMethods.forEach(function (method) { - mutableInstrumentations[method] = createIterableMethod(method, false, false); - readonlyInstrumentations[method] = createIterableMethod(method, true, false); - shallowInstrumentations[method] = createIterableMethod(method, false, true); - }); + has: function has(key) { + return has$1$1.call(this, key, true); + }, + add: createReadonlyMethod("add" + /* ADD */ + ), + set: createReadonlyMethod("set" + /* SET */ + ), + delete: createReadonlyMethod("delete" + /* DELETE */ + ), + clear: createReadonlyMethod("clear" + /* CLEAR */ + ), + forEach: createForEach(true, false) + }; + var shallowReadonlyInstrumentations = { + get: function get(key) { + return get$1(this, key, true, true); + }, + + get size() { + return size(this, true); + }, + + has: function has(key) { + return has$1$1.call(this, key, true); + }, + add: createReadonlyMethod("add" + /* ADD */ + ), + set: createReadonlyMethod("set" + /* SET */ + ), + delete: createReadonlyMethod("delete" + /* DELETE */ + ), + clear: createReadonlyMethod("clear" + /* CLEAR */ + ), + forEach: createForEach(true, true) + }; + var iteratorMethods = ['keys', 'values', 'entries', Symbol.iterator]; + iteratorMethods.forEach(function (method) { + mutableInstrumentations[method] = createIterableMethod(method, false, false); + readonlyInstrumentations[method] = createIterableMethod(method, true, false); + shallowInstrumentations[method] = createIterableMethod(method, false, true); + shallowReadonlyInstrumentations[method] = createIterableMethod(method, true, true); + }); + return [mutableInstrumentations, readonlyInstrumentations, shallowInstrumentations, shallowReadonlyInstrumentations]; + } + + var _createInstrumentatio = /* #__PURE__*/createInstrumentations(), + _createInstrumentatio2 = _slicedToArray(_createInstrumentatio, 4), + mutableInstrumentations = _createInstrumentatio2[0], + readonlyInstrumentations = _createInstrumentatio2[1], + shallowInstrumentations = _createInstrumentatio2[2], + shallowReadonlyInstrumentations = _createInstrumentatio2[3]; function createInstrumentationGetter(isReadonly, shallow) { - var instrumentations = shallow ? shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations; + var instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations; return function (target, key, receiver) { if (key === "__v_isReactive" /* IS_REACTIVE */ @@ -902,10 +1233,10 @@ } var mutableCollectionHandlers = { - get: createInstrumentationGetter(false, false) + get: /*#__PURE__*/createInstrumentationGetter(false, false) }; var readonlyCollectionHandlers = { - get: createInstrumentationGetter(true, false) + get: /*#__PURE__*/createInstrumentationGetter(true, false) }; function checkIdentityKeys(target, has, key) { @@ -918,22 +1249,30 @@ } var reactiveMap = new WeakMap(); + var shallowReactiveMap = new WeakMap(); var readonlyMap = new WeakMap(); + var shallowReadonlyMap = new WeakMap(); function targetTypeMap(rawType) { switch (rawType) { - case "Object": - case "Array": - return 1; - - case "Map": - case "Set": - case "WeakMap": - case "WeakSet": - return 2; + case 'Object': + case 'Array': + return 1 + /* COMMON */ + ; + + case 'Map': + case 'Set': + case 'WeakMap': + case 'WeakSet': + return 2 + /* COLLECTION */ + ; default: - return 0; + return 0 + /* INVALID */ + ; } } @@ -953,14 +1292,19 @@ return target; } - return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers); - } // Return a reactive-copy of the original object, where only the root level + return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap); + } + /** + * Creates a readonly copy of the original object. Note the returned copy is not + * made reactive, but `readonly` can be called on an already reactive object. + */ + function readonly(target) { - return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers); - } // Return a reactive-copy of the original object, where only the root level + return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap); + } - function createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers) { + function createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers, proxyMap) { if (!isObject(target)) { { console.warn("value cannot be made reactive: ".concat(String(target))); @@ -979,7 +1323,6 @@ } // target already has corresponding Proxy - var proxyMap = isReadonly ? readonlyMap : reactiveMap; var existingProxy = proxyMap.get(target); if (existingProxy) { @@ -1021,9 +1364,55 @@ } function toRaw(observed) { - return observed && toRaw(observed["__v_raw" + var raw = observed && observed["__v_raw" /* RAW */ - ]) || observed; + ]; + return raw ? toRaw(raw) : observed; + } + + var toReactive = function toReactive(value) { + return isObject(value) ? reactive(value) : value; + }; + + var toReadonly = function toReadonly(value) { + return isObject(value) ? readonly(value) : value; + }; + + function trackRefValue(ref) { + if (isTracking()) { + ref = toRaw(ref); + + if (!ref.dep) { + ref.dep = createDep(); + } + + { + trackEffects(ref.dep, { + target: ref, + type: "get" + /* GET */ + , + key: 'value' + }); + } + } + } + + function triggerRefValue(ref, newVal) { + ref = toRaw(ref); + + if (ref.dep) { + { + triggerEffects(ref.dep, { + target: ref, + type: "set" + /* SET */ + , + key: 'value', + newValue: newVal + }); + } + } } function isRef(r) { @@ -1037,17 +1426,13 @@ _classCallCheck(this, ComputedRefImpl); this._setter = _setter; + this.dep = undefined; this._dirty = true; this.__v_isRef = true; - this.effect = effect(getter, { - lazy: true, - scheduler: function scheduler() { - if (!_this2._dirty) { - _this2._dirty = true; - trigger(toRaw(_this2), "set" - /* SET */ - , "value"); - } + this.effect = new ReactiveEffect(getter, function () { + if (!_this2._dirty) { + _this2._dirty = true; + triggerRefValue(_this2); } }); this["__v_isReadonly" @@ -1058,15 +1443,16 @@ _createClass(ComputedRefImpl, [{ key: "value", get: function get() { - if (this._dirty) { - this._value = this.effect(); - this._dirty = false; + // the computed ref may get wrapped by other proxies e.g. readonly() #3376 + var self = toRaw(this); + trackRefValue(self); + + if (self._dirty) { + self._dirty = false; + self._value = self.effect.run(); } - track(toRaw(this), "get" - /* GET */ - , "value"); - return this._value; + return self._value; }, set: function set(newValue) { this._setter(newValue); @@ -1076,24 +1462,34 @@ return ComputedRefImpl; }(); - function computed(getterOrOptions) { + function computed(getterOrOptions, debugOptions) { var getter; var setter; + var onlyGetter = isFunction(getterOrOptions); - if (isFunction(getterOrOptions)) { + if (onlyGetter) { getter = getterOrOptions; setter = function setter() { - console.warn("Write operation failed: computed value is readonly"); + console.warn('Write operation failed: computed value is readonly'); }; } else { getter = getterOrOptions.get; setter = getterOrOptions.set; } - return new ComputedRefImpl(getter, setter, isFunction(getterOrOptions) || !getterOrOptions.set); + var cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter); + + if (debugOptions) { + cRef.effect.onTrack = debugOptions.onTrack; + cRef.effect.onTrigger = debugOptions.onTrigger; + } + + return cRef; } + Promise.resolve(); + function noop() {} function isNative(Ctor) { return typeof Ctor === "function" && /native code/.test(Ctor.toString()); @@ -1133,13 +1529,12 @@ function isPlainObject(obj) { return _toString.call(obj) === "[object Object]"; } - var bailRE = /[^\w.$]/; - function parsePath(path) { - if (bailRE.test(path)) { - return; - } - var segments = path.split("."); + function parsePath(path) { + // if (bailRE.test(path)) { + // return; + // } + var segments = path.length > 0 ? path.split(".") : []; return function (obj) { for (var i = 0; i < segments.length; i++) { if (!obj) return; @@ -1439,10 +1834,10 @@ var oldValue = _.isArray(source) ? [] : INITIAL_WATCHER_VALUE; var job = function job() { - if (!runner.active) { - return; - } - + // 这里去掉的原因是,新增属性没有生效也会触发变化监听 + // if (!runner.active) { + // return; + // } if (cb) { // watch(source, cb) var newValue = runner(); @@ -1554,8 +1949,7 @@ return new Function("return " + expr)(); } - function watchExp(model, exp) { - var getter = parsePath(exp); + function watchExp(model, getter) { var result = getter.call(model, model); if (_.isArray(result)) { @@ -1579,15 +1973,29 @@ options.user = true; var exps; - if (_.isFunction(expOrFn) || !(exps = expOrFn.match(/[a-zA-Z0-9_.*]+|[|][|]|[&][&]|[(]|[)]/g)) || exps.length === 1 && !/\*/.test(expOrFn)) { - var watcher = innerWatch(_.isFunction(expOrFn) ? expOrFn : function () { - return watchExp(model, expOrFn); - }, cb, options); + if (_.isFunction(expOrFn)) { + var watcher = innerWatch(expOrFn, cb, options); return function unwatchFn() { watcher(); }; } + if (!(exps = expOrFn.match(/[a-zA-Z0-9_.*]+|[|][|]|[&][&]|[(]|[)]/g)) || exps.length === 1 && !/\*/.test(expOrFn)) { + var paths = expOrFn.split("."); + var prePaths = paths.slice(0, paths.length - 1); + var preGetter = parsePath(prePaths.join(".")); + var v = preGetter.call(model, model); + var getter = parsePath(paths[paths.length - 1]); + + var _watcher = innerWatch(function () { + return watchExp(v, getter); + }, cb, options); + + return function unwatchFn() { + _watcher(); + }; + } + var watchers = []; var fns = exps.slice(); var complete = false, @@ -1624,35 +2032,12 @@ _.each(exps, function (exp, i) { if (_.has(operators, exp)) { return; - } //a.**形式 - - - if (/^[1-9a-zA-Z.]+\*\*$/.test(exp) || exp === "**") { - exp = exp.replace(".**", ""); - var getter = exp === "**" ? function (m) { - return m; - } : parsePath(exp); - watchers.push(innerWatch(function () { - return getter.call(model, model); - }, function (newValue, oldValue) { - callback(i, newValue, oldValue, _.extend({ - index: i - })); - }, _.extend({ - deep: true - }, options))); - return; } - if (/^(\*\*\.)+[1-9a-zA-Z]+(\.\*\*$)/.test(exp)) { - throw new Error("not support"); - } //含有*的情况,如a.*,如*.a,*.*.a,a.*.a - - - if (/\*/.test(exp)) { + if (exp.indexOf("*") >= 0) { // eslint-disable-next-line no-inner-declarations var travers = function travers(root, deps, parent, key, res) { - if (deps.length === paths.length) { + if (deps.length === _paths.length) { root !== undefined && res.push({ parent: parent, k: key @@ -1661,45 +2046,84 @@ } if (root) { - if (paths[deps.length] === "*") { + if (_paths[deps.length] === "*") { // 遍历所有节点 for (var k in root) { travers(root[k], deps.concat([k]), root, k, res); } } else { - var nextKey = paths[deps.length]; + var nextKey = _paths[deps.length]; travers(root[nextKey], deps.concat([nextKey]), root, nextKey, res); } } }; + //a.**形式 + if (/^[1-9a-zA-Z.]+\*\*$/.test(exp) || exp === "**") { + exp = exp.replace(".**", ""); + + var _paths2 = exp.split("."); + + var _prePaths2 = _paths2.slice(0, _paths2.length - 1); + + var _preGetter = parsePath(_prePaths2.join(".")); + + var _v2 = _preGetter.call(model, model); + + var _getter = exp === "**" ? function (m) { + return m; + } : parsePath(_paths2[_paths2.length - 1]); + + watchers.push(innerWatch(function () { + return watchExp(_v2, _getter); + }, function (newValue, oldValue) { + // a.** 在a变化的时候不会触发change + if (!_.isArray(newValue) && oldValue !== newValue) { + return; + } + + callback(i, NaN, NaN, _.extend({ + index: i + })); + }, _.extend({ + deep: true + }, options))); + return; + } + + if (/^(\*\*\.)+[1-9a-zA-Z]+(\.\*\*$)/.test(exp)) { + throw new Error("not support"); + } //含有*的情况,如a.*,如*.a,*.*.a,a.*.a //先获取到能获取到的对象 - var paths = exp.split("."); - var prePaths = []; - for (var _i = 0, len = paths.length; _i < len; _i++) { - if (paths[_i] === "*") { + + var _paths = exp.split("."); + + var _prePaths = []; + + for (var _i = 0, len = _paths.length; _i < len; _i++) { + if (_paths[_i] === "*") { break; } - prePaths[_i] = paths[_i]; + _prePaths[_i] = _paths[_i]; } - var v; + var _v; - if (prePaths.length > 0) { - var _getter = parsePath(prePaths.join(".")); + if (_prePaths.length > 0) { + var _getter2 = parsePath(_prePaths.join(".")); - v = _getter.call(model, model); + _v = _getter2.call(model, model); } else { - v = model; + _v = model; } - paths = paths.slice(prePaths.length); + _paths = _paths.slice(_prePaths.length); var changes = []; watchers.push(innerWatch(function () { var routes = []; - travers(v, [], v, null, routes); + travers(_v, [], _v, null, routes); for (var _i2 = 0, _len = routes.length; _i2 < _len; _i2++) { var _routes$_i = routes[_i2], @@ -1720,11 +2144,11 @@ changes = []; if (newValue === true) { - callback(i, undefined, undefined, _.extend({ + callback(i, NaN, NaN, _.extend({ index: i })); } - }, BI.extend({}, options, { + }, _.extend({}, options, { deep: true, onTrigger: function onTrigger(_ref) { var target = _ref.target, @@ -1738,8 +2162,9 @@ return; } + var getter = parsePath(exp); watchers.push(innerWatch(function () { - return watchExp(model, exp); + return watchExp(model, getter); }, function (newValue, oldValue) { callback(i, newValue, oldValue, _.extend({ index: i From e57d7edd5a879ac130cdb4c73535d721621fb618 Mon Sep 17 00:00:00 2001 From: data Date: Mon, 13 Dec 2021 19:13:42 +0800 Subject: [PATCH 04/46] auto upgrade version to 2.0.20211213191328 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d4a16ba9c..8adfa9a5b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211213173215", + "version": "2.0.20211213191328", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From 02ab7cf85f48721492f9e423b3feb6c13190250b Mon Sep 17 00:00:00 2001 From: windy <1374721899@qq.com> Date: Mon, 13 Dec 2021 19:15:34 +0800 Subject: [PATCH 05/46] =?UTF-8?q?BI-98494=20=E7=B2=98=E8=B4=B4=E6=9C=AB?= =?UTF-8?q?=E5=B0=BE=E5=80=BC=E5=B8=A6=E5=88=86=E9=9A=94=E7=AC=A6=E5=A4=9A?= =?UTF-8?q?=E8=AE=A1=E6=95=B0=E4=B8=80=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/widget/multiselect/multiselect.insert.combo.js | 2 +- src/widget/multiselect/multiselect.insert.combo.nobar.js | 2 +- src/widget/multiselectlist/multiselectlist.insert.js | 2 +- src/widget/multiselectlist/multiselectlist.insert.nobar.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/widget/multiselect/multiselect.insert.combo.js b/src/widget/multiselect/multiselect.insert.combo.js index c77953401..f0435f6f7 100644 --- a/src/widget/multiselect/multiselect.insert.combo.js +++ b/src/widget/multiselect/multiselect.insert.combo.js @@ -81,7 +81,7 @@ BI.MultiSelectInsertCombo = BI.inherit(BI.Single, { var last = BI.last(keywords); keywords = BI.initial(keywords || []); if (keywords.length > 0) { - self._joinKeywords(keywords.slice(0, 2000), function () { + self._joinKeywords(keywords.slice(0, last === BI.BlankSplitChar ? 1999 : 2000), function () { if (BI.endWith(last, BI.BlankSplitChar)) { self.combo.setValue(self.storeValue); assertShowValue(); diff --git a/src/widget/multiselect/multiselect.insert.combo.nobar.js b/src/widget/multiselect/multiselect.insert.combo.nobar.js index 28065441e..18bfc8a82 100644 --- a/src/widget/multiselect/multiselect.insert.combo.nobar.js +++ b/src/widget/multiselect/multiselect.insert.combo.nobar.js @@ -76,7 +76,7 @@ BI.MultiSelectInsertNoBarCombo = BI.inherit(BI.Single, { var last = BI.last(keywords); keywords = BI.initial(keywords || []); if (keywords.length > 0) { - self._joinKeywords(keywords.slice(0, 2000), function () { + self._joinKeywords(keywords.slice(0, last === BI.BlankSplitChar ? 1999 : 2000), function () { if (BI.endWith(last, BI.BlankSplitChar)) { self.combo.setValue(self.storeValue); assertShowValue(); diff --git a/src/widget/multiselectlist/multiselectlist.insert.js b/src/widget/multiselectlist/multiselectlist.insert.js index b27d1271b..e4a6a004b 100644 --- a/src/widget/multiselectlist/multiselectlist.insert.js +++ b/src/widget/multiselectlist/multiselectlist.insert.js @@ -126,7 +126,7 @@ BI.MultiSelectInsertList = BI.inherit(BI.Single, { var last = BI.last(keywords); keywords = BI.initial(keywords || []); if (keywords.length > 0) { - self._joinKeywords(keywords.slice(0, 2000), function () { + self._joinKeywords(keywords.slice(0, last === BI.BlankSplitChar ? 1999 : 2000), function () { if (BI.endWith(last, BI.BlankSplitChar)) { self.adapter.setValue(self.storeValue); assertShowValue(); diff --git a/src/widget/multiselectlist/multiselectlist.insert.nobar.js b/src/widget/multiselectlist/multiselectlist.insert.nobar.js index 6e5f1d65b..f4f1adff4 100644 --- a/src/widget/multiselectlist/multiselectlist.insert.nobar.js +++ b/src/widget/multiselectlist/multiselectlist.insert.nobar.js @@ -129,7 +129,7 @@ BI.MultiSelectInsertNoBarList = BI.inherit(BI.Single, { var last = BI.last(keywords); keywords = BI.initial(keywords || []); if (keywords.length > 0) { - self._joinKeywords(keywords.slice(0, 2000), function () { + self._joinKeywords(keywords.slice(0, last === BI.BlankSplitChar ? 1999 : 2000), function () { if (BI.endWith(last, BI.BlankSplitChar)) { self.adapter.setValue(self.storeValue); assertShowValue(); From 6866113a7e28bfc118ae5a5dd139ded5f39fe82c Mon Sep 17 00:00:00 2001 From: data Date: Tue, 14 Dec 2021 09:54:04 +0800 Subject: [PATCH 06/46] auto upgrade version to 2.0.20211214095351 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8adfa9a5b..54d2549b2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211213191328", + "version": "2.0.20211214095351", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From befa9c253d560fceb58f0d0219be55df5a298146 Mon Sep 17 00:00:00 2001 From: guy Date: Wed, 15 Dec 2021 10:14:13 +0800 Subject: [PATCH 07/46] =?UTF-8?q?=E5=88=A4=E6=96=AD=E6=98=AF=E4=B8=8D?= =?UTF-8?q?=E6=98=AFedge=E5=8F=98=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/platform/web/function.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/platform/web/function.js b/src/core/platform/web/function.js index 9a2f5f807..faa40307b 100644 --- a/src/core/platform/web/function.js +++ b/src/core/platform/web/function.js @@ -44,7 +44,7 @@ _.extend(BI, { if(!_global.navigator) { return false; } - return /edge/i.test(navigator.userAgent.toLowerCase()); + return /edg/i.test(navigator.userAgent.toLowerCase()); }, isChrome: function () { @@ -126,4 +126,4 @@ _.extend(BI, { } return false; } -}); \ No newline at end of file +}); From 1815296af64757cdd708a04a3b26af105ce51442 Mon Sep 17 00:00:00 2001 From: data Date: Wed, 15 Dec 2021 10:22:59 +0800 Subject: [PATCH 08/46] auto upgrade version to 2.0.20211215102248 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 54d2549b2..48cbd10ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211214095351", + "version": "2.0.20211215102248", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From f9b90fc10cc71d85adf55546ac39f3086961c065 Mon Sep 17 00:00:00 2001 From: guy Date: Wed, 15 Dec 2021 12:40:34 +0800 Subject: [PATCH 09/46] =?UTF-8?q?router=E6=8D=A2=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/router.js | 3203 ------------------------------- index.html | 1 - src/router/router.js | 3764 +++++++++++++++++++++++++++++++------ src/router/router_old.js | 627 ++++++ webpack/attachments.js | 34 +- webpack/webpack.common.js | 2 + 6 files changed, 3831 insertions(+), 3800 deletions(-) delete mode 100644 dist/router.js create mode 100644 src/router/router_old.js diff --git a/dist/router.js b/dist/router.js deleted file mode 100644 index 93a661d84..000000000 --- a/dist/router.js +++ /dev/null @@ -1,3203 +0,0 @@ -/*! - * vue-router v3.5.2 - * (c) 2021 Evan You - * @license MIT - */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory()); - }(this, (function () { 'use strict'; - - /* */ - - function assert (condition, message) { - if (!condition) { - throw new Error(("[vue-router] " + message)) - } - } - - function warn (condition, message) { - if (!condition) { - typeof console !== 'undefined' && console.warn(("[vue-router] " + message)); - } - } - - function extend (a, b) { - for (var key in b) { - a[key] = b[key]; - } - return a - } - - /* */ - - var encodeReserveRE = /[!'()*]/g; - var encodeReserveReplacer = function (c) { return '%' + c.charCodeAt(0).toString(16); }; - var commaRE = /%2C/g; - - // fixed encodeURIComponent which is more conformant to RFC3986: - // - escapes [!'()*] - // - preserve commas - var encode = function (str) { return encodeURIComponent(str) - .replace(encodeReserveRE, encodeReserveReplacer) - .replace(commaRE, ','); }; - - function decode (str) { - try { - return decodeURIComponent(str) - } catch (err) { - { - warn(false, ("Error decoding \"" + str + "\". Leaving it intact.")); - } - } - return str - } - - function resolveQuery ( - query, - extraQuery, - _parseQuery - ) { - if ( extraQuery === void 0 ) extraQuery = {}; - - var parse = _parseQuery || parseQuery; - var parsedQuery; - try { - parsedQuery = parse(query || ''); - } catch (e) { - warn(false, e.message); - parsedQuery = {}; - } - for (var key in extraQuery) { - var value = extraQuery[key]; - parsedQuery[key] = Array.isArray(value) - ? value.map(castQueryParamValue) - : castQueryParamValue(value); - } - return parsedQuery - } - - var castQueryParamValue = function (value) { return (value == null || typeof value === 'object' ? value : String(value)); }; - - function parseQuery (query) { - var res = {}; - - query = query.trim().replace(/^(\?|#|&)/, ''); - - if (!query) { - return res - } - - query.split('&').forEach(function (param) { - var parts = param.replace(/\+/g, ' ').split('='); - var key = decode(parts.shift()); - var val = parts.length > 0 ? decode(parts.join('=')) : null; - - if (res[key] === undefined) { - res[key] = val; - } else if (Array.isArray(res[key])) { - res[key].push(val); - } else { - res[key] = [res[key], val]; - } - }); - - return res - } - - function stringifyQuery (obj) { - var res = obj - ? Object.keys(obj) - .map(function (key) { - var val = obj[key]; - - if (val === undefined) { - return '' - } - - if (val === null) { - return encode(key) - } - - if (Array.isArray(val)) { - var result = []; - val.forEach(function (val2) { - if (val2 === undefined) { - return - } - if (val2 === null) { - result.push(encode(key)); - } else { - result.push(encode(key) + '=' + encode(val2)); - } - }); - return result.join('&') - } - - return encode(key) + '=' + encode(val) - }) - .filter(function (x) { return x.length > 0; }) - .join('&') - : null; - return res ? ("?" + res) : '' - } - - /* */ - - var trailingSlashRE = /\/?$/; - - function createRoute ( - record, - location, - redirectedFrom, - router - ) { - var stringifyQuery = router && router.options.stringifyQuery; - - var query = location.query || {}; - try { - query = clone(query); - } catch (e) {} - - var route = { - name: location.name || (record && record.name), - meta: (record && record.meta) || {}, - path: location.path || '/', - hash: location.hash || '', - query: query, - params: location.params || {}, - fullPath: getFullPath(location, stringifyQuery), - matched: record ? formatMatch(record) : [] - }; - if (redirectedFrom) { - route.redirectedFrom = getFullPath(redirectedFrom, stringifyQuery); - } - return Object.freeze(route) - } - - function clone (value) { - if (Array.isArray(value)) { - return value.map(clone) - } else if (value && typeof value === 'object') { - var res = {}; - for (var key in value) { - res[key] = clone(value[key]); - } - return res - } else { - return value - } - } - - // the starting route that represents the initial state - var START = createRoute(null, { - path: '/' - }); - - function formatMatch (record) { - var res = []; - while (record) { - res.unshift(record); - record = record.parent; - } - return res - } - - function getFullPath ( - ref, - _stringifyQuery - ) { - var path = ref.path; - var query = ref.query; if ( query === void 0 ) query = {}; - var hash = ref.hash; if ( hash === void 0 ) hash = ''; - - var stringify = _stringifyQuery || stringifyQuery; - return (path || '/') + stringify(query) + hash - } - - function isSameRoute (a, b, onlyPath) { - if (b === START) { - return a === b - } else if (!b) { - return false - } else if (a.path && b.path) { - return a.path.replace(trailingSlashRE, '') === b.path.replace(trailingSlashRE, '') && (onlyPath || - a.hash === b.hash && - isObjectEqual(a.query, b.query)) - } else if (a.name && b.name) { - return ( - a.name === b.name && - (onlyPath || ( - a.hash === b.hash && - isObjectEqual(a.query, b.query) && - isObjectEqual(a.params, b.params)) - ) - ) - } else { - return false - } - } - - function isObjectEqual (a, b) { - if ( a === void 0 ) a = {}; - if ( b === void 0 ) b = {}; - - // handle null value #1566 - if (!a || !b) { return a === b } - var aKeys = Object.keys(a).sort(); - var bKeys = Object.keys(b).sort(); - if (aKeys.length !== bKeys.length) { - return false - } - return aKeys.every(function (key, i) { - var aVal = a[key]; - var bKey = bKeys[i]; - if (bKey !== key) { return false } - var bVal = b[key]; - // query values can be null and undefined - if (aVal == null || bVal == null) { return aVal === bVal } - // check nested equality - if (typeof aVal === 'object' && typeof bVal === 'object') { - return isObjectEqual(aVal, bVal) - } - return String(aVal) === String(bVal) - }) - } - - function isIncludedRoute (current, target) { - return ( - current.path.replace(trailingSlashRE, '/').indexOf( - target.path.replace(trailingSlashRE, '/') - ) === 0 && - (!target.hash || current.hash === target.hash) && - queryIncludes(current.query, target.query) - ) - } - - function queryIncludes (current, target) { - for (var key in target) { - if (!(key in current)) { - return false - } - } - return true - } - - function handleRouteEntered (route) { - for (var i = 0; i < route.matched.length; i++) { - var record = route.matched[i]; - for (var name in record.instances) { - var instance = record.instances[name]; - var cbs = record.enteredCbs[name]; - if (!instance || !cbs) { continue } - delete record.enteredCbs[name]; - for (var i$1 = 0; i$1 < cbs.length; i$1++) { - if (!instance._isBeingDestroyed) { cbs[i$1](instance); } - } - } - } - } - - // var View = { - // name: 'RouterView', - // functional: true, - // props: { - // name: { - // type: String, - // default: 'default' - // } - // }, - // render: function render (_, ref) { - // var props = ref.props; - // var children = ref.children; - // var parent = ref.parent; - // var data = ref.data; - - // // used by devtools to display a router-view badge - // data.routerView = true; - - // // directly use parent context's createElement() function - // // so that components rendered by router-view can resolve named slots - // var h = parent.$createElement; - // var name = props.name; - // var route = parent.$route; - // var cache = parent._routerViewCache || (parent._routerViewCache = {}); - - // // determine current view depth, also check to see if the tree - // // has been toggled inactive but kept-alive. - // var depth = 0; - // var inactive = false; - // while (parent && parent._routerRoot !== parent) { - // var vnodeData = parent.$vnode ? parent.$vnode.data : {}; - // if (vnodeData.routerView) { - // depth++; - // } - // if (vnodeData.keepAlive && parent._directInactive && parent._inactive) { - // inactive = true; - // } - // parent = parent.$parent; - // } - // data.routerViewDepth = depth; - - // // render previous view if the tree is inactive and kept-alive - // if (inactive) { - // var cachedData = cache[name]; - // var cachedComponent = cachedData && cachedData.component; - // if (cachedComponent) { - // // #2301 - // // pass props - // if (cachedData.configProps) { - // fillPropsinData(cachedComponent, data, cachedData.route, cachedData.configProps); - // } - // return h(cachedComponent, data, children) - // } else { - // // render previous empty view - // return h() - // } - // } - - // var matched = route.matched[depth]; - // var component = matched && matched.components[name]; - - // // render empty node if no matched route or no config component - // if (!matched || !component) { - // cache[name] = null; - // return h() - // } - - // // cache component - // cache[name] = { component: component }; - - // // attach instance registration hook - // // this will be called in the instance's injected lifecycle hooks - // data.registerRouteInstance = function (vm, val) { - // // val could be undefined for unregistration - // var current = matched.instances[name]; - // if ( - // (val && current !== vm) || - // (!val && current === vm) - // ) { - // matched.instances[name] = val; - // } - // } - - // // also register instance in prepatch hook - // // in case the same component instance is reused across different routes - // ;(data.hook || (data.hook = {})).prepatch = function (_, vnode) { - // matched.instances[name] = vnode.componentInstance; - // }; - - // // register instance in init hook - // // in case kept-alive component be actived when routes changed - // data.hook.init = function (vnode) { - // if (vnode.data.keepAlive && - // vnode.componentInstance && - // vnode.componentInstance !== matched.instances[name] - // ) { - // matched.instances[name] = vnode.componentInstance; - // } - - // // if the route transition has already been confirmed then we weren't - // // able to call the cbs during confirmation as the component was not - // // registered yet, so we call it here. - // handleRouteEntered(route); - // }; - - // var configProps = matched.props && matched.props[name]; - // // save route and configProps in cache - // if (configProps) { - // extend(cache[name], { - // route: route, - // configProps: configProps - // }); - // fillPropsinData(component, data, route, configProps); - // } - - // return h(component, data, children) - // } - // }; - - // function fillPropsinData (component, data, route, configProps) { - // // resolve props - // var propsToPass = data.props = resolveProps(route, configProps); - // if (propsToPass) { - // // clone to prevent mutation - // propsToPass = data.props = extend({}, propsToPass); - // // pass non-declared props as attrs - // var attrs = data.attrs = data.attrs || {}; - // for (var key in propsToPass) { - // if (!component.props || !(key in component.props)) { - // attrs[key] = propsToPass[key]; - // delete propsToPass[key]; - // } - // } - // } - // } - - // function resolveProps (route, config) { - // switch (typeof config) { - // case 'undefined': - // return - // case 'object': - // return config - // case 'function': - // return config(route) - // case 'boolean': - // return config ? route.params : undefined - // default: - // { - // warn( - // false, - // "props in \"" + (route.path) + "\" is a " + (typeof config) + ", " + - // "expecting an object, function or boolean." - // ); - // } - // } - // } - - /* */ - - function resolvePath ( - relative, - base, - append - ) { - var firstChar = relative.charAt(0); - if (firstChar === '/') { - return relative - } - - if (firstChar === '?' || firstChar === '#') { - return base + relative - } - - var stack = base.split('/'); - - // remove trailing segment if: - // - not appending - // - appending to trailing slash (last segment is empty) - if (!append || !stack[stack.length - 1]) { - stack.pop(); - } - - // resolve relative path - var segments = relative.replace(/^\//, '').split('/'); - for (var i = 0; i < segments.length; i++) { - var segment = segments[i]; - if (segment === '..') { - stack.pop(); - } else if (segment !== '.') { - stack.push(segment); - } - } - - // ensure leading slash - if (stack[0] !== '') { - stack.unshift(''); - } - - return stack.join('/') - } - - function parsePath (path) { - var hash = ''; - var query = ''; - - var hashIndex = path.indexOf('#'); - if (hashIndex >= 0) { - hash = path.slice(hashIndex); - path = path.slice(0, hashIndex); - } - - var queryIndex = path.indexOf('?'); - if (queryIndex >= 0) { - query = path.slice(queryIndex + 1); - path = path.slice(0, queryIndex); - } - - return { - path: path, - query: query, - hash: hash - } - } - - function cleanPath (path) { - return path.replace(/\/\//g, '/') - } - - var isarray = Array.isArray || function (arr) { - return Object.prototype.toString.call(arr) == '[object Array]'; - }; - - /** - * Expose `pathToRegexp`. - */ - var pathToRegexp_1 = pathToRegexp; - var parse_1 = parse; - var compile_1 = compile; - var tokensToFunction_1 = tokensToFunction; - var tokensToRegExp_1 = tokensToRegExp; - - /** - * The main path matching regexp utility. - * - * @type {RegExp} - */ - var PATH_REGEXP = new RegExp([ - // Match escaped characters that would otherwise appear in future matches. - // This allows the user to escape special characters that won't transform. - '(\\\\.)', - // Match Express-style parameters and un-named parameters with a prefix - // and optional suffixes. Matches appear as: - // - // "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?", undefined] - // "/route(\\d+)" => [undefined, undefined, undefined, "\d+", undefined, undefined] - // "/*" => ["/", undefined, undefined, undefined, undefined, "*"] - '([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))' - ].join('|'), 'g'); - - /** - * Parse a string for the raw tokens. - * - * @param {string} str - * @param {Object=} options - * @return {!Array} - */ - function parse (str, options) { - var tokens = []; - var key = 0; - var index = 0; - var path = ''; - var defaultDelimiter = options && options.delimiter || '/'; - var res; - - while ((res = PATH_REGEXP.exec(str)) != null) { - var m = res[0]; - var escaped = res[1]; - var offset = res.index; - path += str.slice(index, offset); - index = offset + m.length; - - // Ignore already escaped sequences. - if (escaped) { - path += escaped[1]; - continue - } - - var next = str[index]; - var prefix = res[2]; - var name = res[3]; - var capture = res[4]; - var group = res[5]; - var modifier = res[6]; - var asterisk = res[7]; - - // Push the current path onto the tokens. - if (path) { - tokens.push(path); - path = ''; - } - - var partial = prefix != null && next != null && next !== prefix; - var repeat = modifier === '+' || modifier === '*'; - var optional = modifier === '?' || modifier === '*'; - var delimiter = res[2] || defaultDelimiter; - var pattern = capture || group; - - tokens.push({ - name: name || key++, - prefix: prefix || '', - delimiter: delimiter, - optional: optional, - repeat: repeat, - partial: partial, - asterisk: !!asterisk, - pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?') - }); - } - - // Match any characters still remaining. - if (index < str.length) { - path += str.substr(index); - } - - // If the path exists, push it onto the end. - if (path) { - tokens.push(path); - } - - return tokens - } - - /** - * Compile a string to a template function for the path. - * - * @param {string} str - * @param {Object=} options - * @return {!function(Object=, Object=)} - */ - function compile (str, options) { - return tokensToFunction(parse(str, options), options) - } - - /** - * Prettier encoding of URI path segments. - * - * @param {string} - * @return {string} - */ - function encodeURIComponentPretty (str) { - return encodeURI(str).replace(/[\/?#]/g, function (c) { - return '%' + c.charCodeAt(0).toString(16).toUpperCase() - }) - } - - /** - * Encode the asterisk parameter. Similar to `pretty`, but allows slashes. - * - * @param {string} - * @return {string} - */ - function encodeAsterisk (str) { - return encodeURI(str).replace(/[?#]/g, function (c) { - return '%' + c.charCodeAt(0).toString(16).toUpperCase() - }) - } - - /** - * Expose a method for transforming tokens into the path function. - */ - function tokensToFunction (tokens, options) { - // Compile all the tokens into regexps. - var matches = new Array(tokens.length); - - // Compile all the patterns before compilation. - for (var i = 0; i < tokens.length; i++) { - if (typeof tokens[i] === 'object') { - matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$', flags(options)); - } - } - - return function (obj, opts) { - var path = ''; - var data = obj || {}; - var options = opts || {}; - var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent; - - for (var i = 0; i < tokens.length; i++) { - var token = tokens[i]; - - if (typeof token === 'string') { - path += token; - - continue - } - - var value = data[token.name]; - var segment; - - if (value == null) { - if (token.optional) { - // Prepend partial segment prefixes. - if (token.partial) { - path += token.prefix; - } - - continue - } else { - throw new TypeError('Expected "' + token.name + '" to be defined') - } - } - - if (isarray(value)) { - if (!token.repeat) { - throw new TypeError('Expected "' + token.name + '" to not repeat, but received `' + JSON.stringify(value) + '`') - } - - if (value.length === 0) { - if (token.optional) { - continue - } else { - throw new TypeError('Expected "' + token.name + '" to not be empty') - } - } - - for (var j = 0; j < value.length; j++) { - segment = encode(value[j]); - - if (!matches[i].test(segment)) { - throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '", but received `' + JSON.stringify(segment) + '`') - } - - path += (j === 0 ? token.prefix : token.delimiter) + segment; - } - - continue - } - - segment = token.asterisk ? encodeAsterisk(value) : encode(value); - - if (!matches[i].test(segment)) { - throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but received "' + segment + '"') - } - - path += token.prefix + segment; - } - - return path - } - } - - /** - * Escape a regular expression string. - * - * @param {string} str - * @return {string} - */ - function escapeString (str) { - return str.replace(/([.+*?=^!:${}()[\]|\/\\])/g, '\\$1') - } - - /** - * Escape the capturing group by escaping special characters and meaning. - * - * @param {string} group - * @return {string} - */ - function escapeGroup (group) { - return group.replace(/([=!:$\/()])/g, '\\$1') - } - - /** - * Attach the keys as a property of the regexp. - * - * @param {!RegExp} re - * @param {Array} keys - * @return {!RegExp} - */ - function attachKeys (re, keys) { - re.keys = keys; - return re - } - - /** - * Get the flags for a regexp from the options. - * - * @param {Object} options - * @return {string} - */ - function flags (options) { - return options && options.sensitive ? '' : 'i' - } - - /** - * Pull out keys from a regexp. - * - * @param {!RegExp} path - * @param {!Array} keys - * @return {!RegExp} - */ - function regexpToRegexp (path, keys) { - // Use a negative lookahead to match only capturing groups. - var groups = path.source.match(/\((?!\?)/g); - - if (groups) { - for (var i = 0; i < groups.length; i++) { - keys.push({ - name: i, - prefix: null, - delimiter: null, - optional: false, - repeat: false, - partial: false, - asterisk: false, - pattern: null - }); - } - } - - return attachKeys(path, keys) - } - - /** - * Transform an array into a regexp. - * - * @param {!Array} path - * @param {Array} keys - * @param {!Object} options - * @return {!RegExp} - */ - function arrayToRegexp (path, keys, options) { - var parts = []; - - for (var i = 0; i < path.length; i++) { - parts.push(pathToRegexp(path[i], keys, options).source); - } - - var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options)); - - return attachKeys(regexp, keys) - } - - /** - * Create a path regexp from string input. - * - * @param {string} path - * @param {!Array} keys - * @param {!Object} options - * @return {!RegExp} - */ - function stringToRegexp (path, keys, options) { - return tokensToRegExp(parse(path, options), keys, options) - } - - /** - * Expose a function for taking tokens and returning a RegExp. - * - * @param {!Array} tokens - * @param {(Array|Object)=} keys - * @param {Object=} options - * @return {!RegExp} - */ - function tokensToRegExp (tokens, keys, options) { - if (!isarray(keys)) { - options = /** @type {!Object} */ (keys || options); - keys = []; - } - - options = options || {}; - - var strict = options.strict; - var end = options.end !== false; - var route = ''; - - // Iterate over the tokens and create our regexp string. - for (var i = 0; i < tokens.length; i++) { - var token = tokens[i]; - - if (typeof token === 'string') { - route += escapeString(token); - } else { - var prefix = escapeString(token.prefix); - var capture = '(?:' + token.pattern + ')'; - - keys.push(token); - - if (token.repeat) { - capture += '(?:' + prefix + capture + ')*'; - } - - if (token.optional) { - if (!token.partial) { - capture = '(?:' + prefix + '(' + capture + '))?'; - } else { - capture = prefix + '(' + capture + ')?'; - } - } else { - capture = prefix + '(' + capture + ')'; - } - - route += capture; - } - } - - var delimiter = escapeString(options.delimiter || '/'); - var endsWithDelimiter = route.slice(-delimiter.length) === delimiter; - - // In non-strict mode we allow a slash at the end of match. If the path to - // match already ends with a slash, we remove it for consistency. The slash - // is valid at the end of a path match, not in the middle. This is important - // in non-ending mode, where "/test/" shouldn't match "/test//route". - if (!strict) { - route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'; - } - - if (end) { - route += '$'; - } else { - // In non-ending mode, we need the capturing groups to match as much as - // possible by using a positive lookahead to the end or next path segment. - route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'; - } - - return attachKeys(new RegExp('^' + route, flags(options)), keys) - } - - /** - * Normalize the given path string, returning a regular expression. - * - * An empty array can be passed in for the keys, which will hold the - * placeholder key descriptions. For example, using `/user/:id`, `keys` will - * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`. - * - * @param {(string|RegExp|Array)} path - * @param {(Array|Object)=} keys - * @param {Object=} options - * @return {!RegExp} - */ - function pathToRegexp (path, keys, options) { - if (!isarray(keys)) { - options = /** @type {!Object} */ (keys || options); - keys = []; - } - - options = options || {}; - - if (path instanceof RegExp) { - return regexpToRegexp(path, /** @type {!Array} */ (keys)) - } - - if (isarray(path)) { - return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options) - } - - return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options) - } - pathToRegexp_1.parse = parse_1; - pathToRegexp_1.compile = compile_1; - pathToRegexp_1.tokensToFunction = tokensToFunction_1; - pathToRegexp_1.tokensToRegExp = tokensToRegExp_1; - - /* */ - - // $flow-disable-line - var regexpCompileCache = Object.create(null); - - function fillParams ( - path, - params, - routeMsg - ) { - params = params || {}; - try { - var filler = - regexpCompileCache[path] || - (regexpCompileCache[path] = pathToRegexp_1.compile(path)); - - // Fix #2505 resolving asterisk routes { name: 'not-found', params: { pathMatch: '/not-found' }} - // and fix #3106 so that you can work with location descriptor object having params.pathMatch equal to empty string - if (typeof params.pathMatch === 'string') { params[0] = params.pathMatch; } - - return filler(params, { pretty: true }) - } catch (e) { - { - // Fix #3072 no warn if `pathMatch` is string - warn(typeof params.pathMatch === 'string', ("missing param for " + routeMsg + ": " + (e.message))); - } - return '' - } finally { - // delete the 0 if it was added - delete params[0]; - } - } - - /* */ - - function normalizeLocation ( - raw, - current, - append, - router - ) { - var next = typeof raw === 'string' ? { path: raw } : raw; - // named target - if (next._normalized) { - return next - } else if (next.name) { - next = extend({}, raw); - var params = next.params; - if (params && typeof params === 'object') { - next.params = extend({}, params); - } - return next - } - - // relative params - if (!next.path && next.params && current) { - next = extend({}, next); - next._normalized = true; - var params$1 = extend(extend({}, current.params), next.params); - if (current.name) { - next.name = current.name; - next.params = params$1; - } else if (current.matched.length) { - var rawPath = current.matched[current.matched.length - 1].path; - next.path = fillParams(rawPath, params$1, ("path " + (current.path))); - } else { - warn(false, "relative params navigation requires a current route."); - } - return next - } - - var parsedPath = parsePath(next.path || ''); - var basePath = (current && current.path) || '/'; - var path = parsedPath.path - ? resolvePath(parsedPath.path, basePath, append || next.append) - : basePath; - - var query = resolveQuery( - parsedPath.query, - next.query, - router && router.options.parseQuery - ); - - var hash = next.hash || parsedPath.hash; - if (hash && hash.charAt(0) !== '#') { - hash = "#" + hash; - } - - return { - _normalized: true, - path: path, - query: query, - hash: hash - } - } - - // var toTypes = [String, Object]; - // var eventTypes = [String, Array]; - - // var noop = function () {}; - - // var warnedCustomSlot; - // var warnedTagProp; - // var warnedEventProp; - - // var Link = { - // name: 'RouterLink', - // props: { - // to: { - // type: toTypes, - // required: true - // }, - // tag: { - // type: String, - // default: 'a' - // }, - // custom: Boolean, - // exact: Boolean, - // exactPath: Boolean, - // append: Boolean, - // replace: Boolean, - // activeClass: String, - // exactActiveClass: String, - // ariaCurrentValue: { - // type: String, - // default: 'page' - // }, - // event: { - // type: eventTypes, - // default: 'click' - // } - // }, - // render: function render (h) { - // var this$1 = this; - - // var router = this.$router; - // var current = this.$route; - // var ref = router.resolve( - // this.to, - // current, - // this.append - // ); - // var location = ref.location; - // var route = ref.route; - // var href = ref.href; - - // var classes = {}; - // var globalActiveClass = router.options.linkActiveClass; - // var globalExactActiveClass = router.options.linkExactActiveClass; - // // Support global empty active class - // var activeClassFallback = - // globalActiveClass == null ? 'router-link-active' : globalActiveClass; - // var exactActiveClassFallback = - // globalExactActiveClass == null - // ? 'router-link-exact-active' - // : globalExactActiveClass; - // var activeClass = - // this.activeClass == null ? activeClassFallback : this.activeClass; - // var exactActiveClass = - // this.exactActiveClass == null - // ? exactActiveClassFallback - // : this.exactActiveClass; - - // var compareTarget = route.redirectedFrom - // ? createRoute(null, normalizeLocation(route.redirectedFrom), null, router) - // : route; - - // classes[exactActiveClass] = isSameRoute(current, compareTarget, this.exactPath); - // classes[activeClass] = this.exact || this.exactPath - // ? classes[exactActiveClass] - // : isIncludedRoute(current, compareTarget); - - // var ariaCurrentValue = classes[exactActiveClass] ? this.ariaCurrentValue : null; - - // var handler = function (e) { - // if (guardEvent(e)) { - // if (this$1.replace) { - // router.replace(location, noop); - // } else { - // router.push(location, noop); - // } - // } - // }; - - // var on = { click: guardEvent }; - // if (Array.isArray(this.event)) { - // this.event.forEach(function (e) { - // on[e] = handler; - // }); - // } else { - // on[this.event] = handler; - // } - - // var data = { class: classes }; - - // var scopedSlot = - // !this.$scopedSlots.$hasNormal && - // this.$scopedSlots.default && - // this.$scopedSlots.default({ - // href: href, - // route: route, - // navigate: handler, - // isActive: classes[activeClass], - // isExactActive: classes[exactActiveClass] - // }); - - // if (scopedSlot) { - // if (!this.custom) { - // !warnedCustomSlot && warn(false, 'In Vue Router 4, the v-slot API will by default wrap its content with an element. Use the custom prop to remove this warning:\n\n'); - // warnedCustomSlot = true; - // } - // if (scopedSlot.length === 1) { - // return scopedSlot[0] - // } else if (scopedSlot.length > 1 || !scopedSlot.length) { - // { - // warn( - // false, - // (" with to=\"" + (this.to) + "\" is trying to use a scoped slot but it didn't provide exactly one child. Wrapping the content with a span element.") - // ); - // } - // return scopedSlot.length === 0 ? h() : h('span', {}, scopedSlot) - // } - // } - - // { - // if ('tag' in this.$options.propsData && !warnedTagProp) { - // warn( - // false, - // "'s tag prop is deprecated and has been removed in Vue Router 4. Use the v-slot API to remove this warning: https://next.router.vuejs.org/guide/migration/#removal-of-event-and-tag-props-in-router-link." - // ); - // warnedTagProp = true; - // } - // if ('event' in this.$options.propsData && !warnedEventProp) { - // warn( - // false, - // "'s event prop is deprecated and has been removed in Vue Router 4. Use the v-slot API to remove this warning: https://next.router.vuejs.org/guide/migration/#removal-of-event-and-tag-props-in-router-link." - // ); - // warnedEventProp = true; - // } - // } - - // if (this.tag === 'a') { - // data.on = on; - // data.attrs = { href: href, 'aria-current': ariaCurrentValue }; - // } else { - // // find the first child and apply listener and href - // var a = findAnchor(this.$slots.default); - // if (a) { - // // in case the is a static node - // a.isStatic = false; - // var aData = (a.data = extend({}, a.data)); - // aData.on = aData.on || {}; - // // transform existing events in both objects into arrays so we can push later - // for (var event in aData.on) { - // var handler$1 = aData.on[event]; - // if (event in on) { - // aData.on[event] = Array.isArray(handler$1) ? handler$1 : [handler$1]; - // } - // } - // // append new listeners for router-link - // for (var event$1 in on) { - // if (event$1 in aData.on) { - // // on[event] is always a function - // aData.on[event$1].push(on[event$1]); - // } else { - // aData.on[event$1] = handler; - // } - // } - - // var aAttrs = (a.data.attrs = extend({}, a.data.attrs)); - // aAttrs.href = href; - // aAttrs['aria-current'] = ariaCurrentValue; - // } else { - // // doesn't have child, apply listener to self - // data.on = on; - // } - // } - - // return h(this.tag, data, this.$slots.default) - // } - // }; - - function guardEvent (e) { - // don't redirect with control keys - if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) { return } - // don't redirect when preventDefault called - if (e.defaultPrevented) { return } - // don't redirect on right click - if (e.button !== undefined && e.button !== 0) { return } - // don't redirect if `target="_blank"` - if (e.currentTarget && e.currentTarget.getAttribute) { - var target = e.currentTarget.getAttribute('target'); - if (/\b_blank\b/i.test(target)) { return } - } - // this may be a Weex event which doesn't have this method - if (e.preventDefault) { - e.preventDefault(); - } - return true - } - - function findAnchor (children) { - if (children) { - var child; - for (var i = 0; i < children.length; i++) { - child = children[i]; - if (child.tag === 'a') { - return child - } - if (child.children && (child = findAnchor(child.children))) { - return child - } - } - } - } - - // var _Vue; - - // function install (Vue) { - // if (install.installed && _Vue === Vue) { return } - // install.installed = true; - - // _Vue = Vue; - - // var isDef = function (v) { return v !== undefined; }; - - // var registerInstance = function (vm, callVal) { - // var i = vm.$options._parentVnode; - // if (isDef(i) && isDef(i = i.data) && isDef(i = i.registerRouteInstance)) { - // i(vm, callVal); - // } - // }; - - // Vue.mixin({ - // beforeCreate: function beforeCreate () { - // if (isDef(this.$options.router)) { - // this._routerRoot = this; - // this._router = this.$options.router; - // this._router.init(this); - // Vue.util.defineReactive(this, '_route', this._router.history.current); - // } else { - // this._routerRoot = (this.$parent && this.$parent._routerRoot) || this; - // } - // registerInstance(this, this); - // }, - // destroyed: function destroyed () { - // registerInstance(this); - // } - // }); - - // Object.defineProperty(Vue.prototype, '$router', { - // get: function get () { return this._routerRoot._router } - // }); - - // Object.defineProperty(Vue.prototype, '$route', { - // get: function get () { return this._routerRoot._route } - // }); - - // Vue.component('RouterView', View); - // Vue.component('RouterLink', Link); - - // var strats = Vue.config.optionMergeStrategies; - // // use the same hook merging strategy for route hooks - // strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created; - // } - - /* */ - - var inBrowser = typeof window !== 'undefined'; - - /* */ - - function createRouteMap ( - routes, - oldPathList, - oldPathMap, - oldNameMap, - parentRoute - ) { - // the path list is used to control path matching priority - var pathList = oldPathList || []; - // $flow-disable-line - var pathMap = oldPathMap || Object.create(null); - // $flow-disable-line - var nameMap = oldNameMap || Object.create(null); - - routes.forEach(function (route) { - addRouteRecord(pathList, pathMap, nameMap, route, parentRoute); - }); - - // ensure wildcard routes are always at the end - for (var i = 0, l = pathList.length; i < l; i++) { - if (pathList[i] === '*') { - pathList.push(pathList.splice(i, 1)[0]); - l--; - i--; - } - } - - { - // warn if routes do not include leading slashes - var found = pathList - // check for missing leading slash - .filter(function (path) { return path && path.charAt(0) !== '*' && path.charAt(0) !== '/'; }); - - if (found.length > 0) { - var pathNames = found.map(function (path) { return ("- " + path); }).join('\n'); - warn(false, ("Non-nested routes must include a leading slash character. Fix the following routes: \n" + pathNames)); - } - } - - return { - pathList: pathList, - pathMap: pathMap, - nameMap: nameMap - } - } - - function addRouteRecord ( - pathList, - pathMap, - nameMap, - route, - parent, - matchAs - ) { - var path = route.path; - var name = route.name; - { - assert(path != null, "\"path\" is required in a route configuration."); - assert( - typeof route.component !== 'string', - "route config \"component\" for path: " + (String( - path || name - )) + " cannot be a " + "string id. Use an actual component instead." - ); - - warn( - // eslint-disable-next-line no-control-regex - !/[^\u0000-\u007F]+/.test(path), - "Route with path \"" + path + "\" contains unencoded characters, make sure " + - "your path is correctly encoded before passing it to the router. Use " + - "encodeURI to encode static segments of your path." - ); - } - - var pathToRegexpOptions = - route.pathToRegexpOptions || {}; - var normalizedPath = normalizePath(path, parent, pathToRegexpOptions.strict); - - if (typeof route.caseSensitive === 'boolean') { - pathToRegexpOptions.sensitive = route.caseSensitive; - } - - var record = { - path: normalizedPath, - regex: compileRouteRegex(normalizedPath, pathToRegexpOptions), - components: route.components || { default: route.component }, - alias: route.alias - ? typeof route.alias === 'string' - ? [route.alias] - : route.alias - : [], - instances: {}, - enteredCbs: {}, - name: name, - parent: parent, - matchAs: matchAs, - redirect: route.redirect, - beforeEnter: route.beforeEnter, - meta: route.meta || {}, - props: - route.props == null - ? {} - : route.components - ? route.props - : { default: route.props } - }; - - if (route.children) { - // Warn if route is named, does not redirect and has a default child route. - // If users navigate to this route by name, the default child will - // not be rendered (GH Issue #629) - { - if ( - route.name && - !route.redirect && - route.children.some(function (child) { return /^\/?$/.test(child.path); }) - ) { - warn( - false, - "Named Route '" + (route.name) + "' has a default child route. " + - "When navigating to this named route (:to=\"{name: '" + (route.name) + "'\"), " + - "the default child route will not be rendered. Remove the name from " + - "this route and use the name of the default child route for named " + - "links instead." - ); - } - } - route.children.forEach(function (child) { - var childMatchAs = matchAs - ? cleanPath((matchAs + "/" + (child.path))) - : undefined; - addRouteRecord(pathList, pathMap, nameMap, child, record, childMatchAs); - }); - } - - if (!pathMap[record.path]) { - pathList.push(record.path); - pathMap[record.path] = record; - } - - if (route.alias !== undefined) { - var aliases = Array.isArray(route.alias) ? route.alias : [route.alias]; - for (var i = 0; i < aliases.length; ++i) { - var alias = aliases[i]; - if (alias === path) { - warn( - false, - ("Found an alias with the same value as the path: \"" + path + "\". You have to remove that alias. It will be ignored in development.") - ); - // skip in dev to make it work - continue - } - - var aliasRoute = { - path: alias, - children: route.children - }; - addRouteRecord( - pathList, - pathMap, - nameMap, - aliasRoute, - parent, - record.path || '/' // matchAs - ); - } - } - - if (name) { - if (!nameMap[name]) { - nameMap[name] = record; - } else if (!matchAs) { - warn( - false, - "Duplicate named routes definition: " + - "{ name: \"" + name + "\", path: \"" + (record.path) + "\" }" - ); - } - } - } - - function compileRouteRegex ( - path, - pathToRegexpOptions - ) { - var regex = pathToRegexp_1(path, [], pathToRegexpOptions); - { - var keys = Object.create(null); - regex.keys.forEach(function (key) { - warn( - !keys[key.name], - ("Duplicate param keys in route with path: \"" + path + "\"") - ); - keys[key.name] = true; - }); - } - return regex - } - - function normalizePath ( - path, - parent, - strict - ) { - if (!strict) { path = path.replace(/\/$/, ''); } - if (path[0] === '/') { return path } - if (parent == null) { return path } - return cleanPath(((parent.path) + "/" + path)) - } - - /* */ - - - - function createMatcher ( - routes, - router - ) { - var ref = createRouteMap(routes); - var pathList = ref.pathList; - var pathMap = ref.pathMap; - var nameMap = ref.nameMap; - - function addRoutes (routes) { - createRouteMap(routes, pathList, pathMap, nameMap); - } - - function addRoute (parentOrRoute, route) { - var parent = (typeof parentOrRoute !== 'object') ? nameMap[parentOrRoute] : undefined; - // $flow-disable-line - createRouteMap([route || parentOrRoute], pathList, pathMap, nameMap, parent); - - // add aliases of parent - if (parent && parent.alias.length) { - createRouteMap( - // $flow-disable-line route is defined if parent is - parent.alias.map(function (alias) { return ({ path: alias, children: [route] }); }), - pathList, - pathMap, - nameMap, - parent - ); - } - } - - function getRoutes () { - return pathList.map(function (path) { return pathMap[path]; }) - } - - function match ( - raw, - currentRoute, - redirectedFrom - ) { - var location = normalizeLocation(raw, currentRoute, false, router); - var name = location.name; - - if (name) { - var record = nameMap[name]; - { - warn(record, ("Route with name '" + name + "' does not exist")); - } - if (!record) { return _createRoute(null, location) } - var paramNames = record.regex.keys - .filter(function (key) { return !key.optional; }) - .map(function (key) { return key.name; }); - - if (typeof location.params !== 'object') { - location.params = {}; - } - - if (currentRoute && typeof currentRoute.params === 'object') { - for (var key in currentRoute.params) { - if (!(key in location.params) && paramNames.indexOf(key) > -1) { - location.params[key] = currentRoute.params[key]; - } - } - } - - location.path = fillParams(record.path, location.params, ("named route \"" + name + "\"")); - return _createRoute(record, location, redirectedFrom) - } else if (location.path) { - location.params = {}; - for (var i = 0; i < pathList.length; i++) { - var path = pathList[i]; - var record$1 = pathMap[path]; - if (matchRoute(record$1.regex, location.path, location.params)) { - return _createRoute(record$1, location, redirectedFrom) - } - } - } - // no match - return _createRoute(null, location) - } - - function redirect ( - record, - location - ) { - var originalRedirect = record.redirect; - var redirect = typeof originalRedirect === 'function' - ? originalRedirect(createRoute(record, location, null, router)) - : originalRedirect; - - if (typeof redirect === 'string') { - redirect = { path: redirect }; - } - - if (!redirect || typeof redirect !== 'object') { - { - warn( - false, ("invalid redirect option: " + (JSON.stringify(redirect))) - ); - } - return _createRoute(null, location) - } - - var re = redirect; - var name = re.name; - var path = re.path; - var query = location.query; - var hash = location.hash; - var params = location.params; - query = re.hasOwnProperty('query') ? re.query : query; - hash = re.hasOwnProperty('hash') ? re.hash : hash; - params = re.hasOwnProperty('params') ? re.params : params; - - if (name) { - // resolved named direct - var targetRecord = nameMap[name]; - { - assert(targetRecord, ("redirect failed: named route \"" + name + "\" not found.")); - } - return match({ - _normalized: true, - name: name, - query: query, - hash: hash, - params: params - }, undefined, location) - } else if (path) { - // 1. resolve relative redirect - var rawPath = resolveRecordPath(path, record); - // 2. resolve params - var resolvedPath = fillParams(rawPath, params, ("redirect route with path \"" + rawPath + "\"")); - // 3. rematch with existing query and hash - return match({ - _normalized: true, - path: resolvedPath, - query: query, - hash: hash - }, undefined, location) - } else { - { - warn(false, ("invalid redirect option: " + (JSON.stringify(redirect)))); - } - return _createRoute(null, location) - } - } - - function alias ( - record, - location, - matchAs - ) { - var aliasedPath = fillParams(matchAs, location.params, ("aliased route with path \"" + matchAs + "\"")); - var aliasedMatch = match({ - _normalized: true, - path: aliasedPath - }); - if (aliasedMatch) { - var matched = aliasedMatch.matched; - var aliasedRecord = matched[matched.length - 1]; - location.params = aliasedMatch.params; - return _createRoute(aliasedRecord, location) - } - return _createRoute(null, location) - } - - function _createRoute ( - record, - location, - redirectedFrom - ) { - if (record && record.redirect) { - return redirect(record, redirectedFrom || location) - } - if (record && record.matchAs) { - return alias(record, location, record.matchAs) - } - return createRoute(record, location, redirectedFrom, router) - } - - return { - match: match, - addRoute: addRoute, - getRoutes: getRoutes, - addRoutes: addRoutes - } - } - - function matchRoute ( - regex, - path, - params - ) { - var m = path.match(regex); - - if (!m) { - return false - } else if (!params) { - return true - } - - for (var i = 1, len = m.length; i < len; ++i) { - var key = regex.keys[i - 1]; - if (key) { - // Fix #1994: using * with props: true generates a param named 0 - params[key.name || 'pathMatch'] = typeof m[i] === 'string' ? decode(m[i]) : m[i]; - } - } - - return true - } - - function resolveRecordPath (path, record) { - return resolvePath(path, record.parent ? record.parent.path : '/', true) - } - - /* */ - - // use User Timing api (if present) for more accurate key precision - var Time = - inBrowser && window.performance && window.performance.now - ? window.performance - : Date; - - function genStateKey () { - return Time.now().toFixed(3) - } - - var _key = genStateKey(); - - function getStateKey () { - return _key - } - - function setStateKey (key) { - return (_key = key) - } - - /* */ - - var positionStore = Object.create(null); - - function setupScroll () { - // Prevent browser scroll behavior on History popstate - if ('scrollRestoration' in window.history) { - window.history.scrollRestoration = 'manual'; - } - // Fix for #1585 for Firefox - // Fix for #2195 Add optional third attribute to workaround a bug in safari https://bugs.webkit.org/show_bug.cgi?id=182678 - // Fix for #2774 Support for apps loaded from Windows file shares not mapped to network drives: replaced location.origin with - // window.location.protocol + '//' + window.location.host - // location.host contains the port and location.hostname doesn't - var protocolAndPath = window.location.protocol + '//' + window.location.host; - var absolutePath = window.location.href.replace(protocolAndPath, ''); - // preserve existing history state as it could be overriden by the user - var stateCopy = extend({}, window.history.state); - stateCopy.key = getStateKey(); - window.history.replaceState(stateCopy, '', absolutePath); - window.addEventListener('popstate', handlePopState); - return function () { - window.removeEventListener('popstate', handlePopState); - } - } - - function handleScroll ( - router, - to, - from, - isPop - ) { - if (!router.app) { - return - } - - var behavior = router.options.scrollBehavior; - if (!behavior) { - return - } - - { - assert(typeof behavior === 'function', "scrollBehavior must be a function"); - } - - // wait until re-render finishes before scrolling - BI.nextTick(function () { - var position = getScrollPosition(); - var shouldScroll = behavior.call( - router, - to, - from, - isPop ? position : null - ); - - if (!shouldScroll) { - return - } - - if (typeof shouldScroll.then === 'function') { - shouldScroll - .then(function (shouldScroll) { - scrollToPosition((shouldScroll), position); - }) - .catch(function (err) { - { - assert(false, err.toString()); - } - }); - } else { - scrollToPosition(shouldScroll, position); - } - }); - } - - function saveScrollPosition () { - var key = getStateKey(); - if (key) { - positionStore[key] = { - x: window.pageXOffset, - y: window.pageYOffset - }; - } - } - - function handlePopState (e) { - saveScrollPosition(); - if (e.state && e.state.key) { - setStateKey(e.state.key); - } - } - - function getScrollPosition () { - var key = getStateKey(); - if (key) { - return positionStore[key] - } - } - - function getElementPosition (el, offset) { - var docEl = document.documentElement; - var docRect = docEl.getBoundingClientRect(); - var elRect = el.getBoundingClientRect(); - return { - x: elRect.left - docRect.left - offset.x, - y: elRect.top - docRect.top - offset.y - } - } - - function isValidPosition (obj) { - return isNumber(obj.x) || isNumber(obj.y) - } - - function normalizePosition (obj) { - return { - x: isNumber(obj.x) ? obj.x : window.pageXOffset, - y: isNumber(obj.y) ? obj.y : window.pageYOffset - } - } - - function normalizeOffset (obj) { - return { - x: isNumber(obj.x) ? obj.x : 0, - y: isNumber(obj.y) ? obj.y : 0 - } - } - - function isNumber (v) { - return typeof v === 'number' - } - - var hashStartsWithNumberRE = /^#\d/; - - function scrollToPosition (shouldScroll, position) { - var isObject = typeof shouldScroll === 'object'; - if (isObject && typeof shouldScroll.selector === 'string') { - // getElementById would still fail if the selector contains a more complicated query like #main[data-attr] - // but at the same time, it doesn't make much sense to select an element with an id and an extra selector - var el = hashStartsWithNumberRE.test(shouldScroll.selector) // $flow-disable-line - ? document.getElementById(shouldScroll.selector.slice(1)) // $flow-disable-line - : document.querySelector(shouldScroll.selector); - - if (el) { - var offset = - shouldScroll.offset && typeof shouldScroll.offset === 'object' - ? shouldScroll.offset - : {}; - offset = normalizeOffset(offset); - position = getElementPosition(el, offset); - } else if (isValidPosition(shouldScroll)) { - position = normalizePosition(shouldScroll); - } - } else if (isObject && isValidPosition(shouldScroll)) { - position = normalizePosition(shouldScroll); - } - - if (position) { - // $flow-disable-line - if ('scrollBehavior' in document.documentElement.style) { - window.scrollTo({ - left: position.x, - top: position.y, - // $flow-disable-line - behavior: shouldScroll.behavior - }); - } else { - window.scrollTo(position.x, position.y); - } - } - } - - /* */ - - var supportsPushState = - inBrowser && - (function () { - var ua = window.navigator.userAgent; - - if ( - (ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && - ua.indexOf('Mobile Safari') !== -1 && - ua.indexOf('Chrome') === -1 && - ua.indexOf('Windows Phone') === -1 - ) { - return false - } - - return window.history && typeof window.history.pushState === 'function' - })(); - - function pushState (url, replace) { - saveScrollPosition(); - // try...catch the pushState call to get around Safari - // DOM Exception 18 where it limits to 100 pushState calls - var history = window.history; - try { - if (replace) { - // preserve existing history state as it could be overriden by the user - var stateCopy = extend({}, history.state); - stateCopy.key = getStateKey(); - history.replaceState(stateCopy, '', url); - } else { - history.pushState({ key: setStateKey(genStateKey()) }, '', url); - } - } catch (e) { - window.location[replace ? 'replace' : 'assign'](url); - } - } - - function replaceState (url) { - pushState(url, true); - } - - /* */ - - function runQueue (queue, fn, cb) { - var step = function (index) { - if (index >= queue.length) { - cb(); - } else { - if (queue[index]) { - fn(queue[index], function () { - step(index + 1); - }); - } else { - step(index + 1); - } - } - }; - step(0); - } - - // When changing thing, also edit router.d.ts - var NavigationFailureType = { - redirected: 2, - aborted: 4, - cancelled: 8, - duplicated: 16 - }; - - function createNavigationRedirectedError (from, to) { - return createRouterError( - from, - to, - NavigationFailureType.redirected, - ("Redirected when going from \"" + (from.fullPath) + "\" to \"" + (stringifyRoute( - to - )) + "\" via a navigation guard.") - ) - } - - function createNavigationDuplicatedError (from, to) { - var error = createRouterError( - from, - to, - NavigationFailureType.duplicated, - ("Avoided redundant navigation to current location: \"" + (from.fullPath) + "\".") - ); - // backwards compatible with the first introduction of Errors - error.name = 'NavigationDuplicated'; - return error - } - - function createNavigationCancelledError (from, to) { - return createRouterError( - from, - to, - NavigationFailureType.cancelled, - ("Navigation cancelled from \"" + (from.fullPath) + "\" to \"" + (to.fullPath) + "\" with a new navigation.") - ) - } - - function createNavigationAbortedError (from, to) { - return createRouterError( - from, - to, - NavigationFailureType.aborted, - ("Navigation aborted from \"" + (from.fullPath) + "\" to \"" + (to.fullPath) + "\" via a navigation guard.") - ) - } - - function createRouterError (from, to, type, message) { - var error = new Error(message); - error._isRouter = true; - error.from = from; - error.to = to; - error.type = type; - - return error - } - - var propertiesToLog = ['params', 'query', 'hash']; - - function stringifyRoute (to) { - if (typeof to === 'string') { return to } - if ('path' in to) { return to.path } - var location = {}; - propertiesToLog.forEach(function (key) { - if (key in to) { location[key] = to[key]; } - }); - return JSON.stringify(location, null, 2) - } - - function isError (err) { - return Object.prototype.toString.call(err).indexOf('Error') > -1 - } - - function isNavigationFailure (err, errorType) { - return ( - isError(err) && - err._isRouter && - (errorType == null || err.type === errorType) - ) - } - - /* */ - - function resolveAsyncComponents (matched) { - return function (to, from, next) { - var hasAsync = false; - var pending = 0; - var error = null; - - flatMapComponents(matched, function (def, _, match, key) { - // if it's a function and doesn't have cid attached, - // assume it's an async component resolve function. - // we are not using Vue's default async resolving mechanism because - // we want to halt the navigation until the incoming component has been - // resolved. - if (typeof def === 'function' && def.cid === undefined) { - hasAsync = true; - pending++; - - var resolve = once(function (resolvedDef) { - if (isESModule(resolvedDef)) { - resolvedDef = resolvedDef.default; - } - // save resolved on async factory in case it's used elsewhere - def.resolved = resolvedDef; - match.components[key] = resolvedDef; - pending--; - if (pending <= 0) { - next(); - } - }); - - var reject = once(function (reason) { - var msg = "Failed to resolve async component " + key + ": " + reason; - warn(false, msg); - if (!error) { - error = isError(reason) - ? reason - : new Error(msg); - next(error); - } - }); - - var res; - try { - res = def(resolve, reject); - } catch (e) { - reject(e); - } - if (res) { - if (typeof res.then === 'function') { - res.then(resolve, reject); - } else { - // new syntax in Vue 2.3 - var comp = res.component; - if (comp && typeof comp.then === 'function') { - comp.then(resolve, reject); - } - } - } - } - }); - - if (!hasAsync) { next(); } - } - } - - function flatMapComponents ( - matched, - fn - ) { - return flatten(matched.map(function (m) { - return Object.keys(m.components).map(function (key) { return fn( - m.components[key], - m.instances[key], - m, key - ); }) - })) - } - - function flatten (arr) { - return Array.prototype.concat.apply([], arr) - } - - var hasSymbol = - typeof Symbol === 'function' && - typeof Symbol.toStringTag === 'symbol'; - - function isESModule (obj) { - return obj.__esModule || (hasSymbol && obj[Symbol.toStringTag] === 'Module') - } - - // in Webpack 2, require.ensure now also returns a Promise - // so the resolve/reject functions may get called an extra time - // if the user uses an arrow function shorthand that happens to - // return that Promise. - function once (fn) { - var called = false; - return function () { - var args = [], len = arguments.length; - while ( len-- ) args[ len ] = arguments[ len ]; - - if (called) { return } - called = true; - return fn.apply(this, args) - } - } - - /* */ - - var History = function History (router, base) { - this.router = router; - this.base = normalizeBase(base); - // start with a route object that stands for "nowhere" - this.current = START; - this.pending = null; - this.ready = false; - this.readyCbs = []; - this.readyErrorCbs = []; - this.errorCbs = []; - this.listeners = []; - }; - - History.prototype.listen = function listen (cb) { - this.cb = cb; - }; - - History.prototype.onReady = function onReady (cb, errorCb) { - if (this.ready) { - cb(); - } else { - this.readyCbs.push(cb); - if (errorCb) { - this.readyErrorCbs.push(errorCb); - } - } - }; - - History.prototype.onError = function onError (errorCb) { - this.errorCbs.push(errorCb); - }; - - History.prototype.transitionTo = function transitionTo ( - location, - onComplete, - onAbort - ) { - var this$1 = this; - - var route; - // catch redirect option https://github.com/vuejs/vue-router/issues/3201 - try { - route = this.router.match(location, this.current); - } catch (e) { - this.errorCbs.forEach(function (cb) { - cb(e); - }); - // Exception should still be thrown - throw e - } - var prev = this.current; - this.confirmTransition( - route, - function () { - this$1.updateRoute(route); - onComplete && onComplete(route); - this$1.ensureURL(); - this$1.router.afterHooks.forEach(function (hook) { - hook && hook(route, prev); - }); - - // fire ready cbs once - if (!this$1.ready) { - this$1.ready = true; - this$1.readyCbs.forEach(function (cb) { - cb(route); - }); - } - }, - function (err) { - if (onAbort) { - onAbort(err); - } - if (err && !this$1.ready) { - // Initial redirection should not mark the history as ready yet - // because it's triggered by the redirection instead - // https://github.com/vuejs/vue-router/issues/3225 - // https://github.com/vuejs/vue-router/issues/3331 - if (!isNavigationFailure(err, NavigationFailureType.redirected) || prev !== START) { - this$1.ready = true; - this$1.readyErrorCbs.forEach(function (cb) { - cb(err); - }); - } - } - } - ); - }; - - History.prototype.confirmTransition = function confirmTransition (route, onComplete, onAbort) { - var this$1 = this; - - var current = this.current; - this.pending = route; - var abort = function (err) { - // changed after adding errors with - // https://github.com/vuejs/vue-router/pull/3047 before that change, - // redirect and aborted navigation would produce an err == null - if (!isNavigationFailure(err) && isError(err)) { - if (this$1.errorCbs.length) { - this$1.errorCbs.forEach(function (cb) { - cb(err); - }); - } else { - warn(false, 'uncaught error during route navigation:'); - console.error(err); - } - } - onAbort && onAbort(err); - }; - var lastRouteIndex = route.matched.length - 1; - var lastCurrentIndex = current.matched.length - 1; - if ( - isSameRoute(route, current) && - // in the case the route map has been dynamically appended to - lastRouteIndex === lastCurrentIndex && - route.matched[lastRouteIndex] === current.matched[lastCurrentIndex] - ) { - this.ensureURL(); - return abort(createNavigationDuplicatedError(current, route)) - } - - var ref = resolveQueue( - this.current.matched, - route.matched - ); - var updated = ref.updated; - var deactivated = ref.deactivated; - var activated = ref.activated; - - var queue = [].concat( - // in-component leave guards - extractLeaveGuards(deactivated), - // global before hooks - this.router.beforeHooks, - // in-component update hooks - extractUpdateHooks(updated), - // in-config enter guards - activated.map(function (m) { return m.beforeEnter; }), - // async components - resolveAsyncComponents(activated) - ); - - var iterator = function (hook, next) { - if (this$1.pending !== route) { - return abort(createNavigationCancelledError(current, route)) - } - try { - hook(route, current, function (to) { - if (to === false) { - // next(false) -> abort navigation, ensure current URL - this$1.ensureURL(true); - abort(createNavigationAbortedError(current, route)); - } else if (isError(to)) { - this$1.ensureURL(true); - abort(to); - } else if ( - typeof to === 'string' || - (typeof to === 'object' && - (typeof to.path === 'string' || typeof to.name === 'string')) - ) { - // next('/') or next({ path: '/' }) -> redirect - abort(createNavigationRedirectedError(current, route)); - if (typeof to === 'object' && to.replace) { - this$1.replace(to); - } else { - this$1.push(to); - } - } else { - // confirm transition and pass on the value - next(to); - } - }); - } catch (e) { - abort(e); - } - }; - - runQueue(queue, iterator, function () { - // wait until async components are resolved before - // extracting in-component enter guards - var enterGuards = extractEnterGuards(activated); - var queue = enterGuards.concat(this$1.router.resolveHooks); - runQueue(queue, iterator, function () { - if (this$1.pending !== route) { - return abort(createNavigationCancelledError(current, route)) - } - this$1.pending = null; - onComplete(route); - if (this$1.router.app) { - BI.nextTick(function () { - handleRouteEntered(route); - }); - } - }); - }); - }; - - History.prototype.updateRoute = function updateRoute (route) { - this.current = route; - this.cb && this.cb(route); - }; - - History.prototype.setupListeners = function setupListeners () { - // Default implementation is empty - }; - - History.prototype.teardown = function teardown () { - // clean up event listeners - // https://github.com/vuejs/vue-router/issues/2341 - this.listeners.forEach(function (cleanupListener) { - cleanupListener(); - }); - this.listeners = []; - - // reset current history route - // https://github.com/vuejs/vue-router/issues/3294 - this.current = START; - this.pending = null; - }; - - function normalizeBase (base) { - if (!base) { - if (inBrowser) { - // respect tag - var baseEl = document.querySelector('base'); - base = (baseEl && baseEl.getAttribute('href')) || '/'; - // strip full URL origin - base = base.replace(/^https?:\/\/[^\/]+/, ''); - } else { - base = '/'; - } - } - // make sure there's the starting slash - if (base.charAt(0) !== '/') { - base = '/' + base; - } - // remove trailing slash - return base.replace(/\/$/, '') - } - - function resolveQueue ( - current, - next - ) { - var i; - var max = Math.max(current.length, next.length); - for (i = 0; i < max; i++) { - if (current[i] !== next[i]) { - break - } - } - return { - updated: next.slice(0, i), - activated: next.slice(i), - deactivated: current.slice(i) - } - } - - function extractGuards ( - records, - name, - bind, - reverse - ) { - var guards = flatMapComponents(records, function (def, instance, match, key) { - var guard = extractGuard(def, name); - if (guard) { - return Array.isArray(guard) - ? guard.map(function (guard) { return bind(guard, instance, match, key); }) - : bind(guard, instance, match, key) - } - }); - return flatten(reverse ? guards.reverse() : guards) - } - - function extractGuard ( - def, - key - ) { - if (typeof def !== 'function') { - // extend now so that global mixins are applied. - // def = _Vue.extend(def); - } - return def[key] - } - - function extractLeaveGuards (deactivated) { - return extractGuards(deactivated, 'beforeRouteLeave', bindGuard, true) - } - - function extractUpdateHooks (updated) { - return extractGuards(updated, 'beforeRouteUpdate', bindGuard) - } - - function bindGuard (guard, instance) { - if (instance) { - return function boundRouteGuard () { - return guard.apply(instance, arguments) - } - } - } - - function extractEnterGuards ( - activated - ) { - return extractGuards( - activated, - 'beforeRouteEnter', - function (guard, _, match, key) { - return bindEnterGuard(guard, match, key) - } - ) - } - - function bindEnterGuard ( - guard, - match, - key - ) { - return function routeEnterGuard (to, from, next) { - return guard(to, from, function (cb) { - if (typeof cb === 'function') { - if (!match.enteredCbs[key]) { - match.enteredCbs[key] = []; - } - match.enteredCbs[key].push(cb); - } - next(cb); - }) - } - } - - /* */ - - var HTML5History = /*@__PURE__*/(function (History) { - function HTML5History (router, base) { - History.call(this, router, base); - - this._startLocation = getLocation(this.base); - } - - if ( History ) HTML5History.__proto__ = History; - HTML5History.prototype = Object.create( History && History.prototype ); - HTML5History.prototype.constructor = HTML5History; - - HTML5History.prototype.setupListeners = function setupListeners () { - var this$1 = this; - - if (this.listeners.length > 0) { - return - } - - var router = this.router; - var expectScroll = router.options.scrollBehavior; - var supportsScroll = supportsPushState && expectScroll; - - if (supportsScroll) { - this.listeners.push(setupScroll()); - } - - var handleRoutingEvent = function () { - var current = this$1.current; - - // Avoiding first `popstate` event dispatched in some browsers but first - // history route not updated since async guard at the same time. - var location = getLocation(this$1.base); - if (this$1.current === START && location === this$1._startLocation) { - return - } - - this$1.transitionTo(location, function (route) { - if (supportsScroll) { - handleScroll(router, route, current, true); - } - }); - }; - window.addEventListener('popstate', handleRoutingEvent); - this.listeners.push(function () { - window.removeEventListener('popstate', handleRoutingEvent); - }); - }; - - HTML5History.prototype.go = function go (n) { - window.history.go(n); - }; - - HTML5History.prototype.push = function push (location, onComplete, onAbort) { - var this$1 = this; - - var ref = this; - var fromRoute = ref.current; - this.transitionTo(location, function (route) { - pushState(cleanPath(this$1.base + route.fullPath)); - handleScroll(this$1.router, route, fromRoute, false); - onComplete && onComplete(route); - }, onAbort); - }; - - HTML5History.prototype.replace = function replace (location, onComplete, onAbort) { - var this$1 = this; - - var ref = this; - var fromRoute = ref.current; - this.transitionTo(location, function (route) { - replaceState(cleanPath(this$1.base + route.fullPath)); - handleScroll(this$1.router, route, fromRoute, false); - onComplete && onComplete(route); - }, onAbort); - }; - - HTML5History.prototype.ensureURL = function ensureURL (push) { - if (getLocation(this.base) !== this.current.fullPath) { - var current = cleanPath(this.base + this.current.fullPath); - push ? pushState(current) : replaceState(current); - } - }; - - HTML5History.prototype.getCurrentLocation = function getCurrentLocation () { - return getLocation(this.base) - }; - - return HTML5History; - }(History)); - - function getLocation (base) { - var path = window.location.pathname; - var pathLowerCase = path.toLowerCase(); - var baseLowerCase = base.toLowerCase(); - // base="/a" shouldn't turn path="/app" into "/a/pp" - // https://github.com/vuejs/vue-router/issues/3555 - // so we ensure the trailing slash in the base - if (base && ((pathLowerCase === baseLowerCase) || - (pathLowerCase.indexOf(cleanPath(baseLowerCase + '/')) === 0))) { - path = path.slice(base.length); - } - return (path || '/') + window.location.search + window.location.hash - } - - /* */ - - var HashHistory = /*@__PURE__*/(function (History) { - function HashHistory (router, base, fallback) { - History.call(this, router, base); - // check history fallback deeplinking - if (fallback && checkFallback(this.base)) { - return - } - ensureSlash(); - } - - if ( History ) HashHistory.__proto__ = History; - HashHistory.prototype = Object.create( History && History.prototype ); - HashHistory.prototype.constructor = HashHistory; - - // this is delayed until the app mounts - // to avoid the hashchange listener being fired too early - HashHistory.prototype.setupListeners = function setupListeners () { - var this$1 = this; - - if (this.listeners.length > 0) { - return - } - - var router = this.router; - var expectScroll = router.options.scrollBehavior; - var supportsScroll = supportsPushState && expectScroll; - - if (supportsScroll) { - this.listeners.push(setupScroll()); - } - - var handleRoutingEvent = function () { - var current = this$1.current; - if (!ensureSlash()) { - return - } - this$1.transitionTo(getHash(), function (route) { - if (supportsScroll) { - handleScroll(this$1.router, route, current, true); - } - if (!supportsPushState) { - replaceHash(route.fullPath); - } - }); - }; - var eventType = supportsPushState ? 'popstate' : 'hashchange'; - window.addEventListener( - eventType, - handleRoutingEvent - ); - this.listeners.push(function () { - window.removeEventListener(eventType, handleRoutingEvent); - }); - }; - - HashHistory.prototype.push = function push (location, onComplete, onAbort) { - var this$1 = this; - - var ref = this; - var fromRoute = ref.current; - this.transitionTo( - location, - function (route) { - pushHash(route.fullPath); - handleScroll(this$1.router, route, fromRoute, false); - onComplete && onComplete(route); - }, - onAbort - ); - }; - - HashHistory.prototype.replace = function replace (location, onComplete, onAbort) { - var this$1 = this; - - var ref = this; - var fromRoute = ref.current; - this.transitionTo( - location, - function (route) { - replaceHash(route.fullPath); - handleScroll(this$1.router, route, fromRoute, false); - onComplete && onComplete(route); - }, - onAbort - ); - }; - - HashHistory.prototype.go = function go (n) { - window.history.go(n); - }; - - HashHistory.prototype.ensureURL = function ensureURL (push) { - var current = this.current.fullPath; - if (getHash() !== current) { - push ? pushHash(current) : replaceHash(current); - } - }; - - HashHistory.prototype.getCurrentLocation = function getCurrentLocation () { - return getHash() - }; - - return HashHistory; - }(History)); - - function checkFallback (base) { - var location = getLocation(base); - if (!/^\/#/.test(location)) { - window.location.replace(cleanPath(base + '/#' + location)); - return true - } - } - - function ensureSlash () { - var path = getHash(); - if (path.charAt(0) === '/') { - return true - } - replaceHash('/' + path); - return false - } - - function getHash () { - // We can't use window.location.hash here because it's not - // consistent across browsers - Firefox will pre-decode it! - var href = window.location.href; - var index = href.indexOf('#'); - // empty path - if (index < 0) { return '' } - - href = href.slice(index + 1); - - return href - } - - function getUrl (path) { - var href = window.location.href; - var i = href.indexOf('#'); - var base = i >= 0 ? href.slice(0, i) : href; - return (base + "#" + path) - } - - function pushHash (path) { - if (supportsPushState) { - pushState(getUrl(path)); - } else { - window.location.hash = path; - } - } - - function replaceHash (path) { - if (supportsPushState) { - replaceState(getUrl(path)); - } else { - window.location.replace(getUrl(path)); - } - } - - /* */ - - var AbstractHistory = /*@__PURE__*/(function (History) { - function AbstractHistory (router, base) { - History.call(this, router, base); - this.stack = []; - this.index = -1; - } - - if ( History ) AbstractHistory.__proto__ = History; - AbstractHistory.prototype = Object.create( History && History.prototype ); - AbstractHistory.prototype.constructor = AbstractHistory; - - AbstractHistory.prototype.push = function push (location, onComplete, onAbort) { - var this$1 = this; - - this.transitionTo( - location, - function (route) { - this$1.stack = this$1.stack.slice(0, this$1.index + 1).concat(route); - this$1.index++; - onComplete && onComplete(route); - }, - onAbort - ); - }; - - AbstractHistory.prototype.replace = function replace (location, onComplete, onAbort) { - var this$1 = this; - - this.transitionTo( - location, - function (route) { - this$1.stack = this$1.stack.slice(0, this$1.index).concat(route); - onComplete && onComplete(route); - }, - onAbort - ); - }; - - AbstractHistory.prototype.go = function go (n) { - var this$1 = this; - - var targetIndex = this.index + n; - if (targetIndex < 0 || targetIndex >= this.stack.length) { - return - } - var route = this.stack[targetIndex]; - this.confirmTransition( - route, - function () { - var prev = this$1.current; - this$1.index = targetIndex; - this$1.updateRoute(route); - this$1.router.afterHooks.forEach(function (hook) { - hook && hook(route, prev); - }); - }, - function (err) { - if (isNavigationFailure(err, NavigationFailureType.duplicated)) { - this$1.index = targetIndex; - } - } - ); - }; - - AbstractHistory.prototype.getCurrentLocation = function getCurrentLocation () { - var current = this.stack[this.stack.length - 1]; - return current ? current.fullPath : '/' - }; - - AbstractHistory.prototype.ensureURL = function ensureURL () { - // noop - }; - - return AbstractHistory; - }(History)); - - /* */ - - var VueRouter = function VueRouter (options) { - if ( options === void 0 ) options = {}; - - this.app = null; - this.apps = []; - this.options = options; - this.beforeHooks = []; - this.resolveHooks = []; - this.afterHooks = []; - this.matcher = createMatcher(options.routes || [], this); - - var mode = options.mode || 'hash'; - this.fallback = - mode === 'history' && !supportsPushState && options.fallback !== false; - if (this.fallback) { - mode = 'hash'; - } - if (!inBrowser) { - mode = 'abstract'; - } - this.mode = mode; - - switch (mode) { - case 'history': - this.history = new HTML5History(this, options.base); - break - case 'hash': - this.history = new HashHistory(this, options.base, this.fallback); - break - case 'abstract': - this.history = new AbstractHistory(this, options.base); - break - default: - { - assert(false, ("invalid mode: " + mode)); - } - } - }; - - var prototypeAccessors = { currentRoute: { configurable: true } }; - - VueRouter.prototype.match = function match (raw, current, redirectedFrom) { - return this.matcher.match(raw, current, redirectedFrom) - }; - - prototypeAccessors.currentRoute.get = function () { - return this.history && this.history.current - }; - - VueRouter.prototype.init = function init (app /* Vue component instance */) { - var this$1 = this; - - this.apps.push(app); - - // set up app destroyed handler - // https://github.com/vuejs/vue-router/issues/2639 - app.once('hook:destroyed', function () { - // clean out app from this.apps array once destroyed - var index = this$1.apps.indexOf(app); - if (index > -1) { this$1.apps.splice(index, 1); } - // ensure we still have a main app or null if no apps - // we do not release the router so it can be reused - if (this$1.app === app) { this$1.app = this$1.apps[0] || null; } - - if (!this$1.app) { this$1.history.teardown(); } - }); - - // main app previously initialized - // return as we don't need to set up new history listener - if (this.app) { - return - } - - this.app = app; - - var history = this.history; - - if (history instanceof HTML5History || history instanceof HashHistory) { - var handleInitialScroll = function (routeOrError) { - var from = history.current; - var expectScroll = this$1.options.scrollBehavior; - var supportsScroll = supportsPushState && expectScroll; - - if (supportsScroll && 'fullPath' in routeOrError) { - handleScroll(this$1, routeOrError, from, false); - } - }; - var setupListeners = function (routeOrError) { - history.setupListeners(); - handleInitialScroll(routeOrError); - }; - history.transitionTo( - history.getCurrentLocation(), - setupListeners, - setupListeners - ); - } - - history.listen(function (route) { - this$1.apps.forEach(function (app) { - app._router.history.current = route; - }); - }); - }; - - VueRouter.prototype.beforeEach = function beforeEach (fn) { - return registerHook(this.beforeHooks, fn) - }; - - VueRouter.prototype.beforeResolve = function beforeResolve (fn) { - return registerHook(this.resolveHooks, fn) - }; - - VueRouter.prototype.afterEach = function afterEach (fn) { - return registerHook(this.afterHooks, fn) - }; - - VueRouter.prototype.onReady = function onReady (cb, errorCb) { - this.history.onReady(cb, errorCb); - }; - - VueRouter.prototype.onError = function onError (errorCb) { - this.history.onError(errorCb); - }; - - VueRouter.prototype.push = function push (location, onComplete, onAbort) { - var this$1 = this; - - // $flow-disable-line - if (!onComplete && !onAbort && typeof Promise !== 'undefined') { - return new Promise(function (resolve, reject) { - this$1.history.push(location, resolve, reject); - }) - } else { - this.history.push(location, onComplete, onAbort); - } - }; - - VueRouter.prototype.replace = function replace (location, onComplete, onAbort) { - var this$1 = this; - - // $flow-disable-line - if (!onComplete && !onAbort && typeof Promise !== 'undefined') { - return new Promise(function (resolve, reject) { - this$1.history.replace(location, resolve, reject); - }) - } else { - this.history.replace(location, onComplete, onAbort); - } - }; - - VueRouter.prototype.go = function go (n) { - this.history.go(n); - }; - - VueRouter.prototype.back = function back () { - this.go(-1); - }; - - VueRouter.prototype.forward = function forward () { - this.go(1); - }; - - VueRouter.prototype.getMatchedComponents = function getMatchedComponents (to) { - var route = to - ? to.matched - ? to - : this.resolve(to).route - : this.currentRoute; - if (!route) { - return [] - } - return [].concat.apply( - [], - route.matched.map(function (m) { - return Object.keys(m.components).map(function (key) { - return m.components[key] - }) - }) - ) - }; - - VueRouter.prototype.resolve = function resolve ( - to, - current, - append - ) { - current = current || this.history.current; - var location = normalizeLocation(to, current, append, this); - var route = this.match(location, current); - var fullPath = route.redirectedFrom || route.fullPath; - var base = this.history.base; - var href = createHref(base, fullPath, this.mode); - return { - location: location, - route: route, - href: href, - // for backwards compat - normalizedTo: location, - resolved: route - } - }; - - VueRouter.prototype.getRoutes = function getRoutes () { - return this.matcher.getRoutes() - }; - - VueRouter.prototype.addRoute = function addRoute (parentOrRoute, route) { - this.matcher.addRoute(parentOrRoute, route); - if (this.history.current !== START) { - this.history.transitionTo(this.history.getCurrentLocation()); - } - }; - - Object.defineProperties( VueRouter.prototype, prototypeAccessors ); - - function registerHook (list, fn) { - list.push(fn); - return function () { - var i = list.indexOf(fn); - if (i > -1) { list.splice(i, 1); } - } - } - - function createHref (base, fullPath, mode) { - var path = mode === 'hash' ? '#' + fullPath : fullPath; - return base ? cleanPath(base + '/' + path) : path - } - - // VueRouter.install = install; - VueRouter.version = '3.5.2'; - VueRouter.isNavigationFailure = isNavigationFailure; - VueRouter.NavigationFailureType = NavigationFailureType; - VueRouter.START_LOCATION = START; - - - var $router, cbs = []; - BI.RouterWidget = BI.inherit(BI.Widget, { - init: function () { - this.$router = this._router = BI.Router.$router = $router = new VueRouter({ - routes: this.options.routes - }); - this.$router.beforeEach(function (to, from, next) { - if (to.matched.length === 0) { - //如果上级也未匹配到路由则跳转主页面,如果上级能匹配到则转上级路由 - from.path ? next({ path: from.path }) : next('/'); - } else { - //如果匹配到正确跳转 - next(); - } - }); - this.$router.afterEach(function () { - cbs.forEach(function (cb) {cb();}); - }); - this.$router.init(this); - } - }); - BI.shortcut("bi.router", BI.RouterWidget); - - BI.RouterView = BI.inherit(BI.Widget, { - props: { - baseCls: 'bi-router-view', - deps: 0, - name: 'default' - }, - created: function () { - var self = this, o = this.options; - cbs.push(this._callbackListener = function () { - var current = $router.history.current; - // 匹配的路径名(/component/:id) - var matchedPath = current.matched[o.deps] && current.matched[o.deps].path; - var component = current.matched[o.deps] && current.matched[o.deps].components[o.name]; - - if (BI.isNotNull(component)) { - if (matchedPath) { - BI.each(current.params, function (key, value) { - // 把 :id 替换成具体的值(/component/demo.td) - matchedPath = matchedPath.replace(`:${key}`, value); - }); - } - self.tab.setSelect(matchedPath || "/"); - } - }); - // "bi.router_view"是由"bi.tab"实现的,cardCreator是一个异步过程,在"bi.router_view"创建之前,cbs里不会有创建子组件的方法,在初始化路由时,没法直接渲染到子组件,所以这里手动加了一次调用 - this._callbackListener(); - }, - render: function () { - var self = this, o = this.options; - return { - type: "bi.tab", - ref: function (_ref) { - self.tab = _ref; - }, - single: false, // 是不是单页面 - logic: { - dynamic: false - }, - showIndex: false, - cardCreator: function (v) { - return $router.history.current.matched[o.deps].components[o.name]; - } - }; - }, - destroyed: function () { - cbs.remove(this._callbackListener); - } - }); - BI.shortcut("bi.router_view", BI.RouterView); - - BI.Router = BI.Router || VueRouter; - BI.Router.isSameRoute = isSameRoute; - return VueRouter; - - }))); - \ No newline at end of file diff --git a/index.html b/index.html index b7a7bb2a4..03f734a32 100644 --- a/index.html +++ b/index.html @@ -11,5 +11,4 @@
- diff --git a/src/router/router.js b/src/router/router.js index 279289fc0..93a661d84 100644 --- a/src/router/router.js +++ b/src/router/router.js @@ -1,627 +1,3203 @@ -(function () { - var Events = { - - // Bind an event to a `callback` function. Passing `"all"` will bind - // the callback to all events fired. - on: function (name, callback, context) { - if (!eventsApi(this, "on", name, [callback, context]) || !callback) return this; - this._events || (this._events = {}); - var events = this._events[name] || (this._events[name] = []); - events.push({callback: callback, context: context, ctx: context || this}); - return this; - }, - - // Bind an event to only be triggered a single time. After the first time - // the callback is invoked, it will be removed. - once: function (name, callback, context) { - if (!eventsApi(this, "once", name, [callback, context]) || !callback) return this; - var self = this; - var once = _.once(function () { - self.off(name, once); - callback.apply(this, arguments); - }); - once._callback = callback; - return this.on(name, once, context); - }, - - // Remove one or many callbacks. If `context` is null, removes all - // callbacks with that function. If `callback` is null, removes all - // callbacks for the event. If `name` is null, removes all bound - // callbacks for all events. - off: function (name, callback, context) { - if (!this._events || !eventsApi(this, "off", name, [callback, context])) return this; - - // Remove all callbacks for all events. - if (!name && !callback && !context) { - this._events = void 0; - return this; +/*! + * vue-router v3.5.2 + * (c) 2021 Evan You + * @license MIT + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory()); + }(this, (function () { 'use strict'; + + /* */ + + function assert (condition, message) { + if (!condition) { + throw new Error(("[vue-router] " + message)) + } + } + + function warn (condition, message) { + if (!condition) { + typeof console !== 'undefined' && console.warn(("[vue-router] " + message)); + } + } + + function extend (a, b) { + for (var key in b) { + a[key] = b[key]; + } + return a + } + + /* */ + + var encodeReserveRE = /[!'()*]/g; + var encodeReserveReplacer = function (c) { return '%' + c.charCodeAt(0).toString(16); }; + var commaRE = /%2C/g; + + // fixed encodeURIComponent which is more conformant to RFC3986: + // - escapes [!'()*] + // - preserve commas + var encode = function (str) { return encodeURIComponent(str) + .replace(encodeReserveRE, encodeReserveReplacer) + .replace(commaRE, ','); }; + + function decode (str) { + try { + return decodeURIComponent(str) + } catch (err) { + { + warn(false, ("Error decoding \"" + str + "\". Leaving it intact.")); + } + } + return str + } + + function resolveQuery ( + query, + extraQuery, + _parseQuery + ) { + if ( extraQuery === void 0 ) extraQuery = {}; + + var parse = _parseQuery || parseQuery; + var parsedQuery; + try { + parsedQuery = parse(query || ''); + } catch (e) { + warn(false, e.message); + parsedQuery = {}; + } + for (var key in extraQuery) { + var value = extraQuery[key]; + parsedQuery[key] = Array.isArray(value) + ? value.map(castQueryParamValue) + : castQueryParamValue(value); + } + return parsedQuery + } + + var castQueryParamValue = function (value) { return (value == null || typeof value === 'object' ? value : String(value)); }; + + function parseQuery (query) { + var res = {}; + + query = query.trim().replace(/^(\?|#|&)/, ''); + + if (!query) { + return res + } + + query.split('&').forEach(function (param) { + var parts = param.replace(/\+/g, ' ').split('='); + var key = decode(parts.shift()); + var val = parts.length > 0 ? decode(parts.join('=')) : null; + + if (res[key] === undefined) { + res[key] = val; + } else if (Array.isArray(res[key])) { + res[key].push(val); + } else { + res[key] = [res[key], val]; + } + }); + + return res + } + + function stringifyQuery (obj) { + var res = obj + ? Object.keys(obj) + .map(function (key) { + var val = obj[key]; + + if (val === undefined) { + return '' } - - var names = name ? [name] : _.keys(this._events); - for (var i = 0, length = names.length; i < length; i++) { - name = names[i]; - - // Bail out if there are no events stored. - var events = this._events[name]; - if (!events) continue; - - // Remove all callbacks for this event. - if (!callback && !context) { - delete this._events[name]; - continue; - } - - // Find any remaining events. - var remaining = []; - for (var j = 0, k = events.length; j < k; j++) { - var event = events[j]; - if ( - callback && callback !== event.callback && - callback !== event.callback._callback || - context && context !== event.context - ) { - remaining.push(event); - } + + if (val === null) { + return encode(key) + } + + if (Array.isArray(val)) { + var result = []; + val.forEach(function (val2) { + if (val2 === undefined) { + return } - - // Replace events if there are any remaining. Otherwise, clean up. - if (remaining.length) { - this._events[name] = remaining; + if (val2 === null) { + result.push(encode(key)); } else { - delete this._events[name]; + result.push(encode(key) + '=' + encode(val2)); } + }); + return result.join('&') } - - return this; - }, - - un: function () { - this.off.apply(this, arguments); - }, - - // Trigger one or many events, firing all bound callbacks. Callbacks are - // passed the same arguments as `trigger` is, apart from the event name - // (unless you're listening on `"all"`, which will cause your callback to - // receive the true name of the event as the first argument). - trigger: function (name) { - if (!this._events) return this; - var args = slice.call(arguments, 1); - if (!eventsApi(this, "trigger", name, args)) return this; - var events = this._events[name]; - var allEvents = this._events.all; - if (events) triggerEvents(events, args); - if (allEvents) triggerEvents(allEvents, arguments); - return this; - }, - - fireEvent: function () { - this.trigger.apply(this, arguments); - }, - - // Inversion-of-control versions of `on` and `once`. Tell *this* object to - // listen to an event in another object ... keeping track of what it's - // listening to. - listenTo: function (obj, name, callback) { - var listeningTo = this._listeningTo || (this._listeningTo = {}); - var id = obj._listenId || (obj._listenId = _.uniqueId("l")); - listeningTo[id] = obj; - if (!callback && typeof name === "object") callback = this; - obj.on(name, callback, this); - return this; - }, - - listenToOnce: function (obj, name, callback) { - if (typeof name === "object") { - for (var event in name) this.listenToOnce(obj, event, name[event]); - return this; + + return encode(key) + '=' + encode(val) + }) + .filter(function (x) { return x.length > 0; }) + .join('&') + : null; + return res ? ("?" + res) : '' + } + + /* */ + + var trailingSlashRE = /\/?$/; + + function createRoute ( + record, + location, + redirectedFrom, + router + ) { + var stringifyQuery = router && router.options.stringifyQuery; + + var query = location.query || {}; + try { + query = clone(query); + } catch (e) {} + + var route = { + name: location.name || (record && record.name), + meta: (record && record.meta) || {}, + path: location.path || '/', + hash: location.hash || '', + query: query, + params: location.params || {}, + fullPath: getFullPath(location, stringifyQuery), + matched: record ? formatMatch(record) : [] + }; + if (redirectedFrom) { + route.redirectedFrom = getFullPath(redirectedFrom, stringifyQuery); + } + return Object.freeze(route) + } + + function clone (value) { + if (Array.isArray(value)) { + return value.map(clone) + } else if (value && typeof value === 'object') { + var res = {}; + for (var key in value) { + res[key] = clone(value[key]); + } + return res + } else { + return value + } + } + + // the starting route that represents the initial state + var START = createRoute(null, { + path: '/' + }); + + function formatMatch (record) { + var res = []; + while (record) { + res.unshift(record); + record = record.parent; + } + return res + } + + function getFullPath ( + ref, + _stringifyQuery + ) { + var path = ref.path; + var query = ref.query; if ( query === void 0 ) query = {}; + var hash = ref.hash; if ( hash === void 0 ) hash = ''; + + var stringify = _stringifyQuery || stringifyQuery; + return (path || '/') + stringify(query) + hash + } + + function isSameRoute (a, b, onlyPath) { + if (b === START) { + return a === b + } else if (!b) { + return false + } else if (a.path && b.path) { + return a.path.replace(trailingSlashRE, '') === b.path.replace(trailingSlashRE, '') && (onlyPath || + a.hash === b.hash && + isObjectEqual(a.query, b.query)) + } else if (a.name && b.name) { + return ( + a.name === b.name && + (onlyPath || ( + a.hash === b.hash && + isObjectEqual(a.query, b.query) && + isObjectEqual(a.params, b.params)) + ) + ) + } else { + return false + } + } + + function isObjectEqual (a, b) { + if ( a === void 0 ) a = {}; + if ( b === void 0 ) b = {}; + + // handle null value #1566 + if (!a || !b) { return a === b } + var aKeys = Object.keys(a).sort(); + var bKeys = Object.keys(b).sort(); + if (aKeys.length !== bKeys.length) { + return false + } + return aKeys.every(function (key, i) { + var aVal = a[key]; + var bKey = bKeys[i]; + if (bKey !== key) { return false } + var bVal = b[key]; + // query values can be null and undefined + if (aVal == null || bVal == null) { return aVal === bVal } + // check nested equality + if (typeof aVal === 'object' && typeof bVal === 'object') { + return isObjectEqual(aVal, bVal) + } + return String(aVal) === String(bVal) + }) + } + + function isIncludedRoute (current, target) { + return ( + current.path.replace(trailingSlashRE, '/').indexOf( + target.path.replace(trailingSlashRE, '/') + ) === 0 && + (!target.hash || current.hash === target.hash) && + queryIncludes(current.query, target.query) + ) + } + + function queryIncludes (current, target) { + for (var key in target) { + if (!(key in current)) { + return false + } + } + return true + } + + function handleRouteEntered (route) { + for (var i = 0; i < route.matched.length; i++) { + var record = route.matched[i]; + for (var name in record.instances) { + var instance = record.instances[name]; + var cbs = record.enteredCbs[name]; + if (!instance || !cbs) { continue } + delete record.enteredCbs[name]; + for (var i$1 = 0; i$1 < cbs.length; i$1++) { + if (!instance._isBeingDestroyed) { cbs[i$1](instance); } + } + } + } + } + + // var View = { + // name: 'RouterView', + // functional: true, + // props: { + // name: { + // type: String, + // default: 'default' + // } + // }, + // render: function render (_, ref) { + // var props = ref.props; + // var children = ref.children; + // var parent = ref.parent; + // var data = ref.data; + + // // used by devtools to display a router-view badge + // data.routerView = true; + + // // directly use parent context's createElement() function + // // so that components rendered by router-view can resolve named slots + // var h = parent.$createElement; + // var name = props.name; + // var route = parent.$route; + // var cache = parent._routerViewCache || (parent._routerViewCache = {}); + + // // determine current view depth, also check to see if the tree + // // has been toggled inactive but kept-alive. + // var depth = 0; + // var inactive = false; + // while (parent && parent._routerRoot !== parent) { + // var vnodeData = parent.$vnode ? parent.$vnode.data : {}; + // if (vnodeData.routerView) { + // depth++; + // } + // if (vnodeData.keepAlive && parent._directInactive && parent._inactive) { + // inactive = true; + // } + // parent = parent.$parent; + // } + // data.routerViewDepth = depth; + + // // render previous view if the tree is inactive and kept-alive + // if (inactive) { + // var cachedData = cache[name]; + // var cachedComponent = cachedData && cachedData.component; + // if (cachedComponent) { + // // #2301 + // // pass props + // if (cachedData.configProps) { + // fillPropsinData(cachedComponent, data, cachedData.route, cachedData.configProps); + // } + // return h(cachedComponent, data, children) + // } else { + // // render previous empty view + // return h() + // } + // } + + // var matched = route.matched[depth]; + // var component = matched && matched.components[name]; + + // // render empty node if no matched route or no config component + // if (!matched || !component) { + // cache[name] = null; + // return h() + // } + + // // cache component + // cache[name] = { component: component }; + + // // attach instance registration hook + // // this will be called in the instance's injected lifecycle hooks + // data.registerRouteInstance = function (vm, val) { + // // val could be undefined for unregistration + // var current = matched.instances[name]; + // if ( + // (val && current !== vm) || + // (!val && current === vm) + // ) { + // matched.instances[name] = val; + // } + // } + + // // also register instance in prepatch hook + // // in case the same component instance is reused across different routes + // ;(data.hook || (data.hook = {})).prepatch = function (_, vnode) { + // matched.instances[name] = vnode.componentInstance; + // }; + + // // register instance in init hook + // // in case kept-alive component be actived when routes changed + // data.hook.init = function (vnode) { + // if (vnode.data.keepAlive && + // vnode.componentInstance && + // vnode.componentInstance !== matched.instances[name] + // ) { + // matched.instances[name] = vnode.componentInstance; + // } + + // // if the route transition has already been confirmed then we weren't + // // able to call the cbs during confirmation as the component was not + // // registered yet, so we call it here. + // handleRouteEntered(route); + // }; + + // var configProps = matched.props && matched.props[name]; + // // save route and configProps in cache + // if (configProps) { + // extend(cache[name], { + // route: route, + // configProps: configProps + // }); + // fillPropsinData(component, data, route, configProps); + // } + + // return h(component, data, children) + // } + // }; + + // function fillPropsinData (component, data, route, configProps) { + // // resolve props + // var propsToPass = data.props = resolveProps(route, configProps); + // if (propsToPass) { + // // clone to prevent mutation + // propsToPass = data.props = extend({}, propsToPass); + // // pass non-declared props as attrs + // var attrs = data.attrs = data.attrs || {}; + // for (var key in propsToPass) { + // if (!component.props || !(key in component.props)) { + // attrs[key] = propsToPass[key]; + // delete propsToPass[key]; + // } + // } + // } + // } + + // function resolveProps (route, config) { + // switch (typeof config) { + // case 'undefined': + // return + // case 'object': + // return config + // case 'function': + // return config(route) + // case 'boolean': + // return config ? route.params : undefined + // default: + // { + // warn( + // false, + // "props in \"" + (route.path) + "\" is a " + (typeof config) + ", " + + // "expecting an object, function or boolean." + // ); + // } + // } + // } + + /* */ + + function resolvePath ( + relative, + base, + append + ) { + var firstChar = relative.charAt(0); + if (firstChar === '/') { + return relative + } + + if (firstChar === '?' || firstChar === '#') { + return base + relative + } + + var stack = base.split('/'); + + // remove trailing segment if: + // - not appending + // - appending to trailing slash (last segment is empty) + if (!append || !stack[stack.length - 1]) { + stack.pop(); + } + + // resolve relative path + var segments = relative.replace(/^\//, '').split('/'); + for (var i = 0; i < segments.length; i++) { + var segment = segments[i]; + if (segment === '..') { + stack.pop(); + } else if (segment !== '.') { + stack.push(segment); + } + } + + // ensure leading slash + if (stack[0] !== '') { + stack.unshift(''); + } + + return stack.join('/') + } + + function parsePath (path) { + var hash = ''; + var query = ''; + + var hashIndex = path.indexOf('#'); + if (hashIndex >= 0) { + hash = path.slice(hashIndex); + path = path.slice(0, hashIndex); + } + + var queryIndex = path.indexOf('?'); + if (queryIndex >= 0) { + query = path.slice(queryIndex + 1); + path = path.slice(0, queryIndex); + } + + return { + path: path, + query: query, + hash: hash + } + } + + function cleanPath (path) { + return path.replace(/\/\//g, '/') + } + + var isarray = Array.isArray || function (arr) { + return Object.prototype.toString.call(arr) == '[object Array]'; + }; + + /** + * Expose `pathToRegexp`. + */ + var pathToRegexp_1 = pathToRegexp; + var parse_1 = parse; + var compile_1 = compile; + var tokensToFunction_1 = tokensToFunction; + var tokensToRegExp_1 = tokensToRegExp; + + /** + * The main path matching regexp utility. + * + * @type {RegExp} + */ + var PATH_REGEXP = new RegExp([ + // Match escaped characters that would otherwise appear in future matches. + // This allows the user to escape special characters that won't transform. + '(\\\\.)', + // Match Express-style parameters and un-named parameters with a prefix + // and optional suffixes. Matches appear as: + // + // "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?", undefined] + // "/route(\\d+)" => [undefined, undefined, undefined, "\d+", undefined, undefined] + // "/*" => ["/", undefined, undefined, undefined, undefined, "*"] + '([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))' + ].join('|'), 'g'); + + /** + * Parse a string for the raw tokens. + * + * @param {string} str + * @param {Object=} options + * @return {!Array} + */ + function parse (str, options) { + var tokens = []; + var key = 0; + var index = 0; + var path = ''; + var defaultDelimiter = options && options.delimiter || '/'; + var res; + + while ((res = PATH_REGEXP.exec(str)) != null) { + var m = res[0]; + var escaped = res[1]; + var offset = res.index; + path += str.slice(index, offset); + index = offset + m.length; + + // Ignore already escaped sequences. + if (escaped) { + path += escaped[1]; + continue + } + + var next = str[index]; + var prefix = res[2]; + var name = res[3]; + var capture = res[4]; + var group = res[5]; + var modifier = res[6]; + var asterisk = res[7]; + + // Push the current path onto the tokens. + if (path) { + tokens.push(path); + path = ''; + } + + var partial = prefix != null && next != null && next !== prefix; + var repeat = modifier === '+' || modifier === '*'; + var optional = modifier === '?' || modifier === '*'; + var delimiter = res[2] || defaultDelimiter; + var pattern = capture || group; + + tokens.push({ + name: name || key++, + prefix: prefix || '', + delimiter: delimiter, + optional: optional, + repeat: repeat, + partial: partial, + asterisk: !!asterisk, + pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?') + }); + } + + // Match any characters still remaining. + if (index < str.length) { + path += str.substr(index); + } + + // If the path exists, push it onto the end. + if (path) { + tokens.push(path); + } + + return tokens + } + + /** + * Compile a string to a template function for the path. + * + * @param {string} str + * @param {Object=} options + * @return {!function(Object=, Object=)} + */ + function compile (str, options) { + return tokensToFunction(parse(str, options), options) + } + + /** + * Prettier encoding of URI path segments. + * + * @param {string} + * @return {string} + */ + function encodeURIComponentPretty (str) { + return encodeURI(str).replace(/[\/?#]/g, function (c) { + return '%' + c.charCodeAt(0).toString(16).toUpperCase() + }) + } + + /** + * Encode the asterisk parameter. Similar to `pretty`, but allows slashes. + * + * @param {string} + * @return {string} + */ + function encodeAsterisk (str) { + return encodeURI(str).replace(/[?#]/g, function (c) { + return '%' + c.charCodeAt(0).toString(16).toUpperCase() + }) + } + + /** + * Expose a method for transforming tokens into the path function. + */ + function tokensToFunction (tokens, options) { + // Compile all the tokens into regexps. + var matches = new Array(tokens.length); + + // Compile all the patterns before compilation. + for (var i = 0; i < tokens.length; i++) { + if (typeof tokens[i] === 'object') { + matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$', flags(options)); + } + } + + return function (obj, opts) { + var path = ''; + var data = obj || {}; + var options = opts || {}; + var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent; + + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + + if (typeof token === 'string') { + path += token; + + continue + } + + var value = data[token.name]; + var segment; + + if (value == null) { + if (token.optional) { + // Prepend partial segment prefixes. + if (token.partial) { + path += token.prefix; + } + + continue + } else { + throw new TypeError('Expected "' + token.name + '" to be defined') } - if (eventSplitter.test(name)) { - var names = name.split(eventSplitter); - for (var i = 0, length = names.length; i < length; i++) { - this.listenToOnce(obj, names[i], callback); - } - return this; + } + + if (isarray(value)) { + if (!token.repeat) { + throw new TypeError('Expected "' + token.name + '" to not repeat, but received `' + JSON.stringify(value) + '`') } - if (!callback) return this; - var once = _.once(function () { - this.stopListening(obj, name, once); - callback.apply(this, arguments); - }); - once._callback = callback; - return this.listenTo(obj, name, once); - }, - - // Tell this object to stop listening to either specific events ... or - // to every object it's currently listening to. - stopListening: function (obj, name, callback) { - var listeningTo = this._listeningTo; - if (!listeningTo) return this; - var remove = !name && !callback; - if (!callback && typeof name === "object") callback = this; - if (obj) (listeningTo = {})[obj._listenId] = obj; - for (var id in listeningTo) { - obj = listeningTo[id]; - obj.off(name, callback, this); - if (remove || _.isEmpty(obj._events)) delete this._listeningTo[id]; + + if (value.length === 0) { + if (token.optional) { + continue + } else { + throw new TypeError('Expected "' + token.name + '" to not be empty') + } } - return this; - } - - }; - - // Regular expression used to split event strings. - var eventSplitter = /\s+/; - - // Implement fancy features of the Events API such as multiple event - // names `"change blur"` and jQuery-style event maps `{change: action}` - // in terms of the existing API. - var eventsApi = function (obj, action, name, rest) { - if (!name) return true; - - // Handle event maps. - if (typeof name === "object") { - for (var key in name) { - obj[action].apply(obj, [key, name[key]].concat(rest)); + + for (var j = 0; j < value.length; j++) { + segment = encode(value[j]); + + if (!matches[i].test(segment)) { + throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '", but received `' + JSON.stringify(segment) + '`') + } + + path += (j === 0 ? token.prefix : token.delimiter) + segment; } - return false; - } - - // Handle space separated event names. - if (eventSplitter.test(name)) { - var names = name.split(eventSplitter); - for (var i = 0, length = names.length; i < length; i++) { - obj[action].apply(obj, [names[i]].concat(rest)); + + continue + } + + segment = token.asterisk ? encodeAsterisk(value) : encode(value); + + if (!matches[i].test(segment)) { + throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but received "' + segment + '"') + } + + path += token.prefix + segment; + } + + return path + } + } + + /** + * Escape a regular expression string. + * + * @param {string} str + * @return {string} + */ + function escapeString (str) { + return str.replace(/([.+*?=^!:${}()[\]|\/\\])/g, '\\$1') + } + + /** + * Escape the capturing group by escaping special characters and meaning. + * + * @param {string} group + * @return {string} + */ + function escapeGroup (group) { + return group.replace(/([=!:$\/()])/g, '\\$1') + } + + /** + * Attach the keys as a property of the regexp. + * + * @param {!RegExp} re + * @param {Array} keys + * @return {!RegExp} + */ + function attachKeys (re, keys) { + re.keys = keys; + return re + } + + /** + * Get the flags for a regexp from the options. + * + * @param {Object} options + * @return {string} + */ + function flags (options) { + return options && options.sensitive ? '' : 'i' + } + + /** + * Pull out keys from a regexp. + * + * @param {!RegExp} path + * @param {!Array} keys + * @return {!RegExp} + */ + function regexpToRegexp (path, keys) { + // Use a negative lookahead to match only capturing groups. + var groups = path.source.match(/\((?!\?)/g); + + if (groups) { + for (var i = 0; i < groups.length; i++) { + keys.push({ + name: i, + prefix: null, + delimiter: null, + optional: false, + repeat: false, + partial: false, + asterisk: false, + pattern: null + }); + } + } + + return attachKeys(path, keys) + } + + /** + * Transform an array into a regexp. + * + * @param {!Array} path + * @param {Array} keys + * @param {!Object} options + * @return {!RegExp} + */ + function arrayToRegexp (path, keys, options) { + var parts = []; + + for (var i = 0; i < path.length; i++) { + parts.push(pathToRegexp(path[i], keys, options).source); + } + + var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options)); + + return attachKeys(regexp, keys) + } + + /** + * Create a path regexp from string input. + * + * @param {string} path + * @param {!Array} keys + * @param {!Object} options + * @return {!RegExp} + */ + function stringToRegexp (path, keys, options) { + return tokensToRegExp(parse(path, options), keys, options) + } + + /** + * Expose a function for taking tokens and returning a RegExp. + * + * @param {!Array} tokens + * @param {(Array|Object)=} keys + * @param {Object=} options + * @return {!RegExp} + */ + function tokensToRegExp (tokens, keys, options) { + if (!isarray(keys)) { + options = /** @type {!Object} */ (keys || options); + keys = []; + } + + options = options || {}; + + var strict = options.strict; + var end = options.end !== false; + var route = ''; + + // Iterate over the tokens and create our regexp string. + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + + if (typeof token === 'string') { + route += escapeString(token); + } else { + var prefix = escapeString(token.prefix); + var capture = '(?:' + token.pattern + ')'; + + keys.push(token); + + if (token.repeat) { + capture += '(?:' + prefix + capture + ')*'; + } + + if (token.optional) { + if (!token.partial) { + capture = '(?:' + prefix + '(' + capture + '))?'; + } else { + capture = prefix + '(' + capture + ')?'; } - return false; + } else { + capture = prefix + '(' + capture + ')'; + } + + route += capture; } - - return true; - }; - - // A difficult-to-believe, but optimized internal dispatch function for - // triggering events. Tries to keep the usual cases speedy (most internal - // BI events have 3 arguments). - var triggerEvents = function (events, args) { - var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2]; - switch (args.length) { - case 0: - while (++i < l) (ev = events[i]).callback.call(ev.ctx); - return; - case 1: - while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); - return; - case 2: - while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); - return; - case 3: - while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); - return; - default: - while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); - return; + } + + var delimiter = escapeString(options.delimiter || '/'); + var endsWithDelimiter = route.slice(-delimiter.length) === delimiter; + + // In non-strict mode we allow a slash at the end of match. If the path to + // match already ends with a slash, we remove it for consistency. The slash + // is valid at the end of a path match, not in the middle. This is important + // in non-ending mode, where "/test/" shouldn't match "/test//route". + if (!strict) { + route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'; + } + + if (end) { + route += '$'; + } else { + // In non-ending mode, we need the capturing groups to match as much as + // possible by using a positive lookahead to the end or next path segment. + route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'; + } + + return attachKeys(new RegExp('^' + route, flags(options)), keys) + } + + /** + * Normalize the given path string, returning a regular expression. + * + * An empty array can be passed in for the keys, which will hold the + * placeholder key descriptions. For example, using `/user/:id`, `keys` will + * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`. + * + * @param {(string|RegExp|Array)} path + * @param {(Array|Object)=} keys + * @param {Object=} options + * @return {!RegExp} + */ + function pathToRegexp (path, keys, options) { + if (!isarray(keys)) { + options = /** @type {!Object} */ (keys || options); + keys = []; + } + + options = options || {}; + + if (path instanceof RegExp) { + return regexpToRegexp(path, /** @type {!Array} */ (keys)) + } + + if (isarray(path)) { + return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options) + } + + return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options) + } + pathToRegexp_1.parse = parse_1; + pathToRegexp_1.compile = compile_1; + pathToRegexp_1.tokensToFunction = tokensToFunction_1; + pathToRegexp_1.tokensToRegExp = tokensToRegExp_1; + + /* */ + + // $flow-disable-line + var regexpCompileCache = Object.create(null); + + function fillParams ( + path, + params, + routeMsg + ) { + params = params || {}; + try { + var filler = + regexpCompileCache[path] || + (regexpCompileCache[path] = pathToRegexp_1.compile(path)); + + // Fix #2505 resolving asterisk routes { name: 'not-found', params: { pathMatch: '/not-found' }} + // and fix #3106 so that you can work with location descriptor object having params.pathMatch equal to empty string + if (typeof params.pathMatch === 'string') { params[0] = params.pathMatch; } + + return filler(params, { pretty: true }) + } catch (e) { + { + // Fix #3072 no warn if `pathMatch` is string + warn(typeof params.pathMatch === 'string', ("missing param for " + routeMsg + ": " + (e.message))); } - }; - - // BI.Router - // --------------- - - // Routers map faux-URLs to actions, and fire events when routes are - // matched. Creating a new one sets its `routes` hash, if not set statically. - var Router = BI.Router = function (options) { - options || (options = {}); - if (options.routes) this.routes = options.routes; - this._bindRoutes(); - this._init.apply(this, arguments); - }; - - // Cached regular expressions for matching named param parts and splatted - // parts of route strings. - var optionalParam = /\((.*?)\)/g; - var namedParam = /(\(\?)?:\w+/g; - var splatParam = /\*\w+/g; - var escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g; - - // Set up all inheritable **BI.Router** properties and methods. - _.extend(Router.prototype, Events, { - - // _init is an empty function by default. Override it with your own - // initialization logic. - _init: function () { - }, - - // Manually bind a single named route to a callback. For example: - // - // this.route('search/:query/p:num', 'search', function(query, num) { - // ... - // }); - // - route: function (route, name, callback) { - if (!_.isRegExp(route)) route = this._routeToRegExp(route); - if (_.isFunction(name)) { - callback = name; - name = ""; + return '' + } finally { + // delete the 0 if it was added + delete params[0]; + } + } + + /* */ + + function normalizeLocation ( + raw, + current, + append, + router + ) { + var next = typeof raw === 'string' ? { path: raw } : raw; + // named target + if (next._normalized) { + return next + } else if (next.name) { + next = extend({}, raw); + var params = next.params; + if (params && typeof params === 'object') { + next.params = extend({}, params); + } + return next + } + + // relative params + if (!next.path && next.params && current) { + next = extend({}, next); + next._normalized = true; + var params$1 = extend(extend({}, current.params), next.params); + if (current.name) { + next.name = current.name; + next.params = params$1; + } else if (current.matched.length) { + var rawPath = current.matched[current.matched.length - 1].path; + next.path = fillParams(rawPath, params$1, ("path " + (current.path))); + } else { + warn(false, "relative params navigation requires a current route."); + } + return next + } + + var parsedPath = parsePath(next.path || ''); + var basePath = (current && current.path) || '/'; + var path = parsedPath.path + ? resolvePath(parsedPath.path, basePath, append || next.append) + : basePath; + + var query = resolveQuery( + parsedPath.query, + next.query, + router && router.options.parseQuery + ); + + var hash = next.hash || parsedPath.hash; + if (hash && hash.charAt(0) !== '#') { + hash = "#" + hash; + } + + return { + _normalized: true, + path: path, + query: query, + hash: hash + } + } + + // var toTypes = [String, Object]; + // var eventTypes = [String, Array]; + + // var noop = function () {}; + + // var warnedCustomSlot; + // var warnedTagProp; + // var warnedEventProp; + + // var Link = { + // name: 'RouterLink', + // props: { + // to: { + // type: toTypes, + // required: true + // }, + // tag: { + // type: String, + // default: 'a' + // }, + // custom: Boolean, + // exact: Boolean, + // exactPath: Boolean, + // append: Boolean, + // replace: Boolean, + // activeClass: String, + // exactActiveClass: String, + // ariaCurrentValue: { + // type: String, + // default: 'page' + // }, + // event: { + // type: eventTypes, + // default: 'click' + // } + // }, + // render: function render (h) { + // var this$1 = this; + + // var router = this.$router; + // var current = this.$route; + // var ref = router.resolve( + // this.to, + // current, + // this.append + // ); + // var location = ref.location; + // var route = ref.route; + // var href = ref.href; + + // var classes = {}; + // var globalActiveClass = router.options.linkActiveClass; + // var globalExactActiveClass = router.options.linkExactActiveClass; + // // Support global empty active class + // var activeClassFallback = + // globalActiveClass == null ? 'router-link-active' : globalActiveClass; + // var exactActiveClassFallback = + // globalExactActiveClass == null + // ? 'router-link-exact-active' + // : globalExactActiveClass; + // var activeClass = + // this.activeClass == null ? activeClassFallback : this.activeClass; + // var exactActiveClass = + // this.exactActiveClass == null + // ? exactActiveClassFallback + // : this.exactActiveClass; + + // var compareTarget = route.redirectedFrom + // ? createRoute(null, normalizeLocation(route.redirectedFrom), null, router) + // : route; + + // classes[exactActiveClass] = isSameRoute(current, compareTarget, this.exactPath); + // classes[activeClass] = this.exact || this.exactPath + // ? classes[exactActiveClass] + // : isIncludedRoute(current, compareTarget); + + // var ariaCurrentValue = classes[exactActiveClass] ? this.ariaCurrentValue : null; + + // var handler = function (e) { + // if (guardEvent(e)) { + // if (this$1.replace) { + // router.replace(location, noop); + // } else { + // router.push(location, noop); + // } + // } + // }; + + // var on = { click: guardEvent }; + // if (Array.isArray(this.event)) { + // this.event.forEach(function (e) { + // on[e] = handler; + // }); + // } else { + // on[this.event] = handler; + // } + + // var data = { class: classes }; + + // var scopedSlot = + // !this.$scopedSlots.$hasNormal && + // this.$scopedSlots.default && + // this.$scopedSlots.default({ + // href: href, + // route: route, + // navigate: handler, + // isActive: classes[activeClass], + // isExactActive: classes[exactActiveClass] + // }); + + // if (scopedSlot) { + // if (!this.custom) { + // !warnedCustomSlot && warn(false, 'In Vue Router 4, the v-slot API will by default wrap its content with an
element. Use the custom prop to remove this warning:\n\n'); + // warnedCustomSlot = true; + // } + // if (scopedSlot.length === 1) { + // return scopedSlot[0] + // } else if (scopedSlot.length > 1 || !scopedSlot.length) { + // { + // warn( + // false, + // (" with to=\"" + (this.to) + "\" is trying to use a scoped slot but it didn't provide exactly one child. Wrapping the content with a span element.") + // ); + // } + // return scopedSlot.length === 0 ? h() : h('span', {}, scopedSlot) + // } + // } + + // { + // if ('tag' in this.$options.propsData && !warnedTagProp) { + // warn( + // false, + // "'s tag prop is deprecated and has been removed in Vue Router 4. Use the v-slot API to remove this warning: https://next.router.vuejs.org/guide/migration/#removal-of-event-and-tag-props-in-router-link." + // ); + // warnedTagProp = true; + // } + // if ('event' in this.$options.propsData && !warnedEventProp) { + // warn( + // false, + // "'s event prop is deprecated and has been removed in Vue Router 4. Use the v-slot API to remove this warning: https://next.router.vuejs.org/guide/migration/#removal-of-event-and-tag-props-in-router-link." + // ); + // warnedEventProp = true; + // } + // } + + // if (this.tag === 'a') { + // data.on = on; + // data.attrs = { href: href, 'aria-current': ariaCurrentValue }; + // } else { + // // find the first child and apply listener and href + // var a = findAnchor(this.$slots.default); + // if (a) { + // // in case the is a static node + // a.isStatic = false; + // var aData = (a.data = extend({}, a.data)); + // aData.on = aData.on || {}; + // // transform existing events in both objects into arrays so we can push later + // for (var event in aData.on) { + // var handler$1 = aData.on[event]; + // if (event in on) { + // aData.on[event] = Array.isArray(handler$1) ? handler$1 : [handler$1]; + // } + // } + // // append new listeners for router-link + // for (var event$1 in on) { + // if (event$1 in aData.on) { + // // on[event] is always a function + // aData.on[event$1].push(on[event$1]); + // } else { + // aData.on[event$1] = handler; + // } + // } + + // var aAttrs = (a.data.attrs = extend({}, a.data.attrs)); + // aAttrs.href = href; + // aAttrs['aria-current'] = ariaCurrentValue; + // } else { + // // doesn't have child, apply listener to self + // data.on = on; + // } + // } + + // return h(this.tag, data, this.$slots.default) + // } + // }; + + function guardEvent (e) { + // don't redirect with control keys + if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) { return } + // don't redirect when preventDefault called + if (e.defaultPrevented) { return } + // don't redirect on right click + if (e.button !== undefined && e.button !== 0) { return } + // don't redirect if `target="_blank"` + if (e.currentTarget && e.currentTarget.getAttribute) { + var target = e.currentTarget.getAttribute('target'); + if (/\b_blank\b/i.test(target)) { return } + } + // this may be a Weex event which doesn't have this method + if (e.preventDefault) { + e.preventDefault(); + } + return true + } + + function findAnchor (children) { + if (children) { + var child; + for (var i = 0; i < children.length; i++) { + child = children[i]; + if (child.tag === 'a') { + return child + } + if (child.children && (child = findAnchor(child.children))) { + return child + } + } + } + } + + // var _Vue; + + // function install (Vue) { + // if (install.installed && _Vue === Vue) { return } + // install.installed = true; + + // _Vue = Vue; + + // var isDef = function (v) { return v !== undefined; }; + + // var registerInstance = function (vm, callVal) { + // var i = vm.$options._parentVnode; + // if (isDef(i) && isDef(i = i.data) && isDef(i = i.registerRouteInstance)) { + // i(vm, callVal); + // } + // }; + + // Vue.mixin({ + // beforeCreate: function beforeCreate () { + // if (isDef(this.$options.router)) { + // this._routerRoot = this; + // this._router = this.$options.router; + // this._router.init(this); + // Vue.util.defineReactive(this, '_route', this._router.history.current); + // } else { + // this._routerRoot = (this.$parent && this.$parent._routerRoot) || this; + // } + // registerInstance(this, this); + // }, + // destroyed: function destroyed () { + // registerInstance(this); + // } + // }); + + // Object.defineProperty(Vue.prototype, '$router', { + // get: function get () { return this._routerRoot._router } + // }); + + // Object.defineProperty(Vue.prototype, '$route', { + // get: function get () { return this._routerRoot._route } + // }); + + // Vue.component('RouterView', View); + // Vue.component('RouterLink', Link); + + // var strats = Vue.config.optionMergeStrategies; + // // use the same hook merging strategy for route hooks + // strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created; + // } + + /* */ + + var inBrowser = typeof window !== 'undefined'; + + /* */ + + function createRouteMap ( + routes, + oldPathList, + oldPathMap, + oldNameMap, + parentRoute + ) { + // the path list is used to control path matching priority + var pathList = oldPathList || []; + // $flow-disable-line + var pathMap = oldPathMap || Object.create(null); + // $flow-disable-line + var nameMap = oldNameMap || Object.create(null); + + routes.forEach(function (route) { + addRouteRecord(pathList, pathMap, nameMap, route, parentRoute); + }); + + // ensure wildcard routes are always at the end + for (var i = 0, l = pathList.length; i < l; i++) { + if (pathList[i] === '*') { + pathList.push(pathList.splice(i, 1)[0]); + l--; + i--; + } + } + + { + // warn if routes do not include leading slashes + var found = pathList + // check for missing leading slash + .filter(function (path) { return path && path.charAt(0) !== '*' && path.charAt(0) !== '/'; }); + + if (found.length > 0) { + var pathNames = found.map(function (path) { return ("- " + path); }).join('\n'); + warn(false, ("Non-nested routes must include a leading slash character. Fix the following routes: \n" + pathNames)); + } + } + + return { + pathList: pathList, + pathMap: pathMap, + nameMap: nameMap + } + } + + function addRouteRecord ( + pathList, + pathMap, + nameMap, + route, + parent, + matchAs + ) { + var path = route.path; + var name = route.name; + { + assert(path != null, "\"path\" is required in a route configuration."); + assert( + typeof route.component !== 'string', + "route config \"component\" for path: " + (String( + path || name + )) + " cannot be a " + "string id. Use an actual component instead." + ); + + warn( + // eslint-disable-next-line no-control-regex + !/[^\u0000-\u007F]+/.test(path), + "Route with path \"" + path + "\" contains unencoded characters, make sure " + + "your path is correctly encoded before passing it to the router. Use " + + "encodeURI to encode static segments of your path." + ); + } + + var pathToRegexpOptions = + route.pathToRegexpOptions || {}; + var normalizedPath = normalizePath(path, parent, pathToRegexpOptions.strict); + + if (typeof route.caseSensitive === 'boolean') { + pathToRegexpOptions.sensitive = route.caseSensitive; + } + + var record = { + path: normalizedPath, + regex: compileRouteRegex(normalizedPath, pathToRegexpOptions), + components: route.components || { default: route.component }, + alias: route.alias + ? typeof route.alias === 'string' + ? [route.alias] + : route.alias + : [], + instances: {}, + enteredCbs: {}, + name: name, + parent: parent, + matchAs: matchAs, + redirect: route.redirect, + beforeEnter: route.beforeEnter, + meta: route.meta || {}, + props: + route.props == null + ? {} + : route.components + ? route.props + : { default: route.props } + }; + + if (route.children) { + // Warn if route is named, does not redirect and has a default child route. + // If users navigate to this route by name, the default child will + // not be rendered (GH Issue #629) + { + if ( + route.name && + !route.redirect && + route.children.some(function (child) { return /^\/?$/.test(child.path); }) + ) { + warn( + false, + "Named Route '" + (route.name) + "' has a default child route. " + + "When navigating to this named route (:to=\"{name: '" + (route.name) + "'\"), " + + "the default child route will not be rendered. Remove the name from " + + "this route and use the name of the default child route for named " + + "links instead." + ); + } + } + route.children.forEach(function (child) { + var childMatchAs = matchAs + ? cleanPath((matchAs + "/" + (child.path))) + : undefined; + addRouteRecord(pathList, pathMap, nameMap, child, record, childMatchAs); + }); + } + + if (!pathMap[record.path]) { + pathList.push(record.path); + pathMap[record.path] = record; + } + + if (route.alias !== undefined) { + var aliases = Array.isArray(route.alias) ? route.alias : [route.alias]; + for (var i = 0; i < aliases.length; ++i) { + var alias = aliases[i]; + if (alias === path) { + warn( + false, + ("Found an alias with the same value as the path: \"" + path + "\". You have to remove that alias. It will be ignored in development.") + ); + // skip in dev to make it work + continue + } + + var aliasRoute = { + path: alias, + children: route.children + }; + addRouteRecord( + pathList, + pathMap, + nameMap, + aliasRoute, + parent, + record.path || '/' // matchAs + ); + } + } + + if (name) { + if (!nameMap[name]) { + nameMap[name] = record; + } else if (!matchAs) { + warn( + false, + "Duplicate named routes definition: " + + "{ name: \"" + name + "\", path: \"" + (record.path) + "\" }" + ); + } + } + } + + function compileRouteRegex ( + path, + pathToRegexpOptions + ) { + var regex = pathToRegexp_1(path, [], pathToRegexpOptions); + { + var keys = Object.create(null); + regex.keys.forEach(function (key) { + warn( + !keys[key.name], + ("Duplicate param keys in route with path: \"" + path + "\"") + ); + keys[key.name] = true; + }); + } + return regex + } + + function normalizePath ( + path, + parent, + strict + ) { + if (!strict) { path = path.replace(/\/$/, ''); } + if (path[0] === '/') { return path } + if (parent == null) { return path } + return cleanPath(((parent.path) + "/" + path)) + } + + /* */ + + + + function createMatcher ( + routes, + router + ) { + var ref = createRouteMap(routes); + var pathList = ref.pathList; + var pathMap = ref.pathMap; + var nameMap = ref.nameMap; + + function addRoutes (routes) { + createRouteMap(routes, pathList, pathMap, nameMap); + } + + function addRoute (parentOrRoute, route) { + var parent = (typeof parentOrRoute !== 'object') ? nameMap[parentOrRoute] : undefined; + // $flow-disable-line + createRouteMap([route || parentOrRoute], pathList, pathMap, nameMap, parent); + + // add aliases of parent + if (parent && parent.alias.length) { + createRouteMap( + // $flow-disable-line route is defined if parent is + parent.alias.map(function (alias) { return ({ path: alias, children: [route] }); }), + pathList, + pathMap, + nameMap, + parent + ); + } + } + + function getRoutes () { + return pathList.map(function (path) { return pathMap[path]; }) + } + + function match ( + raw, + currentRoute, + redirectedFrom + ) { + var location = normalizeLocation(raw, currentRoute, false, router); + var name = location.name; + + if (name) { + var record = nameMap[name]; + { + warn(record, ("Route with name '" + name + "' does not exist")); + } + if (!record) { return _createRoute(null, location) } + var paramNames = record.regex.keys + .filter(function (key) { return !key.optional; }) + .map(function (key) { return key.name; }); + + if (typeof location.params !== 'object') { + location.params = {}; + } + + if (currentRoute && typeof currentRoute.params === 'object') { + for (var key in currentRoute.params) { + if (!(key in location.params) && paramNames.indexOf(key) > -1) { + location.params[key] = currentRoute.params[key]; + } } - if (!callback) callback = this[name]; - var router = this; - BI.history.route(route, function (fragment) { - var args = router._extractParameters(route, fragment); - if (router.execute(callback, args, name) !== false) { - router.trigger.apply(router, ["route:" + name].concat(args)); - router.trigger("route", name, args); - BI.history.trigger("route", router, name, args); - } - }); - return this; - }, - - // Execute a route handler with the provided parameters. This is an - // excellent place to do pre-route setup or post-route cleanup. - execute: function (callback, args, name) { - if (callback) callback.apply(this, args); - }, - - // Simple proxy to `BI.history` to save a fragment into the history. - navigate: function (fragment, options) { - BI.history.navigate(fragment, options); - return this; - }, - - // Bind all defined routes to `BI.history`. We have to reverse the - // order of the routes here to support behavior where the most general - // routes can be defined at the bottom of the route map. - _bindRoutes: function () { - if (!this.routes) return; - this.routes = _.result(this, "routes"); - var route, routes = _.keys(this.routes); - while ((route = routes.pop()) != null) { - this.route(route, this.routes[route]); + } + + location.path = fillParams(record.path, location.params, ("named route \"" + name + "\"")); + return _createRoute(record, location, redirectedFrom) + } else if (location.path) { + location.params = {}; + for (var i = 0; i < pathList.length; i++) { + var path = pathList[i]; + var record$1 = pathMap[path]; + if (matchRoute(record$1.regex, location.path, location.params)) { + return _createRoute(record$1, location, redirectedFrom) } - }, - - // Convert a route string into a regular expression, suitable for matching - // against the current location hash. - _routeToRegExp: function (route) { - route = route.replace(escapeRegExp, "\\$&") - .replace(optionalParam, "(?:$1)?") - .replace(namedParam, function (match, optional) { - return optional ? match : "([^/?]+)"; - }) - .replace(splatParam, "([^?]*?)"); - return new RegExp("^" + route + "(?:\\?([\\s\\S]*))?$"); - }, - - // Given a route, and a URL fragment that it matches, return the array of - // extracted decoded parameters. Empty or unmatched parameters will be - // treated as `null` to normalize cross-browser behavior. - _extractParameters: function (route, fragment) { - var params = route.exec(fragment).slice(1); - return _.map(params, function (param, i) { - // Don't decode the search params. - if (i === params.length - 1) return param || null; - var resultParam = null; - if (param) { - try { - resultParam = decodeURIComponent(param); - } catch (e) { - resultParam = param; - } - } - return resultParam; + } + } + // no match + return _createRoute(null, location) + } + + function redirect ( + record, + location + ) { + var originalRedirect = record.redirect; + var redirect = typeof originalRedirect === 'function' + ? originalRedirect(createRoute(record, location, null, router)) + : originalRedirect; + + if (typeof redirect === 'string') { + redirect = { path: redirect }; + } + + if (!redirect || typeof redirect !== 'object') { + { + warn( + false, ("invalid redirect option: " + (JSON.stringify(redirect))) + ); + } + return _createRoute(null, location) + } + + var re = redirect; + var name = re.name; + var path = re.path; + var query = location.query; + var hash = location.hash; + var params = location.params; + query = re.hasOwnProperty('query') ? re.query : query; + hash = re.hasOwnProperty('hash') ? re.hash : hash; + params = re.hasOwnProperty('params') ? re.params : params; + + if (name) { + // resolved named direct + var targetRecord = nameMap[name]; + { + assert(targetRecord, ("redirect failed: named route \"" + name + "\" not found.")); + } + return match({ + _normalized: true, + name: name, + query: query, + hash: hash, + params: params + }, undefined, location) + } else if (path) { + // 1. resolve relative redirect + var rawPath = resolveRecordPath(path, record); + // 2. resolve params + var resolvedPath = fillParams(rawPath, params, ("redirect route with path \"" + rawPath + "\"")); + // 3. rematch with existing query and hash + return match({ + _normalized: true, + path: resolvedPath, + query: query, + hash: hash + }, undefined, location) + } else { + { + warn(false, ("invalid redirect option: " + (JSON.stringify(redirect)))); + } + return _createRoute(null, location) + } + } + + function alias ( + record, + location, + matchAs + ) { + var aliasedPath = fillParams(matchAs, location.params, ("aliased route with path \"" + matchAs + "\"")); + var aliasedMatch = match({ + _normalized: true, + path: aliasedPath + }); + if (aliasedMatch) { + var matched = aliasedMatch.matched; + var aliasedRecord = matched[matched.length - 1]; + location.params = aliasedMatch.params; + return _createRoute(aliasedRecord, location) + } + return _createRoute(null, location) + } + + function _createRoute ( + record, + location, + redirectedFrom + ) { + if (record && record.redirect) { + return redirect(record, redirectedFrom || location) + } + if (record && record.matchAs) { + return alias(record, location, record.matchAs) + } + return createRoute(record, location, redirectedFrom, router) + } + + return { + match: match, + addRoute: addRoute, + getRoutes: getRoutes, + addRoutes: addRoutes + } + } + + function matchRoute ( + regex, + path, + params + ) { + var m = path.match(regex); + + if (!m) { + return false + } else if (!params) { + return true + } + + for (var i = 1, len = m.length; i < len; ++i) { + var key = regex.keys[i - 1]; + if (key) { + // Fix #1994: using * with props: true generates a param named 0 + params[key.name || 'pathMatch'] = typeof m[i] === 'string' ? decode(m[i]) : m[i]; + } + } + + return true + } + + function resolveRecordPath (path, record) { + return resolvePath(path, record.parent ? record.parent.path : '/', true) + } + + /* */ + + // use User Timing api (if present) for more accurate key precision + var Time = + inBrowser && window.performance && window.performance.now + ? window.performance + : Date; + + function genStateKey () { + return Time.now().toFixed(3) + } + + var _key = genStateKey(); + + function getStateKey () { + return _key + } + + function setStateKey (key) { + return (_key = key) + } + + /* */ + + var positionStore = Object.create(null); + + function setupScroll () { + // Prevent browser scroll behavior on History popstate + if ('scrollRestoration' in window.history) { + window.history.scrollRestoration = 'manual'; + } + // Fix for #1585 for Firefox + // Fix for #2195 Add optional third attribute to workaround a bug in safari https://bugs.webkit.org/show_bug.cgi?id=182678 + // Fix for #2774 Support for apps loaded from Windows file shares not mapped to network drives: replaced location.origin with + // window.location.protocol + '//' + window.location.host + // location.host contains the port and location.hostname doesn't + var protocolAndPath = window.location.protocol + '//' + window.location.host; + var absolutePath = window.location.href.replace(protocolAndPath, ''); + // preserve existing history state as it could be overriden by the user + var stateCopy = extend({}, window.history.state); + stateCopy.key = getStateKey(); + window.history.replaceState(stateCopy, '', absolutePath); + window.addEventListener('popstate', handlePopState); + return function () { + window.removeEventListener('popstate', handlePopState); + } + } + + function handleScroll ( + router, + to, + from, + isPop + ) { + if (!router.app) { + return + } + + var behavior = router.options.scrollBehavior; + if (!behavior) { + return + } + + { + assert(typeof behavior === 'function', "scrollBehavior must be a function"); + } + + // wait until re-render finishes before scrolling + BI.nextTick(function () { + var position = getScrollPosition(); + var shouldScroll = behavior.call( + router, + to, + from, + isPop ? position : null + ); + + if (!shouldScroll) { + return + } + + if (typeof shouldScroll.then === 'function') { + shouldScroll + .then(function (shouldScroll) { + scrollToPosition((shouldScroll), position); + }) + .catch(function (err) { + { + assert(false, err.toString()); + } }); + } else { + scrollToPosition(shouldScroll, position); } - - }); - - // History - // ---------------- - - // Handles cross-browser history management, based on either - // [pushState](http://diveintohtml5.info/history.html) and real URLs, or - // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange) - // and URL fragments. If the browser supports neither (old IE, natch), - // falls back to polling. - var History = function () { - this.handlers = []; - this.checkUrl = _.bind(this.checkUrl, this); - - // Ensure that `History` can be used outside of the browser. - if (typeof window !== "undefined") { - this.location = _global.location; - this.history = _global.history; + }); + } + + function saveScrollPosition () { + var key = getStateKey(); + if (key) { + positionStore[key] = { + x: window.pageXOffset, + y: window.pageYOffset + }; + } + } + + function handlePopState (e) { + saveScrollPosition(); + if (e.state && e.state.key) { + setStateKey(e.state.key); + } + } + + function getScrollPosition () { + var key = getStateKey(); + if (key) { + return positionStore[key] + } + } + + function getElementPosition (el, offset) { + var docEl = document.documentElement; + var docRect = docEl.getBoundingClientRect(); + var elRect = el.getBoundingClientRect(); + return { + x: elRect.left - docRect.left - offset.x, + y: elRect.top - docRect.top - offset.y + } + } + + function isValidPosition (obj) { + return isNumber(obj.x) || isNumber(obj.y) + } + + function normalizePosition (obj) { + return { + x: isNumber(obj.x) ? obj.x : window.pageXOffset, + y: isNumber(obj.y) ? obj.y : window.pageYOffset + } + } + + function normalizeOffset (obj) { + return { + x: isNumber(obj.x) ? obj.x : 0, + y: isNumber(obj.y) ? obj.y : 0 + } + } + + function isNumber (v) { + return typeof v === 'number' + } + + var hashStartsWithNumberRE = /^#\d/; + + function scrollToPosition (shouldScroll, position) { + var isObject = typeof shouldScroll === 'object'; + if (isObject && typeof shouldScroll.selector === 'string') { + // getElementById would still fail if the selector contains a more complicated query like #main[data-attr] + // but at the same time, it doesn't make much sense to select an element with an id and an extra selector + var el = hashStartsWithNumberRE.test(shouldScroll.selector) // $flow-disable-line + ? document.getElementById(shouldScroll.selector.slice(1)) // $flow-disable-line + : document.querySelector(shouldScroll.selector); + + if (el) { + var offset = + shouldScroll.offset && typeof shouldScroll.offset === 'object' + ? shouldScroll.offset + : {}; + offset = normalizeOffset(offset); + position = getElementPosition(el, offset); + } else if (isValidPosition(shouldScroll)) { + position = normalizePosition(shouldScroll); + } + } else if (isObject && isValidPosition(shouldScroll)) { + position = normalizePosition(shouldScroll); + } + + if (position) { + // $flow-disable-line + if ('scrollBehavior' in document.documentElement.style) { + window.scrollTo({ + left: position.x, + top: position.y, + // $flow-disable-line + behavior: shouldScroll.behavior + }); + } else { + window.scrollTo(position.x, position.y); + } + } + } + + /* */ + + var supportsPushState = + inBrowser && + (function () { + var ua = window.navigator.userAgent; + + if ( + (ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && + ua.indexOf('Mobile Safari') !== -1 && + ua.indexOf('Chrome') === -1 && + ua.indexOf('Windows Phone') === -1 + ) { + return false + } + + return window.history && typeof window.history.pushState === 'function' + })(); + + function pushState (url, replace) { + saveScrollPosition(); + // try...catch the pushState call to get around Safari + // DOM Exception 18 where it limits to 100 pushState calls + var history = window.history; + try { + if (replace) { + // preserve existing history state as it could be overriden by the user + var stateCopy = extend({}, history.state); + stateCopy.key = getStateKey(); + history.replaceState(stateCopy, '', url); + } else { + history.pushState({ key: setStateKey(genStateKey()) }, '', url); } + } catch (e) { + window.location[replace ? 'replace' : 'assign'](url); + } + } + + function replaceState (url) { + pushState(url, true); + } + + /* */ + + function runQueue (queue, fn, cb) { + var step = function (index) { + if (index >= queue.length) { + cb(); + } else { + if (queue[index]) { + fn(queue[index], function () { + step(index + 1); + }); + } else { + step(index + 1); + } + } + }; + step(0); + } + + // When changing thing, also edit router.d.ts + var NavigationFailureType = { + redirected: 2, + aborted: 4, + cancelled: 8, + duplicated: 16 }; - - // Cached regex for stripping a leading hash/slash and trailing space. - var routeStripper = /^[#\/]|\s+$/g; - - // Cached regex for stripping leading and trailing slashes. - var rootStripper = /^\/+|\/+$/g; - - // Cached regex for stripping urls of hash. - var pathStripper = /#.*$/; - - // Has the history handling already been started? - History.started = false; - - // Set up all inheritable **BI.History** properties and methods. - _.extend(History.prototype, Events, { - - // The default interval to poll for hash changes, if necessary, is - // twenty times a second. - interval: 50, - - // Are we at the app root? - atRoot: function () { - var path = this.location.pathname.replace(/[^\/]$/, "$&/"); - return path === this.root && !this.getSearch(); - }, - - // In IE6, the hash fragment and search params are incorrect if the - // fragment contains `?`. - getSearch: function () { - var match = this.location.href.replace(/#.*/, "").match(/\?.+/); - return match ? match[0] : ""; - }, - - // Gets the true hash value. Cannot use location.hash directly due to bug - // in Firefox where location.hash will always be decoded. - getHash: function (window) { - var match = (window || this).location.href.match(/#(.*)$/); - return match ? match[1] : ""; - }, - - // Get the pathname and search params, without the root. - getPath: function () { - var path = this.location.pathname + this.getSearch(); + + function createNavigationRedirectedError (from, to) { + return createRouterError( + from, + to, + NavigationFailureType.redirected, + ("Redirected when going from \"" + (from.fullPath) + "\" to \"" + (stringifyRoute( + to + )) + "\" via a navigation guard.") + ) + } + + function createNavigationDuplicatedError (from, to) { + var error = createRouterError( + from, + to, + NavigationFailureType.duplicated, + ("Avoided redundant navigation to current location: \"" + (from.fullPath) + "\".") + ); + // backwards compatible with the first introduction of Errors + error.name = 'NavigationDuplicated'; + return error + } + + function createNavigationCancelledError (from, to) { + return createRouterError( + from, + to, + NavigationFailureType.cancelled, + ("Navigation cancelled from \"" + (from.fullPath) + "\" to \"" + (to.fullPath) + "\" with a new navigation.") + ) + } + + function createNavigationAbortedError (from, to) { + return createRouterError( + from, + to, + NavigationFailureType.aborted, + ("Navigation aborted from \"" + (from.fullPath) + "\" to \"" + (to.fullPath) + "\" via a navigation guard.") + ) + } + + function createRouterError (from, to, type, message) { + var error = new Error(message); + error._isRouter = true; + error.from = from; + error.to = to; + error.type = type; + + return error + } + + var propertiesToLog = ['params', 'query', 'hash']; + + function stringifyRoute (to) { + if (typeof to === 'string') { return to } + if ('path' in to) { return to.path } + var location = {}; + propertiesToLog.forEach(function (key) { + if (key in to) { location[key] = to[key]; } + }); + return JSON.stringify(location, null, 2) + } + + function isError (err) { + return Object.prototype.toString.call(err).indexOf('Error') > -1 + } + + function isNavigationFailure (err, errorType) { + return ( + isError(err) && + err._isRouter && + (errorType == null || err.type === errorType) + ) + } + + /* */ + + function resolveAsyncComponents (matched) { + return function (to, from, next) { + var hasAsync = false; + var pending = 0; + var error = null; + + flatMapComponents(matched, function (def, _, match, key) { + // if it's a function and doesn't have cid attached, + // assume it's an async component resolve function. + // we are not using Vue's default async resolving mechanism because + // we want to halt the navigation until the incoming component has been + // resolved. + if (typeof def === 'function' && def.cid === undefined) { + hasAsync = true; + pending++; + + var resolve = once(function (resolvedDef) { + if (isESModule(resolvedDef)) { + resolvedDef = resolvedDef.default; + } + // save resolved on async factory in case it's used elsewhere + def.resolved = resolvedDef; + match.components[key] = resolvedDef; + pending--; + if (pending <= 0) { + next(); + } + }); + + var reject = once(function (reason) { + var msg = "Failed to resolve async component " + key + ": " + reason; + warn(false, msg); + if (!error) { + error = isError(reason) + ? reason + : new Error(msg); + next(error); + } + }); + + var res; try { - path = decodeURI(path); - } catch(e) { + res = def(resolve, reject); + } catch (e) { + reject(e); } - var root = this.root.slice(0, -1); - if (!path.indexOf(root)) path = path.slice(root.length); - return path.charAt(0) === "/" ? path.slice(1) : path; - }, - - // Get the cross-browser normalized URL fragment from the path or hash. - getFragment: function (fragment) { - if (fragment == null) { - if (this._hasPushState || !this._wantsHashChange) { - fragment = this.getPath(); - } else { - fragment = this.getHash(); + if (res) { + if (typeof res.then === 'function') { + res.then(resolve, reject); + } else { + // new syntax in Vue 2.3 + var comp = res.component; + if (comp && typeof comp.then === 'function') { + comp.then(resolve, reject); } + } } - return fragment.replace(routeStripper, ""); - }, - - // Start the hash change handling, returning `true` if the current URL matches - // an existing route, and `false` otherwise. - start: function (options) { - if (History.started) throw new Error("BI.history has already been started"); - History.started = true; - - // Figure out the initial configuration. Do we need an iframe? - // Is pushState desired ... is it available? - this.options = _.extend({root: "/"}, this.options, options); - this.root = this.options.root; - this._wantsHashChange = this.options.hashChange !== false; - this._hasHashChange = "onhashchange" in window; - this._wantsPushState = !!this.options.pushState; - this._hasPushState = !!(this.options.pushState && this.history && this.history.pushState); - this.fragment = this.getFragment(); - - // Normalize root to always include a leading and trailing slash. - this.root = ("/" + this.root + "/").replace(rootStripper, "/"); - - // Transition from hashChange to pushState or vice versa if both are - // requested. - if (this._wantsHashChange && this._wantsPushState) { - - // If we've started off with a route from a `pushState`-enabled - // browser, but we're currently in a browser that doesn't support it... - if (!this._hasPushState && !this.atRoot()) { - var root = this.root.slice(0, -1) || "/"; - this.location.replace(root + "#" + this.getPath()); - // Return immediately as browser will do redirect to new url - return true; - - // Or if we've started out with a hash-based route, but we're currently - // in a browser where it could be `pushState`-based instead... - } else if (this._hasPushState && this.atRoot()) { - this.navigate(this.getHash(), {replace: true}); - } - - } - - // Proxy an iframe to handle location events if the browser doesn't - // support the `hashchange` event, HTML5 history, or the user wants - // `hashChange` but not `pushState`. - if (!this._hasHashChange && this._wantsHashChange && (!this._wantsPushState || !this._hasPushState)) { - var iframe = document.createElement("iframe"); - iframe.src = "javascript:0"; - iframe.style.display = "none"; - iframe.tabIndex = -1; - var body = document.body; - // Using `appendChild` will throw on IE < 9 if the document is not ready. - this.iframe = body.insertBefore(iframe, body.firstChild).contentWindow; - this.iframe.document.open().close(); - this.iframe.location.hash = "#" + this.fragment; - } - - // Add a cross-platform `addEventListener` shim for older browsers. - var addEventListener = _global.addEventListener || function (eventName, listener) { - return attachEvent("on" + eventName, listener); - }; - - // Depending on whether we're using pushState or hashes, and whether - // 'onhashchange' is supported, determine how we check the URL state. - if (this._hasPushState) { - addEventListener("popstate", this.checkUrl, false); - } else if (this._wantsHashChange && this._hasHashChange && !this.iframe) { - addEventListener("hashchange", this.checkUrl, false); - } else if (this._wantsHashChange) { - this._checkUrlInterval = setInterval(this.checkUrl, this.interval); - } - - if (!this.options.silent) return this.loadUrl(); - }, - - // Disable BI.history, perhaps temporarily. Not useful in a real app, - // but possibly useful for unit testing Routers. - stop: function () { - // Add a cross-platform `removeEventListener` shim for older browsers. - var removeEventListener = _global.removeEventListener || function (eventName, listener) { - return detachEvent("on" + eventName, listener); - }; - - // Remove window listeners. - if (this._hasPushState) { - removeEventListener("popstate", this.checkUrl, false); - } else if (this._wantsHashChange && this._hasHashChange && !this.iframe) { - removeEventListener("hashchange", this.checkUrl, false); - } - - // Clean up the iframe if necessary. - if (this.iframe) { - document.body.removeChild(this.iframe.frameElement); - this.iframe = null; - } - - // Some environments will throw when clearing an undefined interval. - if (this._checkUrlInterval) clearInterval(this._checkUrlInterval); - History.started = false; - }, - - // Add a route to be tested when the fragment changes. Routes added later - // may override previous routes. - route: function (route, callback) { - this.handlers.unshift({route: route, callback: callback}); - }, - - // check route is Exist. if exist, return the route - checkRoute: function (route) { - for (var i = 0; i < this.handlers.length; i++) { - if (this.handlers[i].route.toString() === Router.prototype._routeToRegExp(route).toString()) { - return this.handlers[i]; - } - } - - return null; - }, - - // remove a route match in routes - unRoute: function (route) { - var index = _.findIndex(this.handlers, function (handler) { - return handler.route.test(route); + } + }); + + if (!hasAsync) { next(); } + } + } + + function flatMapComponents ( + matched, + fn + ) { + return flatten(matched.map(function (m) { + return Object.keys(m.components).map(function (key) { return fn( + m.components[key], + m.instances[key], + m, key + ); }) + })) + } + + function flatten (arr) { + return Array.prototype.concat.apply([], arr) + } + + var hasSymbol = + typeof Symbol === 'function' && + typeof Symbol.toStringTag === 'symbol'; + + function isESModule (obj) { + return obj.__esModule || (hasSymbol && obj[Symbol.toStringTag] === 'Module') + } + + // in Webpack 2, require.ensure now also returns a Promise + // so the resolve/reject functions may get called an extra time + // if the user uses an arrow function shorthand that happens to + // return that Promise. + function once (fn) { + var called = false; + return function () { + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + + if (called) { return } + called = true; + return fn.apply(this, args) + } + } + + /* */ + + var History = function History (router, base) { + this.router = router; + this.base = normalizeBase(base); + // start with a route object that stands for "nowhere" + this.current = START; + this.pending = null; + this.ready = false; + this.readyCbs = []; + this.readyErrorCbs = []; + this.errorCbs = []; + this.listeners = []; + }; + + History.prototype.listen = function listen (cb) { + this.cb = cb; + }; + + History.prototype.onReady = function onReady (cb, errorCb) { + if (this.ready) { + cb(); + } else { + this.readyCbs.push(cb); + if (errorCb) { + this.readyErrorCbs.push(errorCb); + } + } + }; + + History.prototype.onError = function onError (errorCb) { + this.errorCbs.push(errorCb); + }; + + History.prototype.transitionTo = function transitionTo ( + location, + onComplete, + onAbort + ) { + var this$1 = this; + + var route; + // catch redirect option https://github.com/vuejs/vue-router/issues/3201 + try { + route = this.router.match(location, this.current); + } catch (e) { + this.errorCbs.forEach(function (cb) { + cb(e); + }); + // Exception should still be thrown + throw e + } + var prev = this.current; + this.confirmTransition( + route, + function () { + this$1.updateRoute(route); + onComplete && onComplete(route); + this$1.ensureURL(); + this$1.router.afterHooks.forEach(function (hook) { + hook && hook(route, prev); + }); + + // fire ready cbs once + if (!this$1.ready) { + this$1.ready = true; + this$1.readyCbs.forEach(function (cb) { + cb(route); }); - if (index > -1) { - this.handlers.splice(index, 1); - } + } }, - - // Checks the current URL to see if it has changed, and if it has, - // calls `loadUrl`, normalizing across the hidden iframe. - checkUrl: function (e) { - var current = this.getFragment(); - try { - // getFragment 得到的值是编码过的,而this.fragment是没有编码过的 - // 英文路径没有问题,遇上中文和空格有问题了 - current = decodeURIComponent(current); - } catch(e) { + function (err) { + if (onAbort) { + onAbort(err); + } + if (err && !this$1.ready) { + // Initial redirection should not mark the history as ready yet + // because it's triggered by the redirection instead + // https://github.com/vuejs/vue-router/issues/3225 + // https://github.com/vuejs/vue-router/issues/3331 + if (!isNavigationFailure(err, NavigationFailureType.redirected) || prev !== START) { + this$1.ready = true; + this$1.readyErrorCbs.forEach(function (cb) { + cb(err); + }); } - // If the user pressed the back button, the iframe's hash will have - // changed and we should use that for comparison. - if (current === this.fragment && this.iframe) { - current = this.getHash(this.iframe); + } + } + ); + }; + + History.prototype.confirmTransition = function confirmTransition (route, onComplete, onAbort) { + var this$1 = this; + + var current = this.current; + this.pending = route; + var abort = function (err) { + // changed after adding errors with + // https://github.com/vuejs/vue-router/pull/3047 before that change, + // redirect and aborted navigation would produce an err == null + if (!isNavigationFailure(err) && isError(err)) { + if (this$1.errorCbs.length) { + this$1.errorCbs.forEach(function (cb) { + cb(err); + }); + } else { + warn(false, 'uncaught error during route navigation:'); + console.error(err); + } + } + onAbort && onAbort(err); + }; + var lastRouteIndex = route.matched.length - 1; + var lastCurrentIndex = current.matched.length - 1; + if ( + isSameRoute(route, current) && + // in the case the route map has been dynamically appended to + lastRouteIndex === lastCurrentIndex && + route.matched[lastRouteIndex] === current.matched[lastCurrentIndex] + ) { + this.ensureURL(); + return abort(createNavigationDuplicatedError(current, route)) + } + + var ref = resolveQueue( + this.current.matched, + route.matched + ); + var updated = ref.updated; + var deactivated = ref.deactivated; + var activated = ref.activated; + + var queue = [].concat( + // in-component leave guards + extractLeaveGuards(deactivated), + // global before hooks + this.router.beforeHooks, + // in-component update hooks + extractUpdateHooks(updated), + // in-config enter guards + activated.map(function (m) { return m.beforeEnter; }), + // async components + resolveAsyncComponents(activated) + ); + + var iterator = function (hook, next) { + if (this$1.pending !== route) { + return abort(createNavigationCancelledError(current, route)) + } + try { + hook(route, current, function (to) { + if (to === false) { + // next(false) -> abort navigation, ensure current URL + this$1.ensureURL(true); + abort(createNavigationAbortedError(current, route)); + } else if (isError(to)) { + this$1.ensureURL(true); + abort(to); + } else if ( + typeof to === 'string' || + (typeof to === 'object' && + (typeof to.path === 'string' || typeof to.name === 'string')) + ) { + // next('/') or next({ path: '/' }) -> redirect + abort(createNavigationRedirectedError(current, route)); + if (typeof to === 'object' && to.replace) { + this$1.replace(to); + } else { + this$1.push(to); + } + } else { + // confirm transition and pass on the value + next(to); } - - if (current === this.fragment) return false; - if (this.iframe) this.navigate(current); - this.loadUrl(); - }, - - // Attempt to load the current URL fragment. If a route succeeds with a - // match, returns `true`. If no defined routes matches the fragment, - // returns `false`. - loadUrl: function (fragment) { - fragment = this.fragment = this.getFragment(fragment); - return _.some(this.handlers, function (handler) { - if (handler.route.test(fragment)) { - handler.callback(fragment); - return true; - } + }); + } catch (e) { + abort(e); + } + }; + + runQueue(queue, iterator, function () { + // wait until async components are resolved before + // extracting in-component enter guards + var enterGuards = extractEnterGuards(activated); + var queue = enterGuards.concat(this$1.router.resolveHooks); + runQueue(queue, iterator, function () { + if (this$1.pending !== route) { + return abort(createNavigationCancelledError(current, route)) + } + this$1.pending = null; + onComplete(route); + if (this$1.router.app) { + BI.nextTick(function () { + handleRouteEntered(route); }); - }, - - // Save a fragment into the hash history, or replace the URL state if the - // 'replace' option is passed. You are responsible for properly URL-encoding - // the fragment in advance. - // - // The options object can contain `trigger: true` if you wish to have the - // route callback be fired (not usually desirable), or `replace: true`, if - // you wish to modify the current URL without adding an entry to the history. - navigate: function (fragment, options) { - if (!History.started) return false; - if (!options || options === true) options = {trigger: !!options}; - - // Normalize the fragment. - fragment = this.getFragment(fragment || ""); - - // Don't include a trailing slash on the root. - var root = this.root; - if (fragment === "" || fragment.charAt(0) === "?") { - root = root.slice(0, -1) || "/"; + } + }); + }); + }; + + History.prototype.updateRoute = function updateRoute (route) { + this.current = route; + this.cb && this.cb(route); + }; + + History.prototype.setupListeners = function setupListeners () { + // Default implementation is empty + }; + + History.prototype.teardown = function teardown () { + // clean up event listeners + // https://github.com/vuejs/vue-router/issues/2341 + this.listeners.forEach(function (cleanupListener) { + cleanupListener(); + }); + this.listeners = []; + + // reset current history route + // https://github.com/vuejs/vue-router/issues/3294 + this.current = START; + this.pending = null; + }; + + function normalizeBase (base) { + if (!base) { + if (inBrowser) { + // respect tag + var baseEl = document.querySelector('base'); + base = (baseEl && baseEl.getAttribute('href')) || '/'; + // strip full URL origin + base = base.replace(/^https?:\/\/[^\/]+/, ''); + } else { + base = '/'; + } + } + // make sure there's the starting slash + if (base.charAt(0) !== '/') { + base = '/' + base; + } + // remove trailing slash + return base.replace(/\/$/, '') + } + + function resolveQueue ( + current, + next + ) { + var i; + var max = Math.max(current.length, next.length); + for (i = 0; i < max; i++) { + if (current[i] !== next[i]) { + break + } + } + return { + updated: next.slice(0, i), + activated: next.slice(i), + deactivated: current.slice(i) + } + } + + function extractGuards ( + records, + name, + bind, + reverse + ) { + var guards = flatMapComponents(records, function (def, instance, match, key) { + var guard = extractGuard(def, name); + if (guard) { + return Array.isArray(guard) + ? guard.map(function (guard) { return bind(guard, instance, match, key); }) + : bind(guard, instance, match, key) + } + }); + return flatten(reverse ? guards.reverse() : guards) + } + + function extractGuard ( + def, + key + ) { + if (typeof def !== 'function') { + // extend now so that global mixins are applied. + // def = _Vue.extend(def); + } + return def[key] + } + + function extractLeaveGuards (deactivated) { + return extractGuards(deactivated, 'beforeRouteLeave', bindGuard, true) + } + + function extractUpdateHooks (updated) { + return extractGuards(updated, 'beforeRouteUpdate', bindGuard) + } + + function bindGuard (guard, instance) { + if (instance) { + return function boundRouteGuard () { + return guard.apply(instance, arguments) + } + } + } + + function extractEnterGuards ( + activated + ) { + return extractGuards( + activated, + 'beforeRouteEnter', + function (guard, _, match, key) { + return bindEnterGuard(guard, match, key) + } + ) + } + + function bindEnterGuard ( + guard, + match, + key + ) { + return function routeEnterGuard (to, from, next) { + return guard(to, from, function (cb) { + if (typeof cb === 'function') { + if (!match.enteredCbs[key]) { + match.enteredCbs[key] = []; } - var url = root + fragment; - - // Strip the hash and decode for matching. - fragment = fragment.replace(pathStripper, "") - try { - fragment = decodeURI(fragment); - } catch(e) { + match.enteredCbs[key].push(cb); + } + next(cb); + }) + } + } + + /* */ + + var HTML5History = /*@__PURE__*/(function (History) { + function HTML5History (router, base) { + History.call(this, router, base); + + this._startLocation = getLocation(this.base); + } + + if ( History ) HTML5History.__proto__ = History; + HTML5History.prototype = Object.create( History && History.prototype ); + HTML5History.prototype.constructor = HTML5History; + + HTML5History.prototype.setupListeners = function setupListeners () { + var this$1 = this; + + if (this.listeners.length > 0) { + return + } + + var router = this.router; + var expectScroll = router.options.scrollBehavior; + var supportsScroll = supportsPushState && expectScroll; + + if (supportsScroll) { + this.listeners.push(setupScroll()); + } + + var handleRoutingEvent = function () { + var current = this$1.current; + + // Avoiding first `popstate` event dispatched in some browsers but first + // history route not updated since async guard at the same time. + var location = getLocation(this$1.base); + if (this$1.current === START && location === this$1._startLocation) { + return + } + + this$1.transitionTo(location, function (route) { + if (supportsScroll) { + handleScroll(router, route, current, true); } - - if (this.fragment === fragment) return; - this.fragment = fragment; - - // If pushState is available, we use it to set the fragment as a real URL. - if (this._hasPushState) { - this.history[options.replace ? "replaceState" : "pushState"]({}, document.title, url); - - // If hash changes haven't been explicitly disabled, update the hash - // fragment to store history. - } else if (this._wantsHashChange) { - this._updateHash(this.location, fragment, options.replace); - if (this.iframe && (fragment !== this.getHash(this.iframe))) { - // Opening and closing the iframe tricks IE7 and earlier to push a - // history entry on hash-tag change. When replace is true, we don't - // want this. - if (!options.replace) this.iframe.document.open().close(); - this._updateHash(this.iframe.location, fragment, options.replace); - } - - // If you've told us that you explicitly don't want fallback hashchange- - // based history, then `navigate` becomes a page refresh. - } else { - return this.location.assign(url); + }); + }; + window.addEventListener('popstate', handleRoutingEvent); + this.listeners.push(function () { + window.removeEventListener('popstate', handleRoutingEvent); + }); + }; + + HTML5History.prototype.go = function go (n) { + window.history.go(n); + }; + + HTML5History.prototype.push = function push (location, onComplete, onAbort) { + var this$1 = this; + + var ref = this; + var fromRoute = ref.current; + this.transitionTo(location, function (route) { + pushState(cleanPath(this$1.base + route.fullPath)); + handleScroll(this$1.router, route, fromRoute, false); + onComplete && onComplete(route); + }, onAbort); + }; + + HTML5History.prototype.replace = function replace (location, onComplete, onAbort) { + var this$1 = this; + + var ref = this; + var fromRoute = ref.current; + this.transitionTo(location, function (route) { + replaceState(cleanPath(this$1.base + route.fullPath)); + handleScroll(this$1.router, route, fromRoute, false); + onComplete && onComplete(route); + }, onAbort); + }; + + HTML5History.prototype.ensureURL = function ensureURL (push) { + if (getLocation(this.base) !== this.current.fullPath) { + var current = cleanPath(this.base + this.current.fullPath); + push ? pushState(current) : replaceState(current); + } + }; + + HTML5History.prototype.getCurrentLocation = function getCurrentLocation () { + return getLocation(this.base) + }; + + return HTML5History; + }(History)); + + function getLocation (base) { + var path = window.location.pathname; + var pathLowerCase = path.toLowerCase(); + var baseLowerCase = base.toLowerCase(); + // base="/a" shouldn't turn path="/app" into "/a/pp" + // https://github.com/vuejs/vue-router/issues/3555 + // so we ensure the trailing slash in the base + if (base && ((pathLowerCase === baseLowerCase) || + (pathLowerCase.indexOf(cleanPath(baseLowerCase + '/')) === 0))) { + path = path.slice(base.length); + } + return (path || '/') + window.location.search + window.location.hash + } + + /* */ + + var HashHistory = /*@__PURE__*/(function (History) { + function HashHistory (router, base, fallback) { + History.call(this, router, base); + // check history fallback deeplinking + if (fallback && checkFallback(this.base)) { + return + } + ensureSlash(); + } + + if ( History ) HashHistory.__proto__ = History; + HashHistory.prototype = Object.create( History && History.prototype ); + HashHistory.prototype.constructor = HashHistory; + + // this is delayed until the app mounts + // to avoid the hashchange listener being fired too early + HashHistory.prototype.setupListeners = function setupListeners () { + var this$1 = this; + + if (this.listeners.length > 0) { + return + } + + var router = this.router; + var expectScroll = router.options.scrollBehavior; + var supportsScroll = supportsPushState && expectScroll; + + if (supportsScroll) { + this.listeners.push(setupScroll()); + } + + var handleRoutingEvent = function () { + var current = this$1.current; + if (!ensureSlash()) { + return + } + this$1.transitionTo(getHash(), function (route) { + if (supportsScroll) { + handleScroll(this$1.router, route, current, true); } - if (options.trigger) return this.loadUrl(fragment); - }, - - // Update the hash location, either replacing the current entry, or adding - // a new one to the browser history. - _updateHash: function (location, fragment, replace) { - if (replace) { - var href = location.href.replace(/(javascript:|#).*$/, ""); - location.replace(href + "#" + fragment); - } else { - // Some browsers require that `hash` contains a leading #. - location.hash = "#" + fragment; + if (!supportsPushState) { + replaceHash(route.fullPath); } + }); + }; + var eventType = supportsPushState ? 'popstate' : 'hashchange'; + window.addEventListener( + eventType, + handleRoutingEvent + ); + this.listeners.push(function () { + window.removeEventListener(eventType, handleRoutingEvent); + }); + }; + + HashHistory.prototype.push = function push (location, onComplete, onAbort) { + var this$1 = this; + + var ref = this; + var fromRoute = ref.current; + this.transitionTo( + location, + function (route) { + pushHash(route.fullPath); + handleScroll(this$1.router, route, fromRoute, false); + onComplete && onComplete(route); + }, + onAbort + ); + }; + + HashHistory.prototype.replace = function replace (location, onComplete, onAbort) { + var this$1 = this; + + var ref = this; + var fromRoute = ref.current; + this.transitionTo( + location, + function (route) { + replaceHash(route.fullPath); + handleScroll(this$1.router, route, fromRoute, false); + onComplete && onComplete(route); + }, + onAbort + ); + }; + + HashHistory.prototype.go = function go (n) { + window.history.go(n); + }; + + HashHistory.prototype.ensureURL = function ensureURL (push) { + var current = this.current.fullPath; + if (getHash() !== current) { + push ? pushHash(current) : replaceHash(current); + } + }; + + HashHistory.prototype.getCurrentLocation = function getCurrentLocation () { + return getHash() + }; + + return HashHistory; + }(History)); + + function checkFallback (base) { + var location = getLocation(base); + if (!/^\/#/.test(location)) { + window.location.replace(cleanPath(base + '/#' + location)); + return true + } + } + + function ensureSlash () { + var path = getHash(); + if (path.charAt(0) === '/') { + return true + } + replaceHash('/' + path); + return false + } + + function getHash () { + // We can't use window.location.hash here because it's not + // consistent across browsers - Firefox will pre-decode it! + var href = window.location.href; + var index = href.indexOf('#'); + // empty path + if (index < 0) { return '' } + + href = href.slice(index + 1); + + return href + } + + function getUrl (path) { + var href = window.location.href; + var i = href.indexOf('#'); + var base = i >= 0 ? href.slice(0, i) : href; + return (base + "#" + path) + } + + function pushHash (path) { + if (supportsPushState) { + pushState(getUrl(path)); + } else { + window.location.hash = path; + } + } + + function replaceHash (path) { + if (supportsPushState) { + replaceState(getUrl(path)); + } else { + window.location.replace(getUrl(path)); + } + } + + /* */ + + var AbstractHistory = /*@__PURE__*/(function (History) { + function AbstractHistory (router, base) { + History.call(this, router, base); + this.stack = []; + this.index = -1; + } + + if ( History ) AbstractHistory.__proto__ = History; + AbstractHistory.prototype = Object.create( History && History.prototype ); + AbstractHistory.prototype.constructor = AbstractHistory; + + AbstractHistory.prototype.push = function push (location, onComplete, onAbort) { + var this$1 = this; + + this.transitionTo( + location, + function (route) { + this$1.stack = this$1.stack.slice(0, this$1.index + 1).concat(route); + this$1.index++; + onComplete && onComplete(route); + }, + onAbort + ); + }; + + AbstractHistory.prototype.replace = function replace (location, onComplete, onAbort) { + var this$1 = this; + + this.transitionTo( + location, + function (route) { + this$1.stack = this$1.stack.slice(0, this$1.index).concat(route); + onComplete && onComplete(route); + }, + onAbort + ); + }; + + AbstractHistory.prototype.go = function go (n) { + var this$1 = this; + + var targetIndex = this.index + n; + if (targetIndex < 0 || targetIndex >= this.stack.length) { + return } - + var route = this.stack[targetIndex]; + this.confirmTransition( + route, + function () { + var prev = this$1.current; + this$1.index = targetIndex; + this$1.updateRoute(route); + this$1.router.afterHooks.forEach(function (hook) { + hook && hook(route, prev); + }); + }, + function (err) { + if (isNavigationFailure(err, NavigationFailureType.duplicated)) { + this$1.index = targetIndex; + } + } + ); + }; + + AbstractHistory.prototype.getCurrentLocation = function getCurrentLocation () { + var current = this.stack[this.stack.length - 1]; + return current ? current.fullPath : '/' + }; + + AbstractHistory.prototype.ensureURL = function ensureURL () { + // noop + }; + + return AbstractHistory; + }(History)); + + /* */ + + var VueRouter = function VueRouter (options) { + if ( options === void 0 ) options = {}; + + this.app = null; + this.apps = []; + this.options = options; + this.beforeHooks = []; + this.resolveHooks = []; + this.afterHooks = []; + this.matcher = createMatcher(options.routes || [], this); + + var mode = options.mode || 'hash'; + this.fallback = + mode === 'history' && !supportsPushState && options.fallback !== false; + if (this.fallback) { + mode = 'hash'; + } + if (!inBrowser) { + mode = 'abstract'; + } + this.mode = mode; + + switch (mode) { + case 'history': + this.history = new HTML5History(this, options.base); + break + case 'hash': + this.history = new HashHistory(this, options.base, this.fallback); + break + case 'abstract': + this.history = new AbstractHistory(this, options.base); + break + default: + { + assert(false, ("invalid mode: " + mode)); + } + } + }; + + var prototypeAccessors = { currentRoute: { configurable: true } }; + + VueRouter.prototype.match = function match (raw, current, redirectedFrom) { + return this.matcher.match(raw, current, redirectedFrom) + }; + + prototypeAccessors.currentRoute.get = function () { + return this.history && this.history.current + }; + + VueRouter.prototype.init = function init (app /* Vue component instance */) { + var this$1 = this; + + this.apps.push(app); + + // set up app destroyed handler + // https://github.com/vuejs/vue-router/issues/2639 + app.once('hook:destroyed', function () { + // clean out app from this.apps array once destroyed + var index = this$1.apps.indexOf(app); + if (index > -1) { this$1.apps.splice(index, 1); } + // ensure we still have a main app or null if no apps + // we do not release the router so it can be reused + if (this$1.app === app) { this$1.app = this$1.apps[0] || null; } + + if (!this$1.app) { this$1.history.teardown(); } + }); + + // main app previously initialized + // return as we don't need to set up new history listener + if (this.app) { + return + } + + this.app = app; + + var history = this.history; + + if (history instanceof HTML5History || history instanceof HashHistory) { + var handleInitialScroll = function (routeOrError) { + var from = history.current; + var expectScroll = this$1.options.scrollBehavior; + var supportsScroll = supportsPushState && expectScroll; + + if (supportsScroll && 'fullPath' in routeOrError) { + handleScroll(this$1, routeOrError, from, false); + } + }; + var setupListeners = function (routeOrError) { + history.setupListeners(); + handleInitialScroll(routeOrError); + }; + history.transitionTo( + history.getCurrentLocation(), + setupListeners, + setupListeners + ); + } + + history.listen(function (route) { + this$1.apps.forEach(function (app) { + app._router.history.current = route; + }); + }); + }; + + VueRouter.prototype.beforeEach = function beforeEach (fn) { + return registerHook(this.beforeHooks, fn) + }; + + VueRouter.prototype.beforeResolve = function beforeResolve (fn) { + return registerHook(this.resolveHooks, fn) + }; + + VueRouter.prototype.afterEach = function afterEach (fn) { + return registerHook(this.afterHooks, fn) + }; + + VueRouter.prototype.onReady = function onReady (cb, errorCb) { + this.history.onReady(cb, errorCb); + }; + + VueRouter.prototype.onError = function onError (errorCb) { + this.history.onError(errorCb); + }; + + VueRouter.prototype.push = function push (location, onComplete, onAbort) { + var this$1 = this; + + // $flow-disable-line + if (!onComplete && !onAbort && typeof Promise !== 'undefined') { + return new Promise(function (resolve, reject) { + this$1.history.push(location, resolve, reject); + }) + } else { + this.history.push(location, onComplete, onAbort); + } + }; + + VueRouter.prototype.replace = function replace (location, onComplete, onAbort) { + var this$1 = this; + + // $flow-disable-line + if (!onComplete && !onAbort && typeof Promise !== 'undefined') { + return new Promise(function (resolve, reject) { + this$1.history.replace(location, resolve, reject); + }) + } else { + this.history.replace(location, onComplete, onAbort); + } + }; + + VueRouter.prototype.go = function go (n) { + this.history.go(n); + }; + + VueRouter.prototype.back = function back () { + this.go(-1); + }; + + VueRouter.prototype.forward = function forward () { + this.go(1); + }; + + VueRouter.prototype.getMatchedComponents = function getMatchedComponents (to) { + var route = to + ? to.matched + ? to + : this.resolve(to).route + : this.currentRoute; + if (!route) { + return [] + } + return [].concat.apply( + [], + route.matched.map(function (m) { + return Object.keys(m.components).map(function (key) { + return m.components[key] + }) + }) + ) + }; + + VueRouter.prototype.resolve = function resolve ( + to, + current, + append + ) { + current = current || this.history.current; + var location = normalizeLocation(to, current, append, this); + var route = this.match(location, current); + var fullPath = route.redirectedFrom || route.fullPath; + var base = this.history.base; + var href = createHref(base, fullPath, this.mode); + return { + location: location, + route: route, + href: href, + // for backwards compat + normalizedTo: location, + resolved: route + } + }; + + VueRouter.prototype.getRoutes = function getRoutes () { + return this.matcher.getRoutes() + }; + + VueRouter.prototype.addRoute = function addRoute (parentOrRoute, route) { + this.matcher.addRoute(parentOrRoute, route); + if (this.history.current !== START) { + this.history.transitionTo(this.history.getCurrentLocation()); + } + }; + + Object.defineProperties( VueRouter.prototype, prototypeAccessors ); + + function registerHook (list, fn) { + list.push(fn); + return function () { + var i = list.indexOf(fn); + if (i > -1) { list.splice(i, 1); } + } + } + + function createHref (base, fullPath, mode) { + var path = mode === 'hash' ? '#' + fullPath : fullPath; + return base ? cleanPath(base + '/' + path) : path + } + + // VueRouter.install = install; + VueRouter.version = '3.5.2'; + VueRouter.isNavigationFailure = isNavigationFailure; + VueRouter.NavigationFailureType = NavigationFailureType; + VueRouter.START_LOCATION = START; + + + var $router, cbs = []; + BI.RouterWidget = BI.inherit(BI.Widget, { + init: function () { + this.$router = this._router = BI.Router.$router = $router = new VueRouter({ + routes: this.options.routes + }); + this.$router.beforeEach(function (to, from, next) { + if (to.matched.length === 0) { + //如果上级也未匹配到路由则跳转主页面,如果上级能匹配到则转上级路由 + from.path ? next({ path: from.path }) : next('/'); + } else { + //如果匹配到正确跳转 + next(); + } + }); + this.$router.afterEach(function () { + cbs.forEach(function (cb) {cb();}); + }); + this.$router.init(this); + } + }); + BI.shortcut("bi.router", BI.RouterWidget); + + BI.RouterView = BI.inherit(BI.Widget, { + props: { + baseCls: 'bi-router-view', + deps: 0, + name: 'default' + }, + created: function () { + var self = this, o = this.options; + cbs.push(this._callbackListener = function () { + var current = $router.history.current; + // 匹配的路径名(/component/:id) + var matchedPath = current.matched[o.deps] && current.matched[o.deps].path; + var component = current.matched[o.deps] && current.matched[o.deps].components[o.name]; + + if (BI.isNotNull(component)) { + if (matchedPath) { + BI.each(current.params, function (key, value) { + // 把 :id 替换成具体的值(/component/demo.td) + matchedPath = matchedPath.replace(`:${key}`, value); + }); + } + self.tab.setSelect(matchedPath || "/"); + } + }); + // "bi.router_view"是由"bi.tab"实现的,cardCreator是一个异步过程,在"bi.router_view"创建之前,cbs里不会有创建子组件的方法,在初始化路由时,没法直接渲染到子组件,所以这里手动加了一次调用 + this._callbackListener(); + }, + render: function () { + var self = this, o = this.options; + return { + type: "bi.tab", + ref: function (_ref) { + self.tab = _ref; + }, + single: false, // 是不是单页面 + logic: { + dynamic: false + }, + showIndex: false, + cardCreator: function (v) { + return $router.history.current.matched[o.deps].components[o.name]; + } + }; + }, + destroyed: function () { + cbs.remove(this._callbackListener); + } }); - - // Create the default BI.history. - BI.history = new History; -}()); \ No newline at end of file + BI.shortcut("bi.router_view", BI.RouterView); + + BI.Router = BI.Router || VueRouter; + BI.Router.isSameRoute = isSameRoute; + return VueRouter; + + }))); + \ No newline at end of file diff --git a/src/router/router_old.js b/src/router/router_old.js new file mode 100644 index 000000000..279289fc0 --- /dev/null +++ b/src/router/router_old.js @@ -0,0 +1,627 @@ +(function () { + var Events = { + + // Bind an event to a `callback` function. Passing `"all"` will bind + // the callback to all events fired. + on: function (name, callback, context) { + if (!eventsApi(this, "on", name, [callback, context]) || !callback) return this; + this._events || (this._events = {}); + var events = this._events[name] || (this._events[name] = []); + events.push({callback: callback, context: context, ctx: context || this}); + return this; + }, + + // Bind an event to only be triggered a single time. After the first time + // the callback is invoked, it will be removed. + once: function (name, callback, context) { + if (!eventsApi(this, "once", name, [callback, context]) || !callback) return this; + var self = this; + var once = _.once(function () { + self.off(name, once); + callback.apply(this, arguments); + }); + once._callback = callback; + return this.on(name, once, context); + }, + + // Remove one or many callbacks. If `context` is null, removes all + // callbacks with that function. If `callback` is null, removes all + // callbacks for the event. If `name` is null, removes all bound + // callbacks for all events. + off: function (name, callback, context) { + if (!this._events || !eventsApi(this, "off", name, [callback, context])) return this; + + // Remove all callbacks for all events. + if (!name && !callback && !context) { + this._events = void 0; + return this; + } + + var names = name ? [name] : _.keys(this._events); + for (var i = 0, length = names.length; i < length; i++) { + name = names[i]; + + // Bail out if there are no events stored. + var events = this._events[name]; + if (!events) continue; + + // Remove all callbacks for this event. + if (!callback && !context) { + delete this._events[name]; + continue; + } + + // Find any remaining events. + var remaining = []; + for (var j = 0, k = events.length; j < k; j++) { + var event = events[j]; + if ( + callback && callback !== event.callback && + callback !== event.callback._callback || + context && context !== event.context + ) { + remaining.push(event); + } + } + + // Replace events if there are any remaining. Otherwise, clean up. + if (remaining.length) { + this._events[name] = remaining; + } else { + delete this._events[name]; + } + } + + return this; + }, + + un: function () { + this.off.apply(this, arguments); + }, + + // Trigger one or many events, firing all bound callbacks. Callbacks are + // passed the same arguments as `trigger` is, apart from the event name + // (unless you're listening on `"all"`, which will cause your callback to + // receive the true name of the event as the first argument). + trigger: function (name) { + if (!this._events) return this; + var args = slice.call(arguments, 1); + if (!eventsApi(this, "trigger", name, args)) return this; + var events = this._events[name]; + var allEvents = this._events.all; + if (events) triggerEvents(events, args); + if (allEvents) triggerEvents(allEvents, arguments); + return this; + }, + + fireEvent: function () { + this.trigger.apply(this, arguments); + }, + + // Inversion-of-control versions of `on` and `once`. Tell *this* object to + // listen to an event in another object ... keeping track of what it's + // listening to. + listenTo: function (obj, name, callback) { + var listeningTo = this._listeningTo || (this._listeningTo = {}); + var id = obj._listenId || (obj._listenId = _.uniqueId("l")); + listeningTo[id] = obj; + if (!callback && typeof name === "object") callback = this; + obj.on(name, callback, this); + return this; + }, + + listenToOnce: function (obj, name, callback) { + if (typeof name === "object") { + for (var event in name) this.listenToOnce(obj, event, name[event]); + return this; + } + if (eventSplitter.test(name)) { + var names = name.split(eventSplitter); + for (var i = 0, length = names.length; i < length; i++) { + this.listenToOnce(obj, names[i], callback); + } + return this; + } + if (!callback) return this; + var once = _.once(function () { + this.stopListening(obj, name, once); + callback.apply(this, arguments); + }); + once._callback = callback; + return this.listenTo(obj, name, once); + }, + + // Tell this object to stop listening to either specific events ... or + // to every object it's currently listening to. + stopListening: function (obj, name, callback) { + var listeningTo = this._listeningTo; + if (!listeningTo) return this; + var remove = !name && !callback; + if (!callback && typeof name === "object") callback = this; + if (obj) (listeningTo = {})[obj._listenId] = obj; + for (var id in listeningTo) { + obj = listeningTo[id]; + obj.off(name, callback, this); + if (remove || _.isEmpty(obj._events)) delete this._listeningTo[id]; + } + return this; + } + + }; + + // Regular expression used to split event strings. + var eventSplitter = /\s+/; + + // Implement fancy features of the Events API such as multiple event + // names `"change blur"` and jQuery-style event maps `{change: action}` + // in terms of the existing API. + var eventsApi = function (obj, action, name, rest) { + if (!name) return true; + + // Handle event maps. + if (typeof name === "object") { + for (var key in name) { + obj[action].apply(obj, [key, name[key]].concat(rest)); + } + return false; + } + + // Handle space separated event names. + if (eventSplitter.test(name)) { + var names = name.split(eventSplitter); + for (var i = 0, length = names.length; i < length; i++) { + obj[action].apply(obj, [names[i]].concat(rest)); + } + return false; + } + + return true; + }; + + // A difficult-to-believe, but optimized internal dispatch function for + // triggering events. Tries to keep the usual cases speedy (most internal + // BI events have 3 arguments). + var triggerEvents = function (events, args) { + var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2]; + switch (args.length) { + case 0: + while (++i < l) (ev = events[i]).callback.call(ev.ctx); + return; + case 1: + while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); + return; + case 2: + while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); + return; + case 3: + while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); + return; + default: + while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); + return; + } + }; + + // BI.Router + // --------------- + + // Routers map faux-URLs to actions, and fire events when routes are + // matched. Creating a new one sets its `routes` hash, if not set statically. + var Router = BI.Router = function (options) { + options || (options = {}); + if (options.routes) this.routes = options.routes; + this._bindRoutes(); + this._init.apply(this, arguments); + }; + + // Cached regular expressions for matching named param parts and splatted + // parts of route strings. + var optionalParam = /\((.*?)\)/g; + var namedParam = /(\(\?)?:\w+/g; + var splatParam = /\*\w+/g; + var escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g; + + // Set up all inheritable **BI.Router** properties and methods. + _.extend(Router.prototype, Events, { + + // _init is an empty function by default. Override it with your own + // initialization logic. + _init: function () { + }, + + // Manually bind a single named route to a callback. For example: + // + // this.route('search/:query/p:num', 'search', function(query, num) { + // ... + // }); + // + route: function (route, name, callback) { + if (!_.isRegExp(route)) route = this._routeToRegExp(route); + if (_.isFunction(name)) { + callback = name; + name = ""; + } + if (!callback) callback = this[name]; + var router = this; + BI.history.route(route, function (fragment) { + var args = router._extractParameters(route, fragment); + if (router.execute(callback, args, name) !== false) { + router.trigger.apply(router, ["route:" + name].concat(args)); + router.trigger("route", name, args); + BI.history.trigger("route", router, name, args); + } + }); + return this; + }, + + // Execute a route handler with the provided parameters. This is an + // excellent place to do pre-route setup or post-route cleanup. + execute: function (callback, args, name) { + if (callback) callback.apply(this, args); + }, + + // Simple proxy to `BI.history` to save a fragment into the history. + navigate: function (fragment, options) { + BI.history.navigate(fragment, options); + return this; + }, + + // Bind all defined routes to `BI.history`. We have to reverse the + // order of the routes here to support behavior where the most general + // routes can be defined at the bottom of the route map. + _bindRoutes: function () { + if (!this.routes) return; + this.routes = _.result(this, "routes"); + var route, routes = _.keys(this.routes); + while ((route = routes.pop()) != null) { + this.route(route, this.routes[route]); + } + }, + + // Convert a route string into a regular expression, suitable for matching + // against the current location hash. + _routeToRegExp: function (route) { + route = route.replace(escapeRegExp, "\\$&") + .replace(optionalParam, "(?:$1)?") + .replace(namedParam, function (match, optional) { + return optional ? match : "([^/?]+)"; + }) + .replace(splatParam, "([^?]*?)"); + return new RegExp("^" + route + "(?:\\?([\\s\\S]*))?$"); + }, + + // Given a route, and a URL fragment that it matches, return the array of + // extracted decoded parameters. Empty or unmatched parameters will be + // treated as `null` to normalize cross-browser behavior. + _extractParameters: function (route, fragment) { + var params = route.exec(fragment).slice(1); + return _.map(params, function (param, i) { + // Don't decode the search params. + if (i === params.length - 1) return param || null; + var resultParam = null; + if (param) { + try { + resultParam = decodeURIComponent(param); + } catch (e) { + resultParam = param; + } + } + return resultParam; + }); + } + + }); + + // History + // ---------------- + + // Handles cross-browser history management, based on either + // [pushState](http://diveintohtml5.info/history.html) and real URLs, or + // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange) + // and URL fragments. If the browser supports neither (old IE, natch), + // falls back to polling. + var History = function () { + this.handlers = []; + this.checkUrl = _.bind(this.checkUrl, this); + + // Ensure that `History` can be used outside of the browser. + if (typeof window !== "undefined") { + this.location = _global.location; + this.history = _global.history; + } + }; + + // Cached regex for stripping a leading hash/slash and trailing space. + var routeStripper = /^[#\/]|\s+$/g; + + // Cached regex for stripping leading and trailing slashes. + var rootStripper = /^\/+|\/+$/g; + + // Cached regex for stripping urls of hash. + var pathStripper = /#.*$/; + + // Has the history handling already been started? + History.started = false; + + // Set up all inheritable **BI.History** properties and methods. + _.extend(History.prototype, Events, { + + // The default interval to poll for hash changes, if necessary, is + // twenty times a second. + interval: 50, + + // Are we at the app root? + atRoot: function () { + var path = this.location.pathname.replace(/[^\/]$/, "$&/"); + return path === this.root && !this.getSearch(); + }, + + // In IE6, the hash fragment and search params are incorrect if the + // fragment contains `?`. + getSearch: function () { + var match = this.location.href.replace(/#.*/, "").match(/\?.+/); + return match ? match[0] : ""; + }, + + // Gets the true hash value. Cannot use location.hash directly due to bug + // in Firefox where location.hash will always be decoded. + getHash: function (window) { + var match = (window || this).location.href.match(/#(.*)$/); + return match ? match[1] : ""; + }, + + // Get the pathname and search params, without the root. + getPath: function () { + var path = this.location.pathname + this.getSearch(); + try { + path = decodeURI(path); + } catch(e) { + } + var root = this.root.slice(0, -1); + if (!path.indexOf(root)) path = path.slice(root.length); + return path.charAt(0) === "/" ? path.slice(1) : path; + }, + + // Get the cross-browser normalized URL fragment from the path or hash. + getFragment: function (fragment) { + if (fragment == null) { + if (this._hasPushState || !this._wantsHashChange) { + fragment = this.getPath(); + } else { + fragment = this.getHash(); + } + } + return fragment.replace(routeStripper, ""); + }, + + // Start the hash change handling, returning `true` if the current URL matches + // an existing route, and `false` otherwise. + start: function (options) { + if (History.started) throw new Error("BI.history has already been started"); + History.started = true; + + // Figure out the initial configuration. Do we need an iframe? + // Is pushState desired ... is it available? + this.options = _.extend({root: "/"}, this.options, options); + this.root = this.options.root; + this._wantsHashChange = this.options.hashChange !== false; + this._hasHashChange = "onhashchange" in window; + this._wantsPushState = !!this.options.pushState; + this._hasPushState = !!(this.options.pushState && this.history && this.history.pushState); + this.fragment = this.getFragment(); + + // Normalize root to always include a leading and trailing slash. + this.root = ("/" + this.root + "/").replace(rootStripper, "/"); + + // Transition from hashChange to pushState or vice versa if both are + // requested. + if (this._wantsHashChange && this._wantsPushState) { + + // If we've started off with a route from a `pushState`-enabled + // browser, but we're currently in a browser that doesn't support it... + if (!this._hasPushState && !this.atRoot()) { + var root = this.root.slice(0, -1) || "/"; + this.location.replace(root + "#" + this.getPath()); + // Return immediately as browser will do redirect to new url + return true; + + // Or if we've started out with a hash-based route, but we're currently + // in a browser where it could be `pushState`-based instead... + } else if (this._hasPushState && this.atRoot()) { + this.navigate(this.getHash(), {replace: true}); + } + + } + + // Proxy an iframe to handle location events if the browser doesn't + // support the `hashchange` event, HTML5 history, or the user wants + // `hashChange` but not `pushState`. + if (!this._hasHashChange && this._wantsHashChange && (!this._wantsPushState || !this._hasPushState)) { + var iframe = document.createElement("iframe"); + iframe.src = "javascript:0"; + iframe.style.display = "none"; + iframe.tabIndex = -1; + var body = document.body; + // Using `appendChild` will throw on IE < 9 if the document is not ready. + this.iframe = body.insertBefore(iframe, body.firstChild).contentWindow; + this.iframe.document.open().close(); + this.iframe.location.hash = "#" + this.fragment; + } + + // Add a cross-platform `addEventListener` shim for older browsers. + var addEventListener = _global.addEventListener || function (eventName, listener) { + return attachEvent("on" + eventName, listener); + }; + + // Depending on whether we're using pushState or hashes, and whether + // 'onhashchange' is supported, determine how we check the URL state. + if (this._hasPushState) { + addEventListener("popstate", this.checkUrl, false); + } else if (this._wantsHashChange && this._hasHashChange && !this.iframe) { + addEventListener("hashchange", this.checkUrl, false); + } else if (this._wantsHashChange) { + this._checkUrlInterval = setInterval(this.checkUrl, this.interval); + } + + if (!this.options.silent) return this.loadUrl(); + }, + + // Disable BI.history, perhaps temporarily. Not useful in a real app, + // but possibly useful for unit testing Routers. + stop: function () { + // Add a cross-platform `removeEventListener` shim for older browsers. + var removeEventListener = _global.removeEventListener || function (eventName, listener) { + return detachEvent("on" + eventName, listener); + }; + + // Remove window listeners. + if (this._hasPushState) { + removeEventListener("popstate", this.checkUrl, false); + } else if (this._wantsHashChange && this._hasHashChange && !this.iframe) { + removeEventListener("hashchange", this.checkUrl, false); + } + + // Clean up the iframe if necessary. + if (this.iframe) { + document.body.removeChild(this.iframe.frameElement); + this.iframe = null; + } + + // Some environments will throw when clearing an undefined interval. + if (this._checkUrlInterval) clearInterval(this._checkUrlInterval); + History.started = false; + }, + + // Add a route to be tested when the fragment changes. Routes added later + // may override previous routes. + route: function (route, callback) { + this.handlers.unshift({route: route, callback: callback}); + }, + + // check route is Exist. if exist, return the route + checkRoute: function (route) { + for (var i = 0; i < this.handlers.length; i++) { + if (this.handlers[i].route.toString() === Router.prototype._routeToRegExp(route).toString()) { + return this.handlers[i]; + } + } + + return null; + }, + + // remove a route match in routes + unRoute: function (route) { + var index = _.findIndex(this.handlers, function (handler) { + return handler.route.test(route); + }); + if (index > -1) { + this.handlers.splice(index, 1); + } + }, + + // Checks the current URL to see if it has changed, and if it has, + // calls `loadUrl`, normalizing across the hidden iframe. + checkUrl: function (e) { + var current = this.getFragment(); + try { + // getFragment 得到的值是编码过的,而this.fragment是没有编码过的 + // 英文路径没有问题,遇上中文和空格有问题了 + current = decodeURIComponent(current); + } catch(e) { + } + // If the user pressed the back button, the iframe's hash will have + // changed and we should use that for comparison. + if (current === this.fragment && this.iframe) { + current = this.getHash(this.iframe); + } + + if (current === this.fragment) return false; + if (this.iframe) this.navigate(current); + this.loadUrl(); + }, + + // Attempt to load the current URL fragment. If a route succeeds with a + // match, returns `true`. If no defined routes matches the fragment, + // returns `false`. + loadUrl: function (fragment) { + fragment = this.fragment = this.getFragment(fragment); + return _.some(this.handlers, function (handler) { + if (handler.route.test(fragment)) { + handler.callback(fragment); + return true; + } + }); + }, + + // Save a fragment into the hash history, or replace the URL state if the + // 'replace' option is passed. You are responsible for properly URL-encoding + // the fragment in advance. + // + // The options object can contain `trigger: true` if you wish to have the + // route callback be fired (not usually desirable), or `replace: true`, if + // you wish to modify the current URL without adding an entry to the history. + navigate: function (fragment, options) { + if (!History.started) return false; + if (!options || options === true) options = {trigger: !!options}; + + // Normalize the fragment. + fragment = this.getFragment(fragment || ""); + + // Don't include a trailing slash on the root. + var root = this.root; + if (fragment === "" || fragment.charAt(0) === "?") { + root = root.slice(0, -1) || "/"; + } + var url = root + fragment; + + // Strip the hash and decode for matching. + fragment = fragment.replace(pathStripper, "") + try { + fragment = decodeURI(fragment); + } catch(e) { + } + + if (this.fragment === fragment) return; + this.fragment = fragment; + + // If pushState is available, we use it to set the fragment as a real URL. + if (this._hasPushState) { + this.history[options.replace ? "replaceState" : "pushState"]({}, document.title, url); + + // If hash changes haven't been explicitly disabled, update the hash + // fragment to store history. + } else if (this._wantsHashChange) { + this._updateHash(this.location, fragment, options.replace); + if (this.iframe && (fragment !== this.getHash(this.iframe))) { + // Opening and closing the iframe tricks IE7 and earlier to push a + // history entry on hash-tag change. When replace is true, we don't + // want this. + if (!options.replace) this.iframe.document.open().close(); + this._updateHash(this.iframe.location, fragment, options.replace); + } + + // If you've told us that you explicitly don't want fallback hashchange- + // based history, then `navigate` becomes a page refresh. + } else { + return this.location.assign(url); + } + if (options.trigger) return this.loadUrl(fragment); + }, + + // Update the hash location, either replacing the current entry, or adding + // a new one to the browser history. + _updateHash: function (location, fragment, replace) { + if (replace) { + var href = location.href.replace(/(javascript:|#).*$/, ""); + location.replace(href + "#" + fragment); + } else { + // Some browsers require that `hash` contains a leading #. + location.hash = "#" + fragment; + } + } + + }); + + // Create the default BI.history. + BI.history = new History; +}()); \ No newline at end of file diff --git a/webpack/attachments.js b/webpack/attachments.js index a4328bd29..f015af5a4 100644 --- a/webpack/attachments.js +++ b/webpack/attachments.js @@ -38,8 +38,11 @@ const basicAttachmentMap = { "src/widget/**/*.js", "src/component/**/*.js", ]), + router_old: sync([ + "src/router/router_old.js", + ]), router: sync([ - "src/router/**/*.js", + "src/router/router.js", ]), 'core_without_normalize': sync( ["src/less/core/**/*.less", "src/less/theme/**/*.less", "!src/less/core/normalize.less", "!src/less/core/normalize2.less"], @@ -139,6 +142,19 @@ const fineui = [].concat( basicAttachmentMap.ts, ); +const fineui_old = [].concat( + basicAttachmentMap.polyfill, + basicAttachmentMap.core, + basicAttachmentMap.fix, + basicAttachmentMap.base, + basicAttachmentMap.case, + basicAttachmentMap.widget, + basicAttachmentMap.router_old, + [fixCompact, workerCompact], + basicAttachmentMap.ui, + basicAttachmentMap.ts, +); + const fineuiModern = [].concat( sync(["src/less/modern.less"]), sync([ @@ -159,6 +175,18 @@ const fineuiProxy = [].concat( basicAttachmentMap.ts, ); +const fineuiProxy_old = [].concat( + basicAttachmentMap.core, + basicAttachmentMap.fixProxy, + basicAttachmentMap.base, + basicAttachmentMap.case, + basicAttachmentMap.widget, + basicAttachmentMap.router_old, + [fixCompact, workerCompact], + basicAttachmentMap.ui, + basicAttachmentMap.ts, +); + const fineuiWithoutJqueryAndPolyfillJs = [].concat( sync([ "src/core/0.foundation.js", @@ -183,11 +211,11 @@ const fineuiWithoutJqueryAndPolyfillJs = [].concat( const demo = [].concat( basicAttachmentMap.polyfill, basicAttachmentMap.core, - basicAttachmentMap.router, basicAttachmentMap.fix, basicAttachmentMap.base, basicAttachmentMap.case, basicAttachmentMap.widget, + basicAttachmentMap.router, sync(["public/less/app.less", "public/less/**/*.less"]), [fixCompact, workerCompact], basicAttachmentMap.config, @@ -205,8 +233,10 @@ module.exports = { fineuiWithoutNormalize: uniq(fineuiWithoutNormalize), bundleWithoutNormalize: uniq(bundleWithoutNormalize), fineui: uniq(fineui), + fineui_old: uniq(fineui_old), fineuiModern: uniq(fineuiModern), fineuiProxy: uniq(fineuiProxy), + fineuiProxy_old: uniq(fineuiProxy_old), fineuiWithoutJqueryAndPolyfillJs: uniq(fineuiWithoutJqueryAndPolyfillJs), utils: uniq(basicAttachmentMap.utils), demo: uniq(demo), diff --git a/webpack/webpack.common.js b/webpack/webpack.common.js index a8177cf7c..e0c190d61 100644 --- a/webpack/webpack.common.js +++ b/webpack/webpack.common.js @@ -24,7 +24,9 @@ module.exports = { demo: attachments.demo, // 用于启动dev模式时,工程引用调试 fineui: attachments.fineui, + "fineui.old": attachments.fineui_old, "fineui.proxy": attachments.fineuiProxy, + "fineui.proxy.old": attachments.fineuiProxy_old, }, externals: { lodash: '_', From 871e67d824964d8477d65a81bc4a00334942666b Mon Sep 17 00:00:00 2001 From: guy Date: Wed, 15 Dec 2021 13:50:28 +0800 Subject: [PATCH 10/46] =?UTF-8?q?router=E6=8D=A2=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webpack/attachments.js | 32 +------------------------------- webpack/webpack.common.js | 2 -- 2 files changed, 1 insertion(+), 33 deletions(-) diff --git a/webpack/attachments.js b/webpack/attachments.js index f015af5a4..95b166f1e 100644 --- a/webpack/attachments.js +++ b/webpack/attachments.js @@ -38,11 +38,8 @@ const basicAttachmentMap = { "src/widget/**/*.js", "src/component/**/*.js", ]), - router_old: sync([ - "src/router/router_old.js", - ]), router: sync([ - "src/router/router.js", + "src/router/**/*.js", ]), 'core_without_normalize': sync( ["src/less/core/**/*.less", "src/less/theme/**/*.less", "!src/less/core/normalize.less", "!src/less/core/normalize2.less"], @@ -142,19 +139,6 @@ const fineui = [].concat( basicAttachmentMap.ts, ); -const fineui_old = [].concat( - basicAttachmentMap.polyfill, - basicAttachmentMap.core, - basicAttachmentMap.fix, - basicAttachmentMap.base, - basicAttachmentMap.case, - basicAttachmentMap.widget, - basicAttachmentMap.router_old, - [fixCompact, workerCompact], - basicAttachmentMap.ui, - basicAttachmentMap.ts, -); - const fineuiModern = [].concat( sync(["src/less/modern.less"]), sync([ @@ -175,18 +159,6 @@ const fineuiProxy = [].concat( basicAttachmentMap.ts, ); -const fineuiProxy_old = [].concat( - basicAttachmentMap.core, - basicAttachmentMap.fixProxy, - basicAttachmentMap.base, - basicAttachmentMap.case, - basicAttachmentMap.widget, - basicAttachmentMap.router_old, - [fixCompact, workerCompact], - basicAttachmentMap.ui, - basicAttachmentMap.ts, -); - const fineuiWithoutJqueryAndPolyfillJs = [].concat( sync([ "src/core/0.foundation.js", @@ -233,10 +205,8 @@ module.exports = { fineuiWithoutNormalize: uniq(fineuiWithoutNormalize), bundleWithoutNormalize: uniq(bundleWithoutNormalize), fineui: uniq(fineui), - fineui_old: uniq(fineui_old), fineuiModern: uniq(fineuiModern), fineuiProxy: uniq(fineuiProxy), - fineuiProxy_old: uniq(fineuiProxy_old), fineuiWithoutJqueryAndPolyfillJs: uniq(fineuiWithoutJqueryAndPolyfillJs), utils: uniq(basicAttachmentMap.utils), demo: uniq(demo), diff --git a/webpack/webpack.common.js b/webpack/webpack.common.js index e0c190d61..a8177cf7c 100644 --- a/webpack/webpack.common.js +++ b/webpack/webpack.common.js @@ -24,9 +24,7 @@ module.exports = { demo: attachments.demo, // 用于启动dev模式时,工程引用调试 fineui: attachments.fineui, - "fineui.old": attachments.fineui_old, "fineui.proxy": attachments.fineuiProxy, - "fineui.proxy.old": attachments.fineuiProxy_old, }, externals: { lodash: '_', From b31d448e8fb90d7a10a97a809aeba3f1d7cc3f38 Mon Sep 17 00:00:00 2001 From: guy Date: Wed, 15 Dec 2021 13:56:55 +0800 Subject: [PATCH 11/46] =?UTF-8?q?router=E6=8D=A2=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/{router_old.js => 0.router.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/router/{router_old.js => 0.router.js} (100%) diff --git a/src/router/router_old.js b/src/router/0.router.js similarity index 100% rename from src/router/router_old.js rename to src/router/0.router.js From b58f3e50d4654b1232b3364e37331356a47d4772 Mon Sep 17 00:00:00 2001 From: data Date: Wed, 15 Dec 2021 14:13:55 +0800 Subject: [PATCH 12/46] auto upgrade version to 2.0.20211215141320 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 48cbd10ca..6cd0cf454 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211215102248", + "version": "2.0.20211215141320", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From b2b6ba3b22b2efc9ded114a66fbb532945e176ae Mon Sep 17 00:00:00 2001 From: guy Date: Wed, 15 Dec 2021 17:50:33 +0800 Subject: [PATCH 13/46] bugfix --- src/base/single/button/buttons/button.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/base/single/button/buttons/button.js b/src/base/single/button/buttons/button.js index b5dc71c27..cb3024664 100644 --- a/src/base/single/button/buttons/button.js +++ b/src/base/single/button/buttons/button.js @@ -61,7 +61,7 @@ BI.Button = BI.inherit(BI.BasicButton, { type: "bi.icon_label", cls: o.iconCls, width: this._const.iconWidth, - height: o.height, + height: lineHeight, lineHeight: lineHeight, iconWidth: o.iconWidth, iconHeight: o.iconHeight @@ -71,7 +71,7 @@ BI.Button = BI.inherit(BI.BasicButton, { text: o.text, textWidth: BI.isNotNull(o.textWidth) ? o.textWidth - this._const.iconWidth : null, textHeight: textHeight, - height: o.height, + height: lineHeight, value: o.value }); BI.createWidget({ @@ -88,7 +88,7 @@ BI.Button = BI.inherit(BI.BasicButton, { } else { this.text = BI.createWidget({ type: "bi.label", - height: o.height, + height: lineHeight, textAlign: o.textAlign, whiteSpace: o.whiteSpace, textWidth: o.textWidth, From 62582a451e1d38de7e75095f55e83949aa8866a1 Mon Sep 17 00:00:00 2001 From: data Date: Wed, 15 Dec 2021 18:02:58 +0800 Subject: [PATCH 14/46] auto upgrade version to 2.0.20211215180253 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6cd0cf454..2acd95b9c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211215141320", + "version": "2.0.20211215180253", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From 70df786345a0e4587861d55e345f6337c3ac9b3b Mon Sep 17 00:00:00 2001 From: guy Date: Wed, 15 Dec 2021 18:06:30 +0800 Subject: [PATCH 15/46] bugfix --- src/base/single/button/buttons/button.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/base/single/button/buttons/button.js b/src/base/single/button/buttons/button.js index cb3024664..4337a9540 100644 --- a/src/base/single/button/buttons/button.js +++ b/src/base/single/button/buttons/button.js @@ -88,7 +88,7 @@ BI.Button = BI.inherit(BI.BasicButton, { } else { this.text = BI.createWidget({ type: "bi.label", - height: lineHeight, + height: o.height, textAlign: o.textAlign, whiteSpace: o.whiteSpace, textWidth: o.textWidth, From c2fe646860a949f6965ff2cb837ba53d0808eab2 Mon Sep 17 00:00:00 2001 From: data Date: Wed, 15 Dec 2021 18:15:18 +0800 Subject: [PATCH 16/46] auto upgrade version to 2.0.20211215181455 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2acd95b9c..b504fc451 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211215180253", + "version": "2.0.20211215181455", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From 9c6994e4adf742a39b48f6f4927cbcfec21d95e2 Mon Sep 17 00:00:00 2001 From: "Oliver.Ke" Date: Wed, 15 Dec 2021 18:34:12 +0800 Subject: [PATCH 17/46] =?UTF-8?q?CHART-22285=20feat:=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=AD=97=E4=BD=93=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/font/iconfont.eot | Bin 154932 -> 154964 bytes dist/font/iconfont.svg | 6 +++--- dist/font/iconfont.ttf | Bin 154764 -> 154796 bytes dist/font/iconfont.woff | Bin 77640 -> 77660 bytes dist/font/iconfont.woff2 | Bin 61992 -> 61896 bytes 5 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/font/iconfont.eot b/dist/font/iconfont.eot index 60f0cedee6f3df9b91466aa90632e11a1531c724..85b408922bef4d8541387be60e464dcd0a8f909d 100644 GIT binary patch delta 2333 zcmYjSYgm&<7M|}*2#^E_5)vA@gb=wIFyv0afQkq)B8G^F7$Qc%6hnl75z$bjm?A0y z>nc@Bt&7S+q^PKf6e-197A;a1l`5i3Q;HV3D7q2%1H0RuGiTm8@0>H|dEOs07g}t4 zTWqal8(~m?*ou!XTUDh#9KJs&833ph0HD~sZIdQD>c&+7aMJ+LO=%fBQ?J|BVFBQp z0QBCFzGairD~w@v*utFgq)lkcYDj060yPnXMgiJ$)U(+*Sa*$10Q%!&P0i zsw~+dbPC|mNCyCZexil`ixu_I9jN5I4i3SFrGq)zDg~hCb_@iOzL<1?w&EcL7=T82 z*j!{T`S1aNVaRNlMPxt#V}(CIf?rS98vrmPK6`=ri;oUq1WP_Ta^>t0gHfmy>V+fV zE>t9H3|(v`vFgVdt>bN6Y);yWu>dQ^-or`pXuQErWY=lWw7=}2ap)jO2tAH@j(ziv zIJr3GI}H%)oJr1Aq!iLHIh|~B33R!w|HPkiX8vPWft%1xL;=)s`Usg<7Io;uHA z8j%)GJ4NgAVtSeAp>)#%%!1Sf!`_uXXrG%t7T+Y_Za!jj~}ji5v=F7FJV%8%hI`5giqL8ah~;GSSS7z8VW+k!`gRH0OuCo~9+!nP1hNPb9r zNOy=iR2zCQw03dA;uevsNG>vk!QnPbY?f3nEnY^5U@W&^-Vr&lqAp4uO^Hs4z9*K8 z^H)+dE z=f3X9I!i+BdT}Bpv1J2xL&Ao^Bz00%l6fO_qi$ojJYIew**{s8tV=FS9#BLo#x{j- zvZO?&l%o$0s zYFm-oRb7~g$&_SfW%g=9HFcWT+x@pIw;QvFS-Dx=+1}aG?9yzbHbXm}W0S+oQRkR) z@wtNB(jBflG&}lriMoNE(w%KPr}LKP73Ov9qVF>7YT0GZ$LG`Y_w1(ZPTXzS-M)vq zN21@;y63e%U*A(eEKnA_{H(ALE*#n$vsbfsvM9G`{PUxqPZpOJ5ABofYco&`H3st+ zi6z7mRY}|ag#EWmg{9pGLVq5e@#D%Jt{p~cFg9Oo_6eL6}76mYUaz>FUO8opP-*mpJ=OQ zR2#lRe^p#VtSPRU{95^S>q+5B%{K|(7*8=zJ^q`qmRg%wTVC6Bdg#I?tLirAwtnai>rT;~L6g|jWSabkp&Q+;?H;%* zx~sW6axd?m5Vfzp}sY z0q24CLC-_x!>mWdNAgGIk4yu!fwrF&k9m&`kEfp$KN%hr4JrpOKb1W#dD<}q52=QF zo<-@O6+i2IHu{|KT<~1}-1INWFnTz3_|)*^FU()6&Gu%o`JnmXud-j8M+hUOBhP=6 z{8lr{8qFG=dExq^^u_qgjF-c|OMf38Q;apeLchv?b$lE>UNmkRADtjg1Wv?GF3fj6x<;p@4Q+ny?NISX2zM=Eh0+adCV& zQYf6+mYogzDU~yQ$h&ppy|WX=37N2Ird%$E)SN$hcObo~fDU{?6i5ev?L+oq@p*G5 zg64pXL0e<2F%>ESMepP7#b=R8e;S)l#yCJUAMZcSi~D~W{2(&Px)6q80zE7&KAOpN zOQHCA2L##9_jF;iX?(ssGjh+l?2jUgpg;&!k;wPZZ^1j!{r2wH?MBJhqO+bvFB5;d zbz}0%Xl@|c1#{SHsQv^eo6u~eAQ*pYjo78E#t?D#wj!ibQRc+PgU^BMn%<YGNCJec1X%(mAqg==2xK8(3>-y3KpP`cjBJeosUkv*h)57zc$%Ut zMX+e8^&!Q86c9B0K|W>BOxu{tCF`SsOWy`T}5+TR0$Ff<6f;LUZ5+P4FFJ5+RhBkx9a9603ONxVzscw*kSBe51dCbN5UCe7PPF2OXX@kqdmKMk-Wa; zyycl*ncgdFSM957^_>;i3sMD@f>FVO zkR;>?Rl+h6RumwTiyA~T;yiJg__}yV{Kil2XYlKjU?nn1vP3JXlo%va{wepy7Y5#3@WB3=Kbd2&0R{RvOw9p1-nJPr8Ra{?AbVnxac@_TuxkPyl?zq0xw}K z(Kj(Caqx>sRgmheYHq7mjZufF3)OFuB9l6keUo+d+o;=2DeF_}Q^vj&emSwdcKgJR z=pE^)nAEh?shyIY@jGv%anj1up6_zlCErz<4yCKoTQf)*vW%>ZN==MrNHepWx?8#1 zxO-O1)Mo9$?1|mekr|TNxmUK=uy-WOD=RIlVIN_ic3;iD-hH##gzWA6QTs#oYxmdZ zU~?q8oZ6h{x)fboE|e?J9XOD7U?Q(OKOjFgfB2y4;LxGNhlUSl9qv97bi`1ADkv=I z{YS`A=xFp&!?ECFSM+Rs>sQ>bste_XSB|rf*PLLU(46QvF;OHhYA!|6lIz+!^xI$52v?r2?C-BdlUo>RZQzP^6^BKxBDV*AB~264lg zhB4ibvLCA&k2bb94mI(cBAYUs8k?bJS#!rF+$H6unif=xvZbn}y=Ck&?TYCt@2c|Z zlrh{m@RRDN>#e-j;?}NfsB78Rs;{fBkNzC|^SL%`TUJ~5FJ8a2-QeCRzX{z`wd2}D z+H>3Q-(ugYzBSR2+HtC5%+?qlNsZou$I)0^Q32pJ0u^fej4;N^J&A=iQ(ws zwr4`!GtINcXZ_C>o-?0^KR3RRyfBR@Mv6ykH5ye&U!ucCgx4gU$Vb?CL$-QCQNTr-X48xGNqf0rv6F9r1PY7QZ=cc zyfWE8g_{yj#ZMJXHB6(X+0!A@$c-(GpAe(~1qyOoc!_CR&H1nAGwE6x8{zC9VBVcL%Bw8G>07`O%4j{4Qq|il2rjzLc zy1+-^18$UZf`T~Gk1IJVVdW?kVBkClZDWImdSM?YlW|~$xE#*H!>A~*cH_p6z_MkW z3-bqT@wTu+c^C5XE_f`SvFO^MTL2XZ2GjsR6pCP>*i(G?B8rGbLDG>dCW~o>)LCIc z5*4&WS}g)*2o`T7$)0bn5DD!+6$wQ?QjiClv*tpW$FicZKJ{GeDioRX<<@vtMn+b0 zDkNWPp}Hya58R@Z%Y$S*4|^iP33@C+$E)hPd0qc}FN1gCU`vH>?3!YpSh0T|ueH)|z0u z#E#%Z1gmj&PN0Rq$QDDeSz>FAaU`LwtVw7)CyzBC9Zy0#lED`^tTP1p2SX5@6IgBK zg|)IlS@YI_Gy)OrNVNF-o^s(|m@7aBSU@1K1pq`Pt|BrIyEp>#7%Y77bPzTX?bAS5 zOuC2<59@CcQIJ-&k{zNYI(jVxL0C6GQAFUfWsaLD?lcw`<={eAQoX$ui6J4Zz=#N_ zDIx-=*pR=Tw^ksf5g`{(Md;R5o}s={D%l!A3=c~W5pGe+ z$*zcqu*8sEmbb gr6y^1`($DhJTu@hWt%zh^tSo`@N%6$bbjf70ShT(mH+?% diff --git a/dist/font/iconfont.svg b/dist/font/iconfont.svg index 2b3356620..9736695fb 100644 --- a/dist/font/iconfont.svg +++ b/dist/font/iconfont.svg @@ -14,11 +14,11 @@ /> - + - + - + diff --git a/dist/font/iconfont.ttf b/dist/font/iconfont.ttf index fb12a78a7b0f031f0e453f8d8423e70bfa89930e..f6b1e0817411ca72c0691222898259f690464355 100644 GIT binary patch delta 2325 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 delta 2296 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 diff --git a/dist/font/iconfont.woff b/dist/font/iconfont.woff index 8a0afe5b7e7ad37c8d53ffd50ad49ed410ec8ffa..b2d878484c1047abfdd9f8a9b126fe8cef9bcbca 100644 GIT binary patch delta 75134 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

  • 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 literal 61992 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 z zOBIEikWFo!B@G3r#9kaIr%XhGT5r!@GNHE*cyUEc5o4SO!zSrmd7 zG9+G;5;`S&2Tte_=cgoKO)D;D-N<-M0SX4g_f^x>M+(_@zMo2`nc!QgxQ1_edZ`0o zvWYhDVY|`syIG2hxMt#v&$qmbZ1(H1;;NERe;}K>&bpf=h%4AH;Pa##LvUAfQ@b{K z+iN|ep++Na?M)6L+YhI7)TykCVGA8j3{d@;9rI@iH(R23u?6|*2l6NCw-84TsGf29 z16dl)!gUv;z#m&N=%>8iw59Zo;U|U;6kTgvXx6L`*)&&a94tjn?AlA|Ap@>>td47G zw1pm(yA(V`Dh2S;Is1FFs@M;xdYBK`bm00haLoa}_Dnv5UTyT^wZ%)4bO*p5uUS@QD)O|vpVloE62}jBwgSm z?;DQ9&eF1=%<5kAx`SyJ{J(0ChM-VUH%I1Ab1}I+5vvjX ziC=Z!84q4=yMiS5FUtvl>9rSg|55rZjrLrCnIS`G>WgC2`lDiP(#1QvJZF}@$7Tp? zBt0_SkIUTksnzS4-M~XNMsO<8wi{^=;uy!|l)`{;CZgIAS-|W9{hm8l#io-#LxC?l z(W;tjAnNE-NJ^eAgeAk_vCPJ~;fhkLp?W9v@e$BtE3-D>(2&xc zb0~^EMy3V*Yo@R|3{g0ii6|#AQ0$=G zToF5uFk+S`Q|%|gUMa>!iV z8e^E7ZQPf&?;FfM0GAJFeQmmHUTW}8SBfNQ)L=Jd+)MVq;6C5dq;Ww@5<4+U5h{=* zxQzozhclvhRK-?SaWV3Rp|`G*ufWljs;9Ld`Y;xANizQqAs#cHy(HF>E#CDPB00aOd}DqMFp3*YaSf;2MMC(saUC` zo=HLJt2dcLx?`zIs;>4tYD7{H!F-STZ>s1_7&lyvrS+mGX{PJXV-z(zCre_SYsL>Y@IFDnLl3=k_esq(m78eEo z5V90SGN?Q;60|C&_YyW{CN2+&^qp{2JP6%+MWNHg+uS&nPFF59&Dy06I?}z!@$v+m zqs{W(LEIK|uLA1??0RQdsQFl-V2J@E2KfTc&Qoar1PCMwjltsZqkzq>^PN#?RpM57 zu_Mn{^MbhXgIQy7_^{?Y^2j5PJo3mRk37m_p*-=#6Hh#?o=l75e1!AhO&<2+2YE)J zzd=W6sPJ4(o=W3td+o43enh*tx2V~x=;cM&#)LXg#p>0wP5Zg&N>D8u9Nyf4s_uv1Kj8zK87~PTRkh|<-(J6`r#PR9bbvqhlO(Bz<~n?4jtp0A_@lI>Y$G5K|QIT!iq5%3XnnfEfg_Px~t^vC|X1>pQQdP001Ef0Ji`D From 0c6cc5fc3da378b35da65638dbbcb604551dee04 Mon Sep 17 00:00:00 2001 From: windy <1374721899@qq.com> Date: Wed, 15 Dec 2021 19:06:08 +0800 Subject: [PATCH 18/46] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20debounc?= =?UTF-8?q?e=E6=94=B9=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/list/virtualgrouplist.js | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/base/list/virtualgrouplist.js b/src/base/list/virtualgrouplist.js index 95ed647e0..aab04efdc 100644 --- a/src/base/list/virtualgrouplist.js +++ b/src/base/list/virtualgrouplist.js @@ -55,18 +55,10 @@ BI.VirtualGroupList = BI.inherit(BI.Widget, { mounted: function () { var self = this, o = this.options; this._populate(); - this._debounceRelease = BI.debounce(function () { - self._scrollLock = false; - }, 30); - this.element.scroll(function (e) { - if (self._scrollLock === true) { - return; - } - self._scrollLock = true; + this.element.scroll(BI.debounce(function (e) { o.scrollTop = self.element.scrollTop(); - self._debounceRelease(); self._calculateBlocksToRender(); - }); + }, 30)); BI.ResizeDetector.addResizeListener(this, function () { self._calculateBlocksToRender(); }); From 5cb2c552a856198bb9b3c0afbf5d0b654ed7f233 Mon Sep 17 00:00:00 2001 From: data Date: Wed, 15 Dec 2021 19:42:30 +0800 Subject: [PATCH 19/46] auto upgrade version to 2.0.20211215194221 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b504fc451..f62a59b8a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211215181455", + "version": "2.0.20211215194221", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From 8fdb1f76e00fdbaf5c4558606ca2439867022ab5 Mon Sep 17 00:00:00 2001 From: guy Date: Thu, 16 Dec 2021 01:28:06 +0800 Subject: [PATCH 20/46] bugfix --- src/case/combo/iconcombo/trigger.iconcombo.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/case/combo/iconcombo/trigger.iconcombo.js b/src/case/combo/iconcombo/trigger.iconcombo.js index 237846521..65c353504 100644 --- a/src/case/combo/iconcombo/trigger.iconcombo.js +++ b/src/case/combo/iconcombo/trigger.iconcombo.js @@ -42,9 +42,9 @@ BI.IconComboTrigger = BI.inherit(BI.Trigger, { cls: "icon-combo-down-icon trigger-triangle-font font-size-12", width: 12, height: 8, - selected: BI.isNotEmptyString(iconCls) + selected: BI.isNotEmptyString(iconCls), + invisible: !o.isShowDown }); - this.down.setVisible(o.isShowDown); BI.createWidget({ type: "bi.absolute", element: this, @@ -99,4 +99,4 @@ BI.IconComboTrigger = BI.inherit(BI.Trigger, { } }); BI.IconComboTrigger.EVENT_CHANGE = "EVENT_CHANGE"; -BI.shortcut("bi.icon_combo_trigger", BI.IconComboTrigger); \ No newline at end of file +BI.shortcut("bi.icon_combo_trigger", BI.IconComboTrigger); From 1870b8490dda49d9d11ce12040a3328e530695ab Mon Sep 17 00:00:00 2001 From: data Date: Thu, 16 Dec 2021 09:03:50 +0800 Subject: [PATCH 21/46] auto upgrade version to 2.0.20211216090337 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f62a59b8a..d01bbaa5e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211215194221", + "version": "2.0.20211216090337", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From 69a2ec1bf1ddcb8b54977c079e5da943a789812c Mon Sep 17 00:00:00 2001 From: windy <1374721899@qq.com> Date: Thu, 16 Dec 2021 11:08:37 +0800 Subject: [PATCH 22/46] =?UTF-8?q?BI-98494=20fix:=20=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E4=B8=8D=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multiselect/multiselect.insert.combo.js | 4 ++-- .../multiselect/multiselect.insert.combo.nobar.js | 4 ++-- .../trigger/searcher.multiselect.insert.js | 15 +++++++++++++-- .../multiselectlist/multiselectlist.insert.js | 8 +++++++- .../multiselectlist.insert.nobar.js | 8 +++++++- 5 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/widget/multiselect/multiselect.insert.combo.js b/src/widget/multiselect/multiselect.insert.combo.js index f0435f6f7..af2c44f97 100644 --- a/src/widget/multiselect/multiselect.insert.combo.js +++ b/src/widget/multiselect/multiselect.insert.combo.js @@ -81,7 +81,7 @@ BI.MultiSelectInsertCombo = BI.inherit(BI.Single, { var last = BI.last(keywords); keywords = BI.initial(keywords || []); if (keywords.length > 0) { - self._joinKeywords(keywords.slice(0, last === BI.BlankSplitChar ? 1999 : 2000), function () { + self._joinKeywords(keywords, function () { if (BI.endWith(last, BI.BlankSplitChar)) { self.combo.setValue(self.storeValue); assertShowValue(); @@ -93,7 +93,7 @@ BI.MultiSelectInsertCombo = BI.inherit(BI.Single, { } self._dataChange = true; }); - keywords.length > 2000 && BI.Msg.alert(BI.i18nText("BI-Basic_Prompt"), BI.i18nText("BI-Basic_Too_Much_Value_Get_Two_Thousand")); + this.getSearcher().getKeywordsLength() > 2000 && BI.Msg.alert(BI.i18nText("BI-Basic_Prompt"), BI.i18nText("BI-Basic_Too_Much_Value_Get_Two_Thousand")); } self.fireEvent(BI.MultiSelectInsertCombo.EVENT_SEARCHING); }); diff --git a/src/widget/multiselect/multiselect.insert.combo.nobar.js b/src/widget/multiselect/multiselect.insert.combo.nobar.js index 18bfc8a82..00ac76506 100644 --- a/src/widget/multiselect/multiselect.insert.combo.nobar.js +++ b/src/widget/multiselect/multiselect.insert.combo.nobar.js @@ -76,7 +76,7 @@ BI.MultiSelectInsertNoBarCombo = BI.inherit(BI.Single, { var last = BI.last(keywords); keywords = BI.initial(keywords || []); if (keywords.length > 0) { - self._joinKeywords(keywords.slice(0, last === BI.BlankSplitChar ? 1999 : 2000), function () { + self._joinKeywords(keywords, function () { if (BI.endWith(last, BI.BlankSplitChar)) { self.combo.setValue(self.storeValue); assertShowValue(); @@ -88,7 +88,7 @@ BI.MultiSelectInsertNoBarCombo = BI.inherit(BI.Single, { } self._dataChange = true; }); - keywords.length > 2000 && BI.Msg.alert(BI.i18nText("BI-Basic_Prompt"), BI.i18nText("BI-Basic_Too_Much_Value_Get_Two_Thousand")); + this.getSearcher().getKeywordsLength() > 2000 && BI.Msg.alert(BI.i18nText("BI-Basic_Prompt"), BI.i18nText("BI-Basic_Too_Much_Value_Get_Two_Thousand")); } }); diff --git a/src/widget/multiselect/trigger/searcher.multiselect.insert.js b/src/widget/multiselect/trigger/searcher.multiselect.insert.js index e055f86f8..404a0e4e8 100644 --- a/src/widget/multiselect/trigger/searcher.multiselect.insert.js +++ b/src/widget/multiselect/trigger/searcher.multiselect.insert.js @@ -89,7 +89,7 @@ BI.MultiSelectInsertSearcher = BI.inherit(BI.Widget, { }); this.searcher.on(BI.Searcher.EVENT_SEARCHING, function () { var keywords = this.getKeywords(); - self.fireEvent(BI.MultiSelectInsertSearcher.EVENT_SEARCHING, keywords); + self.fireEvent(BI.MultiSelectInsertSearcher.EVENT_SEARCHING, keywords.length > 2000 ? keywords.slice(0, 2000).concat([BI.BlankSplitChar]) : keywords.slice(0, 2000)); }); if (BI.isNotNull(o.value)) { this.setState(o.value); @@ -108,8 +108,19 @@ BI.MultiSelectInsertSearcher = BI.inherit(BI.Widget, { this.searcher.stopSearch(); }, + getKeywordsLength: function () { + var keywords = this.editor.getKeywords(); + + return keywords[keywords.length - 1] === BI.BlankSplitChar ? keywords.length - 1 : keywords.length; + }, + getKeyword: function () { - return this.editor.getKeyword(); + var keywords = this.editor.getKeywords().slice(0, 2000); + if (keywords[keywords.length - 1] === BI.BlankSplitChar) { + keywords = keywords.slice(0, keywords.length - 1); + } + + return BI.isEmptyArray(keywords) ? "" : keywords[keywords.length - 1]; }, hasMatched: function () { diff --git a/src/widget/multiselectlist/multiselectlist.insert.js b/src/widget/multiselectlist/multiselectlist.insert.js index e4a6a004b..4fbf258e2 100644 --- a/src/widget/multiselectlist/multiselectlist.insert.js +++ b/src/widget/multiselectlist/multiselectlist.insert.js @@ -138,7 +138,7 @@ BI.MultiSelectInsertList = BI.inherit(BI.Single, { } self.fireEvent(BI.MultiSelectInsertList.EVENT_CHANGE); }); - keywords.length > 2000 && BI.Msg.alert(BI.i18nText("BI-Basic_Prompt"), BI.i18nText("BI-Basic_Too_Much_Value_Get_Two_Thousand")); + self._getKeywordsLength() > 2000 && BI.Msg.alert(BI.i18nText("BI-Basic_Prompt"), BI.i18nText("BI-Basic_Too_Much_Value_Get_Two_Thousand")); } } }, { @@ -197,6 +197,12 @@ BI.MultiSelectInsertList = BI.inherit(BI.Single, { return keywords; }, + _getKeywordsLength: function () { + var keywords = this._getKeywords(); + + return keywords[keywords.length - 1] === BI.BlankSplitChar ? keywords.length - 1 : keywords.length; + }, + _showAdapter: function () { this.adapter.setVisible(true); this.searcherPane.setVisible(false); diff --git a/src/widget/multiselectlist/multiselectlist.insert.nobar.js b/src/widget/multiselectlist/multiselectlist.insert.nobar.js index f4f1adff4..8369b2acf 100644 --- a/src/widget/multiselectlist/multiselectlist.insert.nobar.js +++ b/src/widget/multiselectlist/multiselectlist.insert.nobar.js @@ -141,7 +141,7 @@ BI.MultiSelectInsertNoBarList = BI.inherit(BI.Single, { } self.fireEvent(BI.MultiSelectInsertNoBarList.EVENT_CHANGE); }); - keywords.length > 2000 && BI.Msg.alert(BI.i18nText("BI-Basic_Prompt"), BI.i18nText("BI-Basic_Too_Much_Value_Get_Two_Thousand")); + self._getKeywordsLength() > 2000 && BI.Msg.alert(BI.i18nText("BI-Basic_Prompt"), BI.i18nText("BI-Basic_Too_Much_Value_Get_Two_Thousand")); } } }, { @@ -203,6 +203,12 @@ BI.MultiSelectInsertNoBarList = BI.inherit(BI.Single, { return keywords; }, + _getKeywordsLength: function () { + var keywords = this._getKeywords(); + + return keywords[keywords.length - 1] === BI.BlankSplitChar ? keywords.length - 1 : keywords.length; + }, + _showAdapter: function () { this.adapter.setVisible(true); this.searcherPane.setVisible(false); From 5a833acf5760369f9ed52627a08f1e62115c3e0e Mon Sep 17 00:00:00 2001 From: data Date: Thu, 16 Dec 2021 11:23:23 +0800 Subject: [PATCH 23/46] auto upgrade version to 2.0.20211216112316 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d01bbaa5e..7ff026d8c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211216090337", + "version": "2.0.20211216112316", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From 16a97beee59eafee99374df5e5d617cf8866cc64 Mon Sep 17 00:00:00 2001 From: guy Date: Thu, 16 Dec 2021 21:00:33 +0800 Subject: [PATCH 24/46] bugfix --- src/case/checkbox/check.arrownode.js | 4 ++-- src/case/checkbox/check.checkingmarknode.js | 7 +------ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/case/checkbox/check.arrownode.js b/src/case/checkbox/check.arrownode.js index ebcb784d7..26447aca6 100644 --- a/src/case/checkbox/check.arrownode.js +++ b/src/case/checkbox/check.arrownode.js @@ -5,7 +5,7 @@ BI.ArrowTreeGroupNodeCheckbox = BI.inherit(BI.IconButton, { _defaultConfig: function () { return BI.extend(BI.ArrowTreeGroupNodeCheckbox.superclass._defaultConfig.apply(this, arguments), { - extraCls: "bi-arrow-group-node-checkbox" + extraCls: "bi-arrow-group-node-checkbox expander-right-font" }); }, @@ -18,4 +18,4 @@ BI.ArrowTreeGroupNodeCheckbox = BI.inherit(BI.IconButton, { } } }); -BI.shortcut("bi.arrow_group_node_checkbox", BI.ArrowTreeGroupNodeCheckbox); \ No newline at end of file +BI.shortcut("bi.arrow_group_node_checkbox", BI.ArrowTreeGroupNodeCheckbox); diff --git a/src/case/checkbox/check.checkingmarknode.js b/src/case/checkbox/check.checkingmarknode.js index d801828ed..b3996691e 100644 --- a/src/case/checkbox/check.checkingmarknode.js +++ b/src/case/checkbox/check.checkingmarknode.js @@ -6,14 +6,9 @@ BI.CheckingMarkNode = BI.inherit(BI.IconButton, { _defaultConfig: function () { return BI.extend( BI.CheckingMarkNode.superclass._defaultConfig.apply(this, arguments), { - extraCls: "check-mark-font" }); }, - _init: function () { - BI.CheckingMarkNode.superclass._init.apply(this, arguments); - this.setSelected(this.options.selected); - }, setSelected: function (v) { BI.CheckingMarkNode.superclass.setSelected.apply(this, arguments); if(v === true) { @@ -23,4 +18,4 @@ BI.CheckingMarkNode = BI.inherit(BI.IconButton, { } } }); -BI.shortcut("bi.checking_mark_node", BI.CheckingMarkNode); \ No newline at end of file +BI.shortcut("bi.checking_mark_node", BI.CheckingMarkNode); From 811639023407c3f4f7d0521b74061e23d8f327cf Mon Sep 17 00:00:00 2001 From: data Date: Fri, 17 Dec 2021 09:53:14 +0800 Subject: [PATCH 25/46] auto upgrade version to 2.0.20211217095307 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7ff026d8c..438bfd2bd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211216112316", + "version": "2.0.20211217095307", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From 817fc60b83e605e7487ff825f1a5fdbd518b744f Mon Sep 17 00:00:00 2001 From: dailer Date: Fri, 17 Dec 2021 11:28:41 +0800 Subject: [PATCH 26/46] =?UTF-8?q?BI-98719=20fix:=20=E3=80=905.1.20=5Frelea?= =?UTF-8?q?se=E5=8F=91=E6=95=A3=E3=80=91=E6=9C=AC=E5=9C=B0=E5=B7=A5?= =?UTF-8?q?=E7=A8=8B=E5=90=AF=E5=8A=A8=E9=A1=B5=E9=9D=A2=E7=A9=BA=E7=99=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webpack/dirs.js | 1 + webpack/webpack.common.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/webpack/dirs.js b/webpack/dirs.js index e983ad7d7..512645e97 100644 --- a/webpack/dirs.js +++ b/webpack/dirs.js @@ -5,6 +5,7 @@ module.exports = { PRIVATE: path.resolve(__dirname, "../private"), BABEL_CONFIG: path.resolve(__dirname, "../babel.config.js"), TYPESCRIPT: path.resolve(__dirname, "../typescript"), + ROUTER: path.resolve(__dirname, "../src/router"), SRC: path.resolve(__dirname, "../src"), DEMO: path.resolve(__dirname, "../demo"), PUBLIC: path.resolve(__dirname, "../public"), diff --git a/webpack/webpack.common.js b/webpack/webpack.common.js index a8177cf7c..a75912f83 100644 --- a/webpack/webpack.common.js +++ b/webpack/webpack.common.js @@ -38,7 +38,7 @@ module.exports = { rules: [ { test: /\.(js|ts)$/, - include: [dirs.NODE_MODULES, dirs.PRIVATE, dirs.TYPESCRIPT], + include: [dirs.NODE_MODULES, dirs.PRIVATE, dirs.TYPESCRIPT, dirs.ROUTER], exclude: /node_modules(\/|\\)core-js/, use: [ { From 42674ed9707e941942943bd2f496d34b5a413bf6 Mon Sep 17 00:00:00 2001 From: data Date: Fri, 17 Dec 2021 15:02:43 +0800 Subject: [PATCH 27/46] auto upgrade version to 2.0.20211217150230 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 438bfd2bd..2ca35d556 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211217095307", + "version": "2.0.20211217150230", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From 48d60340ee94cd5278416dd2ab9f134cd73a393b Mon Sep 17 00:00:00 2001 From: guy Date: Fri, 17 Dec 2021 16:06:23 +0800 Subject: [PATCH 28/46] =?UTF-8?q?bugfix=20=E7=BB=91=E5=AE=9A=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E5=9C=B0=E6=96=B9=E5=BB=B6=E8=BF=9F=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E4=B8=80=E4=B8=8B=EF=BC=8C=E4=BC=9A=E6=9C=89=E5=A5=BD?= =?UTF-8?q?=E5=A4=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/base/combination/combo.js | 3 ++- src/base/combination/expander.js | 3 ++- src/base/combination/switcher.js | 3 ++- src/base/single/button/button.basic.js | 5 +++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/base/combination/combo.js b/src/base/combination/combo.js index 64192fe29..540b693b8 100644 --- a/src/base/combination/combo.js +++ b/src/base/combination/combo.js @@ -43,7 +43,8 @@ render: function () { var self = this, o = this.options; this._initCombo(); - this._initPullDownAction(); + // 延迟绑定事件,这样可以将自己绑定的事情优先执行 + BI.nextTick(this._initPullDownAction.bind(this)); this.combo.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) { if (self.isEnabled() && self.isValid()) { if (type === BI.Events.EXPAND) { diff --git a/src/base/combination/expander.js b/src/base/combination/expander.js index 866949f28..83b99566a 100644 --- a/src/base/combination/expander.js +++ b/src/base/combination/expander.js @@ -25,7 +25,8 @@ BI.Expander = BI.inherit(BI.Widget, { var self = this, o = this.options; this._expanded = !!o.el.open; this._initExpander(); - this._initPullDownAction(); + // 延迟绑定事件,这样可以将自己绑定的事情优先执行 + BI.nextTick(this._initPullDownAction.bind(this)); this.expander.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) { if (self.isEnabled() && self.isValid()) { if (type === BI.Events.EXPAND) { diff --git a/src/base/combination/switcher.js b/src/base/combination/switcher.js index 96a1d3c6a..b464af3d9 100644 --- a/src/base/combination/switcher.js +++ b/src/base/combination/switcher.js @@ -25,7 +25,8 @@ BI.Switcher = BI.inherit(BI.Widget, { render: function () { var self = this, o = this.options; this._initSwitcher(); - this._initPullDownAction(); + // 延迟绑定事件,这样可以将自己绑定的事情优先执行 + BI.nextTick(this._initPullDownAction.bind(this)); this.switcher.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) { if (self.isEnabled() && self.isValid()) { if (type === BI.Events.EXPAND) { diff --git a/src/base/single/button/button.basic.js b/src/base/single/button/button.basic.js index 76ffb77ad..d975bdb81 100644 --- a/src/base/single/button/button.basic.js +++ b/src/base/single/button/button.basic.js @@ -31,7 +31,7 @@ BI.BasicButton = BI.inherit(BI.Single, { _init: function () { BI.BasicButton.superclass._init.apply(this, arguments); var opts = this.options; - + if (opts.shadow) { this._createShadow(); } @@ -44,7 +44,8 @@ BI.BasicButton = BI.inherit(BI.Single, { if (this.options.selected === true) { this.setSelected(true); } - this.bindEvent(); + // 延迟绑定事件,这样可以将自己绑定的事情优先执行 + BI.nextTick(this.bindEvent.bind(this)); BI.BasicButton.superclass._initRef.apply(this, arguments); }, From 424bf4d241befc6a99b909e8cd04bc3d782427f2 Mon Sep 17 00:00:00 2001 From: data Date: Fri, 17 Dec 2021 16:24:30 +0800 Subject: [PATCH 29/46] auto upgrade version to 2.0.20211217162405 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2ca35d556..6d358c9a4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211217150230", + "version": "2.0.20211217162405", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From 77c492793c4430b07148b6755ca53fa5b82f56ea Mon Sep 17 00:00:00 2001 From: guy Date: Fri, 17 Dec 2021 23:35:02 +0800 Subject: [PATCH 30/46] =?UTF-8?q?feature=EF=BC=9A=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=B0=94=E6=B3=A1=E5=BC=B9=E6=A1=86=E6=8E=A7=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.md | 1 + src/base/combination/bubble.js | 513 +++++++++++++++++++++ src/base/combination/combo.js | 282 +---------- src/case/combo/bubblecombo/combo.bubble.js | 1 + src/less/base/combo/combo.bubble.less | 61 +++ 5 files changed, 583 insertions(+), 275 deletions(-) create mode 100644 src/base/combination/bubble.js diff --git a/changelog.md b/changelog.md index 043dae7b7..0aecc31a7 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,6 @@ # 更新日志 2.0(2021-12) +- 新增气泡弹框控件 - BI.point支持widget添加埋点 - childContext废弃,替换成provide - 支持BI.useContext获取上下文环境 diff --git a/src/base/combination/bubble.js b/src/base/combination/bubble.js new file mode 100644 index 000000000..cf0548fb1 --- /dev/null +++ b/src/base/combination/bubble.js @@ -0,0 +1,513 @@ +!(function () { + /** + * @class BI.Bubble + * @extends BI.Widget + */ + BI.Bubble = BI.inherit(BI.Widget, { + _defaultConfig: function () { + var conf = BI.Bubble.superclass._defaultConfig.apply(this, arguments); + return BI.extend(conf, { + baseCls: (conf.baseCls || "") + " bi-popper", + attributes: { + tabIndex: -1 + }, + trigger: "click", // click || hover || click-hover || "" + toggle: true, + direction: "", + placement: "bottom-start", // top-start/top/top-end/bottom-start/bottom/bottom-end/left-start/left/left-end/right-start/right/right-end + logic: { + dynamic: true + }, + container: null, // popupview放置的容器,默认为this.element + isDefaultInit: false, + destroyWhenHide: false, + hideWhenClickOutside: true, + showArrow: true, + hideWhenBlur: false, + isNeedAdjustHeight: true, // 是否需要高度调整 + isNeedAdjustWidth: true, + stopEvent: false, + stopPropagation: false, + adjustLength: 0, // 调整的距离 + adjustXOffset: 0, + adjustYOffset: 0, + hideChecker: BI.emptyFn, + offsetStyle: "left", // left,right,center + el: {}, + popup: {}, + comboClass: "bi-combo-popup", + hoverClass: "bi-combo-hover", + }); + }, + + render: function () { + var self = this, o = this.options; + this._initCombo(); + // 延迟绑定事件,这样可以将自己绑定的事情优先执行 + BI.nextTick(this._initPullDownAction.bind(this)); + this.combo.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) { + if (self.isEnabled() && self.isValid()) { + if (type === BI.Events.EXPAND) { + self._popupView(); + } + if (type === BI.Events.COLLAPSE) { + self._hideView(); + } + if (type === BI.Events.EXPAND) { + self.fireEvent(BI.Controller.EVENT_CHANGE, arguments); + self.fireEvent(BI.Bubble.EVENT_EXPAND); + } + if (type === BI.Events.COLLAPSE) { + self.fireEvent(BI.Controller.EVENT_CHANGE, arguments); + self.isViewVisible() && self.fireEvent(BI.Bubble.EVENT_COLLAPSE); + } + if (type === BI.Events.CLICK) { + self.fireEvent(BI.Bubble.EVENT_TRIGGER_CHANGE, obj); + } + } + }); + + self.element.on("mouseenter." + self.getName(), function (e) { + if (self.isEnabled() && self.isValid() && self.combo.isEnabled() && self.combo.isValid()) { + self.element.addClass(o.hoverClass); + } + }); + self.element.on("mouseleave." + self.getName(), function (e) { + if (self.isEnabled() && self.isValid() && self.combo.isEnabled() && self.combo.isValid()) { + self.element.removeClass(o.hoverClass); + } + }); + + BI.createWidget(BI.extend({ + element: this + }, BI.LogicFactory.createLogic("vertical", BI.extend(o.logic, { + items: [ + {el: this.combo} + ] + })))); + o.isDefaultInit && (this._assertPopupView()); + }, + + _toggle: function (e) { + this._assertPopupViewRender(); + if (this.popupView.isVisible()) { + this._hideView(e); + } else { + if (this.isEnabled()) { + this._popupView(e); + } + } + }, + + _initPullDownAction: function () { + var self = this, o = this.options; + var evs = (this.options.trigger || "").split(","); + var st = function (e) { + if (o.stopEvent) { + e.stopEvent(); + } + if (o.stopPropagation) { + e.stopPropagation(); + } + }; + + var enterPopup = false; + + function hide (e) { + if (self.isEnabled() && self.isValid() && self.combo.isEnabled() && self.combo.isValid() && o.toggle === true) { + self._hideView(e); + self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.COLLAPSE, "", self.combo); + self.fireEvent(BI.Bubble.EVENT_COLLAPSE); + } + self.popupView && self.popupView.element.off("mouseenter." + self.getName()).off("mouseleave." + self.getName()); + enterPopup = false; + } + + BI.each(evs, function (i, ev) { + switch (ev) { + case "hover": + self.element.on("mouseenter." + self.getName(), function (e) { + if (self.isEnabled() && self.isValid() && self.combo.isEnabled() && self.combo.isValid()) { + self._popupView(e); + self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.EXPAND, "", self.combo); + self.fireEvent(BI.Bubble.EVENT_EXPAND); + } + }); + self.element.on("mouseleave." + self.getName(), function (e) { + if (self.popupView) { + self.popupView.element.on("mouseenter." + self.getName(), function (e) { + enterPopup = true; + self.popupView.element.on("mouseleave." + self.getName(), function (e) { + hide(e); + }); + self.popupView.element.off("mouseenter." + self.getName()); + }); + BI.defer(function () { + if (!enterPopup) { + hide(e); + } + }, 50); + } + }); + break; + case "click": + var debounce = BI.debounce(function (e) { + if (self.combo.element.__isMouseInBounds__(e)) { + if (self.isEnabled() && self.isValid() && self.combo.isEnabled() && self.combo.isValid()) { + // if (!o.toggle && self.isViewVisible()) { + // return; + // } + o.toggle ? self._toggle(e) : self._popupView(e); + if (self.isViewVisible()) { + self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.EXPAND, "", self.combo); + self.fireEvent(BI.Bubble.EVENT_EXPAND); + } else { + self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.COLLAPSE, "", self.combo); + self.fireEvent(BI.Bubble.EVENT_COLLAPSE); + } + } + } + }, BI.EVENT_RESPONSE_TIME, { + "leading": true, + "trailing": false + }); + self.element.off(ev + "." + self.getName()).on(ev + "." + self.getName(), function (e) { + debounce(e); + st(e); + }); + break; + case "click-hover": + var debounce = BI.debounce(function (e) { + if (self.combo.element.__isMouseInBounds__(e)) { + if (self.isEnabled() && self.isValid() && self.combo.isEnabled() && self.combo.isValid()) { + // if (self.isViewVisible()) { + // return; + // } + self._popupView(e); + if (self.isViewVisible()) { + self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.EXPAND, "", self.combo); + self.fireEvent(BI.Bubble.EVENT_EXPAND); + } + } + } + }, BI.EVENT_RESPONSE_TIME, { + "leading": true, + "trailing": false + }); + self.element.off("click." + self.getName()).on("click." + self.getName(), function (e) { + debounce(e); + st(e); + }); + self.element.on("mouseleave." + self.getName(), function (e) { + if (self.popupView) { + self.popupView.element.on("mouseenter." + self.getName(), function (e) { + enterPopup = true; + self.popupView.element.on("mouseleave." + self.getName(), function (e) { + hide(e); + }); + self.popupView.element.off("mouseenter." + self.getName()); + }); + BI.delay(function () { + if (!enterPopup) { + hide(e); + } + }, 50); + } + }); + break; + } + }); + }, + + _initCombo: function () { + this.combo = BI.createWidget(this.options.el, { + value: this.options.value + }); + + if (this.options.showArrow) { + this.arrow = BI.createWidget({ + type: "bi.absolute", + cls: "bi-bubble-arrow", + items: [{ + type: "bi.layout", + cls: "bubble-arrow" + }] + }); + } + }, + + _assertPopupView: function () { + var self = this, o = this.options; + if (this.popupView == null) { + this.popupView = BI.createWidget(this.options.popup, { + type: "bi.bubble_popup_view", + value: o.value + }, this); + if (this.options.showArrow) { + BI.createWidget({ + type: "bi.absolute", + element: this.popupView, + items: [{ + el: this.arrow + }] + }); + } + this.popupView.on(BI.Controller.EVENT_CHANGE, function (type, value, obj) { + if (type === BI.Events.CLICK) { + self.combo.setValue(self.getValue()); + self.fireEvent(BI.Bubble.EVENT_CHANGE, value, obj); + } + self.fireEvent(BI.Controller.EVENT_CHANGE, arguments); + }); + this.popupView.setVisible(false); + BI.nextTick(function () { + self.fireEvent(BI.Bubble.EVENT_AFTER_INIT); + }); + } + }, + + _assertPopupViewRender: function () { + this._assertPopupView(); + if (!this._rendered) { + BI.createWidget({ + type: "bi.vertical", + scrolly: false, + element: this.options.container || this, + items: [ + {el: this.popupView} + ] + }); + this._rendered = true; + } + }, + + _hideIf: function (e, skipTriggerChecker) { + // if (this.element.__isMouseInBounds__(e) || (this.popupView && this.popupView.element.__isMouseInBounds__(e))) { + // return; + // } + // BI-10290 公式combo双击公式内容会收起 + if (e && ((skipTriggerChecker !== true && this.element.find(e.target).length > 0) + || (this.popupView && this.popupView.element.find(e.target).length > 0) + || e.target.className === "CodeMirror-cursor" || BI.Widget._renderEngine.createElement(e.target).closest(".CodeMirror-hints").length > 0)) {// BI-9887 CodeMirror的公式弹框需要特殊处理下 + var directions = this.options.direction.split(","); + if (BI.contains(directions, "innerLeft") || BI.contains(directions, "innerRight")) { + // popup可以出现在trigger内部的combo,滚动时不需要消失,而是调整位置 + this.adjustWidth(); + this.adjustHeight(); + } + + return; + } + var isHide = this.options.hideChecker.apply(this, [e]); + if (isHide === false) { + return; + } + this._hideView(e); + return true; + }, + + _hideView: function (e) { + var o = this.options; + this.fireEvent(BI.Bubble.EVENT_BEFORE_HIDEVIEW); + if (this.options.destroyWhenHide === true) { + this.popupView && this.popupView.destroy(); + this.popupView = null; + this._rendered = false; + } else { + this.popupView && this.popupView.invisible(); + } + + if (!e || !this.combo.element.__isMouseInBounds__(e)) { + this.element.removeClass(this.options.hoverClass); + // 应对bi-focus-shadow在收起时不失焦 + this.element.blur(); + } + + if (this.popper) { + this.popper.destroy(); + this.popper = null; + } + + this.element.removeClass(this.options.comboClass); + + BI.Widget._renderEngine.createElement(document).unbind("mousedown." + this.getName()).unbind("mousewheel." + this.getName()); + BI.EVENT_BLUR && o.hideWhenBlur && BI.Widget._renderEngine.createElement(window).unbind("blur." + this.getName()); + this.fireEvent(BI.Bubble.EVENT_AFTER_HIDEVIEW); + }, + + _popupView: function (e) { + var self = this, o = this.options; + this._assertPopupViewRender(); + this.fireEvent(BI.Bubble.EVENT_BEFORE_POPUPVIEW); + // popupVisible是为了获取其宽高, 放到可视范围之外以防止在IE下闪一下 + this.popupView.css({left: -999999999, top: -99999999}); + this.popupView.visible(); + this.adjustWidth(e); + + if (this.popper) { + this.popper.destroy(); + } + var modifiers = [{ + name: "offset", + options: { + offset: function () { + return [o.adjustXOffset, (o.showArrow ? 9 : 0) + (o.adjustYOffset || o.adjustLength)]; + } + } + }]; + if (this.options.showArrow) { + modifiers.push({ + name: "arrow", + options: { + padding: 5, + element: this.arrow.element[0] + } + }); + } + this.popper = BI.Popper.createPopper(this.combo.element[0], this.popupView.element[0], { + placement: o.placement, + strategy: "fixed", + modifiers: modifiers + }); + + // this.adjustHeight(e); + + this.element.addClass(this.options.comboClass); + o.hideWhenClickOutside && BI.Widget._renderEngine.createElement(document).unbind("mousedown." + this.getName()); + BI.EVENT_BLUR && o.hideWhenBlur && BI.Widget._renderEngine.createElement(window).unbind("blur." + this.getName()); + + o.hideWhenClickOutside && BI.Widget._renderEngine.createElement(document).bind("mousedown." + this.getName(), BI.bind(this._hideIf, this)); + BI.EVENT_BLUR && o.hideWhenBlur && BI.Widget._renderEngine.createElement(window).bind("blur." + this.getName(), BI.bind(this._hideIf, this)); + this.fireEvent(BI.Bubble.EVENT_AFTER_POPUPVIEW); + }, + + adjustWidth: function (e) { + var o = this.options; + if (!this.popupView) { + return; + } + if (o.isNeedAdjustWidth === true) { + this.resetListWidth(""); + var width = this.popupView.element.outerWidth(); + var maxW = this.element.outerWidth() || o.width; + // BI-93885 最大列宽算法调整 + if (maxW < 500) { + if (width >= 500) { + maxW = 500; + } else if (width > maxW) { + // 防止小数导致差那么一点 + maxW = width + 1; + } + } + + // if (width > maxW + 80) { + // maxW = maxW + 80; + // } else if (width > maxW) { + // maxW = width; + // } + this.resetListWidth(maxW < 100 ? 100 : maxW); + } + }, + + adjustHeight: function () { + + }, + + resetListHeight: function (h) { + this._assertPopupView(); + this.popupView.resetHeight && this.popupView.resetHeight(h); + }, + + resetListWidth: function (w) { + this._assertPopupView(); + this.popupView.resetWidth && this.popupView.resetWidth(w); + }, + + populate: function (items) { + this._assertPopupView(); + this.popupView.populate.apply(this.popupView, arguments); + this.combo.populate && this.combo.populate.apply(this.combo, arguments); + }, + + _setEnable: function (arg) { + BI.Bubble.superclass._setEnable.apply(this, arguments); + if (arg === true) { + this.element.removeClass("base-disabled disabled"); + } else if (arg === false) { + this.element.addClass("base-disabled disabled"); + } + !arg && this.element.removeClass(this.options.hoverClass); + !arg && this.isViewVisible() && this._hideView(); + }, + + setValue: function (v) { + this.combo.setValue(v); + if (BI.isNull(this.popupView)) { + this.options.popup.value = v; + } else { + this.popupView.setValue(v); + } + }, + + getValue: function () { + if (BI.isNull(this.popupView)) { + return this.options.popup.value; + } else { + return this.popupView.getValue(); + } + }, + + isViewVisible: function () { + return this.isEnabled() && this.combo.isEnabled() && !!this.popupView && this.popupView.isVisible(); + }, + + showView: function (e) { + // 减少popup 调整宽高的次数 + if (this.isEnabled() && this.combo.isEnabled() && !this.isViewVisible()) { + this._popupView(e); + } + }, + + hideView: function (e) { + this._hideView(e); + }, + + getView: function () { + return this.popupView; + }, + + getPopupPosition: function () { + return this.position; + }, + + toggle: function () { + this._toggle(); + }, + + destroyed: function () { + BI.Widget._renderEngine.createElement(document) + .unbind("click." + this.getName()) + .unbind("mousedown." + this.getName()) + .unbind("mouseenter." + this.getName()) + .unbind("mouseleave." + this.getName()); + BI.Widget._renderEngine.createElement(window) + .unbind("blur." + this.getName()); + this.popper && this.popper.destroy(); + this.popper = null; + this.popupView && this.popupView._destroy(); + } + }); + BI.Bubble.EVENT_TRIGGER_CHANGE = "EVENT_TRIGGER_CHANGE"; + BI.Bubble.EVENT_CHANGE = "EVENT_CHANGE"; + BI.Bubble.EVENT_EXPAND = "EVENT_EXPAND"; + BI.Bubble.EVENT_COLLAPSE = "EVENT_COLLAPSE"; + BI.Bubble.EVENT_AFTER_INIT = "EVENT_AFTER_INIT"; + + + BI.Bubble.EVENT_BEFORE_POPUPVIEW = "EVENT_BEFORE_POPUPVIEW"; + BI.Bubble.EVENT_AFTER_POPUPVIEW = "EVENT_AFTER_POPUPVIEW"; + BI.Bubble.EVENT_BEFORE_HIDEVIEW = "EVENT_BEFORE_HIDEVIEW"; + BI.Bubble.EVENT_AFTER_HIDEVIEW = "EVENT_AFTER_HIDEVIEW"; + + BI.shortcut("bi.bubble", BI.Bubble); +}()); diff --git a/src/base/combination/combo.js b/src/base/combination/combo.js index 540b693b8..94c2fab8a 100644 --- a/src/base/combination/combo.js +++ b/src/base/combination/combo.js @@ -4,9 +4,9 @@ * @class BI.Combo * @extends BI.Widget */ - BI.Combo = BI.inherit(BI.Widget, { + BI.Combo = BI.inherit(BI.Bubble, { _defaultConfig: function () { - var conf = BI.Combo.superclass._defaultConfig.apply(this, arguments); + var conf = BI.Bubble.superclass._defaultConfig.apply(this, arguments); return BI.extend(conf, { baseCls: (conf.baseCls || "") + " bi-combo" + (BI.isIE() ? " hack" : ""), attributes: { @@ -23,6 +23,7 @@ destroyWhenHide: false, hideWhenBlur: true, hideWhenAnotherComboOpen: false, + hideWhenClickOutside: true, isNeedAdjustHeight: true, // 是否需要高度调整 isNeedAdjustWidth: true, stopEvent: false, @@ -94,137 +95,6 @@ }, this)); }, - _toggle: function (e) { - this._assertPopupViewRender(); - if (this.popupView.isVisible()) { - this._hideView(e); - } else { - if (this.isEnabled()) { - this._popupView(e); - } - } - }, - - _initPullDownAction: function () { - var self = this, o = this.options; - var evs = (this.options.trigger || "").split(","); - var st = function (e) { - if (o.stopEvent) { - e.stopEvent(); - } - if (o.stopPropagation) { - e.stopPropagation(); - } - }; - - var enterPopup = false; - - function hide(e) { - if (self.isEnabled() && self.isValid() && self.combo.isEnabled() && self.combo.isValid() && o.toggle === true) { - self._hideView(e); - self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.COLLAPSE, "", self.combo); - self.fireEvent(BI.Combo.EVENT_COLLAPSE); - } - self.popupView && self.popupView.element.off("mouseenter." + self.getName()).off("mouseleave." + self.getName()); - enterPopup = false; - } - - BI.each(evs, function (i, ev) { - switch (ev) { - case "hover": - self.element.on("mouseenter." + self.getName(), function (e) { - if (self.isEnabled() && self.isValid() && self.combo.isEnabled() && self.combo.isValid()) { - self._popupView(e); - self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.EXPAND, "", self.combo); - self.fireEvent(BI.Combo.EVENT_EXPAND); - } - }); - self.element.on("mouseleave." + self.getName(), function (e) { - if (self.popupView) { - self.popupView.element.on("mouseenter." + self.getName(), function (e) { - enterPopup = true; - self.popupView.element.on("mouseleave." + self.getName(), function (e) { - hide(e); - }); - self.popupView.element.off("mouseenter." + self.getName()); - }); - BI.defer(function () { - if (!enterPopup) { - hide(e); - } - }, 50); - } - }); - break; - case "click": - var debounce = BI.debounce(function (e) { - if (self.combo.element.__isMouseInBounds__(e)) { - if (self.isEnabled() && self.isValid() && self.combo.isEnabled() && self.combo.isValid()) { - // if (!o.toggle && self.isViewVisible()) { - // return; - // } - o.toggle ? self._toggle(e) : self._popupView(e); - if (self.isViewVisible()) { - self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.EXPAND, "", self.combo); - self.fireEvent(BI.Combo.EVENT_EXPAND); - } else { - self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.COLLAPSE, "", self.combo); - self.fireEvent(BI.Combo.EVENT_COLLAPSE); - } - } - } - }, BI.EVENT_RESPONSE_TIME, { - "leading": true, - "trailing": false - }); - self.element.off(ev + "." + self.getName()).on(ev + "." + self.getName(), function (e) { - debounce(e); - st(e); - }); - break; - case "click-hover": - var debounce = BI.debounce(function (e) { - if (self.combo.element.__isMouseInBounds__(e)) { - if (self.isEnabled() && self.isValid() && self.combo.isEnabled() && self.combo.isValid()) { - // if (self.isViewVisible()) { - // return; - // } - self._popupView(e); - if (self.isViewVisible()) { - self.fireEvent(BI.Controller.EVENT_CHANGE, BI.Events.EXPAND, "", self.combo); - self.fireEvent(BI.Combo.EVENT_EXPAND); - } - } - } - }, BI.EVENT_RESPONSE_TIME, { - "leading": true, - "trailing": false - }); - self.element.off("click." + self.getName()).on("click." + self.getName(), function (e) { - debounce(e); - st(e); - }); - self.element.on("mouseleave." + self.getName(), function (e) { - if (self.popupView) { - self.popupView.element.on("mouseenter." + self.getName(), function (e) { - enterPopup = true; - self.popupView.element.on("mouseleave." + self.getName(), function (e) { - hide(e); - }); - self.popupView.element.off("mouseenter." + self.getName()); - }); - BI.delay(function () { - if (!enterPopup) { - hide(e); - } - }, 50); - } - }); - break; - } - }); - }, - _initCombo: function () { this.combo = BI.createWidget(this.options.el, { value: this.options.value @@ -252,46 +122,6 @@ } }, - _assertPopupViewRender: function () { - this._assertPopupView(); - if (!this._rendered) { - BI.createWidget({ - type: "bi.vertical", - scrolly: false, - element: this.options.container || this, - items: [ - { el: this.popupView } - ] - }); - this._rendered = true; - } - }, - - _hideIf: function (e, skipTriggerChecker) { - // if (this.element.__isMouseInBounds__(e) || (this.popupView && this.popupView.element.__isMouseInBounds__(e))) { - // return; - // } - // BI-10290 公式combo双击公式内容会收起 - if (e && ((skipTriggerChecker !== true && this.element.find(e.target).length > 0) - || (this.popupView && this.popupView.element.find(e.target).length > 0) - || e.target.className === "CodeMirror-cursor" || BI.Widget._renderEngine.createElement(e.target).closest(".CodeMirror-hints").length > 0)) {// BI-9887 CodeMirror的公式弹框需要特殊处理下 - var directions = this.options.direction.split(","); - if (BI.contains(directions, "innerLeft") || BI.contains(directions, "innerRight")) { - // popup可以出现在trigger内部的combo,滚动时不需要消失,而是调整位置 - this.adjustWidth(); - this.adjustHeight(); - } - - return; - } - var isHide = this.options.hideChecker.apply(this, [e]); - if (isHide === false) { - return; - } - this._hideView(e); - return true; - }, - _hideView: function (e) { var o = this.options; this.fireEvent(BI.Combo.EVENT_BEFORE_HIDEVIEW); @@ -336,42 +166,16 @@ this.adjustHeight(e); this.element.addClass(this.options.comboClass); - BI.Widget._renderEngine.createElement(document).unbind("mousedown." + this.getName()).unbind("mousewheel." + this.getName()); + o.hideWhenClickOutside && BI.Widget._renderEngine.createElement(document).unbind("mousedown." + this.getName()).unbind("mousewheel." + this.getName()); + BI.Widget._renderEngine.createElement(document).unbind("mousewheel." + this.getName()); BI.EVENT_BLUR && o.hideWhenBlur && BI.Widget._renderEngine.createElement(window).unbind("blur." + this.getName()); - BI.Widget._renderEngine.createElement(document).bind("mousedown." + this.getName(), BI.bind(this._hideIf, this)).bind("mousewheel." + this.getName(), BI.bind(this._hideIf, this)); + o.hideWhenClickOutside && BI.Widget._renderEngine.createElement(document).bind("mousedown." + this.getName(), BI.bind(this._hideIf, this)).bind("mousewheel." + this.getName(), BI.bind(this._hideIf, this)); + BI.Widget._renderEngine.createElement(document).bind("mousewheel." + this.getName(), BI.bind(this._hideIf, this)); BI.EVENT_BLUR && o.hideWhenBlur && BI.Widget._renderEngine.createElement(window).bind("blur." + this.getName(), BI.bind(this._hideIf, this)); this.fireEvent(BI.Combo.EVENT_AFTER_POPUPVIEW); }, - adjustWidth: function (e) { - var o = this.options; - if (!this.popupView) { - return; - } - if (o.isNeedAdjustWidth === true) { - this.resetListWidth(""); - var width = this.popupView.element.outerWidth(); - var maxW = this.element.outerWidth() || o.width; - // BI-93885 最大列宽算法调整 - if (maxW < 500) { - if (width >= 500) { - maxW = 500; - } else if(width > maxW) { - // 防止小数导致差那么一点 - maxW = width + 1; - } - } - - // if (width > maxW + 80) { - // maxW = maxW + 80; - // } else if (width > maxW) { - // maxW = width; - // } - this.resetListWidth(maxW < 100 ? 100 : maxW); - } - }, - adjustHeight: function (e) { var o = this.options, p = {}; if (!this.popupView) { @@ -484,84 +288,12 @@ this.popupView.setVisible(isVisible); }, - resetListHeight: function (h) { - this._assertPopupView(); - this.popupView.resetHeight && this.popupView.resetHeight(h); - }, - - resetListWidth: function (w) { - this._assertPopupView(); - this.popupView.resetWidth && this.popupView.resetWidth(w); - }, - - populate: function (items) { - this._assertPopupView(); - this.popupView.populate.apply(this.popupView, arguments); - this.combo.populate && this.combo.populate.apply(this.combo, arguments); - }, - - _setEnable: function (arg) { - BI.Combo.superclass._setEnable.apply(this, arguments); - if (arg === true) { - this.element.removeClass("base-disabled disabled"); - } else if (arg === false) { - this.element.addClass("base-disabled disabled"); - } - !arg && this.element.removeClass(this.options.hoverClass); - !arg && this.isViewVisible() && this._hideView(); - }, - - setValue: function (v) { - this.combo.setValue(v); - if (BI.isNull(this.popupView)) { - this.options.popup.value = v; - } else { - this.popupView.setValue(v); - } - }, - - getValue: function () { - if (BI.isNull(this.popupView)) { - return this.options.popup.value; - } else { - return this.popupView.getValue(); - } - }, - - isViewVisible: function () { - return this.isEnabled() && this.combo.isEnabled() && !!this.popupView && this.popupView.isVisible(); - }, - - showView: function (e) { - // 减少popup 调整宽高的次数 - if (this.isEnabled() && this.combo.isEnabled() && !this.isViewVisible()) { - this._popupView(e); - } - }, - - hideView: function (e) { - this._hideView(e); - }, - - getView: function () { - return this.popupView; - }, - - getPopupPosition: function () { - return this.position; - }, - - toggle: function () { - this._toggle(); - }, - destroyed: function () { BI.Widget._renderEngine.createElement(document) .unbind("click." + this.getName()) .unbind("mousedown." + this.getName()) .unbind("mousewheel." + this.getName()) .unbind("mouseenter." + this.getName()) - .unbind("mousemove." + this.getName()) .unbind("mouseleave." + this.getName()); BI.Widget._renderEngine.createElement(window) .unbind("blur." + this.getName()); diff --git a/src/case/combo/bubblecombo/combo.bubble.js b/src/case/combo/bubblecombo/combo.bubble.js index 8a0af89b3..dd77173f3 100644 --- a/src/case/combo/bubblecombo/combo.bubble.js +++ b/src/case/combo/bubblecombo/combo.bubble.js @@ -137,6 +137,7 @@ BI.BubbleCombo = BI.inherit(BI.Widget, { this.triangle && this.triangle.destroy(); this.triangle = BI.createWidget(op, { type: "bi.center_adapt", + scrollable: false, cls: "button-combo-triangle-wrapper", items: [{ type: "bi.layout", diff --git a/src/less/base/combo/combo.bubble.less b/src/less/base/combo/combo.bubble.less index 337077402..fe2867772 100644 --- a/src/less/base/combo/combo.bubble.less +++ b/src/less/base/combo/combo.bubble.less @@ -32,7 +32,68 @@ } } +.bi-popup-view[data-popper-placement^='top'] { + > .bi-bubble-arrow { + bottom: -10px; + > .bubble-arrow { + bottom: 6px; + } + } +} +.bi-popup-view[data-popper-placement^='bottom'] { + > .bi-bubble-arrow { + top: -10px; + > .bubble-arrow { + top: 6px; + } + } +} +.bi-popup-view[data-popper-placement^='left'] { + > .bi-bubble-arrow { + right: -10px; + > .bubble-arrow { + right: 6px; + } + } +} +.bi-popup-view[data-popper-placement^='right'] { + > .bi-bubble-arrow { + left: -10px; + > .bubble-arrow { + left: 6px; + } + } +} + +.bi-bubble-arrow { + width: 10px; + height: 10px; + overflow: hidden; + .bubble-arrow { + width: 10px; + height: 10px; + position: absolute; + &:before { + width: 10px; + height: 10px; + position: absolute; + content: ""; + background: @color-bi-background-default; + top: 0; + left: 0; + transition: transform 0.2s ease-out 0s, visibility 0.2s ease-out 0s; + visibility: visible; + transform: translateX(0px) rotate(-135deg); + transform-origin: center center; + .box-shadow(3px 3px 10px 0,rgba(0,0,0,6%)); + } + } +} + .bi-theme-dark { + .bubble-arrow:before { + background: @color-bi-background-default-theme-dark; + } .bi-bubble-combo { & .bubble-combo-triangle-left, & .bubble-combo-triangle-right, & .bubble-combo-triangle-top, & .bubble-combo-triangle-bottom { &:before { From 3e09046072cbf45f55fb2100db8a2f987c43a8a9 Mon Sep 17 00:00:00 2001 From: data Date: Fri, 17 Dec 2021 23:43:50 +0800 Subject: [PATCH 31/46] auto upgrade version to 2.0.20211217234337 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6d358c9a4..04b6d82c1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211217162405", + "version": "2.0.20211217234337", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From b23b576563c0a22da1133f12a30ed367150952de Mon Sep 17 00:00:00 2001 From: guy Date: Sat, 18 Dec 2021 18:42:51 +0800 Subject: [PATCH 32/46] =?UTF-8?q?chore:=20=E4=BC=98=E5=8C=96=E4=B8=8B?= =?UTF-8?q?=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/case/segment/button.segment.js | 2 +- src/less/base/segment/segment.less | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/case/segment/button.segment.js b/src/case/segment/button.segment.js index 0e3ac343b..2d9d6c19a 100644 --- a/src/case/segment/button.segment.js +++ b/src/case/segment/button.segment.js @@ -10,7 +10,7 @@ BI.SegmentButton = BI.inherit(BI.BasicButton, { _defaultConfig: function () { var conf = BI.SegmentButton.superclass._defaultConfig.apply(this, arguments); return BI.extend(conf, { - baseCls: (conf.baseCls || "") + " bi-segment-button bi-list-item-select", + baseCls: (conf.baseCls || "") + " bi-segment-button bi-list-item-select bi-card", shadow: true, readonly: true, hgap: 5 diff --git a/src/less/base/segment/segment.less b/src/less/base/segment/segment.less index 7796d85af..817c6cd3e 100644 --- a/src/less/base/segment/segment.less +++ b/src/less/base/segment/segment.less @@ -3,7 +3,6 @@ .bi-segment{ & > .center-element{ .overflow-hidden(); - background: @color-bi-background-default; border-right: 1px solid @color-bi-border-highlight; border-top: 1px solid @color-bi-border-highlight; border-bottom: 1px solid @color-bi-border-highlight; @@ -24,7 +23,6 @@ .bi-segment { & > .center-element{ .overflow-hidden(); - background: @color-bi-background-default-theme-dark; border-right: 1px solid @color-bi-border-line-theme-dark; border-top: 1px solid @color-bi-border-line-theme-dark; border-bottom: 1px solid @color-bi-border-line-theme-dark; From 314c4a202700543e307e58e402ad4ec829cbfbab Mon Sep 17 00:00:00 2001 From: data Date: Sat, 18 Dec 2021 18:53:42 +0800 Subject: [PATCH 33/46] auto upgrade version to 2.0.20211218185328 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 04b6d82c1..c4c054b18 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211217234337", + "version": "2.0.20211218185328", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From 63d9fcad97224087dd2712ec80197cb6f357168a Mon Sep 17 00:00:00 2001 From: guy Date: Sat, 18 Dec 2021 18:56:00 +0800 Subject: [PATCH 34/46] =?UTF-8?q?chore:=20=E4=B9=B1=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/case/button/item.singleselect.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/case/button/item.singleselect.js b/src/case/button/item.singleselect.js index 910b579cd..8c5931f15 100644 --- a/src/case/button/item.singleselect.js +++ b/src/case/button/item.singleselect.js @@ -21,8 +21,6 @@ BI.SingleSelectItem = BI.inherit(BI.BasicButton, { text: o.text, keyword: o.keyword, value: o.value, - title: o.title || o.text, - warningTitle: o.warningTitle, py: o.py }); }, @@ -48,4 +46,4 @@ BI.SingleSelectItem = BI.inherit(BI.BasicButton, { }); BI.SingleSelectItem.EVENT_CHANGE = "EVENT_CHANGE"; -BI.shortcut("bi.single_select_item", BI.SingleSelectItem); \ No newline at end of file +BI.shortcut("bi.single_select_item", BI.SingleSelectItem); From a20bccfcf021158e3fc112a0dd2bb64f79dcfaf9 Mon Sep 17 00:00:00 2001 From: guy Date: Sat, 18 Dec 2021 22:11:46 +0800 Subject: [PATCH 35/46] =?UTF-8?q?chore:=20=E4=B9=B1=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../popup.searchtextvalue.js | 24 ++++++++++------- .../popup.textvaluecheck.js | 5 +++- .../combo/textvaluecombo/popup.textvalue.js | 26 +++++++++++-------- .../search/singleselect.search.loader.js | 25 +++++++++++------- .../singleselect/singleselect.loader.js | 23 +++++++++------- 5 files changed, 62 insertions(+), 41 deletions(-) diff --git a/src/case/combo/searchtextvaluecombo/popup.searchtextvalue.js b/src/case/combo/searchtextvaluecombo/popup.searchtextvalue.js index 0118cf84f..5244d5ff4 100644 --- a/src/case/combo/searchtextvaluecombo/popup.searchtextvalue.js +++ b/src/case/combo/searchtextvaluecombo/popup.searchtextvalue.js @@ -17,11 +17,7 @@ BI.SearchTextValueComboPopup = BI.inherit(BI.Pane, { ref: function () { self.popup = this; }, - items: BI.createItems(o.items, { - type: "bi.single_select_item", - textAlign: o.textAlign, - height: 24 - }), + items: this._formatItems(o.items), chooseType: BI.ButtonGroup.CHOOSE_TYPE_SINGLE, layouts: [{ type: "bi.vertical" @@ -45,6 +41,18 @@ BI.SearchTextValueComboPopup = BI.inherit(BI.Pane, { }; }, + _formatItems: function (items) { + var o = this.options; + return BI.map(items, function (i, item) { + return BI.extend({ + type: "bi.single_select_item", + textAlign: o.textAlign, + height: BI.SIZE_CONSANTS.LIST_ITEM_HEIGHT, + title: item.title || item.text + }, item); + }); + }, + // mounted之后做check mounted: function() { this.check(); @@ -53,11 +61,7 @@ BI.SearchTextValueComboPopup = BI.inherit(BI.Pane, { populate: function (find, match, keyword) { var items = BI.concat(find, match); BI.SearchTextValueComboPopup.superclass.populate.apply(this, items); - items = BI.createItems(items, { - type: "bi.single_select_item", - height: 24 - }); - this.popup.populate(items, keyword); + this.popup.populate(this._formatItems(items), keyword); }, getValue: function () { diff --git a/src/case/combo/textvaluecheckcombo/popup.textvaluecheck.js b/src/case/combo/textvaluecheckcombo/popup.textvaluecheck.js index f5678d870..6e700145c 100644 --- a/src/case/combo/textvaluecheckcombo/popup.textvaluecheck.js +++ b/src/case/combo/textvaluecheckcombo/popup.textvaluecheck.js @@ -35,11 +35,14 @@ BI.TextValueCheckComboPopup = BI.inherit(BI.Pane, { }, _formatItems: function (items) { + var o = this.options; return BI.map(items, function (i, item) { return BI.extend({ type: "bi.single_select_item", cls: "bi-list-item", - height: 24 + textAlign: o.textAlign, + height: BI.SIZE_CONSANTS.LIST_ITEM_HEIGHT, + title: item.title || item.text }, item); }); }, diff --git a/src/case/combo/textvaluecombo/popup.textvalue.js b/src/case/combo/textvaluecombo/popup.textvalue.js index 5b3c0a8ee..19840e4a9 100644 --- a/src/case/combo/textvaluecombo/popup.textvalue.js +++ b/src/case/combo/textvaluecombo/popup.textvalue.js @@ -11,11 +11,7 @@ BI.TextValueComboPopup = BI.inherit(BI.Pane, { var o = this.options, self = this; this.popup = BI.createWidget({ type: "bi.button_group", - items: BI.createItems(o.items, { - type: "bi.single_select_item", - textAlign: o.textAlign, - height: BI.SIZE_CONSANTS.LIST_ITEM_HEIGHT, - }), + items: this._formatItems(o.items), chooseType: o.chooseType, layouts: [{ type: "bi.vertical" @@ -39,13 +35,21 @@ BI.TextValueComboPopup = BI.inherit(BI.Pane, { }); }, + _formatItems: function (items) { + var o = this.options; + return BI.map(items, function (i, item) { + return BI.extend({ + type: "bi.single_select_item", + textAlign: o.textAlign, + height: BI.SIZE_CONSANTS.LIST_ITEM_HEIGHT, + title: item.title || item.text + }, item); + }); + }, + populate: function (items) { BI.TextValueComboPopup.superclass.populate.apply(this, arguments); - items = BI.createItems(items, { - type: "bi.single_select_item", - height: BI.SIZE_CONSANTS.LIST_ITEM_HEIGHT, - }); - this.popup.populate(items); + this.popup.populate(this._formatItems(items)); }, getValue: function () { @@ -58,4 +62,4 @@ BI.TextValueComboPopup = BI.inherit(BI.Pane, { }); BI.TextValueComboPopup.EVENT_CHANGE = "EVENT_CHANGE"; -BI.shortcut("bi.text_value_combo_popup", BI.TextValueComboPopup); \ No newline at end of file +BI.shortcut("bi.text_value_combo_popup", BI.TextValueComboPopup); diff --git a/src/widget/singleselect/search/singleselect.search.loader.js b/src/widget/singleselect/search/singleselect.search.loader.js index 5d03f020c..a61ac843e 100644 --- a/src/widget/singleselect/search/singleselect.search.loader.js +++ b/src/widget/singleselect/search/singleselect.search.loader.js @@ -10,6 +10,9 @@ BI.SingleSelectSearchLoader = BI.inherit(BI.Widget, { return BI.extend(BI.SingleSelectSearchLoader.superclass._defaultConfig.apply(this, arguments), { baseCls: "bi-single-select-search-loader", allowNoSelect: false, + logic: { + dynamic: false + }, itemsCreator: BI.emptyFn, keywordGetter: BI.emptyFn, valueFormatter: BI.emptyFn @@ -86,16 +89,18 @@ BI.SingleSelectSearchLoader = BI.inherit(BI.Widget, { }, _createItems: function (items) { - return BI.createItems(items, { - type: this.options.allowNoSelect ? "bi.single_select_item" : "bi.single_select_radio_item", - cls: "bi-list-item-active", - logic: { - dynamic: false - }, - height: 25, - selected: false, - iconWrapperWidth: 26, - hgap: this.options.allowNoSelect ? 10 : 0 + var o = this.options; + return BI.map(items, function (i, item) { + return BI.extend({ + type: o.allowNoSelect ? "bi.single_select_item" : "bi.single_select_radio_item", + logic: o.logic, + cls: "bi-list-item-active", + height: 24, + selected: false, + iconWrapperWidth: 26, + hgap: o.allowNoSelect ? 10 : 0, + title: item.title || item.text + }, item); }); }, diff --git a/src/widget/singleselect/singleselect.loader.js b/src/widget/singleselect/singleselect.loader.js index 6318601ab..0cc2f6e60 100644 --- a/src/widget/singleselect/singleselect.loader.js +++ b/src/widget/singleselect/singleselect.loader.js @@ -108,14 +108,18 @@ BI.SingleSelectLoader = BI.inherit(BI.Widget, { }, _createItems: function (items) { - return BI.createItems(items, { - type: this.options.allowNoSelect ? "bi.single_select_item" : "bi.single_select_radio_item", - logic: this.options.logic, - cls: "bi-list-item-active", - height: 24, - selected: false, - iconWrapperWidth: 26, - hgap: this.options.allowNoSelect ? 10 : 0 + var o = this.options; + return BI.map(items, function (i, item) { + return BI.extend({ + type: o.allowNoSelect ? "bi.single_select_item" : "bi.single_select_radio_item", + logic: o.logic, + cls: "bi-list-item-active", + height: 24, + selected: false, + iconWrapperWidth: 26, + hgap: o.allowNoSelect ? 10 : 0, + title: item.title || item.text + }, item); }); }, @@ -126,7 +130,8 @@ BI.SingleSelectLoader = BI.inherit(BI.Widget, { }, 30); }, - _assertValue: function (val) {}, + _assertValue: function (val) { + }, setStartValue: function (v) { this._startValue = v; From 08fac4067f8d00b2f9806a405ca6e03b009f9d11 Mon Sep 17 00:00:00 2001 From: data Date: Sat, 18 Dec 2021 22:23:49 +0800 Subject: [PATCH 36/46] auto upgrade version to 2.0.20211218222335 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c4c054b18..15e864e6c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211218185328", + "version": "2.0.20211218222335", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From 4ee7c2eb11d2be0c695e3304b2dce5bc469cd900 Mon Sep 17 00:00:00 2001 From: guy Date: Sun, 19 Dec 2021 12:21:57 +0800 Subject: [PATCH 37/46] =?UTF-8?q?chore:=20=E6=94=B9=E4=B8=80=E4=B8=8B?= =?UTF-8?q?=E9=BB=98=E8=AE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/case/editor/editor.clear.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/case/editor/editor.clear.js b/src/case/editor/editor.clear.js index 372d31bdd..4a7916590 100644 --- a/src/case/editor/editor.clear.js +++ b/src/case/editor/editor.clear.js @@ -32,6 +32,7 @@ BI.ClearEditor = BI.inherit(BI.Widget, { this.clear = BI.createWidget({ type: "bi.icon_button", stopEvent: true, + invisible: BI.isKey(o.value), cls: "search-close-h-font" }); this.clear.on(BI.IconButton.EVENT_CHANGE, function () { @@ -113,12 +114,6 @@ BI.ClearEditor = BI.inherit(BI.Widget, { this.editor.on(BI.Editor.EVENT_STOP, function () { self.fireEvent(BI.ClearEditor.EVENT_STOP); }); - - if (BI.isKey(o.value)) { - this.clear.visible(); - } else { - this.clear.invisible(); - } }, _checkClear: function () { @@ -179,4 +174,4 @@ BI.ClearEditor.EVENT_ENTER = "EVENT_ENTER"; BI.ClearEditor.EVENT_RESTRICT = "EVENT_RESTRICT"; BI.ClearEditor.EVENT_REMOVE = "EVENT_REMOVE"; BI.ClearEditor.EVENT_EMPTY = "EVENT_EMPTY"; -BI.shortcut("bi.clear_editor", BI.ClearEditor); \ No newline at end of file +BI.shortcut("bi.clear_editor", BI.ClearEditor); From b547fcf14aa587e6350bc448aea8a2989fe97f01 Mon Sep 17 00:00:00 2001 From: data Date: Sun, 19 Dec 2021 12:53:39 +0800 Subject: [PATCH 38/46] auto upgrade version to 2.0.20211219125332 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 15e864e6c..0335d302e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211218222335", + "version": "2.0.20211219125332", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From 08caa2689ccf08bfb66b4b733fef34d0cf44932f Mon Sep 17 00:00:00 2001 From: guy Date: Sun, 19 Dec 2021 16:20:12 +0800 Subject: [PATCH 39/46] =?UTF-8?q?chore:=20=E6=94=B9=E4=B8=80=E4=B8=8B?= =?UTF-8?q?=E9=BB=98=E8=AE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/case/editor/editor.clear.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/case/editor/editor.clear.js b/src/case/editor/editor.clear.js index 4a7916590..6296d5418 100644 --- a/src/case/editor/editor.clear.js +++ b/src/case/editor/editor.clear.js @@ -32,7 +32,7 @@ BI.ClearEditor = BI.inherit(BI.Widget, { this.clear = BI.createWidget({ type: "bi.icon_button", stopEvent: true, - invisible: BI.isKey(o.value), + invisible: !BI.isKey(o.value), cls: "search-close-h-font" }); this.clear.on(BI.IconButton.EVENT_CHANGE, function () { From f4d1c2a610fa427213e3d389a42cae1caee66a56 Mon Sep 17 00:00:00 2001 From: data Date: Sun, 19 Dec 2021 16:32:50 +0800 Subject: [PATCH 40/46] auto upgrade version to 2.0.20211219163239 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0335d302e..f1205fe2f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211219125332", + "version": "2.0.20211219163239", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From 605602a436edd34d5186a3cbb0484b923ccfb22c Mon Sep 17 00:00:00 2001 From: windy <1374721899@qq.com> Date: Mon, 20 Dec 2021 11:09:20 +0800 Subject: [PATCH 41/46] =?UTF-8?q?BI-98802=20fix:=20=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=90=8C=E6=AD=A5=E6=94=B9=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multiselectlist/multiselectlist.insert.js | 17 +++++++++++------ .../multiselectlist.insert.nobar.js | 17 +++++++++++------ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/widget/multiselectlist/multiselectlist.insert.js b/src/widget/multiselectlist/multiselectlist.insert.js index 4fbf258e2..082669692 100644 --- a/src/widget/multiselectlist/multiselectlist.insert.js +++ b/src/widget/multiselectlist/multiselectlist.insert.js @@ -101,7 +101,11 @@ BI.MultiSelectInsertList = BI.inherit(BI.Single, { }, { eventName: BI.Searcher.EVENT_PAUSE, action: function () { - var keyword = this.getKeyword(); + var keywords = self._getKeywords(); + if (keywords[keywords.length - 1] === BI.BlankSplitChar) { + keywords = keywords.slice(0, keywords.length - 1); + } + var keyword = BI.isEmptyArray(keywords) ? "" : keywords[keywords.length - 1]; self._join({ type: BI.Selection.Multi, value: [keyword] @@ -126,7 +130,7 @@ BI.MultiSelectInsertList = BI.inherit(BI.Single, { var last = BI.last(keywords); keywords = BI.initial(keywords || []); if (keywords.length > 0) { - self._joinKeywords(keywords.slice(0, last === BI.BlankSplitChar ? 1999 : 2000), function () { + self._joinKeywords(keywords, function () { if (BI.endWith(last, BI.BlankSplitChar)) { self.adapter.setValue(self.storeValue); assertShowValue(); @@ -191,16 +195,17 @@ BI.MultiSelectInsertList = BI.inherit(BI.Single, { keywords = keywords.slice(0, keywords.length - 1); } if (/\u200b\s\u200b$/.test(val)) { - return keywords.concat([BI.BlankSplitChar]); + keywords = keywords.concat([BI.BlankSplitChar]); } - return keywords; + return keywords.length > 2000 ? keywords.slice(0, 2000).concat([BI.BlankSplitChar]) : keywords.slice(0, 2000); }, _getKeywordsLength: function () { - var keywords = this._getKeywords(); + var val = this.editor.getValue(); + var keywords = val.split(/\u200b\s\u200b/); - return keywords[keywords.length - 1] === BI.BlankSplitChar ? keywords.length - 1 : keywords.length; + return keywords.length - 1; }, _showAdapter: function () { diff --git a/src/widget/multiselectlist/multiselectlist.insert.nobar.js b/src/widget/multiselectlist/multiselectlist.insert.nobar.js index 8369b2acf..e2c8f2008 100644 --- a/src/widget/multiselectlist/multiselectlist.insert.nobar.js +++ b/src/widget/multiselectlist/multiselectlist.insert.nobar.js @@ -105,7 +105,11 @@ BI.MultiSelectInsertNoBarList = BI.inherit(BI.Single, { }, { eventName: BI.Searcher.EVENT_PAUSE, action: function () { - var keyword = this.getKeyword(); + var keywords = self._getKeywords(); + if (keywords[keywords.length - 1] === BI.BlankSplitChar) { + keywords = keywords.slice(0, keywords.length - 1); + } + var keyword = BI.isEmptyArray(keywords) ? "" : keywords[keywords.length - 1]; self._join({ type: BI.Selection.Multi, value: [keyword] @@ -129,7 +133,7 @@ BI.MultiSelectInsertNoBarList = BI.inherit(BI.Single, { var last = BI.last(keywords); keywords = BI.initial(keywords || []); if (keywords.length > 0) { - self._joinKeywords(keywords.slice(0, last === BI.BlankSplitChar ? 1999 : 2000), function () { + self._joinKeywords(keywords, function () { if (BI.endWith(last, BI.BlankSplitChar)) { self.adapter.setValue(self.storeValue); assertShowValue(); @@ -197,16 +201,17 @@ BI.MultiSelectInsertNoBarList = BI.inherit(BI.Single, { keywords = keywords.slice(0, keywords.length - 1); } if (/\u200b\s\u200b$/.test(val)) { - return keywords.concat([BI.BlankSplitChar]); + keywords = keywords.concat([BI.BlankSplitChar]); } - return keywords; + return keywords.length > 2000 ? keywords.slice(0, 2000).concat([BI.BlankSplitChar]) : keywords.slice(0, 2000); }, _getKeywordsLength: function () { - var keywords = this._getKeywords(); + var val = this.editor.getValue(); + var keywords = val.split(/\u200b\s\u200b/); - return keywords[keywords.length - 1] === BI.BlankSplitChar ? keywords.length - 1 : keywords.length; + return keywords.length - 1; }, _showAdapter: function () { From 4d557711ae2a391cd8f4e04fb3200e009cec2411 Mon Sep 17 00:00:00 2001 From: data Date: Mon, 20 Dec 2021 11:53:58 +0800 Subject: [PATCH 42/46] auto upgrade version to 2.0.20211220115344 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f1205fe2f..cbedaa4b7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211219163239", + "version": "2.0.20211220115344", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From 972e5c9c4f39aa57891b004b3be269b13c4a90a7 Mon Sep 17 00:00:00 2001 From: guy Date: Mon, 20 Dec 2021 15:26:46 +0800 Subject: [PATCH 43/46] =?UTF-8?q?BI-96759=EF=BC=9Atoast=E6=94=AF=E6=8C=81c?= =?UTF-8?q?losable=E5=B1=9E=E6=80=A7=EF=BC=8C=E5=8F=AF=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E6=98=BE=E7=A4=BA=E5=85=B3=E9=97=AD=E6=8C=89?= =?UTF-8?q?=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.md | 1 + src/base/foundation/message.js | 5 +++++ src/base/single/tip/tip.toast.js | 11 ++++++++--- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/changelog.md b/changelog.md index 0aecc31a7..e9ae90d8a 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,6 @@ # 更新日志 2.0(2021-12) +- toast支持closable属性,可控制是否显示关闭按钮 - 新增气泡弹框控件 - BI.point支持widget添加埋点 - childContext废弃,替换成provide diff --git a/src/base/foundation/message.js b/src/base/foundation/message.js index 54d66c8d7..8fade4b01 100644 --- a/src/base/foundation/message.js +++ b/src/base/foundation/message.js @@ -32,6 +32,7 @@ BI.Msg = function () { cls: "bi-message-animate bi-message-leave", level: level, autoClose: autoClose, + closable: options.closable, text: message, listeners: [{ eventName: BI.Toast.EVENT_DESTORY, @@ -67,6 +68,10 @@ BI.Msg = function () { toast.element.removeClass("bi-message-enter").addClass("bi-message-leave"); toast.destroy(); }, 5000); + return function () { + toast.element.removeClass("bi-message-enter").addClass("bi-message-leave"); + toast.destroy(); + }; }, _show: function (hasCancel, title, message, callback) { BI.isNull($mask) && ($mask = BI.Widget._renderEngine.createElement("

    ").css({ diff --git a/src/base/single/tip/tip.toast.js b/src/base/single/tip/tip.toast.js index aca66e47a..f853d8659 100644 --- a/src/base/single/tip/tip.toast.js +++ b/src/base/single/tip/tip.toast.js @@ -15,7 +15,9 @@ BI.Toast = BI.inherit(BI.Tip, { return BI.extend(BI.Toast.superclass._defaultConfig.apply(this, arguments), { extraCls: "bi-toast", text: "", - level: "success" // success或warning + level: "success", // success或warning + autoClose: true, + closable: null }); }, @@ -56,6 +58,9 @@ BI.Toast = BI.inherit(BI.Tip, { break; } + var hasCloseIcon = function () { + return o.closable === true || (o.closable === null && o.autoClose === false); + }; var items = [{ type: "bi.icon_label", cls: cls + " toast-icon", @@ -68,12 +73,12 @@ BI.Toast = BI.inherit(BI.Tip, { textHeight: 16, textAlign: "left" }, - rgap: o.autoClose ? this._const.hgap : 0 + rgap: hasCloseIcon() ? 0 : this._const.hgap }]; var columnSize = [36, "fill"]; - if (o.autoClose === false) { + if (hasCloseIcon()) { items.push({ type: "bi.icon_button", cls: "close-font toast-icon", From a197eb2f9e2e8cc66d447784c8ce1e3356af566a Mon Sep 17 00:00:00 2001 From: data Date: Mon, 20 Dec 2021 15:43:58 +0800 Subject: [PATCH 44/46] auto upgrade version to 2.0.20211220154344 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cbedaa4b7..d8dc4ab46 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211220115344", + "version": "2.0.20211220154344", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts", From fabf8d7fc60847ee6661ed2655972c033dcac2c7 Mon Sep 17 00:00:00 2001 From: guy Date: Mon, 20 Dec 2021 21:58:37 +0800 Subject: [PATCH 45/46] =?UTF-8?q?chore:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../colorchooser/colorchooser.popup.hex.js | 283 +++++++++--------- .../colorpicker/colorpicker.hex.js | 4 +- .../colorpicker/editor.colorpicker.hex.js | 4 +- 3 files changed, 141 insertions(+), 150 deletions(-) diff --git a/src/case/colorchooser/colorchooser.popup.hex.js b/src/case/colorchooser/colorchooser.popup.hex.js index 347dd0401..24ede8718 100644 --- a/src/case/colorchooser/colorchooser.popup.hex.js +++ b/src/case/colorchooser/colorchooser.popup.hex.js @@ -16,32 +16,59 @@ BI.HexColorChooserPopup = BI.inherit(BI.Widget, { var self = this, o = this.options; var hasRecommendColors = BI.isNotNull(o.recommendColorsGetter()); return [{ - el: { - type: 'bi.vertical', - items: [{ - el: { - type: "bi.vertical", - hgap: 15, - items: [BI.extend({ - type: o.simple ? "bi.simple_hex_color_picker_editor" : "bi.hex_color_picker_editor", + type: "bi.vertical", + items: [{ + el: { + type: "bi.vertical", + hgap: 15, + items: [BI.extend({ + type: o.simple ? "bi.simple_hex_color_picker_editor" : "bi.hex_color_picker_editor", + value: o.value, + height: o.simple ? 36 : 70, + listeners: [{ + eventName: BI.ColorPickerEditor.EVENT_CHANGE, + action: function () { + self.setValue(this.getValue()); + self._dealStoreColors(); + self.fireEvent(BI.ColorChooserPopup.EVENT_VALUE_CHANGE, arguments); + } + }], + ref: function (_ref) { + self.colorEditor = _ref; + } + }, o.editor), { + el: { + type: "bi.hex_color_picker", + cls: "bi-border-bottom bi-border-right", + items: [this._digestStoreColors(this._getStoreColors())], + height: 22, value: o.value, - height: o.simple ? 36 : 70, listeners: [{ - eventName: BI.ColorPickerEditor.EVENT_CHANGE, + eventName: BI.ColorPicker.EVENT_CHANGE, action: function () { - self.setValue(this.getValue()); + self.setValue(this.getValue()[0]); self._dealStoreColors(); - self.fireEvent(BI.ColorChooserPopup.EVENT_VALUE_CHANGE, arguments); + self.fireEvent(BI.ColorChooserPopup.EVENT_CHANGE, arguments); } }], ref: function (_ref) { - self.colorEditor = _ref; + self.storeColors = _ref; } - }, o.editor), { - el: { + }, + tgap: 10, + height: 22 + }, { + el: hasRecommendColors ? { + type: "bi.vertical", + items: [{ + type: "bi.label", + text: BI.i18nText("BI-Basic_Recommend_Color"), + textAlign: "left", + height: 24 + }, { type: "bi.hex_color_picker", cls: "bi-border-bottom bi-border-right", - items: [this._digestStoreColors(this._getStoreColors())], + items: [this._digestStoreColors(o.recommendColorsGetter())], height: 22, value: o.value, listeners: [{ @@ -53,144 +80,111 @@ BI.HexColorChooserPopup = BI.inherit(BI.Widget, { } }], ref: function (_ref) { - self.storeColors = _ref; + self.recommendColors = _ref; } - }, - tgap: 10, - height: 22 - }, { - el: hasRecommendColors ? { - type: 'bi.vertical', - items: [{ - type: 'bi.label', - text: BI.i18nText('BI-Basic_Recommend_Color'), - textAlign: 'left', - height: 24, - }, { - type: "bi.hex_color_picker", - cls: "bi-border-bottom bi-border-right", - items: [this._digestStoreColors(o.recommendColorsGetter())], - height: 22, - value: o.value, - listeners: [{ - eventName: BI.ColorPicker.EVENT_CHANGE, - action: function () { - self.setValue(this.getValue()[0]); - self._dealStoreColors(); - self.fireEvent(BI.ColorChooserPopup.EVENT_CHANGE, arguments); - } - }], - ref: function (_ref) { - self.recommendColors = _ref; - } - }] - } : { type: 'bi.layout' }, - tgap: hasRecommendColors ? 10 : 0, - height: hasRecommendColors ? 47 : 0 - }, { - el: { - type: 'bi.layout', - cls: 'bi-border-top', - }, - vgap: 10, - height: 1 - }, { - type: 'bi.absolute', - items: [{ - el: { - type: "bi.hex_color_picker", - space: true, - value: o.value, - listeners: [{ - eventName: BI.ColorPicker.EVENT_CHANGE, - action: function () { - self.setValue(this.getValue()[0]); - self._dealStoreColors(); - self.fireEvent(BI.ColorChooserPopup.EVENT_CHANGE, arguments); - } - }], - ref: function (_ref) { - self.colorPicker = _ref; - }, - }, - top: 0, - left: 0, - right: 0, - bottom: 1, - }], - height: 80, - }] - } - }, { - el: { - type: "bi.combo", - cls: "bi-border-top", - container: null, - direction: "right,top", - isNeedAdjustHeight: false, + }] + } : {type: "bi.layout"}, + tgap: hasRecommendColors ? 10 : 0, + height: hasRecommendColors ? 47 : 0 + }, { el: { - type: "bi.text_item", - cls: "color-chooser-popup-more bi-list-item", - textAlign: "center", - height: 24, - textLgap: 10, - text: BI.i18nText("BI-Basic_More") + "..." + type: "bi.layout", + cls: "bi-border-top" }, - popup: { - type: "bi.popup_panel", - buttons: [BI.i18nText("BI-Basic_Cancel"), BI.i18nText("BI-Basic_Save")], - title: BI.i18nText("BI-Custom_Color"), + vgap: 10, + height: 1 + }, { + type: "bi.absolute", + items: [{ el: { - type: "bi.custom_color_chooser", - editor: o.editor, + type: "bi.hex_color_picker", + space: true, + value: o.value, + listeners: [{ + eventName: BI.ColorPicker.EVENT_CHANGE, + action: function () { + self.setValue(this.getValue()[0]); + self._dealStoreColors(); + self.fireEvent(BI.ColorChooserPopup.EVENT_CHANGE, arguments); + } + }], ref: function (_ref) { - self.customColorChooser = _ref; + self.colorPicker = _ref; } }, - stopPropagation: false, - bgap: -1, - rgap: 1, - lgap: 1, - minWidth: 227, - listeners: [{ - eventName: BI.PopupPanel.EVENT_CLICK_TOOLBAR_BUTTON, - action: function (index) { - switch (index) { - case 0: - self.more.hideView(); - break; - case 1: - var color = self.customColorChooser.getValue(); - // farbtastic选择器没有透明和自动选项,点击保存不应该设置透明 - if (BI.isNotEmptyString(color)) { - self.setValue(color); - self._dealStoreColors(); - } - self.more.hideView(); - self.fireEvent(BI.ColorChooserPopup.EVENT_CHANGE, arguments); - break; - } - } - }] + top: 0, + left: 0, + right: 0, + bottom: 1 + }], + height: 80 + }] + } + }, { + el: { + type: "bi.combo", + cls: "bi-border-top", + container: null, + direction: "right,top", + isNeedAdjustHeight: false, + el: { + type: "bi.text_item", + cls: "color-chooser-popup-more bi-list-item", + textAlign: "center", + height: 24, + textLgap: 10, + text: BI.i18nText("BI-Basic_More") + "..." + }, + popup: { + type: "bi.popup_panel", + buttons: [BI.i18nText("BI-Basic_Cancel"), BI.i18nText("BI-Basic_Save")], + title: BI.i18nText("BI-Custom_Color"), + el: { + type: "bi.custom_color_chooser", + editor: o.editor, + ref: function (_ref) { + self.customColorChooser = _ref; + } }, + stopPropagation: false, + bgap: -1, + rgap: 1, + lgap: 1, + minWidth: 227, listeners: [{ - eventName: BI.Combo.EVENT_AFTER_POPUPVIEW, - action: function () { - self.customColorChooser.setValue(self.getValue()); + eventName: BI.PopupPanel.EVENT_CLICK_TOOLBAR_BUTTON, + action: function (index) { + switch (index) { + case 0: + self.more.hideView(); + break; + case 1: + var color = self.customColorChooser.getValue(); + // farbtastic选择器没有透明和自动选项,点击保存不应该设置透明 + if (BI.isNotEmptyString(color)) { + self.setValue(color); + self._dealStoreColors(); + } + self.more.hideView(); + self.fireEvent(BI.ColorChooserPopup.EVENT_CHANGE, arguments); + break; + } } - }], - ref: function (_ref) { - self.more = _ref; - } + }] }, - tgap: 10, - height: 24 - }] - }, - left: 0, - right: 0, - top: 0, - bottom: 0 + listeners: [{ + eventName: BI.Combo.EVENT_AFTER_POPUPVIEW, + action: function () { + self.customColorChooser.setValue(self.getValue()); + } + }], + ref: function (_ref) { + self.more = _ref; + } + }, + tgap: 10, + height: 24 + }] }, { type: "bi.absolute", items: [{ @@ -212,7 +206,6 @@ BI.HexColorChooserPopup = BI.inherit(BI.Widget, { // 这里就实现的不好了,setValue里面有个editor,editor的setValue会检测错误然后出bubble提示 mounted: function () { - var self = this; var o = this.options; if (BI.isNotNull(o.value)) { this.setValue(o.value); @@ -251,7 +244,7 @@ BI.HexColorChooserPopup = BI.inherit(BI.Widget, { return items; }, - _getStoreColors: function() { + _getStoreColors: function () { var self = this, o = this.options; var colorsArray = BI.string2Array(BI.Cache.getItem("colors") || ""); return BI.filter(colorsArray, function (idx, color) { diff --git a/src/case/colorchooser/colorpicker/colorpicker.hex.js b/src/case/colorchooser/colorpicker/colorpicker.hex.js index fad7c5b84..993607841 100644 --- a/src/case/colorchooser/colorpicker/colorpicker.hex.js +++ b/src/case/colorchooser/colorpicker/colorpicker.hex.js @@ -110,8 +110,6 @@ BI.HexColorPicker = BI.inherit(BI.Widget, { render: function () { var self = this, o = this.options; - this.colors = BI.createWidget(); - return { type: "bi.button_group", items: this._digest(o.items || this._items), @@ -167,4 +165,4 @@ BI.HexColorPicker = BI.inherit(BI.Widget, { } }); BI.HexColorPicker.EVENT_CHANGE = "EVENT_CHANGE"; -BI.shortcut("bi.hex_color_picker", BI.HexColorPicker); \ No newline at end of file +BI.shortcut("bi.hex_color_picker", BI.HexColorPicker); diff --git a/src/case/colorchooser/colorpicker/editor.colorpicker.hex.js b/src/case/colorchooser/colorpicker/editor.colorpicker.hex.js index 0326c9130..d2be8a8f9 100644 --- a/src/case/colorchooser/colorpicker/editor.colorpicker.hex.js +++ b/src/case/colorchooser/colorpicker/editor.colorpicker.hex.js @@ -61,7 +61,7 @@ BI.HexColorPickerEditor = BI.inherit(BI.Widget, { tgap: 10, items: [{ type: 'bi.vertical_adapt', - columnSize: [0.5, 'fill'], + columnSize: ["fill", 'fill'], height: 24, items: [{ type: "bi.color_picker_show_button", @@ -284,4 +284,4 @@ BI.HexColorPickerEditor = BI.inherit(BI.Widget, { } }); BI.HexColorPickerEditor.EVENT_CHANGE = "EVENT_CHANGE"; -BI.shortcut("bi.hex_color_picker_editor", BI.HexColorPickerEditor); \ No newline at end of file +BI.shortcut("bi.hex_color_picker_editor", BI.HexColorPickerEditor); From ffdd869d6b6cdbe2398f29c4f7ffe68ffdf6b6e7 Mon Sep 17 00:00:00 2001 From: data Date: Mon, 20 Dec 2021 22:13:50 +0800 Subject: [PATCH 46/46] auto upgrade version to 2.0.20211220221336 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d8dc4ab46..e930beae6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fineui", - "version": "2.0.20211220154344", + "version": "2.0.20211220221336", "description": "fineui", "main": "dist/fineui.min.js", "types": "dist/lib/index.d.ts",

    +P-cnT#He` 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%0D=&cYSKBnYF|SOm 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