realcity-group-website/vite.config.js
2025-05-28 22:38:46 -06:00

201 lines
6.3 KiB
JavaScript

import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import html from '@rollup/plugin-html';
import { glob } from 'glob';
import path from 'path';
import fs from 'fs';
import fse from 'fs-extra';
/**
* Devuelve archivos de componentes
*/
function getComponentFiles(type) {
return glob.sync(`vendor/koneko/**/resources/${type}/**/*.${type === 'js' ? 'js' : 'scss'}`);
}
/**
* Devuelve solo archivos reales, omitiendo carpetas
*/
/**
* Devuelve solo archivos válidos, omitiendo carpetas, .map, .php, test y node_modules
*/
function GetFilesArray(query) {
return glob.sync(query, {
ignore: [
'**/node_modules/**',
'**/test/**',
'**/*.map',
'**/*.php',
'**/*.md',
'**/*.txt',
'**/*.json',
'**/*.config.js',
'**/index.php'
]
}).filter(file => {
try {
const stats = fs.statSync(file);
return stats.isFile();
} catch (e) {
return false;
}
});
}
/**
* Asignación especial para librerías globales
*/
function libsWindowAssignment() {
return {
name: 'libsWindowAssignment',
transform(src, id) {
if (id.includes('jkanban.js')) {
return src.replace('this.jKanban', 'window.jKanban');
} else if (id.includes('vfs_fonts')) {
return src.replaceAll('this.pdfMake', 'window.pdfMake');
}
}
};
}
/**
* Copiar fuentes de Tabler
*/
function copyTablerFonts() {
const from = 'node_modules/@tabler/icons-webfont/dist/fonts';
const to = 'public/build/webfonts/tabler';
return {
name: 'copy-tabler-fonts',
buildStart() {
fse.ensureDirSync(to);
fse.copySync(from, to, { overwrite: true });
console.log('📁 Tabler fonts copied to:', to);
}
};
}
/**
* Copiar fuentes de Font Awesome
*/
function copyFontAwesomeFonts() {
const from = 'node_modules/@fortawesome/fontawesome-free/webfonts';
const to = 'public/build/webfonts';
return {
name: 'copy-fontawesome-fonts',
buildStart() {
fse.ensureDirSync(to);
fse.copySync(from, to, { overwrite: true });
console.log('📁 Font Awesome fonts copied to:', to);
}
};
}
/**
* Asset groups de componentes
*/
const vendorJsFiles = GetFilesArray('vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/js/*.js');
const libsJsFiles = GetFilesArray('vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/**/*.js');
const coreScssFiles = GetFilesArray('vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/scss/**/!(_)*.scss');
const libsScssFiles = GetFilesArray('vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/**/!(_)*.scss');
const libsCssFiles = GetFilesArray('vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/libs/**/*.css');
const fontsScssFiles = GetFilesArray('vendor/koneko/laravel-vuexy-admin/resources/assets/vendor/fonts/!(_)*.scss');
const assetsJsFiles = GetFilesArray('vendor/koneko/**/resources/assets/js/**/*.js');
const pageJsFiles = getComponentFiles('js');
const pageScssFiles = getComponentFiles('scss');
// assets de layouts tipo website, ecommerce, landing...
const layoutJSFiles = GetFilesArray('vendor/koneko/laravel-vuexy-*-layout-*/resources/assets/**/js/**/*.js');
const layoutSCSSFiles = GetFilesArray('vendor/koneko/laravel-vuexy-*-layout-*/resources/assets/**/scss/**/*.scss');
const layoutCSSFiles = GetFilesArray('vendor/koneko/laravel-vuexy-*-layout-*/resources/assets/**/css/**/*.css');
const layoutVendorJSFiles = GetFilesArray('vendor/koneko/laravel-vuexy-*-layout-*/resources/assets/**/vendor/**/*.js');
const layoutVendorSCSSFiles = GetFilesArray('vendor/koneko/laravel-vuexy-*-layout-*/resources/assets/**/vendor/**/*.scss');
const layoutVendorCSSFiles = GetFilesArray('vendor/koneko/laravel-vuexy-*-layout-*/resources/assets/**/vendor/**/*.css');
const layoutFontsScssFiles = GetFilesArray('vendor/koneko/laravel-vuexy-*-layout-*/resources/assets/**/vendor/fonts/!(_)*.scss');
const inputs = {
admin: [
'vendor/koneko/laravel-vuexy-admin/resources/assets/css/demo.css',
...vendorJsFiles,
...libsJsFiles,
...coreScssFiles,
...libsScssFiles,
...libsCssFiles,
...fontsScssFiles,
...assetsJsFiles,
...pageJsFiles,
...pageScssFiles
],
frontend: [
...layoutJSFiles,
...layoutSCSSFiles,
...layoutCSSFiles,
...layoutVendorJSFiles,
...layoutVendorSCSSFiles,
...layoutVendorCSSFiles,
...layoutFontsScssFiles
]
};
/**
* Aplanar entradas
*/
const flatInputs = Object.entries(inputs).reduce((acc, [group, paths]) => {
paths.forEach((p, i) => {
acc[`${group}-${i}`] = p;
});
return acc;
}, {});
/**
* Configuración final
*/
export default defineConfig({
plugins: [
laravel({
input: Object.values(flatInputs),
refresh: [
'resources/views/**',
'resources/frontend/views/**',
'vendor/koneko/**/resources/views/**',
]
}),
html(),
libsWindowAssignment(),
copyTablerFonts(),
copyFontAwesomeFonts(),
],
resolve: {
alias: {
'@vuexy-admin': path.resolve(__dirname, 'vendor/koneko/laravel-vuexy-admin/resources/'),
'@vuexy-contacts': path.resolve(__dirname, 'vendor/koneko/laravel-vuexy-contacts/resources/'),
'@vuexy-store-manager': path.resolve(__dirname, 'vendor/koneko/laravel-vuexy-store-manager/resources/'),
'@vuevy-warehouse': path.resolve(__dirname, 'vendor/koneko/laravel-vuevy-warehouse/resources/'),
'@vuevy-asset-management': path.resolve(__dirname, 'vendor/koneko/laravel-vuevy-asset-management/resources/'),
},
},
build: {
emptyOutDir: true,
rollupOptions: {
external: ['axios']
}
},
server: {
cors: true,
hmr: {
host: '127.0.0.1',
},
fs: {
allow: ['..'],
},
watch: {
ignored: [
'**/node_modules/**',
'**/storage/**',
'**/public/**'
],
}
},
});