@rsdk/validation.class-validator 2.0.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/CHANGELOG.md +62 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/config-interceptor.d.ts +9 -0
- package/dist/internal/config-interceptor.js +31 -0
- package/dist/internal/config-interceptor.js.map +1 -0
- package/dist/internal/config-storage.d.ts +6 -0
- package/dist/internal/config-storage.js +15 -0
- package/dist/internal/config-storage.js.map +1 -0
- package/dist/pipe.d.ts +21 -0
- package/dist/pipe.js +55 -0
- package/dist/pipe.js.map +1 -0
- package/dist/plugin.d.ts +36 -0
- package/dist/plugin.js +42 -0
- package/dist/plugin.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +23 -0
- package/src/index.ts +3 -0
- package/src/internal/config-interceptor.ts +34 -0
- package/src/internal/config-storage.ts +23 -0
- package/src/pipe.ts +57 -0
- package/src/plugin.ts +56 -0
- package/src/types.ts +6 -0
- package/tsconfig.json +10 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Change Log
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
|
+
|
|
6
|
+
# [2.0.0](https://github.com/R-Vision/rsdk/compare/v1.0.12...v2.0.0) (2023-06-06)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @rsdk/validation.class-validator
|
|
9
|
+
|
|
10
|
+
## 1.0.12 (2023-05-23)
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* remove private dependencies from `peerDependencies` section ([0bce6ff](https://github.com/R-Vision/rsdk/commit/0bce6ffb5b699e2ed1dc9aca77cbdbf085267ff7))
|
|
15
|
+
|
|
16
|
+
## 1.0.11 (2023-05-23)
|
|
17
|
+
|
|
18
|
+
**Note:** Version bump only for package @rsdk/validation.class-validator
|
|
19
|
+
|
|
20
|
+
## 1.0.10 (2023-05-22)
|
|
21
|
+
|
|
22
|
+
### Bug Fixes
|
|
23
|
+
|
|
24
|
+
* add "access: public" to new packages ([04d5983](https://github.com/R-Vision/rsdk/commit/04d5983cfa3e97c5d8219e07208a0499a8c6bc83))
|
|
25
|
+
|
|
26
|
+
## 1.0.9 (2023-05-21)
|
|
27
|
+
|
|
28
|
+
**Note:** Version bump only for package @rsdk/validation.class-validator
|
|
29
|
+
|
|
30
|
+
## 1.0.8 (2023-05-17)
|
|
31
|
+
|
|
32
|
+
**Note:** Version bump only for package @rsdk/validation.class-validator
|
|
33
|
+
|
|
34
|
+
## 1.0.7 (2023-05-11)
|
|
35
|
+
|
|
36
|
+
**Note:** Version bump only for package @rsdk/validation.class-validator
|
|
37
|
+
|
|
38
|
+
## 1.0.6 (2023-05-11)
|
|
39
|
+
|
|
40
|
+
**Note:** Version bump only for package @rsdk/validation.class-validator
|
|
41
|
+
|
|
42
|
+
## 1.0.5 (2023-05-10)
|
|
43
|
+
|
|
44
|
+
**Note:** Version bump only for package @rsdk/validation.class-validator
|
|
45
|
+
|
|
46
|
+
## 1.0.4 (2023-05-10)
|
|
47
|
+
|
|
48
|
+
**Note:** Version bump only for package @rsdk/validation.class-validator
|
|
49
|
+
|
|
50
|
+
## 1.0.3 (2023-05-10)
|
|
51
|
+
|
|
52
|
+
### Bug Fixes
|
|
53
|
+
|
|
54
|
+
* builtin make not private in npm ([50c83b6](https://github.com/R-Vision/rsdk/commit/50c83b6454f9a89f1e99d3b33a497ce2c029d8c6))
|
|
55
|
+
|
|
56
|
+
## 1.0.2 (2023-05-10)
|
|
57
|
+
|
|
58
|
+
**Note:** Version bump only for package @rsdk/validation.class-validator
|
|
59
|
+
|
|
60
|
+
## 1.0.1 (2023-05-07)
|
|
61
|
+
|
|
62
|
+
**Note:** Version bump only for package @rsdk/validation.class-validator
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ClassValidatorPipe = exports.ClassValidatorPlugin = void 0;
|
|
4
|
+
var plugin_1 = require("./plugin");
|
|
5
|
+
Object.defineProperty(exports, "ClassValidatorPlugin", { enumerable: true, get: function () { return plugin_1.ClassValidatorPlugin; } });
|
|
6
|
+
var pipe_1 = require("./pipe");
|
|
7
|
+
Object.defineProperty(exports, "ClassValidatorPipe", { enumerable: true, get: function () { return pipe_1.ClassValidatorPipe; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAgD;AAAvC,8GAAA,oBAAoB,OAAA;AAE7B,+BAA4C;AAAnC,0GAAA,kBAAkB,OAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CallHandler, ExecutionContext, NestInterceptor, Provider } from '@nestjs/common';
|
|
2
|
+
import type { ValidatorOptions } from 'class-validator';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
|
+
export declare class ClassValidatorConfigInterceptor implements NestInterceptor {
|
|
5
|
+
private globalOptions?;
|
|
6
|
+
constructor(globalOptions?: ValidatorOptions | undefined);
|
|
7
|
+
static createProvider(globalOptions: ValidatorOptions): Provider;
|
|
8
|
+
intercept(context: ExecutionContext, next: CallHandler): Observable<any>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ClassValidatorConfigInterceptor = void 0;
|
|
4
|
+
const core_1 = require("@nestjs/core");
|
|
5
|
+
const rxjs_1 = require("rxjs");
|
|
6
|
+
const config_storage_1 = require("./config-storage");
|
|
7
|
+
class ClassValidatorConfigInterceptor {
|
|
8
|
+
globalOptions;
|
|
9
|
+
constructor(globalOptions) {
|
|
10
|
+
this.globalOptions = globalOptions;
|
|
11
|
+
}
|
|
12
|
+
static createProvider(globalOptions) {
|
|
13
|
+
return {
|
|
14
|
+
provide: core_1.APP_INTERCEPTOR,
|
|
15
|
+
useValue: new ClassValidatorConfigInterceptor(globalOptions),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
intercept(context, next) {
|
|
19
|
+
return new rxjs_1.Observable((observer) => {
|
|
20
|
+
config_storage_1.ConfigStorage.run(this.globalOptions, () => {
|
|
21
|
+
next.handle().subscribe({
|
|
22
|
+
complete: () => observer.complete(),
|
|
23
|
+
error: (error) => observer.error(error),
|
|
24
|
+
next: (res) => observer.next(res),
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.ClassValidatorConfigInterceptor = ClassValidatorConfigInterceptor;
|
|
31
|
+
//# sourceMappingURL=config-interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-interceptor.js","sourceRoot":"","sources":["../../src/internal/config-interceptor.ts"],"names":[],"mappings":";;;AAMA,uCAA+C;AAE/C,+BAAkC;AAElC,qDAAiD;AAEjD,MAAa,+BAA+B;IACtB;IAApB,YAAoB,aAAgC;QAAhC,kBAAa,GAAb,aAAa,CAAmB;IAAG,CAAC;IAExD,MAAM,CAAC,cAAc,CAAC,aAA+B;QACnD,OAAO;YACL,OAAO,EAAE,sBAAe;YACxB,QAAQ,EAAE,IAAI,+BAA+B,CAAC,aAAa,CAAC;SAC7D,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,OAAyB,EAAE,IAAiB;QACpD,OAAO,IAAI,iBAAU,CAAC,CAAC,QAAQ,EAAE,EAAE;YACjC,8BAAa,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE;gBACzC,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC;oBACtB,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE;oBACnC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;oBACvC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;iBAClC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AArBD,0EAqBC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PlatformValidationPipeOptions } from '../types';
|
|
2
|
+
export declare class ConfigStorage {
|
|
3
|
+
private static als;
|
|
4
|
+
static run<TResult>(classValidationPipeOptions: PlatformValidationPipeOptions | undefined, fn: () => TResult): TResult;
|
|
5
|
+
static getConfig(): PlatformValidationPipeOptions | undefined;
|
|
6
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConfigStorage = void 0;
|
|
4
|
+
const async_hooks_1 = require("async_hooks");
|
|
5
|
+
class ConfigStorage {
|
|
6
|
+
static als = new async_hooks_1.AsyncLocalStorage();
|
|
7
|
+
static run(classValidationPipeOptions, fn) {
|
|
8
|
+
return this.als.run({ classValidationPipeOptions: classValidationPipeOptions }, fn);
|
|
9
|
+
}
|
|
10
|
+
static getConfig() {
|
|
11
|
+
return this.als.getStore()?.classValidationPipeOptions;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.ConfigStorage = ConfigStorage;
|
|
15
|
+
//# sourceMappingURL=config-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-storage.js","sourceRoot":"","sources":["../../src/internal/config-storage.ts"],"names":[],"mappings":";;;AAAA,6CAAgD;AAIhD,MAAa,aAAa;IAChB,MAAM,CAAC,GAAG,GAAG,IAAI,+BAAiB,EAEtC,CAAC;IAEL,MAAM,CAAC,GAAG,CACR,0BAAqE,EACrE,EAAiB;QAEjB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CACjB,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,EAC1D,EAAE,CACH,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,SAAS;QACd,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,0BAA0B,CAAC;IACzD,CAAC;;AAjBU,sCAAa"}
|
package/dist/pipe.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ArgumentMetadata, PipeTransform } from '@nestjs/common';
|
|
2
|
+
import type { PlatformValidationPipeOptions } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Функция должна вернуть опции для валидации
|
|
5
|
+
* Ей доступна глобальный опции в качестве аргумента исходя из которых она может возвращать разные опции
|
|
6
|
+
*/
|
|
7
|
+
type Overrider = (globalOptions?: PlatformValidationPipeOptions) => PlatformValidationPipeOptions;
|
|
8
|
+
/**
|
|
9
|
+
* Соответствует поведению стандартного `ValidationPipe` из `@nestjs/common`
|
|
10
|
+
* Отличия
|
|
11
|
+
* - Учитывает глобальную конфигурацию
|
|
12
|
+
* - exceptionFactory задана в соответствии с требованиями платформы
|
|
13
|
+
*/
|
|
14
|
+
export declare class ClassValidatorPipe implements PipeTransform {
|
|
15
|
+
readonly options?: PlatformValidationPipeOptions | Overrider | undefined;
|
|
16
|
+
constructor(options?: PlatformValidationPipeOptions | Overrider | undefined);
|
|
17
|
+
transform(value: any, metadata: ArgumentMetadata): Promise<any>;
|
|
18
|
+
private getOptions;
|
|
19
|
+
private exceptionFactory;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
package/dist/pipe.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ClassValidatorPipe = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const core_1 = require("@rsdk/core");
|
|
18
|
+
const config_storage_1 = require("./internal/config-storage");
|
|
19
|
+
/**
|
|
20
|
+
* Соответствует поведению стандартного `ValidationPipe` из `@nestjs/common`
|
|
21
|
+
* Отличия
|
|
22
|
+
* - Учитывает глобальную конфигурацию
|
|
23
|
+
* - exceptionFactory задана в соответствии с требованиями платформы
|
|
24
|
+
*/
|
|
25
|
+
let ClassValidatorPipe = class ClassValidatorPipe {
|
|
26
|
+
options;
|
|
27
|
+
constructor(options) {
|
|
28
|
+
this.options = options;
|
|
29
|
+
}
|
|
30
|
+
async transform(value, metadata) {
|
|
31
|
+
const nestValidationPipe = new common_1.ValidationPipe(this.getOptions());
|
|
32
|
+
return await nestValidationPipe.transform(value, metadata);
|
|
33
|
+
}
|
|
34
|
+
getOptions() {
|
|
35
|
+
const globalOptions = config_storage_1.ConfigStorage.getConfig();
|
|
36
|
+
if (typeof this.options === 'function') {
|
|
37
|
+
return this.options(globalOptions);
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
...globalOptions,
|
|
41
|
+
...this.options,
|
|
42
|
+
exceptionFactory: this.exceptionFactory,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
exceptionFactory(errors) {
|
|
46
|
+
return new core_1.ValidateException(errors);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
ClassValidatorPipe = __decorate([
|
|
50
|
+
(0, common_1.Injectable)(),
|
|
51
|
+
__param(0, (0, common_1.Optional)()),
|
|
52
|
+
__metadata("design:paramtypes", [Object])
|
|
53
|
+
], ClassValidatorPipe);
|
|
54
|
+
exports.ClassValidatorPipe = ClassValidatorPipe;
|
|
55
|
+
//# sourceMappingURL=pipe.js.map
|
package/dist/pipe.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipe.js","sourceRoot":"","sources":["../src/pipe.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAMA,2CAAsE;AACtE,qCAA+C;AAE/C,8DAA0D;AAW1D;;;;;GAKG;AACH,IACa,kBAAkB,GAD/B,MACa,kBAAkB;IAGlB;IAFX,YAEW,OAAmD;QAAnD,YAAO,GAAP,OAAO,CAA4C;IAC3D,CAAC;IAEJ,KAAK,CAAC,SAAS,CAAC,KAAU,EAAE,QAA0B;QACpD,MAAM,kBAAkB,GAAG,IAAI,uBAAc,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAEjE,OAAO,MAAM,kBAAkB,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAEO,UAAU;QAChB,MAAM,aAAa,GAAG,8BAAa,CAAC,SAAS,EAAE,CAAC;QAEhD,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE;YACtC,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;SACpC;QAED,OAAO;YACL,GAAG,aAAa;YAChB,GAAG,IAAI,CAAC,OAAO;YACf,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;SACxC,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,MAAyB;QAChD,OAAO,IAAI,wBAAiB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;CACF,CAAA;AA7BY,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,iBAAQ,GAAE,CAAA;;GAFF,kBAAkB,CA6B9B;AA7BY,gDAAkB"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import type { Constructor } from '@rsdk/common';
|
|
3
|
+
import type { AppropriateTransports, PlatformAppPlugin } from '@rsdk/core';
|
|
4
|
+
import type { PlatformValidationPipeOptions } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* Решает две основные цели
|
|
7
|
+
* - глобальная конфигурация для валидации
|
|
8
|
+
* - глобальная регистрация ValidationPipe
|
|
9
|
+
*
|
|
10
|
+
* Работа с глобальной конфигурацией происходит в пайпе и мержится с
|
|
11
|
+
* заданными пайпу параметрами
|
|
12
|
+
*/
|
|
13
|
+
export declare class ClassValidatorPlugin implements PlatformAppPlugin {
|
|
14
|
+
readonly options?: {
|
|
15
|
+
/**
|
|
16
|
+
* Регистрировать ли пайп глобально
|
|
17
|
+
*/
|
|
18
|
+
global?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Опции аналогичны опциям ValidationPipe из @nestjs/common
|
|
21
|
+
*/
|
|
22
|
+
defaultOptions?: PlatformValidationPipeOptions;
|
|
23
|
+
} | undefined;
|
|
24
|
+
constructor(options?: {
|
|
25
|
+
/**
|
|
26
|
+
* Регистрировать ли пайп глобально
|
|
27
|
+
*/
|
|
28
|
+
global?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Опции аналогичны опциям ValidationPipe из @nestjs/common
|
|
31
|
+
*/
|
|
32
|
+
defaultOptions?: PlatformValidationPipeOptions;
|
|
33
|
+
} | undefined);
|
|
34
|
+
forTransports(): AppropriateTransports;
|
|
35
|
+
modules(): (Constructor | DynamicModule)[];
|
|
36
|
+
}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ClassValidatorPlugin = void 0;
|
|
4
|
+
const core_1 = require("@nestjs/core");
|
|
5
|
+
const config_interceptor_1 = require("./internal/config-interceptor");
|
|
6
|
+
const pipe_1 = require("./pipe");
|
|
7
|
+
/**
|
|
8
|
+
* Решает две основные цели
|
|
9
|
+
* - глобальная конфигурация для валидации
|
|
10
|
+
* - глобальная регистрация ValidationPipe
|
|
11
|
+
*
|
|
12
|
+
* Работа с глобальной конфигурацией происходит в пайпе и мержится с
|
|
13
|
+
* заданными пайпу параметрами
|
|
14
|
+
*/
|
|
15
|
+
class ClassValidatorPlugin {
|
|
16
|
+
options;
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.options = options;
|
|
19
|
+
}
|
|
20
|
+
forTransports() {
|
|
21
|
+
return 'any';
|
|
22
|
+
}
|
|
23
|
+
modules() {
|
|
24
|
+
const providers = [
|
|
25
|
+
config_interceptor_1.ClassValidatorConfigInterceptor.createProvider(this.options?.defaultOptions || {}),
|
|
26
|
+
];
|
|
27
|
+
if (this.options?.global) {
|
|
28
|
+
providers.push({
|
|
29
|
+
provide: core_1.APP_PIPE,
|
|
30
|
+
useClass: pipe_1.ClassValidatorPipe,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return [
|
|
34
|
+
{
|
|
35
|
+
module: ClassValidatorPlugin,
|
|
36
|
+
providers: providers,
|
|
37
|
+
},
|
|
38
|
+
];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.ClassValidatorPlugin = ClassValidatorPlugin;
|
|
42
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":";;;AACA,uCAAwC;AAIxC,sEAAgF;AAChF,iCAA4C;AAG5C;;;;;;;GAOG;AACH,MAAa,oBAAoB;IAEpB;IADX,YACW,OAUR;QAVQ,YAAO,GAAP,OAAO,CAUf;IACA,CAAC;IAEJ,aAAa;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,MAAM,SAAS,GAAG;YAChB,oDAA+B,CAAC,cAAc,CAC5C,IAAI,CAAC,OAAO,EAAE,cAAc,IAAI,EAAE,CACnC;SACF,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE;YACxB,SAAS,CAAC,IAAI,CAAC;gBACb,OAAO,EAAE,eAAQ;gBACjB,QAAQ,EAAE,yBAAkB;aAC7B,CAAC,CAAC;SACJ;QACD,OAAO;YACL;gBACE,MAAM,EAAE,oBAAoB;gBAC5B,SAAS,EAAE,SAAS;aACrB;SACF,CAAC;IACJ,CAAC;CACF;AAtCD,oDAsCC"}
|
package/dist/types.d.ts
ADDED
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rsdk/validation.class-validator",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
7
|
+
"description": "Integrates class-validator into rsdk",
|
|
8
|
+
"license": "Apache License 2.0",
|
|
9
|
+
"repository": {
|
|
10
|
+
"url": "https://github.com/R-Vision/rsdk"
|
|
11
|
+
},
|
|
12
|
+
"main": "dist/index.js",
|
|
13
|
+
"peerDependencies": {
|
|
14
|
+
"@nestjs/common": "^9.0.0",
|
|
15
|
+
"@nestjs/core": "^9.0.0",
|
|
16
|
+
"@rsdk/common": "^2.0.0",
|
|
17
|
+
"@rsdk/core": "^2.0.0",
|
|
18
|
+
"class-transformer": "^0.5.0",
|
|
19
|
+
"class-validator": "^0.14.0",
|
|
20
|
+
"rxjs": "^7.0.0"
|
|
21
|
+
},
|
|
22
|
+
"gitHead": "9fe1395b8e38e1c7b9578dd5eed12e0c57a9087f"
|
|
23
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
CallHandler,
|
|
3
|
+
ExecutionContext,
|
|
4
|
+
NestInterceptor,
|
|
5
|
+
Provider,
|
|
6
|
+
} from '@nestjs/common';
|
|
7
|
+
import { APP_INTERCEPTOR } from '@nestjs/core';
|
|
8
|
+
import type { ValidatorOptions } from 'class-validator';
|
|
9
|
+
import { Observable } from 'rxjs';
|
|
10
|
+
|
|
11
|
+
import { ConfigStorage } from './config-storage';
|
|
12
|
+
|
|
13
|
+
export class ClassValidatorConfigInterceptor implements NestInterceptor {
|
|
14
|
+
constructor(private globalOptions?: ValidatorOptions) {}
|
|
15
|
+
|
|
16
|
+
static createProvider(globalOptions: ValidatorOptions): Provider {
|
|
17
|
+
return {
|
|
18
|
+
provide: APP_INTERCEPTOR,
|
|
19
|
+
useValue: new ClassValidatorConfigInterceptor(globalOptions),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
|
|
24
|
+
return new Observable((observer) => {
|
|
25
|
+
ConfigStorage.run(this.globalOptions, () => {
|
|
26
|
+
next.handle().subscribe({
|
|
27
|
+
complete: () => observer.complete(),
|
|
28
|
+
error: (error) => observer.error(error),
|
|
29
|
+
next: (res) => observer.next(res),
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
|
2
|
+
|
|
3
|
+
import type { PlatformValidationPipeOptions } from '../types';
|
|
4
|
+
|
|
5
|
+
export class ConfigStorage {
|
|
6
|
+
private static als = new AsyncLocalStorage<{
|
|
7
|
+
classValidationPipeOptions: PlatformValidationPipeOptions | undefined;
|
|
8
|
+
}>();
|
|
9
|
+
|
|
10
|
+
static run<TResult>(
|
|
11
|
+
classValidationPipeOptions: PlatformValidationPipeOptions | undefined,
|
|
12
|
+
fn: () => TResult,
|
|
13
|
+
): TResult {
|
|
14
|
+
return this.als.run(
|
|
15
|
+
{ classValidationPipeOptions: classValidationPipeOptions },
|
|
16
|
+
fn,
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
static getConfig(): PlatformValidationPipeOptions | undefined {
|
|
21
|
+
return this.als.getStore()?.classValidationPipeOptions;
|
|
22
|
+
}
|
|
23
|
+
}
|
package/src/pipe.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ArgumentMetadata,
|
|
3
|
+
PipeTransform,
|
|
4
|
+
ValidationError,
|
|
5
|
+
ValidationPipeOptions,
|
|
6
|
+
} from '@nestjs/common';
|
|
7
|
+
import { Injectable, Optional, ValidationPipe } from '@nestjs/common';
|
|
8
|
+
import { ValidateException } from '@rsdk/core';
|
|
9
|
+
|
|
10
|
+
import { ConfigStorage } from './internal/config-storage';
|
|
11
|
+
import type { PlatformValidationPipeOptions } from './types';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Функция должна вернуть опции для валидации
|
|
15
|
+
* Ей доступна глобальный опции в качестве аргумента исходя из которых она может возвращать разные опции
|
|
16
|
+
*/
|
|
17
|
+
type Overrider = (
|
|
18
|
+
globalOptions?: PlatformValidationPipeOptions,
|
|
19
|
+
) => PlatformValidationPipeOptions;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Соответствует поведению стандартного `ValidationPipe` из `@nestjs/common`
|
|
23
|
+
* Отличия
|
|
24
|
+
* - Учитывает глобальную конфигурацию
|
|
25
|
+
* - exceptionFactory задана в соответствии с требованиями платформы
|
|
26
|
+
*/
|
|
27
|
+
@Injectable()
|
|
28
|
+
export class ClassValidatorPipe implements PipeTransform {
|
|
29
|
+
constructor(
|
|
30
|
+
@Optional()
|
|
31
|
+
readonly options?: PlatformValidationPipeOptions | Overrider,
|
|
32
|
+
) {}
|
|
33
|
+
|
|
34
|
+
async transform(value: any, metadata: ArgumentMetadata): Promise<any> {
|
|
35
|
+
const nestValidationPipe = new ValidationPipe(this.getOptions());
|
|
36
|
+
|
|
37
|
+
return await nestValidationPipe.transform(value, metadata);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
private getOptions(): ValidationPipeOptions {
|
|
41
|
+
const globalOptions = ConfigStorage.getConfig();
|
|
42
|
+
|
|
43
|
+
if (typeof this.options === 'function') {
|
|
44
|
+
return this.options(globalOptions);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return {
|
|
48
|
+
...globalOptions,
|
|
49
|
+
...this.options,
|
|
50
|
+
exceptionFactory: this.exceptionFactory,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private exceptionFactory(errors: ValidationError[]): ValidateException {
|
|
55
|
+
return new ValidateException(errors);
|
|
56
|
+
}
|
|
57
|
+
}
|
package/src/plugin.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { APP_PIPE } from '@nestjs/core';
|
|
3
|
+
import type { Constructor } from '@rsdk/common';
|
|
4
|
+
import type { AppropriateTransports, PlatformAppPlugin } from '@rsdk/core';
|
|
5
|
+
|
|
6
|
+
import { ClassValidatorConfigInterceptor } from './internal/config-interceptor';
|
|
7
|
+
import { ClassValidatorPipe } from './pipe';
|
|
8
|
+
import type { PlatformValidationPipeOptions } from './types';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Решает две основные цели
|
|
12
|
+
* - глобальная конфигурация для валидации
|
|
13
|
+
* - глобальная регистрация ValidationPipe
|
|
14
|
+
*
|
|
15
|
+
* Работа с глобальной конфигурацией происходит в пайпе и мержится с
|
|
16
|
+
* заданными пайпу параметрами
|
|
17
|
+
*/
|
|
18
|
+
export class ClassValidatorPlugin implements PlatformAppPlugin {
|
|
19
|
+
constructor(
|
|
20
|
+
readonly options?: {
|
|
21
|
+
/**
|
|
22
|
+
* Регистрировать ли пайп глобально
|
|
23
|
+
*/
|
|
24
|
+
global?: boolean;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Опции аналогичны опциям ValidationPipe из @nestjs/common
|
|
28
|
+
*/
|
|
29
|
+
defaultOptions?: PlatformValidationPipeOptions;
|
|
30
|
+
},
|
|
31
|
+
) {}
|
|
32
|
+
|
|
33
|
+
forTransports(): AppropriateTransports {
|
|
34
|
+
return 'any';
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
modules(): (Constructor | DynamicModule)[] {
|
|
38
|
+
const providers = [
|
|
39
|
+
ClassValidatorConfigInterceptor.createProvider(
|
|
40
|
+
this.options?.defaultOptions || {},
|
|
41
|
+
),
|
|
42
|
+
];
|
|
43
|
+
if (this.options?.global) {
|
|
44
|
+
providers.push({
|
|
45
|
+
provide: APP_PIPE,
|
|
46
|
+
useClass: ClassValidatorPipe,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return [
|
|
50
|
+
{
|
|
51
|
+
module: ClassValidatorPlugin,
|
|
52
|
+
providers: providers,
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
}
|
|
56
|
+
}
|
package/src/types.ts
ADDED