UNPKG

@modern-js/runtime-utils

Version:

A Progressive React Framework for modern web development.

168 lines (167 loc) • 7.04 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var nestedRoutes_exports = {}; __export(nestedRoutes_exports, { renderNestedRoute: () => renderNestedRoute, transformNestedRoutes: () => transformNestedRoutes }); module.exports = __toCommonJS(nestedRoutes_exports); var import_jsx_runtime = require("react/jsx-runtime"); var import_constants = require("@modern-js/utils/universal/constants"); var import_react = require("react"); var import_react_router_dom = require("react-router-dom"); var import_time = require("../time"); var import_async_storage = require("../universal/async_storage"); var import_deferreds = require("./deferreds"); const privateDefer = (data) => { return new import_deferreds.DeferredData(data); }; const transformNestedRoutes = (routes) => { const routeElements = []; for (const route of routes) { const routeElement = renderNestedRoute(route); routeElements.push(routeElement); } return (0, import_react_router_dom.createRoutesFromElements)(routeElements); }; const renderNestedRoute = (nestedRoute, options = {}) => { const { children, index, id, component, isRoot, lazyImport, config, handle } = nestedRoute; const Component = component; const { parent, props = {} } = options; const routeProps = { caseSensitive: nestedRoute.caseSensitive, path: nestedRoute.path, id: nestedRoute.id, loader: createLoader(nestedRoute), action: nestedRoute.action, hasErrorBoundary: nestedRoute.hasErrorBoundary, shouldRevalidate: nestedRoute.shouldRevalidate, handle: { ...handle, ...typeof config === "object" ? config === null || config === void 0 ? void 0 : config.handle : {} }, index: nestedRoute.index, element: nestedRoute.element, errorElement: nestedRoute.errorElement }; if (nestedRoute.error) { const errorElement = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(nestedRoute.error, {}); routeProps.errorElement = errorElement; } let element; if (Component) { if ((parent === null || parent === void 0 ? void 0 : parent.loading) && lazyImport) { const Loading = parent.loading; if (isLoadableComponent(Component)) { element = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Component, { fallback: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Loading, {}) }); } else { element = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.Suspense, { fallback: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Loading, {}), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Component, {}) }); } } else if (isLoadableComponent(Component) && lazyImport) { element = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Component, {}); } else if (isRoot) { element = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Component, { ...props }); } else if (lazyImport) { element = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.Suspense, { fallback: null, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Component, {}) }); } else { element = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Component, {}); } } else { nestedRoute.loading = parent === null || parent === void 0 ? void 0 : parent.loading; routeProps.element = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_router_dom.Outlet, {}); } if (element) { routeProps.element = element; } const childElements = children === null || children === void 0 ? void 0 : children.map((childRoute) => { return renderNestedRoute(childRoute, { parent: nestedRoute }); }); const routeElement = index ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_router_dom.Route, { ...routeProps, index: true }, id) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_router_dom.Route, { ...routeProps, index: false, children: childElements }, id); return routeElement; }; function isPlainObject(value) { return value != null && typeof value === "object" && Object.getPrototypeOf(value) === Object.prototype; } function createLoader(route) { const { loader } = route; if (loader) { return async (args) => { if (typeof route.lazyImport === "function") { route.lazyImport(); } const end = (0, import_time.time)(); const res = await loader(args); const isRouterV7 = process.env._MODERN_ROUTER_VERSION === "v7"; if (isRouterV7) { let activeDeferreds = null; if (typeof document === "undefined") { var _getAsyncLocalStorage_useContext, _getAsyncLocalStorage; activeDeferreds = (_getAsyncLocalStorage = (0, import_async_storage.getAsyncLocalStorage)()) === null || _getAsyncLocalStorage === void 0 ? void 0 : (_getAsyncLocalStorage_useContext = _getAsyncLocalStorage.useContext()) === null || _getAsyncLocalStorage_useContext === void 0 ? void 0 : _getAsyncLocalStorage_useContext.activeDeferreds; } else { activeDeferreds = import_deferreds.activeDeferreds; } if (isPlainObject(res)) { const deferredData = privateDefer(res); activeDeferreds.set(route.id, deferredData); } } const cost = end(); if (typeof document === "undefined") { var _route_id, _storage_useContext_monitors; const storage = (0, import_async_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(`${import_constants.LOADER_REPORTER_NAME}-${(_route_id = route.id) === null || _route_id === void 0 ? void 0 : _route_id.replace(/\//g, "_")}`, cost); } return res; }; } else { return () => { if (typeof route.lazyImport === "function") { route.lazyImport(); } return null; }; } } function isLoadableComponent(component) { return component && component.displayName === "Loadable" && component.preload && typeof component.preload === "function"; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { renderNestedRoute, transformNestedRoutes });