ejv 1.1.10 → 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.
Files changed (75) hide show
  1. package/.eslintrc.json +88 -0
  2. package/.mocharc.json +8 -0
  3. package/CHANGELOG.md +70 -29
  4. package/README-KR.md +6 -2
  5. package/README.md +6 -2
  6. package/build/{constants.js → cjs/constants.js} +117 -118
  7. package/build/cjs/constants.js.map +1 -0
  8. package/build/cjs/ejv.js +1263 -0
  9. package/build/cjs/ejv.js.map +1 -0
  10. package/build/{public_api.js → cjs/index.js} +14 -14
  11. package/build/cjs/index.js.map +1 -0
  12. package/build/cjs/interfaces.js +29 -0
  13. package/build/cjs/interfaces.js.map +1 -0
  14. package/build/cjs/package.json +1 -0
  15. package/build/{tester.js → cjs/tester.js} +273 -268
  16. package/build/cjs/tester.js.map +1 -0
  17. package/build/cjs/util.js +103 -0
  18. package/build/cjs/util.js.map +1 -0
  19. package/build/constants.d.ts +101 -104
  20. package/build/ejv.d.ts +2 -2
  21. package/build/esm/constants.js +115 -0
  22. package/build/esm/constants.js.map +1 -0
  23. package/build/esm/ejv.js +1261 -0
  24. package/build/esm/ejv.js.map +1 -0
  25. package/build/esm/index.js +4 -0
  26. package/build/esm/index.js.map +1 -0
  27. package/build/esm/interfaces.js +33 -0
  28. package/build/esm/interfaces.js.map +1 -0
  29. package/build/esm/package.json +1 -0
  30. package/build/esm/tester.js +240 -0
  31. package/build/esm/tester.js.map +1 -0
  32. package/build/esm/util.js +96 -0
  33. package/build/esm/util.js.map +1 -0
  34. package/build/index.d.ts +3 -0
  35. package/build/interfaces.d.ts +78 -38
  36. package/build/scripts/add-js-extensions.js +46 -0
  37. package/build/scripts/add-js-extensions.js.map +1 -0
  38. package/build/tester.d.ts +33 -34
  39. package/build/util.d.ts +7 -1
  40. package/package.json +48 -37
  41. package/scripts/add-js-extensions.ts +59 -0
  42. package/spec/ArrayScheme.ts +1021 -0
  43. package/spec/CommonScheme.ts +251 -0
  44. package/spec/DateScheme.ts +472 -0
  45. package/spec/NumberScheme.ts +1032 -0
  46. package/spec/ObjectScheme.ts +499 -0
  47. package/spec/RegExpScheme.ts +112 -0
  48. package/spec/StringScheme.ts +1239 -0
  49. package/spec/common-test-util.ts +63 -0
  50. package/spec/ejv.spec.ts +133 -4558
  51. package/spec/testers.spec.ts +17 -16
  52. package/src/constants.ts +41 -42
  53. package/src/ejv.ts +1141 -564
  54. package/src/index.ts +14 -0
  55. package/src/interfaces.ts +127 -41
  56. package/src/tester.ts +75 -69
  57. package/src/util.ts +106 -41
  58. package/tsconfig.cjs.json +8 -0
  59. package/tsconfig.esm.json +7 -0
  60. package/tsconfig.json +21 -18
  61. package/tsconfig.scripts.json +14 -0
  62. package/tsconfig.types.json +9 -0
  63. package/build/constants.js.map +0 -1
  64. package/build/ejv.js +0 -685
  65. package/build/ejv.js.map +0 -1
  66. package/build/interfaces.js +0 -15
  67. package/build/interfaces.js.map +0 -1
  68. package/build/public_api.d.ts +0 -3
  69. package/build/public_api.js.map +0 -1
  70. package/build/tester.js.map +0 -1
  71. package/build/util.js +0 -66
  72. package/build/util.js.map +0 -1
  73. package/spec/common-test-runner.ts +0 -17
  74. package/src/public_api.ts +0 -3
  75. package/tsconfig.spec.json +0 -19
@@ -1,269 +1,274 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.regExpTester = exports.uniqueItemsTester = exports.arrayTypeOfTester = exports.arrayTester = exports.exclusiveMaxDateTester = exports.maxDateTester = exports.exclusiveMinDateTester = exports.minDateTester = exports.dateTester = exports.hasPropertyTester = exports.objectTester = exports.dateTimeFormatTester = exports.timeFormatTester = exports.dateFormatTester = exports.emailTester = exports.stringRegExpTester = exports.stringTester = exports.exclusiveMaxNumberTester = exports.maxNumberTester = exports.exclusiveMinNumberTester = exports.minNumberTester = exports.indexTester = exports.integerTester = exports.numberTester = exports.booleanTester = exports.maxLengthTester = exports.minLengthTester = exports.lengthTester = exports.enumTester = exports.definedTester = exports.typeTester = void 0;
4
- var constants_1 = require("./constants");
5
- var typeTester = function (value, type) {
6
- var valid;
7
- switch (type) {
8
- case constants_1.DataType.BOOLEAN:
9
- valid = exports.booleanTester(value);
10
- break;
11
- case constants_1.DataType.NUMBER:
12
- valid = exports.numberTester(value);
13
- break;
14
- case constants_1.DataType.STRING:
15
- valid = exports.stringTester(value);
16
- break;
17
- case constants_1.DataType.OBJECT:
18
- valid = exports.objectTester(value);
19
- break;
20
- case constants_1.DataType.DATE:
21
- valid = exports.dateTester(value);
22
- break;
23
- case constants_1.DataType.REGEXP:
24
- valid = exports.regExpTester(value);
25
- break;
26
- case constants_1.DataType.ARRAY:
27
- valid = exports.arrayTester(value);
28
- break;
29
- }
30
- return valid;
31
- };
32
- exports.typeTester = typeTester;
33
- var definedTester = function (value) {
34
- return value !== undefined;
35
- };
36
- exports.definedTester = definedTester;
37
- var enumTester = function (value, arr) {
38
- return arr.includes(value);
39
- };
40
- exports.enumTester = enumTester;
41
- var lengthTester = function (value, length) {
42
- return value.length === length;
43
- };
44
- exports.lengthTester = lengthTester;
45
- var minLengthTester = function (value, minLength) {
46
- return value.length >= minLength;
47
- };
48
- exports.minLengthTester = minLengthTester;
49
- var maxLengthTester = function (value, maxLength) {
50
- return value.length <= maxLength;
51
- };
52
- exports.maxLengthTester = maxLengthTester;
53
- var booleanTester = function (value) {
54
- return typeof value === 'boolean';
55
- };
56
- exports.booleanTester = booleanTester;
57
- var numberTester = function (value) {
58
- return typeof value === 'number' && !isNaN(value);
59
- };
60
- exports.numberTester = numberTester;
61
- var integerTester = function (value) {
62
- return +value.toFixed(0) === value;
63
- };
64
- exports.integerTester = integerTester;
65
- var indexTester = function (value) {
66
- return exports.integerTester(value) && value >= 0;
67
- };
68
- exports.indexTester = indexTester;
69
- var minNumberTester = function (value, min) {
70
- return value >= min;
71
- };
72
- exports.minNumberTester = minNumberTester;
73
- var exclusiveMinNumberTester = function (value, min) {
74
- return value > min;
75
- };
76
- exports.exclusiveMinNumberTester = exclusiveMinNumberTester;
77
- var maxNumberTester = function (value, max) {
78
- return value <= max;
79
- };
80
- exports.maxNumberTester = maxNumberTester;
81
- var exclusiveMaxNumberTester = function (value, max) {
82
- return value < max;
83
- };
84
- exports.exclusiveMaxNumberTester = exclusiveMaxNumberTester;
85
- var stringTester = function (value) {
86
- return typeof value === 'string';
87
- };
88
- exports.stringTester = stringTester;
89
- var stringRegExpTester = function (value, regExp) {
90
- var valid = false;
91
- var _regExp = undefined;
92
- if (exports.regExpTester(regExp)) {
93
- _regExp = regExp;
94
- }
95
- else if (exports.stringTester(regExp)) {
96
- _regExp = new RegExp(regExp);
97
- }
98
- if (!!_regExp && exports.regExpTester(_regExp)) {
99
- valid = _regExp.test(value);
100
- }
101
- return valid;
102
- };
103
- exports.stringRegExpTester = stringRegExpTester;
104
- // RFC 5322, 3.4.1. spec
105
- var emailTester = function (value) {
106
- var valid = false;
107
- if (exports.stringTester(value) && exports.stringRegExpTester(value, /^.+@.+$/)) {
108
- var valueAsString = value;
109
- var atIndex = valueAsString.lastIndexOf('@');
110
- var localPart = valueAsString.substr(0, atIndex);
111
- var domain = valueAsString.substr(atIndex + 1);
112
- // regular expression sources
113
- // const aTextRegExpStr : string = '[-a-zA-Z0-9!#$%&\\\'*+/=?^_`{|}~]+';
114
- var dotAtomRegExp = /^(\.?[-a-zA-Z0-9!#$%&'*+/=?^_`{|}~]+)*$/;
115
- var quotedStringRegExp = /^"[\u0020-\u005b\u005d-\u007e\\]*"$/; // include space (\u005b)
116
- var domainLiteralRegExp = /^\[[\u0020-\u005a\u005c-\u007e\\]*]$/;
117
- var validLocalPart = localPart.length <= 64
118
- && (dotAtomRegExp.test(localPart)
119
- || quotedStringRegExp.test(localPart));
120
- var validDomain = !domain.startsWith('.') && !domain.endsWith('.')
121
- && (dotAtomRegExp.test(domain)
122
- || domainLiteralRegExp.test(domain));
123
- valid = validLocalPart && validDomain;
124
- }
125
- return valid;
126
- };
127
- exports.emailTester = emailTester;
128
- // RFC 3339 (https://www.ietf.org/rfc/rfc3339.txt) : YYYY-MM-DDThh:mm:ss[.SSSZ]
129
- var rfc3339Tester = function (value) {
130
- return /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T([0-1][0-9]|2[0-3])(:([0-5][0-9])){2}(\.\d+)?(Z|[-+]\d{2}:\d{2})?$/.test(value);
131
- };
132
- var iso8601DateTester = function (value) {
133
- var years = '(\\d{4})';
134
- var months = '(0[1-9]|1[0-2])';
135
- var dates = '(0[1-9]|[1-2][0-9]|3[0-1])';
136
- var dateOfYear = '(00[1-9]|0[1-9][0-9]|[1-2]\\d{2}|3[0-5]\\d|36[0-6])'; // 366 for leap year
137
- var weeks = '(W(0[1-9]|[2-4][0-9]|5[0-3]))';
138
- var days = '[1-7]';
139
- return [
140
- new RegExp("^[-+]?" + years + "$"),
141
- new RegExp("^" + years + "-" + months + "(-" + dates + ")?$"),
142
- new RegExp("^" + years + months + dates + "$"),
143
- new RegExp("^--" + months + "-?" + dates + "$"),
144
- new RegExp("^" + years + "-" + weeks + "(-" + days + ")?$"),
145
- new RegExp("^" + years + weeks + "(" + days + ")?$"),
146
- new RegExp("^" + years + "-?" + dateOfYear + "$") // ordinal dates : YYYY-DDD, YYYYDDD
147
- ].some(function (regExp) {
148
- return regExp.test(value);
149
- });
150
- };
151
- var iso8601TimeTester = function (value) {
152
- var hours = '([0-1]\\d|2[0-3])';
153
- var minutes = '([0-5]\\d)';
154
- var seconds = '([0-5]\\d|60)'; // 60 for leap second
155
- var ms = '(\\.[0-9]+)';
156
- return [
157
- new RegExp("^(" + hours + "|24)$"),
158
- new RegExp("^((" + hours + ":" + minutes + ")|24:00)$"),
159
- new RegExp("^((" + hours + ":" + minutes + ":" + seconds + ")|24:00:00)$"),
160
- new RegExp("^((" + hours + ":" + minutes + ":" + seconds + ms + ")|24:00:00.0+)$"),
161
- new RegExp("^(" + hours + minutes + "|2400)$"),
162
- new RegExp("^(" + hours + minutes + seconds + "|240000)$"),
163
- new RegExp("^(" + hours + minutes + seconds + ms + "|240000.0+)$") // hhmmss.sss
164
- ]
165
- .some(function (regExp) {
166
- return regExp.test(value);
167
- });
168
- };
169
- var iso8601DateTimeTester = function (value) {
170
- var valid = false;
171
- if (/.+T.+/.test(value) // should have 1 'T'
172
- && /(Z|[-+]\d{2}:?\d{2})$/.test(value) // should end with 'Z' or timezone
173
- ) {
174
- var _a = value.split('T'), date = _a[0], time = _a[1];
175
- if (time.endsWith('Z')) {
176
- time = time.replace('Z', '');
177
- }
178
- else {
179
- var timezoneStartIndex = time.includes('+') ? time.indexOf('+') : time.indexOf('-');
180
- time = time.substr(0, timezoneStartIndex);
181
- }
182
- valid = iso8601DateTester(date) && iso8601TimeTester(time);
183
- }
184
- return valid;
185
- };
186
- var dateFormatTester = function (value) {
187
- return iso8601DateTester(value);
188
- };
189
- exports.dateFormatTester = dateFormatTester;
190
- var timeFormatTester = function (value) {
191
- return iso8601TimeTester(value);
192
- };
193
- exports.timeFormatTester = timeFormatTester;
194
- var dateTimeFormatTester = function (value) {
195
- return rfc3339Tester(value) || iso8601DateTimeTester(value);
196
- };
197
- exports.dateTimeFormatTester = dateTimeFormatTester;
198
- // // with port
199
- // export const urlTester = (value : any) : boolean => {
200
- // return stringTester(value)
201
- // && /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(value);
202
- // };
203
- //
204
- // // TODO: with port
205
- // export const ipv4Tester = (value : any) : boolean => {
206
- // return stringTester(value)
207
- // && /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(value);
208
- // };
209
- //
210
- // export const ipv6Tester = (value : any) : boolean => {
211
- // return stringTester(value)
212
- // && /^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))?$;/.test(value);
213
- // };
214
- //
215
- // export const ipTester = (value : any) : boolean => {
216
- // return ipv4Tester(value) || ipv6Tester(value);
217
- // };
218
- var objectTester = function (value) {
219
- return typeof value === 'object';
220
- };
221
- exports.objectTester = objectTester;
222
- var hasPropertyTester = function (value) {
223
- return Object.keys(value).length > 0;
224
- };
225
- exports.hasPropertyTester = hasPropertyTester;
226
- var dateTester = function (value) {
227
- return exports.objectTester(value)
228
- && value !== null
229
- && typeof value.getFullYear === 'function'
230
- && !isNaN(value.getFullYear());
231
- };
232
- exports.dateTester = dateTester;
233
- var minDateTester = function (value, min) {
234
- return +value >= +min;
235
- };
236
- exports.minDateTester = minDateTester;
237
- var exclusiveMinDateTester = function (value, min) {
238
- return +value > +min;
239
- };
240
- exports.exclusiveMinDateTester = exclusiveMinDateTester;
241
- var maxDateTester = function (value, max) {
242
- return +value <= +max;
243
- };
244
- exports.maxDateTester = maxDateTester;
245
- var exclusiveMaxDateTester = function (value, max) {
246
- return +value < +max;
247
- };
248
- exports.exclusiveMaxDateTester = exclusiveMaxDateTester;
249
- var arrayTester = function (value) {
250
- return Array.isArray(value);
251
- };
252
- exports.arrayTester = arrayTester;
253
- var arrayTypeOfTester = function (array, type) {
254
- return array.every(function (item) {
255
- return exports.typeTester(item, type);
256
- });
257
- };
258
- exports.arrayTypeOfTester = arrayTypeOfTester;
259
- var uniqueItemsTester = function (array) {
260
- return array.every(function (item) {
261
- return array.filter(function (target) { return target === item; }).length === 1;
262
- });
263
- };
264
- exports.uniqueItemsTester = uniqueItemsTester;
265
- var regExpTester = function (value) {
266
- return value instanceof RegExp;
267
- };
268
- exports.regExpTester = regExpTester;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.regExpTester = exports.uniqueItemsTester = exports.arrayTypeOfTester = exports.arrayTester = exports.exclusiveMaxDateTester = exports.maxDateTester = exports.exclusiveMinDateTester = exports.minDateTester = exports.dateTester = exports.hasPropertyTester = exports.objectTester = exports.dateTimeFormatTester = exports.timeFormatTester = exports.dateFormatTester = exports.emailTester = exports.stringRegExpTester = exports.stringTester = exports.exclusiveMaxNumberTester = exports.maxNumberTester = exports.exclusiveMinNumberTester = exports.minNumberTester = exports.indexTester = exports.integerTester = exports.numberTester = exports.booleanTester = exports.maxLengthTester = exports.minLengthTester = exports.lengthTester = exports.enumTester = exports.definedTester = exports.typeTester = void 0;
4
+ const constants_1 = require("./constants.js");
5
+ const typeTester = (value, type) => {
6
+ let valid;
7
+ switch (type) {
8
+ case constants_1.DataType.BOOLEAN:
9
+ valid = (0, exports.booleanTester)(value);
10
+ break;
11
+ case constants_1.DataType.NUMBER:
12
+ valid = (0, exports.numberTester)(value);
13
+ break;
14
+ case constants_1.DataType.STRING:
15
+ valid = (0, exports.stringTester)(value);
16
+ break;
17
+ case constants_1.DataType.OBJECT:
18
+ valid = (0, exports.objectTester)(value);
19
+ break;
20
+ case constants_1.DataType.DATE:
21
+ valid = (0, exports.dateTester)(value);
22
+ break;
23
+ case constants_1.DataType.REGEXP:
24
+ valid = (0, exports.regExpTester)(value);
25
+ break;
26
+ case constants_1.DataType.ARRAY:
27
+ valid = (0, exports.arrayTester)(value);
28
+ break;
29
+ }
30
+ return valid;
31
+ };
32
+ exports.typeTester = typeTester;
33
+ const definedTester = (value) => {
34
+ return value !== undefined;
35
+ };
36
+ exports.definedTester = definedTester;
37
+ const enumTester = (value, arr) => {
38
+ return arr.includes(value);
39
+ };
40
+ exports.enumTester = enumTester;
41
+ const lengthTester = (value, length) => {
42
+ return value.length === length;
43
+ };
44
+ exports.lengthTester = lengthTester;
45
+ const minLengthTester = (value, minLength) => {
46
+ return value.length >= minLength;
47
+ };
48
+ exports.minLengthTester = minLengthTester;
49
+ const maxLengthTester = (value, maxLength) => {
50
+ return value.length <= maxLength;
51
+ };
52
+ exports.maxLengthTester = maxLengthTester;
53
+ const booleanTester = (value) => {
54
+ return typeof value === 'boolean';
55
+ };
56
+ exports.booleanTester = booleanTester;
57
+ const numberTester = (value) => {
58
+ return typeof value === 'number' && !isNaN(value);
59
+ };
60
+ exports.numberTester = numberTester;
61
+ const integerTester = (value) => {
62
+ return +value.toFixed(0) === value;
63
+ };
64
+ exports.integerTester = integerTester;
65
+ const indexTester = (value) => {
66
+ return (0, exports.integerTester)(value) && value >= 0;
67
+ };
68
+ exports.indexTester = indexTester;
69
+ const minNumberTester = (value, min) => {
70
+ return value >= min;
71
+ };
72
+ exports.minNumberTester = minNumberTester;
73
+ const exclusiveMinNumberTester = (value, min) => {
74
+ return value > min;
75
+ };
76
+ exports.exclusiveMinNumberTester = exclusiveMinNumberTester;
77
+ const maxNumberTester = (value, max) => {
78
+ return value <= max;
79
+ };
80
+ exports.maxNumberTester = maxNumberTester;
81
+ const exclusiveMaxNumberTester = (value, max) => {
82
+ return value < max;
83
+ };
84
+ exports.exclusiveMaxNumberTester = exclusiveMaxNumberTester;
85
+ const stringTester = (value) => {
86
+ return typeof value === 'string';
87
+ };
88
+ exports.stringTester = stringTester;
89
+ const stringRegExpTester = (value, regExp) => {
90
+ let valid = false;
91
+ let _regExp = undefined;
92
+ if ((0, exports.regExpTester)(regExp)) {
93
+ _regExp = regExp;
94
+ }
95
+ else if ((0, exports.stringTester)(regExp)) {
96
+ _regExp = new RegExp(regExp);
97
+ }
98
+ if (!!_regExp && (0, exports.regExpTester)(_regExp)) {
99
+ valid = _regExp.test(value);
100
+ }
101
+ return valid;
102
+ };
103
+ exports.stringRegExpTester = stringRegExpTester;
104
+ // RFC 5322, 3.4.1. spec
105
+ const emailTester = (value) => {
106
+ let valid = false;
107
+ if ((0, exports.stringTester)(value) && (0, exports.stringRegExpTester)(value, /^.+@.+$/)) {
108
+ const valueAsString = value;
109
+ const atIndex = valueAsString.lastIndexOf('@');
110
+ const localPart = valueAsString.substr(0, atIndex);
111
+ const domain = valueAsString.substr(atIndex + 1);
112
+ // regular expression sources
113
+ // const aTextRegExpStr : string = '[-a-zA-Z0-9!#$%&\\\'*+/=?^_`{|}~]+';
114
+ const dotAtomRegExp = /^(\.?[-a-zA-Z0-9!#$%&'*+/=?^_`{|}~]+)*$/;
115
+ const quotedStringRegExp = /^"[\u0020-\u005b\u005d-\u007e\\]*"$/; // include space (\u005b)
116
+ const domainLiteralRegExp = /^\[[\u0020-\u005a\u005c-\u007e\\]*]$/;
117
+ const validLocalPart = localPart.length <= 64
118
+ && (dotAtomRegExp.test(localPart)
119
+ || quotedStringRegExp.test(localPart));
120
+ const validDomain = !domain.startsWith('.') && !domain.endsWith('.')
121
+ && (dotAtomRegExp.test(domain)
122
+ || domainLiteralRegExp.test(domain));
123
+ valid = validLocalPart && validDomain;
124
+ }
125
+ return valid;
126
+ };
127
+ exports.emailTester = emailTester;
128
+ // RFC 3339 (https://www.ietf.org/rfc/rfc3339.txt) : YYYY-MM-DDThh:mm:ss[.SSSZ]
129
+ const rfc3339Tester = (value) => {
130
+ return /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T([0-1][0-9]|2[0-3])(:([0-5][0-9])){2}(\.\d+)?(Z|[-+]\d{2}:\d{2})?$/.test(value);
131
+ };
132
+ const iso8601DateTester = (value) => {
133
+ const years = '(\\d{4})';
134
+ const months = '(0[1-9]|1[0-2])';
135
+ const dates = '(0[1-9]|[1-2][0-9]|3[0-1])';
136
+ const dateOfYear = '(00[1-9]|0[1-9][0-9]|[1-2]\\d{2}|3[0-5]\\d|36[0-6])'; // 366 for leap year
137
+ const weeks = '(W(0[1-9]|[2-4][0-9]|5[0-3]))';
138
+ const days = '[1-7]';
139
+ return [
140
+ new RegExp(`^[-+]?${years}$`), // years : YYYY, +YYYY, -YYYY
141
+ new RegExp(`^${years}-${months}(-${dates})?$`), // calendar dates : YYYY-MM-DD, YYYY-MM
142
+ new RegExp(`^${years}${months}${dates}$`), // calendar dates : YYYYMMDD
143
+ new RegExp(`^--${months}-?${dates}$`), // calendar dates : --MM-DD, --MMDD
144
+ new RegExp(`^${years}-${weeks}(-${days})?$`), // week dates : YYYY-Www, YYYY-Www-D
145
+ new RegExp(`^${years}${weeks}(${days})?$`), // week dates : YYYYWww, YYYYWwwD
146
+ new RegExp(`^${years}-?${dateOfYear}$`) // ordinal dates : YYYY-DDD, YYYYDDD
147
+ ].some((regExp) => {
148
+ return regExp.test(value);
149
+ });
150
+ };
151
+ const iso8601TimeTester = (value) => {
152
+ const hours = '([0-1]\\d|2[0-3])';
153
+ const minutes = '([0-5]\\d)';
154
+ const seconds = '([0-5]\\d|60)'; // 60 for leap second
155
+ const ms = '(\\.[0-9]+)';
156
+ return [
157
+ new RegExp(`^(${hours}|24)$`), // hh
158
+ new RegExp(`^((${hours}:${minutes})|24:00)$`), // hh:mm
159
+ new RegExp(`^((${hours}:${minutes}:${seconds})|24:00:00)$`), // hh:mm:ss
160
+ new RegExp(`^((${hours}:${minutes}:${seconds}${ms})|24:00:00.0+)$`), // hh:mm:ss
161
+ new RegExp(`^(${hours}${minutes}|2400)$`), // hhmm
162
+ new RegExp(`^(${hours}${minutes}${seconds}|240000)$`), // hhmmss
163
+ new RegExp(`^(${hours}${minutes}${seconds}${ms}|240000.0+)$`) // hhmmss.sss
164
+ ]
165
+ .some((regExp) => {
166
+ return regExp.test(value);
167
+ });
168
+ };
169
+ const iso8601DateTimeTester = (value) => {
170
+ let valid = false;
171
+ if (/.+T.+/.test(value) // should have 1 'T'
172
+ && /(Z|[-+]\d{2}:?\d{2})$/.test(value) // should end with 'Z' or timezone
173
+ ) {
174
+ const dateAndTime = value.split('T');
175
+ const date = dateAndTime[0];
176
+ let time = dateAndTime[1];
177
+ if (time.endsWith('Z')) {
178
+ time = time.replace('Z', '');
179
+ }
180
+ else {
181
+ const timezoneStartIndex = time.includes('+')
182
+ ? time.indexOf('+')
183
+ : time.indexOf('-');
184
+ time = time.substr(0, timezoneStartIndex);
185
+ }
186
+ valid = iso8601DateTester(date) && iso8601TimeTester(time);
187
+ }
188
+ return valid;
189
+ };
190
+ const dateFormatTester = (value) => {
191
+ return iso8601DateTester(value);
192
+ };
193
+ exports.dateFormatTester = dateFormatTester;
194
+ const timeFormatTester = (value) => {
195
+ return iso8601TimeTester(value);
196
+ };
197
+ exports.timeFormatTester = timeFormatTester;
198
+ const dateTimeFormatTester = (value) => {
199
+ return rfc3339Tester(value) || iso8601DateTimeTester(value);
200
+ };
201
+ exports.dateTimeFormatTester = dateTimeFormatTester;
202
+ // // with port
203
+ // export const urlTester = (value : any) : boolean => {
204
+ // return stringTester(value)
205
+ // && /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(value);
206
+ // };
207
+ //
208
+ // // TODO: with port
209
+ // export const ipv4Tester = (value : any) : boolean => {
210
+ // return stringTester(value)
211
+ // && /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(value);
212
+ // };
213
+ //
214
+ // export const ipv6Tester = (value : any) : boolean => {
215
+ // return stringTester(value)
216
+ // && /^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*(\/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))?$;/.test(value);
217
+ // };
218
+ //
219
+ // export const ipTester = (value : any) : boolean => {
220
+ // return ipv4Tester(value) || ipv6Tester(value);
221
+ // };
222
+ const objectTester = (value) => {
223
+ return typeof value === 'object';
224
+ };
225
+ exports.objectTester = objectTester;
226
+ const hasPropertyTester = (value) => {
227
+ return Object.keys(value).length > 0;
228
+ };
229
+ exports.hasPropertyTester = hasPropertyTester;
230
+ const dateTester = (value) => {
231
+ return (0, exports.objectTester)(value)
232
+ && value !== null
233
+ && typeof value === 'object'
234
+ && value instanceof Date
235
+ && !isNaN(value.getFullYear());
236
+ };
237
+ exports.dateTester = dateTester;
238
+ const minDateTester = (value, min) => {
239
+ return +value >= +min;
240
+ };
241
+ exports.minDateTester = minDateTester;
242
+ const exclusiveMinDateTester = (value, min) => {
243
+ return +value > +min;
244
+ };
245
+ exports.exclusiveMinDateTester = exclusiveMinDateTester;
246
+ const maxDateTester = (value, max) => {
247
+ return +value <= +max;
248
+ };
249
+ exports.maxDateTester = maxDateTester;
250
+ const exclusiveMaxDateTester = (value, max) => {
251
+ return +value < +max;
252
+ };
253
+ exports.exclusiveMaxDateTester = exclusiveMaxDateTester;
254
+ const arrayTester = (value) => {
255
+ return Array.isArray(value);
256
+ };
257
+ exports.arrayTester = arrayTester;
258
+ const arrayTypeOfTester = (array, type) => {
259
+ return array.every((item) => {
260
+ return (0, exports.typeTester)(item, type);
261
+ });
262
+ };
263
+ exports.arrayTypeOfTester = arrayTypeOfTester;
264
+ const uniqueItemsTester = (array) => {
265
+ return array.every((item) => {
266
+ return array.filter((target) => target === item).length === 1;
267
+ });
268
+ };
269
+ exports.uniqueItemsTester = uniqueItemsTester;
270
+ const regExpTester = (value) => {
271
+ return value instanceof RegExp;
272
+ };
273
+ exports.regExpTester = regExpTester;
269
274
  //# sourceMappingURL=tester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tester.js","sourceRoot":"","sources":["../../src/tester.ts"],"names":[],"mappings":"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"}