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.
@@ -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.1.0",
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.2.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.2.0"
16
+ "valsan": "^2.3.0"
17
17
  },
18
18
  "peerDependencies": {
19
- "valsan": "^2.2.0"
19
+ "valsan": "^2.3.0"
20
20
  },
21
21
  "repository": {
22
22
  "type": "git",
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../../src/router/endpoint.ts"],"names":[],"mappings":"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"}
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
- async function runSanitizer(sanitizer, value) {
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":";;;AAEA,oCAAoD;AAEpD;;;GAGG;AACH,8DAA8D;AACvD,KAAK,UAAU,YAAY,CAAC,SAA0B,EAAE,KAAU;IACxE,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;AAVD,oCAUC;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,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;AAxBD,0CAwBC"}
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"}