@flowscripter/dynamic-cli-framework 1.7.2 → 1.7.4

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 (379) hide show
  1. package/cli-plugin.ts +1 -1
  2. package/dist/cli-plugin.d.ts +1 -1
  3. package/dist/cli-plugin.d.ts.map +1 -1
  4. package/dist/cli-plugin.js +25 -247
  5. package/dist/index.js +70 -105710
  6. package/dist/src/api/BaseCLIFeatureOptions.js +0 -0
  7. package/dist/src/api/CLI.js +0 -0
  8. package/dist/src/api/CLIConfig.js +0 -0
  9. package/dist/src/api/Context.js +0 -0
  10. package/dist/src/api/RunResult.js +73 -0
  11. package/dist/src/api/argument/Argument.js +0 -0
  12. package/dist/src/api/argument/ArgumentValueTypes.js +18 -0
  13. package/dist/src/api/argument/ComplexOption.js +1 -0
  14. package/dist/src/api/argument/GlobalCommandArgument.js +0 -0
  15. package/dist/src/api/argument/Option.js +0 -0
  16. package/dist/src/api/argument/Positional.js +0 -0
  17. package/dist/src/api/argument/SubCommandArgument.js +1 -0
  18. package/dist/src/api/command/Command.d.ts +5 -0
  19. package/dist/src/api/command/Command.d.ts.map +1 -1
  20. package/dist/src/api/command/Command.js +0 -0
  21. package/dist/src/api/command/GlobalCommand.js +0 -0
  22. package/dist/src/api/command/GlobalModifierCommand.js +0 -0
  23. package/dist/src/api/command/GroupCommand.js +0 -0
  24. package/dist/src/api/command/SubCommand.js +0 -0
  25. package/dist/src/api/command/UsageExample.js +0 -0
  26. package/dist/src/api/plugin/CLIPlugin.js +2 -0
  27. package/dist/src/api/plugin/CommandFactory.js +7 -0
  28. package/dist/src/api/plugin/ServiceProviderFactory.js +7 -0
  29. package/dist/src/api/plugin/createCLIPlugin.js +30 -0
  30. package/dist/src/api/service/ServiceProvider.js +0 -0
  31. package/dist/src/api/service/core/ArgumentPrompterService.js +1 -0
  32. package/dist/src/api/service/core/AsciiBannerGeneratorService.js +1 -0
  33. package/dist/src/api/service/core/CompletionService.js +8 -0
  34. package/dist/src/api/service/core/DataDumpGeneratorService.js +7 -0
  35. package/dist/src/api/service/core/ImagePrinterService.js +1 -0
  36. package/dist/src/api/service/core/KeyValueService.js +7 -0
  37. package/dist/src/api/service/core/PluginService.js +6 -0
  38. package/dist/src/api/service/core/PrettyPrinterService.js +1 -0
  39. package/dist/src/api/service/core/PrinterService.js +42 -0
  40. package/dist/src/api/service/core/PrompterService.js +10 -0
  41. package/dist/src/api/service/core/SecretService.js +0 -0
  42. package/dist/src/api/service/core/ShutdownService.js +1 -0
  43. package/dist/src/api/service/core/SyntaxHighlighterService.js +1 -0
  44. package/dist/src/api/service/core/Table.js +49 -0
  45. package/dist/src/api/service/core/TableGeneratorService.d.ts +1 -0
  46. package/dist/src/api/service/core/TableGeneratorService.d.ts.map +1 -1
  47. package/dist/src/api/service/core/TableGeneratorService.js +7 -0
  48. package/dist/src/api/service/core/TreePrinterService.js +1 -0
  49. package/dist/src/cli/BaseCLI.d.ts.map +1 -1
  50. package/dist/src/cli/BaseCLI.js +233 -0
  51. package/dist/src/cli/DefaultRuntimeCLI.d.ts.map +1 -1
  52. package/dist/src/cli/DefaultRuntimeCLI.js +20 -0
  53. package/dist/src/cli/DynamicPluginRuntimeCLI.js +50 -0
  54. package/dist/src/command/MultiCommandCliHelpCommand.d.ts.map +1 -1
  55. package/dist/src/command/MultiCommandCliHelpCommand.js +238 -0
  56. package/dist/src/command/SingleCommandCliHelpCommand.js +104 -0
  57. package/dist/src/command/UsageCommand.js +16 -0
  58. package/dist/src/command/VersionCommand.js +13 -0
  59. package/dist/src/launcher.js +61 -0
  60. package/dist/src/runtime/DefaultContext.js +25 -0
  61. package/dist/src/runtime/argument/ArgumentTypeGuards.js +3 -0
  62. package/dist/src/runtime/command/CommandTypeGuards.js +12 -0
  63. package/dist/src/runtime/command/CommandValidator.js +371 -0
  64. package/dist/src/runtime/parser.js +105 -0
  65. package/dist/src/runtime/registry/CommandRegistry.js +0 -0
  66. package/dist/src/runtime/registry/DefaultCommandRegistry.js +190 -0
  67. package/dist/src/runtime/registry/DefaultServiceProviderRegistry.js +20 -0
  68. package/dist/src/runtime/registry/ServiceProviderRegistry.js +0 -0
  69. package/dist/src/runtime/runner.js +507 -0
  70. package/dist/src/runtime/scanner.js +244 -0
  71. package/dist/src/runtime/values/ValuePopulationResult.js +0 -0
  72. package/dist/src/runtime/values/argumentValueMerge.js +122 -0
  73. package/dist/src/runtime/values/argumentValueValidation.js +505 -0
  74. package/dist/src/runtime/values/globalCommandValuePopulation.js +67 -0
  75. package/dist/src/runtime/values/subCommandValuePopulation.js +549 -0
  76. package/dist/src/service/argumentPrompter/ArgumentPrompterServiceProvider.js +19 -0
  77. package/dist/src/service/argumentPrompter/DefaultArgumentPrompterService.js +197 -0
  78. package/dist/src/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.js +28 -0
  79. package/dist/src/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.js +233 -0
  80. package/dist/src/service/asciiBannerGenerator/standard.flf.json +3 -0
  81. package/dist/src/service/banner/BannerServiceProvider.js +60 -0
  82. package/dist/src/service/banner/command/NoBannerCommand.js +24 -0
  83. package/dist/src/service/chiselAsciiBannerGenerator/ChiselFontAsciiBannerGeneratorService.js +51 -0
  84. package/dist/src/service/chiselAsciiBannerGenerator/chisel.flf.json +3 -0
  85. package/dist/src/service/completion/CompletionServiceProvider.d.ts +2 -1
  86. package/dist/src/service/completion/CompletionServiceProvider.d.ts.map +1 -1
  87. package/dist/src/service/completion/CompletionServiceProvider.js +160 -0
  88. package/dist/src/service/completion/DefaultCompletionService.d.ts.map +1 -1
  89. package/dist/src/service/completion/DefaultCompletionService.js +279 -0
  90. package/dist/src/service/completion/command/CompletionCompleteSubCommand.d.ts +15 -0
  91. package/dist/src/service/completion/command/CompletionCompleteSubCommand.d.ts.map +1 -0
  92. package/dist/src/service/completion/command/CompletionCompleteSubCommand.js +37 -0
  93. package/dist/src/service/completion/command/CompletionGroupCommand.d.ts +14 -0
  94. package/dist/src/service/completion/command/CompletionGroupCommand.d.ts.map +1 -0
  95. package/dist/src/service/completion/command/CompletionGroupCommand.js +10 -0
  96. package/dist/src/service/completion/command/CompletionIntegrationSubCommand.d.ts +14 -0
  97. package/dist/src/service/completion/command/CompletionIntegrationSubCommand.d.ts.map +1 -0
  98. package/dist/src/service/completion/command/CompletionIntegrationSubCommand.js +67 -0
  99. package/dist/src/service/completion/shell/ShellHandler.js +0 -0
  100. package/dist/src/service/completion/shell/bash.js +39 -0
  101. package/dist/src/service/completion/shell/fish.js +35 -0
  102. package/dist/src/service/completion/shell/powershell.js +51 -0
  103. package/dist/src/service/completion/shell/zsh.js +42 -0
  104. package/dist/src/service/configuration/ConfigurationServiceProvider.js +482 -0
  105. package/dist/src/service/configuration/DefaultKeyValueService.js +80 -0
  106. package/dist/src/service/configuration/DefaultSecretService.js +60 -0
  107. package/dist/src/service/configuration/command/ConfigCommand.js +24 -0
  108. package/dist/src/service/configuration/command/DumpConfigCommand.js +18 -0
  109. package/dist/src/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.js +24 -0
  110. package/dist/src/service/dataDumpGenerator/DefaultDataDumpGeneratorService.js +59 -0
  111. package/dist/src/service/imagePrinter/DefaultImagePrinterService.js +10 -0
  112. package/dist/src/service/imagePrinter/ImagePrinterServiceProvider.js +20 -0
  113. package/dist/src/service/plugin/DefaultPluginService.js +21 -0
  114. package/dist/src/service/plugin/DefaultPluginServiceProvider.d.ts +1 -1
  115. package/dist/src/service/plugin/DefaultPluginServiceProvider.d.ts.map +1 -1
  116. package/dist/src/service/plugin/DefaultPluginServiceProvider.js +21 -0
  117. package/dist/src/service/plugin/command/PluginAddSubCommand.d.ts +17 -0
  118. package/dist/src/service/plugin/command/PluginAddSubCommand.d.ts.map +1 -0
  119. package/dist/src/service/plugin/command/PluginAddSubCommand.js +49 -0
  120. package/dist/src/service/plugin/command/PluginGroupCommand.d.ts +12 -0
  121. package/dist/src/service/plugin/command/PluginGroupCommand.d.ts.map +1 -0
  122. package/dist/src/service/plugin/command/PluginGroupCommand.js +21 -0
  123. package/dist/src/service/plugin/command/PluginListSubCommand.d.ts +12 -0
  124. package/dist/src/service/plugin/command/PluginListSubCommand.d.ts.map +1 -0
  125. package/dist/src/service/plugin/command/PluginListSubCommand.js +25 -0
  126. package/dist/src/service/plugin/command/PluginRemoveSubCommand.d.ts +17 -0
  127. package/dist/src/service/plugin/command/PluginRemoveSubCommand.d.ts.map +1 -0
  128. package/dist/src/service/plugin/command/PluginRemoveSubCommand.js +24 -0
  129. package/dist/src/service/plugin/command/PluginSearchSubCommand.d.ts +18 -0
  130. package/dist/src/service/plugin/command/PluginSearchSubCommand.d.ts.map +1 -0
  131. package/dist/src/service/plugin/command/PluginSearchSubCommand.js +34 -0
  132. package/dist/src/service/plugin/command/PluginUpgradeSubCommand.d.ts +12 -0
  133. package/dist/src/service/plugin/command/PluginUpgradeSubCommand.d.ts.map +1 -0
  134. package/dist/src/service/plugin/command/PluginUpgradeSubCommand.js +25 -0
  135. package/dist/src/service/plugin/command/getPluginId.d.ts +3 -0
  136. package/dist/src/service/plugin/command/getPluginId.d.ts.map +1 -0
  137. package/dist/src/service/plugin/command/getPluginId.js +3 -0
  138. package/dist/src/service/prettyPrinter/DefaultPrettyPrinterService.js +45 -0
  139. package/dist/src/service/prettyPrinter/PrettyPrinterServiceProvider.js +28 -0
  140. package/dist/src/service/printer/DefaultPrinterService.js +250 -0
  141. package/dist/src/service/printer/PrinterServiceProvider.js +43 -0
  142. package/dist/src/service/printer/command/DarkModeCommand.js +24 -0
  143. package/dist/src/service/printer/command/LogLevelCommand.js +41 -0
  144. package/dist/src/service/printer/command/NoColorCommand.js +24 -0
  145. package/dist/src/service/printer/command/NoHyperlinksCommand.js +21 -0
  146. package/dist/src/service/printer/terminal/Color.js +15 -0
  147. package/dist/src/service/printer/terminal/Progress.js +271 -0
  148. package/dist/src/service/printer/terminal/Spinner.js +83 -0
  149. package/dist/src/service/printer/terminal/Theme.js +26 -0
  150. package/dist/src/service/prompter/DefaultPrompterService.js +52 -0
  151. package/dist/src/service/prompter/PrompterServiceProvider.js +20 -0
  152. package/dist/src/service/prompter/command/NoPromptCommand.js +21 -0
  153. package/dist/src/service/prompter/prompt/PromptContext.js +22 -0
  154. package/dist/src/service/prompter/prompt/promptAcknowledge.js +19 -0
  155. package/dist/src/service/prompter/prompt/promptMultiSelect.js +74 -0
  156. package/dist/src/service/prompter/prompt/promptOpenUrl.js +70 -0
  157. package/dist/src/service/prompter/prompt/promptSingleSelect.js +73 -0
  158. package/dist/src/service/prompter/prompt/promptText.js +75 -0
  159. package/dist/src/service/prompter/prompt/promptToggle.js +21 -0
  160. package/dist/src/service/shutdown/DefaultShutdownService.js +16 -0
  161. package/dist/src/service/shutdown/ShutdownServiceProvider.js +60 -0
  162. package/dist/src/service/shutdown/ShutdownState.js +5 -0
  163. package/dist/src/service/syntaxHighlighter/DefaultSyntaxHighlighterService.js +54 -0
  164. package/dist/src/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.js +32 -0
  165. package/dist/src/service/tableGenerator/DefaultTableGeneratorService.d.ts +3 -1
  166. package/dist/src/service/tableGenerator/DefaultTableGeneratorService.d.ts.map +1 -1
  167. package/dist/src/service/tableGenerator/DefaultTableGeneratorService.js +344 -0
  168. package/dist/src/service/tableGenerator/TableGeneratorServiceProvider.js +26 -0
  169. package/dist/src/service/treePrinter/DefaultTreePrinterService.js +35 -0
  170. package/dist/src/service/treePrinter/TreePrinterServiceProvider.js +24 -0
  171. package/dist/src/terminal/Ansi.js +23 -0
  172. package/dist/src/terminal/ImageRenderer.js +164 -0
  173. package/dist/src/terminal/KeyReader.js +13 -0
  174. package/dist/src/terminal/PngDecoder.js +115 -0
  175. package/dist/src/terminal/Styler.js +0 -0
  176. package/dist/src/terminal/Terminal.js +0 -0
  177. package/dist/src/terminal/TtyKeyReader.js +87 -0
  178. package/dist/src/terminal/TtyStyler.js +55 -0
  179. package/dist/src/terminal/TtyTerminal.js +52 -0
  180. package/dist/src/terminal/supportsHyperlinks.d.ts.map +1 -1
  181. package/dist/src/terminal/supportsHyperlinks.js +95 -0
  182. package/dist/src/util/configHelper.js +61 -0
  183. package/dist/src/util/envVarHelper.js +216 -0
  184. package/dist/src/util/helpHelper.d.ts.map +1 -1
  185. package/dist/src/util/helpHelper.js +497 -0
  186. package/dist/src/util/logger.js +81 -0
  187. package/dist/src/util/runnerHelper.d.ts +1 -0
  188. package/dist/src/util/runnerHelper.d.ts.map +1 -1
  189. package/dist/src/util/runnerHelper.js +80 -0
  190. package/package.json +3 -3
  191. package/src/api/command/Command.ts +6 -0
  192. package/src/api/service/core/TableGeneratorService.ts +1 -0
  193. package/src/cli/BaseCLI.ts +6 -18
  194. package/src/cli/DefaultRuntimeCLI.ts +0 -4
  195. package/src/command/MultiCommandCliHelpCommand.ts +23 -7
  196. package/src/service/completion/CompletionServiceProvider.ts +16 -2
  197. package/src/service/completion/DefaultCompletionService.ts +14 -0
  198. package/src/service/completion/command/CompletionCompleteSubCommand.ts +59 -0
  199. package/src/service/completion/command/CompletionGroupCommand.ts +21 -0
  200. package/src/{command/CompletionCommand.ts → service/completion/command/CompletionIntegrationSubCommand.ts} +12 -72
  201. package/src/service/completion/shell/bash.ts +1 -1
  202. package/src/service/completion/shell/fish.ts +1 -1
  203. package/src/service/completion/shell/powershell.ts +1 -1
  204. package/src/service/completion/shell/zsh.ts +1 -1
  205. package/src/service/plugin/DefaultPluginServiceProvider.ts +2 -2
  206. package/src/service/plugin/command/PluginAddSubCommand.ts +64 -0
  207. package/src/service/plugin/command/PluginGroupCommand.ts +27 -0
  208. package/src/service/plugin/command/PluginListSubCommand.ts +33 -0
  209. package/src/service/plugin/command/PluginRemoveSubCommand.ts +32 -0
  210. package/src/service/plugin/command/PluginSearchSubCommand.ts +42 -0
  211. package/src/service/plugin/command/PluginUpgradeSubCommand.ts +36 -0
  212. package/src/service/plugin/command/getPluginId.ts +5 -0
  213. package/src/service/tableGenerator/DefaultTableGeneratorService.ts +7 -2
  214. package/src/terminal/supportsHyperlinks.ts +22 -0
  215. package/src/util/helpHelper.ts +7 -6
  216. package/src/util/runnerHelper.ts +14 -2
  217. package/dist/src/command/CompletionCommand.d.ts +0 -31
  218. package/dist/src/command/CompletionCommand.d.ts.map +0 -1
  219. package/dist/src/command/PluginCommand.d.ts +0 -67
  220. package/dist/src/command/PluginCommand.d.ts.map +0 -1
  221. package/dist/tests/cli/BaseCLI.test.d.ts +0 -2
  222. package/dist/tests/cli/BaseCLI.test.d.ts.map +0 -1
  223. package/dist/tests/cli/DynamicPluginRuntimeCLI.test.d.ts +0 -2
  224. package/dist/tests/cli/DynamicPluginRuntimeCLI.test.d.ts.map +0 -1
  225. package/dist/tests/command/CompletionCommand.test.d.ts +0 -2
  226. package/dist/tests/command/CompletionCommand.test.d.ts.map +0 -1
  227. package/dist/tests/command/MultiCommandCliHelpCommand.test.d.ts +0 -2
  228. package/dist/tests/command/MultiCommandCliHelpCommand.test.d.ts.map +0 -1
  229. package/dist/tests/command/SingleCommandCliHelpCommand.test.d.ts +0 -2
  230. package/dist/tests/command/SingleCommandCliHelpCommand.test.d.ts.map +0 -1
  231. package/dist/tests/command/UsageCommand.test.d.ts +0 -2
  232. package/dist/tests/command/UsageCommand.test.d.ts.map +0 -1
  233. package/dist/tests/command/VersionCommand.test.d.ts +0 -2
  234. package/dist/tests/command/VersionCommand.test.d.ts.map +0 -1
  235. package/dist/tests/fixtures/CLIConfig.d.ts +0 -3
  236. package/dist/tests/fixtures/CLIConfig.d.ts.map +0 -1
  237. package/dist/tests/fixtures/Command.d.ts +0 -20
  238. package/dist/tests/fixtures/Command.d.ts.map +0 -1
  239. package/dist/tests/fixtures/CommandRegistry.d.ts +0 -4
  240. package/dist/tests/fixtures/CommandRegistry.d.ts.map +0 -1
  241. package/dist/tests/fixtures/ConfigurationServiceProvider.d.ts +0 -10
  242. package/dist/tests/fixtures/ConfigurationServiceProvider.d.ts.map +0 -1
  243. package/dist/tests/fixtures/Context.d.ts +0 -4
  244. package/dist/tests/fixtures/Context.d.ts.map +0 -1
  245. package/dist/tests/fixtures/ServiceProviderRegistry.d.ts +0 -4
  246. package/dist/tests/fixtures/ServiceProviderRegistry.d.ts.map +0 -1
  247. package/dist/tests/fixtures/StreamString.d.ts +0 -10
  248. package/dist/tests/fixtures/StreamString.d.ts.map +0 -1
  249. package/dist/tests/fixtures/prettierPluginFoo.d.ts +0 -4
  250. package/dist/tests/fixtures/prettierPluginFoo.d.ts.map +0 -1
  251. package/dist/tests/fixtures/util.d.ts +0 -8
  252. package/dist/tests/fixtures/util.d.ts.map +0 -1
  253. package/dist/tests/runtime/DefaultContext.test.d.ts +0 -2
  254. package/dist/tests/runtime/DefaultContext.test.d.ts.map +0 -1
  255. package/dist/tests/runtime/argument/ArgumentTypeGuards.test.d.ts +0 -2
  256. package/dist/tests/runtime/argument/ArgumentTypeGuards.test.d.ts.map +0 -1
  257. package/dist/tests/runtime/command/CommandTypeGuards.test.d.ts +0 -2
  258. package/dist/tests/runtime/command/CommandTypeGuards.test.d.ts.map +0 -1
  259. package/dist/tests/runtime/command/CommandValidator.test.d.ts +0 -2
  260. package/dist/tests/runtime/command/CommandValidator.test.d.ts.map +0 -1
  261. package/dist/tests/runtime/parser.test.d.ts +0 -2
  262. package/dist/tests/runtime/parser.test.d.ts.map +0 -1
  263. package/dist/tests/runtime/registry/DefaultCommandRegistry.test.d.ts +0 -2
  264. package/dist/tests/runtime/registry/DefaultCommandRegistry.test.d.ts.map +0 -1
  265. package/dist/tests/runtime/registry/DefaultServiceProviderRegistry.test.d.ts +0 -2
  266. package/dist/tests/runtime/registry/DefaultServiceProviderRegistry.test.d.ts.map +0 -1
  267. package/dist/tests/runtime/runner.test.d.ts +0 -2
  268. package/dist/tests/runtime/runner.test.d.ts.map +0 -1
  269. package/dist/tests/runtime/scanner.test.d.ts +0 -2
  270. package/dist/tests/runtime/scanner.test.d.ts.map +0 -1
  271. package/dist/tests/runtime/values/argumentValueMerge.test.d.ts +0 -2
  272. package/dist/tests/runtime/values/argumentValueMerge.test.d.ts.map +0 -1
  273. package/dist/tests/runtime/values/argumentValueValidation.test.d.ts +0 -2
  274. package/dist/tests/runtime/values/argumentValueValidation.test.d.ts.map +0 -1
  275. package/dist/tests/runtime/values/globalCommandValuePopulation.test.d.ts +0 -2
  276. package/dist/tests/runtime/values/globalCommandValuePopulation.test.d.ts.map +0 -1
  277. package/dist/tests/runtime/values/subCommandValuePopulation.test.d.ts +0 -2
  278. package/dist/tests/runtime/values/subCommandValuePopulation.test.d.ts.map +0 -1
  279. package/dist/tests/service/argumentPrompter/ArgumentPrompterServiceProvider.test.d.ts +0 -2
  280. package/dist/tests/service/argumentPrompter/ArgumentPrompterServiceProvider.test.d.ts.map +0 -1
  281. package/dist/tests/service/argumentPrompter/DefaultArgumentPrompterService.test.d.ts +0 -2
  282. package/dist/tests/service/argumentPrompter/DefaultArgumentPrompterService.test.d.ts.map +0 -1
  283. package/dist/tests/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.test.d.ts +0 -2
  284. package/dist/tests/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.test.d.ts.map +0 -1
  285. package/dist/tests/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.test.d.ts +0 -2
  286. package/dist/tests/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.test.d.ts.map +0 -1
  287. package/dist/tests/service/banner/BannerServiceProvider.test.d.ts +0 -2
  288. package/dist/tests/service/banner/BannerServiceProvider.test.d.ts.map +0 -1
  289. package/dist/tests/service/banner/command/NoBannerCommand.test.d.ts +0 -2
  290. package/dist/tests/service/banner/command/NoBannerCommand.test.d.ts.map +0 -1
  291. package/dist/tests/service/chiselAsciiBannerGenerator/ChiselFontAsciiBannerGeneratorService.test.d.ts +0 -2
  292. package/dist/tests/service/chiselAsciiBannerGenerator/ChiselFontAsciiBannerGeneratorService.test.d.ts.map +0 -1
  293. package/dist/tests/service/completion/CompletionServiceProvider.test.d.ts +0 -2
  294. package/dist/tests/service/completion/CompletionServiceProvider.test.d.ts.map +0 -1
  295. package/dist/tests/service/completion/DefaultCompletionService.test.d.ts +0 -2
  296. package/dist/tests/service/completion/DefaultCompletionService.test.d.ts.map +0 -1
  297. package/dist/tests/service/completion/shell/bash.test.d.ts +0 -2
  298. package/dist/tests/service/completion/shell/bash.test.d.ts.map +0 -1
  299. package/dist/tests/service/completion/shell/fish.test.d.ts +0 -2
  300. package/dist/tests/service/completion/shell/fish.test.d.ts.map +0 -1
  301. package/dist/tests/service/completion/shell/powershell.test.d.ts +0 -2
  302. package/dist/tests/service/completion/shell/powershell.test.d.ts.map +0 -1
  303. package/dist/tests/service/completion/shell/zsh.test.d.ts +0 -2
  304. package/dist/tests/service/completion/shell/zsh.test.d.ts.map +0 -1
  305. package/dist/tests/service/configuration/ConfigurationServiceProvider.test.d.ts +0 -2
  306. package/dist/tests/service/configuration/ConfigurationServiceProvider.test.d.ts.map +0 -1
  307. package/dist/tests/service/configuration/DefaultKeyValueService.test.d.ts +0 -2
  308. package/dist/tests/service/configuration/DefaultKeyValueService.test.d.ts.map +0 -1
  309. package/dist/tests/service/configuration/DefaultSecretService.test.d.ts +0 -2
  310. package/dist/tests/service/configuration/DefaultSecretService.test.d.ts.map +0 -1
  311. package/dist/tests/service/configuration/command/ConfigCommand.test.d.ts +0 -2
  312. package/dist/tests/service/configuration/command/ConfigCommand.test.d.ts.map +0 -1
  313. package/dist/tests/service/configuration/command/DumpConfigCommand.test.d.ts +0 -2
  314. package/dist/tests/service/configuration/command/DumpConfigCommand.test.d.ts.map +0 -1
  315. package/dist/tests/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.test.d.ts +0 -2
  316. package/dist/tests/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.test.d.ts.map +0 -1
  317. package/dist/tests/service/dataDumpGenerator/DefaultDataDumpGeneratorService.test.d.ts +0 -2
  318. package/dist/tests/service/dataDumpGenerator/DefaultDataDumpGeneratorService.test.d.ts.map +0 -1
  319. package/dist/tests/service/imagePrinter/DefaultImagePrinterService.test.d.ts +0 -2
  320. package/dist/tests/service/imagePrinter/DefaultImagePrinterService.test.d.ts.map +0 -1
  321. package/dist/tests/service/imagePrinter/ImagePrinterServiceProvider.test.d.ts +0 -2
  322. package/dist/tests/service/imagePrinter/ImagePrinterServiceProvider.test.d.ts.map +0 -1
  323. package/dist/tests/service/plugin/DefaultPluginServiceProvider.test.d.ts +0 -2
  324. package/dist/tests/service/plugin/DefaultPluginServiceProvider.test.d.ts.map +0 -1
  325. package/dist/tests/service/prettyPrinter/DefaultPrettyPrinterService.test.d.ts +0 -2
  326. package/dist/tests/service/prettyPrinter/DefaultPrettyPrinterService.test.d.ts.map +0 -1
  327. package/dist/tests/service/prettyPrinter/PrettyPrinterServiceProvider.test.d.ts +0 -2
  328. package/dist/tests/service/prettyPrinter/PrettyPrinterServiceProvider.test.d.ts.map +0 -1
  329. package/dist/tests/service/printer/DefaultPrinterService.test.d.ts +0 -2
  330. package/dist/tests/service/printer/DefaultPrinterService.test.d.ts.map +0 -1
  331. package/dist/tests/service/printer/PrinterServiceProvider.test.d.ts +0 -2
  332. package/dist/tests/service/printer/PrinterServiceProvider.test.d.ts.map +0 -1
  333. package/dist/tests/service/printer/command/DarkModeCommand.test.d.ts +0 -2
  334. package/dist/tests/service/printer/command/DarkModeCommand.test.d.ts.map +0 -1
  335. package/dist/tests/service/printer/command/LogLevelCommand.test.d.ts +0 -2
  336. package/dist/tests/service/printer/command/LogLevelCommand.test.d.ts.map +0 -1
  337. package/dist/tests/service/printer/command/NoColorCommand.test.d.ts +0 -2
  338. package/dist/tests/service/printer/command/NoColorCommand.test.d.ts.map +0 -1
  339. package/dist/tests/service/printer/command/NoHyperlinksCommand.test.d.ts +0 -2
  340. package/dist/tests/service/printer/command/NoHyperlinksCommand.test.d.ts.map +0 -1
  341. package/dist/tests/service/printer/terminal/Progress.test.d.ts +0 -2
  342. package/dist/tests/service/printer/terminal/Progress.test.d.ts.map +0 -1
  343. package/dist/tests/service/printer/terminal/Spinner.test.d.ts +0 -2
  344. package/dist/tests/service/printer/terminal/Spinner.test.d.ts.map +0 -1
  345. package/dist/tests/service/prompter/DefaultPrompterService.test.d.ts +0 -2
  346. package/dist/tests/service/prompter/DefaultPrompterService.test.d.ts.map +0 -1
  347. package/dist/tests/service/prompter/PrompterServiceProvider.test.d.ts +0 -2
  348. package/dist/tests/service/prompter/PrompterServiceProvider.test.d.ts.map +0 -1
  349. package/dist/tests/service/prompter/command/NoPromptCommand.test.d.ts +0 -2
  350. package/dist/tests/service/prompter/command/NoPromptCommand.test.d.ts.map +0 -1
  351. package/dist/tests/service/prompter/prompt/PromptContext.test.d.ts +0 -2
  352. package/dist/tests/service/prompter/prompt/PromptContext.test.d.ts.map +0 -1
  353. package/dist/tests/service/shutdown/ShutdownServiceProvider.test.d.ts +0 -2
  354. package/dist/tests/service/shutdown/ShutdownServiceProvider.test.d.ts.map +0 -1
  355. package/dist/tests/service/syntaxHighlighter/DefaultSyntaxHighlighterService.test.d.ts +0 -2
  356. package/dist/tests/service/syntaxHighlighter/DefaultSyntaxHighlighterService.test.d.ts.map +0 -1
  357. package/dist/tests/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.test.d.ts +0 -2
  358. package/dist/tests/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.test.d.ts.map +0 -1
  359. package/dist/tests/service/tableGenerator/DefaultTableGeneratorService.test.d.ts +0 -2
  360. package/dist/tests/service/tableGenerator/DefaultTableGeneratorService.test.d.ts.map +0 -1
  361. package/dist/tests/service/tableGenerator/TableGeneratorServiceProvider.test.d.ts +0 -2
  362. package/dist/tests/service/tableGenerator/TableGeneratorServiceProvider.test.d.ts.map +0 -1
  363. package/dist/tests/service/treePrinter/DefaultTreePrinterService.test.d.ts +0 -2
  364. package/dist/tests/service/treePrinter/DefaultTreePrinterService.test.d.ts.map +0 -1
  365. package/dist/tests/service/treePrinter/TreePrinterServiceProvider.test.d.ts +0 -2
  366. package/dist/tests/service/treePrinter/TreePrinterServiceProvider.test.d.ts.map +0 -1
  367. package/dist/tests/terminal/ImageRenderer.test.d.ts +0 -2
  368. package/dist/tests/terminal/ImageRenderer.test.d.ts.map +0 -1
  369. package/dist/tests/terminal/PngDecoder.test.d.ts +0 -2
  370. package/dist/tests/terminal/PngDecoder.test.d.ts.map +0 -1
  371. package/dist/tests/terminal/supportsHyperlinks.test.d.ts +0 -2
  372. package/dist/tests/terminal/supportsHyperlinks.test.d.ts.map +0 -1
  373. package/dist/tests/util/configHelper.test.d.ts +0 -2
  374. package/dist/tests/util/configHelper.test.d.ts.map +0 -1
  375. package/dist/tests/util/envVarHelper.test.d.ts +0 -2
  376. package/dist/tests/util/envVarHelper.test.d.ts.map +0 -1
  377. package/dist/tests/util/logger.test.d.ts +0 -2
  378. package/dist/tests/util/logger.test.d.ts.map +0 -1
  379. package/src/command/PluginCommand.ts +0 -197
@@ -0,0 +1,497 @@
1
+ import { distance } from "fastest-levenshtein";
2
+ import { ArgumentValueTypeName, ComplexValueTypeName } from "../api/argument/ArgumentValueTypes.js";
3
+ import { getGlobalCommandArgumentConfigurationKey, getSubCommandArgumentConfigurationKey, } from "./configHelper.js";
4
+ const SYNTAX_INDENT_WIDTH = 2;
5
+ const MINIMUM_SYNTAX_COLUMN_WIDTH = 15;
6
+ const HELP_SYNTAX_INDENT = " ".repeat(SYNTAX_INDENT_WIDTH);
7
+ function flattenHelpEntry(printerService, helpEntry, indentText, isRoot, isLastSibling, rows) {
8
+ let syntax = "";
9
+ if (helpEntry.syntax) {
10
+ if (isRoot) {
11
+ syntax = HELP_SYNTAX_INDENT + printerService.primary(helpEntry.syntax);
12
+ }
13
+ else {
14
+ let syntaxTreeChars = "";
15
+ if (indentText.length > 0) {
16
+ syntaxTreeChars = isLastSibling ? "└╴" : "├╴";
17
+ }
18
+ syntax =
19
+ HELP_SYNTAX_INDENT +
20
+ printerService.secondary(indentText + syntaxTreeChars) +
21
+ printerService.primary(helpEntry.syntax);
22
+ }
23
+ }
24
+ const description = helpEntry.description
25
+ ? printerService.secondary(helpEntry.description)
26
+ : undefined;
27
+ rows.push({ syntax, description });
28
+ if (helpEntry.helpSubEntries !== undefined) {
29
+ const nextIndent = indentText + (isLastSibling ? " " : "│ ") + " ".repeat(helpEntry.subEntryIndent || 0);
30
+ for (let i = 0; i < helpEntry.helpSubEntries.length; i++) {
31
+ const sub = helpEntry.helpSubEntries[i];
32
+ flattenHelpEntry(printerService, sub, nextIndent, false, i === helpEntry.helpSubEntries.length - 1, rows);
33
+ }
34
+ }
35
+ }
36
+ export async function printHelpSections(printerService, tableGeneratorService, sections) {
37
+ const terminalWidth = printerService.stdoutColumns();
38
+ for (let i = 0; i < sections.length; i++) {
39
+ const section = sections[i];
40
+ if (section.title.length > 0) {
41
+ await printerService.print(`${printerService.emphasised(section.title)}\n\n`);
42
+ }
43
+ if (section.helpEntries.length === 0)
44
+ continue;
45
+ const rows = [];
46
+ for (const helpEntry of section.helpEntries) {
47
+ flattenHelpEntry(printerService, helpEntry, "", true, true, rows);
48
+ }
49
+ const hasDescriptions = rows.some((r) => r.description !== undefined);
50
+ if (hasDescriptions) {
51
+ const table = tableGeneratorService.createTable(rows.length, 2, {
52
+ border: false,
53
+ padding: 1,
54
+ maxWidth: terminalWidth,
55
+ });
56
+ table.column(0, { minWidth: MINIMUM_SYNTAX_COLUMN_WIDTH });
57
+ table.column(1, { flexWeight: 1 });
58
+ for (let r = 0; r < rows.length; r++) {
59
+ const row = rows[r];
60
+ table.cell(r, 0, row.syntax);
61
+ table.cell(r, 1, row.description ?? "");
62
+ }
63
+ const rendered = tableGeneratorService.render(table);
64
+ await printerService.print(rendered + "\n");
65
+ }
66
+ else {
67
+ for (const row of rows) {
68
+ await printerService.print(row.syntax + "\n");
69
+ }
70
+ }
71
+ await printerService.print("\n");
72
+ }
73
+ }
74
+ function getGlobalCommandArgumentForm(globalCommandArgument) {
75
+ let argumentSyntax = "";
76
+ switch (globalCommandArgument.type) {
77
+ case ArgumentValueTypeName.BOOLEAN:
78
+ argumentSyntax = "true|false";
79
+ break;
80
+ case ArgumentValueTypeName.INTEGER:
81
+ argumentSyntax = "<integer_value>";
82
+ break;
83
+ case ArgumentValueTypeName.NUMBER:
84
+ argumentSyntax = "<number_value>";
85
+ break;
86
+ case ArgumentValueTypeName.STRING:
87
+ argumentSyntax = "<string_value>";
88
+ break;
89
+ }
90
+ if (globalCommandArgument.isOptional ||
91
+ globalCommandArgument.type === ArgumentValueTypeName.BOOLEAN) {
92
+ argumentSyntax = `[${argumentSyntax}]`;
93
+ }
94
+ return argumentSyntax;
95
+ }
96
+ export function getGlobalArgumentHelpEntry(cliConfig, includeEnvVars, globalCommand) {
97
+ const { argument } = globalCommand;
98
+ let description = globalCommand.description || "";
99
+ if (argument === undefined) {
100
+ return { syntax: "", description };
101
+ }
102
+ const syntax = getGlobalCommandArgumentForm(argument);
103
+ const notesItems = [];
104
+ if (argument.allowableValues !== undefined && argument.allowableValues.length > 0) {
105
+ notesItems.push(`valid values: ${argument.allowableValues.join("|")}`);
106
+ }
107
+ else {
108
+ switch (argument.type) {
109
+ case ArgumentValueTypeName.STRING:
110
+ notesItems.push("string value");
111
+ break;
112
+ case ArgumentValueTypeName.INTEGER:
113
+ notesItems.push("integer value");
114
+ break;
115
+ case ArgumentValueTypeName.NUMBER:
116
+ notesItems.push("number value");
117
+ break;
118
+ }
119
+ if (argument.minValueInclusive !== undefined || argument.maxValueInclusive !== undefined) {
120
+ let range = "..";
121
+ if (argument.minValueInclusive !== undefined) {
122
+ range = argument.minValueInclusive + range;
123
+ }
124
+ if (argument.maxValueInclusive !== undefined) {
125
+ range += argument.maxValueInclusive;
126
+ }
127
+ notesItems.push(range);
128
+ }
129
+ }
130
+ if (argument.defaultValue !== undefined) {
131
+ notesItems.push(`default: ${argument.defaultValue}`);
132
+ }
133
+ if (includeEnvVars) {
134
+ const configurationKey = getGlobalCommandArgumentConfigurationKey(cliConfig, globalCommand, argument);
135
+ if (configurationKey !== undefined) {
136
+ notesItems.push(`env var: ${configurationKey}`);
137
+ }
138
+ }
139
+ if (notesItems.length > 0) {
140
+ if (description.length === 0) {
141
+ description = `(${notesItems.join(", ")})`;
142
+ }
143
+ else {
144
+ description = `${description} (${notesItems.join(", ")})`;
145
+ }
146
+ }
147
+ return { syntax, description };
148
+ }
149
+ export function getSubCommandArgumentsSyntax(subCommand) {
150
+ let syntax = "";
151
+ subCommand.options.forEach((option) => {
152
+ let optionSyntax = `--${option.name}`;
153
+ switch (option.type) {
154
+ case ArgumentValueTypeName.BOOLEAN:
155
+ optionSyntax = `${optionSyntax} [true|false]`;
156
+ break;
157
+ case ArgumentValueTypeName.INTEGER:
158
+ optionSyntax = `${optionSyntax} <integer_value>`;
159
+ break;
160
+ case ArgumentValueTypeName.NUMBER:
161
+ optionSyntax = `${optionSyntax} <number_value>`;
162
+ break;
163
+ case ArgumentValueTypeName.STRING:
164
+ optionSyntax = `${optionSyntax} <string_value>`;
165
+ break;
166
+ case ComplexValueTypeName.COMPLEX:
167
+ optionSyntax = `${optionSyntax} <complex_value>`;
168
+ break;
169
+ }
170
+ if (option.isOptional || option.defaultValue !== undefined) {
171
+ optionSyntax = ` [${optionSyntax}]`;
172
+ }
173
+ else {
174
+ optionSyntax = ` ${optionSyntax}`;
175
+ }
176
+ if (option.isArray) {
177
+ optionSyntax = `${optionSyntax}...`;
178
+ }
179
+ syntax = `${syntax}${optionSyntax}`;
180
+ });
181
+ subCommand.positionals.forEach((positional) => {
182
+ let positionalSyntax = `<${positional.name}>`;
183
+ if (positional.isVarargOptional) {
184
+ positionalSyntax = ` [${positionalSyntax}]`;
185
+ }
186
+ else {
187
+ positionalSyntax = ` ${positionalSyntax}`;
188
+ }
189
+ if (positional.isVarargMultiple) {
190
+ positionalSyntax = `${positionalSyntax}...`;
191
+ }
192
+ syntax = `${syntax}${positionalSyntax}`;
193
+ });
194
+ return syntax;
195
+ }
196
+ function getOptionHelpEntry(cliConfig, includeEnvVars, command, option, subEntryIndent = 0, optionAncestry = []) {
197
+ let subEntries;
198
+ let optionCharacters = "--";
199
+ let aliasCharacter = "-";
200
+ let newSubEntryIndent = option.name.length;
201
+ if (subEntryIndent > 0) {
202
+ optionCharacters = ".";
203
+ aliasCharacter = ".";
204
+ newSubEntryIndent += 1;
205
+ }
206
+ const notesItems = [];
207
+ if (option.type === ComplexValueTypeName.COMPLEX) {
208
+ subEntries = [];
209
+ option.properties.forEach((property) => {
210
+ subEntries.push(getOptionHelpEntry(cliConfig, includeEnvVars, command, property, newSubEntryIndent, [
211
+ ...optionAncestry,
212
+ option,
213
+ ]));
214
+ });
215
+ }
216
+ else {
217
+ if (option.allowableValues !== undefined && option.allowableValues.length > 0) {
218
+ notesItems.push(`valid values: ${option.allowableValues.join("|")}`);
219
+ }
220
+ else {
221
+ switch (option.type) {
222
+ case ArgumentValueTypeName.STRING:
223
+ notesItems.push(`string value`);
224
+ break;
225
+ case ArgumentValueTypeName.INTEGER:
226
+ notesItems.push(`integer value`);
227
+ break;
228
+ case ArgumentValueTypeName.NUMBER:
229
+ notesItems.push(`number value`);
230
+ break;
231
+ case ArgumentValueTypeName.BOOLEAN:
232
+ notesItems.push(`boolean value`);
233
+ break;
234
+ }
235
+ }
236
+ }
237
+ if (option.minValueInclusive !== undefined || option.maxValueInclusive !== undefined) {
238
+ let range = "..";
239
+ if (option.minValueInclusive !== undefined) {
240
+ range = option.minValueInclusive + range;
241
+ }
242
+ if (option.maxValueInclusive !== undefined) {
243
+ range += option.maxValueInclusive;
244
+ }
245
+ notesItems.push(range);
246
+ }
247
+ if (option.defaultValue !== undefined) {
248
+ notesItems.push(`default: ${Array.isArray(option.defaultValue)
249
+ ? `${option.defaultValue.join(", ")}`
250
+ : `${option.defaultValue}`}`);
251
+ }
252
+ if (option.isOptional) {
253
+ notesItems.push("optional");
254
+ }
255
+ if (option.isArray) {
256
+ notesItems.push("array");
257
+ }
258
+ if (includeEnvVars && option.type !== ComplexValueTypeName.COMPLEX) {
259
+ const configurationKey = getSubCommandArgumentConfigurationKey(cliConfig, command, [
260
+ ...optionAncestry,
261
+ option,
262
+ ]);
263
+ if (configurationKey !== undefined) {
264
+ notesItems.push(`env var: ${configurationKey}`);
265
+ }
266
+ }
267
+ let description = option.description || "";
268
+ if (description.length > 0) {
269
+ if (notesItems.length > 0) {
270
+ description = `${description} (${notesItems.join(", ")})`;
271
+ }
272
+ }
273
+ else if (notesItems.length > 0) {
274
+ description = "(" + notesItems.join(", ") + ")";
275
+ }
276
+ return {
277
+ syntax: `${optionCharacters}${option.name}${option.shortAlias !== undefined ? `, ${aliasCharacter}${option.shortAlias}` : ""}`,
278
+ description,
279
+ subEntryIndent: newSubEntryIndent,
280
+ helpSubEntries: subEntries,
281
+ };
282
+ }
283
+ function getPositionalHelpEntry(cliConfig, includeEnvVars, command, positional) {
284
+ const notesItems = [];
285
+ if (positional.allowableValues !== undefined && positional.allowableValues.length > 0) {
286
+ notesItems.push(`valid values: ${positional.allowableValues.join("|")}`);
287
+ }
288
+ else {
289
+ switch (positional.type) {
290
+ case ArgumentValueTypeName.STRING:
291
+ notesItems.push(`string value`);
292
+ break;
293
+ case ArgumentValueTypeName.INTEGER:
294
+ notesItems.push(`integer value`);
295
+ break;
296
+ case ArgumentValueTypeName.NUMBER:
297
+ notesItems.push(`number value`);
298
+ break;
299
+ case ArgumentValueTypeName.BOOLEAN:
300
+ notesItems.push(`boolean value`);
301
+ break;
302
+ }
303
+ }
304
+ if (positional.minValueInclusive !== undefined || positional.maxValueInclusive !== undefined) {
305
+ let range = "..";
306
+ if (positional.minValueInclusive !== undefined) {
307
+ range = positional.minValueInclusive + range;
308
+ }
309
+ if (positional.maxValueInclusive !== undefined) {
310
+ range += positional.maxValueInclusive;
311
+ }
312
+ notesItems.push(range);
313
+ }
314
+ if (positional.isVarargOptional) {
315
+ notesItems.push("optional");
316
+ }
317
+ if (positional.isVarargMultiple) {
318
+ notesItems.push("array");
319
+ }
320
+ if (includeEnvVars) {
321
+ const configurationKey = getSubCommandArgumentConfigurationKey(cliConfig, command, [
322
+ positional,
323
+ ]);
324
+ if (configurationKey !== undefined) {
325
+ notesItems.push(`env var: ${configurationKey}`);
326
+ }
327
+ }
328
+ let description = positional.description || "";
329
+ if (description.length > 0) {
330
+ if (notesItems.length > 0) {
331
+ description = `${description} (${notesItems.join(", ")})`;
332
+ }
333
+ }
334
+ else if (notesItems.length > 0) {
335
+ description = "(" + notesItems.join(", ") + ")";
336
+ }
337
+ return {
338
+ syntax: `<${positional.name}>`,
339
+ description,
340
+ };
341
+ }
342
+ export function getCommandArgsHelpSections(cliConfig, includeEnvVars, subCommand, isSingleCommandApp) {
343
+ const helpSections = [];
344
+ if (subCommand.options.length > 0 || subCommand.positionals.length > 0) {
345
+ const argumentsSection = {
346
+ title: `${isSingleCommandApp ? "Command " : ""}Arguments`,
347
+ helpEntries: [],
348
+ };
349
+ subCommand.options.forEach((option) => {
350
+ argumentsSection.helpEntries.push(getOptionHelpEntry(cliConfig, includeEnvVars, subCommand, option));
351
+ });
352
+ subCommand.positionals.forEach((positional) => {
353
+ argumentsSection.helpEntries.push(getPositionalHelpEntry(cliConfig, includeEnvVars, subCommand, positional));
354
+ });
355
+ helpSections.push(argumentsSection);
356
+ }
357
+ return helpSections;
358
+ }
359
+ export function getCommandExamplesHelpSections(printerService, context, subCommand) {
360
+ const helpSections = [];
361
+ if (subCommand.usageExamples !== undefined && subCommand.usageExamples.length > 0) {
362
+ const usageSection = {
363
+ title: subCommand.usageExamples.length > 1 ? "Examples" : "Example",
364
+ helpEntries: [],
365
+ };
366
+ helpSections.push(usageSection);
367
+ subCommand.usageExamples.forEach((usageExample, index) => {
368
+ if (usageExample.description != null && usageExample.description.length > 0) {
369
+ usageSection.helpEntries.push({
370
+ syntax: `${printerService.italic(usageExample.description)}:\n`,
371
+ });
372
+ }
373
+ usageSection.helpEntries.push({
374
+ syntax: `$ ${context.cliConfig.name} ${subCommand.name} ${usageExample.exampleArguments}`,
375
+ });
376
+ if (usageExample.output !== undefined) {
377
+ usageExample.output.forEach((output) => {
378
+ usageSection.helpEntries.push({
379
+ syntax: printerService.secondary(output),
380
+ });
381
+ });
382
+ }
383
+ if (index < subCommand.usageExamples.length - 1) {
384
+ usageSection.helpEntries.push({
385
+ syntax: "",
386
+ });
387
+ }
388
+ });
389
+ }
390
+ return helpSections;
391
+ }
392
+ export function getMultiCommandAppSyntax(context, globalModifierCommands, globalCommands, groupCommands, subCommands) {
393
+ const globalPrefix = groupCommands.length > 0 || subCommands.length > 0 ? "global_" : "";
394
+ let syntax = context.cliConfig.name || "";
395
+ if (globalModifierCommands.length > 0) {
396
+ syntax += ` [<${globalPrefix}option>`;
397
+ // dont render global_option arg if none defined
398
+ const noArg = globalModifierCommands.every((modifier) => modifier.argument === undefined);
399
+ if (!noArg) {
400
+ // render global_option arg in [] if all modifiers have non-optional, non-boolean arg with no default
401
+ const optionArgMandatory = globalModifierCommands.every((modifier) => modifier.argument !== undefined &&
402
+ !modifier.argument.isOptional &&
403
+ modifier.argument.defaultValue === undefined &&
404
+ modifier.argument.type !== ArgumentValueTypeName.BOOLEAN);
405
+ syntax += optionArgMandatory ? " <value>" : " [<value>]";
406
+ }
407
+ syntax += "]";
408
+ }
409
+ if (globalModifierCommands.length > 1) {
410
+ syntax += "...";
411
+ }
412
+ let arg = false;
413
+ let argOptional = false;
414
+ let argValueOptional = false;
415
+ let multipleArg = false;
416
+ const commandClauses = [];
417
+ if (globalCommands.length > 0) {
418
+ commandClauses.push(`<${globalPrefix}command>`);
419
+ arg = globalCommands.some((globalCommand) => globalCommand.argument !== undefined);
420
+ if (arg) {
421
+ argOptional = globalCommands.some((globalCommand) => globalCommand.argument !== undefined &&
422
+ ((globalCommand.argument.isOptional !== undefined && globalCommand.argument.isOptional) ||
423
+ globalCommand.argument.defaultValue !== undefined));
424
+ argValueOptional = globalCommands.some((globalCommand) => globalCommand.argument !== undefined &&
425
+ globalCommand.argument.type === ArgumentValueTypeName.BOOLEAN);
426
+ }
427
+ }
428
+ if (groupCommands.length > 0 || subCommands.length > 0) {
429
+ commandClauses.push("<command>");
430
+ arg =
431
+ arg ||
432
+ groupCommands.some((groupCommand) => groupCommand.memberSubCommands.some((memberCommand) => memberCommand.options.length > 0 || memberCommand.positionals.length > 0)) ||
433
+ subCommands.some((subCommand) => subCommand.options.length > 0 || subCommand.positionals.length > 0);
434
+ if (arg) {
435
+ argOptional =
436
+ argOptional ||
437
+ groupCommands.some((groupCommand) => groupCommand.memberSubCommands.some((memberCommand) => memberCommand.options.some((option) => (option.isOptional !== undefined && option.isOptional) ||
438
+ option.defaultValue !== undefined) ||
439
+ memberCommand.positionals.some((positional) => positional.isVarargOptional !== undefined && positional.isVarargOptional))) ||
440
+ subCommands.some((subCommand) => subCommand.options.some((option) => (option.isOptional !== undefined && option.isOptional) ||
441
+ option.defaultValue !== undefined) ||
442
+ subCommand.positionals.some((positional) => positional.isVarargOptional !== undefined && positional.isVarargOptional));
443
+ argValueOptional =
444
+ argValueOptional ||
445
+ groupCommands.some((groupCommand) => groupCommand.memberSubCommands.some((memberCommand) => memberCommand.options.some((option) => option.type === ArgumentValueTypeName.BOOLEAN ||
446
+ memberCommand.positionals.some((positional) => positional.type === ArgumentValueTypeName.BOOLEAN)))) ||
447
+ subCommands.some((subCommand) => subCommand.options.some((option) => option.type === ArgumentValueTypeName.BOOLEAN) ||
448
+ subCommand.positionals.some((positional) => positional.type === ArgumentValueTypeName.BOOLEAN));
449
+ multipleArg =
450
+ multipleArg ||
451
+ groupCommands.some((groupCommand) => groupCommand.memberSubCommands.some((memberCommand) => memberCommand.options.some((option) => option.isArray) ||
452
+ memberCommand.positionals.some((positional) => positional.isVarargMultiple))) ||
453
+ subCommands.some((subCommand) => subCommand.options.some((option) => option.isArray) ||
454
+ subCommand.positionals.some((positional) => positional.isVarargMultiple));
455
+ }
456
+ }
457
+ if (commandClauses.length > 0) {
458
+ let subSyntax = `${commandClauses.join("|")}`;
459
+ // dont render arg if none defined (no global arg or no option/positional)
460
+ if (arg) {
461
+ let argSyntax = "<arg>";
462
+ // render arg value in [] if some are optional
463
+ argSyntax += argValueOptional ? " [<value>]" : " <value>";
464
+ // dont render arg in [] if none are optional and have no default
465
+ subSyntax += argOptional
466
+ ? ` [${argSyntax}]`
467
+ : multipleArg
468
+ ? ` <${argSyntax}>`
469
+ : ` ${argSyntax}`;
470
+ // check to render multiple arg
471
+ if (multipleArg) {
472
+ subSyntax += "...";
473
+ }
474
+ }
475
+ syntax += ` ${subSyntax}`;
476
+ }
477
+ return syntax;
478
+ }
479
+ export function findPossibleCommandNames(commandName, groupCommands, subCommands) {
480
+ const levenCommandArray = new Array();
481
+ subCommands.forEach((subCommand) => {
482
+ levenCommandArray.push([distance(subCommand.name, commandName), subCommand.name]);
483
+ });
484
+ groupCommands.forEach((groupCommand) => {
485
+ groupCommand.memberSubCommands
486
+ .filter((memberCommand) => !memberCommand.disableGenericHelpDisplay)
487
+ .forEach((memberCommand) => {
488
+ const memberName = `${groupCommand.name}:${memberCommand.name}`;
489
+ levenCommandArray.push([distance(memberName, commandName), memberName]);
490
+ });
491
+ });
492
+ return levenCommandArray
493
+ .sort((a, b) => a[0] - b[0])
494
+ .slice(0, 2)
495
+ .filter((value) => value[0] < 3)
496
+ .map((value) => value[1]);
497
+ }
@@ -0,0 +1,81 @@
1
+ import process from "node:process";
2
+ const LEVEL_PADDINGS = {
3
+ TRACE: " ",
4
+ DEBUG: " ",
5
+ INFO: " ",
6
+ WARN: " ",
7
+ ERROR: " ",
8
+ };
9
+ const debugEnabled = process.env["DYNAMIC_CLI_FRAMEWORK_DEBUG"] !== undefined;
10
+ let maxLoggerNameLength = 0;
11
+ const LOGGER_NAME_PADDINGS = {};
12
+ function getDefaultLogger() {
13
+ return {
14
+ trace: () => { },
15
+ debug: (message, ...optionalParams) => {
16
+ console.debug(message, ...optionalParams);
17
+ },
18
+ info: (message, ...optionalParams) => {
19
+ console.info(message, ...optionalParams);
20
+ },
21
+ warn: (message, ...optionalParams) => {
22
+ console.warn(message, ...optionalParams);
23
+ },
24
+ error: (message, ...optionalParams) => {
25
+ console.error(message, ...optionalParams);
26
+ },
27
+ };
28
+ }
29
+ function wrapDefaultLogger(loggerName, levelPadding, loggerFunction) {
30
+ return (message, ...optionalParams) => {
31
+ if (message instanceof Function) {
32
+ loggerFunction(`${levelPadding} [${loggerName}]${LOGGER_NAME_PADDINGS[loggerName]} ${message()}`, ...optionalParams);
33
+ return;
34
+ }
35
+ if (message instanceof Object) {
36
+ loggerFunction(`${levelPadding} [${loggerName}]${LOGGER_NAME_PADDINGS[loggerName]} ${JSON.stringify(message)}`, ...optionalParams);
37
+ return;
38
+ }
39
+ loggerFunction(`${levelPadding} [${loggerName}]${LOGGER_NAME_PADDINGS[loggerName]} ${message}`, ...optionalParams);
40
+ };
41
+ }
42
+ /**
43
+ * Retrieves a logger instance with the specified name. If the name length exceeds the current maximum logger name length,
44
+ * it updates the padding for all existing logger names to ensure consistent formatting.
45
+ *
46
+ * @param loggerName The name of the logger to retrieve.
47
+ * @returns A logger instance with the specified name.
48
+ */
49
+ export default function getLogger(loggerName) {
50
+ const g = globalThis;
51
+ if (g.defaultLogger === undefined) {
52
+ g.defaultLogger = getDefaultLogger();
53
+ }
54
+ const defaultLogger = g.defaultLogger;
55
+ if (loggerName.length > maxLoggerNameLength) {
56
+ maxLoggerNameLength = loggerName.length;
57
+ for (const key of Object.keys(LOGGER_NAME_PADDINGS)) {
58
+ LOGGER_NAME_PADDINGS[key] = " ".repeat(maxLoggerNameLength - key.length);
59
+ }
60
+ LOGGER_NAME_PADDINGS[loggerName] = "";
61
+ }
62
+ else if (LOGGER_NAME_PADDINGS[loggerName] === undefined) {
63
+ LOGGER_NAME_PADDINGS[loggerName] = " ".repeat(maxLoggerNameLength - loggerName.length);
64
+ }
65
+ if (debugEnabled) {
66
+ return {
67
+ trace: wrapDefaultLogger(loggerName, LEVEL_PADDINGS.TRACE, defaultLogger.trace),
68
+ debug: wrapDefaultLogger(loggerName, LEVEL_PADDINGS.DEBUG, defaultLogger.debug),
69
+ info: wrapDefaultLogger(loggerName, LEVEL_PADDINGS.INFO, defaultLogger.info),
70
+ warn: wrapDefaultLogger(loggerName, LEVEL_PADDINGS.WARN, defaultLogger.warn),
71
+ error: wrapDefaultLogger(loggerName, LEVEL_PADDINGS.ERROR, defaultLogger.error),
72
+ };
73
+ }
74
+ return {
75
+ trace: () => { },
76
+ debug: () => { },
77
+ info: () => { },
78
+ warn: () => { },
79
+ error: wrapDefaultLogger(loggerName, LEVEL_PADDINGS.ERROR, defaultLogger.error),
80
+ };
81
+ }
@@ -3,6 +3,7 @@ import type Context from "../api/Context.ts";
3
3
  import type CommandRegistry from "../runtime/registry/CommandRegistry.ts";
4
4
  export declare function printParseResultError(context: Context, parseResult: ParseResult, isDefaultCommand?: boolean): Promise<void>;
5
5
  export declare function printCommandExecutionError(context: Context, parseResult: ParseResult, err: Error, isDefaultCommand?: boolean): Promise<void>;
6
+ export declare function printRuntimeError(context: Context, err: Error): Promise<void>;
6
7
  export declare function printNoCommandSpecifiedError(context: Context): Promise<void>;
7
8
  export declare function printNoCommandRecognisedError(context: Context, commandRegistry: CommandRegistry, availableArgs: ReadonlyArray<string>): Promise<void>;
8
9
  export declare function printUnusedArgsWarning(context: Context, overallUnusedArgs: ReadonlyArray<string>): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"runnerHelper.d.ts","sourceRoot":"","sources":["../../../src/util/runnerHelper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAE7C,OAAO,KAAK,eAAe,MAAM,wCAAwC,CAAC;AAY1E,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,gBAAgB,UAAQ,iBAiBzB;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,KAAK,EACV,gBAAgB,UAAQ,iBAiBzB;AAED,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,OAAO,iBAGlE;AAED,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,iBA4BrC;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,iBAAiB,EAAE,aAAa,CAAC,MAAM,CAAC,iBAQzC"}
1
+ {"version":3,"file":"runnerHelper.d.ts","sourceRoot":"","sources":["../../../src/util/runnerHelper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAE7C,OAAO,KAAK,eAAe,MAAM,wCAAwC,CAAC;AAY1E,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,gBAAgB,UAAQ,iBAiBzB;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,KAAK,EACV,gBAAgB,UAAQ,iBAiBzB;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,iBAMnE;AAED,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,OAAO,iBAGlE;AAED,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,iBAgCrC;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,iBAAiB,EAAE,aAAa,CAAC,MAAM,CAAC,iBAQzC"}
@@ -0,0 +1,80 @@
1
+ import { Icon, PRINTER_SERVICE_ID } from "../api/service/core/PrinterService.js";
2
+ import { isGlobalCommand, isGlobalModifierCommand } from "../runtime/command/CommandTypeGuards.js";
3
+ import { getInvalidArgumentString } from "../runtime/values/argumentValueValidation.js";
4
+ import { findPossibleCommandNames } from "./helpHelper.js";
5
+ function getCommandString(printerService, parseResult) {
6
+ const { command, groupCommand } = parseResult;
7
+ if (groupCommand) {
8
+ return printerService.yellow(`'${groupCommand.name}:${command.name}'`);
9
+ }
10
+ return printerService.yellow(`'${command.name}'`);
11
+ }
12
+ export async function printParseResultError(context, parseResult, isDefaultCommand = false) {
13
+ const printerService = context.getServiceById(PRINTER_SERVICE_ID);
14
+ const commandErrorString = isDefaultCommand
15
+ ? "Parse error: "
16
+ : `Parse error for command: ${getCommandString(printerService, parseResult)}`;
17
+ const { command, invalidArguments } = parseResult;
18
+ let errorString = "=> ";
19
+ const skipArgName = isGlobalModifierCommand(command) || isGlobalCommand(command);
20
+ const argsString = invalidArguments
21
+ .map((arg) => getInvalidArgumentString(arg, skipArgName))
22
+ .join(", ");
23
+ errorString = `${errorString}${printerService.yellow(argsString)}`;
24
+ await printerService.error(`${commandErrorString}\n ${errorString}\n\n`, Icon.FAILURE);
25
+ }
26
+ export async function printCommandExecutionError(context, parseResult, err, isDefaultCommand = false) {
27
+ const printerService = context.getServiceById(PRINTER_SERVICE_ID);
28
+ const commandErrorString = isDefaultCommand
29
+ ? "Execution error: "
30
+ : `Execution error for command: ${getCommandString(printerService, parseResult)}`;
31
+ if (err !== undefined) {
32
+ await printerService.error(`${commandErrorString}\n => ${printerService.yellow(err.message)}\n\n`, Icon.FAILURE);
33
+ }
34
+ else {
35
+ await printerService.error(`${commandErrorString}\n => ${printerService.yellow("error is undefined")}\n\n`, Icon.FAILURE);
36
+ }
37
+ }
38
+ export async function printRuntimeError(context, err) {
39
+ const printerService = context.getServiceById(PRINTER_SERVICE_ID);
40
+ await printerService.error(`Execution error: \n => ${printerService.yellow(err.message)}\n\n`, Icon.FAILURE);
41
+ }
42
+ export async function printNoCommandSpecifiedError(context) {
43
+ const printerService = context.getServiceById(PRINTER_SERVICE_ID);
44
+ await printerService.error("No command specified\n\n");
45
+ }
46
+ export async function printNoCommandRecognisedError(context, commandRegistry, availableArgs) {
47
+ const printerService = context.getServiceById(PRINTER_SERVICE_ID);
48
+ await printerService.error("No command recognised\n\n");
49
+ if (availableArgs.length > 0) {
50
+ const groupCommands = commandRegistry
51
+ .getGroupCommands()
52
+ .filter((command) => !command.disableGenericHelpDisplay);
53
+ const subCommands = commandRegistry
54
+ .getSubCommands()
55
+ .filter((command) => !command.disableGenericHelpDisplay);
56
+ const allPossibleCommandNames = [];
57
+ for (const arg of availableArgs) {
58
+ // look for other possible matches
59
+ const possibleCommandNames = findPossibleCommandNames(arg, groupCommands, subCommands);
60
+ // add the possible command names to the list if not already present
61
+ for (const possibleCommandName of possibleCommandNames) {
62
+ if (!allPossibleCommandNames.includes(possibleCommandName)) {
63
+ allPossibleCommandNames.push(possibleCommandName);
64
+ }
65
+ }
66
+ }
67
+ if (allPossibleCommandNames.length > 0) {
68
+ await printerService.print(`Possible matches: ${allPossibleCommandNames.join(", ")}\n\n`, Icon.INFORMATION);
69
+ }
70
+ }
71
+ }
72
+ export async function printUnusedArgsWarning(context, overallUnusedArgs) {
73
+ const printerService = context.getServiceById(PRINTER_SERVICE_ID);
74
+ if (overallUnusedArgs.length === 1) {
75
+ await printerService.warn(`Unused arg: ${overallUnusedArgs[0]}\n\n`, Icon.ALERT);
76
+ }
77
+ else {
78
+ await printerService.warn(`Unused args: ${overallUnusedArgs.join(" ")}\n\n`, Icon.ALERT);
79
+ }
80
+ }