UNPKG

@hsui/core

Version:

Hundsun frontend runtime core framework

156 lines (147 loc) 4.53 kB
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties"; import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2"; var _excluded = ["meta"]; import HCore from './Model'; import Fetch, { initFetch } from './fetch'; import I18n from './i18n'; import * as utils from './utils/api'; import { setRouterOpts, navigate, go } from './router'; import { setConfig, storage } from '@hsui/sdk'; import { on, once, off, emit, trigger } from './event'; import { registerMiddleware as middleware } from './middleware'; import { log, logger } from './log'; import { Model, Router, version } from './core'; /** * 整个应用框架接口应该有且仅有三种调用方式: * * 1. 通过应用实例调用,这应该是首选的调用方式,适合在应用入口或者 vue 文件中,具体如下: * const app = hCore(); * app.ajax 或者 this.$hCore.ajax * * 2. 通过 hCore 函数对象调用,这应该可以覆盖非 vue 实例的场景,比如在一个普通的 js 文件中调用,具体如下: * hCore.ajax * * 3. 通过 @hsui/core 暴露的接口调用,这样的接口应该是有限的,目前包括: * - hCoreReference * - initFetch * - initRouter * - initRouterLayout * * 4. 通过 @@/huiExports 动态扩展 @hsui/core */ var hCoreReference; var hCoreOpts = { meta: { versions: { '@hsui/core': version, vue: Model.version, 'vue-router': Router.version } } }; export default function hCore(opts) { if (utils.isPlainObject(opts)) { // 设置日志级别 logger.setLevel(opts.logLevel || 'info'); // 本地日志容量控制配置 logger.setConfig && logger.setConfig(opts.logConfig || {}); // 合并元数据信息 if (opts.meta) { for (var key in opts.meta) { if (Object.hasOwnProperty.call(opts.meta, key)) { if (key === 'versions') { hCoreOpts.meta.versions = _objectSpread(_objectSpread({}, hCoreOpts.meta.versions), opts.meta.versions); } else { hCoreOpts.meta[key] = opts.meta[key]; } } } } var meta = opts.meta, extra = _objectWithoutProperties(opts, _excluded); hCoreOpts = _objectSpread(_objectSpread({}, hCoreOpts), extra); } window.__hCoreReference__ = hCoreReference = new HCore(hCoreOpts); log.debug('应用元数据信息', hCoreOpts.meta); log.debug('hCore 实例', hCoreReference); log.debug('hCore 构建选项', hCoreOpts); return hCoreReference; } setConfig({ logger: logger }); // 支持扩展 HCore 的原型方法 utils.extend(hCore, { extend: function extend(opts) { // Handle case when target is a string or something (possible in deep copy) if (!utils.isPlainObject(opts)) return false; // Extend the base object for (var name in opts) { if (Object.hasOwnProperty.call(opts, name)) { var copy = opts[name]; // Prevent Object.prototype pollution // Prevent never-ending loop if (name === '__proto__' || opts === copy) { continue; } // Recurse if we're merging plain objects or arrays if (copy && (utils.isPlainObject(copy) || utils.isArray(copy))) { // Handle a deep copy situation HCore.prototype[name] = utils.deepClone(copy); // Don't bring in undefined values } else if (copy !== undefined) { HCore.prototype[name] = copy; } } } } }); utils.extend(hCore, { middleware: middleware }); utils.extend(hCore, { log: log, logger: logger }); utils.extend(hCore, { navigate: navigate, go: go }); utils.extend(hCore, { on: on, once: once, off: off, emit: emit, trigger: trigger }); utils.extend(hCore, { storage: storage }); utils.extend(hCore, { utils: utils }); if (hCoreOpts['ajaxConfig'] || hCoreOpts['fetchConfig']) { var fetch = new Fetch(hCoreOpts['ajaxConfig'] || hCoreOpts['fetchConfig']); utils.extend(hCore, { ajax: fetch, fetch: fetch }); } else { var _fetch = new Fetch(); utils.extend(hCore, { ajax: _fetch, fetch: _fetch }); } export { I18n }; export { hCoreReference }; export { initFetch }; export { default as initRouterLayout } from './router/routerLayout'; export { setRouterOpts as initRouterOptions }; /** Legacy for bundler <= 1.3.4 */ export var initRouter = function initRouter(routes, opts) { return setRouterOpts(utils.extend(opts, { routes: routes })); }; export * from '@@/huiExports';