|
import { resolve } from 'node:path'; |
|
import { URL, fileURLToPath } from 'node:url'; |
|
|
|
import VueI18n from '@intlify/unplugin-vue-i18n/vite'; |
|
import vue from '@vitejs/plugin-vue'; |
|
import vueJsx from '@vitejs/plugin-vue-jsx'; |
|
import Unocss from 'unocss/vite'; |
|
import AutoImport from 'unplugin-auto-import/vite'; |
|
import IconsResolver from 'unplugin-icons/resolver'; |
|
import Icons from 'unplugin-icons/vite'; |
|
import { NaiveUiResolver } from 'unplugin-vue-components/resolvers'; |
|
import Components from 'unplugin-vue-components/vite'; |
|
import { defineConfig } from 'vite'; |
|
import { VitePWA } from 'vite-plugin-pwa'; |
|
import markdown from 'vite-plugin-vue-markdown'; |
|
import svgLoader from 'vite-svg-loader'; |
|
import { configDefaults } from 'vitest/config'; |
|
|
|
const baseUrl = process.env.BASE_URL ?? '/'; |
|
|
|
|
|
export default defineConfig({ |
|
plugins: [ |
|
VueI18n({ |
|
runtimeOnly: true, |
|
jitCompilation: true, |
|
compositionOnly: true, |
|
fullInstall: true, |
|
strictMessage: false, |
|
include: [ |
|
resolve(__dirname, 'locales/**'), |
|
], |
|
}), |
|
AutoImport({ |
|
imports: [ |
|
'vue', |
|
'vue-router', |
|
'@vueuse/core', |
|
'vue-i18n', |
|
{ |
|
'naive-ui': ['useDialog', 'useMessage', 'useNotification', 'useLoadingBar'], |
|
}, |
|
], |
|
vueTemplate: true, |
|
eslintrc: { |
|
enabled: true, |
|
}, |
|
}), |
|
Icons({ compiler: 'vue3' }), |
|
vue({ |
|
include: [/\.vue$/, /\.md$/], |
|
}), |
|
vueJsx(), |
|
markdown(), |
|
svgLoader(), |
|
VitePWA({ |
|
registerType: 'autoUpdate', |
|
strategies: 'generateSW', |
|
manifest: { |
|
name: 'IT Tools', |
|
description: 'Aggregated set of useful tools for developers.', |
|
display: 'standalone', |
|
lang: 'fr-FR', |
|
start_url: `${baseUrl}?utm_source=pwa&utm_medium=pwa`, |
|
orientation: 'any', |
|
theme_color: '#18a058', |
|
background_color: '#f1f5f9', |
|
icons: [ |
|
{ |
|
src: '/favicon-16x16.png', |
|
type: 'image/png', |
|
sizes: '16x16', |
|
}, |
|
{ |
|
src: '/favicon-32x32.png', |
|
type: 'image/png', |
|
sizes: '32x32', |
|
}, |
|
{ |
|
src: '/android-chrome-192x192.png', |
|
sizes: '192x192', |
|
type: 'image/png', |
|
}, |
|
{ |
|
src: '/android-chrome-512x512.png', |
|
sizes: '512x512', |
|
type: 'image/png', |
|
purpose: 'any maskable', |
|
}, |
|
], |
|
}, |
|
}), |
|
Components({ |
|
dirs: ['src/'], |
|
extensions: ['vue', 'md'], |
|
include: [/\.vue$/, /\.vue\?vue/, /\.md$/], |
|
resolvers: [NaiveUiResolver(), IconsResolver({ prefix: 'icon' })], |
|
}), |
|
Unocss(), |
|
], |
|
base: baseUrl, |
|
resolve: { |
|
alias: { |
|
'@': fileURLToPath(new URL('./src', import.meta.url)), |
|
}, |
|
}, |
|
define: { |
|
'import.meta.env.PACKAGE_VERSION': JSON.stringify(process.env.npm_package_version), |
|
}, |
|
test: { |
|
exclude: [...configDefaults.exclude, '**/*.e2e.spec.ts'], |
|
}, |
|
build: { |
|
target: 'esnext', |
|
}, |
|
}); |