-
Notifications
You must be signed in to change notification settings - Fork 0
/
vite.config.ts
109 lines (102 loc) · 2.9 KB
/
vite.config.ts
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
101
102
103
104
105
106
107
108
109
import type { UserConfig, ConfigEnv, UserConfigFn } from 'vite';
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import peggy from './plugins/plugin-peggy';
import path from 'path';
const ConfigMode = Symbol();
interface ModeFn<
T extends Record<string, unknown>,
M extends keyof T & string,
> {
<K extends M>(mode: K): T[K];
<K extends string>(mode: K): T[K];
}
function mode<T extends Record<string, unknown>, M extends keyof M & string>(
table: T,
): ModeFn<T, M> {
function fn<K extends M>(mode: K): T[K] {
return table[mode];
}
fn[ConfigMode] = true;
return fn;
}
type ModeSpecificConfigProp<T, M extends string = string> =
| T
| ((mode: M) => T);
type ModeSpecificConfig<T = UserConfig, M extends string = string> = {
[K in keyof T]: T[K] extends Record<string, any>
? ModeSpecificConfig<T[K], M>
: ModeSpecificConfigProp<T[K], M> | ModeSpecificConfig<T[K], M>;
};
function* traverseDeep(obj: any): Generator<{
key: keyof any;
value: unknown;
get(): unknown;
set(value: any): void;
}> {
for (const [k, v] of Object.entries(obj)) {
yield {
key: k,
value: v,
get() {
return obj[k];
},
set(value: any) {
obj[k] = value;
},
};
if (v && (typeof v === 'object' || Array.isArray(v))) {
yield* traverseDeep(v);
}
}
}
function createConfig<C = UserConfig, M extends string = string>(
common: C,
{
build,
serve,
}: {
[K in ConfigEnv['command']]?: ModeSpecificConfig<Partial<C>, M>;
},
): UserConfigFn {
return defineConfig(({ command, mode }) => {
for (const config of [common, build, serve].filter(Boolean)) {
for (const { value, set } of traverseDeep(config)) {
if (typeof value === 'function' && value[ConfigMode]) {
set(value(mode));
}
}
}
return {
serve: Object.assign({}, common, serve),
build: Object.assign({}, common, build),
}[command];
}) as UserConfigFn;
}
export default createConfig<UserConfig, 'lib' | 'page'>(
{
plugins: [
vue(),
peggy({
parserBuildOptions: { output: 'source', format: 'es' },
}),
],
},
{
build: {
root: mode({ lib: '.', page: 'page' }),
base: './',
build: {
outDir: mode({ lib: 'lib', page: '../dist' }),
emptyOutDir: true,
assetsDir: mode({ page: 'resources' }),
lib: mode({
lib: {
name: 'lmbjzs',
entry: path.resolve(__dirname, 'src/index.ts'),
},
}),
},
},
},
);