one
Version:
One is a new React Framework that makes Vite serve both native and web.
74 lines (71 loc) • 3.12 kB
JavaScript
import fs from "node:fs";
import path from "node:path";
import { loadUserOneOptions } from "../vite/loadConfig";
import { getRouterRootFromOneOptions } from "../utils/getRouterRootFromOneOptions";
const GENERATED_COMMENT = `// auto-generated by "one eas-prebuild" - do not edit manually
// regenerate with: npx one eas-prebuild
`;
async function run() {
const root = process.cwd();
console.info("one eas-prebuild: generating EAS build configs..."), process.env.IS_VXRN_CLI = "true";
const { oneOptions } = await loadUserOneOptions("build", !0), routerRoot = getRouterRootFromOneOptions(oneOptions), setupFile = oneOptions.setupFile, reactCompiler = oneOptions.react?.compiler, useReactCompiler = reactCompiler === !0 || reactCompiler === "native" || typeof reactCompiler == "object", hasReanimated = checkDependency(root, "react-native-reanimated"), babelConfig = generateBabelConfig({
routerRoot,
setupFile,
useReactCompiler,
hasReanimated
}), babelPath = path.join(root, "babel.config.cjs");
fs.writeFileSync(babelPath, babelConfig), console.info(` \u2713 wrote ${path.relative(root, babelPath)}`);
const metroConfig = generateMetroConfig(), metroPath = path.join(root, "metro.config.cjs");
fs.writeFileSync(metroPath, metroConfig), console.info(` \u2713 wrote ${path.relative(root, metroPath)}`), console.info("one eas-prebuild: done");
}
function checkDependency(root, pkg) {
try {
const pkgJsonPath = path.join(root, "package.json"), pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8"));
return !!(pkgJson.dependencies?.[pkg] || pkgJson.devDependencies?.[pkg]);
} catch {
return !1;
}
}
function generateBabelConfig({
routerRoot,
setupFile,
useReactCompiler,
hasReanimated
}) {
const setupFileArg = setupFile ? typeof setupFile == "string" ? `'${setupFile}'` : `{ ${Object.entries(setupFile).filter(([, v]) => v).map(([k, v]) => `${k}: '${v}'`).join(", ")} }` : "undefined", prePlugins = [], postPlugins = [];
useReactCompiler && prePlugins.push("'babel-plugin-react-compiler'"), hasReanimated && postPlugins.push("'react-native-reanimated/plugin'");
const pluginsCode = (() => {
if (!prePlugins.length && !postPlugins.length)
return "options.babelConfig?.plugins || []";
const parts = [];
return prePlugins.length && parts.push(...prePlugins), parts.push("...(options.babelConfig?.plugins || [])"), postPlugins.length && parts.push(...postPlugins), `[
${parts.join(`,
`)},
]`;
})();
return `${GENERATED_COMMENT}
const { getViteMetroPluginOptions } = require('one/getViteMetroPluginOptions')
const options = getViteMetroPluginOptions({
projectRoot: __dirname,
relativeRouterRoot: '${routerRoot}',
setupFile: ${setupFileArg},
})
module.exports = function (api) {
api.cache(true)
return {
presets: ['babel-preset-expo'],
plugins: ${pluginsCode},
}
}
`;
}
function generateMetroConfig() {
return `${GENERATED_COMMENT}
const { getDefaultConfig } = require('one/metro-eas')
module.exports = getDefaultConfig(__dirname)
`;
}
export {
run
};
//# sourceMappingURL=easPrebuild.js.map