@modern-js/runtime-utils
Version:
A Progressive React Framework for modern web development.
178 lines (177 loc) • 7.5 kB
JavaScript
import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
import { _ as _object_spread_props } from "@swc/helpers/_/_object_spread_props";
import { _ as _type_of } from "@swc/helpers/_/_type_of";
import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
import { jsx as _jsx } from "react/jsx-runtime";
import { LOADER_REPORTER_NAME } from "@modern-js/utils/universal/constants";
import { Suspense } from "react";
import { Outlet, Route, createRoutesFromElements } from "react-router-dom";
import { time } from "../time";
import { getAsyncLocalStorage } from "../universal/async_storage";
import { DeferredData, activeDeferreds as originalActiveDeferreds } from "./deferreds";
var privateDefer = function(data) {
return new DeferredData(data);
};
var transformNestedRoutes = function(routes) {
var routeElements = [];
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for (var _iterator = routes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var route = _step.value;
var routeElement = renderNestedRoute(route);
routeElements.push(routeElement);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return createRoutesFromElements(routeElements);
};
var renderNestedRoute = function(nestedRoute) {
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var children = nestedRoute.children, index = nestedRoute.index, id = nestedRoute.id, component = nestedRoute.component, isRoot = nestedRoute.isRoot, lazyImport = nestedRoute.lazyImport, config = nestedRoute.config, handle = nestedRoute.handle;
var Component = component;
var parent = options.parent, _options_props = options.props, props = _options_props === void 0 ? {} : _options_props;
var routeProps = {
caseSensitive: nestedRoute.caseSensitive,
path: nestedRoute.path,
id: nestedRoute.id,
loader: createLoader(nestedRoute),
action: nestedRoute.action,
hasErrorBoundary: nestedRoute.hasErrorBoundary,
shouldRevalidate: nestedRoute.shouldRevalidate,
handle: _object_spread({}, handle, (typeof config === "undefined" ? "undefined" : _type_of(config)) === "object" ? config === null || config === void 0 ? void 0 : config.handle : {}),
index: nestedRoute.index,
element: nestedRoute.element,
errorElement: nestedRoute.errorElement
};
if (nestedRoute.error) {
var errorElement = /* @__PURE__ */ _jsx(nestedRoute.error, {});
routeProps.errorElement = errorElement;
}
var element;
if (Component) {
if ((parent === null || parent === void 0 ? void 0 : parent.loading) && lazyImport) {
var Loading = parent.loading;
if (isLoadableComponent(Component)) {
element = /* @__PURE__ */ _jsx(Component, {
fallback: /* @__PURE__ */ _jsx(Loading, {})
});
} else {
element = /* @__PURE__ */ _jsx(Suspense, {
fallback: /* @__PURE__ */ _jsx(Loading, {}),
children: /* @__PURE__ */ _jsx(Component, {})
});
}
} else if (isLoadableComponent(Component) && lazyImport) {
element = /* @__PURE__ */ _jsx(Component, {});
} else if (isRoot) {
element = /* @__PURE__ */ _jsx(Component, _object_spread({}, props));
} else if (lazyImport) {
element = /* @__PURE__ */ _jsx(Suspense, {
fallback: null,
children: /* @__PURE__ */ _jsx(Component, {})
});
} else {
element = /* @__PURE__ */ _jsx(Component, {});
}
} else {
nestedRoute.loading = parent === null || parent === void 0 ? void 0 : parent.loading;
routeProps.element = /* @__PURE__ */ _jsx(Outlet, {});
}
if (element) {
routeProps.element = element;
}
var childElements = children === null || children === void 0 ? void 0 : children.map(function(childRoute) {
return renderNestedRoute(childRoute, {
parent: nestedRoute
});
});
var routeElement = index ? /* @__PURE__ */ _jsx(Route, _object_spread_props(_object_spread({}, routeProps), {
index: true
}), id) : /* @__PURE__ */ _jsx(Route, _object_spread_props(_object_spread({}, routeProps), {
index: false,
children: childElements
}), id);
return routeElement;
};
function isPlainObject(value) {
return value != null && (typeof value === "undefined" ? "undefined" : _type_of(value)) === "object" && Object.getPrototypeOf(value) === Object.prototype;
}
function createLoader(route) {
var loader = route.loader;
if (loader) {
return function() {
var _ref = _async_to_generator(function(args) {
var end, res, isRouterV7, activeDeferreds, _getAsyncLocalStorage_useContext, _getAsyncLocalStorage, deferredData, cost, _route_id, _storage_useContext_monitors, storage;
return _ts_generator(this, function(_state) {
switch (_state.label) {
case 0:
if (typeof route.lazyImport === "function") {
route.lazyImport();
}
end = time();
return [
4,
loader(args)
];
case 1:
res = _state.sent();
isRouterV7 = process.env._MODERN_ROUTER_VERSION === "v7";
if (isRouterV7) {
activeDeferreds = null;
if (typeof document === "undefined") {
;
activeDeferreds = (_getAsyncLocalStorage = getAsyncLocalStorage()) === null || _getAsyncLocalStorage === void 0 ? void 0 : (_getAsyncLocalStorage_useContext = _getAsyncLocalStorage.useContext()) === null || _getAsyncLocalStorage_useContext === void 0 ? void 0 : _getAsyncLocalStorage_useContext.activeDeferreds;
} else {
activeDeferreds = originalActiveDeferreds;
}
if (isPlainObject(res)) {
deferredData = privateDefer(res);
activeDeferreds.set(route.id, deferredData);
}
}
cost = end();
if (typeof document === "undefined") {
;
storage = getAsyncLocalStorage();
storage === null || storage === void 0 ? void 0 : (_storage_useContext_monitors = storage.useContext().monitors) === null || _storage_useContext_monitors === void 0 ? void 0 : _storage_useContext_monitors.timing("".concat(LOADER_REPORTER_NAME, "-").concat((_route_id = route.id) === null || _route_id === void 0 ? void 0 : _route_id.replace(/\//g, "_")), cost);
}
return [
2,
res
];
}
});
});
return function(args) {
return _ref.apply(this, arguments);
};
}();
} else {
return function() {
if (typeof route.lazyImport === "function") {
route.lazyImport();
}
return null;
};
}
}
function isLoadableComponent(component) {
return component && component.displayName === "Loadable" && component.preload && typeof component.preload === "function";
}
export {
renderNestedRoute,
transformNestedRoutes
};