api-machine 1.1.0 → 1.2.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/oas/oas-endpoint-component-converter.d.ts +2 -2
- package/oas/oas-endpoint-converter.d.ts +2 -2
- package/package.json +4 -4
- package/router/endpoint.d.ts +6 -5
- package/router/endpoint.js.map +1 -1
- package/router/validation-middleware.d.ts +2 -2
- package/router/validation-middleware.js +5 -1
- package/router/validation-middleware.js.map +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ObjectSanitizer } from 'valsan';
|
|
1
|
+
import { ObjectSanitizer, ObjectValSan, ArrayValSan } from 'valsan';
|
|
2
2
|
import { SchemaObject } from 'auto-oas/oas/v3.1';
|
|
3
3
|
import { BaseApiEndpoint } from '../router';
|
|
4
4
|
/**
|
|
@@ -9,7 +9,7 @@ export declare class OasEndpointComponentConverter {
|
|
|
9
9
|
getSchemas(endpoint: BaseApiEndpoint): Record<string, SchemaObject>;
|
|
10
10
|
protected addSchema({ name, sanitizer, example, }: {
|
|
11
11
|
name: string;
|
|
12
|
-
sanitizer: ObjectSanitizer;
|
|
12
|
+
sanitizer: ObjectSanitizer | ObjectValSan | ArrayValSan;
|
|
13
13
|
example?: any;
|
|
14
14
|
}): void;
|
|
15
15
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ObjectSanitizer } from 'valsan';
|
|
1
|
+
import { ObjectSanitizer, ObjectValSan } from 'valsan';
|
|
2
2
|
import { PathItemObject, ParameterObject } from 'auto-oas/oas/v3.1';
|
|
3
3
|
import { BaseApiEndpoint } from '../router';
|
|
4
4
|
import { AuthenticationScheme } from '../authentication/authentication-scheme';
|
|
@@ -11,7 +11,7 @@ export declare class OasEndpointConverter {
|
|
|
11
11
|
getOpenApiPath(endpoint: BaseApiEndpoint, authentication?: AuthenticationScheme | null): PathItemObject;
|
|
12
12
|
protected addParams({ location, sanitizer, example, }: {
|
|
13
13
|
location: 'path' | 'query' | 'header';
|
|
14
|
-
sanitizer?: ObjectSanitizer;
|
|
14
|
+
sanitizer?: ObjectSanitizer | ObjectValSan;
|
|
15
15
|
example?: any;
|
|
16
16
|
}): void;
|
|
17
17
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "api-machine",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "api-machine",
|
|
5
5
|
"typescript-template": {
|
|
6
6
|
"base": "1.0.1",
|
|
@@ -9,14 +9,14 @@
|
|
|
9
9
|
},
|
|
10
10
|
"scripts": {},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"auto-oas": "^1.
|
|
12
|
+
"auto-oas": "^1.3.0",
|
|
13
13
|
"cors": "^2.8.5",
|
|
14
14
|
"express": "^5.1.0",
|
|
15
15
|
"swagger-ui-express": "^5.0.1",
|
|
16
|
-
"valsan": "^2.
|
|
16
|
+
"valsan": "^2.3.0"
|
|
17
17
|
},
|
|
18
18
|
"peerDependencies": {
|
|
19
|
-
"valsan": "^2.
|
|
19
|
+
"valsan": "^2.3.0"
|
|
20
20
|
},
|
|
21
21
|
"repository": {
|
|
22
22
|
"type": "git",
|
package/router/endpoint.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { Router as ExpressRouter, Request as ExpressRequest, Response as Express
|
|
|
2
2
|
import { ObjectSanitizer } from 'valsan/object-sanitizer';
|
|
3
3
|
import { BaseApiRoute } from './base';
|
|
4
4
|
import { HTTPError } from '../error';
|
|
5
|
+
import { ArrayValSan, ObjectValSan } from 'valsan';
|
|
5
6
|
export type ApiRequest = ExpressRequest;
|
|
6
7
|
export type ApiResponse = ExpressResponse;
|
|
7
8
|
export type ApiNextFunction = ExpressNextFunction;
|
|
@@ -23,15 +24,15 @@ export declare abstract class BaseApiEndpoint extends BaseApiRoute {
|
|
|
23
24
|
tag?: string;
|
|
24
25
|
method: EndpointMethod;
|
|
25
26
|
statusCode: number;
|
|
26
|
-
body?: ObjectSanitizer;
|
|
27
|
+
body?: ObjectSanitizer | ObjectValSan;
|
|
27
28
|
bodyExample?: any;
|
|
28
|
-
query?: ObjectSanitizer;
|
|
29
|
+
query?: ObjectSanitizer | ObjectValSan;
|
|
29
30
|
queryExample?: any;
|
|
30
|
-
params?: ObjectSanitizer;
|
|
31
|
+
params?: ObjectSanitizer | ObjectValSan;
|
|
31
32
|
paramsExample?: any;
|
|
32
|
-
headers?: ObjectSanitizer;
|
|
33
|
+
headers?: ObjectSanitizer | ObjectValSan;
|
|
33
34
|
headersExample?: any;
|
|
34
|
-
response?: ObjectSanitizer;
|
|
35
|
+
response?: ObjectSanitizer | ObjectValSan | ArrayValSan;
|
|
35
36
|
responseExample?: any;
|
|
36
37
|
getErrors(): {
|
|
37
38
|
[key: string]: HTTPError;
|
package/router/endpoint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../../src/router/endpoint.ts"],"names":[],"mappings":";;;AASA,iCAAsC;AACtC,mEAA0D;AAC1D,oCAAgF;
|
|
1
|
+
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../../src/router/endpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { ObjectSanitizer } from 'valsan';
|
|
1
|
+
import { ArrayValSan, ObjectSanitizer, ObjectValSan } from 'valsan';
|
|
2
2
|
import { ApiRequest, BaseApiEndpoint } from './endpoint';
|
|
3
3
|
/**
|
|
4
4
|
* Runs a valsan ObjectSanitizer on a value,
|
|
5
5
|
* throws with error details if validation fails.
|
|
6
6
|
*/
|
|
7
|
-
export declare function runSanitizer(sanitizer: ObjectSanitizer, value: any): Promise<Record<string, unknown> | undefined>;
|
|
7
|
+
export declare function runSanitizer(sanitizer: ObjectSanitizer | ObjectValSan | ArrayValSan, value: any): Promise<Record<string, unknown> | unknown[] | undefined>;
|
|
8
8
|
/**
|
|
9
9
|
* Validates and sanitizes request parts
|
|
10
10
|
* (body, query, params, headers) if the
|
|
@@ -6,8 +6,9 @@ const error_1 = require("../error");
|
|
|
6
6
|
* Runs a valsan ObjectSanitizer on a value,
|
|
7
7
|
* throws with error details if validation fails.
|
|
8
8
|
*/
|
|
9
|
+
async function runSanitizer(sanitizer,
|
|
9
10
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
-
|
|
11
|
+
value) {
|
|
11
12
|
const result = await sanitizer.run(value);
|
|
12
13
|
if (!result.success) {
|
|
13
14
|
throw new error_1.UnprocessableEntityError('Validation failed', {
|
|
@@ -28,6 +29,9 @@ async function validateRequest(endpoint, request) {
|
|
|
28
29
|
if (!sanitizer) {
|
|
29
30
|
continue;
|
|
30
31
|
}
|
|
32
|
+
if (part === 'headers' && 'options' in sanitizer) {
|
|
33
|
+
sanitizer.options.allowAdditionalProperties = true;
|
|
34
|
+
}
|
|
31
35
|
const sanitized = await runSanitizer(sanitizer, request[part]);
|
|
32
36
|
if (part === 'query') {
|
|
33
37
|
// Mutate the query object instead of reassigning
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-middleware.js","sourceRoot":"","sources":["../../../src/router/validation-middleware.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"validation-middleware.js","sourceRoot":"","sources":["../../../src/router/validation-middleware.ts"],"names":[],"mappings":";;;AAOA,oCAAoD;AAEpD;;;GAGG;AACI,KAAK,UAAU,YAAY,CACjC,SAAuD;AACvD,8DAA8D;AAC9D,KAAU;IAEV,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,gCAAwB,CAAC,mBAAmB,EAAE;YACvD,OAAO,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACpB,CAAC;AAdD,oCAcC;AAED;;;;GAIG;AACI,KAAK,UAAU,eAAe,CACpC,QAAyB,EACzB,OAAmB;IAEnB,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAU,EAAE,CAAC;QACpE,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEjC,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,SAAS;QACV,CAAC;QAED,IAAI,IAAI,KAAK,SAAS,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAEjD,SAAS,CAAC,OACV,CAAC,yBAAyB,GAAG,IAAI,CAAC;QACpC,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAE/D,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACtB,iDAAiD;YACjD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC1C,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACzC,CAAC;aACI,CAAC;YACL,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;QAC3B,CAAC;IACF,CAAC;AACF,CAAC;AA9BD,0CA8BC"}
|