mnehmos.trace.mcp 1.0.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 (339) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1662 -0
  3. package/dist/adapters/bootstrap.d.ts +29 -0
  4. package/dist/adapters/bootstrap.d.ts.map +1 -0
  5. package/dist/adapters/bootstrap.js +46 -0
  6. package/dist/adapters/bootstrap.js.map +1 -0
  7. package/dist/adapters/errors.d.ts +94 -0
  8. package/dist/adapters/errors.d.ts.map +1 -0
  9. package/dist/adapters/errors.js +107 -0
  10. package/dist/adapters/errors.js.map +1 -0
  11. package/dist/adapters/graphql/index.d.ts +9 -0
  12. package/dist/adapters/graphql/index.d.ts.map +1 -0
  13. package/dist/adapters/graphql/index.js +9 -0
  14. package/dist/adapters/graphql/index.js.map +1 -0
  15. package/dist/adapters/graphql/sdl-parser.d.ts +74 -0
  16. package/dist/adapters/graphql/sdl-parser.d.ts.map +1 -0
  17. package/dist/adapters/graphql/sdl-parser.js +559 -0
  18. package/dist/adapters/graphql/sdl-parser.js.map +1 -0
  19. package/dist/adapters/grpc/adapter.d.ts +76 -0
  20. package/dist/adapters/grpc/adapter.d.ts.map +1 -0
  21. package/dist/adapters/grpc/adapter.js +362 -0
  22. package/dist/adapters/grpc/adapter.js.map +1 -0
  23. package/dist/adapters/grpc/index.d.ts +10 -0
  24. package/dist/adapters/grpc/index.d.ts.map +1 -0
  25. package/dist/adapters/grpc/index.js +12 -0
  26. package/dist/adapters/grpc/index.js.map +1 -0
  27. package/dist/adapters/grpc/proto-parser.d.ts +76 -0
  28. package/dist/adapters/grpc/proto-parser.d.ts.map +1 -0
  29. package/dist/adapters/grpc/proto-parser.js +523 -0
  30. package/dist/adapters/grpc/proto-parser.js.map +1 -0
  31. package/dist/adapters/grpc/type-converter.d.ts +43 -0
  32. package/dist/adapters/grpc/type-converter.d.ts.map +1 -0
  33. package/dist/adapters/grpc/type-converter.js +270 -0
  34. package/dist/adapters/grpc/type-converter.js.map +1 -0
  35. package/dist/adapters/grpc/types.d.ts +85 -0
  36. package/dist/adapters/grpc/types.d.ts.map +1 -0
  37. package/dist/adapters/grpc/types.js +7 -0
  38. package/dist/adapters/grpc/types.js.map +1 -0
  39. package/dist/adapters/index.d.ts +39 -0
  40. package/dist/adapters/index.d.ts.map +1 -0
  41. package/dist/adapters/index.js +50 -0
  42. package/dist/adapters/index.js.map +1 -0
  43. package/dist/adapters/mcp.d.ts +23 -0
  44. package/dist/adapters/mcp.d.ts.map +1 -0
  45. package/dist/adapters/mcp.js +293 -0
  46. package/dist/adapters/mcp.js.map +1 -0
  47. package/dist/adapters/openapi/adapter.d.ts +213 -0
  48. package/dist/adapters/openapi/adapter.d.ts.map +1 -0
  49. package/dist/adapters/openapi/adapter.js +557 -0
  50. package/dist/adapters/openapi/adapter.js.map +1 -0
  51. package/dist/adapters/openapi/convert.d.ts +120 -0
  52. package/dist/adapters/openapi/convert.d.ts.map +1 -0
  53. package/dist/adapters/openapi/convert.js +363 -0
  54. package/dist/adapters/openapi/convert.js.map +1 -0
  55. package/dist/adapters/openapi/index.d.ts +39 -0
  56. package/dist/adapters/openapi/index.d.ts.map +1 -0
  57. package/dist/adapters/openapi/index.js +48 -0
  58. package/dist/adapters/openapi/index.js.map +1 -0
  59. package/dist/adapters/openapi/parser.d.ts +95 -0
  60. package/dist/adapters/openapi/parser.d.ts.map +1 -0
  61. package/dist/adapters/openapi/parser.js +171 -0
  62. package/dist/adapters/openapi/parser.js.map +1 -0
  63. package/dist/adapters/registry.d.ts +116 -0
  64. package/dist/adapters/registry.d.ts.map +1 -0
  65. package/dist/adapters/registry.js +246 -0
  66. package/dist/adapters/registry.js.map +1 -0
  67. package/dist/adapters/trpc/adapter.d.ts +159 -0
  68. package/dist/adapters/trpc/adapter.d.ts.map +1 -0
  69. package/dist/adapters/trpc/adapter.js +223 -0
  70. package/dist/adapters/trpc/adapter.js.map +1 -0
  71. package/dist/adapters/trpc/extractor.d.ts +218 -0
  72. package/dist/adapters/trpc/extractor.d.ts.map +1 -0
  73. package/dist/adapters/trpc/extractor.js +708 -0
  74. package/dist/adapters/trpc/extractor.js.map +1 -0
  75. package/dist/adapters/trpc/index.d.ts +31 -0
  76. package/dist/adapters/trpc/index.d.ts.map +1 -0
  77. package/dist/adapters/trpc/index.js +40 -0
  78. package/dist/adapters/trpc/index.js.map +1 -0
  79. package/dist/adapters/trpc/parser.d.ts +119 -0
  80. package/dist/adapters/trpc/parser.d.ts.map +1 -0
  81. package/dist/adapters/trpc/parser.js +128 -0
  82. package/dist/adapters/trpc/parser.js.map +1 -0
  83. package/dist/compare/index.d.ts +33 -0
  84. package/dist/compare/index.d.ts.map +1 -0
  85. package/dist/compare/index.js +261 -0
  86. package/dist/compare/index.js.map +1 -0
  87. package/dist/core/types.d.ts +188 -0
  88. package/dist/core/types.d.ts.map +1 -0
  89. package/dist/core/types.js +9 -0
  90. package/dist/core/types.js.map +1 -0
  91. package/dist/extract/index.d.ts +26 -0
  92. package/dist/extract/index.d.ts.map +1 -0
  93. package/dist/extract/index.js +44 -0
  94. package/dist/extract/index.js.map +1 -0
  95. package/dist/index.d.ts +9 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +674 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/languages/base.d.ts +57 -0
  100. package/dist/languages/base.d.ts.map +1 -0
  101. package/dist/languages/base.js +6 -0
  102. package/dist/languages/base.js.map +1 -0
  103. package/dist/languages/bootstrap.d.ts +10 -0
  104. package/dist/languages/bootstrap.d.ts.map +1 -0
  105. package/dist/languages/bootstrap.js +25 -0
  106. package/dist/languages/bootstrap.js.map +1 -0
  107. package/dist/languages/go/handlers/chi.d.ts +24 -0
  108. package/dist/languages/go/handlers/chi.d.ts.map +1 -0
  109. package/dist/languages/go/handlers/chi.js +205 -0
  110. package/dist/languages/go/handlers/chi.js.map +1 -0
  111. package/dist/languages/go/handlers/gin.d.ts +24 -0
  112. package/dist/languages/go/handlers/gin.d.ts.map +1 -0
  113. package/dist/languages/go/handlers/gin.js +156 -0
  114. package/dist/languages/go/handlers/gin.js.map +1 -0
  115. package/dist/languages/go/handlers/stdlib.d.ts +19 -0
  116. package/dist/languages/go/handlers/stdlib.d.ts.map +1 -0
  117. package/dist/languages/go/handlers/stdlib.js +112 -0
  118. package/dist/languages/go/handlers/stdlib.js.map +1 -0
  119. package/dist/languages/go/index.d.ts +18 -0
  120. package/dist/languages/go/index.d.ts.map +1 -0
  121. package/dist/languages/go/index.js +20 -0
  122. package/dist/languages/go/index.js.map +1 -0
  123. package/dist/languages/go/parser.d.ts +33 -0
  124. package/dist/languages/go/parser.d.ts.map +1 -0
  125. package/dist/languages/go/parser.js +95 -0
  126. package/dist/languages/go/parser.js.map +1 -0
  127. package/dist/languages/go/struct-extractor.d.ts +59 -0
  128. package/dist/languages/go/struct-extractor.d.ts.map +1 -0
  129. package/dist/languages/go/struct-extractor.js +483 -0
  130. package/dist/languages/go/struct-extractor.js.map +1 -0
  131. package/dist/languages/go/tag-parser.d.ts +62 -0
  132. package/dist/languages/go/tag-parser.d.ts.map +1 -0
  133. package/dist/languages/go/tag-parser.js +108 -0
  134. package/dist/languages/go/tag-parser.js.map +1 -0
  135. package/dist/languages/go/type-converter.d.ts +32 -0
  136. package/dist/languages/go/type-converter.d.ts.map +1 -0
  137. package/dist/languages/go/type-converter.js +226 -0
  138. package/dist/languages/go/type-converter.js.map +1 -0
  139. package/dist/languages/go/types.d.ts +153 -0
  140. package/dist/languages/go/types.d.ts.map +1 -0
  141. package/dist/languages/go/types.js +6 -0
  142. package/dist/languages/go/types.js.map +1 -0
  143. package/dist/languages/import-resolver.d.ts +645 -0
  144. package/dist/languages/import-resolver.d.ts.map +1 -0
  145. package/dist/languages/import-resolver.js +1278 -0
  146. package/dist/languages/import-resolver.js.map +1 -0
  147. package/dist/languages/index.d.ts +34 -0
  148. package/dist/languages/index.d.ts.map +1 -0
  149. package/dist/languages/index.js +93 -0
  150. package/dist/languages/index.js.map +1 -0
  151. package/dist/languages/json-schema.d.ts +40 -0
  152. package/dist/languages/json-schema.d.ts.map +1 -0
  153. package/dist/languages/json-schema.js +188 -0
  154. package/dist/languages/json-schema.js.map +1 -0
  155. package/dist/languages/python-ast/index.d.ts +8 -0
  156. package/dist/languages/python-ast/index.d.ts.map +1 -0
  157. package/dist/languages/python-ast/index.js +7 -0
  158. package/dist/languages/python-ast/index.js.map +1 -0
  159. package/dist/languages/python-ast/parser.d.ts +174 -0
  160. package/dist/languages/python-ast/parser.d.ts.map +1 -0
  161. package/dist/languages/python-ast/parser.js +1205 -0
  162. package/dist/languages/python-ast/parser.js.map +1 -0
  163. package/dist/languages/python-ast/type-resolver.d.ts +75 -0
  164. package/dist/languages/python-ast/type-resolver.d.ts.map +1 -0
  165. package/dist/languages/python-ast/type-resolver.js +421 -0
  166. package/dist/languages/python-ast/type-resolver.js.map +1 -0
  167. package/dist/languages/python-ast/types.d.ts +216 -0
  168. package/dist/languages/python-ast/types.d.ts.map +1 -0
  169. package/dist/languages/python-ast/types.js +6 -0
  170. package/dist/languages/python-ast/types.js.map +1 -0
  171. package/dist/languages/python.d.ts +55 -0
  172. package/dist/languages/python.d.ts.map +1 -0
  173. package/dist/languages/python.js +311 -0
  174. package/dist/languages/python.js.map +1 -0
  175. package/dist/languages/typescript.d.ts +272 -0
  176. package/dist/languages/typescript.d.ts.map +1 -0
  177. package/dist/languages/typescript.js +1381 -0
  178. package/dist/languages/typescript.js.map +1 -0
  179. package/dist/patterns/base.d.ts +146 -0
  180. package/dist/patterns/base.d.ts.map +1 -0
  181. package/dist/patterns/base.js +89 -0
  182. package/dist/patterns/base.js.map +1 -0
  183. package/dist/patterns/errors.d.ts +172 -0
  184. package/dist/patterns/errors.d.ts.map +1 -0
  185. package/dist/patterns/errors.js +185 -0
  186. package/dist/patterns/errors.js.map +1 -0
  187. package/dist/patterns/extractors.d.ts +170 -0
  188. package/dist/patterns/extractors.d.ts.map +1 -0
  189. package/dist/patterns/extractors.js +305 -0
  190. package/dist/patterns/extractors.js.map +1 -0
  191. package/dist/patterns/graphql/apollo-client.d.ts +80 -0
  192. package/dist/patterns/graphql/apollo-client.d.ts.map +1 -0
  193. package/dist/patterns/graphql/apollo-client.js +800 -0
  194. package/dist/patterns/graphql/apollo-client.js.map +1 -0
  195. package/dist/patterns/graphql/apollo-server.d.ts +55 -0
  196. package/dist/patterns/graphql/apollo-server.d.ts.map +1 -0
  197. package/dist/patterns/graphql/apollo-server.js +523 -0
  198. package/dist/patterns/graphql/apollo-server.js.map +1 -0
  199. package/dist/patterns/graphql/index.d.ts +11 -0
  200. package/dist/patterns/graphql/index.d.ts.map +1 -0
  201. package/dist/patterns/graphql/index.js +12 -0
  202. package/dist/patterns/graphql/index.js.map +1 -0
  203. package/dist/patterns/graphql/types.d.ts +213 -0
  204. package/dist/patterns/graphql/types.d.ts.map +1 -0
  205. package/dist/patterns/graphql/types.js +16 -0
  206. package/dist/patterns/graphql/types.js.map +1 -0
  207. package/dist/patterns/http-clients/axios.d.ts +148 -0
  208. package/dist/patterns/http-clients/axios.d.ts.map +1 -0
  209. package/dist/patterns/http-clients/axios.js +652 -0
  210. package/dist/patterns/http-clients/axios.js.map +1 -0
  211. package/dist/patterns/http-clients/fetch.d.ts +88 -0
  212. package/dist/patterns/http-clients/fetch.d.ts.map +1 -0
  213. package/dist/patterns/http-clients/fetch.js +364 -0
  214. package/dist/patterns/http-clients/fetch.js.map +1 -0
  215. package/dist/patterns/http-clients/index.d.ts +36 -0
  216. package/dist/patterns/http-clients/index.d.ts.map +1 -0
  217. package/dist/patterns/http-clients/index.js +50 -0
  218. package/dist/patterns/http-clients/index.js.map +1 -0
  219. package/dist/patterns/http-clients/property-access.d.ts +46 -0
  220. package/dist/patterns/http-clients/property-access.d.ts.map +1 -0
  221. package/dist/patterns/http-clients/property-access.js +818 -0
  222. package/dist/patterns/http-clients/property-access.js.map +1 -0
  223. package/dist/patterns/http-clients/type-inference.d.ts +48 -0
  224. package/dist/patterns/http-clients/type-inference.d.ts.map +1 -0
  225. package/dist/patterns/http-clients/type-inference.js +293 -0
  226. package/dist/patterns/http-clients/type-inference.js.map +1 -0
  227. package/dist/patterns/http-clients/types.d.ts +168 -0
  228. package/dist/patterns/http-clients/types.d.ts.map +1 -0
  229. package/dist/patterns/http-clients/types.js +10 -0
  230. package/dist/patterns/http-clients/types.js.map +1 -0
  231. package/dist/patterns/http-clients/url-extractor.d.ts +53 -0
  232. package/dist/patterns/http-clients/url-extractor.d.ts.map +1 -0
  233. package/dist/patterns/http-clients/url-extractor.js +338 -0
  234. package/dist/patterns/http-clients/url-extractor.js.map +1 -0
  235. package/dist/patterns/index.d.ts +44 -0
  236. package/dist/patterns/index.d.ts.map +1 -0
  237. package/dist/patterns/index.js +49 -0
  238. package/dist/patterns/index.js.map +1 -0
  239. package/dist/patterns/python/aiohttp.d.ts +21 -0
  240. package/dist/patterns/python/aiohttp.d.ts.map +1 -0
  241. package/dist/patterns/python/aiohttp.js +188 -0
  242. package/dist/patterns/python/aiohttp.js.map +1 -0
  243. package/dist/patterns/python/httpx.d.ts +20 -0
  244. package/dist/patterns/python/httpx.d.ts.map +1 -0
  245. package/dist/patterns/python/httpx.js +183 -0
  246. package/dist/patterns/python/httpx.js.map +1 -0
  247. package/dist/patterns/python/index.d.ts +32 -0
  248. package/dist/patterns/python/index.d.ts.map +1 -0
  249. package/dist/patterns/python/index.js +63 -0
  250. package/dist/patterns/python/index.js.map +1 -0
  251. package/dist/patterns/python/property-access.d.ts +27 -0
  252. package/dist/patterns/python/property-access.d.ts.map +1 -0
  253. package/dist/patterns/python/property-access.js +132 -0
  254. package/dist/patterns/python/property-access.js.map +1 -0
  255. package/dist/patterns/python/requests.d.ts +19 -0
  256. package/dist/patterns/python/requests.d.ts.map +1 -0
  257. package/dist/patterns/python/requests.js +239 -0
  258. package/dist/patterns/python/requests.js.map +1 -0
  259. package/dist/patterns/python/types.d.ts +95 -0
  260. package/dist/patterns/python/types.d.ts.map +1 -0
  261. package/dist/patterns/python/types.js +43 -0
  262. package/dist/patterns/python/types.js.map +1 -0
  263. package/dist/patterns/registry.d.ts +181 -0
  264. package/dist/patterns/registry.d.ts.map +1 -0
  265. package/dist/patterns/registry.js +304 -0
  266. package/dist/patterns/registry.js.map +1 -0
  267. package/dist/patterns/rest/express.d.ts +78 -0
  268. package/dist/patterns/rest/express.d.ts.map +1 -0
  269. package/dist/patterns/rest/express.js +289 -0
  270. package/dist/patterns/rest/express.js.map +1 -0
  271. package/dist/patterns/rest/fastify.d.ts +93 -0
  272. package/dist/patterns/rest/fastify.d.ts.map +1 -0
  273. package/dist/patterns/rest/fastify.js +420 -0
  274. package/dist/patterns/rest/fastify.js.map +1 -0
  275. package/dist/patterns/rest/index.d.ts +31 -0
  276. package/dist/patterns/rest/index.d.ts.map +1 -0
  277. package/dist/patterns/rest/index.js +45 -0
  278. package/dist/patterns/rest/index.js.map +1 -0
  279. package/dist/patterns/rest/middleware.d.ts +25 -0
  280. package/dist/patterns/rest/middleware.d.ts.map +1 -0
  281. package/dist/patterns/rest/middleware.js +219 -0
  282. package/dist/patterns/rest/middleware.js.map +1 -0
  283. package/dist/patterns/rest/path-parser.d.ts +50 -0
  284. package/dist/patterns/rest/path-parser.d.ts.map +1 -0
  285. package/dist/patterns/rest/path-parser.js +137 -0
  286. package/dist/patterns/rest/path-parser.js.map +1 -0
  287. package/dist/patterns/rest/response-inference.d.ts +44 -0
  288. package/dist/patterns/rest/response-inference.d.ts.map +1 -0
  289. package/dist/patterns/rest/response-inference.js +218 -0
  290. package/dist/patterns/rest/response-inference.js.map +1 -0
  291. package/dist/patterns/rest/types.d.ts +102 -0
  292. package/dist/patterns/rest/types.d.ts.map +1 -0
  293. package/dist/patterns/rest/types.js +10 -0
  294. package/dist/patterns/rest/types.js.map +1 -0
  295. package/dist/patterns/types.d.ts +105 -0
  296. package/dist/patterns/types.d.ts.map +1 -0
  297. package/dist/patterns/types.js +11 -0
  298. package/dist/patterns/types.js.map +1 -0
  299. package/dist/report/index.d.ts +11 -0
  300. package/dist/report/index.d.ts.map +1 -0
  301. package/dist/report/index.js +55 -0
  302. package/dist/report/index.js.map +1 -0
  303. package/dist/tools/contract-comments.d.ts +48 -0
  304. package/dist/tools/contract-comments.d.ts.map +1 -0
  305. package/dist/tools/contract-comments.js +130 -0
  306. package/dist/tools/contract-comments.js.map +1 -0
  307. package/dist/tools/index.d.ts +6 -0
  308. package/dist/tools/index.d.ts.map +1 -0
  309. package/dist/tools/index.js +6 -0
  310. package/dist/tools/index.js.map +1 -0
  311. package/dist/tools/scaffold.d.ts +38 -0
  312. package/dist/tools/scaffold.d.ts.map +1 -0
  313. package/dist/tools/scaffold.js +373 -0
  314. package/dist/tools/scaffold.js.map +1 -0
  315. package/dist/trace/index.d.ts +28 -0
  316. package/dist/trace/index.d.ts.map +1 -0
  317. package/dist/trace/index.js +45 -0
  318. package/dist/trace/index.js.map +1 -0
  319. package/dist/types.d.ts +135 -0
  320. package/dist/types.d.ts.map +1 -0
  321. package/dist/types.js +22 -0
  322. package/dist/types.js.map +1 -0
  323. package/dist/watch/cache.d.ts +41 -0
  324. package/dist/watch/cache.d.ts.map +1 -0
  325. package/dist/watch/cache.js +230 -0
  326. package/dist/watch/cache.js.map +1 -0
  327. package/dist/watch/index.d.ts +9 -0
  328. package/dist/watch/index.d.ts.map +1 -0
  329. package/dist/watch/index.js +7 -0
  330. package/dist/watch/index.js.map +1 -0
  331. package/dist/watch/project.d.ts +128 -0
  332. package/dist/watch/project.d.ts.map +1 -0
  333. package/dist/watch/project.js +152 -0
  334. package/dist/watch/project.js.map +1 -0
  335. package/dist/watch/watcher.d.ts +76 -0
  336. package/dist/watch/watcher.d.ts.map +1 -0
  337. package/dist/watch/watcher.js +235 -0
  338. package/dist/watch/watcher.js.map +1 -0
  339. package/package.json +70 -0
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Python requests library HTTP client detection
3
+ *
4
+ * Detects calls to the requests library:
5
+ * - requests.get(), requests.post(), etc.
6
+ * - session.get(), session.post() with Session instances
7
+ *
8
+ * @see .context/TASK_MAP_P3.md - Task P3-4
9
+ */
10
+ import { HTTP_CLIENT_PATTERNS, normalizeHttpMethod } from './types.js';
11
+ const REQUESTS_PATTERN = HTTP_CLIENT_PATTERNS.requests;
12
+ /**
13
+ * Regex patterns for detecting requests library calls
14
+ */
15
+ const PATTERNS = {
16
+ // Import detection
17
+ importRequests: /^\s*import\s+requests\b/m,
18
+ fromRequests: /^\s*from\s+requests\s+import\s+(.+)/m,
19
+ // Direct function calls: requests.get(...), requests.post(...)
20
+ directCall: /\brequests\.(get|post|put|patch|delete|head|options|request)\s*\(/gi,
21
+ // Session creation: requests.Session(), Session()
22
+ sessionCreate: /\b(\w+)\s*=\s*(?:requests\.)?Session\s*\(\s*\)/g,
23
+ // Session method calls: session.get(...), session.post(...)
24
+ sessionCall: /\b(\w+)\.(get|post|put|patch|delete|head|options|request)\s*\(/gi,
25
+ // Response assignment: response = requests.get(...)
26
+ responseAssign: /\b(\w+)\s*=\s*(?:requests\.)?(?:\w+\.)?(get|post|put|patch|delete|head|options|request)\s*\(/gi,
27
+ // URL extraction from calls (first string argument)
28
+ urlArg: /\(\s*(?:url\s*=\s*)?["'f]([^"']+)["']|f["']([^"']+)["']/,
29
+ // f-string path params
30
+ fstringParams: /\{(\w+)\}/g,
31
+ // Query params detection
32
+ queryParams: /\bparams\s*=/,
33
+ // Headers detection
34
+ headers: /\bheaders\s*=/,
35
+ // JSON body detection
36
+ jsonBody: /\bjson\s*=/,
37
+ // Data body detection
38
+ dataBody: /\bdata\s*=/
39
+ };
40
+ /**
41
+ * Track known session variable names
42
+ */
43
+ const sessionVars = new Set();
44
+ /**
45
+ * Detect HTTP calls from the requests library in Python source code
46
+ */
47
+ export function detectRequestsCalls(content) {
48
+ const calls = [];
49
+ const lines = content.split('\n');
50
+ // First pass: detect imports
51
+ const hasRequestsImport = PATTERNS.importRequests.test(content) ||
52
+ PATTERNS.fromRequests.test(content);
53
+ if (!hasRequestsImport) {
54
+ return [];
55
+ }
56
+ // Second pass: find session variables
57
+ sessionVars.clear();
58
+ let match;
59
+ // Match both requests.Session() and Session() (when imported directly)
60
+ const sessionCreateRegex = /\b(\w+)\s*=\s*(?:requests\.)?Session\s*\(\s*\)/g;
61
+ while ((match = sessionCreateRegex.exec(content)) !== null) {
62
+ sessionVars.add(match[1]);
63
+ }
64
+ // Also match session created via from requests import Session
65
+ // and Session() call in the same file
66
+ const fromImportMatch = content.match(/from\s+requests\s+import\s+.*\bSession\b/);
67
+ if (fromImportMatch) {
68
+ // Look for any variable = Session() patterns
69
+ const directSessionRegex = /\b(\w+)\s*=\s*Session\s*\(\s*\)/g;
70
+ while ((match = directSessionRegex.exec(content)) !== null) {
71
+ sessionVars.add(match[1]);
72
+ }
73
+ }
74
+ // Third pass: detect HTTP calls line by line
75
+ for (let i = 0; i < lines.length; i++) {
76
+ const line = lines[i];
77
+ const lineNum = i + 1;
78
+ // Get multi-line context (look ahead up to 10 lines for multiline calls)
79
+ const multilineContext = getMultilineContext(lines, i);
80
+ // Detect direct requests.method() calls
81
+ const directCallRegex = /\brequests\.(get|post|put|patch|delete|head|options|request)\s*\(/gi;
82
+ while ((match = directCallRegex.exec(line)) !== null) {
83
+ const method = normalizeHttpMethod(match[1]);
84
+ if (method) {
85
+ const call = createHttpCall(method, 'requests', multilineContext, lineNum, match.index);
86
+ call.isSession = false;
87
+ calls.push(call);
88
+ }
89
+ }
90
+ // Detect session.method() calls
91
+ for (const sessionVar of sessionVars) {
92
+ const sessionCallRegex = new RegExp(`\\b${escapeRegex(sessionVar)}\\.(get|post|put|patch|delete|head|options|request)\\s*\\(`, 'gi');
93
+ while ((match = sessionCallRegex.exec(line)) !== null) {
94
+ const method = normalizeHttpMethod(match[1]);
95
+ if (method) {
96
+ const call = createHttpCall(method, 'requests', multilineContext, lineNum, match.index);
97
+ call.isSession = true;
98
+ calls.push(call);
99
+ }
100
+ }
101
+ }
102
+ }
103
+ return calls;
104
+ }
105
+ /**
106
+ * Get multi-line context for a call starting at line index
107
+ * Looks ahead up to 10 lines to capture multiline function calls
108
+ */
109
+ function getMultilineContext(lines, startIndex) {
110
+ let context = lines[startIndex];
111
+ let parenDepth = 0;
112
+ let inCall = false;
113
+ // Count opening parens in the first line
114
+ for (const char of context) {
115
+ if (char === '(') {
116
+ parenDepth++;
117
+ inCall = true;
118
+ }
119
+ else if (char === ')') {
120
+ parenDepth--;
121
+ }
122
+ }
123
+ // If call is complete (balanced parens), return single line
124
+ if (inCall && parenDepth === 0) {
125
+ return context;
126
+ }
127
+ // Look ahead for closing paren
128
+ for (let i = 1; i <= 10 && startIndex + i < lines.length; i++) {
129
+ const nextLine = lines[startIndex + i];
130
+ context += '\n' + nextLine;
131
+ for (const char of nextLine) {
132
+ if (char === '(') {
133
+ parenDepth++;
134
+ }
135
+ else if (char === ')') {
136
+ parenDepth--;
137
+ }
138
+ }
139
+ // Found matching close
140
+ if (parenDepth === 0) {
141
+ break;
142
+ }
143
+ }
144
+ return context;
145
+ }
146
+ /**
147
+ * Create a PythonHttpCall from a detected call
148
+ */
149
+ function createHttpCall(method, library, line, lineNum, column) {
150
+ const call = {
151
+ method,
152
+ library,
153
+ line: lineNum,
154
+ column
155
+ };
156
+ // Extract URL
157
+ const urlInfo = extractUrl(line);
158
+ if (urlInfo) {
159
+ call.url = urlInfo.url;
160
+ call.isDynamicUrl = urlInfo.isDynamic;
161
+ call.pathParams = urlInfo.pathParams;
162
+ }
163
+ // Detect query params
164
+ if (PATTERNS.queryParams.test(line)) {
165
+ call.hasQueryParams = true;
166
+ }
167
+ // URL with query string
168
+ if (call.url?.includes('?')) {
169
+ call.hasQueryParams = true;
170
+ }
171
+ // Detect headers
172
+ if (PATTERNS.headers.test(line)) {
173
+ call.hasHeaders = true;
174
+ }
175
+ // Detect body
176
+ if (PATTERNS.jsonBody.test(line) || PATTERNS.dataBody.test(line)) {
177
+ call.hasBody = true;
178
+ }
179
+ // Extract response variable
180
+ const assignMatch = line.match(/^\s*(\w+)\s*=/);
181
+ if (assignMatch) {
182
+ call.responseVariable = assignMatch[1];
183
+ }
184
+ return call;
185
+ }
186
+ /**
187
+ * Extract URL from a call line
188
+ */
189
+ function extractUrl(line) {
190
+ // Try to find URL in the call
191
+ // Match f-strings first
192
+ const fstringMatch = line.match(/f["']([^"']+)["']/);
193
+ if (fstringMatch) {
194
+ const url = fstringMatch[1];
195
+ const pathParams = [];
196
+ let paramMatch;
197
+ const paramRegex = /\{(\w+)\}/g;
198
+ while ((paramMatch = paramRegex.exec(url)) !== null) {
199
+ pathParams.push(paramMatch[1]);
200
+ }
201
+ return { url, isDynamic: true, pathParams };
202
+ }
203
+ // Match regular strings
204
+ const stringMatch = line.match(/\(\s*["']([^"']+)["']/);
205
+ if (stringMatch) {
206
+ return { url: stringMatch[1], isDynamic: false, pathParams: [] };
207
+ }
208
+ // Match url= keyword argument
209
+ const kwargMatch = line.match(/url\s*=\s*["']([^"']+)["']/);
210
+ if (kwargMatch) {
211
+ return { url: kwargMatch[1], isDynamic: false, pathParams: [] };
212
+ }
213
+ // Match url= with f-string
214
+ const kwargFstringMatch = line.match(/url\s*=\s*f["']([^"']+)["']/);
215
+ if (kwargFstringMatch) {
216
+ const url = kwargFstringMatch[1];
217
+ const pathParams = [];
218
+ let paramMatch;
219
+ const paramRegex = /\{(\w+)\}/g;
220
+ while ((paramMatch = paramRegex.exec(url)) !== null) {
221
+ pathParams.push(paramMatch[1]);
222
+ }
223
+ return { url, isDynamic: true, pathParams };
224
+ }
225
+ return null;
226
+ }
227
+ /**
228
+ * Escape special regex characters in a string
229
+ */
230
+ function escapeRegex(str) {
231
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
232
+ }
233
+ /**
234
+ * Get the response properties that requests library supports
235
+ */
236
+ export function getRequestsResponseProperties() {
237
+ return REQUESTS_PATTERN.responseAccess;
238
+ }
239
+ //# sourceMappingURL=requests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requests.js","sourceRoot":"","sources":["../../../src/patterns/python/requests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Python HTTP Client Pattern Types
3
+ *
4
+ * Types for detecting Python HTTP client calls (requests, httpx, aiohttp)
5
+ * and tracking response property access.
6
+ *
7
+ * @see .context/TASK_MAP_P3.md - Task P3-4
8
+ */
9
+ /**
10
+ * Supported Python HTTP client libraries
11
+ */
12
+ export type PythonHttpLibrary = 'requests' | 'httpx' | 'aiohttp';
13
+ /**
14
+ * HTTP method types
15
+ */
16
+ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS';
17
+ /**
18
+ * Represents a detected Python HTTP client call
19
+ */
20
+ export interface PythonHttpCall {
21
+ /** HTTP method used (GET, POST, etc.) */
22
+ method: HttpMethod;
23
+ /** Library that was detected (requests, httpx, aiohttp) */
24
+ library: PythonHttpLibrary;
25
+ /** Extracted URL (may be partial or contain placeholders) */
26
+ url?: string;
27
+ /** Whether the URL contains dynamic parts (f-strings) */
28
+ isDynamicUrl?: boolean;
29
+ /** Path parameters extracted from f-string URLs */
30
+ pathParams?: string[];
31
+ /** Whether request has query parameters */
32
+ hasQueryParams?: boolean;
33
+ /** Whether request has custom headers */
34
+ hasHeaders?: boolean;
35
+ /** Whether request has a body (json, data) */
36
+ hasBody?: boolean;
37
+ /** Whether this is a session-based call */
38
+ isSession?: boolean;
39
+ /** Whether this uses a Client instance (httpx) */
40
+ isClient?: boolean;
41
+ /** Whether this uses an AsyncClient (httpx) */
42
+ isAsyncClient?: boolean;
43
+ /** Whether this is an async call (httpx AsyncClient, aiohttp) */
44
+ isAsync?: boolean;
45
+ /** Variable name storing the response */
46
+ responseVariable?: string;
47
+ /** Line number in source */
48
+ line: number;
49
+ /** Column number in source */
50
+ column?: number;
51
+ }
52
+ /**
53
+ * Represents response property access on an HTTP response variable
54
+ */
55
+ export interface PythonPropertyAccess {
56
+ /** Variable name being accessed */
57
+ variable: string;
58
+ /** Property or method being accessed (json, text, status_code, etc.) */
59
+ property: string;
60
+ /** Whether this is a method call (json()) vs property access (text) */
61
+ isMethodCall: boolean;
62
+ /** Line number in source */
63
+ line: number;
64
+ }
65
+ /**
66
+ * Combined result of HTTP call detection
67
+ */
68
+ export interface PythonHttpCallResult extends PythonHttpCall {
69
+ /** Properties accessed on the response */
70
+ responseProperties: string[];
71
+ }
72
+ /**
73
+ * Pattern for detecting library-specific HTTP calls
74
+ */
75
+ export interface HttpClientPattern {
76
+ /** Library name */
77
+ library: PythonHttpLibrary;
78
+ /** Module names to detect imports from */
79
+ modules: string[];
80
+ /** Function/method names that make HTTP calls */
81
+ httpMethods: string[];
82
+ /** Session/Client class names */
83
+ sessionClasses: string[];
84
+ /** Response property/method names */
85
+ responseAccess: string[];
86
+ }
87
+ /**
88
+ * Pattern definitions for each supported library
89
+ */
90
+ export declare const HTTP_CLIENT_PATTERNS: Record<PythonHttpLibrary, HttpClientPattern>;
91
+ /**
92
+ * Map HTTP method string to type
93
+ */
94
+ export declare function normalizeHttpMethod(method: string): HttpMethod | null;
95
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/patterns/python/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAEjE;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAE1F;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,MAAM,EAAE,UAAU,CAAC;IAEnB,2DAA2D;IAC3D,OAAO,EAAE,iBAAiB,CAAC;IAE3B,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,yDAAyD;IACzD,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,+CAA+C;IAC/C,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,iEAAiE;IACjE,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IAEb,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IAEjB,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAC;IAEjB,uEAAuE;IACvE,YAAY,EAAE,OAAO,CAAC;IAEtB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,0CAA0C;IAC1C,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mBAAmB;IACnB,OAAO,EAAE,iBAAiB,CAAC;IAE3B,0CAA0C;IAC1C,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,iDAAiD;IACjD,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB,iCAAiC;IACjC,cAAc,EAAE,MAAM,EAAE,CAAC;IAEzB,qCAAqC;IACrC,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,CAsB7E,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAIrE"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Python HTTP Client Pattern Types
3
+ *
4
+ * Types for detecting Python HTTP client calls (requests, httpx, aiohttp)
5
+ * and tracking response property access.
6
+ *
7
+ * @see .context/TASK_MAP_P3.md - Task P3-4
8
+ */
9
+ /**
10
+ * Pattern definitions for each supported library
11
+ */
12
+ export const HTTP_CLIENT_PATTERNS = {
13
+ requests: {
14
+ library: 'requests',
15
+ modules: ['requests'],
16
+ httpMethods: ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'request'],
17
+ sessionClasses: ['Session'],
18
+ responseAccess: ['json', 'text', 'content', 'status_code', 'headers', 'ok', 'reason', 'url', 'encoding', 'cookies']
19
+ },
20
+ httpx: {
21
+ library: 'httpx',
22
+ modules: ['httpx'],
23
+ httpMethods: ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'request'],
24
+ sessionClasses: ['Client', 'AsyncClient'],
25
+ responseAccess: ['json', 'text', 'content', 'status_code', 'headers', 'is_success', 'is_error', 'is_redirect', 'url', 'encoding', 'cookies']
26
+ },
27
+ aiohttp: {
28
+ library: 'aiohttp',
29
+ modules: ['aiohttp'],
30
+ httpMethods: ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'request'],
31
+ sessionClasses: ['ClientSession'],
32
+ responseAccess: ['json', 'text', 'read', 'status', 'headers', 'ok', 'reason', 'url', 'content_type', 'cookies']
33
+ }
34
+ };
35
+ /**
36
+ * Map HTTP method string to type
37
+ */
38
+ export function normalizeHttpMethod(method) {
39
+ const upper = method.toUpperCase();
40
+ const methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'];
41
+ return methods.includes(upper) ? upper : null;
42
+ }
43
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/patterns/python/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA2GH;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAiD;IAChF,QAAQ,EAAE;QACR,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,CAAC,UAAU,CAAC;QACrB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;QACpF,cAAc,EAAE,CAAC,SAAS,CAAC;QAC3B,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC;KACpH;IACD,KAAK,EAAE;QACL,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,CAAC,OAAO,CAAC;QAClB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;QACpF,cAAc,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;QACzC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC;KAC7I;IACD,OAAO,EAAE;QACP,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,CAAC,SAAS,CAAC;QACpB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;QACpF,cAAc,EAAE,CAAC,eAAe,CAAC;QACjC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,CAAC;KAChH;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,MAAM,OAAO,GAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3F,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAmB,CAAC,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Pattern Registry
3
+ *
4
+ * Registry for pattern matchers, following the same design as AdapterRegistry.
5
+ * Provides registration, lookup, and scanning capabilities.
6
+ *
7
+ * The registry uses a module-scoped singleton pattern with exported wrapper
8
+ * functions for a clean, functional API.
9
+ *
10
+ * @module patterns/registry
11
+ * @see .context/ADR-P2-1-PATTERN-MATCHER.md
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * import { registerPattern, scanForPatterns } from './patterns';
16
+ *
17
+ * // Register a custom pattern matcher
18
+ * registerPattern(myExpressMatcher);
19
+ *
20
+ * // Scan source file for patterns
21
+ * const matches = scanForPatterns(sourceFile, {
22
+ * frameworks: ['express'],
23
+ * types: ['call']
24
+ * });
25
+ * ```
26
+ */
27
+ import type { SourceFile } from 'ts-morph';
28
+ import type { PatternMatcher } from './base.js';
29
+ import type { MatchResult, PatternType } from './types.js';
30
+ /**
31
+ * Options for filtering pattern matchers during source file scanning.
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * const options: ScanOptions = {
36
+ * frameworks: ['express', 'nestjs'],
37
+ * types: ['call', 'decorator']
38
+ * };
39
+ * ```
40
+ */
41
+ export interface ScanOptions {
42
+ /**
43
+ * Filter matchers by framework name.
44
+ * Only matchers matching these frameworks will be used.
45
+ */
46
+ frameworks?: string[];
47
+ /**
48
+ * Filter matchers by supported pattern type.
49
+ * Only matchers supporting at least one of these types will be used.
50
+ */
51
+ types?: PatternType[];
52
+ }
53
+ /**
54
+ * Register a pattern matcher with the global registry.
55
+ *
56
+ * The matcher is validated before registration. If validation fails,
57
+ * a {@link PatternValidationError} is thrown with details.
58
+ *
59
+ * @param matcher - The pattern matcher to register
60
+ * @throws {PatternValidationError} If the matcher fails validation
61
+ *
62
+ * @example
63
+ * ```typescript
64
+ * import { registerPattern, BasePatternMatcher } from './patterns';
65
+ *
66
+ * class MyMatcher extends BasePatternMatcher {
67
+ * readonly name = 'my-matcher';
68
+ * readonly framework = 'express';
69
+ * // ... implementation
70
+ * }
71
+ *
72
+ * registerPattern(new MyMatcher());
73
+ * ```
74
+ */
75
+ export declare function registerPattern(matcher: PatternMatcher): void;
76
+ /**
77
+ * Get a pattern matcher by its unique name.
78
+ *
79
+ * @param name - The unique name of the matcher to retrieve
80
+ * @returns The registered pattern matcher
81
+ * @throws {PatternNotFoundError} If no matcher with that name exists
82
+ *
83
+ * @example
84
+ * ```typescript
85
+ * const matcher = getPattern('express-router');
86
+ * const matches = matcher.scan(sourceFile);
87
+ * ```
88
+ */
89
+ export declare function getPattern(name: string): PatternMatcher;
90
+ /**
91
+ * Get all pattern matchers for a specific framework.
92
+ *
93
+ * @param framework - The framework name to filter by
94
+ * @returns Array of matchers for that framework (empty if none)
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * const expressMatchers = getPatternsByFramework('express');
99
+ * console.log(`Found ${expressMatchers.length} Express matchers`);
100
+ * ```
101
+ */
102
+ export declare function getPatternsByFramework(framework: string): PatternMatcher[];
103
+ /**
104
+ * Get all pattern matchers supporting a specific pattern type.
105
+ *
106
+ * @param type - The pattern type to filter by
107
+ * @returns Array of matchers supporting that type
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * const decoratorMatchers = getPatternsByType('decorator');
112
+ * // Returns matchers like NestJS that use decorators
113
+ * ```
114
+ */
115
+ export declare function getPatternsByType(type: PatternType): PatternMatcher[];
116
+ /**
117
+ * Check if a pattern matcher is registered by name.
118
+ *
119
+ * @param name - The name to check
120
+ * @returns `true` if a matcher with that name exists
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * if (!hasPattern('express-router')) {
125
+ * registerPattern(new ExpressRouterMatcher());
126
+ * }
127
+ * ```
128
+ */
129
+ export declare function hasPattern(name: string): boolean;
130
+ /**
131
+ * List all registered pattern matcher names.
132
+ *
133
+ * @returns Array of all registered matcher names
134
+ *
135
+ * @example
136
+ * ```typescript
137
+ * console.log('Available matchers:', listPatterns().join(', '));
138
+ * ```
139
+ */
140
+ export declare function listPatterns(): string[];
141
+ /**
142
+ * List all unique framework names from registered matchers.
143
+ *
144
+ * @returns Array of unique framework names
145
+ *
146
+ * @example
147
+ * ```typescript
148
+ * const frameworks = listFrameworks();
149
+ * // ['express', 'nestjs', 'trpc', ...]
150
+ * ```
151
+ */
152
+ export declare function listFrameworks(): string[];
153
+ /**
154
+ * Scan a source file for patterns using all registered matchers.
155
+ *
156
+ * This is the primary entry point for pattern detection. It applies
157
+ * all registered matchers (or a filtered subset) to find API patterns.
158
+ *
159
+ * @param sourceFile - The ts-morph SourceFile to scan
160
+ * @param options - Optional filtering options
161
+ * @returns Array of all matches found across all matchers
162
+ *
163
+ * @example
164
+ * ```typescript
165
+ * import { Project } from 'ts-morph';
166
+ *
167
+ * const project = new Project();
168
+ * const sourceFile = project.addSourceFileAtPath('./src/routes.ts');
169
+ *
170
+ * // Scan with all matchers
171
+ * const allMatches = scanForPatterns(sourceFile);
172
+ *
173
+ * // Scan with filters
174
+ * const expressMatches = scanForPatterns(sourceFile, {
175
+ * frameworks: ['express'],
176
+ * types: ['call']
177
+ * });
178
+ * ```
179
+ */
180
+ export declare function scanForPatterns(sourceFile: SourceFile, options?: ScanOptions): MatchResult[];
181
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/patterns/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM3D;;;;;;;;;;GAUG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB;;;OAGG;IACH,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;CACvB;AA4KD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAE7D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAEvD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,EAAE,CAE1E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,cAAc,EAAE,CAErE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAEzC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,WAAW,GACpB,WAAW,EAAE,CAEf"}