api-machine 1.0.1 → 1.1.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,4 +1,4 @@
1
- # api-machine - REST API Server Framework
1
+ # API-Machine
2
2
 
3
3
  A lightweight, TypeScript-first REST API framework built on Express with a class-based routing architecture.
4
4
 
@@ -85,39 +85,10 @@ The [`examples/`](examples/) directory contains comprehensive examples:
85
85
  - Request body validation
86
86
  - Structured error responses
87
87
 
88
- ## Configuration
89
-
90
- ### Server Options
91
- #### port `number = 5000`
92
-
93
- The port number on which the server will listen for incoming requests.
94
-
95
- #### maxPayloadSizeMB `number = 10`
96
-
97
- Maximum size in megabytes for JSON request payloads that the server will accept.
98
-
99
- #### maxUrlEncodedSizeMB `number = 1`
100
-
101
- Maximum size in megabytes for URL-encoded request payloads that the server will accept.
102
-
103
- #### log `LogInterface = console`
104
-
105
- Custom logger interface for handling server logging (e.g. `ts-tiny-log`). Must implement the LogInterface contract.
106
-
107
- #### securityHeaders `SecurityHeadersOptions`
108
-
109
- Configuration for HTTP security headers. By default, api-machine is **secure by default** with:
110
- - X-Powered-By header removed (prevents server fingerprinting)
111
- - X-Content-Type-Options: nosniff (prevents MIME sniffing)
112
- - X-Frame-Options: DENY (prevents clickjacking)
113
- - X-XSS-Protection: 1; mode=block (legacy XSS protection)
114
-
115
- See **[Security Headers Documentation](docs/security-headers.md)** for detailed configuration options and best practices.
116
-
117
88
  ### Example with Options
118
89
 
119
90
  ```typescript
120
- const server = new MyServer({
91
+ const server = new MyApiServer({
121
92
  port: 8080,
122
93
  maxPayloadSizeMB: 20,
123
94
  maxUrlEncodedSizeMB: 2,
@@ -125,43 +96,6 @@ const server = new MyServer({
125
96
  });
126
97
  ```
127
98
 
128
- ## API Summary
129
-
130
- ### RestServer
131
-
132
- Abstract class for creating REST API servers.
133
-
134
- **Methods:**
135
- - `start()`: Starts the server
136
- - `stop()`: Stops the server
137
-
138
-
139
- ### BaseApiRouter
140
-
141
- Abstract class for creating route groups.
142
-
143
- **Properties:**
144
- - `path`: The base path for the router (e.g., `/api`)
145
-
146
- **Methods:**
147
- - `routes()`: Abstract method to define endpoints (must be implemented)
148
-
149
- ### BaseApiEndpoint
150
-
151
- Abstract class for creating API endpoints.
152
-
153
- **Properties:**
154
- - `path`: The endpoint path (default: `''`)
155
- - `method`: The HTTP method (default: `GET`). Can be:
156
- - `EndpointMethods.GET`
157
- - `EndpointMethods.POST`
158
- - `EndpointMethods.PATCH`
159
- - `EndpointMethods.PUT`
160
- - `EndpointMethods.DELETE`
161
-
162
- **Methods:**
163
- - `handle(request, response, next)`: Abstract method to handle requests (must be implemented)
164
-
165
99
  #### Using Different HTTP Methods
166
100
 
167
101
  api-machine provides convenience classes for each HTTP method with appropriate default status codes:
@@ -227,55 +161,11 @@ class DeleteUserEndpoint extends DeleteEndpoint {
227
161
  }
228
162
  ```
229
163
 
230
- **Available Endpoint Classes:**
231
- - `GetEndpoint` - GET requests (200 OK)
232
- - `PostEndpoint` - POST requests (201 Created)
233
- - `PutEndpoint` - PUT requests (200 OK)
234
- - `PatchEndpoint` - PATCH requests (200 OK)
235
- - `DeleteEndpoint` - DELETE requests (204 No Content)
236
- - `HealthCheckEndpoint` - Pre-built health check endpoint (GET /health)
237
-
238
- You can also use `BaseApiEndpoint` and manually set the `method` and `statusCode` properties if needed for custom behavior.
239
-
240
164
  #### Pre-Built Endpoints
241
165
 
242
166
  ##### HealthCheckEndpoint
243
167
 
244
- A ready-to-use health check endpoint that returns system status information. Simply include it in your router:
245
-
246
- ```typescript
247
- import { BaseApiRouter, HealthCheckEndpoint } from 'api-machine';
248
-
249
- class MyRouter extends BaseApiRouter {
250
- override path = '/api';
251
-
252
- async routes() {
253
- return [
254
- HealthCheckEndpoint, // Available at GET /api/health
255
- // ... other endpoints
256
- ];
257
- }
258
- }
259
- ```
260
-
261
- **Response Format:**
262
- ```json
263
- {
264
- "status": "ok",
265
- "timestamp": "2025-11-08T12:00:00.000Z",
266
- "uptime": 123.45,
267
- "environment": "development"
268
- }
269
- ```
270
-
271
- **Customizing the Path:**
272
- ```typescript
273
- class CustomHealthCheck extends HealthCheckEndpoint {
274
- override path = '/status'; // Available at GET /api/status
275
- }
276
- ```
277
-
278
- For advanced usage, extending the health check with custom checks, and deployment examples (Kubernetes, Docker, monitoring), see the **[Health Check Endpoint Documentation](docs/health-check-endpoint.md)**.
168
+ A ready-to-use health check endpoint that returns system status information. Simply include it in your router. For advanced usage, extending the health check with custom checks, and deployment examples (Kubernetes, Docker, monitoring), see the **[Health Check Endpoint Documentation](docs/health-check-endpoint.md)**.
279
169
 
280
170
  ## Error Handling
281
171
 
@@ -303,7 +193,7 @@ class GetUserEndpoint extends GetEndpoint {
303
193
  ```
304
194
 
305
195
  **Key Features:**
306
- - 29 built-in error classes covering HTTP status codes 400-451
196
+ - Built-in error classes covering HTTP status codes 400-451
307
197
  - Automatic JSON error responses with timestamps
308
198
  - Support for custom headers (e.g., `WWW-Authenticate`, `Retry-After`)
309
199
  - Optional `details` field for additional context
@@ -376,7 +266,7 @@ See **[Authentication Documentation](docs/authentication.md)** for complete usag
376
266
 
377
267
  ## Middleware
378
268
 
379
- Routers and endpoints support Express-style middleware for logging, validation, and more. See [Middleware Support](docs/middleware.md) for usage and examples.
269
+ Routers and endpoints support Express middleware for logging, validation, and more. See [Middleware Support](docs/middleware.md) for usage and examples.
380
270
 
381
271
  ## Contributing & Development
382
272
 
@@ -17,6 +17,14 @@ class OasEndpointComponentConverter {
17
17
  example: endpoint.bodyExample,
18
18
  });
19
19
  }
20
+ const responseSanitizer = endpoint.response;
21
+ if (responseSanitizer) {
22
+ this.addSchema({
23
+ name: `${endpoint.name}Response`,
24
+ sanitizer: responseSanitizer,
25
+ example: endpoint.responseExample,
26
+ });
27
+ }
20
28
  return this.schemas;
21
29
  }
22
30
  addSchema({ name, sanitizer, example, }) {
@@ -1 +1 @@
1
- {"version":3,"file":"oas-endpoint-component-converter.js","sourceRoot":"","sources":["../../../src/oas/oas-endpoint-component-converter.ts"],"names":[],"mappings":";;;AAIA,gDAAsD;AAEtD;;GAEG;AACH,MAAa,6BAA6B;IAC/B,OAAO,GAAiC,EAAE,CAAC;IAErD,+DAA+D;IACxD,UAAU,CAAC,QAAyB;QAC1C,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC;QAEpC,IAAI,aAAa,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC;gBACd,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,MAAM;gBAC5B,SAAS,EAAE,aAAa;gBACxB,OAAO,EAAE,QAAQ,CAAC,WAAW;aAC7B,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAES,SAAS,CAAC,EACnB,IAAI,EACJ,SAAS,EACT,OAAO,GAMP;QACA,MAAM,MAAM,GAAG,IAAA,4BAAiB,EAAC,SAAS,CAAC,CAAC;QAE5C,IAAI,MAAM,EAAE,CAAC;YACZ,IAAI,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;YAC1B,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QAC7B,CAAC;IACF,CAAC;CACD;AAtCD,sEAsCC"}
1
+ {"version":3,"file":"oas-endpoint-component-converter.js","sourceRoot":"","sources":["../../../src/oas/oas-endpoint-component-converter.ts"],"names":[],"mappings":";;;AAIA,gDAAsD;AAEtD;;GAEG;AACH,MAAa,6BAA6B;IAC/B,OAAO,GAAiC,EAAE,CAAC;IAErD,+DAA+D;IACxD,UAAU,CAAC,QAAyB;QAC1C,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC;QAEpC,IAAI,aAAa,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC;gBACd,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,MAAM;gBAC5B,SAAS,EAAE,aAAa;gBACxB,OAAO,EAAE,QAAQ,CAAC,WAAW;aAC7B,CAAC,CAAC;QACJ,CAAC;QAED,MAAM,iBAAiB,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAE5C,IAAI,iBAAiB,EAAE,CAAC;YACvB,IAAI,CAAC,SAAS,CAAC;gBACd,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,UAAU;gBAChC,SAAS,EAAE,iBAAiB;gBAC5B,OAAO,EAAE,QAAQ,CAAC,eAAe;aACjC,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAES,SAAS,CAAC,EACnB,IAAI,EACJ,SAAS,EACT,OAAO,GAMP;QACA,MAAM,MAAM,GAAG,IAAA,4BAAiB,EAAC,SAAS,CAAC,CAAC;QAE5C,IAAI,MAAM,EAAE,CAAC;YACZ,IAAI,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;YAC1B,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QAC7B,CAAC;IACF,CAAC;CACD;AAhDD,sEAgDC"}
@@ -42,9 +42,26 @@ class OasEndpointConverter {
42
42
  }
43
43
  // Use statusCode for response
44
44
  const status = endpoint.statusCode;
45
- const responses = {
46
- [status]: { description: 'Success' },
47
- };
45
+ const responses = {};
46
+ // Generate success response with schema if available
47
+ const responseSanitizer = endpoint.response;
48
+ if (responseSanitizer && responseSanitizer.schema) {
49
+ responses[status] = {
50
+ description: 'Success',
51
+ content: {
52
+ 'application/json': {
53
+ schema: {
54
+ $ref: '#/components/schemas/' +
55
+ endpoint.getName() +
56
+ 'Response',
57
+ },
58
+ },
59
+ },
60
+ };
61
+ }
62
+ else {
63
+ responses[status] = { description: 'Success' };
64
+ }
48
65
  const errors = endpoint.getErrors();
49
66
  for (const error in errors) {
50
67
  const httpError = errors[error];
@@ -1 +1 @@
1
- {"version":3,"file":"oas-endpoint-converter.js","sourceRoot":"","sources":["../../../src/oas/oas-endpoint-converter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oas-endpoint-converter.js","sourceRoot":"","sources":["../../../src/oas/oas-endpoint-converter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "api-machine",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "api-machine",
5
5
  "typescript-template": {
6
6
  "base": "1.0.1",
@@ -31,6 +31,8 @@ export declare abstract class BaseApiEndpoint extends BaseApiRoute {
31
31
  paramsExample?: any;
32
32
  headers?: ObjectSanitizer;
33
33
  headersExample?: any;
34
+ response?: ObjectSanitizer;
35
+ responseExample?: any;
34
36
  getErrors(): {
35
37
  [key: string]: HTTPError;
36
38
  };
@@ -30,6 +30,9 @@ class BaseApiEndpoint extends base_1.BaseApiRoute {
30
30
  headers;
31
31
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
32
  headersExample;
33
+ response;
34
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
+ responseExample;
33
36
  getErrors() {
34
37
  return {
35
38
  parse: new error_1.BadRequestError(),
@@ -1 +1 @@
1
- {"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../../src/router/endpoint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../../src/router/endpoint.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,15 @@
1
- import { ApiRequest, ApiResponse } from '../endpoint';
1
+ import { ObjectSanitizer } from 'valsan';
2
2
  import { GetEndpoint } from './get-endpoint';
3
3
  export declare class HealthCheckEndpoint extends GetEndpoint {
4
4
  path: string;
5
- handle(_request: ApiRequest, _response: ApiResponse): Promise<{
5
+ responseExample: {
6
+ status: string;
7
+ timestamp: string;
8
+ uptime: number;
9
+ environment: string;
10
+ };
11
+ response: ObjectSanitizer;
12
+ handle(): Promise<{
6
13
  status: string;
7
14
  timestamp: string;
8
15
  uptime: number;
@@ -1,11 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.HealthCheckEndpoint = void 0;
4
+ const valsan_1 = require("valsan");
4
5
  const get_endpoint_1 = require("./get-endpoint");
5
6
  class HealthCheckEndpoint extends get_endpoint_1.GetEndpoint {
6
7
  path = '/health';
7
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
8
- async handle(_request, _response) {
8
+ responseExample = {
9
+ status: 'ok',
10
+ timestamp: new Date().toISOString(),
11
+ uptime: 12345,
12
+ environment: 'development',
13
+ };
14
+ response = new valsan_1.ObjectSanitizer({
15
+ status: new valsan_1.MinLengthValidator(),
16
+ timestamp: new valsan_1.Iso8601TimestampValSan(),
17
+ uptime: new valsan_1.StringToNumberValSan(),
18
+ environment: new valsan_1.MinLengthValidator(),
19
+ });
20
+ async handle() {
9
21
  return {
10
22
  status: await this.getStatus(),
11
23
  timestamp: await this.getTimestamp(),
@@ -1 +1 @@
1
- {"version":3,"file":"health-check-endpoint.js","sourceRoot":"","sources":["../../../../src/router/endpoints/health-check-endpoint.ts"],"names":[],"mappings":";;;AACA,iDAA6C;AAE7C,MAAa,mBAAoB,SAAQ,0BAAW;IAC1C,IAAI,GAAG,SAAS,CAAC;IAE1B,6DAA6D;IAC7D,KAAK,CAAC,MAAM,CAAC,QAAoB,EAAE,SAAsB;QACxD,OAAO;YACN,MAAM,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE;YAC9B,SAAS,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE;YACpC,MAAM,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE;YAC9B,WAAW,EAAE,MAAM,IAAI,CAAC,cAAc,EAAE;SACxC,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,SAAS;QACrB,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,YAAY;QACxB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;IAEM,KAAK,CAAC,SAAS;QACrB,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,cAAc;QAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,aAAa,CAAC;IACjD,CAAC;CACD;AA5BD,kDA4BC"}
1
+ {"version":3,"file":"health-check-endpoint.js","sourceRoot":"","sources":["../../../../src/router/endpoints/health-check-endpoint.ts"],"names":[],"mappings":";;;AAAA,mCAKgB;AAChB,iDAA6C;AAE7C,MAAa,mBAAoB,SAAQ,0BAAW;IAC1C,IAAI,GAAG,SAAS,CAAC;IAEjB,eAAe,GAAG;QAC1B,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,KAAK;QACb,WAAW,EAAE,aAAa;KAC1B,CAAC;IAEO,QAAQ,GAAG,IAAI,wBAAe,CAAC;QACvC,MAAM,EAAE,IAAI,2BAAkB,EAAE;QAChC,SAAS,EAAE,IAAI,+BAAsB,EAAE;QACvC,MAAM,EAAE,IAAI,6BAAoB,EAAE;QAClC,WAAW,EAAE,IAAI,2BAAkB,EAAE;KACrC,CAAC,CAAC;IAEH,KAAK,CAAC,MAAM;QACX,OAAO;YACN,MAAM,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE;YAC9B,SAAS,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE;YACpC,MAAM,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE;YAC9B,WAAW,EAAE,MAAM,IAAI,CAAC,cAAc,EAAE;SACxC,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,SAAS;QACrB,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,YAAY;QACxB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;IAEM,KAAK,CAAC,SAAS;QACrB,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,cAAc;QAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,aAAa,CAAC;IACjD,CAAC;CACD;AAzCD,kDAyCC"}
@@ -10,6 +10,7 @@ export declare abstract class BaseApiRouter extends BaseApiRoute {
10
10
  };
11
11
  getTag(): string;
12
12
  register(parent: ExpressRouter, parentPath: string): Promise<void>;
13
+ protected registerInstance(instance: BaseApiRoute): Promise<void>;
13
14
  }
14
15
  export type ApiRouter = {
15
16
  new (): BaseApiRouter;
package/router/router.js CHANGED
@@ -37,7 +37,7 @@ class BaseApiRouter extends base_1.BaseApiRoute {
37
37
  if (instance.routeType === 'endpoint') {
38
38
  instance.tag = tag;
39
39
  }
40
- await instance.register(this.router, this.fullPath);
40
+ await this.registerInstance(instance);
41
41
  this.registeredRoutes.push(instance);
42
42
  // Track endpoint methods for 405 handling
43
43
  if (instance.routeType === 'endpoint') {
@@ -65,6 +65,9 @@ class BaseApiRouter extends base_1.BaseApiRoute {
65
65
  });
66
66
  });
67
67
  }
68
+ async registerInstance(instance) {
69
+ await instance.register(this.router, this.fullPath);
70
+ }
68
71
  }
69
72
  exports.BaseApiRouter = BaseApiRouter;
70
73
  //# sourceMappingURL=router.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/router/router.ts"],"names":[],"mappings":";;;AAAA,qCAAkD;AAClD,iCAAgD;AAChD,yCAA6D;AAE7D,MAAsB,aAAc,SAAQ,mBAAY;IAC9C,SAAS,GAAG,QAAiB,CAAC;IAC7B,MAAM,CAAgB;IAEzB,gBAAgB,GAAmB,EAAE,CAAC;IAEnC,cAAc,GAAoC,EAAE,CAAC;IAExD,MAAM;QACZ,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IAEM,KAAK,CAAC,QAAQ,CACpB,MAAqB,EACrB,UAAkB;QAElB,IAAI,CAAC,MAAM,GAAG,IAAA,gBAAa,GAAE,CAAC;QAC9B,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAEnC,wCAAwC;QACxC,qEAAqE;QACrE,MAAM,qBAAqB,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnD,kDAAkD;QAClD,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,qBAAqB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9D,CAAC;aACI,CAAC;YACL,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAEnC,uCAAuC;QACvC,MAAM,WAAW,GAAG,IAAI,GAAG,EAA+B,CAAC;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAE1B,6DAA6D;QAC7D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,KAAK,EAAE,CAAC;YAE7B,uDAAuD;YACvD,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;YAE5B,IAAI,QAAQ,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;gBACtC,QAA4B,CAAC,GAAG,GAAG,GAAG,CAAC;YACzC,CAAC;YAED,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEpD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAErC,0CAA0C;YAC1C,IAAI,QAAQ,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;gBACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;gBAE3B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5B,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;gBAClC,CAAC;gBAED,WAAW;qBACT,GAAG,CAAC,IAAI,CAAE;qBACV,GAAG,CAAE,QAA4B,CAAC,MAAM,CAAC,CAAC;YAC7C,CAAC;QACF,CAAC;QAED,wDAAwD;QACxD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,yBAAc,CAAC,CAAC;QACjD,WAAW,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,IAAI,EAAE,EAAE;YAC9C,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC7B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBACnC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;wBACtC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;4BACpB,KAAK,EAAE,oBAAoB;4BAC3B,OAAO,EAAE,UAAU,GAAG,CAAC,MAAM,cAAc;yBAC3C,CAAC,CAAC;oBACJ,CAAC,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;CACD;AAjFD,sCAiFC"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/router/router.ts"],"names":[],"mappings":"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"}