@modern-js/runtime-utils
Version:
A Progressive React Framework for modern web development.
168 lines (167 loc) • 7.04 kB
JavaScript
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
});
;