import * as fs from "fs"; import { join } from "path"; import { build } from "vite"; import { plugins, make_gradio_plugin } from "./plugins"; import type { PreRenderedChunk } from "rollup"; import { examine_module } from "./index"; interface BuildOptions { component_dir: string; root_dir: string; python_path: string; } export async function make_build({ component_dir, root_dir, python_path }: BuildOptions): Promise { process.env.gradio_mode = "dev"; const svelte_dir = join(root_dir, "assets", "svelte"); const module_meta = examine_module( component_dir, root_dir, python_path, "build" ); try { for (const comp of module_meta) { const template_dir = comp.template_dir; const source_dir = comp.frontend_dir; const pkg = JSON.parse( fs.readFileSync(join(source_dir, "package.json"), "utf-8") ); let component_config = { plugins: [], svelte: { preprocess: [] } }; if ( comp.frontend_dir && fs.existsSync(join(comp.frontend_dir, "gradio.config.js")) ) { const m = await import(join(comp.frontend_dir, "gradio.config.js")); component_config.plugins = m.default.plugins || []; component_config.svelte.preprocess = m.default.svelte?.preprocess || []; } const exports: string[][] = [ ["component", pkg.exports["."] as string], ["example", pkg.exports["./example"] as string] ].filter(([_, path]) => !!path); for (const [entry, path] of exports) { try { const x = await build({ root: source_dir, configFile: false, plugins: [ ...plugins(component_config), make_gradio_plugin({ mode: "build", svelte_dir }) ], build: { emptyOutDir: true, outDir: join(template_dir, entry), lib: { entry: join(source_dir, path), fileName: "index.js", formats: ["es"] }, minify: true, rollupOptions: { output: { entryFileNames: (chunkInfo: PreRenderedChunk) => { if (chunkInfo.isEntry) { return "index.js"; } return `${chunkInfo.name.toLocaleLowerCase()}.js`; } } } } }); } catch (e) { throw e; } } } } catch (e) { throw e; } }