UNPKG

one

Version:

One is a new React Framework that makes Vite serve both native and web.

114 lines (107 loc) 3.76 kB
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"; import { resolvedVirtualEntryId, resolvedVirtualEntryIdNative, virtualEntryId, virtualEntryIdNative } from "./virtualEntryConstants"; 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.js.map