@dangao/bun-server 1.9.0 → 1.12.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 +79 -6
- package/dist/cache/cache-module.d.ts +6 -0
- package/dist/cache/cache-module.d.ts.map +1 -1
- package/dist/client/generator.d.ts +16 -0
- package/dist/client/generator.d.ts.map +1 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/runtime.d.ts +15 -0
- package/dist/client/runtime.d.ts.map +1 -0
- package/dist/client/types.d.ts +36 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/config/config-module.d.ts +7 -0
- package/dist/config/config-module.d.ts.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/service.d.ts +13 -0
- package/dist/config/service.d.ts.map +1 -1
- package/dist/config/types.d.ts +10 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/core/application.d.ts +7 -0
- package/dist/core/application.d.ts.map +1 -1
- package/dist/core/apply-decorators.d.ts +6 -0
- package/dist/core/apply-decorators.d.ts.map +1 -0
- package/dist/core/cluster.d.ts +47 -0
- package/dist/core/cluster.d.ts.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/server.d.ts +8 -0
- package/dist/core/server.d.ts.map +1 -1
- package/dist/dashboard/controller.d.ts +55 -0
- package/dist/dashboard/controller.d.ts.map +1 -0
- package/dist/dashboard/dashboard-extension.d.ts +20 -0
- package/dist/dashboard/dashboard-extension.d.ts.map +1 -0
- package/dist/dashboard/dashboard-module.d.ts +13 -0
- package/dist/dashboard/dashboard-module.d.ts.map +1 -0
- package/dist/dashboard/index.d.ts +4 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/types.d.ts +16 -0
- package/dist/dashboard/types.d.ts.map +1 -0
- package/dist/dashboard/ui.d.ts +7 -0
- package/dist/dashboard/ui.d.ts.map +1 -0
- package/dist/database/database-module.d.ts +7 -0
- package/dist/database/database-module.d.ts.map +1 -1
- package/dist/debug/debug-module.d.ts +13 -0
- package/dist/debug/debug-module.d.ts.map +1 -0
- package/dist/debug/debug-ui-middleware.d.ts +8 -0
- package/dist/debug/debug-ui-middleware.d.ts.map +1 -0
- package/dist/debug/index.d.ts +5 -0
- package/dist/debug/index.d.ts.map +1 -0
- package/dist/debug/middleware.d.ts +12 -0
- package/dist/debug/middleware.d.ts.map +1 -0
- package/dist/debug/recorder.d.ts +61 -0
- package/dist/debug/recorder.d.ts.map +1 -0
- package/dist/debug/types.d.ts +48 -0
- package/dist/debug/types.d.ts.map +1 -0
- package/dist/debug/ui.d.ts +6 -0
- package/dist/debug/ui.d.ts.map +1 -0
- package/dist/di/async-module.d.ts +49 -0
- package/dist/di/async-module.d.ts.map +1 -0
- package/dist/di/lifecycle.d.ts +49 -0
- package/dist/di/lifecycle.d.ts.map +1 -0
- package/dist/di/module-registry.d.ts +24 -0
- package/dist/di/module-registry.d.ts.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1887 -35
- package/dist/router/route.d.ts +5 -7
- package/dist/router/route.d.ts.map +1 -1
- package/dist/swagger/generator.d.ts +10 -0
- package/dist/swagger/generator.d.ts.map +1 -1
- package/dist/testing/test-client.d.ts +49 -0
- package/dist/testing/test-client.d.ts.map +1 -0
- package/dist/testing/testing-module.d.ts +90 -0
- package/dist/testing/testing-module.d.ts.map +1 -0
- package/dist/websocket/registry.d.ts +1 -6
- package/dist/websocket/registry.d.ts.map +1 -1
- package/docs/async-module.md +59 -0
- package/docs/client-generation.md +100 -0
- package/docs/cluster.md +81 -0
- package/docs/custom-decorators.md +1 -7
- package/docs/dashboard.md +54 -0
- package/docs/debug.md +58 -0
- package/docs/extensions.md +0 -2
- package/docs/guide.md +0 -1
- package/docs/lifecycle.md +72 -0
- package/docs/testing.md +110 -0
- package/docs/zh/async-module.md +98 -0
- package/docs/zh/client-generation.md +92 -0
- package/docs/zh/cluster.md +74 -0
- package/docs/zh/custom-decorators.md +1 -7
- package/docs/zh/dashboard.md +69 -0
- package/docs/zh/debug.md +81 -0
- package/docs/zh/extensions.md +0 -2
- package/docs/zh/guide.md +0 -1
- package/docs/zh/lifecycle.md +87 -0
- package/docs/zh/migration.md +0 -5
- package/docs/zh/testing.md +119 -0
- package/package.json +4 -4
- package/src/cache/cache-module.ts +25 -0
- package/src/client/generator.ts +36 -0
- package/src/client/index.ts +8 -0
- package/src/client/runtime.ts +101 -0
- package/src/client/types.ts +38 -0
- package/src/config/config-module.ts +44 -4
- package/src/config/index.ts +1 -0
- package/src/config/service.ts +50 -0
- package/src/config/types.ts +12 -0
- package/src/core/application.ts +37 -0
- package/src/core/apply-decorators.ts +31 -0
- package/src/core/cluster.ts +143 -0
- package/src/core/index.ts +1 -0
- package/src/core/server.ts +14 -1
- package/src/dashboard/controller.ts +227 -0
- package/src/dashboard/dashboard-extension.ts +26 -0
- package/src/dashboard/dashboard-module.ts +38 -0
- package/src/dashboard/index.ts +3 -0
- package/src/dashboard/types.ts +16 -0
- package/src/dashboard/ui.ts +219 -0
- package/src/database/database-module.ts +20 -0
- package/src/debug/debug-module.ts +70 -0
- package/src/debug/debug-ui-middleware.ts +110 -0
- package/src/debug/index.ts +9 -0
- package/src/debug/middleware.ts +126 -0
- package/src/debug/recorder.ts +141 -0
- package/src/debug/types.ts +49 -0
- package/src/debug/ui.ts +393 -0
- package/src/di/async-module.ts +141 -0
- package/src/di/lifecycle.ts +117 -0
- package/src/di/module-registry.ts +75 -0
- package/src/index.ts +35 -0
- package/src/router/route.ts +20 -20
- package/src/swagger/generator.ts +100 -0
- package/src/testing/test-client.ts +112 -0
- package/src/testing/testing-module.ts +238 -0
- package/src/websocket/registry.ts +3 -16
- package/tests/auth/auth-decorators.test.ts +0 -1
- package/tests/auth/oauth2-service.test.ts +0 -1
- package/tests/cache/cache-decorators-extended.test.ts +0 -1
- package/tests/cache/cache-decorators.test.ts +0 -1
- package/tests/cache/cache-interceptors.test.ts +0 -1
- package/tests/cache/cache-module.test.ts +0 -1
- package/tests/cache/cache-service-proxy.test.ts +0 -1
- package/tests/client/client-generator.test.ts +142 -0
- package/tests/config/config-center-integration.test.ts +0 -1
- package/tests/config/config-module-extended.test.ts +0 -1
- package/tests/config/config-module.test.ts +0 -1
- package/tests/controller/controller.test.ts +0 -1
- package/tests/controller/param-binder.test.ts +0 -1
- package/tests/controller/path-combination.test.ts +0 -1
- package/tests/core/application.test.ts +34 -0
- package/tests/core/apply-decorators.test.ts +109 -0
- package/tests/core/cluster.test.ts +32 -0
- package/tests/dashboard/dashboard-module.test.ts +85 -0
- package/tests/database/database-module.test.ts +0 -1
- package/tests/database/orm.test.ts +0 -1
- package/tests/database/postgres-mysql-integration.test.ts +0 -1
- package/tests/database/transaction.test.ts +0 -1
- package/tests/debug/debug-module.test.ts +141 -0
- package/tests/di/async-module.test.ts +125 -0
- package/tests/di/container.test.ts +0 -1
- package/tests/di/lifecycle.test.ts +140 -0
- package/tests/error/error-handler.test.ts +0 -1
- package/tests/events/event-decorators.test.ts +0 -1
- package/tests/events/event-listener-scanner.test.ts +0 -1
- package/tests/events/event-module.test.ts +0 -1
- package/tests/extensions/logger-module.test.ts +0 -1
- package/tests/health/health-module.test.ts +0 -1
- package/tests/integration/oauth2-e2e.test.ts +0 -1
- package/tests/integration/session-e2e.test.ts +0 -1
- package/tests/interceptor/base-interceptor.test.ts +0 -1
- package/tests/interceptor/builtin/cache-interceptor.test.ts +0 -1
- package/tests/interceptor/builtin/log-interceptor.test.ts +0 -1
- package/tests/interceptor/builtin/permission-interceptor.test.ts +0 -1
- package/tests/interceptor/interceptor-advanced-integration.test.ts +0 -1
- package/tests/interceptor/interceptor-chain.test.ts +0 -1
- package/tests/interceptor/interceptor-integration.test.ts +0 -1
- package/tests/interceptor/interceptor-metadata.test.ts +0 -1
- package/tests/interceptor/interceptor-registry.test.ts +0 -1
- package/tests/interceptor/perf/interceptor-performance.test.ts +0 -1
- package/tests/metrics/metrics-module.test.ts +0 -1
- package/tests/microservice/config-center.test.ts +0 -1
- package/tests/microservice/service-client-decorators.test.ts +0 -1
- package/tests/microservice/service-registry-decorators.test.ts +0 -1
- package/tests/microservice/service-registry.test.ts +0 -1
- package/tests/middleware/builtin/middleware-builtin-extended.test.ts +0 -1
- package/tests/middleware/builtin/rate-limit.test.ts +0 -1
- package/tests/middleware/middleware-decorators.test.ts +0 -1
- package/tests/middleware/middleware-pipeline.test.ts +0 -1
- package/tests/middleware/middleware.test.ts +0 -1
- package/tests/perf/optimization.test.ts +0 -1
- package/tests/queue/queue-decorators.test.ts +0 -1
- package/tests/queue/queue-module.test.ts +0 -1
- package/tests/queue/queue-service.test.ts +0 -1
- package/tests/router/router-decorators.test.ts +0 -1
- package/tests/router/router-extended.test.ts +0 -1
- package/tests/security/guards/guards-integration.test.ts +0 -1
- package/tests/security/guards/guards.test.ts +0 -1
- package/tests/security/guards/reflector.test.ts +0 -1
- package/tests/security/security-filter.test.ts +0 -1
- package/tests/security/security-module-extended.test.ts +0 -1
- package/tests/security/security-module.test.ts +0 -1
- package/tests/session/session-decorators.test.ts +0 -1
- package/tests/session/session-module.test.ts +0 -1
- package/tests/swagger/decorators.test.ts +0 -1
- package/tests/swagger/swagger-module.test.ts +0 -1
- package/tests/swagger/ui.test.ts +0 -1
- package/tests/testing/testing-module.test.ts +129 -0
- package/tests/validation/class-validator.test.ts +0 -1
- package/tests/validation/controller-validation.test.ts +0 -1
package/README.md
CHANGED
|
@@ -46,6 +46,22 @@
|
|
|
46
46
|
- 📡 **WebSocket gateways** with `@WebSocketGateway`, `@OnMessage`, etc.
|
|
47
47
|
- 📚 **Docs & samples** including multi-language docs, benchmark scripts and
|
|
48
48
|
best practices.
|
|
49
|
+
- 🧪 **Testing module** with `Test.createTestingModule()`, provider override,
|
|
50
|
+
and built-in HTTP test client.
|
|
51
|
+
- 🔄 **Lifecycle hooks** — `OnModuleInit`, `OnModuleDestroy`,
|
|
52
|
+
`OnApplicationBootstrap`, `OnApplicationShutdown`.
|
|
53
|
+
- ⚡ **Async module config** — `forRootAsync()` with factory injection on
|
|
54
|
+
ConfigModule, DatabaseModule, CacheModule and more.
|
|
55
|
+
- 🔌 **Type-safe client generation** — extract route manifests and create
|
|
56
|
+
typed API clients from controller metadata.
|
|
57
|
+
- 🎨 **Decorator composition** — `applyDecorators()` to merge multiple
|
|
58
|
+
decorators into one reusable decorator.
|
|
59
|
+
- 📊 **Built-in dashboard** — `DashboardModule` provides a zero-dependency
|
|
60
|
+
monitoring web UI with system info, routes and health status.
|
|
61
|
+
- 🐛 **Request replay / debug** — `DebugModule` records requests in a ring
|
|
62
|
+
buffer with a debug UI for inspection and replay.
|
|
63
|
+
- 🖥️ **Zero-config cluster** — `ClusterManager` auto-spawns reusePort
|
|
64
|
+
workers matching CPU core count.
|
|
49
65
|
|
|
50
66
|
## Architecture
|
|
51
67
|
|
|
@@ -368,6 +384,8 @@ Examples are organized by difficulty and feature category:
|
|
|
368
384
|
- `multi-module-app.ts` - Module dependencies and organization
|
|
369
385
|
- `context-scope-app.ts` - Request scoping and ContextService
|
|
370
386
|
- `full-app.ts` - Validation, uploads, static files, WebSocket
|
|
387
|
+
- `lifecycle-app.ts` - Lifecycle hooks (OnModuleInit, OnModuleDestroy, etc.)
|
|
388
|
+
- `async-config-app.ts` - Async module config with `forRootAsync()`
|
|
371
389
|
|
|
372
390
|
- **[Official Modules](./examples/02-official-modules/)** - Ready-to-use modules
|
|
373
391
|
- `auth-app.ts` - JWT + OAuth2 authentication (with Web UI)
|
|
@@ -376,15 +394,21 @@ Examples are organized by difficulty and feature category:
|
|
|
376
394
|
- `orm-app.ts` - Entity + Repository pattern
|
|
377
395
|
- `cache-app.ts` - Caching with decorators
|
|
378
396
|
- `queue-app.ts` - Task queues and Cron jobs
|
|
397
|
+
- `dashboard-app.ts` - Built-in monitoring dashboard (with Web UI)
|
|
379
398
|
|
|
380
399
|
- **[Advanced](./examples/03-advanced/)** - Custom framework extensions
|
|
381
400
|
- `custom-decorator-app.ts` - Create custom decorators
|
|
401
|
+
- `apply-decorators-app.ts` - Decorator composition with `applyDecorators()`
|
|
402
|
+
- `testing-app.ts` - TestingModule with mock providers and HTTP client
|
|
403
|
+
- `type-safe-client-app.ts` - Type-safe API client from controller metadata
|
|
404
|
+
- `debug-app.ts` - Request recording and replay (with Web UI)
|
|
382
405
|
- `websocket-chat-app.ts` - Complete WebSocket chat with rooms (with Web UI)
|
|
383
406
|
- `microservice-app.ts` - Microservices architecture
|
|
384
407
|
|
|
385
408
|
- **[Real World](./examples/04-real-world/)** - Production-ready examples
|
|
386
409
|
- `database-test-app.ts` - Database connection tester (Web UI)
|
|
387
410
|
- `perf/app.ts` - Performance benchmarking
|
|
411
|
+
- `perf/cluster-app.ts` - Zero-config cluster with `ClusterManager`
|
|
388
412
|
|
|
389
413
|
### 🔑 Symbol + Interface Pattern
|
|
390
414
|
|
|
@@ -433,22 +457,71 @@ learning paths, difficulty ratings, and usage scenarios.
|
|
|
433
457
|
|
|
434
458
|
## Benchmark Suite
|
|
435
459
|
|
|
436
|
-
|
|
437
|
-
|
|
460
|
+
### Internal Micro-benchmarks
|
|
461
|
+
|
|
462
|
+
`PerformanceHarness` & `StressTester` based benchmarks:
|
|
438
463
|
|
|
439
464
|
| Script | Description |
|
|
440
465
|
| ----------------- | --------------------------------------------------------------------- |
|
|
441
466
|
| `router.bench.ts` | static/dynamic route hits, `router.handle` and stress runs |
|
|
442
467
|
| `di.bench.ts` | singleton vs factory resolves, nested dependencies, concurrent stress |
|
|
443
468
|
|
|
444
|
-
Run directly:
|
|
445
|
-
|
|
446
469
|
```bash
|
|
447
470
|
bun benchmark/router.bench.ts
|
|
448
471
|
bun benchmark/di.bench.ts
|
|
449
472
|
```
|
|
450
473
|
|
|
451
|
-
|
|
474
|
+
### Framework Comparison (bun-server vs Express vs NestJS)
|
|
475
|
+
|
|
476
|
+
Real HTTP load testing with [wrk](https://github.com/wg/wrk), comparing
|
|
477
|
+
bun-server against Express 5 and NestJS 11. All frameworks run on the same Bun
|
|
478
|
+
runtime to isolate framework overhead.
|
|
479
|
+
|
|
480
|
+
**Prerequisites:** wrk (`brew install wrk` / `apt install wrk`). The script
|
|
481
|
+
automatically raises `ulimit -n` to 10240 for child processes.
|
|
482
|
+
|
|
483
|
+
```bash
|
|
484
|
+
bun benchmark/run-wrk-compare.ts # full comparison (3 tiers)
|
|
485
|
+
TIER=0 bun benchmark/run-wrk-compare.ts # Light tier only
|
|
486
|
+
bun benchmark/run-wrk.ts # bun-server only (3 tiers)
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
> **Environment:** Apple M2 Pro (8P + 4E cores) / darwin arm64 / Bun 1.3.10
|
|
490
|
+
|
|
491
|
+
#### Req/Sec (Light: -t2 -c50 -d10s)
|
|
492
|
+
|
|
493
|
+
| Endpoint | bun-server | Express | NestJS |
|
|
494
|
+
|-----------------------|--------------|----------|----------|
|
|
495
|
+
| GET /ping | **31.41k** | 30.01k | 26.52k |
|
|
496
|
+
| GET /json | **28.22k** | 25.99k | 23.64k |
|
|
497
|
+
| GET /users/:id | **30.88k** | 29.91k | 25.62k |
|
|
498
|
+
| GET /search?q= | **29.96k** | 28.70k | 25.17k |
|
|
499
|
+
| POST /users | **27.65k** | 21.37k | 19.38k |
|
|
500
|
+
| POST /users/validated | **26.60k** | 21.28k | 18.93k |
|
|
501
|
+
| GET /middleware | **29.52k** | 28.57k | 24.69k |
|
|
502
|
+
| GET /headers | **30.98k** | 29.57k | 26.43k |
|
|
503
|
+
| GET /io | **21.37k** | 19.46k | 18.49k |
|
|
504
|
+
|
|
505
|
+
Zero errors across all frameworks and tiers. See the full report for Medium and
|
|
506
|
+
Heavy tier results.
|
|
507
|
+
|
|
508
|
+
> 📊 Full comparison report (3 tiers, latency breakdown, per-framework
|
|
509
|
+
> details): [`benchmark/REPORT_COMPARE.md`](./benchmark/REPORT_COMPARE.md)
|
|
510
|
+
>
|
|
511
|
+
> 📋 Single-framework detailed report:
|
|
512
|
+
> [`benchmark/REPORT.md`](./benchmark/REPORT.md)
|
|
513
|
+
|
|
514
|
+
### Multi-process Benchmark (reusePort, Linux only)
|
|
515
|
+
|
|
516
|
+
```bash
|
|
517
|
+
bun benchmark/run-wrk-cluster.ts # default: 1 worker per CPU core
|
|
518
|
+
WORKERS=4 bun benchmark/run-wrk-cluster.ts
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
Spawns N workers sharing the same port via `SO_REUSEPORT`. The kernel
|
|
522
|
+
distributes connections across processes. Report saved to
|
|
523
|
+
`benchmark/REPORT_CLUSTER.md`. Note: `reusePort` only works on **Linux**;
|
|
524
|
+
macOS/Windows silently ignore it.
|
|
452
525
|
|
|
453
526
|
## Docs & Localization
|
|
454
527
|
|
|
@@ -525,6 +598,6 @@ Released under the [MIT License](./LICENSE).
|
|
|
525
598
|
|
|
526
599
|
## Other Languages
|
|
527
600
|
|
|
528
|
-
- [中文 README](./
|
|
601
|
+
- [中文 README](./README_ZH.md)
|
|
529
602
|
|
|
530
603
|
Enjoy building on Bun Server!
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type AsyncModuleOptions } from '../di/async-module';
|
|
1
2
|
import { type CacheModuleOptions } from './types';
|
|
2
3
|
import { CachePostProcessor } from './service-proxy';
|
|
3
4
|
/**
|
|
@@ -14,6 +15,11 @@ export declare class CacheModule {
|
|
|
14
15
|
* @param options - 模块配置
|
|
15
16
|
*/
|
|
16
17
|
static forRoot(options?: CacheModuleOptions): typeof CacheModule;
|
|
18
|
+
/**
|
|
19
|
+
* 异步创建缓存模块
|
|
20
|
+
* @param asyncOptions - 异步配置选项
|
|
21
|
+
*/
|
|
22
|
+
static forRootAsync(asyncOptions: AsyncModuleOptions<CacheModuleOptions>): typeof CacheModule;
|
|
17
23
|
/**
|
|
18
24
|
* 获取缓存后处理器
|
|
19
25
|
* 用于在应用启动时注册到 DI 容器
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-module.d.ts","sourceRoot":"","sources":["../../src/cache/cache-module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cache-module.d.ts","sourceRoot":"","sources":["../../src/cache/cache-module.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,kBAAkB,EAA0B,MAAM,oBAAoB,CAAC;AAGrF,OAAO,EAIL,KAAK,kBAAkB,EAExB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,0BAA0B,eAAoD,CAAC;AAE5F,qBAGa,WAAW;IACtB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa,CAAmC;IAE/D;;;OAGG;WACW,OAAO,CACnB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,WAAW;IAwDrB;;;OAGG;WACW,YAAY,CACxB,YAAY,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,GACnD,OAAO,WAAW;IAkBrB;;;OAGG;WACW,gBAAgB,IAAI,kBAAkB,GAAG,IAAI;IAI3D;;OAEG;WACW,KAAK,IAAI,IAAI;CAI5B"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { RouteManifest } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* 客户端清单生成器
|
|
4
|
+
* 从 RouteRegistry 提取路由元数据,生成路由清单
|
|
5
|
+
*/
|
|
6
|
+
export declare class ClientGenerator {
|
|
7
|
+
/**
|
|
8
|
+
* 从当前 RouteRegistry 生成路由清单
|
|
9
|
+
*/
|
|
10
|
+
static generate(): RouteManifest;
|
|
11
|
+
/**
|
|
12
|
+
* 生成清单的 JSON 字符串
|
|
13
|
+
*/
|
|
14
|
+
static generateJSON(): string;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/client/generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,SAAS,CAAC;AAEjE;;;GAGG;AACH,qBAAa,eAAe;IAC1B;;OAEG;WACW,QAAQ,IAAI,aAAa;IAkBvC;;OAEG;WACW,YAAY,IAAI,MAAM;CAGrC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,oBAAoB,GACrB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ClientConfig, ClientRequestOptions, RouteManifest } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* 从路由清单创建类型安全的 API 客户端
|
|
4
|
+
*
|
|
5
|
+
* 客户端结构按控制器名称(去除 Controller 后缀,转小写)分组,
|
|
6
|
+
* 每个方法名直接映射为函数调用。
|
|
7
|
+
*
|
|
8
|
+
* 示例:
|
|
9
|
+
* ```
|
|
10
|
+
* const client = createClient(manifest, { baseUrl: 'http://localhost:3000' });
|
|
11
|
+
* const result = await client.user.getUser({ params: { id: '1' } });
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare function createClient(manifest: RouteManifest, config: ClientConfig): Record<string, Record<string, (options?: ClientRequestOptions) => Promise<unknown>>>;
|
|
15
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/client/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AA4BjF;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,YAAY,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAyDtF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 路由清单中的单个端点描述
|
|
3
|
+
*/
|
|
4
|
+
export interface RouteManifestEntry {
|
|
5
|
+
method: string;
|
|
6
|
+
path: string;
|
|
7
|
+
controllerName: string;
|
|
8
|
+
methodName: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 完整的路由清单
|
|
12
|
+
*/
|
|
13
|
+
export interface RouteManifest {
|
|
14
|
+
routes: RouteManifestEntry[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 客户端请求选项
|
|
18
|
+
*/
|
|
19
|
+
export interface ClientRequestOptions {
|
|
20
|
+
params?: Record<string, string>;
|
|
21
|
+
query?: Record<string, string>;
|
|
22
|
+
body?: unknown;
|
|
23
|
+
headers?: Record<string, string>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 客户端配置
|
|
27
|
+
*/
|
|
28
|
+
export interface ClientConfig {
|
|
29
|
+
baseUrl: string;
|
|
30
|
+
headers?: Record<string, string>;
|
|
31
|
+
/**
|
|
32
|
+
* 自定义 fetch 实现(可选,用于测试)
|
|
33
|
+
*/
|
|
34
|
+
fetch?: typeof fetch;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type AsyncModuleOptions } from '../di/async-module';
|
|
1
2
|
import { ConfigService } from './service';
|
|
2
3
|
import { type ConfigModuleOptions } from './types';
|
|
3
4
|
export declare class ConfigModule {
|
|
@@ -6,6 +7,12 @@ export declare class ConfigModule {
|
|
|
6
7
|
* @param options - 模块配置
|
|
7
8
|
*/
|
|
8
9
|
static forRoot(options?: ConfigModuleOptions): typeof ConfigModule;
|
|
10
|
+
/**
|
|
11
|
+
* 异步创建配置模块
|
|
12
|
+
* 支持 configFiles 选项从 .json / .jsonc / .json5 文件异步加载配置
|
|
13
|
+
* @param asyncOptions - 异步配置选项
|
|
14
|
+
*/
|
|
15
|
+
static forRootAsync(asyncOptions: AsyncModuleOptions<ConfigModuleOptions>): typeof ConfigModule;
|
|
9
16
|
/**
|
|
10
17
|
* 获取环境变量快照
|
|
11
18
|
* 方便测试和未来扩展(如 .env 文件解析)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-module.d.ts","sourceRoot":"","sources":["../../src/config/config-module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config-module.d.ts","sourceRoot":"","sources":["../../src/config/config-module.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,kBAAkB,EAA0B,MAAM,oBAAoB,CAAC;AAErF,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAwB,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEzE,qBAGa,YAAY;IACvB;;;OAGG;WACW,OAAO,CACnB,OAAO,GAAE,mBAAwB,GAChC,OAAO,YAAY;IAsDtB;;;;OAIG;WACW,YAAY,CACxB,YAAY,EAAE,kBAAkB,CAAC,mBAAmB,CAAC,GACpD,OAAO,YAAY;IAkCtB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAQ1B;;OAEG;WACiB,sBAAsB,CACxC,OAAO,EAAE,aAAa,EACtB,mBAAmB,EAAE,WAAW,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC,GACpE,OAAO,CAAC,IAAI,CAAC;IA+BhB;;OAEG;mBACkB,sBAAsB;IAuE3C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAwDvC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;CAwB9B"}
|
package/dist/config/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { ConfigModule } from './config-module';
|
|
2
2
|
export { ConfigService } from './service';
|
|
3
|
-
export { CONFIG_SERVICE_TOKEN, type ConfigModuleOptions, } from './types';
|
|
3
|
+
export { CONFIG_SERVICE_TOKEN, type ConfigModuleOptions, type ConfigFileFormat, } from './types';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,oBAAoB,EACpB,KAAK,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,SAAS,CAAC"}
|
package/dist/config/service.d.ts
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
|
+
import type { ConfigFileFormat } from './types';
|
|
1
2
|
/**
|
|
2
3
|
* 配置服务
|
|
3
4
|
* 提供类型安全的配置访问能力
|
|
4
5
|
*/
|
|
5
6
|
export declare class ConfigService<TConfig extends Record<string, unknown> = Record<string, unknown>> {
|
|
7
|
+
/**
|
|
8
|
+
* 解析配置内容,按 JSON -> JSONC -> JSON5 顺序自动尝试
|
|
9
|
+
* 利用 Bun 1.3.6+ 的 Bun.JSONC 和 Bun 1.3.7+ 的 Bun.JSON5
|
|
10
|
+
* @param content - 配置文本内容
|
|
11
|
+
* @param format - 强制指定格式(可选),省略则自动检测
|
|
12
|
+
*/
|
|
13
|
+
static parseConfigContent(content: string, format?: ConfigFileFormat): unknown;
|
|
14
|
+
/**
|
|
15
|
+
* 从文件加载配置,根据扩展名自动选择解析器
|
|
16
|
+
* @param filePath - 配置文件路径(.json / .jsonc / .json5)
|
|
17
|
+
*/
|
|
18
|
+
static loadConfigFile(filePath: string): Promise<Record<string, unknown>>;
|
|
6
19
|
private config;
|
|
7
20
|
private readonly namespace?;
|
|
8
21
|
private configUpdateListeners;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/config/service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,aAAa,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1F,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,qBAAqB,CAAwC;gBAElD,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM;IAKtD;;;OAGG;IACI,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAY7C;;;OAGG;IACI,WAAW,CAAC,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAezD;;;;OAIG;IACI,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAUtE;;OAEG;IACI,MAAM,IAAI,OAAO;IAIxB;;;;OAIG;IACI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IASrE;;;OAGG;IACI,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC;IAQ/C;;;OAGG;IACI,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC;IAI/D,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,cAAc;CAuBvB"}
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/config/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD;;;GAGG;AACH,qBAAa,aAAa,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1F;;;;;OAKG;WACW,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO;IAsBrF;;;OAGG;WACiB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAgBtF,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,qBAAqB,CAAwC;gBAElD,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM;IAKtD;;;OAGG;IACI,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAY7C;;;OAGG;IACI,WAAW,CAAC,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAezD;;;;OAIG;IACI,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAUtE;;OAEG;IACI,MAAM,IAAI,OAAO;IAIxB;;;;OAIG;IACI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IASrE;;;OAGG;IACI,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC;IAQ/C;;;OAGG;IACI,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC;IAI/D,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,cAAc;CAuBvB"}
|
package/dist/config/types.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 配置文件解析格式
|
|
3
|
+
*/
|
|
4
|
+
export type ConfigFileFormat = 'json' | 'jsonc' | 'json5';
|
|
1
5
|
export interface ConfigModuleOptions<TConfig extends Record<string, unknown> = Record<string, unknown>> {
|
|
2
6
|
/**
|
|
3
7
|
* 默认配置对象(最低优先级)
|
|
@@ -8,6 +12,12 @@ export interface ConfigModuleOptions<TConfig extends Record<string, unknown> = R
|
|
|
8
12
|
* @param env - process.env 快照
|
|
9
13
|
*/
|
|
10
14
|
load?: (env: Record<string, string | undefined>) => Partial<TConfig>;
|
|
15
|
+
/**
|
|
16
|
+
* 配置文件路径列表(支持 .json / .jsonc / .json5 格式)
|
|
17
|
+
* 优先级:configFiles > defaultConfig,按数组顺序后者覆盖前者
|
|
18
|
+
* 仅在 forRootAsync 中生效(文件读取为异步操作)
|
|
19
|
+
*/
|
|
20
|
+
configFiles?: string[];
|
|
11
21
|
/**
|
|
12
22
|
* 配置验证函数(可抛出错误)
|
|
13
23
|
* 可用于集成 class-validator 风格的校验逻辑
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACpG;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjC;;;OAGG;IACH,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAErE;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAErC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,YAAY,CAAC,EAAE;QACb;;WAEG;QACH,OAAO,CAAC,EAAE,OAAO,CAAC;QAElB;;;;WAIG;QACH,OAAO,CAAC,EAAE,GAAG,CACX,MAAM,EACN;YACE,MAAM,EAAE,MAAM,CAAC;YACf,SAAS,EAAE,MAAM,CAAC;YAClB,WAAW,CAAC,EAAE,MAAM,CAAC;SACtB,CACF,CAAC;QAEF;;;;WAIG;QACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;KAChC,CAAC;CACH;AAED,eAAO,MAAM,oBAAoB,eAA8C,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1D,MAAM,WAAW,mBAAmB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACpG;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjC;;;OAGG;IACH,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAErE;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAErC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,YAAY,CAAC,EAAE;QACb;;WAEG;QACH,OAAO,CAAC,EAAE,OAAO,CAAC;QAElB;;;;WAIG;QACH,OAAO,CAAC,EAAE,GAAG,CACX,MAAM,EACN;YACE,MAAM,EAAE,MAAM,CAAC;YACf,SAAS,EAAE,MAAM,CAAC;YAClB,WAAW,CAAC,EAAE,MAAM,CAAC;SACtB,CACF,CAAC;QAEF;;;;WAIG;QACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;KAChC,CAAC;CACH;AAED,eAAO,MAAM,oBAAoB,eAA8C,CAAC"}
|
|
@@ -25,6 +25,13 @@ export interface ApplicationOptions {
|
|
|
25
25
|
* 默认 true
|
|
26
26
|
*/
|
|
27
27
|
enableSignalHandlers?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* 是否启用 SO_REUSEPORT
|
|
30
|
+
* 允许多进程绑定同一端口,用于多进程负载均衡
|
|
31
|
+
* 仅 Linux 有效,macOS/Windows 会忽略
|
|
32
|
+
* @default false
|
|
33
|
+
*/
|
|
34
|
+
reusePort?: boolean;
|
|
28
35
|
}
|
|
29
36
|
/**
|
|
30
37
|
* 应用主类
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../../src/core/application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAsB,MAAM,UAAU,CAAC;AAMzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../../src/core/application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAsB,MAAM,UAAU,CAAC;AAMzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAU3C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,CAAY;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2B;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;IACzD,OAAO,CAAC,uBAAuB,CAAkB;gBAE9B,OAAO,GAAE,kBAAuB;IAsBnD;;;OAGG;IACI,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAIxC;;OAEG;IACU,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmDpE;;OAEG;YACW,oBAAoB;IAqBlC;;;OAGG;YACW,sBAAsB;IAyBpC;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAqBhC;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBlC;;;;;OAKG;IACU,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB9D;;OAEG;YACW,eAAe;IAkB7B;;;;OAIG;YACW,aAAa;IAyC3B;;;OAGG;IACI,kBAAkB,CAAC,eAAe,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI;IAKtE;;;OAGG;IACI,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAqBrD;;;OAGG;IACH,OAAO,CAAC,kCAAkC;IAc1C;;;OAGG;IACI,wBAAwB,CAAC,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI;IAIzE;;;OAGG;IACI,iBAAiB,CAAC,SAAS,EAAE,oBAAoB,GAAG,IAAI;IAK/D;;;OAGG;IACI,SAAS,IAAI,SAAS,GAAG,SAAS;IAIzC;;;OAGG;YACW,gBAAgB;IAsB9B;;;OAGG;YACW,kBAAkB;IAwBhC;;;OAGG;IACI,YAAY;IAInB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2B7B;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAS7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-decorators.d.ts","sourceRoot":"","sources":["../../src/core/apply-decorators.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,UAAU,EAAE,KAAK,CAAC,cAAc,GAAG,eAAe,GAAG,iBAAiB,CAAC,GACzE,cAAc,GAAG,eAAe,GAAG,iBAAiB,CAwBtD"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface ClusterOptions {
|
|
2
|
+
/**
|
|
3
|
+
* 是否启用集群模式
|
|
4
|
+
* @default false
|
|
5
|
+
*/
|
|
6
|
+
enabled?: boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Worker 数量。'auto' 表示使用 CPU 核心数
|
|
9
|
+
* @default 'auto'
|
|
10
|
+
*/
|
|
11
|
+
workers?: number | 'auto';
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 集群管理器
|
|
15
|
+
* 自动派生 worker 进程,每个 worker 使用 reusePort 绑定相同端口
|
|
16
|
+
*/
|
|
17
|
+
export declare class ClusterManager {
|
|
18
|
+
private readonly workerCount;
|
|
19
|
+
private readonly workers;
|
|
20
|
+
private readonly scriptPath;
|
|
21
|
+
private readonly port;
|
|
22
|
+
private readonly hostname?;
|
|
23
|
+
constructor(options: {
|
|
24
|
+
workers: number | 'auto';
|
|
25
|
+
scriptPath: string;
|
|
26
|
+
port: number;
|
|
27
|
+
hostname?: string;
|
|
28
|
+
});
|
|
29
|
+
/**
|
|
30
|
+
* 启动所有 worker 进程
|
|
31
|
+
*/
|
|
32
|
+
start(): void;
|
|
33
|
+
/**
|
|
34
|
+
* 停止所有 worker 进程
|
|
35
|
+
*/
|
|
36
|
+
stop(): Promise<void>;
|
|
37
|
+
private monitorWorkers;
|
|
38
|
+
/**
|
|
39
|
+
* 检查当前进程是否为 cluster worker
|
|
40
|
+
*/
|
|
41
|
+
static isWorker(): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* 获取当前 worker ID(仅在 worker 进程中有效)
|
|
44
|
+
*/
|
|
45
|
+
static getWorkerId(): number;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=cluster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster.d.ts","sourceRoot":"","sources":["../../src/core/cluster.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAC1D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;gBAEhB,OAAO,EAAE;QAC1B,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IAQD;;OAEG;IACI,KAAK,IAAI,IAAI;IA+BpB;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBlC,OAAO,CAAC,cAAc;IA8BtB;;OAEG;WACW,QAAQ,IAAI,OAAO;IAIjC;;OAEG;WACW,WAAW,IAAI,MAAM;CAGpC"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { Application, type ApplicationOptions } from './application';
|
|
2
2
|
export { BunServer, type ServerOptions } from './server';
|
|
3
|
+
export { ClusterManager, type ClusterOptions } from './cluster';
|
|
3
4
|
export { Context } from './context';
|
|
4
5
|
export { ContextService, CONTEXT_SERVICE_TOKEN, contextStore } from './context-service';
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/core/server.d.ts
CHANGED
|
@@ -27,6 +27,13 @@ export interface ServerOptions {
|
|
|
27
27
|
* 默认 30 秒
|
|
28
28
|
*/
|
|
29
29
|
gracefulShutdownTimeout?: number;
|
|
30
|
+
/**
|
|
31
|
+
* 是否启用 SO_REUSEPORT
|
|
32
|
+
* 允许多进程绑定同一端口,用于多进程负载均衡
|
|
33
|
+
* 仅 Linux 有效,macOS/Windows 会忽略
|
|
34
|
+
* @default false
|
|
35
|
+
*/
|
|
36
|
+
reusePort?: boolean;
|
|
30
37
|
}
|
|
31
38
|
/**
|
|
32
39
|
* 服务器封装类
|
|
@@ -75,6 +82,7 @@ export declare class BunServer {
|
|
|
75
82
|
isRunning(): boolean;
|
|
76
83
|
/**
|
|
77
84
|
* 获取服务器端口
|
|
85
|
+
* 如果服务器正在运行,返回实际绑定的端口(支持 port:0 场景)
|
|
78
86
|
*/
|
|
79
87
|
getPort(): number;
|
|
80
88
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE1D;;OAEG;IACH,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IAE7C;;;OAGG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE1D;;OAEG;IACH,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IAE7C;;;OAGG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,CAAkC;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,eAAe,CAAC,CAAgB;IACxC,OAAO,CAAC,eAAe,CAAC,CAAa;gBAElB,OAAO,EAAE,aAAa;IAIzC;;OAEG;IACI,KAAK,IAAI,IAAI;IAqGpB;;OAEG;IACI,IAAI,IAAI,IAAI;IAWnB;;;;;OAKG;IACU,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2C9D;;OAEG;IACI,iBAAiB,IAAI,MAAM;IAIlC;;OAEG;IACI,mBAAmB,IAAI,OAAO;IAIrC;;;OAGG;IACI,SAAS,IAAI,MAAM,CAAC,uBAAuB,CAAC,GAAG,SAAS;IAI/D;;;OAGG;IACI,SAAS,IAAI,OAAO;IAI3B;;;OAGG;IACI,OAAO,IAAI,MAAM;IAOxB;;OAEG;IACI,WAAW,IAAI,MAAM,GAAG,SAAS;CAGzC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard 服务
|
|
3
|
+
* 提供监控 UI 和 API 端点
|
|
4
|
+
*/
|
|
5
|
+
export declare class DashboardService {
|
|
6
|
+
private readonly basePath;
|
|
7
|
+
private readonly auth?;
|
|
8
|
+
private readonly startTime;
|
|
9
|
+
/**
|
|
10
|
+
* 创建 Dashboard 服务实例
|
|
11
|
+
* @param basePath - Dashboard 基础路径
|
|
12
|
+
* @param auth - Basic Auth 认证配置(可选)
|
|
13
|
+
*/
|
|
14
|
+
constructor(basePath: string, auth?: {
|
|
15
|
+
username: string;
|
|
16
|
+
password: string;
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* 注册 Dashboard 路由
|
|
20
|
+
*/
|
|
21
|
+
registerRoutes(): void;
|
|
22
|
+
/**
|
|
23
|
+
* 检查 Basic Auth
|
|
24
|
+
* @param ctx - 请求上下文
|
|
25
|
+
* @returns 是否通过认证,未配置 auth 时返回 true
|
|
26
|
+
*/
|
|
27
|
+
private checkAuth;
|
|
28
|
+
/**
|
|
29
|
+
* 返回 401 Unauthorized 响应
|
|
30
|
+
*/
|
|
31
|
+
private unauthorizedResponse;
|
|
32
|
+
/**
|
|
33
|
+
* 处理 Dashboard 主页面
|
|
34
|
+
*/
|
|
35
|
+
private handleDashboard;
|
|
36
|
+
/**
|
|
37
|
+
* 处理系统信息 API
|
|
38
|
+
*/
|
|
39
|
+
private handleSystem;
|
|
40
|
+
/**
|
|
41
|
+
* 处理路由列表 API
|
|
42
|
+
*/
|
|
43
|
+
private handleRoutes;
|
|
44
|
+
/**
|
|
45
|
+
* 将 Markdown 文本渲染为 HTML
|
|
46
|
+
* 利用 Bun 1.3.8+ 内置 Bun.markdown 解析器(Zig 实现,支持 GFM)
|
|
47
|
+
*/
|
|
48
|
+
private handleMarkdownRender;
|
|
49
|
+
/**
|
|
50
|
+
* 处理健康检查 API
|
|
51
|
+
* 如果 HealthModule 已注册则运行健康指示器,否则返回基本状态
|
|
52
|
+
*/
|
|
53
|
+
private handleHealth;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/dashboard/controller.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAyC;IAC/D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAEhD;;;;OAIG;gBAED,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAM/C;;OAEG;IACI,cAAc,IAAI,IAAI;IA0B7B;;;;OAIG;IACH,OAAO,CAAC,SAAS;IAmBjB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;OAEG;YACW,eAAe;IAU7B;;OAEG;YACW,YAAY;IAoB1B;;OAEG;YACW,YAAY;IAkB1B;;;OAGG;YACW,oBAAoB;IAwBlC;;;OAGG;YACW,YAAY;CA0C3B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ApplicationExtension } from '../extensions/types';
|
|
2
|
+
import type { Container } from '../di/container';
|
|
3
|
+
import { DashboardService } from './controller';
|
|
4
|
+
/**
|
|
5
|
+
* Dashboard 扩展
|
|
6
|
+
* 在应用初始化时注册 Dashboard 路由
|
|
7
|
+
*/
|
|
8
|
+
export declare class DashboardExtension implements ApplicationExtension {
|
|
9
|
+
private readonly service;
|
|
10
|
+
/**
|
|
11
|
+
* 创建 Dashboard 扩展
|
|
12
|
+
* @param service - Dashboard 服务实例
|
|
13
|
+
*/
|
|
14
|
+
constructor(service: DashboardService);
|
|
15
|
+
/**
|
|
16
|
+
* 注册扩展,将 Dashboard 路由注册到 RouteRegistry
|
|
17
|
+
*/
|
|
18
|
+
register(_container: Container): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=dashboard-extension.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-extension.d.ts","sourceRoot":"","sources":["../../src/dashboard/dashboard-extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,oBAAoB;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAE3C;;;OAGG;gBACgB,OAAO,EAAE,gBAAgB;IAI5C;;OAEG;IACI,QAAQ,CAAC,UAAU,EAAE,SAAS,GAAG,IAAI;CAG7C"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DashboardModuleOptions } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Dashboard 模块
|
|
4
|
+
* 提供监控 Web UI,可视化指标、健康状态、路由和系统信息
|
|
5
|
+
*/
|
|
6
|
+
export declare class DashboardModule {
|
|
7
|
+
/**
|
|
8
|
+
* 创建 Dashboard 模块
|
|
9
|
+
* @param options - 模块配置
|
|
10
|
+
*/
|
|
11
|
+
static forRoot(options?: DashboardModuleOptions): typeof DashboardModule;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=dashboard-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-module.d.ts","sourceRoot":"","sources":["../../src/dashboard/dashboard-module.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEtD;;;GAGG;AACH,qBAKa,eAAe;IAC1B;;;OAGG;WACW,OAAO,CACnB,OAAO,GAAE,sBAA2B,GACnC,OAAO,eAAe;CAgB1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dashboard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,KAAK,sBAAsB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface DashboardModuleOptions {
|
|
2
|
+
/**
|
|
3
|
+
* Dashboard UI 路径
|
|
4
|
+
* @default '/_dashboard'
|
|
5
|
+
*/
|
|
6
|
+
path?: string;
|
|
7
|
+
/**
|
|
8
|
+
* Basic Auth 认证配置
|
|
9
|
+
*/
|
|
10
|
+
auth?: {
|
|
11
|
+
username: string;
|
|
12
|
+
password: string;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export declare const DASHBOARD_OPTIONS_TOKEN: unique symbol;
|
|
16
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/dashboard/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,IAAI,CAAC,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,eAAO,MAAM,uBAAuB,eAAiD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/dashboard/ui.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAqN5D"}
|