temba 0.38.0 → 0.40.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 +7 -72
- package/config/index.d.ts +2 -5
- package/config/index.d.ts.map +1 -1
- package/config/index.js +2 -7
- package/config/index.js.map +1 -1
- package/data/json/index.d.ts.map +1 -1
- package/data/json/index.js +5 -2
- package/data/json/index.js.map +1 -1
- package/data/mongo/index.js +2 -2
- package/data/mongo/index.js.map +1 -1
- package/data/types.d.ts +1 -1
- package/data/types.d.ts.map +1 -1
- package/etags/etags.d.ts +1 -0
- package/etags/etags.d.ts.map +1 -1
- package/etags/etags.js +3 -0
- package/etags/etags.js.map +1 -1
- package/index.d.ts +4 -5
- package/index.d.ts.map +1 -1
- package/index.js +51 -80
- package/index.js.map +1 -1
- package/openapi/openapi.d.ts +2 -1
- package/openapi/openapi.d.ts.map +1 -1
- package/openapi/openapi.js +88 -23
- package/openapi/openapi.js.map +1 -1
- package/package.json +8 -10
- package/requestHandlers/delete.d.ts +1 -1
- package/requestHandlers/delete.d.ts.map +1 -1
- package/requestHandlers/delete.js +5 -5
- package/requestHandlers/delete.js.map +1 -1
- package/requestHandlers/get.d.ts +14 -1
- package/requestHandlers/get.d.ts.map +1 -1
- package/requestHandlers/get.js +12 -4
- package/requestHandlers/get.js.map +1 -1
- package/requestHandlers/index.d.ts +13 -0
- package/requestHandlers/index.d.ts.map +1 -1
- package/requestHandlers/index.js +5 -5
- package/requestHandlers/index.js.map +1 -1
- package/requestHandlers/patch.d.ts +1 -1
- package/requestHandlers/patch.d.ts.map +1 -1
- package/requestHandlers/patch.js +2 -2
- package/requestHandlers/patch.js.map +1 -1
- package/requestHandlers/post.d.ts.map +1 -1
- package/requestHandlers/post.js +13 -3
- package/requestHandlers/post.js.map +1 -1
- package/requestHandlers/put.d.ts +1 -1
- package/requestHandlers/put.d.ts.map +1 -1
- package/requestHandlers/put.js +2 -2
- package/requestHandlers/put.js.map +1 -1
- package/requestHandlers/types.d.ts +4 -1
- package/requestHandlers/types.d.ts.map +1 -1
- package/requestInterceptor/interceptRequest.d.ts +1 -1
- package/requestInterceptor/interceptRequest.d.ts.map +1 -1
- package/requestInterceptor/interceptRequest.js +2 -2
- package/requestInterceptor/interceptRequest.js.map +1 -1
- package/requestInterceptor/types.d.ts +4 -1
- package/requestInterceptor/types.d.ts.map +1 -1
- package/resourceHandler.d.ts +16 -0
- package/resourceHandler.d.ts.map +1 -0
- package/resourceHandler.js +189 -0
- package/resourceHandler.js.map +1 -0
- package/auth/auth.d.ts +0 -6
- package/auth/auth.d.ts.map +0 -1
- package/auth/auth.js +0 -19
- package/auth/auth.js.map +0 -1
- package/delay/delayMiddleware.d.ts +0 -3
- package/delay/delayMiddleware.d.ts.map +0 -1
- package/delay/delayMiddleware.js +0 -11
- package/delay/delayMiddleware.js.map +0 -1
- package/resourceRouter.d.ts +0 -5
- package/resourceRouter.d.ts.map +0 -1
- package/resourceRouter.js +0 -139
- package/resourceRouter.js.map +0 -1
package/README.md
CHANGED
|
@@ -100,6 +100,7 @@ For every resource (`movies` is just an example), Temba supports the following r
|
|
|
100
100
|
- `GET /movies` - Get all movies
|
|
101
101
|
- `GET /movies/:id` - Get a movie by its ID
|
|
102
102
|
- `POST /movies` - Create a new movie
|
|
103
|
+
- `POST /movies:/id` - Create a new movie specifying the ID yourself
|
|
103
104
|
- `PATCH /movies/:id` - Partially update a movie by its ID
|
|
104
105
|
- `PUT /movies/:id` - Fully replace a movie by its ID
|
|
105
106
|
- `DELETE /movies` - Delete all movies (if configured)
|
|
@@ -113,8 +114,6 @@ The HTTP methods that are supported are `GET`, `POST`, `PATCH`, `PUT`, `DELETE`,
|
|
|
113
114
|
|
|
114
115
|
On the root URI (e.g. http://localhost:8080/) only a `GET` request is supported, which shows you a message indicating the API is working. All other HTTP methods on the root URI return a `405 Method Not Allowed` response.
|
|
115
116
|
|
|
116
|
-
The `OPTIONS` method also works, but because Temba uses Express' default implementation for that, the `Access-Control-Allow-Methods` response header might not always be correct.
|
|
117
|
-
|
|
118
117
|
### JSON
|
|
119
118
|
|
|
120
119
|
Temba supports JSON only.
|
|
@@ -123,9 +122,9 @@ Request bodies sent with a `POST`, `PATCH`, and `PUT` requests are valid when th
|
|
|
123
122
|
|
|
124
123
|
Any valid formatted JSON is accepted and stored. If you want to validate or even change the JSON in the request bodies, check out [JSON Schema request body validation](#json-schema-request-body-validation) and the [`requestInterceptor`](#request-validation-or-mutation).
|
|
125
124
|
|
|
126
|
-
IDs are auto generated when creating resources.
|
|
125
|
+
IDs are auto generated when creating resources, unless you specify an ID in the `POST` request URL.
|
|
127
126
|
|
|
128
|
-
Providing IDs in the request body of `POST`, `PUT`, or `PATCH` requests is not allowed and will return a `400 Bad Request` response.
|
|
127
|
+
Providing IDs in the request body of `POST`, `PUT`, or `PATCH` requests is not allowed and will return a `400 Bad Request` response. Instead, provide the ID in the request URL. However, omitting an ID in a `PUT` or `PATCH` request URL also returns a `400 Bad Request` response.
|
|
129
128
|
|
|
130
129
|
## Usage
|
|
131
130
|
|
|
@@ -268,7 +267,7 @@ const config = {
|
|
|
268
267
|
get: ({ headers, resource, id }) => {
|
|
269
268
|
//...
|
|
270
269
|
},
|
|
271
|
-
post: ({ headers, resource, body }) => {
|
|
270
|
+
post: ({ headers, resource, id, body }) => {
|
|
272
271
|
// Validate, or even change the request body
|
|
273
272
|
},
|
|
274
273
|
put: ({ headers, resource, id, body }) => {
|
|
@@ -303,7 +302,7 @@ Example:
|
|
|
303
302
|
```js
|
|
304
303
|
const config = {
|
|
305
304
|
requestInterceptor: {
|
|
306
|
-
post: ({ headers, resource, body }) => {
|
|
305
|
+
post: ({ headers, resource, id, body }) => {
|
|
307
306
|
// Add a genre to Star Trek films:
|
|
308
307
|
if (resource === 'movies' && body.title.startsWith('Star Trek'))
|
|
309
308
|
return { ...body, genre: 'Science Fiction' }
|
|
@@ -381,68 +380,6 @@ After enabling etags, every `GET` request will return an `etag` response header,
|
|
|
381
380
|
|
|
382
381
|
For updating or deleting items with a `PUT`, `PATCH`, or `DELETE`, after enabling etags, these requests are _required_ to provide an `If-Match` header with the etag. Only if the etag represents the latest version of the resource the update is made, otherwise the server responds with a `412 Precondition Failed` status code.
|
|
383
382
|
|
|
384
|
-
### Custom router
|
|
385
|
-
|
|
386
|
-
Because Temba uses Express under the hood, you can create an Express router, and configure it as a `customRouter`:
|
|
387
|
-
|
|
388
|
-
```js
|
|
389
|
-
// Example code of how to create an Express router, from the official Express docs at https://expressjs.com/en/guide/routing.html:
|
|
390
|
-
const express = require('express')
|
|
391
|
-
const router = express.Router()
|
|
392
|
-
|
|
393
|
-
// middleware that is specific to this router
|
|
394
|
-
router.use((req, res, next) => {
|
|
395
|
-
console.log('Time: ', Date.now())
|
|
396
|
-
next()
|
|
397
|
-
})
|
|
398
|
-
// define the home page route
|
|
399
|
-
router.get('/', (req, res) => {
|
|
400
|
-
res.send('Birds home page')
|
|
401
|
-
})
|
|
402
|
-
// define the about route
|
|
403
|
-
router.get('/about', (req, res) => {
|
|
404
|
-
res.send('About birds')
|
|
405
|
-
})
|
|
406
|
-
|
|
407
|
-
// Add the custom router to Temba config
|
|
408
|
-
const config = {
|
|
409
|
-
customRouter: router,
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
const server = create(config)
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
> 💁 Don't overuse `customRouter`, as it defeats the purpose of Temba being a simple out-of-the-box solution.
|
|
416
|
-
|
|
417
|
-
A `customRouter` can only overrule resource routes. The root URL (with or without `staticFolder`) will always be handled by Temba.
|
|
418
|
-
|
|
419
|
-
So for the following router and config:
|
|
420
|
-
|
|
421
|
-
```
|
|
422
|
-
router.get('/', (req, res) => {
|
|
423
|
-
res.send('Birds home page')
|
|
424
|
-
})
|
|
425
|
-
router.get('/stuff', (req, res) => {
|
|
426
|
-
res.send('Some stuff')
|
|
427
|
-
})
|
|
428
|
-
router.get('api/stuff', (req, res) => {
|
|
429
|
-
res.send('Some API stuff')
|
|
430
|
-
})
|
|
431
|
-
|
|
432
|
-
const config = {
|
|
433
|
-
apiPrefix: 'api',
|
|
434
|
-
customRouter: router,
|
|
435
|
-
resources: ['stuff'],
|
|
436
|
-
staticFolder: 'build',
|
|
437
|
-
}
|
|
438
|
-
const server = create(config)
|
|
439
|
-
```
|
|
440
|
-
|
|
441
|
-
- `/` will be handled by Temba, and will return the `staticFolder` (`build`) folder contents
|
|
442
|
-
- `/stuff` and `/api/stuff` will be handled by the custom router
|
|
443
|
-
- `/movies` will return a `404 Not Found`, because of `apiPrefix`
|
|
444
|
-
- `/api/movies` will return movies, handled by Temba
|
|
445
|
-
|
|
446
383
|
## Config settings overview
|
|
447
384
|
|
|
448
385
|
Configuring Temba is optional, it already works out of the box.
|
|
@@ -454,7 +391,6 @@ const config = {
|
|
|
454
391
|
allowDeleteCollection: true,
|
|
455
392
|
apiPrefix: 'api',
|
|
456
393
|
connectionString: 'mongodb://localhost:27017/myDatabase',
|
|
457
|
-
customRouter: router,
|
|
458
394
|
delay: 500,
|
|
459
395
|
etags: true,
|
|
460
396
|
port: 4321,
|
|
@@ -462,7 +398,7 @@ const config = {
|
|
|
462
398
|
get: ({ headers, resource, id }) => {
|
|
463
399
|
//...
|
|
464
400
|
},
|
|
465
|
-
post: ({ headers, resource, body }) => {
|
|
401
|
+
post: ({ headers, resource, id, body }) => {
|
|
466
402
|
// Validate, or even change the request body
|
|
467
403
|
},
|
|
468
404
|
put: ({ headers, resource, id, body }) => {
|
|
@@ -503,7 +439,6 @@ These are all the possible settings:
|
|
|
503
439
|
| `allowDeleteCollection` | Whether a `DELETE` request on a collection is allowed to delete all items. | `false` |
|
|
504
440
|
| `apiPrefix` | See [API prefix](#api-prefix) | `null` |
|
|
505
441
|
| `connectionString` | See [Data persistency](#data-persistency) | `null` |
|
|
506
|
-
| `customRouter` | See [Custom router](#custom-router) | `null` |
|
|
507
442
|
| `delay` | The delay, in milliseconds, after processing the request before sending the response. | `0` |
|
|
508
443
|
| `etags` | See [Caching and consistency with Etags](#caching-and-consistency-with-etags) | `false` |
|
|
509
444
|
| `port` | The port your Temba server listens on | `3000` |
|
|
@@ -516,7 +451,7 @@ These are all the possible settings:
|
|
|
516
451
|
|
|
517
452
|
## Under the hood
|
|
518
453
|
|
|
519
|
-
Temba is built with TypeScript, [Node](https://nodejs.org), [
|
|
454
|
+
Temba is built with TypeScript, [Node](https://nodejs.org), [Vitest](https://vitest.dev/), [Supertest](https://www.npmjs.com/package/supertest), [@rakered/mongo](https://www.npmjs.com/package/@rakered/mongo), and [lowdb](https://www.npmjs.com/package/lowdb).
|
|
520
455
|
|
|
521
456
|
## Contributors ✨
|
|
522
457
|
|
package/config/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Router } from 'express';
|
|
2
1
|
import type { ConfiguredSchemas } from '../schema/types.js';
|
|
3
2
|
import type { RequestInterceptor } from '../requestInterceptor/types.js';
|
|
4
3
|
import type { ResponseBodyInterceptor } from '../responseBodyInterceptor/types.js';
|
|
@@ -19,17 +18,16 @@ export type Config = {
|
|
|
19
18
|
staticFolder: string | null;
|
|
20
19
|
connectionString: string | null;
|
|
21
20
|
delay: number;
|
|
22
|
-
customRouter: Router | null;
|
|
23
21
|
returnNullFields: boolean;
|
|
24
22
|
isTesting: boolean;
|
|
25
23
|
port: number;
|
|
26
24
|
schemas: ConfiguredSchemas | null;
|
|
27
25
|
allowDeleteCollection: boolean;
|
|
28
|
-
|
|
26
|
+
etagsEnabled: boolean;
|
|
29
27
|
openapi: OpenApiConfig;
|
|
30
28
|
};
|
|
31
29
|
export type ConfigKey = keyof Config;
|
|
32
|
-
export type RouterConfig = Pick<Config, 'validateResources' | 'resources' | 'apiPrefix' | 'requestInterceptor' | 'responseBodyInterceptor' | 'returnNullFields' | 'allowDeleteCollection' | '
|
|
30
|
+
export type RouterConfig = Pick<Config, 'validateResources' | 'resources' | 'apiPrefix' | 'requestInterceptor' | 'responseBodyInterceptor' | 'returnNullFields' | 'allowDeleteCollection' | 'etagsEnabled'>;
|
|
33
31
|
export type UserConfig = {
|
|
34
32
|
resources?: Resources;
|
|
35
33
|
staticFolder?: string;
|
|
@@ -38,7 +36,6 @@ export type UserConfig = {
|
|
|
38
36
|
delay?: number;
|
|
39
37
|
requestInterceptor?: RequestInterceptor;
|
|
40
38
|
responseBodyInterceptor?: ResponseBodyInterceptor;
|
|
41
|
-
customRouter?: Router;
|
|
42
39
|
returnNullFields?: boolean;
|
|
43
40
|
isTesting?: boolean;
|
|
44
41
|
port?: number;
|
package/config/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AACrE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAA;AAE/E,KAAK,YAAY,GAAG,MAAM,CAAA;AAE1B,KAAK,gBAAgB,GAAG;IACtB,YAAY,EAAE,YAAY,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,KAAK,SAAS,GAAG,CAAC,YAAY,GAAG,gBAAgB,CAAC,EAAE,CAAA;AAEpD,KAAK,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEtD,MAAM,MAAM,MAAM,GAAG;IACnB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,SAAS,EAAE,SAAS,CAAA;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAA;IAC7C,uBAAuB,EAAE,uBAAuB,GAAG,IAAI,CAAA;IACvD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,gBAAgB,EAAE,OAAO,CAAA;IACzB,SAAS,EAAE,OAAO,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAA;IACjC,qBAAqB,EAAE,OAAO,CAAA;IAC9B,YAAY,EAAE,OAAO,CAAA;IACrB,OAAO,EAAE,aAAa,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,MAAM,CAAA;AAEpC,MAAM,MAAM,YAAY,GAAG,IAAI,CAC7B,MAAM,EACJ,mBAAmB,GACnB,WAAW,GACX,WAAW,GACX,oBAAoB,GACpB,yBAAyB,GACzB,kBAAkB,GAClB,uBAAuB,GACvB,cAAc,CACjB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC,uBAAuB,CAAC,EAAE,uBAAuB,CAAA;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,iBAAiB,CAAA;IAC3B,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB,CAAA;AAoBD,eAAO,MAAM,UAAU,gBAAiB,UAAU,KAAG,MAoGpD,CAAA;AAED,eAAO,MAAM,WAAW,UAAW,OAAO,KAAG,KAAK,IAAI,SAAyC,CAAA"}
|
package/config/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Router } from 'express';
|
|
2
1
|
const defaultConfig = {
|
|
3
2
|
resources: [],
|
|
4
3
|
validateResources: false,
|
|
@@ -8,13 +7,12 @@ const defaultConfig = {
|
|
|
8
7
|
delay: 0,
|
|
9
8
|
requestInterceptor: null,
|
|
10
9
|
responseBodyInterceptor: null,
|
|
11
|
-
customRouter: null,
|
|
12
10
|
returnNullFields: true,
|
|
13
11
|
isTesting: false,
|
|
14
12
|
port: 3000,
|
|
15
13
|
schemas: null,
|
|
16
14
|
allowDeleteCollection: false,
|
|
17
|
-
|
|
15
|
+
etagsEnabled: false,
|
|
18
16
|
openapi: false,
|
|
19
17
|
};
|
|
20
18
|
export const initConfig = (userConfig) => {
|
|
@@ -67,9 +65,6 @@ export const initConfig = (userConfig) => {
|
|
|
67
65
|
if (userConfig.responseBodyInterceptor) {
|
|
68
66
|
config.responseBodyInterceptor = userConfig.responseBodyInterceptor;
|
|
69
67
|
}
|
|
70
|
-
if (userConfig.customRouter) {
|
|
71
|
-
config.customRouter = userConfig.customRouter;
|
|
72
|
-
}
|
|
73
68
|
if (!isUndefined(userConfig.returnNullFields)) {
|
|
74
69
|
config.returnNullFields = userConfig.returnNullFields;
|
|
75
70
|
}
|
|
@@ -86,7 +81,7 @@ export const initConfig = (userConfig) => {
|
|
|
86
81
|
config.allowDeleteCollection = userConfig.allowDeleteCollection;
|
|
87
82
|
}
|
|
88
83
|
if (!isUndefined(userConfig.etags)) {
|
|
89
|
-
config.
|
|
84
|
+
config.etagsEnabled = userConfig.etags;
|
|
90
85
|
}
|
|
91
86
|
if (!isUndefined(userConfig.openapi)) {
|
|
92
87
|
config.openapi = userConfig.openapi;
|
package/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"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"}
|
package/data/json/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/data/json/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,OAAO,EAAE,MAAM,UAAU,CAAA;AAmB5D,KAAK,UAAU,GAAG;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/data/json/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,OAAO,EAAE,MAAM,UAAU,CAAA;AAmB5D,KAAK,UAAU,GAAG;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE,UAAU,WAyEjE"}
|
package/data/json/index.js
CHANGED
|
@@ -27,9 +27,12 @@ export default function createJsonQueries({ filename }) {
|
|
|
27
27
|
const data = db.data[resource] || [];
|
|
28
28
|
return (data || []).find((x) => x.id === id) || null;
|
|
29
29
|
}
|
|
30
|
-
async function create(resource, item) {
|
|
30
|
+
async function create(resource, id, item) {
|
|
31
31
|
const db = await getDb();
|
|
32
|
-
const itemWithId = {
|
|
32
|
+
const itemWithId = {
|
|
33
|
+
...item,
|
|
34
|
+
id: id || String(new Date().getTime()),
|
|
35
|
+
};
|
|
33
36
|
await db.update((data) => {
|
|
34
37
|
data[resource] = [...(data[resource] || []), itemWithId];
|
|
35
38
|
});
|
package/data/json/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/data/json/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAgB,MAAM,EAAE,MAAM,OAAO,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAGrC,MAAM,aAAa,GAAG,CAAO,WAAiB,EAAsB,EAAE;IACpE,OAAO,SAAS,CAAC,IAAI,MAAM,EAAQ,EAAE,WAAW,CAAC,CAAA;AACnD,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,KAAK,EAAQ,QAAkB,EAAE,WAAiB,EAAsB,EAAE;IAC1F,OAAO,MAAM,SAAS,CAAC,IAAI,QAAQ,CAAO,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAA;AACnE,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,KAAK,EAAQ,OAAsB,EAAE,WAAiB,EAAsB,EAAE;IAC9F,MAAM,EAAE,GAAG,IAAI,GAAG,CAAO,OAAO,EAAE,WAAW,CAAC,CAAA;IAC9C,MAAM,EAAE,CAAC,IAAI,EAAE,CAAA;IACf,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAMD,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EAAE,QAAQ,EAAc;IAChE,MAAM,WAAW,GAA8B,EAAE,CAAA;IAEjD,KAAK,UAAU,KAAK;QAClB,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,WAAW,CAAC,CAAA;QAC/F,OAAO,EAAE,CAAA;IACX,CAAC;IAED,KAAK,UAAU,MAAM,CAAC,QAAgB;QACpC,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAA;QACxB,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;QACpC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,UAAU,OAAO,CAAC,QAAgB,EAAE,EAAU;QACjD,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAA;QACxB,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;QACpC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAA;IACtD,CAAC;IAED,KAAK,UAAU,MAAM,CAAC,QAAgB,EAAE,IAAmB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/data/json/index.ts"],"names":[],"mappings":"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"}
|
package/data/mongo/index.js
CHANGED
|
@@ -34,9 +34,9 @@ export const createMongoQueries = (connectionString, logger) => {
|
|
|
34
34
|
return null;
|
|
35
35
|
return removeUnderscoreFromId(item);
|
|
36
36
|
};
|
|
37
|
-
const create = async (resource, item) => {
|
|
37
|
+
const create = async (resource, id, item) => {
|
|
38
38
|
await connectToDatabase();
|
|
39
|
-
const createdItem = await db[resource].insertOne(item);
|
|
39
|
+
const createdItem = await db[resource].insertOne(id ? { ...item, _id: id } : item);
|
|
40
40
|
return removeUnderscoreFromId(createdItem.ops[0]);
|
|
41
41
|
};
|
|
42
42
|
const update = async (resource, item) => {
|
package/data/mongo/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/data/mongo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAIjD,IAAI,GAAW,CAAA;AACf,IAAI,EAAM,CAAA;AAOV,MAAM,sBAAsB,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,WAAW,EAAa,EAAQ,EAAE,CAAC,CAAC;IAChF,EAAE;IACF,GAAG,WAAW;CACf,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,gBAAwB,EAAE,MAAc,EAAE,EAAE;IAC7E,GAAG,GAAG,gBAAgB,CAAA;IAEtB,MAAM,iBAAiB,GAAG,KAAK,IAAI,EAAE;QACnC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;YACxC,IAAI,CAAC;gBACH,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;gBACvB,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;YACvC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;gBAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;QACxC,MAAM,iBAAiB,EAAE,CAAA;QAEzB,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAgB,CAAA;QAE1D,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAA;QAErB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAA;IAC1D,CAAC,CAAA;IAED,MAAM,OAAO,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAU,EAAE,EAAE;QACrD,MAAM,iBAAiB,EAAE,CAAA;QAEzB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAA;QAEpD,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAA;QAEtB,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAA;IACrC,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,KAAK,EAAE,QAAgB,EAAE,IAAmB,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/data/mongo/index.ts"],"names":[],"mappings":"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"}
|
package/data/types.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export type ItemWithoutId = Omit<Item, 'id'>;
|
|
|
6
6
|
export type Queries = {
|
|
7
7
|
getAll: (resource: string) => Promise<Item[]>;
|
|
8
8
|
getById: (resource: string, id: string) => Promise<Item | null>;
|
|
9
|
-
create: (resource: string, item: ItemWithoutId) => Promise<Item>;
|
|
9
|
+
create: (resource: string, id: string | null, item: ItemWithoutId) => Promise<Item>;
|
|
10
10
|
update: (resource: string, item: Item) => Promise<Item>;
|
|
11
11
|
replace: (resource: string, item: Item) => Promise<Item>;
|
|
12
12
|
deleteById: (resource: string, id: string) => Promise<void>;
|
package/data/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/data/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,GAAG;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AAE5C,MAAM,MAAM,OAAO,GAAG;IACpB,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IAC7C,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;IAC/D,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/data/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,GAAG;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AAE5C,MAAM,MAAM,OAAO,GAAG;IACpB,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IAC7C,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;IAC/D,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACnF,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACxD,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3D,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/C,CAAA"}
|
package/etags/etags.d.ts
CHANGED
package/etags/etags.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"etags.d.ts","sourceRoot":"","sources":["../../../src/etags/etags.ts"],"names":[],"mappings":"AAAA,OAAwB,EAAE,KAAK,SAAS,EAAE,MAAM,MAAM,CAAA;AAOtD,eAAO,MAAM,IAAI,WAAY,MAAM,GAAG,MAAM,GAAG,SAAS,WAEvD,CAAA"}
|
|
1
|
+
{"version":3,"file":"etags.d.ts","sourceRoot":"","sources":["../../../src/etags/etags.ts"],"names":[],"mappings":"AAAA,OAAwB,EAAE,KAAK,SAAS,EAAE,MAAM,MAAM,CAAA;AAOtD,eAAO,MAAM,YAAY,YAAa,OAAO,WAE5C,CAAA;AAED,eAAO,MAAM,IAAI,WAAY,MAAM,GAAG,MAAM,GAAG,SAAS,WAEvD,CAAA"}
|
package/etags/etags.js
CHANGED
|
@@ -3,6 +3,9 @@ import etagFromExpress, {} from 'etag';
|
|
|
3
3
|
// Express only supports generating them, so to be sure we use the same algorithm for both,
|
|
4
4
|
// we use the etag module for both by wrapping it here.
|
|
5
5
|
// This means we also override the default Express etag function, but that's with the same algorithm.
|
|
6
|
+
export const generateEtag = (payload) => {
|
|
7
|
+
return etag(JSON.stringify(payload));
|
|
8
|
+
};
|
|
6
9
|
export const etag = (entity) => {
|
|
7
10
|
return etagFromExpress(entity, { weak: true });
|
|
8
11
|
};
|
package/etags/etags.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"etags.js","sourceRoot":"","sources":["../../../src/etags/etags.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,EAAE,EAAkB,MAAM,MAAM,CAAA;AAEtD,iFAAiF;AACjF,2FAA2F;AAC3F,uDAAuD;AACvD,qGAAqG;AAErG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAmC,EAAE,EAAE;IAC1D,OAAO,eAAe,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;AAChD,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"etags.js","sourceRoot":"","sources":["../../../src/etags/etags.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,EAAE,EAAkB,MAAM,MAAM,CAAA;AAEtD,iFAAiF;AACjF,2FAA2F;AAC3F,uDAAuD;AACvD,qGAAqG;AAErG,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;AACtC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAmC,EAAE,EAAE;IAC1D,OAAO,eAAe,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;AAChD,CAAC,CAAA"}
|
package/index.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import {
|
|
1
|
+
import { type UserConfig } from './config/index.js';
|
|
2
|
+
import type { IncomingMessage, ServerResponse } from 'http';
|
|
3
3
|
export declare const create: (userConfig?: UserConfig) => {
|
|
4
|
-
start: () =>
|
|
5
|
-
|
|
4
|
+
start: () => import("http").Server<typeof IncomingMessage, typeof ServerResponse> | undefined;
|
|
5
|
+
server: import("http").Server<typeof IncomingMessage, typeof ServerResponse> | undefined;
|
|
6
6
|
};
|
|
7
|
-
export declare const TembaError: typeof TembaErrorInternal;
|
|
8
7
|
//# sourceMappingURL=index.d.ts.map
|
package/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAoF3D,eAAO,MAAM,MAAM,gBAAiB,UAAU;;;CAA6B,CAAA"}
|
package/index.js
CHANGED
|
@@ -1,101 +1,72 @@
|
|
|
1
|
-
import
|
|
2
|
-
import morgan from 'morgan';
|
|
3
|
-
import { createQueries } from './data/queries.js';
|
|
1
|
+
import { createServer as httpCreateServer } from 'node:http';
|
|
4
2
|
import { initConfig } from './config/index.js';
|
|
5
|
-
import
|
|
6
|
-
import { createDelayMiddleware } from './delay/delayMiddleware.js';
|
|
3
|
+
import { createQueries } from './data/queries.js';
|
|
7
4
|
import { compileSchemas } from './schema/compile.js';
|
|
8
|
-
import {
|
|
9
|
-
import { TembaError as TembaErrorInternal } from './requestInterceptor/TembaError.js';
|
|
10
|
-
import { createAuthMiddleware, isAuthEnabled } from './auth/auth.js';
|
|
5
|
+
import { createResourceHandler, handleMethodNotAllowed, handleNotFound, noopHandler, sendErrorResponse, } from './resourceHandler.js';
|
|
11
6
|
import { initLogger } from './log/logger.js';
|
|
12
|
-
import {
|
|
13
|
-
import
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
res.status(404).json({ message: 'Not Found' });
|
|
7
|
+
import { createOpenApiHandler } from './openapi/openapi.js';
|
|
8
|
+
import morgan from 'morgan';
|
|
9
|
+
const handleRootUrl = (req, res) => {
|
|
10
|
+
if (req.method !== 'GET')
|
|
11
|
+
return handleMethodNotAllowed(req, res);
|
|
12
|
+
res.statusCode = 200;
|
|
13
|
+
res.setHeader('Content-Type', 'text/plain');
|
|
14
|
+
res.end('It works! ツ');
|
|
21
15
|
};
|
|
16
|
+
const removePendingAndTrailingSlashes = (url) => (url ? url.replace(/^\/+|\/+$/g, '') : '');
|
|
22
17
|
const createServer = (userConfig) => {
|
|
23
|
-
const { logger, logLevel } = initLogger(process.env.LOG_LEVEL);
|
|
24
18
|
const config = initConfig(userConfig);
|
|
19
|
+
const rootPath = config.apiPrefix ? removePendingAndTrailingSlashes(config.apiPrefix) : '';
|
|
20
|
+
const openapiPaths = [
|
|
21
|
+
`${rootPath ? `${rootPath}/` : ''}openapi.json`,
|
|
22
|
+
`${rootPath ? `${rootPath}/` : ''}openapi.yaml`,
|
|
23
|
+
];
|
|
24
|
+
const { logger, logLevel } = initLogger(process.env.LOG_LEVEL);
|
|
25
25
|
const queries = createQueries(config.connectionString, logger);
|
|
26
|
-
const app = express();
|
|
27
|
-
app.use(json());
|
|
28
|
-
app.set('etag', config.etags ? (entity) => etag(entity) : false);
|
|
29
|
-
// Add HTTP request logging.
|
|
30
|
-
if (logLevel === 'debug')
|
|
31
|
-
app.use(morgan('tiny'));
|
|
32
|
-
// Enable CORS for all requests.
|
|
33
|
-
app.use(cors({ origin: true, credentials: true }));
|
|
34
|
-
// Serve a static folder, if configured.
|
|
35
|
-
// Because it is defined before the auth middleware, the static folder is served without authentication,
|
|
36
|
-
// because it is not convenient to add an auth header to a web page in the browser.
|
|
37
|
-
if (config.staticFolder) {
|
|
38
|
-
app.use(express.static(config.staticFolder));
|
|
39
|
-
}
|
|
40
|
-
// If enabled, add auth middleware to all requests, and disable the tokens resource.
|
|
41
|
-
if (isAuthEnabled()) {
|
|
42
|
-
app.use(createAuthMiddleware(queries));
|
|
43
|
-
app.all('/tokens', handleNotFound);
|
|
44
|
-
}
|
|
45
|
-
// Add a delay to every request, if configured.
|
|
46
|
-
if (config.delay > 0) {
|
|
47
|
-
const delayMiddleware = createDelayMiddleware(config.delay);
|
|
48
|
-
app.use(delayMiddleware);
|
|
49
|
-
}
|
|
50
|
-
// On the root URL (with apiPrefix, if applicable) only a GET is allowed.
|
|
51
|
-
const rootRouter = express.Router();
|
|
52
|
-
const rootPath = config.apiPrefix ? `${config.apiPrefix}` : '/';
|
|
53
|
-
app.use(rootPath, rootRouter);
|
|
54
|
-
// Use a custom router, if configured.
|
|
55
|
-
if (config.customRouter) {
|
|
56
|
-
app.use(config.customRouter);
|
|
57
|
-
}
|
|
58
|
-
app.use('/openapi.json', createOpenApiRouter('json', config));
|
|
59
|
-
app.use('/openapi.yaml', createOpenApiRouter('yaml', config));
|
|
60
|
-
// Temba supports the GET, POST, PUT, PATCH, DELETE, and HEAD methods for resource URLs.
|
|
61
|
-
// HEAD is not implemented here, because Express supports it out of the box.
|
|
62
|
-
// Create a router on all other URLs, for all supported methods
|
|
63
|
-
const resourcePath = config.apiPrefix ? `${config.apiPrefix}*` : '*';
|
|
64
26
|
const schemas = compileSchemas(config.schemas);
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
27
|
+
const handleResource = createResourceHandler(queries, schemas, config);
|
|
28
|
+
const httpLogger = logLevel === 'debug' ? morgan('tiny') : noopHandler;
|
|
29
|
+
const server = httpCreateServer((req, res) => {
|
|
30
|
+
httpLogger(req, res, (err) => {
|
|
31
|
+
if (err)
|
|
32
|
+
return sendErrorResponse(res);
|
|
33
|
+
const requestUrl = removePendingAndTrailingSlashes(req.url);
|
|
34
|
+
const handleRequest = () => {
|
|
35
|
+
if (requestUrl === rootPath) {
|
|
36
|
+
handleRootUrl(req, res);
|
|
37
|
+
}
|
|
38
|
+
else if (openapiPaths.includes(requestUrl)) {
|
|
39
|
+
createOpenApiHandler(requestUrl.endsWith('.json') ? 'json' : 'yaml', config)(req, res);
|
|
40
|
+
}
|
|
41
|
+
else if (requestUrl.startsWith(rootPath)) {
|
|
42
|
+
handleResource(req, res);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
handleNotFound(req, res);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
if (config.delay > 0) {
|
|
49
|
+
setTimeout(handleRequest, config.delay);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
handleRequest();
|
|
53
|
+
}
|
|
54
|
+
});
|
|
70
55
|
});
|
|
71
|
-
// All other requests to the root URL are not allowed.
|
|
72
|
-
rootRouter.all('/', handleMethodNotAllowed);
|
|
73
|
-
// In case of an API prefix, resource URLs outside of the API prefix return a 404 Not Found.
|
|
74
|
-
if (config.apiPrefix) {
|
|
75
|
-
app.get('*', handleNotFound);
|
|
76
|
-
app.post('*', handleNotFound);
|
|
77
|
-
app.put('*', handleNotFound);
|
|
78
|
-
app.delete('*', handleNotFound);
|
|
79
|
-
app.patch('*', handleNotFound);
|
|
80
|
-
}
|
|
81
|
-
// All other methods to any URL are not allowed.
|
|
82
|
-
app.all('*', handleMethodNotAllowed);
|
|
83
|
-
if (config.apiPrefix)
|
|
84
|
-
app.all(`${config.apiPrefix}*`, handleMethodNotAllowed);
|
|
85
56
|
return {
|
|
86
57
|
start: () => {
|
|
87
58
|
if (config.isTesting) {
|
|
88
59
|
logger.info('⛔️ Server not started. Remove or disable isTesting from your config.');
|
|
89
60
|
return;
|
|
90
61
|
}
|
|
91
|
-
|
|
92
|
-
|
|
62
|
+
server.listen(config.port, () => {
|
|
63
|
+
console.log(`✅ Server listening on port ${config.port}`);
|
|
93
64
|
});
|
|
65
|
+
return server;
|
|
94
66
|
},
|
|
95
|
-
// Expose
|
|
96
|
-
|
|
67
|
+
// Expose the http server for testing purposes only, e.g. usage with supertest.
|
|
68
|
+
server: config.isTesting ? server : undefined,
|
|
97
69
|
};
|
|
98
70
|
};
|
|
99
71
|
export const create = (userConfig) => createServer(userConfig);
|
|
100
|
-
export const TembaError = TembaErrorInternal;
|
|
101
72
|
//# sourceMappingURL=index.js.map
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAmB,MAAM,UAAU,CAAA;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,WAAW,EACX,iBAAiB,GAClB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,MAAM,aAAa,GAAG,CACpB,GAAoB,EACpB,GAA+D,EAC/D,EAAE;IACF,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK;QAAE,OAAO,sBAAsB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAEjE,GAAG,CAAC,UAAU,GAAG,GAAG,CAAA;IACpB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAA;IAC3C,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;AACxB,CAAC,CAAA;AAED,MAAM,+BAA+B,GAAG,CAAC,GAAY,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AAEpG,MAAM,YAAY,GAAG,CAAC,UAAuB,EAAE,EAAE;IAC/C,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAA;IAErC,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,+BAA+B,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC1F,MAAM,YAAY,GAAG;QACnB,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,cAAc;QAC/C,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,cAAc;KAChD,CAAA;IACD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAC9D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;IAC9D,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC9C,MAAM,cAAc,GAAG,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IACtE,MAAM,UAAU,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAA;IAEtE,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC3C,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE;YAC3B,IAAI,GAAG;gBAAE,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAA;YAEtC,MAAM,UAAU,GAAG,+BAA+B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAE3D,MAAM,aAAa,GAAG,GAAG,EAAE;gBACzB,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;oBAC5B,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;gBACzB,CAAC;qBAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC7C,oBAAoB,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;gBACxF,CAAC;qBAAM,IAAI,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC3C,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;gBAC1B,CAAC;qBAAM,CAAC;oBACN,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;gBAC1B,CAAC;YACH,CAAC,CAAA;YAED,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBACrB,UAAU,CAAC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;YACzC,CAAC;iBAAM,CAAC;gBACN,aAAa,EAAE,CAAA;YACjB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,KAAK,EAAE,GAAG,EAAE;YACV,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAA;gBACnF,OAAM;YACR,CAAC;YAED,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;gBAC9B,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;YAC1D,CAAC,CAAC,CAAA;YACF,OAAO,MAAM,CAAA;QACf,CAAC;QACD,kFAAkF;QAClF,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KAC9C,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,UAAuB,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAA"}
|
package/openapi/openapi.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Config } from '../config/index.js';
|
|
2
|
+
import type { IncomingMessage, ServerResponse } from 'http';
|
|
2
3
|
type OpenApiFormat = 'json' | 'yaml';
|
|
3
|
-
export declare const
|
|
4
|
+
export declare const createOpenApiHandler: (format: OpenApiFormat, config: Config) => (req: IncomingMessage, res: ServerResponse<IncomingMessage>) => Promise<void>;
|
|
4
5
|
export {};
|
|
5
6
|
//# sourceMappingURL=openapi.d.ts.map
|
package/openapi/openapi.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../../src/openapi/openapi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../../src/openapi/openapi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAIvC,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AA8C3D,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,CAAA;AAIpC,eAAO,MAAM,oBAAoB,WAAY,aAAa,UAAU,MAAM,WACrC,eAAe,OAAO,cAAc,CAAC,eAAe,CAAC,kBAofzF,CAAA"}
|