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,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"}
|