-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathvite.config.ts
More file actions
124 lines (119 loc) · 4.06 KB
/
vite.config.ts
File metadata and controls
124 lines (119 loc) · 4.06 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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import { defineConfig, type Plugin } from "vite";
import react from "@vitejs/plugin-react";
import path from "path";
import runtimeErrorOverlay from "@replit/vite-plugin-runtime-error-modal";
const cryptoPolyfill: Plugin = {
name: 'crypto-polyfill',
enforce: 'pre',
resolveId(id: string) {
if (id === 'crypto') {
return id;
}
},
load(id: string) {
if (id === 'crypto') {
return `
export const randomBytes = (length) => {
const bytes = new Uint8Array(length);
if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
crypto.getRandomValues(bytes);
} else {
for (let i = 0; i < length; i++) {
bytes[i] = Math.floor(Math.random() * 256);
}
}
return bytes;
};
export const getRandomValues = (array) => {
if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
return crypto.getRandomValues(array);
} else {
for (let i = 0; i < array.length; i++) {
array[i] = Math.floor(Math.random() * 256);
}
return array;
}
};
export default { randomBytes, getRandomValues };
`;
}
}
};
// Плагин для исключения серверных модулей из браузерной сборки
const serverOnlyModules: Plugin = {
name: 'server-only-modules',
enforce: 'pre',
resolveId(id: string) {
// Исключаем модули которые используются только на сервере
if (id.includes('@lib/bot-generator') &&
!id.includes('utils') &&
!id.includes('format') &&
!id.includes('map-utils') &&
!id.includes('media') &&
!id.includes('-browser')) { // Разрешаем browser-версии
// Возвращаем пустой модуль для браузера
return { id, external: true };
}
// Исключаем модули шаблонов которые используются только на сервере
if (id.includes('@lib/bot-generator/templates/') &&
(id.includes('template-renderer') ||
id.includes('generate-header') && !id.includes('-browser') ||
id.includes('generate-imports') && !id.includes('-browser') ||
id.includes('generate-config') && !id.includes('-browser') ||
id.includes('generate-utils') && !id.includes('-browser') ||
id.includes('get-templates-dir'))) {
// Возвращаем пустой модуль для браузера
return { id, external: true };
}
}
};
export default defineConfig(async () => {
const cartographer = process.env.NODE_ENV !== "production" && process.env.REPL_ID !== undefined
? await import("@replit/vite-plugin-cartographer").then((m) => m.cartographer())
: [];
return {
plugins: [
react(),
runtimeErrorOverlay(),
cartographer,
cryptoPolyfill,
serverOnlyModules
].flat(),
resolve: {
alias: {
"@": path.resolve(process.cwd(), "client"),
"@lib": path.resolve(process.cwd(), "lib"),
"@shared": path.resolve(process.cwd(), "shared"),
"@assets": path.resolve(process.cwd(), "attached_assets"),
},
},
root: path.resolve(process.cwd(), "client"),
// Явно указываем корень проекта для поиска .env файлов,
// т.к. root задан как client/ и Vite иначе не найдёт .env в корне
envDir: path.resolve(process.cwd()),
build: {
outDir: path.resolve(process.cwd(), "dist"),
emptyOutDir: true,
rollupOptions: {
external: ['crypto'],
}
},
server: {
fs: {
strict: true,
deny: ["**/.*"],
},
hmr: {
overlay: false,
clientPort: 5000
}
},
define: {
global: 'globalThis',
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development')
},
optimizeDeps: {
include: ['buffer'],
},
};
});