@flowscripter/dynamic-cli-framework 1.7.3 → 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 -105754
- 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.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.js +20 -0
- package/dist/src/cli/DynamicPluginRuntimeCLI.js +50 -0
- 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.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.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.js +80 -0
- package/package.json +2 -2
- package/src/api/service/core/TableGeneratorService.ts +1 -0
- package/src/cli/BaseCLI.ts +4 -18
- package/src/service/completion/CompletionServiceProvider.ts +16 -2
- 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 -73
- 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 +6 -1
- package/src/util/helpHelper.ts +1 -2
- package/dist/src/command/CompletionCommand.d.ts +0 -32
- 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/PluginCommand.test.d.ts +0 -2
- package/dist/tests/command/PluginCommand.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,115 @@
|
|
|
1
|
+
// Minimal PNG-to-RGBA pixel extractor. Supports 8-bit RGB and RGBA only.
|
|
2
|
+
import { inflateSync } from "node:zlib";
|
|
3
|
+
function paethPredictor(a, b, c) {
|
|
4
|
+
const p = a + b - c;
|
|
5
|
+
const pa = Math.abs(p - a);
|
|
6
|
+
const pb = Math.abs(p - b);
|
|
7
|
+
const pc = Math.abs(p - c);
|
|
8
|
+
if (pa <= pb && pa <= pc)
|
|
9
|
+
return a;
|
|
10
|
+
if (pb <= pc)
|
|
11
|
+
return b;
|
|
12
|
+
return c;
|
|
13
|
+
}
|
|
14
|
+
export function decodePngToRGBA(pngBytes) {
|
|
15
|
+
const sig = [137, 80, 78, 71, 13, 10, 26, 10];
|
|
16
|
+
for (let i = 0; i < 8; i++) {
|
|
17
|
+
if (pngBytes[i] !== sig[i])
|
|
18
|
+
throw new Error("Invalid PNG signature");
|
|
19
|
+
}
|
|
20
|
+
const view = new DataView(pngBytes.buffer, pngBytes.byteOffset, pngBytes.byteLength);
|
|
21
|
+
let offset = 8;
|
|
22
|
+
let width = 0;
|
|
23
|
+
let height = 0;
|
|
24
|
+
let bitDepth = 0;
|
|
25
|
+
let colorType = 0;
|
|
26
|
+
const idatChunks = [];
|
|
27
|
+
while (offset < pngBytes.length) {
|
|
28
|
+
const length = view.getUint32(offset);
|
|
29
|
+
const type = String.fromCharCode(pngBytes[offset + 4], pngBytes[offset + 5], pngBytes[offset + 6], pngBytes[offset + 7]);
|
|
30
|
+
const dataStart = offset + 8;
|
|
31
|
+
if (type === "IHDR") {
|
|
32
|
+
width = view.getUint32(dataStart);
|
|
33
|
+
height = view.getUint32(dataStart + 4);
|
|
34
|
+
bitDepth = pngBytes[dataStart + 8];
|
|
35
|
+
colorType = pngBytes[dataStart + 9];
|
|
36
|
+
const interlace = pngBytes[dataStart + 12];
|
|
37
|
+
if (bitDepth !== 8) {
|
|
38
|
+
throw new Error(`Unsupported bit depth: ${bitDepth} (only 8 supported)`);
|
|
39
|
+
}
|
|
40
|
+
if (colorType !== 2 && colorType !== 6) {
|
|
41
|
+
throw new Error(`Unsupported color type: ${colorType} (only RGB=2 and RGBA=6 supported)`);
|
|
42
|
+
}
|
|
43
|
+
if (interlace !== 0) {
|
|
44
|
+
throw new Error("Interlaced PNGs are not supported");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else if (type === "IDAT") {
|
|
48
|
+
idatChunks.push(pngBytes.subarray(dataStart, dataStart + length));
|
|
49
|
+
}
|
|
50
|
+
else if (type === "IEND") {
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
offset = dataStart + length + 4; // +4 for CRC
|
|
54
|
+
}
|
|
55
|
+
if (width === 0 || height === 0)
|
|
56
|
+
throw new Error("Missing IHDR chunk");
|
|
57
|
+
if (idatChunks.length === 0)
|
|
58
|
+
throw new Error("Missing IDAT chunks");
|
|
59
|
+
const bpp = colorType === 6 ? 4 : 3;
|
|
60
|
+
const compressed = new Uint8Array(idatChunks.reduce((sum, c) => sum + c.length, 0));
|
|
61
|
+
let pos = 0;
|
|
62
|
+
for (const chunk of idatChunks) {
|
|
63
|
+
compressed.set(chunk, pos);
|
|
64
|
+
pos += chunk.length;
|
|
65
|
+
}
|
|
66
|
+
const raw = inflateSync(compressed);
|
|
67
|
+
const stride = bpp * width;
|
|
68
|
+
const pixels = new Uint8Array(width * height * 4);
|
|
69
|
+
const prevRow = new Uint8Array(stride);
|
|
70
|
+
const currRow = new Uint8Array(stride);
|
|
71
|
+
let rawOffset = 0;
|
|
72
|
+
for (let y = 0; y < height; y++) {
|
|
73
|
+
const filterType = raw[rawOffset++];
|
|
74
|
+
for (let x = 0; x < stride; x++) {
|
|
75
|
+
currRow[x] = raw[rawOffset++];
|
|
76
|
+
}
|
|
77
|
+
for (let x = 0; x < stride; x++) {
|
|
78
|
+
const left = x >= bpp ? currRow[x - bpp] : 0;
|
|
79
|
+
const up = prevRow[x];
|
|
80
|
+
const upperLeft = x >= bpp ? prevRow[x - bpp] : 0;
|
|
81
|
+
switch (filterType) {
|
|
82
|
+
case 0:
|
|
83
|
+
break;
|
|
84
|
+
case 1:
|
|
85
|
+
currRow[x] = (currRow[x] + left) & 0xff;
|
|
86
|
+
break;
|
|
87
|
+
case 2:
|
|
88
|
+
currRow[x] = (currRow[x] + up) & 0xff;
|
|
89
|
+
break;
|
|
90
|
+
case 3:
|
|
91
|
+
currRow[x] = (currRow[x] + ((left + up) >> 1)) & 0xff;
|
|
92
|
+
break;
|
|
93
|
+
case 4:
|
|
94
|
+
currRow[x] = (currRow[x] + paethPredictor(left, up, upperLeft)) & 0xff;
|
|
95
|
+
break;
|
|
96
|
+
default:
|
|
97
|
+
throw new Error(`Unknown filter type: ${filterType}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const rowStart = y * width * 4;
|
|
101
|
+
if (bpp === 4) {
|
|
102
|
+
pixels.set(currRow, rowStart);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
for (let x = 0; x < width; x++) {
|
|
106
|
+
pixels[rowStart + x * 4] = currRow[x * 3];
|
|
107
|
+
pixels[rowStart + x * 4 + 1] = currRow[x * 3 + 1];
|
|
108
|
+
pixels[rowStart + x * 4 + 2] = currRow[x * 3 + 2];
|
|
109
|
+
pixels[rowStart + x * 4 + 3] = 255;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
prevRow.set(currRow);
|
|
113
|
+
}
|
|
114
|
+
return { width, height, pixels };
|
|
115
|
+
}
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { ReadStream } from "node:tty";
|
|
2
|
+
import { Buffer } from "node:buffer";
|
|
3
|
+
import { SpecialKey } from "./KeyReader.js";
|
|
4
|
+
export default class TtyKeyReader {
|
|
5
|
+
#ttyReadStream;
|
|
6
|
+
constructor(ttyReadStream) {
|
|
7
|
+
if (ttyReadStream.isTTY === false) {
|
|
8
|
+
throw new Error("The provided ReadStream is not a TTY");
|
|
9
|
+
}
|
|
10
|
+
this.#ttyReadStream = ttyReadStream;
|
|
11
|
+
}
|
|
12
|
+
enableRawMode() {
|
|
13
|
+
this.#ttyReadStream.setRawMode(true);
|
|
14
|
+
this.#ttyReadStream.resume();
|
|
15
|
+
}
|
|
16
|
+
disableRawMode() {
|
|
17
|
+
this.#ttyReadStream.setRawMode(false);
|
|
18
|
+
this.#ttyReadStream.pause();
|
|
19
|
+
}
|
|
20
|
+
readKey() {
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
const onData = (data) => {
|
|
23
|
+
this.#ttyReadStream.removeListener("data", onData);
|
|
24
|
+
// A lone 0x1b may be the start of a multi-byte escape sequence (e.g. arrow keys).
|
|
25
|
+
// Wait briefly for the rest of the sequence before decoding.
|
|
26
|
+
if (data.length === 1 && data[0] === 0x1b) {
|
|
27
|
+
const timeout = setTimeout(() => {
|
|
28
|
+
this.#ttyReadStream.removeListener("data", onMore);
|
|
29
|
+
resolve(TtyKeyReader.#decodeKeyEvent(data));
|
|
30
|
+
}, 20);
|
|
31
|
+
const onMore = (more) => {
|
|
32
|
+
clearTimeout(timeout);
|
|
33
|
+
this.#ttyReadStream.removeListener("data", onMore);
|
|
34
|
+
resolve(TtyKeyReader.#decodeKeyEvent(Buffer.concat([data, more])));
|
|
35
|
+
};
|
|
36
|
+
this.#ttyReadStream.once("data", onMore);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
resolve(TtyKeyReader.#decodeKeyEvent(data));
|
|
40
|
+
};
|
|
41
|
+
this.#ttyReadStream.on("data", onData);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
static #decodeKeyEvent(data) {
|
|
45
|
+
if (data.length === 0) {
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
// escape sequences
|
|
49
|
+
if (data[0] === 0x1b) {
|
|
50
|
+
if (data.length === 1) {
|
|
51
|
+
return { specialKey: SpecialKey.ESCAPE };
|
|
52
|
+
}
|
|
53
|
+
if (data.length >= 3 && data[1] === 0x5b) {
|
|
54
|
+
switch (data[2]) {
|
|
55
|
+
case 0x41:
|
|
56
|
+
return { specialKey: SpecialKey.UP };
|
|
57
|
+
case 0x42:
|
|
58
|
+
return { specialKey: SpecialKey.DOWN };
|
|
59
|
+
case 0x43:
|
|
60
|
+
return { specialKey: SpecialKey.RIGHT };
|
|
61
|
+
case 0x44:
|
|
62
|
+
return { specialKey: SpecialKey.LEFT };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return { specialKey: SpecialKey.ESCAPE };
|
|
66
|
+
}
|
|
67
|
+
// control characters
|
|
68
|
+
switch (data[0]) {
|
|
69
|
+
case 0x0d:
|
|
70
|
+
return { specialKey: SpecialKey.ENTER };
|
|
71
|
+
case 0x20:
|
|
72
|
+
return { specialKey: SpecialKey.SPACE };
|
|
73
|
+
case 0x7f:
|
|
74
|
+
return { specialKey: SpecialKey.BACKSPACE };
|
|
75
|
+
case 0x09:
|
|
76
|
+
return { specialKey: SpecialKey.TAB };
|
|
77
|
+
case 0x03:
|
|
78
|
+
return { specialKey: SpecialKey.INTERRUPT };
|
|
79
|
+
}
|
|
80
|
+
// printable characters
|
|
81
|
+
const str = data.toString("utf8");
|
|
82
|
+
if (str.length > 0) {
|
|
83
|
+
return { key: str };
|
|
84
|
+
}
|
|
85
|
+
return {};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { BACKGROUND_COLOR_END, FOREGROUND_COLOR_END, HYPERLINK_END, hyperlinkStart, ITALIC_END, ITALIC_START, } from "./Ansi.js";
|
|
2
|
+
export default class TtyStyler {
|
|
3
|
+
colorEnabled = true;
|
|
4
|
+
hyperlinksEnabled;
|
|
5
|
+
colorLevel;
|
|
6
|
+
/**
|
|
7
|
+
* The color level in use.
|
|
8
|
+
*
|
|
9
|
+
* 1 = 16 color
|
|
10
|
+
* 2 = 256 color
|
|
11
|
+
* 3 = 16 million color
|
|
12
|
+
*/
|
|
13
|
+
constructor(colorLevel = 1, hyperlinksEnabled = true) {
|
|
14
|
+
this.colorLevel = colorLevel;
|
|
15
|
+
this.hyperlinksEnabled = hyperlinksEnabled;
|
|
16
|
+
}
|
|
17
|
+
colorText(text, colorValue) {
|
|
18
|
+
if (!this.colorEnabled) {
|
|
19
|
+
return text;
|
|
20
|
+
}
|
|
21
|
+
if (this.colorLevel === 3) {
|
|
22
|
+
return Bun.color(colorValue, "ansi-16m") + text + FOREGROUND_COLOR_END;
|
|
23
|
+
}
|
|
24
|
+
if (this.colorLevel === 2) {
|
|
25
|
+
return Bun.color(colorValue, "ansi-256") + text + FOREGROUND_COLOR_END;
|
|
26
|
+
}
|
|
27
|
+
return Bun.color(colorValue, "ansi-16") + text + FOREGROUND_COLOR_END;
|
|
28
|
+
}
|
|
29
|
+
backgroundColorText(text, colorValue) {
|
|
30
|
+
if (!this.colorEnabled) {
|
|
31
|
+
return text;
|
|
32
|
+
}
|
|
33
|
+
if (this.colorLevel === 3) {
|
|
34
|
+
const r = (colorValue >> 16) & 0xff;
|
|
35
|
+
const g = (colorValue >> 8) & 0xff;
|
|
36
|
+
const b = colorValue & 0xff;
|
|
37
|
+
return `\x1b[48;2;${r};${g};${b}m${text}${BACKGROUND_COLOR_END}`;
|
|
38
|
+
}
|
|
39
|
+
if (this.colorLevel === 2) {
|
|
40
|
+
return (Bun.color(colorValue, "ansi-256").replace("[38;", "[48;") + text + BACKGROUND_COLOR_END);
|
|
41
|
+
}
|
|
42
|
+
return (Bun.color(colorValue, "ansi-16").replace(/\[(\d+)m/, (_, n) => `[${Number(n) + 10}m`) +
|
|
43
|
+
text +
|
|
44
|
+
BACKGROUND_COLOR_END);
|
|
45
|
+
}
|
|
46
|
+
italicText(text) {
|
|
47
|
+
return ITALIC_START + text + ITALIC_END;
|
|
48
|
+
}
|
|
49
|
+
hyperlink(text, url) {
|
|
50
|
+
if (!this.hyperlinksEnabled) {
|
|
51
|
+
return `${text}: ${url}`;
|
|
52
|
+
}
|
|
53
|
+
return hyperlinkStart(url) + text + HYPERLINK_END;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { WriteStream } from "node:tty";
|
|
2
|
+
import { CLEAR_LINE, CURSOR_LEFT, CURSOR_UP, HIDE_CURSOR, SHOW_CURSOR } from "./Ansi.js";
|
|
3
|
+
export default class TtyTerminal {
|
|
4
|
+
#ttyWriteStream;
|
|
5
|
+
#encoder = new TextEncoder();
|
|
6
|
+
constructor(ttyWriteStream) {
|
|
7
|
+
if (ttyWriteStream.isTTY === false) {
|
|
8
|
+
throw new Error("The provided WriteStream is not a TTY");
|
|
9
|
+
}
|
|
10
|
+
this.#ttyWriteStream = ttyWriteStream;
|
|
11
|
+
}
|
|
12
|
+
#writeAll(message) {
|
|
13
|
+
const encoded = this.#encoder.encode(message);
|
|
14
|
+
this.#ttyWriteStream.write(encoded);
|
|
15
|
+
}
|
|
16
|
+
clearLine() {
|
|
17
|
+
this.#writeAll(CLEAR_LINE + CURSOR_LEFT);
|
|
18
|
+
return Promise.resolve();
|
|
19
|
+
}
|
|
20
|
+
clearUpLines(count) {
|
|
21
|
+
this.#writeAll((CURSOR_UP + CLEAR_LINE).repeat(count) + CLEAR_LINE + CURSOR_LEFT);
|
|
22
|
+
return Promise.resolve();
|
|
23
|
+
}
|
|
24
|
+
hideCursor() {
|
|
25
|
+
this.#writeAll(HIDE_CURSOR);
|
|
26
|
+
return Promise.resolve();
|
|
27
|
+
}
|
|
28
|
+
showCursor() {
|
|
29
|
+
this.#writeAll(SHOW_CURSOR);
|
|
30
|
+
return Promise.resolve();
|
|
31
|
+
}
|
|
32
|
+
write(text) {
|
|
33
|
+
this.#writeAll(text);
|
|
34
|
+
return Promise.resolve();
|
|
35
|
+
}
|
|
36
|
+
columns() {
|
|
37
|
+
try {
|
|
38
|
+
return this.#ttyWriteStream.columns || 80;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return 80;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
rows() {
|
|
45
|
+
try {
|
|
46
|
+
return this.#ttyWriteStream.rows || 24;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return 24;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
function parseVersion(versionString = "") {
|
|
3
|
+
if (/^\d{3,4}$/.test(versionString)) {
|
|
4
|
+
const match = /(\d{1,2})(\d{2})/.exec(versionString) ?? [];
|
|
5
|
+
return {
|
|
6
|
+
major: 0,
|
|
7
|
+
minor: Number.parseInt(match[1] ?? "0", 10),
|
|
8
|
+
patch: Number.parseInt(match[2] ?? "0", 10),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
const versions = (versionString ?? "").split(".").map((n) => Number.parseInt(n, 10));
|
|
12
|
+
return {
|
|
13
|
+
major: versions[0] ?? 0,
|
|
14
|
+
minor: versions[1] ?? 0,
|
|
15
|
+
patch: versions[2] ?? 0,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export default function supportsHyperlinks(stream) {
|
|
19
|
+
const { CI, CURSOR_TRACE_ID, FORCE_HYPERLINK, LC_TERMINAL, LC_TERMINAL_VERSION, TEAMCITY_VERSION, TERM_PROGRAM, TERM_PROGRAM_VERSION, VTE_VERSION, TERM, } = process.env;
|
|
20
|
+
if (FORCE_HYPERLINK) {
|
|
21
|
+
return !(FORCE_HYPERLINK.length > 0 && Number.parseInt(FORCE_HYPERLINK, 10) === 0);
|
|
22
|
+
}
|
|
23
|
+
if (stream && !stream.isTTY) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
if ("WT_SESSION" in process.env) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
if (CI) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
if (TEAMCITY_VERSION) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
if (TERM_PROGRAM) {
|
|
36
|
+
const version = parseVersion(TERM_PROGRAM_VERSION);
|
|
37
|
+
switch (TERM_PROGRAM) {
|
|
38
|
+
case "iTerm.app": {
|
|
39
|
+
if (version.major === 3) {
|
|
40
|
+
return version.minor >= 1;
|
|
41
|
+
}
|
|
42
|
+
return version.major > 3;
|
|
43
|
+
}
|
|
44
|
+
case "WezTerm": {
|
|
45
|
+
if (/^0-unstable-\d{4}-\d{2}-\d{2}$/.test(TERM_PROGRAM_VERSION)) {
|
|
46
|
+
const date = TERM_PROGRAM_VERSION.slice("0-unstable-".length);
|
|
47
|
+
return date >= "2020-06-20";
|
|
48
|
+
}
|
|
49
|
+
return version.major >= 20200620;
|
|
50
|
+
}
|
|
51
|
+
case "vscode": {
|
|
52
|
+
if (CURSOR_TRACE_ID) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
return version.major > 1 || (version.major === 1 && version.minor >= 72);
|
|
56
|
+
}
|
|
57
|
+
case "ghostty":
|
|
58
|
+
return true;
|
|
59
|
+
case "zed":
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (LC_TERMINAL) {
|
|
64
|
+
const version = parseVersion(LC_TERMINAL_VERSION);
|
|
65
|
+
switch (LC_TERMINAL) {
|
|
66
|
+
case "iTerm2": {
|
|
67
|
+
if (version.major === 3) {
|
|
68
|
+
return version.minor >= 1;
|
|
69
|
+
}
|
|
70
|
+
return version.major > 3;
|
|
71
|
+
}
|
|
72
|
+
case "WezTerm": {
|
|
73
|
+
if (/^0-unstable-\d{4}-\d{2}-\d{2}$/.test(LC_TERMINAL_VERSION)) {
|
|
74
|
+
const date = LC_TERMINAL_VERSION.slice("0-unstable-".length);
|
|
75
|
+
return date >= "2020-06-20";
|
|
76
|
+
}
|
|
77
|
+
return version.major >= 20200620;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (VTE_VERSION) {
|
|
82
|
+
if (VTE_VERSION === "0.50.0") {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
const version = parseVersion(VTE_VERSION);
|
|
86
|
+
return version.major > 0 || version.minor >= 50;
|
|
87
|
+
}
|
|
88
|
+
switch (TERM) {
|
|
89
|
+
case "alacritty":
|
|
90
|
+
return true;
|
|
91
|
+
case "xterm-kitty":
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
function getKeySegment(segment, isCustom = false, isArray = false) {
|
|
2
|
+
let keySegment = segment;
|
|
3
|
+
if (!isCustom) {
|
|
4
|
+
keySegment = keySegment.replace("-", "_").toUpperCase();
|
|
5
|
+
if (keySegment[0].match(/[0-9]/)) {
|
|
6
|
+
keySegment = `_${keySegment}`;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
if (isArray) {
|
|
10
|
+
return `${keySegment}[_<index>]`;
|
|
11
|
+
}
|
|
12
|
+
return keySegment;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Determine the configuration key for the specified {@link SubCommandArgument}.
|
|
16
|
+
*
|
|
17
|
+
* @param cliConfig the {@link CLIConfig} to use for determining the default configuration key.
|
|
18
|
+
* @param command the {@link Command} to use for determining the default configuration key.
|
|
19
|
+
* @param argumentAncestry a list of {@link SubCommandArgument} instances from the root command arguments to a leaf argument.
|
|
20
|
+
* Apart from {@link ComplexOption} instances this will always only have a single entry.
|
|
21
|
+
*/
|
|
22
|
+
export function getSubCommandArgumentConfigurationKey(cliConfig, command, argumentAncestry) {
|
|
23
|
+
if (command.enableConfiguration === undefined || command.enableConfiguration !== true) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
if (argumentAncestry.length === 0) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
const keySegments = [];
|
|
30
|
+
const firstArgument = argumentAncestry[0];
|
|
31
|
+
if (firstArgument.configurationKey === undefined) {
|
|
32
|
+
keySegments.push(getKeySegment(cliConfig.name));
|
|
33
|
+
keySegments.push(getKeySegment(command.name));
|
|
34
|
+
}
|
|
35
|
+
argumentAncestry.forEach((argument) => {
|
|
36
|
+
const isArray = argument.isArray || argument.isVarargMultiple;
|
|
37
|
+
keySegments.push(getKeySegment(argument.configurationKey || argument.name, argument.configurationKey !== undefined, isArray));
|
|
38
|
+
});
|
|
39
|
+
return keySegments.join("_");
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Determine the configuration key for the specified {@link GlobalCommandArgument}.
|
|
43
|
+
*
|
|
44
|
+
* @param cliConfig the {@link CLIConfig} to use for determining the default configuration key.
|
|
45
|
+
* @param command the {@link Command} to use for determining the default configuration key.
|
|
46
|
+
* @param globalCommandArgument the {@link GlobalCommandArgument}.
|
|
47
|
+
*/
|
|
48
|
+
export function getGlobalCommandArgumentConfigurationKey(cliConfig, command, globalCommandArgument) {
|
|
49
|
+
if (command.enableConfiguration === undefined || command.enableConfiguration !== true) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
const keySegments = [];
|
|
53
|
+
if (globalCommandArgument.configurationKey === undefined) {
|
|
54
|
+
keySegments.push(getKeySegment(cliConfig.name));
|
|
55
|
+
keySegments.push(getKeySegment(command.name));
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
keySegments.push(getKeySegment(globalCommandArgument.configurationKey));
|
|
59
|
+
}
|
|
60
|
+
return keySegments.join("_");
|
|
61
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import { ArgumentValueTypeName, ComplexValueTypeName, } from "../api/argument/ArgumentValueTypes.js";
|
|
3
|
+
import { MAXIMUM_ARGUMENT_ARRAY_SIZE } from "../api/argument/SubCommandArgument.js";
|
|
4
|
+
function getKeySegment(segment) {
|
|
5
|
+
let keySegment = segment.replace("-", "_").toUpperCase();
|
|
6
|
+
if (keySegment[0].match(/[0-9]/)) {
|
|
7
|
+
keySegment = `_${keySegment}`;
|
|
8
|
+
}
|
|
9
|
+
return keySegment;
|
|
10
|
+
}
|
|
11
|
+
function getSubCommandArgumentKeyPrefix(cliConfig, command, subCommandArgument) {
|
|
12
|
+
if (subCommandArgument.configurationKey) {
|
|
13
|
+
return subCommandArgument.configurationKey;
|
|
14
|
+
}
|
|
15
|
+
return `${getKeySegment(cliConfig.name)}_${getKeySegment(command.name)}_${getKeySegment(subCommandArgument.name)}`;
|
|
16
|
+
}
|
|
17
|
+
function getGlobalArgumentKeyPrefix(cliConfig, command, globalCommandArgument) {
|
|
18
|
+
if (globalCommandArgument.configurationKey) {
|
|
19
|
+
return globalCommandArgument.configurationKey;
|
|
20
|
+
}
|
|
21
|
+
return `${getKeySegment(cliConfig.name)}_${getKeySegment(command.name)}`;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get configured argument value for the specified {@link GlobalCommandArgument} from environment variables.
|
|
25
|
+
*
|
|
26
|
+
* @param cliConfig the {@link CLIConfig} to use for determining the default configuration key.
|
|
27
|
+
* @param command the {@link GlobalCommand} to use for determining the default configuration key and containing a
|
|
28
|
+
* {@link GlobalCommandArgument} instance to populate a value for.
|
|
29
|
+
*/
|
|
30
|
+
export function getGlobalCommandValueFromEnvVars(cliConfig, command) {
|
|
31
|
+
const { argument } = command;
|
|
32
|
+
if (argument === undefined) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
// simple check for a specific env var name
|
|
36
|
+
let envVarValue = process.env[getGlobalArgumentKeyPrefix(cliConfig, command, argument)];
|
|
37
|
+
if (envVarValue != undefined && argument.type === ArgumentValueTypeName.BOOLEAN) {
|
|
38
|
+
envVarValue = envVarValue.length > 0 ? "true" : "false";
|
|
39
|
+
}
|
|
40
|
+
return envVarValue;
|
|
41
|
+
}
|
|
42
|
+
function getOptionValuesFromEnvVars(envVarValues, potentialEnvVarNames, env, option, envVarNamePrefix) {
|
|
43
|
+
if (potentialEnvVarNames.length === 0) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (option.name === "__proto__" || option.name === "constructor" || option.name === "prototype") {
|
|
47
|
+
throw new Error(`Unsafe key name in use: ${option.name}, CodeQL Rule ID: js/prototype-polluting-assignment`);
|
|
48
|
+
}
|
|
49
|
+
if (option.isArray) {
|
|
50
|
+
envVarNamePrefix = `${envVarNamePrefix}_`;
|
|
51
|
+
const matches = potentialEnvVarNames.filter((envVarName) => envVarName.startsWith(envVarNamePrefix));
|
|
52
|
+
matches.forEach((match) => {
|
|
53
|
+
const path = match.substring(envVarNamePrefix.length);
|
|
54
|
+
// either '1' or '1_property...' or 'something_invalid'....
|
|
55
|
+
let indexString = path;
|
|
56
|
+
let suffix = "";
|
|
57
|
+
const indexOf = path.indexOf("_");
|
|
58
|
+
if (indexOf > -1) {
|
|
59
|
+
indexString = path.substring(0, indexOf);
|
|
60
|
+
if (indexOf + 1 < path.length) {
|
|
61
|
+
suffix = path.substring(indexOf + 1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
let index;
|
|
65
|
+
try {
|
|
66
|
+
index = parseInt(indexString);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
throw new Error(`Unable to parse array index from env var: ${match}`);
|
|
70
|
+
}
|
|
71
|
+
if (index !== undefined) {
|
|
72
|
+
if (index > MAXIMUM_ARGUMENT_ARRAY_SIZE) {
|
|
73
|
+
throw new Error(`Maximum array size exceeded: ${index} in env var: ${match}`);
|
|
74
|
+
}
|
|
75
|
+
if (envVarValues[option.name] === undefined) {
|
|
76
|
+
envVarValues[option.name] = [];
|
|
77
|
+
}
|
|
78
|
+
if (suffix.length > 0) {
|
|
79
|
+
if (option.type === ComplexValueTypeName.COMPLEX) {
|
|
80
|
+
if (envVarValues[option.name][index] ===
|
|
81
|
+
undefined) {
|
|
82
|
+
envVarValues[option.name][index] = Object.create(null);
|
|
83
|
+
}
|
|
84
|
+
option.properties.forEach((property) => {
|
|
85
|
+
const propertySegment = property.configurationKey || getKeySegment(property.name);
|
|
86
|
+
getOptionValuesFromEnvVars(envVarValues[option.name][index], matches, env, property, `${envVarNamePrefix}${index}_${propertySegment}`);
|
|
87
|
+
});
|
|
88
|
+
if (Object.keys(envVarValues[option.name][index]).length === 0) {
|
|
89
|
+
delete envVarValues[option.name][index];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
throw new Error(`Unidentified suffix ${suffix} in env var: ${match}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else if (option.type === ComplexValueTypeName.COMPLEX) {
|
|
97
|
+
throw new Error(`Incomplete argument path in env var: ${match}`);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// set primitive value
|
|
101
|
+
let envVarValue = env[match];
|
|
102
|
+
if (envVarValue != undefined && option.type === ArgumentValueTypeName.BOOLEAN) {
|
|
103
|
+
envVarValue = envVarValue.length > 1 ? "true" : "false";
|
|
104
|
+
}
|
|
105
|
+
envVarValues[option.name][index] =
|
|
106
|
+
envVarValue;
|
|
107
|
+
}
|
|
108
|
+
const elements = envVarValues[option.name];
|
|
109
|
+
for (let i = elements.length - 1; i > -1; i--) {
|
|
110
|
+
if (elements[i] === undefined) {
|
|
111
|
+
elements.length = i;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (elements.length === 0) {
|
|
115
|
+
delete envVarValues[option.name];
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
else if (option.type === ComplexValueTypeName.COMPLEX) {
|
|
121
|
+
option.properties.forEach((property) => {
|
|
122
|
+
if (envVarValues[option.name] === undefined) {
|
|
123
|
+
envVarValues[option.name] = Object.create(null);
|
|
124
|
+
}
|
|
125
|
+
const propertySegment = property.configurationKey || getKeySegment(property.name);
|
|
126
|
+
getOptionValuesFromEnvVars(envVarValues[option.name], potentialEnvVarNames, env, property, `${envVarNamePrefix}_${propertySegment}`);
|
|
127
|
+
if (Object.keys(envVarValues[option.name]).length === 0) {
|
|
128
|
+
delete envVarValues[option.name];
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// simple check for a specific env var name
|
|
134
|
+
let value = process.env[envVarNamePrefix];
|
|
135
|
+
if (value === undefined) {
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
if (option.type === ArgumentValueTypeName.BOOLEAN) {
|
|
139
|
+
value = value.length > 1 ? "true" : "false";
|
|
140
|
+
}
|
|
141
|
+
// set primitive value
|
|
142
|
+
envVarValues[option.name] = value;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get configured argument values for the specified {@link Option} from environment variables.
|
|
147
|
+
*
|
|
148
|
+
* @param cliConfig the {@link CLIConfig} to use for determining the default configuration key.
|
|
149
|
+
* @param command the {@link SubCommand} to use for determining the default configuration key and containing
|
|
150
|
+
* {@link Positional} and {@link Option} instances to populate values for.
|
|
151
|
+
*/
|
|
152
|
+
export function getSubCommandValuesFromEnvVars(cliConfig, command) {
|
|
153
|
+
const envVarValues = Object.create(null);
|
|
154
|
+
if (command.options) {
|
|
155
|
+
for (const option of command.options) {
|
|
156
|
+
const potentialEnvVarNames = Object.keys(process.env);
|
|
157
|
+
const optionPrefix = getSubCommandArgumentKeyPrefix(cliConfig, command, option);
|
|
158
|
+
getOptionValuesFromEnvVars(envVarValues, potentialEnvVarNames, process.env ?? {}, option, optionPrefix);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (command.positionals) {
|
|
162
|
+
for (const positional of command.positionals) {
|
|
163
|
+
if (positional.name === "__proto__" ||
|
|
164
|
+
positional.name === "constructor" ||
|
|
165
|
+
positional.name === "prototype") {
|
|
166
|
+
throw new Error(`Unsafe key name in use: ${positional.name}, CodeQL Rule ID: js/prototype-polluting-assignment`);
|
|
167
|
+
}
|
|
168
|
+
let envVarNamePrefix = getSubCommandArgumentKeyPrefix(cliConfig, command, positional);
|
|
169
|
+
if (positional.isVarargMultiple) {
|
|
170
|
+
envVarNamePrefix = `${envVarNamePrefix}_`;
|
|
171
|
+
const matches = Object.keys(process.env).filter((envVarName) => envVarName.startsWith(envVarNamePrefix));
|
|
172
|
+
matches.forEach((match) => {
|
|
173
|
+
let index;
|
|
174
|
+
try {
|
|
175
|
+
index = parseInt(match.substring(envVarNamePrefix.length));
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
throw new Error(`Unable to parse array index from env var: ${match}`);
|
|
179
|
+
}
|
|
180
|
+
if (index !== undefined) {
|
|
181
|
+
if (index > MAXIMUM_ARGUMENT_ARRAY_SIZE) {
|
|
182
|
+
throw new Error(`Maximum array size exceeded: ${index} in env var: ${match}`);
|
|
183
|
+
}
|
|
184
|
+
if (envVarValues[positional.name] === undefined) {
|
|
185
|
+
envVarValues[positional.name] = [];
|
|
186
|
+
}
|
|
187
|
+
// set primitive value
|
|
188
|
+
let envVarValue = process.env[match];
|
|
189
|
+
if (envVarValue != undefined && positional.type === ArgumentValueTypeName.BOOLEAN) {
|
|
190
|
+
envVarValue = envVarValue.length > 1 ? "true" : "false";
|
|
191
|
+
}
|
|
192
|
+
envVarValues[positional.name][index] =
|
|
193
|
+
envVarValue;
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
// simple check for a specific env var name
|
|
199
|
+
let value = process.env[envVarNamePrefix];
|
|
200
|
+
if (value === undefined) {
|
|
201
|
+
return undefined;
|
|
202
|
+
}
|
|
203
|
+
if (positional.type === ArgumentValueTypeName.BOOLEAN) {
|
|
204
|
+
value = value.length > 1 ? "true" : "false";
|
|
205
|
+
}
|
|
206
|
+
// set primitive value
|
|
207
|
+
envVarValues[positional.name] = value;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Check if anything was actually populated
|
|
212
|
+
if (Object.keys(envVarValues).length === 0) {
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
215
|
+
return envVarValues;
|
|
216
|
+
}
|