import path from "node:path"; import { defineConfig } from "vite"; import Vue from "@vitejs/plugin-vue"; import Pages from "vite-plugin-pages"; import generateSitemap from "vite-ssg-sitemap"; import Layouts from "vite-plugin-vue-layouts"; import Components from "unplugin-vue-components/vite"; import AutoImport from "unplugin-auto-import/vite"; import Markdown from "vite-plugin-vue-markdown"; import { VitePWA } from "vite-plugin-pwa"; import VueI18n from "@intlify/unplugin-vue-i18n/vite"; import VueDevTools from "vite-plugin-vue-devtools"; import LinkAttributes from "markdown-it-link-attributes"; import Unocss from "unocss/vite"; import Shiki from "markdown-it-shiki"; import VueMacros from "unplugin-vue-macros/vite"; import WebfontDownload from "vite-plugin-webfont-dl"; import { createHtmlPlugin } from "vite-plugin-html"; import packageJSON from "./package.json"; const proxyConfig = { // target: "https://board.xcpcio.com", target: "http://127.0.0.1:8080", changeOrigin: true, }; export default defineConfig({ resolve: { alias: { "~/": `${path.resolve(__dirname, "src")}/`, }, }, plugins: [ VueMacros({ plugins: { vue: Vue({ include: [/\.vue$/, /\.md$/], }), }, }), // https://github.com/hannoeru/vite-plugin-pages Pages({ extensions: ["vue", "md"], }), // https://github.com/JohnCampionJr/vite-plugin-vue-layouts Layouts(), // https://github.com/antfu/unplugin-auto-import AutoImport({ imports: [ "vue", "vue-router", "vue-i18n", "@vueuse/head", "@vueuse/core", ], dts: "src/auto-imports.d.ts", dirs: [ "src/composables", "src/stores", ], vueTemplate: true, }), // https://github.com/antfu/unplugin-vue-components Components({ // allow auto load markdown components under `./src/components/` extensions: ["vue", "md"], // allow auto import and register components used in markdown include: [/\.vue$/, /\.vue\?vue/, /\.md$/], dts: "src/components.d.ts", }), // https://github.com/antfu/unocss // see uno.config.ts for config Unocss(), // https://github.com/antfu/vite-plugin-vue-markdown // Don't need this? Try vitesse-lite: https://github.com/antfu/vitesse-lite Markdown({ wrapperClasses: "prose prose-sm m-auto text-left", headEnabled: true, markdownItSetup(md) { // https://prismjs.com/ md.use(Shiki, { theme: { light: "vitesse-light", dark: "vitesse-dark", }, }); md.use(LinkAttributes, { matcher: (link: string) => /^https?:\/\//.test(link), attrs: { target: "_blank", rel: "noopener", }, }); }, }), // https://github.com/antfu/vite-plugin-pwa VitePWA({ registerType: "autoUpdate", includeAssets: ["favicon.svg", "safari-pinned-tab.svg"], manifest: { name: "Board", short_name: "Board", theme_color: "#ffffff", icons: [ { src: "/balloon2-192x192.png", sizes: "192x192", type: "image/png", }, { src: "/balloon2-512x512.png", sizes: "512x512", type: "image/png", }, { src: "/balloon2-512x512.png", sizes: "512x512", type: "image/png", purpose: "any maskable", }, ], }, }), // https://github.com/intlify/bundle-tools/tree/main/packages/unplugin-vue-i18n VueI18n({ runtimeOnly: true, compositionOnly: true, fullInstall: true, include: [path.resolve(__dirname, "locales/**")], }), // https://github.com/feat-agency/vite-plugin-webfont-dl WebfontDownload(), // https://github.com/webfansplz/vite-plugin-vue-devtools VueDevTools(), // https://github.com/vbenjs/vite-plugin-html createHtmlPlugin({ minify: { collapseWhitespace: true, keepClosingSlash: true, removeComments: true, removeRedundantAttributes: true, removeScriptTypeAttributes: true, removeStyleLinkTypeAttributes: true, useShortDoctype: true, minifyCSS: true, minifyJS: true, }, }), ], // https://github.com/vitest-dev/vitest test: { include: ["test/**/*.test.ts"], environment: "jsdom", deps: { inline: ["@vue", "@vueuse", "vue-demi"], }, }, // https://github.com/antfu/vite-ssg ssgOptions: { script: "async", formatting: "minify", crittersOptions: { reduceInlineStyles: false, }, onFinished() { generateSitemap(); }, }, ssr: { // TODO: workaround until they support native ESM noExternal: ["workbox-window", /vue-i18n/], }, server: { host: true, proxy: { "/data": proxyConfig, "/rating-data": proxyConfig, }, }, experimental: { // eslint-disable-next-line unused-imports/no-unused-vars renderBuiltUrl(filename: string, { hostType }: { hostType: "js" | "css" | "html" }) { // eslint-disable-next-line n/prefer-global/process if (process.env.BUILD_MODE === "npm_publish") { const tag = packageJSON.version; return `https://cdn.jsdelivr.net/npm/@xcpcio/board-app@${tag}/dist/${filename}`; } return `__CDN_HOST__/${filename}`; }, }, });