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.
- package/LICENSE +21 -0
- package/README.md +1662 -0
- package/dist/adapters/bootstrap.d.ts +29 -0
- package/dist/adapters/bootstrap.d.ts.map +1 -0
- package/dist/adapters/bootstrap.js +46 -0
- package/dist/adapters/bootstrap.js.map +1 -0
- package/dist/adapters/errors.d.ts +94 -0
- package/dist/adapters/errors.d.ts.map +1 -0
- package/dist/adapters/errors.js +107 -0
- package/dist/adapters/errors.js.map +1 -0
- package/dist/adapters/graphql/index.d.ts +9 -0
- package/dist/adapters/graphql/index.d.ts.map +1 -0
- package/dist/adapters/graphql/index.js +9 -0
- package/dist/adapters/graphql/index.js.map +1 -0
- package/dist/adapters/graphql/sdl-parser.d.ts +74 -0
- package/dist/adapters/graphql/sdl-parser.d.ts.map +1 -0
- package/dist/adapters/graphql/sdl-parser.js +559 -0
- package/dist/adapters/graphql/sdl-parser.js.map +1 -0
- package/dist/adapters/grpc/adapter.d.ts +76 -0
- package/dist/adapters/grpc/adapter.d.ts.map +1 -0
- package/dist/adapters/grpc/adapter.js +362 -0
- package/dist/adapters/grpc/adapter.js.map +1 -0
- package/dist/adapters/grpc/index.d.ts +10 -0
- package/dist/adapters/grpc/index.d.ts.map +1 -0
- package/dist/adapters/grpc/index.js +12 -0
- package/dist/adapters/grpc/index.js.map +1 -0
- package/dist/adapters/grpc/proto-parser.d.ts +76 -0
- package/dist/adapters/grpc/proto-parser.d.ts.map +1 -0
- package/dist/adapters/grpc/proto-parser.js +523 -0
- package/dist/adapters/grpc/proto-parser.js.map +1 -0
- package/dist/adapters/grpc/type-converter.d.ts +43 -0
- package/dist/adapters/grpc/type-converter.d.ts.map +1 -0
- package/dist/adapters/grpc/type-converter.js +270 -0
- package/dist/adapters/grpc/type-converter.js.map +1 -0
- package/dist/adapters/grpc/types.d.ts +85 -0
- package/dist/adapters/grpc/types.d.ts.map +1 -0
- package/dist/adapters/grpc/types.js +7 -0
- package/dist/adapters/grpc/types.js.map +1 -0
- package/dist/adapters/index.d.ts +39 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +50 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/mcp.d.ts +23 -0
- package/dist/adapters/mcp.d.ts.map +1 -0
- package/dist/adapters/mcp.js +293 -0
- package/dist/adapters/mcp.js.map +1 -0
- package/dist/adapters/openapi/adapter.d.ts +213 -0
- package/dist/adapters/openapi/adapter.d.ts.map +1 -0
- package/dist/adapters/openapi/adapter.js +557 -0
- package/dist/adapters/openapi/adapter.js.map +1 -0
- package/dist/adapters/openapi/convert.d.ts +120 -0
- package/dist/adapters/openapi/convert.d.ts.map +1 -0
- package/dist/adapters/openapi/convert.js +363 -0
- package/dist/adapters/openapi/convert.js.map +1 -0
- package/dist/adapters/openapi/index.d.ts +39 -0
- package/dist/adapters/openapi/index.d.ts.map +1 -0
- package/dist/adapters/openapi/index.js +48 -0
- package/dist/adapters/openapi/index.js.map +1 -0
- package/dist/adapters/openapi/parser.d.ts +95 -0
- package/dist/adapters/openapi/parser.d.ts.map +1 -0
- package/dist/adapters/openapi/parser.js +171 -0
- package/dist/adapters/openapi/parser.js.map +1 -0
- package/dist/adapters/registry.d.ts +116 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +246 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/trpc/adapter.d.ts +159 -0
- package/dist/adapters/trpc/adapter.d.ts.map +1 -0
- package/dist/adapters/trpc/adapter.js +223 -0
- package/dist/adapters/trpc/adapter.js.map +1 -0
- package/dist/adapters/trpc/extractor.d.ts +218 -0
- package/dist/adapters/trpc/extractor.d.ts.map +1 -0
- package/dist/adapters/trpc/extractor.js +708 -0
- package/dist/adapters/trpc/extractor.js.map +1 -0
- package/dist/adapters/trpc/index.d.ts +31 -0
- package/dist/adapters/trpc/index.d.ts.map +1 -0
- package/dist/adapters/trpc/index.js +40 -0
- package/dist/adapters/trpc/index.js.map +1 -0
- package/dist/adapters/trpc/parser.d.ts +119 -0
- package/dist/adapters/trpc/parser.d.ts.map +1 -0
- package/dist/adapters/trpc/parser.js +128 -0
- package/dist/adapters/trpc/parser.js.map +1 -0
- package/dist/compare/index.d.ts +33 -0
- package/dist/compare/index.d.ts.map +1 -0
- package/dist/compare/index.js +261 -0
- package/dist/compare/index.js.map +1 -0
- package/dist/core/types.d.ts +188 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +9 -0
- package/dist/core/types.js.map +1 -0
- package/dist/extract/index.d.ts +26 -0
- package/dist/extract/index.d.ts.map +1 -0
- package/dist/extract/index.js +44 -0
- package/dist/extract/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +674 -0
- package/dist/index.js.map +1 -0
- package/dist/languages/base.d.ts +57 -0
- package/dist/languages/base.d.ts.map +1 -0
- package/dist/languages/base.js +6 -0
- package/dist/languages/base.js.map +1 -0
- package/dist/languages/bootstrap.d.ts +10 -0
- package/dist/languages/bootstrap.d.ts.map +1 -0
- package/dist/languages/bootstrap.js +25 -0
- package/dist/languages/bootstrap.js.map +1 -0
- package/dist/languages/go/handlers/chi.d.ts +24 -0
- package/dist/languages/go/handlers/chi.d.ts.map +1 -0
- package/dist/languages/go/handlers/chi.js +205 -0
- package/dist/languages/go/handlers/chi.js.map +1 -0
- package/dist/languages/go/handlers/gin.d.ts +24 -0
- package/dist/languages/go/handlers/gin.d.ts.map +1 -0
- package/dist/languages/go/handlers/gin.js +156 -0
- package/dist/languages/go/handlers/gin.js.map +1 -0
- package/dist/languages/go/handlers/stdlib.d.ts +19 -0
- package/dist/languages/go/handlers/stdlib.d.ts.map +1 -0
- package/dist/languages/go/handlers/stdlib.js +112 -0
- package/dist/languages/go/handlers/stdlib.js.map +1 -0
- package/dist/languages/go/index.d.ts +18 -0
- package/dist/languages/go/index.d.ts.map +1 -0
- package/dist/languages/go/index.js +20 -0
- package/dist/languages/go/index.js.map +1 -0
- package/dist/languages/go/parser.d.ts +33 -0
- package/dist/languages/go/parser.d.ts.map +1 -0
- package/dist/languages/go/parser.js +95 -0
- package/dist/languages/go/parser.js.map +1 -0
- package/dist/languages/go/struct-extractor.d.ts +59 -0
- package/dist/languages/go/struct-extractor.d.ts.map +1 -0
- package/dist/languages/go/struct-extractor.js +483 -0
- package/dist/languages/go/struct-extractor.js.map +1 -0
- package/dist/languages/go/tag-parser.d.ts +62 -0
- package/dist/languages/go/tag-parser.d.ts.map +1 -0
- package/dist/languages/go/tag-parser.js +108 -0
- package/dist/languages/go/tag-parser.js.map +1 -0
- package/dist/languages/go/type-converter.d.ts +32 -0
- package/dist/languages/go/type-converter.d.ts.map +1 -0
- package/dist/languages/go/type-converter.js +226 -0
- package/dist/languages/go/type-converter.js.map +1 -0
- package/dist/languages/go/types.d.ts +153 -0
- package/dist/languages/go/types.d.ts.map +1 -0
- package/dist/languages/go/types.js +6 -0
- package/dist/languages/go/types.js.map +1 -0
- package/dist/languages/import-resolver.d.ts +645 -0
- package/dist/languages/import-resolver.d.ts.map +1 -0
- package/dist/languages/import-resolver.js +1278 -0
- package/dist/languages/import-resolver.js.map +1 -0
- package/dist/languages/index.d.ts +34 -0
- package/dist/languages/index.d.ts.map +1 -0
- package/dist/languages/index.js +93 -0
- package/dist/languages/index.js.map +1 -0
- package/dist/languages/json-schema.d.ts +40 -0
- package/dist/languages/json-schema.d.ts.map +1 -0
- package/dist/languages/json-schema.js +188 -0
- package/dist/languages/json-schema.js.map +1 -0
- package/dist/languages/python-ast/index.d.ts +8 -0
- package/dist/languages/python-ast/index.d.ts.map +1 -0
- package/dist/languages/python-ast/index.js +7 -0
- package/dist/languages/python-ast/index.js.map +1 -0
- package/dist/languages/python-ast/parser.d.ts +174 -0
- package/dist/languages/python-ast/parser.d.ts.map +1 -0
- package/dist/languages/python-ast/parser.js +1205 -0
- package/dist/languages/python-ast/parser.js.map +1 -0
- package/dist/languages/python-ast/type-resolver.d.ts +75 -0
- package/dist/languages/python-ast/type-resolver.d.ts.map +1 -0
- package/dist/languages/python-ast/type-resolver.js +421 -0
- package/dist/languages/python-ast/type-resolver.js.map +1 -0
- package/dist/languages/python-ast/types.d.ts +216 -0
- package/dist/languages/python-ast/types.d.ts.map +1 -0
- package/dist/languages/python-ast/types.js +6 -0
- package/dist/languages/python-ast/types.js.map +1 -0
- package/dist/languages/python.d.ts +55 -0
- package/dist/languages/python.d.ts.map +1 -0
- package/dist/languages/python.js +311 -0
- package/dist/languages/python.js.map +1 -0
- package/dist/languages/typescript.d.ts +272 -0
- package/dist/languages/typescript.d.ts.map +1 -0
- package/dist/languages/typescript.js +1381 -0
- package/dist/languages/typescript.js.map +1 -0
- package/dist/patterns/base.d.ts +146 -0
- package/dist/patterns/base.d.ts.map +1 -0
- package/dist/patterns/base.js +89 -0
- package/dist/patterns/base.js.map +1 -0
- package/dist/patterns/errors.d.ts +172 -0
- package/dist/patterns/errors.d.ts.map +1 -0
- package/dist/patterns/errors.js +185 -0
- package/dist/patterns/errors.js.map +1 -0
- package/dist/patterns/extractors.d.ts +170 -0
- package/dist/patterns/extractors.d.ts.map +1 -0
- package/dist/patterns/extractors.js +305 -0
- package/dist/patterns/extractors.js.map +1 -0
- package/dist/patterns/graphql/apollo-client.d.ts +80 -0
- package/dist/patterns/graphql/apollo-client.d.ts.map +1 -0
- package/dist/patterns/graphql/apollo-client.js +800 -0
- package/dist/patterns/graphql/apollo-client.js.map +1 -0
- package/dist/patterns/graphql/apollo-server.d.ts +55 -0
- package/dist/patterns/graphql/apollo-server.d.ts.map +1 -0
- package/dist/patterns/graphql/apollo-server.js +523 -0
- package/dist/patterns/graphql/apollo-server.js.map +1 -0
- package/dist/patterns/graphql/index.d.ts +11 -0
- package/dist/patterns/graphql/index.d.ts.map +1 -0
- package/dist/patterns/graphql/index.js +12 -0
- package/dist/patterns/graphql/index.js.map +1 -0
- package/dist/patterns/graphql/types.d.ts +213 -0
- package/dist/patterns/graphql/types.d.ts.map +1 -0
- package/dist/patterns/graphql/types.js +16 -0
- package/dist/patterns/graphql/types.js.map +1 -0
- package/dist/patterns/http-clients/axios.d.ts +148 -0
- package/dist/patterns/http-clients/axios.d.ts.map +1 -0
- package/dist/patterns/http-clients/axios.js +652 -0
- package/dist/patterns/http-clients/axios.js.map +1 -0
- package/dist/patterns/http-clients/fetch.d.ts +88 -0
- package/dist/patterns/http-clients/fetch.d.ts.map +1 -0
- package/dist/patterns/http-clients/fetch.js +364 -0
- package/dist/patterns/http-clients/fetch.js.map +1 -0
- package/dist/patterns/http-clients/index.d.ts +36 -0
- package/dist/patterns/http-clients/index.d.ts.map +1 -0
- package/dist/patterns/http-clients/index.js +50 -0
- package/dist/patterns/http-clients/index.js.map +1 -0
- package/dist/patterns/http-clients/property-access.d.ts +46 -0
- package/dist/patterns/http-clients/property-access.d.ts.map +1 -0
- package/dist/patterns/http-clients/property-access.js +818 -0
- package/dist/patterns/http-clients/property-access.js.map +1 -0
- package/dist/patterns/http-clients/type-inference.d.ts +48 -0
- package/dist/patterns/http-clients/type-inference.d.ts.map +1 -0
- package/dist/patterns/http-clients/type-inference.js +293 -0
- package/dist/patterns/http-clients/type-inference.js.map +1 -0
- package/dist/patterns/http-clients/types.d.ts +168 -0
- package/dist/patterns/http-clients/types.d.ts.map +1 -0
- package/dist/patterns/http-clients/types.js +10 -0
- package/dist/patterns/http-clients/types.js.map +1 -0
- package/dist/patterns/http-clients/url-extractor.d.ts +53 -0
- package/dist/patterns/http-clients/url-extractor.d.ts.map +1 -0
- package/dist/patterns/http-clients/url-extractor.js +338 -0
- package/dist/patterns/http-clients/url-extractor.js.map +1 -0
- package/dist/patterns/index.d.ts +44 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +49 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/patterns/python/aiohttp.d.ts +21 -0
- package/dist/patterns/python/aiohttp.d.ts.map +1 -0
- package/dist/patterns/python/aiohttp.js +188 -0
- package/dist/patterns/python/aiohttp.js.map +1 -0
- package/dist/patterns/python/httpx.d.ts +20 -0
- package/dist/patterns/python/httpx.d.ts.map +1 -0
- package/dist/patterns/python/httpx.js +183 -0
- package/dist/patterns/python/httpx.js.map +1 -0
- package/dist/patterns/python/index.d.ts +32 -0
- package/dist/patterns/python/index.d.ts.map +1 -0
- package/dist/patterns/python/index.js +63 -0
- package/dist/patterns/python/index.js.map +1 -0
- package/dist/patterns/python/property-access.d.ts +27 -0
- package/dist/patterns/python/property-access.d.ts.map +1 -0
- package/dist/patterns/python/property-access.js +132 -0
- package/dist/patterns/python/property-access.js.map +1 -0
- package/dist/patterns/python/requests.d.ts +19 -0
- package/dist/patterns/python/requests.d.ts.map +1 -0
- package/dist/patterns/python/requests.js +239 -0
- package/dist/patterns/python/requests.js.map +1 -0
- package/dist/patterns/python/types.d.ts +95 -0
- package/dist/patterns/python/types.d.ts.map +1 -0
- package/dist/patterns/python/types.js +43 -0
- package/dist/patterns/python/types.js.map +1 -0
- package/dist/patterns/registry.d.ts +181 -0
- package/dist/patterns/registry.d.ts.map +1 -0
- package/dist/patterns/registry.js +304 -0
- package/dist/patterns/registry.js.map +1 -0
- package/dist/patterns/rest/express.d.ts +78 -0
- package/dist/patterns/rest/express.d.ts.map +1 -0
- package/dist/patterns/rest/express.js +289 -0
- package/dist/patterns/rest/express.js.map +1 -0
- package/dist/patterns/rest/fastify.d.ts +93 -0
- package/dist/patterns/rest/fastify.d.ts.map +1 -0
- package/dist/patterns/rest/fastify.js +420 -0
- package/dist/patterns/rest/fastify.js.map +1 -0
- package/dist/patterns/rest/index.d.ts +31 -0
- package/dist/patterns/rest/index.d.ts.map +1 -0
- package/dist/patterns/rest/index.js +45 -0
- package/dist/patterns/rest/index.js.map +1 -0
- package/dist/patterns/rest/middleware.d.ts +25 -0
- package/dist/patterns/rest/middleware.d.ts.map +1 -0
- package/dist/patterns/rest/middleware.js +219 -0
- package/dist/patterns/rest/middleware.js.map +1 -0
- package/dist/patterns/rest/path-parser.d.ts +50 -0
- package/dist/patterns/rest/path-parser.d.ts.map +1 -0
- package/dist/patterns/rest/path-parser.js +137 -0
- package/dist/patterns/rest/path-parser.js.map +1 -0
- package/dist/patterns/rest/response-inference.d.ts +44 -0
- package/dist/patterns/rest/response-inference.d.ts.map +1 -0
- package/dist/patterns/rest/response-inference.js +218 -0
- package/dist/patterns/rest/response-inference.js.map +1 -0
- package/dist/patterns/rest/types.d.ts +102 -0
- package/dist/patterns/rest/types.d.ts.map +1 -0
- package/dist/patterns/rest/types.js +10 -0
- package/dist/patterns/rest/types.js.map +1 -0
- package/dist/patterns/types.d.ts +105 -0
- package/dist/patterns/types.d.ts.map +1 -0
- package/dist/patterns/types.js +11 -0
- package/dist/patterns/types.js.map +1 -0
- package/dist/report/index.d.ts +11 -0
- package/dist/report/index.d.ts.map +1 -0
- package/dist/report/index.js +55 -0
- package/dist/report/index.js.map +1 -0
- package/dist/tools/contract-comments.d.ts +48 -0
- package/dist/tools/contract-comments.d.ts.map +1 -0
- package/dist/tools/contract-comments.js +130 -0
- package/dist/tools/contract-comments.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/scaffold.d.ts +38 -0
- package/dist/tools/scaffold.d.ts.map +1 -0
- package/dist/tools/scaffold.js +373 -0
- package/dist/tools/scaffold.js.map +1 -0
- package/dist/trace/index.d.ts +28 -0
- package/dist/trace/index.d.ts.map +1 -0
- package/dist/trace/index.js +45 -0
- package/dist/trace/index.js.map +1 -0
- package/dist/types.d.ts +135 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +22 -0
- package/dist/types.js.map +1 -0
- package/dist/watch/cache.d.ts +41 -0
- package/dist/watch/cache.d.ts.map +1 -0
- package/dist/watch/cache.js +230 -0
- package/dist/watch/cache.js.map +1 -0
- package/dist/watch/index.d.ts +9 -0
- package/dist/watch/index.d.ts.map +1 -0
- package/dist/watch/index.js +7 -0
- package/dist/watch/index.js.map +1 -0
- package/dist/watch/project.d.ts +128 -0
- package/dist/watch/project.d.ts.map +1 -0
- package/dist/watch/project.js +152 -0
- package/dist/watch/project.js.map +1 -0
- package/dist/watch/watcher.d.ts +76 -0
- package/dist/watch/watcher.d.ts.map +1 -0
- package/dist/watch/watcher.js +235 -0
- package/dist/watch/watcher.js.map +1 -0
- 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"}
|