UNPKG

@modern-js/runtime-utils

Version:

A Progressive React Framework for modern web development.

178 lines (177 loc) • 7.5 kB
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 };