react-view-router
Version:
react-view-router
93 lines • 4.16 kB
JavaScript
import "core-js/modules/web.dom.iterable.js";
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
import React from 'react';
import { innumerable } from './util';
import { REACT_LAZY_TYPE } from './route-guard';
function isEsModule(value) {
return value && value.__esModule;
}
export class RouteLazy {
constructor(ctor, options = {}) {
_defineProperty(this, "_ctor", void 0);
_defineProperty(this, "_result", void 0);
_defineProperty(this, "resolved", void 0);
_defineProperty(this, "routeLazyInstance", void 0);
_defineProperty(this, "$$typeof", REACT_LAZY_TYPE);
_defineProperty(this, "options", void 0);
_defineProperty(this, "updaters", []);
this._ctor = ctor;
this._result = null;
this.routeLazyInstance = true;
this.options = options;
this.render = this.render.bind(this);
this.resolved = false;
this.updaters = [];
}
toResolve(router, route, key) {
return new Promise(async (resolve, reject) => {
const _resolve = v => {
v = isEsModule(v) ? v.default : v;
const updaters = this.updaters.splice(0, this.updaters.length);
updaters.forEach(updater => v = updater(v, router) || v);
if (!this.resolved) {
this._result = v;
this.resolved = true;
}
resolve(v);
};
if (this.resolved) {
_resolve(this._result);
return;
}
let component = this._ctor.__lazyImportMethod ? this._ctor(route, key, router, this.options) : this._ctor;
try {
component = isPromise(component) ? await component : component;
} catch (ex) {
reject(ex);
return;
}
if (!component) {
reject(new Error('component should not null!'));
return;
}
if (component instanceof Promise) {
component.then(_resolve).catch(function () {
return reject(...arguments);
});
} else _resolve(component);
});
}
render(props, ref) {
if (!this.resolved || !this._result) return null;
return /*#__PURE__*/React.createElement(this._result, _objectSpread(_objectSpread({}, props), {}, {
ref
}), props.children);
}
}
export function hasRouteLazy(route) {
const config = route.config || route;
if (config.components instanceof RouteLazy) return true;
if (config.components) {
for (const key of Object.keys(config.components)) {
if (config.components[key] instanceof RouteLazy) return true;
}
}
return false;
}
export function hasMatchedRouteLazy(matched) {
return matched && matched.some(r => hasRouteLazy(r));
}
export function lazyImport(importMethod, options = {}) {
innumerable(importMethod, '__lazyImportMethod', true);
return new RouteLazy(importMethod, options || {});
}
export function isRouteLazy(value) {
return value && value.routeLazyInstance;
}
export function isPromise(value) {
return value && value.then;
}