one
Version:
One is a new React Framework that makes Vite serve both native and web.
99 lines (92 loc) • 3.72 kB
JavaScript
import { configuration } from "@vxrn/compiler";
import { isNativeEnvironment } from "vxrn";
import { API_ROUTE_GLOB_PATTERN, ROUTE_GLOB_PATTERN, ROUTE_NATIVE_EXCLUSION_GLOB_PATTERNS, ROUTE_WEB_EXCLUSION_GLOB_PATTERNS } from "../../router/glob-patterns.mjs";
import { resolvedVirtualEntryId, resolvedVirtualEntryIdNative, virtualEntryId, virtualEntryIdNative } from "./virtualEntryConstants.mjs";
function normalizeSetupFile(setupFile) {
if (!setupFile) return {};
if (typeof setupFile == "string") return {
client: setupFile,
server: setupFile,
ios: setupFile,
android: setupFile
};
if ("native" in setupFile) return {
client: setupFile.client,
server: setupFile.server,
ios: setupFile.native,
android: setupFile.native
};
const sf = setupFile;
return {
client: sf.client,
server: sf.server,
ios: sf.ios,
android: sf.android
};
}
function getSetupFileImport(environmentName, setupFiles, useStaticImport) {
const key = {
client: "client",
ssr: "server",
ios: "ios",
android: "android"
}[environmentName];
if (!key) return "";
const setupFile = setupFiles[key];
return setupFile ? useStaticImport ? `import ${JSON.stringify(setupFile)}` : `await import(/* @vite-ignore */ ${JSON.stringify(setupFile)})` : "";
}
function createVirtualEntry(options) {
const routeGlobs = [`/${options.root}/${ROUTE_GLOB_PATTERN}`, ...(options.router?.ignoredRouteFiles?.map(pattern => `!/${options.root}/${pattern}`) || [])],
apiRouteGlobs = `/${options.root}/${API_ROUTE_GLOB_PATTERN}`,
setupFiles = normalizeSetupFile(options.setupFile);
return {
name: "one-virtual-entry",
enforce: "pre",
resolveId(id) {
if (id === virtualEntryId) return resolvedVirtualEntryId;
if (id === virtualEntryIdNative) return resolvedVirtualEntryIdNative;
},
load(id) {
if (id === resolvedVirtualEntryId) {
const isNative = isNativeEnvironment(this.environment),
prependCode = getSetupFileImport(this.environment.name, setupFiles, isNative),
nativewindImport = configuration.enableNativewind ? "import 'react-native-css-interop/dist/runtime/components'" : "";
return `
${prependCode}
${nativewindImport}
import { createApp, registerPreloadedRoute as _registerPreloadedRoute } from 'one'
// Export registerPreloadedRoute so preload files can import it from this bundle
// Named export that wraps the original function
export function registerPreloadedRoute(key, module) {
return _registerPreloadedRoute(key, module)
}
// Also expose on window for debugging and to prevent tree-shaking
if (typeof window !== 'undefined') {
window.__oneRegisterPreloadedRoute = registerPreloadedRoute
}
// globbing ${JSON.stringify(routeGlobs)}
export default createApp({
routes: import.meta.glob(${JSON.stringify([...routeGlobs, ...ROUTE_WEB_EXCLUSION_GLOB_PATTERNS.map(p => `!${p}`)])}, { exhaustive: true }),
routerRoot: ${JSON.stringify(options.root)},
flags: ${JSON.stringify(options.flags)},
})
`;
}
if (id === resolvedVirtualEntryIdNative) {
const isNative = isNativeEnvironment(this.environment);
return `
${getSetupFileImport(this.environment.name, setupFiles, isNative)}
import { createApp } from 'one'
// globbing ${JSON.stringify(routeGlobs)}
export default createApp({
routes: import.meta.glob(${JSON.stringify([...routeGlobs, ...ROUTE_NATIVE_EXCLUSION_GLOB_PATTERNS.map(p => `!${p}`), `!${apiRouteGlobs}`])}, { exhaustive: true }),
routerRoot: ${JSON.stringify(options.root)},
flags: ${JSON.stringify(options.flags)},
})
`;
}
}
};
}
export { createVirtualEntry };
//# sourceMappingURL=virtualEntryPlugin.mjs.map