@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,20 @@
1
+ import getLogger from "../../util/logger.js";
2
+ const logger = getLogger("DefaultServiceProviderRegistry");
3
+ /**
4
+ * Default implementation of a {@link ServiceProviderRegistry}.
5
+ */
6
+ export default class DefaultServiceProviderRegistry {
7
+ #serviceProviders = [];
8
+ constructor(serviceProviders) {
9
+ if (serviceProviders !== undefined) {
10
+ this.#serviceProviders.push(...serviceProviders);
11
+ }
12
+ }
13
+ addServiceProvider(serviceProvider) {
14
+ logger.debug("Adding service provider for service ID: %s", serviceProvider.serviceId);
15
+ this.#serviceProviders.push(serviceProvider);
16
+ }
17
+ getServiceProviders() {
18
+ return this.#serviceProviders.sort((a, b) => b.servicePriority - a.servicePriority);
19
+ }
20
+ }
@@ -0,0 +1,507 @@
1
+ import { RunState } from "../api/RunResult.js";
2
+ import { isGlobalCommand, isSubCommand } from "./command/CommandTypeGuards.js";
3
+ import getLogger from "../util/logger.js";
4
+ import { printCommandExecutionError, printNoCommandRecognisedError, printNoCommandSpecifiedError, printParseResultError, printUnusedArgsWarning, } from "../util/runnerHelper.js";
5
+ import { scanForGlobalModifierCommandClauses, scanForNonModifierCommandClause } from "./scanner.js";
6
+ import { parseGlobalCommandClause, parseSubCommandClause } from "./parser.js";
7
+ import { ARGUMENT_PROMPTER_SERVICE_ID } from "../api/service/core/ArgumentPrompterService.js";
8
+ const logger = getLogger("runner");
9
+ async function attemptPromptForMissingArguments(parseResult, context) {
10
+ if (!context.doesServiceExist(ARGUMENT_PROMPTER_SERVICE_ID)) {
11
+ return undefined;
12
+ }
13
+ const service = context.getServiceById(ARGUMENT_PROMPTER_SERVICE_ID);
14
+ try {
15
+ const updated = await service.promptForMissingArguments(parseResult);
16
+ if (updated.invalidArguments.length === 0) {
17
+ return updated;
18
+ }
19
+ }
20
+ catch (error) {
21
+ if (error.message === "Interrupted") {
22
+ throw error;
23
+ }
24
+ return undefined;
25
+ }
26
+ return undefined;
27
+ }
28
+ /**
29
+ * Execute the {@link Command} with arguments contained in the provided {@link ParseResult}.
30
+ *
31
+ * @param parseResult the {@link ParseResult} to execute.
32
+ * @param context the {@link Context} to use.
33
+ * @param configurationServiceProvider optional {@link ConfigurationServiceProvider} to use to get default argument values.
34
+ * @param isDefaultCommand whether the command is the default command for the CLI.
35
+ */
36
+ async function executeParsedCommand(parseResult, context, configurationServiceProvider, isDefaultCommand = false) {
37
+ try {
38
+ if (parseResult.groupCommand !== undefined) {
39
+ logger.debug("Executing group command with name: %s", parseResult.groupCommand.name);
40
+ if (configurationServiceProvider?.keyValueServiceEnabled ||
41
+ configurationServiceProvider?.secretServiceEnabled) {
42
+ configurationServiceProvider.setCommandKeyValueScope(parseResult.groupCommand.name);
43
+ }
44
+ await parseResult.groupCommand.execute(context);
45
+ if (configurationServiceProvider?.keyValueServiceEnabled ||
46
+ configurationServiceProvider?.secretServiceEnabled) {
47
+ await configurationServiceProvider.clearKeyValueScope();
48
+ }
49
+ }
50
+ logger.debug("Executing command with name: %s and args: %O", parseResult.command.name, parseResult.populatedArgumentValues);
51
+ if (configurationServiceProvider?.keyValueServiceEnabled ||
52
+ configurationServiceProvider?.secretServiceEnabled) {
53
+ configurationServiceProvider.setCommandKeyValueScope(parseResult.command.name);
54
+ }
55
+ if (isSubCommand(parseResult.command)) {
56
+ await parseResult.command.execute(context, parseResult.populatedArgumentValues);
57
+ }
58
+ else {
59
+ await parseResult.command.execute(context, parseResult.populatedArgumentValues);
60
+ }
61
+ if (configurationServiceProvider?.keyValueServiceEnabled ||
62
+ configurationServiceProvider?.secretServiceEnabled) {
63
+ await configurationServiceProvider.clearKeyValueScope();
64
+ }
65
+ }
66
+ catch (err) {
67
+ if (err.message === "Interrupted") {
68
+ throw err;
69
+ }
70
+ await printCommandExecutionError(context, parseResult, err, isDefaultCommand);
71
+ return {
72
+ runState: RunState.EXECUTION_ERROR,
73
+ command: parseResult.command,
74
+ error: err,
75
+ };
76
+ }
77
+ return {
78
+ runState: RunState.SUCCESS,
79
+ };
80
+ }
81
+ /**
82
+ * Parse arguments and execute any of the specified {@link GlobalModifierCommand} instances with specified argument values.
83
+ *
84
+ * @param availableArgSequences the list of argument sequences to process.
85
+ * @param unusedArgSequences an array to which any unused argument sequences will be added.
86
+ * @param globalModifierCommandsByName a map of non-modifier {@link Command} instances by name to parse for.
87
+ * @param globalModifierCommandsByShortAlias a map of {@link GlobalModifierCommand} instances by short alias to use when scanning.
88
+ * @param configurationServiceProvider optional {@link ConfigurationServiceProvider} to use to get default argument values.
89
+ * @param context the {@link Context} to use.
90
+ */
91
+ async function findAndExecuteGlobalModifierCommands(availableArgSequences, unusedArgSequences, globalModifierCommandsByName, globalModifierCommandsByShortAlias, configurationServiceProvider, context) {
92
+ // build a list of GlobalModifierCommands to execute
93
+ const globalModifierCommandParseResults = [];
94
+ // maintain a list of remaining GlobalModifierCommands to scan
95
+ let remainingGlobalModifierCommands = Array.from(globalModifierCommandsByName.values());
96
+ const scanResult = scanForGlobalModifierCommandClauses(availableArgSequences, globalModifierCommandsByName, globalModifierCommandsByShortAlias);
97
+ // add any unused args back to the list of still available args for next scan operation
98
+ unusedArgSequences.push(...scanResult.unusedArgSequences);
99
+ if (scanResult.globalModifierCommandClauses) {
100
+ for (const globalModifierCommandClause of scanResult.globalModifierCommandClauses) {
101
+ // parse and fast fail on error
102
+ const defaultArgumentValues = configurationServiceProvider
103
+ ? await configurationServiceProvider.getDefaultArgumentValues(context.cliConfig, globalModifierCommandClause.command)
104
+ : undefined;
105
+ const parseResult = parseGlobalCommandClause(globalModifierCommandClause, defaultArgumentValues);
106
+ if (parseResult.invalidArguments.length > 0) {
107
+ await printParseResultError(context, parseResult);
108
+ return {
109
+ runState: RunState.PARSE_ERROR,
110
+ command: parseResult.command,
111
+ invalidArguments: parseResult.invalidArguments,
112
+ };
113
+ }
114
+ // add any unused args back to the list of still available args for next scan operation
115
+ if (parseResult.unusedArgs.length > 0) {
116
+ unusedArgSequences.push(parseResult.unusedArgs);
117
+ }
118
+ // add the clause to the list of clauses to execute
119
+ globalModifierCommandParseResults.push(parseResult);
120
+ // remove current GlobalModifierCommand from the list which we will later continue to
121
+ // scan for as a default command in the ConfigurationServiceProvider
122
+ remainingGlobalModifierCommands = remainingGlobalModifierCommands.filter((command) => command.name !== globalModifierCommandClause.command.name);
123
+ }
124
+ }
125
+ // scan for remaining GlobalModifierCommand with default argument values in the ConfigurationServiceProvider
126
+ for (const globalModifierCommand of remainingGlobalModifierCommands) {
127
+ // if there is a config entry run this by default even though no arguments were provided on the command line
128
+ const defaultArgumentValues = configurationServiceProvider
129
+ ? await configurationServiceProvider.getDefaultArgumentValues(context.cliConfig, globalModifierCommand)
130
+ : undefined;
131
+ if (defaultArgumentValues !== undefined) {
132
+ // parse and fast fail on error
133
+ const parseResult = parseGlobalCommandClause({
134
+ command: globalModifierCommand,
135
+ potentialArgs: [],
136
+ }, defaultArgumentValues);
137
+ if (parseResult.invalidArguments.length > 0) {
138
+ await printParseResultError(context, parseResult);
139
+ return {
140
+ runState: RunState.PARSE_ERROR,
141
+ command: parseResult.command,
142
+ invalidArguments: parseResult.invalidArguments,
143
+ };
144
+ }
145
+ // add the clause to the list of clauses to execute
146
+ globalModifierCommandParseResults.push(parseResult);
147
+ }
148
+ }
149
+ // execute GlobalModifierCommand clauses in executePriority order
150
+ globalModifierCommandParseResults.sort((a, b) => b.command.executePriority -
151
+ a.command.executePriority);
152
+ for (const parseResult of globalModifierCommandParseResults) {
153
+ // execute and fast fail on error
154
+ const runResult = await executeParsedCommand(parseResult, context, configurationServiceProvider);
155
+ if (runResult.runState !== RunState.SUCCESS) {
156
+ return runResult;
157
+ }
158
+ }
159
+ }
160
+ /**
161
+ * Parse arguments and execute at most one of the specified non-modifier {@link Command} instances with specified argument values.
162
+ *
163
+ * @param availableArgs the list of argument sequences to process.
164
+ * @param unusedArgs an array to which any unused argument sequences will be added.
165
+ * @param nonModifierCommandsByName the map of non-modifier {@link Command} instances by name to parse for.
166
+ * @param globalCommandsByShortAlias the map of {@link GlobalCommand} instances by short alias to use when scanning.
167
+ * @param groupAndMemberCommandsByJoinedName optional map of {@link GroupCommand} and member {@link SubCommand} instances to use when scanning.
168
+ * @param configurationServiceProvider optional {@link ConfigurationServiceProvider} to use to get default argument values.
169
+ * @param context the {@link Context} to use.
170
+ */
171
+ async function findAndExecuteNonModifierCommand(availableArgs, unusedArgs, nonModifierCommandsByName, globalCommandsByShortAlias, groupAndMemberCommandsByJoinedName, configurationServiceProvider, context) {
172
+ let parseResult;
173
+ const scanResult = scanForNonModifierCommandClause(availableArgs, nonModifierCommandsByName, globalCommandsByShortAlias, groupAndMemberCommandsByJoinedName);
174
+ // add any unused args back to the list of still available args for next scan operation
175
+ unusedArgs.push(...scanResult.unusedArgSequences);
176
+ if (scanResult.nonModifierCommandClause) {
177
+ const defaultArgumentValues = configurationServiceProvider
178
+ ? await configurationServiceProvider.getDefaultArgumentValues(context.cliConfig, scanResult.nonModifierCommandClause.command)
179
+ : undefined;
180
+ if (isGlobalCommand(scanResult.nonModifierCommandClause.command)) {
181
+ parseResult = parseGlobalCommandClause(scanResult.nonModifierCommandClause, defaultArgumentValues);
182
+ }
183
+ else {
184
+ parseResult = parseSubCommandClause(scanResult.nonModifierCommandClause, defaultArgumentValues);
185
+ }
186
+ if (parseResult.invalidArguments.length > 0) {
187
+ const prompted = await attemptPromptForMissingArguments(parseResult, context);
188
+ if (prompted) {
189
+ parseResult = prompted;
190
+ }
191
+ else {
192
+ await printParseResultError(context, parseResult);
193
+ return {
194
+ runState: RunState.PARSE_ERROR,
195
+ command: parseResult.command,
196
+ invalidArguments: parseResult.invalidArguments,
197
+ };
198
+ }
199
+ }
200
+ // add any unused args back to the list of still unused args
201
+ if (parseResult.unusedArgs.length > 0) {
202
+ unusedArgs.push(parseResult.unusedArgs);
203
+ }
204
+ }
205
+ else {
206
+ // scan for a non-modifier Command with default argument values in the ConfigurationServiceProvider
207
+ for (const nonModifierCommand of nonModifierCommandsByName.values()) {
208
+ // if there is a config entry run this by default even though no arguments were provided on the command line
209
+ const defaultArgumentValues = configurationServiceProvider
210
+ ? await configurationServiceProvider.getDefaultArgumentValues(context.cliConfig, nonModifierCommand)
211
+ : undefined;
212
+ if (defaultArgumentValues !== undefined) {
213
+ if (isGlobalCommand(nonModifierCommand)) {
214
+ parseResult = parseGlobalCommandClause({
215
+ command: nonModifierCommand,
216
+ potentialArgs: [],
217
+ }, defaultArgumentValues);
218
+ }
219
+ else {
220
+ parseResult = parseSubCommandClause({
221
+ command: nonModifierCommand,
222
+ potentialArgs: [],
223
+ }, defaultArgumentValues);
224
+ }
225
+ if (parseResult.invalidArguments.length > 0) {
226
+ const prompted = await attemptPromptForMissingArguments(parseResult, context);
227
+ if (prompted) {
228
+ parseResult = prompted;
229
+ }
230
+ else {
231
+ await printParseResultError(context, parseResult);
232
+ return {
233
+ runState: RunState.PARSE_ERROR,
234
+ command: parseResult.command,
235
+ invalidArguments: parseResult.invalidArguments,
236
+ };
237
+ }
238
+ }
239
+ break;
240
+ }
241
+ }
242
+ }
243
+ // give up if still nothing found
244
+ if (parseResult === undefined) {
245
+ return;
246
+ }
247
+ // warn on unused args
248
+ if (unusedArgs.length > 0) {
249
+ await printUnusedArgsWarning(context, unusedArgs.flat());
250
+ }
251
+ return executeParsedCommand(parseResult, context, configurationServiceProvider);
252
+ }
253
+ /**
254
+ * Assume provided command in use and parse arguments and execute with specified argument values if valid.
255
+ *
256
+ * @param availableArgs the list of argument sequences to process.
257
+ * @param unusedArgs an array to which any unused argument sequences will be added.
258
+ * @param defaultNonModifierCommand the default non-modifier {@link Command} to use.
259
+ * @param configurationServiceProvider optional {@link ConfigurationServiceProvider} to use to get default argument values.
260
+ * @param context the {@link Context} to use.
261
+ */
262
+ async function findAndExecuteDefaultNonModifierCommand(availableArgs, unusedArgs, defaultNonModifierCommand, configurationServiceProvider, context) {
263
+ const defaultArgumentValues = configurationServiceProvider
264
+ ? await configurationServiceProvider.getDefaultArgumentValues(context.cliConfig, defaultNonModifierCommand)
265
+ : undefined;
266
+ const isGlobal = isGlobalCommand(defaultNonModifierCommand);
267
+ let parseResult;
268
+ // save invalid args to report them if no valid command is found
269
+ let lastErroneousParseResult;
270
+ // create a dummy clause using the default command for each arg sequence
271
+ for (const argSequence of availableArgs) {
272
+ // if already successfully parsed a clause, cycle through remaining arg sequences to add them to unusedArgs
273
+ if (parseResult) {
274
+ unusedArgs.push(argSequence);
275
+ continue;
276
+ }
277
+ if (isGlobal) {
278
+ parseResult = parseGlobalCommandClause({
279
+ command: defaultNonModifierCommand,
280
+ potentialArgs: [...argSequence],
281
+ }, defaultArgumentValues);
282
+ }
283
+ else {
284
+ parseResult = parseSubCommandClause({
285
+ command: defaultNonModifierCommand,
286
+ potentialArgs: [...argSequence],
287
+ }, defaultArgumentValues);
288
+ }
289
+ // add any unused args back to the list of still unused args
290
+ if (parseResult.unusedArgs.length > 0) {
291
+ unusedArgs.push(parseResult.unusedArgs);
292
+ }
293
+ if (parseResult.invalidArguments.length > 0) {
294
+ lastErroneousParseResult = parseResult;
295
+ parseResult = undefined;
296
+ }
297
+ }
298
+ // even though no arguments were provided on the command line, run the command by default
299
+ // if there are no arguments for the command or there is a config entry
300
+ let commandHasNoArgs;
301
+ if (isGlobal) {
302
+ commandHasNoArgs = defaultNonModifierCommand.argument === undefined;
303
+ }
304
+ else {
305
+ commandHasNoArgs =
306
+ defaultNonModifierCommand.options.length === 0 &&
307
+ defaultNonModifierCommand.positionals.length === 0;
308
+ }
309
+ if (parseResult === undefined && (commandHasNoArgs || defaultArgumentValues !== undefined)) {
310
+ if (isGlobal) {
311
+ parseResult = parseGlobalCommandClause({
312
+ command: defaultNonModifierCommand,
313
+ potentialArgs: [],
314
+ }, defaultArgumentValues);
315
+ }
316
+ else {
317
+ parseResult = parseSubCommandClause({
318
+ command: defaultNonModifierCommand,
319
+ potentialArgs: [],
320
+ }, defaultArgumentValues);
321
+ }
322
+ if (parseResult.invalidArguments.length > 0) {
323
+ lastErroneousParseResult = parseResult;
324
+ parseResult = undefined;
325
+ }
326
+ }
327
+ // if there were invalid arguments, attempt prompting before treating as error
328
+ if (lastErroneousParseResult) {
329
+ const prompted = await attemptPromptForMissingArguments(lastErroneousParseResult, context);
330
+ if (prompted) {
331
+ parseResult = prompted;
332
+ lastErroneousParseResult = undefined;
333
+ }
334
+ else {
335
+ await printParseResultError(context, lastErroneousParseResult, true);
336
+ return {
337
+ runState: RunState.PARSE_ERROR,
338
+ command: defaultNonModifierCommand,
339
+ invalidArguments: lastErroneousParseResult.invalidArguments,
340
+ };
341
+ }
342
+ }
343
+ // give up if still nothing found
344
+ if (parseResult === undefined) {
345
+ return;
346
+ }
347
+ // warn on unused args
348
+ if (unusedArgs.length > 0) {
349
+ await printUnusedArgsWarning(context, unusedArgs.flat());
350
+ }
351
+ return executeParsedCommand(parseResult, context, configurationServiceProvider, true);
352
+ }
353
+ /**
354
+ * Scan arguments and execute the parsed {@link Command} clauses with provided argument values
355
+ * using the provided {@link Context}.
356
+ *
357
+ * An overview of the logic (assuming the optional ConfigurationServiceProvider is provided):
358
+ *
359
+ * 1. For each ServiceProvider in servicePriority order:
360
+ * - Scan arguments for GlobalModifierCommand clauses provided by the ServiceProvider
361
+ * - For each discovered clause:
362
+ * - Set any argument defaults from ConfigurationServiceProvider
363
+ * - Parse the arguments for the GlobalModifierCommand
364
+ * - Return on error
365
+ * - Add to list of GlobalModifierCommands to execute
366
+ * - Scan ConfigurationServiceProvider for GlobalModifierCommand clauses provided by the ServiceProvider not already found in arguments
367
+ * - For each configured clause:
368
+ * - Parse the arguments for the GlobalModifierCommand
369
+ * - Return on error
370
+ * - Add to list of GlobalModifierCommands to execute
371
+ * - Order the GlobalModifierCommand clauses in executePriority order
372
+ * - For each GlobalModifierCommand clause:
373
+ * - Execute the GlobalModifierCommand
374
+ * - Return on error
375
+ * - Init the ServiceProvider's service.
376
+ * 2. Scan arguments for any GlobalModifierCommand clauses not provided by ServiceProviders
377
+ * - For each discovered clause:
378
+ * - Set any argument defaults from ConfigurationServiceProvider
379
+ * - Parse the arguments for the GlobalModifierCommand
380
+ * - Return on error
381
+ * - Add to list of GlobalModifierCommands to execute
382
+ * 3. Scan ConfigurationServiceProvider for GlobalModifierCommand clauses not provided by the ServiceProvider and not already found in arguments
383
+ * - For each discovered clause:
384
+ * - Parse the arguments for the GlobalModifierCommand
385
+ * - Return on error
386
+ * - Add to list of GlobalModifierCommands to execute
387
+ * 4. Order the GlobalModifierCommand clauses in executePriority order
388
+ * 5. For each GlobalModifierCommand clause:
389
+ * - Execute the GlobalModifierCommand
390
+ * - Return on error
391
+ * 6. Scan for a single non-modifier Command clause:
392
+ * - If found:
393
+ * - Set any argument defaults from ConfigurationServiceProvider
394
+ * - Parse the arguments for the non-modifier Command
395
+ * - Return on error
396
+ * - Warn on any unused arguments
397
+ * - Execute the non-modifier Command
398
+ * - Return on success or error
399
+ * 7. If default non-modifier Command provided:
400
+ * - Scan for default non-modifier Command clause
401
+ * - If found:
402
+ * - Set any argument defaults from ConfigurationServiceProvider
403
+ * - Parse the arguments for the non-modifier Command (but do not fail)
404
+ * - If parsing succeeds:
405
+ * - Warn on any unused arguments
406
+ * - Execute the non-modifier Command
407
+ * - Return on success or error
408
+ * - If not found:
409
+ * - Set any argument defaults from ConfigurationServiceProvider
410
+ * - Parse the arguments for the non-modifier Command (do not fail if required arguments are missing)
411
+ * - Execute the resulting non-modifier Command (fail on error)
412
+ *
413
+ * @param args the command line arguments (which do not include the invoked executable name).
414
+ * @param commandRegistry the {@link CommandRegistry} to use when scanning and parsing.
415
+ * @param serviceProviderRegistry the {@link ServiceProviderRegistry} to use when scanning and parsing.
416
+ * @param configurationServiceProvider optional {@link ConfigurationServiceProvider} to use for accessing argument defaults.
417
+ * @param context the {@link Context} in which to execute specified {@link Command} instances.
418
+ * @param defaultCommand optional {@link SubCommand} or {@link GlobalCommand} implementation to attempt to parse arguments for and execute if
419
+ * no non-modifier {@link Command} name is identified in the provided arguments.
420
+ */
421
+ export async function run(args, commandRegistry, serviceProviderRegistry, configurationServiceProvider, context, defaultCommand) {
422
+ if (defaultCommand && !isSubCommand(defaultCommand) && !isGlobalCommand(defaultCommand)) {
423
+ throw new Error("If a default command is provided, if must be a global command or sub-command!");
424
+ }
425
+ // maintain a list of args still available for parsing
426
+ // the is an array because the provided args will be segmented into sequences by identified command clauses
427
+ // this is to prevent incorrectly parsing arguments as if they were interleaved across multiple commands which is not supported
428
+ let availableArgs = [args];
429
+ let unusedArgs = [];
430
+ // for each ServiceProvider (they are returned in servicePriority order)
431
+ for (const serviceProvider of serviceProviderRegistry.getServiceProviders()) {
432
+ // using the GlobalModifierCommands instances provided by the ServiceProvider...
433
+ const globalModifierCommandsByName = commandRegistry.getGlobalModifierCommandsByNameProvidedByService(serviceProvider.serviceId);
434
+ const globalModifierCommandsByShortAlias = commandRegistry.getGlobalModifierCommandsByShortAliasProvidedByService(serviceProvider.serviceId);
435
+ // if there are GlobalModifierCommands provided by the ServiceProvider...
436
+ if (globalModifierCommandsByName.size > 0) {
437
+ // ...scan arguments, parse any resulting clauses and execute any resulting parsed GlobalModifierCommands
438
+ const runResult = await findAndExecuteGlobalModifierCommands(availableArgs, unusedArgs, globalModifierCommandsByName, globalModifierCommandsByShortAlias, configurationServiceProvider, context);
439
+ // nothing is returned unless a command was found and there was an error, in which case return the error
440
+ if (runResult) {
441
+ return runResult;
442
+ }
443
+ // update args for the next scan operation
444
+ availableArgs = unusedArgs;
445
+ unusedArgs = [];
446
+ }
447
+ // init the service provider's service
448
+ logger.debug("Initialising service with ID: %s", serviceProvider.serviceId);
449
+ if (configurationServiceProvider?.keyValueServiceEnabled ||
450
+ configurationServiceProvider?.secretServiceEnabled) {
451
+ configurationServiceProvider.setServiceKeyValueScope(serviceProvider.serviceId);
452
+ }
453
+ await serviceProvider.initService(context);
454
+ if (configurationServiceProvider?.keyValueServiceEnabled ||
455
+ configurationServiceProvider?.secretServiceEnabled) {
456
+ await configurationServiceProvider.clearKeyValueScope();
457
+ }
458
+ }
459
+ // using the GlobalModifierCommands instances which are NOT provided by a ServiceProvider...
460
+ const globalModifierCommandsByName = commandRegistry.getGlobalModifierCommandsByNameNotProvidedByService();
461
+ const globalModifierCommandsByShortAlias = commandRegistry.getGlobalModifierCommandsByShortAliasNotProvidedByService();
462
+ // if there are GlobalModifierCommands NOT provided by the ServiceProvider...
463
+ if (globalModifierCommandsByName.size > 0) {
464
+ // ...scan arguments, parse any resulting clauses and execute any resulting parsed GlobalModifierCommands
465
+ const runResult = await findAndExecuteGlobalModifierCommands(availableArgs, unusedArgs, globalModifierCommandsByName, globalModifierCommandsByShortAlias, configurationServiceProvider, context);
466
+ // nothing is returned unless a command was found and there was an error, in which case return the error
467
+ if (runResult) {
468
+ return runResult;
469
+ }
470
+ // update args for the next scan operation
471
+ availableArgs = unusedArgs;
472
+ unusedArgs = [];
473
+ }
474
+ // using the non-modifier Command instances...
475
+ const nonModifierCommandsByName = commandRegistry.getNonModifierCommandsByName();
476
+ const globalCommandsByShortAlias = commandRegistry.getGlobalCommandsByShortAlias();
477
+ // and any group/member instance combinations...
478
+ const groupAndMemberCommandByJoinedName = commandRegistry.getGroupAndMemberCommandsByJoinedName();
479
+ // ...scan arguments, parse a resulting clause and execute a resulting parsed non-modifier Command
480
+ let runResult = await findAndExecuteNonModifierCommand(availableArgs, unusedArgs, nonModifierCommandsByName, globalCommandsByShortAlias, groupAndMemberCommandByJoinedName, configurationServiceProvider, context);
481
+ // nothing is returned if no command was discovered (otherwise a run result is returned)
482
+ if (runResult) {
483
+ return runResult;
484
+ }
485
+ // update args for the next scan operation
486
+ availableArgs = unusedArgs;
487
+ unusedArgs = [];
488
+ // if default non-modifier Command provided...
489
+ if (defaultCommand) {
490
+ // ...assume default command name and parse resulting clauses and execute a resulting parsed non-modifier Command if found
491
+ runResult = await findAndExecuteDefaultNonModifierCommand(availableArgs, unusedArgs, defaultCommand, configurationServiceProvider, context);
492
+ // nothing is returned if no command was discovered (otherwise a run result is returned)
493
+ if (runResult) {
494
+ return runResult;
495
+ }
496
+ }
497
+ // give up if we haven't successfully parsed a non-modifier Command by now
498
+ if (availableArgs.length > 0) {
499
+ await printNoCommandRecognisedError(context, commandRegistry, availableArgs.flat());
500
+ }
501
+ else {
502
+ await printNoCommandSpecifiedError(context);
503
+ }
504
+ return {
505
+ runState: RunState.NO_COMMAND,
506
+ };
507
+ }