|
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<void> { |
|
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: [] |
|
}, |
|
build: { |
|
target: [] |
|
}, |
|
optimizeDeps: {} |
|
}; |
|
|
|
if ( |
|
comp.frontend_dir && |
|
fs.existsSync(join(comp.frontend_dir, "gradio.config.js")) |
|
) { |
|
const m = await import( |
|
join("file://" + comp.frontend_dir, "gradio.config.js") |
|
); |
|
|
|
component_config.plugins = m.default.plugins || []; |
|
component_config.svelte.preprocess = m.default.svelte?.preprocess || []; |
|
component_config.build.target = m.default.build?.target || "modules"; |
|
component_config.optimizeDeps = m.default.optimizeDeps || {}; |
|
} |
|
|
|
const exports: (string | any)[][] = [ |
|
["component", pkg.exports["."] as object], |
|
["example", pkg.exports["./example"] as object] |
|
].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 }) |
|
], |
|
resolve: { |
|
conditions: ["gradio"] |
|
}, |
|
build: { |
|
target: component_config.build.target, |
|
emptyOutDir: true, |
|
outDir: join(template_dir, entry as string), |
|
lib: { |
|
entry: join(source_dir, (path as any).gradio), |
|
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; |
|
} |
|
} |
|
|