@flowscripter/dynamic-cli-framework 1.7.3 → 1.7.5
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 +232 -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 +159 -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.d.ts.map +1 -1
- package/dist/src/terminal/ImageRenderer.js +166 -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 -19
- package/src/service/completion/CompletionServiceProvider.ts +16 -3
- 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/terminal/ImageRenderer.ts +7 -5
- 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,244 @@
|
|
|
1
|
+
import getLogger from "../util/logger.js";
|
|
2
|
+
import { isGroupCommand } from "./command/CommandTypeGuards.js";
|
|
3
|
+
const logger = getLogger("scanner");
|
|
4
|
+
function normaliseFirstArgumentIfRequired(args, globalCommandsByName, globalCommandsByShortAlias) {
|
|
5
|
+
const firstArg = args[0];
|
|
6
|
+
// only looking for:
|
|
7
|
+
// --<global_[modifier_]command_name>
|
|
8
|
+
// --<global_[modifier_]command_name>=<value>
|
|
9
|
+
// -<global_[modifier_]command_short_alias>
|
|
10
|
+
// -<global_[modifier_]command_short_alias>=<value>
|
|
11
|
+
if (firstArg.length < 2 || firstArg.charAt(0) !== "-") {
|
|
12
|
+
return args;
|
|
13
|
+
}
|
|
14
|
+
// looking for:
|
|
15
|
+
// --<global_[modifier_]command_name>
|
|
16
|
+
// --<global_[modifier_]command_name>=<value>
|
|
17
|
+
if (firstArg.length > 2 && firstArg.charAt(1) === "-") {
|
|
18
|
+
let potentialGlobalCommandName = firstArg.slice(2);
|
|
19
|
+
// looking for:
|
|
20
|
+
// <global_command_name>=<value>
|
|
21
|
+
// <global_modifier_command_name>=<value>
|
|
22
|
+
let nextArg;
|
|
23
|
+
if (potentialGlobalCommandName.includes("=")) {
|
|
24
|
+
[potentialGlobalCommandName, nextArg] = potentialGlobalCommandName.split(/=(.*)/);
|
|
25
|
+
}
|
|
26
|
+
if (!globalCommandsByName.has(potentialGlobalCommandName)) {
|
|
27
|
+
// nothing changed
|
|
28
|
+
return args;
|
|
29
|
+
}
|
|
30
|
+
if (!nextArg) {
|
|
31
|
+
// nothing changed
|
|
32
|
+
return args;
|
|
33
|
+
}
|
|
34
|
+
logger.debug(() => `Normalised arg: '${firstArg}' to: '--${potentialGlobalCommandName} ${nextArg}'`);
|
|
35
|
+
return [`--${potentialGlobalCommandName}`, nextArg, ...args.slice(1)];
|
|
36
|
+
}
|
|
37
|
+
// looking for:
|
|
38
|
+
// -<global_[modifier_]command_short_alias>
|
|
39
|
+
// -<global_[modifier_]command_short_alias>=<value>
|
|
40
|
+
// (by now we know the arg starts with -<char>)
|
|
41
|
+
let potentialGlobalCommandShortAlias = firstArg.slice(1);
|
|
42
|
+
// looking for:
|
|
43
|
+
// <global_[modifier_]command_short_alias>=<value>
|
|
44
|
+
let nextArg;
|
|
45
|
+
if (potentialGlobalCommandShortAlias.includes("=")) {
|
|
46
|
+
[potentialGlobalCommandShortAlias, nextArg] = potentialGlobalCommandShortAlias.split(/=(.*)/);
|
|
47
|
+
}
|
|
48
|
+
if (!globalCommandsByShortAlias) {
|
|
49
|
+
// nothing changed
|
|
50
|
+
return args;
|
|
51
|
+
}
|
|
52
|
+
// looking for <global_[modifier_]command_short_alias>
|
|
53
|
+
const globalCommand = globalCommandsByShortAlias.get(potentialGlobalCommandShortAlias);
|
|
54
|
+
if (!globalCommand) {
|
|
55
|
+
// nothing changed
|
|
56
|
+
return args;
|
|
57
|
+
}
|
|
58
|
+
if (nextArg) {
|
|
59
|
+
logger.debug(() => `Normalised arg: '${firstArg}' to: '--${globalCommand.name} ${nextArg}'`);
|
|
60
|
+
return [`--${globalCommand.name}`, nextArg, ...args.slice(1)];
|
|
61
|
+
}
|
|
62
|
+
logger.debug(() => `Normalised arg: '${firstArg}' to: '--${globalCommand.name}'`);
|
|
63
|
+
return [`--${globalCommand.name}`, ...args.slice(1)];
|
|
64
|
+
}
|
|
65
|
+
function scanForNextCommandClause(potentialArgs, includeSubCommands, commandsByName, globalCommandsByShortAlias, groupAndMemberCommandsByJoinedName) {
|
|
66
|
+
let pendingArgs = [...potentialArgs];
|
|
67
|
+
const unusedArgs = [];
|
|
68
|
+
while (pendingArgs.length > 0) {
|
|
69
|
+
pendingArgs = normaliseFirstArgumentIfRequired(pendingArgs, commandsByName, globalCommandsByShortAlias);
|
|
70
|
+
// take first argument
|
|
71
|
+
const currentArg = pendingArgs[0];
|
|
72
|
+
pendingArgs = pendingArgs.slice(1);
|
|
73
|
+
// looking for:
|
|
74
|
+
// <global_[modifier_]command_name>
|
|
75
|
+
if (currentArg.startsWith("--")) {
|
|
76
|
+
const potentialCommandName = currentArg.slice(2);
|
|
77
|
+
// check for Global[Modifier]Command name
|
|
78
|
+
const command = commandsByName.get(potentialCommandName);
|
|
79
|
+
if (command) {
|
|
80
|
+
logger.debug("Found global [modifier] command name: %s", potentialCommandName);
|
|
81
|
+
return {
|
|
82
|
+
commandClause: {
|
|
83
|
+
command,
|
|
84
|
+
potentialArgs: pendingArgs,
|
|
85
|
+
},
|
|
86
|
+
unusedArgs,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (!includeSubCommands || currentArg[0] === "-") {
|
|
91
|
+
unusedArgs.push(currentArg);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (groupAndMemberCommandsByJoinedName) {
|
|
95
|
+
// looking for:
|
|
96
|
+
// <group_command_name>:<member_sub_command_name>
|
|
97
|
+
// <group_command_name> <member_sub_command_name>
|
|
98
|
+
// <sub_command_name>
|
|
99
|
+
let potentialGroupCommandName = currentArg;
|
|
100
|
+
let potentialMemberSubCommandName;
|
|
101
|
+
let potentialMemberCommandNameArgumentUsed = false;
|
|
102
|
+
if (potentialGroupCommandName.includes(":")) {
|
|
103
|
+
// looking for:
|
|
104
|
+
// <group_command_name>:<member_sub_command_name>
|
|
105
|
+
[potentialGroupCommandName, potentialMemberSubCommandName] =
|
|
106
|
+
potentialGroupCommandName.split(":");
|
|
107
|
+
}
|
|
108
|
+
else if (pendingArgs.length > 0) {
|
|
109
|
+
// looking for:
|
|
110
|
+
// <group_command_name> <member_sub_command_name>
|
|
111
|
+
potentialMemberSubCommandName = pendingArgs[0];
|
|
112
|
+
pendingArgs = pendingArgs.slice(1);
|
|
113
|
+
potentialMemberCommandNameArgumentUsed = true;
|
|
114
|
+
}
|
|
115
|
+
if (potentialMemberSubCommandName !== undefined) {
|
|
116
|
+
const result = groupAndMemberCommandsByJoinedName.get(`${potentialGroupCommandName}:${potentialMemberSubCommandName}`);
|
|
117
|
+
if (result && result.command) {
|
|
118
|
+
const { groupCommand, command } = result;
|
|
119
|
+
logger.debug("Found group command name: %s and member sub-command name: %s", potentialGroupCommandName, potentialMemberSubCommandName);
|
|
120
|
+
return {
|
|
121
|
+
commandClause: {
|
|
122
|
+
command,
|
|
123
|
+
groupCommand,
|
|
124
|
+
potentialArgs: pendingArgs,
|
|
125
|
+
},
|
|
126
|
+
unusedArgs,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// if group parsing was not needed, revert state if necessary
|
|
131
|
+
if (potentialMemberCommandNameArgumentUsed && potentialMemberSubCommandName !== undefined) {
|
|
132
|
+
pendingArgs.unshift(potentialMemberSubCommandName);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// looking for:
|
|
136
|
+
// <sub_command_name>
|
|
137
|
+
//
|
|
138
|
+
// if we find it is a group command we skip it as we didn't find a member command
|
|
139
|
+
// following it the logic above
|
|
140
|
+
const command = commandsByName.get(currentArg);
|
|
141
|
+
if (command && !isGroupCommand(command)) {
|
|
142
|
+
logger.debug("Found sub-command name: %s", currentArg);
|
|
143
|
+
return {
|
|
144
|
+
commandClause: {
|
|
145
|
+
command,
|
|
146
|
+
potentialArgs: pendingArgs,
|
|
147
|
+
},
|
|
148
|
+
unusedArgs,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// if we got here we haven't found a command so add the current arg to unused args
|
|
152
|
+
unusedArgs.push(currentArg);
|
|
153
|
+
}
|
|
154
|
+
// if we got here we haven't found a command and we have processed all provided args
|
|
155
|
+
return {
|
|
156
|
+
commandClause: undefined,
|
|
157
|
+
unusedArgs,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Scan the provided arguments and return any {@link CommandClause} instances discovered based on the provided
|
|
162
|
+
* list of {@link GlobalModifierCommand} instances.
|
|
163
|
+
*
|
|
164
|
+
* @param argSequences the list of argument sequences to scan.
|
|
165
|
+
* @param globalModifierCommandsByName the map of {@link GlobalModifierCommand} instances by name to use when scanning.
|
|
166
|
+
* @param globalModifierCommandsByShortAlias the map of {@link GlobalModifierCommand} instances by short alias to use when scanning.
|
|
167
|
+
*/
|
|
168
|
+
export function scanForGlobalModifierCommandClauses(argSequences, globalModifierCommandsByName, globalModifierCommandsByShortAlias) {
|
|
169
|
+
logger.debug(() => `Scanning args: '${JSON.stringify(argSequences)}' for global modifier commands: '${Array.from(globalModifierCommandsByName.keys()).join(" ")}'`);
|
|
170
|
+
const scanResult = {
|
|
171
|
+
unusedArgSequences: [],
|
|
172
|
+
};
|
|
173
|
+
const commandClauses = [];
|
|
174
|
+
for (const argSequence of argSequences) {
|
|
175
|
+
let lastCommandClause;
|
|
176
|
+
let args = argSequence;
|
|
177
|
+
while (args.length > 0) {
|
|
178
|
+
const { commandClause, unusedArgs } = scanForNextCommandClause(args, false, globalModifierCommandsByName, globalModifierCommandsByShortAlias, undefined);
|
|
179
|
+
// any args that weren't used in the current scan are...
|
|
180
|
+
if (unusedArgs.length > 0) {
|
|
181
|
+
if (lastCommandClause) {
|
|
182
|
+
// ... given back to the previous scan result if defined
|
|
183
|
+
lastCommandClause.potentialArgs = unusedArgs;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
// ... or added to the unused arg sequences
|
|
187
|
+
scanResult.unusedArgSequences.push(unusedArgs);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// if we didn't find a command clause all args have been allocated to
|
|
191
|
+
// a previous clause or the unuused arg sequences, so we can stop scanning
|
|
192
|
+
if (!commandClause) {
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
// save the command we found
|
|
196
|
+
commandClauses.push(commandClause);
|
|
197
|
+
// now set the current scan result as the last scan result
|
|
198
|
+
lastCommandClause = commandClause;
|
|
199
|
+
// temporarily take all of the potential args from the last command clause and use them for a potential
|
|
200
|
+
// new command clause, if any args are left over they will be added back to the last command clause
|
|
201
|
+
args = lastCommandClause.potentialArgs;
|
|
202
|
+
lastCommandClause.potentialArgs = [];
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (commandClauses.length > 0) {
|
|
206
|
+
scanResult.globalModifierCommandClauses = commandClauses;
|
|
207
|
+
}
|
|
208
|
+
logger.debug("scan result: %O", scanResult);
|
|
209
|
+
return scanResult;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Scan the provided arguments and return the first {@link CommandClause} instance discovered based on the provided
|
|
213
|
+
* list of non-modifier {@link Command} instances.
|
|
214
|
+
*
|
|
215
|
+
* @param argSequences the list of argument sequences to scan.
|
|
216
|
+
* @param nonModifierCommandsByName the map of non-modifier {@link Command} instances by name to use when scanning.
|
|
217
|
+
* @param globalCommandsByShortAlias optional map of {@link GlobalCommand} instances by short alias to use when scanning.
|
|
218
|
+
* @param groupAndMemberCommandsByJoinedName optional map of {@link GroupCommand} and member {@link SubCommand} instances to use when scanning.
|
|
219
|
+
*/
|
|
220
|
+
export function scanForNonModifierCommandClause(argSequences, nonModifierCommandsByName, globalCommandsByShortAlias, groupAndMemberCommandsByJoinedName) {
|
|
221
|
+
logger.debug(() => `Scanning args: '${JSON.stringify(argSequences)}' for non-modifier commands: '${Array.from(nonModifierCommandsByName.keys()).join(" ")}'`);
|
|
222
|
+
const scanResult = {
|
|
223
|
+
unusedArgSequences: [],
|
|
224
|
+
};
|
|
225
|
+
for (const argSequence of argSequences) {
|
|
226
|
+
// if a command clause is already defined, we don't need to scan any further,
|
|
227
|
+
// just add the unused args to the unused arg sequences
|
|
228
|
+
if (scanResult.nonModifierCommandClause) {
|
|
229
|
+
scanResult.unusedArgSequences.push(argSequence);
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
const { commandClause, unusedArgs } = scanForNextCommandClause(argSequence, true, nonModifierCommandsByName, globalCommandsByShortAlias, groupAndMemberCommandsByJoinedName);
|
|
233
|
+
// args that weren't used in the current scan are given to the unused arg sequences
|
|
234
|
+
if (unusedArgs.length > 0) {
|
|
235
|
+
scanResult.unusedArgSequences.push(unusedArgs);
|
|
236
|
+
}
|
|
237
|
+
// use the result if we found a command
|
|
238
|
+
if (commandClause) {
|
|
239
|
+
scanResult.nonModifierCommandClause = commandClause;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
logger.debug("scan result: %O", scanResult);
|
|
243
|
+
return scanResult;
|
|
244
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { MAXIMUM_ARGUMENT_ARRAY_SIZE } from "../../api/argument/SubCommandArgument.js";
|
|
2
|
+
import { MAXIMUM_COMPLEX_OPTION_NESTING_DEPTH } from "../../api/argument/ComplexOption.js";
|
|
3
|
+
function doClone(source, nestingLevel) {
|
|
4
|
+
if (source === undefined) {
|
|
5
|
+
return source;
|
|
6
|
+
}
|
|
7
|
+
// check if source is an array
|
|
8
|
+
if (Array.isArray(source)) {
|
|
9
|
+
return arrayMerge(source, [], nestingLevel);
|
|
10
|
+
}
|
|
11
|
+
// check if source is an object
|
|
12
|
+
if (typeof source === "object") {
|
|
13
|
+
return objectMerge(source, {}, nestingLevel);
|
|
14
|
+
}
|
|
15
|
+
// source must be a primitive value
|
|
16
|
+
return source;
|
|
17
|
+
}
|
|
18
|
+
function arrayMerge(override, base, nestingLevel) {
|
|
19
|
+
if (override.length > MAXIMUM_ARGUMENT_ARRAY_SIZE) {
|
|
20
|
+
throw new Error(`Maximum array size exceeded: ${override.length}`);
|
|
21
|
+
}
|
|
22
|
+
if (base.length > MAXIMUM_ARGUMENT_ARRAY_SIZE) {
|
|
23
|
+
throw new Error(`Maximum array size exceeded: ${override.length}`);
|
|
24
|
+
}
|
|
25
|
+
const result = base.slice();
|
|
26
|
+
override.forEach((argValue, index) => {
|
|
27
|
+
if (Array.isArray(argValue)) {
|
|
28
|
+
throw new Error(`Array of array values discovered, this is not supported: ${JSON.stringify(argValue)}`);
|
|
29
|
+
}
|
|
30
|
+
if (index >= base.length) {
|
|
31
|
+
result.push(doClone(argValue, nestingLevel));
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
result[index] = doMerge(argValue, base[index], nestingLevel);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
function objectMerge(override, base, nestingLevel) {
|
|
40
|
+
if (nestingLevel > MAXIMUM_COMPLEX_OPTION_NESTING_DEPTH) {
|
|
41
|
+
throw new Error(`Maximum complex option nesting depth exceeded: ${nestingLevel}`);
|
|
42
|
+
}
|
|
43
|
+
nestingLevel++;
|
|
44
|
+
const result = {};
|
|
45
|
+
Object.keys(override).forEach((argName) => {
|
|
46
|
+
if (base[argName] === undefined) {
|
|
47
|
+
// nothing to merge so just clone the override
|
|
48
|
+
result[argName] = doClone(override[argName], nestingLevel);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// merge the base and the override
|
|
52
|
+
result[argName] = doMerge(override[argName], base[argName], nestingLevel);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
Object.keys(base).forEach((argName) => {
|
|
56
|
+
// if the base is in the override, we have already merged above
|
|
57
|
+
if (override[argName] !== undefined) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// nothing to merge so just clone the base
|
|
61
|
+
result[argName] = doClone(base[argName], nestingLevel);
|
|
62
|
+
});
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
function doMerge(override, defaults, nestingLevel) {
|
|
66
|
+
if (defaults === undefined) {
|
|
67
|
+
throw new Error(`Undefined value provided in merge: override = ${JSON.stringify(override)}, defaults = undefined`);
|
|
68
|
+
}
|
|
69
|
+
if (typeof override !== typeof defaults) {
|
|
70
|
+
// check if we need to convert from single value to array
|
|
71
|
+
if (Array.isArray(override)) {
|
|
72
|
+
if (typeof defaults === "object") {
|
|
73
|
+
defaults = [defaults];
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
defaults = [defaults];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else if (Array.isArray(defaults)) {
|
|
80
|
+
if (typeof override === "object") {
|
|
81
|
+
override = [override];
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
override = [override];
|
|
85
|
+
}
|
|
86
|
+
} // check if we need to convert from single non-string value to single string value
|
|
87
|
+
else if (typeof override === "string" &&
|
|
88
|
+
(typeof defaults == "number" || typeof defaults == "boolean")) {
|
|
89
|
+
defaults = `${defaults}`;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (override !== undefined && typeof override !== typeof defaults) {
|
|
93
|
+
throw new Error(`Incompatible value types provided in merge: override = ${JSON.stringify(override)}, defaults = ${JSON.stringify(defaults)}`);
|
|
94
|
+
}
|
|
95
|
+
// check if override is an array
|
|
96
|
+
if (Array.isArray(override)) {
|
|
97
|
+
return arrayMerge(override, defaults, nestingLevel);
|
|
98
|
+
}
|
|
99
|
+
// check if override is an object
|
|
100
|
+
if (typeof override === "object") {
|
|
101
|
+
return objectMerge(override, defaults, nestingLevel);
|
|
102
|
+
}
|
|
103
|
+
// check if override is undefined so we should use default
|
|
104
|
+
if (override === undefined) {
|
|
105
|
+
return doClone(defaults, nestingLevel);
|
|
106
|
+
}
|
|
107
|
+
// override must be a primitive value
|
|
108
|
+
return override;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Deep merge of provided default argument values with overridden argument values. The result is a cloned instance
|
|
112
|
+
* of `defaults` with values in `override` cloned and merged in the result.
|
|
113
|
+
*
|
|
114
|
+
* @throws {Error} if a value appears under the same argument name in both `override` and `defaults`.
|
|
115
|
+
* and they are not of the same type, or if either argument is `undefined`.
|
|
116
|
+
*
|
|
117
|
+
* @param override the values which should be used in place of any defined in `defaults`.
|
|
118
|
+
* @param defaults the values to use unless they are overridden in `override`.
|
|
119
|
+
*/
|
|
120
|
+
export default function argumentValueMerge(override, defaults) {
|
|
121
|
+
return doMerge(override, defaults, 0);
|
|
122
|
+
}
|