mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2026-01-02 15:31:24 +00:00
166 lines
5.4 KiB
JavaScript
166 lines
5.4 KiB
JavaScript
import { defineConfig } from "vite";
|
|
import symfonyPlugin from "vite-plugin-symfony";
|
|
import vue from "@vitejs/plugin-vue";
|
|
import { resolve } from "path";
|
|
import { writeFile, mkdir } from "fs/promises";
|
|
import { existsSync } from "fs";
|
|
|
|
// --- Vite configuration aggregated from per-bundle vite.config.js files ---
|
|
// Import per-bundle lightweight config objects that replace former chill.webpack.config.js
|
|
import ChillMain from "./src/Bundle/ChillMainBundle/vite.config.js";
|
|
import ChillPerson from "./src/Bundle/ChillPersonBundle/vite.config.js";
|
|
import ChillActivity from "./src/Bundle/ChillActivityBundle/vite.config.js";
|
|
import ChillBudget from "./src/Bundle/ChillBudgetBundle/vite.config.js";
|
|
import ChillCalendar from "./src/Bundle/ChillCalendarBundle/vite.config.js";
|
|
import ChillDocGenerator from "./src/Bundle/ChillDocGeneratorBundle/vite.config.js";
|
|
import ChillDocStore from "./src/Bundle/ChillDocStoreBundle/vite.config.js";
|
|
import ChillEvent from "./src/Bundle/ChillEventBundle/vite.config.js";
|
|
import ChillTask from "./src/Bundle/ChillTaskBundle/vite.config.js";
|
|
import ChillThirdParty from "./src/Bundle/ChillThirdPartyBundle/vite.config.js";
|
|
import ChillWopi from "./src/Bundle/ChillWopiBundle/vite.config.js";
|
|
import ChillJob from "./src/Bundle/ChillJobBundle/src/vite.config.js";
|
|
|
|
async function ensureChillAggregatedEntry(chillEntries) {
|
|
// Generate a small aggregate file that imports all base chill entry files
|
|
const outDir = "./assets";
|
|
if (!existsSync(outDir)) {
|
|
await mkdir(outDir, { recursive: true });
|
|
}
|
|
const outFile = resolve(outDir, "chill.entry.js");
|
|
const unique = Array.from(new Set(chillEntries));
|
|
const content = unique
|
|
.map((p, i) => `// auto-generated import ${i}\nimport "${p.replace(/\\/g, "/")}";`)
|
|
.join("\n");
|
|
await writeFile(outFile, `${content}\n`);
|
|
return outFile;
|
|
}
|
|
|
|
export default defineConfig(async () => {
|
|
// Merge per-bundle small configs
|
|
const bundleConfigs = [
|
|
ChillMain,
|
|
ChillPerson,
|
|
ChillActivity,
|
|
ChillBudget,
|
|
ChillCalendar,
|
|
ChillDocGenerator,
|
|
ChillDocStore,
|
|
ChillEvent,
|
|
ChillTask,
|
|
ChillThirdParty,
|
|
ChillWopi,
|
|
ChillJob,
|
|
];
|
|
|
|
// Aggregate chill base imports
|
|
const chillBases = bundleConfigs.flatMap((c) => c.chillBase ?? []);
|
|
const chillEntryPath = await ensureChillAggregatedEntry(
|
|
chillBases.map((p) => resolve(__dirname, p))
|
|
);
|
|
|
|
// Merge inputs
|
|
const inputs = Object.assign(
|
|
{},
|
|
// Legacy root app entry if present
|
|
existsSync(resolve("./assets/app.js")) ? { app: "./assets/app.js" } : {},
|
|
existsSync(resolve("./assets/app.ts")) ? { app: "./assets/app.ts" } : {},
|
|
// Per bundle inputs
|
|
...bundleConfigs.map((c) => c.inputs || {})
|
|
);
|
|
// Add the aggregated chill shared entry
|
|
inputs.chill = chillEntryPath;
|
|
|
|
// Merge aliases (root level + bundle level) and normalize to absolute paths
|
|
const mergedAliasObj = Object.assign(
|
|
{
|
|
translator: resolve(__dirname, "./assets/translator"),
|
|
"@symfony/ux-translator": resolve(
|
|
__dirname,
|
|
"./vendor/symfony/ux-translator/assets"
|
|
),
|
|
},
|
|
...bundleConfigs.map((c) => c.aliases || {})
|
|
);
|
|
|
|
// Vite/Rollup alias replacements work best with absolute paths. Convert any
|
|
// string replacements to absolute paths rooted at this config file.
|
|
const aliasObj = Object.fromEntries(
|
|
Object.entries(mergedAliasObj).map(([key, val]) => {
|
|
if (typeof val === "string") {
|
|
// If already absolute (starts with "/" or a drive letter pattern), keep it.
|
|
const isAbsolute = val.startsWith("/") || /^[A-Za-z]:\\/.test(val);
|
|
return [key, isAbsolute ? val : resolve(__dirname, val)];
|
|
}
|
|
return [key, val];
|
|
})
|
|
);
|
|
|
|
// Support legacy Sass/Webpack tilde imports like `~Alias/...` by adding
|
|
// a tilded alias that points to the same location for every alias key.
|
|
for (const key of Object.keys(aliasObj)) {
|
|
if (!key.startsWith("~")) {
|
|
const tildeKey = `~${key}`;
|
|
if (!aliasObj[tildeKey]) {
|
|
aliasObj[tildeKey] = aliasObj[key];
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
plugins: [
|
|
vue(),
|
|
symfonyPlugin(),
|
|
],
|
|
// Ensure font files and similar are always treated as static assets in dev and build
|
|
// This helps the Symfony proxy /build/... serve them correctly via Vite dev server
|
|
assetsInclude: [
|
|
'**/*.ttf',
|
|
'**/*.woff',
|
|
'**/*.woff2',
|
|
'**/*.eot',
|
|
'**/*.otf',
|
|
'**/*.svg',
|
|
],
|
|
resolve: {
|
|
alias: aliasObj,
|
|
// Allow imports without extension for Vue and TS like `.../App` or `.../Modal`
|
|
extensions: [
|
|
".mjs",
|
|
".js",
|
|
".ts",
|
|
".jsx",
|
|
".tsx",
|
|
".json",
|
|
".vue",
|
|
],
|
|
},
|
|
css: {
|
|
// Forward options to sass/scss compiler to quiet dependency warnings
|
|
preprocessorOptions: {
|
|
scss: {
|
|
quietDeps: true,
|
|
silenceDeprecations: ["import"],
|
|
},
|
|
sass: {
|
|
quietDeps: true,
|
|
silenceDeprecations: ["import"],
|
|
},
|
|
},
|
|
},
|
|
server: {
|
|
// ViteBundle reads Symfony env to configure devServer proxy automatically.
|
|
// Keep defaults; expose HMR host for Docker if needed later.
|
|
strictPort: false,
|
|
},
|
|
build: {
|
|
sourcemap: process.env.NODE_ENV !== "production",
|
|
// Ensure Symfony looks for the manifest where Vite writes it
|
|
outDir: resolve(__dirname, "public/build"),
|
|
manifest: true,
|
|
rollupOptions: {
|
|
input: inputs,
|
|
},
|
|
},
|
|
};
|
|
});
|