hono 2.3.1 → 2.4.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/dist/cjs/compose.js +82 -66
- package/dist/cjs/context.js +159 -144
- package/dist/cjs/hono.js +173 -150
- package/dist/cjs/index.js +31 -11
- package/dist/cjs/middleware/basic-auth/index.js +70 -39
- package/dist/cjs/middleware/bearer-auth/index.js +69 -51
- package/dist/cjs/middleware/cache/index.js +49 -28
- package/dist/cjs/middleware/compress/index.js +39 -16
- package/dist/cjs/middleware/cors/index.js +89 -71
- package/dist/cjs/middleware/etag/index.js +46 -24
- package/dist/cjs/middleware/html/index.js +50 -30
- package/dist/cjs/middleware/jsx/index.js +178 -166
- package/dist/cjs/middleware/jsx/jsx-dev-runtime.js +30 -7
- package/dist/cjs/middleware/jsx/jsx-runtime.js +30 -6
- package/dist/cjs/middleware/jwt/index.js +74 -54
- package/dist/cjs/middleware/logger/index.js +59 -38
- package/dist/cjs/middleware/powered-by/index.js +30 -7
- package/dist/cjs/middleware/pretty-json/index.js +31 -8
- package/dist/cjs/middleware/serve-static/bun.js +56 -38
- package/dist/cjs/middleware/serve-static/index.js +27 -4
- package/dist/cjs/middleware/serve-static/module.js +42 -0
- package/dist/cjs/middleware/serve-static/serve-static.js +58 -39
- package/dist/cjs/middleware/validator/index.js +27 -4
- package/dist/cjs/middleware/validator/middleware.js +125 -91
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/request.js +129 -116
- package/dist/cjs/router/reg-exp-router/index.js +27 -4
- package/dist/cjs/router/reg-exp-router/node.js +108 -97
- package/dist/cjs/router/reg-exp-router/router.js +158 -141
- package/dist/cjs/router/reg-exp-router/trie.js +55 -39
- package/dist/cjs/router/smart-router/index.js +27 -4
- package/dist/cjs/router/smart-router/router.js +70 -49
- package/dist/cjs/router/static-router/index.js +27 -4
- package/dist/cjs/router/static-router/router.js +78 -64
- package/dist/cjs/router/trie-router/index.js +27 -4
- package/dist/cjs/router/trie-router/node.js +167 -159
- package/dist/cjs/router/trie-router/router.js +43 -20
- package/dist/cjs/router.js +35 -6
- package/dist/cjs/types.js +16 -0
- package/dist/cjs/utils/body.js +36 -15
- package/dist/cjs/utils/buffer.js +56 -31
- package/dist/cjs/utils/cloudflare.js +53 -34
- package/dist/cjs/utils/cookie.js +59 -35
- package/dist/cjs/utils/crypto.js +69 -43
- package/dist/cjs/utils/encode.js +92 -65
- package/dist/cjs/utils/filepath.js +39 -22
- package/dist/cjs/utils/html.js +54 -33
- package/dist/cjs/utils/http-status.js +68 -45
- package/dist/cjs/utils/json.js +91 -76
- package/dist/cjs/utils/jwt/index.js +32 -25
- package/dist/cjs/utils/jwt/jwt.js +124 -93
- package/dist/cjs/utils/jwt/types.js +65 -38
- package/dist/cjs/utils/mime.js +110 -87
- package/dist/cjs/utils/object.js +53 -35
- package/dist/cjs/utils/types.js +16 -0
- package/dist/cjs/utils/url.js +89 -78
- package/dist/cjs/validator/rule.js +80 -0
- package/dist/cjs/validator/sanitizer.js +30 -0
- package/dist/cjs/validator/schema.js +16 -0
- package/dist/cjs/validator/validator.js +439 -0
- package/dist/compose.d.ts +4 -3
- package/dist/compose.js +61 -64
- package/dist/context.d.ts +10 -9
- package/dist/context.js +139 -143
- package/dist/hono.d.ts +27 -42
- package/dist/hono.js +153 -149
- package/dist/index.d.ts +4 -1
- package/dist/index.js +9 -9
- package/dist/middleware/basic-auth/index.d.ts +1 -1
- package/dist/middleware/basic-auth/index.js +52 -40
- package/dist/middleware/bearer-auth/index.d.ts +1 -1
- package/dist/middleware/bearer-auth/index.js +48 -49
- package/dist/middleware/cache/index.d.ts +1 -1
- package/dist/middleware/cache/index.js +28 -26
- package/dist/middleware/compress/index.d.ts +1 -1
- package/dist/middleware/compress/index.js +18 -14
- package/dist/middleware/cors/index.d.ts +1 -1
- package/dist/middleware/cors/index.js +68 -69
- package/dist/middleware/etag/index.d.ts +1 -1
- package/dist/middleware/etag/index.js +25 -22
- package/dist/middleware/html/index.js +29 -28
- package/dist/middleware/jsx/index.js +164 -172
- package/dist/middleware/jsx/jsx-dev-runtime.js +9 -5
- package/dist/middleware/jsx/jsx-runtime.js +7 -2
- package/dist/middleware/jwt/index.d.ts +1 -1
- package/dist/middleware/jwt/index.js +53 -52
- package/dist/middleware/logger/index.d.ts +1 -1
- package/dist/middleware/logger/index.js +35 -39
- package/dist/middleware/powered-by/index.d.ts +1 -1
- package/dist/middleware/powered-by/index.js +9 -5
- package/dist/middleware/pretty-json/index.d.ts +1 -1
- package/dist/middleware/pretty-json/index.js +10 -6
- package/dist/middleware/serve-static/bun.d.ts +1 -1
- package/dist/middleware/serve-static/bun.js +35 -36
- package/dist/middleware/serve-static/index.js +5 -1
- package/dist/middleware/serve-static/module.d.ts +3 -0
- package/dist/middleware/serve-static/module.js +13 -0
- package/dist/middleware/serve-static/serve-static.d.ts +2 -3
- package/dist/middleware/serve-static/serve-static.js +36 -36
- package/dist/middleware/validator/index.js +5 -2
- package/dist/middleware/validator/middleware.d.ts +9 -15
- package/dist/middleware/validator/middleware.js +104 -89
- package/dist/request.d.ts +2 -2
- package/dist/request.js +108 -114
- package/dist/router/reg-exp-router/index.js +5 -1
- package/dist/router/reg-exp-router/node.js +87 -96
- package/dist/router/reg-exp-router/router.js +140 -142
- package/dist/router/reg-exp-router/trie.js +35 -38
- package/dist/router/smart-router/index.js +5 -1
- package/dist/router/smart-router/router.js +50 -48
- package/dist/router/static-router/index.js +5 -1
- package/dist/router/static-router/router.js +58 -63
- package/dist/router/trie-router/index.js +5 -1
- package/dist/router/trie-router/node.js +147 -158
- package/dist/router/trie-router/router.js +23 -19
- package/dist/router.js +12 -5
- package/dist/types.d.ts +22 -0
- package/dist/types.js +0 -0
- package/dist/utils/body.js +15 -13
- package/dist/utils/buffer.js +35 -29
- package/dist/utils/cloudflare.js +32 -32
- package/dist/utils/cookie.js +38 -33
- package/dist/utils/crypto.js +48 -41
- package/dist/utils/encode.js +70 -62
- package/dist/utils/filepath.js +18 -20
- package/dist/utils/html.js +34 -32
- package/dist/utils/http-status.js +48 -44
- package/dist/utils/json.js +71 -75
- package/dist/utils/jwt/index.js +5 -1
- package/dist/utils/jwt/jwt.js +95 -90
- package/dist/utils/jwt/types.js +47 -41
- package/dist/utils/mime.js +90 -86
- package/dist/utils/object.js +31 -32
- package/dist/utils/types.d.ts +3 -0
- package/dist/utils/types.js +0 -0
- package/dist/utils/url.js +69 -77
- package/dist/{middleware/validator → validator}/rule.d.ts +0 -0
- package/dist/validator/rule.js +57 -0
- package/dist/{middleware/validator → validator}/sanitizer.d.ts +0 -0
- package/dist/validator/sanitizer.js +7 -0
- package/dist/validator/schema.d.ts +7 -0
- package/dist/validator/schema.js +0 -0
- package/dist/{middleware/validator → validator}/validator.d.ts +10 -7
- package/dist/validator/validator.js +406 -0
- package/package.json +14 -8
- package/dist/cjs/middleware/validator/rule.js +0 -66
- package/dist/cjs/middleware/validator/sanitizer.js +0 -6
- package/dist/cjs/middleware/validator/validator.js +0 -417
- package/dist/middleware/serve-static/module.d.mts +0 -3
- package/dist/middleware/serve-static/module.mjs +0 -13
- package/dist/middleware/validator/rule.js +0 -63
- package/dist/middleware/validator/sanitizer.js +0 -3
- package/dist/middleware/validator/validator.js +0 -403
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var rule_exports = {};
|
|
20
|
+
__export(rule_exports, {
|
|
21
|
+
rule: () => rule
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(rule_exports);
|
|
24
|
+
const rule = {
|
|
25
|
+
isEmpty(value, options = { ignore_whitespace: false }) {
|
|
26
|
+
return (options.ignore_whitespace ? value.trim().length : value.length) === 0;
|
|
27
|
+
},
|
|
28
|
+
isLength: (value, options, arg2) => {
|
|
29
|
+
let min;
|
|
30
|
+
let max;
|
|
31
|
+
if (typeof options === "object") {
|
|
32
|
+
min = options.min || 0;
|
|
33
|
+
max = options.max;
|
|
34
|
+
} else {
|
|
35
|
+
min = options || 0;
|
|
36
|
+
max = arg2;
|
|
37
|
+
}
|
|
38
|
+
const presentationSequences = value.match(/(\uFE0F|\uFE0E)/g) || [];
|
|
39
|
+
const surrogatePairs = value.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g) || [];
|
|
40
|
+
const len = value.length - presentationSequences.length - surrogatePairs.length;
|
|
41
|
+
return len >= min && (typeof max === "undefined" || len <= max);
|
|
42
|
+
},
|
|
43
|
+
isAlpha: (value) => {
|
|
44
|
+
return /^[A-Z]+$/i.test(value);
|
|
45
|
+
},
|
|
46
|
+
isNumeric: (value) => {
|
|
47
|
+
return /^[0-9]+$/.test(value);
|
|
48
|
+
},
|
|
49
|
+
contains: (value, elem, options = {
|
|
50
|
+
ignoreCase: false,
|
|
51
|
+
minOccurrences: 1
|
|
52
|
+
}) => {
|
|
53
|
+
options.ignoreCase || (options.ignoreCase = false);
|
|
54
|
+
options.minOccurrences || (options.minOccurrences = 1);
|
|
55
|
+
if (options.ignoreCase) {
|
|
56
|
+
return value.toLowerCase().split(elem.toLowerCase()).length > options.minOccurrences;
|
|
57
|
+
}
|
|
58
|
+
return value.split(elem).length > options.minOccurrences;
|
|
59
|
+
},
|
|
60
|
+
isIn: (value, options) => {
|
|
61
|
+
if (typeof options === "object") {
|
|
62
|
+
for (const elem of options) {
|
|
63
|
+
if (elem === value)
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
},
|
|
69
|
+
match: (value, regExp) => {
|
|
70
|
+
return regExp.test(value);
|
|
71
|
+
},
|
|
72
|
+
isGte: (value, min) => min <= value,
|
|
73
|
+
isLte: (value, max) => value <= max,
|
|
74
|
+
isTrue: (value) => value === true,
|
|
75
|
+
isFalse: (value) => value === false
|
|
76
|
+
};
|
|
77
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
78
|
+
0 && (module.exports = {
|
|
79
|
+
rule
|
|
80
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var sanitizer_exports = {};
|
|
20
|
+
__export(sanitizer_exports, {
|
|
21
|
+
sanitizer: () => sanitizer
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(sanitizer_exports);
|
|
24
|
+
const sanitizer = {
|
|
25
|
+
trim: (value) => value.trim()
|
|
26
|
+
};
|
|
27
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
28
|
+
0 && (module.exports = {
|
|
29
|
+
sanitizer
|
|
30
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
var schema_exports = {};
|
|
16
|
+
module.exports = __toCommonJS(schema_exports);
|
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var validator_exports = {};
|
|
20
|
+
__export(validator_exports, {
|
|
21
|
+
VArray: () => VArray,
|
|
22
|
+
VBase: () => VBase,
|
|
23
|
+
VBoolean: () => VBoolean,
|
|
24
|
+
VBooleanArray: () => VBooleanArray,
|
|
25
|
+
VNumber: () => VNumber,
|
|
26
|
+
VNumberArray: () => VNumberArray,
|
|
27
|
+
VObject: () => VObject,
|
|
28
|
+
VObjectBase: () => VObjectBase,
|
|
29
|
+
VString: () => VString,
|
|
30
|
+
VStringArray: () => VStringArray,
|
|
31
|
+
Validator: () => Validator
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(validator_exports);
|
|
34
|
+
var import_json = require("./../utils/json");
|
|
35
|
+
var import_rule = require("./rule");
|
|
36
|
+
var import_sanitizer = require("./sanitizer");
|
|
37
|
+
class VObjectBase {
|
|
38
|
+
constructor(container, key) {
|
|
39
|
+
this.keys = [];
|
|
40
|
+
this._isOptional = false;
|
|
41
|
+
this.getValidators = () => {
|
|
42
|
+
const validators = [];
|
|
43
|
+
const thisKeys = [];
|
|
44
|
+
Object.assign(thisKeys, this.keys);
|
|
45
|
+
const walk = (container, keys, isOptional) => {
|
|
46
|
+
for (const v of Object.values(container)) {
|
|
47
|
+
if (v instanceof VArray || v instanceof VObject) {
|
|
48
|
+
isOptional || (isOptional = v._isOptional);
|
|
49
|
+
keys.push(...v.keys);
|
|
50
|
+
walk(v.container, keys, isOptional);
|
|
51
|
+
const tmp = [];
|
|
52
|
+
Object.assign(tmp, thisKeys);
|
|
53
|
+
keys = tmp;
|
|
54
|
+
} else if (v instanceof VBase) {
|
|
55
|
+
if (isOptional)
|
|
56
|
+
v.isOptional();
|
|
57
|
+
v.baseKeys.push(...keys);
|
|
58
|
+
validators.push(v);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
walk(this.container, this.keys, this._isOptional);
|
|
63
|
+
return validators;
|
|
64
|
+
};
|
|
65
|
+
this.container = container;
|
|
66
|
+
if (this instanceof VArray) {
|
|
67
|
+
this.keys.push(key, "[*]");
|
|
68
|
+
} else if (this instanceof VObject) {
|
|
69
|
+
this.keys.push(key);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
isOptional() {
|
|
73
|
+
this._isOptional = true;
|
|
74
|
+
return this;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
class VObject extends VObjectBase {
|
|
78
|
+
constructor(container, key) {
|
|
79
|
+
super(container, key);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
class VArray extends VObjectBase {
|
|
83
|
+
constructor(container, key) {
|
|
84
|
+
super(container, key);
|
|
85
|
+
this.type = "array";
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
class Validator {
|
|
89
|
+
constructor() {
|
|
90
|
+
this.isArray = false;
|
|
91
|
+
this.query = (key) => new VString({ target: "query", key });
|
|
92
|
+
this.queries = (key) => new VStringArray({ target: "queries", key });
|
|
93
|
+
this.header = (key) => new VString({ target: "header", key });
|
|
94
|
+
this.body = (key) => new VString({ target: "body", key });
|
|
95
|
+
this.json = (key) => {
|
|
96
|
+
if (this.isArray) {
|
|
97
|
+
return new VStringArray({ target: "json", key });
|
|
98
|
+
} else {
|
|
99
|
+
return new VString({ target: "json", key });
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
this.array = (path, validator) => {
|
|
103
|
+
this.isArray = true;
|
|
104
|
+
const res = validator(this);
|
|
105
|
+
const arr = new VArray(res, path);
|
|
106
|
+
return arr;
|
|
107
|
+
};
|
|
108
|
+
this.object = (path, validator) => {
|
|
109
|
+
this.isArray = false;
|
|
110
|
+
const res = validator(this);
|
|
111
|
+
const obj = new VObject(res, path);
|
|
112
|
+
return obj;
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
class VBase {
|
|
117
|
+
constructor(options) {
|
|
118
|
+
this.baseKeys = [];
|
|
119
|
+
this._nested = () => this.baseKeys.length ? true : false;
|
|
120
|
+
this.addSanitizer = (sanitizer2) => {
|
|
121
|
+
this.sanitizers.push(sanitizer2);
|
|
122
|
+
return this;
|
|
123
|
+
};
|
|
124
|
+
this.message = (text) => {
|
|
125
|
+
const len = this.rules.length;
|
|
126
|
+
if (len >= 1) {
|
|
127
|
+
this.rules[len - 1].customMessage = text;
|
|
128
|
+
}
|
|
129
|
+
return this;
|
|
130
|
+
};
|
|
131
|
+
this.isRequired = () => {
|
|
132
|
+
return this.addRule("isRequired", (value) => {
|
|
133
|
+
if (value !== void 0 && value !== null && value !== "")
|
|
134
|
+
return true;
|
|
135
|
+
return false;
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
this.isOptional = () => {
|
|
139
|
+
this._optional = true;
|
|
140
|
+
return this.addRule("isOptional", () => true);
|
|
141
|
+
};
|
|
142
|
+
this.isEqual = (comparison) => {
|
|
143
|
+
return this.addRule("isEqual", (value) => {
|
|
144
|
+
return value === comparison;
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
this.asNumber = () => {
|
|
148
|
+
const newVNumber = new VNumber({ ...this, type: "number" });
|
|
149
|
+
if (this.isArray)
|
|
150
|
+
return newVNumber.asArray();
|
|
151
|
+
return newVNumber;
|
|
152
|
+
};
|
|
153
|
+
this.asBoolean = () => {
|
|
154
|
+
const newVBoolean = new VBoolean({ ...this, type: "boolean" });
|
|
155
|
+
if (this.isArray)
|
|
156
|
+
return newVBoolean.asArray();
|
|
157
|
+
return newVBoolean;
|
|
158
|
+
};
|
|
159
|
+
this.validate = async (req) => {
|
|
160
|
+
let value = void 0;
|
|
161
|
+
let jsonData = void 0;
|
|
162
|
+
if (this.target === "query") {
|
|
163
|
+
value = req.query(this.key);
|
|
164
|
+
}
|
|
165
|
+
if (this.target === "queries") {
|
|
166
|
+
value = req.queries(this.key);
|
|
167
|
+
}
|
|
168
|
+
if (this.target === "header") {
|
|
169
|
+
value = req.header(this.key);
|
|
170
|
+
}
|
|
171
|
+
if (this.target === "body") {
|
|
172
|
+
const body = await req.parseBody();
|
|
173
|
+
value = body[this.key];
|
|
174
|
+
}
|
|
175
|
+
if (this.target === "json") {
|
|
176
|
+
if (this._nested()) {
|
|
177
|
+
this.key = `${this.baseKeys.join(".")}.${this.key}`;
|
|
178
|
+
}
|
|
179
|
+
let obj = {};
|
|
180
|
+
try {
|
|
181
|
+
obj = await req.json();
|
|
182
|
+
} catch (e) {
|
|
183
|
+
throw new Error("Malformed JSON in request body");
|
|
184
|
+
}
|
|
185
|
+
const dst = {};
|
|
186
|
+
value = (0, import_json.JSONPathCopy)(obj, dst, this.key);
|
|
187
|
+
if (this._nested())
|
|
188
|
+
jsonData = dst;
|
|
189
|
+
}
|
|
190
|
+
const results = [];
|
|
191
|
+
let typeRule = this.rules.shift();
|
|
192
|
+
for (const rule2 of this.rules) {
|
|
193
|
+
if (rule2.type === "type") {
|
|
194
|
+
typeRule = rule2;
|
|
195
|
+
} else if (rule2.type === "value") {
|
|
196
|
+
const result = this.validateRule(rule2, value);
|
|
197
|
+
result.jsonData || (result.jsonData = jsonData);
|
|
198
|
+
results.push(result);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (typeRule) {
|
|
202
|
+
const typeResult = this.validateRule(typeRule, value);
|
|
203
|
+
typeResult.jsonData || (typeResult.jsonData = jsonData);
|
|
204
|
+
results.unshift(typeResult);
|
|
205
|
+
this.rules.unshift(typeRule);
|
|
206
|
+
}
|
|
207
|
+
return results;
|
|
208
|
+
};
|
|
209
|
+
this.validateType = (value) => {
|
|
210
|
+
if (this.isArray) {
|
|
211
|
+
if (!Array.isArray(value)) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
for (const val of value) {
|
|
215
|
+
if (typeof val === "undefined" && this._nested()) {
|
|
216
|
+
value.pop();
|
|
217
|
+
}
|
|
218
|
+
for (const val2 of value) {
|
|
219
|
+
if (typeof val2 !== this.type) {
|
|
220
|
+
if (!this._optional || typeof val2 !== "undefined")
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
} else {
|
|
226
|
+
if (typeof value !== this.type) {
|
|
227
|
+
if (this._optional && (typeof value === "undefined" || Array.isArray(value))) {
|
|
228
|
+
} else {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return true;
|
|
234
|
+
};
|
|
235
|
+
this.validateValue = (func, value) => {
|
|
236
|
+
if (this._optional && typeof value === "undefined")
|
|
237
|
+
return true;
|
|
238
|
+
if (Array.isArray(value)) {
|
|
239
|
+
if (value.length === 0 && !this._optional)
|
|
240
|
+
return false;
|
|
241
|
+
for (const sanitizer2 of this.sanitizers) {
|
|
242
|
+
value = value.map((innerVal) => sanitizer2(innerVal));
|
|
243
|
+
}
|
|
244
|
+
for (const val of value) {
|
|
245
|
+
if (!func(val)) {
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return true;
|
|
250
|
+
} else {
|
|
251
|
+
for (const sanitizer2 of this.sanitizers) {
|
|
252
|
+
value = sanitizer2(value);
|
|
253
|
+
}
|
|
254
|
+
if (!func(value)) {
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
this.getMessage = (opts) => {
|
|
261
|
+
let keyText;
|
|
262
|
+
const valueText = Array.isArray(opts.value) ? `${opts.value.map(
|
|
263
|
+
(val) => val === void 0 ? "undefined" : typeof val === "string" ? `"${val}"` : val
|
|
264
|
+
).join(", ")}` : opts.value;
|
|
265
|
+
switch (this.target) {
|
|
266
|
+
case "query":
|
|
267
|
+
keyText = `the query parameter "${this.key}"`;
|
|
268
|
+
break;
|
|
269
|
+
case "queries":
|
|
270
|
+
keyText = `the query parameters "${this.key}"`;
|
|
271
|
+
break;
|
|
272
|
+
case "header":
|
|
273
|
+
keyText = `the request header "${this.key}"`;
|
|
274
|
+
break;
|
|
275
|
+
case "body":
|
|
276
|
+
keyText = `the request body "${this.key}"`;
|
|
277
|
+
break;
|
|
278
|
+
case "json":
|
|
279
|
+
keyText = `the JSON body "${this.key}"`;
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
return `Invalid Value [${valueText}]: ${keyText} is invalid - ${opts.ruleName}`;
|
|
283
|
+
};
|
|
284
|
+
this.target = options.target;
|
|
285
|
+
this.key = options.key;
|
|
286
|
+
this.type = options.type || "string";
|
|
287
|
+
this.rules = [
|
|
288
|
+
{
|
|
289
|
+
name: this.getTypeRuleName(),
|
|
290
|
+
type: "type",
|
|
291
|
+
func: this.validateType
|
|
292
|
+
}
|
|
293
|
+
];
|
|
294
|
+
this.sanitizers = [];
|
|
295
|
+
this._optional = false;
|
|
296
|
+
this.isArray = options.isArray || false;
|
|
297
|
+
}
|
|
298
|
+
addRule(arg, func) {
|
|
299
|
+
if (typeof arg === "string" && func) {
|
|
300
|
+
this.rules.push({ name: arg, func, type: "value" });
|
|
301
|
+
} else if (arg instanceof Function) {
|
|
302
|
+
this.rules.push({ name: arg.name, func: arg, type: "value" });
|
|
303
|
+
}
|
|
304
|
+
return this;
|
|
305
|
+
}
|
|
306
|
+
get(value) {
|
|
307
|
+
const len = this.rules.length;
|
|
308
|
+
if (len > 0) {
|
|
309
|
+
this.rules[this.rules.length - 1].customMessage = value;
|
|
310
|
+
}
|
|
311
|
+
return this;
|
|
312
|
+
}
|
|
313
|
+
getTypeRuleName() {
|
|
314
|
+
const prefix = "should be";
|
|
315
|
+
return this.isArray ? `${prefix} "${this.type}[]"` : `${prefix} "${this.type}"`;
|
|
316
|
+
}
|
|
317
|
+
validateRule(rule2, value) {
|
|
318
|
+
let isValid = false;
|
|
319
|
+
if (this._nested() && this.target != "json") {
|
|
320
|
+
isValid = false;
|
|
321
|
+
} else if (rule2.type === "value") {
|
|
322
|
+
isValid = this.validateValue(rule2.func, value);
|
|
323
|
+
} else if (rule2.type === "type") {
|
|
324
|
+
isValid = this.validateType(value);
|
|
325
|
+
}
|
|
326
|
+
const message = isValid ? void 0 : rule2.customMessage || this.getMessage({ ruleName: rule2.name, value });
|
|
327
|
+
const result = {
|
|
328
|
+
isValid,
|
|
329
|
+
message,
|
|
330
|
+
target: this.target,
|
|
331
|
+
key: this.key,
|
|
332
|
+
value,
|
|
333
|
+
ruleName: rule2.name,
|
|
334
|
+
ruleType: rule2.type
|
|
335
|
+
};
|
|
336
|
+
return result;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
class VString extends VBase {
|
|
340
|
+
constructor(options) {
|
|
341
|
+
super(options);
|
|
342
|
+
this.asArray = () => {
|
|
343
|
+
return new VStringArray(this);
|
|
344
|
+
};
|
|
345
|
+
this.isEmpty = (options = { ignore_whitespace: false }) => {
|
|
346
|
+
return this.addRule("isEmpty", (value) => import_rule.rule.isEmpty(value, options));
|
|
347
|
+
};
|
|
348
|
+
this.isLength = (options, arg2) => {
|
|
349
|
+
return this.addRule("isLength", (value) => import_rule.rule.isLength(value, options, arg2));
|
|
350
|
+
};
|
|
351
|
+
this.isAlpha = () => {
|
|
352
|
+
return this.addRule("isAlpha", (value) => import_rule.rule.isAlpha(value));
|
|
353
|
+
};
|
|
354
|
+
this.isNumeric = () => {
|
|
355
|
+
return this.addRule("isNumeric", (value) => import_rule.rule.isNumeric(value));
|
|
356
|
+
};
|
|
357
|
+
this.contains = (elem, options = {
|
|
358
|
+
ignoreCase: false,
|
|
359
|
+
minOccurrences: 1
|
|
360
|
+
}) => {
|
|
361
|
+
return this.addRule("contains", (value) => import_rule.rule.contains(value, elem, options));
|
|
362
|
+
};
|
|
363
|
+
this.isIn = (options) => {
|
|
364
|
+
return this.addRule("isIn", (value) => import_rule.rule.isIn(value, options));
|
|
365
|
+
};
|
|
366
|
+
this.match = (regExp) => {
|
|
367
|
+
return this.addRule("match", (value) => import_rule.rule.match(value, regExp));
|
|
368
|
+
};
|
|
369
|
+
this.trim = () => {
|
|
370
|
+
return this.addSanitizer((value) => import_sanitizer.sanitizer.trim(value));
|
|
371
|
+
};
|
|
372
|
+
this.type = "string";
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
class VNumber extends VBase {
|
|
376
|
+
constructor(options) {
|
|
377
|
+
super(options);
|
|
378
|
+
this.asArray = () => {
|
|
379
|
+
return new VNumberArray(this);
|
|
380
|
+
};
|
|
381
|
+
this.isGte = (min) => {
|
|
382
|
+
return this.addRule("isGte", (value) => import_rule.rule.isGte(value, min));
|
|
383
|
+
};
|
|
384
|
+
this.isLte = (min) => {
|
|
385
|
+
return this.addRule("isLte", (value) => import_rule.rule.isLte(value, min));
|
|
386
|
+
};
|
|
387
|
+
this.type = "number";
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
class VBoolean extends VBase {
|
|
391
|
+
constructor(options) {
|
|
392
|
+
super(options);
|
|
393
|
+
this.asArray = () => {
|
|
394
|
+
return new VBooleanArray(this);
|
|
395
|
+
};
|
|
396
|
+
this.isTrue = () => {
|
|
397
|
+
return this.addRule("isTrue", (value) => import_rule.rule.isTrue(value));
|
|
398
|
+
};
|
|
399
|
+
this.isFalse = () => {
|
|
400
|
+
return this.addRule("isFalse", (value) => import_rule.rule.isFalse(value));
|
|
401
|
+
};
|
|
402
|
+
this.type = "boolean";
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
class VNumberArray extends VNumber {
|
|
406
|
+
constructor(options) {
|
|
407
|
+
super(options);
|
|
408
|
+
this.isArray = true;
|
|
409
|
+
this.rules[0].name = this.getTypeRuleName();
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
class VStringArray extends VString {
|
|
413
|
+
constructor(options) {
|
|
414
|
+
super(options);
|
|
415
|
+
this.isArray = true;
|
|
416
|
+
this.rules[0].name = this.getTypeRuleName();
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
class VBooleanArray extends VBoolean {
|
|
420
|
+
constructor(options) {
|
|
421
|
+
super(options);
|
|
422
|
+
this.isArray = true;
|
|
423
|
+
this.rules[0].name = this.getTypeRuleName();
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
427
|
+
0 && (module.exports = {
|
|
428
|
+
VArray,
|
|
429
|
+
VBase,
|
|
430
|
+
VBoolean,
|
|
431
|
+
VBooleanArray,
|
|
432
|
+
VNumber,
|
|
433
|
+
VNumberArray,
|
|
434
|
+
VObject,
|
|
435
|
+
VObjectBase,
|
|
436
|
+
VString,
|
|
437
|
+
VStringArray,
|
|
438
|
+
Validator
|
|
439
|
+
});
|
package/dist/compose.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { Environment, NotFoundHandler, ErrorHandler } from './
|
|
1
|
+
import type { Environment, NotFoundHandler, ErrorHandler } from './types';
|
|
2
|
+
import type { Schema } from './validator/schema';
|
|
2
3
|
interface ComposeContext {
|
|
3
4
|
finalized: boolean;
|
|
4
|
-
res:
|
|
5
|
+
res: unknown;
|
|
5
6
|
}
|
|
6
|
-
export declare const compose: <C extends ComposeContext, E extends Partial<Environment> = Environment>(middleware: Function[], onNotFound?: NotFoundHandler<E> | undefined, onError?: ErrorHandler<E> | undefined) => (context: C, next?: Function) => C | Promise<C>;
|
|
7
|
+
export declare const compose: <C extends ComposeContext, P extends string = string, E extends Partial<Environment> = Environment, D extends Partial<Schema> = Schema>(middleware: Function[], onNotFound?: NotFoundHandler<P, E, D> | undefined, onError?: ErrorHandler<P, E, D> | undefined) => (context: C, next?: Function) => C | Promise<C>;
|
|
7
8
|
export {};
|