@opensip-cli/checks-typescript 0.1.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 (404) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +8 -0
  3. package/README.md +31 -0
  4. package/dist/__tests__/all-checks-execute.test.d.ts +12 -0
  5. package/dist/__tests__/all-checks-execute.test.d.ts.map +1 -0
  6. package/dist/__tests__/all-checks-execute.test.js +846 -0
  7. package/dist/__tests__/all-checks-execute.test.js.map +1 -0
  8. package/dist/__tests__/behavior-fixtures-2.test.d.ts +9 -0
  9. package/dist/__tests__/behavior-fixtures-2.test.d.ts.map +1 -0
  10. package/dist/__tests__/behavior-fixtures-2.test.js +625 -0
  11. package/dist/__tests__/behavior-fixtures-2.test.js.map +1 -0
  12. package/dist/__tests__/behavior-fixtures-3.test.d.ts +7 -0
  13. package/dist/__tests__/behavior-fixtures-3.test.d.ts.map +1 -0
  14. package/dist/__tests__/behavior-fixtures-3.test.js +658 -0
  15. package/dist/__tests__/behavior-fixtures-3.test.js.map +1 -0
  16. package/dist/__tests__/behavior-fixtures-4.test.d.ts +8 -0
  17. package/dist/__tests__/behavior-fixtures-4.test.d.ts.map +1 -0
  18. package/dist/__tests__/behavior-fixtures-4.test.js +590 -0
  19. package/dist/__tests__/behavior-fixtures-4.test.js.map +1 -0
  20. package/dist/__tests__/behavior-fixtures-5.test.d.ts +7 -0
  21. package/dist/__tests__/behavior-fixtures-5.test.d.ts.map +1 -0
  22. package/dist/__tests__/behavior-fixtures-5.test.js +548 -0
  23. package/dist/__tests__/behavior-fixtures-5.test.js.map +1 -0
  24. package/dist/__tests__/behavior-fixtures-6.test.d.ts +18 -0
  25. package/dist/__tests__/behavior-fixtures-6.test.d.ts.map +1 -0
  26. package/dist/__tests__/behavior-fixtures-6.test.js +1700 -0
  27. package/dist/__tests__/behavior-fixtures-6.test.js.map +1 -0
  28. package/dist/__tests__/behavior-fixtures.test.d.ts +10 -0
  29. package/dist/__tests__/behavior-fixtures.test.d.ts.map +1 -0
  30. package/dist/__tests__/behavior-fixtures.test.js +812 -0
  31. package/dist/__tests__/behavior-fixtures.test.js.map +1 -0
  32. package/dist/__tests__/branch-fixtures-2.test.d.ts +6 -0
  33. package/dist/__tests__/branch-fixtures-2.test.d.ts.map +1 -0
  34. package/dist/__tests__/branch-fixtures-2.test.js +1369 -0
  35. package/dist/__tests__/branch-fixtures-2.test.js.map +1 -0
  36. package/dist/__tests__/branch-fixtures-3.test.d.ts +7 -0
  37. package/dist/__tests__/branch-fixtures-3.test.d.ts.map +1 -0
  38. package/dist/__tests__/branch-fixtures-3.test.js +877 -0
  39. package/dist/__tests__/branch-fixtures-3.test.js.map +1 -0
  40. package/dist/__tests__/branch-fixtures.test.d.ts +6 -0
  41. package/dist/__tests__/branch-fixtures.test.d.ts.map +1 -0
  42. package/dist/__tests__/branch-fixtures.test.js +1072 -0
  43. package/dist/__tests__/branch-fixtures.test.js.map +1 -0
  44. package/dist/__tests__/checks.test.d.ts +2 -0
  45. package/dist/__tests__/checks.test.d.ts.map +1 -0
  46. package/dist/__tests__/checks.test.js +39 -0
  47. package/dist/__tests__/checks.test.js.map +1 -0
  48. package/dist/__tests__/fixture-coverage.allowlist.d.ts +19 -0
  49. package/dist/__tests__/fixture-coverage.allowlist.d.ts.map +1 -0
  50. package/dist/__tests__/fixture-coverage.allowlist.js +27 -0
  51. package/dist/__tests__/fixture-coverage.allowlist.js.map +1 -0
  52. package/dist/__tests__/fixture-coverage.test.d.ts +13 -0
  53. package/dist/__tests__/fixture-coverage.test.d.ts.map +1 -0
  54. package/dist/__tests__/fixture-coverage.test.js +57 -0
  55. package/dist/__tests__/fixture-coverage.test.js.map +1 -0
  56. package/dist/__tests__/no-bootstrap-tool-import.test.d.ts +2 -0
  57. package/dist/__tests__/no-bootstrap-tool-import.test.d.ts.map +1 -0
  58. package/dist/__tests__/no-bootstrap-tool-import.test.js +75 -0
  59. package/dist/__tests__/no-bootstrap-tool-import.test.js.map +1 -0
  60. package/dist/__tests__/phantom-dependency-detection.test.d.ts +12 -0
  61. package/dist/__tests__/phantom-dependency-detection.test.d.ts.map +1 -0
  62. package/dist/__tests__/phantom-dependency-detection.test.js +112 -0
  63. package/dist/__tests__/phantom-dependency-detection.test.js.map +1 -0
  64. package/dist/__tests__/typescript-frontend.test.d.ts +8 -0
  65. package/dist/__tests__/typescript-frontend.test.d.ts.map +1 -0
  66. package/dist/__tests__/typescript-frontend.test.js +57 -0
  67. package/dist/__tests__/typescript-frontend.test.js.map +1 -0
  68. package/dist/checks/architecture/circular-import-detection.d.ts +14 -0
  69. package/dist/checks/architecture/circular-import-detection.d.ts.map +1 -0
  70. package/dist/checks/architecture/circular-import-detection.js +55 -0
  71. package/dist/checks/architecture/circular-import-detection.js.map +1 -0
  72. package/dist/checks/architecture/contracts-schema-consistency.d.ts +11 -0
  73. package/dist/checks/architecture/contracts-schema-consistency.d.ts.map +1 -0
  74. package/dist/checks/architecture/contracts-schema-consistency.js +75 -0
  75. package/dist/checks/architecture/contracts-schema-consistency.js.map +1 -0
  76. package/dist/checks/architecture/drizzle-orm-migration-guardrails.d.ts +12 -0
  77. package/dist/checks/architecture/drizzle-orm-migration-guardrails.d.ts.map +1 -0
  78. package/dist/checks/architecture/drizzle-orm-migration-guardrails.js +92 -0
  79. package/dist/checks/architecture/drizzle-orm-migration-guardrails.js.map +1 -0
  80. package/dist/checks/architecture/index.d.ts +10 -0
  81. package/dist/checks/architecture/index.d.ts.map +1 -0
  82. package/dist/checks/architecture/index.js +10 -0
  83. package/dist/checks/architecture/index.js.map +1 -0
  84. package/dist/checks/architecture/missing-type-exports.d.ts +13 -0
  85. package/dist/checks/architecture/missing-type-exports.d.ts.map +1 -0
  86. package/dist/checks/architecture/missing-type-exports.js +245 -0
  87. package/dist/checks/architecture/missing-type-exports.js.map +1 -0
  88. package/dist/checks/architecture/module-coupling-fan-out.d.ts +20 -0
  89. package/dist/checks/architecture/module-coupling-fan-out.d.ts.map +1 -0
  90. package/dist/checks/architecture/module-coupling-fan-out.js +120 -0
  91. package/dist/checks/architecture/module-coupling-fan-out.js.map +1 -0
  92. package/dist/checks/architecture/no-bootstrap-tool-import.d.ts +38 -0
  93. package/dist/checks/architecture/no-bootstrap-tool-import.d.ts.map +1 -0
  94. package/dist/checks/architecture/no-bootstrap-tool-import.js +95 -0
  95. package/dist/checks/architecture/no-bootstrap-tool-import.js.map +1 -0
  96. package/dist/checks/architecture/package-json-exports-field.d.ts +10 -0
  97. package/dist/checks/architecture/package-json-exports-field.d.ts.map +1 -0
  98. package/dist/checks/architecture/package-json-exports-field.js +56 -0
  99. package/dist/checks/architecture/package-json-exports-field.js.map +1 -0
  100. package/dist/checks/architecture/phantom-dependency-detection.d.ts +22 -0
  101. package/dist/checks/architecture/phantom-dependency-detection.d.ts.map +1 -0
  102. package/dist/checks/architecture/phantom-dependency-detection.js +330 -0
  103. package/dist/checks/architecture/phantom-dependency-detection.js.map +1 -0
  104. package/dist/checks/architecture/tsconfig-extends-validation.d.ts +10 -0
  105. package/dist/checks/architecture/tsconfig-extends-validation.d.ts.map +1 -0
  106. package/dist/checks/architecture/tsconfig-extends-validation.js +78 -0
  107. package/dist/checks/architecture/tsconfig-extends-validation.js.map +1 -0
  108. package/dist/checks/index.d.ts +6 -0
  109. package/dist/checks/index.d.ts.map +1 -0
  110. package/dist/checks/index.js +6 -0
  111. package/dist/checks/index.js.map +1 -0
  112. package/dist/checks/quality/api/api-contract-validation.d.ts +15 -0
  113. package/dist/checks/quality/api/api-contract-validation.d.ts.map +1 -0
  114. package/dist/checks/quality/api/api-contract-validation.js +316 -0
  115. package/dist/checks/quality/api/api-contract-validation.js.map +1 -0
  116. package/dist/checks/quality/api/api-response-validation.d.ts +14 -0
  117. package/dist/checks/quality/api/api-response-validation.d.ts.map +1 -0
  118. package/dist/checks/quality/api/api-response-validation.js +209 -0
  119. package/dist/checks/quality/api/api-response-validation.js.map +1 -0
  120. package/dist/checks/quality/api/fastify-route-validation.d.ts +14 -0
  121. package/dist/checks/quality/api/fastify-route-validation.d.ts.map +1 -0
  122. package/dist/checks/quality/api/fastify-route-validation.js +298 -0
  123. package/dist/checks/quality/api/fastify-route-validation.js.map +1 -0
  124. package/dist/checks/quality/api/fastify-schema-coverage.d.ts +11 -0
  125. package/dist/checks/quality/api/fastify-schema-coverage.d.ts.map +1 -0
  126. package/dist/checks/quality/api/fastify-schema-coverage.js +261 -0
  127. package/dist/checks/quality/api/fastify-schema-coverage.js.map +1 -0
  128. package/dist/checks/quality/api/index.d.ts +5 -0
  129. package/dist/checks/quality/api/index.d.ts.map +1 -0
  130. package/dist/checks/quality/api/index.js +5 -0
  131. package/dist/checks/quality/api/index.js.map +1 -0
  132. package/dist/checks/quality/code-structure/duplicate-utility-functions.d.ts +32 -0
  133. package/dist/checks/quality/code-structure/duplicate-utility-functions.d.ts.map +1 -0
  134. package/dist/checks/quality/code-structure/duplicate-utility-functions.js +451 -0
  135. package/dist/checks/quality/code-structure/duplicate-utility-functions.js.map +1 -0
  136. package/dist/checks/quality/code-structure/index.d.ts +3 -0
  137. package/dist/checks/quality/code-structure/index.d.ts.map +1 -0
  138. package/dist/checks/quality/code-structure/index.js +3 -0
  139. package/dist/checks/quality/code-structure/index.js.map +1 -0
  140. package/dist/checks/quality/code-structure/no-any-types.d.ts +13 -0
  141. package/dist/checks/quality/code-structure/no-any-types.d.ts.map +1 -0
  142. package/dist/checks/quality/code-structure/no-any-types.js +116 -0
  143. package/dist/checks/quality/code-structure/no-any-types.js.map +1 -0
  144. package/dist/checks/quality/data-integrity/__tests__/null-safety-fp.test.d.ts +15 -0
  145. package/dist/checks/quality/data-integrity/__tests__/null-safety-fp.test.d.ts.map +1 -0
  146. package/dist/checks/quality/data-integrity/__tests__/null-safety-fp.test.js +51 -0
  147. package/dist/checks/quality/data-integrity/__tests__/null-safety-fp.test.js.map +1 -0
  148. package/dist/checks/quality/data-integrity/array-validation.d.ts +16 -0
  149. package/dist/checks/quality/data-integrity/array-validation.d.ts.map +1 -0
  150. package/dist/checks/quality/data-integrity/array-validation.js +508 -0
  151. package/dist/checks/quality/data-integrity/array-validation.js.map +1 -0
  152. package/dist/checks/quality/data-integrity/database-index-coverage.d.ts +14 -0
  153. package/dist/checks/quality/data-integrity/database-index-coverage.d.ts.map +1 -0
  154. package/dist/checks/quality/data-integrity/database-index-coverage.js +235 -0
  155. package/dist/checks/quality/data-integrity/database-index-coverage.js.map +1 -0
  156. package/dist/checks/quality/data-integrity/database-schema-validation.d.ts +16 -0
  157. package/dist/checks/quality/data-integrity/database-schema-validation.d.ts.map +1 -0
  158. package/dist/checks/quality/data-integrity/database-schema-validation.js +328 -0
  159. package/dist/checks/quality/data-integrity/database-schema-validation.js.map +1 -0
  160. package/dist/checks/quality/data-integrity/in-memory-repository-detection.d.ts +14 -0
  161. package/dist/checks/quality/data-integrity/in-memory-repository-detection.d.ts.map +1 -0
  162. package/dist/checks/quality/data-integrity/in-memory-repository-detection.js +157 -0
  163. package/dist/checks/quality/data-integrity/in-memory-repository-detection.js.map +1 -0
  164. package/dist/checks/quality/data-integrity/index.d.ts +8 -0
  165. package/dist/checks/quality/data-integrity/index.d.ts.map +1 -0
  166. package/dist/checks/quality/data-integrity/index.js +8 -0
  167. package/dist/checks/quality/data-integrity/index.js.map +1 -0
  168. package/dist/checks/quality/data-integrity/missing-input-validation.d.ts +12 -0
  169. package/dist/checks/quality/data-integrity/missing-input-validation.d.ts.map +1 -0
  170. package/dist/checks/quality/data-integrity/missing-input-validation.js +180 -0
  171. package/dist/checks/quality/data-integrity/missing-input-validation.js.map +1 -0
  172. package/dist/checks/quality/data-integrity/null-safety.d.ts +33 -0
  173. package/dist/checks/quality/data-integrity/null-safety.d.ts.map +1 -0
  174. package/dist/checks/quality/data-integrity/null-safety.js +766 -0
  175. package/dist/checks/quality/data-integrity/null-safety.js.map +1 -0
  176. package/dist/checks/quality/data-integrity/numeric-validation.d.ts +12 -0
  177. package/dist/checks/quality/data-integrity/numeric-validation.d.ts.map +1 -0
  178. package/dist/checks/quality/data-integrity/numeric-validation.js +409 -0
  179. package/dist/checks/quality/data-integrity/numeric-validation.js.map +1 -0
  180. package/dist/checks/quality/frontend/a11y-form-labels.d.ts +14 -0
  181. package/dist/checks/quality/frontend/a11y-form-labels.d.ts.map +1 -0
  182. package/dist/checks/quality/frontend/a11y-form-labels.js +93 -0
  183. package/dist/checks/quality/frontend/a11y-form-labels.js.map +1 -0
  184. package/dist/checks/quality/frontend/a11y-semantic-html.d.ts +14 -0
  185. package/dist/checks/quality/frontend/a11y-semantic-html.d.ts.map +1 -0
  186. package/dist/checks/quality/frontend/a11y-semantic-html.js +88 -0
  187. package/dist/checks/quality/frontend/a11y-semantic-html.js.map +1 -0
  188. package/dist/checks/quality/frontend/index.d.ts +4 -0
  189. package/dist/checks/quality/frontend/index.d.ts.map +1 -0
  190. package/dist/checks/quality/frontend/index.js +4 -0
  191. package/dist/checks/quality/frontend/index.js.map +1 -0
  192. package/dist/checks/quality/frontend/test-only-frontend-modules.d.ts +13 -0
  193. package/dist/checks/quality/frontend/test-only-frontend-modules.d.ts.map +1 -0
  194. package/dist/checks/quality/frontend/test-only-frontend-modules.js +159 -0
  195. package/dist/checks/quality/frontend/test-only-frontend-modules.js.map +1 -0
  196. package/dist/checks/quality/incomplete-regex-escaping.d.ts +13 -0
  197. package/dist/checks/quality/incomplete-regex-escaping.d.ts.map +1 -0
  198. package/dist/checks/quality/incomplete-regex-escaping.js +207 -0
  199. package/dist/checks/quality/incomplete-regex-escaping.js.map +1 -0
  200. package/dist/checks/quality/index.d.ts +11 -0
  201. package/dist/checks/quality/index.d.ts.map +1 -0
  202. package/dist/checks/quality/index.js +11 -0
  203. package/dist/checks/quality/index.js.map +1 -0
  204. package/dist/checks/quality/linting/index.d.ts +2 -0
  205. package/dist/checks/quality/linting/index.d.ts.map +1 -0
  206. package/dist/checks/quality/linting/index.js +2 -0
  207. package/dist/checks/quality/linting/index.js.map +1 -0
  208. package/dist/checks/quality/linting/typescript-frontend.d.ts +25 -0
  209. package/dist/checks/quality/linting/typescript-frontend.d.ts.map +1 -0
  210. package/dist/checks/quality/linting/typescript-frontend.js +159 -0
  211. package/dist/checks/quality/linting/typescript-frontend.js.map +1 -0
  212. package/dist/checks/quality/observability/index.d.ts +5 -0
  213. package/dist/checks/quality/observability/index.d.ts.map +1 -0
  214. package/dist/checks/quality/observability/index.js +5 -0
  215. package/dist/checks/quality/observability/index.js.map +1 -0
  216. package/dist/checks/quality/observability/logger-event-name-format.d.ts +12 -0
  217. package/dist/checks/quality/observability/logger-event-name-format.d.ts.map +1 -0
  218. package/dist/checks/quality/observability/logger-event-name-format.js +124 -0
  219. package/dist/checks/quality/observability/logger-event-name-format.js.map +1 -0
  220. package/dist/checks/quality/observability/no-hardcoded-correlation-id.d.ts +5 -0
  221. package/dist/checks/quality/observability/no-hardcoded-correlation-id.d.ts.map +1 -0
  222. package/dist/checks/quality/observability/no-hardcoded-correlation-id.js +77 -0
  223. package/dist/checks/quality/observability/no-hardcoded-correlation-id.js.map +1 -0
  224. package/dist/checks/quality/observability/observability-coverage/__tests__/analyzer.test.d.ts +11 -0
  225. package/dist/checks/quality/observability/observability-coverage/__tests__/analyzer.test.d.ts.map +1 -0
  226. package/dist/checks/quality/observability/observability-coverage/__tests__/analyzer.test.js +107 -0
  227. package/dist/checks/quality/observability/observability-coverage/__tests__/analyzer.test.js.map +1 -0
  228. package/dist/checks/quality/observability/observability-coverage/__tests__/logger-detector.test.d.ts +12 -0
  229. package/dist/checks/quality/observability/observability-coverage/__tests__/logger-detector.test.d.ts.map +1 -0
  230. package/dist/checks/quality/observability/observability-coverage/__tests__/logger-detector.test.js +94 -0
  231. package/dist/checks/quality/observability/observability-coverage/__tests__/logger-detector.test.js.map +1 -0
  232. package/dist/checks/quality/observability/observability-coverage/analyzer.d.ts +13 -0
  233. package/dist/checks/quality/observability/observability-coverage/analyzer.d.ts.map +1 -0
  234. package/dist/checks/quality/observability/observability-coverage/analyzer.js +117 -0
  235. package/dist/checks/quality/observability/observability-coverage/analyzer.js.map +1 -0
  236. package/dist/checks/quality/observability/observability-coverage/index.d.ts +4 -0
  237. package/dist/checks/quality/observability/observability-coverage/index.d.ts.map +1 -0
  238. package/dist/checks/quality/observability/observability-coverage/index.js +4 -0
  239. package/dist/checks/quality/observability/observability-coverage/index.js.map +1 -0
  240. package/dist/checks/quality/observability/observability-coverage/logger-detector.d.ts +29 -0
  241. package/dist/checks/quality/observability/observability-coverage/logger-detector.d.ts.map +1 -0
  242. package/dist/checks/quality/observability/observability-coverage/logger-detector.js +111 -0
  243. package/dist/checks/quality/observability/observability-coverage/logger-detector.js.map +1 -0
  244. package/dist/checks/quality/observability/observability-coverage/types.d.ts +64 -0
  245. package/dist/checks/quality/observability/observability-coverage/types.d.ts.map +1 -0
  246. package/dist/checks/quality/observability/observability-coverage/types.js +6 -0
  247. package/dist/checks/quality/observability/observability-coverage/types.js.map +1 -0
  248. package/dist/checks/quality/observability/pii-exposure-in-logs.d.ts +22 -0
  249. package/dist/checks/quality/observability/pii-exposure-in-logs.d.ts.map +1 -0
  250. package/dist/checks/quality/observability/pii-exposure-in-logs.js +212 -0
  251. package/dist/checks/quality/observability/pii-exposure-in-logs.js.map +1 -0
  252. package/dist/checks/quality/observability/pii-exposure-in-logs.test.d.ts +11 -0
  253. package/dist/checks/quality/observability/pii-exposure-in-logs.test.d.ts.map +1 -0
  254. package/dist/checks/quality/observability/pii-exposure-in-logs.test.js +46 -0
  255. package/dist/checks/quality/observability/pii-exposure-in-logs.test.js.map +1 -0
  256. package/dist/checks/quality/patterns/__tests__/toctou-fp.test.d.ts +14 -0
  257. package/dist/checks/quality/patterns/__tests__/toctou-fp.test.d.ts.map +1 -0
  258. package/dist/checks/quality/patterns/__tests__/toctou-fp.test.js +61 -0
  259. package/dist/checks/quality/patterns/__tests__/toctou-fp.test.js.map +1 -0
  260. package/dist/checks/quality/patterns/async-waterfall-detection.d.ts +26 -0
  261. package/dist/checks/quality/patterns/async-waterfall-detection.d.ts.map +1 -0
  262. package/dist/checks/quality/patterns/async-waterfall-detection.js +410 -0
  263. package/dist/checks/quality/patterns/async-waterfall-detection.js.map +1 -0
  264. package/dist/checks/quality/patterns/dispose-pattern-completeness.d.ts +13 -0
  265. package/dist/checks/quality/patterns/dispose-pattern-completeness.d.ts.map +1 -0
  266. package/dist/checks/quality/patterns/dispose-pattern-completeness.js +220 -0
  267. package/dist/checks/quality/patterns/dispose-pattern-completeness.js.map +1 -0
  268. package/dist/checks/quality/patterns/error-handling-quality.d.ts +17 -0
  269. package/dist/checks/quality/patterns/error-handling-quality.d.ts.map +1 -0
  270. package/dist/checks/quality/patterns/error-handling-quality.js +335 -0
  271. package/dist/checks/quality/patterns/error-handling-quality.js.map +1 -0
  272. package/dist/checks/quality/patterns/index.d.ts +10 -0
  273. package/dist/checks/quality/patterns/index.d.ts.map +1 -0
  274. package/dist/checks/quality/patterns/index.js +10 -0
  275. package/dist/checks/quality/patterns/index.js.map +1 -0
  276. package/dist/checks/quality/patterns/lifecycle-cleanup-enforcement.d.ts +16 -0
  277. package/dist/checks/quality/patterns/lifecycle-cleanup-enforcement.d.ts.map +1 -0
  278. package/dist/checks/quality/patterns/lifecycle-cleanup-enforcement.js +205 -0
  279. package/dist/checks/quality/patterns/lifecycle-cleanup-enforcement.js.map +1 -0
  280. package/dist/checks/quality/patterns/result-pattern-consistency.d.ts +16 -0
  281. package/dist/checks/quality/patterns/result-pattern-consistency.d.ts.map +1 -0
  282. package/dist/checks/quality/patterns/result-pattern-consistency.js +328 -0
  283. package/dist/checks/quality/patterns/result-pattern-consistency.js.map +1 -0
  284. package/dist/checks/quality/patterns/silent-early-returns.d.ts +23 -0
  285. package/dist/checks/quality/patterns/silent-early-returns.d.ts.map +1 -0
  286. package/dist/checks/quality/patterns/silent-early-returns.js +266 -0
  287. package/dist/checks/quality/patterns/silent-early-returns.js.map +1 -0
  288. package/dist/checks/quality/patterns/stream-buffer-size-limits.d.ts +13 -0
  289. package/dist/checks/quality/patterns/stream-buffer-size-limits.d.ts.map +1 -0
  290. package/dist/checks/quality/patterns/stream-buffer-size-limits.js +163 -0
  291. package/dist/checks/quality/patterns/stream-buffer-size-limits.js.map +1 -0
  292. package/dist/checks/quality/patterns/throws-documentation.d.ts +23 -0
  293. package/dist/checks/quality/patterns/throws-documentation.d.ts.map +1 -0
  294. package/dist/checks/quality/patterns/throws-documentation.js +519 -0
  295. package/dist/checks/quality/patterns/throws-documentation.js.map +1 -0
  296. package/dist/checks/quality/patterns/toctou-race-condition.d.ts +48 -0
  297. package/dist/checks/quality/patterns/toctou-race-condition.d.ts.map +1 -0
  298. package/dist/checks/quality/patterns/toctou-race-condition.js +639 -0
  299. package/dist/checks/quality/patterns/toctou-race-condition.js.map +1 -0
  300. package/dist/checks/quality/stubbed-implementation-detection.d.ts +24 -0
  301. package/dist/checks/quality/stubbed-implementation-detection.d.ts.map +1 -0
  302. package/dist/checks/quality/stubbed-implementation-detection.js +355 -0
  303. package/dist/checks/quality/stubbed-implementation-detection.js.map +1 -0
  304. package/dist/checks/quality/unused-config-options.d.ts +12 -0
  305. package/dist/checks/quality/unused-config-options.d.ts.map +1 -0
  306. package/dist/checks/quality/unused-config-options.js +245 -0
  307. package/dist/checks/quality/unused-config-options.js.map +1 -0
  308. package/dist/checks/resilience/__tests__/callback-invocation-safe.test.d.ts +2 -0
  309. package/dist/checks/resilience/__tests__/callback-invocation-safe.test.d.ts.map +1 -0
  310. package/dist/checks/resilience/__tests__/callback-invocation-safe.test.js +79 -0
  311. package/dist/checks/resilience/__tests__/callback-invocation-safe.test.js.map +1 -0
  312. package/dist/checks/resilience/__tests__/context-leakage-fp.test.d.ts +12 -0
  313. package/dist/checks/resilience/__tests__/context-leakage-fp.test.d.ts.map +1 -0
  314. package/dist/checks/resilience/__tests__/context-leakage-fp.test.js +34 -0
  315. package/dist/checks/resilience/__tests__/context-leakage-fp.test.js.map +1 -0
  316. package/dist/checks/resilience/__tests__/context-mutation.test.d.ts +11 -0
  317. package/dist/checks/resilience/__tests__/context-mutation.test.d.ts.map +1 -0
  318. package/dist/checks/resilience/__tests__/context-mutation.test.js +54 -0
  319. package/dist/checks/resilience/__tests__/context-mutation.test.js.map +1 -0
  320. package/dist/checks/resilience/callback-invocation-safe.d.ts +34 -0
  321. package/dist/checks/resilience/callback-invocation-safe.d.ts.map +1 -0
  322. package/dist/checks/resilience/callback-invocation-safe.js +247 -0
  323. package/dist/checks/resilience/callback-invocation-safe.js.map +1 -0
  324. package/dist/checks/resilience/context-leakage.d.ts +25 -0
  325. package/dist/checks/resilience/context-leakage.d.ts.map +1 -0
  326. package/dist/checks/resilience/context-leakage.js +435 -0
  327. package/dist/checks/resilience/context-leakage.js.map +1 -0
  328. package/dist/checks/resilience/context-mutation.d.ts +21 -0
  329. package/dist/checks/resilience/context-mutation.d.ts.map +1 -0
  330. package/dist/checks/resilience/context-mutation.js +368 -0
  331. package/dist/checks/resilience/context-mutation.js.map +1 -0
  332. package/dist/checks/resilience/detached-promises.d.ts +40 -0
  333. package/dist/checks/resilience/detached-promises.d.ts.map +1 -0
  334. package/dist/checks/resilience/detached-promises.js +646 -0
  335. package/dist/checks/resilience/detached-promises.js.map +1 -0
  336. package/dist/checks/resilience/index.d.ts +7 -0
  337. package/dist/checks/resilience/index.d.ts.map +1 -0
  338. package/dist/checks/resilience/index.js +7 -0
  339. package/dist/checks/resilience/index.js.map +1 -0
  340. package/dist/checks/resilience/no-raw-fetch.d.ts +11 -0
  341. package/dist/checks/resilience/no-raw-fetch.d.ts.map +1 -0
  342. package/dist/checks/resilience/no-raw-fetch.js +110 -0
  343. package/dist/checks/resilience/no-raw-fetch.js.map +1 -0
  344. package/dist/checks/resilience/no-unbounded-concurrency.d.ts +11 -0
  345. package/dist/checks/resilience/no-unbounded-concurrency.d.ts.map +1 -0
  346. package/dist/checks/resilience/no-unbounded-concurrency.js +117 -0
  347. package/dist/checks/resilience/no-unbounded-concurrency.js.map +1 -0
  348. package/dist/checks/security/__tests__/sql-injection.test.d.ts +17 -0
  349. package/dist/checks/security/__tests__/sql-injection.test.d.ts.map +1 -0
  350. package/dist/checks/security/__tests__/sql-injection.test.js +97 -0
  351. package/dist/checks/security/__tests__/sql-injection.test.js.map +1 -0
  352. package/dist/checks/security/index.d.ts +4 -0
  353. package/dist/checks/security/index.d.ts.map +1 -0
  354. package/dist/checks/security/index.js +4 -0
  355. package/dist/checks/security/index.js.map +1 -0
  356. package/dist/checks/security/input-sanitization.d.ts +20 -0
  357. package/dist/checks/security/input-sanitization.d.ts.map +1 -0
  358. package/dist/checks/security/input-sanitization.js +255 -0
  359. package/dist/checks/security/input-sanitization.js.map +1 -0
  360. package/dist/checks/security/sql-injection.d.ts +24 -0
  361. package/dist/checks/security/sql-injection.d.ts.map +1 -0
  362. package/dist/checks/security/sql-injection.js +330 -0
  363. package/dist/checks/security/sql-injection.js.map +1 -0
  364. package/dist/checks/security/unsafe-secret-comparison.d.ts +17 -0
  365. package/dist/checks/security/unsafe-secret-comparison.d.ts.map +1 -0
  366. package/dist/checks/security/unsafe-secret-comparison.js +227 -0
  367. package/dist/checks/security/unsafe-secret-comparison.js.map +1 -0
  368. package/dist/checks/testing/index.d.ts +2 -0
  369. package/dist/checks/testing/index.d.ts.map +1 -0
  370. package/dist/checks/testing/index.js +2 -0
  371. package/dist/checks/testing/index.js.map +1 -0
  372. package/dist/checks/testing/mock-implementations-in-production.d.ts +12 -0
  373. package/dist/checks/testing/mock-implementations-in-production.d.ts.map +1 -0
  374. package/dist/checks/testing/mock-implementations-in-production.js +211 -0
  375. package/dist/checks/testing/mock-implementations-in-production.js.map +1 -0
  376. package/dist/display/architecture.d.ts +9 -0
  377. package/dist/display/architecture.d.ts.map +1 -0
  378. package/dist/display/architecture.js +18 -0
  379. package/dist/display/architecture.js.map +1 -0
  380. package/dist/display/index.d.ts +20 -0
  381. package/dist/display/index.d.ts.map +1 -0
  382. package/dist/display/index.js +30 -0
  383. package/dist/display/index.js.map +1 -0
  384. package/dist/display/quality.d.ts +7 -0
  385. package/dist/display/quality.d.ts.map +1 -0
  386. package/dist/display/quality.js +39 -0
  387. package/dist/display/quality.js.map +1 -0
  388. package/dist/display/resilience.d.ts +7 -0
  389. package/dist/display/resilience.d.ts.map +1 -0
  390. package/dist/display/resilience.js +13 -0
  391. package/dist/display/resilience.js.map +1 -0
  392. package/dist/display/security-testing.d.ts +9 -0
  393. package/dist/display/security-testing.d.ts.map +1 -0
  394. package/dist/display/security-testing.js +14 -0
  395. package/dist/display/security-testing.js.map +1 -0
  396. package/dist/display/types.d.ts +6 -0
  397. package/dist/display/types.d.ts.map +1 -0
  398. package/dist/display/types.js +6 -0
  399. package/dist/display/types.js.map +1 -0
  400. package/dist/index.d.ts +19 -0
  401. package/dist/index.d.ts.map +1 -0
  402. package/dist/index.js +21 -0
  403. package/dist/index.js.map +1 -0
  404. package/package.json +55 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"null-safety.js","sourceRoot":"","sources":["../../../../src/checks/quality/data-integrity/null-safety.ts"],"names":[],"mappings":"AAAA,yHAAyH;AACzH;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAuB,MAAM,sBAAsB,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAejC;;GAEG;AACH,MAAM,aAAa,GAAG;IACpB,MAAM,EAAE,oBAAoB;IAC5B,IAAI,EAAE,kBAAkB;IACxB,MAAM,EAAE,qBAAqB;IAC7B,SAAS,EAAE,oBAAoB;IAC/B,IAAI,EAAE,oBAAoB;CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,qBAAqB,GAAG;IAC5B,IAAI,EAAE,oDAAoD;IAC1D,oBAAoB,EAAE,uBAAuB;IAC7C,eAAe,EAAE,qBAAqB;IACtC,gBAAgB,EAAE,wBAAwB;IAC1C,eAAe,EAAE,gCAAgC;IACjD,aAAa,EAAE,8BAA8B;IAC7C,UAAU,EAAE,0BAA0B;IACtC,SAAS,EAAE,yBAAyB;IACpC,cAAc,EAAE,yBAAyB;IACzC,cAAc,EAAE,6BAA6B;IAC7C,8BAA8B,EAAE,uBAAuB;IACvD,kBAAkB,EAAE,qBAAqB;IACzC,gBAAgB,EAAE,uBAAuB;IACzC,eAAe,EAAE,uBAAuB;IACxC,aAAa,EAAE,8BAA8B;IAC7C,eAAe,EAAE,wBAAwB;IACzC,eAAe,EAAE,wBAAwB;IACzC,YAAY,EAAE,uBAAuB;IACrC,eAAe,EAAE,kBAAkB;IACnC,SAAS,EAAE,2CAA2C;IACtD,SAAS,EAAE,2CAA2C;IACtD,UAAU,EAAE,6CAA6C;IACzD,aAAa,EAAE,wBAAwB;IACvC,gBAAgB,EAAE,wBAAwB;IAC1C,YAAY,EAAE,uBAAuB;IACrC,qBAAqB,EAAE,6BAA6B;IACpD,kBAAkB,EAAE,4CAA4C;IAChE,YAAY,EAAE,oCAAoC;IAClD,iBAAiB,EAAE,oCAAoC;IACvD,oDAAoD;IACpD,UAAU,EAAE,+CAA+C;IAC3D,cAAc;IACd,UAAU,EAAE,4BAA4B;IACxC,WAAW,EAAE,wBAAwB;IACrC,WAAW,EAAE,wBAAwB;IACrC,WAAW,EAAE,wBAAwB;IACrC,WAAW,EAAE,wBAAwB;IACrC,wDAAwD;IACxD,0CAA0C;IAC1C,cAAc;IACd,eAAe;IACf,aAAa;IACb,eAAe;IACf,mBAAmB;IACnB,gDAAgD;IAChD,mBAAmB;IACnB,wBAAwB;IACxB,yBAAyB;IACzB,gEAAgE;IAChE,mBAAmB;IACnB,qBAAqB;IACrB,WAAW;IACX,0BAA0B;IAC1B,wBAAwB;IACxB,gBAAgB;IAChB,qBAAqB;IACrB,mDAAmD;IACnD,gBAAgB;IAChB,gBAAgB;IAChB,mDAAmD;IACnD,UAAU;IACV,sEAAsE;IACtE,QAAQ;IACR,OAAO;IACP,iEAAiE;IACjE,aAAa;IACb,aAAa;IACb,iBAAiB;IACjB,mBAAmB;IACnB,sDAAsD;IACtD,oBAAoB;IACpB,kBAAkB;IAClB,WAAW;IACX,mBAAmB;IACnB,qBAAqB;IACrB,2DAA2D;IAC3D,YAAY;IACZ,WAAW;IACX,aAAa;IACb,aAAa;IACb,WAAW;IACX,aAAa;IACb,SAAS;IACT,gBAAgB;IAChB,gBAAgB;IAChB,WAAW;IACX,aAAa;IACb,qBAAqB;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,kBAAkB;IAClB,MAAM;IACN,OAAO;IACP,SAAS;IACT,4BAA4B;IAC5B,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,SAAS;IACT,MAAM;IACN,OAAO;IACP,MAAM;IACN,WAAW;IACX,UAAU;IACV,eAAe;IACf,UAAU;IACV,SAAS;IACT,aAAa;IACb,IAAI;IACJ,MAAM;IACN,SAAS;IACT,MAAM;IACN,QAAQ;IACR,oCAAoC;IACpC,OAAO;IACP,QAAQ;IACR,MAAM;IACN,SAAS;IACT,MAAM;IACN,MAAM;IACN,KAAK;IACL,OAAO;IACP,SAAS;IACT,MAAM;IACN,iBAAiB;IACjB,MAAM;IACN,WAAW;IACX,SAAS;IACT,aAAa;IACb,aAAa;IACb,mBAAmB;IACnB,mBAAmB;IACnB,OAAO;IACP,SAAS;IACT,YAAY;IACZ,WAAW;IACX,QAAQ;IACR,OAAO;IACP,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,OAAO;IACP,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,mBAAmB;IACnB,MAAM;IACN,iBAAiB;IACjB,UAAU;IACV,2CAA2C;IAC3C,MAAM;IACN,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,sCAAsC;IACtC,OAAO;IACP,UAAU;IACV,SAAS;IACT,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,WAAW;IACX,UAAU;IACV,mBAAmB;IACnB,WAAW;IACX,oBAAoB;IACpB,OAAO;IACP,QAAQ;IACR,MAAM;IACN,MAAM;IACN,QAAQ;IACR,SAAS;IACT,WAAW;IACX,YAAY;IACZ,SAAS;IACT,gCAAgC;IAChC,KAAK;IACL,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,UAAU;IACV,OAAO;IACP,0BAA0B;IAC1B,KAAK;IACL,MAAM;IACN,QAAQ;IACR,UAAU;IACV,aAAa;IACb,aAAa;IACb,aAAa;IACb,WAAW;IACX,OAAO;IACP,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,mCAAmC;IACnC,WAAW;IACX,aAAa;IACb,MAAM;IACN,IAAI;IACJ,KAAK;IACL,MAAM;IACN,oCAAoC;IACpC,OAAO;IACP,UAAU;IACV,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,+EAA+E;IAC/E,SAAS;IACT,SAAS;IACT,YAAY;IACZ,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,WAAW;IACX,4BAA4B;IAC5B,MAAM;IACN,OAAO;IACP,WAAW;IACX,qBAAqB;IACrB,oBAAoB;IACpB,WAAW;IACX,UAAU;IACV,WAAW;IACX,UAAU;IACV,iEAAiE;IACjE,KAAK;IACL,KAAK;IACL,KAAK;IACL,OAAO;IACP,SAAS;IACT,MAAM;IACN,SAAS;IACT,QAAQ;IACR,gEAAgE;IAChE,+BAA+B;IAC/B,SAAS;IACT,UAAU;IACV,QAAQ;IACR,UAAU;IACV,cAAc;IACd,eAAe;IACf,YAAY;IACZ,aAAa;IACb,eAAe;IACf,cAAc;IACd,cAAc;IACd,kBAAkB;IAClB,KAAK;IACL,KAAK;IACL,KAAK;IACL,QAAQ;IACR,OAAO;IACP,MAAM;IACN,mCAAmC;IACnC,aAAa;IACb,QAAQ;IACR,IAAI;IACJ,wEAAwE;IACxE,mEAAmE;IACnE,gEAAgE;IAChE,OAAO;IACP,WAAW;IACX,2EAA2E;IAC3E,MAAM;IACN,SAAS;IACT,eAAe;IACf,aAAa;IACb,eAAe;IACf,UAAU;IACV,YAAY;IACZ,WAAW;IACX,iBAAiB;IACjB,wBAAwB;IACxB,cAAc;IACd,qBAAqB;IACrB,aAAa;IACb,gBAAgB;IAChB,SAAS;IACT,WAAW;IACX,gBAAgB;IAChB,cAAc;IACd,gBAAgB;IAChB,kBAAkB;IAClB,uBAAuB;IACvB,sBAAsB;IACtB,0BAA0B;IAC1B,yBAAyB;IACzB,gBAAgB;IAChB,qBAAqB;IACrB,oBAAoB;IACpB,wBAAwB;IACxB,uBAAuB;IACvB,SAAS;IACT,cAAc;IACd,SAAS;IACT,eAAe;IACf,iBAAiB;IACjB,uBAAuB;IACvB,UAAU;IACV,SAAS;IACT,KAAK;IACL,gEAAgE;IAChE,mBAAmB;IACnB,uBAAuB;IACvB,mBAAmB;IACnB,uBAAuB;IACvB,iBAAiB;IACjB,qBAAqB;IACrB,oBAAoB;IACpB,wBAAwB;IACxB,WAAW;IACX,WAAW;IACX,aAAa;IACb,gBAAgB;IAChB,UAAU;IACV,yEAAyE;IACzE,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,8DAA8D;IAC9D,OAAO;IACP,KAAK;IACL,MAAM;IACN,0DAA0D;IAC1D,QAAQ;IACR,eAAe;IACf,iBAAiB;IACjB,0DAA0D;IAC1D,UAAU;IACV,WAAW;IACX,eAAe;IACf,kBAAkB;IAClB,2FAA2F;IAC3F,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,SAAS;IACT,sFAAsF;IACtF,OAAO;IACP,mFAAmF;IACnF,SAAS;IACT,aAAa;IACb,QAAQ;IACR,gBAAgB;IAChB,QAAQ;IACR,UAAU;IACV,SAAS;IACT,MAAM;IACN,OAAO;IACP,SAAS;IACT,YAAY;IACZ,WAAW;IACX,aAAa;IACb,MAAM;IACN,OAAO;IACP,SAAS;IACT,YAAY;IACZ,aAAa;IACb,oBAAoB;IACpB,0BAA0B;IAC1B,cAAc;IACd,iBAAiB;IACjB,eAAe;IACf,sBAAsB;IACtB,oBAAoB;IACpB,yBAAyB;IACzB,oBAAoB;IACpB,0BAA0B;IAC1B,uBAAuB;IACvB,6BAA6B;CAC9B,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,oBAAoB,GAAG;IAC3B,KAAK;IACL,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,MAAM;IACN,MAAM;IACN,IAAI;IACJ,QAAQ;IACR,OAAO;IACP,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,UAAU;IACV,OAAO;IACP,SAAS;IACT,UAAU;IACV,YAAY;IACZ,+DAA+D;IAC/D,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,0EAA0E;IAC1E,8EAA8E;IAC9E,6DAA6D;IAC7D,UAAU;IACV,QAAQ;IACR,SAAS;IACT,MAAM;IACN,QAAQ;CACT,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,SAAS,oBAAoB,CAAC,UAA6B,EAAE,UAAyB;IACpF,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACjF,IAAI,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,OAAO,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,IAAI,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACrD,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,6BAA6B,CACpC,IAAiC,EACjC,UAAyB;IAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,OAAO,GAAY,IAAI,CAAC;IAC5B,IAAI,MAAM,GAAwB,IAAI,CAAC,MAAM,CAAC;IAC9C,OAAO,MAAM,EAAE,CAAC;QACd,IAAI,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IACE,EAAE,CAAC,uBAAuB,CAAC,MAAM,CAAC;YAClC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACvD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IACE,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC;YAC7B,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB;YACnE,MAAM,CAAC,KAAK,KAAK,OAAO;YACxB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAClD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;QACjB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,IAAiC;IACrD,IAAI,OAAO,GAAkB,IAAI,CAAC,UAAU,CAAC;IAC7C,OAAO,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,0BAA0B,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9E,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAC/B,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,IAAiC;IACtD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAkB,IAAI,CAAC,UAAU,CAAC;IAC7C,OAAO,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,0BAA0B,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9E,IAAI,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,KAAK,EAAE,CAAC;YACR,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,IAAiC,EAAE,UAAyB;IACrF,uEAAuE;IACvE,8EAA8E;IAC9E,IAAI,OAAO,GAAkB,IAAI,CAAC,UAAU,CAAC;IAE7C,OAAO,OAAO,EAAE,CAAC;QACf,IAAI,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAC3D,IAAI,MAAM,CAAC,QAAQ;gBAAE,OAAO,MAAM,CAAC,KAAK,CAAC;YACzC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;YACtB,SAAS;QACX,CAAC;QACD,IAAI,EAAE,CAAC,0BAA0B,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG;gBAAE,OAAO,IAAI,CAAC;YAChE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,IAAI,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAC,IAAI,KAAK,GAAG,CAAC;QAC9B,CAAC;QACD,MAAM;IACR,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gEAAgE;AAChE,SAAS,sBAAsB,CAC7B,IAAuB,EACvB,UAAyB;IAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;IAC/B,IAAI,EAAE,CAAC,0BAA0B,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACxF,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;IACtD,CAAC;IACD,IAAI,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,IAAiC;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IAEnC,2DAA2D;IAC3D,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnD,0FAA0F;IAC1F,IAAI,OAAO,GAAkB,UAAU,CAAC;IAExC,OAAO,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,IAAI,EAAE,CAAC,0BAA0B,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACtD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAChD,IAAI,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;gBACnC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,6BAA6B;YAC7B,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;YACxC,SAAS;QACX,CAAC;QACD,MAAM;IACR,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,eAAe,GAAsB;IACzC,qBAAqB;IACrB,mBAAmB;IACnB,YAAY;IACZ,cAAc;IACd,kEAAkE;IAClE,qEAAqE;IACrE,kCAAkC;IAClC,0DAA0D;CAC3D,CAAC;AAEF,4DAA4D;AAC5D,SAAS,uBAAuB;IAC9B,MAAM,GAAG,GAAG,cAAc,CAAmB,aAAa,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,eAAe,EAAE,GAAG,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB,EAAE,KAAwB;IAChE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,QAAgB;IACjE,MAAM,UAAU,GAAqB,EAAE,CAAC;IAExC,gFAAgF;IAChF,2EAA2E;IAC3E,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAC;IAC5C,IAAI,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC;QAAE,OAAO,UAAU,CAAC;IAE3D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QAE3B,MAAM,KAAK,GAAG,CAAC,IAAa,EAAQ,EAAE;YACpC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAE7B,qEAAqE;YACrE,IAAI,CAAC,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;gBAAE,OAAO;YAE7E,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAEnC,sEAAsE;YACtE,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,UAAU,CAAC;gBAAE,OAAO;YAE1F,+EAA+E;YAC/E,IAAI,YAAY,CAAC,IAAI,CAAC;gBAAE,OAAO;YAE/B,iFAAiF;YACjF,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO;YAEpC,iEAAiE;YACjE,IAAI,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC;gBAAE,OAAO;YAEhD,mCAAmC;YACnC,IAAI,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,oBAAoB,CAAC,UAAU,EAAE,UAAU,CAAC;gBAAE,OAAO;YAE5F,kFAAkF;YAClF,IAAI,aAAa,CAAC,IAAI,CAAC;gBAAE,OAAO;YAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAEhC,+CAA+C;YAC/C,IAAI,kBAAkB,CAAC,QAAQ,CAAC;gBAAE,OAAO;YAEzC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,6BAA6B,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtF,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAEjD,mCAAmC;YACnC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAAE,OAAO;YAExD,mEAAmE;YACnE,iEAAiE;YACjE,IAAI,6BAA6B,CAAC,IAAI,EAAE,UAAU,CAAC;gBAAE,OAAO;YAE5D,yBAAyB;YACzB,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAO;YAEjE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAE3C,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,SAAS,GAAG,CAAC;gBACrB,OAAO,EAAE,wCAAwC,QAAQ,sBAAsB;gBAC/E,QAAQ,EAAE,SAAS;gBACnB,IAAI,EAAE,eAAe;gBACrB,UAAU,EAAE,mCAAmC,QAAQ,WAAW,QAAQ,0EAA0E;gBACpJ,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,KAAK,CAAC,UAAU,CAAC,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC;IACpC,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE;IAC9E,aAAa,EAAE,eAAe;IAE9B,UAAU,EAAE,MAAM;IAClB,WAAW,EAAE,8DAA8D;IAC3E,eAAe,EAAE;;;;;;;;;;mEAUgD;IACjE,IAAI,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,aAAa,CAAC;IAChD,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;IAExB,OAAO,CAAC,OAAe,EAAE,QAAgB;QACvC,8EAA8E;QAC9E,IAAI,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,CAAC;QACpC,OAAO,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @fileoverview Numeric Parameter Validation Check
3
+ *
4
+ * Detects numeric parameters without NaN/Infinity/range validation.
5
+ */
6
+ /**
7
+ * Check: quality/numeric-validation
8
+ *
9
+ * Detects numeric parameters without NaN/Infinity/range validation.
10
+ */
11
+ export declare const numericValidation: import("@opensip-cli/fitness").Check;
12
+ //# sourceMappingURL=numeric-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numeric-validation.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/data-integrity/numeric-validation.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAyaH;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,sCAwC5B,CAAC"}
@@ -0,0 +1,409 @@
1
+ // @fitness-ignore-file no-generic-error -- Generic errors appropriate in this context
2
+ /**
3
+ * @fileoverview Numeric Parameter Validation Check
4
+ *
5
+ * Detects numeric parameters without NaN/Infinity/range validation.
6
+ */
7
+ import { defineCheck, isTestFile } from '@opensip-cli/fitness';
8
+ import { getSharedSourceFile } from '@opensip-cli/lang-typescript';
9
+ import * as ts from 'typescript';
10
+ /**
11
+ * Quick filter keywords for numeric validation patterns
12
+ */
13
+ const QUICK_FILTER_KEYWORDS = ['number', 'Number', 'parseInt', 'parseFloat'];
14
+ /**
15
+ * Patterns that indicate proper numeric validation
16
+ */
17
+ const VALIDATION_PATTERNS = [
18
+ /Number\.isFinite/,
19
+ /Number\.isNaN/,
20
+ /Number\.isInteger/,
21
+ /isFinite\(/,
22
+ /isNaN\(/,
23
+ /typeof\s+\w+\s*===?\s*['"]number['"]/,
24
+ ];
25
+ /**
26
+ * Parameter names that are inherently safe (loop indices, counters, etc.)
27
+ * These are structural values that don't need NaN/Infinity validation.
28
+ */
29
+ const SAFE_PARAMETER_NAMES = new Set([
30
+ 'index',
31
+ 'i',
32
+ 'j',
33
+ 'k',
34
+ 'count',
35
+ 'length',
36
+ 'offset',
37
+ 'limit',
38
+ 'depth',
39
+ 'level',
40
+ 'size',
41
+ 'capacity',
42
+ ]);
43
+ /**
44
+ * Check if a file imports from 'zod', indicating parameters likely come from
45
+ * Zod-parsed schemas and are already validated.
46
+ */
47
+ function fileImportsZod(sourceFile) {
48
+ for (const stmt of sourceFile.statements) {
49
+ if (ts.isImportDeclaration(stmt) &&
50
+ ts.isStringLiteral(stmt.moduleSpecifier) &&
51
+ stmt.moduleSpecifier.text === 'zod') {
52
+ return true;
53
+ }
54
+ }
55
+ return false;
56
+ }
57
+ /**
58
+ * Check if a function/method is private or internal (prefixed with _ or has
59
+ * the `private` modifier). Internal functions are called by code that already
60
+ * validates, so flagging them creates false positives.
61
+ */
62
+ function isPrivateOrInternal(node) {
63
+ // Arrow functions assigned to _-prefixed variables are handled at the caller level
64
+ if (ts.isFunctionDeclaration(node) && node.name?.text.startsWith('_')) {
65
+ return true;
66
+ }
67
+ if (ts.isMethodDeclaration(node)) {
68
+ // Check for `private` keyword
69
+ if (node.modifiers?.some((m) => m.kind === ts.SyntaxKind.PrivateKeyword)) {
70
+ return true;
71
+ }
72
+ // Check for _-prefixed method name
73
+ if (ts.isIdentifier(node.name) && node.name.text.startsWith('_')) {
74
+ return true;
75
+ }
76
+ }
77
+ return false;
78
+ }
79
+ /**
80
+ * Check if a parameter has a default value (e.g., `limit = 50`).
81
+ * Parameters with defaults already have a safe fallback and don't need
82
+ * NaN/Infinity validation at the call boundary.
83
+ */
84
+ function hasDefaultValue(param) {
85
+ return param.initializer !== undefined;
86
+ }
87
+ /**
88
+ * Check if a parameter has a number type reference
89
+ */
90
+ function isNumberTypeParam(param) {
91
+ if (!param.type || !ts.isTypeReferenceNode(param.type)) {
92
+ return false;
93
+ }
94
+ const typeName = param.type.typeName;
95
+ return ts.isIdentifier(typeName) && typeName.text === 'number';
96
+ }
97
+ /**
98
+ * Check if the function body contains numeric validation patterns
99
+ */
100
+ function bodyHasValidation(body, sourceFile) {
101
+ const bodyText = body.getText(sourceFile);
102
+ return VALIDATION_PATTERNS.some((p) => p.test(bodyText));
103
+ }
104
+ /**
105
+ * Create a violation for an unvalidated numeric parameter
106
+ */
107
+ function createParameterViolation(options) {
108
+ const { param, sourceFile } = options;
109
+ const paramName = ts.isIdentifier(param.name) ? param.name.text : 'param';
110
+ const { line, character } = sourceFile.getLineAndCharacterOfPosition(param.getStart());
111
+ const lineNum = line + 1;
112
+ const matchText = param.getText(sourceFile);
113
+ return {
114
+ line: lineNum,
115
+ column: character + 1,
116
+ message: `Numeric parameter '${paramName}' lacks NaN/Infinity validation`,
117
+ severity: 'warning',
118
+ type: 'unvalidated-numeric',
119
+ suggestion: `Add validation at the start of the function: if (!Number.isFinite(${paramName})) { throw new Error('Invalid ${paramName}: must be a finite number'); }`,
120
+ match: matchText,
121
+ };
122
+ }
123
+ /**
124
+ * Check function parameters for unvalidated number types
125
+ */
126
+ function checkFunctionParameters(options) {
127
+ const { node, sourceFile } = options;
128
+ const violations = [];
129
+ const body = node.body;
130
+ /* v8 ignore next -- defensive guard */
131
+ if (!body)
132
+ return violations;
133
+ // Skip private/internal functions — callers validate before passing values
134
+ if (isPrivateOrInternal(node))
135
+ return violations;
136
+ // Filter to number params that lack validation
137
+ const unvalidatedNumberParams = node.parameters.filter((param) => {
138
+ /* v8 ignore next -- defensive AST/type guard */
139
+ if (!isNumberTypeParam(param))
140
+ return false;
141
+ if (bodyHasValidation(body, sourceFile))
142
+ return false;
143
+ // Skip parameters with default values (already have safe fallback)
144
+ if (hasDefaultValue(param))
145
+ return false;
146
+ // Skip safe parameter names (loop indices, counters, etc.)
147
+ /* v8 ignore next -- defensive AST/type guard */
148
+ if (ts.isIdentifier(param.name) && SAFE_PARAMETER_NAMES.has(param.name.text))
149
+ return false;
150
+ return true;
151
+ });
152
+ for (const param of unvalidatedNumberParams) {
153
+ violations.push(createParameterViolation({ param, sourceFile }));
154
+ }
155
+ return violations;
156
+ }
157
+ /**
158
+ * Check if node is inside a validation check (e.g., isFinite wrapper)
159
+ */
160
+ function isInsideValidationCheck(node) {
161
+ const parent = node.parent;
162
+ if (!ts.isCallExpression(parent))
163
+ return false;
164
+ const parentExpr = parent.expression;
165
+ return ts.isPropertyAccessExpression(parentExpr) && parentExpr.name.text === 'isFinite';
166
+ }
167
+ /**
168
+ * Create a violation for unvalidated parseInt/parseFloat call
169
+ */
170
+ function createParseViolation(options) {
171
+ const { node, funcName, sourceFile } = options;
172
+ const { line, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
173
+ const lineNum = line + 1;
174
+ const matchText = node.getText(sourceFile);
175
+ return {
176
+ line: lineNum,
177
+ column: character + 1,
178
+ message: `${funcName}() result not validated for NaN`,
179
+ severity: 'warning',
180
+ type: 'unvalidated-parse',
181
+ suggestion: `Wrap the ${funcName}() call with validation: const parsed = ${funcName}(...); if (!Number.isFinite(parsed)) { /* handle invalid input */ }`,
182
+ match: matchText,
183
+ };
184
+ }
185
+ /**
186
+ * Check if the next N lines after a parse call contain NaN validation.
187
+ * Looks ahead 3 lines for patterns like isNaN(), Number.isFinite(), etc.
188
+ */
189
+ function nearbyLinesHaveValidation(content, lineIndex) {
190
+ const lines = content.split('\n');
191
+ const lookAhead = 3;
192
+ const end = Math.min(lineIndex + lookAhead + 1, lines.length);
193
+ for (let i = lineIndex + 1; i < end; i++) {
194
+ /* v8 ignore next -- defensive nullish fallback */
195
+ const nextLine = lines[i] ?? '';
196
+ if (VALIDATION_PATTERNS.some((p) => p.test(nextLine)))
197
+ return true;
198
+ }
199
+ return false;
200
+ }
201
+ /**
202
+ * Patterns for the `|| 0` fallback that safely handles NaN
203
+ * (NaN || 0 evaluates to 0, so NaN never propagates)
204
+ */
205
+ const OR_ZERO_FALLBACK = /\|\|\s*0\b/;
206
+ /**
207
+ * Check if a parse call argument accesses a DynamoDB `.N` attribute.
208
+ * DynamoDB `.N` attributes are guaranteed to be valid numeric strings.
209
+ */
210
+ function isDynamoDBNumericAttribute(node, sourceFile) {
211
+ const firstArg = node.arguments[0];
212
+ /* v8 ignore next -- defensive AST/type guard */
213
+ if (!firstArg)
214
+ return false;
215
+ const argText = firstArg.getText(sourceFile);
216
+ // Match patterns like `item.N`, `attr.N`, `result.Item.count.N`, including with nullish coalescing
217
+ return /\.N\b/.test(argText);
218
+ }
219
+ /**
220
+ * Check if a parse call has a safe numeric string fallback as its argument.
221
+ * Matches patterns like `parseInt(x || '123', 10)` or `parseInt(x ?? '456', 10)`
222
+ * where the fallback is a literal numeric string.
223
+ */
224
+ function hasSafeNumericFallback(node, sourceFile) {
225
+ const firstArg = node.arguments[0];
226
+ /* v8 ignore next -- defensive AST/type guard */
227
+ if (!firstArg)
228
+ return false;
229
+ const argText = firstArg.getText(sourceFile);
230
+ // Match `expr || 'digits'` or `expr ?? 'digits'` (any quote style) where the fallback is a numeric string
231
+ return /(?:\|\||\?\?)\s*['"`][\d.]+['"`]/.test(argText);
232
+ }
233
+ /**
234
+ * Check if a regex digit guard precedes the parse call on nearby lines,
235
+ * guaranteeing digits-only input. Detects two patterns:
236
+ * 1. Inline guard: `/^\d+$/.test(value)` on the same or preceding line
237
+ * 2. Regex capture: a regex containing `\d` groups (via `.exec()` or variable)
238
+ * where the parse call argument is a regex match subscript (e.g., `match[1]`)
239
+ */
240
+ function hasRegexDigitGuard(content, lineIndex, node, sourceFile) {
241
+ const lines = content.split('\n');
242
+ const lookBack = 3;
243
+ /* v8 ignore next -- defensive non-negative guard */
244
+ const start = Math.max(0, lineIndex - lookBack);
245
+ // Pattern 1: inline .test() with \d regex on same or preceding lines
246
+ for (let i = start; i <= lineIndex; i++) {
247
+ /* v8 ignore next -- defensive nullish fallback */
248
+ const line = lines[i] ?? '';
249
+ if (/\/[^/]*\\d[^/]*\/\w*\.test\(/.test(line))
250
+ return true;
251
+ }
252
+ // Pattern 2: regex capture group - check if parseInt arg is a match subscript
253
+ // AND a regex with \d is defined or used nearby
254
+ const firstArg = node.arguments[0];
255
+ /* v8 ignore next -- defensive AST/type guard */
256
+ if (!firstArg)
257
+ return false;
258
+ const argText = firstArg.getText(sourceFile);
259
+ // Argument must be a match result subscript (e.g., `match[1]`, `retryAfterMatch[1]`)
260
+ // eslint-disable-next-line sonarjs/slow-regex -- simple pattern matching identifier[digit]; no backtracking risk
261
+ if (!/\w+\[\d+\]/.test(argText))
262
+ return false;
263
+ // Look for regex with \d in nearby lines (broader window for variable-defined regex)
264
+ const regexLookBack = 5;
265
+ /* v8 ignore next -- defensive non-negative guard */
266
+ const regexStart = Math.max(0, lineIndex - regexLookBack);
267
+ for (let i = regexStart; i <= lineIndex; i++) {
268
+ /* v8 ignore next -- defensive nullish fallback */
269
+ const line = lines[i] ?? '';
270
+ if (/\/[^/]*\\d[^/]*\//.test(line))
271
+ return true;
272
+ }
273
+ return false;
274
+ }
275
+ /**
276
+ * Check parseInt/parseFloat calls for NaN validation
277
+ */
278
+ function checkParseCall(options) {
279
+ const { node, sourceFile, content } = options;
280
+ const expr = node.expression;
281
+ if (!ts.isIdentifier(expr))
282
+ return null;
283
+ if (expr.text !== 'parseInt' && expr.text !== 'parseFloat')
284
+ return null;
285
+ if (isInsideValidationCheck(node))
286
+ return null;
287
+ const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
288
+ const lines = content.split('\n');
289
+ /* v8 ignore next -- defensive nullish fallback */
290
+ const lineText = lines[line] ?? '';
291
+ // Check current line for validation patterns
292
+ /* v8 ignore next -- defensive AST/type guard */
293
+ if (VALIDATION_PATTERNS.some((p) => p.test(lineText)))
294
+ return null;
295
+ // Check next 2-3 lines for NaN validation (multi-line validation pattern)
296
+ if (nearbyLinesHaveValidation(content, line))
297
+ return null;
298
+ // DynamoDB .N attributes are guaranteed valid numeric strings
299
+ if (isDynamoDBNumericAttribute(node, sourceFile))
300
+ return null;
301
+ // Safe fallback: `|| 0` on the same line converts NaN to 0
302
+ /* v8 ignore next -- defensive AST/type guard */
303
+ if (OR_ZERO_FALLBACK.test(lineText))
304
+ return null;
305
+ // Safe numeric string fallback in argument (e.g., `x ?? '0'`)
306
+ // combined with `|| 0` on the result line, or standalone safe defaults
307
+ if (hasSafeNumericFallback(node, sourceFile))
308
+ return null;
309
+ // Regex digit guard preceding the parse call guarantees digits-only input
310
+ if (hasRegexDigitGuard(content, line, node, sourceFile))
311
+ return null;
312
+ return createParseViolation({ node, funcName: expr.text, sourceFile });
313
+ }
314
+ /**
315
+ * Analyze a file for numeric validation issues
316
+ *
317
+ * @param content - File content to analyze
318
+ * @param filePath - Path to the file
319
+ * @returns Array of violations found
320
+ */
321
+ function analyzeFile(content, filePath) {
322
+ const violations = [];
323
+ // Skip test files — test code doesn't need numeric validation guards
324
+ if (isTestFile(filePath)) {
325
+ return violations;
326
+ }
327
+ // Skip route handler files — parameters come from Zod-validated schemas
328
+ if (filePath.includes('routes/')) {
329
+ return violations;
330
+ }
331
+ // Quick filter: skip files without numeric-related patterns
332
+ if (!QUICK_FILTER_KEYWORDS.some((kw) => content.includes(kw))) {
333
+ return violations;
334
+ }
335
+ try {
336
+ const sourceFile = getSharedSourceFile(filePath, content);
337
+ /* v8 ignore next -- defensive guard */
338
+ if (!sourceFile)
339
+ return [];
340
+ // Skip files that import Zod — parameters likely come from parsed schemas
341
+ if (fileImportsZod(sourceFile))
342
+ return [];
343
+ const visit = (node) => {
344
+ if (ts.isFunctionDeclaration(node) ||
345
+ ts.isMethodDeclaration(node) ||
346
+ ts.isArrowFunction(node)) {
347
+ violations.push(...checkFunctionParameters({ node, sourceFile }));
348
+ }
349
+ if (ts.isCallExpression(node)) {
350
+ const parseViolation = checkParseCall({ node, sourceFile, content });
351
+ if (parseViolation) {
352
+ violations.push(parseViolation);
353
+ }
354
+ }
355
+ ts.forEachChild(node, visit);
356
+ };
357
+ visit(sourceFile);
358
+ /* v8 ignore next 1 -- defensive catch: parse failures already handled */
359
+ }
360
+ catch {
361
+ // @swallow-ok Skip files that fail to parse
362
+ }
363
+ return violations;
364
+ }
365
+ /**
366
+ * Check: quality/numeric-validation
367
+ *
368
+ * Detects numeric parameters without NaN/Infinity/range validation.
369
+ */
370
+ export const numericValidation = defineCheck({
371
+ id: '7e6e4703-670d-45cd-a0cd-e14595e6fffc',
372
+ slug: 'numeric-validation',
373
+ scope: { languages: ['typescript'], concerns: ['backend', 'server'] },
374
+ // 'raw', not 'strip-strings': fileImportsZod matches on the import specifier
375
+ // .text (e.g. "zod"), and hasSafeNumericFallback / OR_ZERO etc. inspect
376
+ // argument getText() for quoted numeric fallbacks like `?? '0'`. Stripping
377
+ // blanks the specifier and the fallback literal, breaking the documented
378
+ // auto-exemptions for zod files and safe parseInt forms.
379
+ contentFilter: 'raw',
380
+ confidence: 'high',
381
+ description: 'Detect numeric parameters without NaN/Infinity/range validation',
382
+ longDescription: `**Purpose:** Ensures numeric function parameters and \`parseInt\`/\`parseFloat\` results are validated for \`NaN\` and \`Infinity\`, preventing silent arithmetic bugs.
383
+
384
+ **Detects:**
385
+ - Function/method/arrow-function parameters with explicit \`number\` type whose body lacks \`Number.isFinite\`, \`Number.isNaN\`, \`Number.isInteger\`, \`isFinite()\`, \`isNaN()\`, or \`typeof === 'number'\` checks
386
+ - \`parseInt()\` and \`parseFloat()\` calls whose result is not validated for NaN
387
+
388
+ **Auto-exempts:**
389
+ - Validation on the same line or within the next 3 lines (multi-line validation)
390
+ - DynamoDB \`.N\` attribute access (guaranteed valid numeric strings)
391
+ - \`|| 0\` fallback on the result (NaN || 0 safely evaluates to 0)
392
+ - Safe numeric string fallback in argument (e.g., \`parseInt(x ?? '0', 10)\`)
393
+ - Regex digit guards preceding the call (e.g., \`/^\\\\d+$/.test(v)\` or regex \`\\\\d\` capture groups via \`.exec()\`)
394
+ - Calls wrapped inside \`Number.isFinite()\`
395
+ - Files that import from \`zod\` (parameters come from Zod-parsed schemas)
396
+ - Private/internal functions (prefixed with \`_\` or \`private\` keyword)
397
+ - Parameters with default values (e.g., \`limit = 50\`)
398
+ - Safe parameter names: loop indices (\`i\`, \`j\`, \`k\`, \`index\`), counters (\`count\`, \`length\`, \`offset\`, \`limit\`, \`depth\`, \`level\`, \`size\`, \`capacity\`)
399
+ - Test files (\`*.test.ts\`, \`__tests__/\`)
400
+ - Route handler files (\`routes/\` -- receive Zod-validated params)
401
+
402
+ **Why it matters:** \`NaN\` and \`Infinity\` silently propagate through arithmetic, corrupting calculations and stored values without throwing errors.
403
+
404
+ **Scope:** General best practice. Analyzes each file individually.`,
405
+ tags: ['quality', 'code-quality', 'type-safety'],
406
+ fileTypes: ['ts', 'tsx'],
407
+ analyze: analyzeFile,
408
+ });
409
+ //# sourceMappingURL=numeric-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numeric-validation.js","sourceRoot":"","sources":["../../../../src/checks/quality/data-integrity/numeric-validation.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAuB,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC;;GAEG;AACH,MAAM,qBAAqB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;AAE7E;;GAEG;AACH,MAAM,mBAAmB,GAAG;IAC1B,kBAAkB;IAClB,eAAe;IACf,mBAAmB;IACnB,YAAY;IACZ,SAAS;IACT,sCAAsC;CACvC,CAAC;AAEF;;;GAGG;AACH,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,OAAO;IACP,GAAG;IACH,GAAG;IACH,GAAG;IACH,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,UAAU;CACX,CAAC,CAAC;AAEH;;;GAGG;AACH,SAAS,cAAc,CAAC,UAAyB;IAC/C,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QACzC,IACE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAC5B,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC;YACxC,IAAI,CAAC,eAAe,CAAC,IAAI,KAAK,KAAK,EACnC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAC1B,IAAsE;IAEtE,mFAAmF;IACnF,IAAI,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,8BAA8B;QAC9B,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACzE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,mCAAmC;QACnC,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,KAA8B;IACrD,OAAO,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,KAA8B;IACvD,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;IACrC,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAa,EAAE,UAAyB;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC3D,CAAC;AAQD;;GAEG;AACH,SAAS,wBAAwB,CAAC,OAAwC;IACxE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1E,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,6BAA6B,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC;IACzB,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE5C,OAAO;QACL,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,SAAS,GAAG,CAAC;QACrB,OAAO,EAAE,sBAAsB,SAAS,iCAAiC;QACzE,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,qBAAqB;QAC3B,UAAU,EAAE,qEAAqE,SAAS,iCAAiC,SAAS,gCAAgC;QACpK,KAAK,EAAE,SAAS;KACjB,CAAC;AACJ,CAAC;AAQD;;GAEG;AACH,SAAS,uBAAuB,CAAC,OAAuC;IACtE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACrC,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,uCAAuC;IACvC,IAAI,CAAC,IAAI;QAAE,OAAO,UAAU,CAAC;IAE7B,2EAA2E;IAC3E,IAAI,mBAAmB,CAAC,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IAEjD,+CAA+C;IAC/C,MAAM,uBAAuB,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/D,gDAAgD;QAChD,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC5C,IAAI,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QAEtD,mEAAmE;QACnE,IAAI,eAAe,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEzC,2DAA2D;QAC3D,gDAAgD;QAChD,IAAI,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAE3F,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,KAAK,IAAI,uBAAuB,EAAE,CAAC;QAC5C,UAAU,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,IAAuB;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,OAAO,EAAE,CAAC,0BAA0B,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC;AAC1F,CAAC;AASD;;GAEG;AACH,SAAS,oBAAoB,CAAC,OAAoC;IAChE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC/C,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,6BAA6B,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC;IACzB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE3C,OAAO;QACL,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,SAAS,GAAG,CAAC;QACrB,OAAO,EAAE,GAAG,QAAQ,iCAAiC;QACrD,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,mBAAmB;QACzB,UAAU,EAAE,YAAY,QAAQ,2CAA2C,QAAQ,qEAAqE;QACxJ,KAAK,EAAE,SAAS;KACjB,CAAC;AACJ,CAAC;AASD;;;GAGG;AACH,SAAS,yBAAyB,CAAC,OAAe,EAAE,SAAiB;IACnE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,CAAC,CAAC;IACpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,SAAS,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9D,KAAK,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,kDAAkD;QAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IACrE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAEtC;;;GAGG;AACH,SAAS,0BAA0B,CAAC,IAAuB,EAAE,UAAyB;IACpF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACnC,gDAAgD;IAChD,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,mGAAmG;IACnG,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,SAAS,sBAAsB,CAAC,IAAuB,EAAE,UAAyB;IAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACnC,gDAAgD;IAChD,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,0GAA0G;IAC1G,OAAO,kCAAkC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CACzB,OAAe,EACf,SAAiB,EACjB,IAAuB,EACvB,UAAyB;IAEzB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,CAAC,CAAC;IACnB,oDAAoD;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC,CAAC;IAEhD,qEAAqE;IACrE,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,kDAAkD;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IAC7D,CAAC;IAED,8EAA8E;IAC9E,gDAAgD;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACnC,gDAAgD;IAChD,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,qFAAqF;IACrF,iHAAiH;IACjH,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAE9C,qFAAqF;IACrF,MAAM,aAAa,GAAG,CAAC,CAAC;IACxB,oDAAoD;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC,CAAC;IAC1D,KAAK,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,kDAAkD;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IAClD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAA8B;IACpD,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IACxE,IAAI,uBAAuB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAE/C,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,6BAA6B,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,kDAAkD;IAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAEnC,6CAA6C;IAC7C,gDAAgD;IAChD,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnE,0EAA0E;IAC1E,IAAI,yBAAyB,CAAC,OAAO,EAAE,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1D,8DAA8D;IAC9D,IAAI,0BAA0B,CAAC,IAAI,EAAE,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9D,2DAA2D;IAC3D,gDAAgD;IAChD,IAAI,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjD,8DAA8D;IAC9D,uEAAuE;IACvE,IAAI,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1D,0EAA0E;IAC1E,IAAI,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAErE,OAAO,oBAAoB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,OAAe,EAAE,QAAgB;IACpD,MAAM,UAAU,GAAqB,EAAE,CAAC;IAExC,qEAAqE;IACrE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,wEAAwE;IACxE,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,4DAA4D;IAC5D,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1D,uCAAuC;QACvC,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QAE3B,0EAA0E;QAC1E,IAAI,cAAc,CAAC,UAAU,CAAC;YAAE,OAAO,EAAE,CAAC;QAE1C,MAAM,KAAK,GAAG,CAAC,IAAa,EAAQ,EAAE;YACpC,IACE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;gBAC9B,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;gBAC5B,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EACxB,CAAC;gBACD,UAAU,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;YACpE,CAAC;YAED,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,MAAM,cAAc,GAAG,cAAc,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;gBACrE,IAAI,cAAc,EAAE,CAAC;oBACnB,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YAED,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,KAAK,CAAC,UAAU,CAAC,CAAC;QAClB,yEAAyE;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAC;IAC3C,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,oBAAoB;IAC1B,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;IACrE,6EAA6E;IAC7E,wEAAwE;IACxE,2EAA2E;IAC3E,yEAAyE;IACzE,yDAAyD;IACzD,aAAa,EAAE,KAAK;IAEpB,UAAU,EAAE,MAAM;IAClB,WAAW,EAAE,iEAAiE;IAC9E,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;mEAsBgD;IACjE,IAAI,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,aAAa,CAAC;IAChD,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;IAExB,OAAO,EAAE,WAAW;CACrB,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @fileoverview Form Input Accessibility Labels Check
3
+ *
4
+ * Verifies that form input components have associated labels for accessibility.
5
+ * Supports React Native and Tamagui form components.
6
+ */
7
+ /**
8
+ * Check: quality/a11y-form-labels
9
+ *
10
+ * Ensures form input components have associated labels for accessibility
11
+ * compliance and screen reader support.
12
+ */
13
+ export declare const a11yFormLabels: import("@opensip-cli/fitness").Check;
14
+ //# sourceMappingURL=a11y-form-labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a11y-form-labels.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/frontend/a11y-form-labels.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2EH;;;;;GAKG;AACH,eAAO,MAAM,cAAc,sCAoBzB,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * @fileoverview Form Input Accessibility Labels Check
3
+ *
4
+ * Verifies that form input components have associated labels for accessibility.
5
+ * Supports React Native and Tamagui form components.
6
+ */
7
+ import { defineCheck } from '@opensip-cli/fitness';
8
+ import { getSharedSourceFile } from '@opensip-cli/lang-typescript';
9
+ import * as ts from 'typescript';
10
+ /**
11
+ * Form input components that should have accessibility labels.
12
+ * Includes React Native and common UI library form components.
13
+ */
14
+ const FORM_INPUT_COMPONENTS = new Set(['TextInput', 'Input', 'Select', 'Picker']);
15
+ /**
16
+ * Props that satisfy the accessibility label requirement.
17
+ * Any one of these props being present is sufficient.
18
+ */
19
+ const ACCESSIBILITY_LABEL_PROPS = new Set([
20
+ 'accessibilityLabel',
21
+ 'accessibilityLabelledBy',
22
+ 'aria-label',
23
+ 'aria-labelledby',
24
+ ]);
25
+ /**
26
+ * Analyze a TSX file for form accessibility issues
27
+ * @param {string} content - The content of the file to analyze
28
+ * @param {string} filePath - The absolute path of the TSX file
29
+ * @returns {CheckViolation[]} Array of accessibility violations found
30
+ */
31
+ function analyzeFile(content, filePath) {
32
+ // Only check TSX files
33
+ if (!filePath.endsWith('.tsx')) {
34
+ return [];
35
+ }
36
+ const violations = [];
37
+ const sourceFile = getSharedSourceFile(filePath, content);
38
+ /* v8 ignore next -- defensive guard */
39
+ if (!sourceFile)
40
+ return violations;
41
+ const visit = (node) => {
42
+ if (ts.isJsxOpeningElement(node) || ts.isJsxSelfClosingElement(node)) {
43
+ const tagName = ts.isIdentifier(node.tagName) ? node.tagName.text : '';
44
+ if (FORM_INPUT_COMPONENTS.has(tagName)) {
45
+ const hasA11yLabel = node.attributes.properties.some((attr) => ts.isJsxAttribute(attr) && ACCESSIBILITY_LABEL_PROPS.has(attr.name.getText()));
46
+ if (!hasA11yLabel) {
47
+ const { line, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
48
+ const lineNum = line + 1;
49
+ const matchText = node.getText(sourceFile).slice(0, 100);
50
+ violations.push({
51
+ filePath,
52
+ line: lineNum,
53
+ column: character + 1,
54
+ message: `<${tagName}> missing accessibility label`,
55
+ severity: 'warning',
56
+ suggestion: `Add accessibilityLabel="description" or link to a label with accessibilityLabelledBy`,
57
+ type: 'missing-form-label',
58
+ match: matchText,
59
+ });
60
+ }
61
+ }
62
+ }
63
+ ts.forEachChild(node, visit);
64
+ };
65
+ visit(sourceFile);
66
+ return violations;
67
+ }
68
+ /**
69
+ * Check: quality/a11y-form-labels
70
+ *
71
+ * Ensures form input components have associated labels for accessibility
72
+ * compliance and screen reader support.
73
+ */
74
+ export const a11yFormLabels = defineCheck({
75
+ id: '67feb11a-bc57-45cf-94e0-5354795d2e3c',
76
+ slug: 'a11y-form-labels',
77
+ scope: { languages: ['typescript', 'tsx'], concerns: ['frontend', 'ui'] },
78
+ confidence: 'high',
79
+ description: 'Verify form inputs have associated labels for accessibility',
80
+ longDescription: `**Purpose:** Ensures form input components have associated accessibility labels so screen readers can identify them.
81
+
82
+ **Detects:** Analyzes each file individually using TypeScript AST traversal of JSX elements.
83
+ - \`<TextInput>\`, \`<Input>\`, \`<Select>\`, and \`<Picker>\` components missing all of: \`accessibilityLabel\`, \`accessibilityLabelledBy\`, \`aria-label\`, \`aria-labelledby\`
84
+ - Only scans \`.tsx\` files; excludes test files
85
+
86
+ **Why it matters:** Form inputs without labels are invisible to screen readers, making forms unusable for visually impaired users.
87
+
88
+ **Scope:** General best practice`,
89
+ tags: ['quality', 'accessibility', 'frontend', 'forms'],
90
+ fileTypes: ['ts', 'tsx'],
91
+ analyze: analyzeFile,
92
+ });
93
+ //# sourceMappingURL=a11y-form-labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a11y-form-labels.js","sourceRoot":"","sources":["../../../../src/checks/quality/frontend/a11y-form-labels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @fileoverview A11y Semantic HTML Check
3
+ *
4
+ * Detects div-soup anti-patterns where View components have onPress handlers
5
+ * without proper accessibility role definitions.
6
+ */
7
+ /**
8
+ * Check: quality/a11y-semantic-html
9
+ *
10
+ * Detects View components with press handlers that lack accessibilityRole.
11
+ * This is a div-soup anti-pattern that hurts screen reader accessibility.
12
+ */
13
+ export declare const a11ySemanticHtml: import("@opensip-cli/fitness").Check;
14
+ //# sourceMappingURL=a11y-semantic-html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a11y-semantic-html.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/frontend/a11y-semantic-html.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyEH;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,sCAoB3B,CAAC"}