Spaces:
Sleeping
Sleeping
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" ] | |
}, | |
}); | |