ldc-gen-game-web/vite.config.ts
Jérémy Munsch a27f0bf4d8
feat(ckeditor): integrate CKEditor 5 with custom plugins and styles
- Added CKEditor 5 integration with custom plugins for enhanced functionality.
- Implemented a unique ID generator for component instances.
- Created a dedicated SCSS file for CKEditor styles to ensure proper styling.
- Updated the CkEditorComponent to utilize the new setup and improve data handling.
2026-07-23 16:46:41 +02:00

209 lines
7.9 KiB
TypeScript

import basicSsl from "@vitejs/plugin-basic-ssl";
import vue from "@vitejs/plugin-vue";
import autoprefixer from "autoprefixer";
import laravel from "laravel-vite-plugin";
import path from "node:path";
import postcssDiscard from "postcss-discard-comments";
import { defineConfig, loadEnv } from "vite";
import checker from "vite-plugin-checker";
import eslint from "vite-plugin-eslint2";
import { viteStaticCopy } from "vite-plugin-static-copy";
const env = loadEnv("r", process.cwd(), "");
const isCI = !!process.env.CI;
const debugMode = ["local", "development"].includes(process.env.NODE_ENV ?? "");
const browserTargets = ["es2019", "edge92", "firefox88", "chrome92", "safari15"];
export default defineConfig({
build: {
chunkSizeWarningLimit: 1500,
target: browserTargets,
cssTarget: browserTargets,
emptyOutDir: true,
sourcemap: debugMode ? "inline" : false,
rollupOptions: {
output: {
entryFileNames: `assets/${debugMode ? "[name]-" : ""}[hash].js`,
chunkFileNames: `assets/${debugMode ? "[name]-" : ""}[hash].js`,
manualChunks(id) {
if (id.includes("node_modules")) {
// ! Isole Bootstrap
if (id.includes("bootstrap")) return "vendor-bootstrap";
// ! Isole Vue
if (id.includes("vue")) return "vendor-vue";
// ! Isole FontAwesome
if (id.includes("@fortawesome")) return "vendor-fontawesome";
// ! Isole Ckeditor
if (id.includes("ckeditor")) return "vendor-ckeditor";
return "vendor";
}
},
assetFileNames: (chunk) => {
if (
Array.isArray(chunk.names) &&
(chunk.names.some(name => String(name).endsWith("mail-theme.scss")) ||
chunk.names.includes("mail-theme.css"))
) {
return "vendor/mail/html/themes/default.[ext]";
}
return `assets/${debugMode ? "[name]-" : ""}[hash].[ext]`;
},
},
},
},
css: {
devSourcemap: debugMode,
preprocessorOptions: {
scss: {
silenceDeprecations: ["color-functions", "global-builtin", "import", "if-function"]
},
},
postcss: {
map: { inline: true },
plugins: [
{
// Hack pour dégager les code css invalid de cookie notice
postcssPlugin: "remove-empty-var",
Declaration(decl) {
if (decl?.value.includes("var()")) {
decl.remove();
}
}
},
postcssDiscard({ removeAll: true }),
autoprefixer(),
],
},
},
plugins: [
{
name: "hmr-symlink-fix",
configureServer(server) {
// * Forcer la détection uniquement sur le thème actif dans mounted et sur le moteur
server.watcher.add(path.resolve(process.cwd(), "resources/theme/mounted"));
server.watcher.add(path.resolve(process.cwd(), "resources/sass"));
},
handleHotUpdate({ file, server }) {
if (file.endsWith(".scss")) {
const modulesToUpdate = [];
for (const mod of server.moduleGraph.idToModuleMap.values()) {
if (!mod.file) continue;
const isFo = mod.file.endsWith("sass/fo.scss");
const isMail = mod.file.endsWith("sass/mail-theme.scss");
const isBo = mod.file.endsWith("sass/bo.scss");
if (isFo || isMail || isBo) {
if (file.includes("/resources/theme/mounted/") && (isFo || isMail)) {
server.moduleGraph.invalidateModule(mod);
modulesToUpdate.push(mod);
} else if (file.includes("/resources/sass/") && isBo) {
server.moduleGraph.invalidateModule(mod);
modulesToUpdate.push(mod);
}
}
}
if (modulesToUpdate.length > 0) {
for (const mod of modulesToUpdate) {
server.ws.send({
type: "update",
updates: [
{
type: "css-update",
path: mod.url,
acceptedPath: mod.url,
timestamp: Date.now()
}
]
});
}
return modulesToUpdate;
}
}
}
},
basicSsl(),
...(isCI ? [] : [
checker({
vueTsc: { root: ".", tsconfigPath: "tsconfig.json" },
typescript: { root: ".", tsconfigPath: "tsconfig.json" },
stylelint: {
lintCommand: "stylelint --quiet -c .stylelintrc.json --fix 'resources/sass/**/*.scss' 'resources/theme/mounted/**/*.scss'",
},
})
]),
laravel({
input: [
"resources/sass/bo.scss",
"resources/ts/bo.ts",
"resources/theme/mounted/sass/mail-theme.scss",
"resources/theme/mounted/sass/fo.scss",
"resources/theme/mounted/ts/fo.ts",
"resources/sass/vendor/ckEditorContent.scss",
],
refresh: [
"resources/views/**/*.blade.php",
"resources/theme/mounted/views/**/*.blade.php",
],
}),
viteStaticCopy({
targets: [
{
src: "resources/theme/mounted/favicon/*",
dest: "../",
rename: { stripBase: true },
},
{
src: "resources/favicon/*",
dest: "../",
rename: { stripBase: true },
overwrite: false,
},
],
}),
eslint({
cache: false,
include: ["resources/ts/**/*.ts", "resources/theme/mounted/ts/**/*.ts"],
exclude: ["node_modules", "vendor"],
lintOnStart: false,
emitWarning: true,
emitError: true,
}),
vue({
isProduction: !debugMode,
exclude: ["node_modules", "vendor"],
})
],
server: {
host: env["APP_URL"] ? new URL(env["APP_URL"]).hostname : "",
port: 4443,
watch: {
usePolling: true,
followSymlinks: true,
ignored: ["!**/resources/theme/mounted/**"]
},
},
resolve: {
preserveSymlinks: true,
extensions: ["*", ".js", ".ts", ".vue"],
alias: [
{
find: "vue",
replacement: "vue/dist/vue.runtime.esm-bundler.js",
},
{
find: "@",
replacement: "/resources/assets",
},
{
find: "@Theme",
replacement: "/resources/theme/mounted/assets",
},
{
find: "~",
replacement: path.resolve(process.cwd(), "./node_modules"),
},
],
},
});