@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,291 @@
1
+ /**
2
+ * @fileoverview No hardcoded timeouts check
3
+ */
4
+ import { logger } from '@opensip-cli/core';
5
+ import { defineCheck, isTestFile } from '@opensip-cli/fitness';
6
+ import { stripStringLiterals, stripStringsAndComments } from '@opensip-cli/fitness';
7
+ import { isDigit, isAlphanumericChar, skipWhitespace, parseDigits, } from './_helpers/config-validation.js';
8
+ // =============================================================================
9
+ // CONSTANTS
10
+ // =============================================================================
11
+ /**
12
+ * Minimum timeout to flag (5000ms = 5 seconds)
13
+ */
14
+ // @fitness-ignore-next-line no-hardcoded-timeouts -- constant defined at module scope for check threshold configuration
15
+ const MIN_FLAGGABLE_TIMEOUT = 5000;
16
+ // =============================================================================
17
+ // TIMEOUT EXTRACTION
18
+ // =============================================================================
19
+ /**
20
+ * Find the comma separator after the callback in setTimeout
21
+ */
22
+ function findSetTimeoutComma(str, startPos) {
23
+ logger.debug({
24
+ evt: 'fitness.checks.no_hardcoded_timeouts.find_set_timeout_comma',
25
+ msg: 'Finding comma separator after setTimeout callback',
26
+ });
27
+ let i = startPos;
28
+ let parenDepth = 1;
29
+ while (i < str.length && parenDepth > 0) {
30
+ if (str[i] === '(') {
31
+ parenDepth++;
32
+ }
33
+ else if (str[i] === ')') {
34
+ parenDepth--;
35
+ }
36
+ else if (str[i] === ',' && parenDepth === 1) {
37
+ break;
38
+ }
39
+ else {
40
+ // Other characters - continue scanning
41
+ }
42
+ i++;
43
+ }
44
+ return i;
45
+ }
46
+ /* v8 ignore start -- timeout extraction state machines; many parser-state branches covered indirectly */
47
+ /**
48
+ * Extract setTimeout value using string parsing.
49
+ */
50
+ function extractSetTimeoutValue(line) {
51
+ logger.debug({
52
+ evt: 'fitness.checks.no_hardcoded_timeouts.extract_set_timeout_value',
53
+ msg: 'Extracting setTimeout value from line',
54
+ });
55
+ const idx = line.indexOf('setTimeout');
56
+ if (idx === -1)
57
+ return null;
58
+ const afterSetTimeout = line.slice(Math.max(0, idx + 10));
59
+ let i = skipWhitespace(afterSetTimeout, 0);
60
+ // Expect (
61
+ if (afterSetTimeout[i] !== '(')
62
+ return null;
63
+ i++;
64
+ // Find the comma (skip over the callback argument)
65
+ i = findSetTimeoutComma(afterSetTimeout, i);
66
+ if (afterSetTimeout[i] !== ',')
67
+ return null;
68
+ i++;
69
+ // Skip whitespace
70
+ i = skipWhitespace(afterSetTimeout, i);
71
+ // Parse the timeout number (4+ digits)
72
+ const { endPos, value: timeout, digitCount } = parseDigits(afterSetTimeout, i);
73
+ i = endPos;
74
+ if (digitCount < 4)
75
+ return null;
76
+ // Skip whitespace and expect )
77
+ i = skipWhitespace(afterSetTimeout, i);
78
+ if (afterSetTimeout[i] !== ')')
79
+ return null;
80
+ i++;
81
+ return {
82
+ timeout,
83
+ matchText: `setTimeout${afterSetTimeout.slice(0, Math.max(0, i))}`,
84
+ };
85
+ }
86
+ /**
87
+ * Extract timeout assignment value using string parsing.
88
+ */
89
+ function extractTimeoutAssignment(line) {
90
+ logger.debug({
91
+ evt: 'fitness.checks.no_hardcoded_timeouts.extract_timeout_assignment',
92
+ msg: 'Extracting timeout assignment value from line',
93
+ });
94
+ const lowerLine = line.toLowerCase();
95
+ const idx = lowerLine.indexOf('timeout');
96
+ if (idx === -1)
97
+ return null;
98
+ // Skip if this is setTimeout (handled separately)
99
+ if (idx >= 3 && lowerLine.slice(idx - 3, idx) === 'set')
100
+ return null;
101
+ const afterTimeout = line.slice(Math.max(0, idx + 7));
102
+ let i = 0;
103
+ // Skip whitespace
104
+ while (i < afterTimeout.length && (afterTimeout[i] === ' ' || afterTimeout[i] === '\t')) {
105
+ i++;
106
+ }
107
+ // Check for = or :
108
+ if (afterTimeout[i] !== '=' && afterTimeout[i] !== ':') {
109
+ return null;
110
+ }
111
+ i++;
112
+ // Skip whitespace
113
+ while (i < afterTimeout.length && (afterTimeout[i] === ' ' || afterTimeout[i] === '\t')) {
114
+ i++;
115
+ }
116
+ // Parse the timeout number (4+ digits)
117
+ const digitStart = i;
118
+ while (i < afterTimeout.length && isDigit(afterTimeout[i])) {
119
+ i++;
120
+ }
121
+ const digitCount = i - digitStart;
122
+ if (digitCount < 4)
123
+ return null;
124
+ // Word boundary check
125
+ if (i < afterTimeout.length && isAlphanumericChar(afterTimeout[i])) {
126
+ return null;
127
+ }
128
+ // @fitness-ignore-next-line numeric-validation -- substring is guaranteed digit-only by isDigit loop above
129
+ const timeout = Number.parseInt(afterTimeout.slice(digitStart, i), 10);
130
+ return {
131
+ timeout,
132
+ matchText: `timeout${afterTimeout.slice(0, Math.max(0, i))}`,
133
+ };
134
+ }
135
+ /**
136
+ * Extract .timeout(N) value using string parsing.
137
+ */
138
+ function extractDotTimeout(line) {
139
+ logger.debug({
140
+ evt: 'fitness.checks.no_hardcoded_timeouts.extract_dot_timeout',
141
+ msg: 'Extracting .timeout() value from line',
142
+ });
143
+ const idx = line.indexOf('.timeout');
144
+ if (idx === -1)
145
+ return null;
146
+ const afterDotTimeout = line.slice(Math.max(0, idx + 8));
147
+ let i = 0;
148
+ // Skip whitespace
149
+ while (i < afterDotTimeout.length &&
150
+ (afterDotTimeout[i] === ' ' || afterDotTimeout[i] === '\t')) {
151
+ i++;
152
+ }
153
+ // Expect (
154
+ if (afterDotTimeout[i] !== '(')
155
+ return null;
156
+ i++;
157
+ // Skip whitespace
158
+ while (i < afterDotTimeout.length &&
159
+ (afterDotTimeout[i] === ' ' || afterDotTimeout[i] === '\t')) {
160
+ i++;
161
+ }
162
+ // Parse the timeout number (4+ digits)
163
+ const digitStart = i;
164
+ while (i < afterDotTimeout.length && isDigit(afterDotTimeout[i])) {
165
+ i++;
166
+ }
167
+ const digitCount = i - digitStart;
168
+ if (digitCount < 4)
169
+ return null;
170
+ // @fitness-ignore-next-line numeric-validation -- substring is guaranteed digit-only by isDigit loop above
171
+ const timeout = Number.parseInt(afterDotTimeout.slice(digitStart, i), 10);
172
+ // Skip whitespace and expect )
173
+ while (i < afterDotTimeout.length &&
174
+ (afterDotTimeout[i] === ' ' || afterDotTimeout[i] === '\t')) {
175
+ i++;
176
+ }
177
+ if (afterDotTimeout[i] !== ')')
178
+ return null;
179
+ i++;
180
+ return {
181
+ timeout,
182
+ matchText: `.timeout${afterDotTimeout.slice(0, Math.max(0, i))}`,
183
+ };
184
+ }
185
+ /* v8 ignore stop */
186
+ /**
187
+ * Extract timeout value from a line using string parsing.
188
+ */
189
+ function extractTimeoutFromLine(line) {
190
+ logger.debug({
191
+ evt: 'fitness.checks.no_hardcoded_timeouts.extract_timeout_from_line',
192
+ msg: 'Extracting timeout value from line',
193
+ });
194
+ // Check for setTimeout(fn, NUMBER)
195
+ const setTimeoutMatch = extractSetTimeoutValue(line);
196
+ if (setTimeoutMatch)
197
+ return setTimeoutMatch;
198
+ // Check for timeout = NUMBER or timeout: NUMBER
199
+ const timeoutAssignMatch = extractTimeoutAssignment(line);
200
+ if (timeoutAssignMatch)
201
+ return timeoutAssignMatch;
202
+ // Check for .timeout(NUMBER)
203
+ const dotTimeoutMatch = extractDotTimeout(line);
204
+ if (dotTimeoutMatch)
205
+ return dotTimeoutMatch;
206
+ return null;
207
+ }
208
+ // =============================================================================
209
+ // LINE CHECKING
210
+ // =============================================================================
211
+ /**
212
+ * Check if a line should be skipped for timeout checking.
213
+ */
214
+ function shouldSkipTimeoutLine(line) {
215
+ logger.debug({
216
+ evt: 'fitness.checks.no_hardcoded_timeouts.should_skip_timeout_line',
217
+ msg: 'Checking if line should be skipped for timeout checking',
218
+ });
219
+ /* v8 ignore next -- defensive: lines.entries() never yields undefined */
220
+ if (!line)
221
+ return true;
222
+ const trimmed = line.trim();
223
+ return trimmed.startsWith('//') || trimmed.startsWith('*');
224
+ }
225
+ // =============================================================================
226
+ // CHECK DEFINITION
227
+ // =============================================================================
228
+ /**
229
+ * Check: resilience/no-hardcoded-timeouts
230
+ *
231
+ * Detects hardcoded timeout values that should be configurable.
232
+ */
233
+ export const noHardcodedTimeouts = defineCheck({
234
+ id: '5c183a31-ff6e-4120-a7a5-39a32dbbcfa5',
235
+ slug: 'no-hardcoded-timeouts',
236
+ scope: { languages: ['typescript'], concerns: ['backend', 'server'] },
237
+ contentFilter: 'strip-strings',
238
+ confidence: 'medium',
239
+ description: 'Detect hardcoded timeout values that should be configurable',
240
+ longDescription: `**Purpose:** Flags hardcoded timeout values that should be externalized to configuration for environment-specific tuning.
241
+
242
+ **Detects:**
243
+ - \`setTimeout(callback, N)\` where N has 4+ digits (>= 1000ms) and the value >= 5000ms
244
+ - \`timeout = N\` or \`timeout: N\` assignments where N has 4+ digits and >= 5000ms
245
+ - \`.timeout(N)\` method calls where N has 4+ digits and >= 5000ms
246
+ - Skips comment lines and lines starting with \`//\` or \`*\`
247
+
248
+ **Why it matters:** Hardcoded timeouts cannot be tuned per environment; a value suitable for development may cause failures or excessive waits in production.
249
+
250
+ **Scope:** General best practice. Analyzes each file individually via string parsing.`,
251
+ tags: ['resilience', 'config', 'timeout'],
252
+ fileTypes: ['ts'],
253
+ analyze(content, filePath) {
254
+ // Skip test files — hardcoded timeouts in tests are low-risk
255
+ if (isTestFile(filePath))
256
+ return [];
257
+ logger.debug({
258
+ evt: 'fitness.checks.no_hardcoded_timeouts.analyze',
259
+ msg: 'Analyzing file for hardcoded timeout values',
260
+ });
261
+ const violations = [];
262
+ // Skip files that don't have timeout patterns (strip strings/comments to avoid false positives)
263
+ const strippedContent = stripStringsAndComments(content);
264
+ if (!strippedContent.includes('timeout') && !strippedContent.includes('setTimeout')) {
265
+ return violations;
266
+ }
267
+ const lines = content.split('\n');
268
+ for (const [i, line] of lines.entries()) {
269
+ if (!line || shouldSkipTimeoutLine(line)) {
270
+ continue;
271
+ }
272
+ const strippedLine = stripStringLiterals(line);
273
+ const result = extractTimeoutFromLine(strippedLine);
274
+ if (!result || result.timeout < MIN_FLAGGABLE_TIMEOUT)
275
+ continue;
276
+ const lineNumber = i + 1;
277
+ violations.push({
278
+ line: lineNumber,
279
+ column: 0,
280
+ message: `Hardcoded timeout value: ${result.timeout}ms`,
281
+ severity: 'warning',
282
+ suggestion: 'Use configurable timeout from configuration or constants. Example: const timeout = config.get("httpTimeout") or import { HTTP_TIMEOUT } from "./constants"',
283
+ match: result.matchText,
284
+ type: 'hardcoded-timeout',
285
+ filePath,
286
+ });
287
+ }
288
+ return violations;
289
+ },
290
+ });
291
+ //# sourceMappingURL=no-hardcoded-timeouts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-hardcoded-timeouts.js","sourceRoot":"","sources":["../../../src/checks/resilience/no-hardcoded-timeouts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @fileoverview Detects process.exit() usage that bypasses finally blocks
3
+ */
4
+ /**
5
+ * Check: resilience/no-process-exit-in-finally
6
+ *
7
+ * Detects process.exit() calls in files that contain try/finally blocks,
8
+ * which would bypass cleanup logic in the finally block.
9
+ */
10
+ export declare const noProcessExitInFinally: import("@opensip-cli/fitness").Check;
11
+ //# sourceMappingURL=no-process-exit-in-finally.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-process-exit-in-finally.d.ts","sourceRoot":"","sources":["../../../src/checks/resilience/no-process-exit-in-finally.ts"],"names":[],"mappings":"AAEA;;GAEG;AAoBH;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,sCAyEjC,CAAC"}
@@ -0,0 +1,89 @@
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 process.exit() usage that bypasses finally blocks
5
+ */
6
+ import { defineCheck, getLineNumber } from '@opensip-cli/fitness';
7
+ /**
8
+ * Pattern for detecting process.exit() calls
9
+ */
10
+ const PROCESS_EXIT_PATTERN = /process\.exit\s*\(/g;
11
+ /**
12
+ * Pattern for detecting an actual try/finally clause: a closing brace
13
+ * (of the try or catch block) immediately followed by `finally {`.
14
+ *
15
+ * Critical: must NOT match `Promise.finally(...)` (a method call),
16
+ * which is `.finally(` — preceded by a dot, followed by `(`. The
17
+ * `}\s*finally\s*\{` shape excludes both cases by requiring brace
18
+ * adjacency on both sides.
19
+ */
20
+ const TRY_FINALLY_PATTERN = /\}\s*finally\s*\{/;
21
+ /**
22
+ * Check: resilience/no-process-exit-in-finally
23
+ *
24
+ * Detects process.exit() calls in files that contain try/finally blocks,
25
+ * which would bypass cleanup logic in the finally block.
26
+ */
27
+ export const noProcessExitInFinally = defineCheck({
28
+ id: '58c0aaf6-f965-4336-983f-ee1033269e54',
29
+ slug: 'no-process-exit-in-finally',
30
+ scope: { languages: ['typescript'], concerns: ['backend', 'frontend', 'cli'] },
31
+ contentFilter: 'strip-strings',
32
+ confidence: 'medium',
33
+ description: 'Detect process.exit() that bypasses finally cleanup',
34
+ longDescription: `**Purpose:** Prevents \`process.exit()\` from bypassing \`finally\` block cleanup logic, which can leave resources (servers, file handles, database connections) in an inconsistent state.
35
+
36
+ **Detects:**
37
+ - \`process.exit()\` calls in files that also contain \`try/finally\` blocks
38
+ - Skips test files and comment lines
39
+
40
+ **Why it matters:** \`process.exit()\` terminates the process immediately, skipping all pending \`finally\` blocks. This can cause server cleanup bypass, leaked file handles, and corrupted state.
41
+
42
+ **Scope:** General best practice. Analyzes each file individually via regex.`,
43
+ tags: ['resilience', 'cleanup', 'process'],
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: must have both process.exit and finally
54
+ if (!content.includes('process.exit') || !content.includes('finally')) {
55
+ return violations;
56
+ }
57
+ // Verify the file has a real try/finally clause (not Promise.finally).
58
+ // The pattern `}\s*finally\s*\{` requires brace adjacency on both sides,
59
+ // which method-style `.finally(...)` cannot match.
60
+ if (!TRY_FINALLY_PATTERN.test(content)) {
61
+ return violations;
62
+ }
63
+ // Find all process.exit() calls
64
+ PROCESS_EXIT_PATTERN.lastIndex = 0;
65
+ const lines = content.split('\n');
66
+ let match;
67
+ while ((match = PROCESS_EXIT_PATTERN.exec(content)) !== null) {
68
+ const lineNumber = getLineNumber(content, match.index);
69
+ const line = lines[lineNumber - 1] ?? '';
70
+ const trimmed = line.trim();
71
+ // Skip comment lines
72
+ if (trimmed.startsWith('//') || trimmed.startsWith('*')) {
73
+ continue;
74
+ }
75
+ violations.push({
76
+ line: lineNumber,
77
+ column: 0,
78
+ message: 'process.exit() in file with try/finally blocks — cleanup will be bypassed',
79
+ severity: 'error',
80
+ suggestion: 'Throw a typed error instead of calling process.exit(). Let the top-level error handler decide the exit code. This ensures finally blocks execute for proper resource cleanup.',
81
+ match: match[0],
82
+ type: 'process-exit-bypasses-finally',
83
+ filePath,
84
+ });
85
+ }
86
+ return violations;
87
+ },
88
+ });
89
+ //# sourceMappingURL=no-process-exit-in-finally.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-process-exit-in-finally.js","sourceRoot":"","sources":["../../../src/checks/resilience/no-process-exit-in-finally.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,sGAAsG;AACtG;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAuB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEvF;;GAEG;AACH,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;AAEnD;;;;;;;;GAQG;AACH,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,WAAW,CAAC;IAChD,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,4BAA4B;IAClC,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,qDAAqD;IAClE,eAAe,EAAE;;;;;;;;6EAQ0D;IAC3E,IAAI,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC;IAC1C,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,uDAAuD;QACvD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACtE,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,uEAAuE;QACvE,yEAAyE;QACzE,mDAAmD;QACnD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,gCAAgC;QAChC,oBAAoB,CAAC,SAAS,GAAG,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7D,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAE5B,qBAAqB;YACrB,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxD,SAAS;YACX,CAAC;YAED,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,2EAA2E;gBACpF,QAAQ,EAAE,OAAO;gBACjB,UAAU,EACR,+KAA+K;gBACjL,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBACf,IAAI,EAAE,+BAA+B;gBACrC,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @fileoverview Detects readline usage without proper cleanup
3
+ */
4
+ /**
5
+ * Check: resilience/readline-cleanup
6
+ *
7
+ * Detects readline interface creation without proper cleanup,
8
+ * which can cause the process to hang if stdin doesn't close.
9
+ */
10
+ export declare const readlineCleanup: import("@opensip-cli/fitness").Check;
11
+ //# sourceMappingURL=readline-cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readline-cleanup.d.ts","sourceRoot":"","sources":["../../../src/checks/resilience/readline-cleanup.ts"],"names":[],"mappings":"AAEA;;GAEG;AAyBH;;;;;GAKG;AACH,eAAO,MAAM,eAAe,sCA2F1B,CAAC"}
@@ -0,0 +1,107 @@
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 readline usage without proper cleanup
5
+ */
6
+ import { defineCheck, getLineNumber } from '@opensip-cli/fitness';
7
+ /**
8
+ * Pattern for detecting readline.createInterface() calls
9
+ */
10
+ const READLINE_CREATE_PATTERN = /readline\.createInterface\s*\(/g;
11
+ /**
12
+ * Pattern for detecting readLine() helper calls (custom wrappers)
13
+ */
14
+ const READLINE_HELPER_PATTERN = /\breadLine\s*\(/g;
15
+ /**
16
+ * Patterns indicating proper cleanup
17
+ */
18
+ const CLEANUP_PATTERNS = [
19
+ /\.close\s*\(/,
20
+ /finally/,
21
+ /using\s/,
22
+ /\[Symbol\.dispose\]/,
23
+ /\[Symbol\.asyncDispose\]/,
24
+ ];
25
+ /**
26
+ * Check: resilience/readline-cleanup
27
+ *
28
+ * Detects readline interface creation without proper cleanup,
29
+ * which can cause the process to hang if stdin doesn't close.
30
+ */
31
+ export const readlineCleanup = defineCheck({
32
+ id: 'd0e76036-c138-4132-99be-d2cddf9aeac1',
33
+ slug: 'readline-cleanup',
34
+ scope: { languages: ['typescript'], concerns: ['backend', 'frontend', 'cli'] },
35
+ contentFilter: 'strip-strings',
36
+ confidence: 'medium',
37
+ description: 'Detect readline usage without proper cleanup (close/finally)',
38
+ longDescription: `**Purpose:** Ensures readline interfaces are properly closed to prevent process hangs.
39
+
40
+ **Detects:**
41
+ - \`readline.createInterface()\` calls in files without corresponding \`.close()\` calls or \`finally\` blocks
42
+ - Custom \`readLine()\` helper calls without timeout or cleanup guards
43
+
44
+ **Why it matters:** An unclosed readline interface keeps the process alive waiting for stdin input, causing CLI commands to hang indefinitely instead of exiting cleanly.
45
+
46
+ **Scope:** General best practice. Analyzes each file individually via regex.`,
47
+ tags: ['resilience', 'cleanup', 'readline'],
48
+ fileTypes: ['ts'],
49
+ analyze(content, filePath) {
50
+ const violations = [];
51
+ // Skip test files
52
+ if (filePath.includes('.test.') ||
53
+ filePath.includes('.spec.') ||
54
+ filePath.includes('__tests__')) {
55
+ return violations;
56
+ }
57
+ // Quick check
58
+ if (!content.includes('readline') && !content.includes('readLine')) {
59
+ return violations;
60
+ }
61
+ const hasCleanup = CLEANUP_PATTERNS.some((p) => p.test(content));
62
+ // Check readline.createInterface without cleanup
63
+ READLINE_CREATE_PATTERN.lastIndex = 0;
64
+ let match;
65
+ while ((match = READLINE_CREATE_PATTERN.exec(content)) !== null) {
66
+ if (!hasCleanup) {
67
+ const lineNumber = getLineNumber(content, match.index);
68
+ violations.push({
69
+ line: lineNumber,
70
+ column: 0,
71
+ message: 'readline.createInterface() without .close() or finally block — process may hang',
72
+ severity: 'warning',
73
+ suggestion: 'Wrap readline usage in a try/finally block and call rl.close() in the finally block, or use a timeout to prevent indefinite hangs.',
74
+ match: match[0],
75
+ type: 'readline-no-cleanup',
76
+ filePath,
77
+ });
78
+ }
79
+ }
80
+ // Check readLine() helper without cleanup
81
+ READLINE_HELPER_PATTERN.lastIndex = 0;
82
+ while ((match = READLINE_HELPER_PATTERN.exec(content)) !== null) {
83
+ // Skip if this is the definition of readLine, not a call
84
+ const lineNumber = getLineNumber(content, match.index);
85
+ const line = content.split('\n')[lineNumber - 1] ?? '';
86
+ if (line.includes('function readLine') ||
87
+ line.includes('const readLine') ||
88
+ line.includes('async function readLine')) {
89
+ continue;
90
+ }
91
+ if (!hasCleanup) {
92
+ violations.push({
93
+ line: lineNumber,
94
+ column: 0,
95
+ message: 'readLine() call without cleanup guard — process may hang if stdin stalls',
96
+ severity: 'warning',
97
+ suggestion: 'Ensure readLine() has a timeout mechanism or is wrapped in a try/finally with proper cleanup.',
98
+ match: match[0],
99
+ type: 'readline-helper-no-cleanup',
100
+ filePath,
101
+ });
102
+ }
103
+ }
104
+ return violations;
105
+ },
106
+ });
107
+ //# sourceMappingURL=readline-cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readline-cleanup.js","sourceRoot":"","sources":["../../../src/checks/resilience/readline-cleanup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @fileoverview Enforce use of canonical recovery patterns
3
+ */
4
+ /**
5
+ * Check: resilience/recovery-patterns
6
+ *
7
+ * Ensures code uses a shared recovery/retry utility
8
+ * instead of custom retry loops, circuit breakers, or timeout wrappers.
9
+ */
10
+ export declare const recoveryPatterns: import("@opensip-cli/fitness").Check;
11
+ /**
12
+ * Check: resilience/no-custom-cache
13
+ *
14
+ * Ensures code uses a shared cache abstraction
15
+ * instead of custom Map-based caches.
16
+ */
17
+ export declare const noCustomCache: import("@opensip-cli/fitness").Check;
18
+ /**
19
+ * Check: resilience/no-custom-rate-limiter
20
+ *
21
+ * Ensures code uses a shared rate limiter
22
+ * instead of custom rate limiting implementations.
23
+ */
24
+ export declare const noCustomRateLimiter: import("@opensip-cli/fitness").Check;
25
+ //# sourceMappingURL=recovery-patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-patterns.d.ts","sourceRoot":"","sources":["../../../src/checks/resilience/recovery-patterns.ts"],"names":[],"mappings":"AACA;;GAEG;AA4OH;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,sCA8B3B,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,aAAa,sCAuBxB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,sCAuB9B,CAAC"}