import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import tsconfigPaths from 'vite-jsconfig-paths';
import { nodePolyfills } from 'vite-plugin-node-polyfills';
import { viteGitCommitHashPlugin } from 'vite-commit-hash-plugin';
const VENDOR_CHUNKS = new Set([
'opentiny-vue',
'opentiny-genui-sdk-core',
'opentiny-genui-sdk-vue',
'opentiny-tiny-robot',
'opentiny-tiny-robot-kit',
'opentiny-tiny-robot-svgs'
]);
function createManualChunks() {
const separator = '[\\/]';
const pkg = `(@[^\\/]+${separator}[^\\/]+|[^\\/]+)`;
const pnpmRegex = new RegExp(`.*node_modules${separator}${pkg}`);
return (id: string): string | undefined => {
if (!id.includes('node_modules')) return undefined;
const pkgName = id.match(pnpmRegex)?.[1];
if (!pkgName) return 'vendor';
const name = pkgName.startsWith('@') ? pkgName.slice(1).replace('/', '-') : pkgName;
if (/^opentiny-vue(-|$)/.test(name)) return 'opentiny-vue';
return VENDOR_CHUNKS.has(name) ? name : 'vendor';
};
}
export default defineConfig(({ command }) => {
const plugins = [
vue({
template: {
compilerOptions: {
isCustomElement: (tag) => tag === 'tiny-schema-renderer-element-ng',
},
},
}),
viteGitCommitHashPlugin({
fileName: 'version.json',
}),
];
if (command === 'serve') {
plugins.push(
tsconfigPaths({
projects: ['./tsconfig.dev.json'],
}),
nodePolyfills(),
);
}
return {
envDir: './env',
plugins,
optimizeDeps: {
exclude: ['monaco-editor', 'monaco-editor-vue3'],
},
build: {
rollupOptions: {
output: {
manualChunks: createManualChunks(),
chunkFileNames: 'assets/[name]-[hash].js',
assetFileNames: 'assets/[name]-[hash][extname]',
},
},
},
};
});