@carecard/validate 3.18.0 → 3.19.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 (36) hide show
  1. package/.agents/skills/carecard-workspace-standards/SKILL.md +49 -20
  2. package/.agents/skills/github-pr-create-update/SKILL.md +22 -1
  3. package/.agents/skills/github-pr-merge-cleanup/SKILL.md +22 -1
  4. package/.agents/skills/logged-in-user-profile-page/SKILL.md +22 -1
  5. package/.agents/skills/pkg-publish/SKILL.md +22 -1
  6. package/.agents/skills/pkg-validate-coding-standards-and-best-practices/SKILL.md +47 -9
  7. package/.agents/skills/pkg-validate-validation-library/SKILL.md +45 -14
  8. package/.agents/skills/software-design-patterns-and-clean-code/SKILL.md +23 -3
  9. package/.codex/AGENTS.md +41 -10
  10. package/.github/workflows/auto-draft-pr.yml +173 -151
  11. package/.github/workflows/ci.yml +35 -32
  12. package/.husky/pre-commit +4 -4
  13. package/.prettierrc.js +10 -9
  14. package/AGENTS.md +19 -0
  15. package/eslint.config.mjs +60 -8
  16. package/index.d.ts +108 -107
  17. package/index.js +6 -6
  18. package/lib/validate.js +230 -157
  19. package/lib/validateNewUserRoleRequest.js +68 -60
  20. package/lib/validateProperties.js +326 -326
  21. package/lib/validateWhitelistProperties.js +182 -142
  22. package/lint-staged.config.mjs +36 -0
  23. package/package.json +66 -60
  24. package/readme.md +22 -1
  25. package/scripts/canonicalTestCommand.test.mjs +32 -0
  26. package/scripts/packageTaskRunner.audit.mjs +37 -0
  27. package/scripts/packageTaskRunner.test.mjs +50 -72
  28. package/scripts/runPackageTask.mjs +103 -58
  29. package/scripts/testOrder/randomizeTestOrder.cjs +35 -25
  30. package/scripts/testOrder/randomizeTestOrder.test.mjs +19 -19
  31. package/scripts/testOrder/testOrderPolicy.audit.mjs +54 -0
  32. package/scripts/testParallel/parallelTestPolicy.audit.mjs +63 -0
  33. package/scripts/testParallel/runIndexedMochaTests.cjs +45 -43
  34. package/scripts/testParallel/runIndexedMochaTests.test.mjs +13 -7
  35. package/scripts/testOrder/testOrderPolicy.test.mjs +0 -48
  36. package/scripts/testParallel/parallelTestPolicy.test.mjs +0 -43
@@ -1,340 +1,340 @@
1
1
  // Validate the property values format.
2
2
  const {
3
- isEmailString,
4
- isPhoneNumber,
5
- isUrlSafeString,
6
- isValidUuidString,
7
- isCcIdString,
8
- isSimplePasswordString,
9
- isPasswordString,
10
- isString6To16CharacterLong,
11
- isNameString,
12
- isSafeSearchString,
13
- isCharactersString,
14
- isValidIntegerString,
15
- isValidJsonString,
16
- isImageUrl,
17
- isValidDomainName,
18
- isValidTimestampzString,
19
- isValidTimestampString,
20
- isValidDateString,
21
- isBoolValue,
22
- isValidUrl,
23
- isValidArrayOfStrings,
24
- isStreetString,
25
- isTextString,
26
- isUserRoleRequestStatusString,
27
- isUserRoleRequestRoleString,
28
- isCountryCodeString,
3
+ isEmailString,
4
+ isPhoneNumber,
5
+ isUrlSafeString,
6
+ isValidUuidString,
7
+ isCcIdString,
8
+ isSimplePasswordString,
9
+ isPasswordString,
10
+ isString6To16CharacterLong,
11
+ isNameString,
12
+ isSafeSearchString,
13
+ isCharactersString,
14
+ isValidIntegerString,
15
+ isValidJsonString,
16
+ isImageUrl,
17
+ isValidDomainName,
18
+ isValidTimestampzString,
19
+ isValidTimestampString,
20
+ isValidDateString,
21
+ isBoolValue,
22
+ isValidUrl,
23
+ isValidArrayOfStrings,
24
+ isStreetString,
25
+ isTextString,
26
+ isUserRoleRequestStatusString,
27
+ isUserRoleRequestRoleString,
28
+ isCountryCodeString,
29
29
  } = require('./validate');
30
30
 
31
31
  function validateProperties(obj = {}) {
32
- const returnObj = {};
32
+ const returnObj = {};
33
33
 
34
- for (const [key, value] of Object.entries(obj || {})) {
35
- switch (key) {
36
- case 'first_name':
37
- case 'firstName':
38
- case 'last_name':
39
- case 'lastName':
40
- case 'username':
41
- case 'new_status':
42
- case 'newStatus':
43
- case 'description':
44
- case 'comment':
45
- case 'status':
46
- case 'name':
47
- case 'title':
48
- case 'brand':
49
- case 'short_description':
50
- case 'shortDescription':
51
- case 'college_name':
52
- case 'collegeName':
53
- case 'campus_name':
54
- case 'campusName':
55
- case 'role':
56
- case 'role_id':
57
- case 'roleId':
58
- case 'campus':
59
- case 'institution_name':
60
- case 'institutionName':
61
- case 'program_name':
62
- case 'programName':
63
- case 'role_name':
64
- case 'roleName':
65
- case 'document_name':
66
- case 'documentName':
67
- case 'document_required_for_role_name':
68
- case 'documentRequiredForRoleName':
69
- case 'reason':
70
- case 'entity_type':
71
- case 'entityType':
72
- case 'action_type':
73
- case 'actionType':
74
- case 'approved_by_role':
75
- case 'approvedByRole':
76
- case 'city':
77
- case 'state':
78
- case 'country':
79
- case 'type':
80
- if (isNameString(value)) {
81
- returnObj[key] = value;
82
- }
83
- break;
84
- case 'street':
85
- if (isStreetString(value)) {
86
- returnObj[key] = value;
87
- }
88
- break;
89
- case 'postal_code':
90
- case 'postalCode':
91
- if (isCharactersString(value)) {
92
- returnObj[key] = value;
93
- }
94
- break;
34
+ for (const [key, value] of Object.entries(obj || {})) {
35
+ switch (key) {
36
+ case 'first_name':
37
+ case 'firstName':
38
+ case 'last_name':
39
+ case 'lastName':
40
+ case 'username':
41
+ case 'new_status':
42
+ case 'newStatus':
43
+ case 'description':
44
+ case 'comment':
45
+ case 'status':
46
+ case 'name':
47
+ case 'title':
48
+ case 'brand':
49
+ case 'short_description':
50
+ case 'shortDescription':
51
+ case 'college_name':
52
+ case 'collegeName':
53
+ case 'campus_name':
54
+ case 'campusName':
55
+ case 'role':
56
+ case 'role_id':
57
+ case 'roleId':
58
+ case 'campus':
59
+ case 'institution_name':
60
+ case 'institutionName':
61
+ case 'program_name':
62
+ case 'programName':
63
+ case 'role_name':
64
+ case 'roleName':
65
+ case 'document_name':
66
+ case 'documentName':
67
+ case 'document_required_for_role_name':
68
+ case 'documentRequiredForRoleName':
69
+ case 'reason':
70
+ case 'entity_type':
71
+ case 'entityType':
72
+ case 'action_type':
73
+ case 'actionType':
74
+ case 'approved_by_role':
75
+ case 'approvedByRole':
76
+ case 'city':
77
+ case 'state':
78
+ case 'country':
79
+ case 'type':
80
+ if (isNameString(value)) {
81
+ returnObj[key] = value;
82
+ }
83
+ break;
84
+ case 'street':
85
+ if (isStreetString(value)) {
86
+ returnObj[key] = value;
87
+ }
88
+ break;
89
+ case 'postal_code':
90
+ case 'postalCode':
91
+ if (isCharactersString(value)) {
92
+ returnObj[key] = value;
93
+ }
94
+ break;
95
95
 
96
- case 'is_primary':
97
- case 'isPrimary':
98
- case 'document_optional':
99
- case 'documentOptional':
100
- if (isBoolValue(value)) {
101
- returnObj[key] = value;
102
- }
103
- break;
104
- case 'search_string':
105
- case 'searchString':
106
- if (isSafeSearchString(value)) {
107
- returnObj[key] = value;
108
- }
109
- break;
110
- case 'password':
111
- case 'new_password':
112
- case 'newPassword':
113
- if (isString6To16CharacterLong(value) && isSimplePasswordString(value)) {
114
- returnObj[key] = value;
115
- }
116
- break;
117
- case 'strong_password':
118
- case 'strongPassword':
119
- if (isString6To16CharacterLong(value) && isPasswordString(value)) {
120
- returnObj[key] = value;
121
- }
122
- break;
123
- case 'email':
124
- if (isEmailString(value)) {
125
- returnObj[key] = value;
126
- }
127
- break;
128
- case 'phone_number':
129
- case 'phoneNumber':
130
- if (isPhoneNumber(value)) {
131
- returnObj[key] = value;
132
- }
133
- break;
134
- case 'country_code':
135
- case 'countryCode':
136
- if (isCountryCodeString(value)) {
137
- returnObj[key] = value;
138
- }
139
- break;
140
- case 'token':
141
- case 'email_verification_token':
142
- case 'emailVerificationToken':
143
- case 'verification_token':
144
- case 'verificationToken':
145
- if (isUrlSafeString(value)) {
146
- returnObj[key] = value;
147
- }
148
- break;
149
- case 'uuid':
150
- case 'item_id':
151
- case 'user_id':
152
- case 'address_id':
153
- case 'addressId':
154
- case 'itemId':
155
- case 'userId':
156
- case 'order_id':
157
- case 'orderId':
158
- case 'category_id':
159
- case 'categoryId':
160
- case 'parent_id':
161
- case 'parentId':
162
- case 'college_id':
163
- case 'collegeId':
164
- case 'campus_id':
165
- case 'campusId':
166
- case 'program_id':
167
- case 'programId':
168
- case 'program_term_id':
169
- case 'programTermId':
170
- case 'template_id':
171
- case 'templateId':
172
- case 'program_template_id':
173
- case 'programTemplateId':
174
- case 'user_item_id':
175
- case 'userItemId':
176
- case 'user_item_status_id':
177
- case 'userItemStatusId':
178
- case 'requirement_item_id':
179
- case 'requirementItemId':
180
- case 'program_document_id':
181
- case 'programDocumentId':
182
- case 'id':
183
- case 'institution_id':
184
- case 'institutionId':
185
- case 'role_assignment_id':
186
- case 'roleAssignmentId':
187
- case 'user_role_id':
188
- case 'userRoleId':
189
- case 'phone_number_id':
190
- case 'phoneNumberId':
191
- case 'entity_id':
192
- case 'entityId':
193
- case 'changed_by':
194
- case 'changedBy':
195
- case 'request_id':
196
- case 'requestId':
197
- case 'approved_by_user_id':
198
- case 'approvedByUserId':
199
- if (isValidUuidString(value)) {
200
- returnObj[key] = value;
201
- }
202
- break;
203
- case 'cc_id':
204
- case 'ccId':
205
- if (isCcIdString(value)) {
206
- returnObj[key] = value;
207
- }
208
- break;
209
- case 'requested_by_name':
210
- case 'requestedByName':
211
- case 'document_description':
212
- case 'documentDescription':
213
- case 'nick_name':
214
- case 'nickName':
215
- case 'requested_by_email':
216
- case 'requestedByEmail':
217
- case 'requested_by_phone':
218
- case 'requestedByPhone':
219
- case 'approved_by_name':
220
- case 'approvedByName':
221
- case 'approved_by_email':
222
- case 'approvedByEmail':
223
- case 'approved_by_phone':
224
- case 'approvedByPhone':
225
- if (isTextString(value)) {
226
- returnObj[key] = value;
227
- }
228
- break;
229
- case 'approved_status':
230
- case 'approvedStatus':
231
- if (isUserRoleRequestStatusString(value)) {
232
- returnObj[key] = value;
233
- }
234
- break;
235
- case 'user_role_request_role':
236
- case 'userRoleRequestRole':
237
- if (isUserRoleRequestRoleString(value)) {
238
- returnObj[key] = value;
239
- }
240
- break;
241
- case 'period':
242
- if (isCharactersString(value)) {
243
- returnObj[key] = value;
244
- }
245
- break;
246
- case 'offset_number':
247
- case 'offsetNumber':
248
- case 'number_of_orders':
249
- case 'numberOfOrders':
250
- case 'price':
251
- case 'from':
252
- case 'number':
253
- case 'limit':
254
- case 'offset':
255
- if (isValidIntegerString(value)) {
256
- returnObj[key] = value;
257
- }
258
- break;
259
- case 'about':
260
- if (isValidJsonString(value)) {
261
- returnObj[key] = value;
262
- }
263
- break;
264
- case 'weight':
265
- case 'dimensions':
266
- case 'permission':
267
- case 'scope_data':
268
- case 'scopeData':
269
- case 'meta_data':
270
- case 'metaData':
271
- case 'metadata':
272
- if (isValidJsonString(JSON.stringify(value))) {
273
- returnObj[key] = value;
274
- }
275
- break;
276
- case 'aliases':
277
- if (isValidArrayOfStrings(value)) {
278
- returnObj[key] = value;
279
- }
280
- break;
281
- case 'image_url':
282
- case 'imageUrl':
283
- case 'website':
284
- case 'file_url':
285
- case 'fileUrl':
286
- if (isImageUrl(value) || isValidUrl(value)) {
287
- returnObj[key] = value;
288
- }
289
- break;
290
- case 'domain_name':
291
- case 'domainName':
292
- case 'domain':
293
- case 'email_domain':
294
- case 'emailDomain':
295
- case 'email_domain_name':
296
- case 'emailDomainName':
297
- if (isValidDomainName(value)) {
298
- returnObj[key] = value;
299
- }
300
- break;
301
- case 'expires_at':
302
- case 'expiresAt':
303
- case 'starts_at':
304
- case 'startsAt':
305
- case 'start_time':
306
- case 'startTime':
307
- case 'end_time':
308
- case 'endTime':
309
- case 'approved_at':
310
- case 'approvedAt':
311
- if (isValidTimestampzString(value) || isValidTimestampString(value)) {
312
- returnObj[key] = value;
313
- }
314
- break;
315
- case 'effective_start_date':
316
- case 'effectiveStartDate':
317
- case 'effective_end_date':
318
- case 'effectiveEndDate':
319
- case 'valid_until_date':
320
- case 'validUntilDate':
321
- case 'renew_date':
322
- case 'renewDate':
323
- if (isValidDateString(value)) {
324
- returnObj[key] = value;
325
- }
326
- break;
327
- case 'active':
328
- if (isBoolValue(value)) {
329
- returnObj[key] = value;
330
- }
331
- break;
96
+ case 'is_primary':
97
+ case 'isPrimary':
98
+ case 'document_optional':
99
+ case 'documentOptional':
100
+ if (isBoolValue(value)) {
101
+ returnObj[key] = value;
102
+ }
103
+ break;
104
+ case 'search_string':
105
+ case 'searchString':
106
+ if (isSafeSearchString(value)) {
107
+ returnObj[key] = value;
108
+ }
109
+ break;
110
+ case 'password':
111
+ case 'new_password':
112
+ case 'newPassword':
113
+ if (isString6To16CharacterLong(value) && isSimplePasswordString(value)) {
114
+ returnObj[key] = value;
115
+ }
116
+ break;
117
+ case 'strong_password':
118
+ case 'strongPassword':
119
+ if (isString6To16CharacterLong(value) && isPasswordString(value)) {
120
+ returnObj[key] = value;
121
+ }
122
+ break;
123
+ case 'email':
124
+ if (isEmailString(value)) {
125
+ returnObj[key] = value;
126
+ }
127
+ break;
128
+ case 'phone_number':
129
+ case 'phoneNumber':
130
+ if (isPhoneNumber(value)) {
131
+ returnObj[key] = value;
132
+ }
133
+ break;
134
+ case 'country_code':
135
+ case 'countryCode':
136
+ if (isCountryCodeString(value)) {
137
+ returnObj[key] = value;
138
+ }
139
+ break;
140
+ case 'token':
141
+ case 'email_verification_token':
142
+ case 'emailVerificationToken':
143
+ case 'verification_token':
144
+ case 'verificationToken':
145
+ if (isUrlSafeString(value)) {
146
+ returnObj[key] = value;
147
+ }
148
+ break;
149
+ case 'uuid':
150
+ case 'item_id':
151
+ case 'user_id':
152
+ case 'address_id':
153
+ case 'addressId':
154
+ case 'itemId':
155
+ case 'userId':
156
+ case 'order_id':
157
+ case 'orderId':
158
+ case 'category_id':
159
+ case 'categoryId':
160
+ case 'parent_id':
161
+ case 'parentId':
162
+ case 'college_id':
163
+ case 'collegeId':
164
+ case 'campus_id':
165
+ case 'campusId':
166
+ case 'program_id':
167
+ case 'programId':
168
+ case 'program_term_id':
169
+ case 'programTermId':
170
+ case 'template_id':
171
+ case 'templateId':
172
+ case 'program_template_id':
173
+ case 'programTemplateId':
174
+ case 'user_item_id':
175
+ case 'userItemId':
176
+ case 'user_item_status_id':
177
+ case 'userItemStatusId':
178
+ case 'requirement_item_id':
179
+ case 'requirementItemId':
180
+ case 'program_document_id':
181
+ case 'programDocumentId':
182
+ case 'id':
183
+ case 'institution_id':
184
+ case 'institutionId':
185
+ case 'role_assignment_id':
186
+ case 'roleAssignmentId':
187
+ case 'user_role_id':
188
+ case 'userRoleId':
189
+ case 'phone_number_id':
190
+ case 'phoneNumberId':
191
+ case 'entity_id':
192
+ case 'entityId':
193
+ case 'changed_by':
194
+ case 'changedBy':
195
+ case 'request_id':
196
+ case 'requestId':
197
+ case 'approved_by_user_id':
198
+ case 'approvedByUserId':
199
+ if (isValidUuidString(value)) {
200
+ returnObj[key] = value;
201
+ }
202
+ break;
203
+ case 'cc_id':
204
+ case 'ccId':
205
+ if (isCcIdString(value)) {
206
+ returnObj[key] = value;
207
+ }
208
+ break;
209
+ case 'requested_by_name':
210
+ case 'requestedByName':
211
+ case 'document_description':
212
+ case 'documentDescription':
213
+ case 'nick_name':
214
+ case 'nickName':
215
+ case 'requested_by_email':
216
+ case 'requestedByEmail':
217
+ case 'requested_by_phone':
218
+ case 'requestedByPhone':
219
+ case 'approved_by_name':
220
+ case 'approvedByName':
221
+ case 'approved_by_email':
222
+ case 'approvedByEmail':
223
+ case 'approved_by_phone':
224
+ case 'approvedByPhone':
225
+ if (isTextString(value)) {
226
+ returnObj[key] = value;
227
+ }
228
+ break;
229
+ case 'approved_status':
230
+ case 'approvedStatus':
231
+ if (isUserRoleRequestStatusString(value)) {
232
+ returnObj[key] = value;
233
+ }
234
+ break;
235
+ case 'user_role_request_role':
236
+ case 'userRoleRequestRole':
237
+ if (isUserRoleRequestRoleString(value)) {
238
+ returnObj[key] = value;
239
+ }
240
+ break;
241
+ case 'period':
242
+ if (isCharactersString(value)) {
243
+ returnObj[key] = value;
244
+ }
245
+ break;
246
+ case 'offset_number':
247
+ case 'offsetNumber':
248
+ case 'number_of_orders':
249
+ case 'numberOfOrders':
250
+ case 'price':
251
+ case 'from':
252
+ case 'number':
253
+ case 'limit':
254
+ case 'offset':
255
+ if (isValidIntegerString(value)) {
256
+ returnObj[key] = value;
257
+ }
258
+ break;
259
+ case 'about':
260
+ if (isValidJsonString(value)) {
261
+ returnObj[key] = value;
262
+ }
263
+ break;
264
+ case 'weight':
265
+ case 'dimensions':
266
+ case 'permission':
267
+ case 'scope_data':
268
+ case 'scopeData':
269
+ case 'meta_data':
270
+ case 'metaData':
271
+ case 'metadata':
272
+ if (isValidJsonString(JSON.stringify(value))) {
273
+ returnObj[key] = value;
274
+ }
275
+ break;
276
+ case 'aliases':
277
+ if (isValidArrayOfStrings(value)) {
278
+ returnObj[key] = value;
279
+ }
280
+ break;
281
+ case 'image_url':
282
+ case 'imageUrl':
283
+ case 'website':
284
+ case 'file_url':
285
+ case 'fileUrl':
286
+ if (isImageUrl(value) || isValidUrl(value)) {
287
+ returnObj[key] = value;
288
+ }
289
+ break;
290
+ case 'domain_name':
291
+ case 'domainName':
292
+ case 'domain':
293
+ case 'email_domain':
294
+ case 'emailDomain':
295
+ case 'email_domain_name':
296
+ case 'emailDomainName':
297
+ if (isValidDomainName(value)) {
298
+ returnObj[key] = value;
299
+ }
300
+ break;
301
+ case 'expires_at':
302
+ case 'expiresAt':
303
+ case 'starts_at':
304
+ case 'startsAt':
305
+ case 'start_time':
306
+ case 'startTime':
307
+ case 'end_time':
308
+ case 'endTime':
309
+ case 'approved_at':
310
+ case 'approvedAt':
311
+ if (isValidTimestampzString(value) || isValidTimestampString(value)) {
312
+ returnObj[key] = value;
313
+ }
314
+ break;
315
+ case 'effective_start_date':
316
+ case 'effectiveStartDate':
317
+ case 'effective_end_date':
318
+ case 'effectiveEndDate':
319
+ case 'valid_until_date':
320
+ case 'validUntilDate':
321
+ case 'renew_date':
322
+ case 'renewDate':
323
+ if (isValidDateString(value)) {
324
+ returnObj[key] = value;
325
+ }
326
+ break;
327
+ case 'active':
328
+ if (isBoolValue(value)) {
329
+ returnObj[key] = value;
332
330
  }
331
+ break;
333
332
  }
333
+ }
334
334
 
335
- return returnObj;
335
+ return returnObj;
336
336
  }
337
337
 
338
338
  module.exports = {
339
- validateProperties,
339
+ validateProperties,
340
340
  };