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,483 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Go Struct Extractor
|
|
3
|
+
* Extracts struct and interface definitions from Go source code
|
|
4
|
+
* Updated: 2024-12-31 CRLF handling and pointer stripping
|
|
5
|
+
*/
|
|
6
|
+
import { TagParser } from './tag-parser.js';
|
|
7
|
+
/**
|
|
8
|
+
* StructExtractor class for parsing Go structs from source code
|
|
9
|
+
*/
|
|
10
|
+
export class StructExtractor {
|
|
11
|
+
tagParser;
|
|
12
|
+
constructor(tagParser) {
|
|
13
|
+
this.tagParser = tagParser || new TagParser();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Extract all structs from Go source code
|
|
17
|
+
*/
|
|
18
|
+
extract(content, filePath) {
|
|
19
|
+
const structs = [];
|
|
20
|
+
const lines = content.split('\n');
|
|
21
|
+
let i = 0;
|
|
22
|
+
while (i < lines.length) {
|
|
23
|
+
const line = lines[i];
|
|
24
|
+
// Match struct definition: type Name struct {
|
|
25
|
+
// Handle Windows CRLF by stripping trailing \r
|
|
26
|
+
const cleanLine = line.replace(/\r$/, '');
|
|
27
|
+
const structMatch = cleanLine.match(/^\s*type\s+([A-Z][a-zA-Z0-9_]*)\s+struct\s*\{/);
|
|
28
|
+
if (structMatch) {
|
|
29
|
+
const name = structMatch[1];
|
|
30
|
+
const description = this.extractComment(lines, i);
|
|
31
|
+
const startLine = i + 1;
|
|
32
|
+
// Find the closing brace
|
|
33
|
+
let braceCount = 1;
|
|
34
|
+
let j = i;
|
|
35
|
+
// Count opening brace on this line
|
|
36
|
+
const firstBraceIdx = line.indexOf('{');
|
|
37
|
+
if (firstBraceIdx >= 0) {
|
|
38
|
+
// Count any additional braces on the same line
|
|
39
|
+
for (let k = firstBraceIdx + 1; k < line.length; k++) {
|
|
40
|
+
if (line[k] === '{')
|
|
41
|
+
braceCount++;
|
|
42
|
+
if (line[k] === '}')
|
|
43
|
+
braceCount--;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
j++;
|
|
47
|
+
while (j < lines.length && braceCount > 0) {
|
|
48
|
+
const currentLine = lines[j];
|
|
49
|
+
for (const char of currentLine) {
|
|
50
|
+
if (char === '{')
|
|
51
|
+
braceCount++;
|
|
52
|
+
if (char === '}')
|
|
53
|
+
braceCount--;
|
|
54
|
+
}
|
|
55
|
+
j++;
|
|
56
|
+
}
|
|
57
|
+
// Extract struct body (lines between opening and closing brace)
|
|
58
|
+
const bodyLines = lines.slice(i + 1, j - 1);
|
|
59
|
+
const fields = this.parseStructFields(bodyLines);
|
|
60
|
+
const embeddedTypes = this.parseEmbeddedTypes(bodyLines);
|
|
61
|
+
structs.push({
|
|
62
|
+
name,
|
|
63
|
+
fields,
|
|
64
|
+
embeddedTypes,
|
|
65
|
+
description,
|
|
66
|
+
sourceLocation: filePath
|
|
67
|
+
? { file: filePath, line: startLine }
|
|
68
|
+
: undefined,
|
|
69
|
+
});
|
|
70
|
+
i = j;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
// Also match simple struct on one line: type Name struct{}
|
|
74
|
+
// Use cleanLine which has CRLF stripped
|
|
75
|
+
const emptyStructMatch = cleanLine.match(/^\s*type\s+([A-Z][a-zA-Z0-9_]*)\s+struct\s*\{\s*\}/);
|
|
76
|
+
if (emptyStructMatch) {
|
|
77
|
+
const name = emptyStructMatch[1];
|
|
78
|
+
const description = this.extractComment(lines, i);
|
|
79
|
+
structs.push({
|
|
80
|
+
name,
|
|
81
|
+
fields: [],
|
|
82
|
+
embeddedTypes: [],
|
|
83
|
+
description,
|
|
84
|
+
sourceLocation: filePath ? { file: filePath, line: i + 1 } : undefined,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
i++;
|
|
88
|
+
}
|
|
89
|
+
return structs;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Extract all interfaces from Go source code
|
|
93
|
+
*/
|
|
94
|
+
extractInterfaces(content, filePath) {
|
|
95
|
+
const interfaces = [];
|
|
96
|
+
const lines = content.split('\n');
|
|
97
|
+
let i = 0;
|
|
98
|
+
while (i < lines.length) {
|
|
99
|
+
// Handle Windows CRLF by stripping trailing \r
|
|
100
|
+
const line = lines[i].replace(/\r$/, '');
|
|
101
|
+
// Match empty interface FIRST: type Name interface{} (with or without space before {})
|
|
102
|
+
// Must check before multi-line interface to avoid mismatching
|
|
103
|
+
const emptyInterfaceMatch = line.match(/^\s*type\s+([A-Z][a-zA-Z0-9_]*)\s+interface\s*\{\}\s*$/);
|
|
104
|
+
if (emptyInterfaceMatch) {
|
|
105
|
+
const name = emptyInterfaceMatch[1];
|
|
106
|
+
const description = this.extractComment(lines, i);
|
|
107
|
+
interfaces.push({
|
|
108
|
+
name,
|
|
109
|
+
methods: [],
|
|
110
|
+
embeddedInterfaces: [],
|
|
111
|
+
description,
|
|
112
|
+
sourceLocation: filePath ? { file: filePath, line: i + 1 } : undefined,
|
|
113
|
+
});
|
|
114
|
+
i++;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
// Match interface definition: type Name interface {
|
|
118
|
+
const interfaceMatch = line.match(/^\s*type\s+([A-Z][a-zA-Z0-9_]*)\s+interface\s*\{/);
|
|
119
|
+
if (interfaceMatch) {
|
|
120
|
+
const name = interfaceMatch[1];
|
|
121
|
+
const description = this.extractComment(lines, i);
|
|
122
|
+
const startLine = i + 1;
|
|
123
|
+
// Find the closing brace
|
|
124
|
+
let braceCount = 1;
|
|
125
|
+
let j = i + 1;
|
|
126
|
+
while (j < lines.length && braceCount > 0) {
|
|
127
|
+
const currentLine = lines[j];
|
|
128
|
+
for (const char of currentLine) {
|
|
129
|
+
if (char === '{')
|
|
130
|
+
braceCount++;
|
|
131
|
+
if (char === '}')
|
|
132
|
+
braceCount--;
|
|
133
|
+
}
|
|
134
|
+
j++;
|
|
135
|
+
}
|
|
136
|
+
// Extract interface body
|
|
137
|
+
const bodyLines = lines.slice(i + 1, j - 1);
|
|
138
|
+
const { methods, embeddedInterfaces } = this.parseInterfaceMethods(bodyLines);
|
|
139
|
+
interfaces.push({
|
|
140
|
+
name,
|
|
141
|
+
methods,
|
|
142
|
+
embeddedInterfaces,
|
|
143
|
+
description,
|
|
144
|
+
sourceLocation: filePath
|
|
145
|
+
? { file: filePath, line: startLine }
|
|
146
|
+
: undefined,
|
|
147
|
+
});
|
|
148
|
+
i = j;
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
i++;
|
|
152
|
+
}
|
|
153
|
+
return interfaces;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Extract type aliases from Go source code
|
|
157
|
+
*/
|
|
158
|
+
extractTypeAliases(content) {
|
|
159
|
+
const aliases = [];
|
|
160
|
+
const lines = content.split('\n');
|
|
161
|
+
for (const rawLine of lines) {
|
|
162
|
+
// Trim to handle Windows line endings (\r\n)
|
|
163
|
+
const line = rawLine.trim();
|
|
164
|
+
// Match type alias: type Name = OtherType
|
|
165
|
+
const aliasMatch = line.match(/^type\s+([A-Z][a-zA-Z0-9_]*)\s*=\s*(.+)$/);
|
|
166
|
+
if (aliasMatch) {
|
|
167
|
+
aliases.push({
|
|
168
|
+
name: aliasMatch[1],
|
|
169
|
+
underlyingType: aliasMatch[2].trim(),
|
|
170
|
+
});
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
// Match type definition: type Name OtherType (not struct/interface)
|
|
174
|
+
// This handles simple types like: type UserID int64
|
|
175
|
+
// And complex types like: type MetaMap map[string]interface{}
|
|
176
|
+
const typeDefMatch = line.match(/^type\s+([A-Z][a-zA-Z0-9_]*)\s+(.+)$/);
|
|
177
|
+
if (typeDefMatch) {
|
|
178
|
+
const underlying = typeDefMatch[2].trim();
|
|
179
|
+
// Skip if it's a struct or interface definition
|
|
180
|
+
if (underlying === 'struct' || underlying === 'interface' ||
|
|
181
|
+
underlying === 'struct {' || underlying === 'interface {' ||
|
|
182
|
+
underlying.startsWith('struct{') || underlying.startsWith('interface{') ||
|
|
183
|
+
underlying.startsWith('struct {') || underlying.startsWith('interface {')) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
aliases.push({
|
|
187
|
+
name: typeDefMatch[1],
|
|
188
|
+
underlyingType: underlying,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return aliases;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Parse struct fields from lines of struct body
|
|
196
|
+
*/
|
|
197
|
+
parseStructFields(bodyLines) {
|
|
198
|
+
const fields = [];
|
|
199
|
+
for (let i = 0; i < bodyLines.length; i++) {
|
|
200
|
+
const line = bodyLines[i];
|
|
201
|
+
// Skip empty lines and comments - also handle CRLF
|
|
202
|
+
const trimmed = line.replace(/\r$/, '').trim();
|
|
203
|
+
if (!trimmed || trimmed.startsWith('//') || trimmed === '}') {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
// Try to parse field with struct tag
|
|
207
|
+
const field = this.parseFieldLine(line, bodyLines, i);
|
|
208
|
+
if (field) {
|
|
209
|
+
fields.push(field);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return fields;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Parse a single field line
|
|
216
|
+
*/
|
|
217
|
+
parseFieldLine(line, bodyLines, lineIndex) {
|
|
218
|
+
const trimmed = line.trim();
|
|
219
|
+
// Skip unexported (lowercase) fields, empty lines, closing brace
|
|
220
|
+
if (!trimmed || trimmed === '}' || trimmed.startsWith('//')) {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
// Check if line contains a field (starts with uppercase letter)
|
|
224
|
+
const firstChar = trimmed[0];
|
|
225
|
+
if (!(firstChar >= 'A' && firstChar <= 'Z')) {
|
|
226
|
+
// Private field or embedded type - skip for now
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
// Parse field line - can have backtick tags
|
|
230
|
+
// Format: FieldName Type `tags`
|
|
231
|
+
// Or: FieldName Type // comment
|
|
232
|
+
// Or: FieldName Type
|
|
233
|
+
let goName;
|
|
234
|
+
let goType;
|
|
235
|
+
let tagString = '';
|
|
236
|
+
// Check if line has backtick tags
|
|
237
|
+
const backtickIndex = trimmed.indexOf('`');
|
|
238
|
+
if (backtickIndex > 0) {
|
|
239
|
+
// Extract tag string between backticks
|
|
240
|
+
const lastBacktickIndex = trimmed.lastIndexOf('`');
|
|
241
|
+
if (lastBacktickIndex > backtickIndex) {
|
|
242
|
+
tagString = trimmed.substring(backtickIndex + 1, lastBacktickIndex);
|
|
243
|
+
}
|
|
244
|
+
// Parse name and type before the backtick
|
|
245
|
+
const beforeTag = trimmed.substring(0, backtickIndex).trim();
|
|
246
|
+
const parts = beforeTag.split(/\s+/);
|
|
247
|
+
if (parts.length >= 2) {
|
|
248
|
+
goName = parts[0];
|
|
249
|
+
goType = parts.slice(1).join(' ').trim();
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
// No tags - just name and type
|
|
257
|
+
// Check for inline comment
|
|
258
|
+
let lineWithoutComment = trimmed;
|
|
259
|
+
const commentIdx = trimmed.indexOf('//');
|
|
260
|
+
if (commentIdx > 0) {
|
|
261
|
+
lineWithoutComment = trimmed.substring(0, commentIdx).trim();
|
|
262
|
+
}
|
|
263
|
+
const parts = lineWithoutComment.split(/\s+/);
|
|
264
|
+
if (parts.length >= 2) {
|
|
265
|
+
goName = parts[0];
|
|
266
|
+
goType = parts.slice(1).join(' ').trim();
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Verify it's an exported field (starts with uppercase)
|
|
273
|
+
if (!goName || !(goName[0] >= 'A' && goName[0] <= 'Z')) {
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
// Parse tags if present
|
|
277
|
+
const tags = tagString ? this.tagParser.parseFieldTags('`' + tagString + '`') : {
|
|
278
|
+
json: undefined,
|
|
279
|
+
validate: undefined,
|
|
280
|
+
};
|
|
281
|
+
// Skip if json:"-"
|
|
282
|
+
if (tags.json?.skip) {
|
|
283
|
+
return {
|
|
284
|
+
name: goName,
|
|
285
|
+
jsonName: goName,
|
|
286
|
+
goType,
|
|
287
|
+
isPointer: goType.startsWith('*'),
|
|
288
|
+
omitempty: false,
|
|
289
|
+
skip: true,
|
|
290
|
+
validateRequired: false,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
// Determine JSON name
|
|
294
|
+
let jsonName = goName;
|
|
295
|
+
if (tags.json?.name) {
|
|
296
|
+
jsonName = tags.json.name;
|
|
297
|
+
}
|
|
298
|
+
return {
|
|
299
|
+
name: goName,
|
|
300
|
+
jsonName,
|
|
301
|
+
goType,
|
|
302
|
+
isPointer: goType.startsWith('*'),
|
|
303
|
+
omitempty: tags.json?.omitempty ?? false,
|
|
304
|
+
skip: false,
|
|
305
|
+
validateRequired: tags.validate?.required ?? false,
|
|
306
|
+
description: this.extractFieldComment(bodyLines, lineIndex),
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Parse embedded types from lines of struct body
|
|
311
|
+
*/
|
|
312
|
+
parseEmbeddedTypes(bodyLines) {
|
|
313
|
+
const embedded = [];
|
|
314
|
+
for (const line of bodyLines) {
|
|
315
|
+
// Remove trailing \r for Windows CRLF line endings
|
|
316
|
+
const trimmed = line.replace(/\r$/, '').trim();
|
|
317
|
+
// Skip empty lines and comments
|
|
318
|
+
if (!trimmed || trimmed.startsWith('//') || trimmed === '}') {
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
// Match embedded type: just a type name (or *TypeName)
|
|
322
|
+
// An embedded type line has only the type name, possibly with a pointer prefix
|
|
323
|
+
// Must not have a second word (that would be a field name followed by type)
|
|
324
|
+
// May have a trailing comment after the type name
|
|
325
|
+
// First, strip any trailing comment
|
|
326
|
+
let lineForEmbedCheck = trimmed;
|
|
327
|
+
const commentIdx = trimmed.indexOf('//');
|
|
328
|
+
if (commentIdx > 0) {
|
|
329
|
+
lineForEmbedCheck = trimmed.substring(0, commentIdx).trim();
|
|
330
|
+
}
|
|
331
|
+
const embeddedMatch = lineForEmbedCheck.match(/^(\*?[A-Z][a-zA-Z0-9_]*(?:\.[A-Z][a-zA-Z0-9_]*)?)\s*$/);
|
|
332
|
+
if (embeddedMatch) {
|
|
333
|
+
embedded.push(embeddedMatch[1]);
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
// Also match embedded interface types like io.Reader
|
|
337
|
+
const pkgEmbeddedMatch = trimmed.match(/^([a-z]+\.[A-Z][a-zA-Z0-9_]*)\s*$/);
|
|
338
|
+
if (pkgEmbeddedMatch) {
|
|
339
|
+
embedded.push(pkgEmbeddedMatch[1]);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return embedded;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Parse interface methods from lines of interface body
|
|
346
|
+
*/
|
|
347
|
+
parseInterfaceMethods(bodyLines) {
|
|
348
|
+
const methods = [];
|
|
349
|
+
const embeddedInterfaces = [];
|
|
350
|
+
for (const line of bodyLines) {
|
|
351
|
+
// Skip empty lines and comments
|
|
352
|
+
const trimmed = line.trim();
|
|
353
|
+
if (!trimmed || trimmed.startsWith('//') || trimmed === '}') {
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
// Match method: MethodName(params) (returns)
|
|
357
|
+
const methodMatch = trimmed.match(/^([A-Z][a-zA-Z0-9_]*)\s*\(([^)]*)\)\s*(?:\(([^)]*)\)|([^\s(][^\s]*))?/);
|
|
358
|
+
if (methodMatch) {
|
|
359
|
+
const methodName = methodMatch[1];
|
|
360
|
+
const paramsStr = methodMatch[2];
|
|
361
|
+
const returnsMulti = methodMatch[3];
|
|
362
|
+
const returnsSingle = methodMatch[4];
|
|
363
|
+
// Parse parameters
|
|
364
|
+
const parameters = this.parseMethodParams(paramsStr);
|
|
365
|
+
// Parse return types
|
|
366
|
+
let returnType;
|
|
367
|
+
if (returnsMulti) {
|
|
368
|
+
returnType = this.parseReturnTypes(returnsMulti);
|
|
369
|
+
}
|
|
370
|
+
else if (returnsSingle) {
|
|
371
|
+
returnType = [returnsSingle.trim()];
|
|
372
|
+
}
|
|
373
|
+
methods.push({
|
|
374
|
+
name: methodName,
|
|
375
|
+
parameters: parameters.length > 0 ? parameters : undefined,
|
|
376
|
+
returnType,
|
|
377
|
+
});
|
|
378
|
+
continue;
|
|
379
|
+
}
|
|
380
|
+
// Match embedded interface: just a type name (io.Reader, Closer, etc.)
|
|
381
|
+
const embeddedMatch = trimmed.match(/^([a-zA-Z]+(?:\.[A-Z][a-zA-Z0-9_]*)?)$/);
|
|
382
|
+
if (embeddedMatch && !trimmed.includes('(')) {
|
|
383
|
+
embeddedInterfaces.push(embeddedMatch[1]);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return { methods, embeddedInterfaces };
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Parse method parameters from parameter string
|
|
390
|
+
*/
|
|
391
|
+
parseMethodParams(paramsStr) {
|
|
392
|
+
if (!paramsStr.trim()) {
|
|
393
|
+
return [];
|
|
394
|
+
}
|
|
395
|
+
const params = [];
|
|
396
|
+
const parts = paramsStr.split(',');
|
|
397
|
+
for (const part of parts) {
|
|
398
|
+
const trimmed = part.trim();
|
|
399
|
+
if (!trimmed)
|
|
400
|
+
continue;
|
|
401
|
+
// Match "name Type" or "name, name2 Type"
|
|
402
|
+
const match = trimmed.match(/^([a-zA-Z_][a-zA-Z0-9_]*)/);
|
|
403
|
+
if (match) {
|
|
404
|
+
params.push(match[1]);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
return params;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Parse return types from return string
|
|
411
|
+
*/
|
|
412
|
+
parseReturnTypes(returnsStr) {
|
|
413
|
+
if (!returnsStr.trim()) {
|
|
414
|
+
return [];
|
|
415
|
+
}
|
|
416
|
+
const returns = [];
|
|
417
|
+
const parts = returnsStr.split(',');
|
|
418
|
+
for (const part of parts) {
|
|
419
|
+
const trimmed = part.trim();
|
|
420
|
+
if (!trimmed)
|
|
421
|
+
continue;
|
|
422
|
+
// Return might be "name Type" or just "Type"
|
|
423
|
+
// Extract the type (last word, or pointer type, or interface type)
|
|
424
|
+
const typeMatch = trimmed.match(/(?:[a-zA-Z_][a-zA-Z0-9_]*\s+)?(\*?[a-zA-Z_][a-zA-Z0-9_]*(?:\[[^\]]*\])?)/);
|
|
425
|
+
if (typeMatch) {
|
|
426
|
+
let typeName = typeMatch[1];
|
|
427
|
+
// Strip pointer prefix for cleaner type representation
|
|
428
|
+
// The test expects 'UserEntity' not '*UserEntity'
|
|
429
|
+
if (typeName.startsWith('*')) {
|
|
430
|
+
typeName = typeName.slice(1);
|
|
431
|
+
}
|
|
432
|
+
returns.push(typeName);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
return returns;
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Extract comment above a struct/interface definition
|
|
439
|
+
*/
|
|
440
|
+
extractComment(lines, lineIndex) {
|
|
441
|
+
const comments = [];
|
|
442
|
+
let i = lineIndex - 1;
|
|
443
|
+
while (i >= 0) {
|
|
444
|
+
const line = lines[i].trim();
|
|
445
|
+
if (line.startsWith('//')) {
|
|
446
|
+
comments.unshift(line.slice(2).trim());
|
|
447
|
+
i--;
|
|
448
|
+
}
|
|
449
|
+
else if (line.startsWith('/*') || line.endsWith('*/')) {
|
|
450
|
+
// Skip block comments for now
|
|
451
|
+
break;
|
|
452
|
+
}
|
|
453
|
+
else if (line === '') {
|
|
454
|
+
// Empty line - stop looking
|
|
455
|
+
break;
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
break;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
return comments.length > 0 ? comments.join(' ') : undefined;
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Extract inline comment for a field
|
|
465
|
+
*/
|
|
466
|
+
extractFieldComment(bodyLines, lineIndex) {
|
|
467
|
+
const line = bodyLines[lineIndex];
|
|
468
|
+
// Check for inline comment: Field Type // comment
|
|
469
|
+
const inlineMatch = line.match(/\/\/\s*(.+)$/);
|
|
470
|
+
if (inlineMatch) {
|
|
471
|
+
return inlineMatch[1].trim();
|
|
472
|
+
}
|
|
473
|
+
// Check for comment on previous line
|
|
474
|
+
if (lineIndex > 0) {
|
|
475
|
+
const prevLine = bodyLines[lineIndex - 1].trim();
|
|
476
|
+
if (prevLine.startsWith('//')) {
|
|
477
|
+
return prevLine.slice(2).trim();
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
return undefined;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
//# sourceMappingURL=struct-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"struct-extractor.js","sourceRoot":"","sources":["../../../src/languages/go/struct-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Go Struct Tag Parser
|
|
3
|
+
* Parses Go struct tags like `json:"name,omitempty"`
|
|
4
|
+
*/
|
|
5
|
+
import type { ParsedTag } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Parse a complete struct tag string (e.g., `json:"name,omitempty" db:"col"`)
|
|
8
|
+
* and extract the json tag value
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseStructTags(tagString: string): {
|
|
11
|
+
json?: ParsedTag;
|
|
12
|
+
validate?: {
|
|
13
|
+
required: boolean;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Parse a JSON tag value (the part inside the quotes)
|
|
18
|
+
* Examples:
|
|
19
|
+
* "name" -> { name: 'name', omitempty: false, skip: false }
|
|
20
|
+
* "name,omitempty" -> { name: 'name', omitempty: true, skip: false }
|
|
21
|
+
* "-" -> { name: '', omitempty: false, skip: true }
|
|
22
|
+
* ",omitempty" -> { name: '', omitempty: true, skip: false }
|
|
23
|
+
* ",string" -> { name: '', omitempty: false, skip: false, asString: true }
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseJsonTag(tagValue: string): ParsedTag;
|
|
26
|
+
/**
|
|
27
|
+
* Extract the raw tag string from a Go struct field line
|
|
28
|
+
* Returns the content between backticks
|
|
29
|
+
*/
|
|
30
|
+
export declare function extractTagString(fieldLine: string): string | null;
|
|
31
|
+
/**
|
|
32
|
+
* Class wrapper for tag parsing with stateful operations
|
|
33
|
+
*/
|
|
34
|
+
export declare class TagParser {
|
|
35
|
+
/**
|
|
36
|
+
* Parse struct tags from a field line
|
|
37
|
+
*/
|
|
38
|
+
parseFieldTags(fieldLine: string): {
|
|
39
|
+
json?: ParsedTag;
|
|
40
|
+
validate?: {
|
|
41
|
+
required: boolean;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Get the JSON property name for a field
|
|
46
|
+
* Returns the json tag name, or falls back to the Go field name
|
|
47
|
+
*/
|
|
48
|
+
getJsonName(goFieldName: string, fieldLine: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Check if a field should be skipped in JSON serialization
|
|
51
|
+
*/
|
|
52
|
+
shouldSkip(fieldLine: string): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Check if a field has omitempty option
|
|
55
|
+
*/
|
|
56
|
+
hasOmitempty(fieldLine: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Check if a field has validate:"required"
|
|
59
|
+
*/
|
|
60
|
+
isValidateRequired(fieldLine: string): boolean;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=tag-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag-parser.d.ts","sourceRoot":"","sources":["../../../src/languages/go/tag-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG;IAClD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;CAClC,CAkBA;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAgBxD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGjE;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB;;OAEG;IACH,cAAc,CACZ,SAAS,EAAE,MAAM,GAChB;QAAE,IAAI,CAAC,EAAE,SAAS,CAAC;QAAC,QAAQ,CAAC,EAAE;YAAE,QAAQ,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE;IAQzD;;;OAGG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAY3D;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAKtC;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAKxC;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;CAI/C"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Go Struct Tag Parser
|
|
3
|
+
* Parses Go struct tags like `json:"name,omitempty"`
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Parse a complete struct tag string (e.g., `json:"name,omitempty" db:"col"`)
|
|
7
|
+
* and extract the json tag value
|
|
8
|
+
*/
|
|
9
|
+
export function parseStructTags(tagString) {
|
|
10
|
+
const result = {};
|
|
11
|
+
// Match json tag: json:"value" or json:`value`
|
|
12
|
+
const jsonMatch = tagString.match(/json:"([^"]*)"/) || tagString.match(/json:`([^`]*)`/);
|
|
13
|
+
if (jsonMatch) {
|
|
14
|
+
result.json = parseJsonTag(jsonMatch[1]);
|
|
15
|
+
}
|
|
16
|
+
// Match validate tag for required
|
|
17
|
+
const validateMatch = tagString.match(/validate:"([^"]*)"/);
|
|
18
|
+
if (validateMatch) {
|
|
19
|
+
result.validate = {
|
|
20
|
+
required: validateMatch[1].split(',').includes('required'),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Parse a JSON tag value (the part inside the quotes)
|
|
27
|
+
* Examples:
|
|
28
|
+
* "name" -> { name: 'name', omitempty: false, skip: false }
|
|
29
|
+
* "name,omitempty" -> { name: 'name', omitempty: true, skip: false }
|
|
30
|
+
* "-" -> { name: '', omitempty: false, skip: true }
|
|
31
|
+
* ",omitempty" -> { name: '', omitempty: true, skip: false }
|
|
32
|
+
* ",string" -> { name: '', omitempty: false, skip: false, asString: true }
|
|
33
|
+
*/
|
|
34
|
+
export function parseJsonTag(tagValue) {
|
|
35
|
+
// Check for skip
|
|
36
|
+
if (tagValue === '-') {
|
|
37
|
+
return { name: '', omitempty: false, skip: true, asString: false };
|
|
38
|
+
}
|
|
39
|
+
const parts = tagValue.split(',');
|
|
40
|
+
const name = parts[0] || '';
|
|
41
|
+
const options = parts.slice(1);
|
|
42
|
+
return {
|
|
43
|
+
name,
|
|
44
|
+
omitempty: options.includes('omitempty'),
|
|
45
|
+
skip: false,
|
|
46
|
+
asString: options.includes('string'),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Extract the raw tag string from a Go struct field line
|
|
51
|
+
* Returns the content between backticks
|
|
52
|
+
*/
|
|
53
|
+
export function extractTagString(fieldLine) {
|
|
54
|
+
const match = fieldLine.match(/`([^`]+)`/);
|
|
55
|
+
return match ? match[1] : null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Class wrapper for tag parsing with stateful operations
|
|
59
|
+
*/
|
|
60
|
+
export class TagParser {
|
|
61
|
+
/**
|
|
62
|
+
* Parse struct tags from a field line
|
|
63
|
+
*/
|
|
64
|
+
parseFieldTags(fieldLine) {
|
|
65
|
+
const tagString = extractTagString(fieldLine);
|
|
66
|
+
if (!tagString) {
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
return parseStructTags(tagString);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get the JSON property name for a field
|
|
73
|
+
* Returns the json tag name, or falls back to the Go field name
|
|
74
|
+
*/
|
|
75
|
+
getJsonName(goFieldName, fieldLine) {
|
|
76
|
+
const tags = this.parseFieldTags(fieldLine);
|
|
77
|
+
if (tags.json?.skip) {
|
|
78
|
+
return ''; // Will be skipped
|
|
79
|
+
}
|
|
80
|
+
if (tags.json?.name) {
|
|
81
|
+
return tags.json.name;
|
|
82
|
+
}
|
|
83
|
+
// Fall back to Go field name
|
|
84
|
+
return goFieldName;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check if a field should be skipped in JSON serialization
|
|
88
|
+
*/
|
|
89
|
+
shouldSkip(fieldLine) {
|
|
90
|
+
const tags = this.parseFieldTags(fieldLine);
|
|
91
|
+
return tags.json?.skip ?? false;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Check if a field has omitempty option
|
|
95
|
+
*/
|
|
96
|
+
hasOmitempty(fieldLine) {
|
|
97
|
+
const tags = this.parseFieldTags(fieldLine);
|
|
98
|
+
return tags.json?.omitempty ?? false;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Check if a field has validate:"required"
|
|
102
|
+
*/
|
|
103
|
+
isValidateRequired(fieldLine) {
|
|
104
|
+
const tags = this.parseFieldTags(fieldLine);
|
|
105
|
+
return tags.validate?.required ?? false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=tag-parser.js.map
|