|
import type { Plugin, PluginOption } from "vite"; |
|
import { svelte } from "@sveltejs/vite-plugin-svelte"; |
|
import preprocess from "svelte-preprocess"; |
|
import { join } from "path"; |
|
import { type ComponentConfig } from "./dev"; |
|
import type { Preprocessor, PreprocessorGroup } from "svelte/compiler"; |
|
|
|
const svelte_codes_to_ignore: Record<string, string> = { |
|
"reactive-component": "Icon" |
|
}; |
|
|
|
const RE_SVELTE_IMPORT = |
|
/import\s+([\w*{},\s]+)\s+from\s+['"](svelte|svelte\/internal)['"]/g; |
|
const RE_BARE_SVELTE_IMPORT = /import ("|')svelte(\/\w+)*("|')(;)*/g; |
|
export function plugins(config: ComponentConfig): PluginOption[] { |
|
const _additional_plugins = config.plugins || []; |
|
const _additional_svelte_preprocess = config.svelte?.preprocess || []; |
|
const _svelte_extensions = (config.svelte?.extensions || [".svelte"]).map( |
|
(ext) => { |
|
if (ext.trim().startsWith(".")) { |
|
return ext; |
|
} |
|
return `.${ext.trim()}`; |
|
} |
|
); |
|
|
|
if (!_svelte_extensions.includes(".svelte")) { |
|
_svelte_extensions.push(".svelte"); |
|
} |
|
|
|
return [ |
|
svelte({ |
|
inspector: false, |
|
onwarn(warning, handler) { |
|
if ( |
|
svelte_codes_to_ignore.hasOwnProperty(warning.code) && |
|
svelte_codes_to_ignore[warning.code] && |
|
warning.message.includes(svelte_codes_to_ignore[warning.code]) |
|
) { |
|
return; |
|
} |
|
handler!(warning); |
|
}, |
|
prebundleSvelteLibraries: false, |
|
hot: true, |
|
compilerOptions: { |
|
discloseVersion: false, |
|
hydratable: true |
|
}, |
|
extensions: _svelte_extensions, |
|
preprocess: [ |
|
preprocess({ |
|
typescript: { |
|
compilerOptions: { |
|
declaration: false, |
|
declarationMap: false |
|
} |
|
} |
|
}), |
|
...(_additional_svelte_preprocess as PreprocessorGroup[]) |
|
] |
|
}), |
|
..._additional_plugins |
|
]; |
|
} |
|
|
|
interface GradioPluginOptions { |
|
mode: "dev" | "build"; |
|
svelte_dir: string; |
|
backend_port?: number; |
|
imports?: string; |
|
} |
|
|
|
export function make_gradio_plugin({ |
|
mode, |
|
svelte_dir, |
|
backend_port, |
|
imports |
|
}: GradioPluginOptions): Plugin { |
|
const v_id = "virtual:component-loader"; |
|
const resolved_v_id = "\0" + v_id; |
|
return { |
|
name: "gradio", |
|
enforce: "pre", |
|
transform(code) { |
|
const new_code = code |
|
.replace(RE_SVELTE_IMPORT, (str, $1, $2) => { |
|
if ($1.trim().startsWith("type")) return str; |
|
const identifier = $1.trim().startsWith("* as") |
|
? $1.replace("* as", "").trim() |
|
: $1.trim(); |
|
return `const ${identifier.replace( |
|
" as ", |
|
": " |
|
)} = window.__gradio__svelte__internal;`; |
|
}) |
|
.replace(RE_BARE_SVELTE_IMPORT, ""); |
|
return { |
|
code: new_code, |
|
map: null |
|
}; |
|
}, |
|
resolveId(id) { |
|
if (id === v_id) { |
|
return resolved_v_id; |
|
} |
|
if ( |
|
id !== "svelte" && |
|
id !== "svelte/internal" && |
|
id.startsWith("svelte/") |
|
) { |
|
return join(svelte_dir, "svelte-submodules.js"); |
|
} |
|
}, |
|
load(id) { |
|
if (id === resolved_v_id) { |
|
return `export default {};`; |
|
} |
|
}, |
|
transformIndexHtml(html) { |
|
return mode === "dev" |
|
? [ |
|
{ |
|
tag: "script", |
|
children: `window.__GRADIO_DEV__ = "dev"; |
|
window.__GRADIO__SERVER_PORT__ = ${backend_port}; |
|
window.__GRADIO__CC__ = ${imports};` |
|
} |
|
] |
|
: undefined; |
|
} |
|
}; |
|
} |
|
|