@decaf-ts/mcp-server 0.4.2 → 0.4.6

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 (536) hide show
  1. package/LICENSE.md +31 -0
  2. package/dist/mcp-server.cjs +2 -2360
  3. package/dist/mcp-server.cjs.map +1 -0
  4. package/dist/mcp-server.js +2 -0
  5. package/dist/mcp-server.js.map +1 -0
  6. package/lib/bin/cli.cjs +7 -35
  7. package/lib/bin/cli.js.map +1 -0
  8. package/lib/builders/builder.cjs +91 -0
  9. package/lib/builders/builder.d.ts +25 -0
  10. package/lib/builders/builder.js.map +1 -0
  11. package/lib/{mcp/resources → builders}/index.cjs +5 -2
  12. package/lib/builders/index.d.ts +4 -0
  13. package/lib/builders/index.js.map +1 -0
  14. package/lib/builders/prompt-builder.cjs +76 -0
  15. package/lib/builders/prompt-builder.d.ts +12 -0
  16. package/lib/builders/prompt-builder.js.map +1 -0
  17. package/lib/builders/resource-builder.cjs +83 -0
  18. package/lib/builders/resource-builder.d.ts +14 -0
  19. package/lib/builders/resource-builder.js.map +1 -0
  20. package/lib/builders/tool-builder.cjs +104 -0
  21. package/lib/builders/tool-builder.d.ts +16 -0
  22. package/lib/builders/tool-builder.js.map +1 -0
  23. package/lib/constants.cjs +28 -30
  24. package/lib/constants.d.ts +19 -24
  25. package/lib/constants.js.map +1 -0
  26. package/lib/environment.cjs +32 -0
  27. package/lib/environment.d.ts +71 -0
  28. package/lib/environment.js.map +1 -0
  29. package/lib/esm/bin/cli.js +7 -35
  30. package/lib/esm/bin/cli.js.map +1 -0
  31. package/lib/esm/builders/builder.d.ts +25 -0
  32. package/lib/esm/builders/builder.js +86 -0
  33. package/lib/esm/builders/builder.js.map +1 -0
  34. package/lib/esm/builders/index.d.ts +4 -0
  35. package/lib/esm/builders/index.js +5 -0
  36. package/lib/esm/builders/index.js.map +1 -0
  37. package/lib/esm/builders/prompt-builder.d.ts +12 -0
  38. package/lib/esm/builders/prompt-builder.js +72 -0
  39. package/lib/esm/builders/prompt-builder.js.map +1 -0
  40. package/lib/esm/builders/resource-builder.d.ts +14 -0
  41. package/lib/esm/builders/resource-builder.js +79 -0
  42. package/lib/esm/builders/resource-builder.js.map +1 -0
  43. package/lib/esm/builders/tool-builder.d.ts +16 -0
  44. package/lib/esm/builders/tool-builder.js +100 -0
  45. package/lib/esm/builders/tool-builder.js.map +1 -0
  46. package/lib/esm/constants.d.ts +19 -24
  47. package/lib/esm/constants.js +27 -29
  48. package/lib/esm/constants.js.map +1 -0
  49. package/lib/esm/environment.d.ts +71 -0
  50. package/lib/esm/environment.js +29 -0
  51. package/lib/esm/environment.js.map +1 -0
  52. package/lib/esm/index.d.ts +3 -10
  53. package/lib/esm/index.js +4 -11
  54. package/lib/esm/index.js.map +1 -0
  55. package/lib/esm/mcp-server.d.ts +10 -0
  56. package/lib/esm/mcp-server.js +189 -0
  57. package/lib/esm/mcp-server.js.map +1 -0
  58. package/lib/esm/modules/template-module/index.d.ts +6 -0
  59. package/lib/esm/modules/template-module/index.js +4 -0
  60. package/lib/esm/modules/template-module/index.js.map +1 -0
  61. package/lib/esm/prompts/code/constants.d.ts +1 -0
  62. package/lib/esm/prompts/code/constants.js +2 -0
  63. package/lib/esm/prompts/code/constants.js.map +1 -0
  64. package/lib/esm/prompts/code/design-patterns/builder.d.ts +2 -0
  65. package/lib/esm/prompts/code/design-patterns/builder.js +118 -0
  66. package/lib/esm/prompts/code/design-patterns/builder.js.map +1 -0
  67. package/lib/esm/prompts/code/design-patterns/constants.d.ts +1 -0
  68. package/lib/esm/prompts/code/design-patterns/constants.js +3 -0
  69. package/lib/esm/prompts/code/design-patterns/constants.js.map +1 -0
  70. package/lib/esm/prompts/example-prompt/index.d.ts +2 -0
  71. package/lib/esm/prompts/example-prompt/index.js +18 -0
  72. package/lib/esm/prompts/example-prompt/index.js.map +1 -0
  73. package/lib/esm/prompts/index.d.ts +2 -0
  74. package/lib/esm/prompts/index.js +26 -0
  75. package/lib/esm/prompts/index.js.map +1 -0
  76. package/lib/esm/prompts/interactive-jsdoc/index.d.ts +2 -0
  77. package/lib/esm/prompts/interactive-jsdoc/index.js +18 -0
  78. package/lib/esm/prompts/interactive-jsdoc/index.js.map +1 -0
  79. package/lib/esm/prompts/jsdocs/class-prompt.d.ts +2 -0
  80. package/lib/esm/prompts/jsdocs/class-prompt.js +52 -0
  81. package/lib/esm/prompts/jsdocs/class-prompt.js.map +1 -0
  82. package/lib/esm/prompts/jsdocs/const-prompt.d.ts +2 -0
  83. package/lib/esm/prompts/jsdocs/const-prompt.js +24 -0
  84. package/lib/esm/prompts/jsdocs/const-prompt.js.map +1 -0
  85. package/lib/esm/prompts/jsdocs/constants.d.ts +4 -0
  86. package/lib/esm/prompts/jsdocs/constants.js +46 -0
  87. package/lib/esm/prompts/jsdocs/constants.js.map +1 -0
  88. package/lib/esm/prompts/jsdocs/decorator-prompt.d.ts +2 -0
  89. package/lib/esm/prompts/jsdocs/decorator-prompt.js +42 -0
  90. package/lib/esm/prompts/jsdocs/decorator-prompt.js.map +1 -0
  91. package/lib/esm/prompts/jsdocs/enum-prompt.d.ts +2 -0
  92. package/lib/esm/prompts/jsdocs/enum-prompt.js +24 -0
  93. package/lib/esm/prompts/jsdocs/enum-prompt.js.map +1 -0
  94. package/lib/esm/prompts/jsdocs/function-prompt.d.ts +2 -0
  95. package/lib/esm/prompts/jsdocs/function-prompt.js +43 -0
  96. package/lib/esm/prompts/jsdocs/function-prompt.js.map +1 -0
  97. package/lib/esm/prompts/jsdocs/interface-prompt.d.ts +2 -0
  98. package/lib/esm/prompts/jsdocs/interface-prompt.js +24 -0
  99. package/lib/esm/prompts/jsdocs/interface-prompt.js.map +1 -0
  100. package/lib/esm/prompts/jsdocs/types-prompt.d.ts +2 -0
  101. package/lib/esm/prompts/jsdocs/types-prompt.js +24 -0
  102. package/lib/esm/prompts/jsdocs/types-prompt.js.map +1 -0
  103. package/lib/esm/resources/example-resource/index.d.ts +2 -0
  104. package/lib/esm/resources/example-resource/index.js +19 -0
  105. package/lib/esm/resources/example-resource/index.js.map +1 -0
  106. package/lib/esm/resources/index.d.ts +2 -0
  107. package/lib/esm/resources/index.js +4 -0
  108. package/lib/esm/resources/index.js.map +1 -0
  109. package/lib/esm/resources/repo-metadata/index.d.ts +2 -0
  110. package/lib/esm/resources/repo-metadata/index.js +25 -0
  111. package/lib/esm/resources/repo-metadata/index.js.map +1 -0
  112. package/lib/esm/tools/ast/ts-ast-tool.d.ts +2 -0
  113. package/lib/esm/tools/ast/ts-ast-tool.js +67 -0
  114. package/lib/esm/tools/ast/ts-ast-tool.js.map +1 -0
  115. package/lib/esm/tools/ast/types.d.ts +105 -0
  116. package/lib/esm/tools/ast/types.js +33 -0
  117. package/lib/esm/tools/ast/types.js.map +1 -0
  118. package/lib/esm/tools/ast/utils.d.ts +5 -0
  119. package/lib/esm/tools/ast/utils.js +58 -0
  120. package/lib/esm/tools/ast/utils.js.map +1 -0
  121. package/lib/esm/tools/ast-jsdoc-tools/apply.d.ts +6 -0
  122. package/lib/esm/tools/ast-jsdoc-tools/apply.js +29 -0
  123. package/lib/esm/tools/ast-jsdoc-tools/apply.js.map +1 -0
  124. package/lib/esm/tools/ast-jsdoc-tools/cli.js +33 -0
  125. package/lib/esm/tools/ast-jsdoc-tools/cli.js.map +1 -0
  126. package/lib/esm/tools/ast-jsdoc-tools/enumerator.d.ts +1 -0
  127. package/lib/esm/tools/ast-jsdoc-tools/enumerator.js +25 -0
  128. package/lib/esm/tools/ast-jsdoc-tools/enumerator.js.map +1 -0
  129. package/lib/esm/tools/ast-jsdoc-tools/fileRunner.d.ts +11 -0
  130. package/lib/esm/tools/ast-jsdoc-tools/fileRunner.js +29 -0
  131. package/lib/esm/tools/ast-jsdoc-tools/fileRunner.js.map +1 -0
  132. package/lib/esm/tools/ast-jsdoc-tools/formatter.d.ts +6 -0
  133. package/lib/esm/tools/ast-jsdoc-tools/formatter.js +18 -0
  134. package/lib/esm/tools/ast-jsdoc-tools/formatter.js.map +1 -0
  135. package/lib/esm/tools/ast-jsdoc-tools/generator.d.ts +12 -0
  136. package/lib/esm/tools/ast-jsdoc-tools/generator.js +55 -0
  137. package/lib/esm/tools/ast-jsdoc-tools/generator.js.map +1 -0
  138. package/lib/esm/tools/ast-jsdoc-tools/index.d.ts +7 -0
  139. package/lib/esm/tools/ast-jsdoc-tools/index.js +29 -0
  140. package/lib/esm/tools/ast-jsdoc-tools/index.js.map +1 -0
  141. package/lib/esm/tools/ast-jsdoc-tools/interactive.d.ts +1 -0
  142. package/lib/esm/tools/ast-jsdoc-tools/interactive.js +7 -0
  143. package/lib/esm/tools/ast-jsdoc-tools/interactive.js.map +1 -0
  144. package/lib/esm/tools/ast-jsdoc-tools/parser.d.ts +13 -0
  145. package/lib/esm/tools/ast-jsdoc-tools/parser.js +71 -0
  146. package/lib/esm/tools/ast-jsdoc-tools/parser.js.map +1 -0
  147. package/lib/esm/tools/ast-jsdoc-tools/patch.d.ts +2 -0
  148. package/lib/esm/tools/ast-jsdoc-tools/patch.js +23 -0
  149. package/lib/esm/tools/ast-jsdoc-tools/patch.js.map +1 -0
  150. package/lib/esm/tools/ast-jsdoc-tools/prompts/loader.d.ts +10 -0
  151. package/lib/esm/tools/ast-jsdoc-tools/prompts/loader.js +26 -0
  152. package/lib/esm/tools/ast-jsdoc-tools/prompts/loader.js.map +1 -0
  153. package/lib/esm/tools/ast-jsdoc-tools/repoRunner.d.ts +16 -0
  154. package/lib/esm/tools/ast-jsdoc-tools/repoRunner.js +61 -0
  155. package/lib/esm/tools/ast-jsdoc-tools/repoRunner.js.map +1 -0
  156. package/lib/esm/tools/ast-jsdoc-tools/tools/jsdoc-generator.d.ts +5 -0
  157. package/lib/esm/tools/ast-jsdoc-tools/tools/jsdoc-generator.js +78 -0
  158. package/lib/esm/tools/ast-jsdoc-tools/tools/jsdoc-generator.js.map +1 -0
  159. package/lib/esm/tools/ast-jsdoc-tools/utils/conflict-detector.d.ts +5 -0
  160. package/lib/esm/tools/ast-jsdoc-tools/utils/conflict-detector.js +30 -0
  161. package/lib/esm/tools/ast-jsdoc-tools/utils/conflict-detector.js.map +1 -0
  162. package/lib/esm/tools/ast-jsdoc-tools/utils/context-schema.d.ts +7 -0
  163. package/lib/esm/tools/ast-jsdoc-tools/utils/context-schema.js +29 -0
  164. package/lib/esm/tools/ast-jsdoc-tools/utils/context-schema.js.map +1 -0
  165. package/lib/esm/tools/ast-jsdoc-tools/utils/heuristics.d.ts +2 -0
  166. package/lib/esm/tools/ast-jsdoc-tools/utils/heuristics.js +31 -0
  167. package/lib/esm/tools/ast-jsdoc-tools/utils/heuristics.js.map +1 -0
  168. package/lib/esm/tools/ast-jsdoc-tools/utils/ts-project.d.ts +12 -0
  169. package/lib/esm/tools/ast-jsdoc-tools/utils/ts-project.js +21 -0
  170. package/lib/esm/tools/ast-jsdoc-tools/utils/ts-project.js.map +1 -0
  171. package/lib/esm/tools/example-tool/index.d.ts +2 -0
  172. package/lib/esm/tools/example-tool/index.js +29 -0
  173. package/lib/esm/tools/example-tool/index.js.map +1 -0
  174. package/lib/esm/tools/file-summarizer/index.d.ts +2 -0
  175. package/lib/esm/tools/file-summarizer/index.js +29 -0
  176. package/lib/esm/tools/file-summarizer/index.js.map +1 -0
  177. package/lib/esm/tools/index.d.ts +2 -0
  178. package/lib/esm/tools/index.js +6 -0
  179. package/lib/esm/tools/index.js.map +1 -0
  180. package/lib/esm/tools/jsdoc/ts-jsdoc-element-tool.d.ts +2 -0
  181. package/lib/esm/tools/jsdoc/ts-jsdoc-element-tool.js +84 -0
  182. package/lib/esm/tools/jsdoc/ts-jsdoc-element-tool.js.map +1 -0
  183. package/lib/esm/tools/jsdoc/utils.d.ts +5 -0
  184. package/lib/esm/tools/jsdoc/utils.js +53 -0
  185. package/lib/esm/tools/jsdoc/utils.js.map +1 -0
  186. package/lib/esm/tools/testing/ts-jest-list-tests.d.ts +2 -0
  187. package/lib/esm/tools/testing/ts-jest-list-tests.js +53 -0
  188. package/lib/esm/tools/testing/ts-jest-list-tests.js.map +1 -0
  189. package/lib/esm/types.d.ts +56 -47
  190. package/lib/esm/types.js +1 -1
  191. package/lib/esm/types.js.map +1 -0
  192. package/lib/esm/utils/banner.d.ts +3 -0
  193. package/lib/esm/utils/banner.js +107 -0
  194. package/lib/esm/utils/banner.js.map +1 -0
  195. package/lib/esm/version.d.ts +2 -0
  196. package/lib/esm/version.js +5 -0
  197. package/lib/esm/version.js.map +1 -0
  198. package/lib/index.cjs +4 -11
  199. package/lib/index.d.ts +3 -10
  200. package/lib/index.js.map +1 -0
  201. package/lib/mcp-server.cjs +226 -0
  202. package/lib/mcp-server.d.ts +10 -0
  203. package/lib/mcp-server.js.map +1 -0
  204. package/lib/modules/template-module/index.cjs +7 -0
  205. package/lib/modules/template-module/index.d.ts +6 -0
  206. package/lib/modules/template-module/index.js.map +1 -0
  207. package/lib/prompts/code/constants.cjs +5 -0
  208. package/lib/prompts/code/constants.d.ts +1 -0
  209. package/lib/prompts/code/constants.js.map +1 -0
  210. package/lib/prompts/code/design-patterns/builder.cjs +121 -0
  211. package/lib/prompts/code/design-patterns/builder.d.ts +2 -0
  212. package/lib/prompts/code/design-patterns/builder.js.map +1 -0
  213. package/lib/prompts/code/design-patterns/constants.cjs +6 -0
  214. package/lib/prompts/code/design-patterns/constants.d.ts +1 -0
  215. package/lib/prompts/code/design-patterns/constants.js.map +1 -0
  216. package/lib/prompts/example-prompt/index.cjs +21 -0
  217. package/lib/prompts/example-prompt/index.d.ts +2 -0
  218. package/lib/prompts/example-prompt/index.js.map +1 -0
  219. package/lib/prompts/index.cjs +29 -0
  220. package/lib/prompts/index.d.ts +2 -0
  221. package/lib/prompts/index.js.map +1 -0
  222. package/lib/prompts/interactive-jsdoc/index.cjs +21 -0
  223. package/lib/prompts/interactive-jsdoc/index.d.ts +2 -0
  224. package/lib/prompts/interactive-jsdoc/index.js.map +1 -0
  225. package/lib/prompts/jsdocs/class-prompt.cjs +55 -0
  226. package/lib/prompts/jsdocs/class-prompt.d.ts +2 -0
  227. package/lib/prompts/jsdocs/class-prompt.js.map +1 -0
  228. package/lib/prompts/jsdocs/const-prompt.cjs +27 -0
  229. package/lib/prompts/jsdocs/const-prompt.d.ts +2 -0
  230. package/lib/prompts/jsdocs/const-prompt.js.map +1 -0
  231. package/lib/prompts/jsdocs/constants.cjs +49 -0
  232. package/lib/prompts/jsdocs/constants.d.ts +4 -0
  233. package/lib/prompts/jsdocs/constants.js.map +1 -0
  234. package/lib/prompts/jsdocs/decorator-prompt.cjs +45 -0
  235. package/lib/prompts/jsdocs/decorator-prompt.d.ts +2 -0
  236. package/lib/prompts/jsdocs/decorator-prompt.js.map +1 -0
  237. package/lib/prompts/jsdocs/enum-prompt.cjs +27 -0
  238. package/lib/prompts/jsdocs/enum-prompt.d.ts +2 -0
  239. package/lib/prompts/jsdocs/enum-prompt.js.map +1 -0
  240. package/lib/prompts/jsdocs/function-prompt.cjs +46 -0
  241. package/lib/prompts/jsdocs/function-prompt.d.ts +2 -0
  242. package/lib/prompts/jsdocs/function-prompt.js.map +1 -0
  243. package/lib/prompts/jsdocs/interface-prompt.cjs +27 -0
  244. package/lib/prompts/jsdocs/interface-prompt.d.ts +2 -0
  245. package/lib/prompts/jsdocs/interface-prompt.js.map +1 -0
  246. package/lib/prompts/jsdocs/types-prompt.cjs +27 -0
  247. package/lib/prompts/jsdocs/types-prompt.d.ts +2 -0
  248. package/lib/prompts/jsdocs/types-prompt.js.map +1 -0
  249. package/lib/resources/example-resource/index.cjs +22 -0
  250. package/lib/resources/example-resource/index.d.ts +2 -0
  251. package/lib/resources/example-resource/index.js.map +1 -0
  252. package/lib/resources/index.cjs +7 -0
  253. package/lib/resources/index.d.ts +2 -0
  254. package/lib/resources/index.js.map +1 -0
  255. package/lib/resources/repo-metadata/index.cjs +28 -0
  256. package/lib/resources/repo-metadata/index.d.ts +2 -0
  257. package/lib/resources/repo-metadata/index.js.map +1 -0
  258. package/lib/tools/ast/ts-ast-tool.cjs +70 -0
  259. package/lib/tools/ast/ts-ast-tool.d.ts +2 -0
  260. package/lib/tools/ast/ts-ast-tool.js.map +1 -0
  261. package/lib/tools/ast/types.cjs +36 -0
  262. package/lib/tools/ast/types.d.ts +105 -0
  263. package/lib/tools/ast/types.js.map +1 -0
  264. package/lib/tools/ast/utils.cjs +65 -0
  265. package/lib/tools/ast/utils.d.ts +5 -0
  266. package/lib/tools/ast/utils.js.map +1 -0
  267. package/lib/tools/ast-jsdoc-tools/apply.cjs +36 -0
  268. package/lib/tools/ast-jsdoc-tools/apply.d.ts +6 -0
  269. package/lib/tools/ast-jsdoc-tools/apply.js.map +1 -0
  270. package/lib/tools/ast-jsdoc-tools/cli.cjs +38 -0
  271. package/lib/tools/ast-jsdoc-tools/cli.js.map +1 -0
  272. package/lib/tools/ast-jsdoc-tools/enumerator.cjs +31 -0
  273. package/lib/tools/ast-jsdoc-tools/enumerator.d.ts +1 -0
  274. package/lib/tools/ast-jsdoc-tools/enumerator.js.map +1 -0
  275. package/lib/tools/ast-jsdoc-tools/fileRunner.cjs +35 -0
  276. package/lib/tools/ast-jsdoc-tools/fileRunner.d.ts +11 -0
  277. package/lib/tools/ast-jsdoc-tools/fileRunner.js.map +1 -0
  278. package/lib/tools/ast-jsdoc-tools/formatter.cjs +21 -0
  279. package/lib/tools/ast-jsdoc-tools/formatter.d.ts +6 -0
  280. package/lib/tools/ast-jsdoc-tools/formatter.js.map +1 -0
  281. package/lib/tools/ast-jsdoc-tools/generator.cjs +58 -0
  282. package/lib/tools/ast-jsdoc-tools/generator.d.ts +12 -0
  283. package/lib/tools/ast-jsdoc-tools/generator.js.map +1 -0
  284. package/lib/tools/ast-jsdoc-tools/index.cjs +33 -0
  285. package/lib/tools/ast-jsdoc-tools/index.d.ts +7 -0
  286. package/lib/tools/ast-jsdoc-tools/index.js.map +1 -0
  287. package/lib/tools/ast-jsdoc-tools/interactive.cjs +10 -0
  288. package/lib/tools/ast-jsdoc-tools/interactive.d.ts +1 -0
  289. package/lib/tools/ast-jsdoc-tools/interactive.js.map +1 -0
  290. package/lib/tools/ast-jsdoc-tools/parser.cjs +77 -0
  291. package/lib/tools/ast-jsdoc-tools/parser.d.ts +13 -0
  292. package/lib/tools/ast-jsdoc-tools/parser.js.map +1 -0
  293. package/lib/tools/ast-jsdoc-tools/patch.cjs +29 -0
  294. package/lib/tools/ast-jsdoc-tools/patch.d.ts +2 -0
  295. package/lib/tools/ast-jsdoc-tools/patch.js.map +1 -0
  296. package/lib/tools/ast-jsdoc-tools/prompts/loader.cjs +32 -0
  297. package/lib/tools/ast-jsdoc-tools/prompts/loader.d.ts +10 -0
  298. package/lib/tools/ast-jsdoc-tools/prompts/loader.js.map +1 -0
  299. package/lib/tools/ast-jsdoc-tools/repoRunner.cjs +67 -0
  300. package/lib/tools/ast-jsdoc-tools/repoRunner.d.ts +16 -0
  301. package/lib/tools/ast-jsdoc-tools/repoRunner.js.map +1 -0
  302. package/lib/tools/ast-jsdoc-tools/tools/jsdoc-generator.cjs +81 -0
  303. package/lib/tools/ast-jsdoc-tools/tools/jsdoc-generator.d.ts +5 -0
  304. package/lib/tools/ast-jsdoc-tools/tools/jsdoc-generator.js.map +1 -0
  305. package/lib/tools/ast-jsdoc-tools/utils/conflict-detector.cjs +33 -0
  306. package/lib/tools/ast-jsdoc-tools/utils/conflict-detector.d.ts +5 -0
  307. package/lib/tools/ast-jsdoc-tools/utils/conflict-detector.js.map +1 -0
  308. package/lib/tools/ast-jsdoc-tools/utils/context-schema.cjs +32 -0
  309. package/lib/tools/ast-jsdoc-tools/utils/context-schema.d.ts +7 -0
  310. package/lib/tools/ast-jsdoc-tools/utils/context-schema.js.map +1 -0
  311. package/lib/tools/ast-jsdoc-tools/utils/heuristics.cjs +34 -0
  312. package/lib/tools/ast-jsdoc-tools/utils/heuristics.d.ts +2 -0
  313. package/lib/tools/ast-jsdoc-tools/utils/heuristics.js.map +1 -0
  314. package/lib/tools/ast-jsdoc-tools/utils/ts-project.cjs +57 -0
  315. package/lib/tools/ast-jsdoc-tools/utils/ts-project.d.ts +12 -0
  316. package/lib/tools/ast-jsdoc-tools/utils/ts-project.js.map +1 -0
  317. package/lib/tools/example-tool/index.cjs +32 -0
  318. package/lib/tools/example-tool/index.d.ts +2 -0
  319. package/lib/tools/example-tool/index.js.map +1 -0
  320. package/lib/tools/file-summarizer/index.cjs +32 -0
  321. package/lib/tools/file-summarizer/index.d.ts +2 -0
  322. package/lib/tools/file-summarizer/index.js.map +1 -0
  323. package/lib/tools/index.cjs +9 -0
  324. package/lib/tools/index.d.ts +2 -0
  325. package/lib/tools/index.js.map +1 -0
  326. package/lib/tools/jsdoc/ts-jsdoc-element-tool.cjs +87 -0
  327. package/lib/tools/jsdoc/ts-jsdoc-element-tool.d.ts +2 -0
  328. package/lib/tools/jsdoc/ts-jsdoc-element-tool.js.map +1 -0
  329. package/lib/tools/jsdoc/utils.cjs +60 -0
  330. package/lib/tools/jsdoc/utils.d.ts +5 -0
  331. package/lib/tools/jsdoc/utils.js.map +1 -0
  332. package/lib/tools/testing/ts-jest-list-tests.cjs +56 -0
  333. package/lib/tools/testing/ts-jest-list-tests.d.ts +2 -0
  334. package/lib/tools/testing/ts-jest-list-tests.js.map +1 -0
  335. package/lib/types.cjs +1 -1
  336. package/lib/types.d.ts +56 -47
  337. package/lib/types.js.map +1 -0
  338. package/lib/utils/banner.cjs +114 -0
  339. package/lib/utils/banner.d.ts +3 -0
  340. package/lib/utils/banner.js.map +1 -0
  341. package/lib/version.cjs +8 -0
  342. package/lib/version.d.ts +2 -0
  343. package/lib/version.js.map +1 -0
  344. package/package.json +14 -63
  345. package/dist/mcp-server.esm.cjs +0 -2314
  346. package/lib/McpWrapper.cjs +0 -233
  347. package/lib/McpWrapper.d.ts +0 -89
  348. package/lib/bin/validate-modules.cjs +0 -24
  349. package/lib/esm/McpWrapper.d.ts +0 -89
  350. package/lib/esm/McpWrapper.js +0 -196
  351. package/lib/esm/bin/validate-modules.js +0 -22
  352. package/lib/esm/mcp/aggregateModules.d.ts +0 -26
  353. package/lib/esm/mcp/aggregateModules.js +0 -185
  354. package/lib/esm/mcp/code.d.ts +0 -23
  355. package/lib/esm/mcp/code.js +0 -70
  356. package/lib/esm/mcp/decorator-tools.d.ts +0 -118
  357. package/lib/esm/mcp/decorator-tools.js +0 -237
  358. package/lib/esm/mcp/fastmcp-wiring.d.ts +0 -14
  359. package/lib/esm/mcp/fastmcp-wiring.js +0 -56
  360. package/lib/esm/mcp/index.d.ts +0 -9
  361. package/lib/esm/mcp/index.js +0 -29
  362. package/lib/esm/mcp/mcp-module.d.ts +0 -11
  363. package/lib/esm/mcp/mcp-module.js +0 -31
  364. package/lib/esm/mcp/moduleRegistry.d.ts +0 -14
  365. package/lib/esm/mcp/moduleRegistry.js +0 -47
  366. package/lib/esm/mcp/prompts/index.d.ts +0 -4
  367. package/lib/esm/mcp/prompts/index.js +0 -7
  368. package/lib/esm/mcp/prompts/prompts.d.ts +0 -22
  369. package/lib/esm/mcp/prompts/prompts.js +0 -203
  370. package/lib/esm/mcp/resources/index.d.ts +0 -1
  371. package/lib/esm/mcp/resources/index.js +0 -2
  372. package/lib/esm/mcp/resources/resources.d.ts +0 -2
  373. package/lib/esm/mcp/resources/resources.js +0 -69
  374. package/lib/esm/mcp/schemas.d.ts +0 -53
  375. package/lib/esm/mcp/schemas.js +0 -97
  376. package/lib/esm/mcp/templates/codex-templates.d.ts +0 -3
  377. package/lib/esm/mcp/templates/codex-templates.js +0 -33
  378. package/lib/esm/mcp/templates/index.d.ts +0 -71
  379. package/lib/esm/mcp/templates/index.js +0 -66
  380. package/lib/esm/mcp/templates/resource-templates.d.ts +0 -3
  381. package/lib/esm/mcp/templates/resource-templates.js +0 -60
  382. package/lib/esm/mcp/templates/workspace-templates.d.ts +0 -3
  383. package/lib/esm/mcp/templates/workspace-templates.js +0 -66
  384. package/lib/esm/mcp/tools/codex-tools.d.ts +0 -5
  385. package/lib/esm/mcp/tools/codex-tools.js +0 -244
  386. package/lib/esm/mcp/tools/generateMcpModule.d.ts +0 -9
  387. package/lib/esm/mcp/tools/generateMcpModule.js +0 -133
  388. package/lib/esm/mcp/tools/index.d.ts +0 -219
  389. package/lib/esm/mcp/tools/index.js +0 -27
  390. package/lib/esm/mcp/tools/tools.d.ts +0 -10
  391. package/lib/esm/mcp/tools/tools.js +0 -275
  392. package/lib/esm/mcp/types.d.ts +0 -66
  393. package/lib/esm/mcp/types.js +0 -2
  394. package/lib/esm/mcp/utils.d.ts +0 -3
  395. package/lib/esm/mcp/utils.js +0 -46
  396. package/lib/esm/mcp/validation/index.d.ts +0 -13
  397. package/lib/esm/mcp/validation/index.js +0 -116
  398. package/lib/esm/mcp/validation/scaffoldModule.d.ts +0 -9
  399. package/lib/esm/mcp/validation/scaffoldModule.js +0 -88
  400. package/lib/esm/mcp/workspace.d.ts +0 -9
  401. package/lib/esm/mcp/workspace.js +0 -73
  402. package/lib/esm/metadata.d.ts +0 -9
  403. package/lib/esm/metadata.js +0 -22
  404. package/lib/esm/modules/_template/index.d.ts +0 -32
  405. package/lib/esm/modules/_template/index.js +0 -16
  406. package/lib/esm/modules/_template/prompts/index.d.ts +0 -6
  407. package/lib/esm/modules/_template/prompts/index.js +0 -9
  408. package/lib/esm/modules/_template/resources/index.d.ts +0 -6
  409. package/lib/esm/modules/_template/resources/index.js +0 -9
  410. package/lib/esm/modules/_template/templates/index.d.ts +0 -7
  411. package/lib/esm/modules/_template/templates/index.js +0 -10
  412. package/lib/esm/modules/_template/tools/index.d.ts +0 -6
  413. package/lib/esm/modules/_template/tools/index.js +0 -15
  414. package/lib/esm/modules/decoration/index.d.ts +0 -46
  415. package/lib/esm/modules/decoration/index.js +0 -10
  416. package/lib/esm/modules/decoration/prompts/index.d.ts +0 -1
  417. package/lib/esm/modules/decoration/prompts/index.js +0 -2
  418. package/lib/esm/modules/decoration/resources/index.d.ts +0 -7
  419. package/lib/esm/modules/decoration/resources/index.js +0 -10
  420. package/lib/esm/modules/decoration/templates/index.d.ts +0 -6
  421. package/lib/esm/modules/decoration/templates/index.js +0 -9
  422. package/lib/esm/modules/decoration/tools/index.d.ts +0 -26
  423. package/lib/esm/modules/decoration/tools/index.js +0 -7
  424. package/lib/esm/modules/index.d.ts +0 -2
  425. package/lib/esm/modules/index.js +0 -17
  426. package/lib/esm/modules/mcp/decoration-assist.d.ts +0 -4
  427. package/lib/esm/modules/mcp/decoration-assist.js +0 -6
  428. package/lib/esm/modules/mcp/index.d.ts +0 -6
  429. package/lib/esm/modules/mcp/index.js +0 -16
  430. package/lib/esm/modules/mcp/prompts/index.d.ts +0 -2
  431. package/lib/esm/modules/mcp/prompts/index.js +0 -9
  432. package/lib/esm/modules/mcp/resources/index.d.ts +0 -2
  433. package/lib/esm/modules/mcp/resources/index.js +0 -24
  434. package/lib/esm/modules/mcp/templates/index.d.ts +0 -2
  435. package/lib/esm/modules/mcp/templates/index.js +0 -28
  436. package/lib/esm/modules/mcp/tools/index.d.ts +0 -6
  437. package/lib/esm/modules/mcp/tools/index.js +0 -15
  438. package/lib/esm/utils/modulePaths.d.ts +0 -6
  439. package/lib/esm/utils/modulePaths.js +0 -33
  440. package/lib/esm/utils/moduleValidator.d.ts +0 -14
  441. package/lib/esm/utils/moduleValidator.js +0 -176
  442. package/lib/esm/utils.d.ts +0 -61
  443. package/lib/esm/utils.js +0 -86
  444. package/lib/mcp/aggregateModules.cjs +0 -225
  445. package/lib/mcp/aggregateModules.d.ts +0 -26
  446. package/lib/mcp/code.cjs +0 -81
  447. package/lib/mcp/code.d.ts +0 -23
  448. package/lib/mcp/decorator-tools.cjs +0 -243
  449. package/lib/mcp/decorator-tools.d.ts +0 -118
  450. package/lib/mcp/fastmcp-wiring.cjs +0 -59
  451. package/lib/mcp/fastmcp-wiring.d.ts +0 -14
  452. package/lib/mcp/index.cjs +0 -57
  453. package/lib/mcp/index.d.ts +0 -9
  454. package/lib/mcp/mcp-module.cjs +0 -46
  455. package/lib/mcp/mcp-module.d.ts +0 -11
  456. package/lib/mcp/moduleRegistry.cjs +0 -52
  457. package/lib/mcp/moduleRegistry.d.ts +0 -14
  458. package/lib/mcp/prompts/index.cjs +0 -25
  459. package/lib/mcp/prompts/index.d.ts +0 -4
  460. package/lib/mcp/prompts/prompts.cjs +0 -217
  461. package/lib/mcp/prompts/prompts.d.ts +0 -22
  462. package/lib/mcp/resources/index.d.ts +0 -1
  463. package/lib/mcp/resources/resources.cjs +0 -72
  464. package/lib/mcp/resources/resources.d.ts +0 -2
  465. package/lib/mcp/schemas.cjs +0 -100
  466. package/lib/mcp/schemas.d.ts +0 -53
  467. package/lib/mcp/templates/codex-templates.cjs +0 -40
  468. package/lib/mcp/templates/codex-templates.d.ts +0 -3
  469. package/lib/mcp/templates/index.cjs +0 -76
  470. package/lib/mcp/templates/index.d.ts +0 -71
  471. package/lib/mcp/templates/resource-templates.cjs +0 -67
  472. package/lib/mcp/templates/resource-templates.d.ts +0 -3
  473. package/lib/mcp/templates/workspace-templates.cjs +0 -70
  474. package/lib/mcp/templates/workspace-templates.d.ts +0 -3
  475. package/lib/mcp/tools/codex-tools.cjs +0 -250
  476. package/lib/mcp/tools/codex-tools.d.ts +0 -5
  477. package/lib/mcp/tools/generateMcpModule.cjs +0 -139
  478. package/lib/mcp/tools/generateMcpModule.d.ts +0 -9
  479. package/lib/mcp/tools/index.cjs +0 -30
  480. package/lib/mcp/tools/index.d.ts +0 -219
  481. package/lib/mcp/tools/tools.cjs +0 -317
  482. package/lib/mcp/tools/tools.d.ts +0 -10
  483. package/lib/mcp/types.cjs +0 -3
  484. package/lib/mcp/types.d.ts +0 -66
  485. package/lib/mcp/utils.cjs +0 -54
  486. package/lib/mcp/utils.d.ts +0 -3
  487. package/lib/mcp/validation/index.cjs +0 -123
  488. package/lib/mcp/validation/index.d.ts +0 -13
  489. package/lib/mcp/validation/scaffoldModule.cjs +0 -94
  490. package/lib/mcp/validation/scaffoldModule.d.ts +0 -9
  491. package/lib/mcp/workspace.cjs +0 -119
  492. package/lib/mcp/workspace.d.ts +0 -9
  493. package/lib/metadata.cjs +0 -25
  494. package/lib/metadata.d.ts +0 -9
  495. package/lib/modules/_template/index.cjs +0 -23
  496. package/lib/modules/_template/index.d.ts +0 -32
  497. package/lib/modules/_template/prompts/index.cjs +0 -12
  498. package/lib/modules/_template/prompts/index.d.ts +0 -6
  499. package/lib/modules/_template/resources/index.cjs +0 -12
  500. package/lib/modules/_template/resources/index.d.ts +0 -6
  501. package/lib/modules/_template/templates/index.cjs +0 -13
  502. package/lib/modules/_template/templates/index.d.ts +0 -7
  503. package/lib/modules/_template/tools/index.cjs +0 -18
  504. package/lib/modules/_template/tools/index.d.ts +0 -6
  505. package/lib/modules/decoration/index.cjs +0 -17
  506. package/lib/modules/decoration/index.d.ts +0 -46
  507. package/lib/modules/decoration/prompts/index.cjs +0 -5
  508. package/lib/modules/decoration/prompts/index.d.ts +0 -1
  509. package/lib/modules/decoration/resources/index.cjs +0 -13
  510. package/lib/modules/decoration/resources/index.d.ts +0 -7
  511. package/lib/modules/decoration/templates/index.cjs +0 -12
  512. package/lib/modules/decoration/templates/index.d.ts +0 -6
  513. package/lib/modules/decoration/tools/index.cjs +0 -10
  514. package/lib/modules/decoration/tools/index.d.ts +0 -26
  515. package/lib/modules/index.cjs +0 -20
  516. package/lib/modules/index.d.ts +0 -2
  517. package/lib/modules/mcp/decoration-assist.cjs +0 -13
  518. package/lib/modules/mcp/decoration-assist.d.ts +0 -4
  519. package/lib/modules/mcp/index.cjs +0 -23
  520. package/lib/modules/mcp/index.d.ts +0 -6
  521. package/lib/modules/mcp/prompts/index.cjs +0 -12
  522. package/lib/modules/mcp/prompts/index.d.ts +0 -2
  523. package/lib/modules/mcp/resources/index.cjs +0 -27
  524. package/lib/modules/mcp/resources/index.d.ts +0 -2
  525. package/lib/modules/mcp/templates/index.cjs +0 -31
  526. package/lib/modules/mcp/templates/index.d.ts +0 -2
  527. package/lib/modules/mcp/tools/index.cjs +0 -18
  528. package/lib/modules/mcp/tools/index.d.ts +0 -6
  529. package/lib/utils/modulePaths.cjs +0 -43
  530. package/lib/utils/modulePaths.d.ts +0 -6
  531. package/lib/utils/moduleValidator.cjs +0 -184
  532. package/lib/utils/moduleValidator.d.ts +0 -14
  533. package/lib/utils.cjs +0 -129
  534. package/lib/utils.d.ts +0 -61
  535. /package/lib/{bin/validate-modules.d.ts → esm/tools/ast-jsdoc-tools/cli.d.ts} +0 -0
  536. /package/lib/{esm/bin/validate-modules.d.ts → tools/ast-jsdoc-tools/cli.d.ts} +0 -0
@@ -1,196 +0,0 @@
1
- import * as fs from "fs";
2
- import * as path from "path";
3
- import { MCP_FILE_NAME } from "./constants";
4
- import { McpUtils } from "./utils";
5
- import { FastMCP } from "fastmcp";
6
- import { LoggedClass } from "@decaf-ts/logging";
7
- import { VERSION } from "./metadata";
8
- import { fileURLToPath } from "url";
9
- /**
10
- * @description Utility class to handle CLI functionality from all Decaf modules
11
- * @summary This class provides a wrapper around Commander.js to handle CLI commands from different Decaf modules.
12
- * It crawls the filesystem to find CLI modules, loads them, and registers their commands.
13
- */
14
- export class McpWrapper extends LoggedClass {
15
- constructor(basePath = "./", crawlLevels = 4) {
16
- super();
17
- this.basePath = basePath;
18
- this.crawlLevels = crawlLevels;
19
- this.modules = {};
20
- // Support both CommonJS and ESM runtimes for filename/dirname
21
- let localDirname;
22
- if (typeof __filename !== "undefined" && typeof __dirname !== "undefined") {
23
- // CommonJS environment
24
- localDirname = __dirname;
25
- }
26
- else {
27
- // ESM or other env: compute import.meta.url at runtime to avoid TS compile-time import.meta checks
28
- let metaUrl;
29
- try {
30
- // Use a dynamic function so TypeScript won't parse `import.meta` at compile time
31
- const fn = new Function('return (typeof import !== "undefined" && typeof import.meta !== "undefined") ? import.meta.url : undefined;');
32
- metaUrl = fn();
33
- }
34
- catch {
35
- metaUrl = undefined;
36
- }
37
- if (metaUrl) {
38
- localDirname = path.dirname(fileURLToPath(metaUrl));
39
- }
40
- else {
41
- // Last-resort fallback: use current working directory
42
- localDirname = process.cwd();
43
- }
44
- }
45
- this.rootPath = path.resolve(localDirname, "..");
46
- }
47
- /**
48
- * @description Retrieves and initializes the Commander Command object
49
- * @summary Lazy-loads the Command object, initializing it with the package name, description, and version
50
- * @return {FastMCP} The initialized Command object
51
- * @private
52
- */
53
- get mcp() {
54
- if (!this._mcp) {
55
- this._mcp = new FastMCP({
56
- name: "decaf-ts MCP server",
57
- instructions: "",
58
- version: VERSION,
59
- });
60
- }
61
- return this._mcp;
62
- }
63
- /**
64
- * @description Loads and registers an mcp extension module from a file
65
- * @summary Dynamically imports an mcp extension module from the specified file path, initializes it, and registers it in the modules collection
66
- *
67
- */
68
- async load(server, filePath) {
69
- const log = this.log.for(this.load);
70
- let pkg, version, enrich;
71
- try {
72
- const res = await McpUtils.loadFromFile(filePath);
73
- pkg = res.PACKAGE_NAME;
74
- version = res.VERSION;
75
- enrich = res.enrich;
76
- }
77
- catch (e) {
78
- throw new Error(e.message || e);
79
- }
80
- try {
81
- log.info(`Enriching mcp server with module ${pkg} v${version}`);
82
- const result = enrich(server);
83
- server = result instanceof Promise ? await result : result;
84
- }
85
- catch (e) {
86
- throw new Error(`failed to enrich mcp with module ${pkg || "unnamed"} under ${filePath}: ${e instanceof Error ? e.message : e}`);
87
- }
88
- return {
89
- mcp: server,
90
- package: pkg,
91
- version: version,
92
- };
93
- }
94
- /**
95
- * @description Finds and loads all CLI modules in the basePath
96
- * @summary Uses the crawl method to find all CLI modules in the specified base path,
97
- * then loads and registers each module as a subcommand
98
- *
99
- * @return {Promise<void>} A promise that resolves when all modules are loaded
100
- *
101
- * @private
102
- * @mermaid
103
- * sequenceDiagram
104
- * participant CliWrapper
105
- * participant Filesystem
106
- * participant Module
107
- *
108
- * CliWrapper->>Filesystem: Join basePath with cwd
109
- * CliWrapper->>CliWrapper: crawl(basePath, crawlLevels)
110
- * CliWrapper-->>CliWrapper: modules[]
111
- * loop For each module
112
- * alt Not @decaf-ts/cli
113
- * CliWrapper->>CliWrapper: load(module, cwd)
114
- * CliWrapper-->>CliWrapper: name
115
- * CliWrapper->>CliWrapper: Check if command exists
116
- * alt Command doesn't exist
117
- * CliWrapper->>Command: command(name).addCommand(modules[name])
118
- * end
119
- * end
120
- * end
121
- * CliWrapper->>Console: Log loaded modules
122
- */
123
- async boot() {
124
- const log = this.log.for(this.boot);
125
- let server = this.mcp;
126
- // discover modules by crawling basePath
127
- const moduleFiles = this.crawl(path.resolve(this.basePath), this.crawlLevels);
128
- for (const moduleFile of moduleFiles) {
129
- if (moduleFile.includes("@decaf-ts/mcp")) {
130
- continue;
131
- }
132
- try {
133
- const res = await this.load(server, moduleFile);
134
- server = res.mcp;
135
- this.modules[res.package] = moduleFile;
136
- }
137
- catch (e) {
138
- log.error(`Failed to load MCP configs for ${moduleFile}: ${e instanceof Error ? e.message : e}`);
139
- }
140
- }
141
- console.log(`loaded modules:\n${Object.keys(this.modules)
142
- .map((k) => `- ${k}`)
143
- .join("\n")}`);
144
- return server;
145
- }
146
- /**
147
- * @description Recursively searches for CLI module files in the directory structure
148
- * @summary Crawls the basePath up to the specified number of folder levels to find files named according to CLI_FILE_NAME
149
- *
150
- * @param {string} basePath The absolute base path to start searching in
151
- * @param {number} [levels=2] The maximum number of directory levels to crawl
152
- * @return {string[]} An array of file paths to CLI modules
153
- *
154
- * @private
155
- */
156
- crawl(basePath, levels = 2) {
157
- if (levels <= 0)
158
- return [];
159
- return fs.readdirSync(basePath).reduce((accum, file) => {
160
- file = path.join(basePath, file);
161
- if (fs.statSync(file).isDirectory()) {
162
- accum.push(...this.crawl(file, levels - 1));
163
- }
164
- else if (file.match(new RegExp(`${MCP_FILE_NAME}.[cm]?js$`, "gm"))) {
165
- accum.push(file);
166
- }
167
- return accum;
168
- }, []);
169
- }
170
- /**
171
- * @description Executes the CLI with the provided arguments
172
- * @summary Boots the CLI by loading all modules, then parses and executes the command specified in the arguments
173
- *
174
- * @param {string[]} [args=process.argv] Command line arguments to parse and execute
175
- * @return {Promise<void>} A promise that resolves when the command execution is complete
176
- *
177
- * @mermaid
178
- * sequenceDiagram
179
- * participant Client
180
- * participant CliWrapper
181
- * participant Command
182
- *
183
- * Client->>CliWrapper: run(args)
184
- * CliWrapper->>CliWrapper: boot()
185
- * Note over CliWrapper: Loads all modules
186
- * CliWrapper->>Command: parseAsync(args)
187
- * Command-->>CliWrapper: result
188
- * CliWrapper-->>Client: result
189
- */
190
- async run(args = process.argv) {
191
- void args;
192
- const server = await this.boot();
193
- await server.start({ transportType: "stdio" });
194
- }
195
- }
196
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWNwV3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9NY3BXcmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFNcEM7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxVQUFXLFNBQVEsV0FBVztJQUt6QyxZQUNVLFdBQW1CLElBQUksRUFDdkIsY0FBYyxDQUFDO1FBRXZCLEtBQUssRUFBRSxDQUFDO1FBSEEsYUFBUSxHQUFSLFFBQVEsQ0FBZTtRQUN2QixnQkFBVyxHQUFYLFdBQVcsQ0FBSTtRQUxqQixZQUFPLEdBQTJCLEVBQUUsQ0FBQztRQVEzQyw4REFBOEQ7UUFDOUQsSUFBSSxZQUFvQixDQUFDO1FBQ3pCLElBQUksT0FBTyxVQUFVLEtBQUssV0FBVyxJQUFJLE9BQU8sU0FBUyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQzFFLHVCQUF1QjtZQUN2QixZQUFZLEdBQUcsU0FBbUIsQ0FBQztRQUNyQyxDQUFDO2FBQU0sQ0FBQztZQUNOLG1HQUFtRztZQUNuRyxJQUFJLE9BQTJCLENBQUM7WUFDaEMsSUFBSSxDQUFDO2dCQUNILGlGQUFpRjtnQkFDakYsTUFBTSxFQUFFLEdBQUcsSUFBSSxRQUFRLENBQ3JCLDZHQUE2RyxDQUM5RyxDQUFDO2dCQUNG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LEtBQWUsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUMvRCxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDakMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQ3BDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLGFBQWEsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDVCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQWlCLE9BQU8sQ0FBQyxJQUFJO1FBQ3JDLEtBQUssSUFBSSxDQUFDO1FBQ1YsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakMsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBNQ1BfRklMRV9OQU1FIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNY3BVdGlscyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBGYXN0TUNQIH0gZnJvbSBcImZhc3RtY3BcIjtcbmltcG9ydCB7IExvZ2dlZENsYXNzIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSBcIi4vbWV0YWRhdGFcIjtcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwidXJsXCI7XG5cbi8vIGFsbG93IHJlZmVyZW5jaW5nIF9fZmlsZW5hbWUvX19kaXJuYW1lIGluIGJvdGggQ29tbW9uSlMgYW5kIEVTTSBydW50aW1lc1xuZGVjbGFyZSBjb25zdCBfX2ZpbGVuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5kZWNsYXJlIGNvbnN0IF9fZGlybmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBVdGlsaXR5IGNsYXNzIHRvIGhhbmRsZSBDTEkgZnVuY3Rpb25hbGl0eSBmcm9tIGFsbCBEZWNhZiBtb2R1bGVzXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgd3JhcHBlciBhcm91bmQgQ29tbWFuZGVyLmpzIHRvIGhhbmRsZSBDTEkgY29tbWFuZHMgZnJvbSBkaWZmZXJlbnQgRGVjYWYgbW9kdWxlcy5cbiAqIEl0IGNyYXdscyB0aGUgZmlsZXN5c3RlbSB0byBmaW5kIENMSSBtb2R1bGVzLCBsb2FkcyB0aGVtLCBhbmQgcmVnaXN0ZXJzIHRoZWlyIGNvbW1hbmRzLlxuICovXG5leHBvcnQgY2xhc3MgTWNwV3JhcHBlciBleHRlbmRzIExvZ2dlZENsYXNzIHtcbiAgcHJpdmF0ZSBfbWNwPzogRmFzdE1DUDtcbiAgcHJpdmF0ZSBtb2R1bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgcm9vdFBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGJhc2VQYXRoOiBzdHJpbmcgPSBcIi4vXCIsXG4gICAgcHJpdmF0ZSBjcmF3bExldmVscyA9IDRcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBTdXBwb3J0IGJvdGggQ29tbW9uSlMgYW5kIEVTTSBydW50aW1lcyBmb3IgZmlsZW5hbWUvZGlybmFtZVxuICAgIGxldCBsb2NhbERpcm5hbWU6IHN0cmluZztcbiAgICBpZiAodHlwZW9mIF9fZmlsZW5hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIF9fZGlybmFtZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgLy8gQ29tbW9uSlMgZW52aXJvbm1lbnRcbiAgICAgIGxvY2FsRGlybmFtZSA9IF9fZGlybmFtZSBhcyBzdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEVTTSBvciBvdGhlciBlbnY6IGNvbXB1dGUgaW1wb3J0Lm1ldGEudXJsIGF0IHJ1bnRpbWUgdG8gYXZvaWQgVFMgY29tcGlsZS10aW1lIGltcG9ydC5tZXRhIGNoZWNrc1xuICAgICAgbGV0IG1ldGFVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFVzZSBhIGR5bmFtaWMgZnVuY3Rpb24gc28gVHlwZVNjcmlwdCB3b24ndCBwYXJzZSBgaW1wb3J0Lm1ldGFgIGF0IGNvbXBpbGUgdGltZVxuICAgICAgICBjb25zdCBmbiA9IG5ldyBGdW5jdGlvbihcbiAgICAgICAgICAncmV0dXJuICh0eXBlb2YgaW1wb3J0ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBpbXBvcnQubWV0YSAhPT0gXCJ1bmRlZmluZWRcIikgPyBpbXBvcnQubWV0YS51cmwgOiB1bmRlZmluZWQ7J1xuICAgICAgICApO1xuICAgICAgICBtZXRhVXJsID0gZm4oKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBtZXRhVXJsID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFVcmwpIHtcbiAgICAgICAgbG9jYWxEaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgobWV0YVVybCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTGFzdC1yZXNvcnQgZmFsbGJhY2s6IHVzZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgICAgIGxvY2FsRGlybmFtZSA9IHByb2Nlc3MuY3dkKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucm9vdFBhdGggPSBwYXRoLnJlc29sdmUobG9jYWxEaXJuYW1lLCBcIi4uXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBDb21tYW5kZXIgQ29tbWFuZCBvYmplY3RcbiAgICogQHN1bW1hcnkgTGF6eS1sb2FkcyB0aGUgQ29tbWFuZCBvYmplY3QsIGluaXRpYWxpemluZyBpdCB3aXRoIHRoZSBwYWNrYWdlIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQgdmVyc2lvblxuICAgKiBAcmV0dXJuIHtGYXN0TUNQfSBUaGUgaW5pdGlhbGl6ZWQgQ29tbWFuZCBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0IG1jcCgpIHtcbiAgICBpZiAoIXRoaXMuX21jcCkge1xuICAgICAgdGhpcy5fbWNwID0gbmV3IEZhc3RNQ1Aoe1xuICAgICAgICBuYW1lOiBcImRlY2FmLXRzIE1DUCBzZXJ2ZXJcIixcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBcIlwiLFxuICAgICAgICB2ZXJzaW9uOiBWRVJTSU9OIGFzIGFueSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbWNwO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2FkcyBhbmQgcmVnaXN0ZXJzIGFuIG1jcCBleHRlbnNpb24gbW9kdWxlIGZyb20gYSBmaWxlXG4gICAqIEBzdW1tYXJ5IER5bmFtaWNhbGx5IGltcG9ydHMgYW4gbWNwIGV4dGVuc2lvbiBtb2R1bGUgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgcGF0aCwgaW5pdGlhbGl6ZXMgaXQsIGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIG1vZHVsZXMgY29sbGVjdGlvblxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkKFxuICAgIHNlcnZlcjogRmFzdE1DUCxcbiAgICBmaWxlUGF0aDogc3RyaW5nXG4gICk6IFByb21pc2U8eyBtY3A6IEZhc3RNQ1A7IHBhY2thZ2U6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5sb2FkKTtcblxuICAgIGxldCBwa2c6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCBlbnJpY2g6IGFueTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgTWNwVXRpbHMubG9hZEZyb21GaWxlKGZpbGVQYXRoKTtcbiAgICAgIHBrZyA9IHJlcy5QQUNLQUdFX05BTUU7XG4gICAgICB2ZXJzaW9uID0gcmVzLlZFUlNJT047XG4gICAgICBlbnJpY2ggPSByZXMuZW5yaWNoO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigoZSBhcyBhbnkpLm1lc3NhZ2UgfHwgKGUgYXMgYW55KSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBsb2cuaW5mbyhgRW5yaWNoaW5nIG1jcCBzZXJ2ZXIgd2l0aCBtb2R1bGUgJHtwa2d9IHYke3ZlcnNpb259YCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBlbnJpY2goc2VydmVyKTtcbiAgICAgIHNlcnZlciA9IHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UgPyBhd2FpdCByZXN1bHQgOiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgZmFpbGVkIHRvIGVucmljaCBtY3Agd2l0aCBtb2R1bGUgJHtwa2cgfHwgXCJ1bm5hbWVkXCJ9IHVuZGVyICR7ZmlsZVBhdGh9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IGV9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG1jcDogc2VydmVyLFxuICAgICAgcGFja2FnZTogcGtnLFxuICAgICAgdmVyc2lvbjogdmVyc2lvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaW5kcyBhbmQgbG9hZHMgYWxsIENMSSBtb2R1bGVzIGluIHRoZSBiYXNlUGF0aFxuICAgKiBAc3VtbWFyeSBVc2VzIHRoZSBjcmF3bCBtZXRob2QgdG8gZmluZCBhbGwgQ0xJIG1vZHVsZXMgaW4gdGhlIHNwZWNpZmllZCBiYXNlIHBhdGgsXG4gICAqIHRoZW4gbG9hZHMgYW5kIHJlZ2lzdGVycyBlYWNoIG1vZHVsZSBhcyBhIHN1YmNvbW1hbmRcbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbW9kdWxlcyBhcmUgbG9hZGVkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaVdyYXBwZXJcbiAgICogICBwYXJ0aWNpcGFudCBGaWxlc3lzdGVtXG4gICAqICAgcGFydGljaXBhbnQgTW9kdWxlXG4gICAqXG4gICAqICAgQ2xpV3JhcHBlci0+PkZpbGVzeXN0ZW06IEpvaW4gYmFzZVBhdGggd2l0aCBjd2RcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogY3Jhd2woYmFzZVBhdGgsIGNyYXdsTGV2ZWxzKVxuICAgKiAgIENsaVdyYXBwZXItLT4+Q2xpV3JhcHBlcjogbW9kdWxlc1tdXG4gICAqICAgbG9vcCBGb3IgZWFjaCBtb2R1bGVcbiAgICogICAgIGFsdCBOb3QgQGRlY2FmLXRzL2NsaVxuICAgKiAgICAgICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogbG9hZChtb2R1bGUsIGN3ZClcbiAgICogICAgICAgQ2xpV3JhcHBlci0tPj5DbGlXcmFwcGVyOiBuYW1lXG4gICAqICAgICAgIENsaVdyYXBwZXItPj5DbGlXcmFwcGVyOiBDaGVjayBpZiBjb21tYW5kIGV4aXN0c1xuICAgKiAgICAgICBhbHQgQ29tbWFuZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICAgICAgQ2xpV3JhcHBlci0+PkNvbW1hbmQ6IGNvbW1hbmQobmFtZSkuYWRkQ29tbWFuZChtb2R1bGVzW25hbWVdKVxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIENsaVdyYXBwZXItPj5Db25zb2xlOiBMb2cgbG9hZGVkIG1vZHVsZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYm9vdCgpIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5ib290KTtcbiAgICBsZXQgc2VydmVyID0gdGhpcy5tY3A7XG4gICAgLy8gZGlzY292ZXIgbW9kdWxlcyBieSBjcmF3bGluZyBiYXNlUGF0aFxuICAgIGNvbnN0IG1vZHVsZUZpbGVzID0gdGhpcy5jcmF3bChcbiAgICAgIHBhdGgucmVzb2x2ZSh0aGlzLmJhc2VQYXRoKSxcbiAgICAgIHRoaXMuY3Jhd2xMZXZlbHNcbiAgICApO1xuICAgIGZvciAoY29uc3QgbW9kdWxlRmlsZSBvZiBtb2R1bGVGaWxlcykge1xuICAgICAgaWYgKG1vZHVsZUZpbGUuaW5jbHVkZXMoXCJAZGVjYWYtdHMvbWNwXCIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5sb2FkKHNlcnZlciwgbW9kdWxlRmlsZSk7XG4gICAgICAgIHNlcnZlciA9IHJlcy5tY3A7XG4gICAgICAgIHRoaXMubW9kdWxlc1tyZXMucGFja2FnZV0gPSBtb2R1bGVGaWxlO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIE1DUCBjb25maWdzIGZvciAke21vZHVsZUZpbGV9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IGV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBsb2FkZWQgbW9kdWxlczpcXG4ke09iamVjdC5rZXlzKHRoaXMubW9kdWxlcylcbiAgICAgICAgLm1hcCgoaykgPT4gYC0gJHtrfWApXG4gICAgICAgIC5qb2luKFwiXFxuXCIpfWBcbiAgICApO1xuICAgIHJldHVybiBzZXJ2ZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlY3Vyc2l2ZWx5IHNlYXJjaGVzIGZvciBDTEkgbW9kdWxlIGZpbGVzIGluIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlXG4gICAqIEBzdW1tYXJ5IENyYXdscyB0aGUgYmFzZVBhdGggdXAgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZm9sZGVyIGxldmVscyB0byBmaW5kIGZpbGVzIG5hbWVkIGFjY29yZGluZyB0byBDTElfRklMRV9OQU1FXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYWJzb2x1dGUgYmFzZSBwYXRoIHRvIHN0YXJ0IHNlYXJjaGluZyBpblxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xldmVscz0yXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGlyZWN0b3J5IGxldmVscyB0byBjcmF3bFxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQW4gYXJyYXkgb2YgZmlsZSBwYXRocyB0byBDTEkgbW9kdWxlc1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmF3bChiYXNlUGF0aDogc3RyaW5nLCBsZXZlbHM6IG51bWJlciA9IDIpIHtcbiAgICBpZiAobGV2ZWxzIDw9IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gZnMucmVhZGRpclN5bmMoYmFzZVBhdGgpLnJlZHVjZSgoYWNjdW06IHN0cmluZ1tdLCBmaWxlKSA9PiB7XG4gICAgICBmaWxlID0gcGF0aC5qb2luKGJhc2VQYXRoLCBmaWxlKTtcbiAgICAgIGlmIChmcy5zdGF0U3luYyhmaWxlKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGFjY3VtLnB1c2goLi4udGhpcy5jcmF3bChmaWxlLCBsZXZlbHMgLSAxKSk7XG4gICAgICB9IGVsc2UgaWYgKGZpbGUubWF0Y2gobmV3IFJlZ0V4cChgJHtNQ1BfRklMRV9OQU1FfS5bY21dP2pzJGAsIFwiZ21cIikpKSB7XG4gICAgICAgIGFjY3VtLnB1c2goZmlsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyB0aGUgQ0xJIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50c1xuICAgKiBAc3VtbWFyeSBCb290cyB0aGUgQ0xJIGJ5IGxvYWRpbmcgYWxsIG1vZHVsZXMsIHRoZW4gcGFyc2VzIGFuZCBleGVjdXRlcyB0aGUgY29tbWFuZCBzcGVjaWZpZWQgaW4gdGhlIGFyZ3VtZW50c1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncz1wcm9jZXNzLmFyZ3ZdIENvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gcGFyc2UgYW5kIGV4ZWN1dGVcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29tbWFuZCBleGVjdXRpb24gaXMgY29tcGxldGVcbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgQ2xpV3JhcHBlclxuICAgKiAgIHBhcnRpY2lwYW50IENvbW1hbmRcbiAgICpcbiAgICogICBDbGllbnQtPj5DbGlXcmFwcGVyOiBydW4oYXJncylcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogYm9vdCgpXG4gICAqICAgTm90ZSBvdmVyIENsaVdyYXBwZXI6IExvYWRzIGFsbCBtb2R1bGVzXG4gICAqICAgQ2xpV3JhcHBlci0+PkNvbW1hbmQ6IHBhcnNlQXN5bmMoYXJncylcbiAgICogICBDb21tYW5kLS0+PkNsaVdyYXBwZXI6IHJlc3VsdFxuICAgKiAgIENsaVdyYXBwZXItLT4+Q2xpZW50OiByZXN1bHRcbiAgICovXG4gIGFzeW5jIHJ1bihhcmdzOiBzdHJpbmdbXSA9IHByb2Nlc3MuYXJndikge1xuICAgIHZvaWQgYXJncztcbiAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCB0aGlzLmJvb3QoKTtcbiAgICBhd2FpdCBzZXJ2ZXIuc3RhcnQoeyB0cmFuc3BvcnRUeXBlOiBcInN0ZGlvXCIgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,22 +0,0 @@
1
- #!/usr/bin/env node
2
- import { assertModuleScaffolding } from "../utils/moduleValidator";
3
- async function main() {
4
- try {
5
- const issues = assertModuleScaffolding();
6
- if (issues.length) {
7
- console.log(`[module-validator] Completed with ${issues.length} issue(s) (warnings may persist)`);
8
- for (const issue of issues) {
9
- console.log(` - [${issue.severity.toUpperCase()}] ${issue.module}: ${issue.detail}`);
10
- }
11
- }
12
- else {
13
- console.log("[module-validator] Modules validated successfully");
14
- }
15
- }
16
- catch (error) {
17
- console.error(`[module-validator] ${error instanceof Error ? error.message : error}`);
18
- process.exitCode = 1;
19
- }
20
- }
21
- void main();
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtbW9kdWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iaW4vdmFsaWRhdGUtbW9kdWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFbkUsS0FBSyxVQUFVLElBQUk7SUFDakIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsdUJBQXVCLEVBQUUsQ0FBQztRQUN6QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixPQUFPLENBQUMsR0FBRyxDQUNULHFDQUFxQyxNQUFNLENBQUMsTUFBTSxrQ0FBa0MsQ0FDckYsQ0FBQztZQUNGLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQ1QsUUFBUSxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUN6RSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO1FBQ25FLENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdEYsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQztBQUNILENBQUM7QUFFRCxLQUFLLElBQUksRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuaW1wb3J0IHsgYXNzZXJ0TW9kdWxlU2NhZmZvbGRpbmcgfSBmcm9tIFwiLi4vdXRpbHMvbW9kdWxlVmFsaWRhdG9yXCI7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgaXNzdWVzID0gYXNzZXJ0TW9kdWxlU2NhZmZvbGRpbmcoKTtcbiAgICBpZiAoaXNzdWVzLmxlbmd0aCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBbbW9kdWxlLXZhbGlkYXRvcl0gQ29tcGxldGVkIHdpdGggJHtpc3N1ZXMubGVuZ3RofSBpc3N1ZShzKSAod2FybmluZ3MgbWF5IHBlcnNpc3QpYFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgaXNzdWUgb2YgaXNzdWVzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGAgIC0gWyR7aXNzdWUuc2V2ZXJpdHkudG9VcHBlckNhc2UoKX1dICR7aXNzdWUubW9kdWxlfTogJHtpc3N1ZS5kZXRhaWx9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcIlttb2R1bGUtdmFsaWRhdG9yXSBNb2R1bGVzIHZhbGlkYXRlZCBzdWNjZXNzZnVsbHlcIik7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYFttb2R1bGUtdmFsaWRhdG9yXSAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3J9YCk7XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gIH1cbn1cblxudm9pZCBtYWluKCk7XG4iXX0=
@@ -1,26 +0,0 @@
1
- export type Provenance = {
2
- moduleName: string;
3
- modulePath: string;
4
- };
5
- export type AggregationConflict = {
6
- key: string;
7
- existing: Provenance;
8
- incoming: Provenance;
9
- };
10
- export type AggregationResult<T = any> = {
11
- prompts: Array<T & {
12
- provenance: Provenance;
13
- }>;
14
- resources: Array<T & {
15
- provenance: Provenance;
16
- }>;
17
- templates: Array<T & {
18
- provenance: Provenance;
19
- }>;
20
- tools: Array<T & {
21
- provenance: Provenance;
22
- }>;
23
- conflicts: AggregationConflict[];
24
- };
25
- export declare function aggregateModules(repoRoot: string): Promise<AggregationResult>;
26
- export declare function aggregateModulesSync(repoRoot: string): AggregationResult;
@@ -1,185 +0,0 @@
1
- // Aggregator: import module index files and merge exported arrays with provenance + duplicate detection
2
- import path from "path";
3
- import fs from "fs";
4
- import { pathToFileURL } from "url";
5
- import { findModuleDirs } from "./validation";
6
- const SUBFOLDERS = ["prompts", "resources", "templates", "tools"];
7
- const INDEX_CANDIDATES = [
8
- "index.ts",
9
- "index.tsx",
10
- "index.js",
11
- "index.cjs",
12
- "index.mjs",
13
- ];
14
- function findIndexFile(folder) {
15
- for (const c of INDEX_CANDIDATES) {
16
- const f = path.join(folder, c);
17
- if (fs.existsSync(f))
18
- return f;
19
- }
20
- return undefined;
21
- }
22
- function makeKeyForItem(item) {
23
- if (!item)
24
- return JSON.stringify(item);
25
- if (typeof item === "string")
26
- return `str:${item}`;
27
- if (typeof item === "number")
28
- return `num:${item}`;
29
- if (item.id)
30
- return `id:${item.id}`;
31
- if (item.name)
32
- return `name:${item.name}`;
33
- // fallback to stable string
34
- try {
35
- return `obj:${JSON.stringify(item)}`;
36
- }
37
- catch (e) {
38
- return `obj:${String(item)}`;
39
- }
40
- }
41
- async function loadArrayFromIndex(filePath) {
42
- // Prefer a fast, static parse of the first array literal found in the file.
43
- try {
44
- const content = fs.readFileSync(filePath, "utf8");
45
- const start = content.indexOf("[");
46
- if (start !== -1) {
47
- let depth = 0;
48
- let end = -1;
49
- for (let i = start; i < content.length; i++) {
50
- const ch = content[i];
51
- if (ch === "[")
52
- depth++;
53
- else if (ch === "]") {
54
- depth--;
55
- if (depth === 0) {
56
- end = i;
57
- break;
58
- }
59
- }
60
- }
61
- if (end !== -1) {
62
- const arrText = content.slice(start, end + 1);
63
- try {
64
- return JSON.parse(arrText);
65
- }
66
- catch (e) {
67
- // Normalize TS object literals to JSON:
68
- // - convert single quotes to double quotes
69
- // - quote unquoted object keys
70
- // - strip trailing commas
71
- const normalized = arrText
72
- // unify quotes in string literals
73
- .replace(/'(?:\\'|[^'])*'/g, (m) => m.replace(/'/g, '"'))
74
- // quote unquoted keys after { or ,
75
- .replace(/([\{,]\s*)([A-Za-z_$][\w$]*)(\s*:)/g, '$1"$2"$3')
76
- // remove trailing commas before ] or }
77
- .replace(/,(\s*[\}\]])/g, '$1');
78
- try {
79
- return JSON.parse(normalized);
80
- }
81
- catch (e2) {
82
- // fallthrough to import attempt below
83
- }
84
- }
85
- }
86
- }
87
- }
88
- catch (e) {
89
- // ignore static parse errors and fall back to import
90
- }
91
- try {
92
- const fileUrl = pathToFileURL(filePath).href;
93
- const mod = await import(fileUrl);
94
- // Find first export that is an array
95
- for (const key of Object.keys(mod)) {
96
- const val = mod[key];
97
- if (Array.isArray(val))
98
- return val;
99
- }
100
- // default export check
101
- if (Array.isArray(mod.default))
102
- return mod.default;
103
- return undefined;
104
- }
105
- catch (err) {
106
- // fallback: if import fails, try to static-parse again (already attempted) and finally return undefined
107
- return undefined;
108
- }
109
- }
110
- export async function aggregateModules(repoRoot) {
111
- const dirs = findModuleDirs(repoRoot);
112
- const master = {
113
- prompts: [],
114
- resources: [],
115
- templates: [],
116
- tools: [],
117
- conflicts: [],
118
- };
119
- // maps to detect duplicates per type
120
- const maps = {
121
- prompts: new Map(),
122
- resources: new Map(),
123
- templates: new Map(),
124
- tools: new Map(),
125
- };
126
- for (const moduleDir of dirs) {
127
- const moduleName = path.basename(moduleDir);
128
- for (const sub of SUBFOLDERS) {
129
- const folder = path.join(moduleDir, sub);
130
- const indexFile = findIndexFile(folder);
131
- if (!indexFile)
132
- continue;
133
- let arr;
134
- try {
135
- arr = await loadArrayFromIndex(indexFile);
136
- }
137
- catch (err) {
138
- // skip module on import error but record as conflict-like issue
139
- master.conflicts.push({
140
- key: `import-error:${moduleName}:${sub}`,
141
- existing: { moduleName, modulePath: moduleDir },
142
- incoming: { moduleName, modulePath: moduleDir },
143
- });
144
- continue;
145
- }
146
- if (!arr || !Array.isArray(arr))
147
- continue;
148
- for (const item of arr) {
149
- const key = makeKeyForItem(item);
150
- const provenance = { moduleName, modulePath: moduleDir };
151
- const map = maps[sub];
152
- if (map.has(key)) {
153
- // record conflict deterministically (existing vs incoming)
154
- const existing = map.get(key);
155
- master.conflicts.push({ key, existing, incoming: provenance });
156
- // skip adding duplicate
157
- continue;
158
- }
159
- map.set(key, provenance);
160
- master[sub].push({ ...item, provenance });
161
- }
162
- }
163
- }
164
- return master;
165
- }
166
- // For compatibility with CommonJS call sites (not exported by ESM), provide a sync wrapper
167
- export function aggregateModulesSync(repoRoot) {
168
- // synchronous wrapper that runs the async function and blocks — suitable for small module sets
169
- const p = aggregateModules(repoRoot);
170
- let result;
171
- let done = false;
172
- p.then((r) => {
173
- result = r;
174
- done = true;
175
- }).catch((e) => {
176
- throw e;
177
- });
178
- // spin-wait (acceptable in small dev scripts)
179
- const until = Date.now() + 5000;
180
- while (!done && Date.now() < until) { }
181
- if (!done)
182
- throw new Error("aggregateModulesSync: timeout waiting for async aggregation");
183
- return result;
184
- }
185
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRlTW9kdWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tY3AvYWdncmVnYXRlTW9kdWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3R0FBd0c7QUFDeEcsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFpQjlDLE1BQU0sVUFBVSxHQUFHLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEUsTUFBTSxnQkFBZ0IsR0FBRztJQUN2QixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsV0FBVztDQUNaLENBQUM7QUFFRixTQUFTLGFBQWEsQ0FBQyxNQUFjO0lBQ25DLEtBQUssTUFBTSxDQUFDLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNqQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQixJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxJQUFTO0lBQy9CLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUNuRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDbkQs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Q0FDOUQsQ0FBQztJQUNKLE9BQU8sTUFBMkIsQ0FBQztBQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQWdncmVnYXRvcjogaW1wb3J0IG1vZHVsZSBpbmRleCBmaWxlcyBhbmQgbWVyZ2UgZXhwb3J0ZWQgYXJyYXlzIHdpdGggcHJvdmVuYW5jZSArIGR1cGxpY2F0ZSBkZXRlY3Rpb25cbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcInVybFwiO1xuaW1wb3J0IHsgZmluZE1vZHVsZURpcnMgfSBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCB0eXBlIFByb3ZlbmFuY2UgPSB7IG1vZHVsZU5hbWU6IHN0cmluZzsgbW9kdWxlUGF0aDogc3RyaW5nIH07XG5leHBvcnQgdHlwZSBBZ2dyZWdhdGlvbkNvbmZsaWN0ID0ge1xuICBrZXk6IHN0cmluZztcbiAgZXhpc3Rpbmc6IFByb3ZlbmFuY2U7XG4gIGluY29taW5nOiBQcm92ZW5hbmNlO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25SZXN1bHQ8VCA9IGFueT4gPSB7XG4gIHByb21wdHM6IEFycmF5PFQgJiB7IHByb3ZlbmFuY2U6IFByb3ZlbmFuY2UgfT47XG4gIHJlc291cmNlczogQXJyYXk8VCAmIHsgcHJvdmVuYW5jZTogUHJvdmVuYW5jZSB9PjtcbiAgdGVtcGxhdGVzOiBBcnJheTxUICYgeyBwcm92ZW5hbmNlOiBQcm92ZW5hbmNlIH0+O1xuICB0b29sczogQXJyYXk8VCAmIHsgcHJvdmVuYW5jZTogUHJvdmVuYW5jZSB9PjtcbiAgY29uZmxpY3RzOiBBZ2dyZWdhdGlvbkNvbmZsaWN0W107XG59O1xuXG5jb25zdCBTVUJGT0xERVJTID0gW1wicHJvbXB0c1wiLCBcInJlc291cmNlc1wiLCBcInRlbXBsYXRlc1wiLCBcInRvb2xzXCJdO1xuY29uc3QgSU5ERVhfQ0FORElEQVRFUyA9IFtcbiAgXCJpbmRleC50c1wiLFxuICBcImluZGV4LnRzeFwiLFxuICBcImluZGV4LmpzXCIsXG4gIFwiaW5kZXguY2pzXCIsXG4gIFwiaW5kZXgubWpzXCIsXG5dO1xuXG5mdW5jdGlvbiBmaW5kSW5kZXhGaWxlKGZvbGRlcjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBjIG9mIElOREVYX0NBTkRJREFURVMpIHtcbiAgICBjb25zdCBmID0gcGF0aC5qb2luKGZvbGRlciwgYyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZikpIHJldHVybiBmO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIG1ha2VLZXlGb3JJdGVtKGl0ZW06IGFueSk6IHN0cmluZyB7XG4gIGlmICghaXRlbSkgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGl0ZW0pO1xuICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHJldHVybiBgc3RyOiR7aXRlbX1gO1xuICBpZiAodHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIpIHJldHVybiBgbnVtOiR7aXRlbX1gO1xuICBpZiAoaXRlbS5pZCkgcmV0dXJuIGBpZDoke2l0ZW0uaWR9YDtcbiAgaWYgKGl0ZW0ubmFtZSkgcmV0dXJuIGBuYW1lOiR7aXRlbS5uYW1lfWA7XG4gIC8vIGZhbGxiYWNrIHRvIHN0YWJsZSBzdHJpbmdcbiAgdHJ5IHtcbiAgICByZXR1cm4gYG9iajoke0pTT04uc3RyaW5naWZ5KGl0ZW0pfWA7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gYG9iajoke1N0cmluZyhpdGVtKX1gO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRBcnJheUZyb21JbmRleChcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxhbnlbXSB8IHVuZGVmaW5lZD4ge1xuICAvLyBQcmVmZXIgYSBmYXN0LCBzdGF0aWMgcGFyc2Ugb2YgdGhlIGZpcnN0IGFycmF5IGxpdGVyYWwgZm91bmQgaW4gdGhlIGZpbGUuXG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGY4XCIpO1xuICAgIGNvbnN0IHN0YXJ0ID0gY29udGVudC5pbmRleE9mKFwiW1wiKTtcbiAgICBpZiAoc3RhcnQgIT09IC0xKSB7XG4gICAgICBsZXQgZGVwdGggPSAwO1xuICAgICAgbGV0IGVuZCA9IC0xO1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgY29udGVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaCA9IGNvbnRlbnRbaV07XG4gICAgICAgIGlmIChjaCA9PT0gXCJbXCIpIGRlcHRoKys7XG4gICAgICAgIGVsc2UgaWYgKGNoID09PSBcIl1cIikge1xuICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgICBlbmQgPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZW5kICE9PSAtMSkge1xuICAgICAgICBjb25zdCBhcnJUZXh0ID0gY29udGVudC5zbGljZShzdGFydCwgZW5kICsgMSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoYXJyVGV4dCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBOb3JtYWxpemUgVFMgb2JqZWN0IGxpdGVyYWxzIHRvIEpTT046XG4gICAgICAgICAgLy8gLSBjb252ZXJ0IHNpbmdsZSBxdW90ZXMgdG8gZG91YmxlIHF1b3Rlc1xuICAgICAgICAgIC8vIC0gcXVvdGUgdW5xdW90ZWQgb2JqZWN0IGtleXNcbiAgICAgICAgICAvLyAtIHN0cmlwIHRyYWlsaW5nIGNvbW1hc1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBhcnJUZXh0XG4gICAgICAgICAgICAvLyB1bmlmeSBxdW90ZXMgaW4gc3RyaW5nIGxpdGVyYWxzXG4gICAgICAgICAgICAucmVwbGFjZSgvJyg/OlxcXFwnfFteJ10pKicvZywgKG0pID0+IG0ucmVwbGFjZSgvJy9nLCAnXCInKSlcbiAgICAgICAgICAgIC8vIHF1b3RlIHVucXVvdGVkIGtleXMgYWZ0ZXIgeyBvciAsXG4gICAgICAgICAgICAucmVwbGFjZSgvKFtcXHssXVxccyopKFtBLVphLXpfJF1bXFx3JF0qKShcXHMqOikvZywgJyQxXCIkMlwiJDMnKVxuICAgICAgICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIGNvbW1hcyBiZWZvcmUgXSBvciB9XG4gICAgICAgICAgICAucmVwbGFjZSgvLChcXHMqW1xcfVxcXV0pL2csICckMScpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShub3JtYWxpemVkKTtcbiAgICAgICAgICB9IGNhdGNoIChlMikge1xuICAgICAgICAgICAgLy8gZmFsbHRocm91Z2ggdG8gaW1wb3J0IGF0dGVtcHQgYmVsb3dcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBpZ25vcmUgc3RhdGljIHBhcnNlIGVycm9ycyBhbmQgZmFsbCBiYWNrIHRvIGltcG9ydFxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlVXJsID0gcGF0aFRvRmlsZVVSTChmaWxlUGF0aCkuaHJlZjtcbiAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoZmlsZVVybCk7XG4gICAgLy8gRmluZCBmaXJzdCBleHBvcnQgdGhhdCBpcyBhbiBhcnJheVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG1vZCkpIHtcbiAgICAgIGNvbnN0IHZhbCA9IChtb2QgYXMgYW55KVtrZXldO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgLy8gZGVmYXVsdCBleHBvcnQgY2hlY2tcbiAgICBpZiAoQXJyYXkuaXNBcnJheSgobW9kIGFzIGFueSkuZGVmYXVsdCkpIHJldHVybiAobW9kIGFzIGFueSkuZGVmYXVsdDtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBmYWxsYmFjazogaWYgaW1wb3J0IGZhaWxzLCB0cnkgdG8gc3RhdGljLXBhcnNlIGFnYWluIChhbHJlYWR5IGF0dGVtcHRlZCkgYW5kIGZpbmFsbHkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFnZ3JlZ2F0ZU1vZHVsZXMoXG4gIHJlcG9Sb290OiBzdHJpbmdcbik6IFByb21pc2U8QWdncmVnYXRpb25SZXN1bHQ+IHtcbiAgY29uc3QgZGlycyA9IGZpbmRNb2R1bGVEaXJzKHJlcG9Sb290KTtcbiAgY29uc3QgbWFzdGVyID0ge1xuICAgIHByb21wdHM6IFtdIGFzIGFueVtdLFxuICAgIHJlc291cmNlczogW10gYXMgYW55W10sXG4gICAgdGVtcGxhdGVzOiBbXSBhcyBhbnlbXSxcbiAgICB0b29sczogW10gYXMgYW55W10sXG4gICAgY29uZmxpY3RzOiBbXSBhcyBBZ2dyZWdhdGlvbkNvbmZsaWN0W10sXG4gIH07XG5cbiAgLy8gbWFwcyB0byBkZXRlY3QgZHVwbGljYXRlcyBwZXIgdHlwZVxuICBjb25zdCBtYXBzOiBSZWNvcmQ8c3RyaW5nLCBNYXA8c3RyaW5nLCBQcm92ZW5hbmNlPj4gPSB7XG4gICAgcHJvbXB0czogbmV3IE1hcCgpLFxuICAgIHJlc291cmNlczogbmV3IE1hcCgpLFxuICAgIHRlbXBsYXRlczogbmV3IE1hcCgpLFxuICAgIHRvb2xzOiBuZXcgTWFwKCksXG4gIH07XG5cbiAgZm9yIChjb25zdCBtb2R1bGVEaXIgb2YgZGlycykge1xuICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKG1vZHVsZURpcik7XG4gICAgZm9yIChjb25zdCBzdWIgb2YgU1VCRk9MREVSUykge1xuICAgICAgY29uc3QgZm9sZGVyID0gcGF0aC5qb2luKG1vZHVsZURpciwgc3ViKTtcbiAgICAgIGNvbnN0IGluZGV4RmlsZSA9IGZpbmRJbmRleEZpbGUoZm9sZGVyKTtcbiAgICAgIGlmICghaW5kZXhGaWxlKSBjb250aW51ZTtcbiAgICAgIGxldCBhcnI6IGFueVtdIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXJyID0gYXdhaXQgbG9hZEFycmF5RnJvbUluZGV4KGluZGV4RmlsZSk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAvLyBza2lwIG1vZHVsZSBvbiBpbXBvcnQgZXJyb3IgYnV0IHJlY29yZCBhcyBjb25mbGljdC1saWtlIGlzc3VlXG4gICAgICAgIG1hc3Rlci5jb25mbGljdHMucHVzaCh7XG4gICAgICAgICAga2V5OiBgaW1wb3J0LWVycm9yOiR7bW9kdWxlTmFtZX06JHtzdWJ9YCxcbiAgICAgICAgICBleGlzdGluZzogeyBtb2R1bGVOYW1lLCBtb2R1bGVQYXRoOiBtb2R1bGVEaXIgfSxcbiAgICAgICAgICBpbmNvbWluZzogeyBtb2R1bGVOYW1lLCBtb2R1bGVQYXRoOiBtb2R1bGVEaXIgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFhcnIgfHwgIUFycmF5LmlzQXJyYXkoYXJyKSkgY29udGludWU7XG5cbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcnIpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbWFrZUtleUZvckl0ZW0oaXRlbSk7XG4gICAgICAgIGNvbnN0IHByb3ZlbmFuY2UgPSB7IG1vZHVsZU5hbWUsIG1vZHVsZVBhdGg6IG1vZHVsZURpciB9O1xuICAgICAgICBjb25zdCBtYXAgPSBtYXBzW3N1Yl07XG4gICAgICAgIGlmIChtYXAuaGFzKGtleSkpIHtcbiAgICAgICAgICAvLyByZWNvcmQgY29uZmxpY3QgZGV0ZXJtaW5pc3RpY2FsbHkgKGV4aXN0aW5nIHZzIGluY29taW5nKVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gbWFwLmdldChrZXkpITtcbiAgICAgICAgICBtYXN0ZXIuY29uZmxpY3RzLnB1c2goeyBrZXksIGV4aXN0aW5nLCBpbmNvbWluZzogcHJvdmVuYW5jZSB9KTtcbiAgICAgICAgICAvLyBza2lwIGFkZGluZyBkdXBsaWNhdGVcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBtYXAuc2V0KGtleSwgcHJvdmVuYW5jZSk7XG4gICAgICAgIChtYXN0ZXIgYXMgYW55KVtzdWJdLnB1c2goeyAuLi5pdGVtLCBwcm92ZW5hbmNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYXN0ZXI7XG59XG5cbi8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggQ29tbW9uSlMgY2FsbCBzaXRlcyAobm90IGV4cG9ydGVkIGJ5IEVTTSksIHByb3ZpZGUgYSBzeW5jIHdyYXBwZXJcbmV4cG9ydCBmdW5jdGlvbiBhZ2dyZWdhdGVNb2R1bGVzU3luYyhyZXBvUm9vdDogc3RyaW5nKSB7XG4gIC8vIHN5bmNocm9ub3VzIHdyYXBwZXIgdGhhdCBydW5zIHRoZSBhc3luYyBmdW5jdGlvbiBhbmQgYmxvY2tzIOKAlCBzdWl0YWJsZSBmb3Igc21hbGwgbW9kdWxlIHNldHNcbiAgY29uc3QgcCA9IGFnZ3JlZ2F0ZU1vZHVsZXMocmVwb1Jvb3QpO1xuICBsZXQgcmVzdWx0OiBhbnk7XG4gIGxldCBkb25lID0gZmFsc2U7XG4gIHAudGhlbigocikgPT4ge1xuICAgIHJlc3VsdCA9IHI7XG4gICAgZG9uZSA9IHRydWU7XG4gIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgdGhyb3cgZTtcbiAgfSk7XG4gIC8vIHNwaW4td2FpdCAoYWNjZXB0YWJsZSBpbiBzbWFsbCBkZXYgc2NyaXB0cylcbiAgY29uc3QgdW50aWwgPSBEYXRlLm5vdygpICsgNTAwMDtcbiAgd2hpbGUgKCFkb25lICYmIERhdGUubm93KCkgPCB1bnRpbCkge31cbiAgaWYgKCFkb25lKVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiYWdncmVnYXRlTW9kdWxlc1N5bmM6IHRpbWVvdXQgd2FpdGluZyBmb3IgYXN5bmMgYWdncmVnYXRpb25cIlxuICAgICk7XG4gIHJldHVybiByZXN1bHQgYXMgQWdncmVnYXRpb25SZXN1bHQ7XG59XG4iXX0=
@@ -1,23 +0,0 @@
1
- export declare function isSourceFile(p: string): boolean;
2
- export declare function isTestFile(p: string): boolean;
3
- export declare function extractExports(fileContent: string): string[];
4
- export declare function extractDecorators(fileContent: string): string[];
5
- export declare function summarizeReadme(readme?: string): {
6
- title: string;
7
- bullets: string[];
8
- } | undefined;
9
- export declare function analyzeRepo(root: string): {
10
- files: string[];
11
- testFiles: string[];
12
- api: Record<string, {
13
- exports: string[];
14
- decorators: string[];
15
- }>;
16
- tests: Record<string, {
17
- mentions: string[];
18
- }>;
19
- readme: {
20
- title: string;
21
- bullets: string[];
22
- } | undefined;
23
- };
@@ -1,70 +0,0 @@
1
- // Analysis helpers (minimal yet effective, text-based to avoid heavy AST deps)
2
- import path from "path";
3
- import fs from "fs";
4
- import { listFilesRecursive, readFileSafe } from "./utils";
5
- export function isSourceFile(p) {
6
- return /\.(ts|tsx|js|jsx)$/.test(p) && !p.endsWith(".d.ts");
7
- }
8
- export function isTestFile(p) {
9
- return /(\.test\.|\.spec\.)/.test(p);
10
- }
11
- export function extractExports(fileContent) {
12
- const names = new Set();
13
- const exportRe = /(export\s+(?:default\s+)?(?:class|function|const|let|var|interface|type|enum)\s+)([A-Za-z0-9_]+)/g;
14
- const namedRe = /export\s*\{([^}]+)\}/g;
15
- let m;
16
- while ((m = exportRe.exec(fileContent)))
17
- names.add(m[2]);
18
- while ((m = namedRe.exec(fileContent))) {
19
- m[1]
20
- .split(",")
21
- .map((s) => s.trim().split(" as ")[0].trim())
22
- .forEach((n) => {
23
- if (n)
24
- names.add(n);
25
- });
26
- }
27
- return [...names].sort();
28
- }
29
- export function extractDecorators(fileContent) {
30
- const decs = new Set();
31
- const decRe = /@([A-Za-z_][A-Za-z0-9_]*)/g;
32
- let m;
33
- while ((m = decRe.exec(fileContent)))
34
- decs.add(m[1]);
35
- return [...decs].sort();
36
- }
37
- export function summarizeReadme(readme) {
38
- if (!readme)
39
- return undefined;
40
- const lines = readme.split(/\r?\n/).filter(Boolean);
41
- const title = lines.find((l) => /^#\s+/.test(l))?.replace(/^#\s+/, "") || "README";
42
- const bullets = lines.filter((l) => /^[-*]\s+/.test(l)).slice(0, 20);
43
- return { title, bullets };
44
- }
45
- export function analyzeRepo(root) {
46
- const src = path.join(root, "src");
47
- const testDir = path.join(root, "tests");
48
- const readmePath = path.join(root, "README.md");
49
- const readme = readFileSafe(readmePath);
50
- const files = fs.existsSync(src) ? listFilesRecursive(src, isSourceFile) : [];
51
- const testFiles = fs.existsSync(testDir)
52
- ? listFilesRecursive(testDir, (f) => isSourceFile(f) && isTestFile(f))
53
- : [];
54
- const api = {};
55
- for (const f of files) {
56
- const content = readFileSafe(f) || "";
57
- api[path.relative(root, f)] = {
58
- exports: extractExports(content),
59
- decorators: extractDecorators(content),
60
- };
61
- }
62
- const tests = {};
63
- for (const f of testFiles) {
64
- const content = readFileSafe(f) || "";
65
- const mentions = Array.from(new Set([...extractExports(content), ...extractDecorators(content)])).sort();
66
- tests[path.relative(root, f)] = { mentions };
67
- }
68
- return { files, testFiles, api, tests, readme: summarizeReadme(readme) };
69
- }
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tY3AvY29kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrRUFBK0U7QUFDL0UsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRTNELE1BQU0sVUFBVSxZQUFZLENBQUMsQ0FBUztJQUNwQyxPQUFPLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUNELE1BQU0sVUFBVSxVQUFVLENBQUMsQ0FBUztJQUNsQyxPQUFPLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxXQUFtQjtJQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ2hDLE1BQU0sUUFBUSxHQUNaLG1HQUFtRyxDQUFDO0lBQ3RHLE1BQU0sT0FBTyxHQUFHLHVCQUF1QixDQUFDO0lBQ3hDLElBQUksQ0FBeUIsQ0FBQztJQUM5QixPQUFPLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELE9BQU8sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDVixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FB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UUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHO1lBQzVCLE9BQU8sRUFBRSxjQUFjLENBQUMsT0FBTyxDQUFDO1lBQ2hDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7U0FDdkMsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBMkMsRUFBRSxDQUFDO0lBQ3pELEtBQUssTUFBTSxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7UUFDMUIsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUN6QixJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUNyRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1QsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7QUFDM0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuYWx5c2lzIGhlbHBlcnMgKG1pbmltYWwgeWV0IGVmZmVjdGl2ZSwgdGV4dC1iYXNlZCB0byBhdm9pZCBoZWF2eSBBU1QgZGVwcylcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBsaXN0RmlsZXNSZWN1cnNpdmUsIHJlYWRGaWxlU2FmZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NvdXJjZUZpbGUocDogc3RyaW5nKSB7XG4gIHJldHVybiAvXFwuKHRzfHRzeHxqc3xqc3gpJC8udGVzdChwKSAmJiAhcC5lbmRzV2l0aChcIi5kLnRzXCIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVGVzdEZpbGUocDogc3RyaW5nKSB7XG4gIHJldHVybiAvKFxcLnRlc3RcXC58XFwuc3BlY1xcLikvLnRlc3QocCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RXhwb3J0cyhmaWxlQ29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBleHBvcnRSZSA9XG4gICAgLyhleHBvcnRcXHMrKD86ZGVmYXVsdFxccyspPyg/OmNsYXNzfGZ1bmN0aW9ufGNvbnN0fGxldHx2YXJ8aW50ZXJmYWNlfHR5cGV8ZW51bSlcXHMrKShbQS1aYS16MC05X10rKS9nO1xuICBjb25zdCBuYW1lZFJlID0gL2V4cG9ydFxccypcXHsoW159XSspXFx9L2c7XG4gIGxldCBtOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICB3aGlsZSAoKG0gPSBleHBvcnRSZS5leGVjKGZpbGVDb250ZW50KSkpIG5hbWVzLmFkZChtWzJdKTtcbiAgd2hpbGUgKChtID0gbmFtZWRSZS5leGVjKGZpbGVDb250ZW50KSkpIHtcbiAgICBtWzFdXG4gICAgICAuc3BsaXQoXCIsXCIpXG4gICAgICAubWFwKChzKSA9PiBzLnRyaW0oKS5zcGxpdChcIiBhcyBcIilbMF0udHJpbSgpKVxuICAgICAgLmZvckVhY2goKG4pID0+IHtcbiAgICAgICAgaWYgKG4pIG5hbWVzLmFkZChuKTtcbiAgICAgIH0pO1xuICB9XG4gIHJldHVybiBbLi4ubmFtZXNdLnNvcnQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3REZWNvcmF0b3JzKGZpbGVDb250ZW50OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlY3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVjUmUgPSAvQChbQS1aYS16X11bQS1aYS16MC05X10qKS9nO1xuICBsZXQgbTogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgd2hpbGUgKChtID0gZGVjUmUuZXhlYyhmaWxlQ29udGVudCkpKSBkZWNzLmFkZChtWzFdKTtcbiAgcmV0dXJuIFsuLi5kZWNzXS5zb3J0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdW1tYXJpemVSZWFkbWUocmVhZG1lPzogc3RyaW5nKSB7XG4gIGlmICghcmVhZG1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBsaW5lcyA9IHJlYWRtZS5zcGxpdCgvXFxyP1xcbi8pLmZpbHRlcihCb29sZWFuKTtcbiAgY29uc3QgdGl0bGUgPVxuICAgIGxpbmVzLmZpbmQoKGwpID0+IC9eI1xccysvLnRlc3QobCkpPy5yZXBsYWNlKC9eI1xccysvLCBcIlwiKSB8fCBcIlJFQURNRVwiO1xuICBjb25zdCBidWxsZXRzID0gbGluZXMuZmlsdGVyKChsKSA9PiAvXlstKl1cXHMrLy50ZXN0KGwpKS5zbGljZSgwLCAyMCk7XG4gIHJldHVybiB7IHRpdGxlLCBidWxsZXRzIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbmFseXplUmVwbyhyb290OiBzdHJpbmcpIHtcbiAgY29uc3Qgc3JjID0gcGF0aC5qb2luKHJvb3QsIFwic3JjXCIpO1xuICBjb25zdCB0ZXN0RGlyID0gcGF0aC5qb2luKHJvb3QsIFwidGVzdHNcIik7XG4gIGNvbnN0IHJlYWRtZVBhdGggPSBwYXRoLmpvaW4ocm9vdCwgXCJSRUFETUUubWRcIik7XG4gIGNvbnN0IHJlYWRtZSA9IHJlYWRGaWxlU2FmZShyZWFkbWVQYXRoKTtcblxuICBjb25zdCBmaWxlcyA9IGZzLmV4aXN0c1N5bmMoc3JjKSA/IGxpc3RGaWxlc1JlY3Vyc2l2ZShzcmMsIGlzU291cmNlRmlsZSkgOiBbXTtcbiAgY29uc3QgdGVzdEZpbGVzID0gZnMuZXhpc3RzU3luYyh0ZXN0RGlyKVxuICAgID8gbGlzdEZpbGVzUmVjdXJzaXZlKHRlc3REaXIsIChmKSA9PiBpc1NvdXJjZUZpbGUoZikgJiYgaXNUZXN0RmlsZShmKSlcbiAgICA6IFtdO1xuXG4gIGNvbnN0IGFwaTogUmVjb3JkPHN0cmluZywgeyBleHBvcnRzOiBzdHJpbmdbXTsgZGVjb3JhdG9yczogc3RyaW5nW10gfT4gPSB7fTtcbiAgZm9yIChjb25zdCBmIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU2FmZShmKSB8fCBcIlwiO1xuICAgIGFwaVtwYXRoLnJlbGF0aXZlKHJvb3QsIGYpXSA9IHtcbiAgICAgIGV4cG9ydHM6IGV4dHJhY3RFeHBvcnRzKGNvbnRlbnQpLFxuICAgICAgZGVjb3JhdG9yczogZXh0cmFjdERlY29yYXRvcnMoY29udGVudCksXG4gICAgfTtcbiAgfVxuICBjb25zdCB0ZXN0czogUmVjb3JkPHN0cmluZywgeyBtZW50aW9uczogc3RyaW5nW10gfT4gPSB7fTtcbiAgZm9yIChjb25zdCBmIG9mIHRlc3RGaWxlcykge1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVNhZmUoZikgfHwgXCJcIjtcbiAgICBjb25zdCBtZW50aW9ucyA9IEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFsuLi5leHRyYWN0RXhwb3J0cyhjb250ZW50KSwgLi4uZXh0cmFjdERlY29yYXRvcnMoY29udGVudCldKVxuICAgICkuc29ydCgpO1xuICAgIHRlc3RzW3BhdGgucmVsYXRpdmUocm9vdCwgZildID0geyBtZW50aW9ucyB9O1xuICB9XG4gIHJldHVybiB7IGZpbGVzLCB0ZXN0RmlsZXMsIGFwaSwgdGVzdHMsIHJlYWRtZTogc3VtbWFyaXplUmVhZG1lKHJlYWRtZSkgfTtcbn1cbiJdfQ==