@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,209 @@
1
+ /**
2
+ * @fileoverview Pino Serializer Coverage Check
3
+ *
4
+ * Validates that complex objects logged with Pino have serializers:
5
+ * - Objects without registered serializers break structured logging
6
+ * - Circular references cause logging failures
7
+ * - Large objects need truncation
8
+ */
9
+ import { defineCheck } from '@opensip-cli/fitness';
10
+ /**
11
+ * Pre-compiled patterns for complex objects that need serializers.
12
+ * These patterns are intentional and safe for static code analysis.
13
+ * They detect object references in log statements, not user input.
14
+ */
15
+ const REQUEST_PATTERN = new RegExp(String.raw `\breq\s*[,}]`);
16
+ const QUERY_RUNNER_PATTERN = new RegExp(String.raw `queryRunner\s*[,}]`, 'i');
17
+ const ENTITY_PATTERN = new RegExp(String.raw `\bentity\s*[,}]`, 'i');
18
+ /**
19
+ * Known complex objects that need serializers
20
+ */
21
+ const COMPLEX_OBJECTS = [
22
+ { pattern: REQUEST_PATTERN, name: 'Request' },
23
+ { pattern: QUERY_RUNNER_PATTERN, name: 'QueryRunner' },
24
+ { pattern: ENTITY_PATTERN, name: 'Entity' },
25
+ ];
26
+ /**
27
+ * Pre-compiled patterns for safe serialization indicators.
28
+ * These patterns are intentional and safe for static code analysis.
29
+ * Using escaped dot (\\.) instead of character class [.] per sonarjs/single-char-in-character-classes.
30
+ */
31
+ const SAFE_ID_PATTERN = /\.id\s{0,10}[,}]/;
32
+ const SAFE_NAME_PATTERN = /\.name\s{0,10}[,}]/;
33
+ const SAFE_TO_STRING_PATTERN = /\.toString\s{0,10}\(\)/;
34
+ const SAFE_JSON_STRINGIFY_PATTERN = /JSON\.stringify/;
35
+ const SAFE_TO_JSON_PATTERN = /\.toJSON\s{0,10}\(\)/;
36
+ /**
37
+ * Safe patterns that indicate proper serialization
38
+ */
39
+ const SAFE_PATTERNS = [
40
+ SAFE_ID_PATTERN,
41
+ SAFE_NAME_PATTERN,
42
+ SAFE_TO_STRING_PATTERN,
43
+ SAFE_JSON_STRINGIFY_PATTERN,
44
+ SAFE_TO_JSON_PATTERN,
45
+ ];
46
+ /**
47
+ * Pre-compiled pattern for detecting logger calls with objects.
48
+ * This pattern is intentional and safe for static code analysis.
49
+ * Using bounded quantifiers for safety.
50
+ */
51
+ const LOG_CALL_PATTERN = /logger\.(info|warn|error|debug|trace)\s{0,10}\(\s{0,10}\{/;
52
+ /**
53
+ * Pre-compiled pattern for detecting circular reference issues.
54
+ * This pattern is intentional and safe for static code analysis.
55
+ * Using bounded quantifiers for safety.
56
+ */
57
+ const THIS_PATTERN = /:\s{0,10}this\s{0,10}[,}]/;
58
+ /**
59
+ * Counts brackets in a line
60
+ * @param line - The line to count brackets in
61
+ * @returns The net bracket count (open minus close)
62
+ */
63
+ function countBrackets(line) {
64
+ let openCount = 0;
65
+ let closeCount = 0;
66
+ for (const char of line) {
67
+ if (char === '{')
68
+ openCount++;
69
+ if (char === '}')
70
+ closeCount++;
71
+ }
72
+ return openCount - closeCount;
73
+ }
74
+ /**
75
+ * Builds the complete log statement from multiple lines
76
+ * @param lines - All lines in the file
77
+ * @param startIndex - Starting line index
78
+ * @returns The complete log statement
79
+ */
80
+ function buildLogStatement(lines, startIndex) {
81
+ const firstLine = lines[startIndex];
82
+ if (!firstLine)
83
+ return '';
84
+ let logStatement = firstLine;
85
+ let bracketCount = countBrackets(firstLine);
86
+ let j = startIndex + 1;
87
+ while (bracketCount > 0 && j < lines.length) {
88
+ const nextLine = lines[j];
89
+ if (nextLine) {
90
+ logStatement += '\n' + nextLine;
91
+ bracketCount += countBrackets(nextLine);
92
+ }
93
+ j++;
94
+ }
95
+ return logStatement;
96
+ }
97
+ /**
98
+ * Creates complex object violation info
99
+ */
100
+ function createComplexObjectViolation(lineNum, objectName, match) {
101
+ const lowerName = objectName.toLowerCase();
102
+ return {
103
+ lineNum,
104
+ message: `Logging ${objectName} object without serializer`,
105
+ suggestion: `Register a Pino serializer for ${objectName} objects, or extract specific fields: { ${lowerName}Id: ${lowerName}.id, ${lowerName}Name: ${lowerName}.name }`,
106
+ match,
107
+ };
108
+ }
109
+ /**
110
+ * Creates circular reference violation info
111
+ */
112
+ function createCircularReferenceViolation(lineNum, match) {
113
+ return {
114
+ lineNum,
115
+ message: 'Logging "this" directly may cause circular reference',
116
+ suggestion: 'Extract specific properties from "this" instead of logging the entire object: { className: this.constructor.name, id: this.id }',
117
+ match,
118
+ };
119
+ }
120
+ /**
121
+ * Checks for complex object violations in log statement
122
+ */
123
+ function checkComplexObjects(logStatement, lineNum, match, violationInfos) {
124
+ for (const { pattern, name } of COMPLEX_OBJECTS) {
125
+ if (pattern.test(logStatement)) {
126
+ violationInfos.push(createComplexObjectViolation(lineNum, name, match));
127
+ }
128
+ }
129
+ }
130
+ /**
131
+ * Checks for circular reference violations in log statement
132
+ */
133
+ function checkCircularReferences(logStatement, lineNum, match, violationInfos) {
134
+ if (THIS_PATTERN.test(logStatement)) {
135
+ violationInfos.push(createCircularReferenceViolation(lineNum, match));
136
+ }
137
+ }
138
+ /**
139
+ * Analyze a file for Pino serializer coverage issues
140
+ */
141
+ function analyzeFile(content, _filePath) {
142
+ const violations = [];
143
+ // Quick filter: skip files without logger patterns
144
+ if (!content.includes('logger.info') &&
145
+ !content.includes('logger.warn') &&
146
+ !content.includes('logger.error') &&
147
+ !content.includes('logger.debug')) {
148
+ return violations;
149
+ }
150
+ const lines = content.split('\n');
151
+ for (let i = 0; i < lines.length; i++) {
152
+ const line = lines[i];
153
+ if (!line)
154
+ continue;
155
+ // Check for logger calls with objects
156
+ if (!LOG_CALL_PATTERN.test(line))
157
+ continue;
158
+ // Get the full log statement (may span multiple lines)
159
+ const logStatement = buildLogStatement(lines, i);
160
+ // Check if any safe patterns are used
161
+ const isSafe = SAFE_PATTERNS.some((p) => p.test(logStatement));
162
+ if (isSafe)
163
+ continue;
164
+ const lineNum = i + 1;
165
+ const violationInfos = [];
166
+ checkComplexObjects(logStatement, lineNum, line, violationInfos);
167
+ checkCircularReferences(logStatement, lineNum, line, violationInfos);
168
+ for (const info of violationInfos) {
169
+ violations.push({
170
+ line: info.lineNum,
171
+ column: 0,
172
+ message: info.message,
173
+ severity: 'warning',
174
+ suggestion: info.suggestion,
175
+ match: info.match,
176
+ });
177
+ }
178
+ }
179
+ return violations;
180
+ }
181
+ /**
182
+ * Check: quality/pino-serializer-coverage
183
+ *
184
+ * Validates that complex objects logged have proper Pino serializers.
185
+ */
186
+ export const pinoSerializerCoverage = defineCheck({
187
+ id: 'e54a6ff0-332e-4848-bc62-d7df37b4795a',
188
+ slug: 'pino-serializer-coverage',
189
+ scope: { languages: ['typescript'], concerns: ['backend', 'server'] },
190
+ contentFilter: 'strip-strings-and-comments',
191
+ confidence: 'medium',
192
+ description: 'Validates that complex objects logged have proper Pino serializers',
193
+ longDescription: `**Purpose:** Validates that complex objects passed to Pino logger calls have proper serializers registered, preventing structured logging failures from circular references or oversized objects.
194
+
195
+ **Detects:**
196
+ - \`logger.(info|warn|error|debug|trace)\` calls containing complex object references: \`req\` (Request), \`queryRunner\` (QueryRunner), \`entity\` (Entity) without safe serialization
197
+ - Logging \`this\` directly (matched via \`:\\s*this\\s*[,}]\`), which risks circular reference errors
198
+ - Skips log statements that use safe patterns: \`.id\`, \`.name\`, \`.toString()\`, \`JSON.stringify\`, or \`.toJSON()\`
199
+
200
+ **Why it matters:** Logging unserialized complex objects causes Pino to fail silently, produce truncated output, or throw circular reference errors -- all of which degrade observability in production.
201
+
202
+ **Scope:** General best practice. Analyzes each file individually using regex-based log statement scanning.`,
203
+ tags: ['logging', 'quality'],
204
+ fileTypes: ['ts'],
205
+ // @fitness-ignore-next-line no-hardcoded-timeouts -- framework default for fitness check execution
206
+ timeout: 180_000, // 3 minutes - scans log statements across codebase
207
+ analyze: analyzeFile,
208
+ });
209
+ //# sourceMappingURL=pino-serializer-coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pino-serializer-coverage.js","sourceRoot":"","sources":["../../../../src/checks/quality/observability/pino-serializer-coverage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @fileoverview Async State Pattern Check
3
+ *
4
+ * Enforces that data-driven screens are wrapped in the AsyncState pattern.
5
+ * Screens using TanStack Query should use AsyncState for consistent loading/error handling.
6
+ */
7
+ /**
8
+ * Check: quality/async-state-pattern
9
+ *
10
+ * Ensures data-driven screens use AsyncState pattern for consistent
11
+ * loading and error state handling with TanStack Query.
12
+ */
13
+ export declare const asyncStatePattern: import("@opensip-cli/fitness").Check;
14
+ //# sourceMappingURL=async-state-pattern.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-state-pattern.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/async-state-pattern.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,sCAgE5B,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * @fileoverview Async State Pattern Check
3
+ *
4
+ * Enforces that data-driven screens are wrapped in the AsyncState pattern.
5
+ * Screens using TanStack Query should use AsyncState for consistent loading/error handling.
6
+ */
7
+ // @fitness-ignore-next-line no-markdown-references -- rule provenance reference for developer context
8
+ // Rule source: .augment/rules/ui-patterns.md
9
+ import { defineCheck, extractSnippet } from '@opensip-cli/fitness';
10
+ /**
11
+ * Paths to exclude from checking
12
+ */
13
+ const NON_SCREEN_PATTERNS = [
14
+ /node_modules/,
15
+ /__tests__/,
16
+ /\.test\./,
17
+ /\.spec\./,
18
+ /components\/patterns\//, // The pattern components themselves
19
+ ];
20
+ /**
21
+ * Check: quality/async-state-pattern
22
+ *
23
+ * Ensures data-driven screens use AsyncState pattern for consistent
24
+ * loading and error state handling with TanStack Query.
25
+ */
26
+ export const asyncStatePattern = defineCheck({
27
+ id: '3bc0cb23-7354-4f85-b39f-d21813e6394c',
28
+ slug: 'async-state-pattern',
29
+ disabled: true,
30
+ scope: { languages: ['typescript'], concerns: ['backend', 'server'] },
31
+ contentFilter: 'strip-strings',
32
+ confidence: 'medium',
33
+ description: 'Ensure data-driven screens use AsyncState pattern',
34
+ longDescription: `**Purpose:** Enforces that data-driven screens wrap TanStack Query results in the AsyncState component for consistent loading/error handling.
35
+
36
+ **Detects:** Analyzes each file individually. Screen files in \`/screens/\` that import \`useQuery\`, \`useMutation\`, or \`useInfiniteQuery\` but do not reference \`AsyncState\` or \`<AsyncState\`.
37
+
38
+ **Why it matters:** Without AsyncState, each screen implements its own loading/error UI, leading to inconsistent user experience and duplicated boilerplate.
39
+
40
+ **Scope:** Codebase-specific convention (rule source: .augment/rules/ui-patterns.md)`,
41
+ tags: ['quality', 'frontend', 'patterns', 'tanstack-query', 'consistency'],
42
+ fileTypes: ['ts', 'tsx'],
43
+ analyze(content, filePath) {
44
+ // Only check screen files
45
+ if (!filePath.includes('/screens/') ||
46
+ (!filePath.endsWith('.ts') && !filePath.endsWith('.tsx'))) {
47
+ return [];
48
+ }
49
+ // Skip excluded paths
50
+ if (NON_SCREEN_PATTERNS.some((pattern) => pattern.test(filePath))) {
51
+ return [];
52
+ }
53
+ const violations = [];
54
+ // Check if file uses TanStack Query (useQuery, useMutation)
55
+ const usesQuery = /use(Query|Mutation|InfiniteQuery)\s*\(/.test(content);
56
+ if (!usesQuery) {
57
+ return violations; // Not a data-driven screen
58
+ }
59
+ // Check if file imports or uses AsyncState pattern
60
+ const hasAsyncState = /AsyncState|<AsyncState/.test(content);
61
+ if (!hasAsyncState) {
62
+ // Find the useQuery line for better context
63
+ const queryMatch = /use(Query|Mutation|InfiniteQuery)\s*\(/.exec(content);
64
+ const queryLine = queryMatch ? content.slice(0, queryMatch.index).split('\n').length : 1;
65
+ extractSnippet(content, queryLine, 3);
66
+ const matchText = queryMatch?.[0] ?? 'useQuery';
67
+ violations.push({
68
+ line: queryLine,
69
+ column: 0,
70
+ message: 'Data-driven screen uses TanStack Query but not AsyncState pattern',
71
+ severity: 'warning',
72
+ suggestion: "Import AsyncState from 'components/patterns/' and wrap data display: <AsyncState isLoading={isLoading} error={error} data={data}>{...}</AsyncState>",
73
+ type: 'missing-async-state',
74
+ match: matchText,
75
+ });
76
+ }
77
+ return violations;
78
+ },
79
+ });
80
+ //# sourceMappingURL=async-state-pattern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-state-pattern.js","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/async-state-pattern.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,sGAAsG;AACtG,6CAA6C;AAE7C,OAAO,EAAE,WAAW,EAAuB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAExF;;GAEG;AACH,MAAM,mBAAmB,GAAG;IAC1B,cAAc;IACd,WAAW;IACX,UAAU;IACV,UAAU;IACV,wBAAwB,EAAE,oCAAoC;CAC/D,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAC;IAC3C,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,qBAAqB;IAC3B,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;IACrE,aAAa,EAAE,eAAe;IAE9B,UAAU,EAAE,QAAQ;IACpB,WAAW,EAAE,mDAAmD;IAChE,eAAe,EAAE;;;;;;qFAMkE;IACnF,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,aAAa,CAAC;IAC1E,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;IAExB,OAAO,CAAC,OAAO,EAAE,QAAQ;QACvB,0BAA0B;QAC1B,IACE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC/B,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EACzD,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,sBAAsB;QACtB,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAClE,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,UAAU,GAAqB,EAAE,CAAC;QAExC,4DAA4D;QAC5D,MAAM,SAAS,GAAG,wCAAwC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,UAAU,CAAC,CAAC,2BAA2B;QAChD,CAAC;QAED,mDAAmD;QACnD,MAAM,aAAa,GAAG,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,4CAA4C;YAC5C,MAAM,UAAU,GAAG,wCAAwC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1E,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACzF,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC;YAEhD,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,mEAAmE;gBAC5E,QAAQ,EAAE,SAAS;gBACnB,UAAU,EACR,qJAAqJ;gBACvJ,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './async-state-pattern.js';
2
+ export * from './no-non-null-assertions.js';
3
+ export * from './performance-anti-patterns.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './async-state-pattern.js';
2
+ export * from './no-non-null-assertions.js';
3
+ export * from './performance-anti-patterns.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @fileoverview No non-null assertions check
3
+ */
4
+ /**
5
+ * Check: quality/no-non-null-assertions
6
+ *
7
+ * Detects TypeScript non-null assertion operator (!) usage in production code.
8
+ */
9
+ export declare const noNonNullAssertions: import("@opensip-cli/fitness").Check;
10
+ //# sourceMappingURL=no-non-null-assertions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-non-null-assertions.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/no-non-null-assertions.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0EH;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,sCA0B9B,CAAC"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * @fileoverview No non-null assertions check
3
+ */
4
+ import { defineCheck, isTestFile } from '@opensip-cli/fitness';
5
+ /**
6
+ * Regex to detect non-null assertion operator usage.
7
+ * Matches patterns like: expr!. or expr![ or expr!) where expr is an identifier.
8
+ * Avoids matching !== and != comparisons.
9
+ */
10
+ // eslint-disable-next-line sonarjs/slow-regex -- character class has no overlap; '!' acts as fixed delimiter
11
+ const NON_NULL_ASSERTION_REGEX = /([\w.[\]]+)!\s*[.[;,)]/g;
12
+ /**
13
+ * Analyze a file for non-null assertion operator usage
14
+ */
15
+ // eslint-disable-next-line sonarjs/cognitive-complexity -- Inherent complexity: template literal tracking + regex matching + multiple skip conditions
16
+ function analyzeNonNullAssertions(content, _filePath) {
17
+ const violations = [];
18
+ const lines = content.split('\n');
19
+ // Track template literal nesting to skip lines inside multi-line template literals
20
+ let inTemplateLiteral = false;
21
+ for (const [i, line_] of lines.entries()) {
22
+ const line = line_ ?? '';
23
+ const trimmed = line.trim();
24
+ // Track template literal boundaries (count unescaped backticks)
25
+ let backtickCount = 0;
26
+ for (let c = 0; c < line.length; c++) {
27
+ if (line[c] === '`' && (c === 0 || line[c - 1] !== '\\'))
28
+ backtickCount++;
29
+ }
30
+ if (backtickCount % 2 === 1)
31
+ inTemplateLiteral = !inTemplateLiteral;
32
+ // Skip lines inside multi-line template literals (e.g., longDescription text)
33
+ if (inTemplateLiteral && backtickCount % 2 === 0)
34
+ continue;
35
+ // Skip comments, imports, and type declarations
36
+ if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('import '))
37
+ continue;
38
+ if (trimmed.startsWith('type ') ||
39
+ trimmed.startsWith('interface ') ||
40
+ trimmed.startsWith('export type ') ||
41
+ trimmed.startsWith('export interface '))
42
+ continue;
43
+ // Skip lines that are string literals (rough heuristic)
44
+ if (trimmed.startsWith("'") || trimmed.startsWith('"') || trimmed.startsWith('`'))
45
+ continue;
46
+ NON_NULL_ASSERTION_REGEX.lastIndex = 0;
47
+ let match;
48
+ while ((match = NON_NULL_ASSERTION_REGEX.exec(line)) !== null) {
49
+ // Make sure this isn't part of !== or !=
50
+ const bangPos = match.index + (match[1]?.length ?? 0);
51
+ const nextChar = line[bangPos + 1];
52
+ if (nextChar === '=')
53
+ continue;
54
+ violations.push({
55
+ line: i + 1,
56
+ message: `Non-null assertion operator (\`!\`) used on '${match[1]}' — this bypasses TypeScript null checking`,
57
+ severity: 'warning',
58
+ suggestion: 'Use optional chaining (?.), nullish coalescing (??), or a proper null guard instead of the ! operator',
59
+ type: 'non-null-assertion',
60
+ match: trimmed.slice(0, 120),
61
+ });
62
+ }
63
+ }
64
+ return violations;
65
+ }
66
+ /**
67
+ * Check: quality/no-non-null-assertions
68
+ *
69
+ * Detects TypeScript non-null assertion operator (!) usage in production code.
70
+ */
71
+ export const noNonNullAssertions = defineCheck({
72
+ id: 'd1e51952-5758-40f3-999b-b83f57db9a42',
73
+ slug: 'no-non-null-assertions',
74
+ scope: { languages: ['typescript'], concerns: ['backend', 'server'] },
75
+ contentFilter: 'strip-strings',
76
+ confidence: 'medium',
77
+ description: 'Detects TypeScript non-null assertion operator (!) usage in production code — prefer proper null handling',
78
+ longDescription: `**Purpose:** Detects uses of the TypeScript non-null assertion operator (\`!\`) which bypasses null checking and can mask real null/undefined bugs at runtime.
79
+
80
+ **Detects:**
81
+ - \`expr!.property\` — non-null assertion before property access
82
+ - \`expr![index]\` — non-null assertion before index access
83
+ - Excludes \`!==\` and \`!=\` comparisons (not assertions)
84
+
85
+ **Why it matters:** Non-null assertions are type-safety escape hatches. They tell TypeScript "trust me, this is not null" without any runtime check. When wrong, they cause runtime errors.
86
+
87
+ **Scope:** Production code. Analyzes each file individually via regex.`,
88
+ tags: ['type-safety', 'quality', 'typescript'],
89
+ fileTypes: ['ts', 'tsx'],
90
+ analyze(content, filePath) {
91
+ // Skip test files — non-null assertions in tests are low-risk due to controlled inputs
92
+ if (isTestFile(filePath))
93
+ return [];
94
+ return analyzeNonNullAssertions(content, filePath);
95
+ },
96
+ });
97
+ //# sourceMappingURL=no-non-null-assertions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-non-null-assertions.js","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/no-non-null-assertions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @fileoverview Performance Anti-Patterns Check
3
+ *
4
+ * Detects common performance anti-patterns:
5
+ * - Sequential awaits in loops
6
+ * - Spread operators in loops
7
+ * - String concatenation in loops
8
+ * - Nested O(n^2) loops
9
+ */
10
+ /**
11
+ * Check: quality/performance-anti-patterns
12
+ *
13
+ * Detects common performance anti-patterns in code.
14
+ */
15
+ export declare const performanceAntiPatterns: import("@opensip-cli/fitness").Check;
16
+ //# sourceMappingURL=performance-anti-patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance-anti-patterns.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/performance-anti-patterns.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AA4NH;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,sCAuDlC,CAAC"}