UNPKG

@hsui/core

Version:

Hundsun frontend runtime core framework

1,635 lines (1,500 loc) 67 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@hsui/sdk'), require('@hsui/logger'), require('vue'), require('vue-router'), require('@@/huiExports')) : typeof define === 'function' && define.amd ? define(['exports', '@hsui/sdk', '@hsui/logger', 'vue', 'vue-router', '@@/huiExports'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.core = {}, global.huiSdk, global.huiLogger, global.Vue, global.VueRouter, global.huiExports)); }(this, (function (exports, sdk, logger$1, Model, Router, huiExports) { 'use strict'; function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var Model__default = /*#__PURE__*/_interopDefaultLegacy(Model); var Router__default = /*#__PURE__*/_interopDefaultLegacy(Router); function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } 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; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } 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); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _classPrivateFieldBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } var id = 0; function _classPrivateFieldKey(name) { return "__private_" + id++ + "_" + name; } function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } /** * Native isArray */ var isArray = Array.isArray; /** * Underscore isFunction */ function isFunction(value) { return Object.prototype.toString.call(value) === '[object Function]'; } /** * Redux isPlainObject */ function isPlainObject(obj) { if (_typeof(obj) !== 'object' || obj === null) return false; var proto = obj; while (Object.getPrototypeOf(proto) !== null) { proto = Object.getPrototypeOf(proto); } return Object.getPrototypeOf(obj) === proto; } /** * Check if powered by HUI Micro App */ function isMicroApp() { return Boolean(window.__POWERED_BY_HUI_MICRO_APP__); } /** * simple generate uuid * 支持 ie10 及以上 * 基于 uuid v4 添加 performance.now 避免重复 */ function uuid() { var d = Date.now(); if (typeof performance !== 'undefined' && typeof performance.now === 'function') { d += performance.now(); //use high-precision timer if available } return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = (d + Math.random() * 16) % 16 | 0; d = Math.floor(d / 16); return (c === 'x' ? r : r & 0x3 | 0x8).toString(16); }); } /** * Underscore uniqueId */ var idCounter = 0; function uniqueId(prefix) { var id = ++idCounter + ''; return prefix ? prefix + id : id; } /** * Native extend */ var extend = Object.assign; /** * Lodash isObject */ function isObject$1(value) { var type = _typeof(value); return value != null && (type == 'object' || type == 'function'); } /** * Underscore clone */ function clone(value) { if (!isObject$1(value)) return value; if (typeof value === 'function') return value; return isArray(value) ? value.slice() : extend({}, value); } /** * DeepClone */ function deepClone(value) { return JSON.parse(JSON.stringify(value)); } var utils = /*#__PURE__*/Object.freeze({ __proto__: null, isArray: isArray, isFunction: isFunction, isPlainObject: isPlainObject, isMicroApp: isMicroApp, uuid: uuid, uniqueId: uniqueId, extend: extend, isObject: isObject$1, clone: clone, deepClone: deepClone }); /** * Lodash isUndefined */ function isUndefined(value) { return value === undefined; } /** * Lodash isObject */ function isObject(value) { var type = _typeof(value); return value != null && (type == 'object' || type == 'function'); } /** * Lodash noop */ function noop() { // No operation performed. } function isNull(value) { return value === null || value === undefined; } function isString(value) { return typeof value === 'string'; } 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 _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } 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 _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 _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } /** * @class - MiddlewareManager * @classdesc - manager of middlewares */ var MiddlewareManager = /*#__PURE__*/function () { function MiddlewareManager(type) { _classCallCheck(this, MiddlewareManager); this.type = type; this.middlewares = []; this.finalHook = noop; } _createClass(MiddlewareManager, [{ key: "final", value: function final(hook) { this.finalHook = hook; } }, { key: "concat", value: function concat(middlewares) { this.middlewares = this.middlewares.concat(middlewares); } }, { key: "push", value: function push(middleware) { this.middlewares.push(middleware); } // just run and return nothing }, { key: "justRun", value: function justRun() { this.args = Array.prototype.slice.call(arguments); var _this = this; var fn = function fn(index) { if (index < this.middlewares.length) { this.middlewares[index].apply(null, [].concat(_toConsumableArray(this.args), [function () { fn.call(_this, ++index); }])); } else { this.finalHook.apply(null, this.args); } }; fn.call(_this, 0); } // run middlewares and return a promise }, { key: "runAndReturn", value: function runAndReturn() { this.args = Array.prototype.slice.call(arguments); var _this = this; return new Promise(function (resolve, reject) { var fn = function fn(index) { if (index < this.middlewares.length) { try { this.middlewares[index].apply(null, [].concat(_toConsumableArray(this.args), [function () { fn.call(_this, ++index); }])); } catch (error) { reject(error); } } else { // final hook should return a promise too this.finalHook.apply(null, this.args).then(resolve).catch(reject); } }; fn.call(_this, 0); }); } }]); return MiddlewareManager; }(); var manager = {}; ['before-route-change', 'after-route-change', 'before-request-send', 'after-request-send', 'before-launch'].forEach(function (type) { manager[type] = new MiddlewareManager(type); }); var beforeRouteChange = manager['before-route-change']; var afterRouteChange = manager['after-route-change']; var beforeRequestSend = manager['before-request-send']; var afterRequestSend = manager['after-request-send']; var beforeLaunch = manager['before-launch']; function registerMiddleware(type, middleware) { if (isFunction(middleware)) { manager[type].push(middleware); } if (isArray(middleware)) { manager[type].concat(middleware); } } var logger = logger$1.createLogger(); var log = function log() { for (var _len = arguments.length, content = new Array(_len), _key = 0; _key < _len; _key++) { content[_key] = arguments[_key]; } return logger.info.apply(logger, content); }; logger.levels.forEach(function (level) { log[level] = function () { for (var _len2 = arguments.length, content = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { content[_key2] = arguments[_key2]; } return logger[level].apply(logger, content); }; }); function final_(error, response) { if (error) { return Promise.reject(error); } return Promise.resolve(response); } /** * 合并全局配置和实例配置 * @param {Object} defaultConfig 全局配置 * @param {Object} config 实例配置 * @returns 合并后的请求配置 */ function mergeConfig(defaultConfig, config) { var mergedConfig = _objectSpread2(_objectSpread2({}, defaultConfig), config); if (mergedConfig.shouldMergeHeaders) { var defaultHeaders = defaultConfig.headers; var configHeaders = config.headers; var mergedHeaders = _objectSpread2(_objectSpread2({}, defaultHeaders), configHeaders); mergedConfig.headers = mergedHeaders; } return mergedConfig; } /** * fetchPromise(调用fetch函数得到) 和 ajaxPromise(调用ajax函数得到) 关联对应 * 其中,key 为 fetchPromise,value 为 ajaxPromise */ var fetchMap = new WeakMap(); var defaultConfig = { method: 'post', data: {}, timeout: 5000, headers: {}, withCredentials: false }; var Fetch = /*#__PURE__*/_createClass(function Fetch() { var _config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Fetch); extend(defaultConfig, _config); var ajaxPromise; // 存储 ajax 返回的 promise beforeRequestSend.final(function (config) { return new Promise(function (resolve, reject) { var error, response; ajaxPromise = sdk.ajax(config); ajaxPromise.then(function (res) { return response = res; }).catch(function (err) { return error = err; }).finally(function () { afterRequestSend.runAndReturn(error, response).then(resolve).catch(reject); }); }); }); afterRequestSend.final(final_); function fetch(config) { log.debug('Fetch 实例初始化选项', mergeConfig(defaultConfig, config)); var fetchPromise = beforeRequestSend.runAndReturn(mergeConfig(defaultConfig, config)); fetchMap.set(fetchPromise, ajaxPromise); // 建立关联,fetchPromise 和 ajaxPromise return fetchPromise; } fetch.get = function (url, config) { if (config) { extend(config, { url: url, method: 'get' }); } else { config = { url: url, method: 'get' }; } return fetch(config); }; fetch.post = function (url, data, config) { if (config) { extend(config, { url: url, method: 'post', data: data }); } else { config = { url: url, method: 'post', data: data }; } return fetch(config); }; fetch.cancel = function () { for (var _len = arguments.length, fetchPromises = new Array(_len), _key = 0; _key < _len; _key++) { fetchPromises[_key] = arguments[_key]; } fetchPromises.forEach(function (fetchPromise, index) { var ajaxPromise = fetchMap.get(fetchPromise); var cancel = sdk.ajaxCancelMap.get(ajaxPromise); cancel ? cancel() : log.debug("\u6CA1\u6709\u627E\u5230\u4E0B\u6807\u4E3A ".concat(index, " \u5BF9\u5E94\u7684 cancel \u51FD\u6570")); }); }; return fetch; }); function initFetch() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$defaultConfig = _ref.defaultConfig, defaultConfig = _ref$defaultConfig === void 0 ? { method: 'post', data: {}, timeout: 5000, headers: {}, withCredentials: false } : _ref$defaultConfig, _ref$beforeRequestSen = _ref.beforeRequestSendMiddlewares, beforeRequestSendMiddlewares = _ref$beforeRequestSen === void 0 ? [] : _ref$beforeRequestSen, _ref$afterRequestSend = _ref.afterRequestSendMiddlewares, afterRequestSendMiddlewares = _ref$afterRequestSend === void 0 ? [] : _ref$afterRequestSend; var beforeRequestSend = new MiddlewareManager('before-request-send'); beforeRequestSend.concat(beforeRequestSendMiddlewares); var afterRequestSend = new MiddlewareManager('after-request-send'); afterRequestSend.concat(afterRequestSendMiddlewares); afterRequestSend.final(final_); var ajaxPromise; // 存储 ajax 函数返回的 promise beforeRequestSend.final(function (config) { return new Promise(function (resolve, reject) { var error, response; ajaxPromise = sdk.ajax(config); ajaxPromise.then(function (res) { return response = res; }).catch(function (err) { return error = err; }).finally(function () { afterRequestSend.runAndReturn(error, response).then(resolve).catch(reject); }); }); }); var fetch = function fetch(config) { log.debug('Fetch 实例初始化选项', mergeConfig(defaultConfig, config)); var fetchPromise = beforeRequestSend.runAndReturn(mergeConfig(defaultConfig, config)); fetchMap.set(fetchPromise, ajaxPromise); return fetchPromise; }; fetch.get = function (url, config) { if (config) { extend(config, { url: url, method: 'get' }); } else { config = { url: url, method: 'get' }; } return fetch(config); }; fetch.post = function (url, data, config) { if (config) { extend(config, { url: url, method: 'post', data: data }); } else { config = { url: url, method: 'post', data: data }; } return fetch(config); }; fetch.cancel = function () { for (var _len2 = arguments.length, fetchPromises = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { fetchPromises[_key2] = arguments[_key2]; } fetchPromises.forEach(function (fetchPromise, index) { var ajaxPromise = fetchMap.get(fetchPromise); // 根据传入的 fetchPromise,查找对应的 ajaxPromise var cancel = sdk.ajaxCancelMap.get(ajaxPromise); // 根据指定的 ajaxPromise,查找对应的取消函数 cancel ? cancel() : log.debug("\u6CA1\u6709\u627E\u5230\u4E0B\u6807\u4E3A ".concat(index, " \u5BF9\u5E94\u7684 cancel \u51FD\u6570")); }); }; return fetch; } var _require = require('../package.json'), version = _require.version; var isNavigationFailure = Router__default['default'].isNavigationFailure, NavigationFailureType = Router__default['default'].NavigationFailureType; var encodeReserveRE = /[!'()*]/g; var encodeReserveReplacer = function encodeReserveReplacer(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 encode(str) { return encodeURIComponent(str).replace(encodeReserveRE, encodeReserveReplacer).replace(commaRE, ','); }; var decode = decodeURIComponent; var defaultRouterOpts = { scrollBehavior: function scrollBehavior() { return { x: 0, y: 0 }; } }; var router = null; function initRouter$1(routes, opts) { if (router) return router; // 避免在调用 initRouter 之前注册,在 1.0 的场景下,多个子应用都访问 @hsui/core 的情况下会造成冲突 Model__default['default'].use(Router__default['default']); // 合并 defaultRouterOpts opts = _objectSpread2(_objectSpread2({}, defaultRouterOpts), opts); // 保证在 hash 模式下也能从 location.search 中读取查询参数 // TODO - 暂时还没有解决方案,在主子应用同时存在路由参数的情况下,url 会存在多个 search 片段的问题 if (opts.mode === 'hash') { opts = _objectSpread2(_objectSpread2({}, opts), {}, { parseQuery: function parseQuery(query) { var res = {}; query = query.trim().replace(/^(\?|#|&)/, ''); if (!query) { var _location = location, search = _location.search; search = search.trim().replace(/^(\?|#|&)/, ''); if (!search) { return res; } query = search; } 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; }, stringifyQuery: 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; if (res && !location.search.includes(res)) { return "?".concat(res); } return ''; } }); } router = new Router__default['default'](opts); if (routes) { router.addRoutes(routes); } log.debug('Router 实例', router); log.debug('Router 构建选项', opts); log.debug('Routes 路由记录', router.getRoutes()); router.beforeEach(function (to, from, next) { log.debug('路由跳转前置导航守卫', to, from); next(); }); beforeRouteChange.middlewares.forEach(function (middleware) { return router.beforeEach(middleware); }); router.afterEach(function (to, from) { log.debug('路由跳转后置导航守卫', to, from); afterRouteChange.justRun(to, from); }); return router; } /** * Set default router options * @param {object} opts */ function setRouterOpts(opts) { extend(defaultRouterOpts, opts); } /** * @description jump programmatically * @param {String} path target path * @param {Object} opts options * @param {Boolean} opts.history whether to keep current browser history, perform like pushState or replaceState, default true * @param {Boolean} opts.animation todo * @param {Object} query query params */ function navigate(path, opts, query) { if (!router) return; var defaultOpts = { history: true }; var defaultQuery = {}; if (!_typeof(path) === 'string' || path === '') { log.error('navigate 方法必须指定 path 为字符串类型且不能为空'); return false; } // 只有两个参数,则第二个为 query if (isPlainObject(opts) && isUndefined(query)) { query = opts; opts = defaultOpts; } // path 是必填项 if (isUndefined(opts)) { opts = defaultOpts; query = defaultQuery; } var _opts = opts, history = _opts.history; var onError = function onError(err) { if (isNavigationFailure(err, NavigationFailureType.duplicated) || isNavigationFailure(err, NavigationFailureType.redirected)) { return; } log.error('路由跳转异常', err); throw err; }; if (history) { router.push({ path: path, query: query }).catch(onError); } else { router.replace({ path: path, query: query }).catch(onError); } } /** * @description go forwards or go backwards in the history stack programmatically * @param {Number} n steps to go, setting to 0 perform like reload */ function go(n) { if (!router) return; router.go(n); } /** * https://github.com/developit/mitt */ function mitt(all) { all = all || new Map(); return { on: function on(type, handler) { var handlers = all.get(type); var added = handlers && handlers.push(handler); if (!added) { all.set(type, [handler]); } log.debug('部署事件监听', type); }, off: function off(type, handler) { var handlers = all.get(type); if (handlers) { if (handler) { handlers.splice(handlers.indexOf(handler) >>> 0, 1); } else { all.set(type, []); } } log.debug('取消事件监听', type); }, emit: function emit(type) { log.debug.apply(log, ['触发事件监听'].concat(Array.prototype.slice.call(arguments))); var args = Array.prototype.slice.call(arguments); (all.get(type) || []).slice().map(function (handler) { log.debug('响应事件监听', type, handler); handler.apply(null, args.slice(1)); }); (all.get('*') || []).slice().map(function (handler) { log.debug('响应事件监听', type, handler); handler.apply(null, args); }); } }; } var emitter = mitt(); emitter.once = function (type, handler) { var _handler = function _handler() { handler.apply(null, Array.prototype.slice.call(arguments)); emitter.off(type, _handler); }; emitter.on(type, _handler); }; var on = emitter.on, once = emitter.once, off = emitter.off, emit = emitter.emit, trigger = emitter.emit; /** * Path parser * - Inspired: * Vue.js Path parser */ // actions var APPEND = 0; var PUSH = 1; var INC_SUB_PATH_DEPTH = 2; var PUSH_SUB_PATH = 3; // states var BEFORE_PATH = 0; var IN_PATH = 1; var BEFORE_IDENT = 2; var IN_IDENT = 3; var IN_SUB_PATH = 4; var IN_SINGLE_QUOTE = 5; var IN_DOUBLE_QUOTE = 6; var AFTER_PATH = 7; var ERROR = 8; var pathStateMachine = []; pathStateMachine[BEFORE_PATH] = { ws: [BEFORE_PATH], ident: [IN_IDENT, APPEND], '[': [IN_SUB_PATH], eof: [AFTER_PATH] }; pathStateMachine[IN_PATH] = { ws: [IN_PATH], '.': [BEFORE_IDENT], '[': [IN_SUB_PATH], eof: [AFTER_PATH] }; pathStateMachine[BEFORE_IDENT] = { ws: [BEFORE_IDENT], ident: [IN_IDENT, APPEND], '0': [IN_IDENT, APPEND], number: [IN_IDENT, APPEND] }; pathStateMachine[IN_IDENT] = { ident: [IN_IDENT, APPEND], '0': [IN_IDENT, APPEND], number: [IN_IDENT, APPEND], ws: [IN_PATH, PUSH], '.': [BEFORE_IDENT, PUSH], '[': [IN_SUB_PATH, PUSH], eof: [AFTER_PATH, PUSH] }; pathStateMachine[IN_SUB_PATH] = { "'": [IN_SINGLE_QUOTE, APPEND], '"': [IN_DOUBLE_QUOTE, APPEND], '[': [IN_SUB_PATH, INC_SUB_PATH_DEPTH], ']': [IN_PATH, PUSH_SUB_PATH], eof: ERROR, else: [IN_SUB_PATH, APPEND] }; pathStateMachine[IN_SINGLE_QUOTE] = { "'": [IN_SUB_PATH, APPEND], eof: ERROR, else: [IN_SINGLE_QUOTE, APPEND] }; pathStateMachine[IN_DOUBLE_QUOTE] = { '"': [IN_SUB_PATH, APPEND], eof: ERROR, else: [IN_DOUBLE_QUOTE, APPEND] }; /** * Check if an expression is a literal value. */ var literalValueRE = /^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/; function isLiteral(exp) { return literalValueRE.test(exp); } /** * Strip quotes from a string */ function stripQuotes(str) { var a = str.charCodeAt(0); var b = str.charCodeAt(str.length - 1); return a === b && (a === 0x22 || a === 0x27) ? str.slice(1, -1) : str; } /** * Determine the type of a character in a keypath. */ function getPathCharType(ch) { if (ch === undefined || ch === null) { return 'eof'; } var code = ch.charCodeAt(0); switch (code) { case 0x5b: // [ case 0x5d: // ] case 0x2e: // . case 0x22: // " case 0x27: // ' return ch; case 0x5f: // _ case 0x24: // $ case 0x2d: // - return 'ident'; case 0x09: // Tab case 0x0a: // Newline case 0x0d: // Return case 0xa0: // No-break space case 0xfeff: // Byte Order Mark case 0x2028: // Line Separator case 0x2029: // Paragraph Separator return 'ws'; } return 'ident'; } /** * Format a subPath, return its plain form if it is * a literal string or number. Otherwise prepend the * dynamic indicator (*). */ function formatSubPath(path) { var trimmed = path.trim(); // invalid leading 0 if (path.charAt(0) === '0') { return false; } return isLiteral(trimmed) ? stripQuotes(trimmed) : '*' + trimmed; } /** * Parse a string path into an array of segments */ function parse(path) { var keys = []; var index = -1; var mode = BEFORE_PATH; var subPathDepth = 0; var c; var key; var newChar; var type; var transition; var action; var typeMap; var actions = []; actions[PUSH] = function () { if (key !== undefined) { keys.push(key); key = undefined; } }; actions[APPEND] = function () { if (key === undefined) { key = newChar; } else { key += newChar; } }; actions[INC_SUB_PATH_DEPTH] = function () { actions[APPEND](); subPathDepth++; }; actions[PUSH_SUB_PATH] = function () { if (subPathDepth > 0) { subPathDepth--; mode = IN_SUB_PATH; actions[APPEND](); } else { subPathDepth = 0; if (key === undefined) { return false; } key = formatSubPath(key); if (key === false) { return false; } else { actions[PUSH](); } } }; function maybeUnescapeQuote() { var nextChar = path[index + 1]; if (mode === IN_SINGLE_QUOTE && nextChar === "'" || mode === IN_DOUBLE_QUOTE && nextChar === '"') { index++; newChar = '\\' + nextChar; actions[APPEND](); return true; } } while (mode !== null) { index++; c = path[index]; if (c === '\\' && maybeUnescapeQuote()) { continue; } type = getPathCharType(c); typeMap = pathStateMachine[mode]; transition = typeMap[type] || typeMap['else'] || ERROR; if (transition === ERROR) { return; // parse error } mode = transition[0]; action = actions[transition[1]]; if (action) { newChar = transition[2]; newChar = newChar === undefined ? c : newChar; if (action() === false) { return; } } if (mode === AFTER_PATH) { return keys; } } } var I18nPath = /*#__PURE__*/function () { function I18nPath() { _classCallCheck(this, I18nPath); this._cache = void 0; this._cache = Object.create(null); } /** * External parse that check for a cache hit first */ _createClass(I18nPath, [{ key: "parsePath", value: function parsePath(path) { var hit = this._cache[path]; if (!hit) { hit = parse(path); if (hit) { this._cache[path] = hit; } } return hit || []; } /** * Get path value from path string */ }, { key: "getPathValue", value: function getPathValue(obj, path) { if (!isObject(obj)) { return null; } var paths = this.parsePath(path); if (paths.length === 0) { return null; } else { var length = paths.length; var last = obj; var i = 0; while (i < length) { var value = last[paths[i]]; if (value === undefined || value === null) { return null; } last = value; i++; } return last; } } }]); return I18nPath; }(); var i18ns = []; var I18n = /*#__PURE__*/function () { /** * lightweight i18n * @param {object} options * - locale * - messages */ function I18n(options) { _classCallCheck(this, I18n); this.locale = options.locale || 'en-US'; this.messages = options.messages || {}; // window.__hCoreReference var root = window.__hCoreReference__.root; this._root = options.root || root || null; this._path = new I18nPath(); this.watchLocale(); i18ns.push(this); } _createClass(I18n, [{ key: "watchLocale", value: function watchLocale() { // sync with vue-i18n root if (this._root && this._root.$i18n) { // locale watcher var _this = this; this.localeWatcher = this._root.$i18n.vm.$watch('locale', function (val) { _this.locale = val; }, { immediate: true }); } return null; } // string support only }, { key: "_translate", value: function _translate(message, key) { var pathRet = this._path.getPathValue(message, key); if (isArray(pathRet) || isPlainObject(pathRet)) { return pathRet; } var ret; if (isNull(pathRet) && isPlainObject(message)) { ret = message[key]; } else if (isString(pathRet)) { ret = pathRet; } else { return null; } return !isString(ret) ? ret.join('') : ret; } }, { key: "t", value: function t(key) { if (!key) return ''; var message = this.messages[this.locale]; if (message) { return this._translate(message, key); } return ''; } }]); return I18n; }(); var _app = /*#__PURE__*/_classPrivateFieldKey("app"); var _isNavigable = /*#__PURE__*/_classPrivateFieldKey("isNavigable"); var _options = /*#__PURE__*/_classPrivateFieldKey("options"); var _walkOpts = /*#__PURE__*/_classPrivateFieldKey("walkOpts"); var HCore = /*#__PURE__*/function () { function HCore(_opts) { _classCallCheck(this, HCore); Object.defineProperty(this, _walkOpts, { value: _walkOpts2 }); Object.defineProperty(this, _app, { writable: true, value: void 0 }); // enable or disable router system Object.defineProperty(this, _isNavigable, { writable: true, value: true }); // model options Object.defineProperty(this, _options, { writable: true, value: { el: '#app', beforeDestroy: function beforeDestroy() { i18ns.forEach(function (i18n) { if (i18n.localeWatcher) { delete i18n.localeWatcher; i18n = null; } }); } } }); if (!!_classPrivateFieldBase(this, _app)[_app]) { return _classPrivateFieldBase(this, _app)[_app]; } _classPrivateFieldBase(this, _app)[_app] = this; _classPrivateFieldBase(this, _walkOpts)[_walkOpts](_opts); this.Model.prototype.$hCore = _classPrivateFieldBase(this, _app)[_app]; if (!this.ajax) { var fetch = new Fetch(); extend(this, { ajax: fetch, fetch: fetch }); } extend(this, { middleware: registerMiddleware }); extend(this, { on: on, once: once, off: off, emit: emit, trigger: trigger }); extend(this, { log: log, logger: logger }); extend(this, { utils: utils }); extend(this, { storage: sdk.storage }); extend(this, { navigate: navigate, go: go }); } _createClass(HCore, [{ key: "Model", get: function get() { return Model__default['default']; } }, { key: "options", get: function get() { return _classPrivateFieldBase(this, _options)[_options]; } }, { key: "version", get: function get() { return version; } }, { key: "initRouter", value: function initRouter(routes, opts) { if (_classPrivateFieldBase(this, _isNavigable)[_isNavigable]) { var router = initRouter$1(routes, opts); extend(_classPrivateFieldBase(this, _options)[_options], { router: router, template: '<router-view></router-view>' }); extend(this, { router: router }); } } }, { key: "addRoutes", value: function addRoutes(routes) { if (this.router) { this.log.debug('新增 Routes 路由记录', routes); this.router.addRoutes(routes); } else { this.initRouter(routes); } } }, { key: "start", value: function start(cb) { var _this = this; // 在应用前要确保已经完成路由系统的初始化 if (!this.router) { this.initRouter(); } // 这里最好不要有异步逻辑,在微前端框架下可能会出现问题 // 暂时不对外 beforeLaunch.final(function () { // 在微前端框架下应用生命周期被接管 if (!isMicroApp()) { _this.root = new _this.Model(_classPrivateFieldBase(_this, _options)[_options]); _this.root.$nextTick(function () { trigger('app-ready', _this.root); cb && cb(_this.root); }); } else { // 启动的回调函数传递给 singleSpaVue,保持和独立运行一致的处理逻辑 trigger('app-start', cb); } }); beforeLaunch.justRun(this); } }]); return HCore; }(); function _walkOpts2(opts) { var _this2 = this; if (isPlainObject(opts)) { Object.keys(opts).forEach(function (key) { // ajaxConfig === fetchConfig if (key === 'ajaxConfig' || key === 'fetchConfig') { var fetch = new Fetch(opts[key]); extend(_this2, { ajax: fetch, fetch: fetch }); // ajax === fetch } // logLevel if (key === 'logLevel') { logger.setLevel(opts[key]); } // extra vue options if (key === 'extraModelOptions') { var staticModelKey = ['router']; Object.keys(opts[key]).filter(function (modelKey) { return !staticModelKey.includes(modelKey); }).forEach(function (modelKey) { extend(_classPrivateFieldBase(_this2, _options)[_options], _defineProperty({}, modelKey, opts[key][modelKey])); // store if (modelKey === 'store') { extend(_this2, _defineProperty({}, modelKey, opts[key][modelKey])); } }); } // extra router options if (key === 'extraRouterOptions') { if (typeof opts[key]['isNavigable'] !== 'undefined') { _classPrivateFieldBase(_this2, _isNavigable)[_isNavigable] = opts[key]['isNavigable']; } if (_classPrivateFieldBase(_this2, _isNavigable)[_isNavigable]) { _classPrivateFieldBase(_this2, _isNavigable)[_isNavigable] && setRouterOpts(opts[key]); } } }); } } function _regeneratorRuntime() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return generator._invoke = function (innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; }(innerFn, self, context), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; this._invoke = function (method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); }; } function maybeInvokeDelegate(delegate, context) { var method = delegate.iterator[context.method]; if (undefined === method) { if (context.delegate = null, "throw" === context.method) { if (delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method)) return ContinueSentinel; context.method = "throw", context.arg = new TypeError("The iterator does not provide a 'throw' method"); } return ContinueSentinel; } var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) { if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; } return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, define(Gp, "constructor", GeneratorFunctionPrototype), define(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (object) { var keys = []; for (var key in object) { keys.push(key); } return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) { "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); } }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw root