temba 0.15.0 → 0.17.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 +42 -51
- package/config/index.d.ts +7 -3
- package/config/index.js +10 -6
- package/config/index.js.map +1 -1
- package/index.d.ts +4 -1
- package/index.js +13 -3
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/queries/in-memory.d.ts +7 -7
- package/queries/in-memory.js +23 -23
- package/queries/in-memory.js.map +1 -1
- package/queries/mongo.d.ts +7 -7
- package/queries/mongo.js +14 -14
- package/queries/mongo.js.map +1 -1
- package/queries/queries.d.ts +14 -14
- package/routes/delete.js +4 -4
- package/routes/delete.js.map +1 -1
- package/routes/get.js +5 -5
- package/routes/get.js.map +1 -1
- package/routes/interceptors.js +9 -9
- package/routes/interceptors.js.map +1 -1
- package/routes/patch.js +7 -7
- package/routes/patch.js.map +1 -1
- package/routes/post.js +6 -6
- package/routes/post.js.map +1 -1
- package/routes/put.js +7 -7
- package/routes/put.js.map +1 -1
- package/routes/routes.js +2 -2
- package/routes/routes.js.map +1 -1
- package/routes/types.d.ts +4 -4
- package/urls/urlMiddleware.d.ts +1 -1
- package/urls/urlMiddleware.js +5 -5
- package/urls/urlMiddleware.js.map +1 -1
- package/urls/urlParser.d.ts +1 -1
- package/urls/urlParser.js +3 -3
- package/urls/urlParser.js.map +1 -1
package/README.md
CHANGED
|
@@ -72,11 +72,13 @@ Alternatively, add Temba to your app manually:
|
|
|
72
72
|
```js
|
|
73
73
|
import temba from 'temba'
|
|
74
74
|
const server = temba.create()
|
|
75
|
+
server.start()
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
3. In your console you'll see:
|
|
75
79
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
console.log(`Temba is running on port ${port}`)
|
|
79
|
-
})
|
|
80
|
+
```
|
|
81
|
+
✅ Server listening on port 3000
|
|
80
82
|
```
|
|
81
83
|
|
|
82
84
|
### Configuration
|
|
@@ -134,11 +136,11 @@ For every resource you use in your requests, a collection is created in the data
|
|
|
134
136
|
|
|
135
137
|
### Allowing specific resources only
|
|
136
138
|
|
|
137
|
-
If you only want to allow specific resource names, configure them by providing a `
|
|
139
|
+
If you only want to allow specific resource names, configure them by providing a `resources` key in the config object when creating the Temba server:
|
|
138
140
|
|
|
139
141
|
```js
|
|
140
142
|
const config = {
|
|
141
|
-
|
|
143
|
+
resources: ['movies', 'actors'],
|
|
142
144
|
}
|
|
143
145
|
const server = temba.create(config)
|
|
144
146
|
```
|
|
@@ -208,14 +210,14 @@ You can even omit a request body when doing a `POST`, `PATCH`, or `PUT`. If you
|
|
|
208
210
|
```js
|
|
209
211
|
const config = {
|
|
210
212
|
requestBodyInterceptor: {
|
|
211
|
-
post: ({
|
|
212
|
-
// Validate, or even change the
|
|
213
|
+
post: ({ resource, body }) => {
|
|
214
|
+
// Validate, or even change the request body
|
|
213
215
|
},
|
|
214
|
-
put: ({
|
|
215
|
-
// Validate, or even change the
|
|
216
|
+
put: ({ resource, body }) => {
|
|
217
|
+
// Validate, or even change the request body
|
|
216
218
|
},
|
|
217
|
-
patch: ({
|
|
218
|
-
// Validate, or even change the
|
|
219
|
+
patch: ({ resource, body }) => {
|
|
220
|
+
// Validate, or even change the request body
|
|
219
221
|
},
|
|
220
222
|
},
|
|
221
223
|
}
|
|
@@ -225,7 +227,7 @@ const server = temba.create(config)
|
|
|
225
227
|
|
|
226
228
|
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.
|
|
227
229
|
|
|
228
|
-
The callback function receives an object containing the `
|
|
230
|
+
The callback function receives an object containing the `resource`, which for example is `movies` if you request `POST /movies`, and the `body`, which is the JSON object of the request body.
|
|
229
231
|
|
|
230
232
|
Your callback function can return the following things:
|
|
231
233
|
|
|
@@ -238,13 +240,13 @@ Example:
|
|
|
238
240
|
```js
|
|
239
241
|
const config = {
|
|
240
242
|
requestBodyInterceptor: {
|
|
241
|
-
post: ({
|
|
242
|
-
// Do not allow Pokemons to be created: 400 Bad
|
|
243
|
-
if (
|
|
243
|
+
post: ({ resource, body }) => {
|
|
244
|
+
// Do not allow Pokemons to be created: 400 Bad Req best
|
|
245
|
+
if (resource === 'pokemons') return 'You are not allowed to create new Pokemons'
|
|
244
246
|
|
|
245
247
|
// Add a genre to Star Trek films:
|
|
246
|
-
if (
|
|
247
|
-
return { ...
|
|
248
|
+
if (resource === 'movies' && body.title.startsWith('Star Trek'))
|
|
249
|
+
return { ...body, genre: 'Science Fiction' }
|
|
248
250
|
|
|
249
251
|
// If you end up here, void will be returned, so the request will just be saved.
|
|
250
252
|
},
|
|
@@ -260,17 +262,17 @@ To change the response body of a `GET` request, before it's being sent to the cl
|
|
|
260
262
|
|
|
261
263
|
```js
|
|
262
264
|
const config = {
|
|
263
|
-
responseBodyInterceptor: ({
|
|
264
|
-
if (
|
|
265
|
+
responseBodyInterceptor: ({ resource, body, id }) => {
|
|
266
|
+
if (resource === 'movies') {
|
|
265
267
|
if (id) {
|
|
266
|
-
//
|
|
268
|
+
// response body is an object
|
|
267
269
|
return {
|
|
268
|
-
...
|
|
270
|
+
...body,
|
|
269
271
|
stuff: 'more stuff',
|
|
270
272
|
}
|
|
271
273
|
} else {
|
|
272
|
-
//
|
|
273
|
-
return
|
|
274
|
+
// response body is an array
|
|
275
|
+
return body.map((x) => ({
|
|
274
276
|
...x,
|
|
275
277
|
stuff: 'more stuff',
|
|
276
278
|
}))
|
|
@@ -284,9 +286,9 @@ const config = {
|
|
|
284
286
|
const server = temba.create(config)
|
|
285
287
|
```
|
|
286
288
|
|
|
287
|
-
`responseBodyInterceptor` is a callback function that provides an object containing the `
|
|
289
|
+
`responseBodyInterceptor` is a callback function that provides an object containing the `resource`, `body`, and the `id`. Depending on whether it's a collection or item request, the `body` is either an array or object, and the `id` can be `undefined`.
|
|
288
290
|
|
|
289
|
-
In the example above we check for the `id` being defined, but a runtime check to determine the type of `
|
|
291
|
+
In the example above we check for the `id` being defined, but a runtime check to determine the type of `body` would also suffice.
|
|
290
292
|
|
|
291
293
|
Whatever you return in this function will become the response body and will be serialized as JSON and returned to the client.
|
|
292
294
|
|
|
@@ -296,18 +298,7 @@ The `responseBodyInterceptor` will only be called when the response was successf
|
|
|
296
298
|
|
|
297
299
|
### Custom router
|
|
298
300
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
```js
|
|
302
|
-
const server = temba.create()
|
|
303
|
-
|
|
304
|
-
// 🛑 Although `server` is an Express instance, the following does not work:
|
|
305
|
-
server.get('/hello', (req, res) => {
|
|
306
|
-
res.send('hello world')
|
|
307
|
-
})
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
The reason is that Temba is in charge of all Express routes, to make sure only _resource routes_ can be overruled by a custom router. To add your own routes, create an Express router, and configure it as a `customRouter`:
|
|
301
|
+
Because Temba uses Express under the hood, you can create an Express router, and configure it as a `customRouter`:
|
|
311
302
|
|
|
312
303
|
```js
|
|
313
304
|
// Example code of how to create an Express router, from the official Express docs at https://expressjs.com/en/guide/routing.html:
|
|
@@ -356,7 +347,7 @@ router.get('api/stuff', (req, res) => {
|
|
|
356
347
|
const config = {
|
|
357
348
|
apiPrefix: 'api',
|
|
358
349
|
customRouter: router,
|
|
359
|
-
|
|
350
|
+
resources: ['stuff'],
|
|
360
351
|
staticFolder: 'build',
|
|
361
352
|
}
|
|
362
353
|
const server = temba.create(config)
|
|
@@ -380,19 +371,20 @@ const config = {
|
|
|
380
371
|
connectionString: 'mongodb://localhost:27017',
|
|
381
372
|
customRouter: router,
|
|
382
373
|
delay: 500,
|
|
374
|
+
port: 4321,
|
|
383
375
|
requestBodyInterceptor: {
|
|
384
|
-
post: ({
|
|
385
|
-
// Validate, or even change the
|
|
376
|
+
post: ({ resource, body }) => {
|
|
377
|
+
// Validate, or even change the request body
|
|
386
378
|
},
|
|
387
|
-
patch: ({
|
|
388
|
-
// Validate, or even change the
|
|
379
|
+
patch: ({ resource, body }) => {
|
|
380
|
+
// Validate, or even change the request body
|
|
389
381
|
},
|
|
390
|
-
put: ({
|
|
391
|
-
// Validate, or even change the
|
|
382
|
+
put: ({ resource, body }) => {
|
|
383
|
+
// Validate, or even change the request body
|
|
392
384
|
},
|
|
393
385
|
},
|
|
394
|
-
|
|
395
|
-
responseBodyInterceptor: ({
|
|
386
|
+
resources: ['movies', 'actors'],
|
|
387
|
+
responseBodyInterceptor: ({ resource, body, id }) => {
|
|
396
388
|
// Change the response body before it is sent to the client
|
|
397
389
|
},
|
|
398
390
|
returnNullFields: false,
|
|
@@ -410,8 +402,9 @@ These are all the possible settings:
|
|
|
410
402
|
| `connectionString` | See [MongoDB](#mongodb) | `null` |
|
|
411
403
|
| `customRouter` | See [Custom router](#custom-router) | `null` |
|
|
412
404
|
| `delay` | After processing the request, the delay in milliseconds before the request should be sent. | `0` |
|
|
405
|
+
| `port` | The port your Temba server listens on | `3000` |
|
|
413
406
|
| `requestBodyInterceptor` | See [Request body validation or mutation](#request-body-validation-or-mutation) | `noop` |
|
|
414
|
-
| `
|
|
407
|
+
| `resources` | See [Allowing specific resources only](#allowing-specific-resources-only) | `[]` |
|
|
415
408
|
| `responseBodyInterceptor` | See [Response body interception](#request-body-validation-or-mutation) | `noop` |
|
|
416
409
|
| `returnNullFields` | Whether fields with a `null` value should be returned in responses. | `true` |
|
|
417
410
|
| `staticFolder` | See [Static assets](#static-assets) | `null` |
|
|
@@ -424,14 +417,12 @@ Although I won't promise if and when, these are some things to consider for the
|
|
|
424
417
|
|
|
425
418
|
- Better **security**, for example CORS, CSRF, etc.
|
|
426
419
|
|
|
427
|
-
-
|
|
420
|
+
- Opt-in logging with debug-js events
|
|
428
421
|
|
|
429
422
|
- 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`
|
|
430
423
|
|
|
431
424
|
- Intial data seed when using in-memory.
|
|
432
425
|
|
|
433
|
-
- Get rid of Express?
|
|
434
|
-
|
|
435
426
|
## Under the hood
|
|
436
427
|
|
|
437
428
|
Temba is built with JavaScript, [Node](https://nodejs.org), [Express](https://expressjs.com/), [Jest](https://jestjs.io/), [Supertest](https://www.npmjs.com/package/supertest), and [@rakered/mongo](https://www.npmjs.com/package/@rakered/mongo).
|
package/config/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { Router } from 'express';
|
|
|
2
2
|
import { RequestBodyInterceptor, ResponseBodyInterceptor } from '../routes/types';
|
|
3
3
|
export type Config = {
|
|
4
4
|
validateResources: boolean;
|
|
5
|
-
|
|
5
|
+
resources: string[];
|
|
6
6
|
apiPrefix: string;
|
|
7
7
|
cacheControl: string;
|
|
8
8
|
requestBodyInterceptor: RequestBodyInterceptor;
|
|
@@ -12,10 +12,12 @@ export type Config = {
|
|
|
12
12
|
delay: number;
|
|
13
13
|
customRouter: Router;
|
|
14
14
|
returnNullFields: boolean;
|
|
15
|
+
isTesting: boolean;
|
|
16
|
+
port: number;
|
|
15
17
|
};
|
|
16
|
-
export type RouterConfig = Pick<Config, 'validateResources' | '
|
|
18
|
+
export type RouterConfig = Pick<Config, 'validateResources' | 'resources' | 'apiPrefix' | 'cacheControl' | 'requestBodyInterceptor' | 'responseBodyInterceptor' | 'returnNullFields'>;
|
|
17
19
|
export type UserConfig = {
|
|
18
|
-
|
|
20
|
+
resources?: string[];
|
|
19
21
|
staticFolder?: string;
|
|
20
22
|
apiPrefix?: string;
|
|
21
23
|
connectionString?: string;
|
|
@@ -25,5 +27,7 @@ export type UserConfig = {
|
|
|
25
27
|
responseBodyInterceptor?: ResponseBodyInterceptor;
|
|
26
28
|
customRouter?: Router;
|
|
27
29
|
returnNullFields?: boolean;
|
|
30
|
+
isTesting?: boolean;
|
|
31
|
+
port?: number;
|
|
28
32
|
};
|
|
29
33
|
export declare function initConfig(userConfig: UserConfig): Config;
|
package/config/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.initConfig = void 0;
|
|
4
4
|
const defaultConfig = {
|
|
5
|
-
|
|
5
|
+
resources: [],
|
|
6
6
|
validateResources: false,
|
|
7
7
|
staticFolder: null,
|
|
8
8
|
apiPrefix: '',
|
|
@@ -20,19 +20,21 @@ const defaultConfig = {
|
|
|
20
20
|
// do nothing
|
|
21
21
|
},
|
|
22
22
|
},
|
|
23
|
-
responseBodyInterceptor: ({
|
|
24
|
-
return
|
|
23
|
+
responseBodyInterceptor: ({ body }) => {
|
|
24
|
+
return body;
|
|
25
25
|
},
|
|
26
26
|
customRouter: null,
|
|
27
27
|
returnNullFields: true,
|
|
28
|
+
isTesting: false,
|
|
29
|
+
port: 3000,
|
|
28
30
|
};
|
|
29
31
|
function initConfig(userConfig) {
|
|
30
|
-
var _a;
|
|
32
|
+
var _a, _b, _c;
|
|
31
33
|
if (!userConfig)
|
|
32
34
|
return defaultConfig;
|
|
33
35
|
const config = Object.assign({}, defaultConfig);
|
|
34
|
-
if (userConfig.
|
|
35
|
-
config.
|
|
36
|
+
if (userConfig.resources && userConfig.resources.length > 0) {
|
|
37
|
+
config.resources = userConfig.resources;
|
|
36
38
|
config.validateResources = true;
|
|
37
39
|
}
|
|
38
40
|
if (userConfig.staticFolder) {
|
|
@@ -75,6 +77,8 @@ function initConfig(userConfig) {
|
|
|
75
77
|
config.customRouter = userConfig.customRouter;
|
|
76
78
|
}
|
|
77
79
|
config.returnNullFields = (_a = userConfig.returnNullFields) !== null && _a !== void 0 ? _a : true;
|
|
80
|
+
config.isTesting = (_b = userConfig.isTesting) !== null && _b !== void 0 ? _b : false;
|
|
81
|
+
config.port = (_c = userConfig.port) !== null && _c !== void 0 ? _c : 3000;
|
|
78
82
|
return config;
|
|
79
83
|
}
|
|
80
84
|
exports.initConfig = initConfig;
|
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/index.d.ts
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
import { Config } from './config';
|
|
2
|
-
export declare function create(userConfig?: Config):
|
|
2
|
+
export declare function create(userConfig?: Config): {
|
|
3
|
+
start: () => void;
|
|
4
|
+
Express: import("express-serve-static-core").Express;
|
|
5
|
+
};
|
package/index.js
CHANGED
|
@@ -47,8 +47,6 @@ function createServer(userConfig) {
|
|
|
47
47
|
const delayMiddleware = (0, delayMiddleware_1.createDelayMiddleware)(config.delay);
|
|
48
48
|
app.use(delayMiddleware);
|
|
49
49
|
}
|
|
50
|
-
//TODO customRoutes:
|
|
51
|
-
// - Al deze routing code naar een aparte functie
|
|
52
50
|
// Serve a static folder, if configured.
|
|
53
51
|
if (config.staticFolder) {
|
|
54
52
|
app.use(express_1.default.static(config.staticFolder));
|
|
@@ -75,7 +73,19 @@ function createServer(userConfig) {
|
|
|
75
73
|
app.all('*', routes_1.handleMethodNotAllowed);
|
|
76
74
|
if (config.apiPrefix)
|
|
77
75
|
app.all(`${config.apiPrefix}*`, routes_1.handleMethodNotAllowed);
|
|
78
|
-
return
|
|
76
|
+
return {
|
|
77
|
+
start: () => {
|
|
78
|
+
if (config.isTesting) {
|
|
79
|
+
console.log('⛔️ Server not started. Remove or disable isTesting from your config.');
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
app.listen(config.port, () => {
|
|
83
|
+
console.log(`✅ Server listening on port ${config.port}`);
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
// Expose Express for testing purposes only, e.g. usage with supertest.
|
|
87
|
+
Express: config.isTesting ? app : undefined,
|
|
88
|
+
};
|
|
79
89
|
}
|
|
80
90
|
function create(userConfig) {
|
|
81
91
|
return createServer(userConfig);
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAAuC;AACvC,oDAA2B;AAC3B,4CAKwB;AACxB,+CAAiD;AACjD,qCAAyD;AACzD,gDAAuB;AACvB,6DAA+D;AAE/D,SAAS,YAAY,CAAC,UAAuB;IAC3C,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,UAAU,CAAC,CAAA;IAErC,MAAM,OAAO,GAAG,IAAA,uBAAa,EAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;IAEtD,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAA;IACrB,GAAG,CAAC,GAAG,CAAC,IAAA,cAAI,GAAE,CAAC,CAAA;IAEf,4BAA4B;IAC5B,GAAG,CAAC,GAAG,CAAC,IAAA,gBAAM,EAAC,MAAM,CAAC,CAAC,CAAA;IAEvB,gCAAgC;IAChC,GAAG,CAAC,GAAG,CAAC,IAAA,cAAI,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAElD,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE;QACpB,MAAM,eAAe,GAAG,IAAA,uCAAqB,EAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3D,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;KACzB;IAED,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/queries/in-memory.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
declare function connectToDatabase(): void;
|
|
2
|
-
declare function getAll(
|
|
3
|
-
declare function getById(
|
|
4
|
-
declare function create(
|
|
5
|
-
declare function update(
|
|
6
|
-
declare function replace(
|
|
7
|
-
declare function deleteById(
|
|
8
|
-
declare function deleteAll(
|
|
2
|
+
declare function getAll(resource: any): Promise<unknown>;
|
|
3
|
+
declare function getById(resource: any, id: any): Promise<unknown>;
|
|
4
|
+
declare function create(resource: any, item: any): Promise<unknown>;
|
|
5
|
+
declare function update(resource: any, item: any): Promise<unknown>;
|
|
6
|
+
declare function replace(resource: any, item: any): Promise<unknown>;
|
|
7
|
+
declare function deleteById(resource: any, id: any): Promise<void>;
|
|
8
|
+
declare function deleteAll(resource: any): Promise<unknown>;
|
|
9
9
|
declare const _default: {
|
|
10
10
|
connectToDatabase: typeof connectToDatabase;
|
|
11
11
|
getAll: typeof getAll;
|
package/queries/in-memory.js
CHANGED
|
@@ -4,54 +4,54 @@ const data = {};
|
|
|
4
4
|
function connectToDatabase() {
|
|
5
5
|
// do nothing
|
|
6
6
|
}
|
|
7
|
-
function getAll(
|
|
8
|
-
createResourceArrayIfNecessary(
|
|
7
|
+
function getAll(resource) {
|
|
8
|
+
createResourceArrayIfNecessary(resource);
|
|
9
9
|
return new Promise((resolve) => {
|
|
10
|
-
resolve(data[
|
|
10
|
+
resolve(data[resource]);
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
|
-
function getById(
|
|
14
|
-
createResourceArrayIfNecessary(
|
|
13
|
+
function getById(resource, id) {
|
|
14
|
+
createResourceArrayIfNecessary(resource);
|
|
15
15
|
return new Promise((resolve) => {
|
|
16
|
-
resolve(data[
|
|
16
|
+
resolve(data[resource].find((item) => item.id === id));
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
|
-
function create(
|
|
20
|
-
createResourceArrayIfNecessary(
|
|
19
|
+
function create(resource, item) {
|
|
20
|
+
createResourceArrayIfNecessary(resource);
|
|
21
21
|
const newItem = Object.assign(Object.assign({}, item), { id: String(new Date().getTime()) });
|
|
22
|
-
data[
|
|
22
|
+
data[resource] = [...data[resource], newItem];
|
|
23
23
|
return new Promise((resolve) => {
|
|
24
24
|
resolve(newItem);
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
|
-
function update(
|
|
28
|
-
createResourceArrayIfNecessary(
|
|
27
|
+
function update(resource, item) {
|
|
28
|
+
createResourceArrayIfNecessary(resource);
|
|
29
29
|
const updatedItem = Object.assign({}, item);
|
|
30
|
-
data[
|
|
30
|
+
data[resource] = [...data[resource].filter((r) => r.id !== item.id), updatedItem];
|
|
31
31
|
return new Promise((resolve) => {
|
|
32
32
|
resolve(updatedItem);
|
|
33
33
|
});
|
|
34
34
|
}
|
|
35
|
-
function replace(
|
|
36
|
-
return update(
|
|
35
|
+
function replace(resource, item) {
|
|
36
|
+
return update(resource, item);
|
|
37
37
|
}
|
|
38
|
-
function deleteById(
|
|
39
|
-
createResourceArrayIfNecessary(
|
|
40
|
-
data[
|
|
38
|
+
function deleteById(resource, id) {
|
|
39
|
+
createResourceArrayIfNecessary(resource);
|
|
40
|
+
data[resource] = data[resource].filter((item) => item.id !== id);
|
|
41
41
|
return new Promise((resolve) => {
|
|
42
42
|
resolve();
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
|
-
function deleteAll(
|
|
46
|
-
createResourceArrayIfNecessary(
|
|
47
|
-
data[
|
|
45
|
+
function deleteAll(resource) {
|
|
46
|
+
createResourceArrayIfNecessary(resource);
|
|
47
|
+
data[resource] = [];
|
|
48
48
|
return new Promise((resolve) => {
|
|
49
49
|
resolve([]);
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
|
-
function createResourceArrayIfNecessary(
|
|
53
|
-
if (!data.hasOwnProperty(
|
|
54
|
-
data[
|
|
52
|
+
function createResourceArrayIfNecessary(resource) {
|
|
53
|
+
if (!data.hasOwnProperty(resource))
|
|
54
|
+
data[resource] = [];
|
|
55
55
|
}
|
|
56
56
|
exports.default = {
|
|
57
57
|
connectToDatabase,
|
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,
|
|
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
|
@@ -9,11 +9,11 @@ export default function createMongoQueries(connectionString: any): {
|
|
|
9
9
|
deleteAll: typeof deleteAll;
|
|
10
10
|
};
|
|
11
11
|
declare function connectToDatabase(): Promise<void>;
|
|
12
|
-
declare function getAll(
|
|
13
|
-
declare function getById(
|
|
14
|
-
declare function create(
|
|
15
|
-
declare function update(
|
|
16
|
-
declare function replace(
|
|
17
|
-
declare function deleteById(
|
|
18
|
-
declare function deleteAll(
|
|
12
|
+
declare function getAll(resource: any): Promise<any>;
|
|
13
|
+
declare function getById(resource: any, id: any): Promise<any>;
|
|
14
|
+
declare function create(resource: any, item: any): Promise<any>;
|
|
15
|
+
declare function update(resource: any, item: any): Promise<any>;
|
|
16
|
+
declare function replace(resource: any, item: any): Promise<any>;
|
|
17
|
+
declare function deleteById(resource: any, id: any): Promise<void>;
|
|
18
|
+
declare function deleteAll(resource: any): Promise<void>;
|
|
19
19
|
export {};
|
package/queries/mongo.js
CHANGED
|
@@ -41,61 +41,61 @@ function connectToDatabase() {
|
|
|
41
41
|
}
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
|
-
function getAll(
|
|
44
|
+
function getAll(resource) {
|
|
45
45
|
return __awaiter(this, void 0, void 0, function* () {
|
|
46
46
|
yield connectToDatabase();
|
|
47
|
-
const items = yield db[
|
|
47
|
+
const items = yield db[resource].find({});
|
|
48
48
|
if (!items)
|
|
49
49
|
return [];
|
|
50
50
|
return items.map((item) => removeUnderscoreFromId(item));
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
|
-
function getById(
|
|
53
|
+
function getById(resource, id) {
|
|
54
54
|
return __awaiter(this, void 0, void 0, function* () {
|
|
55
55
|
yield connectToDatabase();
|
|
56
|
-
const item = yield db[
|
|
56
|
+
const item = yield db[resource].findOne({ _id: id });
|
|
57
57
|
if (!item)
|
|
58
58
|
return null;
|
|
59
59
|
return removeUnderscoreFromId(item);
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
|
-
function create(
|
|
62
|
+
function create(resource, item) {
|
|
63
63
|
return __awaiter(this, void 0, void 0, function* () {
|
|
64
64
|
yield connectToDatabase();
|
|
65
|
-
const createdItem = yield db[
|
|
65
|
+
const createdItem = yield db[resource].insertOne(item);
|
|
66
66
|
return removeUnderscoreFromId(createdItem.ops[0]);
|
|
67
67
|
});
|
|
68
68
|
}
|
|
69
|
-
function update(
|
|
69
|
+
function update(resource, item) {
|
|
70
70
|
return __awaiter(this, void 0, void 0, function* () {
|
|
71
71
|
yield connectToDatabase();
|
|
72
72
|
const id = item.id;
|
|
73
73
|
delete item.id;
|
|
74
|
-
const updatedItem = yield db[
|
|
74
|
+
const updatedItem = yield db[resource].findOneAndUpdate({ _id: id }, { $set: item }, { returnOriginal: false });
|
|
75
75
|
return removeUnderscoreFromId(updatedItem.value);
|
|
76
76
|
});
|
|
77
77
|
}
|
|
78
|
-
function replace(
|
|
78
|
+
function replace(resource, item) {
|
|
79
79
|
return __awaiter(this, void 0, void 0, function* () {
|
|
80
80
|
yield connectToDatabase();
|
|
81
81
|
const id = item.id;
|
|
82
82
|
delete item.id;
|
|
83
|
-
const replacedItem = yield db[
|
|
83
|
+
const replacedItem = yield db[resource].findOneAndReplace({ _id: id }, item, {
|
|
84
84
|
returnOriginal: false,
|
|
85
85
|
});
|
|
86
86
|
return removeUnderscoreFromId(replacedItem.value);
|
|
87
87
|
});
|
|
88
88
|
}
|
|
89
|
-
function deleteById(
|
|
89
|
+
function deleteById(resource, id) {
|
|
90
90
|
return __awaiter(this, void 0, void 0, function* () {
|
|
91
91
|
yield connectToDatabase();
|
|
92
|
-
yield db[
|
|
92
|
+
yield db[resource].deleteOne({ _id: id });
|
|
93
93
|
});
|
|
94
94
|
}
|
|
95
|
-
function deleteAll(
|
|
95
|
+
function deleteAll(resource) {
|
|
96
96
|
return __awaiter(this, void 0, void 0, function* () {
|
|
97
97
|
yield connectToDatabase();
|
|
98
|
-
yield db[
|
|
98
|
+
yield db[resource].deleteMany({});
|
|
99
99
|
});
|
|
100
100
|
}
|
|
101
101
|
function removeUnderscoreFromId(item) {
|
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,OAAO;QACP,UAAU;QACV,SAAS;KACV,CAAA;AACH,CAAC;AAbD,qCAaC;AAED,SAAe,iBAAiB;;QAC9B,IAAI,CAAC,EAAE,EAAE;YACP,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;YACvC,IAAI;gBACF,EAAE,GAAG,MAAM,IAAA,eAAO,EAAC,GAAG,CAAC,CAAA;gBACvB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;aACrC;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;gBAC3C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;aACrB;SACF;IACH,CAAC;CAAA;AAED,SAAe,MAAM,CAAC,
|
|
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,OAAO;QACP,UAAU;QACV,SAAS;KACV,CAAA;AACH,CAAC;AAbD,qCAaC;AAED,SAAe,iBAAiB;;QAC9B,IAAI,CAAC,EAAE,EAAE;YACP,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;YACvC,IAAI;gBACF,EAAE,GAAG,MAAM,IAAA,eAAO,EAAC,GAAG,CAAC,CAAA;gBACvB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;aACrC;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;gBAC3C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;aACrB;SACF;IACH,CAAC;CAAA;AAED,SAAe,MAAM,CAAC,QAAQ;;QAC5B,MAAM,iBAAiB,EAAE,CAAA;QAEzB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAEzC,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;AAED,SAAe,OAAO,CAAC,QAAQ,EAAE,EAAE;;QACjC,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;AAED,SAAe,MAAM,CAAC,QAAQ,EAAE,IAAI;;QAClC,MAAM,iBAAiB,EAAE,CAAA;QAEzB,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAEtD,OAAO,sBAAsB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACnD,CAAC;CAAA;AAED,SAAe,MAAM,CAAC,QAAQ,EAAE,IAAI;;QAClC,MAAM,iBAAiB,EAAE,CAAA;QAEzB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;QAClB,OAAO,IAAI,CAAC,EAAE,CAAA;QAEd,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CACrD,EAAE,GAAG,EAAE,EAAE,EAAE,EACX,EAAE,IAAI,EAAE,IAAI,EAAE,EACd,EAAE,cAAc,EAAE,KAAK,EAAE,CAC1B,CAAA;QAED,OAAO,sBAAsB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IAClD,CAAC;CAAA;AAED,SAAe,OAAO,CAAC,QAAQ,EAAE,IAAI;;QACnC,MAAM,iBAAiB,EAAE,CAAA;QAEzB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;QAClB,OAAO,IAAI,CAAC,EAAE,CAAA;QAEd,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;YAC3E,cAAc,EAAE,KAAK;SACtB,CAAC,CAAA;QAEF,OAAO,sBAAsB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IACnD,CAAC;CAAA;AAED,SAAe,UAAU,CAAC,QAAQ,EAAE,EAAE;;QACpC,MAAM,iBAAiB,EAAE,CAAA;QAEzB,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAA;IAC3C,CAAC;CAAA;AAED,SAAe,SAAS,CAAC,QAAQ;;QAC/B,MAAM,iBAAiB,EAAE,CAAA;QAEzB,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;IACnC,CAAC;CAAA;AAED,SAAS,sBAAsB,CAAC,IAAI;IAClC,MAAM,WAAW,mCAAQ,IAAI,KAAE,EAAE,EAAE,IAAI,CAAC,GAAG,GAAE,CAAA;IAC7C,OAAO,WAAW,CAAC,GAAG,CAAA;IACtB,OAAO,WAAW,CAAA;AACpB,CAAC"}
|
package/queries/queries.d.ts
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
declare function createQueries(connectionString: any): {
|
|
2
2
|
connectToDatabase: () => Promise<void>;
|
|
3
|
-
getAll: (
|
|
4
|
-
getById: (
|
|
5
|
-
create: (
|
|
6
|
-
update: (
|
|
7
|
-
replace: (
|
|
8
|
-
deleteById: (
|
|
9
|
-
deleteAll: (
|
|
3
|
+
getAll: (resource: any) => Promise<any>;
|
|
4
|
+
getById: (resource: any, id: any) => Promise<any>;
|
|
5
|
+
create: (resource: any, item: any) => Promise<any>;
|
|
6
|
+
update: (resource: any, item: any) => Promise<any>;
|
|
7
|
+
replace: (resource: any, item: any) => Promise<any>;
|
|
8
|
+
deleteById: (resource: any, id: any) => Promise<void>;
|
|
9
|
+
deleteAll: (resource: any) => Promise<void>;
|
|
10
10
|
} | {
|
|
11
11
|
connectToDatabase: () => void;
|
|
12
|
-
getAll: (
|
|
13
|
-
getById: (
|
|
14
|
-
create: (
|
|
15
|
-
update: (
|
|
16
|
-
replace: (
|
|
17
|
-
deleteById: (
|
|
18
|
-
deleteAll: (
|
|
12
|
+
getAll: (resource: any) => Promise<unknown>;
|
|
13
|
+
getById: (resource: any, id: any) => Promise<unknown>;
|
|
14
|
+
create: (resource: any, item: any) => Promise<unknown>;
|
|
15
|
+
update: (resource: any, item: any) => Promise<unknown>;
|
|
16
|
+
replace: (resource: any, item: any) => Promise<unknown>;
|
|
17
|
+
deleteById: (resource: any, id: any) => Promise<void>;
|
|
18
|
+
deleteAll: (resource: any) => Promise<unknown>;
|
|
19
19
|
};
|
|
20
20
|
export { createQueries };
|
package/routes/delete.js
CHANGED
|
@@ -14,15 +14,15 @@ function createDeleteRoutes(queries) {
|
|
|
14
14
|
function handleDelete(req, res) {
|
|
15
15
|
return __awaiter(this, void 0, void 0, function* () {
|
|
16
16
|
try {
|
|
17
|
-
const {
|
|
17
|
+
const { resource, id } = req.requestInfo;
|
|
18
18
|
if (id) {
|
|
19
|
-
const item = yield queries.getById(
|
|
19
|
+
const item = yield queries.getById(resource, id);
|
|
20
20
|
if (item) {
|
|
21
|
-
yield queries.deleteById(
|
|
21
|
+
yield queries.deleteById(resource, id);
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
else {
|
|
25
|
-
yield queries.deleteAll(
|
|
25
|
+
yield queries.deleteAll(resource);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
catch (error) {
|
package/routes/delete.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/routes/delete.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,SAAS,kBAAkB,CAAC,OAAO;IACjC,SAAe,YAAY,CAAC,GAAG,EAAE,GAAG;;YAClC,IAAI;gBACF,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/routes/delete.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,SAAS,kBAAkB,CAAC,OAAO;IACjC,SAAe,YAAY,CAAC,GAAG,EAAE,GAAG;;YAClC,IAAI;gBACF,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,WAAW,CAAA;gBAExC,IAAI,EAAE,EAAE;oBACN,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;oBAChD,IAAI,IAAI,EAAE;wBACR,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;qBACvC;iBACF;qBAAM;oBACL,MAAM,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;iBAClC;aACF;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;YAED,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;QAC/B,CAAC;KAAA;IAED,OAAO;QACL,YAAY;KACb,CAAA;AACH,CAAC;AAEQ,gDAAkB"}
|
package/routes/get.js
CHANGED
|
@@ -15,10 +15,10 @@ function createGetRoutes(queries, cacheControl, responseBodyInterceptor, returnN
|
|
|
15
15
|
function handleGetResource(req, res) {
|
|
16
16
|
return __awaiter(this, void 0, void 0, function* () {
|
|
17
17
|
try {
|
|
18
|
-
const {
|
|
18
|
+
const { resource, id } = req.requestInfo;
|
|
19
19
|
res.set('Cache-control', cacheControl);
|
|
20
20
|
if (id) {
|
|
21
|
-
const item = yield queries.getById(
|
|
21
|
+
const item = yield queries.getById(resource, id);
|
|
22
22
|
if (!item) {
|
|
23
23
|
res.status(404);
|
|
24
24
|
return res.send();
|
|
@@ -26,7 +26,7 @@ function createGetRoutes(queries, cacheControl, responseBodyInterceptor, returnN
|
|
|
26
26
|
let theItem = item;
|
|
27
27
|
if (responseBodyInterceptor) {
|
|
28
28
|
try {
|
|
29
|
-
theItem = responseBodyInterceptor({
|
|
29
|
+
theItem = responseBodyInterceptor({ resource, body: item, id });
|
|
30
30
|
if (!theItem)
|
|
31
31
|
theItem = item;
|
|
32
32
|
}
|
|
@@ -40,11 +40,11 @@ function createGetRoutes(queries, cacheControl, responseBodyInterceptor, returnN
|
|
|
40
40
|
res.json(returnNullFields ? theItem : (0, utils_1.removeNullFields)(theItem));
|
|
41
41
|
return res.send();
|
|
42
42
|
}
|
|
43
|
-
const items = yield queries.getAll(
|
|
43
|
+
const items = yield queries.getAll(resource);
|
|
44
44
|
let theItems = items;
|
|
45
45
|
if (responseBodyInterceptor) {
|
|
46
46
|
try {
|
|
47
|
-
theItems = responseBodyInterceptor({
|
|
47
|
+
theItems = responseBodyInterceptor({ resource, body: items });
|
|
48
48
|
if (!theItems)
|
|
49
49
|
theItems = items;
|
|
50
50
|
}
|
package/routes/get.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/routes/get.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAA0C;AAE1C,SAAS,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,gBAAgB;IACvF,SAAe,iBAAiB,CAAC,GAAG,EAAE,GAAG;;YACvC,IAAI;gBACF,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/routes/get.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAA0C;AAE1C,SAAS,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,gBAAgB;IACvF,SAAe,iBAAiB,CAAC,GAAG,EAAE,GAAG;;YACvC,IAAI;gBACF,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,WAAW,CAAA;gBAExC,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAA;gBAEtC,IAAI,EAAE,EAAE;oBACN,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;oBAEhD,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,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;4BAC/D,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,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAA,wBAAgB,EAAC,OAAO,CAAC,CAAC,CAAA;oBAChE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;iBAClB;gBAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;gBAE5C,IAAI,QAAQ,GAAG,KAAK,CAAA;gBACpB,IAAI,uBAAuB,EAAE;oBAC3B,IAAI;wBACF,QAAQ,GAAG,uBAAuB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;wBAC7D,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,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,wBAAgB,EAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACtF,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"}
|
package/routes/interceptors.js
CHANGED
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.interceptRequestBody = void 0;
|
|
4
4
|
function interceptRequestBody(intercept, req) {
|
|
5
|
-
const {
|
|
6
|
-
let
|
|
7
|
-
const validationResult = intercept({
|
|
8
|
-
if (!validationResult && typeof
|
|
9
|
-
return
|
|
5
|
+
const { resource } = req.requestInfo;
|
|
6
|
+
let body = req.body;
|
|
7
|
+
const validationResult = intercept({ resource, body });
|
|
8
|
+
if (!validationResult && typeof body === 'object')
|
|
9
|
+
return body;
|
|
10
10
|
if (typeof validationResult === 'string')
|
|
11
11
|
return validationResult;
|
|
12
|
-
// The
|
|
12
|
+
// The request body was replaced by something else.
|
|
13
13
|
if (validationResult)
|
|
14
|
-
|
|
15
|
-
if (typeof
|
|
16
|
-
return
|
|
14
|
+
body = validationResult;
|
|
15
|
+
if (typeof body === 'object') {
|
|
16
|
+
return body;
|
|
17
17
|
}
|
|
18
18
|
else
|
|
19
19
|
return req.body;
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"interceptors.js","sourceRoot":"","sources":["../../src/routes/interceptors.ts"],"names":[],"mappings":";;;AAEA,SAAS,oBAAoB,CAAC,SAAyC,EAAE,GAAG;IAC1E,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,WAAW,CAAA;IACpC,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;IAEnB,MAAM,gBAAgB,GAAG,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IAEtD,IAAI,CAAC,gBAAgB,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IAE9D,IAAI,OAAO,gBAAgB,KAAK,QAAQ;QAAE,OAAO,gBAAgB,CAAA;IAEjE,mDAAmD;IACnD,IAAI,gBAAgB;QAAE,IAAI,GAAG,gBAAgB,CAAA;IAE7C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,OAAO,IAAI,CAAA;KACZ;;QAAM,OAAO,GAAG,CAAC,IAAI,CAAA;AACxB,CAAC;AAEQ,oDAAoB"}
|
package/routes/patch.js
CHANGED
|
@@ -16,19 +16,19 @@ function createPatchRoutes(queries, requestBodyInterceptor, returnNullFields) {
|
|
|
16
16
|
function handlePatch(req, res) {
|
|
17
17
|
return __awaiter(this, void 0, void 0, function* () {
|
|
18
18
|
try {
|
|
19
|
-
const {
|
|
20
|
-
const
|
|
21
|
-
if (typeof
|
|
22
|
-
return res.status(400).json({ message:
|
|
19
|
+
const { resource, id } = req.requestInfo;
|
|
20
|
+
const body = (0, interceptors_1.interceptRequestBody)(requestBodyInterceptor.patch, req);
|
|
21
|
+
if (typeof body === 'string')
|
|
22
|
+
return res.status(400).json({ message: body }).send();
|
|
23
23
|
let item = null;
|
|
24
24
|
if (id)
|
|
25
|
-
item = yield queries.getById(
|
|
25
|
+
item = yield queries.getById(resource, id);
|
|
26
26
|
if (!item)
|
|
27
27
|
return res.status(404).json({
|
|
28
28
|
message: `ID '${id}' not found`,
|
|
29
29
|
});
|
|
30
|
-
item = Object.assign(Object.assign(Object.assign({}, item),
|
|
31
|
-
const updatedItem = yield queries.update(
|
|
30
|
+
item = Object.assign(Object.assign(Object.assign({}, item), body), { id });
|
|
31
|
+
const updatedItem = yield queries.update(resource, item);
|
|
32
32
|
return res
|
|
33
33
|
.status(200)
|
|
34
34
|
.json(returnNullFields ? updatedItem : (0, utils_1.removeNullFields)(updatedItem))
|
package/routes/patch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/routes/patch.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAAqD;AACrD,mCAA0C;AAE1C,SAAS,iBAAiB,CAAC,OAAO,EAAE,sBAAsB,EAAE,gBAAgB;IAC1E,SAAe,WAAW,CAAC,GAAG,EAAE,GAAG;;YACjC,IAAI;gBACF,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/routes/patch.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAAqD;AACrD,mCAA0C;AAE1C,SAAS,iBAAiB,CAAC,OAAO,EAAE,sBAAsB,EAAE,gBAAgB;IAC1E,SAAe,WAAW,CAAC,GAAG,EAAE,GAAG;;YACjC,IAAI;gBACF,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,WAAW,CAAA;gBAExC,MAAM,IAAI,GAAG,IAAA,mCAAoB,EAAC,sBAAsB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;gBAEpE,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;gBAEnF,IAAI,IAAI,GAAG,IAAI,CAAA;gBACf,IAAI,EAAE;oBAAE,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;gBAElD,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,IAAI,KAAE,EAAE,GAAE,CAAA;gBAE/B,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBAExD,OAAO,GAAG;qBACP,MAAM,CAAC,GAAG,CAAC;qBACX,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAA,wBAAgB,EAAC,WAAW,CAAC,CAAC;qBACpE,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,WAAW;KACZ,CAAA;AACH,CAAC;AAEQ,8CAAiB"}
|
package/routes/post.js
CHANGED
|
@@ -17,17 +17,17 @@ function createPostRoutes(queries, requestBodyInterceptor, returnNullFields) {
|
|
|
17
17
|
function handlePost(req, res) {
|
|
18
18
|
return __awaiter(this, void 0, void 0, function* () {
|
|
19
19
|
try {
|
|
20
|
-
const {
|
|
21
|
-
const
|
|
22
|
-
if (typeof
|
|
23
|
-
return res.status(400).json({ message:
|
|
24
|
-
const newItem = yield queries.create(
|
|
20
|
+
const { resource } = req.requestInfo;
|
|
21
|
+
const body = (0, interceptors_1.interceptRequestBody)(requestBodyInterceptor.post, req);
|
|
22
|
+
if (typeof body === 'string')
|
|
23
|
+
return res.status(400).json({ message: body }).send();
|
|
24
|
+
const newItem = yield queries.create(resource, body);
|
|
25
25
|
return res
|
|
26
26
|
.set({
|
|
27
27
|
Location: (0, url_1.format)({
|
|
28
28
|
protocol: req.protocol,
|
|
29
29
|
host: req.get('host'),
|
|
30
|
-
pathname: `${
|
|
30
|
+
pathname: `${resource}/${newItem.id}`,
|
|
31
31
|
}),
|
|
32
32
|
})
|
|
33
33
|
.status(201)
|
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,iDAAqD;AACrD,mCAA0C;AAE1C,SAAS,gBAAgB,CAAC,OAAO,EAAE,sBAAsB,EAAE,gBAAgB;IACzE,SAAe,UAAU,CAAC,GAAG,EAAE,GAAG;;YAChC,IAAI;gBACF,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/routes/post.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6BAA4B;AAC5B,iDAAqD;AACrD,mCAA0C;AAE1C,SAAS,gBAAgB,CAAC,OAAO,EAAE,sBAAsB,EAAE,gBAAgB;IACzE,SAAe,UAAU,CAAC,GAAG,EAAE,GAAG;;YAChC,IAAI;gBACF,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,WAAW,CAAA;gBAEpC,MAAM,IAAI,GAAG,IAAA,mCAAoB,EAAC,sBAAsB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;gBAEnE,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;gBAEnF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBAEpD,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,QAAQ,IAAI,OAAO,CAAC,EAAE,EAAE;qBACtC,CAAC;iBACH,CAAC;qBACD,MAAM,CAAC,GAAG,CAAC;qBACX,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAA,wBAAgB,EAAC,OAAO,CAAC,CAAC;qBAC5D,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.js
CHANGED
|
@@ -16,19 +16,19 @@ function createPutRoutes(queries, requestBodyInterceptor, returnNullFields) {
|
|
|
16
16
|
function handlePut(req, res) {
|
|
17
17
|
return __awaiter(this, void 0, void 0, function* () {
|
|
18
18
|
try {
|
|
19
|
-
const {
|
|
20
|
-
const
|
|
21
|
-
if (typeof
|
|
22
|
-
return res.status(400).json({ message:
|
|
19
|
+
const { resource, id } = req.requestInfo;
|
|
20
|
+
const body = (0, interceptors_1.interceptRequestBody)(requestBodyInterceptor.put, req);
|
|
21
|
+
if (typeof body === 'string')
|
|
22
|
+
return res.status(400).json({ message: body }).send();
|
|
23
23
|
let item = null;
|
|
24
24
|
if (id)
|
|
25
|
-
item = yield queries.getById(
|
|
25
|
+
item = yield queries.getById(resource, id);
|
|
26
26
|
if (!item)
|
|
27
27
|
return res.status(404).json({
|
|
28
28
|
message: `ID '${id}' not found`,
|
|
29
29
|
});
|
|
30
|
-
item = Object.assign(Object.assign({},
|
|
31
|
-
const replacedItem = yield queries.replace(
|
|
30
|
+
item = Object.assign(Object.assign({}, body), { id });
|
|
31
|
+
const replacedItem = yield queries.replace(resource, item);
|
|
32
32
|
return res
|
|
33
33
|
.status(200)
|
|
34
34
|
.json(returnNullFields ? replacedItem : (0, utils_1.removeNullFields)(replacedItem))
|
package/routes/put.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"put.js","sourceRoot":"","sources":["../../src/routes/put.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAAqD;AACrD,mCAA0C;AAE1C,SAAS,eAAe,CAAC,OAAO,EAAE,sBAAsB,EAAE,gBAAgB;IACxE,SAAe,SAAS,CAAC,GAAG,EAAE,GAAG;;YAC/B,IAAI;gBACF,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"put.js","sourceRoot":"","sources":["../../src/routes/put.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAAqD;AACrD,mCAA0C;AAE1C,SAAS,eAAe,CAAC,OAAO,EAAE,sBAAsB,EAAE,gBAAgB;IACxE,SAAe,SAAS,CAAC,GAAG,EAAE,GAAG;;YAC/B,IAAI;gBACF,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,WAAW,CAAA;gBAExC,MAAM,IAAI,GAAG,IAAA,mCAAoB,EAAC,sBAAsB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;gBAElE,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;gBAEnF,IAAI,IAAI,GAAG,IAAI,CAAA;gBACf,IAAI,EAAE;oBAAE,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;gBAElD,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,IAAI,KAAE,EAAE,GAAE,CAAA;gBAEtB,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBAE1D,OAAO,GAAG;qBACP,MAAM,CAAC,GAAG,CAAC;qBACX,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAA,wBAAgB,EAAC,YAAY,CAAC,CAAC;qBACtE,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,SAAS;KACV,CAAA;AACH,CAAC;AAEQ,0CAAe"}
|
package/routes/routes.js
CHANGED
|
@@ -21,13 +21,13 @@ 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,
|
|
24
|
+
const { validateResources, resources, apiPrefix, cacheControl, requestBodyInterceptor, responseBodyInterceptor, returnNullFields, } = routerConfig;
|
|
25
25
|
const { handleGetResource } = (0, get_1.createGetRoutes)(queries, cacheControl, responseBodyInterceptor, returnNullFields);
|
|
26
26
|
const { handlePost } = (0, post_1.createPostRoutes)(queries, requestBodyInterceptor, returnNullFields);
|
|
27
27
|
const { handlePut } = (0, put_1.createPutRoutes)(queries, requestBodyInterceptor, returnNullFields);
|
|
28
28
|
const { handlePatch } = (0, patch_1.createPatchRoutes)(queries, requestBodyInterceptor, returnNullFields);
|
|
29
29
|
const { handleDelete } = (0, delete_1.createDeleteRoutes)(queries);
|
|
30
|
-
const validateResource = (0, urlMiddleware_1.createValidateResourceMiddleware)(validateResources,
|
|
30
|
+
const validateResource = (0, urlMiddleware_1.createValidateResourceMiddleware)(validateResources, resources);
|
|
31
31
|
const getResourceAndId = (0, urlMiddleware_1.createResourceAndIdParser)(apiPrefix);
|
|
32
32
|
const resourceRouter = express_1.default.Router();
|
|
33
33
|
resourceRouter
|
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,yDAAmG;AAEnG,sDAA6B;AAG7B,SAAS,oBAAoB,CAAC,OAAO,EAAE,YAA0B;IAC/D,MAAM,EACJ,iBAAiB,EACjB,
|
|
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,SAAS,EACT,SAAS,EACT,YAAY,EACZ,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,GACjB,GAAG,YAAY,CAAA;IAEhB,MAAM,EAAE,iBAAiB,EAAE,GAAG,IAAA,qBAAe,EAC3C,OAAO,EACP,YAAY,EACZ,uBAAuB,EACvB,gBAAgB,CACjB,CAAA;IACD,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,uBAAgB,EAAC,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,CAAC,CAAA;IAC1F,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,qBAAe,EAAC,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,CAAC,CAAA;IACxF,MAAM,EAAE,WAAW,EAAE,GAAG,IAAA,yBAAiB,EAAC,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,CAAC,CAAA;IAC5F,MAAM,EAAE,YAAY,EAAE,GAAG,IAAA,2BAAkB,EAAC,OAAO,CAAC,CAAA;IAEpD,MAAM,gBAAgB,GAAG,IAAA,gDAAgC,EAAC,iBAAiB,EAAE,SAAS,CAAC,CAAA;IACvF,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,6 +1,6 @@
|
|
|
1
1
|
type RequestInfo = {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
resource: string;
|
|
3
|
+
body: unknown;
|
|
4
4
|
};
|
|
5
5
|
export type RequestBodyInterceptorCallback = (info: RequestInfo) => void | string | object;
|
|
6
6
|
export type RequestBodyInterceptor = {
|
|
@@ -9,8 +9,8 @@ export type RequestBodyInterceptor = {
|
|
|
9
9
|
put?: RequestBodyInterceptorCallback;
|
|
10
10
|
};
|
|
11
11
|
type ResponseInfo = {
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
resource: string;
|
|
13
|
+
body: unknown;
|
|
14
14
|
id?: string;
|
|
15
15
|
};
|
|
16
16
|
export type ResponseBodyInterceptor = (info: ResponseInfo) => unknown;
|
package/urls/urlMiddleware.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
declare function createResourceAndIdParser(apiPrefix: any): (req: any, _: any, next: any) => any;
|
|
2
|
-
declare function createValidateResourceMiddleware(validateResources: any,
|
|
2
|
+
declare function createValidateResourceMiddleware(validateResources: any, resources: any): (req: any, res: any, next: any) => any;
|
|
3
3
|
export { createResourceAndIdParser, createValidateResourceMiddleware };
|
package/urls/urlMiddleware.js
CHANGED
|
@@ -11,16 +11,16 @@ function createResourceAndIdParser(apiPrefix) {
|
|
|
11
11
|
};
|
|
12
12
|
}
|
|
13
13
|
exports.createResourceAndIdParser = createResourceAndIdParser;
|
|
14
|
-
function createValidateResourceMiddleware(validateResources,
|
|
14
|
+
function createValidateResourceMiddleware(validateResources, resources) {
|
|
15
15
|
return function validateResource(req, res, next) {
|
|
16
16
|
if (!validateResources)
|
|
17
17
|
return next();
|
|
18
|
-
const {
|
|
19
|
-
if (!
|
|
18
|
+
const { resource } = req.requestInfo;
|
|
19
|
+
if (!resource)
|
|
20
20
|
return next();
|
|
21
|
-
if (!
|
|
21
|
+
if (!resources.includes(resource.toLowerCase())) {
|
|
22
22
|
return res.status(404).json({
|
|
23
|
-
message: `'${
|
|
23
|
+
message: `'${resource}' is an unknown resource`,
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
26
|
return next();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urlMiddleware.js","sourceRoot":"","sources":["../../src/urls/urlMiddleware.ts"],"names":[],"mappings":";;;AAAA,2CAAsC;AAEtC,SAAS,yBAAyB,CAAC,SAAS;IAC1C,OAAO,SAAS,gBAAgB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI;QAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,IAAA,oBAAQ,EAAC,GAAG,CAAC,CAAA;QAE7B,GAAG,CAAC,WAAW,mCAAQ,GAAG,CAAC,WAAW,GAAK,OAAO,CAAE,CAAA;QAEpD,OAAO,IAAI,EAAE,CAAA;IACf,CAAC,CAAA;AACH,CAAC;AAoBQ,8DAAyB;AAlBlC,SAAS,gCAAgC,CAAC,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"urlMiddleware.js","sourceRoot":"","sources":["../../src/urls/urlMiddleware.ts"],"names":[],"mappings":";;;AAAA,2CAAsC;AAEtC,SAAS,yBAAyB,CAAC,SAAS;IAC1C,OAAO,SAAS,gBAAgB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI;QAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,IAAA,oBAAQ,EAAC,GAAG,CAAC,CAAA;QAE7B,GAAG,CAAC,WAAW,mCAAQ,GAAG,CAAC,WAAW,GAAK,OAAO,CAAE,CAAA;QAEpD,OAAO,IAAI,EAAE,CAAA;IACf,CAAC,CAAA;AACH,CAAC;AAoBQ,8DAAyB;AAlBlC,SAAS,gCAAgC,CAAC,iBAAiB,EAAE,SAAS;IACpE,OAAO,SAAS,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI;QAC7C,IAAI,CAAC,iBAAiB;YAAE,OAAO,IAAI,EAAE,CAAA;QAErC,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,WAAW,CAAA;QAEpC,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,EAAE,CAAA;QAE5B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE;YAC/C,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,OAAO,EAAE,IAAI,QAAQ,0BAA0B;aAChD,CAAC,CAAA;SACH;QAED,OAAO,IAAI,EAAE,CAAA;IACf,CAAC,CAAA;AACH,CAAC;AAEmC,4EAAgC"}
|
package/urls/urlParser.d.ts
CHANGED
package/urls/urlParser.js
CHANGED
|
@@ -3,11 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.parseUrl = void 0;
|
|
4
4
|
function parseUrl(url) {
|
|
5
5
|
if (!url || (url && !url.trim()))
|
|
6
|
-
return {
|
|
6
|
+
return { resource: null, id: null };
|
|
7
7
|
const urlSegments = url.split('/').filter((i) => i);
|
|
8
|
-
const
|
|
8
|
+
const resource = urlSegments.length > 0 ? urlSegments[0] : null;
|
|
9
9
|
const id = urlSegments.length > 1 ? urlSegments[1] : null;
|
|
10
|
-
return {
|
|
10
|
+
return { resource, id };
|
|
11
11
|
}
|
|
12
12
|
exports.parseUrl = parseUrl;
|
|
13
13
|
//# sourceMappingURL=urlParser.js.map
|
package/urls/urlParser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urlParser.js","sourceRoot":"","sources":["../../src/urls/urlParser.ts"],"names":[],"mappings":";;;AAAA,SAAS,QAAQ,CAAC,GAAG;IACnB,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"urlParser.js","sourceRoot":"","sources":["../../src/urls/urlParser.ts"],"names":[],"mappings":";;;AAAA,SAAS,QAAQ,CAAC,GAAG;IACnB,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;IAErE,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IAEnD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC/D,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAEzD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;AACzB,CAAC;AAEQ,4BAAQ"}
|