one
Version:
One is a new React Framework that makes Vite serve both native and web.
140 lines (139 loc) • 6.96 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: !0 });
}, __copyProps = (to, from, except, desc) => {
if (from && typeof from == "object" || typeof from == "function")
for (let key of __getOwnPropNames(from))
!__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: !0 }), mod);
var useViteRoutes_exports = {};
__export(useViteRoutes_exports, {
getPreloadedModule: () => getPreloadedModule,
getPreloadedModuleKeys: () => getPreloadedModuleKeys,
globbedRoutesToRouteContext: () => globbedRoutesToRouteContext,
loadRoutes: () => loadRoutes,
preloadRouteModules: () => preloadRouteModules,
registerPreloadedRoute: () => registerPreloadedRoute,
useViteRoutes: () => useViteRoutes
});
module.exports = __toCommonJS(useViteRoutes_exports);
var import_hmrImport = require("./hmrImport");
let lastVersion = 0, context;
function useViteRoutes(routes, routerRoot, options, version) {
return version && version > lastVersion && (context = null, lastVersion = version), context || loadRoutes(routes, routerRoot, options), context;
}
const preloadedModules = {};
function registerPreloadedRoute(key, module2) {
preloadedModules[key] = module2;
}
function getPreloadedModule(key) {
return preloadedModules[key];
}
function getPreloadedModuleKeys() {
return Object.keys(preloadedModules);
}
function matchDynamicRoute(routePattern, actualPath) {
const routeSegments = routePattern.split("/"), pathSegments = actualPath.split("/");
if (routeSegments.some((s) => s.startsWith("[..."))) {
const catchAllIdx = routeSegments.findIndex((s) => s.startsWith("[..."));
for (let i = 0; i < catchAllIdx; i++)
if (routeSegments[i] && !routeSegments[i].startsWith("[") && routeSegments[i] !== pathSegments[i])
return !1;
return pathSegments.length >= catchAllIdx;
}
if (routeSegments.length !== pathSegments.length) return !1;
for (let i = 0; i < routeSegments.length; i++) {
const routeSeg = routeSegments[i], pathSeg = pathSegments[i];
if (!(routeSeg.startsWith("[") && routeSeg.endsWith("]")) && routeSeg !== pathSeg)
return !1;
}
return !0;
}
async function preloadRouteModules(href) {
const globbed = globalThis.__importMetaGlobbed;
if (!globbed) return;
const normalizedHref = href === "/" ? "" : href.replace(/^\//, "").replace(/\/$/, ""), promises = [];
for (const key of Object.keys(globbed)) {
let routePath = key.replace(/^\/[^/]+\//, "");
routePath = routePath.replace(/\([^)]+\)\//g, ""), routePath = routePath.replace(/\/_layout\.tsx$/, "").replace(/\/index(\+[a-z]+)?\.tsx$/, "").replace(/(\+[a-z]+)?\.tsx$/, ""), routePath = routePath.replace(/^\//, "");
const isStaticMatch = routePath === normalizedHref || // exact match
routePath.startsWith(normalizedHref + "/") || // child route
normalizedHref.startsWith(routePath + "/") || // parent layout
routePath === "" || // root layout
normalizedHref !== "" && routePath === normalizedHref.split("/")[0], isDynamicMatch = routePath.includes("[") && matchDynamicRoute(routePath, normalizedHref);
(isStaticMatch || isDynamicMatch) && typeof globbed[key] == "function" && promises.push(
globbed[key]().then((mod) => {
preloadedModules[key] = mod;
}).catch(() => {
})
);
}
await Promise.all(promises);
}
function loadRoutes(paths, routerRoot, options) {
return context || (globalThis.__importMetaGlobbed = paths, context = globbedRoutesToRouteContext(paths, routerRoot, options), context);
}
function globbedRoutesToRouteContext(paths, routerRoot, options) {
const routesSync = {}, routePaths = {}, promises = {}, loadedRoutes = {}, clears = {};
Object.keys(paths).forEach((path) => {
if (!paths[path]) {
console.error(`Error: Missing route at path ${path}`);
return;
}
const loadRouteFunction = paths[path], pathWithoutRelative = path.replace(`/${routerRoot}/`, "./"), originalPath = pathWithoutRelative.slice(1).replace(/\.[jt]sx?$/, "");
options?.routeModes?.[originalPath] === "spa" ? (console.info(`Spa mode: ${originalPath}`), loadedRoutes[pathWithoutRelative] = () => null) : (routesSync[pathWithoutRelative] = loadRouteFunction, routePaths[pathWithoutRelative] = path);
});
const moduleKeys = Object.keys(routesSync);
let hmrVersion = 0;
typeof window < "u" && (window.__oneRouteCache = {
clear: () => {
hmrVersion++, Object.keys(loadedRoutes).forEach((key) => {
delete loadedRoutes[key];
}), Object.keys(promises).forEach((key) => {
delete promises[key];
}), Object.keys(preloadedModules).forEach((key) => {
delete preloadedModules[key];
});
},
clearFile: (file) => {
hmrVersion++;
const normalizedFile = file.replace(/^app\//, "./");
Object.keys(loadedRoutes).forEach((key) => {
(key === normalizedFile || key.endsWith(normalizedFile.replace("./", "/"))) && delete loadedRoutes[key];
}), Object.keys(promises).forEach((key) => {
(key === normalizedFile || key.endsWith(normalizedFile.replace("./", "/"))) && delete promises[key];
}), Object.keys(preloadedModules).forEach((key) => {
key.includes(file) && delete preloadedModules[key];
});
},
getVersion: () => hmrVersion
});
function resolve(id) {
if (clearTimeout(clears[id]), loadedRoutes[id])
return loadedRoutes[id];
const preloadKey = id.replace("./", `/${routerRoot}/`), preloaded = getPreloadedModule(preloadKey);
if (preloaded)
return loadedRoutes[id] = preloaded, preloaded;
if (typeof routesSync[id] != "function")
return routesSync[id];
if (!promises[id]) {
let importPromise;
process.env.NODE_ENV === "development" && hmrVersion > 0 && routePaths[id] ? importPromise = (0, import_hmrImport.hmrImport)(routePaths[id]).catch(() => routesSync[id]()) : importPromise = routesSync[id](), promises[id] = importPromise.then((val) => (loadedRoutes[id] = val, delete promises[id], clears[id] = setTimeout(() => {
delete loadedRoutes[id];
}, 500), val)).catch((err) => {
console.error("Error loading route", id, err, new Error().stack), loadedRoutes[id] = {
default: () => null
}, delete promises[id];
}), process.env.NODE_ENV === "development" && (promises[id].stack = new Error().stack);
}
throw promises[id];
}
return resolve.keys = () => moduleKeys, resolve.id = "", resolve.resolve = (id) => id, resolve;
}
//# sourceMappingURL=useViteRoutes.js.map