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,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 📋 tRPC Schema Adapter
|
|
3
|
+
*
|
|
4
|
+
* Extracts and converts tRPC router definitions to NormalizedSchema.
|
|
5
|
+
*
|
|
6
|
+
* This adapter implements the SchemaAdapter interface for tRPC
|
|
7
|
+
* router files. It supports extraction of:
|
|
8
|
+
* - Procedure input schemas (from `.input()` calls)
|
|
9
|
+
* - Procedure output schemas (from `.output()` calls)
|
|
10
|
+
* - Nested router structures
|
|
11
|
+
* - Zod schema validation rules
|
|
12
|
+
*
|
|
13
|
+
* Uses ts-morph for AST analysis, parsing the actual TypeScript
|
|
14
|
+
* source code to extract schema definitions without requiring
|
|
15
|
+
* runtime evaluation.
|
|
16
|
+
*
|
|
17
|
+
* @module adapters/trpc/adapter
|
|
18
|
+
*/
|
|
19
|
+
import type { SchemaAdapter, SchemaRef, NormalizedSchema } from '../../core/types.js';
|
|
20
|
+
/**
|
|
21
|
+
* Schema adapter for tRPC router definitions.
|
|
22
|
+
*
|
|
23
|
+
* Implements the SchemaAdapter interface to extract schemas from
|
|
24
|
+
* tRPC router files. Uses ts-morph for AST analysis to parse
|
|
25
|
+
* Zod schemas without runtime evaluation.
|
|
26
|
+
*
|
|
27
|
+
* Supported tRPC patterns:
|
|
28
|
+
* - `t.router({ ... })` - Standard tRPC v10+ pattern
|
|
29
|
+
* - `createTRPCRouter({ ... })` - Next.js/T3 pattern
|
|
30
|
+
* - `createRouter({ ... })` - Legacy pattern
|
|
31
|
+
* - Nested routers via object composition
|
|
32
|
+
*
|
|
33
|
+
* Supported Zod schemas:
|
|
34
|
+
* - Primitives: `z.string()`, `z.number()`, `z.boolean()`
|
|
35
|
+
* - Objects: `z.object({ ... })`
|
|
36
|
+
* - Arrays: `z.array(...)`
|
|
37
|
+
* - Unions: `z.union([...])`, `z.enum([...])`
|
|
38
|
+
* - Modifiers: `.optional()`, `.nullable()`, `.default()`
|
|
39
|
+
* - Constraints: `.min()`, `.max()`, `.email()`, etc.
|
|
40
|
+
*
|
|
41
|
+
* @implements {SchemaAdapter}
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* import { TRPCAdapter } from './adapter.js';
|
|
46
|
+
* import { registerAdapter } from '../registry.js';
|
|
47
|
+
*
|
|
48
|
+
* // Register the adapter
|
|
49
|
+
* registerAdapter(new TRPCAdapter());
|
|
50
|
+
*
|
|
51
|
+
* // Extract procedure input schema
|
|
52
|
+
* const adapter = new TRPCAdapter();
|
|
53
|
+
* const schema = await adapter.extract({
|
|
54
|
+
* source: 'trpc',
|
|
55
|
+
* id: 'trpc:users.getById@./router.ts'
|
|
56
|
+
* });
|
|
57
|
+
*
|
|
58
|
+
* // Extract procedure output schema
|
|
59
|
+
* const outputSchema = await adapter.extract({
|
|
60
|
+
* source: 'trpc',
|
|
61
|
+
* id: 'trpc:users.getById.output@./router.ts'
|
|
62
|
+
* });
|
|
63
|
+
*
|
|
64
|
+
* // List all procedures in a file
|
|
65
|
+
* const refs = await adapter.list('./router.ts');
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export declare class TRPCAdapter implements SchemaAdapter {
|
|
69
|
+
/** Adapter kind identifier */
|
|
70
|
+
readonly kind: "trpc";
|
|
71
|
+
/**
|
|
72
|
+
* Check if this adapter supports the given schema reference.
|
|
73
|
+
*
|
|
74
|
+
* @param ref - The schema reference to check
|
|
75
|
+
* @returns True if the ref source is 'trpc'
|
|
76
|
+
*/
|
|
77
|
+
supports(ref: SchemaRef): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Extract a schema from a tRPC procedure.
|
|
80
|
+
*
|
|
81
|
+
* Parses the ref ID to determine the procedure and schema type:
|
|
82
|
+
* - `trpc:{path}@{file}` - Extract input schema (default)
|
|
83
|
+
* - `trpc:{path}.input@{file}` - Extract input schema (explicit)
|
|
84
|
+
* - `trpc:{path}.output@{file}` - Extract output schema
|
|
85
|
+
*
|
|
86
|
+
* The extraction process:
|
|
87
|
+
* 1. Parse the reference ID to get procedure path and schema type
|
|
88
|
+
* 2. Load and parse the TypeScript file with ts-morph
|
|
89
|
+
* 3. Find all router definitions and extract procedures
|
|
90
|
+
* 4. Locate the target procedure by path
|
|
91
|
+
* 5. Convert the Zod schema to NormalizedSchema
|
|
92
|
+
*
|
|
93
|
+
* @param ref - The schema reference specifying what to extract
|
|
94
|
+
* @returns Promise resolving to the normalized schema
|
|
95
|
+
* @throws {Error} If the ref ID is invalid
|
|
96
|
+
* @throws {Error} If the file is not found
|
|
97
|
+
* @throws {Error} If the procedure is not found
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* // Extract input schema (default)
|
|
102
|
+
* const schema = await adapter.extract({
|
|
103
|
+
* source: 'trpc',
|
|
104
|
+
* id: 'trpc:users.getById@./router.ts'
|
|
105
|
+
* });
|
|
106
|
+
*
|
|
107
|
+
* // Extract output schema
|
|
108
|
+
* const outputSchema = await adapter.extract({
|
|
109
|
+
* source: 'trpc',
|
|
110
|
+
* id: 'trpc:users.create.output@./router.ts'
|
|
111
|
+
* });
|
|
112
|
+
*
|
|
113
|
+
* // Access the extracted schema
|
|
114
|
+
* console.log(schema.name); // 'users.getById.input'
|
|
115
|
+
* console.log(schema.properties); // { id: { type: {...}, optional: false, ... } }
|
|
116
|
+
* console.log(schema.required); // ['id']
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
extract(ref: SchemaRef): Promise<NormalizedSchema>;
|
|
120
|
+
/**
|
|
121
|
+
* List all tRPC procedures in a file.
|
|
122
|
+
*
|
|
123
|
+
* Scans the file for router definitions and returns a SchemaRef
|
|
124
|
+
* for each procedure found. Only returns input schema refs by default,
|
|
125
|
+
* as these are the most commonly needed for validation.
|
|
126
|
+
*
|
|
127
|
+
* The listing process:
|
|
128
|
+
* 1. Load and parse the TypeScript file with ts-morph
|
|
129
|
+
* 2. Find all router definitions (including nested routers)
|
|
130
|
+
* 3. Extract procedure definitions
|
|
131
|
+
* 4. Build SchemaRef IDs for each procedure
|
|
132
|
+
*
|
|
133
|
+
* Handles errors gracefully - returns empty array if file not found
|
|
134
|
+
* or parsing fails, per ADR guidelines.
|
|
135
|
+
*
|
|
136
|
+
* @param basePath - Path to the tRPC router file
|
|
137
|
+
* @returns Promise resolving to array of procedure SchemaRefs
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```typescript
|
|
141
|
+
* const refs = await adapter.list('./server/routers/index.ts');
|
|
142
|
+
* // [
|
|
143
|
+
* // { source: 'trpc', id: 'trpc:users.list@./server/routers/index.ts' },
|
|
144
|
+
* // { source: 'trpc', id: 'trpc:users.getById@./server/routers/index.ts' },
|
|
145
|
+
* // { source: 'trpc', id: 'trpc:users.create@./server/routers/index.ts' },
|
|
146
|
+
* // { source: 'trpc', id: 'trpc:posts.list@./server/routers/index.ts' },
|
|
147
|
+
* // ...
|
|
148
|
+
* // ]
|
|
149
|
+
*
|
|
150
|
+
* // Then extract each schema
|
|
151
|
+
* for (const ref of refs) {
|
|
152
|
+
* const schema = await adapter.extract(ref);
|
|
153
|
+
* console.log(`${schema.name}: ${Object.keys(schema.properties).length} props`);
|
|
154
|
+
* }
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
list(basePath: string): Promise<SchemaRef[]>;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/trpc/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAc7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,qBAAa,WAAY,YAAW,aAAa;IAC/C,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;IAEhC;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO;IAIjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwCG;IACG,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2CxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CA+BnD"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 📋 tRPC Schema Adapter
|
|
3
|
+
*
|
|
4
|
+
* Extracts and converts tRPC router definitions to NormalizedSchema.
|
|
5
|
+
*
|
|
6
|
+
* This adapter implements the SchemaAdapter interface for tRPC
|
|
7
|
+
* router files. It supports extraction of:
|
|
8
|
+
* - Procedure input schemas (from `.input()` calls)
|
|
9
|
+
* - Procedure output schemas (from `.output()` calls)
|
|
10
|
+
* - Nested router structures
|
|
11
|
+
* - Zod schema validation rules
|
|
12
|
+
*
|
|
13
|
+
* Uses ts-morph for AST analysis, parsing the actual TypeScript
|
|
14
|
+
* source code to extract schema definitions without requiring
|
|
15
|
+
* runtime evaluation.
|
|
16
|
+
*
|
|
17
|
+
* @module adapters/trpc/adapter
|
|
18
|
+
*/
|
|
19
|
+
import { existsSync } from 'fs';
|
|
20
|
+
import { parseTRPCRef, buildTRPCRefId } from './parser.js';
|
|
21
|
+
import { createProject, extractProcedures, zodToNormalizedSchema, createEmptySchema, } from './extractor.js';
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Adapter Implementation
|
|
24
|
+
// ============================================================================
|
|
25
|
+
/**
|
|
26
|
+
* Schema adapter for tRPC router definitions.
|
|
27
|
+
*
|
|
28
|
+
* Implements the SchemaAdapter interface to extract schemas from
|
|
29
|
+
* tRPC router files. Uses ts-morph for AST analysis to parse
|
|
30
|
+
* Zod schemas without runtime evaluation.
|
|
31
|
+
*
|
|
32
|
+
* Supported tRPC patterns:
|
|
33
|
+
* - `t.router({ ... })` - Standard tRPC v10+ pattern
|
|
34
|
+
* - `createTRPCRouter({ ... })` - Next.js/T3 pattern
|
|
35
|
+
* - `createRouter({ ... })` - Legacy pattern
|
|
36
|
+
* - Nested routers via object composition
|
|
37
|
+
*
|
|
38
|
+
* Supported Zod schemas:
|
|
39
|
+
* - Primitives: `z.string()`, `z.number()`, `z.boolean()`
|
|
40
|
+
* - Objects: `z.object({ ... })`
|
|
41
|
+
* - Arrays: `z.array(...)`
|
|
42
|
+
* - Unions: `z.union([...])`, `z.enum([...])`
|
|
43
|
+
* - Modifiers: `.optional()`, `.nullable()`, `.default()`
|
|
44
|
+
* - Constraints: `.min()`, `.max()`, `.email()`, etc.
|
|
45
|
+
*
|
|
46
|
+
* @implements {SchemaAdapter}
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* import { TRPCAdapter } from './adapter.js';
|
|
51
|
+
* import { registerAdapter } from '../registry.js';
|
|
52
|
+
*
|
|
53
|
+
* // Register the adapter
|
|
54
|
+
* registerAdapter(new TRPCAdapter());
|
|
55
|
+
*
|
|
56
|
+
* // Extract procedure input schema
|
|
57
|
+
* const adapter = new TRPCAdapter();
|
|
58
|
+
* const schema = await adapter.extract({
|
|
59
|
+
* source: 'trpc',
|
|
60
|
+
* id: 'trpc:users.getById@./router.ts'
|
|
61
|
+
* });
|
|
62
|
+
*
|
|
63
|
+
* // Extract procedure output schema
|
|
64
|
+
* const outputSchema = await adapter.extract({
|
|
65
|
+
* source: 'trpc',
|
|
66
|
+
* id: 'trpc:users.getById.output@./router.ts'
|
|
67
|
+
* });
|
|
68
|
+
*
|
|
69
|
+
* // List all procedures in a file
|
|
70
|
+
* const refs = await adapter.list('./router.ts');
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export class TRPCAdapter {
|
|
74
|
+
/** Adapter kind identifier */
|
|
75
|
+
kind = 'trpc';
|
|
76
|
+
/**
|
|
77
|
+
* Check if this adapter supports the given schema reference.
|
|
78
|
+
*
|
|
79
|
+
* @param ref - The schema reference to check
|
|
80
|
+
* @returns True if the ref source is 'trpc'
|
|
81
|
+
*/
|
|
82
|
+
supports(ref) {
|
|
83
|
+
return ref.source === 'trpc';
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Extract a schema from a tRPC procedure.
|
|
87
|
+
*
|
|
88
|
+
* Parses the ref ID to determine the procedure and schema type:
|
|
89
|
+
* - `trpc:{path}@{file}` - Extract input schema (default)
|
|
90
|
+
* - `trpc:{path}.input@{file}` - Extract input schema (explicit)
|
|
91
|
+
* - `trpc:{path}.output@{file}` - Extract output schema
|
|
92
|
+
*
|
|
93
|
+
* The extraction process:
|
|
94
|
+
* 1. Parse the reference ID to get procedure path and schema type
|
|
95
|
+
* 2. Load and parse the TypeScript file with ts-morph
|
|
96
|
+
* 3. Find all router definitions and extract procedures
|
|
97
|
+
* 4. Locate the target procedure by path
|
|
98
|
+
* 5. Convert the Zod schema to NormalizedSchema
|
|
99
|
+
*
|
|
100
|
+
* @param ref - The schema reference specifying what to extract
|
|
101
|
+
* @returns Promise resolving to the normalized schema
|
|
102
|
+
* @throws {Error} If the ref ID is invalid
|
|
103
|
+
* @throws {Error} If the file is not found
|
|
104
|
+
* @throws {Error} If the procedure is not found
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```typescript
|
|
108
|
+
* // Extract input schema (default)
|
|
109
|
+
* const schema = await adapter.extract({
|
|
110
|
+
* source: 'trpc',
|
|
111
|
+
* id: 'trpc:users.getById@./router.ts'
|
|
112
|
+
* });
|
|
113
|
+
*
|
|
114
|
+
* // Extract output schema
|
|
115
|
+
* const outputSchema = await adapter.extract({
|
|
116
|
+
* source: 'trpc',
|
|
117
|
+
* id: 'trpc:users.create.output@./router.ts'
|
|
118
|
+
* });
|
|
119
|
+
*
|
|
120
|
+
* // Access the extracted schema
|
|
121
|
+
* console.log(schema.name); // 'users.getById.input'
|
|
122
|
+
* console.log(schema.properties); // { id: { type: {...}, optional: false, ... } }
|
|
123
|
+
* console.log(schema.required); // ['id']
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
async extract(ref) {
|
|
127
|
+
const parsed = parseTRPCRef(ref.id);
|
|
128
|
+
if (!parsed) {
|
|
129
|
+
throw new Error(`Invalid tRPC ref ID: ${ref.id}`);
|
|
130
|
+
}
|
|
131
|
+
const { path: procedurePath, schemaType, filePath } = parsed;
|
|
132
|
+
// Check if file exists
|
|
133
|
+
if (!existsSync(filePath)) {
|
|
134
|
+
throw new Error(`File not found: ${filePath}`);
|
|
135
|
+
}
|
|
136
|
+
// Create project and load file
|
|
137
|
+
const project = createProject();
|
|
138
|
+
const sourceFile = project.addSourceFileAtPath(filePath);
|
|
139
|
+
// Extract all procedures
|
|
140
|
+
const procedures = extractProcedures(sourceFile);
|
|
141
|
+
// Find the target procedure
|
|
142
|
+
const procedure = procedures.find(p => p.path.join('.') === procedurePath);
|
|
143
|
+
if (!procedure) {
|
|
144
|
+
throw new Error(`Procedure "${procedurePath}" not found in ${filePath}`);
|
|
145
|
+
}
|
|
146
|
+
// Get the appropriate schema
|
|
147
|
+
const schemaNode = schemaType === 'output'
|
|
148
|
+
? procedure.outputSchema
|
|
149
|
+
: procedure.inputSchema;
|
|
150
|
+
// Build the schema name
|
|
151
|
+
const schemaName = `${procedurePath}.${schemaType}`;
|
|
152
|
+
if (!schemaNode) {
|
|
153
|
+
// Return empty schema for procedures without explicit input/output
|
|
154
|
+
return createEmptySchema(ref, procedure.location, schemaName);
|
|
155
|
+
}
|
|
156
|
+
return zodToNormalizedSchema(schemaNode, ref, procedure.location, schemaName);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* List all tRPC procedures in a file.
|
|
160
|
+
*
|
|
161
|
+
* Scans the file for router definitions and returns a SchemaRef
|
|
162
|
+
* for each procedure found. Only returns input schema refs by default,
|
|
163
|
+
* as these are the most commonly needed for validation.
|
|
164
|
+
*
|
|
165
|
+
* The listing process:
|
|
166
|
+
* 1. Load and parse the TypeScript file with ts-morph
|
|
167
|
+
* 2. Find all router definitions (including nested routers)
|
|
168
|
+
* 3. Extract procedure definitions
|
|
169
|
+
* 4. Build SchemaRef IDs for each procedure
|
|
170
|
+
*
|
|
171
|
+
* Handles errors gracefully - returns empty array if file not found
|
|
172
|
+
* or parsing fails, per ADR guidelines.
|
|
173
|
+
*
|
|
174
|
+
* @param basePath - Path to the tRPC router file
|
|
175
|
+
* @returns Promise resolving to array of procedure SchemaRefs
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* ```typescript
|
|
179
|
+
* const refs = await adapter.list('./server/routers/index.ts');
|
|
180
|
+
* // [
|
|
181
|
+
* // { source: 'trpc', id: 'trpc:users.list@./server/routers/index.ts' },
|
|
182
|
+
* // { source: 'trpc', id: 'trpc:users.getById@./server/routers/index.ts' },
|
|
183
|
+
* // { source: 'trpc', id: 'trpc:users.create@./server/routers/index.ts' },
|
|
184
|
+
* // { source: 'trpc', id: 'trpc:posts.list@./server/routers/index.ts' },
|
|
185
|
+
* // ...
|
|
186
|
+
* // ]
|
|
187
|
+
*
|
|
188
|
+
* // Then extract each schema
|
|
189
|
+
* for (const ref of refs) {
|
|
190
|
+
* const schema = await adapter.extract(ref);
|
|
191
|
+
* console.log(`${schema.name}: ${Object.keys(schema.properties).length} props`);
|
|
192
|
+
* }
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
async list(basePath) {
|
|
196
|
+
try {
|
|
197
|
+
// Check if file exists
|
|
198
|
+
if (!existsSync(basePath)) {
|
|
199
|
+
return [];
|
|
200
|
+
}
|
|
201
|
+
// Create project and load file
|
|
202
|
+
const project = createProject();
|
|
203
|
+
const sourceFile = project.addSourceFileAtPath(basePath);
|
|
204
|
+
// Extract all procedures
|
|
205
|
+
const procedures = extractProcedures(sourceFile);
|
|
206
|
+
// Convert to SchemaRefs
|
|
207
|
+
const refs = [];
|
|
208
|
+
for (const proc of procedures) {
|
|
209
|
+
const procPath = proc.path.join('.');
|
|
210
|
+
refs.push({
|
|
211
|
+
source: 'trpc',
|
|
212
|
+
id: buildTRPCRefId(procPath, 'input', basePath),
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
return refs;
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Per ADR, list() should handle errors gracefully
|
|
219
|
+
return [];
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/trpc/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🔧 tRPC Router/Procedure Extractor
|
|
3
|
+
*
|
|
4
|
+
* AST-based extraction of tRPC router definitions and Zod schemas.
|
|
5
|
+
* This module provides utilities to:
|
|
6
|
+
* - Parse TypeScript files containing tRPC routers
|
|
7
|
+
* - Extract procedure definitions (query, mutation, subscription)
|
|
8
|
+
* - Convert Zod schemas to NormalizedSchema format
|
|
9
|
+
*
|
|
10
|
+
* Uses ts-morph for AST analysis, supporting patterns like:
|
|
11
|
+
* - `t.router({ ... })` - Standard tRPC v10+ pattern
|
|
12
|
+
* - `createTRPCRouter({ ... })` - Next.js/T3 pattern
|
|
13
|
+
* - Nested routers via object composition
|
|
14
|
+
*
|
|
15
|
+
* @module adapters/trpc/extractor
|
|
16
|
+
*/
|
|
17
|
+
import { Project, Node, CallExpression, SourceFile } from 'ts-morph';
|
|
18
|
+
import type { NormalizedSchema, SchemaRef, SourceLocation } from '../../core/types.js';
|
|
19
|
+
/**
|
|
20
|
+
* Information about an extracted tRPC procedure.
|
|
21
|
+
*
|
|
22
|
+
* Represents a single procedure within a router, including its
|
|
23
|
+
* path (e.g., `["users", "getById"]`), type, and schema AST nodes.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const info: ProcedureInfo = {
|
|
28
|
+
* path: ['users', 'getById'],
|
|
29
|
+
* type: 'query',
|
|
30
|
+
* inputSchema: inputNode,
|
|
31
|
+
* outputSchema: undefined,
|
|
32
|
+
* location: { file: './router.ts', line: 42 }
|
|
33
|
+
* };
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export interface ProcedureInfo {
|
|
37
|
+
/** Full path as array (e.g., ["users", "getById"]) */
|
|
38
|
+
path: string[];
|
|
39
|
+
/** Procedure type: query for reads, mutation for writes, subscription for realtime */
|
|
40
|
+
type: 'query' | 'mutation' | 'subscription';
|
|
41
|
+
/** Input schema AST node (from `.input(...)` call), if defined */
|
|
42
|
+
inputSchema?: Node;
|
|
43
|
+
/** Output schema AST node (from `.output(...)` call), if defined */
|
|
44
|
+
outputSchema?: Node;
|
|
45
|
+
/** Source location where the procedure is defined */
|
|
46
|
+
location: SourceLocation;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create a new ts-morph Project instance for AST analysis.
|
|
50
|
+
*
|
|
51
|
+
* Configures the project without tsconfig to allow standalone
|
|
52
|
+
* file analysis without project-wide compilation context.
|
|
53
|
+
*
|
|
54
|
+
* @returns A new ts-morph Project instance
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* const project = createProject();
|
|
59
|
+
* const sourceFile = project.addSourceFileAtPath('./router.ts');
|
|
60
|
+
* const procedures = extractProcedures(sourceFile);
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare function createProject(): Project;
|
|
64
|
+
/**
|
|
65
|
+
* Extract all procedures from a tRPC router source file.
|
|
66
|
+
*
|
|
67
|
+
* Scans the file for router definitions and extracts all procedure
|
|
68
|
+
* definitions, including those in nested routers. Each procedure
|
|
69
|
+
* is returned with its full path, type, and schema nodes.
|
|
70
|
+
*
|
|
71
|
+
* Supported patterns:
|
|
72
|
+
* - `t.router({ user: t.procedure.query(...) })`
|
|
73
|
+
* - `createTRPCRouter({ users: userRouter })`
|
|
74
|
+
* - `createRouter({ nested: { deep: procedure } })`
|
|
75
|
+
*
|
|
76
|
+
* @param sourceFile - The ts-morph SourceFile to analyze
|
|
77
|
+
* @returns Array of ProcedureInfo objects for all found procedures
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* const project = createProject();
|
|
82
|
+
* const file = project.addSourceFileAtPath('./server/routers/index.ts');
|
|
83
|
+
* const procedures = extractProcedures(file);
|
|
84
|
+
*
|
|
85
|
+
* for (const proc of procedures) {
|
|
86
|
+
* console.log(`${proc.path.join('.')} - ${proc.type}`);
|
|
87
|
+
* // Output: "users.getById - query"
|
|
88
|
+
* }
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export declare function extractProcedures(sourceFile: SourceFile): ProcedureInfo[];
|
|
92
|
+
/**
|
|
93
|
+
* Check if a call expression is a tRPC router call.
|
|
94
|
+
*
|
|
95
|
+
* Matches patterns like:
|
|
96
|
+
* - `t.router(...)` - Method call on object
|
|
97
|
+
* - `trpc.router(...)` - Namespaced call
|
|
98
|
+
* - `createRouter(...)` - Function call
|
|
99
|
+
* - `createTRPCRouter(...)` - T3/Next.js pattern
|
|
100
|
+
*
|
|
101
|
+
* @param node - The AST node to check
|
|
102
|
+
* @returns True if the node is a router call expression
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* sourceFile.forEachDescendant((node) => {
|
|
107
|
+
* if (Node.isCallExpression(node) && isRouterCall(node)) {
|
|
108
|
+
* // Process router definition
|
|
109
|
+
* }
|
|
110
|
+
* });
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
export declare function isRouterCall(node: Node): node is CallExpression;
|
|
114
|
+
/**
|
|
115
|
+
* Check if a node is a tRPC procedure chain.
|
|
116
|
+
*
|
|
117
|
+
* Procedure chains are method chains that terminate in `.query()`,
|
|
118
|
+
* `.mutation()`, or `.subscription()`. This function walks up the
|
|
119
|
+
* chain to find these terminal methods.
|
|
120
|
+
*
|
|
121
|
+
* @param node - The AST node to check
|
|
122
|
+
* @returns True if the node is a procedure chain
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```typescript
|
|
126
|
+
* // These would return true:
|
|
127
|
+
* // t.procedure.input(z.string()).query(...)
|
|
128
|
+
* // t.procedure.mutation(...)
|
|
129
|
+
* // publicProcedure.subscription(...)
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
export declare function isProcedureChain(node: Node | undefined): boolean;
|
|
133
|
+
/**
|
|
134
|
+
* Parse a router object literal and extract all procedures.
|
|
135
|
+
*
|
|
136
|
+
* Recursively processes router definitions, handling:
|
|
137
|
+
* - Direct procedure definitions
|
|
138
|
+
* - Nested router references
|
|
139
|
+
* - Inline nested routers
|
|
140
|
+
*
|
|
141
|
+
* @param routerCall - The router call expression node
|
|
142
|
+
* @param currentPath - Current path prefix for nested routers
|
|
143
|
+
* @param filePath - Path to the source file
|
|
144
|
+
* @returns Array of ProcedureInfo for all found procedures
|
|
145
|
+
*/
|
|
146
|
+
export declare function parseRouterObject(routerCall: CallExpression, currentPath: string[], filePath: string): ProcedureInfo[];
|
|
147
|
+
/**
|
|
148
|
+
* Parse a procedure method chain to extract input/output schemas.
|
|
149
|
+
*
|
|
150
|
+
* Walks the method chain (`.input().output().query()`) and extracts:
|
|
151
|
+
* - Input schema from `.input(zodSchema)`
|
|
152
|
+
* - Output schema from `.output(zodSchema)`
|
|
153
|
+
* - Procedure type from terminal method (`.query()`, `.mutation()`, `.subscription()`)
|
|
154
|
+
*
|
|
155
|
+
* @param node - The procedure chain call expression
|
|
156
|
+
* @param path - Full path to this procedure
|
|
157
|
+
* @param filePath - Path to the source file
|
|
158
|
+
* @returns ProcedureInfo or null if parsing fails
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* ```typescript
|
|
162
|
+
* // For: t.procedure.input(z.object({ id: z.string() })).query(...)
|
|
163
|
+
* // Returns: { path: ['getById'], type: 'query', inputSchema: <Node>, ... }
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
export declare function parseProcedureChain(node: Node, path: string[], filePath: string): ProcedureInfo | null;
|
|
167
|
+
/**
|
|
168
|
+
* Convert a Zod schema AST node to NormalizedSchema.
|
|
169
|
+
*
|
|
170
|
+
* Parses Zod schema definitions and converts them to the framework's
|
|
171
|
+
* NormalizedSchema format. Supports common Zod types:
|
|
172
|
+
* - Primitives: `z.string()`, `z.number()`, `z.boolean()`
|
|
173
|
+
* - Objects: `z.object({ ... })`
|
|
174
|
+
* - Arrays: `z.array(...)`
|
|
175
|
+
* - Unions: `z.union([...])`, `z.enum([...])`
|
|
176
|
+
* - Modifiers: `.optional()`, `.nullable()`, `.default()`
|
|
177
|
+
* - Constraints: `.min()`, `.max()`, `.email()`, etc.
|
|
178
|
+
*
|
|
179
|
+
* @param node - The AST node containing the Zod schema
|
|
180
|
+
* @param ref - The SchemaRef for source tracking
|
|
181
|
+
* @param location - Source location for error reporting
|
|
182
|
+
* @param name - Optional schema name
|
|
183
|
+
* @returns The converted NormalizedSchema
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* ```typescript
|
|
187
|
+
* const schema = zodToNormalizedSchema(
|
|
188
|
+
* inputSchemaNode,
|
|
189
|
+
* { source: 'trpc', id: 'trpc:users.create@./router.ts' },
|
|
190
|
+
* { file: './router.ts', line: 42 },
|
|
191
|
+
* 'users.create.input'
|
|
192
|
+
* );
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
export declare function zodToNormalizedSchema(node: Node, ref: SchemaRef, location: SourceLocation, name?: string): NormalizedSchema;
|
|
196
|
+
/**
|
|
197
|
+
* Create an empty NormalizedSchema.
|
|
198
|
+
*
|
|
199
|
+
* Used for procedures without explicit input or output schemas.
|
|
200
|
+
* Returns a valid schema with empty properties.
|
|
201
|
+
*
|
|
202
|
+
* @param ref - The SchemaRef for source tracking
|
|
203
|
+
* @param location - Source location for error reporting
|
|
204
|
+
* @param name - Optional schema name
|
|
205
|
+
* @returns An empty NormalizedSchema
|
|
206
|
+
*
|
|
207
|
+
* @example
|
|
208
|
+
* ```typescript
|
|
209
|
+
* // For a procedure with no .input() call
|
|
210
|
+
* const emptyInput = createEmptySchema(
|
|
211
|
+
* ref,
|
|
212
|
+
* { file: './router.ts', line: 10 },
|
|
213
|
+
* 'users.list.input'
|
|
214
|
+
* );
|
|
215
|
+
* ```
|
|
216
|
+
*/
|
|
217
|
+
export declare function createEmptySchema(ref: SchemaRef, location: SourceLocation, name?: string): NormalizedSchema;
|
|
218
|
+
//# sourceMappingURL=extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../../src/adapters/trpc/extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,OAAO,EACP,IAAI,EACJ,cAAc,EACd,UAAU,EAGX,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EACV,gBAAgB,EAGhB,SAAS,EACT,cAAc,EAEf,MAAM,qBAAqB,CAAC;AAM7B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,sFAAsF;IACtF,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;IAC5C,kEAAkE;IAClE,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,oEAAoE;IACpE,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,qDAAqD;IACrD,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAKvC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,EAAE,CAazE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,cAAc,CAiB/D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,OAAO,CAyBhE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,cAAc,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,QAAQ,EAAE,MAAM,GACf,aAAa,EAAE,CAsCjB;AAwDD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,EAAE,MAAM,GACf,aAAa,GAAG,IAAI,CA2DtB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,SAAS,EACd,QAAQ,EAAE,cAAc,EACxB,IAAI,CAAC,EAAE,MAAM,GACZ,gBAAgB,CAgClB;AA0TD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,SAAS,EACd,QAAQ,EAAE,cAAc,EACxB,IAAI,CAAC,EAAE,MAAM,GACZ,gBAAgB,CAQlB"}
|