kemono2/client/vite.config.mjs
2025-04-11 00:58:59 +02:00

180 lines
5.4 KiB
JavaScript

// @ts-check
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import legacy from "@vitejs/plugin-legacy";
import ViteYaml from "@modyfi/vite-plugin-yaml";
import { viteStaticCopy } from "vite-plugin-static-copy";
import { createHtmlPlugin } from "vite-plugin-html";
import { patchCssModules } from 'vite-css-modules'
import {
siteName,
favicon,
analyticsEnabled,
analyticsCode,
kemonoSite,
sentryDSN,
iconsPrepend,
bannersPrepend,
thumbnailsPrepend,
artistsOrCreators,
disableDMs,
disableFAQ,
disableFilehaus,
sidebarItems,
footerItems,
bannerGlobal,
bannerWelcome,
homeBackgroundImage,
homeMascotPath,
homeLogoPath,
homeWelcomeCredits,
homeAnnouncements,
paysiteList,
headerAd,
middleAd,
footerAd,
sliderAd,
videoAd,
isArchiveServerEnabled,
apiServerBaseURL,
apiServerPort,
gitCommitHash,
isFileServingEnabled,
buildDate,
AnnouncementBannerGlobal,
} from "./configs/vars.mjs";
export const baseConfig = defineConfig(async ({ command, mode }) => {
/**
* @type {import("vite").UserConfig}
*/
const config = {
plugins: [
legacy({
targets: ["defaults", "not IE 11"],
}),
patchCssModules({ exportMode: "named" }),
ViteYaml(),
// TODO: remove it after settling the static files situation
// by using the vite option of copying public folder instead
viteStaticCopy({
structured: true,
targets: [
{
src: "static",
dest: "./",
},
],
}),
createHtmlPlugin({
entry: "./src/index.tsx",
inject: {
data: {
title: siteName,
analytics: !analyticsEnabled
? undefined
: !analyticsCode
? undefined
: atob(analyticsCode),
},
tags: [
{
tag: "link",
attrs: {
rel: "icon",
href: favicon,
},
injectTo: "head",
},
{
tag: "meta",
attrs: {
name: "og:type",
content: "website",
},
injectTo: "head",
},
{
tag: "meta",
attrs: {
name: "og:site_name",
content: siteName,
},
injectTo: "head",
},
{
tag: "meta",
attrs: {
name: "og:title",
content: siteName,
},
injectTo: "head",
},
{
tag: "meta",
attrs: {
name: "og:image",
content: `${kemonoSite}/static/kemono-logo.svg`,
},
injectTo: "head",
},
{
tag: "meta",
attrs: {
name: "og:image:width",
content: "150",
},
injectTo: "head",
},
{
tag: "meta",
attrs: {
name: "og:image:height",
content: "150",
},
injectTo: "head",
},
],
},
}),
react(),
],
define: {
BUNDLER_ENV_KEMONO_SITE: JSON.stringify(kemonoSite),
BUNDLER_ENV_SENTRY_DSN: JSON.stringify(sentryDSN),
BUNDLER_ENV_SITE_NAME: JSON.stringify(siteName),
BUNDLER_ENV_ICONS_PREPEND: JSON.stringify(iconsPrepend),
BUNDLER_ENV_BANNERS_PREPEND: JSON.stringify(bannersPrepend),
BUNDLER_ENV_THUMBNAILS_PREPEND: JSON.stringify(thumbnailsPrepend),
BUNDLER_ENV_ARTISTS_OR_CREATORS: JSON.stringify(artistsOrCreators),
BUNDLER_ENV_DISABLE_DMS: JSON.stringify(disableDMs),
BUNDLER_ENV_DISABLE_FAQ: JSON.stringify(disableFAQ),
BUNDLER_ENV_DISABLE_FILEHAUS: JSON.stringify(disableFilehaus),
BUNDLER_ENV_SIDEBAR_ITEMS: JSON.stringify(sidebarItems),
BUNDLER_ENV_FOOTER_ITEMS: JSON.stringify(footerItems),
BUNDLER_ENV_BANNER_GLOBAL: JSON.stringify(bannerGlobal),
BUNDLER_ENV_ANNOUNCEMENT_BANNER_GLOBAL: JSON.stringify(AnnouncementBannerGlobal),
BUNDLER_ENV_BANNER_WELCOME: JSON.stringify(bannerWelcome),
BUNDLER_ENV_HOME_BACKGROUND_IMAGE: JSON.stringify(homeBackgroundImage),
BUNDLER_ENV_HOME_MASCOT_PATH: JSON.stringify(homeMascotPath),
BUNDLER_ENV_HOME_LOGO_PATH: JSON.stringify(homeLogoPath),
BUNDLER_ENV_HOME_WELCOME_CREDITS: JSON.stringify(homeWelcomeCredits),
BUNDLER_ENV_HOME_ANNOUNCEMENTS: JSON.stringify(homeAnnouncements),
BUNDLER_ENV_PAYSITE_LIST: JSON.stringify(paysiteList),
BUNDLER_ENV_HEADER_AD: JSON.stringify(headerAd),
BUNDLER_ENV_MIDDLE_AD: JSON.stringify(middleAd),
BUNDLER_ENV_FOOTER_AD: JSON.stringify(footerAd),
BUNDLER_ENV_SLIDER_AD: JSON.stringify(sliderAd),
BUNDLER_ENV_VIDEO_AD: JSON.stringify(videoAd),
BUNDLER_ENV_IS_ARCHIVER_ENABLED: JSON.stringify(isArchiveServerEnabled),
BUNDLER_ENV_API_SERVER_BASE_URL: JSON.stringify(apiServerBaseURL),
BUNDLER_ENV_API_SERVER_PORT: JSON.stringify(apiServerPort),
BUNDLER_ENV_GIT_COMMIT_HASH: JSON.stringify(gitCommitHash),
BUNDLER_ENV_BUILD_DATE: JSON.stringify(buildDate),
BUNDLER_ENV_IS_FILE_SERVING_ENABLED: JSON.stringify(isFileServingEnabled),
},
};
return config;
});