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 +5 -115
- package/oas/oas-endpoint-component-converter.js +8 -0
- package/oas/oas-endpoint-component-converter.js.map +1 -1
- package/oas/oas-endpoint-converter.js +20 -3
- package/oas/oas-endpoint-converter.js.map +1 -1
- package/package.json +1 -1
- package/router/endpoint.d.ts +2 -0
- package/router/endpoint.js +3 -0
- package/router/endpoint.js.map +1 -1
- package/router/endpoints/health-check-endpoint.d.ts +9 -2
- package/router/endpoints/health-check-endpoint.js +14 -2
- package/router/endpoints/health-check-endpoint.js.map +1 -1
- package/router/router.d.ts +1 -0
- package/router/router.js +4 -1
- package/router/router.js.map +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
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
|
|
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
|
-
-
|
|
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
|
|
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;
|
|
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
|
-
|
|
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":";;;
|
|
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
package/router/endpoint.d.ts
CHANGED
package/router/endpoint.js
CHANGED
|
@@ -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(),
|
package/router/endpoint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../../src/router/endpoint.ts"],"names":[],"mappings":";;;AASA,iCAAsC;AACtC,mEAA0D;AAC1D,oCAAgF;AAShF,IAAY,cAMX;AAND,WAAY,cAAc;IACzB,6BAAW,CAAA;IACX,+BAAa,CAAA;IACb,6BAAW,CAAA;IACX,mCAAiB,CAAA;IACjB,iCAAe,CAAA;AAChB,CAAC,EANW,cAAc,8BAAd,cAAc,QAMzB;AAED,MAAsB,eAAgB,SAAQ,mBAAY;IAChD,SAAS,GAAG,UAAmB,CAAC;IAChC,IAAI,GAAG,EAAE,CAAC;IACZ,GAAG,CAAU;IACb,MAAM,GAAmB,cAAc,CAAC,GAAG,CAAC;IAC5C,UAAU,GAAW,GAAG,CAAC;IAEzB,IAAI,CAAmB;IAC9B,8DAA8D;IACvD,WAAW,CAAO;IAElB,KAAK,CAAmB;IAC/B,8DAA8D;IACvD,YAAY,CAAO;IAEnB,MAAM,CAAmB;IAChC,8DAA8D;IACvD,aAAa,CAAO;IAEpB,OAAO,CAAmB;IACjC,8DAA8D;IACvD,cAAc,CAAO;IAErB,SAAS;QACf,OAAO;YACN,KAAK,EAAE,IAAI,uBAAe,EAAE;YAC5B,UAAU,EAAE,IAAI,gCAAwB,EAAE;SAC1C,CAAC;IACH,CAAC;IAEM,MAAM;QACZ,iEAAiE;QACjE,OAAO,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC;IAEe,KAAK,CAAC,QAAQ,CAC7B,YAA2B,EAC3B,UAAkB;QAElB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAEnC,8CAA8C;QAC9C,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QAEhD,kEAAkE;QAClE,4DAA4D;QAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;QACxD,IAAI,aAAa,EAAE,CAAC;YACnB,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,uDAAuD;QACvD,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CACxB,IAAI,CAAC,IAAI,EACT,GAAG,kBAAkB,EACrB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAC7B,CAAC;QACH,CAAC;aACI,CAAC;YACL,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACrE,CAAC;IACF,CAAC;IAEM,KAAK,CAAC,aAAa,CACzB,OAAmB,EACnB,QAAqB,EACrB,IAAqB;QAErB,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAExD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAQM,KAAK,CAAC,YAAY,CAAC,OAAmB;QAC5C,wDAAwD;QACxD,6BAA6B;QAC7B,MAAM,IAAA,uCAAe,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;CACD;
|
|
1
|
+
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../../src/router/endpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
8
|
-
|
|
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":";;;
|
|
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"}
|
package/router/router.d.ts
CHANGED
|
@@ -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
|
|
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
|
package/router/router.js.map
CHANGED
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/router/router.ts"],"names":[],"mappings":"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"}
|