one
Version:
One is a new React Framework that makes Vite serve both native and web.
140 lines (134 loc) • 5.3 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 virtualEntryPlugin_exports = {};
__export(virtualEntryPlugin_exports, {
createVirtualEntry: () => createVirtualEntry
});
module.exports = __toCommonJS(virtualEntryPlugin_exports);
var import_compiler = require("@vxrn/compiler"),
import_vxrn = require("vxrn"),
import_glob_patterns = require("../../router/glob-patterns.cjs"),
import_virtualEntryConstants = require("./virtualEntryConstants.cjs");
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 {
importStatement: "",
promiseDeclaration: "",
promiseVarName: ""
};
const setupFile = setupFiles[key];
return setupFile ? useStaticImport ? {
importStatement: `import ${JSON.stringify(setupFile)}`,
promiseDeclaration: "",
promiseVarName: ""
} : {
importStatement: "",
promiseDeclaration: `const __oneSetupPromise = import(/* @vite-ignore */ ${JSON.stringify(setupFile)})`,
promiseVarName: "__oneSetupPromise"
} : {
importStatement: "",
promiseDeclaration: "",
promiseVarName: ""
};
}
function createVirtualEntry(options) {
const routeGlobs = [`/${options.root}/${import_glob_patterns.ROUTE_GLOB_PATTERN}`, ...(options.router?.ignoredRouteFiles?.map(pattern => `!/${options.root}/${pattern}`) || [])],
apiRouteGlobs = `/${options.root}/${import_glob_patterns.API_ROUTE_GLOB_PATTERN}`,
setupFiles = normalizeSetupFile(options.setupFile);
return {
name: "one-virtual-entry",
enforce: "pre",
resolveId(id) {
if (id === import_virtualEntryConstants.virtualEntryId) return import_virtualEntryConstants.resolvedVirtualEntryId;
if (id === import_virtualEntryConstants.virtualEntryIdNative) return import_virtualEntryConstants.resolvedVirtualEntryIdNative;
},
load(id) {
if (id === import_virtualEntryConstants.resolvedVirtualEntryId) {
const isNative = (0, import_vxrn.isNativeEnvironment)(this.environment),
setupResult = getSetupFileImport(this.environment.name, setupFiles, isNative),
nativewindImport = import_compiler.configuration.enableNativewind ? "import 'react-native-css-interop/dist/runtime/components'" : "",
setupPromiseArg = setupResult.promiseVarName ? `setupPromise: ${setupResult.promiseVarName},` : "";
return `
${setupResult.importStatement}
${setupResult.promiseDeclaration}
${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({
${setupPromiseArg}
routes: import.meta.glob(${JSON.stringify([...routeGlobs, ...import_glob_patterns.ROUTE_WEB_EXCLUSION_GLOB_PATTERNS.map(p => `!${p}`)])}, { exhaustive: true }),
routerRoot: ${JSON.stringify(options.root)},
flags: ${JSON.stringify(options.flags)},
})
`;
}
if (id === import_virtualEntryConstants.resolvedVirtualEntryIdNative) {
const isNative = (0, import_vxrn.isNativeEnvironment)(this.environment);
return `
${getSetupFileImport(this.environment.name, setupFiles, isNative).importStatement}
import { createApp } from 'one'
// globbing ${JSON.stringify(routeGlobs)}
export default createApp({
routes: import.meta.glob(${JSON.stringify([...routeGlobs, ...import_glob_patterns.ROUTE_NATIVE_EXCLUSION_GLOB_PATTERNS.map(p => `!${p}`), `!${apiRouteGlobs}`])}, { exhaustive: true }),
routerRoot: ${JSON.stringify(options.root)},
flags: ${JSON.stringify(options.flags)},
})
`;
}
}
};
}