temba 0.12.21 → 0.13.1
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 +25 -29
- package/config/index.d.ts +4 -4
- package/config/index.js +13 -14
- package/config/index.js.map +1 -1
- package/package.json +1 -1
- package/queries/in-memory.d.ts +2 -0
- package/queries/in-memory.js +5 -4
- package/queries/in-memory.js.map +1 -1
- package/queries/mongo.d.ts +2 -0
- package/queries/mongo.js +12 -0
- package/queries/mongo.js.map +1 -1
- package/queries/queries.d.ts +2 -0
- package/routes/get.js +2 -2
- package/routes/get.js.map +1 -1
- package/routes/interceptors.d.ts +3 -0
- package/routes/{validator.js → interceptors.js} +5 -5
- package/routes/interceptors.js.map +1 -0
- package/routes/patch.d.ts +1 -1
- package/routes/patch.js +3 -3
- package/routes/patch.js.map +1 -1
- package/routes/post.d.ts +1 -1
- package/routes/post.js +3 -3
- package/routes/post.js.map +1 -1
- package/routes/put.d.ts +1 -1
- package/routes/put.js +4 -4
- package/routes/put.js.map +1 -1
- package/routes/routes.d.ts +1 -1
- package/routes/routes.js +4 -4
- package/routes/routes.js.map +1 -1
- package/routes/types.d.ts +16 -6
- package/routes/validator.d.ts +0 -3
- package/routes/validator.js.map +0 -1
package/README.md
CHANGED
|
@@ -52,7 +52,7 @@ Prerequisites you need to have:
|
|
|
52
52
|
Create your own Temba server with the following command and you are up and running!
|
|
53
53
|
|
|
54
54
|
```bash
|
|
55
|
-
npx create-temba-server my-rest-api
|
|
55
|
+
npx create-temba-server my-rest-api@latest
|
|
56
56
|
cd my-rest-api
|
|
57
57
|
npm start
|
|
58
58
|
```
|
|
@@ -113,7 +113,7 @@ Temba supports JSON only.
|
|
|
113
113
|
|
|
114
114
|
Request bodies sent with a `POST`, `PATCH`, and `PUT` requests are valid when the request body is either empty, or when it's valid formatted JSON. Adding a `Content-Type: application/json` header is required. If you send a request with invalid formatted JSON, a `400 Bad Request` response is returned.
|
|
115
115
|
|
|
116
|
-
Any valid formatted JSON is accepted and stored. If you want to validate or even change the JSON in the request bodies, check out the [`
|
|
116
|
+
Any valid formatted JSON is accepted and stored. If you want to validate or even change the JSON in the request bodies, check out the [`requestBodyInterceptor`](#request-body-validation-or-mutation) callbacks.
|
|
117
117
|
|
|
118
118
|
IDs are auto generated when creating resources. IDs in the JSON request body are ignored for any request.
|
|
119
119
|
|
|
@@ -197,18 +197,18 @@ POST /movies
|
|
|
197
197
|
}
|
|
198
198
|
```
|
|
199
199
|
|
|
200
|
-
You can even omit a request body when doing a `POST`, `PATCH`, or `PUT`. If you don't want that, and want to have proper validation, use the `
|
|
200
|
+
You can even omit a request body when doing a `POST`, `PATCH`, or `PUT`. If you don't want that, and want to have proper validation, use the `requestBodyInterceptor` config setting:
|
|
201
201
|
|
|
202
202
|
```js
|
|
203
203
|
const config = {
|
|
204
|
-
|
|
205
|
-
post: (resourceName, requestBody) => {
|
|
204
|
+
requestBodyInterceptor: {
|
|
205
|
+
post: ({ resourceName, requestBody }) => {
|
|
206
206
|
// Validate, or even change the requestBody
|
|
207
207
|
},
|
|
208
|
-
put: (resourceName, requestBody) => {
|
|
208
|
+
put: ({ resourceName, requestBody }) => {
|
|
209
209
|
// Validate, or even change the requestBody
|
|
210
210
|
},
|
|
211
|
-
patch: (resourceName, requestBody) => {
|
|
211
|
+
patch: ({ resourceName, requestBody }) => {
|
|
212
212
|
// Validate, or even change the requestBody
|
|
213
213
|
},
|
|
214
214
|
},
|
|
@@ -217,9 +217,9 @@ const config = {
|
|
|
217
217
|
const server = temba.create(config)
|
|
218
218
|
```
|
|
219
219
|
|
|
220
|
-
The `
|
|
220
|
+
The `requestBodyInterceptor` is an object with a `post`, and/or `patch`, and/or `put` field, which contains the callback function you want Temba to call before the JSON is saved to the database.
|
|
221
221
|
|
|
222
|
-
The callback function receives
|
|
222
|
+
The callback function receives an object containing the `resourceName`, which for example is `movies` if you request `POST /movies`, and the `requestBody`, which is the JSON object of the request body.
|
|
223
223
|
|
|
224
224
|
Your callback function can return the following things:
|
|
225
225
|
|
|
@@ -231,8 +231,8 @@ Example:
|
|
|
231
231
|
|
|
232
232
|
```js
|
|
233
233
|
const config = {
|
|
234
|
-
|
|
235
|
-
post: (resourceName, requestBody) => {
|
|
234
|
+
requestBodyInterceptor: {
|
|
235
|
+
post: ({ resourceName, requestBody }) => {
|
|
236
236
|
// Do not allow Pokemons to be created: 400 Bad Request
|
|
237
237
|
if (resourceName === 'pokemons') return 'You are not allowed to create new Pokemons'
|
|
238
238
|
|
|
@@ -254,7 +254,7 @@ To change the response body of a `GET` request, before it's being sent to the cl
|
|
|
254
254
|
|
|
255
255
|
```js
|
|
256
256
|
const config = {
|
|
257
|
-
responseBodyInterceptor: (resourceName, responseBody, id) => {
|
|
257
|
+
responseBodyInterceptor: ({ resourceName, responseBody, id }) => {
|
|
258
258
|
if (resourceName === 'movies') {
|
|
259
259
|
if (id) {
|
|
260
260
|
// responseBody is an object
|
|
@@ -278,7 +278,7 @@ const config = {
|
|
|
278
278
|
const server = temba.create(config)
|
|
279
279
|
```
|
|
280
280
|
|
|
281
|
-
`responseBodyInterceptor` is a callback function that provides the `resourceName`, `responseBody`, and the `id`. Depending on whether it's a collection or item request, the `responseBody` is either an array or object, and the `id' can be `undefined`.
|
|
281
|
+
`responseBodyInterceptor` is a callback function that provides an object containing the `resourceName`, `responseBody`, and the `id`. Depending on whether it's a collection or item request, the `responseBody` is either an array or object, and the `id' can be `undefined`.
|
|
282
282
|
|
|
283
283
|
In the example above we check for the `id` being defined, but a runtime check to determine the type of `responseBody` would also suffice.
|
|
284
284
|
|
|
@@ -376,14 +376,14 @@ const config = {
|
|
|
376
376
|
customRouter: router,
|
|
377
377
|
cacheControl: 'public, max-age=300',
|
|
378
378
|
delay: 500,
|
|
379
|
-
|
|
380
|
-
post: (resourceName, requestBody) => {
|
|
379
|
+
requestBodyInterceptor: {
|
|
380
|
+
post: ({ resourceName, requestBody }) => {
|
|
381
381
|
// Validate, or even change the requestBody
|
|
382
382
|
},
|
|
383
|
-
patch: (resourceName, requestBody) => {
|
|
383
|
+
patch: ({ resourceName, requestBody }) => {
|
|
384
384
|
// Validate, or even change the requestBody
|
|
385
385
|
},
|
|
386
|
-
put: (resourceName, requestBody) => {
|
|
386
|
+
put: ({ resourceName, requestBody }) => {
|
|
387
387
|
// Validate, or even change the requestBody
|
|
388
388
|
},
|
|
389
389
|
},
|
|
@@ -404,24 +404,20 @@ These are all the possible settings:
|
|
|
404
404
|
| `customRouter` | See [Custom router](#custom-router) |
|
|
405
405
|
| `cacheControl` | The `Cache-control` response header value for each GET request. |
|
|
406
406
|
| `delay` | After processing the request, the delay in milliseconds before the request should be sent. |
|
|
407
|
-
| `
|
|
408
|
-
| `responseBodyInterceptor` | See [Response body interception](#
|
|
407
|
+
| `requestBodyInterceptor` | See [Request body validation or mutation](#request-body-validation-or-mutation) |
|
|
408
|
+
| `responseBodyInterceptor` | See [Response body interception](#request-body-validation-or-mutation) |
|
|
409
409
|
|
|
410
|
-
##
|
|
410
|
+
## Roadmap
|
|
411
411
|
|
|
412
|
-
|
|
412
|
+
Although I won't promise if and when, these are some things to consider for the future:
|
|
413
413
|
|
|
414
|
-
|
|
414
|
+
- **Authorization bearer tokens**, probably by providing a callback function so you can check the token however you want.
|
|
415
415
|
|
|
416
|
-
|
|
416
|
+
- Better **security**, for example CORS, CSRF, etc.
|
|
417
417
|
|
|
418
|
-
|
|
418
|
+
- Connecting to a **SQLite** database
|
|
419
419
|
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
### Filtering and sorting
|
|
423
|
-
|
|
424
|
-
And there is no filtering, sorting, searching, etc. (yet?).
|
|
420
|
+
- Generic **filtering and sorting**, for example: `GET /api/movies?filter=releaseYear ge 1980 and releaseYear le 1989&sort=-releaseYear,title&page=2&limit=20&fields=title,releaseYear,genre`
|
|
425
421
|
|
|
426
422
|
## Under the hood
|
|
427
423
|
|
package/config/index.d.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { Router } from 'express';
|
|
2
|
-
import {
|
|
2
|
+
import { RequestBodyInterceptor, ResponseBodyInterceptor } from '../routes/types';
|
|
3
3
|
export type Config = {
|
|
4
4
|
validateResources: boolean;
|
|
5
5
|
resourceNames: string[];
|
|
6
6
|
apiPrefix: string;
|
|
7
7
|
cacheControl: string;
|
|
8
|
-
|
|
8
|
+
requestBodyInterceptor: RequestBodyInterceptor;
|
|
9
9
|
responseBodyInterceptor: ResponseBodyInterceptor;
|
|
10
10
|
staticFolder: string;
|
|
11
11
|
connectionString: string;
|
|
12
12
|
delay: number;
|
|
13
13
|
customRouter: Router;
|
|
14
14
|
};
|
|
15
|
-
export type RouterConfig = Pick<Config, 'validateResources' | 'resourceNames' | 'apiPrefix' | 'cacheControl' | '
|
|
15
|
+
export type RouterConfig = Pick<Config, 'validateResources' | 'resourceNames' | 'apiPrefix' | 'cacheControl' | 'requestBodyInterceptor' | 'responseBodyInterceptor'>;
|
|
16
16
|
export type UserConfig = {
|
|
17
17
|
resourceNames?: string[];
|
|
18
18
|
validateResources?: boolean;
|
|
@@ -21,7 +21,7 @@ export type UserConfig = {
|
|
|
21
21
|
connectionString?: string;
|
|
22
22
|
cacheControl?: string;
|
|
23
23
|
delay?: number;
|
|
24
|
-
|
|
24
|
+
requestBodyInterceptor?: RequestBodyInterceptor;
|
|
25
25
|
responseBodyInterceptor?: ResponseBodyInterceptor;
|
|
26
26
|
customRouter?: Router;
|
|
27
27
|
};
|
package/config/index.js
CHANGED
|
@@ -9,7 +9,7 @@ const defaultConfig = {
|
|
|
9
9
|
connectionString: null,
|
|
10
10
|
cacheControl: 'no-store',
|
|
11
11
|
delay: 0,
|
|
12
|
-
|
|
12
|
+
requestBodyInterceptor: {
|
|
13
13
|
post: () => {
|
|
14
14
|
// do nothing
|
|
15
15
|
},
|
|
@@ -20,7 +20,7 @@ const defaultConfig = {
|
|
|
20
20
|
// do nothing
|
|
21
21
|
},
|
|
22
22
|
},
|
|
23
|
-
responseBodyInterceptor: (
|
|
23
|
+
responseBodyInterceptor: ({ responseBody }) => {
|
|
24
24
|
return responseBody;
|
|
25
25
|
},
|
|
26
26
|
customRouter: null,
|
|
@@ -37,8 +37,7 @@ function initConfig(userConfig) {
|
|
|
37
37
|
config.staticFolder = userConfig.staticFolder.replace(/[^a-zA-Z0-9]/g, '');
|
|
38
38
|
}
|
|
39
39
|
if (userConfig.apiPrefix) {
|
|
40
|
-
config.apiPrefix =
|
|
41
|
-
'/' + userConfig.apiPrefix.replace(/[^a-zA-Z0-9]/g, '') + '/';
|
|
40
|
+
config.apiPrefix = '/' + userConfig.apiPrefix.replace(/[^a-zA-Z0-9]/g, '') + '/';
|
|
42
41
|
}
|
|
43
42
|
if (userConfig.connectionString && userConfig.connectionString.length > 0) {
|
|
44
43
|
config.connectionString = userConfig.connectionString;
|
|
@@ -53,18 +52,18 @@ function initConfig(userConfig) {
|
|
|
53
52
|
Number(userConfig.delay) < 10000) {
|
|
54
53
|
config.delay = Number(userConfig.delay);
|
|
55
54
|
}
|
|
56
|
-
if (userConfig.
|
|
57
|
-
if (userConfig.
|
|
58
|
-
typeof userConfig.
|
|
59
|
-
config.
|
|
55
|
+
if (userConfig.requestBodyInterceptor) {
|
|
56
|
+
if (userConfig.requestBodyInterceptor.post &&
|
|
57
|
+
typeof userConfig.requestBodyInterceptor.post === 'function') {
|
|
58
|
+
config.requestBodyInterceptor.post = userConfig.requestBodyInterceptor.post;
|
|
60
59
|
}
|
|
61
|
-
if (userConfig.
|
|
62
|
-
typeof userConfig.
|
|
63
|
-
config.
|
|
60
|
+
if (userConfig.requestBodyInterceptor.patch &&
|
|
61
|
+
typeof userConfig.requestBodyInterceptor.patch === 'function') {
|
|
62
|
+
config.requestBodyInterceptor.patch = userConfig.requestBodyInterceptor.patch;
|
|
64
63
|
}
|
|
65
|
-
if (userConfig.
|
|
66
|
-
typeof userConfig.
|
|
67
|
-
config.
|
|
64
|
+
if (userConfig.requestBodyInterceptor.put &&
|
|
65
|
+
typeof userConfig.requestBodyInterceptor.put === 'function') {
|
|
66
|
+
config.requestBodyInterceptor.put = userConfig.requestBodyInterceptor.put;
|
|
68
67
|
}
|
|
69
68
|
}
|
|
70
69
|
if (userConfig.responseBodyInterceptor) {
|
package/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":";;;AAuCA,MAAM,aAAa,GAAW;IAC5B,aAAa,EAAE,EAAE;IACjB,iBAAiB,EAAE,KAAK;IACxB,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,EAAE;IACb,gBAAgB,EAAE,IAAI;IACtB,YAAY,EAAE,UAAU;IACxB,KAAK,EAAE,CAAC;IACR,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/queries/in-memory.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ declare function getAll(resourceName: any): Promise<unknown>;
|
|
|
3
3
|
declare function getById(resourceName: any, id: any): Promise<unknown>;
|
|
4
4
|
declare function create(resourceName: any, item: any): Promise<unknown>;
|
|
5
5
|
declare function update(resourceName: any, item: any): Promise<unknown>;
|
|
6
|
+
declare function replace(resourceName: any, item: any): Promise<unknown>;
|
|
6
7
|
declare function deleteById(resourceName: any, id: any): Promise<void>;
|
|
7
8
|
declare function deleteAll(resourceName: any): Promise<unknown>;
|
|
8
9
|
declare const _default: {
|
|
@@ -11,6 +12,7 @@ declare const _default: {
|
|
|
11
12
|
getById: typeof getById;
|
|
12
13
|
create: typeof create;
|
|
13
14
|
update: typeof update;
|
|
15
|
+
replace: typeof replace;
|
|
14
16
|
deleteById: typeof deleteById;
|
|
15
17
|
deleteAll: typeof deleteAll;
|
|
16
18
|
};
|
package/queries/in-memory.js
CHANGED
|
@@ -27,14 +27,14 @@ function create(resourceName, item) {
|
|
|
27
27
|
function update(resourceName, item) {
|
|
28
28
|
createResourceArrayIfNecessary(resourceName);
|
|
29
29
|
const updatedItem = Object.assign({}, item);
|
|
30
|
-
data[resourceName] = [
|
|
31
|
-
...data[resourceName].filter((r) => r.id !== item.id),
|
|
32
|
-
updatedItem,
|
|
33
|
-
];
|
|
30
|
+
data[resourceName] = [...data[resourceName].filter((r) => r.id !== item.id), updatedItem];
|
|
34
31
|
return new Promise((resolve) => {
|
|
35
32
|
resolve(updatedItem);
|
|
36
33
|
});
|
|
37
34
|
}
|
|
35
|
+
function replace(resourceName, item) {
|
|
36
|
+
return update(resourceName, item);
|
|
37
|
+
}
|
|
38
38
|
function deleteById(resourceName, id) {
|
|
39
39
|
createResourceArrayIfNecessary(resourceName);
|
|
40
40
|
data[resourceName] = data[resourceName].filter((item) => item.id !== id);
|
|
@@ -59,6 +59,7 @@ exports.default = {
|
|
|
59
59
|
getById,
|
|
60
60
|
create,
|
|
61
61
|
update,
|
|
62
|
+
replace,
|
|
62
63
|
deleteById,
|
|
63
64
|
deleteAll,
|
|
64
65
|
};
|
package/queries/in-memory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory.js","sourceRoot":"","sources":["../../src/queries/in-memory.ts"],"names":[],"mappings":";;AAAA,MAAM,IAAI,GAAG,EAAE,CAAA;AAEf,SAAS,iBAAiB;IACxB,aAAa;AACf,CAAC;AAED,SAAS,MAAM,CAAC,YAAY;IAC1B,8BAA8B,CAAC,YAAY,CAAC,CAAA;IAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,YAAY,EAAE,EAAE;IAC/B,8BAA8B,CAAC,YAAY,CAAC,CAAA;IAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,YAAY,EAAE,IAAI;IAChC,8BAA8B,CAAC,YAAY,CAAC,CAAA;IAE5C,MAAM,OAAO,mCAAQ,IAAI,KAAE,EAAE,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,GAAE,CAAA;IAE7D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,CAAA;IAErD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,OAAO,CAAC,OAAO,CAAC,CAAA;IAClB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,YAAY,EAAE,IAAI;IAChC,8BAA8B,CAAC,YAAY,CAAC,CAAA;IAE5C,MAAM,WAAW,qBAAQ,IAAI,CAAE,CAAA;IAC/B,IAAI,CAAC,YAAY,CAAC,GAAG
|
|
1
|
+
{"version":3,"file":"in-memory.js","sourceRoot":"","sources":["../../src/queries/in-memory.ts"],"names":[],"mappings":"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"}
|
package/queries/mongo.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export default function createMongoQueries(connectionString: any): {
|
|
|
4
4
|
getById: typeof getById;
|
|
5
5
|
create: typeof create;
|
|
6
6
|
update: typeof update;
|
|
7
|
+
replace: typeof replace;
|
|
7
8
|
deleteById: typeof deleteById;
|
|
8
9
|
deleteAll: typeof deleteAll;
|
|
9
10
|
};
|
|
@@ -12,6 +13,7 @@ declare function getAll(resourceName: any): Promise<any>;
|
|
|
12
13
|
declare function getById(resourceName: any, id: any): Promise<any>;
|
|
13
14
|
declare function create(resourceName: any, item: any): Promise<any>;
|
|
14
15
|
declare function update(resourceName: any, item: any): Promise<any>;
|
|
16
|
+
declare function replace(resourceName: any, item: any): Promise<any>;
|
|
15
17
|
declare function deleteById(resourceName: any, id: any): Promise<void>;
|
|
16
18
|
declare function deleteAll(resourceName: any): Promise<void>;
|
|
17
19
|
export {};
|
package/queries/mongo.js
CHANGED
|
@@ -20,6 +20,7 @@ function createMongoQueries(connectionString) {
|
|
|
20
20
|
getById,
|
|
21
21
|
create,
|
|
22
22
|
update,
|
|
23
|
+
replace,
|
|
23
24
|
deleteById,
|
|
24
25
|
deleteAll,
|
|
25
26
|
};
|
|
@@ -67,6 +68,17 @@ function update(resourceName, item) {
|
|
|
67
68
|
return removeUnderscoreFromId(updatedItem.value);
|
|
68
69
|
});
|
|
69
70
|
}
|
|
71
|
+
function replace(resourceName, item) {
|
|
72
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
73
|
+
yield connectToDatabase();
|
|
74
|
+
const id = item.id;
|
|
75
|
+
delete item.id;
|
|
76
|
+
const replacedItem = yield db[resourceName].findOneAndReplace({ _id: id }, item, {
|
|
77
|
+
returnOriginal: false,
|
|
78
|
+
});
|
|
79
|
+
return removeUnderscoreFromId(replacedItem.value);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
70
82
|
function deleteById(resourceName, id) {
|
|
71
83
|
return __awaiter(this, void 0, void 0, function* () {
|
|
72
84
|
yield connectToDatabase();
|
package/queries/mongo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongo.js","sourceRoot":"","sources":["../../src/queries/mongo.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,0CAAwC;AAExC,IAAI,GAAG,CAAA;AACP,IAAI,EAAE,CAAA;AAEN,SAAwB,kBAAkB,CAAC,gBAAgB;IACzD,GAAG,GAAG,gBAAgB,CAAA;IAEtB,OAAO;QACL,iBAAiB;QACjB,MAAM;QACN,OAAO;QACP,MAAM;QACN,MAAM;QACN,UAAU;QACV,SAAS;KACV,CAAA;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"mongo.js","sourceRoot":"","sources":["../../src/queries/mongo.ts"],"names":[],"mappings":"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"}
|
package/queries/queries.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ declare function createQueries(connectionString: any): {
|
|
|
4
4
|
getById: (resourceName: any, id: any) => Promise<any>;
|
|
5
5
|
create: (resourceName: any, item: any) => Promise<any>;
|
|
6
6
|
update: (resourceName: any, item: any) => Promise<any>;
|
|
7
|
+
replace: (resourceName: any, item: any) => Promise<any>;
|
|
7
8
|
deleteById: (resourceName: any, id: any) => Promise<void>;
|
|
8
9
|
deleteAll: (resourceName: any) => Promise<void>;
|
|
9
10
|
} | {
|
|
@@ -12,6 +13,7 @@ declare function createQueries(connectionString: any): {
|
|
|
12
13
|
getById: (resourceName: any, id: any) => Promise<unknown>;
|
|
13
14
|
create: (resourceName: any, item: any) => Promise<unknown>;
|
|
14
15
|
update: (resourceName: any, item: any) => Promise<unknown>;
|
|
16
|
+
replace: (resourceName: any, item: any) => Promise<unknown>;
|
|
15
17
|
deleteById: (resourceName: any, id: any) => Promise<void>;
|
|
16
18
|
deleteAll: (resourceName: any) => Promise<unknown>;
|
|
17
19
|
};
|
package/routes/get.js
CHANGED
|
@@ -25,7 +25,7 @@ function createGetRoutes(queries, cacheControl, responseBodyInterceptor) {
|
|
|
25
25
|
let theItem = item;
|
|
26
26
|
if (responseBodyInterceptor) {
|
|
27
27
|
try {
|
|
28
|
-
theItem = responseBodyInterceptor(resourceName, item, id);
|
|
28
|
+
theItem = responseBodyInterceptor({ resourceName, responseBody: item, id });
|
|
29
29
|
if (!theItem)
|
|
30
30
|
theItem = item;
|
|
31
31
|
}
|
|
@@ -43,7 +43,7 @@ function createGetRoutes(queries, cacheControl, responseBodyInterceptor) {
|
|
|
43
43
|
let theItems = items;
|
|
44
44
|
if (responseBodyInterceptor) {
|
|
45
45
|
try {
|
|
46
|
-
theItems = responseBodyInterceptor(resourceName, items);
|
|
46
|
+
theItems = responseBodyInterceptor({ resourceName, responseBody: items });
|
|
47
47
|
if (!theItems)
|
|
48
48
|
theItems = items;
|
|
49
49
|
}
|
package/routes/get.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/routes/get.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,SAAS,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,uBAAuB;IACrE,SAAe,iBAAiB,CAAC,GAAG,EAAE,GAAG;;YACvC,IAAI;gBACF,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,WAAW,CAAA;gBAE5C,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAA;gBAEtC,IAAI,EAAE,EAAE;oBACN,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;oBAEpD,IAAI,CAAC,IAAI,EAAE;wBACT,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;wBACf,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;qBAClB;oBAED,IAAI,OAAO,GAAG,IAAI,CAAA;oBAClB,IAAI,uBAAuB,EAAE;wBAC3B,IAAI;4BACF,OAAO,GAAG,uBAAuB,CAAC,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/routes/get.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,SAAS,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,uBAAuB;IACrE,SAAe,iBAAiB,CAAC,GAAG,EAAE,GAAG;;YACvC,IAAI;gBACF,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,WAAW,CAAA;gBAE5C,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAA;gBAEtC,IAAI,EAAE,EAAE;oBACN,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;oBAEpD,IAAI,CAAC,IAAI,EAAE;wBACT,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;wBACf,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;qBAClB;oBAED,IAAI,OAAO,GAAG,IAAI,CAAA;oBAClB,IAAI,uBAAuB,EAAE;wBAC3B,IAAI;4BACF,OAAO,GAAG,uBAAuB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;4BAC3E,IAAI,CAAC,OAAO;gCAAE,OAAO,GAAG,IAAI,CAAA;yBAC7B;wBAAC,OAAO,KAAK,EAAE;4BACd,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gCAC1B,OAAO,EAAE,oCAAoC,GAAG,KAAK,CAAC,OAAO;6BAC9D,CAAC,CAAA;yBACH;qBACF;oBAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;oBACf,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;oBACjB,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;iBAClB;gBAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;gBAEhD,IAAI,QAAQ,GAAG,KAAK,CAAA;gBACpB,IAAI,uBAAuB,EAAE;oBAC3B,IAAI;wBACF,QAAQ,GAAG,uBAAuB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAA;wBACzE,IAAI,CAAC,QAAQ;4BAAE,QAAQ,GAAG,KAAK,CAAA;qBAChC;oBAAC,OAAO,KAAK,EAAE;wBACd,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;4BAC1B,OAAO,EAAE,oCAAoC,GAAG,KAAK,CAAC,OAAO;yBAC9D,CAAC,CAAA;qBACH;iBACF;gBAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBACf,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBAClB,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;aAClB;YAAC,OAAO,KAAc,EAAE;gBACvB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAA;aACnE;QACH,CAAC;KAAA;IAED,OAAO;QACL,iBAAiB;KAClB,CAAA;AACH,CAAC;AAEQ,0CAAe"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
function
|
|
3
|
+
exports.interceptRequestBody = void 0;
|
|
4
|
+
function interceptRequestBody(intercept, req) {
|
|
5
5
|
const { resourceName } = req.requestInfo;
|
|
6
6
|
let requestBody = req.body;
|
|
7
|
-
const validationResult =
|
|
7
|
+
const validationResult = intercept({ resourceName, requestBody });
|
|
8
8
|
if (!validationResult && typeof requestBody === 'object')
|
|
9
9
|
return requestBody;
|
|
10
10
|
if (typeof validationResult === 'string')
|
|
@@ -18,5 +18,5 @@ function validateRequestBody(validator, req) {
|
|
|
18
18
|
else
|
|
19
19
|
return req.body;
|
|
20
20
|
}
|
|
21
|
-
exports.
|
|
22
|
-
//# sourceMappingURL=
|
|
21
|
+
exports.interceptRequestBody = interceptRequestBody;
|
|
22
|
+
//# sourceMappingURL=interceptors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptors.js","sourceRoot":"","sources":["../../src/routes/interceptors.ts"],"names":[],"mappings":";;;AAEA,SAAS,oBAAoB,CAAC,SAAyC,EAAE,GAAG;IAC1E,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,WAAW,CAAA;IACxC,IAAI,WAAW,GAAG,GAAG,CAAC,IAAI,CAAA;IAE1B,MAAM,gBAAgB,GAAG,SAAS,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAA;IAEjE,IAAI,CAAC,gBAAgB,IAAI,OAAO,WAAW,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAA;IAE5E,IAAI,OAAO,gBAAgB,KAAK,QAAQ;QAAE,OAAO,gBAAgB,CAAA;IAEjE,kDAAkD;IAClD,IAAI,gBAAgB;QAAE,WAAW,GAAG,gBAAgB,CAAA;IAEpD,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;QACnC,OAAO,WAAW,CAAA;KACnB;;QAAM,OAAO,GAAG,CAAC,IAAI,CAAA;AACxB,CAAC;AAEQ,oDAAoB"}
|
package/routes/patch.d.ts
CHANGED
package/routes/patch.js
CHANGED
|
@@ -10,13 +10,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.createPatchRoutes = void 0;
|
|
13
|
-
const
|
|
14
|
-
function createPatchRoutes(queries,
|
|
13
|
+
const interceptors_1 = require("./interceptors");
|
|
14
|
+
function createPatchRoutes(queries, requestBodyInterceptor) {
|
|
15
15
|
function handlePatch(req, res) {
|
|
16
16
|
return __awaiter(this, void 0, void 0, function* () {
|
|
17
17
|
try {
|
|
18
18
|
const { resourceName, id } = req.requestInfo;
|
|
19
|
-
const requestBody = (0,
|
|
19
|
+
const requestBody = (0, interceptors_1.interceptRequestBody)(requestBodyInterceptor.patch, req);
|
|
20
20
|
if (typeof requestBody === 'string')
|
|
21
21
|
return res.status(400).json({ message: requestBody }).send();
|
|
22
22
|
let item = null;
|
package/routes/patch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/routes/patch.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/routes/patch.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAAqD;AAErD,SAAS,iBAAiB,CAAC,OAAO,EAAE,sBAAsB;IACxD,SAAe,WAAW,CAAC,GAAG,EAAE,GAAG;;YACjC,IAAI;gBACF,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,WAAW,CAAA;gBAE5C,MAAM,WAAW,GAAG,IAAA,mCAAoB,EAAC,sBAAsB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;gBAE3E,IAAI,OAAO,WAAW,KAAK,QAAQ;oBACjC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;gBAE9D,IAAI,IAAI,GAAG,IAAI,CAAA;gBACf,IAAI,EAAE;oBAAE,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;gBAEtD,IAAI,CAAC,IAAI;oBACP,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBAC1B,OAAO,EAAE,OAAO,EAAE,aAAa;qBAChC,CAAC,CAAA;gBAEJ,IAAI,iDAAQ,IAAI,GAAK,WAAW,KAAE,EAAE,GAAE,CAAA;gBAEtC,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;gBAE5D,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAA;aAChD;YAAC,OAAO,KAAc,EAAE;gBACvB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAA;aACnE;QACH,CAAC;KAAA;IAED,OAAO;QACL,WAAW;KACZ,CAAA;AACH,CAAC;AAEQ,8CAAiB"}
|
package/routes/post.d.ts
CHANGED
package/routes/post.js
CHANGED
|
@@ -11,13 +11,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.createPostRoutes = void 0;
|
|
13
13
|
const url_1 = require("url");
|
|
14
|
-
const
|
|
15
|
-
function createPostRoutes(queries,
|
|
14
|
+
const interceptors_1 = require("./interceptors");
|
|
15
|
+
function createPostRoutes(queries, requestBodyInterceptor) {
|
|
16
16
|
function handlePost(req, res) {
|
|
17
17
|
return __awaiter(this, void 0, void 0, function* () {
|
|
18
18
|
try {
|
|
19
19
|
const { resourceName } = req.requestInfo;
|
|
20
|
-
const requestBody = (0,
|
|
20
|
+
const requestBody = (0, interceptors_1.interceptRequestBody)(requestBodyInterceptor.post, req);
|
|
21
21
|
if (typeof requestBody === 'string')
|
|
22
22
|
return res.status(400).json({ message: requestBody }).send();
|
|
23
23
|
const newItem = yield queries.create(resourceName, requestBody);
|
package/routes/post.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/routes/post.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6BAA4B;AAC5B,
|
|
1
|
+
{"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/routes/post.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6BAA4B;AAC5B,iDAAqD;AAErD,SAAS,gBAAgB,CAAC,OAAO,EAAE,sBAAsB;IACvD,SAAe,UAAU,CAAC,GAAG,EAAE,GAAG;;YAChC,IAAI;gBACF,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,WAAW,CAAA;gBAExC,MAAM,WAAW,GAAG,IAAA,mCAAoB,EAAC,sBAAsB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;gBAE1E,IAAI,OAAO,WAAW,KAAK,QAAQ;oBACjC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;gBAE9D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;gBAE/D,OAAO,GAAG;qBACP,GAAG,CAAC;oBACH,QAAQ,EAAE,IAAA,YAAM,EAAC;wBACf,QAAQ,EAAE,GAAG,CAAC,QAAQ;wBACtB,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;wBACrB,QAAQ,EAAE,GAAG,YAAY,IAAI,OAAO,CAAC,EAAE,EAAE;qBAC1C,CAAC;iBACH,CAAC;qBACD,MAAM,CAAC,GAAG,CAAC;qBACX,IAAI,CAAC,OAAO,CAAC;qBACb,IAAI,EAAE,CAAA;aACV;YAAC,OAAO,KAAc,EAAE;gBACvB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAA;aACnE;QACH,CAAC;KAAA;IAED,OAAO;QACL,UAAU;KACX,CAAA;AACH,CAAC;AAEQ,4CAAgB"}
|
package/routes/put.d.ts
CHANGED
package/routes/put.js
CHANGED
|
@@ -10,13 +10,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.createPutRoutes = void 0;
|
|
13
|
-
const
|
|
14
|
-
function createPutRoutes(queries,
|
|
13
|
+
const interceptors_1 = require("./interceptors");
|
|
14
|
+
function createPutRoutes(queries, requestBodyInterceptor) {
|
|
15
15
|
function handlePut(req, res) {
|
|
16
16
|
return __awaiter(this, void 0, void 0, function* () {
|
|
17
17
|
try {
|
|
18
18
|
const { resourceName, id } = req.requestInfo;
|
|
19
|
-
const requestBody = (0,
|
|
19
|
+
const requestBody = (0, interceptors_1.interceptRequestBody)(requestBodyInterceptor.put, req);
|
|
20
20
|
if (typeof requestBody === 'string')
|
|
21
21
|
return res.status(400).json({ message: requestBody }).send();
|
|
22
22
|
let item = null;
|
|
@@ -27,7 +27,7 @@ function createPutRoutes(queries, requestBodyValidator) {
|
|
|
27
27
|
message: `ID '${id}' not found`,
|
|
28
28
|
});
|
|
29
29
|
item = Object.assign(Object.assign({}, requestBody), { id });
|
|
30
|
-
const replacedItem = yield queries.
|
|
30
|
+
const replacedItem = yield queries.replace(resourceName, item);
|
|
31
31
|
return res.status(200).json(replacedItem).send();
|
|
32
32
|
}
|
|
33
33
|
catch (error) {
|
package/routes/put.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"put.js","sourceRoot":"","sources":["../../src/routes/put.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"put.js","sourceRoot":"","sources":["../../src/routes/put.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAAqD;AAErD,SAAS,eAAe,CAAC,OAAO,EAAE,sBAAsB;IACtD,SAAe,SAAS,CAAC,GAAG,EAAE,GAAG;;YAC/B,IAAI;gBACF,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,WAAW,CAAA;gBAE5C,MAAM,WAAW,GAAG,IAAA,mCAAoB,EAAC,sBAAsB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;gBAEzE,IAAI,OAAO,WAAW,KAAK,QAAQ;oBACjC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;gBAE9D,IAAI,IAAI,GAAG,IAAI,CAAA;gBACf,IAAI,EAAE;oBAAE,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;gBAEtD,IAAI,CAAC,IAAI;oBACP,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBAC1B,OAAO,EAAE,OAAO,EAAE,aAAa;qBAChC,CAAC,CAAA;gBAEJ,IAAI,mCAAQ,WAAW,KAAE,EAAE,GAAE,CAAA;gBAE7B,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;gBAE9D,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAA;aACjD;YAAC,OAAO,KAAc,EAAE;gBACvB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAA;aACnE;QACH,CAAC;KAAA;IAED,OAAO;QACL,SAAS;KACV,CAAA;AACH,CAAC;AAEQ,0CAAe"}
|
package/routes/routes.d.ts
CHANGED
|
@@ -3,4 +3,4 @@ declare function createResourceRouter(queries: any, routerConfig: RouterConfig):
|
|
|
3
3
|
declare const rootRouter: import("express-serve-static-core").Router;
|
|
4
4
|
declare function handleMethodNotAllowed(_: any, res: any): void;
|
|
5
5
|
declare function handleNotFound(_: any, res: any): void;
|
|
6
|
-
export { createResourceRouter, rootRouter, handleMethodNotAllowed, handleNotFound
|
|
6
|
+
export { createResourceRouter, rootRouter, handleMethodNotAllowed, handleNotFound };
|
package/routes/routes.js
CHANGED
|
@@ -21,11 +21,11 @@ const delete_1 = require("./delete");
|
|
|
21
21
|
const urlMiddleware_1 = require("../urls/urlMiddleware");
|
|
22
22
|
const express_1 = __importDefault(require("express"));
|
|
23
23
|
function createResourceRouter(queries, routerConfig) {
|
|
24
|
-
const { validateResources, resourceNames, apiPrefix, cacheControl,
|
|
24
|
+
const { validateResources, resourceNames, apiPrefix, cacheControl, requestBodyInterceptor, responseBodyInterceptor, } = routerConfig;
|
|
25
25
|
const { handleGetResource } = (0, get_1.createGetRoutes)(queries, cacheControl, responseBodyInterceptor);
|
|
26
|
-
const { handlePost } = (0, post_1.createPostRoutes)(queries,
|
|
27
|
-
const { handlePut } = (0, put_1.createPutRoutes)(queries,
|
|
28
|
-
const { handlePatch } = (0, patch_1.createPatchRoutes)(queries,
|
|
26
|
+
const { handlePost } = (0, post_1.createPostRoutes)(queries, requestBodyInterceptor);
|
|
27
|
+
const { handlePut } = (0, put_1.createPutRoutes)(queries, requestBodyInterceptor);
|
|
28
|
+
const { handlePatch } = (0, patch_1.createPatchRoutes)(queries, requestBodyInterceptor);
|
|
29
29
|
const { handleDelete } = (0, delete_1.createDeleteRoutes)(queries);
|
|
30
30
|
const validateResource = (0, urlMiddleware_1.createValidateResourceMiddleware)(validateResources, resourceNames);
|
|
31
31
|
const getResourceAndId = (0, urlMiddleware_1.createResourceAndIdParser)(apiPrefix);
|
package/routes/routes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/routes/routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,+BAAuC;AACvC,iCAAyC;AACzC,+BAAuC;AACvC,mCAA2C;AAC3C,qCAA6C;AAC7C,
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/routes/routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,+BAAuC;AACvC,iCAAyC;AACzC,+BAAuC;AACvC,mCAA2C;AAC3C,qCAA6C;AAC7C,yDAAmG;AAEnG,sDAA6B;AAG7B,SAAS,oBAAoB,CAAC,OAAO,EAAE,YAA0B;IAC/D,MAAM,EACJ,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,YAAY,EACZ,sBAAsB,EACtB,uBAAuB,GACxB,GAAG,YAAY,CAAA;IAEhB,MAAM,EAAE,iBAAiB,EAAE,GAAG,IAAA,qBAAe,EAAC,OAAO,EAAE,YAAY,EAAE,uBAAuB,CAAC,CAAA;IAC7F,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,uBAAgB,EAAC,OAAO,EAAE,sBAAsB,CAAC,CAAA;IACxE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,qBAAe,EAAC,OAAO,EAAE,sBAAsB,CAAC,CAAA;IACtE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAA,yBAAiB,EAAC,OAAO,EAAE,sBAAsB,CAAC,CAAA;IAC1E,MAAM,EAAE,YAAY,EAAE,GAAG,IAAA,2BAAkB,EAAC,OAAO,CAAC,CAAA;IAEpD,MAAM,gBAAgB,GAAG,IAAA,gDAAgC,EAAC,iBAAiB,EAAE,aAAa,CAAC,CAAA;IAC3F,MAAM,gBAAgB,GAAG,IAAA,yCAAyB,EAAC,SAAS,CAAC,CAAA;IAE7D,MAAM,cAAc,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;IAEvC,cAAc;QACZ,6GAA6G;SAC5G,GAAG,CAAC,GAAG,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC;SAC/D,IAAI,CAAC,GAAG,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,UAAU,CAAC;SACzD,GAAG,CAAC,GAAG,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,SAAS,CAAC;SACvD,KAAK,CAAC,GAAG,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,CAAC;SAC3D,MAAM,CAAC,GAAG,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAA;IAEhE,OAAO,cAAc,CAAA;AACvB,CAAC;AAqBQ,oDAAoB;AAnB7B,iDAAiD;AACjD,MAAM,UAAU,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;AAkBJ,gCAAU;AAjBzC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAO,CAAC,EAAE,GAAG,EAAE,EAAE;IACnC,OAAO,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;AAChC,CAAC,CAAA,CAAC,CAAA;AAEF,sDAAsD;AACtD,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAA;AAE3C,0CAA0C;AAC1C,SAAS,sBAAsB,CAAC,CAAC,EAAE,GAAG;IACpC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAA;AACzD,CAAC;AAO0C,wDAAsB;AALjE,gCAAgC;AAChC,SAAS,cAAc,CAAC,CAAC,EAAE,GAAG;IAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAA;AAChD,CAAC;AAEkE,wCAAc"}
|
package/routes/types.d.ts
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
patch?: ValidatorCallback;
|
|
5
|
-
put?: ValidatorCallback;
|
|
1
|
+
type RequestInfo = {
|
|
2
|
+
resourceName: string;
|
|
3
|
+
requestBody: unknown;
|
|
6
4
|
};
|
|
7
|
-
export type
|
|
5
|
+
export type RequestBodyInterceptorCallback = (info: RequestInfo) => void | string | object;
|
|
6
|
+
export type RequestBodyInterceptor = {
|
|
7
|
+
post?: RequestBodyInterceptorCallback;
|
|
8
|
+
patch?: RequestBodyInterceptorCallback;
|
|
9
|
+
put?: RequestBodyInterceptorCallback;
|
|
10
|
+
};
|
|
11
|
+
type ResponseInfo = {
|
|
12
|
+
resourceName: string;
|
|
13
|
+
responseBody: unknown;
|
|
14
|
+
id?: string;
|
|
15
|
+
};
|
|
16
|
+
export type ResponseBodyInterceptor = (info: ResponseInfo) => unknown;
|
|
17
|
+
export {};
|
package/routes/validator.d.ts
DELETED
package/routes/validator.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/routes/validator.ts"],"names":[],"mappings":";;;AAEA,SAAS,mBAAmB,CAC1B,SAA4B,EAC5B,GAAG;IAEH,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,WAAW,CAAA;IACxC,IAAI,WAAW,GAAG,GAAG,CAAC,IAAI,CAAA;IAE1B,MAAM,gBAAgB,GAAG,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IAE7D,IAAI,CAAC,gBAAgB,IAAI,OAAO,WAAW,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAA;IAE5E,IAAI,OAAO,gBAAgB,KAAK,QAAQ;QAAE,OAAO,gBAAgB,CAAA;IAEjE,kDAAkD;IAClD,IAAI,gBAAgB;QAAE,WAAW,GAAG,gBAAgB,CAAA;IAEpD,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;QACnC,OAAO,WAAW,CAAA;KACnB;;QAAM,OAAO,GAAG,CAAC,IAAI,CAAA;AACxB,CAAC;AAEQ,kDAAmB"}
|