88 lines
3.1 KiB
TypeScript
88 lines
3.1 KiB
TypeScript
import { execSync } from "child_process";
|
|
import { readFileSync } from "fs";
|
|
import path from "path";
|
|
|
|
import { svelte } from "@sveltejs/vite-plugin-svelte";
|
|
import { sveltePreprocess } from "svelte-preprocess";
|
|
import { defineConfig, type PluginOption } from "vite";
|
|
import { DynamicPublicDirectory as viteMultipleAssets } from "vite-multiple-assets";
|
|
|
|
const projectRootDir = path.resolve(__dirname);
|
|
|
|
// https://vitejs.dev/config/
|
|
export default defineConfig(({ mode }) => {
|
|
return {
|
|
plugins: plugins(mode),
|
|
resolve: {
|
|
alias: [
|
|
{ find: /@branding\/(.*\.svg)/, replacement: path.resolve(projectRootDir, "../branding", "$1?raw") },
|
|
{ find: "@graphite/../assets", replacement: path.resolve(projectRootDir, "assets") },
|
|
{ find: "@graphite/../public", replacement: path.resolve(projectRootDir, "public") },
|
|
{ find: "@graphite", replacement: path.resolve(projectRootDir, "src") },
|
|
],
|
|
},
|
|
server: {
|
|
port: 8080,
|
|
host: "0.0.0.0",
|
|
},
|
|
};
|
|
});
|
|
|
|
function plugins(mode: string): PluginOption[] {
|
|
const plugins = [
|
|
svelte({
|
|
preprocess: [sveltePreprocess()],
|
|
onwarn(warning, defaultHandler) {
|
|
const suppressed = [
|
|
"css-unused-selector", // NOTICE: Keep this list in sync with the list in `.vscode/settings.json`
|
|
"vite-plugin-svelte-css-no-scopable-elements", // NOTICE: Keep this list in sync with the list in `.vscode/settings.json`
|
|
"a11y-no-static-element-interactions", // NOTICE: Keep this list in sync with the list in `.vscode/settings.json`
|
|
"a11y-no-noninteractive-element-interactions", // NOTICE: Keep this list in sync with the list in `.vscode/settings.json`
|
|
"a11y-click-events-have-key-events", // NOTICE: Keep this list in sync with the list in `.vscode/settings.json`
|
|
"a11y_consider_explicit_label", // NOTICE: Keep this list in sync with the list in `.vscode/settings.json`
|
|
"a11y_click_events_have_key_events", // NOTICE: Keep this list in sync with the list in `.vscode/settings.json`
|
|
"a11y_no_noninteractive_element_interactions", // NOTICE: Keep this list in sync with the list in `.vscode/settings.json`
|
|
"a11y_no_static_element_interactions", // NOTICE: Keep this list in sync with the list in `.vscode/settings.json`
|
|
];
|
|
if (suppressed.includes(warning.code)) return;
|
|
|
|
defaultHandler?.(warning);
|
|
},
|
|
}),
|
|
viteMultipleAssets(
|
|
// Additional static asset directories besides `public/`
|
|
[
|
|
{ input: "../demo-artwork/**", output: "demo-artwork" },
|
|
{ input: "../branding/favicons/**", output: "" },
|
|
],
|
|
// Options where we set custom MIME types
|
|
{ mimeTypes: { ".graphite": "application/json" } },
|
|
),
|
|
];
|
|
|
|
if (mode !== "native") {
|
|
plugins.push({
|
|
name: "third-party-licenses",
|
|
buildStart() {
|
|
try {
|
|
execSync("cargo run -p third-party-licenses", {
|
|
stdio: "inherit",
|
|
});
|
|
} catch (_e) {
|
|
this.error("Failed to generate third-party licenses");
|
|
}
|
|
},
|
|
generateBundle() {
|
|
const source = readFileSync(path.resolve(projectRootDir, "third-party-licenses.txt"), "utf-8");
|
|
this.emitFile({
|
|
type: "asset",
|
|
fileName: "third-party-licenses.txt",
|
|
source,
|
|
});
|
|
},
|
|
});
|
|
}
|
|
|
|
return plugins;
|
|
}
|