@infodb/revx 0.4.0 → 1.0.0
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 +273 -26
- 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 +47 -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 +14 -0
- package/dist/utils/vite-middleware.d.ts.map +1 -0
- package/dist/utils/vite-middleware.js +63 -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]`
|
|
@@ -191,6 +257,46 @@ routes:
|
|
|
191
257
|
"^/api": ""
|
|
192
258
|
```
|
|
193
259
|
|
|
260
|
+
#### Vite Middleware (NEW!)
|
|
261
|
+
|
|
262
|
+
Native Vite integration using middleware mode - the best way to serve multiple Vite projects:
|
|
263
|
+
|
|
264
|
+
```yaml
|
|
265
|
+
routes:
|
|
266
|
+
- path: "/app1"
|
|
267
|
+
vite:
|
|
268
|
+
root: "./projects/app1"
|
|
269
|
+
base: "/app1"
|
|
270
|
+
configFile: "./projects/app1/vite.config.ts" # optional
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
**Why use Vite middleware instead of proxy?**
|
|
274
|
+
- Full HMR support without WebSocket configuration
|
|
275
|
+
- No proxy overhead - native Vite performance
|
|
276
|
+
- Multiple Vite projects on a single port
|
|
277
|
+
- Better error messages and development experience
|
|
278
|
+
|
|
279
|
+
**Requirements:**
|
|
280
|
+
- Vite must be installed: `npm install vite` or `pnpm add vite`
|
|
281
|
+
- Each Vite project must have its own directory with a valid configuration
|
|
282
|
+
|
|
283
|
+
**Multiple Vite projects example:**
|
|
284
|
+
```yaml
|
|
285
|
+
routes:
|
|
286
|
+
- path: "/dashboard"
|
|
287
|
+
vite:
|
|
288
|
+
root: "./apps/dashboard"
|
|
289
|
+
base: "/dashboard"
|
|
290
|
+
|
|
291
|
+
- path: "/admin"
|
|
292
|
+
vite:
|
|
293
|
+
root: "./apps/admin"
|
|
294
|
+
base: "/admin"
|
|
295
|
+
|
|
296
|
+
- path: "/api/*"
|
|
297
|
+
target: "http://localhost:4000"
|
|
298
|
+
```
|
|
299
|
+
|
|
194
300
|
#### WebSocket Proxy
|
|
195
301
|
|
|
196
302
|
WebSocket support is critical for Hot Module Replacement (HMR) with development servers like Vite:
|
|
@@ -332,6 +438,106 @@ routes:
|
|
|
332
438
|
changeOrigin: true
|
|
333
439
|
```
|
|
334
440
|
|
|
441
|
+
### Multi-Vite Project Setup (Recommended)
|
|
442
|
+
|
|
443
|
+
```yaml
|
|
444
|
+
server:
|
|
445
|
+
port: 3000
|
|
446
|
+
name: "Multi-App Dev Server"
|
|
447
|
+
maxSockets: 512
|
|
448
|
+
|
|
449
|
+
global:
|
|
450
|
+
cors:
|
|
451
|
+
enabled: true
|
|
452
|
+
origin: "*"
|
|
453
|
+
|
|
454
|
+
routes:
|
|
455
|
+
# App 1 - Customer Portal (Vite)
|
|
456
|
+
- path: "/portal"
|
|
457
|
+
vite:
|
|
458
|
+
root: "./apps/portal"
|
|
459
|
+
base: "/portal"
|
|
460
|
+
|
|
461
|
+
# App 2 - Admin Dashboard (Vite)
|
|
462
|
+
- path: "/admin"
|
|
463
|
+
vite:
|
|
464
|
+
root: "./apps/admin"
|
|
465
|
+
base: "/admin"
|
|
466
|
+
|
|
467
|
+
# Shared API backend
|
|
468
|
+
- path: "/api/*"
|
|
469
|
+
target: "http://localhost:4000"
|
|
470
|
+
pathRewrite:
|
|
471
|
+
"^/api": ""
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
This setup allows you to:
|
|
475
|
+
- Run multiple Vite projects on one port
|
|
476
|
+
- Share a single backend API across all apps
|
|
477
|
+
- Get full HMR support for all apps
|
|
478
|
+
- Develop in a monorepo-friendly way
|
|
479
|
+
|
|
480
|
+
### Mixed Development Servers (Vite + webpack)
|
|
481
|
+
|
|
482
|
+
Migrate gradually or mix different build tools:
|
|
483
|
+
|
|
484
|
+
```yaml
|
|
485
|
+
server:
|
|
486
|
+
port: 3000
|
|
487
|
+
maxSockets: 512
|
|
488
|
+
|
|
489
|
+
routes:
|
|
490
|
+
# New app - using Vite
|
|
491
|
+
- path: "/new-app"
|
|
492
|
+
vite:
|
|
493
|
+
root: "./apps/new-app"
|
|
494
|
+
base: "/new-app"
|
|
495
|
+
|
|
496
|
+
# Legacy app - still on webpack dev server
|
|
497
|
+
- path: "/legacy/*"
|
|
498
|
+
target: "http://localhost:8080"
|
|
499
|
+
ws: true # Enable WebSocket for webpack HMR
|
|
500
|
+
changeOrigin: true
|
|
501
|
+
|
|
502
|
+
# Another legacy app - using Parcel
|
|
503
|
+
- path: "/old-dashboard/*"
|
|
504
|
+
target: "http://localhost:1234"
|
|
505
|
+
ws: true
|
|
506
|
+
changeOrigin: true
|
|
507
|
+
|
|
508
|
+
# Backend API
|
|
509
|
+
- path: "/api/*"
|
|
510
|
+
target: "http://localhost:4000"
|
|
511
|
+
pathRewrite:
|
|
512
|
+
"^/api": ""
|
|
513
|
+
|
|
514
|
+
# Static documentation
|
|
515
|
+
- path: "/docs"
|
|
516
|
+
static: "./public/docs"
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
**Usage:**
|
|
520
|
+
```bash
|
|
521
|
+
# Terminal 1: Start webpack dev server
|
|
522
|
+
cd apps/legacy && npm run dev # runs on :8080
|
|
523
|
+
|
|
524
|
+
# Terminal 2: Start Parcel
|
|
525
|
+
cd apps/old-dashboard && npm run dev # runs on :1234
|
|
526
|
+
|
|
527
|
+
# Terminal 3: Start backend
|
|
528
|
+
cd api && npm run dev # runs on :4000
|
|
529
|
+
|
|
530
|
+
# Terminal 4: Start revx (unifies everything)
|
|
531
|
+
npx revx start
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
Now access everything at `http://localhost:3000`:
|
|
535
|
+
- `/new-app` - Vite with native HMR ⚡
|
|
536
|
+
- `/legacy` - webpack via proxy 🔌
|
|
537
|
+
- `/old-dashboard` - Parcel via proxy 🔌
|
|
538
|
+
- `/api` - Backend API 🔌
|
|
539
|
+
- `/docs` - Static files 📁
|
|
540
|
+
|
|
335
541
|
### Vite Build Watch Mode
|
|
336
542
|
|
|
337
543
|
```yaml
|
|
@@ -361,19 +567,60 @@ revx start
|
|
|
361
567
|
|
|
362
568
|
## Troubleshooting
|
|
363
569
|
|
|
364
|
-
###
|
|
570
|
+
### When to use each route type?
|
|
365
571
|
|
|
366
|
-
|
|
572
|
+
**Vite middleware (`vite` config) - RECOMMENDED for Vite projects:**
|
|
573
|
+
```yaml
|
|
574
|
+
- path: "/app"
|
|
575
|
+
vite:
|
|
576
|
+
root: "./apps/myapp"
|
|
577
|
+
```
|
|
578
|
+
- ✅ Best for: Your own Vite projects in the monorepo
|
|
579
|
+
- ✅ Native HMR with no configuration
|
|
580
|
+
- ✅ No proxy overhead
|
|
581
|
+
- ✅ Full Vite dev server features
|
|
367
582
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
583
|
+
**Reverse proxy (`target` config) - For external/non-Vite servers:**
|
|
584
|
+
```yaml
|
|
585
|
+
- path: "/legacy"
|
|
586
|
+
target: "http://localhost:8080"
|
|
587
|
+
ws: true
|
|
588
|
+
```
|
|
589
|
+
- ✅ Best for: webpack, Parcel, external APIs, legacy apps
|
|
590
|
+
- ✅ Preserve HMR via WebSocket proxy
|
|
591
|
+
- ✅ Don't need to modify the target server
|
|
371
592
|
|
|
372
|
-
|
|
373
|
-
|
|
593
|
+
**Static files (`static` config) - For built assets:**
|
|
594
|
+
```yaml
|
|
595
|
+
- path: "/docs"
|
|
596
|
+
static: "./dist"
|
|
374
597
|
```
|
|
598
|
+
- ✅ Best for: Documentation, pre-built assets, `vite build --watch` output
|
|
599
|
+
- ✅ No processing overhead
|
|
600
|
+
- ✅ Production-like serving
|
|
601
|
+
|
|
602
|
+
### Common Issues
|
|
375
603
|
|
|
376
|
-
|
|
604
|
+
**Error: "Vite root directory not found"**
|
|
605
|
+
- Check that the `root` path in your config exists
|
|
606
|
+
- Use relative paths from where you run `revx start`
|
|
607
|
+
- Example: If config is in project root, use `./apps/myapp` not `/apps/myapp`
|
|
608
|
+
|
|
609
|
+
**Multiple Vite servers slow to start**
|
|
610
|
+
- This is normal - each Vite server initializes independently
|
|
611
|
+
- Use `--verbose` to see progress
|
|
612
|
+
- First startup is slower (dependency pre-bundling)
|
|
613
|
+
|
|
614
|
+
**HMR not working for proxied webpack app**
|
|
615
|
+
- Make sure `ws: true` is set in the route config
|
|
616
|
+
- Check that the webpack dev server is actually running
|
|
617
|
+
- Verify WebSocket connection in browser dev tools
|
|
618
|
+
- No additional webpack configuration needed - revx handles WebSocket upgrade automatically
|
|
619
|
+
|
|
620
|
+
**Does webpack need special configuration?**
|
|
621
|
+
- No! Just add `ws: true` in revx config
|
|
622
|
+
- revx automatically handles WebSocket upgrade requests
|
|
623
|
+
- Your existing webpack dev server config works as-is
|
|
377
624
|
|
|
378
625
|
### Performance Issues with Dev Servers
|
|
379
626
|
|
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,45 @@ 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 proxied routes
|
|
103
|
+
server.on('upgrade', (req, socket, head) => {
|
|
104
|
+
const proxies = proxyManager.getProxies();
|
|
105
|
+
for (const { middleware, route } of proxies) {
|
|
106
|
+
if (route.ws) {
|
|
107
|
+
// Check if the request URL matches the proxy route
|
|
108
|
+
const urlPath = req.url || '/';
|
|
109
|
+
const routePath = route.path.replace(/\/\*$/, ''); // Remove trailing /*
|
|
110
|
+
if (urlPath.startsWith(routePath)) {
|
|
111
|
+
logger.verbose(`WebSocket upgrade: ${urlPath} -> ${route.target}`);
|
|
112
|
+
// @ts-ignore - upgrade method exists on the middleware
|
|
113
|
+
middleware.upgrade(req, socket, head);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// If no proxy matched, close the socket
|
|
119
|
+
logger.verbose(`WebSocket upgrade failed: no matching route for ${req.url}`);
|
|
120
|
+
socket.destroy();
|
|
121
|
+
});
|
|
95
122
|
server.listen(port, host, () => {
|
|
96
123
|
logger.server(`${config.server.name || 'Reverse Proxy'} started`);
|
|
97
124
|
logger.success(`Listening on http://${host}:${port}`);
|
|
98
125
|
logger.info('');
|
|
99
126
|
logger.info('Configured routes:');
|
|
100
127
|
config.routes.forEach((route) => {
|
|
101
|
-
const target = route.target || route.static;
|
|
102
|
-
|
|
128
|
+
const target = route.target || route.static || (route.vite ? `vite:${route.vite.root}` : 'unknown');
|
|
129
|
+
const wsIndicator = route.ws ? ' (WS)' : '';
|
|
130
|
+
logger.info(` ${route.path} -> ${target}${wsIndicator}`);
|
|
103
131
|
});
|
|
132
|
+
if (viteManager.getServerCount() > 0) {
|
|
133
|
+
logger.info('');
|
|
134
|
+
logger.info(`Running ${viteManager.getServerCount()} Vite dev server(s)`);
|
|
135
|
+
}
|
|
104
136
|
logger.info('');
|
|
105
137
|
logger.info('Press Ctrl+C to stop the server');
|
|
106
138
|
resolve();
|
|
@@ -113,20 +145,21 @@ async function startServer(app, config, logger) {
|
|
|
113
145
|
reject(error);
|
|
114
146
|
}
|
|
115
147
|
});
|
|
116
|
-
|
|
148
|
+
const shutdown = async () => {
|
|
117
149
|
logger.info('');
|
|
118
150
|
logger.info('Shutting down server...');
|
|
151
|
+
await viteManager.cleanup();
|
|
119
152
|
server.close(() => {
|
|
120
153
|
logger.success('Server stopped');
|
|
121
154
|
process.exit(0);
|
|
122
155
|
});
|
|
156
|
+
};
|
|
157
|
+
process.on('SIGINT', () => {
|
|
158
|
+
shutdown();
|
|
123
159
|
});
|
|
124
160
|
process.on('SIGTERM', () => {
|
|
125
161
|
logger.info('Received SIGTERM signal');
|
|
126
|
-
|
|
127
|
-
logger.success('Server stopped');
|
|
128
|
-
process.exit(0);
|
|
129
|
-
});
|
|
162
|
+
shutdown();
|
|
130
163
|
});
|
|
131
164
|
});
|
|
132
165
|
}
|
|
@@ -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.0');
|
|
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,14 @@
|
|
|
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
|
+
}
|
|
14
|
+
//# 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;CAGzB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
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
|
+
}
|
|
63
|
+
//# 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.0",
|
|
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: "/"
|