@grigorov-it/mazer
Version:
Free and Open-source Bootstrap 5 Admin Dashboard Template and Landing Page
183 lines (166 loc) • 5.97 kB
JavaScript
import { defineConfig, normalizePath, build } from 'vite'
import fs from 'fs'
import path, { resolve } from 'path'
import { fileURLToPath } from 'url';
import nunjucks from 'vite-plugin-nunjucks'
import { viteStaticCopy } from 'vite-plugin-static-copy';
import sidebarItems from "./src/sidebar-items.json"
import horizontalMenuItems from "./src/horizontal-menu-items.json"
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const root = resolve(__dirname, 'src')
const isProd = process.env.NODE_ENV === 'production'
const outDir0 = isProd ? 'dist' : 'prebuild';
const getFiles = () => {
let files = {}
fs.readdirSync(root)
.filter(filename => filename.endsWith('.html'))
.forEach(filename => {
files[filename.slice(0, -5)] = resolve(root, filename)
})
return files
}
const files = getFiles()
const getVariables = (mode) => {
const variables = {}
Object.keys(files).forEach((filename) => {
if (filename.includes('layouts')) filename = `layouts/${filename}`
variables[filename + '.html'] = {
web_title: "Mazer Admin Dashboard",
sidebarItems,
horizontalMenuItems,
isDev: mode === 'development'
}
})
return variables
}
// Modules and extensions
// If the value is true, then it will copy the files inside the `dist` folders
// But if the value is false, it will copy the entire module files and folders
const modulesToCopy = {
"@icon/dripicons": false, // With dist folder = false
"@fortawesome/fontawesome-free": false,
"rater-js": false,
"bootstrap-icons": false,
apexcharts: true,
"perfect-scrollbar": true,
flatpickr: true,
filepond: true,
"filepond-plugin-file-validate-size": true,
"filepond-plugin-file-validate-type": true,
"filepond-plugin-image-crop": true,
"filepond-plugin-image-exif-orientation": true,
"filepond-plugin-image-filter": true,
"filepond-plugin-image-preview": true,
"filepond-plugin-image-resize": true,
"feather-icons": true,
dragula: true,
dayjs: false,
"chart.js": true,
"choices.js": false,
parsleyjs: true,
sweetalert2: true,
summernote: true,
jquery: true,
quill: true,
tinymce: false,
"toastify-js": false,
"datatables.net": false,
"datatables.net-bs5": false,
"simple-datatables": true,
jsvectormap: true,
}
const copyModules = Object.keys(modulesToCopy).map(moduleName => {
const withDist = modulesToCopy[moduleName]
return {
src: normalizePath(resolve(__dirname, `./node_modules/${moduleName}${withDist ? '/dist' : ''}`)),
dest: 'assets/extensions',
rename: moduleName
}
})
build({
configFile: false,
build: {
cssMinify: isProd,
minify: isProd ? 'esbuild' : false,
emptyOutDir: false,
outDir: resolve(__dirname, `${outDir0}/assets/compiled/js`),
lib: {
name: 'app',
formats: ['umd'],
fileName: 'app',
entry: './src/assets/js/app.js',
},
rollupOptions: {
output: {
entryFileNames: '[name].js'
}
}
},
})
export default defineConfig((env) => ({
publicDir: 'static',
base: './',
root,
plugins: [
viteStaticCopy({
targets: [
{ src: normalizePath(resolve(__dirname, './src/assets/static')), dest: 'assets' },
{ src: normalizePath(resolve(__dirname, `./${outDir0}/assets/compiled/fonts`)), dest: 'assets/compiled/css' },
{ src: normalizePath(resolve(__dirname, "./node_modules/bootstrap-icons/bootstrap-icons.svg")), dest: 'assets/static/images' },
...copyModules
],
watch: {
reloadPageOnChange: true
}
}),
nunjucks.default({
templatesDir: root,
variables: getVariables(env.mode),
nunjucksEnvironment: {
filters: {
containString: (str, containStr) => {
if (!str.length) return false
return str.indexOf(containStr) >= 0
},
startsWith: (str, targetStr) => {
if (!str.length) return false
return str.startsWith(targetStr)
}
}
}
})
],
resolve: {
alias: {
'@': normalizePath(resolve(__dirname, 'src')),
'~bootstrap': resolve(__dirname, 'node_modules/bootstrap'),
'~bootstrap-icons': resolve(__dirname, 'node_modules/bootstrap-icons'),
'~perfect-scrollbar': resolve(__dirname, 'node_modules/perfect-scrollbar'),
'~@fontsource': resolve(__dirname, 'node_modules/@fontsource'),
}
},
build: {
cssMinify: isProd,
minify: isProd ? 'esbuild' : false,
emptyOutDir: false,
manifest: true,
target: "chrome58",
outDir: resolve(__dirname, outDir0),
rollupOptions: {
input: files,
output: {
entryFileNames: `assets/compiled/js/[name].js`,
chunkFileNames: `assets/compiled/js/[name].js`,
assetFileNames: (a) => {
const extname = a.name.split('.')[1]
let folder = extname ? `${extname}/` : ''
// Put fonts into css folder
if (['woff', 'woff2', 'ttf'].includes(extname))
folder = 'fonts/'
return `assets/compiled/${folder}[name][extname]`
}
}
},
}
}))