@carecard/validate 3.18.0 → 3.20.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/.agents/skills/carecard-workspace-standards/SKILL.md +49 -20
- package/.agents/skills/github-pr-create-update/SKILL.md +22 -1
- package/.agents/skills/github-pr-merge-cleanup/SKILL.md +22 -1
- package/.agents/skills/logged-in-user-profile-page/SKILL.md +22 -1
- package/.agents/skills/pkg-publish/SKILL.md +22 -1
- package/.agents/skills/pkg-validate-coding-standards-and-best-practices/SKILL.md +47 -9
- package/.agents/skills/pkg-validate-validation-library/SKILL.md +45 -14
- package/.agents/skills/software-design-patterns-and-clean-code/SKILL.md +23 -3
- package/.codex/AGENTS.md +41 -10
- package/.github/workflows/auto-draft-pr.yml +173 -151
- package/.github/workflows/ci.yml +35 -32
- package/.husky/pre-commit +4 -4
- package/.prettierrc.js +10 -9
- package/AGENTS.md +19 -0
- package/eslint.config.mjs +60 -8
- package/index.d.ts +108 -107
- package/index.js +6 -6
- package/lib/validate.js +262 -158
- package/lib/validateNewUserRoleRequest.js +86 -60
- package/lib/validateProperties.js +326 -326
- package/lib/validateWhitelistProperties.js +182 -142
- package/lint-staged.config.mjs +36 -0
- package/package.json +66 -60
- package/readme.md +22 -1
- package/scripts/canonicalTestCommand.test.mjs +32 -0
- package/scripts/packageTaskRunner.audit.mjs +37 -0
- package/scripts/packageTaskRunner.test.mjs +50 -72
- package/scripts/runPackageTask.mjs +103 -58
- package/scripts/testOrder/randomizeTestOrder.cjs +35 -25
- package/scripts/testOrder/randomizeTestOrder.test.mjs +19 -19
- package/scripts/testOrder/testOrderPolicy.audit.mjs +54 -0
- package/scripts/testParallel/parallelTestPolicy.audit.mjs +63 -0
- package/scripts/testParallel/runIndexedMochaTests.cjs +45 -43
- package/scripts/testParallel/runIndexedMochaTests.test.mjs +13 -7
- package/scripts/testOrder/testOrderPolicy.test.mjs +0 -48
- package/scripts/testParallel/parallelTestPolicy.test.mjs +0 -43
package/lib/validate.js
CHANGED
|
@@ -1,279 +1,383 @@
|
|
|
1
1
|
const isImageUrl = imageUrl => {
|
|
2
|
-
|
|
2
|
+
if (
|
|
3
|
+
imageUrl === undefined ||
|
|
4
|
+
typeof imageUrl !== 'string' ||
|
|
5
|
+
imageUrl.length === 0 ||
|
|
6
|
+
imageUrl.length > 2048
|
|
7
|
+
) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
3
10
|
|
|
4
|
-
|
|
5
|
-
|
|
11
|
+
const imageUrlRegex = /^[a-zA-Z0-9-_./]+$/;
|
|
12
|
+
return imageUrlRegex.test(imageUrl);
|
|
6
13
|
};
|
|
7
14
|
|
|
8
15
|
const isInteger = number => {
|
|
9
|
-
|
|
16
|
+
return Number.isInteger(number);
|
|
10
17
|
};
|
|
11
18
|
|
|
19
|
+
// Pattern: Predicate - reports whether a bounded string contains a JSON object or array.
|
|
12
20
|
const isValidJsonString = str => {
|
|
13
|
-
|
|
21
|
+
if (str === undefined || typeof str !== 'string' || str.length === 0 || str.length > 10000) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
14
24
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
25
|
+
try {
|
|
26
|
+
const json = JSON.parse(str);
|
|
27
|
+
return typeof json === 'object' && json !== null;
|
|
28
|
+
} catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
22
31
|
};
|
|
23
32
|
|
|
24
33
|
const isValidIntegerString = str => {
|
|
25
|
-
|
|
26
|
-
return
|
|
34
|
+
if (str === undefined || typeof str !== 'string' || str.length === 0 || str.length > 20) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
return /^\d+$/.test(str);
|
|
27
38
|
};
|
|
28
39
|
|
|
29
40
|
const isValidUuidString = str => {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
41
|
+
if (str === undefined || typeof str !== 'string' || str.length === 0) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
45
|
+
return uuidRegex.test(str);
|
|
33
46
|
};
|
|
34
47
|
|
|
35
48
|
const isCcIdString = str => {
|
|
36
|
-
|
|
37
|
-
return
|
|
49
|
+
if (typeof str !== 'string') {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
return /^[a-z0-9]{8}$/.test(str);
|
|
38
53
|
};
|
|
39
54
|
|
|
40
55
|
const isCharactersString = str => {
|
|
41
|
-
|
|
42
|
-
return
|
|
56
|
+
if (str === undefined || typeof str !== 'string' || str.length === 0 || str.length > 1000) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return /^[\da-zA-Z _-]+$/.test(str);
|
|
43
60
|
};
|
|
44
61
|
|
|
45
62
|
const isStreetString = str => {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
63
|
+
if (typeof str !== 'string' || str.trim().length === 0 || str.length > 1000) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
const value = str.trim();
|
|
67
|
+
const streetRegex = /^(?![,_-])[0-9a-zA-Z\s,./#-]+$/;
|
|
68
|
+
return streetRegex.test(value);
|
|
52
69
|
};
|
|
53
70
|
|
|
54
71
|
const isNameString = str => {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
72
|
+
if (typeof str !== 'string' || str.length === 0 || str.length > 1000) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return /^[A-Za-z][0-9a-zA-Z-_.,'() ]+$/.test(str.trim());
|
|
59
76
|
};
|
|
60
77
|
|
|
61
78
|
const isSafeSearchString = str => {
|
|
62
|
-
|
|
63
|
-
return
|
|
79
|
+
if (typeof str !== 'string' || str.length === 0) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
return /^[A-Za-z][0-9a-zA-Z\-_.,'()@ ]{1,100}$/.test(str.trim());
|
|
64
83
|
};
|
|
65
84
|
|
|
66
85
|
const isEmailString = email => {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
86
|
+
if (typeof email !== 'string' || email.length === 0 || email.length > 320) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
// Simplified safe email regex
|
|
90
|
+
const regExpEmail =
|
|
91
|
+
/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-zA-Z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/;
|
|
92
|
+
return regExpEmail.test(email);
|
|
74
93
|
};
|
|
75
94
|
|
|
76
95
|
const isJwtString = jwt => {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
96
|
+
if (typeof jwt !== 'string' || jwt.length === 0 || jwt.length > 8192 || jwt.trim() === '') {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
const jwtRegex = /^eyJ[a-zA-Z0-9-_.]+$/;
|
|
100
|
+
return jwtRegex.test(jwt);
|
|
80
101
|
};
|
|
81
102
|
|
|
82
103
|
const isPasswordString = password => {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
104
|
+
if (typeof password !== 'string' || password.length === 0 || password.length > 128) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
const regExPassword = /^(?=.*[a-zA-Z0-9])(?=.*[!@#$%^&*_-])[a-zA-Z0-9!@#$%^&*_-]{6,32}$/;
|
|
108
|
+
return regExPassword.test(String(password));
|
|
86
109
|
};
|
|
87
110
|
|
|
88
111
|
const isSimplePasswordString = password => {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
112
|
+
if (typeof password !== 'string' || password.length === 0 || password.length > 128) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
const regExPassword = /^[a-zA-Z0-9!@#$%^&*_-]{6,32}$/;
|
|
116
|
+
return regExPassword.test(String(password));
|
|
92
117
|
};
|
|
93
118
|
|
|
94
119
|
const isPasswordStringFailureMessage = password => {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
120
|
+
if (!isPasswordString(password)) {
|
|
121
|
+
return 'Total 6 to 32 characters, numbers and one of !@#$%^&*_-';
|
|
122
|
+
} else {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
100
125
|
};
|
|
101
126
|
|
|
102
127
|
const isSimplePasswordStringFailureMessage = password => {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
128
|
+
if (!isSimplePasswordString(password)) {
|
|
129
|
+
return 'Total 6 to 32 characters, numbers or !@#$%^&*_-';
|
|
130
|
+
} else {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
108
133
|
};
|
|
109
134
|
|
|
110
135
|
const isUsernameString = str => {
|
|
111
|
-
|
|
112
|
-
return
|
|
136
|
+
if (typeof str !== 'string' || str.length === 0 || str.length > 200) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
return /^[0-9a-zA-Z]+$/.test(str);
|
|
113
140
|
};
|
|
114
141
|
|
|
115
142
|
function isPhoneNumber(str) {
|
|
116
|
-
|
|
117
|
-
return
|
|
143
|
+
if (typeof str !== 'string' || str.length === 0 || str.length > 20) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
return /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/.test(str);
|
|
118
147
|
}
|
|
119
148
|
|
|
120
149
|
const isUrlSafeString = inputString => {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
150
|
+
if (
|
|
151
|
+
typeof inputString !== 'string' ||
|
|
152
|
+
inputString.length === 0 ||
|
|
153
|
+
inputString.length > 2048 ||
|
|
154
|
+
inputString.trim() === ''
|
|
155
|
+
) {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
const urlSafeRegex = /^[a-zA-Z0-9-_.]+$/;
|
|
159
|
+
return urlSafeRegex.test(inputString);
|
|
124
160
|
};
|
|
125
161
|
|
|
126
162
|
const isString6To24CharacterLong = password => {
|
|
127
|
-
|
|
128
|
-
return
|
|
163
|
+
if (typeof password !== 'string' || password.length === 0) {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
return 6 <= password.length && password.length <= 24;
|
|
129
167
|
};
|
|
130
168
|
|
|
131
169
|
const isString6To16CharacterLong = password => {
|
|
132
|
-
|
|
133
|
-
return
|
|
170
|
+
if (typeof password !== 'string' || password.length === 0) {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
return 6 <= password.length && password.length <= 16;
|
|
134
174
|
};
|
|
135
175
|
|
|
136
176
|
const isProvinceString = inputString => {
|
|
137
|
-
|
|
177
|
+
const provinces = ['on', 'qc'];
|
|
138
178
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
179
|
+
if (isNameString(inputString)) {
|
|
180
|
+
return provinces.includes(inputString.toLowerCase().trim());
|
|
181
|
+
}
|
|
142
182
|
|
|
143
|
-
|
|
183
|
+
return false;
|
|
144
184
|
};
|
|
145
185
|
|
|
146
186
|
const isBoolValue = inputValue => {
|
|
147
|
-
|
|
187
|
+
return typeof inputValue === 'boolean' || inputValue === 'true' || inputValue === 'false';
|
|
148
188
|
};
|
|
149
189
|
|
|
150
190
|
const isPostalCodeString = inputString => {
|
|
151
|
-
|
|
191
|
+
const postalCodeRegex = /^(?!.*[DFIOQU])[A-VXY][0-9][A-Z] ?[0-9][A-Z][0-9]$/i;
|
|
152
192
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
193
|
+
if (isNameString(inputString)) {
|
|
194
|
+
return postalCodeRegex.test(inputString.trim());
|
|
195
|
+
}
|
|
156
196
|
|
|
157
|
-
|
|
197
|
+
return false;
|
|
158
198
|
};
|
|
159
199
|
|
|
160
200
|
const isSafeString = str => {
|
|
161
|
-
|
|
162
|
-
return
|
|
201
|
+
if (typeof str !== 'string' || str.length === 0 || str.length > 10000) {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
return /^[\da-zA-Z-_.,#*'()[\]: ]+$/.test(str);
|
|
163
205
|
};
|
|
164
206
|
|
|
165
207
|
const isTextString = str => {
|
|
166
|
-
|
|
208
|
+
return typeof str === 'string' && str.length > 0 && str.length <= 10000;
|
|
167
209
|
};
|
|
168
210
|
|
|
169
211
|
const isInStringArray = (StringArray, inputString) => {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
212
|
+
if (isNameString(inputString)) {
|
|
213
|
+
return StringArray.includes(inputString.toLowerCase().trim());
|
|
214
|
+
}
|
|
173
215
|
|
|
174
|
-
|
|
216
|
+
return false;
|
|
175
217
|
};
|
|
176
218
|
|
|
177
219
|
const isUserRoleRequestStatusString = inputString => {
|
|
178
|
-
|
|
179
|
-
|
|
220
|
+
const statuses = [
|
|
221
|
+
'pending',
|
|
222
|
+
'approved',
|
|
223
|
+
'rejected',
|
|
224
|
+
'cancelled',
|
|
225
|
+
'expired',
|
|
226
|
+
'hidden',
|
|
227
|
+
'on_hold',
|
|
228
|
+
'in_progress',
|
|
229
|
+
'info_needed',
|
|
230
|
+
];
|
|
231
|
+
return isInStringArray(statuses, inputString);
|
|
180
232
|
};
|
|
181
233
|
|
|
182
234
|
const isUserRoleRequestRoleString = inputString => {
|
|
183
|
-
|
|
184
|
-
|
|
235
|
+
const roles = ['student', 'intern', 'volunteer'];
|
|
236
|
+
return typeof inputString === 'string' && roles.includes(inputString.trim().toLowerCase());
|
|
185
237
|
};
|
|
186
238
|
|
|
187
239
|
const isCountryCodeString = str => {
|
|
188
|
-
|
|
240
|
+
if (typeof str !== 'string' || str.length === 0 || str.length > 4) {
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
189
243
|
|
|
190
|
-
|
|
244
|
+
const countryCodeRegex = /^\+[1-9][0-9]{0,2}$/;
|
|
191
245
|
|
|
192
|
-
|
|
246
|
+
return countryCodeRegex.test(str);
|
|
193
247
|
};
|
|
194
248
|
|
|
195
249
|
const isValidDomainName = domain => {
|
|
196
|
-
|
|
250
|
+
if (typeof domain !== 'string' || domain.length === 0 || domain.length > 253) {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
const domainRegex =
|
|
255
|
+
/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$/i;
|
|
256
|
+
return domainRegex.test(domain);
|
|
257
|
+
};
|
|
197
258
|
|
|
198
|
-
|
|
199
|
-
|
|
259
|
+
// Pattern: Pure Function - validates calendar and clock fields without Date.parse normalization.
|
|
260
|
+
const hasValidTimestampFields = match => {
|
|
261
|
+
if (!match) {
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
const [, year, month, day, hour, minute, second] = match;
|
|
265
|
+
return (
|
|
266
|
+
isValidCalendarDate(Number(year), Number(month), Number(day)) &&
|
|
267
|
+
Number(hour) <= 23 &&
|
|
268
|
+
Number(minute) <= 59 &&
|
|
269
|
+
Number(second) <= 59
|
|
270
|
+
);
|
|
200
271
|
};
|
|
201
272
|
|
|
273
|
+
// Pattern: Pure Function - validates the numeric UTC offset carried by a timestamp.
|
|
274
|
+
const hasValidTimestampOffset = match => {
|
|
275
|
+
const zone = match?.[7];
|
|
276
|
+
return zone === 'Z' || (Number(match?.[8]) <= 23 && Number(match?.[9]) <= 59);
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
// Pattern: Predicate - accepts only real ISO timestamps with an explicit time zone.
|
|
202
280
|
const isValidTimestampzString = str => {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
281
|
+
if (typeof str !== 'string' || str.length === 0 || str.length > 64) {
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
284
|
+
// ISO 8601 for UTC or with Offset: 2023-10-27T10:00:00Z or 2023-10-27T10:00:00+02:00
|
|
285
|
+
const timestampzRegex =
|
|
286
|
+
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(Z|[+-](\d{2}):(\d{2}))$/;
|
|
287
|
+
const match = str.match(timestampzRegex);
|
|
288
|
+
return hasValidTimestampFields(match) && hasValidTimestampOffset(match);
|
|
207
289
|
};
|
|
208
290
|
|
|
291
|
+
// Pattern: Predicate - accepts only real ISO local timestamps without a time zone.
|
|
209
292
|
const isValidTimestampString = str => {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
293
|
+
if (typeof str !== 'string' || str.length === 0 || str.length > 64) {
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
// ISO 8601 without time zone: 2023-10-27T10:00:00 or 2023-10-27T10:00:00.123
|
|
297
|
+
const timestampRegex = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?$/;
|
|
298
|
+
return hasValidTimestampFields(str.match(timestampRegex));
|
|
214
299
|
};
|
|
215
300
|
|
|
216
|
-
|
|
217
|
-
|
|
301
|
+
// Pattern: Pure Function - validates Gregorian date fields without runtime date coercion.
|
|
302
|
+
function isValidCalendarDate(year, month, day) {
|
|
303
|
+
if (year < 1 || month < 1 || month > 12 || day < 1) {
|
|
304
|
+
return false;
|
|
305
|
+
}
|
|
306
|
+
const leapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
|
|
307
|
+
const monthLengths = [31, leapYear ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
308
|
+
return day <= monthLengths[month - 1];
|
|
309
|
+
}
|
|
218
310
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
311
|
+
// Pattern: Predicate - accepts only real Gregorian dates in YYYY-MM-DD form.
|
|
312
|
+
const isValidDateString = str => {
|
|
313
|
+
if (typeof str !== 'string' || str.length === 0 || str.length > 10) {
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
222
316
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
317
|
+
const dateRegex = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
318
|
+
const match = str.match(dateRegex);
|
|
319
|
+
if (!match) {
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
227
322
|
|
|
228
|
-
|
|
323
|
+
const year = Number(match[1]);
|
|
324
|
+
const month = Number(match[2]);
|
|
325
|
+
const day = Number(match[3]);
|
|
326
|
+
return isValidCalendarDate(year, month, day);
|
|
229
327
|
};
|
|
230
328
|
|
|
231
329
|
const isValidUrl = url => {
|
|
232
|
-
|
|
233
|
-
|
|
330
|
+
if (typeof url !== 'string' || url.length === 0 || url.length > 2048) {
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
if (!URL.canParse(url)) {
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
234
336
|
|
|
235
|
-
|
|
236
|
-
|
|
337
|
+
const parsedUrl = new URL(url);
|
|
338
|
+
return parsedUrl.protocol === 'http:' || parsedUrl.protocol === 'https:';
|
|
237
339
|
};
|
|
238
340
|
const isValidArrayOfStrings = arr => {
|
|
239
|
-
|
|
240
|
-
return
|
|
341
|
+
if (!Array.isArray(arr)) {
|
|
342
|
+
return false;
|
|
343
|
+
}
|
|
344
|
+
return arr.every(isSafeString);
|
|
241
345
|
};
|
|
242
346
|
module.exports = {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
347
|
+
isImageUrl,
|
|
348
|
+
isInteger,
|
|
349
|
+
isValidJsonString,
|
|
350
|
+
isValidIntegerString,
|
|
351
|
+
isValidUuidString,
|
|
352
|
+
isCcIdString,
|
|
353
|
+
isCharactersString,
|
|
354
|
+
isStreetString,
|
|
355
|
+
isNameString,
|
|
356
|
+
isSafeSearchString,
|
|
357
|
+
isEmailString,
|
|
358
|
+
isJwtString,
|
|
359
|
+
isPasswordString,
|
|
360
|
+
isSimplePasswordString,
|
|
361
|
+
isPasswordStringFailureMessage,
|
|
362
|
+
isSimplePasswordStringFailureMessage,
|
|
363
|
+
isUsernameString,
|
|
364
|
+
isPhoneNumber,
|
|
365
|
+
isUrlSafeString,
|
|
366
|
+
isString6To24CharacterLong,
|
|
367
|
+
isString6To16CharacterLong,
|
|
368
|
+
isProvinceString,
|
|
369
|
+
isBoolValue,
|
|
370
|
+
isPostalCodeString,
|
|
371
|
+
isSafeString,
|
|
372
|
+
isTextString,
|
|
373
|
+
isInStringArray,
|
|
374
|
+
isUserRoleRequestStatusString,
|
|
375
|
+
isUserRoleRequestRoleString,
|
|
376
|
+
isCountryCodeString,
|
|
377
|
+
isValidDomainName,
|
|
378
|
+
isValidTimestampzString,
|
|
379
|
+
isValidTimestampString,
|
|
380
|
+
isValidDateString,
|
|
381
|
+
isValidUrl,
|
|
382
|
+
isValidArrayOfStrings,
|
|
279
383
|
};
|