-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvite.config.ts
More file actions
100 lines (97 loc) · 3.03 KB
/
vite.config.ts
File metadata and controls
100 lines (97 loc) · 3.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import { defineConfig } from 'vite';
import { resolve } from 'path';
import dts from 'vite-plugin-dts';
import { copyFileSync, readFileSync, writeFileSync } from 'fs';
import postcss from 'postcss';
import cssnano from 'cssnano';
export default defineConfig({
plugins: [
dts({
include: ['src/**/*.ts', 'src/**/*.tsx'],
exclude: ['src/**/*.test.ts', 'src/**/*.spec.ts']
}),
// Add "use client" directive to Next.js client bundle
{
name: 'add-use-client-directive',
generateBundle(options, bundle) {
const nextBundle = bundle['next.es.js'];
if (nextBundle && 'code' in nextBundle) {
nextBundle.code = `"use client";\n${nextBundle.code}`;
}
}
},
// Copy and minify CSS file to dist folder
{
name: 'copy-css',
async writeBundle() {
const cssPath = resolve(__dirname, 'src/toolbar.css');
const outputPath = resolve(__dirname, 'dist/toolbar.css');
const css = readFileSync(cssPath, 'utf-8');
// Minify CSS with cssnano (default preset)
const result = await postcss([
cssnano({
preset: ['default', {
discardComments: { removeAll: true },
normalizeWhitespace: true,
}]
})
]).process(css, { from: cssPath, to: outputPath });
writeFileSync(outputPath, result.css);
}
}
],
build: {
target: 'esnext',
lib: {
entry: {
index: resolve(__dirname, 'src/index.ts'),
react: resolve(__dirname, 'src/react/index.tsx'),
next: resolve(__dirname, 'src/next/index.ts'),
'next-server': resolve(__dirname, 'src/next/server.ts')
},
name: 'UnleashSessionToolbar',
formats: ['es'],
fileName: (format, entryName) => `${entryName}.${format}.js`
},
minify: 'terser',
terserOptions: {
compress: {
passes: 3,
drop_console: false, // Keep console.error for debugging
drop_debugger: true,
pure_funcs: ['console.log', 'console.debug', 'console.trace'],
pure_getters: true,
unsafe_arrows: true,
unsafe_methods: true,
unsafe_proto: true,
unsafe_regexp: true,
},
mangle: {
toplevel: true,
properties: false, // Don't mangle properties to avoid breaking lit-html
},
format: {
comments: false,
ecma: 2020,
},
},
rollupOptions: {
external: ['react', 'react/jsx-runtime', 'unleash-proxy-client', '@unleash/proxy-client-react'],
output: {
globals: {
react: 'React',
'react/jsx-runtime': 'jsxRuntime',
'unleash-proxy-client': 'UnleashClient',
'@unleash/proxy-client-react': 'UnleashReact'
},
assetFileNames: (assetInfo) => {
if (assetInfo.name?.endsWith('.png')) return 'assets/[name][extname]';
return assetInfo.name || '';
}
}
},
sourcemap: true,
outDir: 'dist',
assetsInlineLimit: 0 // Don't inline assets, keep them as separate files
}
});