Spaces:
Paused
Paused
| import { defineConfig, searchForWorkspaceRoot, type PluginOption } from "vite"; | |
| import { sveltekit } from "@sveltejs/kit/vite"; | |
| import basicSSL from "@vitejs/plugin-basic-ssl"; | |
| import { glob } from "glob"; | |
| import mime from "mime"; | |
| import { createSitemap } from 'svelte-sitemap/src/index' | |
| import { cp, readdir, mkdir } from "node:fs/promises"; | |
| import { createReadStream } from "node:fs"; | |
| import { join, basename } from "node:path"; | |
| const exposeLibAV: PluginOption = (() => { | |
| const IMPUT_MODULE_DIR = join(__dirname, 'node_modules/@imput'); | |
| return { | |
| name: "vite-libav.js", | |
| configureServer(server) { | |
| server.middlewares.use(async (req, res, next) => { | |
| if (!req.url?.startsWith('/_libav/')) return next(); | |
| const filename = basename(req.url).split('?')[0]; | |
| if (!filename) return next(); | |
| const [ file ] = await glob(join(IMPUT_MODULE_DIR, '/**/dist/', filename)); | |
| if (!file) return next(); | |
| const fileType = mime.getType(filename); | |
| if (!fileType) return next(); | |
| res.setHeader('Content-Type', fileType); | |
| return createReadStream(file).pipe(res); | |
| }); | |
| }, | |
| generateBundle: async (options) => { | |
| if (!options.dir) { | |
| return; | |
| } | |
| const assets = join(options.dir, '_libav'); | |
| await mkdir(assets, { recursive: true }); | |
| const modules = await readdir(IMPUT_MODULE_DIR).then( | |
| modules => modules.filter(m => m.startsWith('libav.js')) | |
| ); | |
| for (const module of modules) { | |
| const distFolder = join(IMPUT_MODULE_DIR, module, 'dist/'); | |
| await cp(distFolder, assets, { recursive: true }); | |
| } | |
| } | |
| } | |
| })(); | |
| const enableCOEP: PluginOption = { | |
| name: "isolation", | |
| configureServer(server) { | |
| server.middlewares.use((_req, res, next) => { | |
| res.setHeader("Cross-Origin-Opener-Policy", "same-origin"); | |
| res.setHeader("Cross-Origin-Embedder-Policy", "require-corp"); | |
| next(); | |
| }) | |
| } | |
| }; | |
| const generateSitemap: PluginOption = { | |
| name: "generate-sitemap", | |
| async writeBundle(bundle) { | |
| if (!process.env.WEB_HOST || !bundle.dir?.endsWith('server')) { | |
| return; | |
| } | |
| await createSitemap(`https://${process.env.WEB_HOST}`, { | |
| changeFreq: 'monthly', | |
| outDir: '.svelte-kit/output/prerendered/pages', | |
| resetTime: true | |
| }); | |
| } | |
| } | |
| export default defineConfig({ | |
| plugins: [ | |
| basicSSL(), | |
| sveltekit(), | |
| enableCOEP, | |
| exposeLibAV, | |
| generateSitemap | |
| ], | |
| build: { | |
| rollupOptions: { | |
| output: { | |
| manualChunks: (id) => { | |
| if (id.includes('/web/i18n') && id.endsWith('.json')) { | |
| const lang = id.split('/web/i18n/')?.[1].split('/')?.[0]; | |
| if (lang) { | |
| return `i18n_${lang}`; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| }, | |
| server: { | |
| headers: { | |
| "Cross-Origin-Opener-Policy": "same-origin", | |
| "Cross-Origin-Embedder-Policy": "require-corp" | |
| }, | |
| fs: { | |
| allow: [ | |
| searchForWorkspaceRoot(process.cwd()) | |
| ] | |
| }, | |
| proxy: {} | |
| }, | |
| optimizeDeps: { | |
| exclude: [ "@imput/libav.js-remux-cli" ] | |
| }, | |
| }); | |