@opensip-cli/checks-universal 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 (620) 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 +17 -0
  5. package/dist/__tests__/all-checks-execute.test.d.ts.map +1 -0
  6. package/dist/__tests__/all-checks-execute.test.js +452 -0
  7. package/dist/__tests__/all-checks-execute.test.js.map +1 -0
  8. package/dist/__tests__/behavior-fixtures-10.test.d.ts +8 -0
  9. package/dist/__tests__/behavior-fixtures-10.test.d.ts.map +1 -0
  10. package/dist/__tests__/behavior-fixtures-10.test.js +200 -0
  11. package/dist/__tests__/behavior-fixtures-10.test.js.map +1 -0
  12. package/dist/__tests__/behavior-fixtures-11.test.d.ts +8 -0
  13. package/dist/__tests__/behavior-fixtures-11.test.d.ts.map +1 -0
  14. package/dist/__tests__/behavior-fixtures-11.test.js +120 -0
  15. package/dist/__tests__/behavior-fixtures-11.test.js.map +1 -0
  16. package/dist/__tests__/behavior-fixtures-12.test.d.ts +8 -0
  17. package/dist/__tests__/behavior-fixtures-12.test.d.ts.map +1 -0
  18. package/dist/__tests__/behavior-fixtures-12.test.js +157 -0
  19. package/dist/__tests__/behavior-fixtures-12.test.js.map +1 -0
  20. package/dist/__tests__/behavior-fixtures-2.test.d.ts +8 -0
  21. package/dist/__tests__/behavior-fixtures-2.test.d.ts.map +1 -0
  22. package/dist/__tests__/behavior-fixtures-2.test.js +785 -0
  23. package/dist/__tests__/behavior-fixtures-2.test.js.map +1 -0
  24. package/dist/__tests__/behavior-fixtures-3.test.d.ts +6 -0
  25. package/dist/__tests__/behavior-fixtures-3.test.d.ts.map +1 -0
  26. package/dist/__tests__/behavior-fixtures-3.test.js +663 -0
  27. package/dist/__tests__/behavior-fixtures-3.test.js.map +1 -0
  28. package/dist/__tests__/behavior-fixtures-4.test.d.ts +5 -0
  29. package/dist/__tests__/behavior-fixtures-4.test.d.ts.map +1 -0
  30. package/dist/__tests__/behavior-fixtures-4.test.js +612 -0
  31. package/dist/__tests__/behavior-fixtures-4.test.js.map +1 -0
  32. package/dist/__tests__/behavior-fixtures-5.test.d.ts +5 -0
  33. package/dist/__tests__/behavior-fixtures-5.test.d.ts.map +1 -0
  34. package/dist/__tests__/behavior-fixtures-5.test.js +469 -0
  35. package/dist/__tests__/behavior-fixtures-5.test.js.map +1 -0
  36. package/dist/__tests__/behavior-fixtures-6.test.d.ts +8 -0
  37. package/dist/__tests__/behavior-fixtures-6.test.d.ts.map +1 -0
  38. package/dist/__tests__/behavior-fixtures-6.test.js +591 -0
  39. package/dist/__tests__/behavior-fixtures-6.test.js.map +1 -0
  40. package/dist/__tests__/behavior-fixtures-7.test.d.ts +5 -0
  41. package/dist/__tests__/behavior-fixtures-7.test.d.ts.map +1 -0
  42. package/dist/__tests__/behavior-fixtures-7.test.js +662 -0
  43. package/dist/__tests__/behavior-fixtures-7.test.js.map +1 -0
  44. package/dist/__tests__/behavior-fixtures-8.test.d.ts +11 -0
  45. package/dist/__tests__/behavior-fixtures-8.test.d.ts.map +1 -0
  46. package/dist/__tests__/behavior-fixtures-8.test.js +634 -0
  47. package/dist/__tests__/behavior-fixtures-8.test.js.map +1 -0
  48. package/dist/__tests__/behavior-fixtures-9.test.d.ts +11 -0
  49. package/dist/__tests__/behavior-fixtures-9.test.d.ts.map +1 -0
  50. package/dist/__tests__/behavior-fixtures-9.test.js +271 -0
  51. package/dist/__tests__/behavior-fixtures-9.test.js.map +1 -0
  52. package/dist/__tests__/behavior-fixtures.test.d.ts +14 -0
  53. package/dist/__tests__/behavior-fixtures.test.d.ts.map +1 -0
  54. package/dist/__tests__/behavior-fixtures.test.js +1423 -0
  55. package/dist/__tests__/behavior-fixtures.test.js.map +1 -0
  56. package/dist/__tests__/checks.test.d.ts +2 -0
  57. package/dist/__tests__/checks.test.d.ts.map +1 -0
  58. package/dist/__tests__/checks.test.js +61 -0
  59. package/dist/__tests__/checks.test.js.map +1 -0
  60. package/dist/__tests__/env-var-validation.test.d.ts +14 -0
  61. package/dist/__tests__/env-var-validation.test.d.ts.map +1 -0
  62. package/dist/__tests__/env-var-validation.test.js +53 -0
  63. package/dist/__tests__/env-var-validation.test.js.map +1 -0
  64. package/dist/__tests__/file-length-limit.test.d.ts +2 -0
  65. package/dist/__tests__/file-length-limit.test.d.ts.map +1 -0
  66. package/dist/__tests__/file-length-limit.test.js +29 -0
  67. package/dist/__tests__/file-length-limit.test.js.map +1 -0
  68. package/dist/__tests__/fixture-coverage.allowlist.d.ts +18 -0
  69. package/dist/__tests__/fixture-coverage.allowlist.d.ts.map +1 -0
  70. package/dist/__tests__/fixture-coverage.allowlist.js +35 -0
  71. package/dist/__tests__/fixture-coverage.allowlist.js.map +1 -0
  72. package/dist/__tests__/fixture-coverage.test.d.ts +13 -0
  73. package/dist/__tests__/fixture-coverage.test.d.ts.map +1 -0
  74. package/dist/__tests__/fixture-coverage.test.js +57 -0
  75. package/dist/__tests__/fixture-coverage.test.js.map +1 -0
  76. package/dist/__tests__/iic.test.d.ts +15 -0
  77. package/dist/__tests__/iic.test.d.ts.map +1 -0
  78. package/dist/__tests__/iic.test.js +316 -0
  79. package/dist/__tests__/iic.test.js.map +1 -0
  80. package/dist/__tests__/no-skipped-tests.test.d.ts +14 -0
  81. package/dist/__tests__/no-skipped-tests.test.d.ts.map +1 -0
  82. package/dist/__tests__/no-skipped-tests.test.js +144 -0
  83. package/dist/__tests__/no-skipped-tests.test.js.map +1 -0
  84. package/dist/__tests__/no-todo-comments.test.d.ts +2 -0
  85. package/dist/__tests__/no-todo-comments.test.d.ts.map +1 -0
  86. package/dist/__tests__/no-todo-comments.test.js +31 -0
  87. package/dist/__tests__/no-todo-comments.test.js.map +1 -0
  88. package/dist/__tests__/no-unimplemented-markers.test.d.ts +2 -0
  89. package/dist/__tests__/no-unimplemented-markers.test.d.ts.map +1 -0
  90. package/dist/__tests__/no-unimplemented-markers.test.js +140 -0
  91. package/dist/__tests__/no-unimplemented-markers.test.js.map +1 -0
  92. package/dist/__tests__/public-api-jsdoc-scope.test.d.ts +10 -0
  93. package/dist/__tests__/public-api-jsdoc-scope.test.d.ts.map +1 -0
  94. package/dist/__tests__/public-api-jsdoc-scope.test.js +176 -0
  95. package/dist/__tests__/public-api-jsdoc-scope.test.js.map +1 -0
  96. package/dist/__tests__/resilience-fp.test.d.ts +14 -0
  97. package/dist/__tests__/resilience-fp.test.d.ts.map +1 -0
  98. package/dist/__tests__/resilience-fp.test.js +110 -0
  99. package/dist/__tests__/resilience-fp.test.js.map +1 -0
  100. package/dist/checks/architecture/__tests__/no-kebab-option-indexing.test.d.ts +2 -0
  101. package/dist/checks/architecture/__tests__/no-kebab-option-indexing.test.d.ts.map +1 -0
  102. package/dist/checks/architecture/__tests__/no-kebab-option-indexing.test.js +32 -0
  103. package/dist/checks/architecture/__tests__/no-kebab-option-indexing.test.js.map +1 -0
  104. package/dist/checks/architecture/__tests__/tool-has-manifest.test.d.ts +2 -0
  105. package/dist/checks/architecture/__tests__/tool-has-manifest.test.d.ts.map +1 -0
  106. package/dist/checks/architecture/__tests__/tool-has-manifest.test.js +152 -0
  107. package/dist/checks/architecture/__tests__/tool-has-manifest.test.js.map +1 -0
  108. package/dist/checks/architecture/__tests__/vitest-config-required-with-tests.test.d.ts +2 -0
  109. package/dist/checks/architecture/__tests__/vitest-config-required-with-tests.test.d.ts.map +1 -0
  110. package/dist/checks/architecture/__tests__/vitest-config-required-with-tests.test.js +129 -0
  111. package/dist/checks/architecture/__tests__/vitest-config-required-with-tests.test.js.map +1 -0
  112. package/dist/checks/architecture/_yaml-doc-bindings.d.ts +23 -0
  113. package/dist/checks/architecture/_yaml-doc-bindings.d.ts.map +1 -0
  114. package/dist/checks/architecture/_yaml-doc-bindings.js +29 -0
  115. package/dist/checks/architecture/_yaml-doc-bindings.js.map +1 -0
  116. package/dist/checks/architecture/dependencies/index.d.ts +2 -0
  117. package/dist/checks/architecture/dependencies/index.d.ts.map +1 -0
  118. package/dist/checks/architecture/dependencies/index.js +2 -0
  119. package/dist/checks/architecture/dependencies/index.js.map +1 -0
  120. package/dist/checks/architecture/dependencies/no-duplicate-packages.d.ts +11 -0
  121. package/dist/checks/architecture/dependencies/no-duplicate-packages.d.ts.map +1 -0
  122. package/dist/checks/architecture/dependencies/no-duplicate-packages.js +171 -0
  123. package/dist/checks/architecture/dependencies/no-duplicate-packages.js.map +1 -0
  124. package/dist/checks/architecture/docker-best-practices.d.ts +23 -0
  125. package/dist/checks/architecture/docker-best-practices.d.ts.map +1 -0
  126. package/dist/checks/architecture/docker-best-practices.js +427 -0
  127. package/dist/checks/architecture/docker-best-practices.js.map +1 -0
  128. package/dist/checks/architecture/docker-ignore-validation.d.ts +18 -0
  129. package/dist/checks/architecture/docker-ignore-validation.d.ts.map +1 -0
  130. package/dist/checks/architecture/docker-ignore-validation.js +117 -0
  131. package/dist/checks/architecture/docker-ignore-validation.js.map +1 -0
  132. package/dist/checks/architecture/docker-version-sync.d.ts +16 -0
  133. package/dist/checks/architecture/docker-version-sync.d.ts.map +1 -0
  134. package/dist/checks/architecture/docker-version-sync.js +193 -0
  135. package/dist/checks/architecture/docker-version-sync.js.map +1 -0
  136. package/dist/checks/architecture/env-var-validation.d.ts +14 -0
  137. package/dist/checks/architecture/env-var-validation.d.ts.map +1 -0
  138. package/dist/checks/architecture/env-var-validation.js +289 -0
  139. package/dist/checks/architecture/env-var-validation.js.map +1 -0
  140. package/dist/checks/architecture/heavy-import-detection.d.ts +11 -0
  141. package/dist/checks/architecture/heavy-import-detection.d.ts.map +1 -0
  142. package/dist/checks/architecture/heavy-import-detection.js +91 -0
  143. package/dist/checks/architecture/heavy-import-detection.js.map +1 -0
  144. package/dist/checks/architecture/index.d.ts +16 -0
  145. package/dist/checks/architecture/index.d.ts.map +1 -0
  146. package/dist/checks/architecture/index.js +16 -0
  147. package/dist/checks/architecture/index.js.map +1 -0
  148. package/dist/checks/architecture/modules/empty-package-detection.d.ts +11 -0
  149. package/dist/checks/architecture/modules/empty-package-detection.d.ts.map +1 -0
  150. package/dist/checks/architecture/modules/empty-package-detection.js +277 -0
  151. package/dist/checks/architecture/modules/empty-package-detection.js.map +1 -0
  152. package/dist/checks/architecture/modules/index.d.ts +3 -0
  153. package/dist/checks/architecture/modules/index.d.ts.map +1 -0
  154. package/dist/checks/architecture/modules/index.js +3 -0
  155. package/dist/checks/architecture/modules/index.js.map +1 -0
  156. package/dist/checks/architecture/modules/interface-implementation-consistency.d.ts +12 -0
  157. package/dist/checks/architecture/modules/interface-implementation-consistency.d.ts.map +1 -0
  158. package/dist/checks/architecture/modules/interface-implementation-consistency.js +555 -0
  159. package/dist/checks/architecture/modules/interface-implementation-consistency.js.map +1 -0
  160. package/dist/checks/architecture/no-custom-event-emitter.d.ts +11 -0
  161. package/dist/checks/architecture/no-custom-event-emitter.d.ts.map +1 -0
  162. package/dist/checks/architecture/no-custom-event-emitter.js +123 -0
  163. package/dist/checks/architecture/no-custom-event-emitter.js.map +1 -0
  164. package/dist/checks/architecture/no-kebab-option-indexing.d.ts +33 -0
  165. package/dist/checks/architecture/no-kebab-option-indexing.d.ts.map +1 -0
  166. package/dist/checks/architecture/no-kebab-option-indexing.js +81 -0
  167. package/dist/checks/architecture/no-kebab-option-indexing.js.map +1 -0
  168. package/dist/checks/architecture/node-version-consistency.d.ts +22 -0
  169. package/dist/checks/architecture/node-version-consistency.d.ts.map +1 -0
  170. package/dist/checks/architecture/node-version-consistency.js +225 -0
  171. package/dist/checks/architecture/node-version-consistency.js.map +1 -0
  172. package/dist/checks/architecture/project-readme-existence.d.ts +13 -0
  173. package/dist/checks/architecture/project-readme-existence.d.ts.map +1 -0
  174. package/dist/checks/architecture/project-readme-existence.js +55 -0
  175. package/dist/checks/architecture/project-readme-existence.js.map +1 -0
  176. package/dist/checks/architecture/stale-build-artifacts.d.ts +10 -0
  177. package/dist/checks/architecture/stale-build-artifacts.d.ts.map +1 -0
  178. package/dist/checks/architecture/stale-build-artifacts.js +55 -0
  179. package/dist/checks/architecture/stale-build-artifacts.js.map +1 -0
  180. package/dist/checks/architecture/tool-has-manifest.d.ts +27 -0
  181. package/dist/checks/architecture/tool-has-manifest.d.ts.map +1 -0
  182. package/dist/checks/architecture/tool-has-manifest.js +135 -0
  183. package/dist/checks/architecture/tool-has-manifest.js.map +1 -0
  184. package/dist/checks/architecture/vitest-config-extends-base.d.ts +15 -0
  185. package/dist/checks/architecture/vitest-config-extends-base.d.ts.map +1 -0
  186. package/dist/checks/architecture/vitest-config-extends-base.js +104 -0
  187. package/dist/checks/architecture/vitest-config-extends-base.js.map +1 -0
  188. package/dist/checks/architecture/vitest-config-required-with-tests.d.ts +49 -0
  189. package/dist/checks/architecture/vitest-config-required-with-tests.d.ts.map +1 -0
  190. package/dist/checks/architecture/vitest-config-required-with-tests.js +199 -0
  191. package/dist/checks/architecture/vitest-config-required-with-tests.js.map +1 -0
  192. package/dist/checks/documentation/_directives/eslint.d.ts +9 -0
  193. package/dist/checks/documentation/_directives/eslint.d.ts.map +1 -0
  194. package/dist/checks/documentation/_directives/eslint.js +168 -0
  195. package/dist/checks/documentation/_directives/eslint.js.map +1 -0
  196. package/dist/checks/documentation/_directives/fitness.d.ts +9 -0
  197. package/dist/checks/documentation/_directives/fitness.d.ts.map +1 -0
  198. package/dist/checks/documentation/_directives/fitness.js +64 -0
  199. package/dist/checks/documentation/_directives/fitness.js.map +1 -0
  200. package/dist/checks/documentation/_directives/graph.d.ts +10 -0
  201. package/dist/checks/documentation/_directives/graph.d.ts.map +1 -0
  202. package/dist/checks/documentation/_directives/graph.js +65 -0
  203. package/dist/checks/documentation/_directives/graph.js.map +1 -0
  204. package/dist/checks/documentation/_directives/graph.test.d.ts +2 -0
  205. package/dist/checks/documentation/_directives/graph.test.d.ts.map +1 -0
  206. package/dist/checks/documentation/_directives/graph.test.js +54 -0
  207. package/dist/checks/documentation/_directives/graph.test.js.map +1 -0
  208. package/dist/checks/documentation/_directives/semgrep.d.ts +8 -0
  209. package/dist/checks/documentation/_directives/semgrep.d.ts.map +1 -0
  210. package/dist/checks/documentation/_directives/semgrep.js +72 -0
  211. package/dist/checks/documentation/_directives/semgrep.js.map +1 -0
  212. package/dist/checks/documentation/_directives/types.d.ts +21 -0
  213. package/dist/checks/documentation/_directives/types.d.ts.map +1 -0
  214. package/dist/checks/documentation/_directives/types.js +9 -0
  215. package/dist/checks/documentation/_directives/types.js.map +1 -0
  216. package/dist/checks/documentation/_directives/typescript.d.ts +10 -0
  217. package/dist/checks/documentation/_directives/typescript.d.ts.map +1 -0
  218. package/dist/checks/documentation/_directives/typescript.js +54 -0
  219. package/dist/checks/documentation/_directives/typescript.js.map +1 -0
  220. package/dist/checks/documentation/_public-api-graph.d.ts +30 -0
  221. package/dist/checks/documentation/_public-api-graph.d.ts.map +1 -0
  222. package/dist/checks/documentation/_public-api-graph.js +304 -0
  223. package/dist/checks/documentation/_public-api-graph.js.map +1 -0
  224. package/dist/checks/documentation/directive-audit.d.ts +26 -0
  225. package/dist/checks/documentation/directive-audit.d.ts.map +1 -0
  226. package/dist/checks/documentation/directive-audit.js +144 -0
  227. package/dist/checks/documentation/directive-audit.js.map +1 -0
  228. package/dist/checks/documentation/index.d.ts +3 -0
  229. package/dist/checks/documentation/index.d.ts.map +1 -0
  230. package/dist/checks/documentation/index.js +3 -0
  231. package/dist/checks/documentation/index.js.map +1 -0
  232. package/dist/checks/documentation/public-api-jsdoc.d.ts +10 -0
  233. package/dist/checks/documentation/public-api-jsdoc.d.ts.map +1 -0
  234. package/dist/checks/documentation/public-api-jsdoc.js +131 -0
  235. package/dist/checks/documentation/public-api-jsdoc.js.map +1 -0
  236. package/dist/checks/file-length-limit.d.ts +16 -0
  237. package/dist/checks/file-length-limit.d.ts.map +1 -0
  238. package/dist/checks/file-length-limit.js +47 -0
  239. package/dist/checks/file-length-limit.js.map +1 -0
  240. package/dist/checks/index.d.ts +16 -0
  241. package/dist/checks/index.d.ts.map +1 -0
  242. package/dist/checks/index.js +16 -0
  243. package/dist/checks/index.js.map +1 -0
  244. package/dist/checks/no-todo-comments.d.ts +18 -0
  245. package/dist/checks/no-todo-comments.d.ts.map +1 -0
  246. package/dist/checks/no-todo-comments.js +79 -0
  247. package/dist/checks/no-todo-comments.js.map +1 -0
  248. package/dist/checks/no-unimplemented-markers.d.ts +24 -0
  249. package/dist/checks/no-unimplemented-markers.d.ts.map +1 -0
  250. package/dist/checks/no-unimplemented-markers.js +198 -0
  251. package/dist/checks/no-unimplemented-markers.js.map +1 -0
  252. package/dist/checks/quality/api/graphql-offset-pagination.d.ts +9 -0
  253. package/dist/checks/quality/api/graphql-offset-pagination.d.ts.map +1 -0
  254. package/dist/checks/quality/api/graphql-offset-pagination.js +63 -0
  255. package/dist/checks/quality/api/graphql-offset-pagination.js.map +1 -0
  256. package/dist/checks/quality/api/index.d.ts +3 -0
  257. package/dist/checks/quality/api/index.d.ts.map +1 -0
  258. package/dist/checks/quality/api/index.js +3 -0
  259. package/dist/checks/quality/api/index.js.map +1 -0
  260. package/dist/checks/quality/api/zod-openapi-sync.d.ts +13 -0
  261. package/dist/checks/quality/api/zod-openapi-sync.d.ts.map +1 -0
  262. package/dist/checks/quality/api/zod-openapi-sync.js +88 -0
  263. package/dist/checks/quality/api/zod-openapi-sync.js.map +1 -0
  264. package/dist/checks/quality/code-structure/dead-code.d.ts +12 -0
  265. package/dist/checks/quality/code-structure/dead-code.d.ts.map +1 -0
  266. package/dist/checks/quality/code-structure/dead-code.js +238 -0
  267. package/dist/checks/quality/code-structure/dead-code.js.map +1 -0
  268. package/dist/checks/quality/code-structure/index.d.ts +5 -0
  269. package/dist/checks/quality/code-structure/index.d.ts.map +1 -0
  270. package/dist/checks/quality/code-structure/index.js +5 -0
  271. package/dist/checks/quality/code-structure/index.js.map +1 -0
  272. package/dist/checks/quality/code-structure/no-ai-attribution.d.ts +25 -0
  273. package/dist/checks/quality/code-structure/no-ai-attribution.d.ts.map +1 -0
  274. package/dist/checks/quality/code-structure/no-ai-attribution.js +76 -0
  275. package/dist/checks/quality/code-structure/no-ai-attribution.js.map +1 -0
  276. package/dist/checks/quality/code-structure/no-console-log.d.ts +17 -0
  277. package/dist/checks/quality/code-structure/no-console-log.d.ts.map +1 -0
  278. package/dist/checks/quality/code-structure/no-console-log.js +106 -0
  279. package/dist/checks/quality/code-structure/no-console-log.js.map +1 -0
  280. package/dist/checks/quality/code-structure/no-process-artifacts.d.ts +25 -0
  281. package/dist/checks/quality/code-structure/no-process-artifacts.d.ts.map +1 -0
  282. package/dist/checks/quality/code-structure/no-process-artifacts.js +104 -0
  283. package/dist/checks/quality/code-structure/no-process-artifacts.js.map +1 -0
  284. package/dist/checks/quality/dependency-version-consistency.d.ts +20 -0
  285. package/dist/checks/quality/dependency-version-consistency.d.ts.map +1 -0
  286. package/dist/checks/quality/dependency-version-consistency.js +266 -0
  287. package/dist/checks/quality/dependency-version-consistency.js.map +1 -0
  288. package/dist/checks/quality/fitness-ignore-hygiene.d.ts +10 -0
  289. package/dist/checks/quality/fitness-ignore-hygiene.d.ts.map +1 -0
  290. package/dist/checks/quality/fitness-ignore-hygiene.js +93 -0
  291. package/dist/checks/quality/fitness-ignore-hygiene.js.map +1 -0
  292. package/dist/checks/quality/frontend/expo-vector-icons.d.ts +13 -0
  293. package/dist/checks/quality/frontend/expo-vector-icons.d.ts.map +1 -0
  294. package/dist/checks/quality/frontend/expo-vector-icons.js +80 -0
  295. package/dist/checks/quality/frontend/expo-vector-icons.js.map +1 -0
  296. package/dist/checks/quality/frontend/image-optimization.d.ts +13 -0
  297. package/dist/checks/quality/frontend/image-optimization.d.ts.map +1 -0
  298. package/dist/checks/quality/frontend/image-optimization.js +166 -0
  299. package/dist/checks/quality/frontend/image-optimization.js.map +1 -0
  300. package/dist/checks/quality/frontend/index.d.ts +4 -0
  301. package/dist/checks/quality/frontend/index.d.ts.map +1 -0
  302. package/dist/checks/quality/frontend/index.js +4 -0
  303. package/dist/checks/quality/frontend/index.js.map +1 -0
  304. package/dist/checks/quality/frontend/navigation-typing.d.ts +12 -0
  305. package/dist/checks/quality/frontend/navigation-typing.d.ts.map +1 -0
  306. package/dist/checks/quality/frontend/navigation-typing.js +77 -0
  307. package/dist/checks/quality/frontend/navigation-typing.js.map +1 -0
  308. package/dist/checks/quality/graph-ignore-hygiene.d.ts +10 -0
  309. package/dist/checks/quality/graph-ignore-hygiene.d.ts.map +1 -0
  310. package/dist/checks/quality/graph-ignore-hygiene.js +95 -0
  311. package/dist/checks/quality/graph-ignore-hygiene.js.map +1 -0
  312. package/dist/checks/quality/graph-ignore-hygiene.test.d.ts +14 -0
  313. package/dist/checks/quality/graph-ignore-hygiene.test.d.ts.map +1 -0
  314. package/dist/checks/quality/graph-ignore-hygiene.test.js +58 -0
  315. package/dist/checks/quality/graph-ignore-hygiene.test.js.map +1 -0
  316. package/dist/checks/quality/index.d.ts +16 -0
  317. package/dist/checks/quality/index.d.ts.map +1 -0
  318. package/dist/checks/quality/index.js +16 -0
  319. package/dist/checks/quality/index.js.map +1 -0
  320. package/dist/checks/quality/linting/eslint-justifications.d.ts +12 -0
  321. package/dist/checks/quality/linting/eslint-justifications.d.ts.map +1 -0
  322. package/dist/checks/quality/linting/eslint-justifications.js +328 -0
  323. package/dist/checks/quality/linting/eslint-justifications.js.map +1 -0
  324. package/dist/checks/quality/linting/index.d.ts +4 -0
  325. package/dist/checks/quality/linting/index.d.ts.map +1 -0
  326. package/dist/checks/quality/linting/index.js +4 -0
  327. package/dist/checks/quality/linting/index.js.map +1 -0
  328. package/dist/checks/quality/linting/semgrep-justifications.d.ts +16 -0
  329. package/dist/checks/quality/linting/semgrep-justifications.d.ts.map +1 -0
  330. package/dist/checks/quality/linting/semgrep-justifications.js +229 -0
  331. package/dist/checks/quality/linting/semgrep-justifications.js.map +1 -0
  332. package/dist/checks/quality/linting/typescript-directive-hygiene.d.ts +12 -0
  333. package/dist/checks/quality/linting/typescript-directive-hygiene.d.ts.map +1 -0
  334. package/dist/checks/quality/linting/typescript-directive-hygiene.js +142 -0
  335. package/dist/checks/quality/linting/typescript-directive-hygiene.js.map +1 -0
  336. package/dist/checks/quality/no-compatibility-layer-names.d.ts +13 -0
  337. package/dist/checks/quality/no-compatibility-layer-names.d.ts.map +1 -0
  338. package/dist/checks/quality/no-compatibility-layer-names.js +100 -0
  339. package/dist/checks/quality/no-compatibility-layer-names.js.map +1 -0
  340. package/dist/checks/quality/no-deprecated-tags.d.ts +11 -0
  341. package/dist/checks/quality/no-deprecated-tags.d.ts.map +1 -0
  342. package/dist/checks/quality/no-deprecated-tags.js +76 -0
  343. package/dist/checks/quality/no-deprecated-tags.js.map +1 -0
  344. package/dist/checks/quality/no-markdown-references.d.ts +16 -0
  345. package/dist/checks/quality/no-markdown-references.d.ts.map +1 -0
  346. package/dist/checks/quality/no-markdown-references.js +145 -0
  347. package/dist/checks/quality/no-markdown-references.js.map +1 -0
  348. package/dist/checks/quality/no-raw-regex-on-code.d.ts +9 -0
  349. package/dist/checks/quality/no-raw-regex-on-code.d.ts.map +1 -0
  350. package/dist/checks/quality/no-raw-regex-on-code.js +61 -0
  351. package/dist/checks/quality/no-raw-regex-on-code.js.map +1 -0
  352. package/dist/checks/quality/no-temporary-workarounds.d.ts +11 -0
  353. package/dist/checks/quality/no-temporary-workarounds.d.ts.map +1 -0
  354. package/dist/checks/quality/no-temporary-workarounds.js +69 -0
  355. package/dist/checks/quality/no-temporary-workarounds.js.map +1 -0
  356. package/dist/checks/quality/no-window-alert.d.ts +19 -0
  357. package/dist/checks/quality/no-window-alert.d.ts.map +1 -0
  358. package/dist/checks/quality/no-window-alert.js +74 -0
  359. package/dist/checks/quality/no-window-alert.js.map +1 -0
  360. package/dist/checks/quality/observability/index.d.ts +2 -0
  361. package/dist/checks/quality/observability/index.d.ts.map +1 -0
  362. package/dist/checks/quality/observability/index.js +2 -0
  363. package/dist/checks/quality/observability/index.js.map +1 -0
  364. package/dist/checks/quality/observability/pino-serializer-coverage.d.ts +15 -0
  365. package/dist/checks/quality/observability/pino-serializer-coverage.d.ts.map +1 -0
  366. package/dist/checks/quality/observability/pino-serializer-coverage.js +209 -0
  367. package/dist/checks/quality/observability/pino-serializer-coverage.js.map +1 -0
  368. package/dist/checks/quality/patterns/async-state-pattern.d.ts +14 -0
  369. package/dist/checks/quality/patterns/async-state-pattern.d.ts.map +1 -0
  370. package/dist/checks/quality/patterns/async-state-pattern.js +80 -0
  371. package/dist/checks/quality/patterns/async-state-pattern.js.map +1 -0
  372. package/dist/checks/quality/patterns/index.d.ts +4 -0
  373. package/dist/checks/quality/patterns/index.d.ts.map +1 -0
  374. package/dist/checks/quality/patterns/index.js +4 -0
  375. package/dist/checks/quality/patterns/index.js.map +1 -0
  376. package/dist/checks/quality/patterns/no-non-null-assertions.d.ts +10 -0
  377. package/dist/checks/quality/patterns/no-non-null-assertions.d.ts.map +1 -0
  378. package/dist/checks/quality/patterns/no-non-null-assertions.js +97 -0
  379. package/dist/checks/quality/patterns/no-non-null-assertions.js.map +1 -0
  380. package/dist/checks/quality/patterns/performance-anti-patterns.d.ts +16 -0
  381. package/dist/checks/quality/patterns/performance-anti-patterns.d.ts.map +1 -0
  382. package/dist/checks/quality/patterns/performance-anti-patterns.js +239 -0
  383. package/dist/checks/quality/patterns/performance-anti-patterns.js.map +1 -0
  384. package/dist/checks/resilience/_helpers/config-validation.d.ts +27 -0
  385. package/dist/checks/resilience/_helpers/config-validation.d.ts.map +1 -0
  386. package/dist/checks/resilience/_helpers/config-validation.js +61 -0
  387. package/dist/checks/resilience/_helpers/config-validation.js.map +1 -0
  388. package/dist/checks/resilience/batch-operations.d.ts +22 -0
  389. package/dist/checks/resilience/batch-operations.d.ts.map +1 -0
  390. package/dist/checks/resilience/batch-operations.js +422 -0
  391. package/dist/checks/resilience/batch-operations.js.map +1 -0
  392. package/dist/checks/resilience/cache-ttl-validation.d.ts +13 -0
  393. package/dist/checks/resilience/cache-ttl-validation.d.ts.map +1 -0
  394. package/dist/checks/resilience/cache-ttl-validation.js +222 -0
  395. package/dist/checks/resilience/cache-ttl-validation.js.map +1 -0
  396. package/dist/checks/resilience/catch-clause-safety.d.ts +12 -0
  397. package/dist/checks/resilience/catch-clause-safety.d.ts.map +1 -0
  398. package/dist/checks/resilience/catch-clause-safety.js +110 -0
  399. package/dist/checks/resilience/catch-clause-safety.js.map +1 -0
  400. package/dist/checks/resilience/dangerous-config-defaults.d.ts +11 -0
  401. package/dist/checks/resilience/dangerous-config-defaults.d.ts.map +1 -0
  402. package/dist/checks/resilience/dangerous-config-defaults.js +304 -0
  403. package/dist/checks/resilience/dangerous-config-defaults.js.map +1 -0
  404. package/dist/checks/resilience/error-code-registration.d.ts +11 -0
  405. package/dist/checks/resilience/error-code-registration.d.ts.map +1 -0
  406. package/dist/checks/resilience/error-code-registration.js +88 -0
  407. package/dist/checks/resilience/error-code-registration.js.map +1 -0
  408. package/dist/checks/resilience/event-patterns.d.ts +21 -0
  409. package/dist/checks/resilience/event-patterns.d.ts.map +1 -0
  410. package/dist/checks/resilience/event-patterns.js +232 -0
  411. package/dist/checks/resilience/event-patterns.js.map +1 -0
  412. package/dist/checks/resilience/exit-code-correctness.d.ts +12 -0
  413. package/dist/checks/resilience/exit-code-correctness.d.ts.map +1 -0
  414. package/dist/checks/resilience/exit-code-correctness.js +107 -0
  415. package/dist/checks/resilience/exit-code-correctness.js.map +1 -0
  416. package/dist/checks/resilience/index.d.ts +18 -0
  417. package/dist/checks/resilience/index.d.ts.map +1 -0
  418. package/dist/checks/resilience/index.js +18 -0
  419. package/dist/checks/resilience/index.js.map +1 -0
  420. package/dist/checks/resilience/no-hardcoded-timeouts.d.ts +10 -0
  421. package/dist/checks/resilience/no-hardcoded-timeouts.d.ts.map +1 -0
  422. package/dist/checks/resilience/no-hardcoded-timeouts.js +291 -0
  423. package/dist/checks/resilience/no-hardcoded-timeouts.js.map +1 -0
  424. package/dist/checks/resilience/no-process-exit-in-finally.d.ts +11 -0
  425. package/dist/checks/resilience/no-process-exit-in-finally.d.ts.map +1 -0
  426. package/dist/checks/resilience/no-process-exit-in-finally.js +89 -0
  427. package/dist/checks/resilience/no-process-exit-in-finally.js.map +1 -0
  428. package/dist/checks/resilience/readline-cleanup.d.ts +11 -0
  429. package/dist/checks/resilience/readline-cleanup.d.ts.map +1 -0
  430. package/dist/checks/resilience/readline-cleanup.js +107 -0
  431. package/dist/checks/resilience/readline-cleanup.js.map +1 -0
  432. package/dist/checks/resilience/recovery-patterns.d.ts +25 -0
  433. package/dist/checks/resilience/recovery-patterns.d.ts.map +1 -0
  434. package/dist/checks/resilience/recovery-patterns.js +273 -0
  435. package/dist/checks/resilience/recovery-patterns.js.map +1 -0
  436. package/dist/checks/resilience/reentrancy-guard.d.ts +12 -0
  437. package/dist/checks/resilience/reentrancy-guard.d.ts.map +1 -0
  438. package/dist/checks/resilience/reentrancy-guard.js +86 -0
  439. package/dist/checks/resilience/reentrancy-guard.js.map +1 -0
  440. package/dist/checks/resilience/retry-config-validation.d.ts +13 -0
  441. package/dist/checks/resilience/retry-config-validation.d.ts.map +1 -0
  442. package/dist/checks/resilience/retry-config-validation.js +159 -0
  443. package/dist/checks/resilience/retry-config-validation.js.map +1 -0
  444. package/dist/checks/resilience/sentry/_helpers/sentry.d.ts +25 -0
  445. package/dist/checks/resilience/sentry/_helpers/sentry.d.ts.map +1 -0
  446. package/dist/checks/resilience/sentry/_helpers/sentry.js +68 -0
  447. package/dist/checks/resilience/sentry/_helpers/sentry.js.map +1 -0
  448. package/dist/checks/resilience/sentry/index.d.ts +8 -0
  449. package/dist/checks/resilience/sentry/index.d.ts.map +1 -0
  450. package/dist/checks/resilience/sentry/index.js +8 -0
  451. package/dist/checks/resilience/sentry/index.js.map +1 -0
  452. package/dist/checks/resilience/sentry/sentry-dsn-configured.d.ts +12 -0
  453. package/dist/checks/resilience/sentry/sentry-dsn-configured.d.ts.map +1 -0
  454. package/dist/checks/resilience/sentry/sentry-dsn-configured.js +55 -0
  455. package/dist/checks/resilience/sentry/sentry-dsn-configured.js.map +1 -0
  456. package/dist/checks/resilience/sentry/sentry-environment-set.d.ts +12 -0
  457. package/dist/checks/resilience/sentry/sentry-environment-set.d.ts.map +1 -0
  458. package/dist/checks/resilience/sentry/sentry-environment-set.js +51 -0
  459. package/dist/checks/resilience/sentry/sentry-environment-set.js.map +1 -0
  460. package/dist/checks/resilience/sentry/sentry-error-boundary.d.ts +12 -0
  461. package/dist/checks/resilience/sentry/sentry-error-boundary.d.ts.map +1 -0
  462. package/dist/checks/resilience/sentry/sentry-error-boundary.js +75 -0
  463. package/dist/checks/resilience/sentry/sentry-error-boundary.js.map +1 -0
  464. package/dist/checks/resilience/sentry/sentry-pii-scrubbing.d.ts +13 -0
  465. package/dist/checks/resilience/sentry/sentry-pii-scrubbing.d.ts.map +1 -0
  466. package/dist/checks/resilience/sentry/sentry-pii-scrubbing.js +125 -0
  467. package/dist/checks/resilience/sentry/sentry-pii-scrubbing.js.map +1 -0
  468. package/dist/checks/resilience/sentry/sentry-release-set.d.ts +12 -0
  469. package/dist/checks/resilience/sentry/sentry-release-set.d.ts.map +1 -0
  470. package/dist/checks/resilience/sentry/sentry-release-set.js +51 -0
  471. package/dist/checks/resilience/sentry/sentry-release-set.js.map +1 -0
  472. package/dist/checks/resilience/sentry/sentry-sample-rate.d.ts +12 -0
  473. package/dist/checks/resilience/sentry/sentry-sample-rate.d.ts.map +1 -0
  474. package/dist/checks/resilience/sentry/sentry-sample-rate.js +78 -0
  475. package/dist/checks/resilience/sentry/sentry-sample-rate.js.map +1 -0
  476. package/dist/checks/resilience/sentry/sentry-source-maps.d.ts +12 -0
  477. package/dist/checks/resilience/sentry/sentry-source-maps.d.ts.map +1 -0
  478. package/dist/checks/resilience/sentry/sentry-source-maps.js +83 -0
  479. package/dist/checks/resilience/sentry/sentry-source-maps.js.map +1 -0
  480. package/dist/checks/resilience/service-patterns.d.ts +18 -0
  481. package/dist/checks/resilience/service-patterns.d.ts.map +1 -0
  482. package/dist/checks/resilience/service-patterns.js +230 -0
  483. package/dist/checks/resilience/service-patterns.js.map +1 -0
  484. package/dist/checks/resilience/timer-lifecycle.d.ts +10 -0
  485. package/dist/checks/resilience/timer-lifecycle.d.ts.map +1 -0
  486. package/dist/checks/resilience/timer-lifecycle.js +78 -0
  487. package/dist/checks/resilience/timer-lifecycle.js.map +1 -0
  488. package/dist/checks/resilience/transaction-patterns.d.ts +21 -0
  489. package/dist/checks/resilience/transaction-patterns.d.ts.map +1 -0
  490. package/dist/checks/resilience/transaction-patterns.js +258 -0
  491. package/dist/checks/resilience/transaction-patterns.js.map +1 -0
  492. package/dist/checks/security/__tests__/no-hardcoded-secrets.test.d.ts +9 -0
  493. package/dist/checks/security/__tests__/no-hardcoded-secrets.test.d.ts.map +1 -0
  494. package/dist/checks/security/__tests__/no-hardcoded-secrets.test.js +37 -0
  495. package/dist/checks/security/__tests__/no-hardcoded-secrets.test.js.map +1 -0
  496. package/dist/checks/security/__tests__/package-supply-chain-policy.test.d.ts +2 -0
  497. package/dist/checks/security/__tests__/package-supply-chain-policy.test.d.ts.map +1 -0
  498. package/dist/checks/security/__tests__/package-supply-chain-policy.test.js +128 -0
  499. package/dist/checks/security/__tests__/package-supply-chain-policy.test.js.map +1 -0
  500. package/dist/checks/security/api-key-rotation.d.ts +10 -0
  501. package/dist/checks/security/api-key-rotation.d.ts.map +1 -0
  502. package/dist/checks/security/api-key-rotation.js +186 -0
  503. package/dist/checks/security/api-key-rotation.js.map +1 -0
  504. package/dist/checks/security/auth-middleware-coverage.d.ts +11 -0
  505. package/dist/checks/security/auth-middleware-coverage.d.ts.map +1 -0
  506. package/dist/checks/security/auth-middleware-coverage.js +210 -0
  507. package/dist/checks/security/auth-middleware-coverage.js.map +1 -0
  508. package/dist/checks/security/auth-route-guard.d.ts +12 -0
  509. package/dist/checks/security/auth-route-guard.d.ts.map +1 -0
  510. package/dist/checks/security/auth-route-guard.js +70 -0
  511. package/dist/checks/security/auth-route-guard.js.map +1 -0
  512. package/dist/checks/security/cors-configuration.d.ts +11 -0
  513. package/dist/checks/security/cors-configuration.d.ts.map +1 -0
  514. package/dist/checks/security/cors-configuration.js +126 -0
  515. package/dist/checks/security/cors-configuration.js.map +1 -0
  516. package/dist/checks/security/csp-headers.d.ts +11 -0
  517. package/dist/checks/security/csp-headers.d.ts.map +1 -0
  518. package/dist/checks/security/csp-headers.js +192 -0
  519. package/dist/checks/security/csp-headers.js.map +1 -0
  520. package/dist/checks/security/dependency-vulnerability-audit.d.ts +15 -0
  521. package/dist/checks/security/dependency-vulnerability-audit.d.ts.map +1 -0
  522. package/dist/checks/security/dependency-vulnerability-audit.js +184 -0
  523. package/dist/checks/security/dependency-vulnerability-audit.js.map +1 -0
  524. package/dist/checks/security/env-secret-exposure.d.ts +11 -0
  525. package/dist/checks/security/env-secret-exposure.d.ts.map +1 -0
  526. package/dist/checks/security/env-secret-exposure.js +127 -0
  527. package/dist/checks/security/env-secret-exposure.js.map +1 -0
  528. package/dist/checks/security/hasura-production-config.d.ts +11 -0
  529. package/dist/checks/security/hasura-production-config.d.ts.map +1 -0
  530. package/dist/checks/security/hasura-production-config.js +122 -0
  531. package/dist/checks/security/hasura-production-config.js.map +1 -0
  532. package/dist/checks/security/index.d.ts +17 -0
  533. package/dist/checks/security/index.d.ts.map +1 -0
  534. package/dist/checks/security/index.js +17 -0
  535. package/dist/checks/security/index.js.map +1 -0
  536. package/dist/checks/security/jwt-validation.d.ts +11 -0
  537. package/dist/checks/security/jwt-validation.d.ts.map +1 -0
  538. package/dist/checks/security/jwt-validation.js +294 -0
  539. package/dist/checks/security/jwt-validation.js.map +1 -0
  540. package/dist/checks/security/no-eval.d.ts +16 -0
  541. package/dist/checks/security/no-eval.d.ts.map +1 -0
  542. package/dist/checks/security/no-eval.js +83 -0
  543. package/dist/checks/security/no-eval.js.map +1 -0
  544. package/dist/checks/security/no-hardcoded-secrets.d.ts +28 -0
  545. package/dist/checks/security/no-hardcoded-secrets.d.ts.map +1 -0
  546. package/dist/checks/security/no-hardcoded-secrets.js +209 -0
  547. package/dist/checks/security/no-hardcoded-secrets.js.map +1 -0
  548. package/dist/checks/security/package-supply-chain-policy.d.ts +12 -0
  549. package/dist/checks/security/package-supply-chain-policy.d.ts.map +1 -0
  550. package/dist/checks/security/package-supply-chain-policy.js +534 -0
  551. package/dist/checks/security/package-supply-chain-policy.js.map +1 -0
  552. package/dist/checks/security/rate-limit-coverage.d.ts +10 -0
  553. package/dist/checks/security/rate-limit-coverage.d.ts.map +1 -0
  554. package/dist/checks/security/rate-limit-coverage.js +143 -0
  555. package/dist/checks/security/rate-limit-coverage.js.map +1 -0
  556. package/dist/checks/security/semgrep-scan.d.ts +13 -0
  557. package/dist/checks/security/semgrep-scan.d.ts.map +1 -0
  558. package/dist/checks/security/semgrep-scan.js +86 -0
  559. package/dist/checks/security/semgrep-scan.js.map +1 -0
  560. package/dist/checks/security/use-centralized-crypto.d.ts +11 -0
  561. package/dist/checks/security/use-centralized-crypto.d.ts.map +1 -0
  562. package/dist/checks/security/use-centralized-crypto.js +129 -0
  563. package/dist/checks/security/use-centralized-crypto.js.map +1 -0
  564. package/dist/checks/security/webhook-signature-verification.d.ts +10 -0
  565. package/dist/checks/security/webhook-signature-verification.d.ts.map +1 -0
  566. package/dist/checks/security/webhook-signature-verification.js +183 -0
  567. package/dist/checks/security/webhook-signature-verification.js.map +1 -0
  568. package/dist/checks/testing/index.d.ts +6 -0
  569. package/dist/checks/testing/index.d.ts.map +1 -0
  570. package/dist/checks/testing/index.js +6 -0
  571. package/dist/checks/testing/index.js.map +1 -0
  572. package/dist/checks/testing/no-skipped-tests.d.ts +40 -0
  573. package/dist/checks/testing/no-skipped-tests.d.ts.map +1 -0
  574. package/dist/checks/testing/no-skipped-tests.js +174 -0
  575. package/dist/checks/testing/no-skipped-tests.js.map +1 -0
  576. package/dist/checks/testing/no-stub-tests.d.ts +11 -0
  577. package/dist/checks/testing/no-stub-tests.d.ts.map +1 -0
  578. package/dist/checks/testing/no-stub-tests.js +103 -0
  579. package/dist/checks/testing/no-stub-tests.js.map +1 -0
  580. package/dist/checks/testing/test-convention-consistency.d.ts +14 -0
  581. package/dist/checks/testing/test-convention-consistency.d.ts.map +1 -0
  582. package/dist/checks/testing/test-convention-consistency.js +93 -0
  583. package/dist/checks/testing/test-convention-consistency.js.map +1 -0
  584. package/dist/checks/testing/test-file-naming.d.ts +13 -0
  585. package/dist/checks/testing/test-file-naming.d.ts.map +1 -0
  586. package/dist/checks/testing/test-file-naming.js +218 -0
  587. package/dist/checks/testing/test-file-naming.js.map +1 -0
  588. package/dist/checks/testing/test-file-pairing.d.ts +13 -0
  589. package/dist/checks/testing/test-file-pairing.d.ts.map +1 -0
  590. package/dist/checks/testing/test-file-pairing.js +274 -0
  591. package/dist/checks/testing/test-file-pairing.js.map +1 -0
  592. package/dist/display/architecture.d.ts +9 -0
  593. package/dist/display/architecture.d.ts.map +1 -0
  594. package/dist/display/architecture.js +29 -0
  595. package/dist/display/architecture.js.map +1 -0
  596. package/dist/display/index.d.ts +20 -0
  597. package/dist/display/index.d.ts.map +1 -0
  598. package/dist/display/index.js +30 -0
  599. package/dist/display/index.js.map +1 -0
  600. package/dist/display/quality.d.ts +7 -0
  601. package/dist/display/quality.d.ts.map +1 -0
  602. package/dist/display/quality.js +34 -0
  603. package/dist/display/quality.js.map +1 -0
  604. package/dist/display/resilience.d.ts +7 -0
  605. package/dist/display/resilience.d.ts.map +1 -0
  606. package/dist/display/resilience.js +36 -0
  607. package/dist/display/resilience.js.map +1 -0
  608. package/dist/display/security-testing.d.ts +9 -0
  609. package/dist/display/security-testing.d.ts.map +1 -0
  610. package/dist/display/security-testing.js +31 -0
  611. package/dist/display/security-testing.js.map +1 -0
  612. package/dist/display/types.d.ts +6 -0
  613. package/dist/display/types.d.ts.map +1 -0
  614. package/dist/display/types.js +6 -0
  615. package/dist/display/types.js.map +1 -0
  616. package/dist/index.d.ts +19 -0
  617. package/dist/index.d.ts.map +1 -0
  618. package/dist/index.js +21 -0
  619. package/dist/index.js.map +1 -0
  620. package/package.json +52 -0
@@ -0,0 +1,273 @@
1
+ // @fitness-ignore-file recovery-patterns -- Check definition contains custom timeout pattern strings it detects
2
+ /**
3
+ * @fileoverview Enforce use of canonical recovery patterns
4
+ */
5
+ import { logger } from '@opensip-cli/core';
6
+ import { defineCheck, isCommentLine } from '@opensip-cli/fitness';
7
+ // Recovery patterns
8
+ const RECOVERY_PATTERNS = [
9
+ {
10
+ id: 'manual-retry-loop',
11
+ // Pattern: for (let retry... or for (let numRetry...
12
+ regex: /for\s{0,10}\(\s{0,10}let\s{1,10}\w{0,30}[Rr]etry/g,
13
+ message: 'Manual retry loop detected',
14
+ suggestion: 'Use a shared recovery/retry utility with standardized backoff and jitter instead of manual retry loops',
15
+ severity: 'error',
16
+ skipInComments: true,
17
+ },
18
+ {
19
+ id: 'manual-retry-while',
20
+ // Pattern: while (x < retries) or while (x < maxRetries)
21
+ regex: /while\s{0,10}\(\s{0,10}\w{1,30}\s{0,10}<\s{0,10}(?:max)?[Rr]etries?\s{0,10}\)/g,
22
+ message: 'Manual retry while-loop detected',
23
+ suggestion: 'Use a shared recovery/retry utility with standardized backoff and jitter instead of manual retry loops',
24
+ severity: 'error',
25
+ skipInComments: true,
26
+ },
27
+ {
28
+ id: 'custom-circuit-breaker',
29
+ // Pattern: circuitState = or isOpen: or consecutiveFailures =
30
+ regex: /(?:circuitState|isOpen|consecutiveFailures)\s{0,10}[=:]/g,
31
+ message: 'Custom circuit breaker state detected',
32
+ suggestion: 'Use a shared recovery/retry utility with circuit breaker support instead of custom circuit breaker state',
33
+ severity: 'error',
34
+ skipInComments: true,
35
+ },
36
+ {
37
+ id: 'custom-timeout',
38
+ // Pattern: new Promise((resolve, reject) => { ... setTimeout ... reject
39
+ regex: /new\s{1,10}Promise\s{0,10}\(\s{0,10}\(resolve,\s{0,10}reject\)\s{0,10}=>\s{0,10}\{[\s\S]{0,500}?setTimeout[\s\S]{0,500}?reject/g,
40
+ message: 'Custom timeout wrapper detected',
41
+ suggestion: 'Use a shared timeout utility instead of custom Promise-based timeout wrappers',
42
+ severity: 'warning',
43
+ skipInComments: true,
44
+ multiline: true,
45
+ },
46
+ ];
47
+ // Cache patterns
48
+ const CACHE_PATTERNS = [
49
+ {
50
+ id: 'custom-cache-map',
51
+ // Pattern: private cache = new Map or private readonly myCache: new Map
52
+ regex: /private\s{1,10}(?:readonly\s{1,10})?\w{0,30}[Cc]ache\s{0,10}[=:]\s{0,10}new\s{1,10}Map/g,
53
+ message: 'Custom Map-based cache detected',
54
+ suggestion: 'Use a shared cache abstraction with TTL management and eviction policies instead of custom Map-based caches',
55
+ severity: 'warning',
56
+ skipInComments: true,
57
+ },
58
+ {
59
+ id: 'custom-cache-object',
60
+ // Pattern: private cache = {} or private readonly myCache: {}
61
+ regex: /private\s{1,10}(?:readonly\s{1,10})?\w{0,30}[Cc]ache\s{0,10}[=:]\s{0,10}\{\s{0,10}\}/g,
62
+ message: 'Custom object-based cache detected',
63
+ suggestion: 'Use a shared cache abstraction with TTL management and eviction policies instead of custom object-based caches',
64
+ severity: 'warning',
65
+ skipInComments: true,
66
+ },
67
+ ];
68
+ // Rate limiter patterns
69
+ const RATE_LIMITER_PATTERNS = [
70
+ {
71
+ id: 'custom-rate-limiter',
72
+ regex: /(?:requestCount|rateLimitWindow|tokensRemaining)\s{0,10}[=:]/g,
73
+ message: 'Custom rate limiting detected',
74
+ suggestion: 'Use a shared rate limiter instead of custom rate limiting implementations',
75
+ severity: 'warning',
76
+ skipInComments: true,
77
+ },
78
+ ];
79
+ // =============================================================================
80
+ // HELPER FUNCTIONS
81
+ // =============================================================================
82
+ /** Check if file path matches exclusion pattern */
83
+ function matchesExclusionPattern(filePath, patterns) {
84
+ logger.debug({
85
+ evt: 'fitness.checks.recovery_patterns.matches_exclusion_pattern',
86
+ msg: 'Checking if file path matches exclusion pattern',
87
+ });
88
+ for (const pattern of patterns) {
89
+ // Convert glob pattern to simple substring match for common cases
90
+ const normalizedPattern = pattern.replaceAll('**', '').replaceAll('*', '');
91
+ if (normalizedPattern && filePath.includes(normalizedPattern)) {
92
+ return true;
93
+ }
94
+ }
95
+ return false;
96
+ }
97
+ function createViolation(pattern, lineNumber, matchText) {
98
+ logger.debug({
99
+ evt: 'fitness.checks.recovery_patterns.create_violation',
100
+ msg: 'Creating violation record for detected pattern',
101
+ });
102
+ return {
103
+ line: lineNumber,
104
+ message: pattern.message,
105
+ severity: pattern.severity,
106
+ suggestion: pattern.suggestion,
107
+ match: matchText,
108
+ type: pattern.id,
109
+ };
110
+ }
111
+ function detectMultilinePattern(content, pattern) {
112
+ logger.debug({
113
+ evt: 'fitness.checks.recovery_patterns.detect_multiline_pattern',
114
+ msg: 'Detecting multiline pattern violations',
115
+ });
116
+ const violations = [];
117
+ pattern.regex.lastIndex = 0;
118
+ let match;
119
+ while ((match = pattern.regex.exec(content)) !== null) {
120
+ const lineNumber = content.slice(0, match.index).split('\n').length;
121
+ violations.push(createViolation(pattern, lineNumber, match[0].slice(0, 100)));
122
+ }
123
+ return violations;
124
+ }
125
+ function detectSingleLinePattern(lines, pattern) {
126
+ logger.debug({
127
+ evt: 'fitness.checks.recovery_patterns.detect_single_line_pattern',
128
+ msg: 'Detecting single line pattern violations',
129
+ });
130
+ const violations = [];
131
+ for (const [i, line] of lines.entries()) {
132
+ /* v8 ignore next -- defensive: lines.entries() never yields undefined */
133
+ if (line === undefined)
134
+ continue;
135
+ if (pattern.skipInComments && isCommentLine(line))
136
+ continue;
137
+ if (pattern.regex.global) {
138
+ pattern.regex.lastIndex = 0;
139
+ }
140
+ const match = pattern.regex.exec(line);
141
+ if (match) {
142
+ violations.push(createViolation(pattern, i + 1, match[0]));
143
+ }
144
+ }
145
+ return violations;
146
+ }
147
+ function detectPatternViolations(content, lines, pattern) {
148
+ logger.debug({
149
+ evt: 'fitness.checks.recovery_patterns.detect_pattern_violations',
150
+ msg: 'Detecting pattern violations for content',
151
+ });
152
+ if (pattern.regex.global) {
153
+ pattern.regex.lastIndex = 0;
154
+ }
155
+ if (pattern.multiline) {
156
+ return detectMultilinePattern(content, pattern);
157
+ }
158
+ return detectSingleLinePattern(lines, pattern);
159
+ }
160
+ function detectPatterns(content, filePath, patterns, excludePaths) {
161
+ logger.debug({
162
+ evt: 'fitness.checks.recovery_patterns.detect_patterns',
163
+ msg: 'Running pattern detection on file content',
164
+ });
165
+ if (matchesExclusionPattern(filePath, excludePaths)) {
166
+ return [];
167
+ }
168
+ const lines = content.split('\n');
169
+ const violations = [];
170
+ for (const pattern of patterns) {
171
+ const patternViolations = detectPatternViolations(content, lines, pattern);
172
+ for (const violation of patternViolations) {
173
+ violations.push(violation);
174
+ }
175
+ }
176
+ return violations;
177
+ }
178
+ // =============================================================================
179
+ // CHECK DEFINITIONS
180
+ // =============================================================================
181
+ /**
182
+ * Check: resilience/recovery-patterns
183
+ *
184
+ * Ensures code uses a shared recovery/retry utility
185
+ * instead of custom retry loops, circuit breakers, or timeout wrappers.
186
+ */
187
+ export const recoveryPatterns = defineCheck({
188
+ id: '64f07f7e-baed-4946-83be-2b8102a9f98b',
189
+ slug: 'recovery-patterns',
190
+ disabled: true,
191
+ scope: { languages: ['typescript'], concerns: ['backend', 'server'] },
192
+ contentFilter: 'strip-strings',
193
+ confidence: 'medium',
194
+ description: 'Enforce use of shared recovery/retry utilities instead of hand-rolled retry loops',
195
+ longDescription: `**Purpose:** Prevents hand-rolled retry loops, circuit breakers, and timeout wrappers in favor of the canonical recovery module.
196
+
197
+ **Detects:**
198
+ - Manual retry for-loops: \`for (let *retry\` or \`for (let *Retry\`
199
+ - Manual retry while-loops: \`while (x < retries)\` or \`while (x < maxRetries)\`
200
+ - Custom circuit breaker state: \`circuitState =\`, \`isOpen:\`, \`consecutiveFailures =\`
201
+ - Custom timeout wrappers: \`new Promise((resolve, reject) => { ... setTimeout ... reject\` (multiline)
202
+ - Skips comment lines when \`skipInComments\` is set
203
+
204
+ **Why it matters:** Custom recovery logic duplicates proven patterns and lacks standardized backoff, jitter, and observability.
205
+
206
+ **Scope:** Codebase-specific convention. Analyzes each file individually via regex.`,
207
+ tags: ['resilience', 'recovery', 'canonical'],
208
+ fileTypes: ['ts'],
209
+ analyze(content, filePath) {
210
+ return detectPatterns(content, filePath, RECOVERY_PATTERNS, [
211
+ 'foundation/src/recovery',
212
+ '__tests__',
213
+ ]);
214
+ },
215
+ });
216
+ /**
217
+ * Check: resilience/no-custom-cache
218
+ *
219
+ * Ensures code uses a shared cache abstraction
220
+ * instead of custom Map-based caches.
221
+ */
222
+ export const noCustomCache = defineCheck({
223
+ id: '4c389ae7-ea92-42ff-bcec-0eb9d5d69e3e',
224
+ slug: 'no-custom-cache',
225
+ disabled: true,
226
+ description: 'Enforce use of a shared cache abstraction instead of custom Map-based caches',
227
+ longDescription: `**Purpose:** Prevents custom Map- or object-based caches in favor of the canonical CacheClient from infrastructure.
228
+
229
+ **Detects:**
230
+ - \`private [readonly] *cache = new Map\` pattern (Map-based cache)
231
+ - \`private [readonly] *cache = {}\` pattern (object-based cache)
232
+ - Skips comment lines
233
+
234
+ **Why it matters:** Custom caches lack TTL management, eviction policies, distributed invalidation, and observability that the canonical CacheClient provides.
235
+
236
+ **Scope:** Codebase-specific convention. Analyzes each file individually via regex.`,
237
+ tags: ['resilience', 'canonical', 'cache'],
238
+ analyze(content, filePath) {
239
+ return detectPatterns(content, filePath, CACHE_PATTERNS, [
240
+ 'infrastructure/src/cache',
241
+ '__tests__',
242
+ ]);
243
+ },
244
+ });
245
+ /**
246
+ * Check: resilience/no-custom-rate-limiter
247
+ *
248
+ * Ensures code uses a shared rate limiter
249
+ * instead of custom rate limiting implementations.
250
+ */
251
+ export const noCustomRateLimiter = defineCheck({
252
+ id: '330407bb-d139-48f3-b51e-61516eb93929',
253
+ slug: 'no-custom-rate-limiter',
254
+ disabled: true,
255
+ description: 'Enforce use of a shared rate limiter instead of custom rate limiting implementations',
256
+ longDescription: `**Purpose:** Prevents custom rate limiting implementations in favor of the canonical RateLimiter from infrastructure.
257
+
258
+ **Detects:**
259
+ - Custom rate limiter state variables: \`requestCount =\`, \`rateLimitWindow =\`, \`tokensRemaining =\`
260
+ - Skips comment lines
261
+
262
+ **Why it matters:** Custom rate limiters lack distributed coordination, sliding window accuracy, and configuration consistency that the canonical module provides.
263
+
264
+ **Scope:** Codebase-specific convention. Analyzes each file individually via regex.`,
265
+ tags: ['resilience', 'canonical', 'rate-limiting'],
266
+ analyze(content, filePath) {
267
+ return detectPatterns(content, filePath, RATE_LIMITER_PATTERNS, [
268
+ 'infrastructure/src/rate-limiting',
269
+ '__tests__',
270
+ ]);
271
+ },
272
+ });
273
+ //# sourceMappingURL=recovery-patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-patterns.js","sourceRoot":"","sources":["../../../src/checks/resilience/recovery-patterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @fileoverview Detects boolean flag reentrancy guards that should use counters or mutexes
3
+ */
4
+ /**
5
+ * Check: resilience/reentrancy-guard
6
+ *
7
+ * Detects module-scoped boolean flags used as reentrancy guards
8
+ * (e.g., `let serverRunning = false` with `if (serverRunning) return`).
9
+ * These are not re-entrant and can corrupt state with concurrent calls.
10
+ */
11
+ export declare const reentrancyGuard: import("@opensip-cli/fitness").Check;
12
+ //# sourceMappingURL=reentrancy-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reentrancy-guard.d.ts","sourceRoot":"","sources":["../../../src/checks/resilience/reentrancy-guard.ts"],"names":[],"mappings":"AAEA;;GAEG;AAmBH;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,sCAuE1B,CAAC"}
@@ -0,0 +1,86 @@
1
+ // @fitness-ignore-file project-readme-existence -- internal module, not a package root
2
+ // @fitness-ignore-file fitness-check-coverage -- check implementation with framework-managed coverage
3
+ /**
4
+ * @fileoverview Detects boolean flag reentrancy guards that should use counters or mutexes
5
+ */
6
+ import { defineCheck, getLineNumber } from '@opensip-cli/fitness';
7
+ /**
8
+ * Pattern for detecting module-scoped boolean state flags used as reentrancy guards.
9
+ * Matches: let serverRunning = false, let isRunning = false, etc.
10
+ */
11
+ const BOOLEAN_FLAG_PATTERN = /^(?:let|var)\s+(\w+(?:Running|Started|Active|Initialized|Locked))\s*(?::\s*boolean\s*)?=\s*false/gm;
12
+ /**
13
+ * Pattern for early return based on the flag (reentrancy guard)
14
+ */
15
+ function createFlagCheckPattern(flagName) {
16
+ // @fitness-ignore-next-line semgrep-scan -- non-literal RegExp is intentional; flagName is extracted from regex match on source code identifiers (\w+), not user input
17
+ return new RegExp(String.raw `if\s*\(\s*${flagName}\s*\)\s*(?:return|\{)`);
18
+ }
19
+ /**
20
+ * Check: resilience/reentrancy-guard
21
+ *
22
+ * Detects module-scoped boolean flags used as reentrancy guards
23
+ * (e.g., `let serverRunning = false` with `if (serverRunning) return`).
24
+ * These are not re-entrant and can corrupt state with concurrent calls.
25
+ */
26
+ export const reentrancyGuard = defineCheck({
27
+ id: 'd7f35c3b-af42-435f-b953-ee167060fecb',
28
+ slug: 'reentrancy-guard',
29
+ scope: { languages: ['typescript'], concerns: ['backend', 'frontend', 'cli'] },
30
+ contentFilter: 'strip-strings',
31
+ confidence: 'medium',
32
+ description: 'Detect boolean reentrancy guards that need counter/mutex semantics',
33
+ longDescription: `**Purpose:** Detects module-scoped boolean flags used as reentrancy guards that can fail under concurrent or nested calls.
34
+
35
+ **Detects:**
36
+ - Module-scoped \`let\` boolean variables with names like \`*Running\`, \`*Started\`, \`*Active\`, \`*Initialized\`, \`*Locked\` initialized to \`false\`
37
+ - Paired with an \`if (flag) return\` guard pattern indicating reentrancy protection
38
+ - These boolean guards are not re-entrant: nested calls will see the flag as \`true\` and silently skip, and concurrent calls can interleave flag reads/writes
39
+
40
+ **Why it matters:** Boolean flags for reentrancy create race conditions where concurrent callers skip initialization or corrupt shared state. A reference counter or mutex provides correct semantics.
41
+
42
+ **Scope:** General best practice. Analyzes each file individually via regex.`,
43
+ tags: ['resilience', 'concurrency', 'reentrancy'],
44
+ fileTypes: ['ts'],
45
+ analyze(content, filePath) {
46
+ const violations = [];
47
+ // Skip test files
48
+ if (filePath.includes('.test.') ||
49
+ filePath.includes('.spec.') ||
50
+ filePath.includes('__tests__')) {
51
+ return violations;
52
+ }
53
+ // Quick check
54
+ if (!content.includes('Running') &&
55
+ !content.includes('Started') &&
56
+ !content.includes('Active') &&
57
+ !content.includes('Initialized') &&
58
+ !content.includes('Locked')) {
59
+ return violations;
60
+ }
61
+ BOOLEAN_FLAG_PATTERN.lastIndex = 0;
62
+ let match;
63
+ while ((match = BOOLEAN_FLAG_PATTERN.exec(content)) !== null) {
64
+ const flagName = match[1];
65
+ if (!flagName)
66
+ continue;
67
+ // Check if there's a corresponding guard pattern
68
+ const guardPattern = createFlagCheckPattern(flagName);
69
+ if (!guardPattern.test(content))
70
+ continue;
71
+ const lineNumber = getLineNumber(content, match.index);
72
+ violations.push({
73
+ line: lineNumber,
74
+ column: 0,
75
+ message: `Boolean reentrancy guard '${flagName}' is not safe for concurrent or nested calls`,
76
+ severity: 'warning',
77
+ suggestion: 'Replace the boolean flag with a reference counter (increment on enter, decrement on exit) or use a mutex/semaphore for proper reentrancy protection.',
78
+ match: match[0],
79
+ type: 'boolean-reentrancy-guard',
80
+ filePath,
81
+ });
82
+ }
83
+ return violations;
84
+ },
85
+ });
86
+ //# sourceMappingURL=reentrancy-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reentrancy-guard.js","sourceRoot":"","sources":["../../../src/checks/resilience/reentrancy-guard.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,sGAAsG;AACtG;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAuB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEvF;;;GAGG;AACH,MAAM,oBAAoB,GACxB,oGAAoG,CAAC;AAEvG;;GAEG;AACH,SAAS,sBAAsB,CAAC,QAAgB;IAC9C,uKAAuK;IACvK,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,aAAa,QAAQ,uBAAuB,CAAC,CAAC;AAC5E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;IACzC,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,kBAAkB;IACxB,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,QAAQ;IACpB,WAAW,EAAE,oEAAoE;IACjF,eAAe,EAAE;;;;;;;;;6EAS0D;IAC3E,IAAI,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC;IACjD,SAAS,EAAE,CAAC,IAAI,CAAC;IAEjB,OAAO,CAAC,OAAe,EAAE,QAAgB;QACvC,MAAM,UAAU,GAAqB,EAAE,CAAC;QAExC,kBAAkB;QAClB,IACE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAC9B,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,cAAc;QACd,IACE,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC5B,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC5B,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;YAChC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC3B,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,oBAAoB,CAAC,SAAS,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,QAAQ;gBAAE,SAAS;YAExB,iDAAiD;YACjD,MAAM,YAAY,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,SAAS;YAE1C,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAEvD,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,6BAA6B,QAAQ,8CAA8C;gBAC5F,QAAQ,EAAE,SAAS;gBACnB,UAAU,EACR,sJAAsJ;gBACxJ,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBACf,IAAI,EAAE,0BAA0B;gBAChC,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @fileoverview Retry configuration validation check
3
+ */
4
+ /**
5
+ * Check: resilience/retry-config-validation
6
+ *
7
+ * Validates retry configuration values to prevent:
8
+ * - Too many retries (resource exhaustion)
9
+ * - Too few retries (no fault tolerance)
10
+ * - Excessive backoff delays
11
+ */
12
+ export declare const retryConfigValidation: import("@opensip-cli/fitness").Check;
13
+ //# sourceMappingURL=retry-config-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-config-validation.d.ts","sourceRoot":"","sources":["../../../src/checks/resilience/retry-config-validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6IH;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,sCA+DhC,CAAC"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * @fileoverview Retry configuration validation check
3
+ */
4
+ import { logger } from '@opensip-cli/core';
5
+ import { defineCheck } from '@opensip-cli/fitness';
6
+ import { stripStringLiterals, stripStringsAndComments } from '@opensip-cli/fitness';
7
+ import { isDigit } from './_helpers/config-validation.js';
8
+ // =============================================================================
9
+ // CONFIG PARSING
10
+ // =============================================================================
11
+ /**
12
+ * Parse a config value from a line using string matching.
13
+ */
14
+ function parseConfigValueFromLine(line, configKey) {
15
+ logger.debug({
16
+ evt: 'fitness.checks.retry_config_validation.parse_config_value_from_line',
17
+ msg: 'Parsing config value from line',
18
+ });
19
+ const lowerLine = line.toLowerCase();
20
+ const lowerKey = configKey.toLowerCase();
21
+ const idx = lowerLine.indexOf(lowerKey);
22
+ if (idx === -1)
23
+ return null;
24
+ const afterKey = line.slice(Math.max(0, idx + configKey.length));
25
+ let i = 0;
26
+ // Skip whitespace
27
+ while (i < afterKey.length && (afterKey[i] === ' ' || afterKey[i] === '\t')) {
28
+ i++;
29
+ }
30
+ // Check for = or :
31
+ if (afterKey[i] !== '=' && afterKey[i] !== ':') {
32
+ return null;
33
+ }
34
+ i++;
35
+ // Skip whitespace
36
+ while (i < afterKey.length && (afterKey[i] === ' ' || afterKey[i] === '\t')) {
37
+ i++;
38
+ }
39
+ // Parse digits
40
+ const digitStart = i;
41
+ while (i < afterKey.length && isDigit(afterKey[i])) {
42
+ i++;
43
+ }
44
+ if (digitStart === i) {
45
+ return null; // No digits found
46
+ }
47
+ // @fitness-ignore-next-line numeric-validation -- substring is guaranteed digit-only by isDigit loop above
48
+ const value = Number.parseInt(afterKey.slice(digitStart, i), 10);
49
+ return {
50
+ value,
51
+ matchText: `${configKey}${afterKey.slice(0, Math.max(0, i))}`,
52
+ };
53
+ }
54
+ function checkMaxRetriesValue(value) {
55
+ logger.debug({
56
+ evt: 'fitness.checks.retry_config_validation.check_max_retries_value',
57
+ msg: 'Checking maxRetries value for excessive count',
58
+ });
59
+ if (value <= 10)
60
+ return null;
61
+ return {
62
+ message: `maxRetries of ${value} is excessive`,
63
+ severity: 'warning',
64
+ suggestion: 'Consider reducing maxRetries to 3-5 with exponential backoff. Use a shared retry utility for proper retry handling.',
65
+ type: 'excessive-retries',
66
+ };
67
+ }
68
+ function checkBaseDelayValue(value) {
69
+ logger.debug({
70
+ evt: 'fitness.checks.retry_config_validation.check_base_delay_value',
71
+ msg: 'Checking baseDelay value for aggressive timing',
72
+ });
73
+ if (value >= 100)
74
+ return null;
75
+ return {
76
+ message: `baseDelay of ${value}ms may be too aggressive`,
77
+ severity: 'warning',
78
+ suggestion: 'Consider a baseDelay of at least 100ms to avoid overwhelming downstream services. Use exponential backoff for better resilience.',
79
+ type: 'aggressive-retry-delay',
80
+ };
81
+ }
82
+ // =============================================================================
83
+ // LINE CHECKING
84
+ // =============================================================================
85
+ function checkConfigOnLine(strippedLine, configKey, checker, lineNumber, filePath) {
86
+ const result = parseConfigValueFromLine(strippedLine, configKey);
87
+ if (!result)
88
+ return null;
89
+ const violation = checker(result.value);
90
+ if (!violation)
91
+ return null;
92
+ return {
93
+ line: lineNumber,
94
+ column: 0,
95
+ message: violation.message,
96
+ severity: violation.severity,
97
+ suggestion: violation.suggestion,
98
+ match: result.matchText,
99
+ type: violation.type,
100
+ filePath,
101
+ };
102
+ }
103
+ // =============================================================================
104
+ // CHECK DEFINITION
105
+ // =============================================================================
106
+ /**
107
+ * Check: resilience/retry-config-validation
108
+ *
109
+ * Validates retry configuration values to prevent:
110
+ * - Too many retries (resource exhaustion)
111
+ * - Too few retries (no fault tolerance)
112
+ * - Excessive backoff delays
113
+ */
114
+ export const retryConfigValidation = defineCheck({
115
+ id: '174659f8-56b5-4e8d-a495-3c3188fddaf8',
116
+ slug: 'retry-config-validation',
117
+ scope: { languages: ['typescript'], concerns: ['backend', 'server'] },
118
+ contentFilter: 'strip-strings',
119
+ confidence: 'medium',
120
+ description: 'Validate retry configs: flag excessive maxRetries (>10) and aggressive baseDelay (<100ms)',
121
+ longDescription: `**Purpose:** Validates retry configuration values to prevent resource exhaustion from too many retries or aggressive retry timing.
122
+
123
+ **Detects:**
124
+ - \`maxRetries = N\` or \`maxRetries: N\` where N > 10 (excessive retries)
125
+ - \`baseDelay = N\` or \`baseDelay: N\` where N < 100ms (too aggressive)
126
+ - Only scans files containing \`retry\` or \`attempt\` keywords
127
+
128
+ **Why it matters:** Excessive retries can amplify failures into cascading outages; aggressive retry delays overwhelm already-struggling downstream services.
129
+
130
+ **Scope:** General best practice. Analyzes each file individually via string parsing.`,
131
+ tags: ['resilience', 'retry', 'config'],
132
+ fileTypes: ['ts'],
133
+ analyze(content, filePath) {
134
+ const violations = [];
135
+ const strippedContent = stripStringsAndComments(content).toLowerCase();
136
+ if (!strippedContent.includes('retry') && !strippedContent.includes('attempt')) {
137
+ return violations;
138
+ }
139
+ const lines = content.split('\n');
140
+ for (const [i, line] of lines.entries()) {
141
+ if (!line)
142
+ continue;
143
+ const strippedLine = stripStringLiterals(line);
144
+ const trimmed = strippedLine.trim();
145
+ if (trimmed.startsWith('//') || trimmed.startsWith('*')) {
146
+ continue;
147
+ }
148
+ const lineNumber = i + 1;
149
+ const maxRetriesViolation = checkConfigOnLine(strippedLine, 'maxRetries', checkMaxRetriesValue, lineNumber, filePath);
150
+ if (maxRetriesViolation)
151
+ violations.push(maxRetriesViolation);
152
+ const baseDelayViolation = checkConfigOnLine(strippedLine, 'baseDelay', checkBaseDelayValue, lineNumber, filePath);
153
+ if (baseDelayViolation)
154
+ violations.push(baseDelayViolation);
155
+ }
156
+ return violations;
157
+ },
158
+ });
159
+ //# sourceMappingURL=retry-config-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-config-validation.js","sourceRoot":"","sources":["../../../src/checks/resilience/retry-config-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @fileoverview Shared helpers for Sentry fitness checks
3
+ * @module checks-builtin/checks/resilience/sentry/_helpers/sentry
4
+ */
5
+ /**
6
+ * Quick bail-out: returns true if the file references Sentry at all.
7
+ * All Sentry checks should call this first to avoid unnecessary work.
8
+ */
9
+ export declare function hasSentryUsage(content: string): boolean;
10
+ /**
11
+ * Returns true if the file contains a `Sentry.init(` call.
12
+ * Used by checks that validate init configuration.
13
+ */
14
+ export declare function hasSentryInit(content: string): boolean;
15
+ /**
16
+ * Extracts the Sentry.init() call block from file content.
17
+ * Returns the line range (start/end indices) and the content of the init block.
18
+ * Handles multi-line init calls by tracking brace depth.
19
+ */
20
+ export declare function extractSentryInitBlock(content: string): {
21
+ startLine: number;
22
+ endLine: number;
23
+ block: string;
24
+ } | null;
25
+ //# sourceMappingURL=sentry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry.d.ts","sourceRoot":"","sources":["../../../../../src/checks/resilience/sentry/_helpers/sentry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;;GAIG;AAEH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,GACd;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgD9D"}