File size: 3,252 Bytes
0bd62e5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
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
},
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) => {
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;
}
};
}
|