@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 CHANGED
@@ -1,58 +1,124 @@
1
1
  # @infodb/revx
2
2
 
3
- Reverse proxy CLI tool with YAML configuration. Built with Express and http-proxy-middleware.
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
- - YAML-based configuration
8
- - Simple reverse proxy setup
9
- - **Automatic route sorting** - Routes are automatically sorted by specificity (longest paths first)
10
- - WebSocket support (critical for HMR)
11
- - Static file serving
12
- - CORS configuration
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. Create a configuration file:
73
+ 1. Install revx in your monorepo:
30
74
 
31
75
  ```bash
32
- revx init
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 example configuration.
85
+ This creates a `revx.yaml` file with Vite multi-project configuration.
36
86
 
37
- 2. Edit `revx.yaml` to configure your routes:
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
- 3. Start the proxy server:
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
- ### Vite Development Server Issues
570
+ ### When to use each route type?
365
571
 
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:
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
- ```bash
369
- # Terminal 1: Build and watch
370
- vite build --watch
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
- # Terminal 2: Serve with revx
373
- revx start
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
- This approach serves pre-built files and avoids proxy-related issues.
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
 
@@ -1,5 +1,6 @@
1
1
  export declare function initCommand(options: {
2
2
  simple?: boolean;
3
+ proxy?: boolean;
3
4
  output?: string;
4
5
  verbose?: boolean;
5
6
  }): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA2EA,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,iBAwBlG"}
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"}
@@ -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
- const content = options.simple ? SIMPLE_CONFIG : SAMPLE_CONFIG;
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 reverse proxy settings');
87
- logger.info(`Start the proxy with: revx start ${outputPath}`);
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,OAAiE;IACjG,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,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC;QAC/D,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,wDAAwD,CAAC,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,oCAAoC,UAAU,EAAE,CAAC,CAAC;IAChE,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
+ {"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":"AAWA,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,YAAc,EAAE,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,iBAyBlG"}
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"}
@@ -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.forEach((route) => {
63
- if (route.static) {
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
- logger.info(` ${route.path} -> ${target}`);
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
- process.on('SIGINT', () => {
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
- server.close(() => {
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":"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"}
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,iBAoCvF"}
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('Reverse proxy CLI tool with YAML configuration')
10
- .version('0.4.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 file')
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,gDAAgD,CAAC;KAC7D,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,oCAAoC,CAAC;KACjD,MAAM,CAAC,UAAU,EAAE,oCAAoC,CAAC;KACxD,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"}
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"}
@@ -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;CAgBtB"}
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"}
@@ -85,11 +85,16 @@ export class ConfigLoader {
85
85
  }
86
86
  const hasTarget = !!route.target;
87
87
  const hasStatic = !!route.static;
88
- if (!hasTarget && !hasStatic) {
89
- throw new Error(`Route ${route.path} must have either target or static`);
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 (hasTarget && hasStatic) {
92
- throw new Error(`Route ${route.path} cannot have both target and static`);
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
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;AAmDxB,MAAM,OAAO,YAAY;IACvB,YAAoB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAEtC,IAAI,CAAC,UAAkB;QACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;QAEpD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEtE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,eAAe,GAAG,IAAI,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAe,CAAC;YAEzD,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC5B,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,0BAA0B,CAAC,OAAe;QAChD,OAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,mCAAmC,OAAO,sBAAsB,CAAC,CAAC;gBACtF,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,uBAAuB,CAAC,MAAkB;QAChD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,OAAO;QACT,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;YACrB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;YAErB,yBAAyB;YACzB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YAC/C,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,UAAU,CAAC;YACpB,CAAC;YAED,uCAAuC;YACvC,MAAM,cAAc,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACzD,MAAM,cAAc,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACzD,MAAM,YAAY,GAAG,cAAc,GAAG,cAAc,CAAC;YACrD,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,YAAY,CAAC;YACtB,CAAC;YAED,aAAa;YACb,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,8BAA8B,EAAE;YAClD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IAEO,cAAc,CAAC,MAAkB;QACvC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,KAAkB;QACtC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QACjC,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QACjC,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QAE7B,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAE1E,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC,IAAI,2CAA2C,CAAC,CAAC;QAClF,CAAC;QAED,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC,IAAI,gDAAgD,CAAC,CAAC;QACvF,CAAC;QAED,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,IAAK,CAAC,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC,IAAI,2CAA2C,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;CACF"}
@@ -1,6 +1,7 @@
1
1
  export declare class Logger {
2
- private isVerbose;
3
- constructor(isVerbose?: boolean);
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,SAAS;gBAAT,SAAS,GAAE,OAAe;IAE9C,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"}
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"}
@@ -1,7 +1,10 @@
1
1
  import chalk from 'chalk';
2
2
  export class Logger {
3
- constructor(isVerbose = false) {
4
- this.isVerbose = isVerbose;
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.isVerbose) {
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.isVerbose) {
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)));
@@ -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,YAAqB,KAAK;QAA1B,cAAS,GAAT,SAAS,CAAiB;IAAG,CAAC;IAElD,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,SAAS,EAAE,CAAC;YACnB,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,SAAS,EAAE,CAAC;YACnB,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"}
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"}
@@ -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
- import { ServerResponse } from 'http';
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): import("http-proxy-middleware").RequestHandler<import("http").IncomingMessage, ServerResponse<import("http").IncomingMessage>, (err?: any) => void>;
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":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAEtC,qBAAa,YAAY;IACX,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAElC,qBAAqB,CAAC,KAAK,EAAE,WAAW;CA2CzC"}
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"}
@@ -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
- return createProxyMiddleware(options);
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
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/utils/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAW,MAAM,uBAAuB,CAAC;AAKvE,MAAM,OAAO,YAAY;IACvB,YAAoB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,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,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;CACF"}
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.0",
4
- "description": "Reverse proxy CLI tool with YAML configuration",
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
- "proxy",
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: "/"