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,88 @@
1
+ /**
2
+ * Fetch Pattern Matcher
3
+ *
4
+ * Pattern matcher for the native fetch() API.
5
+ * Extracts URL patterns, HTTP methods, request/response types,
6
+ * and property access tracking for consumer schema inference.
7
+ *
8
+ * @module patterns/http-clients/fetch
9
+ * @see .context/ADR-P2-3-HTTP-CLIENT-TRACING.md
10
+ */
11
+ import { Node } from 'ts-morph';
12
+ import { BasePatternMatcher } from '../base.js';
13
+ import type { MatchResult, PatternDef, PatternType } from '../types.js';
14
+ import type { NormalizedSchema } from '../../core/types.js';
15
+ /**
16
+ * Pattern matcher for fetch() API calls.
17
+ *
18
+ * Detects patterns like:
19
+ * - `fetch('/api/users')`
20
+ * - `fetch(url, { method: 'POST', body: ... })`
21
+ * - `` fetch(`/api/users/${id}`) ``
22
+ * - `response.json()`
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const matcher = new FetchPatternMatcher();
27
+ * const matches = matcher.scan(sourceFile);
28
+ * // Returns matches for all fetch() calls with extracted metadata
29
+ * ```
30
+ */
31
+ export declare class FetchPatternMatcher extends BasePatternMatcher {
32
+ readonly name = "fetch-client";
33
+ readonly framework = "fetch";
34
+ readonly supportedTypes: PatternType[];
35
+ readonly patterns: PatternDef[];
36
+ /**
37
+ * Match a single pattern against a node.
38
+ *
39
+ * @param pattern - Pattern definition to match
40
+ * @param node - AST node to test
41
+ * @returns MatchResult if matched, null otherwise
42
+ */
43
+ protected matchPattern(pattern: PatternDef, node: Node): MatchResult | null;
44
+ /**
45
+ * Build a match result from a fetch call.
46
+ *
47
+ * @internal
48
+ */
49
+ private buildMatchResult;
50
+ /**
51
+ * Extract captures from a fetch call.
52
+ *
53
+ * @internal
54
+ */
55
+ private extractCaptures;
56
+ /**
57
+ * Parse fetch options object.
58
+ *
59
+ * @internal
60
+ */
61
+ private parseOptionsObject;
62
+ /**
63
+ * Check if a string is a valid HTTP method.
64
+ *
65
+ * @internal
66
+ */
67
+ private isValidMethod;
68
+ /**
69
+ * Extract body information.
70
+ *
71
+ * @internal
72
+ */
73
+ private extractBodyInfo;
74
+ /**
75
+ * Extract headers information.
76
+ *
77
+ * @internal
78
+ */
79
+ private extractHeadersInfo;
80
+ /**
81
+ * Extract schema from a match result.
82
+ *
83
+ * @param match - The match result to extract schema from
84
+ * @returns NormalizedSchema representing the fetch call
85
+ */
86
+ extract(match: MatchResult): Promise<NormalizedSchema>;
87
+ }
88
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/patterns/http-clients/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AACvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAU5D;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,mBAAoB,SAAQ,kBAAkB;IACzD,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,SAAS,WAAW;IAC7B,QAAQ,CAAC,cAAc,EAAE,WAAW,EAAE,CAAqB;IAE3D,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,CAM7B;IAMF;;;;;;OAMG;IACH,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,WAAW,GAAG,IAAI;IAkB3E;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IA+BxB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAyDvB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA8C1B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAQrB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IA6BvB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAqD1B;;;;;OAKG;IACG,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA8E7D"}
@@ -0,0 +1,364 @@
1
+ /**
2
+ * Fetch Pattern Matcher
3
+ *
4
+ * Pattern matcher for the native fetch() API.
5
+ * Extracts URL patterns, HTTP methods, request/response types,
6
+ * and property access tracking for consumer schema inference.
7
+ *
8
+ * @module patterns/http-clients/fetch
9
+ * @see .context/ADR-P2-3-HTTP-CLIENT-TRACING.md
10
+ */
11
+ import { Node } from 'ts-morph';
12
+ import { BasePatternMatcher } from '../base.js';
13
+ import { extractURL } from './url-extractor.js';
14
+ import { findTypeInferenceSources } from './type-inference.js';
15
+ import { trackPropertyAccesses } from './property-access.js';
16
+ /* ═══════════════════════════════════════════════════════════════════════════
17
+ * 🌐 FetchPatternMatcher Class
18
+ * ═══════════════════════════════════════════════════════════════════════════ */
19
+ /**
20
+ * Pattern matcher for fetch() API calls.
21
+ *
22
+ * Detects patterns like:
23
+ * - `fetch('/api/users')`
24
+ * - `fetch(url, { method: 'POST', body: ... })`
25
+ * - `` fetch(`/api/users/${id}`) ``
26
+ * - `response.json()`
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const matcher = new FetchPatternMatcher();
31
+ * const matches = matcher.scan(sourceFile);
32
+ * // Returns matches for all fetch() calls with extracted metadata
33
+ * ```
34
+ */
35
+ export class FetchPatternMatcher extends BasePatternMatcher {
36
+ name = 'fetch-client';
37
+ framework = 'fetch';
38
+ supportedTypes = ['call', 'chain'];
39
+ patterns = [
40
+ {
41
+ type: 'call',
42
+ signature: /^fetch$/,
43
+ inputSchemaLocation: { type: 'arg', index: 0 },
44
+ },
45
+ ];
46
+ /* ─────────────────────────────────────────────────────────────────────────
47
+ * Pattern Matching
48
+ * ───────────────────────────────────────────────────────────────────────── */
49
+ /**
50
+ * Match a single pattern against a node.
51
+ *
52
+ * @param pattern - Pattern definition to match
53
+ * @param node - AST node to test
54
+ * @returns MatchResult if matched, null otherwise
55
+ */
56
+ matchPattern(pattern, node) {
57
+ if (!Node.isCallExpression(node)) {
58
+ return null;
59
+ }
60
+ const expression = node.getExpression();
61
+ // Check for direct fetch() call
62
+ if (Node.isIdentifier(expression)) {
63
+ const name = expression.getText();
64
+ if (this.matchesSignature(name, pattern.signature)) {
65
+ return this.buildMatchResult(pattern, node);
66
+ }
67
+ }
68
+ return null;
69
+ }
70
+ /**
71
+ * Build a match result from a fetch call.
72
+ *
73
+ * @internal
74
+ */
75
+ buildMatchResult(pattern, callNode) {
76
+ if (!Node.isCallExpression(callNode)) {
77
+ throw new Error('Expected call expression');
78
+ }
79
+ const sourceFile = callNode.getSourceFile();
80
+ const args = callNode.getArguments();
81
+ // Extract captures
82
+ const captures = this.extractCaptures(callNode, args);
83
+ // Build identifier as "METHOD /path"
84
+ const method = captures.httpMethod || 'GET';
85
+ const url = captures.url?.raw ||
86
+ captures.url?.static || '/';
87
+ const identifier = `${method} ${url}`;
88
+ return {
89
+ pattern,
90
+ node: callNode,
91
+ framework: this.framework,
92
+ identifier,
93
+ location: this.getLocation(callNode, sourceFile.getFilePath()),
94
+ captures,
95
+ };
96
+ }
97
+ /* ─────────────────────────────────────────────────────────────────────────
98
+ * Capture Extraction
99
+ * ───────────────────────────────────────────────────────────────────────── */
100
+ /**
101
+ * Extract captures from a fetch call.
102
+ *
103
+ * @internal
104
+ */
105
+ extractCaptures(callNode, args) {
106
+ if (!Node.isCallExpression(callNode)) {
107
+ return { httpMethod: 'GET' };
108
+ }
109
+ const captures = {
110
+ httpMethod: 'GET', // Default method
111
+ };
112
+ // Extract URL from first argument
113
+ if (args.length > 0) {
114
+ const urlNode = args[0];
115
+ const urlResult = extractURL(urlNode);
116
+ if (urlResult) {
117
+ captures.url = urlResult;
118
+ captures.routePath = urlResult.raw || urlResult.static;
119
+ }
120
+ }
121
+ // Extract options from second argument
122
+ if (args.length > 1) {
123
+ const optionsNode = args[1];
124
+ const options = this.parseOptionsObject(optionsNode);
125
+ if (options.method) {
126
+ captures.httpMethod = options.method;
127
+ }
128
+ if (options.body !== undefined) {
129
+ captures.requestBody = options.body;
130
+ }
131
+ if (options.headers) {
132
+ captures.requestHeaders = options.headers;
133
+ }
134
+ }
135
+ // Extract type inference sources
136
+ const typeInference = findTypeInferenceSources(callNode);
137
+ if (typeInference.length > 0) {
138
+ captures.typeInference = typeInference;
139
+ }
140
+ // Track property accesses on the response
141
+ const propertyAccesses = trackPropertyAccesses(callNode);
142
+ if (propertyAccesses.length > 0) {
143
+ captures.propertyAccesses = propertyAccesses;
144
+ }
145
+ // Mark as fetch client
146
+ captures.clientLibrary = 'fetch';
147
+ return captures;
148
+ }
149
+ /* ─────────────────────────────────────────────────────────────────────────
150
+ * Options Parsing
151
+ * ───────────────────────────────────────────────────────────────────────── */
152
+ /**
153
+ * Parse fetch options object.
154
+ *
155
+ * @internal
156
+ */
157
+ parseOptionsObject(node) {
158
+ const result = {};
159
+ if (!Node.isObjectLiteralExpression(node)) {
160
+ return result;
161
+ }
162
+ for (const prop of node.getProperties()) {
163
+ if (!Node.isPropertyAssignment(prop))
164
+ continue;
165
+ const name = prop.getName();
166
+ const initializer = prop.getInitializer();
167
+ if (!initializer)
168
+ continue;
169
+ switch (name) {
170
+ case 'method':
171
+ if (Node.isStringLiteral(initializer)) {
172
+ const method = initializer.getLiteralValue().toUpperCase();
173
+ if (this.isValidMethod(method)) {
174
+ result.method = method;
175
+ }
176
+ }
177
+ break;
178
+ case 'body':
179
+ result.body = this.extractBodyInfo(initializer);
180
+ break;
181
+ case 'headers':
182
+ result.headers = this.extractHeadersInfo(initializer);
183
+ break;
184
+ }
185
+ }
186
+ return result;
187
+ }
188
+ /**
189
+ * Check if a string is a valid HTTP method.
190
+ *
191
+ * @internal
192
+ */
193
+ isValidMethod(method) {
194
+ return ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'].includes(method);
195
+ }
196
+ /* ─────────────────────────────────────────────────────────────────────────
197
+ * Request Body & Headers Extraction
198
+ * ───────────────────────────────────────────────────────────────────────── */
199
+ /**
200
+ * Extract body information.
201
+ *
202
+ * @internal
203
+ */
204
+ extractBodyInfo(node) {
205
+ // For JSON.stringify() calls
206
+ if (Node.isCallExpression(node)) {
207
+ const expr = node.getExpression();
208
+ if (Node.isPropertyAccessExpression(expr)) {
209
+ const objExpr = expr.getExpression();
210
+ const propName = expr.getName();
211
+ if (Node.isIdentifier(objExpr) && objExpr.getText() === 'JSON' && propName === 'stringify') {
212
+ const args = node.getArguments();
213
+ if (args.length > 0) {
214
+ return { type: 'json', value: args[0].getText() };
215
+ }
216
+ }
217
+ }
218
+ }
219
+ // For object literals
220
+ if (Node.isObjectLiteralExpression(node)) {
221
+ return { type: 'object', value: node.getText() };
222
+ }
223
+ // For identifiers
224
+ if (Node.isIdentifier(node)) {
225
+ return { type: 'reference', name: node.getText() };
226
+ }
227
+ return { type: 'unknown', raw: node.getText() };
228
+ }
229
+ /**
230
+ * Extract headers information.
231
+ *
232
+ * @internal
233
+ */
234
+ extractHeadersInfo(node) {
235
+ const result = {};
236
+ if (Node.isObjectLiteralExpression(node)) {
237
+ const staticHeaders = {};
238
+ const dynamicHeaders = [];
239
+ for (const prop of node.getProperties()) {
240
+ if (Node.isPropertyAssignment(prop)) {
241
+ // Get property name - handle both quoted and unquoted
242
+ const nameNode = prop.getNameNode();
243
+ let name;
244
+ if (Node.isStringLiteral(nameNode)) {
245
+ name = nameNode.getLiteralValue();
246
+ }
247
+ else if (Node.isIdentifier(nameNode)) {
248
+ name = nameNode.getText();
249
+ }
250
+ else {
251
+ // Fallback - strip quotes from getName() if present
252
+ name = prop.getName().replace(/^['"]|['"]$/g, '');
253
+ }
254
+ const init = prop.getInitializer();
255
+ if (init && Node.isStringLiteral(init)) {
256
+ staticHeaders[name] = init.getLiteralValue();
257
+ }
258
+ else if (init && Node.isNoSubstitutionTemplateLiteral(init)) {
259
+ // Template literal without substitutions is static
260
+ staticHeaders[name] = init.getLiteralValue();
261
+ }
262
+ else {
263
+ // Template with substitutions, call expressions, identifiers are dynamic
264
+ dynamicHeaders.push(name);
265
+ }
266
+ }
267
+ }
268
+ if (Object.keys(staticHeaders).length > 0) {
269
+ result.static = staticHeaders;
270
+ }
271
+ if (dynamicHeaders.length > 0) {
272
+ result.dynamic = dynamicHeaders;
273
+ }
274
+ }
275
+ else {
276
+ // Headers object or variable reference
277
+ result.dynamic = ['*'];
278
+ }
279
+ return result;
280
+ }
281
+ /* ─────────────────────────────────────────────────────────────────────────
282
+ * Schema Extraction
283
+ * ───────────────────────────────────────────────────────────────────────── */
284
+ /**
285
+ * Extract schema from a match result.
286
+ *
287
+ * @param match - The match result to extract schema from
288
+ * @returns NormalizedSchema representing the fetch call
289
+ */
290
+ async extract(match) {
291
+ const captures = match.captures;
292
+ const url = captures.url?.raw ||
293
+ captures.url?.static || '';
294
+ const method = captures.httpMethod || 'GET';
295
+ // Build a NormalizedSchema from the captures
296
+ // identifier should be "METHOD /path" format
297
+ const schema = {
298
+ name: `${method} ${url}`,
299
+ properties: {
300
+ url: {
301
+ type: { kind: 'primitive', value: 'string' },
302
+ optional: false,
303
+ nullable: false,
304
+ readonly: true,
305
+ deprecated: false,
306
+ description: `URL: ${url}`,
307
+ },
308
+ method: {
309
+ type: { kind: 'literal', value: captures.httpMethod || 'GET' },
310
+ optional: false,
311
+ nullable: false,
312
+ readonly: true,
313
+ deprecated: false,
314
+ },
315
+ },
316
+ required: ['url', 'method'],
317
+ source: {
318
+ source: 'typescript',
319
+ id: match.identifier,
320
+ },
321
+ location: match.location,
322
+ };
323
+ // Add request body if present
324
+ if (captures.requestBody) {
325
+ schema.properties.requestBody = {
326
+ type: { kind: 'any' },
327
+ optional: true,
328
+ nullable: false,
329
+ readonly: false,
330
+ deprecated: false,
331
+ };
332
+ }
333
+ // Add inferred response type from type inference
334
+ const typeInference = captures.typeInference;
335
+ if (typeInference && typeInference.length > 0) {
336
+ const bestType = typeInference[0];
337
+ schema.properties.responseType = {
338
+ type: { kind: 'ref', name: bestType.typeText || 'unknown' },
339
+ optional: true,
340
+ nullable: false,
341
+ readonly: true,
342
+ deprecated: false,
343
+ description: `Inferred via ${bestType.method}`,
344
+ };
345
+ }
346
+ // Add property accesses as hints
347
+ const propertyAccesses = captures.propertyAccesses;
348
+ if (propertyAccesses && propertyAccesses.length > 0) {
349
+ schema.properties.accessedProperties = {
350
+ type: {
351
+ kind: 'array',
352
+ element: { kind: 'primitive', value: 'string' }
353
+ },
354
+ optional: true,
355
+ nullable: false,
356
+ readonly: true,
357
+ deprecated: false,
358
+ description: `Properties accessed: ${propertyAccesses.map(p => p.path).join(', ')}`,
359
+ };
360
+ }
361
+ return schema;
362
+ }
363
+ }
364
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/patterns/http-clients/fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * HTTP Client Pattern Matchers
3
+ *
4
+ * This module provides pattern matchers for HTTP client libraries (fetch, axios).
5
+ * It enables tracing of HTTP requests made from consumer code, extracting:
6
+ * - URL patterns and path parameters
7
+ * - HTTP methods
8
+ * - Request/response type inference
9
+ * - Property access tracking for consumer schema inference
10
+ *
11
+ * @module patterns/http-clients
12
+ * @see .context/ADR-P2-3-HTTP-CLIENT-TRACING.md
13
+ */
14
+ export type { HTTPMethod, URLExtractionResult, TypeInferenceSource, PropertyAccess, HeadersInfo, HTTPClientCaptures, ConsumerUsage, AxiosInstanceConfig, } from './types.js';
15
+ export { extractURL, composeURL } from './url-extractor.js';
16
+ export { findTypeInferenceSources, getBestInferredType } from './type-inference.js';
17
+ export { trackPropertyAccesses, buildTypeFromAccesses } from './property-access.js';
18
+ export { FetchPatternMatcher } from './fetch.js';
19
+ export { AxiosPatternMatcher } from './axios.js';
20
+ /**
21
+ * Register all HTTP client pattern matchers with the global registry.
22
+ *
23
+ * Call this during application initialization to enable HTTP client tracing.
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * import { bootstrapHTTPClientPatterns } from './patterns/http-clients/index.js';
28
+ *
29
+ * // During app initialization
30
+ * bootstrapHTTPClientPatterns();
31
+ *
32
+ * // Now HTTP client patterns are available for matching
33
+ * ```
34
+ */
35
+ export declare function bootstrapHTTPClientPatterns(): void;
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/patterns/http-clients/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,YAAY,EACV,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAMpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAUjD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAGlD"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * HTTP Client Pattern Matchers
3
+ *
4
+ * This module provides pattern matchers for HTTP client libraries (fetch, axios).
5
+ * It enables tracing of HTTP requests made from consumer code, extracting:
6
+ * - URL patterns and path parameters
7
+ * - HTTP methods
8
+ * - Request/response type inference
9
+ * - Property access tracking for consumer schema inference
10
+ *
11
+ * @module patterns/http-clients
12
+ * @see .context/ADR-P2-3-HTTP-CLIENT-TRACING.md
13
+ */
14
+ /* ═══════════════════════════════════════════════════════════════════════════
15
+ * 🔧 Utility Exports
16
+ * ═══════════════════════════════════════════════════════════════════════════ */
17
+ export { extractURL, composeURL } from './url-extractor.js';
18
+ export { findTypeInferenceSources, getBestInferredType } from './type-inference.js';
19
+ export { trackPropertyAccesses, buildTypeFromAccesses } from './property-access.js';
20
+ /* ═══════════════════════════════════════════════════════════════════════════
21
+ * 🔍 Matcher Exports
22
+ * ═══════════════════════════════════════════════════════════════════════════ */
23
+ export { FetchPatternMatcher } from './fetch.js';
24
+ export { AxiosPatternMatcher } from './axios.js';
25
+ /* ═══════════════════════════════════════════════════════════════════════════
26
+ * 🚀 Bootstrap
27
+ * ═══════════════════════════════════════════════════════════════════════════ */
28
+ import { registerPattern } from '../registry.js';
29
+ import { FetchPatternMatcher } from './fetch.js';
30
+ import { AxiosPatternMatcher } from './axios.js';
31
+ /**
32
+ * Register all HTTP client pattern matchers with the global registry.
33
+ *
34
+ * Call this during application initialization to enable HTTP client tracing.
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * import { bootstrapHTTPClientPatterns } from './patterns/http-clients/index.js';
39
+ *
40
+ * // During app initialization
41
+ * bootstrapHTTPClientPatterns();
42
+ *
43
+ * // Now HTTP client patterns are available for matching
44
+ * ```
45
+ */
46
+ export function bootstrapHTTPClientPatterns() {
47
+ registerPattern(new FetchPatternMatcher());
48
+ registerPattern(new AxiosPatternMatcher());
49
+ }
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/patterns/http-clients/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiBH;;iFAEiF;AAEjF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAEpF;;iFAEiF;AAEjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;iFAEiF;AAEjF,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,2BAA2B;IACzC,eAAe,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC;IAC3C,eAAe,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Property Access Tracking
3
+ *
4
+ * Track property accesses on HTTP client response data to infer types.
5
+ * This enables consumer schema inference from how response data is used.
6
+ *
7
+ * @module patterns/http-clients/property-access
8
+ * @see .context/ADR-P2-3-HTTP-CLIENT-TRACING.md
9
+ */
10
+ import { Node } from 'ts-morph';
11
+ import type { PropertyAccess } from './types.js';
12
+ /**
13
+ * Track all property accesses on a variable assigned from a call expression.
14
+ *
15
+ * Handles:
16
+ * - Direct access: `response.data`
17
+ * - Chained access: `response.data.user.name`
18
+ * - Destructuring: `const { data } = response`
19
+ * - Optional chaining: `response?.data?.user`
20
+ *
21
+ * @param callNode - The call expression node
22
+ * @param variableName - Optional variable name to track (derived if not provided)
23
+ * @returns Array of property accesses found
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const accesses = trackPropertyAccesses(fetchCall);
28
+ * // [{ path: 'data.user.name', segments: ['data', 'user', 'name'] }]
29
+ * ```
30
+ */
31
+ export declare function trackPropertyAccesses(callNode: Node, variableName?: string): PropertyAccess[];
32
+ /**
33
+ * Build an inferred type structure from property accesses.
34
+ *
35
+ * @param accesses - Property accesses observed
36
+ * @returns Nested object representing the inferred type structure
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * const accesses = [{ path: 'user.name' }, { path: 'user.email' }];
41
+ * const type = buildTypeFromAccesses(accesses);
42
+ * // { user: { name: 'unknown', email: 'unknown' } }
43
+ * ```
44
+ */
45
+ export declare function buildTypeFromAccesses(accesses: PropertyAccess[]): Record<string, unknown>;
46
+ //# sourceMappingURL=property-access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-access.d.ts","sourceRoot":"","sources":["../../../src/patterns/http-clients/property-access.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAc,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CA6D7F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwCzF"}