@infodb/revx 0.4.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -326
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +56 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +64 -14
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +9 -0
- package/dist/commands/validate.js.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/utils/config.d.ts +6 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +9 -4
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/logger.d.ts +3 -2
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +7 -4
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/proxy.d.ts +8 -2
- package/dist/utils/proxy.d.ts.map +1 -1
- package/dist/utils/proxy.js +11 -1
- package/dist/utils/proxy.js.map +1 -1
- package/dist/utils/vite-middleware.d.ts +18 -0
- package/dist/utils/vite-middleware.d.ts.map +1 -0
- package/dist/utils/vite-middleware.js +69 -0
- package/dist/utils/vite-middleware.js.map +1 -0
- package/package.json +11 -6
- package/sample/revx.mixed.yaml +63 -0
- package/sample/revx.vite.yaml +56 -0
package/README.md
CHANGED
|
@@ -1,58 +1,124 @@
|
|
|
1
1
|
# @infodb/revx
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Host multiple Vite projects on a single port with unified routing.**
|
|
4
|
+
|
|
5
|
+
Perfect for monorepo development - run all your Vite apps, backend APIs, and other dev servers together with native HMR support.
|
|
6
|
+
|
|
7
|
+
## Why revx?
|
|
8
|
+
|
|
9
|
+
Development in a monorepo with multiple Vite projects is painful:
|
|
10
|
+
- Each Vite app runs on a different port (3000, 3001, 3002...)
|
|
11
|
+
- Cross-app navigation requires hardcoded ports
|
|
12
|
+
- Cookie/session sharing is complicated
|
|
13
|
+
- CORS issues everywhere
|
|
14
|
+
|
|
15
|
+
**revx solves this** by using Vite's middleware mode to host everything on one port with path-based routing:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
http://localhost:3000/app1 → Vite Project 1 (native HMR)
|
|
19
|
+
http://localhost:3000/app2 → Vite Project 2 (native HMR)
|
|
20
|
+
http://localhost:3000/api → Your Backend API
|
|
21
|
+
http://localhost:3000/legacy → webpack dev server (via proxy)
|
|
22
|
+
```
|
|
4
23
|
|
|
5
24
|
## Features
|
|
6
25
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
- CORS
|
|
13
|
-
- Path rewriting
|
|
14
|
-
- Environment variable expansion
|
|
15
|
-
- Optimized for development servers like Vite
|
|
26
|
+
- **🎯 Primary: Multi-Vite hosting** - Native Vite integration with full HMR support
|
|
27
|
+
- **🔌 Reverse proxy** - Integrate webpack, Parcel, or any other dev server
|
|
28
|
+
- **📁 Static file serving** - Serve built assets or documentation
|
|
29
|
+
- **🎨 YAML configuration** - Simple, declarative routing
|
|
30
|
+
- **⚡ Automatic route sorting** - Routes prioritized by specificity
|
|
31
|
+
- **🌐 CORS & environment variables** - Full control over cross-origin and config
|
|
16
32
|
|
|
17
33
|
## Installation
|
|
18
34
|
|
|
35
|
+
### Option 1: Install as dev dependency (Recommended)
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm install -D @infodb/revx
|
|
39
|
+
# or
|
|
40
|
+
pnpm add -D @infodb/revx
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Then add to package.json scripts:
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"scripts": {
|
|
47
|
+
"dev": "revx start",
|
|
48
|
+
"dev:verbose": "revx start --verbose"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Option 2: Use with npx/pnpx (No installation)
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npx @infodb/revx start
|
|
57
|
+
# or
|
|
58
|
+
pnpx @infodb/revx start
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Good for trying out revx, but slower on repeated runs.
|
|
62
|
+
|
|
63
|
+
### Option 3: Global installation
|
|
64
|
+
|
|
19
65
|
```bash
|
|
20
66
|
npm install -g @infodb/revx
|
|
21
67
|
# or
|
|
22
68
|
pnpm add -g @infodb/revx
|
|
23
|
-
# or
|
|
24
|
-
npx @infodb/revx
|
|
25
69
|
```
|
|
26
70
|
|
|
27
71
|
## Quick Start
|
|
28
72
|
|
|
29
|
-
1.
|
|
73
|
+
1. Install revx in your monorepo:
|
|
30
74
|
|
|
31
75
|
```bash
|
|
32
|
-
revx
|
|
76
|
+
pnpm add -D @infodb/revx
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
2. Create a configuration file:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
pnpm revx init
|
|
33
83
|
```
|
|
34
84
|
|
|
35
|
-
This creates a `revx.yaml` file with
|
|
85
|
+
This creates a `revx.yaml` file with Vite multi-project configuration.
|
|
36
86
|
|
|
37
|
-
|
|
87
|
+
3. Edit `revx.yaml` to point to your Vite projects:
|
|
38
88
|
|
|
39
89
|
```yaml
|
|
40
90
|
server:
|
|
41
91
|
port: 3000
|
|
92
|
+
maxSockets: 512 # Important for Vite performance
|
|
42
93
|
|
|
43
94
|
routes:
|
|
95
|
+
# Your Vite apps
|
|
96
|
+
- path: "/app1"
|
|
97
|
+
vite:
|
|
98
|
+
root: "./apps/app1"
|
|
99
|
+
base: "/app1"
|
|
100
|
+
|
|
101
|
+
- path: "/app2"
|
|
102
|
+
vite:
|
|
103
|
+
root: "./apps/app2"
|
|
104
|
+
base: "/app2"
|
|
105
|
+
|
|
106
|
+
# Backend API
|
|
44
107
|
- path: "/api/*"
|
|
45
108
|
target: "http://localhost:4000"
|
|
46
109
|
pathRewrite:
|
|
47
110
|
"^/api": ""
|
|
48
111
|
```
|
|
49
112
|
|
|
50
|
-
|
|
113
|
+
4. Start the unified dev server:
|
|
51
114
|
|
|
52
115
|
```bash
|
|
53
|
-
revx start
|
|
116
|
+
pnpm revx start
|
|
117
|
+
# or add to package.json scripts and run: pnpm dev
|
|
54
118
|
```
|
|
55
119
|
|
|
120
|
+
Now all your apps are available at `http://localhost:3000` with full HMR! 🎉
|
|
121
|
+
|
|
56
122
|
## Commands
|
|
57
123
|
|
|
58
124
|
### `revx start [config-file]`
|
|
@@ -96,315 +162,11 @@ revx init --simple
|
|
|
96
162
|
revx init --output my-config.yaml
|
|
97
163
|
```
|
|
98
164
|
|
|
99
|
-
##
|
|
100
|
-
|
|
101
|
-
### Basic Configuration
|
|
102
|
-
|
|
103
|
-
```yaml
|
|
104
|
-
server:
|
|
105
|
-
port: 3000
|
|
106
|
-
host: 0.0.0.0
|
|
107
|
-
name: "My Reverse Proxy"
|
|
108
|
-
|
|
109
|
-
routes:
|
|
110
|
-
- path: "/api/*"
|
|
111
|
-
target: "http://localhost:4000"
|
|
112
|
-
pathRewrite:
|
|
113
|
-
"^/api": ""
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
### Global Settings
|
|
117
|
-
|
|
118
|
-
```yaml
|
|
119
|
-
global:
|
|
120
|
-
# Max concurrent sockets (default: 256)
|
|
121
|
-
# Increase for better performance with dev servers like Vite
|
|
122
|
-
maxSockets: 512
|
|
123
|
-
|
|
124
|
-
cors:
|
|
125
|
-
enabled: true
|
|
126
|
-
origin: "*"
|
|
127
|
-
methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"]
|
|
128
|
-
credentials: true
|
|
129
|
-
|
|
130
|
-
logging:
|
|
131
|
-
enabled: true
|
|
132
|
-
format: "combined" # combined | dev | common | short | tiny
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
### Performance Tuning
|
|
136
|
-
|
|
137
|
-
#### Max Sockets Configuration
|
|
138
|
-
|
|
139
|
-
When proxying to development servers like Vite that serve many files concurrently, you may need to increase the maximum number of concurrent sockets:
|
|
140
|
-
|
|
141
|
-
```yaml
|
|
142
|
-
server:
|
|
143
|
-
maxSockets: 512 # Can be set at server level
|
|
144
|
-
|
|
145
|
-
# OR
|
|
146
|
-
|
|
147
|
-
global:
|
|
148
|
-
maxSockets: 512 # Can be set globally
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
**Default**: 256
|
|
152
|
-
|
|
153
|
-
**When to increase**:
|
|
154
|
-
- Proxying to Vite or similar dev servers
|
|
155
|
-
- Serving applications with many static assets
|
|
156
|
-
- High concurrent request scenarios
|
|
157
|
-
|
|
158
|
-
**Note**: The `server.maxSockets` takes precedence over `global.maxSockets` if both are set.
|
|
159
|
-
|
|
160
|
-
### Route Configuration
|
|
161
|
-
|
|
162
|
-
**Important:** Routes are automatically sorted by specificity when loaded. You don't need to worry about the order in your YAML file - the most specific routes (longest paths) will always be matched first.
|
|
163
|
-
|
|
164
|
-
For example:
|
|
165
|
-
```yaml
|
|
166
|
-
routes:
|
|
167
|
-
# These will be automatically reordered
|
|
168
|
-
- path: "/" # Will match last
|
|
169
|
-
target: "http://static"
|
|
170
|
-
|
|
171
|
-
- path: "/api/v1/users/*" # Will match first (most specific)
|
|
172
|
-
target: "http://users-api"
|
|
173
|
-
|
|
174
|
-
- path: "/api/*" # Will match after /api/v1/users/*
|
|
175
|
-
target: "http://api"
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
The automatic sorting order:
|
|
179
|
-
1. Longest paths first
|
|
180
|
-
2. Paths with fewer wildcards (more specific)
|
|
181
|
-
3. Alphabetical order for equal paths
|
|
182
|
-
|
|
183
|
-
#### Simple Proxy
|
|
184
|
-
|
|
185
|
-
```yaml
|
|
186
|
-
routes:
|
|
187
|
-
- path: "/api/*"
|
|
188
|
-
target: "http://api.example.com"
|
|
189
|
-
changeOrigin: true
|
|
190
|
-
pathRewrite:
|
|
191
|
-
"^/api": ""
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
#### WebSocket Proxy
|
|
195
|
-
|
|
196
|
-
WebSocket support is critical for Hot Module Replacement (HMR) with development servers like Vite:
|
|
197
|
-
|
|
198
|
-
```yaml
|
|
199
|
-
routes:
|
|
200
|
-
- path: "/ws"
|
|
201
|
-
target: "ws://websocket.example.com"
|
|
202
|
-
ws: true
|
|
203
|
-
changeOrigin: true
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
#### Static File Serving
|
|
207
|
-
|
|
208
|
-
Serve static files directly without proxying (useful for `vite build --watch` output):
|
|
209
|
-
|
|
210
|
-
```yaml
|
|
211
|
-
routes:
|
|
212
|
-
- path: "/*"
|
|
213
|
-
static: "./dist"
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
**Combined with API proxy:**
|
|
217
|
-
```yaml
|
|
218
|
-
routes:
|
|
219
|
-
# API requests go to backend
|
|
220
|
-
- path: "/api/*"
|
|
221
|
-
target: "http://localhost:4000"
|
|
222
|
-
pathRewrite:
|
|
223
|
-
"^/api": ""
|
|
224
|
-
|
|
225
|
-
# Static files from Vite build
|
|
226
|
-
- path: "/*"
|
|
227
|
-
static: "./dist"
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
**Use case: Vite build --watch**
|
|
231
|
-
```bash
|
|
232
|
-
# Terminal 1: Run Vite in build watch mode
|
|
233
|
-
vite build --watch
|
|
234
|
-
|
|
235
|
-
# Terminal 2: Run revx to serve the built files
|
|
236
|
-
revx start
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
This serves pre-built static files, avoiding proxy-related errors that can occur with Vite dev server.
|
|
240
|
-
|
|
241
|
-
### Environment Variables
|
|
242
|
-
|
|
243
|
-
Use `${VARIABLE_NAME}` syntax to reference environment variables:
|
|
244
|
-
|
|
245
|
-
```yaml
|
|
246
|
-
server:
|
|
247
|
-
port: ${PORT}
|
|
248
|
-
|
|
249
|
-
routes:
|
|
250
|
-
- path: "/api/*"
|
|
251
|
-
target: "${API_URL}"
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
Then run:
|
|
255
|
-
|
|
256
|
-
```bash
|
|
257
|
-
PORT=3000 API_URL=http://api.example.com revx start
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
## Examples
|
|
261
|
-
|
|
262
|
-
### Microservices Gateway
|
|
263
|
-
|
|
264
|
-
```yaml
|
|
265
|
-
server:
|
|
266
|
-
port: 8080
|
|
267
|
-
name: "Microservices Gateway"
|
|
268
|
-
|
|
269
|
-
routes:
|
|
270
|
-
- path: "/users/*"
|
|
271
|
-
target: "http://user-service:3001"
|
|
272
|
-
pathRewrite:
|
|
273
|
-
"^/users": ""
|
|
274
|
-
|
|
275
|
-
- path: "/products/*"
|
|
276
|
-
target: "http://product-service:3002"
|
|
277
|
-
pathRewrite:
|
|
278
|
-
"^/products": ""
|
|
279
|
-
|
|
280
|
-
- path: "/orders/*"
|
|
281
|
-
target: "http://order-service:3003"
|
|
282
|
-
pathRewrite:
|
|
283
|
-
"^/orders": ""
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
### Development Proxy
|
|
287
|
-
|
|
288
|
-
```yaml
|
|
289
|
-
server:
|
|
290
|
-
port: 3000
|
|
291
|
-
|
|
292
|
-
global:
|
|
293
|
-
cors:
|
|
294
|
-
enabled: true
|
|
295
|
-
origin: "http://localhost:5173"
|
|
296
|
-
|
|
297
|
-
routes:
|
|
298
|
-
- path: "/api/*"
|
|
299
|
-
target: "http://localhost:4000"
|
|
300
|
-
pathRewrite:
|
|
301
|
-
"^/api": ""
|
|
302
|
-
|
|
303
|
-
- path: "/ws"
|
|
304
|
-
target: "ws://localhost:4000"
|
|
305
|
-
ws: true
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
### Vite Development Server Proxy
|
|
309
|
-
|
|
310
|
-
```yaml
|
|
311
|
-
server:
|
|
312
|
-
port: 3000
|
|
313
|
-
# Increase max sockets for Vite's many concurrent requests
|
|
314
|
-
maxSockets: 512
|
|
315
|
-
|
|
316
|
-
global:
|
|
317
|
-
cors:
|
|
318
|
-
enabled: true
|
|
319
|
-
origin: "http://localhost:5173"
|
|
320
|
-
|
|
321
|
-
routes:
|
|
322
|
-
# Proxy API requests to backend
|
|
323
|
-
- path: "/api/*"
|
|
324
|
-
target: "http://localhost:4000"
|
|
325
|
-
pathRewrite:
|
|
326
|
-
"^/api": ""
|
|
327
|
-
|
|
328
|
-
# Proxy everything else to Vite dev server
|
|
329
|
-
- path: "/*"
|
|
330
|
-
target: "http://localhost:5173"
|
|
331
|
-
ws: true # Enable WebSocket for HMR
|
|
332
|
-
changeOrigin: true
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
### Vite Build Watch Mode
|
|
336
|
-
|
|
337
|
-
```yaml
|
|
338
|
-
server:
|
|
339
|
-
port: 3000
|
|
340
|
-
|
|
341
|
-
routes:
|
|
342
|
-
# Proxy API requests to backend
|
|
343
|
-
- path: "/api/*"
|
|
344
|
-
target: "http://localhost:4000"
|
|
345
|
-
pathRewrite:
|
|
346
|
-
"^/api": ""
|
|
347
|
-
|
|
348
|
-
# Serve static files built by Vite
|
|
349
|
-
- path: "/*"
|
|
350
|
-
static: "./dist"
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
Run with:
|
|
354
|
-
```bash
|
|
355
|
-
# Terminal 1: Build and watch
|
|
356
|
-
vite build --watch
|
|
357
|
-
|
|
358
|
-
# Terminal 2: Serve with revx
|
|
359
|
-
revx start
|
|
360
|
-
```
|
|
361
|
-
|
|
362
|
-
## Troubleshooting
|
|
363
|
-
|
|
364
|
-
### Vite Development Server Issues
|
|
365
|
-
|
|
366
|
-
When proxying directly to Vite dev server, you may encounter errors due to dynamic content transformation. For a more stable setup, consider using `vite build --watch` with static file serving instead:
|
|
367
|
-
|
|
368
|
-
```bash
|
|
369
|
-
# Terminal 1: Build and watch
|
|
370
|
-
vite build --watch
|
|
371
|
-
|
|
372
|
-
# Terminal 2: Serve with revx
|
|
373
|
-
revx start
|
|
374
|
-
```
|
|
375
|
-
|
|
376
|
-
This approach serves pre-built files and avoids proxy-related issues.
|
|
377
|
-
|
|
378
|
-
### Performance Issues with Dev Servers
|
|
379
|
-
|
|
380
|
-
If you experience slow loading or timeouts when proxying to Vite or similar dev servers:
|
|
381
|
-
|
|
382
|
-
1. **Increase max sockets**:
|
|
383
|
-
```yaml
|
|
384
|
-
server:
|
|
385
|
-
maxSockets: 512 # or higher
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
2. **Use verbose mode** to check socket configuration:
|
|
389
|
-
```bash
|
|
390
|
-
revx start --verbose
|
|
391
|
-
```
|
|
392
|
-
|
|
393
|
-
3. **Check the log output** for "Max sockets configured: XXX"
|
|
394
|
-
|
|
395
|
-
### Common Issues
|
|
396
|
-
|
|
397
|
-
**Q: Routes not matching correctly**
|
|
398
|
-
- Routes are automatically sorted by specificity (longest first)
|
|
399
|
-
- Use `--verbose` mode to see the sorted route order
|
|
400
|
-
|
|
401
|
-
**Q: Path not being rewritten**
|
|
402
|
-
- `pathRewrite` is optional; paths are preserved by default
|
|
403
|
-
- Only use `pathRewrite` when you need to modify the path
|
|
165
|
+
## Documentation
|
|
404
166
|
|
|
405
|
-
**
|
|
406
|
-
-
|
|
407
|
-
-
|
|
167
|
+
- **[Configuration Reference](./docs/CONFIGURATION.md)** - Detailed configuration options and performance tuning
|
|
168
|
+
- **[Examples](./docs/EXAMPLES.md)** - Real-world configuration examples for various use cases
|
|
169
|
+
- **[Troubleshooting](./docs/TROUBLESHOOTING.md)** - Common issues and solutions
|
|
408
170
|
|
|
409
171
|
## Development
|
|
410
172
|
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAuHA,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,iBAiCnH"}
|
package/dist/commands/init.js
CHANGED
|
@@ -70,6 +70,49 @@ routes:
|
|
|
70
70
|
ws: true
|
|
71
71
|
changeOrigin: true
|
|
72
72
|
`;
|
|
73
|
+
const VITE_CONFIG = `# revx.yaml - Multi-Vite Project Configuration
|
|
74
|
+
|
|
75
|
+
# Server settings
|
|
76
|
+
server:
|
|
77
|
+
port: 3000
|
|
78
|
+
host: 0.0.0.0
|
|
79
|
+
name: "Multi-Vite Dev Server"
|
|
80
|
+
# Increase max sockets for better performance with Vite
|
|
81
|
+
maxSockets: 512
|
|
82
|
+
|
|
83
|
+
# Global configuration
|
|
84
|
+
global:
|
|
85
|
+
# CORS settings
|
|
86
|
+
cors:
|
|
87
|
+
enabled: true
|
|
88
|
+
origin: "*"
|
|
89
|
+
|
|
90
|
+
# Logging settings
|
|
91
|
+
logging:
|
|
92
|
+
enabled: true
|
|
93
|
+
format: "dev"
|
|
94
|
+
|
|
95
|
+
# Route definitions
|
|
96
|
+
routes:
|
|
97
|
+
# Vite project 1
|
|
98
|
+
- path: "/app1"
|
|
99
|
+
vite:
|
|
100
|
+
root: "./projects/app1"
|
|
101
|
+
base: "/app1"
|
|
102
|
+
|
|
103
|
+
# Vite project 2
|
|
104
|
+
- path: "/app2"
|
|
105
|
+
vite:
|
|
106
|
+
root: "./projects/app2"
|
|
107
|
+
base: "/app2"
|
|
108
|
+
|
|
109
|
+
# Backend API proxy
|
|
110
|
+
- path: "/api/*"
|
|
111
|
+
target: "http://localhost:4000"
|
|
112
|
+
changeOrigin: true
|
|
113
|
+
pathRewrite:
|
|
114
|
+
"^/api": ""
|
|
115
|
+
`;
|
|
73
116
|
export async function initCommand(options) {
|
|
74
117
|
const logger = new Logger(options.verbose);
|
|
75
118
|
const outputPath = options.output || 'revx.yaml';
|
|
@@ -80,11 +123,21 @@ export async function initCommand(options) {
|
|
|
80
123
|
logger.info('Use --output to specify a different file name');
|
|
81
124
|
process.exit(1);
|
|
82
125
|
}
|
|
83
|
-
|
|
126
|
+
let content;
|
|
127
|
+
if (options.proxy) {
|
|
128
|
+
content = SAMPLE_CONFIG;
|
|
129
|
+
}
|
|
130
|
+
else if (options.simple) {
|
|
131
|
+
content = SIMPLE_CONFIG;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
// Default: Vite configuration
|
|
135
|
+
content = VITE_CONFIG;
|
|
136
|
+
}
|
|
84
137
|
writeFileSync(fullPath, content, 'utf-8');
|
|
85
138
|
logger.success(`Configuration file created: ${fullPath}`);
|
|
86
|
-
logger.info('Edit the file to configure your
|
|
87
|
-
logger.info(`Start the
|
|
139
|
+
logger.info('Edit the file to configure your routes');
|
|
140
|
+
logger.info(`Start the server with: revx start ${outputPath}`);
|
|
88
141
|
}
|
|
89
142
|
catch (error) {
|
|
90
143
|
if (error instanceof Error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDrB,CAAC;AAEF,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;CAerB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDrB,CAAC;AAEF,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;CAerB,CAAC;AAEF,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CnB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAkF;IAClH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,OAAe,CAAC;QACpB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,GAAG,aAAa,CAAC;QAC1B,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1B,OAAO,GAAG,aAAa,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,8BAA8B;YAC9B,OAAO,GAAG,WAAW,CAAC;QACxB,CAAC;QAED,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAE1C,MAAM,CAAC,OAAO,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,qCAAqC,UAAU,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,wCAAwC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAYA,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,YAAc,EAAE,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,iBA2BlG"}
|
package/dist/commands/start.js
CHANGED
|
@@ -7,10 +7,12 @@ import { existsSync } from 'fs';
|
|
|
7
7
|
import { resolve } from 'path';
|
|
8
8
|
import { ConfigLoader } from '../utils/config.js';
|
|
9
9
|
import { ProxyManager } from '../utils/proxy.js';
|
|
10
|
+
import { ViteMiddlewareManager } from '../utils/vite-middleware.js';
|
|
10
11
|
import { Logger } from '../utils/logger.js';
|
|
11
12
|
export async function startCommand(configFile = 'revx.yaml', options) {
|
|
12
13
|
const logger = new Logger(options.verbose);
|
|
13
14
|
const configLoader = new ConfigLoader(logger);
|
|
15
|
+
const viteManager = new ViteMiddlewareManager(logger);
|
|
14
16
|
try {
|
|
15
17
|
logger.info(`Loading configuration from: ${configFile}`);
|
|
16
18
|
const config = configLoader.load(configFile);
|
|
@@ -21,13 +23,14 @@ export async function startCommand(configFile = 'revx.yaml', options) {
|
|
|
21
23
|
const app = express();
|
|
22
24
|
const proxyManager = new ProxyManager(logger);
|
|
23
25
|
setupMiddleware(app, config, logger);
|
|
24
|
-
setupRoutes(app, config, proxyManager, logger);
|
|
25
|
-
await startServer(app, config, logger);
|
|
26
|
+
await setupRoutes(app, config, proxyManager, viteManager, logger);
|
|
27
|
+
await startServer(app, config, viteManager, proxyManager, logger);
|
|
26
28
|
}
|
|
27
29
|
catch (error) {
|
|
28
30
|
if (error instanceof Error) {
|
|
29
31
|
logger.error(`Failed to start server: ${error.message}`);
|
|
30
32
|
}
|
|
33
|
+
await viteManager.cleanup();
|
|
31
34
|
process.exit(1);
|
|
32
35
|
}
|
|
33
36
|
}
|
|
@@ -58,16 +61,20 @@ function setupStaticRoute(app, route, logger) {
|
|
|
58
61
|
logger.info(`Static files configured: ${route.path} -> ${rootPath}`);
|
|
59
62
|
app.use(route.path, express.static(rootPath));
|
|
60
63
|
}
|
|
61
|
-
function setupRoutes(app, config, proxyManager, logger) {
|
|
62
|
-
config.routes
|
|
63
|
-
if (route.
|
|
64
|
+
async function setupRoutes(app, config, proxyManager, viteManager, logger) {
|
|
65
|
+
for (const route of config.routes) {
|
|
66
|
+
if (route.vite) {
|
|
67
|
+
const viteMiddleware = await viteManager.createViteMiddleware(route);
|
|
68
|
+
app.use(route.path, viteMiddleware);
|
|
69
|
+
}
|
|
70
|
+
else if (route.static) {
|
|
64
71
|
setupStaticRoute(app, route, logger);
|
|
65
72
|
}
|
|
66
73
|
else {
|
|
67
74
|
const proxyMiddleware = proxyManager.createProxyMiddleware(route);
|
|
68
75
|
app.use(proxyMiddleware);
|
|
69
76
|
}
|
|
70
|
-
}
|
|
77
|
+
}
|
|
71
78
|
app.get('/health', (req, res) => {
|
|
72
79
|
res.json({ status: 'ok', timestamp: new Date().toISOString() });
|
|
73
80
|
});
|
|
@@ -87,20 +94,62 @@ function setupRoutes(app, config, proxyManager, logger) {
|
|
|
87
94
|
}
|
|
88
95
|
});
|
|
89
96
|
}
|
|
90
|
-
async function startServer(app, config, logger) {
|
|
97
|
+
async function startServer(app, config, viteManager, proxyManager, logger) {
|
|
91
98
|
return new Promise((resolve, reject) => {
|
|
92
99
|
const port = config.server.port;
|
|
93
100
|
const host = config.server.host || '0.0.0.0';
|
|
94
101
|
const server = createServer(app);
|
|
102
|
+
// Handle WebSocket upgrade requests for Vite HMR and proxied routes
|
|
103
|
+
server.on('upgrade', (req, socket, head) => {
|
|
104
|
+
const urlPath = req.url || '/';
|
|
105
|
+
// First, check if this is a Vite HMR WebSocket request
|
|
106
|
+
const viteServers = viteManager.getAllServers();
|
|
107
|
+
for (const { path, server: viteServer } of viteServers) {
|
|
108
|
+
// Vite HMR WebSocket connections are typically at the base path or /@vite/client
|
|
109
|
+
if (urlPath.startsWith(path)) {
|
|
110
|
+
logger.verbose(`Vite HMR WebSocket upgrade: ${urlPath} (route: ${path})`);
|
|
111
|
+
// Access the underlying ws WebSocketServer instance
|
|
112
|
+
const wss = viteServer.ws.wss;
|
|
113
|
+
if (wss && wss.handleUpgrade) {
|
|
114
|
+
wss.handleUpgrade(req, socket, head, (ws) => {
|
|
115
|
+
wss.emit('connection', ws, req);
|
|
116
|
+
});
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Then check for proxied WebSocket routes
|
|
122
|
+
const proxies = proxyManager.getProxies();
|
|
123
|
+
for (const { middleware, route } of proxies) {
|
|
124
|
+
if (route.ws) {
|
|
125
|
+
// Check if the request URL matches the proxy route
|
|
126
|
+
const routePath = route.path.replace(/\/\*$/, ''); // Remove trailing /*
|
|
127
|
+
if (urlPath.startsWith(routePath)) {
|
|
128
|
+
logger.verbose(`WebSocket upgrade: ${urlPath} -> ${route.target}`);
|
|
129
|
+
// @ts-ignore - upgrade method exists on the middleware
|
|
130
|
+
middleware.upgrade(req, socket, head);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// If no route matched, close the socket
|
|
136
|
+
logger.verbose(`WebSocket upgrade failed: no matching route for ${req.url}`);
|
|
137
|
+
socket.destroy();
|
|
138
|
+
});
|
|
95
139
|
server.listen(port, host, () => {
|
|
96
140
|
logger.server(`${config.server.name || 'Reverse Proxy'} started`);
|
|
97
141
|
logger.success(`Listening on http://${host}:${port}`);
|
|
98
142
|
logger.info('');
|
|
99
143
|
logger.info('Configured routes:');
|
|
100
144
|
config.routes.forEach((route) => {
|
|
101
|
-
const target = route.target || route.static;
|
|
102
|
-
|
|
145
|
+
const target = route.target || route.static || (route.vite ? `vite:${route.vite.root}` : 'unknown');
|
|
146
|
+
const wsIndicator = route.ws ? ' (WS)' : '';
|
|
147
|
+
logger.info(` ${route.path} -> ${target}${wsIndicator}`);
|
|
103
148
|
});
|
|
149
|
+
if (viteManager.getServerCount() > 0) {
|
|
150
|
+
logger.info('');
|
|
151
|
+
logger.info(`Running ${viteManager.getServerCount()} Vite dev server(s)`);
|
|
152
|
+
}
|
|
104
153
|
logger.info('');
|
|
105
154
|
logger.info('Press Ctrl+C to stop the server');
|
|
106
155
|
resolve();
|
|
@@ -113,20 +162,21 @@ async function startServer(app, config, logger) {
|
|
|
113
162
|
reject(error);
|
|
114
163
|
}
|
|
115
164
|
});
|
|
116
|
-
|
|
165
|
+
const shutdown = async () => {
|
|
117
166
|
logger.info('');
|
|
118
167
|
logger.info('Shutting down server...');
|
|
168
|
+
await viteManager.cleanup();
|
|
119
169
|
server.close(() => {
|
|
120
170
|
logger.success('Server stopped');
|
|
121
171
|
process.exit(0);
|
|
122
172
|
});
|
|
173
|
+
};
|
|
174
|
+
process.on('SIGINT', () => {
|
|
175
|
+
shutdown();
|
|
123
176
|
});
|
|
124
177
|
process.on('SIGTERM', () => {
|
|
125
178
|
logger.info('Received SIGTERM signal');
|
|
126
|
-
|
|
127
|
-
logger.success('Server stopped');
|
|
128
|
-
process.exit(0);
|
|
129
|
-
});
|
|
179
|
+
shutdown();
|
|
130
180
|
});
|
|
131
181
|
});
|
|
132
182
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,OAA4C,MAAM,SAAS,CAAC;AACnE,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,YAAY,EAA2B,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,aAAqB,WAAW,EAAE,OAA8B;IACjG,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAGA,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAGA,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,iBA4CvF"}
|
|
@@ -25,6 +25,15 @@ export async function validateCommand(configFile, options) {
|
|
|
25
25
|
else if (route.static) {
|
|
26
26
|
logger.info(` Static: ${route.static}`);
|
|
27
27
|
}
|
|
28
|
+
else if (route.vite) {
|
|
29
|
+
logger.info(` Vite: ${route.vite.root}`);
|
|
30
|
+
if (route.vite.base) {
|
|
31
|
+
logger.info(` Base: ${route.vite.base}`);
|
|
32
|
+
}
|
|
33
|
+
if (route.vite.configFile) {
|
|
34
|
+
logger.info(` Config: ${route.vite.configFile}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
28
37
|
});
|
|
29
38
|
}
|
|
30
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAkB,EAAE,OAA8B;IACtF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE7C,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,MAAM,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAEjD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC9B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACrC,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC7C,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC5C,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;wBACb,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;oBACzC,CAAC;gBACH,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,sBAAsB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAkB,EAAE,OAA8B;IACtF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE7C,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,MAAM,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAEjD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC9B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACrC,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC7C,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC5C,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;wBACb,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;oBACzC,CAAC;gBACH,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC9C,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACtB,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC7C,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;wBACpB,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC/C,CAAC;oBACD,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;wBAC1B,MAAM,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;oBACvD,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,sBAAsB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,8 +6,8 @@ import { initCommand } from './commands/init.js';
|
|
|
6
6
|
const program = new Command();
|
|
7
7
|
program
|
|
8
8
|
.name('revx')
|
|
9
|
-
.description('
|
|
10
|
-
.version('0.
|
|
9
|
+
.description('Multi-Vite project development server')
|
|
10
|
+
.version('1.0.1');
|
|
11
11
|
program
|
|
12
12
|
.command('start')
|
|
13
13
|
.description('Start the reverse proxy server')
|
|
@@ -22,8 +22,9 @@ program
|
|
|
22
22
|
.action(validateCommand);
|
|
23
23
|
program
|
|
24
24
|
.command('init')
|
|
25
|
-
.description('Create a sample configuration file')
|
|
26
|
-
.option('--simple', 'Create a simple configuration
|
|
25
|
+
.description('Create a sample configuration file (default: Vite multi-project)')
|
|
26
|
+
.option('--simple', 'Create a simple Vite proxy configuration')
|
|
27
|
+
.option('--proxy', 'Create a reverse proxy configuration')
|
|
27
28
|
.option('--output <file>', 'Output file path', 'revx.yaml')
|
|
28
29
|
.option('--verbose', 'Verbose output')
|
|
29
30
|
.action(initCommand);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,uCAAuC,CAAC;KACpD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,QAAQ,CAAC,eAAe,EAAE,yBAAyB,EAAE,WAAW,CAAC;KACjE,MAAM,CAAC,WAAW,EAAE,gBAAgB,CAAC;KACrC,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,QAAQ,CAAC,eAAe,EAAE,yBAAyB,CAAC;KACpD,MAAM,CAAC,WAAW,EAAE,gBAAgB,CAAC;KACrC,MAAM,CAAC,eAAe,CAAC,CAAC;AAE3B,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,UAAU,EAAE,0CAA0C,CAAC;KAC9D,MAAM,CAAC,SAAS,EAAE,sCAAsC,CAAC;KACzD,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,WAAW,CAAC;KAC1D,MAAM,CAAC,WAAW,EAAE,gBAAgB,CAAC;KACrC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/utils/config.d.ts
CHANGED
|
@@ -21,10 +21,16 @@ export interface ServerConfig {
|
|
|
21
21
|
name?: string;
|
|
22
22
|
maxSockets?: number;
|
|
23
23
|
}
|
|
24
|
+
export interface ViteConfig {
|
|
25
|
+
root: string;
|
|
26
|
+
base?: string;
|
|
27
|
+
configFile?: string;
|
|
28
|
+
}
|
|
24
29
|
export interface RouteConfig {
|
|
25
30
|
path: string;
|
|
26
31
|
target?: string;
|
|
27
32
|
static?: string;
|
|
33
|
+
vite?: ViteConfig;
|
|
28
34
|
changeOrigin?: boolean;
|
|
29
35
|
pathRewrite?: Record<string, string>;
|
|
30
36
|
ws?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAC1D,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,EAAE,CAAC,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAElC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU;IAyBpC,OAAO,CAAC,0BAA0B;IAWlC,OAAO,CAAC,uBAAuB;IAgC/B,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,aAAa;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAC1D,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,EAAE,CAAC,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAElC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU;IAyBpC,OAAO,CAAC,0BAA0B;IAWlC,OAAO,CAAC,uBAAuB;IAgC/B,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,aAAa;CAuBtB"}
|
package/dist/utils/config.js
CHANGED
|
@@ -85,11 +85,16 @@ export class ConfigLoader {
|
|
|
85
85
|
}
|
|
86
86
|
const hasTarget = !!route.target;
|
|
87
87
|
const hasStatic = !!route.static;
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
const hasVite = !!route.vite;
|
|
89
|
+
const routeTypes = [hasTarget, hasStatic, hasVite].filter(Boolean).length;
|
|
90
|
+
if (routeTypes === 0) {
|
|
91
|
+
throw new Error(`Route ${route.path} must have either target, static, or vite`);
|
|
90
92
|
}
|
|
91
|
-
if (
|
|
92
|
-
throw new Error(`Route ${route.path}
|
|
93
|
+
if (routeTypes > 1) {
|
|
94
|
+
throw new Error(`Route ${route.path} can only have one of: target, static, or vite`);
|
|
95
|
+
}
|
|
96
|
+
if (hasVite && !route.vite.root) {
|
|
97
|
+
throw new Error(`Route ${route.path} vite configuration requires 'root' field`);
|
|
93
98
|
}
|
|
94
99
|
}
|
|
95
100
|
}
|
package/dist/utils/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export declare class Logger {
|
|
2
|
-
private
|
|
3
|
-
constructor(
|
|
2
|
+
private verboseMode;
|
|
3
|
+
constructor(verboseMode?: boolean);
|
|
4
|
+
isVerbose(): boolean;
|
|
4
5
|
info(message: string): void;
|
|
5
6
|
success(message: string): void;
|
|
6
7
|
error(message: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,qBAAa,MAAM;IACL,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,qBAAa,MAAM;IACL,OAAO,CAAC,WAAW;gBAAX,WAAW,GAAE,OAAe;IAEhD,SAAS,IAAI,OAAO;IAIpB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAS1C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IASxC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI7B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAK3C,OAAO,CAAC,cAAc;CAgBvB"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
export class Logger {
|
|
3
|
-
constructor(
|
|
4
|
-
this.
|
|
3
|
+
constructor(verboseMode = false) {
|
|
4
|
+
this.verboseMode = verboseMode;
|
|
5
|
+
}
|
|
6
|
+
isVerbose() {
|
|
7
|
+
return this.verboseMode;
|
|
5
8
|
}
|
|
6
9
|
info(message) {
|
|
7
10
|
console.log(chalk.blue('ℹ'), message);
|
|
@@ -16,7 +19,7 @@ export class Logger {
|
|
|
16
19
|
console.warn(chalk.yellow('⚠'), message);
|
|
17
20
|
}
|
|
18
21
|
verbose(message, data) {
|
|
19
|
-
if (this.
|
|
22
|
+
if (this.verboseMode) {
|
|
20
23
|
console.log(chalk.gray('🔍'), chalk.gray(message));
|
|
21
24
|
if (data) {
|
|
22
25
|
console.log(chalk.gray(JSON.stringify(data, null, 2)));
|
|
@@ -24,7 +27,7 @@ export class Logger {
|
|
|
24
27
|
}
|
|
25
28
|
}
|
|
26
29
|
debug(message, data) {
|
|
27
|
-
if (this.
|
|
30
|
+
if (this.verboseMode) {
|
|
28
31
|
console.log(chalk.magenta('🐛'), chalk.magenta(message));
|
|
29
32
|
if (data) {
|
|
30
33
|
console.log(chalk.magenta(JSON.stringify(data, null, 2)));
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,OAAO,MAAM;IACjB,YAAoB,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,OAAO,MAAM;IACjB,YAAoB,cAAuB,KAAK;QAA5B,gBAAW,GAAX,WAAW,CAAiB;IAAG,CAAC;IAEpD,SAAS;QACP,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,OAAe,EAAE,IAAU;QACjC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACnD,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAAU;QAC/B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YACzD,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,OAAe;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,MAAc,EAAE,IAAY;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACjF,CAAC;IAEO,cAAc,CAAC,MAAc;QACnC,QAAQ,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7B,KAAK,KAAK;gBACR,OAAO,KAAK,CAAC,KAAK,CAAC;YACrB,KAAK,MAAM;gBACT,OAAO,KAAK,CAAC,IAAI,CAAC;YACpB,KAAK,KAAK;gBACR,OAAO,KAAK,CAAC,MAAM,CAAC;YACtB,KAAK,QAAQ;gBACX,OAAO,KAAK,CAAC,GAAG,CAAC;YACnB,KAAK,OAAO;gBACV,OAAO,KAAK,CAAC,OAAO,CAAC;YACvB;gBACE,OAAO,KAAK,CAAC,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;CACF"}
|
package/dist/utils/proxy.d.ts
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
|
+
import { RequestHandler } from 'http-proxy-middleware';
|
|
1
2
|
import { RouteConfig } from './config.js';
|
|
2
3
|
import { Logger } from './logger.js';
|
|
3
|
-
|
|
4
|
+
export interface ProxyInfo {
|
|
5
|
+
middleware: RequestHandler;
|
|
6
|
+
route: RouteConfig;
|
|
7
|
+
}
|
|
4
8
|
export declare class ProxyManager {
|
|
5
9
|
private logger;
|
|
10
|
+
private proxies;
|
|
6
11
|
constructor(logger: Logger);
|
|
7
|
-
createProxyMiddleware(route: RouteConfig):
|
|
12
|
+
createProxyMiddleware(route: RouteConfig): RequestHandler;
|
|
13
|
+
getProxies(): ProxyInfo[];
|
|
8
14
|
}
|
|
9
15
|
//# sourceMappingURL=proxy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/utils/proxy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/utils/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,cAAc,CAAC;IAC3B,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,qBAAa,YAAY;IAGX,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,OAAO,CAAmB;gBAEd,MAAM,EAAE,MAAM;IAElC,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,cAAc;IAqDzD,UAAU,IAAI,SAAS,EAAE;CAG1B"}
|
package/dist/utils/proxy.js
CHANGED
|
@@ -2,6 +2,7 @@ import { createProxyMiddleware } from 'http-proxy-middleware';
|
|
|
2
2
|
export class ProxyManager {
|
|
3
3
|
constructor(logger) {
|
|
4
4
|
this.logger = logger;
|
|
5
|
+
this.proxies = [];
|
|
5
6
|
}
|
|
6
7
|
createProxyMiddleware(route) {
|
|
7
8
|
const options = {
|
|
@@ -39,8 +40,17 @@ export class ProxyManager {
|
|
|
39
40
|
}
|
|
40
41
|
}
|
|
41
42
|
};
|
|
43
|
+
const middleware = createProxyMiddleware(options);
|
|
44
|
+
// Store proxy info for WebSocket upgrade handling
|
|
45
|
+
this.proxies.push({ middleware, route });
|
|
42
46
|
this.logger.info(`Proxy configured: ${route.path} -> ${route.target}`);
|
|
43
|
-
|
|
47
|
+
if (route.ws) {
|
|
48
|
+
this.logger.verbose(`WebSocket enabled for: ${route.path}`);
|
|
49
|
+
}
|
|
50
|
+
return middleware;
|
|
51
|
+
}
|
|
52
|
+
getProxies() {
|
|
53
|
+
return this.proxies;
|
|
44
54
|
}
|
|
45
55
|
}
|
|
46
56
|
//# sourceMappingURL=proxy.js.map
|
package/dist/utils/proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/utils/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/utils/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAA2B,MAAM,uBAAuB,CAAC;AAUvF,MAAM,OAAO,YAAY;IAGvB,YAAoB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QAF1B,YAAO,GAAgB,EAAE,CAAC;IAEG,CAAC;IAEtC,qBAAqB,CAAC,KAAkB;QACtC,MAAM,OAAO,GAAY;YACvB,UAAU,EAAE,KAAK,CAAC,IAAI;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI;YACxC,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,KAAK;YACrB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,qBAAqB,EAAE,IAAI;YAC3B,WAAW,EAAE,IAAI;YAEjB,EAAE,EAAE;gBACF,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;oBAC1B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE;wBACnC,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,IAAI,EAAE,GAAG,CAAC,GAAG;wBACb,MAAM,EAAE,KAAK,CAAC,MAAM;qBACrB,CAAC,CAAC;gBACL,CAAC;gBAED,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;oBAC/B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE;wBACpC,UAAU,EAAE,QAAQ,CAAC,UAAU;wBAC/B,IAAI,EAAE,GAAG,CAAC,GAAG;qBACd,CAAC,CAAC;gBACL,CAAC;gBAED,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;oBACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBACjD,MAAM,SAAS,GAAG,GAAqB,CAAC;oBACxC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;wBAC3B,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBACnE,CAAC;oBACD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;wBAC3B,KAAK,EAAE,aAAa;wBACpB,OAAO,EAAE,yBAAyB;qBACnC,CAAC,CAAC,CAAC;gBACN,CAAC;aACF;SACF,CAAC;QAEF,MAAM,UAAU,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAElD,kDAAkD;QAClD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAEzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,0BAA0B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ViteDevServer } from 'vite';
|
|
2
|
+
import { RequestHandler } from 'express';
|
|
3
|
+
import { RouteConfig } from './config.js';
|
|
4
|
+
import { Logger } from './logger.js';
|
|
5
|
+
export declare class ViteMiddlewareManager {
|
|
6
|
+
private logger;
|
|
7
|
+
private viteServers;
|
|
8
|
+
constructor(logger: Logger);
|
|
9
|
+
createViteMiddleware(route: RouteConfig): Promise<RequestHandler>;
|
|
10
|
+
cleanup(): Promise<void>;
|
|
11
|
+
getServer(path: string): ViteDevServer | undefined;
|
|
12
|
+
getServerCount(): number;
|
|
13
|
+
getAllServers(): Array<{
|
|
14
|
+
path: string;
|
|
15
|
+
server: ViteDevServer;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=vite-middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-middleware.d.ts","sourceRoot":"","sources":["../../src/utils/vite-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA8B,MAAM,MAAM,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,qBAAa,qBAAqB;IAGpB,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,WAAW,CAAyC;gBAExC,MAAM,EAAE,MAAM;IAE5B,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IA+CjE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIlD,cAAc,IAAI,MAAM;IAIxB,aAAa,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE,CAAC;CAMhE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { createServer } from 'vite';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { resolve } from 'path';
|
|
4
|
+
export class ViteMiddlewareManager {
|
|
5
|
+
constructor(logger) {
|
|
6
|
+
this.logger = logger;
|
|
7
|
+
this.viteServers = new Map();
|
|
8
|
+
}
|
|
9
|
+
async createViteMiddleware(route) {
|
|
10
|
+
if (!route.vite) {
|
|
11
|
+
throw new Error('Route does not have vite configuration');
|
|
12
|
+
}
|
|
13
|
+
const rootPath = resolve(process.cwd(), route.vite.root);
|
|
14
|
+
if (!existsSync(rootPath)) {
|
|
15
|
+
this.logger.error(`Vite root directory does not exist: ${rootPath}`);
|
|
16
|
+
throw new Error(`Vite root directory not found: ${rootPath}`);
|
|
17
|
+
}
|
|
18
|
+
this.logger.info(`Creating Vite middleware: ${route.path} -> ${rootPath}`);
|
|
19
|
+
const viteConfig = {
|
|
20
|
+
root: rootPath,
|
|
21
|
+
base: route.vite.base || route.path,
|
|
22
|
+
configFile: route.vite.configFile,
|
|
23
|
+
server: {
|
|
24
|
+
middlewareMode: true,
|
|
25
|
+
hmr: {
|
|
26
|
+
// Use the parent server's port for HMR
|
|
27
|
+
clientPort: undefined,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
// Suppress Vite's own logging since we're using our logger
|
|
31
|
+
logLevel: this.logger.isVerbose() ? 'info' : 'warn',
|
|
32
|
+
};
|
|
33
|
+
try {
|
|
34
|
+
const vite = await createServer(viteConfig);
|
|
35
|
+
this.viteServers.set(route.path, vite);
|
|
36
|
+
this.logger.verbose(`Vite server created for ${route.path}`, {
|
|
37
|
+
root: rootPath,
|
|
38
|
+
base: viteConfig.base,
|
|
39
|
+
});
|
|
40
|
+
return vite.middlewares;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error instanceof Error) {
|
|
44
|
+
this.logger.error(`Failed to create Vite server for ${route.path}: ${error.message}`);
|
|
45
|
+
}
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async cleanup() {
|
|
50
|
+
this.logger.info('Closing Vite servers...');
|
|
51
|
+
const closePromises = Array.from(this.viteServers.values()).map((vite) => vite.close());
|
|
52
|
+
await Promise.all(closePromises);
|
|
53
|
+
this.viteServers.clear();
|
|
54
|
+
this.logger.verbose('All Vite servers closed');
|
|
55
|
+
}
|
|
56
|
+
getServer(path) {
|
|
57
|
+
return this.viteServers.get(path);
|
|
58
|
+
}
|
|
59
|
+
getServerCount() {
|
|
60
|
+
return this.viteServers.size;
|
|
61
|
+
}
|
|
62
|
+
getAllServers() {
|
|
63
|
+
return Array.from(this.viteServers.entries()).map(([path, server]) => ({
|
|
64
|
+
path,
|
|
65
|
+
server,
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=vite-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-middleware.js","sourceRoot":"","sources":["../../src/utils/vite-middleware.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@infodb/revx",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Multi-Vite project development server - Host multiple Vite apps on a single port with unified routing",
|
|
5
5
|
"homepage": "https://github.com/tamuto/infodb-cli/",
|
|
6
6
|
"bugs": "https://github.com/tamuto/infodb-cli/issues",
|
|
7
7
|
"repository": {
|
|
@@ -10,12 +10,16 @@
|
|
|
10
10
|
"directory": "revx"
|
|
11
11
|
},
|
|
12
12
|
"keywords": [
|
|
13
|
+
"vite",
|
|
14
|
+
"multi-project",
|
|
15
|
+
"monorepo",
|
|
16
|
+
"dev-server",
|
|
17
|
+
"vite-middleware",
|
|
18
|
+
"hmr",
|
|
13
19
|
"reverse-proxy",
|
|
14
|
-
"
|
|
15
|
-
"cli",
|
|
20
|
+
"webpack",
|
|
16
21
|
"express",
|
|
17
|
-
"yaml"
|
|
18
|
-
"http-proxy"
|
|
22
|
+
"yaml"
|
|
19
23
|
],
|
|
20
24
|
"author": "tamuto <tamuto@infodb.jp>",
|
|
21
25
|
"license": "MIT",
|
|
@@ -39,6 +43,7 @@
|
|
|
39
43
|
"express": "^5.1.0",
|
|
40
44
|
"http-proxy-middleware": "^3.0.3",
|
|
41
45
|
"morgan": "^1.10.0",
|
|
46
|
+
"vite": "^6.0.7",
|
|
42
47
|
"yaml": "^2.8.1"
|
|
43
48
|
},
|
|
44
49
|
"devDependencies": {
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# revx.mixed.yaml - Mixed Development Servers Example
|
|
2
|
+
# Use this when you have Vite apps alongside webpack/Parcel/other dev servers
|
|
3
|
+
|
|
4
|
+
# Server settings
|
|
5
|
+
server:
|
|
6
|
+
port: 3000
|
|
7
|
+
host: 0.0.0.0
|
|
8
|
+
name: "Mixed Dev Server (Vite + webpack)"
|
|
9
|
+
maxSockets: 512
|
|
10
|
+
|
|
11
|
+
# Global configuration
|
|
12
|
+
global:
|
|
13
|
+
cors:
|
|
14
|
+
enabled: true
|
|
15
|
+
origin: "*"
|
|
16
|
+
|
|
17
|
+
logging:
|
|
18
|
+
enabled: true
|
|
19
|
+
format: "dev"
|
|
20
|
+
|
|
21
|
+
# Route definitions
|
|
22
|
+
routes:
|
|
23
|
+
# New Vite app (native middleware)
|
|
24
|
+
- path: "/new-app"
|
|
25
|
+
vite:
|
|
26
|
+
root: "./apps/new-app"
|
|
27
|
+
base: "/new-app"
|
|
28
|
+
|
|
29
|
+
# Another Vite app
|
|
30
|
+
- path: "/dashboard"
|
|
31
|
+
vite:
|
|
32
|
+
root: "./apps/dashboard"
|
|
33
|
+
base: "/dashboard"
|
|
34
|
+
|
|
35
|
+
# Legacy webpack dev server (reverse proxy)
|
|
36
|
+
- path: "/legacy/*"
|
|
37
|
+
target: "http://localhost:8080"
|
|
38
|
+
ws: true # Enable WebSocket for webpack HMR
|
|
39
|
+
changeOrigin: true
|
|
40
|
+
|
|
41
|
+
# Parcel dev server (reverse proxy)
|
|
42
|
+
- path: "/old-app/*"
|
|
43
|
+
target: "http://localhost:1234"
|
|
44
|
+
ws: true
|
|
45
|
+
changeOrigin: true
|
|
46
|
+
|
|
47
|
+
# Backend API
|
|
48
|
+
- path: "/api/*"
|
|
49
|
+
target: "http://localhost:4000"
|
|
50
|
+
changeOrigin: true
|
|
51
|
+
pathRewrite:
|
|
52
|
+
"^/api": ""
|
|
53
|
+
|
|
54
|
+
# Static documentation
|
|
55
|
+
- path: "/docs"
|
|
56
|
+
static: "./public/docs"
|
|
57
|
+
|
|
58
|
+
# Usage:
|
|
59
|
+
# 1. Start webpack dev server: cd apps/legacy && npm run dev (on :8080)
|
|
60
|
+
# 2. Start Parcel: cd apps/old-app && npm run dev (on :1234)
|
|
61
|
+
# 3. Start backend API: cd api && npm run dev (on :4000)
|
|
62
|
+
# 4. Start revx: revx start revx.mixed.yaml
|
|
63
|
+
# 5. Access all apps at http://localhost:3000
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# revx.vite.yaml - Multi-Vite Project Configuration Example
|
|
2
|
+
|
|
3
|
+
# Server settings
|
|
4
|
+
server:
|
|
5
|
+
port: 3000
|
|
6
|
+
host: 0.0.0.0
|
|
7
|
+
name: "Multi-Vite Dev Server"
|
|
8
|
+
# Increase max sockets for better performance with Vite
|
|
9
|
+
maxSockets: 512
|
|
10
|
+
|
|
11
|
+
# Global configuration
|
|
12
|
+
global:
|
|
13
|
+
# CORS settings
|
|
14
|
+
cors:
|
|
15
|
+
enabled: true
|
|
16
|
+
origin: "*"
|
|
17
|
+
methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"]
|
|
18
|
+
credentials: true
|
|
19
|
+
|
|
20
|
+
# Logging settings
|
|
21
|
+
logging:
|
|
22
|
+
enabled: true
|
|
23
|
+
format: "dev" # dev format is good for development
|
|
24
|
+
|
|
25
|
+
# Route definitions
|
|
26
|
+
routes:
|
|
27
|
+
# Example 1: Vite project 1 (SPA at /app1)
|
|
28
|
+
- path: "/app1"
|
|
29
|
+
vite:
|
|
30
|
+
root: "./projects/app1"
|
|
31
|
+
base: "/app1"
|
|
32
|
+
# Optional: specify custom vite config file
|
|
33
|
+
# configFile: "./projects/app1/vite.config.ts"
|
|
34
|
+
|
|
35
|
+
# Example 2: Vite project 2 (SPA at /app2)
|
|
36
|
+
- path: "/app2"
|
|
37
|
+
vite:
|
|
38
|
+
root: "./projects/app2"
|
|
39
|
+
base: "/app2"
|
|
40
|
+
|
|
41
|
+
# Example 3: Backend API proxy
|
|
42
|
+
- path: "/api/*"
|
|
43
|
+
target: "http://localhost:4000"
|
|
44
|
+
changeOrigin: true
|
|
45
|
+
pathRewrite:
|
|
46
|
+
"^/api": ""
|
|
47
|
+
|
|
48
|
+
# Example 4: Admin dashboard (static files)
|
|
49
|
+
- path: "/admin/*"
|
|
50
|
+
static: "./admin/dist"
|
|
51
|
+
|
|
52
|
+
# Example 5: Root Vite project (catches remaining routes)
|
|
53
|
+
# - path: "/*"
|
|
54
|
+
# vite:
|
|
55
|
+
# root: "./projects/main"
|
|
56
|
+
# base: "/"
|