diff --git a/.editorconfig b/.editorconfig index 3afaa32df..70a03f65a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -21,3 +21,6 @@ indent_size = 2 [*.kts] indent_style = space indent_size = 2 + +[*.goldfile] +insert_final_newline = false diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index fdda33204..720708b73 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -46,3 +46,21 @@ jobs: path: | ./reports ./coverage + # For now, the smoke tests are no-ops, so the job doesn't have to do anything exciting. + # When smoke-tests stop being no-ops, we'll need a build-dependencies step to create a tarball artifact, and so forth. + # We'll be able to use the v4 workflow as a template. + smoke-tests: + strategy: + # By default, if any job in a matrix fails, all other jobs are automatically cancelled. This makes the jobs run + # to completion instead. + fail-fast: false + matrix: + node: ${{ fromJson(inputs.node-matrix) }} + os: [{vm: ubuntu-latest, exe: .sh}, {vm: macos-latest, exe: .sh}, {vm: windows-latest, exe: .cmd}] + runs-on: ${{ matrix.os.vm }} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.target-branch }} + - run: smoke-tests/smoke-test${{ matrix.os.exe }} sf + diff --git a/messages/config-command.md b/messages/config-command.md index 28b57b97f..a7d73693f 100644 --- a/messages/config-command.md +++ b/messages/config-command.md @@ -4,36 +4,37 @@ Display the current state of configuration for Code Analyzer. # command.description -Code Analyzer gives you the ability to configure settings that modify Code Analyzer's behavior, to override the tags and severity levels of rules, and to configure the engine specific settings. Use this command to see the current state of this configuration and to save this state to a YAML-formatted file that you can modify to our needs. +Code Analyzer gives you the ability to configure settings that modify Code Analyzer's behavior, to override the tags and severity levels of rules, and to configure the engine specific settings. Use this command to see the current state of this configuration. You can also save this state to a YAML-formatted file that you can modify for your needs. -To apply a custom configuration with Code Analyzer, either keep your custom configuration settings in a 'code-analyzer.yml' file located in the current working directory from which you are executing commands, or specify the location of your custom configuration file to each of the Code Analyzer commands via the `--config-file` flag. +To apply a custom configuration with Code Analyzer, either keep your custom configuration settings in a `code-analyzer.yml` file located in the current folder from which you are executing commands, or specify the location of your custom configuration file to the Code Analyzer commands with the --config-file flag. # command.examples -- Display the current state of configuration for Code Analyzer using the default behavior: display top level configuration, display the engine and rule override settings associated with all the rules that have a 'Recommended' tag; and automatically apply any existing custom configuration settings found in a "code-analyzer.yml" or "code-analyzer.yaml" file in the current folder: +- Display the current state of the Code Analyzer configuration using the default behavior: display top level configuration, display the engine and rule override settings associated with all the rules that have a "Recommended" tag; and automatically apply any existing custom configuration settings found in a `code-analyzer.yml` or `code-analyzer.yaml` file in the current folder: - <%= config.bin %> <%= command.id %> + <%= config.bin %> <%= command.id %> -- This example is identical to the previous one, if `./code-analyzer.yml` exists. +- This example is identical to the previous one, assuming that `./code-analyzer.yml` exists in your current folder. - <%= config.bin %> <%= command.id %> --config-file ./code-analyzer.yml --rule-selector Recommended + <%= config.bin %> <%= command.id %> --config-file ./code-analyzer.yml --rule-selector Recommended -- Write the current state of configuration to `code-analyzer.yml`, including any configuration from an existing `code-analyzer.yml` file. This preserves all values from the original config, but will overwrite any comments: +- Write the current state of configuration to the file `code-analyzer.yml`, including any configuration from an existing `code-analyzer.yml` file. The command preserves all values from the original config, but overwrites any comments: - <%= config.bin %> <%= command.id %> --config-file ./code-analyzer.yml --output-file code-analyzer.yml + <%= config.bin %> <%= command.id %> --config-file ./code-analyzer.yml --output-file code-analyzer.yml - Display the configuration state for all rules, instead of just the recommended ones: - <%= config.bin %> <%= command.id %> --rule-selector all + <%= config.bin %> <%= command.id %> --rule-selector all + - Display the configuration state associated with recommended rules that are applicable to your workspace folder, `./src`: - <%= config.bin %> <%= command.id %> --workspace ./src + <%= config.bin %> <%= command.id %> --workspace ./src - Display any relevant configuration settings associated with the rule name 'no-undef' from the 'eslint' engine: - <%= config.bin %> <%= command.id %> --rule-selection eslint:no-undef + <%= config.bin %> <%= command.id %> --rule-selection eslint:no-undef -- Load from an existing configuration called 'existing-config.yml', but write to a new configuration file called 'new-config.yml' the configuration state that is applicable to all rules that are relevant to workspace located in current working directory: +- Load an existing configuration file called `existing-config.yml`, and then write the configuration to a new file called `new-config.yml`, the configuration state that is applicable to all rules that are relevant to the workspace located in the current folder: <%= config.bin %> <%= command.id %> --config-file ./existing-config.yml --rule-selection all --workspace . --output-file ./subfolder-config.yml @@ -43,11 +44,11 @@ Set of files you want to include in the code analysis. # flags.workspace.description -If you specify this flag, the command returns a more accurate list of the rules that apply to the files that make up your workspace. Typically, a workspace is a single project folder that contains all your files. But it can also consist of one or more folders, one or more files, and use glob patterns (wildcards). If you specify this flag multiple times, then your workspace is the sum of the files and folders. +Use the --workspace flag to display only the configuration associated with the rules that apply to the files that make up your workspace. Typically, a workspace is a single project folder that contains all your files. But it can also consist of one or more folders, one or more files, and use glob patterns (wildcards). If you specify this flag multiple times, then your workspace is the sum of the files and folders. -This command uses the type of file in the workspace, such as JavaScript or Typescript, to determine the rules to list. For example, if your workspace contains only JavaScript files, the command doesn't list TypeScript rules. The command uses a file's extension to determine what kind of file it is, such as ".ts" for TypeScript. +This command uses the type of file in the workspace, such as JavaScript or Typescript, to determine the rules to include in the configuration state. For example, if your workspace contains only JavaScript files, the command doesn't include TypeScript rules. The command uses a file's extension to determine what kind of file it is, such as ".ts" for TypeScript. -Some engines may be configured to add additional rules based on what it finds in your workspace. For example, if you set the engines.eslint.auto_discover_eslint_config value of your code-analyzer.yml file to true, then supplying your workspace allows the "eslint" engine to examine your files in order to find ESLint configuration files that could potentially add in additional rules. +Some engines may be configured to add additional rules based on what it finds in your workspace. For example, if you set the "engines.eslint.auto_discover_eslint_config" value of your `code-analyzer.yml` file to true, then supplying your workspace allows the "eslint" engine to examine your files in order to find ESLint configuration files that could potentially add in additional rules. # flags.rule-selector.summary @@ -59,7 +60,7 @@ Use the --rule-selector flag to display only the configuration associated with t You can combine different criteria using colons to further filter the list; the colon works as an intersection. For example, "--rule-selector eslint:Security" reduces the output to only contain the configuration state associated with the rules from the "eslint" engine that have the "Security" tag. To add multiple rule selectors together (a union), specify the --rule-selector flag multiple times, such as "--rule-selector eslint:Recommended --rule-selector retire-js:3". -If this flag is not specified, then the 'Recommended' tag rule selector will be used. +If you don't specify this flag, then the command uses the "Recommended" tag rule selector. Run `<%= config.bin %> <%= command.id %> --rule-selector all` to display the configuration state associated with all possible rules available, and not just the recommended ones. @@ -71,11 +72,11 @@ Path to the existing configuration file used to customize the engines and rules. Use this flag to apply the customizations from a custom Code Analyzer configuration file to be displayed alongside the current Code Analyzer configuration state. -If this flag is not specified, then by default Code Analyzer will look for and apply a file named "code-analyzer.yml" or "code-analyzer.yaml" in your current working directory. +If you don't specify this flag, then the command looks for and applies a file named `code-analyzer.yml` or `code-analyzer.yaml` in your current folder. # flags.output-file.summary -Output file to write the configuration state to. The file will be written in YAML format. +Output file to write the configuration state to. The file is written in YAML format. # flags.output-file.description diff --git a/messages/config-model.md b/messages/config-model.md new file mode 100644 index 000000000..54eadeabd --- /dev/null +++ b/messages/config-model.md @@ -0,0 +1,14 @@ +# template.last-calculated-as +Last calculated by the config command as: %s + +# template.modified-from +Modified from: %s + +# template.rule-overrides-section +%s ENGINE RULE OVERRIDES + +# template.yaml.no-engines-selected +Empty object used because rule selection returned no rules + +# template.yaml.no-rules-selected +Remove this empty object {} when you are ready to specify your first rule override diff --git a/messages/results-viewer.md b/messages/results-viewer.md index 97629b94e..4d85513f3 100644 --- a/messages/results-viewer.md +++ b/messages/results-viewer.md @@ -1,7 +1,3 @@ -# summary.found-no-results - -Found 0 violations. - # summary.detail.found-results Found %d violation(s) across %d file(s): @@ -10,18 +6,6 @@ Found %d violation(s) across %d file(s): %d. %s -# summary.detail.breakdown.header - -Summary - -# summary.detail.breakdown.total - -Found %d violation(s): - -# summary.detail.breakdown.item - -%d %s severity - # summary.table.found-results Found %d violation(s) across %d file(s) relative to '%s': diff --git a/messages/run-command.md b/messages/run-command.md index 427c1acdd..154d493b7 100644 --- a/messages/run-command.md +++ b/messages/run-command.md @@ -50,6 +50,8 @@ If you want to preview the list of rules before you actually run them, use the ` <%= config.bin %> <%= command.id %> --rule-selector eslint:getter-return --rule-selector no-inner-declarations +# command.examples.temporarily-hidden-for-now + - Specify three method starting points to be applied to the path-based recommended rules of the Salesforce Graph Engine, "sfge", while specifying the "./src" folder as the workspace to be used to build the source graph: <%= config.bin %> <%= command.id %> --rule-selector sfge:Recommended --workspace ./src --path-start ./src/classes/Utils.cls#init --path-start ./src/classes/Helpers.cls#method1;method2 diff --git a/messages/run-summary-viewer.md b/messages/run-summary-viewer.md new file mode 100644 index 000000000..ab712ae84 --- /dev/null +++ b/messages/run-summary-viewer.md @@ -0,0 +1,27 @@ +# summary.header + +Summary + +# summary.found-no-violations + +Found 0 violations. + +# summary.violations-total + +Found %d violation(s): + +# summary.violations-item + +%d %s severity violation(s) found. + +# summary.no-outfiles + +No results files were specified. + +# summary.outfiles-total + +Results written to: + +# summary.log-file-location + +Additional log information written to: diff --git a/messages/shared.md b/messages/shared.md new file mode 100644 index 000000000..c39149101 --- /dev/null +++ b/messages/shared.md @@ -0,0 +1,7 @@ +# label.command-state + +Developer Preview + +# warning.command-state + +This command is in %s. diff --git a/package.json b/package.json index fdf0a3c11..84ee336b6 100644 --- a/package.json +++ b/package.json @@ -1,22 +1,25 @@ { "name": "@salesforce/plugin-code-analyzer", "description": "Static code scanner that applies quality and security rules to Apex code, and provides feedback.", - "version": "5.0.0-alpha.1", + "version": "5.0.0-alpha.2", "author": "Salesforce Code Analyzer Team", "bugs": "https://github.com/forcedotcom/sfdx-scanner/issues", "dependencies": { "@oclif/core": "^3.3.2", - "@salesforce/code-analyzer-core": "0.12.0", - "@salesforce/code-analyzer-engine-api": "0.9.0", - "@salesforce/code-analyzer-eslint-engine": "0.9.0", - "@salesforce/code-analyzer-regex-engine": "0.9.0", - "@salesforce/code-analyzer-retirejs-engine": "0.9.0", + "@salesforce/code-analyzer-core": "^0.13.2", + "@salesforce/code-analyzer-engine-api": "0.10.0", + "@salesforce/code-analyzer-eslint-engine": "0.10.0", + "@salesforce/code-analyzer-pmd-engine": "0.10.1", + "@salesforce/code-analyzer-regex-engine": "0.10.0", + "@salesforce/code-analyzer-retirejs-engine": "0.10.0", "@salesforce/core": "^5", "@salesforce/sf-plugins-core": "^5.0.4", "@salesforce/ts-types": "^2.0.9", - "@types/node": "^17", + "@types/js-yaml": "^4.0.9", + "@types/node": "^22.5.5", "ansis": "^3.2.0", "fast-glob": "^3.3.2", + "js-yaml": "^4.1.0", "ts-node": "^10", "tslib": "^2" }, diff --git a/smoke-tests/smoke-test-generator.js b/smoke-tests/smoke-test-generator.js index 5998a712f..eb9190c2c 100644 --- a/smoke-tests/smoke-test-generator.js +++ b/smoke-tests/smoke-test-generator.js @@ -35,6 +35,8 @@ function generateScriptBody(isBash, delim) { // Log an explainer that since we're in the Alpha stage, we don't have a fully fleshed out smoke test. `echo "At this point in the alpha, the smoke tests are no-ops and it is fine."` ] + + return commands.join('\n'); } function generateScript(isBash, delim) { diff --git a/smoke-tests/smoke-test.cmd b/smoke-tests/smoke-test.cmd old mode 100644 new mode 100755 index 5b7610136..0e5350764 --- a/smoke-tests/smoke-test.cmd +++ b/smoke-tests/smoke-test.cmd @@ -1,9 +1,9 @@ @echo off -REM Auto-generated on Wed Aug 07 2024 +REM Auto-generated on Tue Aug 27 2024 REM This script WILL EVENTUALLY run a smoke test of the entire plugin by running a series of commands that collectively REM hit a vertical slice of all major features. If they all succeed, then we can reasonably assume that the plugin is REM approximately stable. REM DO NOT EDIT THIS SCRIPT DIRECTLY! INSTEAD, MAKE CHANGES IN ./smoke-tests/smoke-test-generator.js AND RERUN THAT REM SCRIPT FROM THE PROJECT ROOT! SET EXE_NAME=%1 -undefined \ No newline at end of file +echo "At this point in the alpha, the smoke tests are no-ops and it is fine." \ No newline at end of file diff --git a/smoke-tests/smoke-test.sh b/smoke-tests/smoke-test.sh old mode 100644 new mode 100755 index 08f7c773b..6aa7f0639 --- a/smoke-tests/smoke-test.sh +++ b/smoke-tests/smoke-test.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Auto-generated on Wed Aug 07 2024 +# Auto-generated on Tue Aug 27 2024 # This script WILL EVENTUALLY run a smoke test of the entire plugin by running a series of commands that collectively # hit a vertical slice of all major features. If they all succeed, then we can reasonably assume that the plugin is # approximately stable. @@ -7,4 +7,4 @@ # SCRIPT FROM THE PROJECT ROOT! set -e EXE_NAME=$1 -undefined \ No newline at end of file +echo "At this point in the alpha, the smoke tests are no-ops and it is fine." \ No newline at end of file diff --git a/src/commands/code-analyzer/config.ts b/src/commands/code-analyzer/config.ts index b5a409fbb..f7634059b 100644 --- a/src/commands/code-analyzer/config.ts +++ b/src/commands/code-analyzer/config.ts @@ -1,14 +1,13 @@ -import {CodeAnalyzerConfig, RuleSelection} from "@salesforce/code-analyzer-core"; import {Flags, SfCommand} from '@salesforce/sf-plugins-core'; import {ConfigAction, ConfigDependencies} from '../../lib/actions/ConfigAction'; import {ConfigFileWriter} from '../../lib/writers/ConfigWriter'; -import {ConfigRawYamlViewer} from '../../lib/viewers/ConfigViewer'; +import {ConfigStyledYamlViewer} from '../../lib/viewers/ConfigViewer'; import {CodeAnalyzerConfigFactoryImpl} from '../../lib/factories/CodeAnalyzerConfigFactory'; import {EnginePluginsFactoryImpl} from '../../lib/factories/EnginePluginsFactory'; import {BundleName, getMessage, getMessages} from '../../lib/messages'; import {LogEventDisplayer} from '../../lib/listeners/LogEventListener'; import {RuleSelectionProgressSpinner} from '../../lib/listeners/ProgressEventListener'; -import {DummyConfigModel} from '../../lib/models/ConfigModel'; +import {AnnotatedConfigModel, ConfigContext} from '../../lib/models/ConfigModel'; import {Displayable, UxDisplay} from '../../lib/Display'; export default class ConfigCommand extends SfCommand implements Displayable { @@ -17,8 +16,9 @@ export default class ConfigCommand extends SfCommand implements Displayabl public static readonly summary = getMessage(BundleName.ConfigCommand, 'command.summary'); public static readonly description = getMessage(BundleName.ConfigCommand, 'command.description'); public static readonly examples = getMessages(BundleName.ConfigCommand, 'command.examples'); - // TODO: UN-HIDE WHEN COMMAND IS READY - public static readonly hidden = true; + + // TODO: Update when we go to Beta and when we go GA + public static readonly state = getMessage(BundleName.Shared, 'label.command-state'); public static readonly flags = { workspace: Flags.string({ @@ -26,9 +26,7 @@ export default class ConfigCommand extends SfCommand implements Displayabl description: getMessage(BundleName.ConfigCommand, 'flags.workspace.description'), char: 'w', multiple: true, - delimiter: ',', - // TODO: UN-HIDE WHEN ASSOCIATED FEATURES ARE IMPLEMENTED - hidden: true + delimiter: ',' }), 'rule-selector': Flags.string({ summary: getMessage(BundleName.ConfigCommand, 'flags.rule-selector.summary'), @@ -36,17 +34,13 @@ export default class ConfigCommand extends SfCommand implements Displayabl char: 'r', multiple: true, delimiter: ',', - default: ["Recommended"], - // TODO: UN-HIDE WHEN ASSOCIATED FEATURES ARE IMPLEMENTED - hidden: true + default: ["Recommended"] }), 'config-file': Flags.file({ summary: getMessage(BundleName.ConfigCommand, 'flags.config-file.summary'), description: getMessage(BundleName.ConfigCommand, 'flags.config-file.description'), char: 'c', - exists: true, - // TODO: UN-HIDE WHEN ASSOCIATED FEATURES ARE IMPLEMENTED - hidden: true + exists: true }), 'output-file': Flags.string({ summary: getMessage(BundleName.ConfigCommand, 'flags.output-file.summary'), @@ -56,7 +50,9 @@ export default class ConfigCommand extends SfCommand implements Displayabl }; public async run(): Promise { - this.warn('This command is still a work-in-progress. Currently it can only generate a fixed config file.'); + // TODO: Update when we go to Beta and when we go GA + this.warn(getMessage(BundleName.Shared, "warning.command-state", [getMessage(BundleName.Shared, 'label.command-state')])); + const parsedFlags = (await this.parse(ConfigCommand)).flags; const dependencies: ConfigDependencies = this.createDependencies(parsedFlags['output-file']); const action: ConfigAction = ConfigAction.createAction(dependencies); @@ -65,8 +61,8 @@ export default class ConfigCommand extends SfCommand implements Displayabl protected createDependencies(outputFile?: string): ConfigDependencies { const uxDisplay: UxDisplay = new UxDisplay(this, this.spinner); - const modelGeneratorFunction = (rawConfig: CodeAnalyzerConfig, ruleSelection: RuleSelection) => { - return DummyConfigModel.fromSelection(rawConfig, ruleSelection); + const modelGeneratorFunction = (relevantEngines: Set, userContext: ConfigContext, defaultContext: ConfigContext) => { + return AnnotatedConfigModel.fromSelection(relevantEngines, userContext, defaultContext); }; const dependencies: ConfigDependencies = { configFactory: new CodeAnalyzerConfigFactoryImpl(), @@ -74,7 +70,7 @@ export default class ConfigCommand extends SfCommand implements Displayabl logEventListeners: [new LogEventDisplayer(uxDisplay)], progressEventListeners: [new RuleSelectionProgressSpinner(uxDisplay)], modelGenerator: modelGeneratorFunction, - viewer: new ConfigRawYamlViewer(uxDisplay) + viewer: new ConfigStyledYamlViewer(uxDisplay) }; if (outputFile) { dependencies.writer = ConfigFileWriter.fromFile(outputFile); diff --git a/src/commands/code-analyzer/rules.ts b/src/commands/code-analyzer/rules.ts index 00a09a4e3..6181b38a5 100644 --- a/src/commands/code-analyzer/rules.ts +++ b/src/commands/code-analyzer/rules.ts @@ -2,7 +2,7 @@ import {Flags, SfCommand} from '@salesforce/sf-plugins-core'; import {View} from '../../Constants'; import {CodeAnalyzerConfigFactoryImpl} from '../../lib/factories/CodeAnalyzerConfigFactory'; import {EnginePluginsFactoryImpl} from '../../lib/factories/EnginePluginsFactory'; -import {RuleDetailViewer, RuleTableViewer} from '../../lib/viewers/RuleViewer'; +import {RuleDetailDisplayer, RuleTableDisplayer} from '../../lib/viewers/RuleViewer'; import {RulesAction, RulesDependencies} from '../../lib/actions/RulesAction'; import {BundleName, getMessage, getMessages} from '../../lib/messages'; import {Displayable, UxDisplay} from '../../lib/Display'; @@ -16,6 +16,9 @@ export default class RulesCommand extends SfCommand implements Displayable public static readonly description = getMessage(BundleName.RulesCommand, 'command.description'); public static readonly examples = getMessages(BundleName.RulesCommand, 'command.examples'); + // TODO: Update when we go to Beta and when we go GA + public static readonly state = getMessage(BundleName.Shared, 'label.command-state'); + public static readonly flags = { workspace: Flags.string({ summary: getMessage(BundleName.RulesCommand, 'flags.workspace.summary'), @@ -48,6 +51,9 @@ export default class RulesCommand extends SfCommand implements Displayable }; public async run(): Promise { + // TODO: Update when we go to Beta and when we go GA + this.warn(getMessage(BundleName.Shared, "warning.command-state", [getMessage(BundleName.Shared, 'label.command-state')])); + const parsedFlags = (await this.parse(RulesCommand)).flags; const dependencies: RulesDependencies = this.createDependencies(parsedFlags.view as View); const action: RulesAction = RulesAction.createAction(dependencies); @@ -61,7 +67,7 @@ export default class RulesCommand extends SfCommand implements Displayable pluginsFactory: new EnginePluginsFactoryImpl(), logEventListeners: [new LogEventDisplayer(uxDisplay)], progressListeners: [new RuleSelectionProgressSpinner(uxDisplay)], - viewer: view === View.TABLE ? new RuleTableViewer(uxDisplay) : new RuleDetailViewer(uxDisplay) + viewer: view === View.TABLE ? new RuleTableDisplayer(uxDisplay) : new RuleDetailDisplayer(uxDisplay) }; } } diff --git a/src/commands/code-analyzer/run.ts b/src/commands/code-analyzer/run.ts index 3d57f5e0a..b2cd008ca 100644 --- a/src/commands/code-analyzer/run.ts +++ b/src/commands/code-analyzer/run.ts @@ -5,7 +5,8 @@ import {View} from '../../Constants'; import {CodeAnalyzerConfigFactoryImpl} from '../../lib/factories/CodeAnalyzerConfigFactory'; import {EnginePluginsFactoryImpl} from '../../lib/factories/EnginePluginsFactory'; import {CompositeResultsWriter} from '../../lib/writers/ResultsWriter'; -import {ResultsDetailViewer, ResultsTableViewer} from '../../lib/viewers/ResultsViewer'; +import {ResultsDetailDisplayer, ResultsTableDisplayer} from '../../lib/viewers/ResultsViewer'; +import {RunSummaryDisplayer} from '../../lib/viewers/RunSummaryViewer'; import {BundleName, getMessage, getMessages} from '../../lib/messages'; import {LogEventDisplayer} from '../../lib/listeners/LogEventListener'; import {EngineRunProgressSpinner, RuleSelectionProgressSpinner} from '../../lib/listeners/ProgressEventListener'; @@ -18,6 +19,9 @@ export default class RunCommand extends SfCommand implements Displayable { public static readonly description = getMessage(BundleName.RunCommand, 'command.description'); public static readonly examples = getMessages(BundleName.RunCommand, 'command.examples'); + // TODO: Update when we go to Beta and when we go GA + public static readonly state = getMessage(BundleName.Shared, 'label.command-state'); + public static readonly flags = { // === Flags pertaining to targeting === workspace: Flags.string({ @@ -33,7 +37,8 @@ export default class RunCommand extends SfCommand implements Displayable { description: getMessage(BundleName.RunCommand, 'flags.path-start.description'), char: 's', multiple: true, - delimiter: ',' + delimiter: ',', + hidden: true }), // === Flags pertaining to rule selection === 'rule-selector': Flags.string({ @@ -74,11 +79,15 @@ export default class RunCommand extends SfCommand implements Displayable { }; public async run(): Promise { + // TODO: Update when we go to Beta and when we go GA + this.warn(getMessage(BundleName.Shared, "warning.command-state", [getMessage(BundleName.Shared, 'label.command-state')])); + const parsedFlags = (await this.parse(RunCommand)).flags; const dependencies: RunDependencies = this.createDependencies(parsedFlags.view as View, parsedFlags['output-file']); const action: RunAction = RunAction.createAction(dependencies); const runInput: RunInput = { 'config-file': parsedFlags['config-file'], + 'output-file': parsedFlags['output-file'] ?? [], 'path-start': parsedFlags['path-start'], // TODO: We should move validation of this here instead of having it in the RunAction. 'rule-selector': parsedFlags['rule-selector'], 'workspace': parsedFlags['workspace'], @@ -96,9 +105,10 @@ export default class RunCommand extends SfCommand implements Displayable { writer: CompositeResultsWriter.fromFiles(outputFiles), logEventListeners: [new LogEventDisplayer(uxDisplay)], progressListeners: [new EngineRunProgressSpinner(uxDisplay), new RuleSelectionProgressSpinner(uxDisplay)], - viewer: view === View.TABLE - ? new ResultsTableViewer(uxDisplay) - : new ResultsDetailViewer(uxDisplay) + resultsViewer: view === View.TABLE + ? new ResultsTableDisplayer(uxDisplay) + : new ResultsDetailDisplayer(uxDisplay), + runSummaryViewer: new RunSummaryDisplayer(uxDisplay) }; } } diff --git a/src/lib/actions/ConfigAction.ts b/src/lib/actions/ConfigAction.ts index 1042f2b38..ea8eefa95 100644 --- a/src/lib/actions/ConfigAction.ts +++ b/src/lib/actions/ConfigAction.ts @@ -1,4 +1,4 @@ -import {CodeAnalyzerConfig, CodeAnalyzer, RuleSelection} from "@salesforce/code-analyzer-core"; +import {CodeAnalyzerConfig, CodeAnalyzer} from "@salesforce/code-analyzer-core"; import {CodeAnalyzerConfigFactory} from '../factories/CodeAnalyzerConfigFactory'; import {EnginePluginsFactory} from '../factories/EnginePluginsFactory'; import {ConfigWriter} from '../writers/ConfigWriter'; @@ -7,7 +7,7 @@ import {ConfigViewer} from '../viewers/ConfigViewer'; import {createWorkspace} from '../utils/WorkspaceUtil'; import {LogEventListener, LogEventLogger} from '../listeners/LogEventListener'; import {ProgressEventListener} from '../listeners/ProgressEventListener'; -import {ConfigModel, ConfigModelGeneratorFunction} from '../models/ConfigModel'; +import {ConfigModel, ConfigModelGeneratorFunction, ConfigContext} from '../models/ConfigModel'; export type ConfigDependencies = { configFactory: CodeAnalyzerConfigFactory; @@ -33,38 +33,89 @@ export class ConfigAction { } public async execute(input: ConfigInput): Promise { - const config: CodeAnalyzerConfig = this.dependencies.configFactory.create(input['config-file']); - const logWriter: LogFileWriter = await LogFileWriter.fromConfig(config); - // We always add a Logger Listener to the appropriate listeners list, because we should Always Be Logging. - this.dependencies.logEventListeners.push(new LogEventLogger(logWriter)); + // We need the user's Config and the default Config. + const userConfig: CodeAnalyzerConfig = this.dependencies.configFactory.create(input['config-file']); + const defaultConfig: CodeAnalyzerConfig = CodeAnalyzerConfig.withDefaults(); - const core: CodeAnalyzer = new CodeAnalyzer(config); + // We always add a Logger Listener to the appropriate listeners list, because we should always be logging. + const logEventLogger: LogEventLogger = new LogEventLogger(await LogFileWriter.fromConfig(userConfig)); + this.dependencies.logEventListeners.push(logEventLogger); + + // The User's config produces one Core. + const userCore: CodeAnalyzer = new CodeAnalyzer(userConfig); + // The Default config produces two Cores, since we have to run two selections. + const defaultCoreForAllRules: CodeAnalyzer = new CodeAnalyzer(defaultConfig); + const defaultCoreForSelectRules: CodeAnalyzer = new CodeAnalyzer(defaultConfig); + + // LogEventListeners should start listening as soon as the User Core is instantiated, since it can start emitting + // relevant events basically immediately. + this.dependencies.logEventListeners.forEach(listener => listener.listen(userCore)); + // Only the File Logger should listen to the Default Cores, since we don't want to bother the user with redundant + // logs printed to the console. + logEventLogger.listen(defaultCoreForAllRules); + logEventLogger.listen(defaultCoreForSelectRules); - // LogEventListeners should start listening as soon as the Core is instantiated, since Core can start emitting - // events they listen for basically immediately. - this.dependencies.logEventListeners.forEach(listener => listener.listen(core)); const enginePlugins = this.dependencies.pluginsFactory.create(); - const enginePluginModules = config.getCustomEnginePluginModules(); + const enginePluginModules = userConfig.getCustomEnginePluginModules(); + const addEnginePromises: Promise[] = [ - ...enginePlugins.map(enginePlugin => core.addEnginePlugin(enginePlugin)), - ...enginePluginModules.map(pluginModule => core.dynamicallyAddEnginePlugin(pluginModule)) + // Assumption: It's safe for the different cores to share the same plugins, because all currently existent + // plugins return unique engines every time. This code may fail or behave unexpectedly if a plugin reuses engines. + ...enginePlugins.map(enginePlugin => userCore.addEnginePlugin(enginePlugin)), + ...enginePlugins.map(enginePlugin => defaultCoreForAllRules.addEnginePlugin(enginePlugin)), + ...enginePlugins.map(enginePlugin => defaultCoreForSelectRules.addEnginePlugin(enginePlugin)), + ...enginePluginModules.map(pluginModule => userCore.dynamicallyAddEnginePlugin(pluginModule)), + // Assumption: Every engine's default configuration is sufficient to allow that engine to be instantiated, + // or throw a clear error indicating the problem. + ...enginePluginModules.map(pluginModule => defaultCoreForAllRules.dynamicallyAddEnginePlugin(pluginModule)), + ...enginePluginModules.map(pluginModule => defaultCoreForSelectRules.dynamicallyAddEnginePlugin(pluginModule)), ]; await Promise.all(addEnginePromises); - const selectOptions = input.workspace - ? {workspace: await createWorkspace(core, input.workspace)} + const userSelectOptions = input.workspace + ? {workspace: await createWorkspace(userCore, input.workspace)} + : undefined; + const defaultSelectOptionsForAllRules = input.workspace + ? {workspace: await createWorkspace(defaultCoreForAllRules, input.workspace)} : undefined; - // EngineProgressListeners should start listening right before we call Core's `.selectRules()` method, since + const defaultSelectOptionsForSelectRules = input.workspace + ? {workspace: await createWorkspace(defaultCoreForSelectRules, input.workspace)} + : undefined; + + // EngineProgressListeners should start listening right before we call the Cores' `.selectRules()` methods, since // that's when progress events can start being emitted. - this.dependencies.progressEventListeners.forEach(listener => listener.listen(core)); - const ruleSelection: RuleSelection = await core.selectRules(input['rule-selector'], selectOptions); + this.dependencies.progressEventListeners.forEach(listener => listener.listen(userCore, defaultCoreForAllRules, defaultCoreForSelectRules)); - // After Core is done running, the listeners need to be told to stop, since some of them have persistent UI elements - // or file handlers that must be gracefully ended. + const [userRules, allDefaultRules, selectedDefaultRules] = await Promise.all([ + // The user Core should respect the user's selection criteria. + userCore.selectRules(input['rule-selector'], userSelectOptions), + // One of the Default Cores should always use "all", to minimize the likelihood of a rule's default state + // being unavailable for comparison. + defaultCoreForAllRules.selectRules(['all'], defaultSelectOptionsForAllRules), + // One of the Default Cores should use the same selectors as the User Core, so we know what rules are available + // by default. + defaultCoreForSelectRules.selectRules(input['rule-selector'], defaultSelectOptionsForSelectRules) + ]); + + // After the Cores are done running, the listeners need to be told to stop, since some of them have persistent UI + // elements or file handlers that must be gracefully ended. this.dependencies.progressEventListeners.forEach(listener => listener.stopListening()); this.dependencies.logEventListeners.forEach(listener => listener.stopListening()); - const configModel: ConfigModel = this.dependencies.modelGenerator(config, ruleSelection); + // We need the Set of all Engines that returned rules for the user's selection on both the Default and User Cores. + const relevantEngines: Set = new Set([...userRules.getEngineNames(), ...selectedDefaultRules.getEngineNames()]); + + const userConfigContext: ConfigContext = { + config: userConfig, + core: userCore, + rules: userRules + }; + const defaultConfigContext: ConfigContext = { + config: defaultConfig, + core: defaultCoreForAllRules, + rules: allDefaultRules + }; + const configModel: ConfigModel = this.dependencies.modelGenerator(relevantEngines, userConfigContext, defaultConfigContext); this.dependencies.viewer.view(configModel); this.dependencies.writer?.write(configModel); diff --git a/src/lib/actions/RunAction.ts b/src/lib/actions/RunAction.ts index 8c8bacdf3..e4fc4018c 100644 --- a/src/lib/actions/RunAction.ts +++ b/src/lib/actions/RunAction.ts @@ -13,6 +13,7 @@ import {EnginePluginsFactory} from '../factories/EnginePluginsFactory'; import {createPathStarts} from '../utils/PathStartUtil'; import {createWorkspace} from '../utils/WorkspaceUtil'; import {ResultsViewer} from '../viewers/ResultsViewer'; +import {RunSummaryViewer} from '../viewers/RunSummaryViewer'; import {ResultsWriter} from '../writers/ResultsWriter'; import {LogFileWriter} from '../writers/LogWriter'; import {LogEventListener, LogEventLogger} from '../listeners/LogEventListener'; @@ -25,15 +26,18 @@ export type RunDependencies = { logEventListeners: LogEventListener[]; progressListeners: ProgressEventListener[]; writer: ResultsWriter; - viewer: ResultsViewer; + resultsViewer: ResultsViewer; + runSummaryViewer: RunSummaryViewer; } export type RunInput = { 'config-file'?: string; + 'output-file': string[]; 'path-start'?: string[]; 'rule-selector': string[]; 'severity-threshold'?: SeverityLevel; workspace: string[]; + } export class RunAction { @@ -75,7 +79,8 @@ export class RunAction { this.dependencies.progressListeners.forEach(listener => listener.stopListening()); this.dependencies.logEventListeners.forEach(listener => listener.stopListening()); this.dependencies.writer.write(results); - this.dependencies.viewer.view(results); + this.dependencies.resultsViewer.view(results); + this.dependencies.runSummaryViewer.view(results, config, input['output-file']); const thresholdValue = input['severity-threshold']; if (thresholdValue) { diff --git a/src/lib/factories/EnginePluginsFactory.ts b/src/lib/factories/EnginePluginsFactory.ts index d45ef6bc2..accc6ce7c 100644 --- a/src/lib/factories/EnginePluginsFactory.ts +++ b/src/lib/factories/EnginePluginsFactory.ts @@ -1,5 +1,6 @@ import {EnginePlugin} from '@salesforce/code-analyzer-engine-api'; import * as ESLintEngineModule from '@salesforce/code-analyzer-eslint-engine'; +import * as PmdCpdEnginesModule from '@salesforce/code-analyzer-pmd-engine'; import * as RetireJSEngineModule from '@salesforce/code-analyzer-retirejs-engine'; import * as RegexEngineModule from '@salesforce/code-analyzer-regex-engine'; @@ -11,6 +12,7 @@ export class EnginePluginsFactoryImpl implements EnginePluginsFactory { public create(): EnginePlugin[] { return [ ESLintEngineModule.createEnginePlugin(), + PmdCpdEnginesModule.createEnginePlugin(), RetireJSEngineModule.createEnginePlugin(), RegexEngineModule.createEnginePlugin() ]; diff --git a/src/lib/listeners/ProgressEventListener.ts b/src/lib/listeners/ProgressEventListener.ts index 2a3f641f0..7a46307db 100644 --- a/src/lib/listeners/ProgressEventListener.ts +++ b/src/lib/listeners/ProgressEventListener.ts @@ -8,7 +8,7 @@ import {Display} from '../Display'; import {BundleName, getMessage} from '../messages'; export interface ProgressEventListener { - listen(codeAnalyzer: CodeAnalyzer): void; + listen(...codeAnalyzers: CodeAnalyzer[]): void; stopListening(): void; } @@ -74,8 +74,8 @@ abstract class ProgressSpinner { export class RuleSelectionProgressSpinner extends ProgressSpinner implements ProgressEventListener { private isListening: boolean; - private engineNames: string[]; - private completionPercent: number; + private engineNames: Set; + private readonly completionPercentages: number[]; /** * @param display The display with which to show output to the user @@ -84,15 +84,21 @@ export class RuleSelectionProgressSpinner extends ProgressSpinner implements Pro public constructor(display: Display, tickTime: number = 1000) { super(display, tickTime); this.isListening = false; + this.engineNames = new Set(); + this.completionPercentages = []; } - public listen(codeAnalyzer: CodeAnalyzer): void { + public listen(...codeAnalyzers: CodeAnalyzer[]): void { /* istanbul ignore else: should not be calling listen() twice */ if (!this.isListening) { this.isListening = true; - this.engineNames = codeAnalyzer.getEngineNames(); - this.completionPercent = 0; - codeAnalyzer.onEvent(EventType.RuleSelectionProgressEvent, (e: RuleSelectionProgressEvent) => this.handleEvent(e)); + codeAnalyzers.forEach((codeAnalyzer, idx) => { + for (const engineName of codeAnalyzer.getEngineNames()) { + this.engineNames.add(engineName); + } + this.completionPercentages.push(0); + codeAnalyzer.onEvent(EventType.RuleSelectionProgressEvent, (e: RuleSelectionProgressEvent) => this.handleEvent(e, idx)); + }); } } @@ -103,7 +109,7 @@ export class RuleSelectionProgressSpinner extends ProgressSpinner implements Pro } } - private handleEvent(e: RuleSelectionProgressEvent): void { + private handleEvent(e: RuleSelectionProgressEvent, idx: number): void { if (!this.isListening) { return; } @@ -112,18 +118,21 @@ export class RuleSelectionProgressSpinner extends ProgressSpinner implements Pro this.startSpinning(getMessage(BundleName.ProgressEventListener, 'selection-spinner.action')); } - this.completionPercent = Math.floor(e.percentComplete); + this.completionPercentages[idx] = Math.floor(e.percentComplete); + this.updateSpinner(); // Since the events this spinner listens to have one aggregated completion percentage, we can (and should) stop - // listening as soon as we get the 100% event, instead of waiting for the `stopListening()` method. - if (this.completionPercent === 100) { + // listening as soon as all Cores get their 100% event, instead of waiting for the `stopListening()` method. + if (this.completionPercentages.every(p => p === 100)) { this.stopListening(); } } protected createSpinnerStatus(): string { + const aggregateCompletionPercentage: number = + Math.floor(this.completionPercentages.reduce((prevTotal, next) => prevTotal + next, 0) / this.completionPercentages.length); return getMessage(BundleName.ProgressEventListener, 'selection-spinner.status', - [this.engineNames.join(', '), this.completionPercent, this.getSecondsSpentSpinning()]); + [[...this.engineNames.keys()].join(', '), aggregateCompletionPercentage, this.getSecondsSpentSpinning()]); } } @@ -144,12 +153,17 @@ export class EngineRunProgressSpinner extends ProgressSpinner implements Progres this.isListening = false; } - public listen(codeAnalyzer: CodeAnalyzer): void { + public listen(...codeAnalyzers: CodeAnalyzer[]): void { + if (codeAnalyzers.length > 1) { + // It's technically possible to implement multiple-core support for this spinner, but not currently necessary. + // So just throw a Developer Error if anyone tries. + throw new Error('Developer Error: EngineRunProgressSpinner cannot listen to multiple Code Analyzers'); + } /* istanbul ignore else: should not be calling listen() twice */ if (!this.isListening) { this.isListening = true; this.progressMap = new Map(); - codeAnalyzer.onEvent(EventType.EngineRunProgressEvent, (e: EngineRunProgressEvent) => this.handleEvent(e)); + codeAnalyzers[0].onEvent(EventType.EngineRunProgressEvent, (e: EngineRunProgressEvent) => this.handleEvent(e)); } } @@ -161,6 +175,7 @@ export class EngineRunProgressSpinner extends ProgressSpinner implements Progres } private handleEvent(e: EngineRunProgressEvent): void { + /* istanbul ignore if: no event should be coming in after we're done listening */ if (!this.isListening) { return; } diff --git a/src/lib/messages.ts b/src/lib/messages.ts index 52afc7bfe..6d7edc4cb 100644 --- a/src/lib/messages.ts +++ b/src/lib/messages.ts @@ -6,6 +6,7 @@ Messages.importMessagesDirectory(__dirname); export enum BundleName { ConfigCommand = 'config-command', + ConfigModel = 'config-model', ConfigWriter = 'config-writer', PathStartUtil = 'path-start-util', ProgressEventListener = 'progress-event-listener', @@ -15,6 +16,8 @@ export enum BundleName { ResultsWriter = 'results-writer', RunAction = 'run-action', RunCommand = 'run-command', + RunSummaryViewer = 'run-summary-viewer', + Shared = 'shared', WorkspaceUtil = 'workspace-util' } diff --git a/src/lib/models/ConfigModel.ts b/src/lib/models/ConfigModel.ts index 22cdfaf3a..5f151d025 100644 --- a/src/lib/models/ConfigModel.ts +++ b/src/lib/models/ConfigModel.ts @@ -1,139 +1,206 @@ -import {CodeAnalyzerConfig, RuleSelection} from '@salesforce/code-analyzer-core'; +import * as yaml from 'js-yaml'; +import { + CodeAnalyzer, + CodeAnalyzerConfig, + ConfigDescription, + Rule, + RuleSelection, + SeverityLevel +} from '@salesforce/code-analyzer-core'; +import {indent, makeGrey} from '../utils/StylingUtil'; +import {BundleName, getMessage} from '../messages'; export enum OutputFormat { - YAML = "YAML" + RAW_YAML = "RAW_YAML", + STYLED_YAML = "STYLED_YAML" } export interface ConfigModel { toFormattedOutput(format: OutputFormat): string; } -export type ConfigModelGeneratorFunction = (rawConfig: CodeAnalyzerConfig, ruleSelection: RuleSelection) => ConfigModel; +export type ConfigContext = { + config: CodeAnalyzerConfig; + core: CodeAnalyzer; + rules: RuleSelection; +} + +export type ConfigModelGeneratorFunction = (relevantEngines: Set, userContext: ConfigContext, defaultContext: ConfigContext) => ConfigModel; + +export class AnnotatedConfigModel implements ConfigModel { + private readonly relevantEngines: Set; + private readonly userContext: ConfigContext; + private readonly defaultContext: ConfigContext; + + private constructor(relevantEngines: Set, userContext: ConfigContext, defaultContext: ConfigContext) { + this.relevantEngines = relevantEngines; + this.userContext = userContext; + this.defaultContext = defaultContext; + } + + toFormattedOutput(format: OutputFormat): string { + // istanbul ignore else: Should be impossible + if (format === OutputFormat.STYLED_YAML) { + return toYaml(this.relevantEngines, this.userContext, this.defaultContext, true); + } else if (format === OutputFormat.RAW_YAML) { + return toYaml(this.relevantEngines, this.userContext, this.defaultContext, false); + } else { + throw new Error(`Unsupported`) + } + } + + public static fromSelection(relevantEngines: Set, userContext: ConfigContext, defaultContext: ConfigContext): AnnotatedConfigModel { + return new AnnotatedConfigModel(relevantEngines, userContext, defaultContext); + } +} + +function toYaml(relevantEngines: Set, userContext: ConfigContext, defaultContext: ConfigContext, styled: boolean): string { + let result: string = ''; + + // First, add the header. + const topLevelDescription: ConfigDescription = CodeAnalyzerConfig.getConfigDescription(); + result += `${toYamlComment(getYamlSectionWrapper(), styled)}\n` + result += `${toYamlComment(topLevelDescription.overview!, styled)}\n`; + result += `${toYamlComment(getYamlSectionWrapper(), styled)}\n` + result += '\n'; + + // Next add `config_root` + result += `${toYamlComment(topLevelDescription.fieldDescriptions!.config_root, styled)}\n`; + result += `config_root: ${toYamlWithDerivedValueComment(userContext.config.getConfigRoot(), process.cwd(), styled)}\n`; + result += '\n'; + + // Then `log_folder' + result += `${toYamlComment(topLevelDescription.fieldDescriptions!.log_folder, styled)}\n`; + result += `log_folder: ${toYamlWithDerivedValueComment(userContext.config.getLogFolder(), defaultContext.config.getLogFolder(), styled)}\n`; + result += '\n'; + + // Then the `rules` section + result += `${toYamlComment(topLevelDescription.fieldDescriptions!.rules, styled)}\n`; + result += `${toYamlRules(userContext, defaultContext, styled)}\n`; + result += '\n'; + + // Then the `engines` section + result += `${toYamlComment(topLevelDescription.fieldDescriptions!.engines, styled)}\n`; + result += `${toYamlEngines(relevantEngines, userContext, defaultContext, styled)}`; + + return result; +} + +function getYamlSectionWrapper(): string { + return '='.repeat(70); +} + +function toYamlComment(comment: string, styled: boolean, indentLength: number = 0): string { + // At the start of the string, and at the start of every line... + return comment.replace(/^.*/gm, s => { + // ...Inject a `# ` at the start to make it a comment... + let commented = `# ${s}`; + // ...Apply styling if requested... + commented = styled ? makeGrey(commented) : commented; + // ...And indent to the requested amount + return indent(commented, indentLength); + }); +} + +function toYamlWithDerivedValueComment(userValue: string, defaultValue: string, styled: boolean): string { + if (userValue == null || userValue === defaultValue) { + const comment = getMessage(BundleName.ConfigModel, 'template.last-calculated-as', [defaultValue]); + return `null ${toYamlComment(comment, styled)}`; + } else { + return `${userValue}`; + } +} + +function toYamlRules(userContext: ConfigContext, defaultContext: ConfigContext, styled: boolean): string { + if (userContext.rules.getCount() === 0) { + const comment = getMessage(BundleName.ConfigModel, 'template.yaml.no-rules-selected'); + return `rules: {} ${toYamlComment(comment, styled)}`; + } + let results: string = 'rules:\n'; + for (const engineName of userContext.rules.getEngineNames()) { + results += `\n${toYamlComment(getYamlSectionWrapper(), styled, 2)}\n`; + results += `${toYamlComment(getMessage(BundleName.ConfigModel, 'template.rule-overrides-section', [engineName.toUpperCase()]), styled, 2)}\n`; + results += `${toYamlComment(getYamlSectionWrapper(), styled, 2)}\n`; + results += indent(`${engineName}:`, 2) + '\n'; + for (const userRule of userContext.rules.getRulesFor(engineName)) { + const defaultRule = getDefaultRule(defaultContext, engineName, userRule.getName()); + results += indent(toYamlRule(userRule, defaultRule, styled), 4); + } + } + return results; +} + +function getDefaultRule(defaultContext: ConfigContext, engineName: string, ruleName: string): Rule|null { + try { + return defaultContext.rules.getRule(engineName, ruleName); + } catch (e) { + // istanbul ignore next + return null; + } +} + +function toYamlRule(userRule: Rule, defaultRule: Rule|null, styled: boolean): string { + const ruleName: string = userRule.getName(); + const userSeverity: SeverityLevel = userRule.getSeverityLevel(); + const userTags: string[] = userRule.getTags(); + + let severityYaml = yaml.dump({severity: userSeverity}); + let tagsYaml = yaml.dump({tags: userTags}); + + if (defaultRule != null) { + const defaultSeverity: SeverityLevel = defaultRule.getSeverityLevel(); + const defaultTagsJson: string = JSON.stringify(defaultRule.getTags()); + + if (userSeverity !== defaultSeverity) { + const comment = getMessage(BundleName.ConfigModel, 'template.modified-from', [defaultSeverity]); + severityYaml = severityYaml.replace('\n', ` ${toYamlComment(comment, styled)}\n`); + } + + if (JSON.stringify(userTags) !== defaultTagsJson) { + const comment = getMessage(BundleName.ConfigModel, 'template.modified-from', [defaultTagsJson]); + // The YAML spec requires a trailing newline, so we know that there's at least one newline somewhere in the + // string. If we inject a comment before the first newline we encounter, then it will look clean. + tagsYaml = tagsYaml.replace('\n', ` ${toYamlComment(comment, styled)}\n`); + } + } + return `"${ruleName}":\n${indent(severityYaml, 2)}${indent(tagsYaml, 2)}`; +} -export class DummyConfigModel { - toFormattedOutput(_format: OutputFormat): string { - return DUMMY_CONFIG; +function toYamlEngines(relevantEngines: Set, userContext: ConfigContext, defaultContext: ConfigContext, styled: boolean): string { + if (relevantEngines.size === 0) { + const comment = getMessage(BundleName.ConfigModel, 'template.yaml.no-engines-selected'); + return `engines: {} ${toYamlComment(comment, styled)}`; } - public static fromSelection(_rawConfig: CodeAnalyzerConfig, _ruleSelection: RuleSelection) { - return new DummyConfigModel(); + let results: string = 'engines:\n' + + for (const engineName of relevantEngines.keys()) { + const engineConfigDescriptor = userContext.core.getEngineConfigDescription(engineName); + const userEngineConfig = userContext.core.getEngineConfig(engineName); + const defaultEngineConfig = defaultContext.core.getEngineConfig(engineName); + + results += `\n${toYamlComment(getYamlSectionWrapper(), styled, 2)}\n` + // Engines are guaranteed to have an overview, even if it's just generic text. + results += `${toYamlComment(engineConfigDescriptor.overview!, styled, 2)}\n`; + results += `${toYamlComment(getYamlSectionWrapper(), styled, 2)}\n` + + results += indent(`${engineName}:`, 2) + '\n'; + // By fiat, the field description will always include, at minimum, an entry for "disable_engine", so we can + // assume that the object is not undefined. + for (const configField of Object.keys(engineConfigDescriptor.fieldDescriptions!)) { + const fieldDescription = engineConfigDescriptor.fieldDescriptions![configField]; + const defaultFieldValue = defaultEngineConfig[configField] ?? null; + const userFieldValue = userEngineConfig[configField] ?? defaultFieldValue; + // Add a leading newline to visually break up the property from the previous one. + results += '\n' + toYamlComment(fieldDescription, styled, 4) + '\n'; + let fieldYaml = indent(`${yaml.dump({[configField]: userFieldValue})}`, 4); + if(JSON.stringify(userFieldValue) !== JSON.stringify(defaultFieldValue)) { + const comment = getMessage(BundleName.ConfigModel, 'template.modified-from', [JSON.stringify(defaultFieldValue)]); + fieldYaml = fieldYaml.replace('\n', ` ${toYamlComment(comment, styled)}\n`); + } + results += fieldYaml; + } } + return results; } -export const DUMMY_CONFIG: string = -` -# The absolute folder path to which all other path values in this configuration may be relative to. -# If not specified or if equal to null, then the value is automatically chosen to be the parent folder of your Code Analyzer -# configuration file if it exists, or the current working directory otherwise. -config_root: null # Last calculated by the config command as: - -# Folder where to store log files. May be an absolute path or a path relative to config_root. -# If not specified or if equal to null, then the value is automatically chosen to be your machine's default temporary directory -log_folder: null # Last calculated by the config command as: - -# (Use at your own risk. This is an experimental property that is not officially supported.) -# List of EnginePlugin module paths to dynamically add to Code Analyzer. Each path may be absolute or relative to config_root. -custom-engine_plugin_modules: [] - -# Rule override settings of the format rules... = where -# * is the name of the engine containing the rule that you want to override -# * is the name of the rule that you want to override -# * can either be: -# 'severity' - [Optional] The severity level value that you want to use to override the default severity level for the rule -# Possible values: 1 or 'Critical', 2 or 'High', 3 or 'Moderate', 4 or 'Low', 5 or 'Info' -# 'tags' - [Optional] The string array of tag values that you want to use to override the default tags for the rule -# -# [Example usage]: -# rules: -# eslint: -# sort-vars: -# severity: Info -# tags: ["Recommended", "Suggestion"] -rules: {} # Remove this empty object {} when you are ready to specify your first rule override - -# Engine specific custom configuration settings of the format engines.. = where -# is the name of the engine containing the rule that you want to override -# is the name of a property associated with the engine that you would like to set -# Each engine will have its own set of properties that will be available that will help you customize that particular engine's -# behavior. See to learn more. -engines: - - # Custom configuration settings for the 'eslint' engine - # See to learn more about these settings. - eslint: - - # Whether to turn off the 'eslint' engine so that it is not included when running Code Analyzer commands - disable_engine: false - - # Whether to have Code Analyzer automatically discover/apply any ESLint configuration and ignore files from your workspace - auto_discover_eslint_config: false - - # Your project's main ESLint configuration file. May be an absolute path or a path relative to the config_root. - # If null and auto_discover_eslint_config is true, then Code Analyzer will attempt to discover/apply it automatically. - # Currently only legacy ESLInt config files are supported. - # See https://eslint.org/docs/v8.x/use/configure/configuration-files to learn more. - eslint_config_file: null - - # Your project's ".eslintignore" file. May be an absolute path or a path relative to the config_root. - # If null and auto_discover_eslint_config is true, then Code Analyzer will attempt to discover/apply it automatically. - # See https://eslint.org/docs/v8.x/use/configure/ignore#the-eslintignore-file to learn more. - eslint_ignore_file: null - - # Whether to turn off the default base configuration that supplies the standard ESLint rules for javascript files - disable_javascript_base_config: false - - # Whether to turn off the default base configuration that supplies the LWC rules for javascript files - disable_lwc_base_config: false - - # Whether to turn off the default base configuration that supplies the standard rules for typescript files - disable_typescript_base_config: false - - # Extensions of the javascript files in your workspace that will be associated with javascript and LWC rules - javascript_file_extensions: ['.js', '.cjs', '.mjs'] - - # Extensions of the typescript files in your workspace that will be associated with typescript rules - typescript_file_extensions: ['.ts'] - - # Custom configuration settings for the 'regex' engine - # See to learn more about these settings. - regex: - - # Whether to turn off the 'regex' engine so that it is not included when running Code Analyzer commands - disable_engine: false - - # Custom rules to be added to the 'regex' engine of the format custom_rules.. = where - # * is the name you would like to give to your custom rule - # * is the name of one of the rule properties. You may specify the following rule properties: - # 'regex' - The regular expression that triggers a violation when matched against the contents of a file. - # 'file_extensions' - The extensions of the files that you would like to test the regular expression against. - # 'description' - A description of the rule's purpose - # 'violation_message' - [Optional] The message emitted when a rule violation occurs. - # This message is intended to help the user understand the violation. - # Default: 'A match of the regular expression was found for rule : ' - # 'severity' - [Optional] The severity level to apply to this rule by default. - # Possible values: 1 or 'Critical', 2 or 'High', 3 or 'Moderate', 4 or 'Low', 5 or 'Info' - # Default: 'Moderate' - # 'tags' - [Optional] The string array of tag values to apply to this rule by default. - # Default: ['Recommended'] - # - # [Example usage]: - # engines: - # regex: - # custom_rules: - # NoTodoComments: - # regex: /\\/\\/[ \\t]*TODO/gi - # file_extensions: [".cls", ".trigger"] - # description: "Prevents TODO comments from being in apex code." - # violation_message: "A comment with a TODO statement was found. Please remove TODO statements from your apex code." - # severity: "Info" - # tags: ['TechDebt'] - custom_rules: {} # Remove this empty object {} when you are ready to define your first custom rule - - # Custom configuration settings for the 'retire-js' engine - # See to learn more about these settings. - retire-js: - - # Whether to turn off the 'retire-js' engine so that it is not included when running Code Analyzer commands - disable_engine: false - -`; diff --git a/src/lib/utils/StylingUtil.ts b/src/lib/utils/StylingUtil.ts index 60b2c135d..85478e9ba 100644 --- a/src/lib/utils/StylingUtil.ts +++ b/src/lib/utils/StylingUtil.ts @@ -8,7 +8,7 @@ type Styleable = null | undefined | {[key: string]: string}; export function toStyledHeaderAndBody(header: string, body: Styleable, keys?: string[]): string { const styledHeader: string = toStyledHeader(header); - const styledBody: string = indent(toStyledPropertyList(body, keys), 4); + const styledBody: string = indent(toStyledPropertyList(body, keys)); return `${styledHeader}\n${styledBody}`; } @@ -16,6 +16,10 @@ export function toStyledHeader(header: string): string { return `${ansis.dim('===')} ${ansis.bold(header)}`; } +export function makeGrey(str: string): string { + return ansis.dim(str); +} + export function toStyledPropertyList(body: Styleable, selectedKeys?: string[]): string { if (body == null || (selectedKeys && selectedKeys.length === 0)) { return ''; @@ -34,6 +38,6 @@ export function toStyledPropertyList(body: Styleable, selectedKeys?: string[]): return output.join('\n'); } -function indent(text: string, indentLength: number): string { - return text.replace(/^/gm, ' '.repeat(indentLength)); +export function indent(text: string, indentLength: number = 4): string { + return text.replace(/^.+/gm, m => m.length > 0 ? ' '.repeat(indentLength) + m : m); } diff --git a/src/lib/viewers/ConfigViewer.ts b/src/lib/viewers/ConfigViewer.ts index 7209cad24..f10ecef91 100644 --- a/src/lib/viewers/ConfigViewer.ts +++ b/src/lib/viewers/ConfigViewer.ts @@ -6,7 +6,7 @@ export interface ConfigViewer { view(configModel: ConfigModel): void; } -export class ConfigRawYamlViewer implements ConfigViewer { +export class ConfigStyledYamlViewer implements ConfigViewer { private readonly display: Display; public constructor(display: Display) { @@ -14,6 +14,8 @@ export class ConfigRawYamlViewer implements ConfigViewer { } public view(configModel: ConfigModel): void { - this.display.displayLog(configModel.toFormattedOutput(OutputFormat.YAML)); + const styledYaml = configModel.toFormattedOutput(OutputFormat.STYLED_YAML); + // Prepend a newline to visually separate the output from anything else we've already logged. + this.display.displayLog('\n' + styledYaml); } } diff --git a/src/lib/viewers/ResultsViewer.ts b/src/lib/viewers/ResultsViewer.ts index 50536d49d..34d795467 100644 --- a/src/lib/viewers/ResultsViewer.ts +++ b/src/lib/viewers/ResultsViewer.ts @@ -1,7 +1,7 @@ import {Ux} from '@salesforce/sf-plugins-core'; import {CodeLocation, RunResults, SeverityLevel, Violation} from '@salesforce/code-analyzer-core'; import {Display} from '../Display'; -import {toStyledHeaderAndBody, toStyledHeader} from '../utils/StylingUtil'; +import {toStyledHeaderAndBody} from '../utils/StylingUtil'; import {BundleName, getMessage} from '../messages'; import path from "node:path"; @@ -9,7 +9,7 @@ export interface ResultsViewer { view(results: RunResults): void; } -abstract class AbstractResultsViewer implements ResultsViewer { +abstract class AbstractResultsDisplayer implements ResultsViewer { protected display: Display; public constructor(display: Display) { @@ -18,9 +18,10 @@ abstract class AbstractResultsViewer implements ResultsViewer { public view(results: RunResults): void { if (results.getViolationCount() === 0) { - this.display.displayLog(getMessage(BundleName.ResultsViewer, 'summary.found-no-results')); + return; } else { this._view(results); + this.display.displayLog('\n'); } } @@ -39,15 +40,13 @@ abstract class AbstractResultsViewer implements ResultsViewer { protected abstract _view(results: RunResults): void; } -export class ResultsDetailViewer extends AbstractResultsViewer { +export class ResultsDetailDisplayer extends AbstractResultsDisplayer { protected _view(results: RunResults): void { const violations = sortViolations(results.getViolations()); this.display.displayLog(getMessage(BundleName.ResultsViewer, 'summary.detail.found-results', [ violations.length, this.countUniqueFiles(violations)])); this.displayDetails(violations); - this.display.displayLog('\n'); - this.displayBreakdown(results); } private displayDetails(violations: Violation[]): void { @@ -76,21 +75,6 @@ export class ResultsDetailViewer extends AbstractResultsViewer { const keys = ['severity', 'engine', 'message', 'location', 'resources']; return toStyledHeaderAndBody(header, body, keys); } - - private displayBreakdown(results: RunResults): void { - this.display.displayLog(toStyledHeader(getMessage(BundleName.ResultsViewer, 'summary.detail.breakdown.header'))); - this.display.displayLog(getMessage(BundleName.ResultsViewer, 'summary.detail.breakdown.total', [results.getViolationCount()])); - for (const sev of Object.values(SeverityLevel)) { - // Some of the keys will be numbers, since the enum is numerical. Skip those. - if (typeof sev !== 'string') { - continue; - } - const sevCount = results.getViolationCountOfSeverity(SeverityLevel[sev] as SeverityLevel); - if (sevCount > 0) { - this.display.displayLog(getMessage(BundleName.ResultsViewer, 'summary.detail.breakdown.item', [sevCount, sev])); - } - } - } } type ResultRow = { @@ -119,7 +103,7 @@ const TABLE_COLUMNS: Ux.Table.Columns = { } }; -export class ResultsTableViewer extends AbstractResultsViewer { +export class ResultsTableDisplayer extends AbstractResultsDisplayer { protected _view(results: RunResults) { const violations: Violation[] = sortViolations(results.getViolations()); const parentFolder: string = findLongestCommonParentFolderOf(violations.map(v => diff --git a/src/lib/viewers/RuleViewer.ts b/src/lib/viewers/RuleViewer.ts index 3434f13f9..1e1c82b57 100644 --- a/src/lib/viewers/RuleViewer.ts +++ b/src/lib/viewers/RuleViewer.ts @@ -9,7 +9,7 @@ export interface RuleViewer { } -abstract class AbstractRuleViewer implements RuleViewer { +abstract class AbstractRuleDisplayer implements RuleViewer { protected display: Display; public constructor(display: Display) { @@ -28,7 +28,7 @@ abstract class AbstractRuleViewer implements RuleViewer { protected abstract _view(rules: Rule[]): void; } -export class RuleDetailViewer extends AbstractRuleViewer { +export class RuleDetailDisplayer extends AbstractRuleDisplayer { protected _view(rules: Rule[]): void { const styledRules: string[] = []; for (let i = 0; i < rules.length; i++) { @@ -76,7 +76,7 @@ const TABLE_COLUMNS: Ux.Table.Columns = { } }; -export class RuleTableViewer extends AbstractRuleViewer { +export class RuleTableDisplayer extends AbstractRuleDisplayer { protected _view(rules: Rule[]): void { const ruleJsons: RuleRow[] = rules.map((rule, idx) => { const severity = rule.getSeverityLevel(); diff --git a/src/lib/viewers/RunSummaryViewer.ts b/src/lib/viewers/RunSummaryViewer.ts new file mode 100644 index 000000000..d7471eed0 --- /dev/null +++ b/src/lib/viewers/RunSummaryViewer.ts @@ -0,0 +1,62 @@ +import {CodeAnalyzerConfig, RunResults, SeverityLevel} from '@salesforce/code-analyzer-core'; +import {Display} from '../Display'; +import {indent, toStyledHeader} from '../utils/StylingUtil'; +import {BundleName, getMessage} from '../messages'; + +export interface RunSummaryViewer { + view(results: RunResults, config: CodeAnalyzerConfig, outfiles: string[]): void; +} + +export class RunSummaryDisplayer { + protected display: Display; + + public constructor(display: Display) { + this.display = display; + } + + public view(results: RunResults, config: CodeAnalyzerConfig, outfiles: string[]): void { + this.display.displayLog(toStyledHeader(getMessage(BundleName.RunSummaryViewer, 'summary.header'))); + // Use empty line as a visual separator + this.display.displayLog(''); + + if (results.getViolationCount() === 0) { + this.display.displayLog(getMessage(BundleName.RunSummaryViewer, 'summary.found-no-violations')); + } else { + this.displayResultsSummary(results); + } + // Use empty line as a visual separator + this.display.displayLog(''); + + if (outfiles.length === 0) { + this.display.displayLog(getMessage(BundleName.RunSummaryViewer, 'summary.no-outfiles')); + } else { + this.displayOutfiles(outfiles); + } + // Use empty line as a visual separator + this.display.displayLog(''); + + this.display.displayLog(getMessage(BundleName.RunSummaryViewer, 'summary.log-file-location')); + this.display.displayLog(indent(config.getLogFolder())); + } + + private displayResultsSummary(results: RunResults): void { + this.display.displayLog(getMessage(BundleName.RunSummaryViewer, 'summary.violations-total', [results.getViolationCount()])); + for (const sev of Object.values(SeverityLevel)) { + // Some of the keys will be numbers, since the enum is numerical. Skip those. + if (typeof sev !== 'string') { + continue; + } + const sevCount = results.getViolationCountOfSeverity(SeverityLevel[sev] as SeverityLevel); + if (sevCount > 0) { + this.display.displayLog(indent(getMessage(BundleName.RunSummaryViewer, 'summary.violations-item', [sevCount, sev]))); + } + } + } + + private displayOutfiles(outfiles: string[]): void { + this.display.displayLog(getMessage(BundleName.RunSummaryViewer, 'summary.outfiles-total')); + for (const outfile of outfiles) { + this.display.displayLog(indent(outfile)); + } + } +} diff --git a/src/lib/writers/ConfigWriter.ts b/src/lib/writers/ConfigWriter.ts index 340b5d815..e3718b186 100644 --- a/src/lib/writers/ConfigWriter.ts +++ b/src/lib/writers/ConfigWriter.ts @@ -23,7 +23,7 @@ export class ConfigFileWriter implements ConfigWriter { public static fromFile(file: string): ConfigFileWriter { const ext = path.extname(file).toLowerCase(); if (ext === '.yaml' || ext === '.yml') { - return new ConfigFileWriter(file, OutputFormat.YAML); + return new ConfigFileWriter(file, OutputFormat.RAW_YAML); } else { throw new Error(getMessage(BundleName.ConfigWriter, 'error.unrecognized-file-format', [file])); } diff --git a/test/commands/code-analyzer/rules.test.ts b/test/commands/code-analyzer/rules.test.ts index 98eeba24e..351604d7f 100644 --- a/test/commands/code-analyzer/rules.test.ts +++ b/test/commands/code-analyzer/rules.test.ts @@ -110,7 +110,7 @@ describe('`code-analyzer rules` tests', () => { expect(executeSpy).toHaveBeenCalled(); expect(receivedActionInput).toHaveProperty('view', inputValue); expect(createActionSpy).toHaveBeenCalled(); - expect(receivedActionDependencies.viewer.constructor.name).toEqual('RuleTableViewer'); + expect(receivedActionDependencies.viewer.constructor.name).toEqual('RuleTableDisplayer'); }); it('Accepts the value, "detail"', async () => { @@ -119,7 +119,7 @@ describe('`code-analyzer rules` tests', () => { expect(executeSpy).toHaveBeenCalled(); expect(receivedActionInput).toHaveProperty('view', inputValue); expect(createActionSpy).toHaveBeenCalled(); - expect(receivedActionDependencies.viewer.constructor.name).toEqual('RuleDetailViewer'); + expect(receivedActionDependencies.viewer.constructor.name).toEqual('RuleDetailDisplayer'); }); it('Rejects all other values', async () => { @@ -134,7 +134,7 @@ describe('`code-analyzer rules` tests', () => { expect(executeSpy).toHaveBeenCalled(); expect(receivedActionInput).toHaveProperty('view', 'table'); expect(createActionSpy).toHaveBeenCalled(); - expect(receivedActionDependencies.viewer.constructor.name).toEqual('RuleTableViewer'); + expect(receivedActionDependencies.viewer.constructor.name).toEqual('RuleTableDisplayer'); }); it('Can be supplied only once', async () => { @@ -152,7 +152,7 @@ describe('`code-analyzer rules` tests', () => { expect(executeSpy).toHaveBeenCalled(); expect(receivedActionInput).toHaveProperty('view', inputValue); expect(createActionSpy).toHaveBeenCalled(); - expect(receivedActionDependencies.viewer.constructor.name).toEqual('RuleDetailViewer'); + expect(receivedActionDependencies.viewer.constructor.name).toEqual('RuleDetailDisplayer'); }); }); diff --git a/test/commands/code-analyzer/run.test.ts b/test/commands/code-analyzer/run.test.ts index 98affd34b..094ece083 100644 --- a/test/commands/code-analyzer/run.test.ts +++ b/test/commands/code-analyzer/run.test.ts @@ -295,14 +295,14 @@ describe('`code-analyzer run` tests', () => { const inputValue = 'table'; await RunCommand.run(['--view', inputValue]); expect(createActionSpy).toHaveBeenCalled(); - expect(receivedActionDependencies.viewer.constructor.name).toEqual('ResultsTableViewer'); + expect(receivedActionDependencies.resultsViewer.constructor.name).toEqual('ResultsTableDisplayer'); }); it('Accepts the value, "detail"', async () => { const inputValue = 'detail'; await RunCommand.run(['--view', inputValue]); expect(createActionSpy).toHaveBeenCalled(); - expect(receivedActionDependencies.viewer.constructor.name).toEqual('ResultsDetailViewer'); + expect(receivedActionDependencies.resultsViewer.constructor.name).toEqual('ResultsDetailDisplayer'); }); it('Rejects all other values', async () => { @@ -315,7 +315,7 @@ describe('`code-analyzer run` tests', () => { it('Defaults to value of "table"', async () => { await RunCommand.run([]); expect(createActionSpy).toHaveBeenCalled(); - expect(receivedActionDependencies.viewer.constructor.name).toEqual('ResultsTableViewer'); + expect(receivedActionDependencies.resultsViewer.constructor.name).toEqual('ResultsTableDisplayer'); }); it('Can be supplied only once', async () => { @@ -331,7 +331,7 @@ describe('`code-analyzer run` tests', () => { const inputValue = 'detail'; await RunCommand.run(['-v', inputValue]); expect(createActionSpy).toHaveBeenCalled(); - expect(receivedActionDependencies.viewer.constructor.name).toEqual('ResultsDetailViewer'); + expect(receivedActionDependencies.resultsViewer.constructor.name).toEqual('ResultsDetailDisplayer'); }); }); }); diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/default-configurations/Stub1Rule1.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/default-configurations/Stub1Rule1.yml.goldfile new file mode 100644 index 000000000..2d462327c --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/default-configurations/Stub1Rule1.yml.goldfile @@ -0,0 +1,5 @@ + "Stub1Rule1": + severity: 5 + tags: + - Recommended + - CodeStyle diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/default-configurations/Stub1Rule7.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/default-configurations/Stub1Rule7.yml.goldfile new file mode 100644 index 000000000..dbc4a2420 --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/default-configurations/Stub1Rule7.yml.goldfile @@ -0,0 +1,3 @@ + "Stub1Rule7": + severity: 3 + tags: [] diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/default-configurations/StubEngine1.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/default-configurations/StubEngine1.yml.goldfile new file mode 100644 index 000000000..1226a478e --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/default-configurations/StubEngine1.yml.goldfile @@ -0,0 +1,29 @@ + + # ====================================================================== + # This is a generic overview for StubEngine1 + # It has multiple lines of text + # Whee! + # ====================================================================== + StubEngine1: + + # Whether to turn off the 'StubEngine1' engine so that it is not included when running Code Analyzer commands. + disable_engine: false + + # This is the description for Property1 + Property1: default1 + + # This is the description for Property3 + Property3: default3 + + # This is the description for Property4 + Property4: + SubProperty1: 10 + SubProperty2: true + + # This is the description for Property5 + Property5: + - arr1 + - arr2 + + # This is the description for Property6 + Property6: null diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/derivables-as-defaults/config_root.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/derivables-as-defaults/config_root.yml.goldfile new file mode 100644 index 000000000..671ccdfcc --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/derivables-as-defaults/config_root.yml.goldfile @@ -0,0 +1 @@ +config_root: null # Last calculated by the config command as: __DUMMY_CONFIG_ROOT__ diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/derivables-as-defaults/log_folder.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/derivables-as-defaults/log_folder.yml.goldfile new file mode 100644 index 000000000..23c46fc99 --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/derivables-as-defaults/log_folder.yml.goldfile @@ -0,0 +1 @@ +log_folder: null # Last calculated by the config command as: __DUMMY_LOG_FOLDER__ diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/derivables-as-non-defaults/config_root.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/derivables-as-non-defaults/config_root.yml.goldfile new file mode 100644 index 000000000..05e5e45c1 --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/derivables-as-non-defaults/config_root.yml.goldfile @@ -0,0 +1 @@ +config_root: __DUMMY_CONFIG_ROOT__ diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/derivables-as-non-defaults/log_folder.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/derivables-as-non-defaults/log_folder.yml.goldfile new file mode 100644 index 000000000..d5585725c --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/derivables-as-non-defaults/log_folder.yml.goldfile @@ -0,0 +1 @@ +log_folder: __DUMMY_LOG_FOLDER__ diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/header-comments/config_root-section.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/header-comments/config_root-section.yml.goldfile new file mode 100644 index 000000000..c166770cd --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/header-comments/config_root-section.yml.goldfile @@ -0,0 +1,4 @@ +# The absolute folder path to which all other path values in this configuration may be relative to. +# If unspecified, or if specified as null, then the value is automatically chosen to be the parent folder of your Code Analyzer +# configuration file if it exists, or the current working directory otherwise. +config_root: \ No newline at end of file diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/header-comments/engines-section.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/header-comments/engines-section.yml.goldfile new file mode 100644 index 000000000..d140e87a4 --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/header-comments/engines-section.yml.goldfile @@ -0,0 +1,5 @@ +# Engine specific custom configuration settings of the format engines.{engine_name}.{property_name} = {value} where: +# {engine_name} is the name of the engine containing the setting that you want to override. +# {property_name} is the name of a property that you would like to override. +# Each engine may have its own set of properties available to help customize that particular engine's behavior. +engines: \ No newline at end of file diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/header-comments/log_folder-section.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/header-comments/log_folder-section.yml.goldfile new file mode 100644 index 000000000..ab5bcd851 --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/header-comments/log_folder-section.yml.goldfile @@ -0,0 +1,3 @@ +# Folder where to store log files. May be an absolute path or a path relative to config_root. +# If unspecified, or if specified as null, then the value is automatically chosen to be your machine's default temporary directory. +log_folder: \ No newline at end of file diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/header-comments/rules-section.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/header-comments/rules-section.yml.goldfile new file mode 100644 index 000000000..d422b90bc --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/header-comments/rules-section.yml.goldfile @@ -0,0 +1,15 @@ +# Rule override settings of the format rules.{engine_name}.{rule_name}.{property_name} = {override_value} where: +# {engine_name} is the name of the engine containing the rule that you want to override. +# {rule_name} is the name of the rule that you want to override. +# {property_name} can either be: +# 'severity' - [Optional] The severity level value that you want to use to override the default severity level for the rule +# Possible values: 1 or 'Critical', 2 or 'High', 3 or 'Moderate', 4 or 'Low', 5 or 'Info' +# 'tags' - [Optional] The string array of tag values that you want to use to override the default tags for the rule +# ---- [Example usage]: --------------------- +# rules: +# eslint: +# sort-vars: +# severity: "Info" +# tags: ["Recommended", "Suggestion"] +# ------------------------------------------- +rules: \ No newline at end of file diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/header-comments/top-level.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/header-comments/top-level.yml.goldfile new file mode 100644 index 000000000..2858b0c8b --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/header-comments/top-level.yml.goldfile @@ -0,0 +1,4 @@ +# ====================================================================== +# CODE ANALYZER CONFIGURATION +# To learn more about this configuration, visit: __LINK_COMING_SOON__ +# ====================================================================== diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule1.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule1.yml.goldfile new file mode 100644 index 000000000..f394ffe5f --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule1.yml.goldfile @@ -0,0 +1,10 @@ + # ====================================================================== + # STUBENGINE1 ENGINE RULE OVERRIDES + # ====================================================================== + StubEngine1: + "Stub1Rule1": + severity: 5 + tags: # Modified from: ["Recommended","CodeStyle"] + - Recommended + - CodeStyle + - Beep diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule2.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule2.yml.goldfile new file mode 100644 index 000000000..ebd261cb3 --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule2.yml.goldfile @@ -0,0 +1,4 @@ + "Stub1Rule2": + severity: 2 # Modified from: 3 + tags: + - CodeStyle diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule3.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule3.yml.goldfile new file mode 100644 index 000000000..468484486 --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule3.yml.goldfile @@ -0,0 +1,5 @@ + "Stub1Rule3": + severity: 3 # Modified from: 4 + tags: # Modified from: ["BestPractices"] + - CodeStyle + - BestPractices diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule4.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule4.yml.goldfile new file mode 100644 index 000000000..468484486 --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule4.yml.goldfile @@ -0,0 +1,5 @@ + "Stub1Rule3": + severity: 3 # Modified from: 4 + tags: # Modified from: ["BestPractices"] + - CodeStyle + - BestPractices diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule7.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule7.yml.goldfile new file mode 100644 index 000000000..dbc4a2420 --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule7.yml.goldfile @@ -0,0 +1,3 @@ + "Stub1Rule7": + severity: 3 + tags: [] diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule8.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule8.yml.goldfile new file mode 100644 index 000000000..c0656a805 --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/Stub1Rule8.yml.goldfile @@ -0,0 +1,3 @@ + "Stub1Rule8": + severity: 3 + tags: [] # Modified from: ["Recommended"] diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/StubEngine1.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/StubEngine1.yml.goldfile new file mode 100644 index 000000000..73dc1cbdd --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/StubEngine1.yml.goldfile @@ -0,0 +1,29 @@ + + # ====================================================================== + # This is a generic overview for StubEngine1 + # It has multiple lines of text + # Whee! + # ====================================================================== + StubEngine1: + + # Whether to turn off the 'StubEngine1' engine so that it is not included when running Code Analyzer commands. + disable_engine: false + + # This is the description for Property1 + Property1: foo # Modified from: "default1" + + # This is the description for Property3 + Property3: baz # Modified from: "default3" + + # This is the description for Property4 + Property4: # Modified from: {"SubProperty1":10,"SubProperty2":true} + SubProperty1: 42 + SubProperty2: false + + # This is the description for Property5 + Property5: # Modified from: ["arr1","arr2"] + - bada-bing + - bada-boom + + # This is the description for Property6 + Property6: null diff --git a/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/StubEngine3.yml.goldfile b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/StubEngine3.yml.goldfile new file mode 100644 index 000000000..abb154542 --- /dev/null +++ b/test/fixtures/comparison-files/lib/actions/ConfigAction.test.ts/override-configurations/StubEngine3.yml.goldfile @@ -0,0 +1,7 @@ + # ====================================================================== + # STUBENGINE3 ENGINE CONFIGURATION + # ====================================================================== + StubEngine3: + + # Whether to turn off the 'StubEngine3' engine so that it is not included when running Code Analyzer commands. + disable_engine: true # Modified from: false diff --git a/test/fixtures/comparison-files/lib/utils/StylingUtil.test.ts/styled-comment.txt b/test/fixtures/comparison-files/lib/utils/StylingUtil.test.ts/styled-comment.txt new file mode 100644 index 000000000..ecd175826 --- /dev/null +++ b/test/fixtures/comparison-files/lib/utils/StylingUtil.test.ts/styled-comment.txt @@ -0,0 +1 @@ +this text is styled as a comment \ No newline at end of file diff --git a/test/fixtures/comparison-files/lib/viewers/ResultsViewer.test.ts/four-identical-violations-details.txt b/test/fixtures/comparison-files/lib/viewers/ResultsViewer.test.ts/four-identical-violations-details.txt index 84f3346aa..b180c09b8 100644 --- a/test/fixtures/comparison-files/lib/viewers/ResultsViewer.test.ts/four-identical-violations-details.txt +++ b/test/fixtures/comparison-files/lib/viewers/ResultsViewer.test.ts/four-identical-violations-details.txt @@ -26,8 +26,3 @@ Found 4 violation(s) across 1 file(s): message: This is a message location: __PATH_TO_SOME_FILE__:1:1 resources: https://example.com/stub1RuleA - - -=== Summary -Found 4 violation(s): -4 Low severity \ No newline at end of file diff --git a/test/fixtures/comparison-files/lib/viewers/ResultsViewer.test.ts/four-unique-violations-details.txt b/test/fixtures/comparison-files/lib/viewers/ResultsViewer.test.ts/four-unique-violations-details.txt index fab8fc8ce..35080fcf8 100644 --- a/test/fixtures/comparison-files/lib/viewers/ResultsViewer.test.ts/four-unique-violations-details.txt +++ b/test/fixtures/comparison-files/lib/viewers/ResultsViewer.test.ts/four-unique-violations-details.txt @@ -26,9 +26,3 @@ Found 4 violation(s) across 2 file(s): message: This is a message location: __PATH_TO_FILE_Z__:1:1 resources: https://example.com/stub1RuleA - - -=== Summary -Found 4 violation(s): -1 High severity -3 Low severity \ No newline at end of file diff --git a/test/fixtures/comparison-files/lib/viewers/RunSummaryViewer.test.ts/four-unique-violations-summary.txt b/test/fixtures/comparison-files/lib/viewers/RunSummaryViewer.test.ts/four-unique-violations-summary.txt new file mode 100644 index 000000000..fdfd3a17d --- /dev/null +++ b/test/fixtures/comparison-files/lib/viewers/RunSummaryViewer.test.ts/four-unique-violations-summary.txt @@ -0,0 +1,3 @@ +Found 4 violation(s): + 1 High severity violation(s) found. + 3 Low severity violation(s) found. diff --git a/test/fixtures/example-workspaces/ConfigAction.test.ts/folder-with-config/code-analyzer.yml b/test/fixtures/example-workspaces/ConfigAction.test.ts/folder-with-config/code-analyzer.yml deleted file mode 100644 index b81a09f8f..000000000 --- a/test/fixtures/example-workspaces/ConfigAction.test.ts/folder-with-config/code-analyzer.yml +++ /dev/null @@ -1,6 +0,0 @@ - -rules: - stubEngine2: - stub2RuleA: - # This rule normally does not have the Recommended tag. We're adding it. - tags: ['CodeStyle', 'Recommended', 'Security'] diff --git a/test/fixtures/example-workspaces/ConfigAction.test.ts/folder-without-config/dummy-file.txt b/test/fixtures/example-workspaces/ConfigAction.test.ts/folder-without-config/dummy-file.txt deleted file mode 100644 index 7e9642749..000000000 --- a/test/fixtures/example-workspaces/ConfigAction.test.ts/folder-without-config/dummy-file.txt +++ /dev/null @@ -1 +0,0 @@ -We can't add empty folders to Github, so this file needs to exist. diff --git a/test/fixtures/example-workspaces/ConfigAction.test.ts/optional-input-config.yml b/test/fixtures/example-workspaces/ConfigAction.test.ts/optional-input-config.yml new file mode 100644 index 000000000..eb4dee090 --- /dev/null +++ b/test/fixtures/example-workspaces/ConfigAction.test.ts/optional-input-config.yml @@ -0,0 +1,35 @@ +# Tests should replace the dummy value with whatever value they need. +config_root: __DUMMY_CONFIG_ROOT__ +# Tests should replace the dummy value with whatever value they need. +log_folder: __DUMMY_LOG_FOLDER__ +engines: + StubEngine1: + Property1: "foo" + Property2: "bar" + Property3: "baz" + Property4: + SubProperty1: 42 + SubProperty2: false + Property5: ['bada-bing', 'bada-boom'] + # Property6 is not set, so it should default to null + StubEngine3: + disable_engine: true +rules: + StubEngine1: + Stub1Rule1: + # This rule's default tags are "Recommended" and "CodeStyle", so we're adding the "Beep" tag. + tags: ["Recommended", "CodeStyle", "Beep"] + Stub1Rule2: + # This rule's default severity is "Moderate", and we're overriding it to "High" + severity: "high" + Stub1Rule3: + # This rule's only default tag is "BestPractices", so we're adding the "CodeStyle" tag. + tags: ["CodeStyle", "BestPractices"] + # This rule's default severity is "Low", and we're overriding it to "Moderate" + severity: "Moderate" + Stub1Rule5: + # This rule's default tags are "Recommended" and "CodeStyle", so we're removing the "CodeStyle" tag. + tags: ["Recommended"] + Stub1Rule8: + # This rule's default tag is "Recommended", and we're overriding it to remove its tags altogether + tags: [] diff --git a/test/lib/actions/ConfigAction.test.ts b/test/lib/actions/ConfigAction.test.ts index d5e1d6520..85f64b0d0 100644 --- a/test/lib/actions/ConfigAction.test.ts +++ b/test/lib/actions/ConfigAction.test.ts @@ -1,128 +1,645 @@ import path from 'node:path'; +import * as fs from 'node:fs'; +import * as fsp from 'node:fs/promises'; +import ansis from 'ansis'; import {CodeAnalyzerConfig} from "@salesforce/code-analyzer-core"; +import * as EngineApi from "@salesforce/code-analyzer-engine-api"; -import {CodeAnalyzerConfigFactoryImpl} from "../../../src/lib/factories/CodeAnalyzerConfigFactory"; +import {CodeAnalyzerConfigFactory} from "../../../src/lib/factories/CodeAnalyzerConfigFactory"; +import {EnginePluginsFactory} from '../../../src/lib/factories/EnginePluginsFactory'; import {ConfigAction, ConfigDependencies, ConfigInput} from '../../../src/lib/actions/ConfigAction'; +import {AnnotatedConfigModel} from '../../../src/lib/models/ConfigModel'; +import {ConfigStyledYamlViewer} from '../../../lib/lib/viewers/ConfigViewer'; -import {StubEnginePluginsFactory_withFunctionalStubEngine} from "../../stubs/StubEnginePluginsFactories"; -import {SpyConfigModel} from '../../stubs/StubConfigModel'; -import {SpyConfigViewer} from '../../stubs/SpyConfigViewer'; import {SpyConfigWriter} from '../../stubs/SpyConfigWriter'; +import {DisplayEventType, SpyDisplay} from '../../stubs/SpyDisplay'; + +const PATH_TO_EXAMPLE_WORKSPACE = path.join(__dirname, '..', '..', 'fixtures', 'example-workspaces', 'ConfigAction.test.ts'); describe('ConfigAction tests', () => { - const ORIGINAL_DIRECTORY = process.cwd(); + const PATH_TO_COMPARISON_DIR = path.join(__dirname, '..', '..', 'fixtures', 'comparison-files', 'lib', 'actions', 'ConfigAction.test.ts'); - let spyViewer: SpyConfigViewer; + let spyDisplay: SpyDisplay; let dependencies: ConfigDependencies; - beforeEach(() => { - spyViewer = new SpyConfigViewer(); - dependencies = { - logEventListeners: [], - progressEventListeners: [], - viewer: spyViewer, - configFactory: new CodeAnalyzerConfigFactoryImpl(), - modelGenerator: SpyConfigModel.fromSelection, - pluginsFactory: new StubEnginePluginsFactory_withFunctionalStubEngine() - }; - }); + describe('Config Resolution', () => { - afterEach(() => { - // These tests will involve moving into a new directory, so we should make sure to move back into the original - // directory after each test. - process.chdir(ORIGINAL_DIRECTORY); - }); + describe('When there IS NOT an existing config...', () => { - describe('When there is NOT an existing config...', () => { - beforeEach(() => { - const pathToTestDirectory = path.join(__dirname, '..', '..', 'fixtures', 'example-workspaces', 'ConfigAction.test.ts', 'folder-without-config'); - process.chdir(pathToTestDirectory); - }); + beforeEach(async () => { + spyDisplay = new SpyDisplay(); + dependencies = { + logEventListeners: [], + progressEventListeners: [], + viewer: new ConfigStyledYamlViewer(spyDisplay), + configFactory: new DefaultStubCodeAnalyzerConfigFactory(), + modelGenerator: AnnotatedConfigModel.fromSelection, + pluginsFactory: new StubEnginePluginFactory() + }; + }); - it('The default configuration is used', async () => { - await testScenario(dependencies, ['all'], 8, CodeAnalyzerConfig.withDefaults()); - }); + it('Top-level overview-comment is correct', async () => { + // ==== TESTED BEHAVIOR ==== + // Just select all rules for this test, since we don't care about the rules here. + const output = await runActionAndGetDisplayedConfig(dependencies, ['all']); - it('Rule selections properly synthesize with the default configuration', async () => { - await testScenario(dependencies, ['codestyle'], 2, CodeAnalyzerConfig.withDefaults()); - }); + // ==== ASSERTIONS ==== + const goldFileContents = await readGoldFile(path.join(PATH_TO_COMPARISON_DIR, 'header-comments', 'top-level.yml.goldfile')); + expect(output).toContain(goldFileContents); + }); - it('If a ConfigWriter is provided, it is used along with the ConfigViewer', async () => { - // We need to add a Writer to the dependencies. - const spyWriter = new SpyConfigWriter(); - dependencies.writer = spyWriter; + it.each([ + {section: 'config_root'}, + {section: 'log_folder'}, + {section: 'rules'}, + {section: 'engines'} + ])('`$section` section header-comment is correct', async ({section}) => { + // ==== TESTED BEHAVIOR ==== + // Just select all rules for this test, since we don't care about the rules here. + const output = await runActionAndGetDisplayedConfig(dependencies, ['all']); - await testScenario(dependencies, ['all'], 8, CodeAnalyzerConfig.withDefaults()); + // ==== ASSERTIONS ==== + const goldFileContents = await readGoldFile(path.join(PATH_TO_COMPARISON_DIR, 'header-comments', `${section}-section.yml.goldfile`)); + expect(output).toContain(goldFileContents); + }); - // Make sure that the Writer was provided the right type of ConfigModel. - const writerCallHistory = spyWriter.getCallHistory(); - expect(writerCallHistory).toHaveLength(1); - expect(writerCallHistory[0]).toBeInstanceOf(SpyConfigModel); + it.each([ + {prop: 'config_root'}, + {prop: 'log_folder'} + ])('Derivable property $prop is null, and derived value is in a comment', async ({prop}) => { + // ==== TESTED BEHAVIOR ==== + // Just select all rules for this test, since we don't care about the rules here. + const output = await runActionAndGetDisplayedConfig(dependencies, ['all']); - // Make sure that the Writer's ConfigModel was instantiated from the right things. - const writtenSpyConfigModel: SpyConfigModel = writerCallHistory[0] as SpyConfigModel; - // The engines we're using have a total of 8 rules. - expect(writtenSpyConfigModel.getRuleSelection().getCount()).toEqual(8); - expect(writtenSpyConfigModel.getRawConfig()).toEqual(CodeAnalyzerConfig.withDefaults()); - }); - }); + // ==== ASSERTIONS ==== + const goldFileContents = (await readGoldFile(path.join(PATH_TO_COMPARISON_DIR, 'derivables-as-defaults', `${prop}.yml.goldfile`))) + .replaceAll('__DUMMY_CONFIG_ROOT__', CodeAnalyzerConfig.withDefaults().getConfigRoot()) + .replaceAll('__DUMMY_LOG_FOLDER__', CodeAnalyzerConfig.withDefaults().getLogFolder()); + expect(output).toContain(goldFileContents); + }); - describe('When there IS an existing config...', () => { - let expectedBaseConfig: CodeAnalyzerConfig; + it('Selected rules are present and uncommented', async () => { + // ==== TESTED BEHAVIOR ==== + // Select the rules with the CodeStyle tag + const output = await runActionAndGetDisplayedConfig(dependencies, ['CodeStyle']); - beforeEach(async () => { - const pathToTestDirectory = path.join(__dirname, '..', '..', 'fixtures', 'example-workspaces', 'ConfigAction.test.ts', 'folder-with-config'); - process.chdir(pathToTestDirectory); - expectedBaseConfig = CodeAnalyzerConfig.fromFile('code-analyzer.yml'); + // ==== ASSERTIONS ==== + // Rather than exhaustively check every rule, we'll just check one, because if that one is correct then + // we can reasonably assume that the other rules are also present and correct. + const goldFileContents = await readGoldFile(path.join(PATH_TO_COMPARISON_DIR, 'default-configurations', 'Stub1Rule1.yml.goldfile')); + expect(output).toContain(goldFileContents); + }); + + it('Unselected rules are absent', async () => { + // ==== TESTED BEHAVIOR ==== + // Select the rules with the CodeStyle tag + const output = await runActionAndGetDisplayedConfig(dependencies, ['CodeStyle']); + + // ==== ASSERTIONS ==== + // Rather than exhaustively check every rule, we'll just check one, because if that rule is properly + // absent then we can reasonably assume that the other ones are too. + expect(output).not.toContain('Stub1Rule3'); + }); + + it('Engines for selected rules use their default configuration', async () => { + // ==== TESTED BEHAVIOR ==== + // Select the rules with the CodeStyle tag + const output = await runActionAndGetDisplayedConfig(dependencies, ['CodeStyle']); + + // ==== ASSERTIONS ==== + // Only one engine has rules that got returned. + const goldFileContents = await readGoldFile(path.join(PATH_TO_COMPARISON_DIR, 'default-configurations', 'StubEngine1.yml.goldfile')); + expect(output).toContain(goldFileContents); + }); + + it('Engines for unselected rules have no configuration', async () => { + // ==== TESTED BEHAVIOR ==== + // Select the rules with the CodeStyle tag + const output = await runActionAndGetDisplayedConfig(dependencies, ['CodeStyle']); + + // ==== ASSERTIONS ==== + // StubEngine2 has no rules with the CodeStyle tag. + expect(output).not.toContain('StubEngine2'); + }); + + it('Edge case: When no rules are selected, `rules` and `engines` sections are commented empty objects', async () => { + // ==== TESTED BEHAVIOR ==== + // Select the tag "NoRuleHasThisTag" + const output = await runActionAndGetDisplayedConfig(dependencies, ['NoRuleHasThisTag']); + + // ==== ASSERTIONS ==== + expect(output).toContain('rules: {} # Remove this empty object {} when you are ready to specify your first rule override'); + expect(output).toContain('engines: {} # Empty object used because rule selection returned no rules'); + }); + + it('Edge case: When a selected rule has no tags by default, `tags` is an empty array with no comment', async () => { + // ==== TESTED BEHAVIOR ==== + // Select Stub1Rule7, which has no tags, by its name directly. + const output = await runActionAndGetDisplayedConfig(dependencies, ['Stub1Rule7']); + + // ==== ASSERTIONS ==== + const goldFileContents = await readGoldFile(path.join(PATH_TO_COMPARISON_DIR, 'default-configurations', 'Stub1Rule7.yml.goldfile')); + expect(output).toContain(goldFileContents); + }); }); - it('The existing configuration overrides the default', async () => { - await testScenario(dependencies, ['all'], 8, expectedBaseConfig); + describe('When there IS an existing config...', () => { + + let stubConfigFactory: AlternativeStubCodeAnalyzerConfigFactory; + + beforeEach(async () => { + stubConfigFactory = new AlternativeStubCodeAnalyzerConfigFactory(); + spyDisplay = new SpyDisplay(); + dependencies = { + logEventListeners: [], + progressEventListeners: [], + viewer: new ConfigStyledYamlViewer(spyDisplay), + configFactory: stubConfigFactory, + modelGenerator: AnnotatedConfigModel.fromSelection, + pluginsFactory: new StubEnginePluginFactory() + }; + }); + + + it('Top-level overview-comment is correct', async () => { + // ==== SETUP ==== + // Set the dummy config properties to null; it's fine for this test. + stubConfigFactory.setDummyConfigRoot('null'); + stubConfigFactory.setDummyLogFolder('null'); + + // ==== TESTED BEHAVIOR ==== + // Just select all rules for this test, since we don't care about the rules here. + const output = await runActionAndGetDisplayedConfig(dependencies, ['all']); + + // ==== ASSERTIONS ==== + const goldFileContents = await readGoldFile(path.join(PATH_TO_COMPARISON_DIR, 'header-comments', 'top-level.yml.goldfile')); + expect(output).toContain(goldFileContents); + }); + + it.each([ + {section: 'config_root'}, + {section: 'log_folder'}, + {section: 'rules'}, + {section: 'engines'} + ])('`$section` section header-comment is correct', async ({section}) => { + // ==== SETUP ==== + // Set the dummy config properties to null; it's fine for this test. + stubConfigFactory.setDummyConfigRoot('null'); + stubConfigFactory.setDummyLogFolder('null'); + + // ==== TESTED BEHAVIOR ==== + // Just select all rules for this test, since we don't care about the rules here. + const output = await runActionAndGetDisplayedConfig(dependencies, ['all']); + + // ==== ASSERTIONS ==== + const goldFileContents = await readGoldFile(path.join(PATH_TO_COMPARISON_DIR, 'header-comments', `${section}-section.yml.goldfile`)); + expect(output).toContain(goldFileContents); + }); + + it.each([ + {prop: 'config_root'}, + {prop: 'log_folder'} + ])('If derivable property $prop is explicitly null, then output is null and derived value is in a comment', async ({prop}) => { + // ==== SETUP ==== + stubConfigFactory.setDummyConfigRoot('null'); + stubConfigFactory.setDummyLogFolder('null'); + + // ==== TESTED BEHAVIOR ==== + // Just select all rules for this test, since we don't care about the rules here. + const output = await runActionAndGetDisplayedConfig(dependencies, ['all']); + + // ==== ASSERTIONS ==== + const goldFileContents = (await readGoldFile(path.join(PATH_TO_COMPARISON_DIR, 'derivables-as-defaults', `${prop}.yml.goldfile`))) + .replaceAll('__DUMMY_CONFIG_ROOT__', CodeAnalyzerConfig.withDefaults().getConfigRoot()) + .replaceAll('__DUMMY_LOG_FOLDER__', CodeAnalyzerConfig.withDefaults().getLogFolder()); + expect(output).toContain(goldFileContents); + }); + + it.each([ + {prop: 'config_root'}, + {prop: 'log_folder'} + ])('If derivable property $prop is explicitly its default value, then output is null and derived value is in a comment', async ({prop}) => { + // ==== SETUP ==== + stubConfigFactory.setDummyConfigRoot(CodeAnalyzerConfig.withDefaults().getConfigRoot()); + stubConfigFactory.setDummyLogFolder(CodeAnalyzerConfig.withDefaults().getLogFolder()); + + // ==== TESTED BEHAVIOR ==== + // Just select all rules for this test, since we don't care about the rules here. + const output = await runActionAndGetDisplayedConfig(dependencies, ['all']); + + // ==== ASSERTIONS ==== + const goldFileContents = (await readGoldFile(path.join(PATH_TO_COMPARISON_DIR, 'derivables-as-defaults', `${prop}.yml.goldfile`))) + .replaceAll('__DUMMY_CONFIG_ROOT__', CodeAnalyzerConfig.withDefaults().getConfigRoot()) + .replaceAll('__DUMMY_LOG_FOLDER__', CodeAnalyzerConfig.withDefaults().getLogFolder()); + expect(output).toContain(goldFileContents); + }); + + it.each([ + {prop: 'config_root'}, + {prop: 'log_folder'} + ])(`When derivable property $prop input is non-null and non-default, it is rendered as-is with no comment`, async ({prop}) => { + // ==== SETUP ==== + // Make the config root and log folder both be the folder above this one. + const parentOfCurrentDirectory = path.resolve(__dirname, '..'); + stubConfigFactory.setDummyConfigRoot(parentOfCurrentDirectory); + stubConfigFactory.setDummyLogFolder(parentOfCurrentDirectory); + + // ==== TESTED BEHAVIOR ==== + // Just select all rules for this test, since we don't care about the rules here. + const output = await runActionAndGetDisplayedConfig(dependencies, ['all']); + + // ==== ASSERTIONS ==== + const goldFileContents = (await readGoldFile(path.join(PATH_TO_COMPARISON_DIR, 'derivables-as-non-defaults', `${prop}.yml.goldfile`))) + .replaceAll('__DUMMY_CONFIG_ROOT__', parentOfCurrentDirectory) + .replaceAll('__DUMMY_LOG_FOLDER__', parentOfCurrentDirectory); + expect(output).toContain(goldFileContents); + }); + + it.each([ + {overrideStatus: 'overridden tags', commentStatus: 'comment indicating original values', ruleName: 'Stub1Rule1'}, + {overrideStatus: 'overridden severity', commentStatus: 'comment indicating original values', ruleName: 'Stub1Rule2'}, + {overrideStatus: 'overridden tags and severity', commentStatus: 'comment indicating original values', ruleName: 'Stub1Rule3'}, + {overrideStatus: 'no overrides', commentStatus: 'no comment', ruleName: 'Stub1Rule4'}, + ])('Selected and enabled rules with $overrideStatus are present with $commentStatus', async ({ruleName}) => { + // ==== SETUP ==== + stubConfigFactory.setDummyConfigRoot('null'); + stubConfigFactory.setDummyLogFolder('null'); + + // ==== TESTED BEHAVIOR ==== + const output = await runActionAndGetDisplayedConfig(dependencies, ['CodeStyle']); + + // ==== ASSERTIONS ==== + const goldFileContents = await readGoldFile(path.join(PATH_TO_COMPARISON_DIR, 'override-configurations', `${ruleName}.yml.goldfile`)); + expect(output).toContain(goldFileContents); + }); + + it.each([ + {ruleType: 'Overridden and unselected rules', ruleName: 'Stub1Rule5'}, + {ruleType: 'Non-overridden and unselected rules', ruleName: 'Stub1Rule6'}, + {ruleType: 'Selected rules on disabled engines', ruleName: 'Stub3Rule1'}, + ])('$ruleType are absent', async ({ruleName}) => { + // ==== SETUP ==== + stubConfigFactory.setDummyConfigRoot('null'); + stubConfigFactory.setDummyLogFolder('null'); + + // ==== TESTED BEHAVIOR ==== + const output = await runActionAndGetDisplayedConfig(dependencies, ['CodeStyle']); + + // ==== ASSERTIONS ==== + expect(output).not.toContain(ruleName); + }); + + it('Engines for selected rules use their existing configuration', async () => { + // ==== SETUP ==== + stubConfigFactory.setDummyConfigRoot('null'); + stubConfigFactory.setDummyLogFolder('null'); + + // ==== TESTED BEHAVIOR ==== + const output = await runActionAndGetDisplayedConfig(dependencies, ['CodeStyle']); + + // ==== ASSERTIONS ==== + const goldFileContents = await readGoldFile(path.join(PATH_TO_COMPARISON_DIR, 'override-configurations', `StubEngine1.yml.goldfile`)); + expect(output).toContain(goldFileContents); + }); + + it('Engines for unselected rules have no configuration', async () => { + // ==== SETUP ==== + stubConfigFactory.setDummyConfigRoot('null'); + stubConfigFactory.setDummyLogFolder('null'); + + // ==== TESTED BEHAVIOR ==== + const output = await runActionAndGetDisplayedConfig(dependencies, ['CodeStyle']); + + // ==== ASSERTIONS ==== + expect(output).not.toContain('StubEngine2'); + }); + + it('Disabled engines with selected rules use their configuration', async () => { + // ==== SETUP ==== + stubConfigFactory.setDummyConfigRoot('null'); + stubConfigFactory.setDummyLogFolder('null'); + + // ==== TESTED BEHAVIOR ==== + const output = await runActionAndGetDisplayedConfig(dependencies, ['CodeStyle']); + + // ==== ASSERTIONS ==== + const goldFileContents = await readGoldFile(path.join(PATH_TO_COMPARISON_DIR, 'override-configurations', `StubEngine3.yml.goldfile`)); + expect(output).toContain(goldFileContents); + }); + + it('Edge Case: When no rules are selected, `rules` and `engines` sections are commented empty objects', async () => { + // ==== SETUP ==== + stubConfigFactory.setDummyConfigRoot('null'); + stubConfigFactory.setDummyLogFolder('null'); + + // ==== TESTED BEHAVIOR ==== + // Select the tag "NoRuleHasThisTag" + const output = await runActionAndGetDisplayedConfig(dependencies, ['NoRuleHasThisTag']); + + // ==== ASSERTIONS ==== + expect(output).toContain('rules: {} # Remove this empty object {} when you are ready to specify your first rule override'); + expect(output).toContain('engines: {} # Empty object used because rule selection returned no rules'); + }); + + it.each([ + {overrideStatus: 'via override', commentStatus: 'there is a comment', ruleName: 'Stub1Rule7'}, + {overrideStatus: 'by default', commentStatus: 'there is no comment', ruleName: 'Stub1Rule8'} + ])('Edge Case: When selected rule has no tags $overrideStatus, `tags` is an empty array and $commentStatus', async ({ruleName}) => { + // ==== SETUP ==== + stubConfigFactory.setDummyConfigRoot('null'); + stubConfigFactory.setDummyLogFolder('null'); + + // ==== TESTED BEHAVIOR ==== + const output = await runActionAndGetDisplayedConfig(dependencies, [ruleName]); + + // ==== ASSERTIONS ==== + const goldFileContents = await readGoldFile(path.join(PATH_TO_COMPARISON_DIR, 'override-configurations', `${ruleName}.yml.goldfile`)); + expect(output).toContain(goldFileContents); + }); }); + }); - it('Rule selections properly synthesize with the existing configuration', async () => { - await testScenario(dependencies, ['codestyle'], 3, expectedBaseConfig); + describe('File Creation', () => { + beforeEach(async () => { + spyDisplay = new SpyDisplay(); + dependencies = { + logEventListeners: [], + progressEventListeners: [], + viewer: new ConfigStyledYamlViewer(spyDisplay), + configFactory: new DefaultStubCodeAnalyzerConfigFactory(), + modelGenerator: AnnotatedConfigModel.fromSelection, + pluginsFactory: new StubEnginePluginFactory() + }; }); it('If a ConfigWriter is provided, it is used along with the ConfigViewer', async () => { + // ==== SETUP ==== // We need to add a Writer to the dependencies. const spyWriter = new SpyConfigWriter(); dependencies.writer = spyWriter; - await testScenario(dependencies, ['all'], 8, expectedBaseConfig); + // ==== TESTED BEHAVIOR ==== + await runActionAndGetDisplayedConfig(dependencies, ['all']); - // Make sure that the Writer was provided the right type of ConfigModel - const writerCallHistory = spyWriter.getCallHistory(); - expect(writerCallHistory).toHaveLength(1); - expect(writerCallHistory[0]).toBeInstanceOf(SpyConfigModel); - - // Make sure that the Writer's ConfigModel was instantiated from the right things. - const writtenSpyConfigModel: SpyConfigModel = writerCallHistory[0] as SpyConfigModel; - // The engines we're using have a total of 8 rules. - expect(writtenSpyConfigModel.getRuleSelection().getCount()).toEqual(8); - expect(writtenSpyConfigModel.getRawConfig()).toEqual(expectedBaseConfig); + // ==== ASSERTIONS ==== + expect(spyWriter.getCallHistory()).toHaveLength(1); }); }); + // ====== HELPER FUNCTIONS ====== - async function testScenario(dependencies: ConfigDependencies, ruleSelectors: string[], expectedRuleCount: number, expectedBaseConfig: CodeAnalyzerConfig): Promise { - // ==== TEST SETUP ==== - const action = ConfigAction.createAction(dependencies); + async function readGoldFile(goldFilePath: string): Promise { + return fsp.readFile(goldFilePath, {encoding: 'utf-8'}); + } - // ==== TESTED BEHAVIOR ==== + async function runActionAndGetDisplayedConfig(dependencies: ConfigDependencies, ruleSelectors: string[]): Promise { + // ==== SETUP ==== + const action = ConfigAction.createAction(dependencies); const input: ConfigInput = { 'rule-selector': ruleSelectors }; + + // ==== TESTED BEHAVIOR ==== await action.execute(input); - // ==== ASSERTIONS ==== - // Make sure the Viewer was provided the right type of ConfigModel. - const viewerCallHistory = spyViewer.getCallHistory(); - expect(viewerCallHistory).toHaveLength(1); - expect(viewerCallHistory[0]).toBeInstanceOf(SpyConfigModel); + // ==== OUTPUT PROCESSING ==== + const displayEvents = spyDisplay.getDisplayEvents(); + expect(displayEvents).toHaveLength(1); + expect(displayEvents[0].type).toEqual(DisplayEventType.LOG); + return ansis.strip(displayEvents[0].data); + } +}); + +// ====== STUBS ====== + +class DefaultStubCodeAnalyzerConfigFactory implements CodeAnalyzerConfigFactory { + public create(): CodeAnalyzerConfig { + return CodeAnalyzerConfig.withDefaults(); + } +} + +class AlternativeStubCodeAnalyzerConfigFactory implements CodeAnalyzerConfigFactory { + private dummyConfigRoot: string; + private dummyLogFolder: string; + + public setDummyConfigRoot(dummyConfigRoot: string): void { + this.dummyConfigRoot = dummyConfigRoot; + } + + public setDummyLogFolder(dummyLogFolder: string): void { + this.dummyLogFolder = dummyLogFolder; + } + + public create(): CodeAnalyzerConfig { + const rawConfigFileContents = fs.readFileSync(path.join(PATH_TO_EXAMPLE_WORKSPACE, 'optional-input-config.yml'), {encoding: 'utf-8'}); + const validatedConfigFileContents = rawConfigFileContents + .replaceAll('__DUMMY_CONFIG_ROOT__', this.dummyConfigRoot) + .replaceAll('__DUMMY_LOG_FOLDER__', this.dummyLogFolder); + return CodeAnalyzerConfig.fromYamlString(validatedConfigFileContents, process.cwd()); + } +} + +class StubEnginePluginFactory implements EnginePluginsFactory { + public create(): EngineApi.EnginePlugin[] { + return [ + new StubEnginePlugin() + ]; + } +} + +class StubEnginePlugin extends EngineApi.EnginePluginV1 { + + private readonly createdEngines: Map = new Map(); + + private readonly descriptionsByEngine: {[key: string]: EngineApi.ConfigDescription} = { + StubEngine1: { + overview: 'This is a generic overview for StubEngine1\nIt has multiple lines of text\nWhee!', + fieldDescriptions: { + 'Property1': 'This is the description for Property1', + // Property2 is undocumented + 'Property3': 'This is the description for Property3', + 'Property4': 'This is the description for Property4', + 'Property5': 'This is the description for Property5', + 'Property6': 'This is the description for Property6' + } + } + // StubEngine2 has no overview and no documented properties. + // StubEngine3 also has no overview or documented properties. + } + + public getAvailableEngineNames(): string[] { + return ['StubEngine1', 'StubEngine2', 'StubEngine3']; + } + + public createEngine(engineName: string, config: EngineApi.ConfigObject): Promise { + if (engineName === 'StubEngine1') { + this.createdEngines.set(engineName, new StubEngine1(config)); + } else if (engineName === 'StubEngine2') { + this.createdEngines.set(engineName, new StubEngine2(config)); + } else if (engineName === 'StubEngine3') { + this.createdEngines.set(engineName, new StubEngine3(config)); + } else { + throw new Error(`No engine named ${engineName}`); + } + return Promise.resolve(this.getCreatedEngine(engineName)); + } + + public createEngineConfig(engineName: string, configValueExtractor: EngineApi.ConfigValueExtractor): Promise { + if (engineName === 'StubEngine1') { + return Promise.resolve({ + Property1: configValueExtractor.extractString('Property1', 'default1')!, + Property2: configValueExtractor.extractString('Property2', 'default2')!, + Property3: configValueExtractor.extractString('Property3', 'default3')!, + Property4: configValueExtractor.extractObject('Property4', {SubProperty1: 10, SubProperty2: true})!, + Property5: configValueExtractor.extractArray('Property5', EngineApi.ValueValidator.validateString, ['arr1', 'arr2'])! + }); + } else if (engineName === 'StubEngine2') { + return Promise.resolve(configValueExtractor.getObject()); + } else if (engineName === 'StubEngine3') { + return Promise.resolve(configValueExtractor.getObject()); + } else { + throw new Error('Cannot configure unknown engine ' + engineName); + } + } + + public describeEngineConfig(engineName: string): EngineApi.ConfigDescription { + return this.descriptionsByEngine[engineName] ?? {}; + } + + public getCreatedEngine(engineName: string): EngineApi.Engine { + if (this.createdEngines.has(engineName)) { + return this.createdEngines.get(engineName) as EngineApi.Engine; + } + throw new Error(`Engine named ${engineName} not yet instantiated`); + } +} + +class StubEngine1 extends EngineApi.Engine { + + public constructor(_config: EngineApi.ConfigObject) { + super(); + } - // Make sure that the Viewer's ConfigModel was instantiated from the right things. - const spyConfigModel: SpyConfigModel = viewerCallHistory[0] as SpyConfigModel; - expect(spyConfigModel.getRuleSelection().getCount()).toEqual(expectedRuleCount); - expect(spyConfigModel.getRawConfig()).toEqual(expectedBaseConfig); + public getName(): string { + return 'StubEngine1'; + } + + public describeRules(): Promise { + return Promise.resolve([{ + name: 'Stub1Rule1', + severityLevel: EngineApi.SeverityLevel.Info, + type: EngineApi.RuleType.Standard, + tags: ["Recommended", "CodeStyle"], + description: 'Generic description', + resourceUrls: [] + }, { + name: 'Stub1Rule2', + severityLevel: EngineApi.SeverityLevel.Moderate, + type: EngineApi.RuleType.Standard, + tags: ["CodeStyle"], + description: 'Generic description', + resourceUrls: [] + }, { + name: 'Stub1Rule3', + severityLevel: EngineApi.SeverityLevel.Low, + type: EngineApi.RuleType.Standard, + tags: ["BestPractices"], + description: 'Generic description', + resourceUrls: [] + }, { + name: 'Stub1Rule4', + severityLevel: EngineApi.SeverityLevel.High, + type: EngineApi.RuleType.Standard, + tags: ["CodeStyle"], + description: 'Generic description', + resourceUrls: [] + }, { + name: 'Stub1Rule5', + severityLevel: EngineApi.SeverityLevel.High, + type: EngineApi.RuleType.Standard, + tags: ["Recommended", "CodeStyle"], + description: 'Generic description', + resourceUrls: [] + }, { + name: 'Stub1Rule6', + severityLevel: EngineApi.SeverityLevel.Low, + type: EngineApi.RuleType.Standard, + tags: ["Recommended"], + description: 'Generic description', + resourceUrls: [] + }, { + name: 'Stub1Rule7', + severityLevel: EngineApi.SeverityLevel.Moderate, + type: EngineApi.RuleType.Standard, + tags: [], + description: 'Generic description', + resourceUrls: [] + }, { + name: 'Stub1Rule8', + severityLevel: EngineApi.SeverityLevel.Moderate, + type: EngineApi.RuleType.Standard, + tags: ['Recommended'], + description: 'Generic description', + resourceUrls: [] + }]); + } + + public runRules(): Promise { + return Promise.resolve({ + violations: [] + }); + } +} + +class StubEngine2 extends EngineApi.Engine { + public constructor(_config: EngineApi.ConfigObject) { + super(); + } + + public getName(): string { + return 'StubEngine2'; + } + + public describeRules(): Promise { + return Promise.resolve([{ + name: 'Stub2Rule1', + severityLevel: EngineApi.SeverityLevel.Moderate, + type: EngineApi.RuleType.Standard, + tags: ['Security'], + description: 'Generic description', + resourceUrls: [] + }]); + } + + public runRules(): Promise { + return Promise.resolve({ + violations: [] + }); + } +} + +class StubEngine3 extends EngineApi.Engine { + public constructor(_config: EngineApi.ConfigObject) { + super(); + } + + public getName(): string { + return 'StubEngine3'; + } + + public describeRules(): Promise { + return Promise.resolve([{ + name: 'Stub3Rule1', + severityLevel: EngineApi.SeverityLevel.Moderate, + type: EngineApi.RuleType.Standard, + tags: ['CodeStyle'], + description: 'Generic description', + resourceUrls: [] + }]); + } + + public runRules(): Promise { + return Promise.resolve({ + violations: [] + }); } -}) +} diff --git a/test/lib/actions/RunAction.test.ts b/test/lib/actions/RunAction.test.ts index ad24c2a54..70a6cefa3 100644 --- a/test/lib/actions/RunAction.test.ts +++ b/test/lib/actions/RunAction.test.ts @@ -2,6 +2,7 @@ import path from 'node:path'; import {SfError} from '@salesforce/core'; import {SeverityLevel} from '@salesforce/code-analyzer-core'; import {SpyResultsViewer} from '../../stubs/SpyResultsViewer'; +import {SpyRunSummaryViewer} from '../../stubs/SpyRunSummaryViewer'; import {SpyResultsWriter} from '../../stubs/SpyResultsWriter'; import {StubDefaultConfigFactory} from '../../stubs/StubCodeAnalyzerConfigFactories'; import {ConfigurableStubEnginePlugin1, StubEngine1, TargetDependentEngine1} from '../../stubs/StubEnginePlugins'; @@ -18,7 +19,8 @@ describe('RunAction tests', () => { let stubEnginePlugin: ConfigurableStubEnginePlugin1; let pluginsFactory: StubEnginePluginsFactory_withPreconfiguredStubEngines; let writer: SpyResultsWriter; - let viewer: SpyResultsViewer; + let resultsViewer: SpyResultsViewer; + let runSummaryViewer: SpyRunSummaryViewer; let dependencies: RunDependencies; let action: RunAction; @@ -30,9 +32,10 @@ describe('RunAction tests', () => { pluginsFactory = new StubEnginePluginsFactory_withPreconfiguredStubEngines(); pluginsFactory.addPreconfiguredEnginePlugin(stubEnginePlugin); - // Set up the writer and viewer. + // Set up the writer and viewers. writer = new SpyResultsWriter(); - viewer = new SpyResultsViewer(); + resultsViewer = new SpyResultsViewer(); + runSummaryViewer = new SpyRunSummaryViewer(); // Initialize our dependency object. dependencies = { @@ -41,7 +44,8 @@ describe('RunAction tests', () => { logEventListeners: [], progressListeners: [], writer, - viewer + resultsViewer, + runSummaryViewer }; // Create the action. action = RunAction.createAction(dependencies); @@ -58,7 +62,9 @@ describe('RunAction tests', () => { // Use the selector provided by the test 'rule-selector': [selector], // Use the current directory, for convenience. - 'workspace': ['.'] + 'workspace': ['.'], + // Outfiles can just be an empty list. + 'output-file': [] }; // Configure the engine to return a violation for the first expected rule. engine1.resultsToReturn = { @@ -86,8 +92,10 @@ describe('RunAction tests', () => { // Verify that the expected results were passed into the Viewer and Writer. expect(writer.getCallHistory()[0].getViolationCount()).toEqual(1); expect(writer.getCallHistory()[0].getViolations()[0].getMessage()).toEqual('Fake message'); - expect(viewer.getCallHistory()[0].getViolationCount()).toEqual(1); - expect(viewer.getCallHistory()[0].getViolations()[0].getMessage()).toEqual('Fake message'); + expect(resultsViewer.getCallHistory()[0].getViolationCount()).toEqual(1); + expect(resultsViewer.getCallHistory()[0].getViolations()[0].getMessage()).toEqual('Fake message'); + expect(runSummaryViewer.getCallHistory()[0].results.getViolationCount()).toEqual(1); + expect(runSummaryViewer.getCallHistory()[0].results.getViolations()[0].getMessage()).toEqual('Fake message'); }); it('Engines with target-dependent rules run the right rules', async () => { @@ -101,7 +109,8 @@ describe('RunAction tests', () => { const input: RunInput = { // Select only rules in the target-dependent engine. "rule-selector": [targetDependentEngine.getName()], - "workspace": targetedFilesAndFolders + "workspace": targetedFilesAndFolders, + 'output-file': [] }; // ==== TESTED BEHAVIOR ==== @@ -132,7 +141,8 @@ describe('RunAction tests', () => { // Use 'all' to select all rules. 'rule-selector': ['all'], // Use the current directory, for convenience. - 'workspace': ['.'] + 'workspace': ['.'], + 'output-file': [] }; // Configure the engine to return a violation for a rule with a known severity. engine1.resultsToReturn = { @@ -171,7 +181,8 @@ describe('RunAction tests', () => { // Use 'all' to select all rules. 'rule-selector': ['all'], // Use the current directory, for convenience. - 'workspace': ['.'] + 'workspace': ['.'], + 'output-file': [] }; // Configure the engine to return a violation for a rule with a known severity. engine1.resultsToReturn = { @@ -205,14 +216,16 @@ describe('RunAction tests', () => { logEventListeners: [], progressListeners: [], writer, - viewer + resultsViewer, + runSummaryViewer }; // Instantiate our action, intentionally using a different instance than the one set up in // the before-each. const action = RunAction.createAction(dependencies); const input: RunInput = { 'rule-selector': ['all'], - 'workspace': ['.'] + 'workspace': ['.'], + 'output-file': [] }; // ==== TESTED BEHAVIOR ==== diff --git a/test/lib/factories/EnginePluginsFactory.test.ts b/test/lib/factories/EnginePluginsFactory.test.ts index ea6e2086b..72559c364 100644 --- a/test/lib/factories/EnginePluginsFactory.test.ts +++ b/test/lib/factories/EnginePluginsFactory.test.ts @@ -6,9 +6,10 @@ describe('EnginePluginsFactoryImpl', () => { const pluginsFactory = new EnginePluginsFactoryImpl(); const enginePlugins = pluginsFactory.create(); - expect(enginePlugins).toHaveLength(3); + expect(enginePlugins).toHaveLength(4); expect(enginePlugins[0].getAvailableEngineNames()).toEqual(['eslint']); - expect(enginePlugins[1].getAvailableEngineNames()).toEqual(['retire-js']); - expect(enginePlugins[2].getAvailableEngineNames()).toEqual(['regex']); + expect(enginePlugins[1].getAvailableEngineNames()).toEqual(['pmd']); + expect(enginePlugins[2].getAvailableEngineNames()).toEqual(['retire-js']); + expect(enginePlugins[3].getAvailableEngineNames()).toEqual(['regex']); }); }); diff --git a/test/lib/listeners/ProgressEventListener.test.ts b/test/lib/listeners/ProgressEventListener.test.ts index 4ac6f77a7..781beb6bf 100644 --- a/test/lib/listeners/ProgressEventListener.test.ts +++ b/test/lib/listeners/ProgressEventListener.test.ts @@ -90,6 +90,42 @@ describe('ProgressEventListener implementations', () => { expect(endEvent.data).toContain('done'); }); + it('Properly aggregates percentages across multiple Cores', async () => { + // ==== TEST SETUP ==== + // Instantiate a second Core and assign the standard functional stubs to both instances. + const secondCore: CodeAnalyzer = new CodeAnalyzer(CodeAnalyzerConfig.withDefaults()); + const factory1 = new StubEnginePluginsFactory_withFunctionalStubEngine(); + for (const enginePlugin of factory1.create()) { + await codeAnalyzer.addEnginePlugin(enginePlugin); + } + const factory2 = new StubEnginePluginsFactory_withFunctionalStubEngine(); + for (const enginePlugin of factory2.create()) { + await secondCore.addEnginePlugin(enginePlugin); + } + + // We don't want automated ticking to mess with the messages, so just turn it off for now. + spinner = new RuleSelectionProgressSpinner(spyDisplay, -1); + + // ==== TESTED BEHAVIOR ==== + // Start listening to the spinners, select some rules in each one, then stop listening. + spinner.listen(codeAnalyzer, secondCore); + await codeAnalyzer.selectRules(['all']); + await secondCore.selectRules(['all']); + spinner.stopListening(); + + // ==== ASSERTIONS ==== + const displayEvents = spyDisplay.getDisplayEvents(); + // The first event should have been the Spinner Start setting completion to 0. + const startEvent = displayEvents[0]; + expect(startEvent).toHaveProperty('type', DisplayEventType.SPINNER_START); + expect(startEvent.data).toContain(`Eligible engines: ${codeAnalyzer.getEngineNames().join(', ')}; Completion: 0%; Elapsed time: 0s`); + const percentagesInOrder = getDedupedCompletionPercentages(displayEvents.slice(0, displayEvents.length - 1)); + expect(percentagesInOrder).toEqual([0, 12, 25, 50, 62, 75, 100]); + const endEvent = displayEvents[displayEvents.length - 1]; + expect(endEvent).toHaveProperty('type', DisplayEventType.SPINNER_STOP); + expect(endEvent.data).toContain('done'); + }); + it('Properly interleaves progress updates with ticking', async () => { // ==== TEST SETUP ==== // Use a plugin with engines that can be configured to wait a certain amount of time between sending their @@ -298,6 +334,28 @@ describe('ProgressEventListener implementations', () => { expect(endEvent).toHaveProperty('type', DisplayEventType.SPINNER_STOP); expect(endEvent.data).toContain('done'); }, 10000); + + // There's currently no need for this Spinner to accept multiple Cores, so we've opted to not implement that + // functionality. We're locking that in with a test, and we can change this test if we ever decide to support it. + it('Rejects multiple Cores', async () => { + // ==== TEST SETUP ==== + // Instantiate a second Core and assign the standard functional stubs to both instances. + const secondCore: CodeAnalyzer = new CodeAnalyzer(CodeAnalyzerConfig.withDefaults()); + const factory1 = new StubEnginePluginsFactory_withFunctionalStubEngine(); + for (const enginePlugin of factory1.create()) { + await codeAnalyzer.addEnginePlugin(enginePlugin); + } + const factory2 = new StubEnginePluginsFactory_withFunctionalStubEngine(); + for (const enginePlugin of factory2.create()) { + await secondCore.addEnginePlugin(enginePlugin); + } + // The spinner's tick time doesn't matter for this test, so just turn it off. + spinner = new EngineRunProgressSpinner(spyDisplay, -1); + + // ==== TESTED BEHAVIOR ==== + // Attempt to listen to both Cores, and verify that the expected error is thrown. + expect(() => spinner.listen(codeAnalyzer, secondCore)).toThrow(/Developer Error:/); + }); }); /** diff --git a/test/lib/models/ConfigModel.test.ts b/test/lib/models/ConfigModel.test.ts deleted file mode 100644 index ff5ab3fc1..000000000 --- a/test/lib/models/ConfigModel.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import {DummyConfigModel, DUMMY_CONFIG, OutputFormat} from '../../../src/lib/models/ConfigModel'; - -describe('ConfigModel implementations', () => { - describe('DummyConfigModel', () => { - it('Outputs the Dummy Config', () => { - expect(new DummyConfigModel().toFormattedOutput(OutputFormat.YAML)).toEqual(DUMMY_CONFIG); - }); - }); -}); diff --git a/test/lib/utils/StylingUtil.test.ts b/test/lib/utils/StylingUtil.test.ts index e128c7b01..b348d21b2 100644 --- a/test/lib/utils/StylingUtil.test.ts +++ b/test/lib/utils/StylingUtil.test.ts @@ -1,6 +1,6 @@ import * as fs from 'node:fs/promises'; import path from 'node:path'; -import {toStyledHeaderAndBody, toStyledHeader, toStyledPropertyList} from '../../../src/lib/utils/StylingUtil'; +import {makeGrey, toStyledHeaderAndBody, toStyledHeader, toStyledPropertyList, indent} from '../../../src/lib/utils/StylingUtil'; const PATH_TO_COMPARISON_FILES = path.resolve('.', 'test', 'fixtures', 'comparison-files', 'lib', 'utils', 'StylingUtil.test.ts'); @@ -24,13 +24,23 @@ describe('StylingUtil tests', () => { }); }); + describe('#makeGrey()', () => { + it('Properly styles input', async () => { + const input = 'this text is styled as a comment'; + const styledComment = makeGrey(input); + + const expectedOutput = (await fs.readFile(path.join(PATH_TO_COMPARISON_FILES, 'styled-comment.txt'), {encoding: 'utf-8'})); + expect(styledComment).toEqual(expectedOutput); + + }); + }); + describe('#toStyledHeader()', () => { it('Properly styles input', async () => { const input: string = 'SAMPLE HEADER TEXT'; const styledHeader = toStyledHeader(input); - const expectedHeader = (await fs.readFile(path.join(PATH_TO_COMPARISON_FILES, 'styled-header.txt'), {encoding: 'utf-8'})) - ; + const expectedHeader = (await fs.readFile(path.join(PATH_TO_COMPARISON_FILES, 'styled-header.txt'), {encoding: 'utf-8'})); expect(styledHeader).toEqual(expectedHeader); }); @@ -100,4 +110,10 @@ describe('StylingUtil tests', () => { expect(actualOutput).toEqual(''); }); }); + + describe('#indent()', () => { + it('Applies indentation to non-empty lines only', () => { + expect(indent('line1\n\nline3\n line4\n ')).toEqual(' line1\n\n line3\n line4\n '); + }); + }); }); diff --git a/test/lib/viewers/ConfigViewer.test.ts b/test/lib/viewers/ConfigViewer.test.ts index e539e5986..e4288cc7f 100644 --- a/test/lib/viewers/ConfigViewer.test.ts +++ b/test/lib/viewers/ConfigViewer.test.ts @@ -1,4 +1,4 @@ -import {ConfigRawYamlViewer} from '../../../src/lib/viewers/ConfigViewer'; +import {ConfigStyledYamlViewer} from '../../../src/lib/viewers/ConfigViewer'; import {DisplayEventType, SpyDisplay} from '../../stubs/SpyDisplay'; import {StubConfigModel} from '../../stubs/StubConfigModel'; @@ -9,14 +9,14 @@ describe('ConfigViewer implementations', () => { spyDisplay = new SpyDisplay(); }) - describe('ConfigRawYamlViewer', () => { - let viewer: ConfigRawYamlViewer; + describe('ConfigStyledYamlViewer', () => { + let viewer: ConfigStyledYamlViewer; beforeEach(() => { - viewer = new ConfigRawYamlViewer(spyDisplay); + viewer = new ConfigStyledYamlViewer(spyDisplay); }) - it('When given a config, outputs it as raw YAML', () => { + it('When given a config, outputs it as styled YAML with a leading newline', () => { // ==== TEST SETUP ==== // Instantiate the config model. const configModel = new StubConfigModel(); @@ -28,10 +28,8 @@ describe('ConfigViewer implementations', () => { // ==== ASSERTIONS ==== const displayEvents = spyDisplay.getDisplayEvents(); expect(displayEvents).toHaveLength(1); - expect(displayEvents).toEqual([{ - type: DisplayEventType.LOG, - data: `Results formatted as YAML` - }]); + expect(displayEvents[0].type).toEqual(DisplayEventType.LOG); + expect(displayEvents[0].data).toEqual(`\n# This is a leading comment\nResults formatted as STYLED_YAML`); }); }); }); diff --git a/test/lib/viewers/ResultsViewer.test.ts b/test/lib/viewers/ResultsViewer.test.ts index 62f04d324..cb4c74ce9 100644 --- a/test/lib/viewers/ResultsViewer.test.ts +++ b/test/lib/viewers/ResultsViewer.test.ts @@ -6,8 +6,8 @@ import {RuleDescription, Violation} from '@salesforce/code-analyzer-engine-api'; import { findLongestCommonParentFolderOf, - ResultsDetailViewer, - ResultsTableViewer + ResultsDetailDisplayer, + ResultsTableDisplayer } from '../../../src/lib/viewers/ResultsViewer'; import {BundleName, getMessage} from '../../../src/lib/messages'; import {DisplayEvent, DisplayEventType, SpyDisplay} from '../../stubs/SpyDisplay'; @@ -41,14 +41,14 @@ describe('ResultsViewer implementations', () => { rule2 = (await engine1.describeRules())[1]; }); - describe('ResultsDetailViewer', () => { - let viewer: ResultsDetailViewer; + describe('ResultsDetailDisplayer', () => { + let viewer: ResultsDetailDisplayer; beforeEach(() => { - viewer = new ResultsDetailViewer(spyDisplay); + viewer = new ResultsDetailDisplayer(spyDisplay); }); - it('When given no results, outputs top-level count and nothing else', async () => { + it('When given no results, outputs nothing', async () => { // ==== TEST SETUP ==== // "Run" the plugin without assigning any violations. const workspace = await codeAnalyzerCore.createWorkspace(['package.json']); @@ -60,13 +60,9 @@ describe('ResultsViewer implementations', () => { viewer.view(results); // ==== ASSERTIONS ==== - // Assert against our messages. + // Expect nothing to have been displayed. const displayEvents = spyDisplay.getDisplayEvents(); - expect(displayEvents).toHaveLength(1); - expect(displayEvents).toEqual([{ - type: DisplayEventType.LOG, - data: getMessage(BundleName.ResultsViewer, 'summary.found-no-results') - }]); + expect(displayEvents).toHaveLength(0); }); it(`When there are violations, all are shown`, async () => { @@ -86,7 +82,7 @@ describe('ResultsViewer implementations', () => { viewer.view(results); // ==== ASSERTIONS ==== - // Compare the text in the events with the text in our comparison file. + // Compare the text in the events with the text in our comparison files. const actualDisplayEvents: DisplayEvent[] = spyDisplay.getDisplayEvents(); for (const event of actualDisplayEvents) { expect(event.type).toEqual(DisplayEventType.LOG); @@ -95,7 +91,7 @@ describe('ResultsViewer implementations', () => { const actualEventText = ansis.strip(actualDisplayEvents.map(e => e.data).join('\n')); const expectedViolationDetails = (await readComparisonFile('four-identical-violations-details.txt')) .replace(/__PATH_TO_SOME_FILE__/g, PATH_TO_SOME_FILE); - expect(actualEventText).toEqual(expectedViolationDetails); + expect(actualEventText).toContain(expectedViolationDetails); }); // The reasoning behind this sorting order is so that the Detail view can function as a "show me the N most @@ -134,35 +130,32 @@ describe('ResultsViewer implementations', () => { const expectedViolationDetails = (await readComparisonFile('four-unique-violations-details.txt')) .replace(/__PATH_TO_FILE_A__/g, PATH_TO_FILE_A) .replace(/__PATH_TO_FILE_Z__/g, PATH_TO_FILE_Z); - expect(actualEventText).toEqual(expectedViolationDetails); + expect(actualEventText).toContain(expectedViolationDetails); }); }); - describe('ResultsTableViewer', () => { - let viewer: ResultsTableViewer; + describe('ResultsTableDisplayer', () => { + let viewer: ResultsTableDisplayer; beforeEach(() => { - viewer = new ResultsTableViewer(spyDisplay); + viewer = new ResultsTableDisplayer(spyDisplay); }) - it('When given no results, outputs top-level count and nothing else', async () => { - // ==== SETUP ==== + it('When given no results, outputs nothing', async () => { + // ==== TEST SETUP ==== + // "Run" the plugin without assigning any violations. const workspace = await codeAnalyzerCore.createWorkspace(['package.json']); - const rules = await codeAnalyzerCore.selectRules(['all']); - // Run without having assigned any violations. + const rules = await codeAnalyzerCore.selectRules(['all'], {workspace}); const results = await codeAnalyzerCore.run(rules, {workspace}); - // ==== TESTED BEHAVIOR ==== - // Pass the empty results object into the viewer. + // ==== TESTED METHOD ==== + // Pass the empty result object into the viewer. viewer.view(results); // ==== ASSERTIONS ==== + // Expect nothing to have been displayed. const displayEvents = spyDisplay.getDisplayEvents(); - expect(displayEvents).toHaveLength(1); - expect(displayEvents).toEqual([{ - type: DisplayEventType.LOG, - data: getMessage(BundleName.ResultsViewer, 'summary.found-no-results') - }]); + expect(displayEvents).toHaveLength(0); }); it('When given violations, they are displayed as a table', async () => { @@ -170,7 +163,7 @@ describe('ResultsViewer implementations', () => { // This test doesn't care about sorting, so just assign our engine several copies of the same violation. const violations: Violation[] = repeatViolation( createViolation(rule1.name, PATH_TO_SOME_FILE, 1, 1), - 10 + 4 ); engine1.resultsToReturn = {violations}; const workspace = await codeAnalyzerCore.createWorkspace([PATH_TO_SOME_FILE]); @@ -183,11 +176,11 @@ describe('ResultsViewer implementations', () => { // ==== ASSERTIONS ==== const displayEvents = spyDisplay.getDisplayEvents(); - expect(displayEvents).toHaveLength(2); + expect(displayEvents).toHaveLength(3); expect(displayEvents[0].type).toEqual(DisplayEventType.LOG); - expect(displayEvents[0].data).toEqual(getMessage(BundleName.ResultsViewer, 'summary.table.found-results', [10, 1, PATH_TO_SAMPLE_CODE])); + expect(displayEvents[0].data).toEqual(getMessage(BundleName.ResultsViewer, 'summary.table.found-results', [4, 1, PATH_TO_SAMPLE_CODE])); expect(displayEvents[1].type).toEqual(DisplayEventType.TABLE); - expect(displayEvents[1].data).toEqual(`{"columns":["#","Severity","Rule","Location","Message"],"rows":[{"num":1,"location":"someFile.cls:1:1","rule":"stubEngine1:stub1RuleA","severity":"4 (Low)","message":"This is a message"},{"num":2,"location":"someFile.cls:1:1","rule":"stubEngine1:stub1RuleA","severity":"4 (Low)","message":"This is a message"},{"num":3,"location":"someFile.cls:1:1","rule":"stubEngine1:stub1RuleA","severity":"4 (Low)","message":"This is a message"},{"num":4,"location":"someFile.cls:1:1","rule":"stubEngine1:stub1RuleA","severity":"4 (Low)","message":"This is a message"},{"num":5,"location":"someFile.cls:1:1","rule":"stubEngine1:stub1RuleA","severity":"4 (Low)","message":"This is a message"},{"num":6,"location":"someFile.cls:1:1","rule":"stubEngine1:stub1RuleA","severity":"4 (Low)","message":"This is a message"},{"num":7,"location":"someFile.cls:1:1","rule":"stubEngine1:stub1RuleA","severity":"4 (Low)","message":"This is a message"},{"num":8,"location":"someFile.cls:1:1","rule":"stubEngine1:stub1RuleA","severity":"4 (Low)","message":"This is a message"},{"num":9,"location":"someFile.cls:1:1","rule":"stubEngine1:stub1RuleA","severity":"4 (Low)","message":"This is a message"},{"num":10,"location":"someFile.cls:1:1","rule":"stubEngine1:stub1RuleA","severity":"4 (Low)","message":"This is a message"}]}`); + expect(displayEvents[1].data).toEqual(`{"columns":["#","Severity","Rule","Location","Message"],"rows":[{"num":1,"location":"someFile.cls:1:1","rule":"stubEngine1:stub1RuleA","severity":"4 (Low)","message":"This is a message"},{"num":2,"location":"someFile.cls:1:1","rule":"stubEngine1:stub1RuleA","severity":"4 (Low)","message":"This is a message"},{"num":3,"location":"someFile.cls:1:1","rule":"stubEngine1:stub1RuleA","severity":"4 (Low)","message":"This is a message"},{"num":4,"location":"someFile.cls:1:1","rule":"stubEngine1:stub1RuleA","severity":"4 (Low)","message":"This is a message"}]}`); }); // The reasoning behind this sorting order is so that the Table view can function as a "show me all the violations @@ -215,7 +208,7 @@ describe('ResultsViewer implementations', () => { // ==== ASSERTIONS ==== const displayEvents = spyDisplay.getDisplayEvents(); - expect(displayEvents).toHaveLength(2); + expect(displayEvents).toHaveLength(3); expect(displayEvents[0].type).toEqual(DisplayEventType.LOG); expect(displayEvents[0].data).toEqual(getMessage(BundleName.ResultsViewer, 'summary.table.found-results', [4, 2, PATH_TO_SAMPLE_CODE])); expect(displayEvents[1].type).toEqual(DisplayEventType.TABLE); diff --git a/test/lib/viewers/RuleViewer.test.ts b/test/lib/viewers/RuleViewer.test.ts index 5dc663e4e..2c5eb7f7f 100644 --- a/test/lib/viewers/RuleViewer.test.ts +++ b/test/lib/viewers/RuleViewer.test.ts @@ -1,7 +1,7 @@ import fs from 'node:fs'; import path from 'path'; import ansis from 'ansis'; -import {RuleDetailViewer, RuleTableViewer} from '../../../src/lib/viewers/RuleViewer'; +import {RuleDetailDisplayer, RuleTableDisplayer} from '../../../src/lib/viewers/RuleViewer'; import {DisplayEventType, SpyDisplay} from '../../stubs/SpyDisplay'; import * as StubRules from '../../stubs/StubRules'; @@ -9,10 +9,10 @@ const PATH_TO_COMPARISON_FILES = path.resolve(__dirname, '..', '..', '..', 'test 'viewers', 'RuleViewer.test.ts'); describe('RuleViewer implementations', () => { - describe('RuleDetailViewer', () => { + describe('RuleDetailDisplayer', () => { it('When given no rules, outputs summary and nothing else', () => { const display = new SpyDisplay(); - const viewer = new RuleDetailViewer(display); + const viewer = new RuleDetailDisplayer(display); viewer.view([]); @@ -26,7 +26,7 @@ describe('RuleViewer implementations', () => { it('When given one rule, outputs correct summary and correctly styled rule data', () => { const display = new SpyDisplay(); - const viewer = new RuleDetailViewer(display); + const viewer = new RuleDetailDisplayer(display); const rule = new StubRules.StubRule1(); viewer.view([ @@ -47,7 +47,7 @@ describe('RuleViewer implementations', () => { it('When given multiple rules, outputs correct summary and correctly styled rule data', () => { const display = new SpyDisplay(); - const viewer = new RuleDetailViewer(display); + const viewer = new RuleDetailDisplayer(display); const rule1 = new StubRules.StubRule1(); const rule2 = new StubRules.StubRule2(); @@ -69,10 +69,10 @@ describe('RuleViewer implementations', () => { }); }); - describe('RuleTableViewer', () => { + describe('RuleTableDisplayer', () => { it('When given no rules, outputs summary and nothing else', () => { const display = new SpyDisplay(); - const viewer = new RuleTableViewer(display); + const viewer = new RuleTableDisplayer(display); viewer.view([]); @@ -86,7 +86,7 @@ describe('RuleViewer implementations', () => { it('When given one rule, outputs correct summary and rule data', () => { const display = new SpyDisplay(); - const viewer = new RuleTableViewer(display); + const viewer = new RuleTableDisplayer(display); const rule = new StubRules.StubRule1(); viewer.view([ @@ -115,7 +115,7 @@ describe('RuleViewer implementations', () => { it('When given multiple rules, outputs correct summary and rule data', () => { const display = new SpyDisplay(); - const viewer = new RuleTableViewer(display); + const viewer = new RuleTableDisplayer(display); const rule1 = new StubRules.StubRule1(); const rule2 = new StubRules.StubRule2(); diff --git a/test/lib/viewers/RunSummaryViewer.test.ts b/test/lib/viewers/RunSummaryViewer.test.ts new file mode 100644 index 000000000..76056302d --- /dev/null +++ b/test/lib/viewers/RunSummaryViewer.test.ts @@ -0,0 +1,149 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import ansis from 'ansis'; +import {CodeAnalyzer, CodeAnalyzerConfig, RunResults} from '@salesforce/code-analyzer-core'; +import {Violation} from "@salesforce/code-analyzer-engine-api"; + +import {RunSummaryDisplayer} from '../../../src/lib/viewers/RunSummaryViewer'; + +import {DisplayEvent, DisplayEventType, SpyDisplay} from "../../stubs/SpyDisplay"; +import {FunctionalStubEnginePlugin1, StubEngine1} from '../../stubs/StubEnginePlugins'; + +const PATH_TO_COMPARISON_FILES = path.resolve(__dirname, '..', '..', '..', 'test', 'fixtures', 'comparison-files', 'lib', + 'viewers', 'RunSummaryViewer.test.ts'); +const PATH_TO_SAMPLE_CODE = path.resolve(__dirname, '..', '..', '..', 'test', 'sample-code'); +const PATH_TO_OUTFILE1 = path.join('the', 'specifics', 'of', 'this', 'path', 'do', 'not', 'matter.csv'); +const PATH_TO_OUTFILE2 = path.join('neither', 'do', 'the', 'specifics', 'of', 'this', 'one.json'); +const PATH_TO_FILE_A = path.resolve(PATH_TO_SAMPLE_CODE, 'fileA.cls'); +const PATH_TO_FILE_Z = path.resolve(PATH_TO_SAMPLE_CODE, 'fileZ.cls'); + +describe('RunSummaryViewer implementations', () => { + // We need SpyDisplays for the cases where inputs are empty and non-empty. + const emptyInputsSpyDisplay: SpyDisplay = new SpyDisplay(); + const nonEmptyInputsSpyDisplay: SpyDisplay = new SpyDisplay(); + + // We need a config, core, and plugin. + const config: CodeAnalyzerConfig = CodeAnalyzerConfig.withDefaults(); + const codeAnalyzerCore: CodeAnalyzer = new CodeAnalyzer(config); + const stubEnginePlugin: FunctionalStubEnginePlugin1 = new FunctionalStubEnginePlugin1(); + + let emptyResults: RunResults; + let nonEmptyResults: RunResults; + + // The tests are similar enough that we can do all of the setup in the `beforeAll()` functions. + beforeAll(async () => { + // Add the stub plugin to the core. + await codeAnalyzerCore.addEnginePlugin(stubEnginePlugin); + + // Run the core once without assigning any violations. + const workspace = await codeAnalyzerCore.createWorkspace(['package.json']); + const rules = await codeAnalyzerCore.selectRules(['all'], {workspace}); + emptyResults = await codeAnalyzerCore.run(rules, {workspace}); + + // Assign some violations and then run the core again. + const engine1 = stubEnginePlugin.getCreatedEngine(`stubEngine1`) as StubEngine1; + const rule1 = (await engine1.describeRules())[0]; + const rule2 = (await engine1.describeRules())[1]; + const violations: Violation[] = [ + // A low-severity violation late in a high-alphabetical file. + createViolation(rule1.name, PATH_TO_FILE_A, 20, 1), + // A low-severity violation early in the same high-alphabetical file. + createViolation(rule1.name, PATH_TO_FILE_A, 1, 1), + // A low-severity violation early in a low-alphabetical file. + createViolation(rule1.name, PATH_TO_FILE_Z, 1, 1), + // A high-severity violation later in the same low-alphabetical file. + createViolation(rule2.name, PATH_TO_FILE_Z, 20, 1) + ]; + engine1.resultsToReturn = {violations}; + + nonEmptyResults = await codeAnalyzerCore.run(rules, {workspace}); + }); + + describe('RunSummaryDisplayer', () => { + // Create Displayers for the empty-input and non-empty-input cases. + const emptyInputsDisplayer: RunSummaryDisplayer = new RunSummaryDisplayer(emptyInputsSpyDisplay); + const nonEmptyInputsDisplayer: RunSummaryDisplayer = new RunSummaryDisplayer(nonEmptyInputsSpyDisplay); + + let emptyInputsDisplayEvents: DisplayEvent[]; + let nonEmptyInputsDisplayEvents: DisplayEvent[]; + + beforeAll(() => { + emptyInputsDisplayer.view(emptyResults, config, []); + emptyInputsDisplayEvents = emptyInputsSpyDisplay.getDisplayEvents(); + nonEmptyInputsDisplayer.view(nonEmptyResults, config, [PATH_TO_OUTFILE1, PATH_TO_OUTFILE2]) + nonEmptyInputsDisplayEvents = nonEmptyInputsSpyDisplay.getDisplayEvents(); + }); + + describe('Formatting', () => { + it('Output has correct header', () => { + expect(ansis.strip(emptyInputsDisplayEvents[0].data)).toEqual('=== Summary'); + expect(ansis.strip(nonEmptyInputsDisplayEvents[0].data)).toEqual('=== Summary'); + }); + + it('Output has correct log level', () => { + for (const event of emptyInputsDisplayEvents) { + expect(event.type).toEqual(DisplayEventType.LOG); + } + for (const event of nonEmptyInputsDisplayEvents) { + expect(event.type).toEqual(DisplayEventType.LOG); + } + }); + }); + + describe('Results breakdown', () => { + it('When no violations exist, correctly outputs this fact', () => { + const contents = emptyInputsDisplayEvents.map(e => e.data).join('\n'); + expect(contents).toContain('Found 0 violations.\n'); + }); + + it('When violations exist, they are broken down by severity', async () => { + const contents = nonEmptyInputsDisplayEvents.map(e => e.data).join('\n'); + const expectedViolationSummary = await readComparisonFile('four-unique-violations-summary.txt'); + expect(contents).toContain(expectedViolationSummary); + }); + }); + + describe('Outfile breakdown', () => { + it('When no outfiles were provided, correctly outputs this fact', () => { + const contents = emptyInputsDisplayEvents.map(e => e.data).join('\n'); + expect(contents).toContain('No results files were specified.\n'); + }); + + it('When outfiles were provided, they are properly listed', () => { + const contents = nonEmptyInputsDisplayEvents.map(e => e.data).join('\n'); + const expectation = `Results written to:\n` + + ` ${PATH_TO_OUTFILE1}\n` + + ` ${PATH_TO_OUTFILE2}\n`; + expect(contents).toContain(expectation); + }); + }); + + describe('Logging breakdown', () => { + it('Logfile is correctly displayed', () => { + const expectation = `Additional log information written to:\n` + + ` ${config.getLogFolder()}`; + const emptyContents = emptyInputsDisplayEvents.map(e => e.data).join('\n'); + const nonEmptyContents = nonEmptyInputsDisplayEvents.map(e => e.data).join('\n'); + expect(emptyContents).toContain(expectation); + expect(nonEmptyContents).toContain(expectation); + }); + }); + }); +}); + +function createViolation(ruleName: string, file: string, startLine: number, startColumn: number): Violation { + return { + ruleName, + message: 'This is a message', + codeLocations: [{ + file, + startLine, + startColumn + }], + primaryLocationIndex: 0 + }; +} + +function readComparisonFile(fileName: string): Promise { + return fs.readFile(path.join(PATH_TO_COMPARISON_FILES, fileName), {encoding: 'utf-8'}); +} diff --git a/test/lib/writers/ConfigWriter.test.ts b/test/lib/writers/ConfigWriter.test.ts index 6b9632c3d..90ad33e32 100644 --- a/test/lib/writers/ConfigWriter.test.ts +++ b/test/lib/writers/ConfigWriter.test.ts @@ -20,8 +20,8 @@ describe('ConfigWriter implementations', () => { }) it.each([ - {ext: '.yaml', expectedOutput: `Results formatted as ${OutputFormat.YAML}`}, - {ext: '.yml', expectedOutput: `Results formatted as ${OutputFormat.YAML}`} + {ext: '.yaml', expectedOutput: `# This is a leading comment\nResults formatted as ${OutputFormat.RAW_YAML}`}, + {ext: '.yml', expectedOutput: `# This is a leading comment\nResults formatted as ${OutputFormat.RAW_YAML}`} ])('Accepts and outputs valid file format: *$ext', ({ext, expectedOutput}) => { const validFile = `beep${ext}`; const configFileWriter = ConfigFileWriter.fromFile(validFile); diff --git a/test/stubs/SpyRunSummaryViewer.ts b/test/stubs/SpyRunSummaryViewer.ts new file mode 100644 index 000000000..3b993d326 --- /dev/null +++ b/test/stubs/SpyRunSummaryViewer.ts @@ -0,0 +1,14 @@ +import {CodeAnalyzerConfig, RunResults} from '@salesforce/code-analyzer-core'; +import {RunSummaryViewer} from '../../src/lib/viewers/RunSummaryViewer' + +export class SpyRunSummaryViewer implements RunSummaryViewer { + private callHistory: {results: RunResults, config: CodeAnalyzerConfig, outfiles: string[]}[] = []; + + public view(results: RunResults, config: CodeAnalyzerConfig, outfiles: string[]): void { + this.callHistory.push({results, config, outfiles}); + } + + public getCallHistory(): {results: RunResults, config: CodeAnalyzerConfig, outfiles: string[]}[] { + return this.callHistory; + } +} diff --git a/test/stubs/StubConfigModel.ts b/test/stubs/StubConfigModel.ts index 94f212299..70af2c5e4 100644 --- a/test/stubs/StubConfigModel.ts +++ b/test/stubs/StubConfigModel.ts @@ -1,34 +1,8 @@ -import {CodeAnalyzerConfig, RuleSelection} from "@salesforce/code-analyzer-core"; import {ConfigModel, OutputFormat} from '../../src/lib/models/ConfigModel'; export class StubConfigModel implements ConfigModel { public toFormattedOutput(format: OutputFormat): string { - return `Results formatted as ${format}` - } -} - -export class SpyConfigModel implements ConfigModel { - private readonly rawConfig: CodeAnalyzerConfig; - private readonly ruleSelection: RuleSelection; - - private constructor(rawConfig: CodeAnalyzerConfig, ruleSelection: RuleSelection) { - this.rawConfig = rawConfig; - this.ruleSelection = ruleSelection; - } - - public toFormattedOutput(format: OutputFormat): string { - return `Results formatted as ${format}`; - } - - public getRawConfig(): CodeAnalyzerConfig { - return this.rawConfig; - } - - public getRuleSelection(): RuleSelection { - return this.ruleSelection; - } - - public static fromSelection(rawConfig: CodeAnalyzerConfig, ruleSelection: RuleSelection): SpyConfigModel { - return new SpyConfigModel(rawConfig, ruleSelection); + return `# This is a leading comment\n` + + `Results formatted as ${format}` } } diff --git a/yarn.lock b/yarn.lock index 2aa8ddf50..68963753f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -78,521 +78,523 @@ "@smithy/util-utf8" "^2.0.0" tslib "^2.6.2" -"@aws-sdk/client-cloudfront@^3.624.0": - version "3.637.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudfront/-/client-cloudfront-3.637.0.tgz#55d3f08e9655544a34c221ef432fcc860dca7929" - integrity sha512-yuKqFTRlRHAA5mVds/ufO8n6ENcCFAW0D6nXldQcMOCXIuz1UQRE5qyEwajIdDGtFnyeZVf5fWRMx3ylWC7h0Q== +"@aws-sdk/client-cloudfront@^3.645.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudfront/-/client-cloudfront-3.654.0.tgz#1ea9f1eeb03d390c6e49a9b64c2238438f349f9e" + integrity sha512-AdSusqY4WJVcHpOMPRSpQpcknhOSUfxfAPYaIFkeyFduIGsl5lxvvMfhT4c+37nHFNhP9od1BxZZuaa6idgEDg== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.637.0" - "@aws-sdk/client-sts" "3.637.0" - "@aws-sdk/core" "3.635.0" - "@aws-sdk/credential-provider-node" "3.637.0" - "@aws-sdk/middleware-host-header" "3.620.0" - "@aws-sdk/middleware-logger" "3.609.0" - "@aws-sdk/middleware-recursion-detection" "3.620.0" - "@aws-sdk/middleware-user-agent" "3.637.0" - "@aws-sdk/region-config-resolver" "3.614.0" - "@aws-sdk/types" "3.609.0" - "@aws-sdk/util-endpoints" "3.637.0" - "@aws-sdk/util-user-agent-browser" "3.609.0" - "@aws-sdk/util-user-agent-node" "3.614.0" - "@aws-sdk/xml-builder" "3.609.0" - "@smithy/config-resolver" "^3.0.5" - "@smithy/core" "^2.4.0" - "@smithy/fetch-http-handler" "^3.2.4" - "@smithy/hash-node" "^3.0.3" - "@smithy/invalid-dependency" "^3.0.3" - "@smithy/middleware-content-length" "^3.0.5" - "@smithy/middleware-endpoint" "^3.1.0" - "@smithy/middleware-retry" "^3.0.15" - "@smithy/middleware-serde" "^3.0.3" - "@smithy/middleware-stack" "^3.0.3" - "@smithy/node-config-provider" "^3.1.4" - "@smithy/node-http-handler" "^3.1.4" - "@smithy/protocol-http" "^4.1.0" - "@smithy/smithy-client" "^3.2.0" - "@smithy/types" "^3.3.0" - "@smithy/url-parser" "^3.0.3" + "@aws-sdk/client-sso-oidc" "3.654.0" + "@aws-sdk/client-sts" "3.654.0" + "@aws-sdk/core" "3.654.0" + "@aws-sdk/credential-provider-node" "3.654.0" + "@aws-sdk/middleware-host-header" "3.654.0" + "@aws-sdk/middleware-logger" "3.654.0" + "@aws-sdk/middleware-recursion-detection" "3.654.0" + "@aws-sdk/middleware-user-agent" "3.654.0" + "@aws-sdk/region-config-resolver" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@aws-sdk/util-endpoints" "3.654.0" + "@aws-sdk/util-user-agent-browser" "3.654.0" + "@aws-sdk/util-user-agent-node" "3.654.0" + "@aws-sdk/xml-builder" "3.654.0" + "@smithy/config-resolver" "^3.0.8" + "@smithy/core" "^2.4.3" + "@smithy/fetch-http-handler" "^3.2.7" + "@smithy/hash-node" "^3.0.6" + "@smithy/invalid-dependency" "^3.0.6" + "@smithy/middleware-content-length" "^3.0.8" + "@smithy/middleware-endpoint" "^3.1.3" + "@smithy/middleware-retry" "^3.0.18" + "@smithy/middleware-serde" "^3.0.6" + "@smithy/middleware-stack" "^3.0.6" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/node-http-handler" "^3.2.2" + "@smithy/protocol-http" "^4.1.3" + "@smithy/smithy-client" "^3.3.2" + "@smithy/types" "^3.4.2" + "@smithy/url-parser" "^3.0.6" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.15" - "@smithy/util-defaults-mode-node" "^3.0.15" - "@smithy/util-endpoints" "^2.0.5" - "@smithy/util-middleware" "^3.0.3" - "@smithy/util-retry" "^3.0.3" - "@smithy/util-stream" "^3.1.3" + "@smithy/util-defaults-mode-browser" "^3.0.18" + "@smithy/util-defaults-mode-node" "^3.0.18" + "@smithy/util-endpoints" "^2.1.2" + "@smithy/util-middleware" "^3.0.6" + "@smithy/util-retry" "^3.0.6" + "@smithy/util-stream" "^3.1.6" "@smithy/util-utf8" "^3.0.0" - "@smithy/util-waiter" "^3.1.2" + "@smithy/util-waiter" "^3.1.5" tslib "^2.6.2" -"@aws-sdk/client-s3@^3.633.0": - version "3.637.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.637.0.tgz#2879bd8ddef84397b65fa9e61bca10bb4ba08211" - integrity sha512-y6UC94fsMvhKbf0dzfnjVP1HePeGjplfcYfilZU1COIJLyTkMcUv4XcT4I407CGIrvgEafONHkiC09ygqUauNA== +"@aws-sdk/client-s3@^3.651.1": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.654.0.tgz#a4a5a341959a4bab71b4a3326a76e59fb0d50ecd" + integrity sha512-EsyeZJhkZD2VMdZpNt4NhlQ3QUAF24gMC+5w2wpGg6Yw+Bv7VLdg1t3PkTQovriJX1KTJAYHcGAuy92OFmWIng== dependencies: "@aws-crypto/sha1-browser" "5.2.0" "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.637.0" - "@aws-sdk/client-sts" "3.637.0" - "@aws-sdk/core" "3.635.0" - "@aws-sdk/credential-provider-node" "3.637.0" - "@aws-sdk/middleware-bucket-endpoint" "3.620.0" - "@aws-sdk/middleware-expect-continue" "3.620.0" - "@aws-sdk/middleware-flexible-checksums" "3.620.0" - "@aws-sdk/middleware-host-header" "3.620.0" - "@aws-sdk/middleware-location-constraint" "3.609.0" - "@aws-sdk/middleware-logger" "3.609.0" - "@aws-sdk/middleware-recursion-detection" "3.620.0" - "@aws-sdk/middleware-sdk-s3" "3.635.0" - "@aws-sdk/middleware-ssec" "3.609.0" - "@aws-sdk/middleware-user-agent" "3.637.0" - "@aws-sdk/region-config-resolver" "3.614.0" - "@aws-sdk/signature-v4-multi-region" "3.635.0" - "@aws-sdk/types" "3.609.0" - "@aws-sdk/util-endpoints" "3.637.0" - "@aws-sdk/util-user-agent-browser" "3.609.0" - "@aws-sdk/util-user-agent-node" "3.614.0" - "@aws-sdk/xml-builder" "3.609.0" - "@smithy/config-resolver" "^3.0.5" - "@smithy/core" "^2.4.0" - "@smithy/eventstream-serde-browser" "^3.0.6" - "@smithy/eventstream-serde-config-resolver" "^3.0.3" - "@smithy/eventstream-serde-node" "^3.0.5" - "@smithy/fetch-http-handler" "^3.2.4" - "@smithy/hash-blob-browser" "^3.1.2" - "@smithy/hash-node" "^3.0.3" - "@smithy/hash-stream-node" "^3.1.2" - "@smithy/invalid-dependency" "^3.0.3" - "@smithy/md5-js" "^3.0.3" - "@smithy/middleware-content-length" "^3.0.5" - "@smithy/middleware-endpoint" "^3.1.0" - "@smithy/middleware-retry" "^3.0.15" - "@smithy/middleware-serde" "^3.0.3" - "@smithy/middleware-stack" "^3.0.3" - "@smithy/node-config-provider" "^3.1.4" - "@smithy/node-http-handler" "^3.1.4" - "@smithy/protocol-http" "^4.1.0" - "@smithy/smithy-client" "^3.2.0" - "@smithy/types" "^3.3.0" - "@smithy/url-parser" "^3.0.3" + "@aws-sdk/client-sso-oidc" "3.654.0" + "@aws-sdk/client-sts" "3.654.0" + "@aws-sdk/core" "3.654.0" + "@aws-sdk/credential-provider-node" "3.654.0" + "@aws-sdk/middleware-bucket-endpoint" "3.654.0" + "@aws-sdk/middleware-expect-continue" "3.654.0" + "@aws-sdk/middleware-flexible-checksums" "3.654.0" + "@aws-sdk/middleware-host-header" "3.654.0" + "@aws-sdk/middleware-location-constraint" "3.654.0" + "@aws-sdk/middleware-logger" "3.654.0" + "@aws-sdk/middleware-recursion-detection" "3.654.0" + "@aws-sdk/middleware-sdk-s3" "3.654.0" + "@aws-sdk/middleware-ssec" "3.654.0" + "@aws-sdk/middleware-user-agent" "3.654.0" + "@aws-sdk/region-config-resolver" "3.654.0" + "@aws-sdk/signature-v4-multi-region" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@aws-sdk/util-endpoints" "3.654.0" + "@aws-sdk/util-user-agent-browser" "3.654.0" + "@aws-sdk/util-user-agent-node" "3.654.0" + "@aws-sdk/xml-builder" "3.654.0" + "@smithy/config-resolver" "^3.0.8" + "@smithy/core" "^2.4.3" + "@smithy/eventstream-serde-browser" "^3.0.9" + "@smithy/eventstream-serde-config-resolver" "^3.0.6" + "@smithy/eventstream-serde-node" "^3.0.8" + "@smithy/fetch-http-handler" "^3.2.7" + "@smithy/hash-blob-browser" "^3.1.5" + "@smithy/hash-node" "^3.0.6" + "@smithy/hash-stream-node" "^3.1.5" + "@smithy/invalid-dependency" "^3.0.6" + "@smithy/md5-js" "^3.0.6" + "@smithy/middleware-content-length" "^3.0.8" + "@smithy/middleware-endpoint" "^3.1.3" + "@smithy/middleware-retry" "^3.0.18" + "@smithy/middleware-serde" "^3.0.6" + "@smithy/middleware-stack" "^3.0.6" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/node-http-handler" "^3.2.2" + "@smithy/protocol-http" "^4.1.3" + "@smithy/smithy-client" "^3.3.2" + "@smithy/types" "^3.4.2" + "@smithy/url-parser" "^3.0.6" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.15" - "@smithy/util-defaults-mode-node" "^3.0.15" - "@smithy/util-endpoints" "^2.0.5" - "@smithy/util-middleware" "^3.0.3" - "@smithy/util-retry" "^3.0.3" - "@smithy/util-stream" "^3.1.3" + "@smithy/util-defaults-mode-browser" "^3.0.18" + "@smithy/util-defaults-mode-node" "^3.0.18" + "@smithy/util-endpoints" "^2.1.2" + "@smithy/util-middleware" "^3.0.6" + "@smithy/util-retry" "^3.0.6" + "@smithy/util-stream" "^3.1.6" "@smithy/util-utf8" "^3.0.0" - "@smithy/util-waiter" "^3.1.2" + "@smithy/util-waiter" "^3.1.5" tslib "^2.6.2" -"@aws-sdk/client-sso-oidc@3.637.0": - version "3.637.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz#d7e22ce6627c3285bf311e6c9e64c22b99bbd76a" - integrity sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw== +"@aws-sdk/client-sso-oidc@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.654.0.tgz#9c02ce49f95203e8b99e896cf0dca6e4858e2da7" + integrity sha512-gbHrKsEnaAtmkNCVQzLyiqMzpDaThV/bWl/ODEklI+t6stW3Pe3oDMstEHLfJ6JU5g8sYnx4VLuxlnJMtUkvPw== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.635.0" - "@aws-sdk/credential-provider-node" "3.637.0" - "@aws-sdk/middleware-host-header" "3.620.0" - "@aws-sdk/middleware-logger" "3.609.0" - "@aws-sdk/middleware-recursion-detection" "3.620.0" - "@aws-sdk/middleware-user-agent" "3.637.0" - "@aws-sdk/region-config-resolver" "3.614.0" - "@aws-sdk/types" "3.609.0" - "@aws-sdk/util-endpoints" "3.637.0" - "@aws-sdk/util-user-agent-browser" "3.609.0" - "@aws-sdk/util-user-agent-node" "3.614.0" - "@smithy/config-resolver" "^3.0.5" - "@smithy/core" "^2.4.0" - "@smithy/fetch-http-handler" "^3.2.4" - "@smithy/hash-node" "^3.0.3" - "@smithy/invalid-dependency" "^3.0.3" - "@smithy/middleware-content-length" "^3.0.5" - "@smithy/middleware-endpoint" "^3.1.0" - "@smithy/middleware-retry" "^3.0.15" - "@smithy/middleware-serde" "^3.0.3" - "@smithy/middleware-stack" "^3.0.3" - "@smithy/node-config-provider" "^3.1.4" - "@smithy/node-http-handler" "^3.1.4" - "@smithy/protocol-http" "^4.1.0" - "@smithy/smithy-client" "^3.2.0" - "@smithy/types" "^3.3.0" - "@smithy/url-parser" "^3.0.3" + "@aws-sdk/core" "3.654.0" + "@aws-sdk/credential-provider-node" "3.654.0" + "@aws-sdk/middleware-host-header" "3.654.0" + "@aws-sdk/middleware-logger" "3.654.0" + "@aws-sdk/middleware-recursion-detection" "3.654.0" + "@aws-sdk/middleware-user-agent" "3.654.0" + "@aws-sdk/region-config-resolver" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@aws-sdk/util-endpoints" "3.654.0" + "@aws-sdk/util-user-agent-browser" "3.654.0" + "@aws-sdk/util-user-agent-node" "3.654.0" + "@smithy/config-resolver" "^3.0.8" + "@smithy/core" "^2.4.3" + "@smithy/fetch-http-handler" "^3.2.7" + "@smithy/hash-node" "^3.0.6" + "@smithy/invalid-dependency" "^3.0.6" + "@smithy/middleware-content-length" "^3.0.8" + "@smithy/middleware-endpoint" "^3.1.3" + "@smithy/middleware-retry" "^3.0.18" + "@smithy/middleware-serde" "^3.0.6" + "@smithy/middleware-stack" "^3.0.6" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/node-http-handler" "^3.2.2" + "@smithy/protocol-http" "^4.1.3" + "@smithy/smithy-client" "^3.3.2" + "@smithy/types" "^3.4.2" + "@smithy/url-parser" "^3.0.6" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.15" - "@smithy/util-defaults-mode-node" "^3.0.15" - "@smithy/util-endpoints" "^2.0.5" - "@smithy/util-middleware" "^3.0.3" - "@smithy/util-retry" "^3.0.3" + "@smithy/util-defaults-mode-browser" "^3.0.18" + "@smithy/util-defaults-mode-node" "^3.0.18" + "@smithy/util-endpoints" "^2.1.2" + "@smithy/util-middleware" "^3.0.6" + "@smithy/util-retry" "^3.0.6" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/client-sso@3.637.0": - version "3.637.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.637.0.tgz#ae152759a5e1e576e1df6b8f4edaf59796e1758e" - integrity sha512-+KjLvgX5yJYROWo3TQuwBJlHCY0zz9PsLuEolmXQn0BVK1L/m9GteZHtd+rEdAoDGBpE0Xqjy1oz5+SmtsaRUw== +"@aws-sdk/client-sso@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.654.0.tgz#6d800f0cfca97f8acf1fbf46cdac46169201267b" + integrity sha512-4kBxs2IzCDtj6a6lRXa/lXK5wWpMGzwKtb+HMXf/rJYVM6x7wYRzc1hYrOd3DYkFQ/sR3dUFj+0mTP0os3aAbA== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.635.0" - "@aws-sdk/middleware-host-header" "3.620.0" - "@aws-sdk/middleware-logger" "3.609.0" - "@aws-sdk/middleware-recursion-detection" "3.620.0" - "@aws-sdk/middleware-user-agent" "3.637.0" - "@aws-sdk/region-config-resolver" "3.614.0" - "@aws-sdk/types" "3.609.0" - "@aws-sdk/util-endpoints" "3.637.0" - "@aws-sdk/util-user-agent-browser" "3.609.0" - "@aws-sdk/util-user-agent-node" "3.614.0" - "@smithy/config-resolver" "^3.0.5" - "@smithy/core" "^2.4.0" - "@smithy/fetch-http-handler" "^3.2.4" - "@smithy/hash-node" "^3.0.3" - "@smithy/invalid-dependency" "^3.0.3" - "@smithy/middleware-content-length" "^3.0.5" - "@smithy/middleware-endpoint" "^3.1.0" - "@smithy/middleware-retry" "^3.0.15" - "@smithy/middleware-serde" "^3.0.3" - "@smithy/middleware-stack" "^3.0.3" - "@smithy/node-config-provider" "^3.1.4" - "@smithy/node-http-handler" "^3.1.4" - "@smithy/protocol-http" "^4.1.0" - "@smithy/smithy-client" "^3.2.0" - "@smithy/types" "^3.3.0" - "@smithy/url-parser" "^3.0.3" + "@aws-sdk/core" "3.654.0" + "@aws-sdk/middleware-host-header" "3.654.0" + "@aws-sdk/middleware-logger" "3.654.0" + "@aws-sdk/middleware-recursion-detection" "3.654.0" + "@aws-sdk/middleware-user-agent" "3.654.0" + "@aws-sdk/region-config-resolver" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@aws-sdk/util-endpoints" "3.654.0" + "@aws-sdk/util-user-agent-browser" "3.654.0" + "@aws-sdk/util-user-agent-node" "3.654.0" + "@smithy/config-resolver" "^3.0.8" + "@smithy/core" "^2.4.3" + "@smithy/fetch-http-handler" "^3.2.7" + "@smithy/hash-node" "^3.0.6" + "@smithy/invalid-dependency" "^3.0.6" + "@smithy/middleware-content-length" "^3.0.8" + "@smithy/middleware-endpoint" "^3.1.3" + "@smithy/middleware-retry" "^3.0.18" + "@smithy/middleware-serde" "^3.0.6" + "@smithy/middleware-stack" "^3.0.6" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/node-http-handler" "^3.2.2" + "@smithy/protocol-http" "^4.1.3" + "@smithy/smithy-client" "^3.3.2" + "@smithy/types" "^3.4.2" + "@smithy/url-parser" "^3.0.6" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.15" - "@smithy/util-defaults-mode-node" "^3.0.15" - "@smithy/util-endpoints" "^2.0.5" - "@smithy/util-middleware" "^3.0.3" - "@smithy/util-retry" "^3.0.3" + "@smithy/util-defaults-mode-browser" "^3.0.18" + "@smithy/util-defaults-mode-node" "^3.0.18" + "@smithy/util-endpoints" "^2.1.2" + "@smithy/util-middleware" "^3.0.6" + "@smithy/util-retry" "^3.0.6" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/client-sts@3.637.0": - version "3.637.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz#6dcde6640d8a5e60dd4a2df8557284a0226d182c" - integrity sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw== +"@aws-sdk/client-sts@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.654.0.tgz#574194804834f6158cc06d44ab517ec6e4c1c1c2" + integrity sha512-tyHa8jsBy+/NQZFHm6Q2Q09Vi9p3EH4yPy6PU8yPewpi2klreObtrUd0anJa6nzjS9SSuqnlZWsRic3cQ4QwCg== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.637.0" - "@aws-sdk/core" "3.635.0" - "@aws-sdk/credential-provider-node" "3.637.0" - "@aws-sdk/middleware-host-header" "3.620.0" - "@aws-sdk/middleware-logger" "3.609.0" - "@aws-sdk/middleware-recursion-detection" "3.620.0" - "@aws-sdk/middleware-user-agent" "3.637.0" - "@aws-sdk/region-config-resolver" "3.614.0" - "@aws-sdk/types" "3.609.0" - "@aws-sdk/util-endpoints" "3.637.0" - "@aws-sdk/util-user-agent-browser" "3.609.0" - "@aws-sdk/util-user-agent-node" "3.614.0" - "@smithy/config-resolver" "^3.0.5" - "@smithy/core" "^2.4.0" - "@smithy/fetch-http-handler" "^3.2.4" - "@smithy/hash-node" "^3.0.3" - "@smithy/invalid-dependency" "^3.0.3" - "@smithy/middleware-content-length" "^3.0.5" - "@smithy/middleware-endpoint" "^3.1.0" - "@smithy/middleware-retry" "^3.0.15" - "@smithy/middleware-serde" "^3.0.3" - "@smithy/middleware-stack" "^3.0.3" - "@smithy/node-config-provider" "^3.1.4" - "@smithy/node-http-handler" "^3.1.4" - "@smithy/protocol-http" "^4.1.0" - "@smithy/smithy-client" "^3.2.0" - "@smithy/types" "^3.3.0" - "@smithy/url-parser" "^3.0.3" + "@aws-sdk/client-sso-oidc" "3.654.0" + "@aws-sdk/core" "3.654.0" + "@aws-sdk/credential-provider-node" "3.654.0" + "@aws-sdk/middleware-host-header" "3.654.0" + "@aws-sdk/middleware-logger" "3.654.0" + "@aws-sdk/middleware-recursion-detection" "3.654.0" + "@aws-sdk/middleware-user-agent" "3.654.0" + "@aws-sdk/region-config-resolver" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@aws-sdk/util-endpoints" "3.654.0" + "@aws-sdk/util-user-agent-browser" "3.654.0" + "@aws-sdk/util-user-agent-node" "3.654.0" + "@smithy/config-resolver" "^3.0.8" + "@smithy/core" "^2.4.3" + "@smithy/fetch-http-handler" "^3.2.7" + "@smithy/hash-node" "^3.0.6" + "@smithy/invalid-dependency" "^3.0.6" + "@smithy/middleware-content-length" "^3.0.8" + "@smithy/middleware-endpoint" "^3.1.3" + "@smithy/middleware-retry" "^3.0.18" + "@smithy/middleware-serde" "^3.0.6" + "@smithy/middleware-stack" "^3.0.6" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/node-http-handler" "^3.2.2" + "@smithy/protocol-http" "^4.1.3" + "@smithy/smithy-client" "^3.3.2" + "@smithy/types" "^3.4.2" + "@smithy/url-parser" "^3.0.6" "@smithy/util-base64" "^3.0.0" "@smithy/util-body-length-browser" "^3.0.0" "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.15" - "@smithy/util-defaults-mode-node" "^3.0.15" - "@smithy/util-endpoints" "^2.0.5" - "@smithy/util-middleware" "^3.0.3" - "@smithy/util-retry" "^3.0.3" + "@smithy/util-defaults-mode-browser" "^3.0.18" + "@smithy/util-defaults-mode-node" "^3.0.18" + "@smithy/util-endpoints" "^2.1.2" + "@smithy/util-middleware" "^3.0.6" + "@smithy/util-retry" "^3.0.6" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/core@3.635.0": - version "3.635.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.635.0.tgz#74b7d0d7fa3aa39f87ea5cf4e6c97d4d84f4ef14" - integrity sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg== - dependencies: - "@smithy/core" "^2.4.0" - "@smithy/node-config-provider" "^3.1.4" - "@smithy/property-provider" "^3.1.3" - "@smithy/protocol-http" "^4.1.0" - "@smithy/signature-v4" "^4.1.0" - "@smithy/smithy-client" "^3.2.0" - "@smithy/types" "^3.3.0" - "@smithy/util-middleware" "^3.0.3" +"@aws-sdk/core@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.654.0.tgz#9ccc3618af04b4ff198433a22e27d7db14890917" + integrity sha512-4Rwx7BVaNaFqmXBDmnOkMbyuIFFbpZ+ru4lr660p45zY1QoNNSalechfoRffcokLFOZO+VWEJkdcorPUUU993w== + dependencies: + "@smithy/core" "^2.4.3" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/property-provider" "^3.1.6" + "@smithy/protocol-http" "^4.1.3" + "@smithy/signature-v4" "^4.1.3" + "@smithy/smithy-client" "^3.3.2" + "@smithy/types" "^3.4.2" + "@smithy/util-middleware" "^3.0.6" fast-xml-parser "4.4.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-env@3.620.1": - version "3.620.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz#d4692c49a65ebc11dae3f7f8b053fee9268a953c" - integrity sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg== +"@aws-sdk/credential-provider-env@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.654.0.tgz#5773a9d969ede7e30059472b26c9e39b3992cc0a" + integrity sha512-kogsx3Ql81JouHS7DkheCDU9MYAvK0AokxjcshDveGmf7BbgbWCA8Fnb9wjQyNDaOXNvkZu8Z8rgkX91z324/w== dependencies: - "@aws-sdk/types" "3.609.0" - "@smithy/property-provider" "^3.1.3" - "@smithy/types" "^3.3.0" + "@aws-sdk/types" "3.654.0" + "@smithy/property-provider" "^3.1.6" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@3.635.0": - version "3.635.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.635.0.tgz#083439af1336693049958e4b61695e4712b30fd4" - integrity sha512-iJyRgEjOCQlBMXqtwPLIKYc7Bsc6nqjrZybdMDenPDa+kmLg7xh8LxHsu9088e+2/wtLicE34FsJJIfzu3L82g== - dependencies: - "@aws-sdk/types" "3.609.0" - "@smithy/fetch-http-handler" "^3.2.4" - "@smithy/node-http-handler" "^3.1.4" - "@smithy/property-provider" "^3.1.3" - "@smithy/protocol-http" "^4.1.0" - "@smithy/smithy-client" "^3.2.0" - "@smithy/types" "^3.3.0" - "@smithy/util-stream" "^3.1.3" +"@aws-sdk/credential-provider-http@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.654.0.tgz#72ce2ff0136eb87ef0c90d435bf1dd61558fe96d" + integrity sha512-tgmAH4MBi/aDR882lfw48+tDV95ZH3GWc1Eoe6DpNLiM3GN2VfU/cZwuHmi6aq+vAbdIlswBHJ/+va0fOvlyjw== + dependencies: + "@aws-sdk/types" "3.654.0" + "@smithy/fetch-http-handler" "^3.2.7" + "@smithy/node-http-handler" "^3.2.2" + "@smithy/property-provider" "^3.1.6" + "@smithy/protocol-http" "^4.1.3" + "@smithy/smithy-client" "^3.3.2" + "@smithy/types" "^3.4.2" + "@smithy/util-stream" "^3.1.6" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@3.637.0": - version "3.637.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.637.0.tgz#dae0d8b05c8b9480da5a92beb4dd244985ecbd70" - integrity sha512-h+PFCWfZ0Q3Dx84SppET/TFpcQHmxFW8/oV9ArEvMilw4EBN+IlxgbL0CnHwjHW64szcmrM0mbebjEfHf4FXmw== - dependencies: - "@aws-sdk/credential-provider-env" "3.620.1" - "@aws-sdk/credential-provider-http" "3.635.0" - "@aws-sdk/credential-provider-process" "3.620.1" - "@aws-sdk/credential-provider-sso" "3.637.0" - "@aws-sdk/credential-provider-web-identity" "3.621.0" - "@aws-sdk/types" "3.609.0" - "@smithy/credential-provider-imds" "^3.2.0" - "@smithy/property-provider" "^3.1.3" - "@smithy/shared-ini-file-loader" "^3.1.4" - "@smithy/types" "^3.3.0" +"@aws-sdk/credential-provider-ini@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.654.0.tgz#557b3774d4ab3d127f96cb2cd29419b2a8569796" + integrity sha512-DKSdaNu2hwdmuvnm9KnA0NLqMWxxmxSOLWjSUSoFIm++wGXUjPrRMFYKvMktaXnPuyf5my8gF/yGbwzPZ8wlTg== + dependencies: + "@aws-sdk/credential-provider-env" "3.654.0" + "@aws-sdk/credential-provider-http" "3.654.0" + "@aws-sdk/credential-provider-process" "3.654.0" + "@aws-sdk/credential-provider-sso" "3.654.0" + "@aws-sdk/credential-provider-web-identity" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@smithy/credential-provider-imds" "^3.2.3" + "@smithy/property-provider" "^3.1.6" + "@smithy/shared-ini-file-loader" "^3.1.7" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@3.637.0": - version "3.637.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.637.0.tgz#0ac6678ab31783adf5b1cf03add5d1da101ea946" - integrity sha512-yoEhoxJJfs7sPVQ6Is939BDQJZpZCoUgKr/ySse4YKOZ24t4VqgHA6+wV7rYh+7IW24Rd91UTvEzSuHYTlxlNA== - dependencies: - "@aws-sdk/credential-provider-env" "3.620.1" - "@aws-sdk/credential-provider-http" "3.635.0" - "@aws-sdk/credential-provider-ini" "3.637.0" - "@aws-sdk/credential-provider-process" "3.620.1" - "@aws-sdk/credential-provider-sso" "3.637.0" - "@aws-sdk/credential-provider-web-identity" "3.621.0" - "@aws-sdk/types" "3.609.0" - "@smithy/credential-provider-imds" "^3.2.0" - "@smithy/property-provider" "^3.1.3" - "@smithy/shared-ini-file-loader" "^3.1.4" - "@smithy/types" "^3.3.0" +"@aws-sdk/credential-provider-node@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.654.0.tgz#a701dda47eea2a3d5996d97672c058949ef41d3b" + integrity sha512-wPV7CNYaXDEc+SS+3R0v8SZwkHRUE1z2k2j1d49tH5QBDT4tb/k2V/biXWkwSk3hbR+IMWXmuhJDv/5lybhIvg== + dependencies: + "@aws-sdk/credential-provider-env" "3.654.0" + "@aws-sdk/credential-provider-http" "3.654.0" + "@aws-sdk/credential-provider-ini" "3.654.0" + "@aws-sdk/credential-provider-process" "3.654.0" + "@aws-sdk/credential-provider-sso" "3.654.0" + "@aws-sdk/credential-provider-web-identity" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@smithy/credential-provider-imds" "^3.2.3" + "@smithy/property-provider" "^3.1.6" + "@smithy/shared-ini-file-loader" "^3.1.7" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/credential-provider-process@3.620.1": - version "3.620.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz#10387cf85400420bb4bbda9cc56937dcc6d6d0ee" - integrity sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg== +"@aws-sdk/credential-provider-process@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.654.0.tgz#2c526d0d059eddfe4176933fadbbf8bd59480642" + integrity sha512-PmQoo8sZ9Q2Ow8OMzK++Z9lI7MsRUG7sNq3E72DVA215dhtTICTDQwGlXH2AAmIp7n+G9LLRds+4wo2ehG4mkg== dependencies: - "@aws-sdk/types" "3.609.0" - "@smithy/property-provider" "^3.1.3" - "@smithy/shared-ini-file-loader" "^3.1.4" - "@smithy/types" "^3.3.0" + "@aws-sdk/types" "3.654.0" + "@smithy/property-provider" "^3.1.6" + "@smithy/shared-ini-file-loader" "^3.1.7" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@3.637.0": - version "3.637.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.637.0.tgz#13acf77579df026e89ced33501489defd06a0518" - integrity sha512-Mvz+h+e62/tl+dVikLafhv+qkZJ9RUb8l2YN/LeKMWkxQylPT83CPk9aimVhCV89zth1zpREArl97+3xsfgQvA== - dependencies: - "@aws-sdk/client-sso" "3.637.0" - "@aws-sdk/token-providers" "3.614.0" - "@aws-sdk/types" "3.609.0" - "@smithy/property-provider" "^3.1.3" - "@smithy/shared-ini-file-loader" "^3.1.4" - "@smithy/types" "^3.3.0" +"@aws-sdk/credential-provider-sso@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.654.0.tgz#cb6cd05a8279c6ffe7e7399c03ba2db5ef2534f5" + integrity sha512-7GFme6fWEdA/XYKzZPOAdj/jS6fMBy1NdSIZsDXikS0v9jU+ZzHrAaWt13YLzHyjgxB9Sg9id9ncdY1IiubQXQ== + dependencies: + "@aws-sdk/client-sso" "3.654.0" + "@aws-sdk/token-providers" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@smithy/property-provider" "^3.1.6" + "@smithy/shared-ini-file-loader" "^3.1.7" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@3.621.0": - version "3.621.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz#b25878c0a05dad60cd5f91e7e5a31a145c2f14be" - integrity sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w== +"@aws-sdk/credential-provider-web-identity@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.654.0.tgz#67dc0463d20f801c8577276e2066f9151b2d5eb1" + integrity sha512-6a2g9gMtZToqSu+CusjNK5zvbLJahQ9di7buO3iXgbizXpLXU1rnawCpWxwslMpT5fLgMSKDnKDrr6wdEk7jSw== dependencies: - "@aws-sdk/types" "3.609.0" - "@smithy/property-provider" "^3.1.3" - "@smithy/types" "^3.3.0" + "@aws-sdk/types" "3.654.0" + "@smithy/property-provider" "^3.1.6" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/middleware-bucket-endpoint@3.620.0": - version "3.620.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.620.0.tgz#c5dc0e98b6209a91479cad6c2c74fbc5a3429fab" - integrity sha512-eGLL0W6L3HDb3OACyetZYOWpHJ+gLo0TehQKeQyy2G8vTYXqNTeqYhuI6up9HVjBzU9eQiULVQETmgQs7TFaRg== +"@aws-sdk/middleware-bucket-endpoint@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.654.0.tgz#f8241db792eb951e1aaa127911e9d35ae11f45f2" + integrity sha512-/lWkyeLESiK+rAB4+NCw1cVPle9RN7RW/v7B4b8ORiCn1FwZLUPmEiZSYzyh4in5oa3Mri+W/g+KafZDH6LCbA== dependencies: - "@aws-sdk/types" "3.609.0" + "@aws-sdk/types" "3.654.0" "@aws-sdk/util-arn-parser" "3.568.0" - "@smithy/node-config-provider" "^3.1.4" - "@smithy/protocol-http" "^4.1.0" - "@smithy/types" "^3.3.0" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/protocol-http" "^4.1.3" + "@smithy/types" "^3.4.2" "@smithy/util-config-provider" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-expect-continue@3.620.0": - version "3.620.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.620.0.tgz#6a362c0f0696dc6749108a33de9998e0fa6b50ec" - integrity sha512-QXeRFMLfyQ31nAHLbiTLtk0oHzG9QLMaof5jIfqcUwnOkO8YnQdeqzakrg1Alpy/VQ7aqzIi8qypkBe2KXZz0A== +"@aws-sdk/middleware-expect-continue@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.654.0.tgz#ccf64bd5dbde3266181a00052bad8f78fcc1914e" + integrity sha512-S7fSlo8vdjkQTy9DmdF54ZsPwc+aA4z5Y9JVqAlGL9QiZe/fPtRE3GZ8BBbMICjBfMEa12tWjzhDz9su2c6PIA== dependencies: - "@aws-sdk/types" "3.609.0" - "@smithy/protocol-http" "^4.1.0" - "@smithy/types" "^3.3.0" + "@aws-sdk/types" "3.654.0" + "@smithy/protocol-http" "^4.1.3" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/middleware-flexible-checksums@3.620.0": - version "3.620.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.620.0.tgz#42cd48cdc0ad9639545be000bf537969210ce8c5" - integrity sha512-ftz+NW7qka2sVuwnnO1IzBku5ccP+s5qZGeRTPgrKB7OzRW85gthvIo1vQR2w+OwHFk7WJbbhhWwbCbktnP4UA== +"@aws-sdk/middleware-flexible-checksums@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.654.0.tgz#2868528c66c1f0094811668e2e89b246ca94352a" + integrity sha512-ZSRC+Lf9WxyoDLuTkd7JrFRrBLPLXcTOZzX6tDsnHc6tgdneBNwV3/ZOYUwQ8bdwLLnzSaQUU+X5B2BkEFKIhQ== dependencies: "@aws-crypto/crc32" "5.2.0" "@aws-crypto/crc32c" "5.2.0" - "@aws-sdk/types" "3.609.0" + "@aws-sdk/types" "3.654.0" "@smithy/is-array-buffer" "^3.0.0" - "@smithy/protocol-http" "^4.1.0" - "@smithy/types" "^3.3.0" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/protocol-http" "^4.1.3" + "@smithy/types" "^3.4.2" + "@smithy/util-middleware" "^3.0.6" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-host-header@3.620.0": - version "3.620.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz#b561d419a08a984ba364c193376b482ff5224d74" - integrity sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg== +"@aws-sdk/middleware-host-header@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.654.0.tgz#8b02dcc28467d5b48c32cec22fd6e10ffd2a0549" + integrity sha512-rxGgVHWKp8U2ubMv+t+vlIk7QYUaRCHaVpmUlJv0Wv6Q0KeO9a42T9FxHphjOTlCGQOLcjCreL9CF8Qhtb4mdQ== dependencies: - "@aws-sdk/types" "3.609.0" - "@smithy/protocol-http" "^4.1.0" - "@smithy/types" "^3.3.0" + "@aws-sdk/types" "3.654.0" + "@smithy/protocol-http" "^4.1.3" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/middleware-location-constraint@3.609.0": - version "3.609.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.609.0.tgz#7ed82d71e5ddcd50683ef2bbde10d1cc2492057e" - integrity sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A== +"@aws-sdk/middleware-location-constraint@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.654.0.tgz#a64ab011c390e4c7be75a08e0e104e06ccb4d961" + integrity sha512-Duvv5c4DEQ7P6c0YlcvEUW3xCJi6X2uktafNGjILhVDMQwShSF/aFqNv/ikWU/luQcmWHZ9DtDjTR9UKLh6eTA== dependencies: - "@aws-sdk/types" "3.609.0" - "@smithy/types" "^3.3.0" + "@aws-sdk/types" "3.654.0" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/middleware-logger@3.609.0": - version "3.609.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz#ed44d201f091b8bac908cbf14724c7a4d492553f" - integrity sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ== +"@aws-sdk/middleware-logger@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.654.0.tgz#510495302fb134e1ef2163205f8eaedd46ffe05f" + integrity sha512-OQYb+nWlmASyXfRb989pwkJ9EVUMP1CrKn2eyTk3usl20JZmKo2Vjis6I0tLUkMSxMhnBJJlQKyWkRpD/u1FVg== dependencies: - "@aws-sdk/types" "3.609.0" - "@smithy/types" "^3.3.0" + "@aws-sdk/types" "3.654.0" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/middleware-recursion-detection@3.620.0": - version "3.620.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz#f8270dfff843fd756be971e5673f89c6a24c6513" - integrity sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w== +"@aws-sdk/middleware-recursion-detection@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.654.0.tgz#4ade897efb6cbbfd72dd62a66999f28fd1552f9a" + integrity sha512-gKSomgltKVmsT8sC6W7CrADZ4GHwX9epk3GcH6QhebVO3LA9LRbkL3TwOPUXakxxOLLUTYdOZLIOtFf7iH00lg== dependencies: - "@aws-sdk/types" "3.609.0" - "@smithy/protocol-http" "^4.1.0" - "@smithy/types" "^3.3.0" + "@aws-sdk/types" "3.654.0" + "@smithy/protocol-http" "^4.1.3" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/middleware-sdk-s3@3.635.0": - version "3.635.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.635.0.tgz#be7f61c6033a803cde59ec5a29db266b42fdbc01" - integrity sha512-RLdYJPEV4JL/7NBoFUs7VlP90X++5FlJdxHz0DzCjmiD3qCviKy+Cym3qg1gBgHwucs5XisuClxDrGokhAdTQw== +"@aws-sdk/middleware-sdk-s3@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.654.0.tgz#53c87e64e745b45b6ff30ba8f06ed27b1fa7c761" + integrity sha512-6prq+GK6hLMAbxEb83tBMb1YiTWWK196fJhFO/7gE5TUPL1v756RhQZzKV/njbwB1fIBjRBTuhYLh5Bn98HhdA== dependencies: - "@aws-sdk/core" "3.635.0" - "@aws-sdk/types" "3.609.0" + "@aws-sdk/core" "3.654.0" + "@aws-sdk/types" "3.654.0" "@aws-sdk/util-arn-parser" "3.568.0" - "@smithy/core" "^2.4.0" - "@smithy/node-config-provider" "^3.1.4" - "@smithy/protocol-http" "^4.1.0" - "@smithy/signature-v4" "^4.1.0" - "@smithy/smithy-client" "^3.2.0" - "@smithy/types" "^3.3.0" + "@smithy/core" "^2.4.3" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/protocol-http" "^4.1.3" + "@smithy/signature-v4" "^4.1.3" + "@smithy/smithy-client" "^3.3.2" + "@smithy/types" "^3.4.2" "@smithy/util-config-provider" "^3.0.0" - "@smithy/util-middleware" "^3.0.3" - "@smithy/util-stream" "^3.1.3" + "@smithy/util-middleware" "^3.0.6" + "@smithy/util-stream" "^3.1.6" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-ssec@3.609.0": - version "3.609.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.609.0.tgz#b87a8bc6133f3f6bdc6801183d0f9dad3f93cf9f" - integrity sha512-GZSD1s7+JswWOTamVap79QiDaIV7byJFssBW68GYjyRS5EBjNfwA/8s+6uE6g39R3ojyTbYOmvcANoZEhSULXg== +"@aws-sdk/middleware-ssec@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.654.0.tgz#025cddb3317e5ab8cfdb1f449c4135441810119b" + integrity sha512-k7hkQDJh4hcRJC7YojQ11kc37SY4foryen26Eafj5qYjeG2OGMW0oZTJDl1TVFJ7AcCjqIuMIo0Ho2US/2JspQ== dependencies: - "@aws-sdk/types" "3.609.0" - "@smithy/types" "^3.3.0" + "@aws-sdk/types" "3.654.0" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/middleware-user-agent@3.637.0": - version "3.637.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz#2b00de72b00953a477bcc02a68d8cbb5e9670c44" - integrity sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug== +"@aws-sdk/middleware-user-agent@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.654.0.tgz#5fa56514b97ced923fefe2653429d7b2bfb102bb" + integrity sha512-liCcqPAyRsr53cy2tYu4qeH4MMN0eh9g6k56XzI5xd4SghXH5YWh4qOYAlQ8T66ZV4nPMtD8GLtLXGzsH8moFg== dependencies: - "@aws-sdk/types" "3.609.0" - "@aws-sdk/util-endpoints" "3.637.0" - "@smithy/protocol-http" "^4.1.0" - "@smithy/types" "^3.3.0" + "@aws-sdk/types" "3.654.0" + "@aws-sdk/util-endpoints" "3.654.0" + "@smithy/protocol-http" "^4.1.3" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/region-config-resolver@3.614.0": - version "3.614.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz#9cebb31a5bcfea2a41891fff7f28d0164cde179a" - integrity sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g== +"@aws-sdk/region-config-resolver@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.654.0.tgz#f98e25a6669fde3d747db23eb589732384e213ef" + integrity sha512-ydGOrXJxj3x0sJhsXyTmvJVLAE0xxuTWFJihTl67RtaO7VRNtd82I3P3bwoMMaDn5WpmV5mPo8fEUDRlBm3fPg== dependencies: - "@aws-sdk/types" "3.609.0" - "@smithy/node-config-provider" "^3.1.4" - "@smithy/types" "^3.3.0" + "@aws-sdk/types" "3.654.0" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/types" "^3.4.2" "@smithy/util-config-provider" "^3.0.0" - "@smithy/util-middleware" "^3.0.3" + "@smithy/util-middleware" "^3.0.6" tslib "^2.6.2" -"@aws-sdk/signature-v4-multi-region@3.635.0": - version "3.635.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.635.0.tgz#76e8eb66bfd9b661b4f9768b18aca2e04dd781a2" - integrity sha512-J6QY4/invOkpogCHjSaDON1hF03viPpOnsrzVuCvJMmclS/iG62R4EY0wq1alYll0YmSdmKlpJwHMWwGtqK63Q== +"@aws-sdk/signature-v4-multi-region@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.654.0.tgz#717ec39af4ec371ee463d0e51fa3985a2fb784ac" + integrity sha512-f8kyvbzgD3lSK1kFc3jsDCYjdutcqGO3tOzYO/QIK7BTl5lxc4rm6IKTcF2UYJsn8jiNqih7tVK8aVIGi8IF/w== dependencies: - "@aws-sdk/middleware-sdk-s3" "3.635.0" - "@aws-sdk/types" "3.609.0" - "@smithy/protocol-http" "^4.1.0" - "@smithy/signature-v4" "^4.1.0" - "@smithy/types" "^3.3.0" + "@aws-sdk/middleware-sdk-s3" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@smithy/protocol-http" "^4.1.3" + "@smithy/signature-v4" "^4.1.3" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/token-providers@3.614.0": - version "3.614.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz#88da04f6d4ce916b0b0f6e045676d04201fb47fd" - integrity sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw== +"@aws-sdk/token-providers@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.654.0.tgz#1aba36d510d471ccac43f90b59e2a354399ed069" + integrity sha512-D8GeJYmvbfWkQDtTB4owmIobSMexZel0fOoetwvgCQ/7L8VPph3Q2bn1TRRIXvH7wdt6DcDxA3tKMHPBkT3GlA== dependencies: - "@aws-sdk/types" "3.609.0" - "@smithy/property-provider" "^3.1.3" - "@smithy/shared-ini-file-loader" "^3.1.4" - "@smithy/types" "^3.3.0" + "@aws-sdk/types" "3.654.0" + "@smithy/property-provider" "^3.1.6" + "@smithy/shared-ini-file-loader" "^3.1.7" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/types@3.609.0", "@aws-sdk/types@^3.222.0": - version "3.609.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.609.0.tgz#06b39d799c9f197a7b43670243e8e78a3bf7d6a5" - integrity sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q== +"@aws-sdk/types@3.654.0", "@aws-sdk/types@^3.222.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.654.0.tgz#d368dda5e8aff9e7b6575985bb425bbbaf67aa97" + integrity sha512-VWvbED3SV+10QJIcmU/PKjsKilsTV16d1I7/on4bvD/jo1qGeMXqLDBSen3ks/tuvXZF/mFc7ZW/W2DiLVtO7A== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" tslib "^2.6.2" "@aws-sdk/util-arn-parser@3.568.0": @@ -602,14 +604,14 @@ dependencies: tslib "^2.6.2" -"@aws-sdk/util-endpoints@3.637.0": - version "3.637.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz#e20bcb69028039fdbc06e98a3028c7f8d8e8adaa" - integrity sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw== +"@aws-sdk/util-endpoints@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.654.0.tgz#ae8ac05c8afe73cf1428942c3a6d0ab8765f3911" + integrity sha512-i902fcBknHs0Irgdpi62+QMvzxE+bczvILXigYrlHL4+PiEnlMVpni5L5W1qCkNZXf8AaMrSBuR1NZAGp6UOUw== dependencies: - "@aws-sdk/types" "3.609.0" - "@smithy/types" "^3.3.0" - "@smithy/util-endpoints" "^2.0.5" + "@aws-sdk/types" "3.654.0" + "@smithy/types" "^3.4.2" + "@smithy/util-endpoints" "^2.1.2" tslib "^2.6.2" "@aws-sdk/util-locate-window@^3.0.0": @@ -619,32 +621,32 @@ dependencies: tslib "^2.6.2" -"@aws-sdk/util-user-agent-browser@3.609.0": - version "3.609.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz#aa15421b2e32ae8bc589dac2bd6e8969832ce588" - integrity sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA== +"@aws-sdk/util-user-agent-browser@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.654.0.tgz#caa5e5d6d502aad1fe5a436cffbabfff1ec3b92c" + integrity sha512-ykYAJqvnxLt7wfrqya28wuH3/7NdrwzfiFd7NqEVQf7dXVxL5RPEpD7DxjcyQo3DsHvvdUvGZVaQhozycn1pzA== dependencies: - "@aws-sdk/types" "3.609.0" - "@smithy/types" "^3.3.0" + "@aws-sdk/types" "3.654.0" + "@smithy/types" "^3.4.2" bowser "^2.11.0" tslib "^2.6.2" -"@aws-sdk/util-user-agent-node@3.614.0": - version "3.614.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz#1e3f49a80f841a3f21647baed2adce01aac5beb5" - integrity sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA== +"@aws-sdk/util-user-agent-node@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.654.0.tgz#d4b88fa9f3fce2fd70118d2c01abd941d30cffa7" + integrity sha512-a0ojjdBN6pqv6gB4H/QPPSfhs7mFtlVwnmKCM/QrTaFzN0U810PJ1BST3lBx5sa23I5jWHGaoFY+5q65C3clLQ== dependencies: - "@aws-sdk/types" "3.609.0" - "@smithy/node-config-provider" "^3.1.4" - "@smithy/types" "^3.3.0" + "@aws-sdk/types" "3.654.0" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@aws-sdk/xml-builder@3.609.0": - version "3.609.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.609.0.tgz#eeb3d5cde000a23cfeeefe0354b6193440dc7d87" - integrity sha512-l9XxNcA4HX98rwCC2/KoiWcmEiRfZe4G+mYwDbCFT87JIMj6GBhLDkAzr/W8KAaA2IDr8Vc6J8fZPgVulxxfMA== +"@aws-sdk/xml-builder@3.654.0": + version "3.654.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.654.0.tgz#28d295a1a9bbe6313ba240ce9cf851e894fcd449" + integrity sha512-qA2diK3d/ztC8HUb7NwPKbJRV01NpzTzxFn+L5G3HzJBNeKbjLcprQ/9uG9gp2UEx2Go782FI1ddrMNa0qBICA== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" tslib "^2.6.2" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": @@ -720,12 +722,12 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.24.9", "@babel/generator@^7.25.0", "@babel/generator@^7.25.4", "@babel/generator@^7.7.2": - version "7.25.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.5.tgz#b31cf05b3fe8c32d206b6dad03bb0aacbde73450" - integrity sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w== +"@babel/generator@^7.24.9", "@babel/generator@^7.25.0", "@babel/generator@^7.25.6", "@babel/generator@^7.7.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== dependencies: - "@babel/types" "^7.25.4" + "@babel/types" "^7.25.6" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" @@ -788,12 +790,12 @@ integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== "@babel/helpers@^7.24.8", "@babel/helpers@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a" - integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" + integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== dependencies: "@babel/template" "^7.25.0" - "@babel/types" "^7.25.0" + "@babel/types" "^7.25.6" "@babel/highlight@^7.24.7": version "7.24.7" @@ -805,12 +807,12 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.8", "@babel/parser@^7.25.0", "@babel/parser@^7.25.4": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.4.tgz#af4f2df7d02440286b7de57b1c21acfb2a6f257a" - integrity sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.8", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== dependencies: - "@babel/types" "^7.25.4" + "@babel/types" "^7.25.6" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -841,11 +843,11 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" - integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz#6d4c78f042db0e82fd6436cd65fec5dc78ad2bde" + integrity sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" @@ -932,17 +934,17 @@ "@babel/helper-plugin-utils" "^7.24.8" "@babel/runtime-corejs3@^7.12.5": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.25.0.tgz#0a318b66dfc765ad10562d829fea372ed7e1eb7d" - integrity sha512-BOehWE7MgQ8W8Qn0CQnMtg2tHPHPulcS/5AVpFvs2KCK1ET+0WqZqPvnpRpFN81gYoFopdIEJX9Sgjw3ZBccPg== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.25.6.tgz#5e3facf42775cc95bcde95746e940061931286e4" + integrity sha512-Gz0Nrobx8szge6kQQ5Z5MX9L3ObqNwCQY1PSwSNzreFL7aHGxv8Fp2j3ETV6/wWdbiV+mW6OSm8oQhg3Tcsniw== dependencies: core-js-pure "^3.30.2" regenerator-runtime "^0.14.0" "@babel/runtime@^7.12.5": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.4.tgz#6ef37d678428306e7d75f054d5b1bdb8cf8aa8ee" - integrity sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" + integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== dependencies: regenerator-runtime "^0.14.0" @@ -956,22 +958,22 @@ "@babel/types" "^7.25.0" "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.2": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.4.tgz#648678046990f2957407e3086e97044f13c3e18e" - integrity sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg== + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== dependencies: "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.25.4" - "@babel/parser" "^7.25.4" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" "@babel/template" "^7.25.0" - "@babel/types" "^7.25.4" + "@babel/types" "^7.25.6" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.9", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.4", "@babel/types@^7.3.3": - version "7.25.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.4.tgz#6bcb46c72fdf1012a209d016c07f769e10adcb5f" - integrity sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.9", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6", "@babel/types@^7.3.3": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== dependencies: "@babel/helper-string-parser" "^7.24.8" "@babel/helper-validator-identifier" "^7.24.7" @@ -997,9 +999,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" - integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== + version "4.11.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -1016,17 +1018,17 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0", "@eslint/js@^8.57", "@eslint/js@^8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@8.57.1", "@eslint/js@^8.57", "@eslint/js@^8.57.0": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" @@ -1035,31 +1037,30 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": +"@humanwhocodes/object-schema@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== -"@inquirer/confirm@^3.1.22": - version "3.1.22" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.22.tgz#23990624c11f60c6f7a5b0558c7505c35076a037" - integrity sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg== +"@inquirer/confirm@^3.1.22", "@inquirer/confirm@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.2.0.tgz#6af1284670ea7c7d95e3f1253684cfbd7228ad6a" + integrity sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw== dependencies: - "@inquirer/core" "^9.0.10" - "@inquirer/type" "^1.5.2" + "@inquirer/core" "^9.1.0" + "@inquirer/type" "^1.5.3" -"@inquirer/core@^9.0.10": - version "9.0.10" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-9.0.10.tgz#4270191e2ad3bea6223530a093dd9479bcbc7dd0" - integrity sha512-TdESOKSVwf6+YWDz8GhS6nKscwzkIyakEzCLJ5Vh6O3Co2ClhCJ0A4MG909MUWfaWdpJm7DE45ii51/2Kat9tA== +"@inquirer/core@^9.1.0": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-9.2.1.tgz#677c49dee399c9063f31e0c93f0f37bddc67add1" + integrity sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg== dependencies: - "@inquirer/figures" "^1.0.5" - "@inquirer/type" "^1.5.2" + "@inquirer/figures" "^1.0.6" + "@inquirer/type" "^2.0.0" "@types/mute-stream" "^0.0.4" - "@types/node" "^22.1.0" + "@types/node" "^22.5.5" "@types/wrap-ansi" "^3.0.0" ansi-escapes "^4.3.2" - cli-spinners "^2.9.2" cli-width "^4.1.0" mute-stream "^1.0.0" signal-exit "^4.1.0" @@ -1067,34 +1068,41 @@ wrap-ansi "^6.2.0" yoctocolors-cjs "^2.1.2" -"@inquirer/figures@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.5.tgz#57f9a996d64d3e3345d2a3ca04d36912e94f8790" - integrity sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA== +"@inquirer/figures@^1.0.5", "@inquirer/figures@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.6.tgz#1a562f916da39888c56b65b78259d2261bd7d40b" + integrity sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ== "@inquirer/input@^2.2.4": - version "2.2.9" - resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-2.2.9.tgz#08fdf9a48e4f6fc64c2d508b9d10afac843f9bd8" - integrity sha512-7Z6N+uzkWM7+xsE+3rJdhdG/+mQgejOVqspoW+w0AbSZnL6nq5tGMEVASaYVWbkoSzecABWwmludO2evU3d31g== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-2.3.0.tgz#9b99022f53780fecc842908f3f319b52a5a16865" + integrity sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw== dependencies: - "@inquirer/core" "^9.0.10" - "@inquirer/type" "^1.5.2" + "@inquirer/core" "^9.1.0" + "@inquirer/type" "^1.5.3" "@inquirer/select@^2.3.10": - version "2.4.7" - resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-2.4.7.tgz#6a23742b4f76d228186dfd42571d973def378ffa" - integrity sha512-JH7XqPEkBpNWp3gPCqWqY8ECbyMoFcCZANlL6pV9hf59qK6dGmkOlx1ydyhY+KZ0c5X74+W6Mtp+nm2QX0/MAQ== + version "2.5.0" + resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-2.5.0.tgz#345c6908ecfaeef3d84ddd2f9feb2f487c558efb" + integrity sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA== dependencies: - "@inquirer/core" "^9.0.10" + "@inquirer/core" "^9.1.0" "@inquirer/figures" "^1.0.5" - "@inquirer/type" "^1.5.2" + "@inquirer/type" "^1.5.3" ansi-escapes "^4.3.2" yoctocolors-cjs "^2.1.2" -"@inquirer/type@^1.5.2": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.5.2.tgz#15f5e4a4dae02c4203650cb07c8a000cdd423939" - integrity sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA== +"@inquirer/type@^1.5.3": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.5.5.tgz#303ea04ce7ad2e585b921b662b3be36ef7b4f09b" + integrity sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA== + dependencies: + mute-stream "^1.0.0" + +"@inquirer/type@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-2.0.0.tgz#08fa513dca2cb6264fe1b0a2fabade051444e3f6" + integrity sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag== dependencies: mute-stream "^1.0.0" @@ -1346,7 +1354,7 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@jsforce/jsforce-node@^3.4.0": +"@jsforce/jsforce-node@^3.4.1": version "3.4.1" resolved "https://registry.yarnpkg.com/@jsforce/jsforce-node/-/jsforce-node-3.4.1.tgz#36f5cba775b395eeedba676a78eafe447c3f4b28" integrity sha512-PsBKfglH0/8W/Srr4LsxEFsVmjmZjEj/T4XLGpbBoK8yVObwbiMk4VqwA6XwiA6SHqnEqqQbHZxk2rr7dZC+4A== @@ -1469,15 +1477,15 @@ wrap-ansi "^7.0.0" "@oclif/core@^4": - version "4.0.18" - resolved "https://registry.yarnpkg.com/@oclif/core/-/core-4.0.18.tgz#a4df3fc79645491b5335dca11451c44edf5bf3df" - integrity sha512-3EP4zJ+1ndc92UxdNmGX4HhFK5Xh94fWvUeOW1Tu/Ed+/jAljIsbmZyjVhDoE0vV5cftT+3QaVB/LFxaXxty/w== + version "4.0.22" + resolved "https://registry.yarnpkg.com/@oclif/core/-/core-4.0.22.tgz#acb233c0c18ff4f365caca15e29e2807a4325709" + integrity sha512-aXM2O4g7f+kPNzhhOfqGOVRVYDxTVrH7Y720MuH0Twq5WHMxI4XwntnyBaRscoCPG6FWhItZLtiZxsvaUdupGg== dependencies: ansi-escapes "^4.3.2" ansis "^3.3.2" clean-stack "^3.0.1" cli-spinners "^2.9.2" - debug "^4.3.5" + debug "^4.3.7" ejs "^3.1.10" get-package-type "^0.1.0" globby "^11.1.0" @@ -1498,79 +1506,106 @@ dependencies: "@oclif/core" "^2.15.0" -"@oclif/plugin-help@^6.2.8": - version "6.2.8" - resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-6.2.8.tgz#cbaea5ef886d76e75dbab6e77e34012889e924b5" - integrity sha512-QRpFYlBeJffl4cXGBi8e+EfGogDmU7y8do1ZHxmPKZ5eZ0mfeKiqq2WA9dwRMZJriy1qSaGsbkOYgYQWlOYhSg== +"@oclif/plugin-help@^6.2.10": + version "6.2.11" + resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-6.2.11.tgz#4477cf02778c6051b91cf21add5593fea9c8418c" + integrity sha512-Vo854dALtNhA34g6m4T9uWIrYfm/JFM82LWa5gLrsJGwpUGgeBwBX4P64HLo5ro59LF3YO2xPWViLaoK6gkm3g== dependencies: "@oclif/core" "^4" -"@oclif/plugin-not-found@^3.2.15": - version "3.2.16" - resolved "https://registry.yarnpkg.com/@oclif/plugin-not-found/-/plugin-not-found-3.2.16.tgz#e81c3ec965802d07b80dade118cbec86ec5082dd" - integrity sha512-9yGR1lAg4ItSwRb4WhZ41X+6tO55SJjDYnu+EXW9gPCPj64z5qRIBU1ZWUZGtxJpHNB0vUh9nDLTsQAJOw/lnw== +"@oclif/plugin-not-found@^3.2.21": + version "3.2.21" + resolved "https://registry.yarnpkg.com/@oclif/plugin-not-found/-/plugin-not-found-3.2.21.tgz#a1ef31a0e00fee1bde84d7aea118a269b80f2978" + integrity sha512-1v5MkECOH+mkubpk5RgyVK1qEHn3hr2wX1qsx5hawTyssd10WEFIkH258M9CjyiG42M6ZCQhOS3Wo2wteLo/vg== dependencies: - "@inquirer/confirm" "^3.1.22" + "@inquirer/confirm" "^3.2.0" "@oclif/core" "^4" ansis "^3.3.1" fast-levenshtein "^3.0.0" "@oclif/plugin-warn-if-update-available@^3.1.11": - version "3.1.11" - resolved "https://registry.yarnpkg.com/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-3.1.11.tgz#e0d7622e72998a37796b598d3e97921d0acbe516" - integrity sha512-Pv4EFxhpzspq0n2v0cdfqRwIMwYyd3YOIKny/1Ao71D0pKlpxJ63c9OFDNJAJcUjFOUHzODTtXXNwimOpzfbYg== + version "3.1.16" + resolved "https://registry.yarnpkg.com/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-3.1.16.tgz#cc51b757fe3d0be075e948455bf190a802fce0dd" + integrity sha512-QGQF1kL+aUj/cTtXdV0GT1n7HNf3HX1ZnCwL86Y9rlZgQbBU9gl8/01/6P/uPj0E+WWExZMVF6+fmktTqwYVQw== dependencies: "@oclif/core" "^4" ansis "^3.3.1" debug "^4.3.5" http-call "^5.2.2" lodash "^4.17.21" + registry-auth-token "^5.0.2" + +"@pnpm/config.env-replace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" + integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== + +"@pnpm/network.ca-file@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" + integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== + dependencies: + graceful-fs "4.2.10" + +"@pnpm/npm-conf@^2.1.0": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz#bb375a571a0bd63ab0a23bece33033c683e9b6b0" + integrity sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw== + dependencies: + "@pnpm/config.env-replace" "^1.1.0" + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" + +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== "@salesforce/cli-plugins-testkit@^5.3.8": - version "5.3.26" - resolved "https://registry.yarnpkg.com/@salesforce/cli-plugins-testkit/-/cli-plugins-testkit-5.3.26.tgz#11f4946b24749a7f32125688ed43ae9dbc248e60" - integrity sha512-5+Cx0Gbx5v+uvB6TQr+gHIRULOCUhzLtlBRh2UZQoWlUihlOvTYIOXqWQP50qm92KlV0iv3LJ25zJQDFnvAIzQ== + version "5.3.32" + resolved "https://registry.yarnpkg.com/@salesforce/cli-plugins-testkit/-/cli-plugins-testkit-5.3.32.tgz#30018a25d68b21ad2cb4b91c82be1bcf9690629b" + integrity sha512-eXi0n4Ae7igTS4PAvuK19I5utA9p1uQlojNFlvQl0Oiqidy9Rl5i5GWekIAmNrn/hX0gbftwAh4PezB/W5hZ3Q== dependencies: - "@salesforce/core" "^8.4.0" - "@salesforce/kit" "^3.2.1" + "@salesforce/core" "^8.5.7" + "@salesforce/kit" "^3.2.3" "@salesforce/ts-types" "^2.0.11" "@types/shelljs" "^0.8.15" - debug "^4.3.6" + debug "^4.3.7" jszip "^3.10.1" shelljs "^0.8.4" sinon "^17.0.2" strip-ansi "6.0.1" ts-retry-promise "^0.8.1" -"@salesforce/code-analyzer-core@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@salesforce/code-analyzer-core/-/code-analyzer-core-0.12.0.tgz#ea068ac652e459620a5e52ce3f7e8b4a55629f1f" - integrity sha512-PQ5hxKFikW587vHnSUmnHKT2Q8kSRHtA7sD9EroPdI3e1W4FSojw7MMhqH6ymLgvdpYRZmxUad2Tp7/Yzf4uQQ== +"@salesforce/code-analyzer-core@^0.13.2": + version "0.13.2" + resolved "https://registry.yarnpkg.com/@salesforce/code-analyzer-core/-/code-analyzer-core-0.13.2.tgz#c2c05d5d04a1e0a3369badad476333a80b3c92ca" + integrity sha512-SDIF3s5j4bFEOEldGgq0pUZKAKZhbwBCUQ6r5UznEmuoiawiLTEAuR7YgpAS1+upw/zfaOJg1gKoVydxDNF3Kg== dependencies: - "@salesforce/code-analyzer-engine-api" "0.9.0" + "@salesforce/code-analyzer-engine-api" "0.10.0" "@types/js-yaml" "^4.0.9" "@types/node" "^20.0.0" csv-stringify "^6.5.0" js-yaml "^4.1.0" xmlbuilder "^15.1.1" -"@salesforce/code-analyzer-engine-api@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@salesforce/code-analyzer-engine-api/-/code-analyzer-engine-api-0.9.0.tgz#21bb274b6c86afb28c921c8e060b68e2737a93ce" - integrity sha512-sDO8hlEiA2yn8QtdRiOrOaAs+m4qYab+tyfNQ7GAoOt9l5f2t9GeLfmG5S4cAudZ6v72AbFxWJtOMPuF9qfOIw== +"@salesforce/code-analyzer-engine-api@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@salesforce/code-analyzer-engine-api/-/code-analyzer-engine-api-0.10.0.tgz#28675d8300c49bc6316cdd468ee42ea1f16ef15a" + integrity sha512-PyFJgGLOc7Wi+epOEtKg7MHQUlUhOCoKGOEXtcJWh5iaj+b1LCHxhwrN4jZvOPTN9NfB0fcVIH/5JvCdCdqkVA== dependencies: "@types/node" "^20.0.0" -"@salesforce/code-analyzer-eslint-engine@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@salesforce/code-analyzer-eslint-engine/-/code-analyzer-eslint-engine-0.9.0.tgz#18ce4dfcd357ffef865196139f93e54d546b5462" - integrity sha512-7nq/Bhm+4gMzg4GP8znRuneCKOTepil/zOpzz2/VkNQy+xKFRmiTzyCeqlhDAOipalNwMY1YLiiHXrXFygTLHA== +"@salesforce/code-analyzer-eslint-engine@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@salesforce/code-analyzer-eslint-engine/-/code-analyzer-eslint-engine-0.10.0.tgz#dabde01da4e0a37d97f0f6301b02b9e08ee94f94" + integrity sha512-wXCzSBuGsXvJ27b5Wrabkziurl4Pdj037bPcXf4EmLUFff5kv0P0ZhzDB2okW7yWtcQAG+UyVSCqTUHhy4Y5vQ== dependencies: "@babel/core" "^7.24.7" "@babel/eslint-parser" "^7.24.7" "@eslint/js" "^8.57.0" "@lwc/eslint-plugin-lwc" "^1.8.0" - "@salesforce/code-analyzer-engine-api" "0.9.0" + "@salesforce/code-analyzer-engine-api" "0.10.0" "@salesforce/eslint-config-lwc" "^3.5.3" "@salesforce/eslint-plugin-lightning" "^1.0.0" "@types/eslint" "^8.56.10" @@ -1581,21 +1616,31 @@ eslint-plugin-import "^2.29.1" eslint-plugin-jest "^28.6.0" -"@salesforce/code-analyzer-regex-engine@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@salesforce/code-analyzer-regex-engine/-/code-analyzer-regex-engine-0.9.0.tgz#67e0e0171a05c6c35a8c5b060c31a9bf39a80dfd" - integrity sha512-VDKKFxx7BAjXL0ZcNZtGKQT8jqbj8335etkSKuNo9TiSDqm1HI8731HTvAU0BVSM2db1aMsSSJHHpSP0xEePrw== +"@salesforce/code-analyzer-pmd-engine@0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@salesforce/code-analyzer-pmd-engine/-/code-analyzer-pmd-engine-0.10.1.tgz#ec63c66f7d752188b1ef6240c9d9391a32c4ddbd" + integrity sha512-X8lFTMzq5Nk6xlaod0YDkXo9BXEIulJL1PH/Jq+GAB1gDRYjnETWchk/sIo9BnbHsw8mSCK9TgtEOlRq9DVz2Q== + dependencies: + "@salesforce/code-analyzer-engine-api" "0.10.0" + "@types/node" "^20.0.0" + "@types/tmp" "^0.2.6" + tmp "^0.2.3" + +"@salesforce/code-analyzer-regex-engine@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@salesforce/code-analyzer-regex-engine/-/code-analyzer-regex-engine-0.10.0.tgz#8728a00be3117b21c0b1ac50d1eb140aed052459" + integrity sha512-e/WZYko1o1aFodnyLGdMQFSJQ/dqOosqgTpJJNd8ltrgVdLS/J9B2XyqyKBDRcTviLEcCJVNVQi7CRDIBFctIw== dependencies: - "@salesforce/code-analyzer-engine-api" "0.9.0" + "@salesforce/code-analyzer-engine-api" "0.10.0" "@types/node" "^20.0.0" isbinaryfile "^5.0.2" -"@salesforce/code-analyzer-retirejs-engine@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@salesforce/code-analyzer-retirejs-engine/-/code-analyzer-retirejs-engine-0.9.0.tgz#f9b2756eb696bffd03fd9b72972560f7c1cd9ea2" - integrity sha512-O09loHkrRLAZP2+Y2xEhj2IR3cFUinD9jNaXS3CB7ECfkYy09W2TNbRkQzGt545tpPyUurHmA7+GPds2xTAPjw== +"@salesforce/code-analyzer-retirejs-engine@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@salesforce/code-analyzer-retirejs-engine/-/code-analyzer-retirejs-engine-0.10.0.tgz#62b521bb13af9a88ae2a5b0af08c44f64eac847f" + integrity sha512-SPbCFkdijPGoK8dsVIhEGSBlb27grahUWt7pGZrnFyhCgWmZ7hwmQ7FaSBBX7V8invV6VavvQh0SD+10ygoLxw== dependencies: - "@salesforce/code-analyzer-engine-api" "0.9.0" + "@salesforce/code-analyzer-engine-api" "0.10.0" "@types/node" "^20.0.0" "@types/tmp" "^0.2.6" isbinaryfile "^5.0.2" @@ -1650,13 +1695,13 @@ semver "^7.6.0" ts-retry-promise "^0.7.1" -"@salesforce/core@^8.4.0": - version "8.4.0" - resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-8.4.0.tgz#d2ddfe07994c42b1e917e581e9cf47ad27b97a93" - integrity sha512-P+n0+Sp+v6voLTShW2E5sdF7gCUxEXJjNcc9Jtto0ZMyQesmQJ6WGpWmAuRoi+BVYc8OPSlEffndaYDAo/u73g== +"@salesforce/core@^8.5.4", "@salesforce/core@^8.5.7": + version "8.5.7" + resolved "https://registry.yarnpkg.com/@salesforce/core/-/core-8.5.7.tgz#18c98ba383f7030f7e5420677bbd108d1d93dcc3" + integrity sha512-HY2ztRT2QACgWrbze+v+B6L4q+RT9FdswXhVQRssf8ZeJH/kqFnF4U640i+dAFChs9mGGCS2zmm6BTREiwg2LA== dependencies: - "@jsforce/jsforce-node" "^3.4.0" - "@salesforce/kit" "^3.1.6" + "@jsforce/jsforce-node" "^3.4.1" + "@salesforce/kit" "^3.2.2" "@salesforce/schemas" "^1.9.0" "@salesforce/ts-types" "^2.0.10" ajv "^8.17.1" @@ -1667,7 +1712,7 @@ js2xmlparser "^4.0.1" jsonwebtoken "9.0.2" jszip "3.10.1" - pino "^9.3.2" + pino "^9.4.0" pino-abstract-transport "^1.2.0" pino-pretty "^11.2.2" proper-lockfile "^4.1.2" @@ -1689,10 +1734,10 @@ resolved "https://registry.yarnpkg.com/@salesforce/eslint-plugin-lightning/-/eslint-plugin-lightning-1.0.0.tgz#9ecf80527d83394960ef3c358c790cdfde44f578" integrity sha512-zk0PKXAcHKHepAG2EOSWlkOTxQM0Aw1CT6+MUxJcM42fCDwH/yPPpGkG3CWtRfmVViODGOwU9ywU2wlkAYcvUQ== -"@salesforce/kit@^3.0.15", "@salesforce/kit@^3.1.0", "@salesforce/kit@^3.1.6", "@salesforce/kit@^3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@salesforce/kit/-/kit-3.2.1.tgz#3de2c9ff52710a169fc887716d97c00d26065c56" - integrity sha512-LrZH2F06XPLUTMXC3av6A0VDAJykUqRtYB6tTjAKzwS1gCnp6BEn6VyjZNg0Fg/Kfp6OTrMxiIgbUFsNehEV7A== +"@salesforce/kit@^3.0.15", "@salesforce/kit@^3.1.0", "@salesforce/kit@^3.2.2", "@salesforce/kit@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@salesforce/kit/-/kit-3.2.3.tgz#a7293c384ef6133191fe3590e604e3896fdecf4a" + integrity sha512-X8rZouLt06dxRkn+uYTwywWDS/NqZ783AyomGqgtWdUxF61EOJvu0ehtcYeutx9Ng08uuZ+s6wNvWiDsdhUcPg== dependencies: "@salesforce/ts-types" "^2.0.12" @@ -1734,13 +1779,6 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" - integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== - dependencies: - type-detect "4.0.8" - "@sinonjs/commons@^3.0.0", "@sinonjs/commons@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" @@ -1756,32 +1794,32 @@ "@sinonjs/commons" "^3.0.0" "@sinonjs/fake-timers@^11.2.2": - version "11.2.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz#50063cc3574f4a27bd8453180a04171c85cc9699" - integrity sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw== + version "11.3.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz#51d6e8d83ca261ff02c0ab0e68e9db23d5cd5999" + integrity sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA== dependencies: - "@sinonjs/commons" "^3.0.0" + "@sinonjs/commons" "^3.0.1" "@sinonjs/samsam@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.0.tgz#0d488c91efb3fa1442e26abea81759dfc8b5ac60" - integrity sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew== + version "8.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.2.tgz#e4386bf668ff36c95949e55a38dc5f5892fc2689" + integrity sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw== dependencies: - "@sinonjs/commons" "^2.0.0" + "@sinonjs/commons" "^3.0.1" lodash.get "^4.4.2" - type-detect "^4.0.8" + type-detect "^4.1.0" "@sinonjs/text-encoding@^0.7.2": version "0.7.3" resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz#282046f03e886e352b2d5f5da5eb755e01457f3f" integrity sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA== -"@smithy/abort-controller@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-3.1.1.tgz#291210611ff6afecfc198d0ca72d5771d8461d16" - integrity sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ== +"@smithy/abort-controller@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-3.1.4.tgz#7cb22871f7392319c565d1d9ab3cb04e635c4dd9" + integrity sha512-VupaALAQlXViW3/enTf/f5l5JZYSAxoJL7f0nanhNNKnww6DGCg1oYIuNP78KDugnkwthBO6iEcym16HhWV8RQ== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" tslib "^2.6.2" "@smithy/chunked-blob-reader-native@^3.0.0": @@ -1799,135 +1837,135 @@ dependencies: tslib "^2.6.2" -"@smithy/config-resolver@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-3.0.5.tgz#727978bba7ace754c741c259486a19d3083431fd" - integrity sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA== +"@smithy/config-resolver@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-3.0.8.tgz#8717ea934f1d72474a709fc3535d7b8a11de2e33" + integrity sha512-Tv1obAC18XOd2OnDAjSWmmthzx6Pdeh63FbLin8MlPiuJ2ATpKkq0NcNOJFr0dO+JmZXnwu8FQxKJ3TKJ3Hulw== dependencies: - "@smithy/node-config-provider" "^3.1.4" - "@smithy/types" "^3.3.0" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/types" "^3.4.2" "@smithy/util-config-provider" "^3.0.0" - "@smithy/util-middleware" "^3.0.3" + "@smithy/util-middleware" "^3.0.6" tslib "^2.6.2" -"@smithy/core@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-2.4.0.tgz#56e917b6ab2dffeba681a05395c40a757d681147" - integrity sha512-cHXq+FneIF/KJbt4q4pjN186+Jf4ZB0ZOqEaZMBhT79srEyGDDBV31NqBRBjazz8ppQ1bJbDJMY9ba5wKFV36w== - dependencies: - "@smithy/middleware-endpoint" "^3.1.0" - "@smithy/middleware-retry" "^3.0.15" - "@smithy/middleware-serde" "^3.0.3" - "@smithy/protocol-http" "^4.1.0" - "@smithy/smithy-client" "^3.2.0" - "@smithy/types" "^3.3.0" +"@smithy/core@^2.4.3": + version "2.4.3" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-2.4.3.tgz#18344c2ff63f748f625ebc5171755816f3043849" + integrity sha512-4LTusLqFMRVQUfC3RNuTg6IzYTeJNpydRdTKq7J5wdEyIRQSu3rGIa3s80mgG2hhe6WOZl9IqTSo1pgbn6EHhA== + dependencies: + "@smithy/middleware-endpoint" "^3.1.3" + "@smithy/middleware-retry" "^3.0.18" + "@smithy/middleware-serde" "^3.0.6" + "@smithy/protocol-http" "^4.1.3" + "@smithy/smithy-client" "^3.3.2" + "@smithy/types" "^3.4.2" "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-middleware" "^3.0.3" + "@smithy/util-middleware" "^3.0.6" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@smithy/credential-provider-imds@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz#0e0e7ddaff1a8633cb927aee1056c0ab506b7ecf" - integrity sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA== +"@smithy/credential-provider-imds@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.3.tgz#93314e58e4f81f2b641de6efac037c7a3250c050" + integrity sha512-VoxMzSzdvkkjMJNE38yQgx4CfnmT+Z+5EUXkg4x7yag93eQkVQgZvN3XBSHC/ylfBbLbAtdu7flTCChX9I+mVg== dependencies: - "@smithy/node-config-provider" "^3.1.4" - "@smithy/property-provider" "^3.1.3" - "@smithy/types" "^3.3.0" - "@smithy/url-parser" "^3.0.3" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/property-provider" "^3.1.6" + "@smithy/types" "^3.4.2" + "@smithy/url-parser" "^3.0.6" tslib "^2.6.2" -"@smithy/eventstream-codec@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-3.1.2.tgz#4a1c72b34400631b829241151984a1ad8c4f963c" - integrity sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw== +"@smithy/eventstream-codec@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-3.1.5.tgz#2b0d65818425d60e043b8e9d8dee9c6744de0e7b" + integrity sha512-6pu+PT2r+5ZnWEV3vLV1DzyrpJ0TmehQlniIDCSpZg6+Ji2SfOI38EqUyQ+O8lotVElCrfVc9chKtSMe9cmCZQ== dependencies: "@aws-crypto/crc32" "5.2.0" - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" "@smithy/util-hex-encoding" "^3.0.0" tslib "^2.6.2" -"@smithy/eventstream-serde-browser@^3.0.6": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.6.tgz#a4ab4f7cfbd137bcaa54c375276f9214e568fd8f" - integrity sha512-2hM54UWQUOrki4BtsUI1WzmD13/SeaqT/AB3EUJKbcver/WgKNaiJ5y5F5XXuVe6UekffVzuUDrBZVAA3AWRpQ== +"@smithy/eventstream-serde-browser@^3.0.9": + version "3.0.9" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.9.tgz#bb71b836a8755dd5d5fed85ac2fa500702f60544" + integrity sha512-PiQLo6OQmZAotJweIcObL1H44gkvuJACKMNqpBBe5Rf2Ax1DOcGi/28+feZI7yTe1ERHlQQaGnm8sSkyDUgsMg== dependencies: - "@smithy/eventstream-serde-universal" "^3.0.5" - "@smithy/types" "^3.3.0" + "@smithy/eventstream-serde-universal" "^3.0.8" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/eventstream-serde-config-resolver@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.3.tgz#f852e096d0ad112363b4685e1d441088d1fce67a" - integrity sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ== +"@smithy/eventstream-serde-config-resolver@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.6.tgz#538862ef05e549c0ef97b060100a5ffbb5d7adfb" + integrity sha512-iew15It+c7WfnVowWkt2a7cdPp533LFJnpjDQgfZQcxv2QiOcyEcea31mnrk5PVbgo0nNH3VbYGq7myw2q/F6A== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/eventstream-serde-node@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.5.tgz#2bbf5c9312a28f23bc55ae284efa9499f8b8f982" - integrity sha512-+upXvnHNyZP095s11jF5dhGw/Ihzqwl5G+/KtMnoQOpdfC3B5HYCcDVG9EmgkhJMXJlM64PyN5gjJl0uXFQehQ== +"@smithy/eventstream-serde-node@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.8.tgz#0221c555f2851fd847b041f27a6231945822018f" + integrity sha512-6m+wI+fT0na+6oao6UqALVA38fsScCpoG5UO/A8ZSyGLnPM2i4MS1cFUhpuALgvLMxfYoTCh7qSeJa0aG4IWpQ== dependencies: - "@smithy/eventstream-serde-universal" "^3.0.5" - "@smithy/types" "^3.3.0" + "@smithy/eventstream-serde-universal" "^3.0.8" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/eventstream-serde-universal@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.5.tgz#e1cc2f71f4d174a03e00ce4b563395a81dd17bec" - integrity sha512-5u/nXbyoh1s4QxrvNre9V6vfyoLWuiVvvd5TlZjGThIikc3G+uNiG9uOTCWweSRjv1asdDIWK7nOmN7le4RYHQ== +"@smithy/eventstream-serde-universal@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.8.tgz#0dac5365e3bb349960999b10a4a3c66b77b79dc3" + integrity sha512-09tqzIQ6e+7jLqGvRji1yJoDbL/zob0OFhq75edgStWErGLf16+yI5hRc/o9/YAybOhUZs/swpW2SPn892G5Gg== dependencies: - "@smithy/eventstream-codec" "^3.1.2" - "@smithy/types" "^3.3.0" + "@smithy/eventstream-codec" "^3.1.5" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/fetch-http-handler@^3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz#c754de7e0ff2541b73ac9ba7cc955940114b3d62" - integrity sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg== +"@smithy/fetch-http-handler@^3.2.7": + version "3.2.7" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.7.tgz#30520ca939fb817d3eb3ab9445ddc0f6c1df2960" + integrity sha512-Ra6IPI1spYLO+t62/3jQbodjOwAbto9wlpJdHZwkycm0Kit+GVpzHW/NMmSgY4rK1bjJ4qLAmCnaBzePO5Nkkg== dependencies: - "@smithy/protocol-http" "^4.1.0" - "@smithy/querystring-builder" "^3.0.3" - "@smithy/types" "^3.3.0" + "@smithy/protocol-http" "^4.1.3" + "@smithy/querystring-builder" "^3.0.6" + "@smithy/types" "^3.4.2" "@smithy/util-base64" "^3.0.0" tslib "^2.6.2" -"@smithy/hash-blob-browser@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.2.tgz#90281c1f183d93686fb4f26107f1819644d68829" - integrity sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg== +"@smithy/hash-blob-browser@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.5.tgz#db1cf756647f8f39b4214403482750afbb8f2236" + integrity sha512-Vi3eoNCmao4iKglS80ktYnBOIqZhjbDDwa1IIbF/VaJ8PsHnZTQ5wSicicPrU7nTI4JPFn92/txzWkh4GlK18Q== dependencies: "@smithy/chunked-blob-reader" "^3.0.0" "@smithy/chunked-blob-reader-native" "^3.0.0" - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/hash-node@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-3.0.3.tgz#82c5cb7b0f1a29ee7319081853d2d158c07dff24" - integrity sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw== +"@smithy/hash-node@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-3.0.6.tgz#7c1a869afcbd411eac04c4777dd193ea7ac4e588" + integrity sha512-c/FHEdKK/7DU2z6ZE91L36ahyXWayR3B+FzELjnYq7wH5YqIseM24V+pWCS9kFn1Ln8OFGTf+pyYPiHZuX0s/Q== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" "@smithy/util-buffer-from" "^3.0.0" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@smithy/hash-stream-node@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-3.1.2.tgz#89f0290ae44b113863878e75b10c484ff48af71c" - integrity sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g== +"@smithy/hash-stream-node@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-3.1.5.tgz#4c8d290f6e4d55fdb143d65d645031da12af7fc1" + integrity sha512-61CyFCzqN3VBfcnGX7mof/rkzLb8oHjm4Lr6ZwBIRpBssBb8d09ChrZAqinP2rUrA915BRNkq9NpJz18N7+3hQ== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@smithy/invalid-dependency@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz#8d9fd70e3a94b565a4eba4ffbdc95238e1930528" - integrity sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw== +"@smithy/invalid-dependency@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-3.0.6.tgz#3b3e30a55b92341412626b412fe919929871eeb1" + integrity sha512-czM7Ioq3s8pIXht7oD+vmgy4Wfb4XavU/k/irO8NdXFFOx7YAlsCCcKOh/lJD1mJSYQqiR7NmpZ9JviryD/7AQ== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" tslib "^2.6.2" "@smithy/is-array-buffer@^2.2.0": @@ -1944,177 +1982,177 @@ dependencies: tslib "^2.6.2" -"@smithy/md5-js@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-3.0.3.tgz#55ee40aa24075b096c39f7910590c18ff7660c98" - integrity sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q== +"@smithy/md5-js@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-3.0.6.tgz#cb8881ffef4ffbf68b0daf52d8add30dc57e3a7a" + integrity sha512-Ze690T8O3M5SVbb70WormwrKzVf9QQRtIuxtJDgpUQDkmt+PtdYDetBbyCbF9ryupxLw6tgzWKgwffAShhVIXQ== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@smithy/middleware-content-length@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz#1680aa4fb2a1c0505756103c9a5c2916307d9035" - integrity sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw== +"@smithy/middleware-content-length@^3.0.8": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-3.0.8.tgz#4e1c1631718e4d6dfe9a06f37faa90de92e884ed" + integrity sha512-VuyszlSO49WKh3H9/kIO2kf07VUwGV80QRiaDxUfP8P8UKlokz381ETJvwLhwuypBYhLymCYyNhB3fLAGBX2og== dependencies: - "@smithy/protocol-http" "^4.1.0" - "@smithy/types" "^3.3.0" + "@smithy/protocol-http" "^4.1.3" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/middleware-endpoint@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz#9b8a496d87a68ec43f3f1a0139868d6765a88119" - integrity sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw== - dependencies: - "@smithy/middleware-serde" "^3.0.3" - "@smithy/node-config-provider" "^3.1.4" - "@smithy/shared-ini-file-loader" "^3.1.4" - "@smithy/types" "^3.3.0" - "@smithy/url-parser" "^3.0.3" - "@smithy/util-middleware" "^3.0.3" +"@smithy/middleware-endpoint@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.3.tgz#8c84d40c9d26b77e2bbb99721fd4a3d379828505" + integrity sha512-KeM/OrK8MVFUsoJsmCN0MZMVPjKKLudn13xpgwIMpGTYpA8QZB2Xq5tJ+RE6iu3A6NhOI4VajDTwBsm8pwwrhg== + dependencies: + "@smithy/middleware-serde" "^3.0.6" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/shared-ini-file-loader" "^3.1.7" + "@smithy/types" "^3.4.2" + "@smithy/url-parser" "^3.0.6" + "@smithy/util-middleware" "^3.0.6" tslib "^2.6.2" -"@smithy/middleware-retry@^3.0.15": - version "3.0.15" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-3.0.15.tgz#9b96900cde70d8aafd267e13f4e79241be90e0c7" - integrity sha512-iTMedvNt1ApdvkaoE8aSDuwaoc+BhvHqttbA/FO4Ty+y/S5hW6Ci/CTScG7vam4RYJWZxdTElc3MEfHRVH6cgQ== - dependencies: - "@smithy/node-config-provider" "^3.1.4" - "@smithy/protocol-http" "^4.1.0" - "@smithy/service-error-classification" "^3.0.3" - "@smithy/smithy-client" "^3.2.0" - "@smithy/types" "^3.3.0" - "@smithy/util-middleware" "^3.0.3" - "@smithy/util-retry" "^3.0.3" +"@smithy/middleware-retry@^3.0.18": + version "3.0.18" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-3.0.18.tgz#58372e264ca0c3a35f0526c531eb433ed8472df0" + integrity sha512-YU1o/vYob6vlqZdd97MN8cSXRToknLXhFBL3r+c9CZcnxkO/rgNZ++CfgX2vsmnEKvlqdi26+SRtSzlVp5z6Mg== + dependencies: + "@smithy/node-config-provider" "^3.1.7" + "@smithy/protocol-http" "^4.1.3" + "@smithy/service-error-classification" "^3.0.6" + "@smithy/smithy-client" "^3.3.2" + "@smithy/types" "^3.4.2" + "@smithy/util-middleware" "^3.0.6" + "@smithy/util-retry" "^3.0.6" tslib "^2.6.2" uuid "^9.0.1" -"@smithy/middleware-serde@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz#74d974460f74d99f38c861e6862984543a880a66" - integrity sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA== +"@smithy/middleware-serde@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-3.0.6.tgz#9f7a9c152989b59c12865ef3a17acbdb7b6a1566" + integrity sha512-KKTUSl1MzOM0MAjGbudeaVNtIDo+PpekTBkCNwvfZlKndodrnvRo+00USatiyLOc0ujjO9UydMRu3O9dYML7ag== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/middleware-stack@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz#91845c7e61e6f137fa912b623b6def719a4f6ce7" - integrity sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA== +"@smithy/middleware-stack@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-3.0.6.tgz#e63d09b3e292b7a46ac3b9eb482973701de15a6f" + integrity sha512-2c0eSYhTQ8xQqHMcRxLMpadFbTXg6Zla5l0mwNftFCZMQmuhI7EbAJMx6R5eqfuV3YbJ3QGyS3d5uSmrHV8Khg== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/node-config-provider@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz#05647bed666aa8036a1ad72323c1942e5d421be1" - integrity sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ== +"@smithy/node-config-provider@^3.1.7": + version "3.1.7" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-3.1.7.tgz#6ae71aeff45e8c9792720986f0b1623cf6da671f" + integrity sha512-g3mfnC3Oo8pOI0dYuPXLtdW1WGVb3bR2tkV21GNkm0ZvQjLTtamXAwCWt/FCb0HGvKt3gHHmF1XerG0ICfalOg== dependencies: - "@smithy/property-provider" "^3.1.3" - "@smithy/shared-ini-file-loader" "^3.1.4" - "@smithy/types" "^3.3.0" + "@smithy/property-provider" "^3.1.6" + "@smithy/shared-ini-file-loader" "^3.1.7" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/node-http-handler@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz#be4195e45639e690d522cd5f11513ea822ff9d5f" - integrity sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg== +"@smithy/node-http-handler@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-3.2.2.tgz#1e659d52ba4d27123efc7b8a5c1abe76f97ea915" + integrity sha512-42Cy4/oT2O+00aiG1iQ7Kd7rE6q8j7vI0gFfnMlUiATvyo8vefJkhb7O10qZY0jAqo5WZdUzfl9IV6wQ3iMBCg== dependencies: - "@smithy/abort-controller" "^3.1.1" - "@smithy/protocol-http" "^4.1.0" - "@smithy/querystring-builder" "^3.0.3" - "@smithy/types" "^3.3.0" + "@smithy/abort-controller" "^3.1.4" + "@smithy/protocol-http" "^4.1.3" + "@smithy/querystring-builder" "^3.0.6" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/property-provider@^3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-3.1.3.tgz#afd57ea82a3f6c79fbda95e3cb85c0ee0a79f39a" - integrity sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g== +"@smithy/property-provider@^3.1.6": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-3.1.6.tgz#141a245ad8cac074d29a836ec992ef7dc3363bf7" + integrity sha512-NK3y/T7Q/Bw+Z8vsVs9MYIQ5v7gOX7clyrXcwhhIBQhbPgRl6JDrZbusO9qWDhcEus75Tg+VCxtIRfo3H76fpw== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/protocol-http@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-4.1.0.tgz#23519d8f45bf4f33960ea5415847bc2b620a010b" - integrity sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA== +"@smithy/protocol-http@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-4.1.3.tgz#91d894ec7d82c012c5674cb3e209800852f05abd" + integrity sha512-GcbMmOYpH9iRqtC05RbRnc/0FssxSTHlmaNhYBTgSgNCYpdR3Kt88u5GAZTBmouzv+Zlj/VRv92J9ruuDeJuEw== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/querystring-builder@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz#6b0e566f885bb84938d077c69e8f8555f686af13" - integrity sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw== +"@smithy/querystring-builder@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-3.0.6.tgz#bcb718b860697dca5257ca38dc8041a4696c486f" + integrity sha512-sQe08RunoObe+Usujn9+R2zrLuQERi3CWvRO3BvnoWSYUaIrLKuAIeY7cMeDax6xGyfIP3x/yFWbEKSXvOnvVg== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" "@smithy/util-uri-escape" "^3.0.0" tslib "^2.6.2" -"@smithy/querystring-parser@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz#272a6b83f88dfcbbec8283d72a6bde850cc00091" - integrity sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ== +"@smithy/querystring-parser@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-3.0.6.tgz#f30e7e244fa674d77bdfd3c65481c5dc0aa083ef" + integrity sha512-UJKw4LlEkytzz2Wq+uIdHf6qOtFfee/o7ruH0jF5I6UAuU+19r9QV7nU3P/uI0l6+oElRHmG/5cBBcGJrD7Ozg== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/service-error-classification@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz#73484255060a094aa9372f6cd972dcaf97e3ce80" - integrity sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ== +"@smithy/service-error-classification@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-3.0.6.tgz#e0ca00b79d9ccf00795284e01cfdc48b43b81d76" + integrity sha512-53SpchU3+DUZrN7J6sBx9tBiCVGzsib2e4sc512Q7K9fpC5zkJKs6Z9s+qbMxSYrkEkle6hnMtrts7XNkMJJMg== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" -"@smithy/shared-ini-file-loader@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz#7dceaf5a5307a2ee347ace8aba17312a1a3ede15" - integrity sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ== +"@smithy/shared-ini-file-loader@^3.1.7": + version "3.1.7" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.7.tgz#bdcf3f0213c3c5779c3fbb41580e9a217ad52e8f" + integrity sha512-IA4K2qTJYXkF5OfVN4vsY1hfnUZjaslEE8Fsr/gGFza4TAC2A9NfnZuSY2srQIbt9bwtjHiAayrRVgKse4Q7fA== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/signature-v4@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-4.1.0.tgz#251ff43dc1f4ad66776122732fea9e56efc56443" - integrity sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag== +"@smithy/signature-v4@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-4.1.3.tgz#1a5adc19563b8cf8f28ae1ada4d6cda7d351943d" + integrity sha512-YD2KYSCEEeFHcWZ1E3mLdAaHl8T/TANh6XwmocQ6nPcTdBfh4N5fusgnblnWDlnlU1/cUqEq3PiGi22GmT2Lkg== dependencies: "@smithy/is-array-buffer" "^3.0.0" - "@smithy/protocol-http" "^4.1.0" - "@smithy/types" "^3.3.0" + "@smithy/protocol-http" "^4.1.3" + "@smithy/types" "^3.4.2" "@smithy/util-hex-encoding" "^3.0.0" - "@smithy/util-middleware" "^3.0.3" + "@smithy/util-middleware" "^3.0.6" "@smithy/util-uri-escape" "^3.0.0" "@smithy/util-utf8" "^3.0.0" tslib "^2.6.2" -"@smithy/smithy-client@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-3.2.0.tgz#6db94024e4bdaefa079ac68dbea23dafbea230c8" - integrity sha512-pDbtxs8WOhJLJSeaF/eAbPgXg4VVYFlRcL/zoNYA5WbG3wBL06CHtBSg53ppkttDpAJ/hdiede+xApip1CwSLw== - dependencies: - "@smithy/middleware-endpoint" "^3.1.0" - "@smithy/middleware-stack" "^3.0.3" - "@smithy/protocol-http" "^4.1.0" - "@smithy/types" "^3.3.0" - "@smithy/util-stream" "^3.1.3" +"@smithy/smithy-client@^3.3.2": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-3.3.2.tgz#0c5511525f3e64ac5132d513c38d5d0d4a770719" + integrity sha512-RKDfhF2MTwXl7jan5d7QfS9eCC6XJbO3H+EZAvLQN8A5in4ib2Ml4zoeLo57w9QrqFekBPcsoC2hW3Ekw4vQ9Q== + dependencies: + "@smithy/middleware-endpoint" "^3.1.3" + "@smithy/middleware-stack" "^3.0.6" + "@smithy/protocol-http" "^4.1.3" + "@smithy/types" "^3.4.2" + "@smithy/util-stream" "^3.1.6" tslib "^2.6.2" -"@smithy/types@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.3.0.tgz#fae037c733d09bc758946a01a3de0ef6e210b16b" - integrity sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA== +"@smithy/types@^3.4.2": + version "3.4.2" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.4.2.tgz#aa2d087922d57205dbad68df8a45c848699c551e" + integrity sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w== dependencies: tslib "^2.6.2" -"@smithy/url-parser@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-3.0.3.tgz#e8a060d9810b24b1870385fc2b02485b8a6c5955" - integrity sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A== +"@smithy/url-parser@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-3.0.6.tgz#98b426f9a492e0c992fcd5dceac35444c2632837" + integrity sha512-47Op/NU8Opt49KyGpHtVdnmmJMsp2hEwBdyjuFB9M2V5QVOwA7pBhhxKN5z6ztKGrMw76gd8MlbPuzzvaAncuQ== dependencies: - "@smithy/querystring-parser" "^3.0.3" - "@smithy/types" "^3.3.0" + "@smithy/querystring-parser" "^3.0.6" + "@smithy/types" "^3.4.2" tslib "^2.6.2" "@smithy/util-base64@^3.0.0": @@ -2163,37 +2201,37 @@ dependencies: tslib "^2.6.2" -"@smithy/util-defaults-mode-browser@^3.0.15": - version "3.0.15" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.15.tgz#df73b9ae3dddc9126e0bb93ebc720b09d7163858" - integrity sha512-FZ4Psa3vjp8kOXcd3HJOiDPBCWtiilLl57r0cnNtq/Ga9RSDrM5ERL6xt+tO43+2af6Pn5Yp92x2n5vPuduNfg== +"@smithy/util-defaults-mode-browser@^3.0.18": + version "3.0.18" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.18.tgz#c3904b71db96c9b99861fc2017fea503fcff12a4" + integrity sha512-/eveCzU6Z6Yw8dlYQLA4rcK30XY0E4L3lD3QFHm59mzDaWYelrXE1rlynuT3J6qxv+5yNy3a1JuzhG5hk5hcmw== dependencies: - "@smithy/property-provider" "^3.1.3" - "@smithy/smithy-client" "^3.2.0" - "@smithy/types" "^3.3.0" + "@smithy/property-provider" "^3.1.6" + "@smithy/smithy-client" "^3.3.2" + "@smithy/types" "^3.4.2" bowser "^2.11.0" tslib "^2.6.2" -"@smithy/util-defaults-mode-node@^3.0.15": - version "3.0.15" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.15.tgz#d52476e1f2e66525d918b51f8d5a9b0972bf518e" - integrity sha512-KSyAAx2q6d0t6f/S4XB2+3+6aQacm3aLMhs9aLMqn18uYGUepbdssfogW5JQZpc6lXNBnp0tEnR5e9CEKmEd7A== - dependencies: - "@smithy/config-resolver" "^3.0.5" - "@smithy/credential-provider-imds" "^3.2.0" - "@smithy/node-config-provider" "^3.1.4" - "@smithy/property-provider" "^3.1.3" - "@smithy/smithy-client" "^3.2.0" - "@smithy/types" "^3.3.0" +"@smithy/util-defaults-mode-node@^3.0.18": + version "3.0.18" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.18.tgz#6b46911f2f749bb048cdc287d7237be9d58f4a6b" + integrity sha512-9cfzRjArtOFPlTYRREJk00suUxVXTgbrzVncOyMRTUeMKnecG/YentLF3cORa+R6mUOMSrMSnT18jos1PKqK6Q== + dependencies: + "@smithy/config-resolver" "^3.0.8" + "@smithy/credential-provider-imds" "^3.2.3" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/property-provider" "^3.1.6" + "@smithy/smithy-client" "^3.3.2" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/util-endpoints@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz#e3a7a4d1c41250bfd2b2d890d591273a7d8934be" - integrity sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg== +"@smithy/util-endpoints@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-2.1.2.tgz#e1d789d598da9ab955b8cf3257ab2f263c35031a" + integrity sha512-FEISzffb4H8DLzGq1g4MuDpcv6CIG15fXoQzDH9SjpRJv6h7J++1STFWWinilG0tQh9H1v2UKWG19Jjr2B16zQ== dependencies: - "@smithy/node-config-provider" "^3.1.4" - "@smithy/types" "^3.3.0" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/types" "^3.4.2" tslib "^2.6.2" "@smithy/util-hex-encoding@^3.0.0": @@ -2203,31 +2241,31 @@ dependencies: tslib "^2.6.2" -"@smithy/util-middleware@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-3.0.3.tgz#07bf9602682f5a6c55bc2f0384303f85fc68c87e" - integrity sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw== +"@smithy/util-middleware@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-3.0.6.tgz#463c41e74d6e8d758f6cceba4dbed4dc5a4afe50" + integrity sha512-BxbX4aBhI1O9p87/xM+zWy0GzT3CEVcXFPBRDoHAM+pV0eSW156pR+PSYEz0DQHDMYDsYAflC2bQNz2uaDBUZQ== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/util-retry@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-3.0.3.tgz#9b2ac0dbb1c81f69812a8affa4d772bebfc0e049" - integrity sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w== +"@smithy/util-retry@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-3.0.6.tgz#297de1cd5a836fb957ab2ad3439041e848815499" + integrity sha512-BRZiuF7IwDntAbevqMco67an0Sr9oLQJqqRCsSPZZHYRnehS0LHDAkJk/pSmI7Z8c/1Vet294H7fY2fWUgB+Rg== dependencies: - "@smithy/service-error-classification" "^3.0.3" - "@smithy/types" "^3.3.0" + "@smithy/service-error-classification" "^3.0.6" + "@smithy/types" "^3.4.2" tslib "^2.6.2" -"@smithy/util-stream@^3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-3.1.3.tgz#699ee2397cc1d474e46d2034039d5263812dca64" - integrity sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw== +"@smithy/util-stream@^3.1.6": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-3.1.6.tgz#424dbb4e321129807e5fb01d961ef902ee7c04f8" + integrity sha512-lQEUfTx1ht5CRdvIjdAN/gUL6vQt2wSARGGLaBHNe+iJSkRHlWzY+DOn0mFTmTgyU3jcI5n9DkT5gTzYuSOo6A== dependencies: - "@smithy/fetch-http-handler" "^3.2.4" - "@smithy/node-http-handler" "^3.1.4" - "@smithy/types" "^3.3.0" + "@smithy/fetch-http-handler" "^3.2.7" + "@smithy/node-http-handler" "^3.2.2" + "@smithy/types" "^3.4.2" "@smithy/util-base64" "^3.0.0" "@smithy/util-buffer-from" "^3.0.0" "@smithy/util-hex-encoding" "^3.0.0" @@ -2257,13 +2295,13 @@ "@smithy/util-buffer-from" "^3.0.0" tslib "^2.6.2" -"@smithy/util-waiter@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-3.1.2.tgz#2d40c3312f3537feee763459a19acafab4c75cf3" - integrity sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw== +"@smithy/util-waiter@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-3.1.5.tgz#56b3a0fa6498ed22dfee7f40c64d13a54dd04fcc" + integrity sha512-jYOSvM3H6sZe3CHjzD2VQNCjWBJs+4DbtwBMvUp9y5EnnwNa7NQxTeYeQw0CKCAdGGZ3QvVkyJmvbvs5M/B10A== dependencies: - "@smithy/abort-controller" "^3.1.1" - "@smithy/types" "^3.3.0" + "@smithy/abort-controller" "^3.1.4" + "@smithy/types" "^3.4.2" tslib "^2.6.2" "@szmarczak/http-timer@^5.0.1": @@ -2339,17 +2377,17 @@ "@types/node" "*" "@types/eslint@^8.56.10": - version "8.56.11" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.11.tgz#e2ff61510a3b9454b3329fe7731e3b4c6f780041" - integrity sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q== + version "8.56.12" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.12.tgz#1657c814ffeba4d2f84c0d4ba0f44ca7ea1ca53a" + integrity sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/glob@~7.2.0": version "7.2.0" @@ -2399,9 +2437,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@^29.5.12": - version "29.5.12" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" - integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== + version "29.5.13" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.13.tgz#8bc571659f401e6a719a7bf0dbcb8b78c71a8adc" + integrity sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2433,10 +2471,10 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@^22.1.0": - version "22.5.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.0.tgz#10f01fe9465166b4cab72e75f60d8b99d019f958" - integrity sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg== +"@types/node@*", "@types/node@^22.5.5": + version "22.5.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.5.tgz#52f939dd0f65fc552a4ad0b392f3c466cc5d7a44" + integrity sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA== dependencies: undici-types "~6.19.2" @@ -2445,15 +2483,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== -"@types/node@^17": - version "17.0.45" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" - integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== - "@types/node@^20.0.0": - version "20.16.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.1.tgz#0b44b15271d0e2191ca68faf1fbe506e06aed732" - integrity sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ== + version "20.16.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.5.tgz#d43c7f973b32ffdf9aa7bd4f80e1072310fd7a53" + integrity sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA== dependencies: undici-types "~6.19.2" @@ -2538,13 +2571,13 @@ "@typescript-eslint/types" "7.18.0" "@typescript-eslint/visitor-keys" "7.18.0" -"@typescript-eslint/scope-manager@8.2.0": - version "8.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.2.0.tgz#4a4bd7e7df5522acc8795c3b6f21e8c41b951138" - integrity sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw== +"@typescript-eslint/scope-manager@8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.6.0.tgz#28cc2fc26a84b75addf45091a2c6283e29e2c982" + integrity sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw== dependencies: - "@typescript-eslint/types" "8.2.0" - "@typescript-eslint/visitor-keys" "8.2.0" + "@typescript-eslint/types" "8.6.0" + "@typescript-eslint/visitor-keys" "8.6.0" "@typescript-eslint/type-utils@7.18.0": version "7.18.0" @@ -2561,10 +2594,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== -"@typescript-eslint/types@8.2.0": - version "8.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.2.0.tgz#dfe9895a2812f7c6bf7af863054c22a67060420c" - integrity sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ== +"@typescript-eslint/types@8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.6.0.tgz#cdc3a16f83f2f0663d6723e9fd032331cdd9f51c" + integrity sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw== "@typescript-eslint/typescript-estree@7.18.0": version "7.18.0" @@ -2580,15 +2613,15 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/typescript-estree@8.2.0": - version "8.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.2.0.tgz#fbdb93a1c7ac7f1f96ae2de4fc97cd64c60ae894" - integrity sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA== +"@typescript-eslint/typescript-estree@8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.6.0.tgz#f945506de42871f04868371cb5bf21e8f7266e01" + integrity sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g== dependencies: - "@typescript-eslint/types" "8.2.0" - "@typescript-eslint/visitor-keys" "8.2.0" + "@typescript-eslint/types" "8.6.0" + "@typescript-eslint/visitor-keys" "8.6.0" debug "^4.3.4" - globby "^11.1.0" + fast-glob "^3.3.2" is-glob "^4.0.3" minimatch "^9.0.4" semver "^7.6.0" @@ -2605,14 +2638,14 @@ "@typescript-eslint/typescript-estree" "7.18.0" "@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0": - version "8.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.2.0.tgz#02d442285925f28d520587185f295f932702e733" - integrity sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg== + version "8.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.6.0.tgz#175fe893f32804bed1e72b3364ea6bbe1044181c" + integrity sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.2.0" - "@typescript-eslint/types" "8.2.0" - "@typescript-eslint/typescript-estree" "8.2.0" + "@typescript-eslint/scope-manager" "8.6.0" + "@typescript-eslint/types" "8.6.0" + "@typescript-eslint/typescript-estree" "8.6.0" "@typescript-eslint/visitor-keys@7.18.0": version "7.18.0" @@ -2622,12 +2655,12 @@ "@typescript-eslint/types" "7.18.0" eslint-visitor-keys "^3.4.3" -"@typescript-eslint/visitor-keys@8.2.0": - version "8.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.2.0.tgz#f6abb3b6508898a117175ddc11f9b9869cc96834" - integrity sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q== +"@typescript-eslint/visitor-keys@8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.6.0.tgz#5432af4a1753f376f35ab5b891fc9db237aaf76f" + integrity sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg== dependencies: - "@typescript-eslint/types" "8.2.0" + "@typescript-eslint/types" "8.6.0" eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": @@ -2648,9 +2681,9 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.1.1: - version "8.3.3" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" - integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== dependencies: acorn "^8.11.0" @@ -2772,7 +2805,7 @@ array-buffer-byte-length@^1.0.1: call-bind "^1.0.5" is-array-buffer "^3.0.4" -array-includes@^3.1.7: +array-includes@^3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== @@ -2789,7 +2822,7 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.findlastindex@^1.2.3: +array.prototype.findlastindex@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== @@ -3017,7 +3050,7 @@ browserslist@^4.23.1: node-releases "^2.0.18" update-browserslist-db "^1.1.0" -bs-logger@0.x: +bs-logger@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== @@ -3110,9 +3143,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001646: - version "1.0.30001651" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz#52de59529e8b02b1aedcaaf5c05d9e23c0c28138" - integrity sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg== + version "1.0.30001662" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz#3574b22dfec54a3f3b6787331da1040fe8e763ec" + integrity sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA== capital-case@^1.0.4: version "1.0.4" @@ -3182,9 +3215,9 @@ ci-info@^3.2.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" - integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== clean-stack@^3.0.1: version "3.0.1" @@ -3313,6 +3346,14 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + constant-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" @@ -3438,12 +3479,12 @@ dateformat@^4.6.3: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6: - version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@^3.2.7: version "3.2.7" @@ -3592,9 +3633,9 @@ ejs@^3.1.10, ejs@^3.1.8: jake "^10.8.5" electron-to-chromium@^1.5.4: - version "1.5.13" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6" - integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q== + version "1.5.26" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.26.tgz#449b4fa90e83ab98abbe3b6a96c8ee395de94452" + integrity sha512-Z+OMe9M/V6Ep9n/52+b7lkvYEps26z4Yz3vjWL1V61W0q+VLF1pOHhMY17sa4roz4AWmULSI8E6SAojZA5L0YQ== emittery@^0.13.1: version "0.13.1" @@ -3717,9 +3758,9 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" escalade@^3.1.1, escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" @@ -3756,49 +3797,50 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== +eslint-module-utils@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz#b99b211ca4318243f09661fae088f373ad5243c4" + integrity sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ== dependencies: debug "^3.2.7" eslint-plugin-import@^2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + version "2.30.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz#21ceea0fc462657195989dd780e50c92fe95f449" + integrity sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw== dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" array.prototype.flat "^1.3.2" array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" + eslint-module-utils "^2.9.0" + hasown "^2.0.2" + is-core-module "^2.15.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" semver "^6.3.1" tsconfig-paths "^3.15.0" eslint-plugin-jest@^28.6.0: - version "28.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.8.0.tgz#54f597b5a3295ad04ec946baa245ad02b9b2bca0" - integrity sha512-Tubj1hooFxCl52G4qQu0edzV/+EZzPUeN8p2NnW5uu4fbDs+Yo7+qDVDc4/oG3FbCqEBmu/OC3LSsyiU22oghw== + version "28.8.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.8.3.tgz#c5699bba0ad06090ad613535e4f1572f4c2567c0" + integrity sha512-HIQ3t9hASLKm2IhIOqnu+ifw7uLZkIlR7RYNv7fMcEi/p0CIiJmfriStQS2LDkgtY4nyLbIZAD+JL347Yc2ETQ== dependencies: "@typescript-eslint/utils" "^6.0.0 || ^7.0.0 || ^8.0.0" eslint-plugin-sf-plugin@^1.17.4: - version "1.20.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-sf-plugin/-/eslint-plugin-sf-plugin-1.20.5.tgz#167657e6dd319e5e5bcc8a733668fff8e7a8089a" - integrity sha512-V8Y18rFPvVEIhWnXyQrgmdNKGFYRmDPY32lTN2vu0FCY9RkIF9ARDUAmGc5Zpz3J/faDNRtVQVra5dAJyqrMTA== + version "1.20.7" + resolved "https://registry.yarnpkg.com/eslint-plugin-sf-plugin/-/eslint-plugin-sf-plugin-1.20.7.tgz#f22dfe52f6731e68e6ff54debccc938e7802645c" + integrity sha512-Lps86ebnRrHTYRVMJPvoQtvM+hmTzkEj0mbD3d0UfPPvTZ2dy5HtFk/8OspG9HweyYbTJU6qoTXWDwIH09LD0g== dependencies: - "@salesforce/core" "^8.4.0" + "@salesforce/core" "^8.5.4" "@typescript-eslint/utils" "^7.18.0" eslint-restricted-globals@~0.2.0: @@ -3833,15 +3875,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.57, eslint@^8.57.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -4359,6 +4401,11 @@ got@^13: p-cancelable "^3.0.0" responselike "^3.0.0" +graceful-fs@4.2.10: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" @@ -4565,6 +4612,11 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + inquirer@^7.0.0: version "7.3.3" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" @@ -4665,7 +4717,7 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.13.0, is-core-module@^2.13.1: +is-core-module@^2.13.0, is-core-module@^2.15.1: version "2.15.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== @@ -5526,7 +5578,7 @@ lodash.isstring@^4.0.1: resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== -lodash.memoize@4.x: +lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== @@ -5590,7 +5642,7 @@ make-dir@^4.0.0: dependencies: semver "^7.5.3" -make-error@1.x, make-error@^1.1.1: +make-error@^1.1.1, make-error@^1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -5618,9 +5670,9 @@ meriyah@^4.3.9: integrity sha512-Rbiu0QPIxTXgOXwiIpRVJfZRQ2FWyfzYrOGBs9SN5RbaXg1CN5ELn/plodwWwluX93yzc4qO/bNIen1ThGFCxw== micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" picomatch "^2.3.1" @@ -5683,12 +5735,7 @@ mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: +ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -5818,7 +5865,7 @@ object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" -object.fromentries@^2.0.7: +object.fromentries@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== @@ -5828,7 +5875,7 @@ object.fromentries@^2.0.7: es-abstract "^1.23.2" es-object-atoms "^1.0.0" -object.groupby@^1.0.1: +object.groupby@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== @@ -5837,7 +5884,7 @@ object.groupby@^1.0.1: define-properties "^1.2.1" es-abstract "^1.23.2" -object.values@^1.1.7: +object.values@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== @@ -5847,18 +5894,18 @@ object.values@^1.1.7: es-object-atoms "^1.0.0" oclif@^4.0.3: - version "4.14.22" - resolved "https://registry.yarnpkg.com/oclif/-/oclif-4.14.22.tgz#cc389d01bcdf74a3f824abaa6cf8bcd3d9401bcb" - integrity sha512-6kcjM6MowDIozatGRiN7COMYrTzDVeyNDa1cUO8I1HgmWoQ5eoC8bq1cicLpWZawcyfJwzGi0oz67i1W05W/Og== + version "4.14.34" + resolved "https://registry.yarnpkg.com/oclif/-/oclif-4.14.34.tgz#45ddd207ab648a0996ec845e975087ac2fe10479" + integrity sha512-NA604h6cPhiDQTLjjwaJ2yGq3gv6OyHIMIdwt9xTiOqMjFOrKXpoqXiwmKN6bGoeWC1SuaSJqlfoXThlAKn+Ag== dependencies: - "@aws-sdk/client-cloudfront" "^3.624.0" - "@aws-sdk/client-s3" "^3.633.0" + "@aws-sdk/client-cloudfront" "^3.645.0" + "@aws-sdk/client-s3" "^3.651.1" "@inquirer/confirm" "^3.1.22" "@inquirer/input" "^2.2.4" "@inquirer/select" "^2.3.10" "@oclif/core" "^4" - "@oclif/plugin-help" "^6.2.8" - "@oclif/plugin-not-found" "^3.2.15" + "@oclif/plugin-help" "^6.2.10" + "@oclif/plugin-not-found" "^3.2.21" "@oclif/plugin-warn-if-update-available" "^3.1.11" async-retry "^1.3.3" chalk "^4" @@ -5872,7 +5919,7 @@ oclif@^4.0.3: lodash "^4.17.21" normalize-package-data "^6" semver "^7.6.3" - sort-package-json "^2.10.0" + sort-package-json "^2.10.1" tiny-jsonc "^1.0.1" validate-npm-package-name "^5.0.1" @@ -6078,9 +6125,9 @@ path-parse@^1.0.7: integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.2.tgz#324377a83e5049cbecadc5554d6a63a9a4866b36" - integrity sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw== + version "6.3.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" + integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== path-type@^4.0.0: version "4.0.0" @@ -6088,9 +6135,9 @@ path-type@^4.0.0: integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -6172,10 +6219,10 @@ pino@^8.16.0, pino@^8.19.0: sonic-boom "^3.7.0" thread-stream "^2.6.0" -pino@^9.3.2: - version "9.3.2" - resolved "https://registry.yarnpkg.com/pino/-/pino-9.3.2.tgz#a530d6d28f1d954b6f54416a218cbb616f52f901" - integrity sha512-WtARBjgZ7LNEkrGWxMBN/jvlFiE17LTbBoH0konmBU684Kd0uIiDwBXlcTCW7iJnA6HfIKwUssS/2AC6cDEanw== +pino@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-9.4.0.tgz#e4600ff199efc744856a5b3b71c53e38998eae5a" + integrity sha512-nbkQb5+9YPhQRz/BeQmrWpEknAaqjpAqRK8NwJpmrX/JHu7JuZC5G1CeAwJDJfGes4h+YihC6in3Q2nGb+Y09w== dependencies: atomic-sleep "^1.0.0" fast-redact "^3.1.1" @@ -6257,6 +6304,11 @@ proper-lockfile@^4.1.2: retry "^0.12.0" signal-exit "^3.0.2" +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + proxy-agent@^6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.4.0.tgz#b4e2dd51dee2b377748aef8d45604c2d7608652d" @@ -6276,20 +6328,15 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== @@ -6299,11 +6346,6 @@ pure-rand@^6.0.0: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -6396,6 +6438,13 @@ regexp.prototype.flags@^1.5.2: es-errors "^1.3.0" set-function-name "^2.0.1" +registry-auth-token@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" + integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== + dependencies: + "@pnpm/npm-conf" "^2.1.0" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -6406,11 +6455,6 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - resolve-alpn@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" @@ -6553,9 +6597,9 @@ safe-regex-test@^1.0.3: is-regex "^1.1.4" safe-stable-stringify@^2.3.1: - version "2.4.3" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" - integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== "safer-buffer@>= 2.1.2 < 3": version "2.1.2" @@ -6745,9 +6789,9 @@ sonic-boom@^3.0.0, sonic-boom@^3.7.0: atomic-sleep "^1.0.0" sonic-boom@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.0.1.tgz#515b7cef2c9290cb362c4536388ddeece07aed30" - integrity sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ== + version "4.1.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.1.0.tgz#4f039663ba191fac5cfe4f1dc330faac079e4342" + integrity sha512-NGipjjRicyJJ03rPiZCJYjwlsuP2d1/5QUviozRXC7S3WdVWNK5e3Ojieb9CCyfhq2UC+3+SRd9nG3I2lPRvUw== dependencies: atomic-sleep "^1.0.0" @@ -6756,7 +6800,7 @@ sort-object-keys@^1.1.3: resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== -sort-package-json@^2.10.0: +sort-package-json@^2.10.1: version "2.10.1" resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-2.10.1.tgz#18e7fa0172233cb2d4d926f7c99e6bfcf4d1d25c" integrity sha512-d76wfhgUuGypKqY72Unm5LFnMpACbdxXsLPcL27pOsSrmVqH3PztFp1uq+Z22suk15h7vXmTesuh2aEjdCqb5w== @@ -6994,6 +7038,18 @@ tiny-jsonc@^1.0.1: resolved "https://registry.yarnpkg.com/tiny-jsonc/-/tiny-jsonc-1.0.1.tgz#71de47c9d812b411e87a9f3ab4a5fe42cd8d8f9c" integrity sha512-ik6BCxzva9DoiEfDX/li0L2cWKPPENYvixUprFdl3YPi4bZZUhDnNI9YUkacrv+uIG90dnxR5mNqaoD6UhD6Bw== +tldts-core@^6.1.47: + version "6.1.47" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.47.tgz#bb6deb97abb6ef04243af60968d2d0055a65cbd7" + integrity sha512-6SWyFMnlst1fEt7GQVAAu16EGgFK0cLouH/2Mk6Ftlwhv3Ol40L0dlpGMcnnNiiOMyD2EV/aF3S+U2nKvvLvrA== + +tldts@^6.1.32: + version "6.1.47" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.47.tgz#bab4edf5867e2bbd763e72d9435289de97b082df" + integrity sha512-R/K2tZ5MiY+mVrnSkNJkwqYT2vUv1lcT6wJvd2emGaMJ7PHUGRY4e3tUsdFCXgqxi2QgbHjL3yJgXCo40v9Hxw== + dependencies: + tldts-core "^6.1.47" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -7024,14 +7080,11 @@ to-regex-range@^5.0.1: is-number "^7.0.0" tough-cookie@*: - version "4.1.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" - integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + version "5.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.0.0.tgz#6b6518e2b5c070cf742d872ee0f4f92d69eac1af" + integrity sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q== dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" + tldts "^6.1.32" tr46@~0.0.3: version "0.0.3" @@ -7044,19 +7097,19 @@ ts-api-utils@^1.3.0: integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== ts-jest@^29.1.4: - version "29.2.4" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.4.tgz#38ccf487407d7a63054a72689f6f99b075e296e5" - integrity sha512-3d6tgDyhCI29HlpwIq87sNuI+3Q6GLTTCeYRHCs7vDz+/3GCMwEtV9jezLyl4ZtnBgx00I7hm8PCP8cTksMGrw== + version "29.2.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" + integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== dependencies: - bs-logger "0.x" + bs-logger "^0.2.6" ejs "^3.1.10" - fast-json-stable-stringify "2.x" + fast-json-stable-stringify "^2.1.0" jest-util "^29.0.0" json5 "^2.2.3" - lodash.memoize "4.x" - make-error "1.x" - semver "^7.5.3" - yargs-parser "^21.0.1" + lodash.memoize "^4.1.2" + make-error "^1.3.6" + semver "^7.6.3" + yargs-parser "^21.1.1" ts-node@^10, ts-node@^10.9.1: version "10.9.2" @@ -7103,9 +7156,9 @@ tslib@^1.9.0: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.5.0, tslib@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== tunnel-agent@*, tunnel-agent@^0.6.0: version "0.6.0" @@ -7126,7 +7179,7 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-detect@^4.0.8: +type-detect@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== @@ -7186,9 +7239,9 @@ typed-array-length@^1.0.6: possible-typed-array-names "^1.0.0" typescript@^5.4.5: - version "5.5.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" - integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== + version "5.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" + integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== unbox-primitive@^1.0.2: version "1.0.2" @@ -7210,11 +7263,6 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - universalify@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" @@ -7249,14 +7297,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -7468,7 +7508,7 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yargs-parser@^21.0.1, yargs-parser@^21.1.1: +yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==