(candidate: string, rule: KeyRule)
| 293 | } |
| 294 | |
| 295 | function matchesRule(candidate: string, rule: KeyRule): boolean { |
| 296 | candidate = candidate.toLowerCase(); |
| 297 | |
| 298 | if (rule == null) { |
| 299 | return true; |
| 300 | } |
| 301 | |
| 302 | if (typeof rule === 'string') { |
| 303 | return candidate === rule.toLowerCase(); |
| 304 | } |
| 305 | |
| 306 | const r = rule as Record<string, unknown>; |
| 307 | for (const [op, val] of Object.entries(r)) { |
| 308 | if (val === undefined) { |
| 309 | continue; |
| 310 | } |
| 311 | switch (op) { |
| 312 | case 'eq': |
| 313 | if (candidate !== String(val as string | number).toLowerCase()) |
| 314 | return false; |
| 315 | break; |
| 316 | case 'neq': |
| 317 | if (candidate === (val as string).toLowerCase()) return false; |
| 318 | break; |
| 319 | case 'inc': |
| 320 | if (!(val as string[]).some(v => candidate === v.toLowerCase())) |
| 321 | return false; |
| 322 | break; |
| 323 | case 'ninc': |
| 324 | if ((val as string[]).some(v => candidate === v.toLowerCase())) |
| 325 | return false; |
| 326 | break; |
| 327 | case 'pre': |
| 328 | if (!candidate.startsWith(String(val).toLowerCase())) return false; |
| 329 | break; |
| 330 | case 'suf': |
| 331 | if (!candidate.endsWith(String(val).toLowerCase())) return false; |
| 332 | break; |
| 333 | case 'sub': |
| 334 | if (!candidate.includes(String(val).toLowerCase())) return false; |
| 335 | break; |
| 336 | case 'gt': |
| 337 | if (!(Number(candidate) > (val as number))) return false; |
| 338 | break; |
| 339 | case 'gte': |
| 340 | if (!(Number(candidate) >= (val as number))) return false; |
| 341 | break; |
| 342 | case 'lt': |
| 343 | if (!(Number(candidate) < (val as number))) return false; |
| 344 | break; |
| 345 | case 'lte': |
| 346 | if (!(Number(candidate) <= (val as number))) return false; |
| 347 | break; |
| 348 | default: |
| 349 | break; |
| 350 | } |
| 351 | } |
| 352 | return true; |
no outgoing calls
no test coverage detected