@tsed/ajv 6.87.2 → 6.90.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/lib/{decorators → cjs/decorators}/formats.d.ts +0 -0
- package/lib/cjs/decorators/formats.js +22 -0
- package/lib/cjs/decorators/formats.js.map +1 -0
- package/lib/{decorators → cjs/decorators}/keyword.d.ts +0 -0
- package/lib/cjs/decorators/keyword.js +21 -0
- package/lib/cjs/decorators/keyword.js.map +1 -0
- package/lib/{errors → cjs/errors}/AjvValidationError.d.ts +0 -0
- package/lib/cjs/errors/AjvValidationError.js +13 -0
- package/lib/cjs/errors/AjvValidationError.js.map +1 -0
- package/lib/{index.d.ts → cjs/index.d.ts} +0 -0
- package/lib/cjs/index.js +11 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/{interfaces → cjs/interfaces}/FormatsMethods.d.ts +0 -0
- package/lib/cjs/interfaces/FormatsMethods.js +3 -0
- package/lib/cjs/interfaces/FormatsMethods.js.map +1 -0
- package/lib/{interfaces → cjs/interfaces}/IAjvSettings.d.ts +0 -0
- package/lib/cjs/interfaces/IAjvSettings.js +3 -0
- package/lib/cjs/interfaces/IAjvSettings.js.map +1 -0
- package/lib/{interfaces → cjs/interfaces}/KeywordMethods.d.ts +0 -0
- package/lib/cjs/interfaces/KeywordMethods.js +3 -0
- package/lib/cjs/interfaces/KeywordMethods.js.map +1 -0
- package/lib/{services → cjs/services}/Ajv.d.ts +0 -0
- package/lib/cjs/services/Ajv.js +68 -0
- package/lib/cjs/services/Ajv.js.map +1 -0
- package/lib/{services → cjs/services}/AjvService.d.ts +0 -0
- package/lib/cjs/services/AjvService.js +91 -0
- package/lib/cjs/services/AjvService.js.map +1 -0
- package/lib/{utils → cjs/utils}/defaultErrorFormatter.d.ts +0 -0
- package/lib/cjs/utils/defaultErrorFormatter.js +24 -0
- package/lib/cjs/utils/defaultErrorFormatter.js.map +1 -0
- package/lib/{utils → cjs/utils}/getPath.d.ts +0 -0
- package/lib/cjs/utils/getPath.js +9 -0
- package/lib/cjs/utils/getPath.js.map +1 -0
- package/lib/esm/decorators/formats.js +18 -0
- package/lib/esm/decorators/formats.js.map +1 -0
- package/lib/esm/decorators/keyword.js +17 -0
- package/lib/esm/decorators/keyword.js.map +1 -0
- package/lib/esm/errors/AjvValidationError.js +9 -0
- package/lib/esm/errors/AjvValidationError.js.map +1 -0
- package/lib/esm/index.js +8 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/interfaces/FormatsMethods.js +2 -0
- package/lib/esm/interfaces/FormatsMethods.js.map +1 -0
- package/lib/esm/interfaces/IAjvSettings.js +2 -0
- package/lib/esm/interfaces/IAjvSettings.js.map +1 -0
- package/lib/esm/interfaces/KeywordMethods.js +2 -0
- package/lib/esm/interfaces/KeywordMethods.js.map +1 -0
- package/lib/esm/services/Ajv.js +65 -0
- package/lib/esm/services/Ajv.js.map +1 -0
- package/lib/esm/services/AjvService.js +88 -0
- package/lib/esm/services/AjvService.js.map +1 -0
- package/lib/esm/utils/defaultErrorFormatter.js +20 -0
- package/lib/esm/utils/defaultErrorFormatter.js.map +1 -0
- package/lib/esm/utils/getPath.js +5 -0
- package/lib/esm/utils/getPath.js.map +1 -0
- package/lib/types/decorators/formats.d.ts +10 -0
- package/lib/types/decorators/keyword.d.ts +12 -0
- package/lib/types/errors/AjvValidationError.d.ts +6 -0
- package/lib/types/index.d.ts +15 -0
- package/lib/types/interfaces/FormatsMethods.d.ts +4 -0
- package/lib/types/interfaces/IAjvSettings.d.ts +19 -0
- package/lib/types/interfaces/KeywordMethods.d.ts +23 -0
- package/lib/types/services/Ajv.d.ts +1 -0
- package/lib/types/services/AjvService.d.ts +19 -0
- package/lib/types/utils/defaultErrorFormatter.d.ts +4 -0
- package/lib/types/utils/getPath.d.ts +1 -0
- package/package.json +18 -15
- package/tsconfig.compile.esm.json +23 -0
- package/lib/index.js +0 -302
- package/lib/index.js.map +0 -1
- package/lib/index.modern.js +0 -295
- package/lib/index.modern.js.map +0 -1
package/lib/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/errors/AjvValidationError.ts","../src/utils/getPath.ts","../src/utils/defaultErrorFormatter.ts","../src/services/Ajv.ts","../src/services/AjvService.ts","../src/decorators/keyword.ts","../src/decorators/formats.ts"],"sourcesContent":["import {BadRequest} from \"@tsed/exceptions\";\n\nexport class AjvValidationError extends BadRequest {\n public name: string = \"AJV_VALIDATION_ERROR\";\n public errors: any[];\n\n constructor(message: string, errors: any[] = []) {\n super(message);\n this.errors = errors;\n }\n}\n","import {getValue} from \"@tsed/core\";\n\nexport function getPath(error: any) {\n return getValue(error, \"dataPath\", getValue(error, \"instancePath\", \"\")).replace(/\\//gi, \".\");\n}\n","import {AjvErrorObject} from \"../interfaces/IAjvSettings\";\nimport {getPath} from \"./getPath\";\n\nexport function defaultErrorFormatter(error: AjvErrorObject & {dataPath: string}) {\n const value = JSON.stringify(error.data === undefined ? \"undefined\" : error.data);\n const join = (list: any[]): string => list.filter(Boolean).join(\"\").trim();\n\n error.dataPath = getPath(error);\n\n const [, indexPath, ...paths] = error.dataPath.split(\".\");\n const deepPaths = paths.length ? \".\" + paths.join(\".\") : \"\";\n\n if (error.collectionName) {\n switch (error.collectionName) {\n case \"Array\":\n return join([`${error.modelName || \"\"}[${indexPath}]${deepPaths}`, ` ${error.message}. Given value: ${value}`]);\n case \"Map\":\n return join([`Map<${indexPath}, ${error.modelName || \"\"}>${deepPaths}`, ` ${error.message}. Given value: ${value}`]);\n case \"Set\":\n return join([`Set<${indexPath}, ${error.modelName || \"\"}>${deepPaths}`, ` ${error.message}. Given value: ${value}`]);\n }\n }\n\n return join([!error.modelName && \"Value\", `${error.modelName || \"\"}`, error.dataPath, ` ${error.message}. Given value: ${value}`]);\n}\n","import {cleanObject} from \"@tsed/core\";\nimport {Configuration, InjectorService, ProviderScope, registerProvider} from \"@tsed/di\";\nimport Ajv, {Format, KeywordDefinition, Vocabulary} from \"ajv\";\nimport AjvFormats from \"ajv-formats\";\nimport {FormatsMethods} from \"../interfaces/FormatsMethods\";\nimport {IAjvSettings} from \"../interfaces/IAjvSettings\";\n\nfunction getHandler(key: string, service: any) {\n if (service[key]) {\n return service[key].bind(service);\n }\n}\n\nfunction getKeywordProviders(injector: InjectorService) {\n return injector.getProviders(\"ajv:keyword\");\n}\n\nfunction bindKeywords(injector: InjectorService): Vocabulary {\n return getKeywordProviders(injector).map((provider) => {\n const options = provider.store.get<Omit<KeywordDefinition, \"compile\">>(\"ajv:keyword\", {})!;\n const service = injector.invoke(provider.token);\n\n return <KeywordDefinition>cleanObject({\n ...options,\n validate: getHandler(\"validate\", service),\n compile: getHandler(\"compile\", service),\n code: getHandler(\"code\", service),\n macro: getHandler(\"macro\", service)\n });\n });\n}\n\nfunction getFormatsProviders(injector: InjectorService) {\n return injector.getProviders(\"ajv:formats\");\n}\n\nfunction getFormats(injector: InjectorService): {name: string; options: Format}[] {\n return getFormatsProviders(injector).map((provider) => {\n const {name, options} = provider.store.get<any>(\"ajv:formats\", {})!;\n const service = injector.invoke<FormatsMethods<any>>(provider.token);\n\n return {\n name,\n options: {\n ...options,\n validate: service.validate.bind(service),\n compare: service.compare?.bind(service)\n }\n };\n });\n}\n\nregisterProvider({\n provide: Ajv,\n deps: [Configuration, InjectorService],\n scope: ProviderScope.SINGLETON,\n useFactory(configuration: Configuration, injector: InjectorService) {\n const {errorFormatter, keywords = [], ...props} = configuration.get<IAjvSettings>(\"ajv\") || {};\n const options = {\n verbose: false,\n coerceTypes: true,\n strict: false,\n keywords: [...keywords, ...bindKeywords(injector)],\n ...props\n };\n\n const ajv = new Ajv(options);\n\n AjvFormats(ajv as any);\n\n getFormats(injector).forEach(({name, options}) => {\n ajv.addFormat(name, options);\n });\n\n return ajv;\n }\n});\n","import {deepClone, getValue, nameOf, prototypeOf, setValue, Type} from \"@tsed/core\";\nimport {Constant, Inject, Injectable} from \"@tsed/di\";\nimport {getJsonSchema, JsonEntityStore, JsonSchema, JsonSchemaObject} from \"@tsed/schema\";\nimport Ajv, {ErrorObject} from \"ajv\";\nimport {AjvValidationError} from \"../errors/AjvValidationError\";\nimport {AjvErrorObject, ErrorFormatter} from \"../interfaces/IAjvSettings\";\nimport {defaultErrorFormatter} from \"../utils/defaultErrorFormatter\";\nimport \"./Ajv\";\nimport {getPath} from \"../utils/getPath\";\n\nexport interface AjvValidateOptions extends Record<string, any> {\n schema?: JsonSchema | Partial<JsonSchemaObject>;\n type?: Type<any> | any;\n collectionType?: Type<any> | any;\n}\n\n@Injectable()\nexport class AjvService {\n @Constant(\"ajv.errorFormatter\", defaultErrorFormatter)\n protected errorFormatter: ErrorFormatter;\n\n @Inject()\n protected ajv: Ajv;\n\n async validate(value: any, options: AjvValidateOptions | JsonSchema): Promise<any> {\n let {schema, type, collectionType, ...additionalOptions} = this.mapOptions(options);\n\n schema = schema || getJsonSchema(type, {...additionalOptions, customKeys: true});\n\n if (schema) {\n const localValue = deepClone(value);\n const valid = await this.ajv.validate(schema as any, localValue);\n if (!valid) {\n throw this.mapErrors(this.ajv.errors || [], {\n type,\n collectionType,\n async: true,\n value: localValue\n });\n }\n }\n\n return value;\n }\n\n protected mapOptions(options: AjvValidateOptions | JsonSchema): AjvValidateOptions {\n if (options instanceof JsonSchema) {\n return {\n schema: options.toJSON({customKeys: true})\n };\n }\n\n return options;\n }\n\n protected mapErrors(errors: ErrorObject[], options: any) {\n const {type, collectionType, value} = options;\n\n const message = errors\n .map((error: AjvErrorObject) => {\n if (collectionType) {\n error.collectionName = nameOf(collectionType);\n }\n\n const dataPath = getPath(error);\n\n if (!error.data) {\n if (dataPath) {\n error.data = getValue(value, dataPath.replace(/^\\./, \"\"));\n } else if (error.schemaPath !== \"#/required\") {\n error.data = value;\n }\n }\n\n if (dataPath && dataPath.match(/pwd|password|mdp|secret/)) {\n error.data = \"[REDACTED]\";\n }\n\n if (type) {\n error.modelName = nameOf(type);\n error.message = this.mapClassError(error, type);\n }\n\n return this.errorFormatter.call(this, error, {});\n })\n .join(\"\\n\");\n\n return new AjvValidationError(message, errors);\n }\n\n protected mapClassError(error: AjvErrorObject, targetType: Type<any>) {\n const propertyKey = getValue(error, \"params.missingProperty\");\n\n if (propertyKey) {\n const store = JsonEntityStore.from<JsonEntityStore>(prototypeOf(targetType), propertyKey);\n\n if (store) {\n setValue(error, \"params.missingProperty\", store.name || propertyKey);\n\n return error.message!.replace(`'${propertyKey}'`, `'${store.name || propertyKey}'`);\n }\n }\n\n return error.message;\n }\n}\n","import {StoreSet, useDecorators} from \"@tsed/core\";\nimport {Injectable} from \"@tsed/di\";\nimport {JsonSchema} from \"@tsed/schema\";\nimport {AnySchemaObject, KeywordDefinition} from \"ajv\";\n\nexport type KeywordOptions = Partial<Omit<KeywordDefinition, \"metaSchema\">> & {\n metaSchema?: AnySchemaObject | JsonSchema;\n};\n\n/**\n * Create new keyword custom validator\n * @param options\n * @decorator\n * @ajv\n */\nexport function Keyword(options: KeywordOptions): ClassDecorator {\n return useDecorators(\n Injectable({\n type: \"ajv:keyword\"\n }),\n StoreSet(\"ajv:keyword\", {\n ...options,\n metaSchema: options.metaSchema && options.metaSchema.toJSON ? options.metaSchema.toJSON() : options.metaSchema\n })\n );\n}\n","import {StoreSet, useDecorators} from \"@tsed/core\";\nimport {Injectable} from \"@tsed/di\";\nimport {AsyncFormatDefinition, FormatDefinition} from \"ajv\";\n\nexport type FormatsOptions = Omit<FormatDefinition<any>, \"validate\" | \"compare\"> | Omit<AsyncFormatDefinition<any>, \"validate\" | \"compare\">;\n\n/**\n * Create a new custom formats validator\n * @param name\n * @param options\n * @decorator\n * @ajv\n */\nexport function Formats(name: string, options: FormatsOptions = {}): ClassDecorator {\n return useDecorators(\n Injectable({\n type: \"ajv:formats\"\n }),\n StoreSet(\"ajv:formats\", {\n name,\n options\n })\n );\n}\n"],"names":["AjvValidationError","BadRequest","constructor","message","errors","getPath","error","getValue","replace","defaultErrorFormatter","value","JSON","stringify","data","undefined","join","list","filter","Boolean","trim","dataPath","indexPath","paths","split","deepPaths","length","collectionName","modelName","getHandler","key","service","bind","getKeywordProviders","injector","getProviders","bindKeywords","map","provider","options","store","get","invoke","token","cleanObject","validate","compile","code","macro","getFormatsProviders","getFormats","name","compare","registerProvider","provide","Ajv","deps","Configuration","InjectorService","scope","ProviderScope","SINGLETON","useFactory","configuration","keywords","props","verbose","coerceTypes","strict","ajv","AjvFormats","forEach","addFormat","AjvService","mapOptions","schema","type","collectionType","additionalOptions","getJsonSchema","customKeys","localValue","deepClone","valid","mapErrors","async","JsonSchema","toJSON","nameOf","schemaPath","match","mapClassError","errorFormatter","call","targetType","propertyKey","JsonEntityStore","from","prototypeOf","setValue","__decorate","Constant","Inject","Injectable","Keyword","useDecorators","StoreSet","metaSchema","Formats"],"mappings":"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"}
|
package/lib/index.modern.js
DELETED
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
import { BadRequest } from '@tsed/exceptions';
|
|
2
|
-
import { __decorate, __metadata } from 'tslib';
|
|
3
|
-
import { getValue, cleanObject, deepClone, nameOf, prototypeOf, setValue, useDecorators, StoreSet } from '@tsed/core';
|
|
4
|
-
import { registerProvider, Configuration, InjectorService, ProviderScope, Constant, Inject, Injectable } from '@tsed/di';
|
|
5
|
-
import { getJsonSchema, JsonSchema, JsonEntityStore } from '@tsed/schema';
|
|
6
|
-
import Ajv from 'ajv';
|
|
7
|
-
import AjvFormats from 'ajv-formats';
|
|
8
|
-
|
|
9
|
-
class AjvValidationError extends BadRequest {
|
|
10
|
-
constructor(message, errors = []) {
|
|
11
|
-
super(message);
|
|
12
|
-
this.name = "AJV_VALIDATION_ERROR";
|
|
13
|
-
this.errors = errors;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function _extends() {
|
|
19
|
-
_extends = Object.assign || function (target) {
|
|
20
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
21
|
-
var source = arguments[i];
|
|
22
|
-
|
|
23
|
-
for (var key in source) {
|
|
24
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
25
|
-
target[key] = source[key];
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
return target;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
return _extends.apply(this, arguments);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
37
|
-
if (source == null) return {};
|
|
38
|
-
var target = {};
|
|
39
|
-
var sourceKeys = Object.keys(source);
|
|
40
|
-
var key, i;
|
|
41
|
-
|
|
42
|
-
for (i = 0; i < sourceKeys.length; i++) {
|
|
43
|
-
key = sourceKeys[i];
|
|
44
|
-
if (excluded.indexOf(key) >= 0) continue;
|
|
45
|
-
target[key] = source[key];
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return target;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function getPath(error) {
|
|
52
|
-
return getValue(error, "dataPath", getValue(error, "instancePath", "")).replace(/\//gi, ".");
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function defaultErrorFormatter(error) {
|
|
56
|
-
const value = JSON.stringify(error.data === undefined ? "undefined" : error.data);
|
|
57
|
-
|
|
58
|
-
const join = list => list.filter(Boolean).join("").trim();
|
|
59
|
-
|
|
60
|
-
error.dataPath = getPath(error);
|
|
61
|
-
const [, indexPath, ...paths] = error.dataPath.split(".");
|
|
62
|
-
const deepPaths = paths.length ? "." + paths.join(".") : "";
|
|
63
|
-
|
|
64
|
-
if (error.collectionName) {
|
|
65
|
-
switch (error.collectionName) {
|
|
66
|
-
case "Array":
|
|
67
|
-
return join([`${error.modelName || ""}[${indexPath}]${deepPaths}`, ` ${error.message}. Given value: ${value}`]);
|
|
68
|
-
|
|
69
|
-
case "Map":
|
|
70
|
-
return join([`Map<${indexPath}, ${error.modelName || ""}>${deepPaths}`, ` ${error.message}. Given value: ${value}`]);
|
|
71
|
-
|
|
72
|
-
case "Set":
|
|
73
|
-
return join([`Set<${indexPath}, ${error.modelName || ""}>${deepPaths}`, ` ${error.message}. Given value: ${value}`]);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return join([!error.modelName && "Value", `${error.modelName || ""}`, error.dataPath, ` ${error.message}. Given value: ${value}`]);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const _excluded$1 = ["errorFormatter", "keywords"];
|
|
81
|
-
|
|
82
|
-
function getHandler(key, service) {
|
|
83
|
-
if (service[key]) {
|
|
84
|
-
return service[key].bind(service);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function getKeywordProviders(injector) {
|
|
89
|
-
return injector.getProviders("ajv:keyword");
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function bindKeywords(injector) {
|
|
93
|
-
return getKeywordProviders(injector).map(provider => {
|
|
94
|
-
const options = provider.store.get("ajv:keyword", {});
|
|
95
|
-
const service = injector.invoke(provider.token);
|
|
96
|
-
return cleanObject(_extends({}, options, {
|
|
97
|
-
validate: getHandler("validate", service),
|
|
98
|
-
compile: getHandler("compile", service),
|
|
99
|
-
code: getHandler("code", service),
|
|
100
|
-
macro: getHandler("macro", service)
|
|
101
|
-
}));
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function getFormatsProviders(injector) {
|
|
106
|
-
return injector.getProviders("ajv:formats");
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
function getFormats(injector) {
|
|
110
|
-
return getFormatsProviders(injector).map(provider => {
|
|
111
|
-
var _service$compare;
|
|
112
|
-
|
|
113
|
-
const {
|
|
114
|
-
name,
|
|
115
|
-
options
|
|
116
|
-
} = provider.store.get("ajv:formats", {});
|
|
117
|
-
const service = injector.invoke(provider.token);
|
|
118
|
-
return {
|
|
119
|
-
name,
|
|
120
|
-
options: _extends({}, options, {
|
|
121
|
-
validate: service.validate.bind(service),
|
|
122
|
-
compare: (_service$compare = service.compare) == null ? void 0 : _service$compare.bind(service)
|
|
123
|
-
})
|
|
124
|
-
};
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
registerProvider({
|
|
129
|
-
provide: Ajv,
|
|
130
|
-
deps: [Configuration, InjectorService],
|
|
131
|
-
scope: ProviderScope.SINGLETON,
|
|
132
|
-
|
|
133
|
-
useFactory(configuration, injector) {
|
|
134
|
-
const _ref = configuration.get("ajv") || {},
|
|
135
|
-
{
|
|
136
|
-
keywords = []
|
|
137
|
-
} = _ref,
|
|
138
|
-
props = _objectWithoutPropertiesLoose(_ref, _excluded$1);
|
|
139
|
-
|
|
140
|
-
const options = _extends({
|
|
141
|
-
verbose: false,
|
|
142
|
-
coerceTypes: true,
|
|
143
|
-
strict: false,
|
|
144
|
-
keywords: [...keywords, ...bindKeywords(injector)]
|
|
145
|
-
}, props);
|
|
146
|
-
|
|
147
|
-
const ajv = new Ajv(options);
|
|
148
|
-
AjvFormats(ajv);
|
|
149
|
-
getFormats(injector).forEach(({
|
|
150
|
-
name,
|
|
151
|
-
options
|
|
152
|
-
}) => {
|
|
153
|
-
ajv.addFormat(name, options);
|
|
154
|
-
});
|
|
155
|
-
return ajv;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
const _excluded = ["schema", "type", "collectionType"];
|
|
161
|
-
let AjvService = class AjvService {
|
|
162
|
-
async validate(value, options) {
|
|
163
|
-
let _this$mapOptions = this.mapOptions(options),
|
|
164
|
-
{
|
|
165
|
-
schema,
|
|
166
|
-
type,
|
|
167
|
-
collectionType
|
|
168
|
-
} = _this$mapOptions,
|
|
169
|
-
additionalOptions = _objectWithoutPropertiesLoose(_this$mapOptions, _excluded);
|
|
170
|
-
|
|
171
|
-
schema = schema || getJsonSchema(type, _extends({}, additionalOptions, {
|
|
172
|
-
customKeys: true
|
|
173
|
-
}));
|
|
174
|
-
|
|
175
|
-
if (schema) {
|
|
176
|
-
const localValue = deepClone(value);
|
|
177
|
-
const valid = await this.ajv.validate(schema, localValue);
|
|
178
|
-
|
|
179
|
-
if (!valid) {
|
|
180
|
-
throw this.mapErrors(this.ajv.errors || [], {
|
|
181
|
-
type,
|
|
182
|
-
collectionType,
|
|
183
|
-
async: true,
|
|
184
|
-
value: localValue
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
return value;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
mapOptions(options) {
|
|
193
|
-
if (options instanceof JsonSchema) {
|
|
194
|
-
return {
|
|
195
|
-
schema: options.toJSON({
|
|
196
|
-
customKeys: true
|
|
197
|
-
})
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
return options;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
mapErrors(errors, options) {
|
|
205
|
-
const {
|
|
206
|
-
type,
|
|
207
|
-
collectionType,
|
|
208
|
-
value
|
|
209
|
-
} = options;
|
|
210
|
-
const message = errors.map(error => {
|
|
211
|
-
if (collectionType) {
|
|
212
|
-
error.collectionName = nameOf(collectionType);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
const dataPath = getPath(error);
|
|
216
|
-
|
|
217
|
-
if (!error.data) {
|
|
218
|
-
if (dataPath) {
|
|
219
|
-
error.data = getValue(value, dataPath.replace(/^\./, ""));
|
|
220
|
-
} else if (error.schemaPath !== "#/required") {
|
|
221
|
-
error.data = value;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
if (dataPath && dataPath.match(/pwd|password|mdp|secret/)) {
|
|
226
|
-
error.data = "[REDACTED]";
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
if (type) {
|
|
230
|
-
error.modelName = nameOf(type);
|
|
231
|
-
error.message = this.mapClassError(error, type);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
return this.errorFormatter.call(this, error, {});
|
|
235
|
-
}).join("\n");
|
|
236
|
-
return new AjvValidationError(message, errors);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
mapClassError(error, targetType) {
|
|
240
|
-
const propertyKey = getValue(error, "params.missingProperty");
|
|
241
|
-
|
|
242
|
-
if (propertyKey) {
|
|
243
|
-
const store = JsonEntityStore.from(prototypeOf(targetType), propertyKey);
|
|
244
|
-
|
|
245
|
-
if (store) {
|
|
246
|
-
setValue(error, "params.missingProperty", store.name || propertyKey);
|
|
247
|
-
return error.message.replace(`'${propertyKey}'`, `'${store.name || propertyKey}'`);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
return error.message;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
};
|
|
255
|
-
|
|
256
|
-
__decorate([Constant("ajv.errorFormatter", defaultErrorFormatter), __metadata("design:type", Function)], AjvService.prototype, "errorFormatter", void 0);
|
|
257
|
-
|
|
258
|
-
__decorate([Inject(), __metadata("design:type", Ajv)], AjvService.prototype, "ajv", void 0);
|
|
259
|
-
|
|
260
|
-
AjvService = __decorate([Injectable()], AjvService);
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* Create new keyword custom validator
|
|
264
|
-
* @param options
|
|
265
|
-
* @decorator
|
|
266
|
-
* @ajv
|
|
267
|
-
*/
|
|
268
|
-
|
|
269
|
-
function Keyword(options) {
|
|
270
|
-
return useDecorators(Injectable({
|
|
271
|
-
type: "ajv:keyword"
|
|
272
|
-
}), StoreSet("ajv:keyword", _extends({}, options, {
|
|
273
|
-
metaSchema: options.metaSchema && options.metaSchema.toJSON ? options.metaSchema.toJSON() : options.metaSchema
|
|
274
|
-
})));
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
/**
|
|
278
|
-
* Create a new custom formats validator
|
|
279
|
-
* @param name
|
|
280
|
-
* @param options
|
|
281
|
-
* @decorator
|
|
282
|
-
* @ajv
|
|
283
|
-
*/
|
|
284
|
-
|
|
285
|
-
function Formats(name, options = {}) {
|
|
286
|
-
return useDecorators(Injectable({
|
|
287
|
-
type: "ajv:formats"
|
|
288
|
-
}), StoreSet("ajv:formats", {
|
|
289
|
-
name,
|
|
290
|
-
options
|
|
291
|
-
}));
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
export { AjvService, AjvValidationError, Formats, Keyword };
|
|
295
|
-
//# sourceMappingURL=index.modern.js.map
|
package/lib/index.modern.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.modern.js","sources":["../src/errors/AjvValidationError.ts","../src/utils/getPath.ts","../src/utils/defaultErrorFormatter.ts","../src/services/Ajv.ts","../src/services/AjvService.ts","../src/decorators/keyword.ts","../src/decorators/formats.ts"],"sourcesContent":["import {BadRequest} from \"@tsed/exceptions\";\n\nexport class AjvValidationError extends BadRequest {\n public name: string = \"AJV_VALIDATION_ERROR\";\n public errors: any[];\n\n constructor(message: string, errors: any[] = []) {\n super(message);\n this.errors = errors;\n }\n}\n","import {getValue} from \"@tsed/core\";\n\nexport function getPath(error: any) {\n return getValue(error, \"dataPath\", getValue(error, \"instancePath\", \"\")).replace(/\\//gi, \".\");\n}\n","import {AjvErrorObject} from \"../interfaces/IAjvSettings\";\nimport {getPath} from \"./getPath\";\n\nexport function defaultErrorFormatter(error: AjvErrorObject & {dataPath: string}) {\n const value = JSON.stringify(error.data === undefined ? \"undefined\" : error.data);\n const join = (list: any[]): string => list.filter(Boolean).join(\"\").trim();\n\n error.dataPath = getPath(error);\n\n const [, indexPath, ...paths] = error.dataPath.split(\".\");\n const deepPaths = paths.length ? \".\" + paths.join(\".\") : \"\";\n\n if (error.collectionName) {\n switch (error.collectionName) {\n case \"Array\":\n return join([`${error.modelName || \"\"}[${indexPath}]${deepPaths}`, ` ${error.message}. Given value: ${value}`]);\n case \"Map\":\n return join([`Map<${indexPath}, ${error.modelName || \"\"}>${deepPaths}`, ` ${error.message}. Given value: ${value}`]);\n case \"Set\":\n return join([`Set<${indexPath}, ${error.modelName || \"\"}>${deepPaths}`, ` ${error.message}. Given value: ${value}`]);\n }\n }\n\n return join([!error.modelName && \"Value\", `${error.modelName || \"\"}`, error.dataPath, ` ${error.message}. Given value: ${value}`]);\n}\n","import {cleanObject} from \"@tsed/core\";\nimport {Configuration, InjectorService, ProviderScope, registerProvider} from \"@tsed/di\";\nimport Ajv, {Format, KeywordDefinition, Vocabulary} from \"ajv\";\nimport AjvFormats from \"ajv-formats\";\nimport {FormatsMethods} from \"../interfaces/FormatsMethods\";\nimport {IAjvSettings} from \"../interfaces/IAjvSettings\";\n\nfunction getHandler(key: string, service: any) {\n if (service[key]) {\n return service[key].bind(service);\n }\n}\n\nfunction getKeywordProviders(injector: InjectorService) {\n return injector.getProviders(\"ajv:keyword\");\n}\n\nfunction bindKeywords(injector: InjectorService): Vocabulary {\n return getKeywordProviders(injector).map((provider) => {\n const options = provider.store.get<Omit<KeywordDefinition, \"compile\">>(\"ajv:keyword\", {})!;\n const service = injector.invoke(provider.token);\n\n return <KeywordDefinition>cleanObject({\n ...options,\n validate: getHandler(\"validate\", service),\n compile: getHandler(\"compile\", service),\n code: getHandler(\"code\", service),\n macro: getHandler(\"macro\", service)\n });\n });\n}\n\nfunction getFormatsProviders(injector: InjectorService) {\n return injector.getProviders(\"ajv:formats\");\n}\n\nfunction getFormats(injector: InjectorService): {name: string; options: Format}[] {\n return getFormatsProviders(injector).map((provider) => {\n const {name, options} = provider.store.get<any>(\"ajv:formats\", {})!;\n const service = injector.invoke<FormatsMethods<any>>(provider.token);\n\n return {\n name,\n options: {\n ...options,\n validate: service.validate.bind(service),\n compare: service.compare?.bind(service)\n }\n };\n });\n}\n\nregisterProvider({\n provide: Ajv,\n deps: [Configuration, InjectorService],\n scope: ProviderScope.SINGLETON,\n useFactory(configuration: Configuration, injector: InjectorService) {\n const {errorFormatter, keywords = [], ...props} = configuration.get<IAjvSettings>(\"ajv\") || {};\n const options = {\n verbose: false,\n coerceTypes: true,\n strict: false,\n keywords: [...keywords, ...bindKeywords(injector)],\n ...props\n };\n\n const ajv = new Ajv(options);\n\n AjvFormats(ajv as any);\n\n getFormats(injector).forEach(({name, options}) => {\n ajv.addFormat(name, options);\n });\n\n return ajv;\n }\n});\n","import {deepClone, getValue, nameOf, prototypeOf, setValue, Type} from \"@tsed/core\";\nimport {Constant, Inject, Injectable} from \"@tsed/di\";\nimport {getJsonSchema, JsonEntityStore, JsonSchema, JsonSchemaObject} from \"@tsed/schema\";\nimport Ajv, {ErrorObject} from \"ajv\";\nimport {AjvValidationError} from \"../errors/AjvValidationError\";\nimport {AjvErrorObject, ErrorFormatter} from \"../interfaces/IAjvSettings\";\nimport {defaultErrorFormatter} from \"../utils/defaultErrorFormatter\";\nimport \"./Ajv\";\nimport {getPath} from \"../utils/getPath\";\n\nexport interface AjvValidateOptions extends Record<string, any> {\n schema?: JsonSchema | Partial<JsonSchemaObject>;\n type?: Type<any> | any;\n collectionType?: Type<any> | any;\n}\n\n@Injectable()\nexport class AjvService {\n @Constant(\"ajv.errorFormatter\", defaultErrorFormatter)\n protected errorFormatter: ErrorFormatter;\n\n @Inject()\n protected ajv: Ajv;\n\n async validate(value: any, options: AjvValidateOptions | JsonSchema): Promise<any> {\n let {schema, type, collectionType, ...additionalOptions} = this.mapOptions(options);\n\n schema = schema || getJsonSchema(type, {...additionalOptions, customKeys: true});\n\n if (schema) {\n const localValue = deepClone(value);\n const valid = await this.ajv.validate(schema as any, localValue);\n if (!valid) {\n throw this.mapErrors(this.ajv.errors || [], {\n type,\n collectionType,\n async: true,\n value: localValue\n });\n }\n }\n\n return value;\n }\n\n protected mapOptions(options: AjvValidateOptions | JsonSchema): AjvValidateOptions {\n if (options instanceof JsonSchema) {\n return {\n schema: options.toJSON({customKeys: true})\n };\n }\n\n return options;\n }\n\n protected mapErrors(errors: ErrorObject[], options: any) {\n const {type, collectionType, value} = options;\n\n const message = errors\n .map((error: AjvErrorObject) => {\n if (collectionType) {\n error.collectionName = nameOf(collectionType);\n }\n\n const dataPath = getPath(error);\n\n if (!error.data) {\n if (dataPath) {\n error.data = getValue(value, dataPath.replace(/^\\./, \"\"));\n } else if (error.schemaPath !== \"#/required\") {\n error.data = value;\n }\n }\n\n if (dataPath && dataPath.match(/pwd|password|mdp|secret/)) {\n error.data = \"[REDACTED]\";\n }\n\n if (type) {\n error.modelName = nameOf(type);\n error.message = this.mapClassError(error, type);\n }\n\n return this.errorFormatter.call(this, error, {});\n })\n .join(\"\\n\");\n\n return new AjvValidationError(message, errors);\n }\n\n protected mapClassError(error: AjvErrorObject, targetType: Type<any>) {\n const propertyKey = getValue(error, \"params.missingProperty\");\n\n if (propertyKey) {\n const store = JsonEntityStore.from<JsonEntityStore>(prototypeOf(targetType), propertyKey);\n\n if (store) {\n setValue(error, \"params.missingProperty\", store.name || propertyKey);\n\n return error.message!.replace(`'${propertyKey}'`, `'${store.name || propertyKey}'`);\n }\n }\n\n return error.message;\n }\n}\n","import {StoreSet, useDecorators} from \"@tsed/core\";\nimport {Injectable} from \"@tsed/di\";\nimport {JsonSchema} from \"@tsed/schema\";\nimport {AnySchemaObject, KeywordDefinition} from \"ajv\";\n\nexport type KeywordOptions = Partial<Omit<KeywordDefinition, \"metaSchema\">> & {\n metaSchema?: AnySchemaObject | JsonSchema;\n};\n\n/**\n * Create new keyword custom validator\n * @param options\n * @decorator\n * @ajv\n */\nexport function Keyword(options: KeywordOptions): ClassDecorator {\n return useDecorators(\n Injectable({\n type: \"ajv:keyword\"\n }),\n StoreSet(\"ajv:keyword\", {\n ...options,\n metaSchema: options.metaSchema && options.metaSchema.toJSON ? options.metaSchema.toJSON() : options.metaSchema\n })\n );\n}\n","import {StoreSet, useDecorators} from \"@tsed/core\";\nimport {Injectable} from \"@tsed/di\";\nimport {AsyncFormatDefinition, FormatDefinition} from \"ajv\";\n\nexport type FormatsOptions = Omit<FormatDefinition<any>, \"validate\" | \"compare\"> | Omit<AsyncFormatDefinition<any>, \"validate\" | \"compare\">;\n\n/**\n * Create a new custom formats validator\n * @param name\n * @param options\n * @decorator\n * @ajv\n */\nexport function Formats(name: string, options: FormatsOptions = {}): ClassDecorator {\n return useDecorators(\n Injectable({\n type: \"ajv:formats\"\n }),\n StoreSet(\"ajv:formats\", {\n name,\n options\n })\n );\n}\n"],"names":["AjvValidationError","BadRequest","constructor","message","errors","getPath","error","getValue","replace","defaultErrorFormatter","value","JSON","stringify","data","undefined","join","list","filter","Boolean","trim","dataPath","indexPath","paths","split","deepPaths","length","collectionName","modelName","getHandler","key","service","bind","getKeywordProviders","injector","getProviders","bindKeywords","map","provider","options","store","get","invoke","token","cleanObject","validate","compile","code","macro","getFormatsProviders","getFormats","name","compare","registerProvider","provide","Ajv","deps","Configuration","InjectorService","scope","ProviderScope","SINGLETON","useFactory","configuration","keywords","props","verbose","coerceTypes","strict","ajv","AjvFormats","forEach","addFormat","AjvService","mapOptions","schema","type","collectionType","additionalOptions","getJsonSchema","customKeys","localValue","deepClone","valid","mapErrors","async","JsonSchema","toJSON","nameOf","schemaPath","match","mapClassError","errorFormatter","call","targetType","propertyKey","JsonEntityStore","from","prototypeOf","setValue","__decorate","Constant","Inject","Injectable","Keyword","useDecorators","StoreSet","metaSchema","Formats"],"mappings":"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"}
|