mnehmos.trace.mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1662 -0
  3. package/dist/adapters/bootstrap.d.ts +29 -0
  4. package/dist/adapters/bootstrap.d.ts.map +1 -0
  5. package/dist/adapters/bootstrap.js +46 -0
  6. package/dist/adapters/bootstrap.js.map +1 -0
  7. package/dist/adapters/errors.d.ts +94 -0
  8. package/dist/adapters/errors.d.ts.map +1 -0
  9. package/dist/adapters/errors.js +107 -0
  10. package/dist/adapters/errors.js.map +1 -0
  11. package/dist/adapters/graphql/index.d.ts +9 -0
  12. package/dist/adapters/graphql/index.d.ts.map +1 -0
  13. package/dist/adapters/graphql/index.js +9 -0
  14. package/dist/adapters/graphql/index.js.map +1 -0
  15. package/dist/adapters/graphql/sdl-parser.d.ts +74 -0
  16. package/dist/adapters/graphql/sdl-parser.d.ts.map +1 -0
  17. package/dist/adapters/graphql/sdl-parser.js +559 -0
  18. package/dist/adapters/graphql/sdl-parser.js.map +1 -0
  19. package/dist/adapters/grpc/adapter.d.ts +76 -0
  20. package/dist/adapters/grpc/adapter.d.ts.map +1 -0
  21. package/dist/adapters/grpc/adapter.js +362 -0
  22. package/dist/adapters/grpc/adapter.js.map +1 -0
  23. package/dist/adapters/grpc/index.d.ts +10 -0
  24. package/dist/adapters/grpc/index.d.ts.map +1 -0
  25. package/dist/adapters/grpc/index.js +12 -0
  26. package/dist/adapters/grpc/index.js.map +1 -0
  27. package/dist/adapters/grpc/proto-parser.d.ts +76 -0
  28. package/dist/adapters/grpc/proto-parser.d.ts.map +1 -0
  29. package/dist/adapters/grpc/proto-parser.js +523 -0
  30. package/dist/adapters/grpc/proto-parser.js.map +1 -0
  31. package/dist/adapters/grpc/type-converter.d.ts +43 -0
  32. package/dist/adapters/grpc/type-converter.d.ts.map +1 -0
  33. package/dist/adapters/grpc/type-converter.js +270 -0
  34. package/dist/adapters/grpc/type-converter.js.map +1 -0
  35. package/dist/adapters/grpc/types.d.ts +85 -0
  36. package/dist/adapters/grpc/types.d.ts.map +1 -0
  37. package/dist/adapters/grpc/types.js +7 -0
  38. package/dist/adapters/grpc/types.js.map +1 -0
  39. package/dist/adapters/index.d.ts +39 -0
  40. package/dist/adapters/index.d.ts.map +1 -0
  41. package/dist/adapters/index.js +50 -0
  42. package/dist/adapters/index.js.map +1 -0
  43. package/dist/adapters/mcp.d.ts +23 -0
  44. package/dist/adapters/mcp.d.ts.map +1 -0
  45. package/dist/adapters/mcp.js +293 -0
  46. package/dist/adapters/mcp.js.map +1 -0
  47. package/dist/adapters/openapi/adapter.d.ts +213 -0
  48. package/dist/adapters/openapi/adapter.d.ts.map +1 -0
  49. package/dist/adapters/openapi/adapter.js +557 -0
  50. package/dist/adapters/openapi/adapter.js.map +1 -0
  51. package/dist/adapters/openapi/convert.d.ts +120 -0
  52. package/dist/adapters/openapi/convert.d.ts.map +1 -0
  53. package/dist/adapters/openapi/convert.js +363 -0
  54. package/dist/adapters/openapi/convert.js.map +1 -0
  55. package/dist/adapters/openapi/index.d.ts +39 -0
  56. package/dist/adapters/openapi/index.d.ts.map +1 -0
  57. package/dist/adapters/openapi/index.js +48 -0
  58. package/dist/adapters/openapi/index.js.map +1 -0
  59. package/dist/adapters/openapi/parser.d.ts +95 -0
  60. package/dist/adapters/openapi/parser.d.ts.map +1 -0
  61. package/dist/adapters/openapi/parser.js +171 -0
  62. package/dist/adapters/openapi/parser.js.map +1 -0
  63. package/dist/adapters/registry.d.ts +116 -0
  64. package/dist/adapters/registry.d.ts.map +1 -0
  65. package/dist/adapters/registry.js +246 -0
  66. package/dist/adapters/registry.js.map +1 -0
  67. package/dist/adapters/trpc/adapter.d.ts +159 -0
  68. package/dist/adapters/trpc/adapter.d.ts.map +1 -0
  69. package/dist/adapters/trpc/adapter.js +223 -0
  70. package/dist/adapters/trpc/adapter.js.map +1 -0
  71. package/dist/adapters/trpc/extractor.d.ts +218 -0
  72. package/dist/adapters/trpc/extractor.d.ts.map +1 -0
  73. package/dist/adapters/trpc/extractor.js +708 -0
  74. package/dist/adapters/trpc/extractor.js.map +1 -0
  75. package/dist/adapters/trpc/index.d.ts +31 -0
  76. package/dist/adapters/trpc/index.d.ts.map +1 -0
  77. package/dist/adapters/trpc/index.js +40 -0
  78. package/dist/adapters/trpc/index.js.map +1 -0
  79. package/dist/adapters/trpc/parser.d.ts +119 -0
  80. package/dist/adapters/trpc/parser.d.ts.map +1 -0
  81. package/dist/adapters/trpc/parser.js +128 -0
  82. package/dist/adapters/trpc/parser.js.map +1 -0
  83. package/dist/compare/index.d.ts +33 -0
  84. package/dist/compare/index.d.ts.map +1 -0
  85. package/dist/compare/index.js +261 -0
  86. package/dist/compare/index.js.map +1 -0
  87. package/dist/core/types.d.ts +188 -0
  88. package/dist/core/types.d.ts.map +1 -0
  89. package/dist/core/types.js +9 -0
  90. package/dist/core/types.js.map +1 -0
  91. package/dist/extract/index.d.ts +26 -0
  92. package/dist/extract/index.d.ts.map +1 -0
  93. package/dist/extract/index.js +44 -0
  94. package/dist/extract/index.js.map +1 -0
  95. package/dist/index.d.ts +9 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +674 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/languages/base.d.ts +57 -0
  100. package/dist/languages/base.d.ts.map +1 -0
  101. package/dist/languages/base.js +6 -0
  102. package/dist/languages/base.js.map +1 -0
  103. package/dist/languages/bootstrap.d.ts +10 -0
  104. package/dist/languages/bootstrap.d.ts.map +1 -0
  105. package/dist/languages/bootstrap.js +25 -0
  106. package/dist/languages/bootstrap.js.map +1 -0
  107. package/dist/languages/go/handlers/chi.d.ts +24 -0
  108. package/dist/languages/go/handlers/chi.d.ts.map +1 -0
  109. package/dist/languages/go/handlers/chi.js +205 -0
  110. package/dist/languages/go/handlers/chi.js.map +1 -0
  111. package/dist/languages/go/handlers/gin.d.ts +24 -0
  112. package/dist/languages/go/handlers/gin.d.ts.map +1 -0
  113. package/dist/languages/go/handlers/gin.js +156 -0
  114. package/dist/languages/go/handlers/gin.js.map +1 -0
  115. package/dist/languages/go/handlers/stdlib.d.ts +19 -0
  116. package/dist/languages/go/handlers/stdlib.d.ts.map +1 -0
  117. package/dist/languages/go/handlers/stdlib.js +112 -0
  118. package/dist/languages/go/handlers/stdlib.js.map +1 -0
  119. package/dist/languages/go/index.d.ts +18 -0
  120. package/dist/languages/go/index.d.ts.map +1 -0
  121. package/dist/languages/go/index.js +20 -0
  122. package/dist/languages/go/index.js.map +1 -0
  123. package/dist/languages/go/parser.d.ts +33 -0
  124. package/dist/languages/go/parser.d.ts.map +1 -0
  125. package/dist/languages/go/parser.js +95 -0
  126. package/dist/languages/go/parser.js.map +1 -0
  127. package/dist/languages/go/struct-extractor.d.ts +59 -0
  128. package/dist/languages/go/struct-extractor.d.ts.map +1 -0
  129. package/dist/languages/go/struct-extractor.js +483 -0
  130. package/dist/languages/go/struct-extractor.js.map +1 -0
  131. package/dist/languages/go/tag-parser.d.ts +62 -0
  132. package/dist/languages/go/tag-parser.d.ts.map +1 -0
  133. package/dist/languages/go/tag-parser.js +108 -0
  134. package/dist/languages/go/tag-parser.js.map +1 -0
  135. package/dist/languages/go/type-converter.d.ts +32 -0
  136. package/dist/languages/go/type-converter.d.ts.map +1 -0
  137. package/dist/languages/go/type-converter.js +226 -0
  138. package/dist/languages/go/type-converter.js.map +1 -0
  139. package/dist/languages/go/types.d.ts +153 -0
  140. package/dist/languages/go/types.d.ts.map +1 -0
  141. package/dist/languages/go/types.js +6 -0
  142. package/dist/languages/go/types.js.map +1 -0
  143. package/dist/languages/import-resolver.d.ts +645 -0
  144. package/dist/languages/import-resolver.d.ts.map +1 -0
  145. package/dist/languages/import-resolver.js +1278 -0
  146. package/dist/languages/import-resolver.js.map +1 -0
  147. package/dist/languages/index.d.ts +34 -0
  148. package/dist/languages/index.d.ts.map +1 -0
  149. package/dist/languages/index.js +93 -0
  150. package/dist/languages/index.js.map +1 -0
  151. package/dist/languages/json-schema.d.ts +40 -0
  152. package/dist/languages/json-schema.d.ts.map +1 -0
  153. package/dist/languages/json-schema.js +188 -0
  154. package/dist/languages/json-schema.js.map +1 -0
  155. package/dist/languages/python-ast/index.d.ts +8 -0
  156. package/dist/languages/python-ast/index.d.ts.map +1 -0
  157. package/dist/languages/python-ast/index.js +7 -0
  158. package/dist/languages/python-ast/index.js.map +1 -0
  159. package/dist/languages/python-ast/parser.d.ts +174 -0
  160. package/dist/languages/python-ast/parser.d.ts.map +1 -0
  161. package/dist/languages/python-ast/parser.js +1205 -0
  162. package/dist/languages/python-ast/parser.js.map +1 -0
  163. package/dist/languages/python-ast/type-resolver.d.ts +75 -0
  164. package/dist/languages/python-ast/type-resolver.d.ts.map +1 -0
  165. package/dist/languages/python-ast/type-resolver.js +421 -0
  166. package/dist/languages/python-ast/type-resolver.js.map +1 -0
  167. package/dist/languages/python-ast/types.d.ts +216 -0
  168. package/dist/languages/python-ast/types.d.ts.map +1 -0
  169. package/dist/languages/python-ast/types.js +6 -0
  170. package/dist/languages/python-ast/types.js.map +1 -0
  171. package/dist/languages/python.d.ts +55 -0
  172. package/dist/languages/python.d.ts.map +1 -0
  173. package/dist/languages/python.js +311 -0
  174. package/dist/languages/python.js.map +1 -0
  175. package/dist/languages/typescript.d.ts +272 -0
  176. package/dist/languages/typescript.d.ts.map +1 -0
  177. package/dist/languages/typescript.js +1381 -0
  178. package/dist/languages/typescript.js.map +1 -0
  179. package/dist/patterns/base.d.ts +146 -0
  180. package/dist/patterns/base.d.ts.map +1 -0
  181. package/dist/patterns/base.js +89 -0
  182. package/dist/patterns/base.js.map +1 -0
  183. package/dist/patterns/errors.d.ts +172 -0
  184. package/dist/patterns/errors.d.ts.map +1 -0
  185. package/dist/patterns/errors.js +185 -0
  186. package/dist/patterns/errors.js.map +1 -0
  187. package/dist/patterns/extractors.d.ts +170 -0
  188. package/dist/patterns/extractors.d.ts.map +1 -0
  189. package/dist/patterns/extractors.js +305 -0
  190. package/dist/patterns/extractors.js.map +1 -0
  191. package/dist/patterns/graphql/apollo-client.d.ts +80 -0
  192. package/dist/patterns/graphql/apollo-client.d.ts.map +1 -0
  193. package/dist/patterns/graphql/apollo-client.js +800 -0
  194. package/dist/patterns/graphql/apollo-client.js.map +1 -0
  195. package/dist/patterns/graphql/apollo-server.d.ts +55 -0
  196. package/dist/patterns/graphql/apollo-server.d.ts.map +1 -0
  197. package/dist/patterns/graphql/apollo-server.js +523 -0
  198. package/dist/patterns/graphql/apollo-server.js.map +1 -0
  199. package/dist/patterns/graphql/index.d.ts +11 -0
  200. package/dist/patterns/graphql/index.d.ts.map +1 -0
  201. package/dist/patterns/graphql/index.js +12 -0
  202. package/dist/patterns/graphql/index.js.map +1 -0
  203. package/dist/patterns/graphql/types.d.ts +213 -0
  204. package/dist/patterns/graphql/types.d.ts.map +1 -0
  205. package/dist/patterns/graphql/types.js +16 -0
  206. package/dist/patterns/graphql/types.js.map +1 -0
  207. package/dist/patterns/http-clients/axios.d.ts +148 -0
  208. package/dist/patterns/http-clients/axios.d.ts.map +1 -0
  209. package/dist/patterns/http-clients/axios.js +652 -0
  210. package/dist/patterns/http-clients/axios.js.map +1 -0
  211. package/dist/patterns/http-clients/fetch.d.ts +88 -0
  212. package/dist/patterns/http-clients/fetch.d.ts.map +1 -0
  213. package/dist/patterns/http-clients/fetch.js +364 -0
  214. package/dist/patterns/http-clients/fetch.js.map +1 -0
  215. package/dist/patterns/http-clients/index.d.ts +36 -0
  216. package/dist/patterns/http-clients/index.d.ts.map +1 -0
  217. package/dist/patterns/http-clients/index.js +50 -0
  218. package/dist/patterns/http-clients/index.js.map +1 -0
  219. package/dist/patterns/http-clients/property-access.d.ts +46 -0
  220. package/dist/patterns/http-clients/property-access.d.ts.map +1 -0
  221. package/dist/patterns/http-clients/property-access.js +818 -0
  222. package/dist/patterns/http-clients/property-access.js.map +1 -0
  223. package/dist/patterns/http-clients/type-inference.d.ts +48 -0
  224. package/dist/patterns/http-clients/type-inference.d.ts.map +1 -0
  225. package/dist/patterns/http-clients/type-inference.js +293 -0
  226. package/dist/patterns/http-clients/type-inference.js.map +1 -0
  227. package/dist/patterns/http-clients/types.d.ts +168 -0
  228. package/dist/patterns/http-clients/types.d.ts.map +1 -0
  229. package/dist/patterns/http-clients/types.js +10 -0
  230. package/dist/patterns/http-clients/types.js.map +1 -0
  231. package/dist/patterns/http-clients/url-extractor.d.ts +53 -0
  232. package/dist/patterns/http-clients/url-extractor.d.ts.map +1 -0
  233. package/dist/patterns/http-clients/url-extractor.js +338 -0
  234. package/dist/patterns/http-clients/url-extractor.js.map +1 -0
  235. package/dist/patterns/index.d.ts +44 -0
  236. package/dist/patterns/index.d.ts.map +1 -0
  237. package/dist/patterns/index.js +49 -0
  238. package/dist/patterns/index.js.map +1 -0
  239. package/dist/patterns/python/aiohttp.d.ts +21 -0
  240. package/dist/patterns/python/aiohttp.d.ts.map +1 -0
  241. package/dist/patterns/python/aiohttp.js +188 -0
  242. package/dist/patterns/python/aiohttp.js.map +1 -0
  243. package/dist/patterns/python/httpx.d.ts +20 -0
  244. package/dist/patterns/python/httpx.d.ts.map +1 -0
  245. package/dist/patterns/python/httpx.js +183 -0
  246. package/dist/patterns/python/httpx.js.map +1 -0
  247. package/dist/patterns/python/index.d.ts +32 -0
  248. package/dist/patterns/python/index.d.ts.map +1 -0
  249. package/dist/patterns/python/index.js +63 -0
  250. package/dist/patterns/python/index.js.map +1 -0
  251. package/dist/patterns/python/property-access.d.ts +27 -0
  252. package/dist/patterns/python/property-access.d.ts.map +1 -0
  253. package/dist/patterns/python/property-access.js +132 -0
  254. package/dist/patterns/python/property-access.js.map +1 -0
  255. package/dist/patterns/python/requests.d.ts +19 -0
  256. package/dist/patterns/python/requests.d.ts.map +1 -0
  257. package/dist/patterns/python/requests.js +239 -0
  258. package/dist/patterns/python/requests.js.map +1 -0
  259. package/dist/patterns/python/types.d.ts +95 -0
  260. package/dist/patterns/python/types.d.ts.map +1 -0
  261. package/dist/patterns/python/types.js +43 -0
  262. package/dist/patterns/python/types.js.map +1 -0
  263. package/dist/patterns/registry.d.ts +181 -0
  264. package/dist/patterns/registry.d.ts.map +1 -0
  265. package/dist/patterns/registry.js +304 -0
  266. package/dist/patterns/registry.js.map +1 -0
  267. package/dist/patterns/rest/express.d.ts +78 -0
  268. package/dist/patterns/rest/express.d.ts.map +1 -0
  269. package/dist/patterns/rest/express.js +289 -0
  270. package/dist/patterns/rest/express.js.map +1 -0
  271. package/dist/patterns/rest/fastify.d.ts +93 -0
  272. package/dist/patterns/rest/fastify.d.ts.map +1 -0
  273. package/dist/patterns/rest/fastify.js +420 -0
  274. package/dist/patterns/rest/fastify.js.map +1 -0
  275. package/dist/patterns/rest/index.d.ts +31 -0
  276. package/dist/patterns/rest/index.d.ts.map +1 -0
  277. package/dist/patterns/rest/index.js +45 -0
  278. package/dist/patterns/rest/index.js.map +1 -0
  279. package/dist/patterns/rest/middleware.d.ts +25 -0
  280. package/dist/patterns/rest/middleware.d.ts.map +1 -0
  281. package/dist/patterns/rest/middleware.js +219 -0
  282. package/dist/patterns/rest/middleware.js.map +1 -0
  283. package/dist/patterns/rest/path-parser.d.ts +50 -0
  284. package/dist/patterns/rest/path-parser.d.ts.map +1 -0
  285. package/dist/patterns/rest/path-parser.js +137 -0
  286. package/dist/patterns/rest/path-parser.js.map +1 -0
  287. package/dist/patterns/rest/response-inference.d.ts +44 -0
  288. package/dist/patterns/rest/response-inference.d.ts.map +1 -0
  289. package/dist/patterns/rest/response-inference.js +218 -0
  290. package/dist/patterns/rest/response-inference.js.map +1 -0
  291. package/dist/patterns/rest/types.d.ts +102 -0
  292. package/dist/patterns/rest/types.d.ts.map +1 -0
  293. package/dist/patterns/rest/types.js +10 -0
  294. package/dist/patterns/rest/types.js.map +1 -0
  295. package/dist/patterns/types.d.ts +105 -0
  296. package/dist/patterns/types.d.ts.map +1 -0
  297. package/dist/patterns/types.js +11 -0
  298. package/dist/patterns/types.js.map +1 -0
  299. package/dist/report/index.d.ts +11 -0
  300. package/dist/report/index.d.ts.map +1 -0
  301. package/dist/report/index.js +55 -0
  302. package/dist/report/index.js.map +1 -0
  303. package/dist/tools/contract-comments.d.ts +48 -0
  304. package/dist/tools/contract-comments.d.ts.map +1 -0
  305. package/dist/tools/contract-comments.js +130 -0
  306. package/dist/tools/contract-comments.js.map +1 -0
  307. package/dist/tools/index.d.ts +6 -0
  308. package/dist/tools/index.d.ts.map +1 -0
  309. package/dist/tools/index.js +6 -0
  310. package/dist/tools/index.js.map +1 -0
  311. package/dist/tools/scaffold.d.ts +38 -0
  312. package/dist/tools/scaffold.d.ts.map +1 -0
  313. package/dist/tools/scaffold.js +373 -0
  314. package/dist/tools/scaffold.js.map +1 -0
  315. package/dist/trace/index.d.ts +28 -0
  316. package/dist/trace/index.d.ts.map +1 -0
  317. package/dist/trace/index.js +45 -0
  318. package/dist/trace/index.js.map +1 -0
  319. package/dist/types.d.ts +135 -0
  320. package/dist/types.d.ts.map +1 -0
  321. package/dist/types.js +22 -0
  322. package/dist/types.js.map +1 -0
  323. package/dist/watch/cache.d.ts +41 -0
  324. package/dist/watch/cache.d.ts.map +1 -0
  325. package/dist/watch/cache.js +230 -0
  326. package/dist/watch/cache.js.map +1 -0
  327. package/dist/watch/index.d.ts +9 -0
  328. package/dist/watch/index.d.ts.map +1 -0
  329. package/dist/watch/index.js +7 -0
  330. package/dist/watch/index.js.map +1 -0
  331. package/dist/watch/project.d.ts +128 -0
  332. package/dist/watch/project.d.ts.map +1 -0
  333. package/dist/watch/project.js +152 -0
  334. package/dist/watch/project.js.map +1 -0
  335. package/dist/watch/watcher.d.ts +76 -0
  336. package/dist/watch/watcher.d.ts.map +1 -0
  337. package/dist/watch/watcher.js +235 -0
  338. package/dist/watch/watcher.js.map +1 -0
  339. package/package.json +70 -0
@@ -0,0 +1,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