temba 0.13.1 → 0.14.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 +36 -23
- package/config/index.d.ts +3 -2
- package/config/index.js +3 -0
- package/config/index.js.map +1 -1
- package/package.json +1 -1
- package/routes/get.d.ts +1 -1
- package/routes/get.js +4 -3
- package/routes/get.js.map +1 -1
- package/routes/patch.d.ts +1 -1
- package/routes/patch.js +6 -2
- package/routes/patch.js.map +1 -1
- package/routes/post.d.ts +1 -1
- package/routes/post.js +3 -2
- package/routes/post.js.map +1 -1
- package/routes/put.d.ts +1 -1
- package/routes/put.js +6 -2
- package/routes/put.js.map +1 -1
- package/routes/routes.js +5 -5
- package/routes/routes.js.map +1 -1
- package/routes/utils.d.ts +3 -0
- package/routes/utils.js +8 -0
- package/routes/utils.js.map +1 -0
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@latest my-rest-api
|
|
56
56
|
cd my-rest-api
|
|
57
57
|
npm start
|
|
58
58
|
```
|
|
@@ -137,7 +137,9 @@ For every resource you use in your requests, a collection is created in the data
|
|
|
137
137
|
If you only want to allow specific resource names, configure them by providing a `resourceNames` key in the config object when creating the Temba server:
|
|
138
138
|
|
|
139
139
|
```js
|
|
140
|
-
const config = {
|
|
140
|
+
const config = {
|
|
141
|
+
resourceNames: ['movies', 'actors'],
|
|
142
|
+
}
|
|
141
143
|
const server = temba.create(config)
|
|
142
144
|
```
|
|
143
145
|
|
|
@@ -148,7 +150,9 @@ Requests on these resources only give a `404 Not Found` if the ID does not exist
|
|
|
148
150
|
If you want to host static assets, next to the API, configure the `staticFolder`:
|
|
149
151
|
|
|
150
152
|
```js
|
|
151
|
-
const config = {
|
|
153
|
+
const config = {
|
|
154
|
+
staticFolder: 'build',
|
|
155
|
+
}
|
|
152
156
|
const server = temba.create(config)
|
|
153
157
|
```
|
|
154
158
|
|
|
@@ -167,7 +171,9 @@ To be able to still access the `/products` API resource, configure an `apiPrefix
|
|
|
167
171
|
With the `apiPrefix` config setting, all resources get an extra path segment in front of them. If the `apiPrefix` is `'api'`, then `/movies/12345` becomes `/api/movies/12345`:
|
|
168
172
|
|
|
169
173
|
```js
|
|
170
|
-
const config = {
|
|
174
|
+
const config = {
|
|
175
|
+
apiPrefix: 'api',
|
|
176
|
+
}
|
|
171
177
|
const server = temba.create(config)
|
|
172
178
|
```
|
|
173
179
|
|
|
@@ -348,10 +354,10 @@ router.get('api/stuff', (req, res) => {
|
|
|
348
354
|
})
|
|
349
355
|
|
|
350
356
|
const config = {
|
|
351
|
-
resourceNames: ['stuff'],
|
|
352
|
-
staticFolder: 'build',
|
|
353
357
|
apiPrefix: 'api',
|
|
354
358
|
customRouter: router,
|
|
359
|
+
resourceNames: ['stuff'],
|
|
360
|
+
staticFolder: 'build',
|
|
355
361
|
}
|
|
356
362
|
const server = temba.create(config)
|
|
357
363
|
```
|
|
@@ -369,12 +375,10 @@ Here is an example of the config settings for Temba, and how you define them:
|
|
|
369
375
|
|
|
370
376
|
```js
|
|
371
377
|
const config = {
|
|
372
|
-
resourceNames: ['movies', 'actors'],
|
|
373
|
-
connectionString: 'mongodb://localhost:27017',
|
|
374
|
-
staticFolder: 'build',
|
|
375
378
|
apiPrefix: 'api',
|
|
376
|
-
customRouter: router,
|
|
377
379
|
cacheControl: 'public, max-age=300',
|
|
380
|
+
connectionString: 'mongodb://localhost:27017',
|
|
381
|
+
customRouter: router,
|
|
378
382
|
delay: 500,
|
|
379
383
|
requestBodyInterceptor: {
|
|
380
384
|
post: ({ resourceName, requestBody }) => {
|
|
@@ -387,25 +391,30 @@ const config = {
|
|
|
387
391
|
// Validate, or even change the requestBody
|
|
388
392
|
},
|
|
389
393
|
},
|
|
394
|
+
resourceNames: ['movies', 'actors'],
|
|
395
|
+
responseBodyInterceptor: ({ resourceName, responseBody, id }) => {
|
|
396
|
+
// Change the response body before it is sent to the client
|
|
397
|
+
},
|
|
398
|
+
returnNullFields: false,
|
|
399
|
+
staticFolder: 'build',
|
|
390
400
|
}
|
|
391
401
|
const server = temba.create(config)
|
|
392
402
|
```
|
|
393
403
|
|
|
394
|
-
None of the settings are required, and only the settings you define are used.
|
|
395
|
-
|
|
396
404
|
These are all the possible settings:
|
|
397
405
|
|
|
398
|
-
| Config setting | Description |
|
|
399
|
-
| :------------------------ | :----------------------------------------------------------------------------------------- |
|
|
400
|
-
| `
|
|
401
|
-
| `
|
|
402
|
-
| `
|
|
403
|
-
| `
|
|
404
|
-
| `
|
|
405
|
-
| `
|
|
406
|
-
| `
|
|
407
|
-
| `
|
|
408
|
-
| `
|
|
406
|
+
| Config setting | Description | Default value |
|
|
407
|
+
| :------------------------ | :----------------------------------------------------------------------------------------- | :------------ |
|
|
408
|
+
| `apiPrefix` | See [API prefix](#api-prefix) | `null` |
|
|
409
|
+
| `cacheControl` | The `Cache-control` response header value for each GET request. | `'no-store'` |
|
|
410
|
+
| `connectionString` | See [MongoDB](#mongodb) | `null` |
|
|
411
|
+
| `customRouter` | See [Custom router](#custom-router) | `null` |
|
|
412
|
+
| `delay` | After processing the request, the delay in milliseconds before the request should be sent. | `0` |
|
|
413
|
+
| `requestBodyInterceptor` | See [Request body validation or mutation](#request-body-validation-or-mutation) | `noop` |
|
|
414
|
+
| `resourceNames` | See [Allowing specific resources only](#allowing-specific-resources-only) | `[]` |
|
|
415
|
+
| `responseBodyInterceptor` | See [Response body interception](#request-body-validation-or-mutation) | `noop` |
|
|
416
|
+
| `returnNullFields` | Whether fields with a `null` value should be returned in responses. | `true` |
|
|
417
|
+
| `staticFolder` | See [Static assets](#static-assets) | `null` |
|
|
409
418
|
|
|
410
419
|
## Roadmap
|
|
411
420
|
|
|
@@ -419,6 +428,10 @@ Although I won't promise if and when, these are some things to consider for the
|
|
|
419
428
|
|
|
420
429
|
- 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`
|
|
421
430
|
|
|
431
|
+
- Intial data seed when using in-memory.
|
|
432
|
+
|
|
433
|
+
- Get rid of Express?
|
|
434
|
+
|
|
422
435
|
## Under the hood
|
|
423
436
|
|
|
424
437
|
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
|
@@ -11,11 +11,11 @@ export type Config = {
|
|
|
11
11
|
connectionString: string;
|
|
12
12
|
delay: number;
|
|
13
13
|
customRouter: Router;
|
|
14
|
+
returnNullFields: boolean;
|
|
14
15
|
};
|
|
15
|
-
export type RouterConfig = Pick<Config, 'validateResources' | 'resourceNames' | 'apiPrefix' | 'cacheControl' | 'requestBodyInterceptor' | 'responseBodyInterceptor'>;
|
|
16
|
+
export type RouterConfig = Pick<Config, 'validateResources' | 'resourceNames' | 'apiPrefix' | 'cacheControl' | 'requestBodyInterceptor' | 'responseBodyInterceptor' | 'returnNullFields'>;
|
|
16
17
|
export type UserConfig = {
|
|
17
18
|
resourceNames?: string[];
|
|
18
|
-
validateResources?: boolean;
|
|
19
19
|
staticFolder?: string;
|
|
20
20
|
apiPrefix?: string;
|
|
21
21
|
connectionString?: string;
|
|
@@ -24,5 +24,6 @@ export type UserConfig = {
|
|
|
24
24
|
requestBodyInterceptor?: RequestBodyInterceptor;
|
|
25
25
|
responseBodyInterceptor?: ResponseBodyInterceptor;
|
|
26
26
|
customRouter?: Router;
|
|
27
|
+
returnNullFields?: boolean;
|
|
27
28
|
};
|
|
28
29
|
export declare function initConfig(userConfig: UserConfig): Config;
|
package/config/index.js
CHANGED
|
@@ -24,8 +24,10 @@ const defaultConfig = {
|
|
|
24
24
|
return responseBody;
|
|
25
25
|
},
|
|
26
26
|
customRouter: null,
|
|
27
|
+
returnNullFields: true,
|
|
27
28
|
};
|
|
28
29
|
function initConfig(userConfig) {
|
|
30
|
+
var _a;
|
|
29
31
|
if (!userConfig)
|
|
30
32
|
return defaultConfig;
|
|
31
33
|
const config = Object.assign({}, defaultConfig);
|
|
@@ -72,6 +74,7 @@ function initConfig(userConfig) {
|
|
|
72
74
|
if (userConfig.customRouter) {
|
|
73
75
|
config.customRouter = userConfig.customRouter;
|
|
74
76
|
}
|
|
77
|
+
config.returnNullFields = (_a = userConfig.returnNullFields) !== null && _a !== void 0 ? _a : true;
|
|
75
78
|
return config;
|
|
76
79
|
}
|
|
77
80
|
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/package.json
CHANGED
package/routes/get.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
declare function createGetRoutes(queries: any, cacheControl: any, responseBodyInterceptor: any): {
|
|
1
|
+
declare function createGetRoutes(queries: any, cacheControl: any, responseBodyInterceptor: any, returnNullFields: any): {
|
|
2
2
|
handleGetResource: (req: any, res: any) => Promise<any>;
|
|
3
3
|
};
|
|
4
4
|
export { createGetRoutes };
|
package/routes/get.js
CHANGED
|
@@ -10,7 +10,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.createGetRoutes = void 0;
|
|
13
|
-
|
|
13
|
+
const utils_1 = require("./utils");
|
|
14
|
+
function createGetRoutes(queries, cacheControl, responseBodyInterceptor, returnNullFields) {
|
|
14
15
|
function handleGetResource(req, res) {
|
|
15
16
|
return __awaiter(this, void 0, void 0, function* () {
|
|
16
17
|
try {
|
|
@@ -36,7 +37,7 @@ function createGetRoutes(queries, cacheControl, responseBodyInterceptor) {
|
|
|
36
37
|
}
|
|
37
38
|
}
|
|
38
39
|
res.status(200);
|
|
39
|
-
res.json(theItem);
|
|
40
|
+
res.json(returnNullFields ? theItem : (0, utils_1.removeNullFields)(theItem));
|
|
40
41
|
return res.send();
|
|
41
42
|
}
|
|
42
43
|
const items = yield queries.getAll(resourceName);
|
|
@@ -54,7 +55,7 @@ function createGetRoutes(queries, cacheControl, responseBodyInterceptor) {
|
|
|
54
55
|
}
|
|
55
56
|
}
|
|
56
57
|
res.status(200);
|
|
57
|
-
res.json(theItems);
|
|
58
|
+
res.json(returnNullFields ? theItems : theItems.map((item) => (0, utils_1.removeNullFields)(item)));
|
|
58
59
|
return res.send();
|
|
59
60
|
}
|
|
60
61
|
catch (error) {
|
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;
|
|
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,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,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,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,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/patch.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
declare function createPatchRoutes(queries: any, requestBodyInterceptor: any): {
|
|
1
|
+
declare function createPatchRoutes(queries: any, requestBodyInterceptor: any, returnNullFields: any): {
|
|
2
2
|
handlePatch: (req: any, res: any) => Promise<any>;
|
|
3
3
|
};
|
|
4
4
|
export { createPatchRoutes };
|
package/routes/patch.js
CHANGED
|
@@ -11,7 +11,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.createPatchRoutes = void 0;
|
|
13
13
|
const interceptors_1 = require("./interceptors");
|
|
14
|
-
|
|
14
|
+
const utils_1 = require("./utils");
|
|
15
|
+
function createPatchRoutes(queries, requestBodyInterceptor, returnNullFields) {
|
|
15
16
|
function handlePatch(req, res) {
|
|
16
17
|
return __awaiter(this, void 0, void 0, function* () {
|
|
17
18
|
try {
|
|
@@ -28,7 +29,10 @@ function createPatchRoutes(queries, requestBodyInterceptor) {
|
|
|
28
29
|
});
|
|
29
30
|
item = Object.assign(Object.assign(Object.assign({}, item), requestBody), { id });
|
|
30
31
|
const updatedItem = yield queries.update(resourceName, item);
|
|
31
|
-
return res
|
|
32
|
+
return res
|
|
33
|
+
.status(200)
|
|
34
|
+
.json(returnNullFields ? updatedItem : (0, utils_1.removeNullFields)(updatedItem))
|
|
35
|
+
.send();
|
|
32
36
|
}
|
|
33
37
|
catch (error) {
|
|
34
38
|
return res.status(500).json({ message: error.message });
|
package/routes/patch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/routes/patch.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAAqD;
|
|
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,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;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.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
declare function createPostRoutes(queries: any, requestBodyInterceptor: any): {
|
|
1
|
+
declare function createPostRoutes(queries: any, requestBodyInterceptor: any, returnNullFields: any): {
|
|
2
2
|
handlePost: (req: any, res: any) => Promise<any>;
|
|
3
3
|
};
|
|
4
4
|
export { createPostRoutes };
|
package/routes/post.js
CHANGED
|
@@ -12,7 +12,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.createPostRoutes = void 0;
|
|
13
13
|
const url_1 = require("url");
|
|
14
14
|
const interceptors_1 = require("./interceptors");
|
|
15
|
-
|
|
15
|
+
const utils_1 = require("./utils");
|
|
16
|
+
function createPostRoutes(queries, requestBodyInterceptor, returnNullFields) {
|
|
16
17
|
function handlePost(req, res) {
|
|
17
18
|
return __awaiter(this, void 0, void 0, function* () {
|
|
18
19
|
try {
|
|
@@ -30,7 +31,7 @@ function createPostRoutes(queries, requestBodyInterceptor) {
|
|
|
30
31
|
}),
|
|
31
32
|
})
|
|
32
33
|
.status(201)
|
|
33
|
-
.json(newItem)
|
|
34
|
+
.json(returnNullFields ? newItem : (0, utils_1.removeNullFields)(newItem))
|
|
34
35
|
.send();
|
|
35
36
|
}
|
|
36
37
|
catch (error) {
|
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;
|
|
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,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,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.d.ts
CHANGED
package/routes/put.js
CHANGED
|
@@ -11,7 +11,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.createPutRoutes = void 0;
|
|
13
13
|
const interceptors_1 = require("./interceptors");
|
|
14
|
-
|
|
14
|
+
const utils_1 = require("./utils");
|
|
15
|
+
function createPutRoutes(queries, requestBodyInterceptor, returnNullFields) {
|
|
15
16
|
function handlePut(req, res) {
|
|
16
17
|
return __awaiter(this, void 0, void 0, function* () {
|
|
17
18
|
try {
|
|
@@ -28,7 +29,10 @@ function createPutRoutes(queries, requestBodyInterceptor) {
|
|
|
28
29
|
});
|
|
29
30
|
item = Object.assign(Object.assign({}, requestBody), { id });
|
|
30
31
|
const replacedItem = yield queries.replace(resourceName, item);
|
|
31
|
-
return res
|
|
32
|
+
return res
|
|
33
|
+
.status(200)
|
|
34
|
+
.json(returnNullFields ? replacedItem : (0, utils_1.removeNullFields)(replacedItem))
|
|
35
|
+
.send();
|
|
32
36
|
}
|
|
33
37
|
catch (error) {
|
|
34
38
|
return res.status(500).json({ message: error.message });
|
package/routes/put.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"put.js","sourceRoot":"","sources":["../../src/routes/put.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAAqD;
|
|
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,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;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,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, requestBodyInterceptor, responseBodyInterceptor, } = routerConfig;
|
|
25
|
-
const { handleGetResource } = (0, get_1.createGetRoutes)(queries, cacheControl, responseBodyInterceptor);
|
|
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);
|
|
24
|
+
const { validateResources, resourceNames, apiPrefix, cacheControl, requestBodyInterceptor, responseBodyInterceptor, returnNullFields, } = routerConfig;
|
|
25
|
+
const { handleGetResource } = (0, get_1.createGetRoutes)(queries, cacheControl, responseBodyInterceptor, returnNullFields);
|
|
26
|
+
const { handlePost } = (0, post_1.createPostRoutes)(queries, requestBodyInterceptor, returnNullFields);
|
|
27
|
+
const { handlePut } = (0, put_1.createPutRoutes)(queries, requestBodyInterceptor, returnNullFields);
|
|
28
|
+
const { handlePatch } = (0, patch_1.createPatchRoutes)(queries, requestBodyInterceptor, returnNullFields);
|
|
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,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,
|
|
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,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,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/utils.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.removeNullFields = void 0;
|
|
4
|
+
const removeNullFields = (obj) => {
|
|
5
|
+
return Object.fromEntries(Object.entries(obj).filter(([_, value]) => value !== null));
|
|
6
|
+
};
|
|
7
|
+
exports.removeNullFields = removeNullFields;
|
|
8
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/routes/utils.ts"],"names":[],"mappings":";;;AAAO,MAAM,gBAAgB,GAAG,CAAC,GAA4B,EAAE,EAAE;IAC/D,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAA;AACvF,CAAC,CAAA;AAFY,QAAA,gBAAgB,oBAE5B"}
|