@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.
- package/cli-plugin.ts +1 -1
- package/dist/cli-plugin.d.ts +1 -1
- package/dist/cli-plugin.d.ts.map +1 -1
- package/dist/cli-plugin.js +25 -247
- package/dist/index.js +70 -105710
- package/dist/src/api/BaseCLIFeatureOptions.js +0 -0
- package/dist/src/api/CLI.js +0 -0
- package/dist/src/api/CLIConfig.js +0 -0
- package/dist/src/api/Context.js +0 -0
- package/dist/src/api/RunResult.js +73 -0
- package/dist/src/api/argument/Argument.js +0 -0
- package/dist/src/api/argument/ArgumentValueTypes.js +18 -0
- package/dist/src/api/argument/ComplexOption.js +1 -0
- package/dist/src/api/argument/GlobalCommandArgument.js +0 -0
- package/dist/src/api/argument/Option.js +0 -0
- package/dist/src/api/argument/Positional.js +0 -0
- package/dist/src/api/argument/SubCommandArgument.js +1 -0
- package/dist/src/api/command/Command.d.ts +5 -0
- package/dist/src/api/command/Command.d.ts.map +1 -1
- package/dist/src/api/command/Command.js +0 -0
- package/dist/src/api/command/GlobalCommand.js +0 -0
- package/dist/src/api/command/GlobalModifierCommand.js +0 -0
- package/dist/src/api/command/GroupCommand.js +0 -0
- package/dist/src/api/command/SubCommand.js +0 -0
- package/dist/src/api/command/UsageExample.js +0 -0
- package/dist/src/api/plugin/CLIPlugin.js +2 -0
- package/dist/src/api/plugin/CommandFactory.js +7 -0
- package/dist/src/api/plugin/ServiceProviderFactory.js +7 -0
- package/dist/src/api/plugin/createCLIPlugin.js +30 -0
- package/dist/src/api/service/ServiceProvider.js +0 -0
- package/dist/src/api/service/core/ArgumentPrompterService.js +1 -0
- package/dist/src/api/service/core/AsciiBannerGeneratorService.js +1 -0
- package/dist/src/api/service/core/CompletionService.js +8 -0
- package/dist/src/api/service/core/DataDumpGeneratorService.js +7 -0
- package/dist/src/api/service/core/ImagePrinterService.js +1 -0
- package/dist/src/api/service/core/KeyValueService.js +7 -0
- package/dist/src/api/service/core/PluginService.js +6 -0
- package/dist/src/api/service/core/PrettyPrinterService.js +1 -0
- package/dist/src/api/service/core/PrinterService.js +42 -0
- package/dist/src/api/service/core/PrompterService.js +10 -0
- package/dist/src/api/service/core/SecretService.js +0 -0
- package/dist/src/api/service/core/ShutdownService.js +1 -0
- package/dist/src/api/service/core/SyntaxHighlighterService.js +1 -0
- package/dist/src/api/service/core/Table.js +49 -0
- package/dist/src/api/service/core/TableGeneratorService.d.ts +1 -0
- package/dist/src/api/service/core/TableGeneratorService.d.ts.map +1 -1
- package/dist/src/api/service/core/TableGeneratorService.js +7 -0
- package/dist/src/api/service/core/TreePrinterService.js +1 -0
- package/dist/src/cli/BaseCLI.d.ts.map +1 -1
- package/dist/src/cli/BaseCLI.js +233 -0
- package/dist/src/cli/DefaultRuntimeCLI.d.ts.map +1 -1
- package/dist/src/cli/DefaultRuntimeCLI.js +20 -0
- package/dist/src/cli/DynamicPluginRuntimeCLI.js +50 -0
- package/dist/src/command/MultiCommandCliHelpCommand.d.ts.map +1 -1
- package/dist/src/command/MultiCommandCliHelpCommand.js +238 -0
- package/dist/src/command/SingleCommandCliHelpCommand.js +104 -0
- package/dist/src/command/UsageCommand.js +16 -0
- package/dist/src/command/VersionCommand.js +13 -0
- package/dist/src/launcher.js +61 -0
- package/dist/src/runtime/DefaultContext.js +25 -0
- package/dist/src/runtime/argument/ArgumentTypeGuards.js +3 -0
- package/dist/src/runtime/command/CommandTypeGuards.js +12 -0
- package/dist/src/runtime/command/CommandValidator.js +371 -0
- package/dist/src/runtime/parser.js +105 -0
- package/dist/src/runtime/registry/CommandRegistry.js +0 -0
- package/dist/src/runtime/registry/DefaultCommandRegistry.js +190 -0
- package/dist/src/runtime/registry/DefaultServiceProviderRegistry.js +20 -0
- package/dist/src/runtime/registry/ServiceProviderRegistry.js +0 -0
- package/dist/src/runtime/runner.js +507 -0
- package/dist/src/runtime/scanner.js +244 -0
- package/dist/src/runtime/values/ValuePopulationResult.js +0 -0
- package/dist/src/runtime/values/argumentValueMerge.js +122 -0
- package/dist/src/runtime/values/argumentValueValidation.js +505 -0
- package/dist/src/runtime/values/globalCommandValuePopulation.js +67 -0
- package/dist/src/runtime/values/subCommandValuePopulation.js +549 -0
- package/dist/src/service/argumentPrompter/ArgumentPrompterServiceProvider.js +19 -0
- package/dist/src/service/argumentPrompter/DefaultArgumentPrompterService.js +197 -0
- package/dist/src/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.js +28 -0
- package/dist/src/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.js +233 -0
- package/dist/src/service/asciiBannerGenerator/standard.flf.json +3 -0
- package/dist/src/service/banner/BannerServiceProvider.js +60 -0
- package/dist/src/service/banner/command/NoBannerCommand.js +24 -0
- package/dist/src/service/chiselAsciiBannerGenerator/ChiselFontAsciiBannerGeneratorService.js +51 -0
- package/dist/src/service/chiselAsciiBannerGenerator/chisel.flf.json +3 -0
- package/dist/src/service/completion/CompletionServiceProvider.d.ts +2 -1
- package/dist/src/service/completion/CompletionServiceProvider.d.ts.map +1 -1
- package/dist/src/service/completion/CompletionServiceProvider.js +160 -0
- package/dist/src/service/completion/DefaultCompletionService.d.ts.map +1 -1
- package/dist/src/service/completion/DefaultCompletionService.js +279 -0
- package/dist/src/service/completion/command/CompletionCompleteSubCommand.d.ts +15 -0
- package/dist/src/service/completion/command/CompletionCompleteSubCommand.d.ts.map +1 -0
- package/dist/src/service/completion/command/CompletionCompleteSubCommand.js +37 -0
- package/dist/src/service/completion/command/CompletionGroupCommand.d.ts +14 -0
- package/dist/src/service/completion/command/CompletionGroupCommand.d.ts.map +1 -0
- package/dist/src/service/completion/command/CompletionGroupCommand.js +10 -0
- package/dist/src/service/completion/command/CompletionIntegrationSubCommand.d.ts +14 -0
- package/dist/src/service/completion/command/CompletionIntegrationSubCommand.d.ts.map +1 -0
- package/dist/src/service/completion/command/CompletionIntegrationSubCommand.js +67 -0
- package/dist/src/service/completion/shell/ShellHandler.js +0 -0
- package/dist/src/service/completion/shell/bash.js +39 -0
- package/dist/src/service/completion/shell/fish.js +35 -0
- package/dist/src/service/completion/shell/powershell.js +51 -0
- package/dist/src/service/completion/shell/zsh.js +42 -0
- package/dist/src/service/configuration/ConfigurationServiceProvider.js +482 -0
- package/dist/src/service/configuration/DefaultKeyValueService.js +80 -0
- package/dist/src/service/configuration/DefaultSecretService.js +60 -0
- package/dist/src/service/configuration/command/ConfigCommand.js +24 -0
- package/dist/src/service/configuration/command/DumpConfigCommand.js +18 -0
- package/dist/src/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.js +24 -0
- package/dist/src/service/dataDumpGenerator/DefaultDataDumpGeneratorService.js +59 -0
- package/dist/src/service/imagePrinter/DefaultImagePrinterService.js +10 -0
- package/dist/src/service/imagePrinter/ImagePrinterServiceProvider.js +20 -0
- package/dist/src/service/plugin/DefaultPluginService.js +21 -0
- package/dist/src/service/plugin/DefaultPluginServiceProvider.d.ts +1 -1
- package/dist/src/service/plugin/DefaultPluginServiceProvider.d.ts.map +1 -1
- package/dist/src/service/plugin/DefaultPluginServiceProvider.js +21 -0
- package/dist/src/service/plugin/command/PluginAddSubCommand.d.ts +17 -0
- package/dist/src/service/plugin/command/PluginAddSubCommand.d.ts.map +1 -0
- package/dist/src/service/plugin/command/PluginAddSubCommand.js +49 -0
- package/dist/src/service/plugin/command/PluginGroupCommand.d.ts +12 -0
- package/dist/src/service/plugin/command/PluginGroupCommand.d.ts.map +1 -0
- package/dist/src/service/plugin/command/PluginGroupCommand.js +21 -0
- package/dist/src/service/plugin/command/PluginListSubCommand.d.ts +12 -0
- package/dist/src/service/plugin/command/PluginListSubCommand.d.ts.map +1 -0
- package/dist/src/service/plugin/command/PluginListSubCommand.js +25 -0
- package/dist/src/service/plugin/command/PluginRemoveSubCommand.d.ts +17 -0
- package/dist/src/service/plugin/command/PluginRemoveSubCommand.d.ts.map +1 -0
- package/dist/src/service/plugin/command/PluginRemoveSubCommand.js +24 -0
- package/dist/src/service/plugin/command/PluginSearchSubCommand.d.ts +18 -0
- package/dist/src/service/plugin/command/PluginSearchSubCommand.d.ts.map +1 -0
- package/dist/src/service/plugin/command/PluginSearchSubCommand.js +34 -0
- package/dist/src/service/plugin/command/PluginUpgradeSubCommand.d.ts +12 -0
- package/dist/src/service/plugin/command/PluginUpgradeSubCommand.d.ts.map +1 -0
- package/dist/src/service/plugin/command/PluginUpgradeSubCommand.js +25 -0
- package/dist/src/service/plugin/command/getPluginId.d.ts +3 -0
- package/dist/src/service/plugin/command/getPluginId.d.ts.map +1 -0
- package/dist/src/service/plugin/command/getPluginId.js +3 -0
- package/dist/src/service/prettyPrinter/DefaultPrettyPrinterService.js +45 -0
- package/dist/src/service/prettyPrinter/PrettyPrinterServiceProvider.js +28 -0
- package/dist/src/service/printer/DefaultPrinterService.js +250 -0
- package/dist/src/service/printer/PrinterServiceProvider.js +43 -0
- package/dist/src/service/printer/command/DarkModeCommand.js +24 -0
- package/dist/src/service/printer/command/LogLevelCommand.js +41 -0
- package/dist/src/service/printer/command/NoColorCommand.js +24 -0
- package/dist/src/service/printer/command/NoHyperlinksCommand.js +21 -0
- package/dist/src/service/printer/terminal/Color.js +15 -0
- package/dist/src/service/printer/terminal/Progress.js +271 -0
- package/dist/src/service/printer/terminal/Spinner.js +83 -0
- package/dist/src/service/printer/terminal/Theme.js +26 -0
- package/dist/src/service/prompter/DefaultPrompterService.js +52 -0
- package/dist/src/service/prompter/PrompterServiceProvider.js +20 -0
- package/dist/src/service/prompter/command/NoPromptCommand.js +21 -0
- package/dist/src/service/prompter/prompt/PromptContext.js +22 -0
- package/dist/src/service/prompter/prompt/promptAcknowledge.js +19 -0
- package/dist/src/service/prompter/prompt/promptMultiSelect.js +74 -0
- package/dist/src/service/prompter/prompt/promptOpenUrl.js +70 -0
- package/dist/src/service/prompter/prompt/promptSingleSelect.js +73 -0
- package/dist/src/service/prompter/prompt/promptText.js +75 -0
- package/dist/src/service/prompter/prompt/promptToggle.js +21 -0
- package/dist/src/service/shutdown/DefaultShutdownService.js +16 -0
- package/dist/src/service/shutdown/ShutdownServiceProvider.js +60 -0
- package/dist/src/service/shutdown/ShutdownState.js +5 -0
- package/dist/src/service/syntaxHighlighter/DefaultSyntaxHighlighterService.js +54 -0
- package/dist/src/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.js +32 -0
- package/dist/src/service/tableGenerator/DefaultTableGeneratorService.d.ts +3 -1
- package/dist/src/service/tableGenerator/DefaultTableGeneratorService.d.ts.map +1 -1
- package/dist/src/service/tableGenerator/DefaultTableGeneratorService.js +344 -0
- package/dist/src/service/tableGenerator/TableGeneratorServiceProvider.js +26 -0
- package/dist/src/service/treePrinter/DefaultTreePrinterService.js +35 -0
- package/dist/src/service/treePrinter/TreePrinterServiceProvider.js +24 -0
- package/dist/src/terminal/Ansi.js +23 -0
- package/dist/src/terminal/ImageRenderer.js +164 -0
- package/dist/src/terminal/KeyReader.js +13 -0
- package/dist/src/terminal/PngDecoder.js +115 -0
- package/dist/src/terminal/Styler.js +0 -0
- package/dist/src/terminal/Terminal.js +0 -0
- package/dist/src/terminal/TtyKeyReader.js +87 -0
- package/dist/src/terminal/TtyStyler.js +55 -0
- package/dist/src/terminal/TtyTerminal.js +52 -0
- package/dist/src/terminal/supportsHyperlinks.d.ts.map +1 -1
- package/dist/src/terminal/supportsHyperlinks.js +95 -0
- package/dist/src/util/configHelper.js +61 -0
- package/dist/src/util/envVarHelper.js +216 -0
- package/dist/src/util/helpHelper.d.ts.map +1 -1
- package/dist/src/util/helpHelper.js +497 -0
- package/dist/src/util/logger.js +81 -0
- package/dist/src/util/runnerHelper.d.ts +1 -0
- package/dist/src/util/runnerHelper.d.ts.map +1 -1
- package/dist/src/util/runnerHelper.js +80 -0
- package/package.json +3 -3
- package/src/api/command/Command.ts +6 -0
- package/src/api/service/core/TableGeneratorService.ts +1 -0
- package/src/cli/BaseCLI.ts +6 -18
- package/src/cli/DefaultRuntimeCLI.ts +0 -4
- package/src/command/MultiCommandCliHelpCommand.ts +23 -7
- package/src/service/completion/CompletionServiceProvider.ts +16 -2
- package/src/service/completion/DefaultCompletionService.ts +14 -0
- package/src/service/completion/command/CompletionCompleteSubCommand.ts +59 -0
- package/src/service/completion/command/CompletionGroupCommand.ts +21 -0
- package/src/{command/CompletionCommand.ts → service/completion/command/CompletionIntegrationSubCommand.ts} +12 -72
- package/src/service/completion/shell/bash.ts +1 -1
- package/src/service/completion/shell/fish.ts +1 -1
- package/src/service/completion/shell/powershell.ts +1 -1
- package/src/service/completion/shell/zsh.ts +1 -1
- package/src/service/plugin/DefaultPluginServiceProvider.ts +2 -2
- package/src/service/plugin/command/PluginAddSubCommand.ts +64 -0
- package/src/service/plugin/command/PluginGroupCommand.ts +27 -0
- package/src/service/plugin/command/PluginListSubCommand.ts +33 -0
- package/src/service/plugin/command/PluginRemoveSubCommand.ts +32 -0
- package/src/service/plugin/command/PluginSearchSubCommand.ts +42 -0
- package/src/service/plugin/command/PluginUpgradeSubCommand.ts +36 -0
- package/src/service/plugin/command/getPluginId.ts +5 -0
- package/src/service/tableGenerator/DefaultTableGeneratorService.ts +7 -2
- package/src/terminal/supportsHyperlinks.ts +22 -0
- package/src/util/helpHelper.ts +7 -6
- package/src/util/runnerHelper.ts +14 -2
- package/dist/src/command/CompletionCommand.d.ts +0 -31
- package/dist/src/command/CompletionCommand.d.ts.map +0 -1
- package/dist/src/command/PluginCommand.d.ts +0 -67
- package/dist/src/command/PluginCommand.d.ts.map +0 -1
- package/dist/tests/cli/BaseCLI.test.d.ts +0 -2
- package/dist/tests/cli/BaseCLI.test.d.ts.map +0 -1
- package/dist/tests/cli/DynamicPluginRuntimeCLI.test.d.ts +0 -2
- package/dist/tests/cli/DynamicPluginRuntimeCLI.test.d.ts.map +0 -1
- package/dist/tests/command/CompletionCommand.test.d.ts +0 -2
- package/dist/tests/command/CompletionCommand.test.d.ts.map +0 -1
- package/dist/tests/command/MultiCommandCliHelpCommand.test.d.ts +0 -2
- package/dist/tests/command/MultiCommandCliHelpCommand.test.d.ts.map +0 -1
- package/dist/tests/command/SingleCommandCliHelpCommand.test.d.ts +0 -2
- package/dist/tests/command/SingleCommandCliHelpCommand.test.d.ts.map +0 -1
- package/dist/tests/command/UsageCommand.test.d.ts +0 -2
- package/dist/tests/command/UsageCommand.test.d.ts.map +0 -1
- package/dist/tests/command/VersionCommand.test.d.ts +0 -2
- package/dist/tests/command/VersionCommand.test.d.ts.map +0 -1
- package/dist/tests/fixtures/CLIConfig.d.ts +0 -3
- package/dist/tests/fixtures/CLIConfig.d.ts.map +0 -1
- package/dist/tests/fixtures/Command.d.ts +0 -20
- package/dist/tests/fixtures/Command.d.ts.map +0 -1
- package/dist/tests/fixtures/CommandRegistry.d.ts +0 -4
- package/dist/tests/fixtures/CommandRegistry.d.ts.map +0 -1
- package/dist/tests/fixtures/ConfigurationServiceProvider.d.ts +0 -10
- package/dist/tests/fixtures/ConfigurationServiceProvider.d.ts.map +0 -1
- package/dist/tests/fixtures/Context.d.ts +0 -4
- package/dist/tests/fixtures/Context.d.ts.map +0 -1
- package/dist/tests/fixtures/ServiceProviderRegistry.d.ts +0 -4
- package/dist/tests/fixtures/ServiceProviderRegistry.d.ts.map +0 -1
- package/dist/tests/fixtures/StreamString.d.ts +0 -10
- package/dist/tests/fixtures/StreamString.d.ts.map +0 -1
- package/dist/tests/fixtures/prettierPluginFoo.d.ts +0 -4
- package/dist/tests/fixtures/prettierPluginFoo.d.ts.map +0 -1
- package/dist/tests/fixtures/util.d.ts +0 -8
- package/dist/tests/fixtures/util.d.ts.map +0 -1
- package/dist/tests/runtime/DefaultContext.test.d.ts +0 -2
- package/dist/tests/runtime/DefaultContext.test.d.ts.map +0 -1
- package/dist/tests/runtime/argument/ArgumentTypeGuards.test.d.ts +0 -2
- package/dist/tests/runtime/argument/ArgumentTypeGuards.test.d.ts.map +0 -1
- package/dist/tests/runtime/command/CommandTypeGuards.test.d.ts +0 -2
- package/dist/tests/runtime/command/CommandTypeGuards.test.d.ts.map +0 -1
- package/dist/tests/runtime/command/CommandValidator.test.d.ts +0 -2
- package/dist/tests/runtime/command/CommandValidator.test.d.ts.map +0 -1
- package/dist/tests/runtime/parser.test.d.ts +0 -2
- package/dist/tests/runtime/parser.test.d.ts.map +0 -1
- package/dist/tests/runtime/registry/DefaultCommandRegistry.test.d.ts +0 -2
- package/dist/tests/runtime/registry/DefaultCommandRegistry.test.d.ts.map +0 -1
- package/dist/tests/runtime/registry/DefaultServiceProviderRegistry.test.d.ts +0 -2
- package/dist/tests/runtime/registry/DefaultServiceProviderRegistry.test.d.ts.map +0 -1
- package/dist/tests/runtime/runner.test.d.ts +0 -2
- package/dist/tests/runtime/runner.test.d.ts.map +0 -1
- package/dist/tests/runtime/scanner.test.d.ts +0 -2
- package/dist/tests/runtime/scanner.test.d.ts.map +0 -1
- package/dist/tests/runtime/values/argumentValueMerge.test.d.ts +0 -2
- package/dist/tests/runtime/values/argumentValueMerge.test.d.ts.map +0 -1
- package/dist/tests/runtime/values/argumentValueValidation.test.d.ts +0 -2
- package/dist/tests/runtime/values/argumentValueValidation.test.d.ts.map +0 -1
- package/dist/tests/runtime/values/globalCommandValuePopulation.test.d.ts +0 -2
- package/dist/tests/runtime/values/globalCommandValuePopulation.test.d.ts.map +0 -1
- package/dist/tests/runtime/values/subCommandValuePopulation.test.d.ts +0 -2
- package/dist/tests/runtime/values/subCommandValuePopulation.test.d.ts.map +0 -1
- package/dist/tests/service/argumentPrompter/ArgumentPrompterServiceProvider.test.d.ts +0 -2
- package/dist/tests/service/argumentPrompter/ArgumentPrompterServiceProvider.test.d.ts.map +0 -1
- package/dist/tests/service/argumentPrompter/DefaultArgumentPrompterService.test.d.ts +0 -2
- package/dist/tests/service/argumentPrompter/DefaultArgumentPrompterService.test.d.ts.map +0 -1
- package/dist/tests/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.test.d.ts +0 -2
- package/dist/tests/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.test.d.ts.map +0 -1
- package/dist/tests/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.test.d.ts +0 -2
- package/dist/tests/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.test.d.ts.map +0 -1
- package/dist/tests/service/banner/BannerServiceProvider.test.d.ts +0 -2
- package/dist/tests/service/banner/BannerServiceProvider.test.d.ts.map +0 -1
- package/dist/tests/service/banner/command/NoBannerCommand.test.d.ts +0 -2
- package/dist/tests/service/banner/command/NoBannerCommand.test.d.ts.map +0 -1
- package/dist/tests/service/chiselAsciiBannerGenerator/ChiselFontAsciiBannerGeneratorService.test.d.ts +0 -2
- package/dist/tests/service/chiselAsciiBannerGenerator/ChiselFontAsciiBannerGeneratorService.test.d.ts.map +0 -1
- package/dist/tests/service/completion/CompletionServiceProvider.test.d.ts +0 -2
- package/dist/tests/service/completion/CompletionServiceProvider.test.d.ts.map +0 -1
- package/dist/tests/service/completion/DefaultCompletionService.test.d.ts +0 -2
- package/dist/tests/service/completion/DefaultCompletionService.test.d.ts.map +0 -1
- package/dist/tests/service/completion/shell/bash.test.d.ts +0 -2
- package/dist/tests/service/completion/shell/bash.test.d.ts.map +0 -1
- package/dist/tests/service/completion/shell/fish.test.d.ts +0 -2
- package/dist/tests/service/completion/shell/fish.test.d.ts.map +0 -1
- package/dist/tests/service/completion/shell/powershell.test.d.ts +0 -2
- package/dist/tests/service/completion/shell/powershell.test.d.ts.map +0 -1
- package/dist/tests/service/completion/shell/zsh.test.d.ts +0 -2
- package/dist/tests/service/completion/shell/zsh.test.d.ts.map +0 -1
- package/dist/tests/service/configuration/ConfigurationServiceProvider.test.d.ts +0 -2
- package/dist/tests/service/configuration/ConfigurationServiceProvider.test.d.ts.map +0 -1
- package/dist/tests/service/configuration/DefaultKeyValueService.test.d.ts +0 -2
- package/dist/tests/service/configuration/DefaultKeyValueService.test.d.ts.map +0 -1
- package/dist/tests/service/configuration/DefaultSecretService.test.d.ts +0 -2
- package/dist/tests/service/configuration/DefaultSecretService.test.d.ts.map +0 -1
- package/dist/tests/service/configuration/command/ConfigCommand.test.d.ts +0 -2
- package/dist/tests/service/configuration/command/ConfigCommand.test.d.ts.map +0 -1
- package/dist/tests/service/configuration/command/DumpConfigCommand.test.d.ts +0 -2
- package/dist/tests/service/configuration/command/DumpConfigCommand.test.d.ts.map +0 -1
- package/dist/tests/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.test.d.ts +0 -2
- package/dist/tests/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.test.d.ts.map +0 -1
- package/dist/tests/service/dataDumpGenerator/DefaultDataDumpGeneratorService.test.d.ts +0 -2
- package/dist/tests/service/dataDumpGenerator/DefaultDataDumpGeneratorService.test.d.ts.map +0 -1
- package/dist/tests/service/imagePrinter/DefaultImagePrinterService.test.d.ts +0 -2
- package/dist/tests/service/imagePrinter/DefaultImagePrinterService.test.d.ts.map +0 -1
- package/dist/tests/service/imagePrinter/ImagePrinterServiceProvider.test.d.ts +0 -2
- package/dist/tests/service/imagePrinter/ImagePrinterServiceProvider.test.d.ts.map +0 -1
- package/dist/tests/service/plugin/DefaultPluginServiceProvider.test.d.ts +0 -2
- package/dist/tests/service/plugin/DefaultPluginServiceProvider.test.d.ts.map +0 -1
- package/dist/tests/service/prettyPrinter/DefaultPrettyPrinterService.test.d.ts +0 -2
- package/dist/tests/service/prettyPrinter/DefaultPrettyPrinterService.test.d.ts.map +0 -1
- package/dist/tests/service/prettyPrinter/PrettyPrinterServiceProvider.test.d.ts +0 -2
- package/dist/tests/service/prettyPrinter/PrettyPrinterServiceProvider.test.d.ts.map +0 -1
- package/dist/tests/service/printer/DefaultPrinterService.test.d.ts +0 -2
- package/dist/tests/service/printer/DefaultPrinterService.test.d.ts.map +0 -1
- package/dist/tests/service/printer/PrinterServiceProvider.test.d.ts +0 -2
- package/dist/tests/service/printer/PrinterServiceProvider.test.d.ts.map +0 -1
- package/dist/tests/service/printer/command/DarkModeCommand.test.d.ts +0 -2
- package/dist/tests/service/printer/command/DarkModeCommand.test.d.ts.map +0 -1
- package/dist/tests/service/printer/command/LogLevelCommand.test.d.ts +0 -2
- package/dist/tests/service/printer/command/LogLevelCommand.test.d.ts.map +0 -1
- package/dist/tests/service/printer/command/NoColorCommand.test.d.ts +0 -2
- package/dist/tests/service/printer/command/NoColorCommand.test.d.ts.map +0 -1
- package/dist/tests/service/printer/command/NoHyperlinksCommand.test.d.ts +0 -2
- package/dist/tests/service/printer/command/NoHyperlinksCommand.test.d.ts.map +0 -1
- package/dist/tests/service/printer/terminal/Progress.test.d.ts +0 -2
- package/dist/tests/service/printer/terminal/Progress.test.d.ts.map +0 -1
- package/dist/tests/service/printer/terminal/Spinner.test.d.ts +0 -2
- package/dist/tests/service/printer/terminal/Spinner.test.d.ts.map +0 -1
- package/dist/tests/service/prompter/DefaultPrompterService.test.d.ts +0 -2
- package/dist/tests/service/prompter/DefaultPrompterService.test.d.ts.map +0 -1
- package/dist/tests/service/prompter/PrompterServiceProvider.test.d.ts +0 -2
- package/dist/tests/service/prompter/PrompterServiceProvider.test.d.ts.map +0 -1
- package/dist/tests/service/prompter/command/NoPromptCommand.test.d.ts +0 -2
- package/dist/tests/service/prompter/command/NoPromptCommand.test.d.ts.map +0 -1
- package/dist/tests/service/prompter/prompt/PromptContext.test.d.ts +0 -2
- package/dist/tests/service/prompter/prompt/PromptContext.test.d.ts.map +0 -1
- package/dist/tests/service/shutdown/ShutdownServiceProvider.test.d.ts +0 -2
- package/dist/tests/service/shutdown/ShutdownServiceProvider.test.d.ts.map +0 -1
- package/dist/tests/service/syntaxHighlighter/DefaultSyntaxHighlighterService.test.d.ts +0 -2
- package/dist/tests/service/syntaxHighlighter/DefaultSyntaxHighlighterService.test.d.ts.map +0 -1
- package/dist/tests/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.test.d.ts +0 -2
- package/dist/tests/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.test.d.ts.map +0 -1
- package/dist/tests/service/tableGenerator/DefaultTableGeneratorService.test.d.ts +0 -2
- package/dist/tests/service/tableGenerator/DefaultTableGeneratorService.test.d.ts.map +0 -1
- package/dist/tests/service/tableGenerator/TableGeneratorServiceProvider.test.d.ts +0 -2
- package/dist/tests/service/tableGenerator/TableGeneratorServiceProvider.test.d.ts.map +0 -1
- package/dist/tests/service/treePrinter/DefaultTreePrinterService.test.d.ts +0 -2
- package/dist/tests/service/treePrinter/DefaultTreePrinterService.test.d.ts.map +0 -1
- package/dist/tests/service/treePrinter/TreePrinterServiceProvider.test.d.ts +0 -2
- package/dist/tests/service/treePrinter/TreePrinterServiceProvider.test.d.ts.map +0 -1
- package/dist/tests/terminal/ImageRenderer.test.d.ts +0 -2
- package/dist/tests/terminal/ImageRenderer.test.d.ts.map +0 -1
- package/dist/tests/terminal/PngDecoder.test.d.ts +0 -2
- package/dist/tests/terminal/PngDecoder.test.d.ts.map +0 -1
- package/dist/tests/terminal/supportsHyperlinks.test.d.ts +0 -2
- package/dist/tests/terminal/supportsHyperlinks.test.d.ts.map +0 -1
- package/dist/tests/util/configHelper.test.d.ts +0 -2
- package/dist/tests/util/configHelper.test.d.ts.map +0 -1
- package/dist/tests/util/envVarHelper.test.d.ts +0 -2
- package/dist/tests/util/envVarHelper.test.d.ts.map +0 -1
- package/dist/tests/util/logger.test.d.ts +0 -2
- package/dist/tests/util/logger.test.d.ts.map +0 -1
- package/src/command/PluginCommand.ts +0 -197
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import { Align } from "../../api/service/core/TableGeneratorService.js";
|
|
2
|
+
import Table from "../../api/service/core/Table.js";
|
|
3
|
+
const BORDER_TOP_LEFT = "┌";
|
|
4
|
+
const BORDER_TOP = "─";
|
|
5
|
+
const BORDER_TOP_MIDDLE = "┬";
|
|
6
|
+
const BORDER_TOP_RIGHT = "┐";
|
|
7
|
+
const BORDER_LEFT = "│";
|
|
8
|
+
const BORDER_MIDDLE_VERTICAL = "│";
|
|
9
|
+
const BORDER_RIGHT = "│";
|
|
10
|
+
const BORDER_LEFT_MIDDLE = "├";
|
|
11
|
+
const BORDER_MIDDLE = "─";
|
|
12
|
+
const BORDER_MIDDLE_MIDDLE = "┼";
|
|
13
|
+
const BORDER_RIGHT_MIDDLE = "┤";
|
|
14
|
+
const BORDER_BOTTOM_LEFT = "└";
|
|
15
|
+
const BORDER_BOTTOM = "─";
|
|
16
|
+
const BORDER_BOTTOM_MIDDLE = "┴";
|
|
17
|
+
const BORDER_BOTTOM_RIGHT = "┘";
|
|
18
|
+
export default class DefaultTableGeneratorService {
|
|
19
|
+
colorEnabled = true;
|
|
20
|
+
colorFunction = (text) => text;
|
|
21
|
+
backgroundColorFunction = (text) => text;
|
|
22
|
+
createTable(rowCount, columnCount, options) {
|
|
23
|
+
return new Table(rowCount, columnCount, options);
|
|
24
|
+
}
|
|
25
|
+
#resolveAlign(table, rowIndex, columnIndex) {
|
|
26
|
+
const cellOpts = table.getCell(rowIndex, columnIndex)?.options;
|
|
27
|
+
if (cellOpts?.align !== undefined)
|
|
28
|
+
return cellOpts.align;
|
|
29
|
+
const rowOpts = table.getRowOptions(rowIndex);
|
|
30
|
+
if (rowOpts?.align !== undefined)
|
|
31
|
+
return rowOpts.align;
|
|
32
|
+
const colOpts = table.getColumnOptions(columnIndex);
|
|
33
|
+
if (colOpts?.align !== undefined)
|
|
34
|
+
return colOpts.align;
|
|
35
|
+
return table.options.align ?? Align.LEFT;
|
|
36
|
+
}
|
|
37
|
+
#calculateColumnWidths(table) {
|
|
38
|
+
const border = table.options.border !== false;
|
|
39
|
+
const padding = table.options.padding ?? 1;
|
|
40
|
+
const maxWidth = table.options.maxWidth ?? 80;
|
|
41
|
+
const borderOverhead = border ? table.columnCount + 1 : Math.max(table.columnCount - 1, 0);
|
|
42
|
+
const paddingOverhead = table.columnCount * 2 * padding;
|
|
43
|
+
const contentBudget = Math.max(maxWidth - borderOverhead - paddingOverhead, table.columnCount);
|
|
44
|
+
const naturalWidths = [];
|
|
45
|
+
for (let col = 0; col < table.columnCount; col++) {
|
|
46
|
+
let maxCellWidth = 0;
|
|
47
|
+
for (let row = 0; row < table.rowCount; row++) {
|
|
48
|
+
const cell = table.getCell(row, col);
|
|
49
|
+
if (cell) {
|
|
50
|
+
const lines = cell.contents.split("\n");
|
|
51
|
+
for (const line of lines) {
|
|
52
|
+
const w = Bun.stringWidth(line);
|
|
53
|
+
if (w > maxCellWidth)
|
|
54
|
+
maxCellWidth = w;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const colOpts = table.getColumnOptions(col);
|
|
59
|
+
if (colOpts?.minWidth !== undefined && maxCellWidth < colOpts.minWidth) {
|
|
60
|
+
maxCellWidth = colOpts.minWidth;
|
|
61
|
+
}
|
|
62
|
+
if (colOpts?.maxWidth !== undefined && maxCellWidth > colOpts.maxWidth) {
|
|
63
|
+
maxCellWidth = colOpts.maxWidth;
|
|
64
|
+
}
|
|
65
|
+
naturalWidths.push(maxCellWidth);
|
|
66
|
+
}
|
|
67
|
+
const totalNatural = naturalWidths.reduce((a, b) => a + b, 0);
|
|
68
|
+
if (totalNatural <= contentBudget) {
|
|
69
|
+
const surplus = contentBudget - totalNatural;
|
|
70
|
+
const totalFlexWeight = this.#sumFlexWeights(table);
|
|
71
|
+
if (surplus > 0 && totalFlexWeight > 0) {
|
|
72
|
+
this.#distributeGrow(table, naturalWidths, surplus, totalFlexWeight);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const excess = totalNatural - contentBudget;
|
|
77
|
+
this.#distributeShrink(table, naturalWidths, excess);
|
|
78
|
+
}
|
|
79
|
+
return naturalWidths;
|
|
80
|
+
}
|
|
81
|
+
#sumFlexWeights(table) {
|
|
82
|
+
let total = 0;
|
|
83
|
+
for (let col = 0; col < table.columnCount; col++) {
|
|
84
|
+
const colOpts = table.getColumnOptions(col);
|
|
85
|
+
total += colOpts?.flexWeight ?? 0;
|
|
86
|
+
}
|
|
87
|
+
return total;
|
|
88
|
+
}
|
|
89
|
+
#distributeGrow(table, widths, surplus, totalFlexWeight) {
|
|
90
|
+
let remaining = surplus;
|
|
91
|
+
for (let col = 0; col < table.columnCount; col++) {
|
|
92
|
+
const colOpts = table.getColumnOptions(col);
|
|
93
|
+
const weight = colOpts?.flexWeight ?? 0;
|
|
94
|
+
if (weight <= 0)
|
|
95
|
+
continue;
|
|
96
|
+
const share = Math.floor((weight / totalFlexWeight) * surplus);
|
|
97
|
+
let newWidth = widths[col] + share;
|
|
98
|
+
if (colOpts?.maxWidth !== undefined && newWidth > colOpts.maxWidth) {
|
|
99
|
+
newWidth = colOpts.maxWidth;
|
|
100
|
+
}
|
|
101
|
+
const added = newWidth - widths[col];
|
|
102
|
+
widths[col] = newWidth;
|
|
103
|
+
remaining -= added;
|
|
104
|
+
}
|
|
105
|
+
// distribute any rounding remainder to first flex column
|
|
106
|
+
if (remaining > 0) {
|
|
107
|
+
for (let col = 0; col < table.columnCount; col++) {
|
|
108
|
+
const colOpts = table.getColumnOptions(col);
|
|
109
|
+
if ((colOpts?.flexWeight ?? 0) > 0) {
|
|
110
|
+
let newWidth = widths[col] + remaining;
|
|
111
|
+
if (colOpts?.maxWidth !== undefined && newWidth > colOpts.maxWidth) {
|
|
112
|
+
newWidth = colOpts.maxWidth;
|
|
113
|
+
}
|
|
114
|
+
widths[col] = newWidth;
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
#distributeShrink(table, widths, excess) {
|
|
121
|
+
let remaining = excess;
|
|
122
|
+
const shrinkable = new Set();
|
|
123
|
+
for (let col = 0; col < table.columnCount; col++) {
|
|
124
|
+
const colOpts = table.getColumnOptions(col);
|
|
125
|
+
if ((colOpts?.flexWeight ?? 0) > 0) {
|
|
126
|
+
shrinkable.add(col);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
while (remaining > 0 && shrinkable.size > 0) {
|
|
130
|
+
let totalWeightedWidth = 0;
|
|
131
|
+
for (const col of shrinkable) {
|
|
132
|
+
const colOpts = table.getColumnOptions(col);
|
|
133
|
+
totalWeightedWidth += (colOpts?.flexWeight ?? 0) * widths[col];
|
|
134
|
+
}
|
|
135
|
+
if (totalWeightedWidth <= 0)
|
|
136
|
+
break;
|
|
137
|
+
let shrank = false;
|
|
138
|
+
for (const col of shrinkable) {
|
|
139
|
+
if (remaining <= 0)
|
|
140
|
+
break;
|
|
141
|
+
const colOpts = table.getColumnOptions(col);
|
|
142
|
+
const weight = colOpts?.flexWeight ?? 0;
|
|
143
|
+
const share = Math.max(1, Math.floor(((weight * widths[col]) / totalWeightedWidth) * remaining));
|
|
144
|
+
const minWidth = colOpts?.minWidth ?? 1;
|
|
145
|
+
const maxShrink = widths[col] - minWidth;
|
|
146
|
+
if (maxShrink <= 0) {
|
|
147
|
+
shrinkable.delete(col);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const actual = Math.min(share, maxShrink);
|
|
151
|
+
widths[col] = widths[col] - actual;
|
|
152
|
+
remaining -= actual;
|
|
153
|
+
shrank = true;
|
|
154
|
+
if (widths[col] <= minWidth) {
|
|
155
|
+
shrinkable.delete(col);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (!shrank)
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
#wrapLine(line, width) {
|
|
163
|
+
if (width <= 0)
|
|
164
|
+
return [line];
|
|
165
|
+
if (Bun.stringWidth(line) <= width)
|
|
166
|
+
return [line];
|
|
167
|
+
const wrapped = [];
|
|
168
|
+
const words = line.split(/(\s+)/);
|
|
169
|
+
let currentLine = "";
|
|
170
|
+
let currentWidth = 0;
|
|
171
|
+
for (const word of words) {
|
|
172
|
+
const wordWidth = Bun.stringWidth(word);
|
|
173
|
+
if (currentWidth === 0) {
|
|
174
|
+
if (wordWidth <= width) {
|
|
175
|
+
currentLine = word;
|
|
176
|
+
currentWidth = wordWidth;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
this.#hardBreak(word, width, wrapped);
|
|
180
|
+
currentLine = "";
|
|
181
|
+
currentWidth = 0;
|
|
182
|
+
if (wrapped.length > 0) {
|
|
183
|
+
const last = wrapped[wrapped.length - 1];
|
|
184
|
+
if (Bun.stringWidth(last) < width) {
|
|
185
|
+
currentLine = wrapped.pop();
|
|
186
|
+
currentWidth = Bun.stringWidth(currentLine);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
else if (currentWidth + wordWidth <= width) {
|
|
192
|
+
currentLine += word;
|
|
193
|
+
currentWidth += wordWidth;
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
wrapped.push(currentLine);
|
|
197
|
+
const trimmed = word.replace(/^\s+/, "");
|
|
198
|
+
const trimmedWidth = Bun.stringWidth(trimmed);
|
|
199
|
+
if (trimmedWidth <= width) {
|
|
200
|
+
currentLine = trimmed;
|
|
201
|
+
currentWidth = trimmedWidth;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
this.#hardBreak(trimmed, width, wrapped);
|
|
205
|
+
currentLine = "";
|
|
206
|
+
currentWidth = 0;
|
|
207
|
+
if (wrapped.length > 0) {
|
|
208
|
+
const last = wrapped[wrapped.length - 1];
|
|
209
|
+
if (Bun.stringWidth(last) < width) {
|
|
210
|
+
currentLine = wrapped.pop();
|
|
211
|
+
currentWidth = Bun.stringWidth(currentLine);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (currentLine.length > 0) {
|
|
218
|
+
wrapped.push(currentLine);
|
|
219
|
+
}
|
|
220
|
+
return wrapped.length > 0 ? wrapped : [""];
|
|
221
|
+
}
|
|
222
|
+
#hardBreak(text, width, output) {
|
|
223
|
+
let remaining = text;
|
|
224
|
+
while (Bun.stringWidth(remaining) > width) {
|
|
225
|
+
let breakAt = 0;
|
|
226
|
+
let w = 0;
|
|
227
|
+
for (const char of remaining) {
|
|
228
|
+
const cw = Bun.stringWidth(char);
|
|
229
|
+
if (w + cw > width)
|
|
230
|
+
break;
|
|
231
|
+
w += cw;
|
|
232
|
+
breakAt += char.length;
|
|
233
|
+
}
|
|
234
|
+
if (breakAt === 0)
|
|
235
|
+
breakAt = 1;
|
|
236
|
+
output.push(remaining.slice(0, breakAt));
|
|
237
|
+
remaining = remaining.slice(breakAt);
|
|
238
|
+
}
|
|
239
|
+
if (remaining.length > 0) {
|
|
240
|
+
output.push(remaining);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
#wrapCellContent(contents, width) {
|
|
244
|
+
const inputLines = contents.split("\n");
|
|
245
|
+
const result = [];
|
|
246
|
+
for (const line of inputLines) {
|
|
247
|
+
result.push(...this.#wrapLine(line, width));
|
|
248
|
+
}
|
|
249
|
+
return result.length > 0 ? result : [""];
|
|
250
|
+
}
|
|
251
|
+
#alignText(text, width, align) {
|
|
252
|
+
const textWidth = Bun.stringWidth(text);
|
|
253
|
+
const gap = width - textWidth;
|
|
254
|
+
if (gap <= 0)
|
|
255
|
+
return text;
|
|
256
|
+
switch (align) {
|
|
257
|
+
case Align.LEFT:
|
|
258
|
+
return text + " ".repeat(gap);
|
|
259
|
+
case Align.RIGHT:
|
|
260
|
+
return " ".repeat(gap) + text;
|
|
261
|
+
case Align.CENTER: {
|
|
262
|
+
const left = Math.floor(gap / 2);
|
|
263
|
+
const right = gap - left;
|
|
264
|
+
return " ".repeat(left) + text + " ".repeat(right);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
#colorBorder(char, table) {
|
|
269
|
+
let result = char;
|
|
270
|
+
if (this.colorEnabled && table.options.borderBackgroundColor) {
|
|
271
|
+
result = this.backgroundColorFunction(result, table.options.borderBackgroundColor);
|
|
272
|
+
}
|
|
273
|
+
if (this.colorEnabled && table.options.borderColor) {
|
|
274
|
+
result = this.colorFunction(result, table.options.borderColor);
|
|
275
|
+
}
|
|
276
|
+
return result;
|
|
277
|
+
}
|
|
278
|
+
render(table) {
|
|
279
|
+
const border = table.options.border !== false;
|
|
280
|
+
const padding = table.options.padding ?? 1;
|
|
281
|
+
const columnWidths = this.#calculateColumnWidths(table);
|
|
282
|
+
const pad = " ".repeat(padding);
|
|
283
|
+
const wrappedCells = [];
|
|
284
|
+
const rowHeights = [];
|
|
285
|
+
for (let row = 0; row < table.rowCount; row++) {
|
|
286
|
+
const rowCells = [];
|
|
287
|
+
let maxHeight = 1;
|
|
288
|
+
for (let col = 0; col < table.columnCount; col++) {
|
|
289
|
+
const cell = table.getCell(row, col);
|
|
290
|
+
const lines = this.#wrapCellContent(cell?.contents ?? "", columnWidths[col]);
|
|
291
|
+
rowCells.push(lines);
|
|
292
|
+
if (lines.length > maxHeight)
|
|
293
|
+
maxHeight = lines.length;
|
|
294
|
+
}
|
|
295
|
+
wrappedCells.push(rowCells);
|
|
296
|
+
rowHeights.push(maxHeight);
|
|
297
|
+
}
|
|
298
|
+
const output = [];
|
|
299
|
+
if (border) {
|
|
300
|
+
output.push(this.#renderHorizontalBorder(table, columnWidths, padding, BORDER_TOP_LEFT, BORDER_TOP, BORDER_TOP_MIDDLE, BORDER_TOP_RIGHT));
|
|
301
|
+
}
|
|
302
|
+
for (let row = 0; row < table.rowCount; row++) {
|
|
303
|
+
for (let subLine = 0; subLine < rowHeights[row]; subLine++) {
|
|
304
|
+
let line = "";
|
|
305
|
+
if (border)
|
|
306
|
+
line += this.#colorBorder(BORDER_LEFT, table);
|
|
307
|
+
for (let col = 0; col < table.columnCount; col++) {
|
|
308
|
+
if (!border && col > 0)
|
|
309
|
+
line += " ".repeat(padding * 2);
|
|
310
|
+
const cellLines = wrappedCells[row][col];
|
|
311
|
+
const content = subLine < cellLines.length ? cellLines[subLine] : "";
|
|
312
|
+
const align = this.#resolveAlign(table, row, col);
|
|
313
|
+
const aligned = this.#alignText(content, columnWidths[col], align);
|
|
314
|
+
line += pad + aligned + pad;
|
|
315
|
+
if (border && col < table.columnCount - 1) {
|
|
316
|
+
line += this.#colorBorder(BORDER_MIDDLE_VERTICAL, table);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
if (border)
|
|
320
|
+
line += this.#colorBorder(BORDER_RIGHT, table);
|
|
321
|
+
output.push(border ? line : line.trimEnd());
|
|
322
|
+
}
|
|
323
|
+
if (border && row < table.rowCount - 1) {
|
|
324
|
+
output.push(this.#renderHorizontalBorder(table, columnWidths, padding, BORDER_LEFT_MIDDLE, BORDER_MIDDLE, BORDER_MIDDLE_MIDDLE, BORDER_RIGHT_MIDDLE));
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (border) {
|
|
328
|
+
output.push(this.#renderHorizontalBorder(table, columnWidths, padding, BORDER_BOTTOM_LEFT, BORDER_BOTTOM, BORDER_BOTTOM_MIDDLE, BORDER_BOTTOM_RIGHT));
|
|
329
|
+
}
|
|
330
|
+
return output.join("\n");
|
|
331
|
+
}
|
|
332
|
+
#renderHorizontalBorder(table, columnWidths, padding, left, horizontal, middle, right) {
|
|
333
|
+
let line = this.#colorBorder(left, table);
|
|
334
|
+
for (let col = 0; col < table.columnCount; col++) {
|
|
335
|
+
const segment = horizontal.repeat(columnWidths[col] + padding * 2);
|
|
336
|
+
line += this.#colorBorder(segment, table);
|
|
337
|
+
if (col < table.columnCount - 1) {
|
|
338
|
+
line += this.#colorBorder(middle, table);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
line += this.#colorBorder(right, table);
|
|
342
|
+
return line;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import DefaultTableGeneratorService from "./DefaultTableGeneratorService.js";
|
|
2
|
+
import { TABLE_GENERATOR_SERVICE_ID } from "../../api/service/core/TableGeneratorService.js";
|
|
3
|
+
import { PRINTER_SERVICE_ID } from "../../api/service/core/PrinterService.js";
|
|
4
|
+
export default class TableGeneratorServiceProvider {
|
|
5
|
+
servicePriority;
|
|
6
|
+
serviceId = TABLE_GENERATOR_SERVICE_ID;
|
|
7
|
+
#defaultTableGeneratorService;
|
|
8
|
+
constructor(servicePriority) {
|
|
9
|
+
this.servicePriority = servicePriority;
|
|
10
|
+
this.#defaultTableGeneratorService = new DefaultTableGeneratorService();
|
|
11
|
+
}
|
|
12
|
+
getServiceInfo(_cliConfig) {
|
|
13
|
+
return Promise.resolve({
|
|
14
|
+
service: this.#defaultTableGeneratorService,
|
|
15
|
+
commands: [],
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
initService(context) {
|
|
19
|
+
const printerService = context.getServiceById(PRINTER_SERVICE_ID);
|
|
20
|
+
this.#defaultTableGeneratorService.colorEnabled = printerService.colorEnabled;
|
|
21
|
+
this.#defaultTableGeneratorService.colorFunction = printerService.color.bind(printerService);
|
|
22
|
+
this.#defaultTableGeneratorService.backgroundColorFunction =
|
|
23
|
+
printerService.backgroundColor.bind(printerService);
|
|
24
|
+
return Promise.resolve(undefined);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const DEFAULT_NODE_COLOR = "#839496";
|
|
2
|
+
export default class DefaultTreePrinterService {
|
|
3
|
+
colorEnabled = true;
|
|
4
|
+
colorFunction = (text) => text;
|
|
5
|
+
#nodeColor;
|
|
6
|
+
constructor(nodeColor = DEFAULT_NODE_COLOR) {
|
|
7
|
+
this.#nodeColor = nodeColor;
|
|
8
|
+
}
|
|
9
|
+
#colorLabel(label) {
|
|
10
|
+
if (this.colorEnabled) {
|
|
11
|
+
return this.colorFunction(label, this.#nodeColor);
|
|
12
|
+
}
|
|
13
|
+
return label;
|
|
14
|
+
}
|
|
15
|
+
#renderChildren(children, prefix, lines) {
|
|
16
|
+
for (let i = 0; i < children.length; i++) {
|
|
17
|
+
const child = children[i];
|
|
18
|
+
const isLast = i === children.length - 1;
|
|
19
|
+
const connector = isLast ? "└── " : "├── ";
|
|
20
|
+
const extension = isLast ? " " : "│ ";
|
|
21
|
+
if (typeof child === "string") {
|
|
22
|
+
lines.push(prefix + connector + this.#colorLabel(child));
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
lines.push(prefix + connector + this.#colorLabel(child.label));
|
|
26
|
+
this.#renderChildren(child.children ?? [], prefix + extension, lines);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
print(node) {
|
|
31
|
+
const lines = [this.#colorLabel(node.label)];
|
|
32
|
+
this.#renderChildren(node.children ?? [], "", lines);
|
|
33
|
+
return lines.join("\n");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import DefaultTreePrinterService from "./DefaultTreePrinterService.js";
|
|
2
|
+
import { TREE_PRINTER_SERVICE_ID } from "../../api/service/core/TreePrinterService.js";
|
|
3
|
+
import { PRINTER_SERVICE_ID } from "../../api/service/core/PrinterService.js";
|
|
4
|
+
export default class TreePrinterServiceProvider {
|
|
5
|
+
servicePriority;
|
|
6
|
+
serviceId = TREE_PRINTER_SERVICE_ID;
|
|
7
|
+
#defaultTreePrinterService;
|
|
8
|
+
constructor(servicePriority) {
|
|
9
|
+
this.servicePriority = servicePriority;
|
|
10
|
+
this.#defaultTreePrinterService = new DefaultTreePrinterService();
|
|
11
|
+
}
|
|
12
|
+
getServiceInfo(_cliConfig) {
|
|
13
|
+
return Promise.resolve({
|
|
14
|
+
service: this.#defaultTreePrinterService,
|
|
15
|
+
commands: [],
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
initService(context) {
|
|
19
|
+
const printerService = context.getServiceById(PRINTER_SERVICE_ID);
|
|
20
|
+
this.#defaultTreePrinterService.colorEnabled = printerService.colorEnabled;
|
|
21
|
+
this.#defaultTreePrinterService.colorFunction = printerService.color.bind(printerService);
|
|
22
|
+
return Promise.resolve(undefined);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const CSI = "\x1b[";
|
|
2
|
+
const OSC = "\x1b]";
|
|
3
|
+
const BEL = "\x07";
|
|
4
|
+
const SEP = ";";
|
|
5
|
+
export const CLEAR_LINE = CSI + "2K";
|
|
6
|
+
export const CURSOR_LEFT = CSI + "G";
|
|
7
|
+
export const CURSOR_UP = CSI + "1A";
|
|
8
|
+
export const HIDE_CURSOR = CSI + "?25l";
|
|
9
|
+
export const SHOW_CURSOR = CSI + "?25h";
|
|
10
|
+
export const ITALIC_START = CSI + "3m";
|
|
11
|
+
export const ITALIC_END = CSI + "23m";
|
|
12
|
+
export const FOREGROUND_COLOR_END = CSI + "39m";
|
|
13
|
+
export const BACKGROUND_COLOR_END = CSI + "49m";
|
|
14
|
+
export const HYPERLINK_END = `${OSC}8${SEP}${SEP}${BEL}`;
|
|
15
|
+
export function foregroundColorStart(r, g, b) {
|
|
16
|
+
return `\x1b[38;2;${r};${g};${b}m`;
|
|
17
|
+
}
|
|
18
|
+
export function backgroundColorStart(r, g, b) {
|
|
19
|
+
return `\x1b[48;2;${r};${g};${b}m`;
|
|
20
|
+
}
|
|
21
|
+
export function hyperlinkStart(url) {
|
|
22
|
+
return `${OSC}8${SEP}${SEP}${url}${BEL}`;
|
|
23
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import supportsTerminalGraphics from "supports-terminal-graphics";
|
|
3
|
+
import { decodePngToRGBA } from "./PngDecoder.js";
|
|
4
|
+
import { BACKGROUND_COLOR_END, backgroundColorStart, FOREGROUND_COLOR_END, foregroundColorStart, } from "./Ansi.js";
|
|
5
|
+
import { Buffer } from "node:buffer";
|
|
6
|
+
export default class ImageRenderer {
|
|
7
|
+
#terminal;
|
|
8
|
+
constructor(terminal) {
|
|
9
|
+
this.#terminal = terminal;
|
|
10
|
+
}
|
|
11
|
+
renderImage(imageBuffer, widthPercentage = 100, hexFormattedBackgroundColor) {
|
|
12
|
+
if (!this.#isMultiplexer()) {
|
|
13
|
+
if (supportsTerminalGraphics.stdout.kitty) {
|
|
14
|
+
return this.#renderKitty(imageBuffer, widthPercentage);
|
|
15
|
+
}
|
|
16
|
+
if (supportsTerminalGraphics.stdout.iterm2) {
|
|
17
|
+
return this.#renderITerm2(imageBuffer, widthPercentage);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return this.#renderAnsiBlocks(imageBuffer, widthPercentage, hexFormattedBackgroundColor);
|
|
21
|
+
}
|
|
22
|
+
#isMultiplexer() {
|
|
23
|
+
const term = (process.env.TERM || "").toLowerCase();
|
|
24
|
+
const termProgram = (process.env.TERM_PROGRAM || "").toLowerCase();
|
|
25
|
+
return (termProgram === "tmux" ||
|
|
26
|
+
termProgram === "screen" ||
|
|
27
|
+
term.startsWith("tmux") ||
|
|
28
|
+
term.startsWith("screen"));
|
|
29
|
+
}
|
|
30
|
+
// https://sw.kovidgoyal.net/kitty/graphics-protocol/
|
|
31
|
+
async #renderKitty(imageBuffer, widthPercentage) {
|
|
32
|
+
const pngBytes = await new Bun.Image(imageBuffer).png().bytes();
|
|
33
|
+
const columns = Math.floor((this.#terminal.columns() * widthPercentage) / 100);
|
|
34
|
+
const base64 = Buffer.from(pngBytes).toString("base64");
|
|
35
|
+
const chunks = [];
|
|
36
|
+
for (let i = 0; i < base64.length; i += 4096) {
|
|
37
|
+
chunks.push(base64.slice(i, i + 4096));
|
|
38
|
+
}
|
|
39
|
+
let result = "";
|
|
40
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
41
|
+
const isLast = i === chunks.length - 1;
|
|
42
|
+
if (i === 0) {
|
|
43
|
+
result += `\x1b_Gf=100,a=T,c=${columns},m=${isLast ? 0 : 1};${chunks[i]}\x1b\\`;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
result += `\x1b_Gm=${isLast ? 0 : 1};${chunks[i]}\x1b\\`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
// https://iterm2.com/documentation-images.html
|
|
52
|
+
async #renderITerm2(imageBuffer, widthPercentage) {
|
|
53
|
+
const pngBytes = await new Bun.Image(imageBuffer).png().bytes();
|
|
54
|
+
const base64 = Buffer.from(pngBytes).toString("base64");
|
|
55
|
+
return `\x1b]1337;File=inline=1;width=${widthPercentage}%:${base64}\x07`;
|
|
56
|
+
}
|
|
57
|
+
static #parseHexColor(hex) {
|
|
58
|
+
const match = hex.match(/^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);
|
|
59
|
+
if (!match)
|
|
60
|
+
return undefined;
|
|
61
|
+
return {
|
|
62
|
+
r: Number.parseInt(match[1], 16),
|
|
63
|
+
g: Number.parseInt(match[2], 16),
|
|
64
|
+
b: Number.parseInt(match[3], 16),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async #renderAnsiBlocks(imageBuffer, widthPercentage, hexFormattedBackgroundColor) {
|
|
68
|
+
const bg = hexFormattedBackgroundColor
|
|
69
|
+
? ImageRenderer.#parseHexColor(hexFormattedBackgroundColor)
|
|
70
|
+
: undefined;
|
|
71
|
+
const columns = this.#terminal.columns();
|
|
72
|
+
const rows = this.#terminal.rows();
|
|
73
|
+
const targetWidth = Math.floor((columns * widthPercentage) / 100);
|
|
74
|
+
const meta = await new Bun.Image(imageBuffer).metadata();
|
|
75
|
+
const aspectRatio = meta.height / meta.width;
|
|
76
|
+
let targetHeight = Math.round(targetWidth * aspectRatio);
|
|
77
|
+
if (targetHeight % 2 !== 0)
|
|
78
|
+
targetHeight++;
|
|
79
|
+
const maxHeight = (rows - 2) * 2;
|
|
80
|
+
if (targetHeight > maxHeight)
|
|
81
|
+
targetHeight = maxHeight;
|
|
82
|
+
const resizedPng = await new Bun.Image(imageBuffer)
|
|
83
|
+
.resize(targetWidth, targetHeight, { fit: "inside" })
|
|
84
|
+
.png()
|
|
85
|
+
.bytes();
|
|
86
|
+
const { width, height, pixels } = decodePngToRGBA(resizedPng);
|
|
87
|
+
const lines = [];
|
|
88
|
+
for (let y = 0; y < height; y += 2) {
|
|
89
|
+
let line = "";
|
|
90
|
+
const hasBottom = y + 1 < height;
|
|
91
|
+
for (let x = 0; x < width; x++) {
|
|
92
|
+
const topIdx = (y * width + x) * 4;
|
|
93
|
+
const r = pixels[topIdx];
|
|
94
|
+
const g = pixels[topIdx + 1];
|
|
95
|
+
const b = pixels[topIdx + 2];
|
|
96
|
+
const a = pixels[topIdx + 3];
|
|
97
|
+
if (hasBottom) {
|
|
98
|
+
const botIdx = ((y + 1) * width + x) * 4;
|
|
99
|
+
const r2 = pixels[botIdx];
|
|
100
|
+
const g2 = pixels[botIdx + 1];
|
|
101
|
+
const b2 = pixels[botIdx + 2];
|
|
102
|
+
const a2 = pixels[botIdx + 3];
|
|
103
|
+
if (a === 0 && a2 === 0) {
|
|
104
|
+
if (bg) {
|
|
105
|
+
line += backgroundColorStart(bg.r, bg.g, bg.b) + " " + BACKGROUND_COLOR_END;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
line += " ";
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if (a === 0) {
|
|
112
|
+
if (bg) {
|
|
113
|
+
line +=
|
|
114
|
+
backgroundColorStart(bg.r, bg.g, bg.b) +
|
|
115
|
+
foregroundColorStart(r2, g2, b2) +
|
|
116
|
+
"▄" +
|
|
117
|
+
FOREGROUND_COLOR_END +
|
|
118
|
+
BACKGROUND_COLOR_END;
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
line += foregroundColorStart(r2, g2, b2) + "▄" + FOREGROUND_COLOR_END;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else if (a2 === 0) {
|
|
125
|
+
if (bg) {
|
|
126
|
+
line +=
|
|
127
|
+
backgroundColorStart(bg.r, bg.g, bg.b) +
|
|
128
|
+
foregroundColorStart(r, g, b) +
|
|
129
|
+
"▀" +
|
|
130
|
+
FOREGROUND_COLOR_END +
|
|
131
|
+
BACKGROUND_COLOR_END;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
line += foregroundColorStart(r, g, b) + "▀" + FOREGROUND_COLOR_END;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
line +=
|
|
139
|
+
backgroundColorStart(r, g, b) +
|
|
140
|
+
foregroundColorStart(r2, g2, b2) +
|
|
141
|
+
"▄" +
|
|
142
|
+
FOREGROUND_COLOR_END +
|
|
143
|
+
BACKGROUND_COLOR_END;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
if (a === 0) {
|
|
148
|
+
if (bg) {
|
|
149
|
+
line += backgroundColorStart(bg.r, bg.g, bg.b) + " " + BACKGROUND_COLOR_END;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
line += " ";
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
line += backgroundColorStart(r, g, b) + " " + BACKGROUND_COLOR_END;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
lines.push(line);
|
|
161
|
+
}
|
|
162
|
+
return lines.join("\n");
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export var SpecialKey;
|
|
2
|
+
(function (SpecialKey) {
|
|
3
|
+
SpecialKey[SpecialKey["UP"] = 0] = "UP";
|
|
4
|
+
SpecialKey[SpecialKey["DOWN"] = 1] = "DOWN";
|
|
5
|
+
SpecialKey[SpecialKey["LEFT"] = 2] = "LEFT";
|
|
6
|
+
SpecialKey[SpecialKey["RIGHT"] = 3] = "RIGHT";
|
|
7
|
+
SpecialKey[SpecialKey["ENTER"] = 4] = "ENTER";
|
|
8
|
+
SpecialKey[SpecialKey["SPACE"] = 5] = "SPACE";
|
|
9
|
+
SpecialKey[SpecialKey["BACKSPACE"] = 6] = "BACKSPACE";
|
|
10
|
+
SpecialKey[SpecialKey["ESCAPE"] = 7] = "ESCAPE";
|
|
11
|
+
SpecialKey[SpecialKey["TAB"] = 8] = "TAB";
|
|
12
|
+
SpecialKey[SpecialKey["INTERRUPT"] = 9] = "INTERRUPT";
|
|
13
|
+
})(SpecialKey || (SpecialKey = {}));
|