@middy/validator 3.6.2 → 4.0.0-alpha.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/index.cjs +46 -70
- package/index.js +35 -66
- package/package.json +6 -11
package/index.cjs
CHANGED
|
@@ -2,121 +2,97 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
transpileSchema: ()=>transpileSchema,
|
|
13
|
+
transpileLocale: ()=>transpileLocale,
|
|
14
|
+
default: ()=>_default
|
|
8
15
|
});
|
|
9
16
|
const _util = require("@middy/util");
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const _ajvFormats = _interopRequireDefault(require("ajv-formats"));
|
|
13
|
-
const _ajvFormatsDraft2019 = _interopRequireDefault(require("ajv-formats-draft2019"));
|
|
14
|
-
const _typeofJs = _interopRequireDefault(require("ajv-keywords/dist/definitions/typeof.js"));
|
|
15
|
-
const _fastUri = _interopRequireDefault(require("fast-uri"));
|
|
17
|
+
const _ajvCmd = require("ajv-cmd");
|
|
18
|
+
const _ajvFtlI18N = _interopRequireDefault(require("ajv-ftl-i18n"));
|
|
16
19
|
function _interopRequireDefault(obj) {
|
|
17
20
|
return obj && obj.__esModule ? obj : {
|
|
18
21
|
default: obj
|
|
19
22
|
};
|
|
20
23
|
}
|
|
21
|
-
const Ajv = _2020Js.default.default;
|
|
22
|
-
let ajv;
|
|
23
|
-
const ajvDefaults = {
|
|
24
|
-
strict: true,
|
|
25
|
-
coerceTypes: 'array',
|
|
26
|
-
allErrors: true,
|
|
27
|
-
useDefaults: 'empty',
|
|
28
|
-
messages: false,
|
|
29
|
-
uriResolver: _fastUri.default,
|
|
30
|
-
keywords: [
|
|
31
|
-
(0, _typeofJs.default)()
|
|
32
|
-
]
|
|
33
|
-
};
|
|
34
24
|
const defaults = {
|
|
35
25
|
eventSchema: undefined,
|
|
36
26
|
contextSchema: undefined,
|
|
37
27
|
responseSchema: undefined,
|
|
38
|
-
|
|
39
|
-
ajvInstance: undefined,
|
|
28
|
+
i18nEnabled: true,
|
|
40
29
|
defaultLanguage: 'en',
|
|
41
|
-
|
|
30
|
+
languages: {}
|
|
42
31
|
};
|
|
43
32
|
const validatorMiddleware = (opts = {})=>{
|
|
44
|
-
|
|
33
|
+
const { eventSchema , contextSchema , responseSchema , i18nEnabled , defaultLanguage , languages } = {
|
|
45
34
|
...defaults,
|
|
46
35
|
...opts
|
|
47
36
|
};
|
|
48
|
-
eventSchema = compile(eventSchema ?? inputSchema, ajvOptions, ajvInstance);
|
|
49
|
-
contextSchema = compile(contextSchema, ajvOptions, ajvInstance);
|
|
50
|
-
responseSchema = compile(responseSchema ?? outputSchema, ajvOptions, ajvInstance);
|
|
51
37
|
const validatorMiddlewareBefore = async (request)=>{
|
|
52
38
|
if (eventSchema) {
|
|
53
39
|
const validEvent = await eventSchema(request.event);
|
|
54
40
|
if (!validEvent) {
|
|
55
41
|
if (i18nEnabled) {
|
|
56
42
|
const language = chooseLanguage(request.event, defaultLanguage);
|
|
57
|
-
|
|
43
|
+
if (languages[language]) {
|
|
44
|
+
languages[language](eventSchema.errors);
|
|
45
|
+
} else {
|
|
46
|
+
_ajvFtlI18N.default[language](eventSchema.errors);
|
|
47
|
+
}
|
|
58
48
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
49
|
+
throw (0, _util.createError)(400, 'Event object failed validation', {
|
|
50
|
+
cause: eventSchema.errors
|
|
51
|
+
});
|
|
62
52
|
}
|
|
63
53
|
}
|
|
64
54
|
if (contextSchema) {
|
|
65
55
|
const validContext = await contextSchema(request.context);
|
|
66
56
|
if (!validContext) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
57
|
+
throw (0, _util.createError)(500, 'Context object failed validation', {
|
|
58
|
+
cause: contextSchema.errors
|
|
59
|
+
});
|
|
70
60
|
}
|
|
71
61
|
}
|
|
72
62
|
};
|
|
73
63
|
const validatorMiddlewareAfter = async (request)=>{
|
|
74
|
-
const
|
|
75
|
-
if (!
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
64
|
+
const validResponse = await responseSchema(request.response);
|
|
65
|
+
if (!validResponse) {
|
|
66
|
+
throw (0, _util.createError)(500, 'Response object failed validation', {
|
|
67
|
+
cause: responseSchema.errors
|
|
68
|
+
});
|
|
79
69
|
}
|
|
80
70
|
};
|
|
81
71
|
return {
|
|
82
|
-
before: eventSchema ??
|
|
83
|
-
after: responseSchema
|
|
72
|
+
before: eventSchema ?? contextSchema ? validatorMiddlewareBefore : undefined,
|
|
73
|
+
after: responseSchema ? validatorMiddlewareAfter : undefined
|
|
84
74
|
};
|
|
85
75
|
};
|
|
86
|
-
const
|
|
87
|
-
|
|
76
|
+
const ajvDefaults = {
|
|
77
|
+
strict: true,
|
|
78
|
+
coerceTypes: 'array',
|
|
79
|
+
allErrors: true,
|
|
80
|
+
useDefaults: 'empty',
|
|
81
|
+
messages: true
|
|
82
|
+
};
|
|
83
|
+
const transpileSchema = (schema, ajvOptions)=>{
|
|
88
84
|
const options = {
|
|
89
85
|
...ajvDefaults,
|
|
90
86
|
...ajvOptions
|
|
91
87
|
};
|
|
92
|
-
|
|
93
|
-
ajv = ajvInstance ?? new Ajv(options);
|
|
94
|
-
(0, _ajvFormats.default)(ajv);
|
|
95
|
-
(0, _ajvFormatsDraft2019.default)(ajv);
|
|
96
|
-
} else if (!ajvInstance) {
|
|
97
|
-
ajv.opts = {
|
|
98
|
-
...ajv.opts,
|
|
99
|
-
...options
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
return ajv.compile(schema);
|
|
103
|
-
};
|
|
104
|
-
const languageNormalizationMap = {
|
|
105
|
-
pt: 'pt-BR',
|
|
106
|
-
'pt-br': 'pt-BR',
|
|
107
|
-
pt_BR: 'pt-BR',
|
|
108
|
-
pt_br: 'pt-BR',
|
|
109
|
-
'zh-tw': 'zh-TW',
|
|
110
|
-
zh_TW: 'zh-TW',
|
|
111
|
-
zh_tw: 'zh-TW'
|
|
88
|
+
return (0, _ajvCmd.compile)(schema, options);
|
|
112
89
|
};
|
|
113
|
-
const
|
|
114
|
-
const availableLanguages = Object.keys(
|
|
90
|
+
const transpileLocale = _ajvCmd.ftl;
|
|
91
|
+
const availableLanguages = Object.keys(_ajvFtlI18N.default);
|
|
115
92
|
const chooseLanguage = ({ preferredLanguage }, defaultLanguage)=>{
|
|
116
93
|
if (preferredLanguage) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
return lang;
|
|
94
|
+
if (availableLanguages.includes(preferredLanguage)) {
|
|
95
|
+
return preferredLanguage;
|
|
120
96
|
}
|
|
121
97
|
}
|
|
122
98
|
return defaultLanguage;
|
package/index.js
CHANGED
|
@@ -1,109 +1,78 @@
|
|
|
1
1
|
import { createError } from '@middy/util';
|
|
2
|
-
import
|
|
3
|
-
import localize from 'ajv-i18n';
|
|
4
|
-
import formats from 'ajv-formats';
|
|
5
|
-
import formatsDraft2019 from 'ajv-formats-draft2019';
|
|
6
|
-
import typeofKeyword from 'ajv-keywords/dist/definitions/typeof.js';
|
|
7
|
-
import uriResolver from 'fast-uri';
|
|
8
|
-
const Ajv = _ajv.default;
|
|
9
|
-
let ajv;
|
|
10
|
-
const ajvDefaults = {
|
|
11
|
-
strict: true,
|
|
12
|
-
coerceTypes: 'array',
|
|
13
|
-
allErrors: true,
|
|
14
|
-
useDefaults: 'empty',
|
|
15
|
-
messages: false,
|
|
16
|
-
uriResolver,
|
|
17
|
-
keywords: [
|
|
18
|
-
typeofKeyword()
|
|
19
|
-
]
|
|
20
|
-
};
|
|
2
|
+
import { compile, ftl } from 'ajv-cmd';
|
|
3
|
+
import localize from 'ajv-ftl-i18n';
|
|
21
4
|
const defaults = {
|
|
22
5
|
eventSchema: undefined,
|
|
23
6
|
contextSchema: undefined,
|
|
24
7
|
responseSchema: undefined,
|
|
25
|
-
|
|
26
|
-
ajvInstance: undefined,
|
|
8
|
+
i18nEnabled: true,
|
|
27
9
|
defaultLanguage: 'en',
|
|
28
|
-
|
|
10
|
+
languages: {}
|
|
29
11
|
};
|
|
30
12
|
const validatorMiddleware = (opts = {})=>{
|
|
31
|
-
|
|
13
|
+
const { eventSchema , contextSchema , responseSchema , i18nEnabled , defaultLanguage , languages } = {
|
|
32
14
|
...defaults,
|
|
33
15
|
...opts
|
|
34
16
|
};
|
|
35
|
-
eventSchema = compile(eventSchema ?? inputSchema, ajvOptions, ajvInstance);
|
|
36
|
-
contextSchema = compile(contextSchema, ajvOptions, ajvInstance);
|
|
37
|
-
responseSchema = compile(responseSchema ?? outputSchema, ajvOptions, ajvInstance);
|
|
38
17
|
const validatorMiddlewareBefore = async (request)=>{
|
|
39
18
|
if (eventSchema) {
|
|
40
19
|
const validEvent = await eventSchema(request.event);
|
|
41
20
|
if (!validEvent) {
|
|
42
21
|
if (i18nEnabled) {
|
|
43
22
|
const language = chooseLanguage(request.event, defaultLanguage);
|
|
44
|
-
|
|
23
|
+
if (languages[language]) {
|
|
24
|
+
languages[language](eventSchema.errors);
|
|
25
|
+
} else {
|
|
26
|
+
localize[language](eventSchema.errors);
|
|
27
|
+
}
|
|
45
28
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
29
|
+
throw createError(400, 'Event object failed validation', {
|
|
30
|
+
cause: eventSchema.errors
|
|
31
|
+
});
|
|
49
32
|
}
|
|
50
33
|
}
|
|
51
34
|
if (contextSchema) {
|
|
52
35
|
const validContext = await contextSchema(request.context);
|
|
53
36
|
if (!validContext) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
37
|
+
throw createError(500, 'Context object failed validation', {
|
|
38
|
+
cause: contextSchema.errors
|
|
39
|
+
});
|
|
57
40
|
}
|
|
58
41
|
}
|
|
59
42
|
};
|
|
60
43
|
const validatorMiddlewareAfter = async (request)=>{
|
|
61
|
-
const
|
|
62
|
-
if (!
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
44
|
+
const validResponse = await responseSchema(request.response);
|
|
45
|
+
if (!validResponse) {
|
|
46
|
+
throw createError(500, 'Response object failed validation', {
|
|
47
|
+
cause: responseSchema.errors
|
|
48
|
+
});
|
|
66
49
|
}
|
|
67
50
|
};
|
|
68
51
|
return {
|
|
69
|
-
before: eventSchema ??
|
|
70
|
-
after: responseSchema
|
|
52
|
+
before: eventSchema ?? contextSchema ? validatorMiddlewareBefore : undefined,
|
|
53
|
+
after: responseSchema ? validatorMiddlewareAfter : undefined
|
|
71
54
|
};
|
|
72
55
|
};
|
|
73
|
-
const
|
|
74
|
-
|
|
56
|
+
const ajvDefaults = {
|
|
57
|
+
strict: true,
|
|
58
|
+
coerceTypes: 'array',
|
|
59
|
+
allErrors: true,
|
|
60
|
+
useDefaults: 'empty',
|
|
61
|
+
messages: true
|
|
62
|
+
};
|
|
63
|
+
export const transpileSchema = (schema, ajvOptions)=>{
|
|
75
64
|
const options = {
|
|
76
65
|
...ajvDefaults,
|
|
77
66
|
...ajvOptions
|
|
78
67
|
};
|
|
79
|
-
|
|
80
|
-
ajv = ajvInstance ?? new Ajv(options);
|
|
81
|
-
formats(ajv);
|
|
82
|
-
formatsDraft2019(ajv);
|
|
83
|
-
} else if (!ajvInstance) {
|
|
84
|
-
ajv.opts = {
|
|
85
|
-
...ajv.opts,
|
|
86
|
-
...options
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
return ajv.compile(schema);
|
|
90
|
-
};
|
|
91
|
-
const languageNormalizationMap = {
|
|
92
|
-
pt: 'pt-BR',
|
|
93
|
-
'pt-br': 'pt-BR',
|
|
94
|
-
pt_BR: 'pt-BR',
|
|
95
|
-
pt_br: 'pt-BR',
|
|
96
|
-
'zh-tw': 'zh-TW',
|
|
97
|
-
zh_TW: 'zh-TW',
|
|
98
|
-
zh_tw: 'zh-TW'
|
|
68
|
+
return compile(schema, options);
|
|
99
69
|
};
|
|
100
|
-
const
|
|
70
|
+
export const transpileLocale = ftl;
|
|
101
71
|
const availableLanguages = Object.keys(localize);
|
|
102
72
|
const chooseLanguage = ({ preferredLanguage }, defaultLanguage)=>{
|
|
103
73
|
if (preferredLanguage) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
return lang;
|
|
74
|
+
if (availableLanguages.includes(preferredLanguage)) {
|
|
75
|
+
return preferredLanguage;
|
|
107
76
|
}
|
|
108
77
|
}
|
|
109
78
|
return defaultLanguage;
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@middy/validator",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0-alpha.0",
|
|
4
4
|
"description": "Validator middleware for the middy framework",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
7
|
-
"node": ">=
|
|
7
|
+
"node": ">=16"
|
|
8
8
|
},
|
|
9
9
|
"engineStrict": true,
|
|
10
10
|
"publishConfig": {
|
|
@@ -61,18 +61,13 @@
|
|
|
61
61
|
},
|
|
62
62
|
"homepage": "https://middy.js.org",
|
|
63
63
|
"dependencies": {
|
|
64
|
-
"@middy/util": "
|
|
65
|
-
"ajv": "
|
|
66
|
-
"ajv-formats": "2.1.1",
|
|
67
|
-
"ajv-formats-draft2019": "1.6.1",
|
|
68
|
-
"ajv-i18n": "4.2.0",
|
|
69
|
-
"ajv-keywords": "5.1.0",
|
|
70
|
-
"fast-uri": "2.1.0"
|
|
64
|
+
"@middy/util": "4.0.0-alpha.0",
|
|
65
|
+
"ajv-cmd": "0.1.9"
|
|
71
66
|
},
|
|
72
67
|
"devDependencies": {
|
|
73
|
-
"@middy/core": "
|
|
68
|
+
"@middy/core": "4.0.0-alpha.0",
|
|
74
69
|
"@types/http-errors": "^1.8.1",
|
|
75
70
|
"ajv-bsontype": "^1.0.7"
|
|
76
71
|
},
|
|
77
|
-
"gitHead": "
|
|
72
|
+
"gitHead": "306fb9aa633d5757d11ced3dc192f046ef3c2685"
|
|
78
73
|
}
|