From 5b1f100c1282c05a26f5d4e7c03d01f2bb5d9d07 Mon Sep 17 00:00:00 2001 From: Christer Date: Mon, 5 May 2025 14:17:04 +0200 Subject: [PATCH 1/7] chore: Added config to cli_tools exports --- example/main.dart | 1 - lib/cli_tools.dart | 3 ++- test/documentation_generator/generate_markdown_test.dart | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/example/main.dart b/example/main.dart index d8c724d..7343709 100644 --- a/example/main.dart +++ b/example/main.dart @@ -3,7 +3,6 @@ import 'dart:io' show exit; import 'package:args/command_runner.dart'; import 'package:cli_tools/cli_tools.dart'; -import 'package:cli_tools/config.dart'; void main(List args) async { var commandRunner = BetterCommandRunner( diff --git a/lib/cli_tools.dart b/lib/cli_tools.dart index 778d5d1..e3e969b 100644 --- a/lib/cli_tools.dart +++ b/lib/cli_tools.dart @@ -1,7 +1,8 @@ export 'analytics.dart'; export 'better_command_runner.dart'; +export 'config.dart'; +export 'docs_generator.dart'; export 'local_storage_manager.dart'; export 'logger.dart'; export 'package_version.dart'; -export 'docs_generator.dart'; export 'prompts.dart'; diff --git a/test/documentation_generator/generate_markdown_test.dart b/test/documentation_generator/generate_markdown_test.dart index fcbb2a1..9effcde 100644 --- a/test/documentation_generator/generate_markdown_test.dart +++ b/test/documentation_generator/generate_markdown_test.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:args/command_runner.dart'; import 'package:cli_tools/cli_tools.dart'; -import 'package:cli_tools/src/config/configuration.dart'; import 'package:test/test.dart'; class AddSpiceCommand extends Command { From 63d1faa47cd4672373553a3f1e661cd022adac40 Mon Sep 17 00:00:00 2001 From: Christer Date: Mon, 5 May 2025 19:30:26 +0200 Subject: [PATCH 2/7] refactor: Simplified ConfigResolver --- lib/src/better_command_runner/better_command.dart | 14 +++++++------- .../better_command_runner.dart | 8 ++++---- lib/src/better_command_runner/config_resolver.dart | 9 ++++----- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/lib/src/better_command_runner/better_command.dart b/lib/src/better_command_runner/better_command.dart index a4d71b6..8dccc1c 100644 --- a/lib/src/better_command_runner/better_command.dart +++ b/lib/src/better_command_runner/better_command.dart @@ -14,7 +14,7 @@ abstract class BetterCommand extends Command { final ArgParser _argParser; /// The configuration resolver for this command. - ConfigResolver? _configResolver; + ConfigResolver? _configResolver; /// The option definitions for this command. final List options; @@ -29,6 +29,9 @@ abstract class BetterCommand extends Command { /// [configResolver] and [messageOutput] are optional and will default to the /// values of the command runner (if any). /// + /// If no [configResolver] is provided then [DefaultConfigResolver] will be used, + /// which uses the command line arguments and environment variables as input sources. + /// /// To define a bespoke set of options, it is recommended to define /// a proper options enum. It can included any of the default options /// as well as any custom options. Example: @@ -48,14 +51,11 @@ abstract class BetterCommand extends Command { /// final ConfigOptionBase option; /// } /// ``` - /// - /// If [configResolver] is not provided then [DefaultConfigResolver] will be used, - /// which uses the command line arguments and environment variables as input sources. BetterCommand({ MessageOutput? messageOutput = _defaultMessageOutput, int? wrapTextColumn, this.options = const [], - ConfigResolver? configResolver, + ConfigResolver? configResolver, }) : _messageOutput = messageOutput, _argParser = ArgParser(usageLineLength: wrapTextColumn), _configResolver = configResolver { @@ -72,11 +72,11 @@ abstract class BetterCommand extends Command { return _messageOutput; } - ConfigResolver get configResolver { + ConfigResolver get configResolver { if (runner case BetterCommandRunner runner) { return runner.configResolver; } - return _configResolver ??= DefaultConfigResolver(); + return _configResolver ??= DefaultConfigResolver(); } @override diff --git a/lib/src/better_command_runner/better_command_runner.dart b/lib/src/better_command_runner/better_command_runner.dart index d72bd71..bd3499a 100644 --- a/lib/src/better_command_runner/better_command_runner.dart +++ b/lib/src/better_command_runner/better_command_runner.dart @@ -72,7 +72,7 @@ class BetterCommandRunner /// The gloabl option definitions. late final List _globalOptions; - final ConfigResolver _configResolver; + final ConfigResolver _configResolver; Configuration? _globalConfiguration; @@ -151,12 +151,12 @@ class BetterCommandRunner OnAnalyticsEvent? onAnalyticsEvent, int? wrapTextColumn, List? globalOptions, - ConfigResolver? configResolver, + ConfigResolver? configResolver, }) : _messageOutput = messageOutput, _setLogLevel = setLogLevel, _onBeforeRunCommand = onBeforeRunCommand, _onAnalyticsEvent = onAnalyticsEvent, - _configResolver = configResolver ?? DefaultConfigResolver(), + _configResolver = configResolver ?? DefaultConfigResolver(), super( usageLineLength: wrapTextColumn, ) { @@ -182,7 +182,7 @@ class BetterCommandRunner /// The configuration resolver used for the global configuration. /// It is also used for the command configurations unless they have their own. - ConfigResolver get configResolver => _configResolver; + ConfigResolver get configResolver => _configResolver; /// Adds a list of commands to the command runner. void addCommands(List> commands) { diff --git a/lib/src/better_command_runner/config_resolver.dart b/lib/src/better_command_runner/config_resolver.dart index 5ae57bb..6e518bb 100644 --- a/lib/src/better_command_runner/config_resolver.dart +++ b/lib/src/better_command_runner/config_resolver.dart @@ -14,9 +14,9 @@ import 'package:cli_tools/config.dart' show Configuration, OptionDefinition; /// /// If invoked from global command runner or a command that has /// subcommands, set [ignoreUnexpectedPositionalArgs] to true. -abstract interface class ConfigResolver { +abstract interface class ConfigResolver { /// {@macro config_resolver} - Configuration resolveConfiguration({ + Configuration resolveConfiguration({ required Iterable options, ArgResults? argResults, bool ignoreUnexpectedPositionalArgs = false, @@ -25,15 +25,14 @@ abstract interface class ConfigResolver { /// The default behavior is to invoke this using the [argResults] and /// [Platform.environment] as input. -class DefaultConfigResolver - implements ConfigResolver { +class DefaultConfigResolver implements ConfigResolver { final Map _env; DefaultConfigResolver({Map? env}) : _env = env ?? Platform.environment; @override - Configuration resolveConfiguration({ + Configuration resolveConfiguration({ required Iterable options, ArgResults? argResults, bool ignoreUnexpectedPositionalArgs = false, From cecebdcc8495034fb15d4fec80bd322761a5b5c2 Mon Sep 17 00:00:00 2001 From: Christer Date: Tue, 6 May 2025 09:39:17 +0200 Subject: [PATCH 3/7] fix: Fixed type bug in BetterCommand.parent --- lib/src/better_command_runner/better_command.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/better_command_runner/better_command.dart b/lib/src/better_command_runner/better_command.dart index 8dccc1c..7f7a719 100644 --- a/lib/src/better_command_runner/better_command.dart +++ b/lib/src/better_command_runner/better_command.dart @@ -80,7 +80,8 @@ abstract class BetterCommand extends Command { } @override - BetterCommand? get parent => super.parent as BetterCommand?; + BetterCommand? get parent => + super.parent as BetterCommand?; @override BetterCommandRunner? get runner => From aa52efc484e7a011a99f38ccb292863752bebf01 Mon Sep 17 00:00:00 2001 From: Christer Date: Tue, 6 May 2025 09:43:54 +0200 Subject: [PATCH 4/7] refactor: Removed ConfigResolver delegate, replaced by method override --- .../better_command_runner/better_command.dart | 64 +++++++++---------- .../better_command_runner.dart | 57 ++++++++--------- .../config_resolver.dart | 48 -------------- 3 files changed, 57 insertions(+), 112 deletions(-) diff --git a/lib/src/better_command_runner/better_command.dart b/lib/src/better_command_runner/better_command.dart index 7f7a719..b63f7df 100644 --- a/lib/src/better_command_runner/better_command.dart +++ b/lib/src/better_command_runner/better_command.dart @@ -1,20 +1,26 @@ import 'dart:async' show FutureOr; +import 'dart:io' show Platform; import 'package:args/args.dart'; import 'package:args/command_runner.dart'; -import 'package:cli_tools/better_command_runner.dart'; import 'package:cli_tools/config.dart'; +import 'better_command_runner.dart'; import 'config_resolver.dart'; +/// An extension of [Command] with additional features. +/// +/// The [BetterCommand] class uses the config library to provide +/// a more enhanced command line interface for running commands and handling +/// command line arguments, environment variables, and configuration. abstract class BetterCommand extends Command { static const _defaultMessageOutput = MessageOutput(usageLogger: print); final MessageOutput? _messageOutput; final ArgParser _argParser; - /// The configuration resolver for this command. - ConfigResolver? _configResolver; + /// The environment variables used for configuration resolution. + final Map envVariables; /// The option definitions for this command. final List options; @@ -24,13 +30,13 @@ abstract class BetterCommand extends Command { /// - [messageOutput] is an optional [MessageOutput] object used to pass specific log messages. /// - [wrapTextColumn] is the column width for wrapping text in the command line interface. /// - [options] is a list of options, empty by default. - /// - [configResolver] is an optional custom [ConfigResolver] implementation. + /// - [env] is an optional map of environment variables. If not set then + /// [Platform.environment] will be used. /// - /// [configResolver] and [messageOutput] are optional and will default to the - /// values of the command runner (if any). + /// [messageOutput] is optional and will default to the + /// value of the command runner (if any). /// - /// If no [configResolver] is provided then [DefaultConfigResolver] will be used, - /// which uses the command line arguments and environment variables as input sources. + /// ## Options /// /// To define a bespoke set of options, it is recommended to define /// a proper options enum. It can included any of the default options @@ -55,10 +61,10 @@ abstract class BetterCommand extends Command { MessageOutput? messageOutput = _defaultMessageOutput, int? wrapTextColumn, this.options = const [], - ConfigResolver? configResolver, + Map? env, }) : _messageOutput = messageOutput, _argParser = ArgParser(usageLineLength: wrapTextColumn), - _configResolver = configResolver { + envVariables = env ?? Platform.environment { prepareOptionsForParsing(options, argParser); } @@ -72,13 +78,6 @@ abstract class BetterCommand extends Command { return _messageOutput; } - ConfigResolver get configResolver { - if (runner case BetterCommandRunner runner) { - return runner.configResolver; - } - return _configResolver ??= DefaultConfigResolver(); - } - @override BetterCommand? get parent => super.parent as BetterCommand?; @@ -99,39 +98,38 @@ abstract class BetterCommand extends Command { /// Resolves the configuration (args, env, etc) and runs the command /// subclass via [runWithConfig]. /// + /// If there are errors resolving the configuration, + /// a UsageException is thrown with appropriate error messages. + /// /// Subclasses should override [runWithConfig], /// unless they want to handle the configuration resolution themselves. @override FutureOr? run() { final config = resolveConfiguration(argResults); + if (config.errors.isNotEmpty) { + final buffer = StringBuffer(); + final errors = config.errors.map(formatConfigError); + buffer.writeAll(errors, '\n'); + usageException(buffer.toString()); + } + return runWithConfig(config); } - /// Resolves the configuration for this command - /// using the preset [ConfigResolver]. - /// If there are errors resolving the configuration, - /// a UsageException is thrown with appropriate error messages. + /// Resolves the configuration for this command. /// /// This method can be overridden to change the configuration resolution - /// or error handling behavior. + /// behavior. Configuration resolveConfiguration(ArgResults? argResults) { - final config = configResolver.resolveConfiguration( + return Configuration.resolve( options: options, argResults: argResults, + env: envVariables, ); - - if (config.errors.isNotEmpty) { - final buffer = StringBuffer(); - final errors = config.errors.map(formatConfigError); - buffer.writeAll(errors, '\n'); - usageException(buffer.toString()); - } - - return config; } - /// Runs this command with prepared configuration (options). + /// Runs this command with the resolved configuration (option values). /// Subclasses should override this method. FutureOr? runWithConfig(final Configuration commandConfig); } diff --git a/lib/src/better_command_runner/better_command_runner.dart b/lib/src/better_command_runner/better_command_runner.dart index bd3499a..6e6bbd5 100644 --- a/lib/src/better_command_runner/better_command_runner.dart +++ b/lib/src/better_command_runner/better_command_runner.dart @@ -1,9 +1,11 @@ import 'dart:async'; +import 'dart:io' show Platform; import 'package:args/args.dart'; import 'package:args/command_runner.dart'; import 'package:cli_tools/config.dart'; -import 'package:cli_tools/src/better_command_runner/config_resolver.dart'; + +import 'config_resolver.dart'; /// A function type for executing code before running a command. typedef OnBeforeRunCommand = Future Function(BetterCommandRunner runner); @@ -45,14 +47,15 @@ typedef SetLogLevel = void Function({ /// A function type for tracking events. typedef OnAnalyticsEvent = void Function(String event); -/// A custom implementation of [CommandRunner] with additional features. +/// An extension of [CommandRunner] with additional features. /// /// This class extends the [CommandRunner] class from the `args` package and adds /// additional functionality such as logging, setting log levels, tracking events, /// and handling analytics. /// -/// The [BetterCommandRunner] class provides a more enhanced command line interface -/// for running commands and handling command line arguments. +/// The [BetterCommandRunner] class uses the config library to provide +/// a more enhanced command line interface for running commands and handling +/// command line arguments, environment variables, and configuration. class BetterCommandRunner extends CommandRunner { static const foo = [ @@ -69,11 +72,12 @@ class BetterCommandRunner final OnBeforeRunCommand? _onBeforeRunCommand; OnAnalyticsEvent? _onAnalyticsEvent; + /// The environment variables used for configuration resolution. + final Map envVariables; + /// The gloabl option definitions. late final List _globalOptions; - final ConfigResolver _configResolver; - Configuration? _globalConfiguration; /// The current global configuration. @@ -101,7 +105,8 @@ class BetterCommandRunner /// - [onAnalyticsEvent] function is used to track events. /// - [wrapTextColumn] is the column width for wrapping text in the command line interface. /// - [globalOptions] is an optional list of global options. - /// - [configResolver] is an optional custom [ConfigResolver] implementation. + /// - [env] is an optional map of environment variables. If not set then + /// [Platform.environment] will be used. /// /// ## Message Output /// @@ -138,9 +143,6 @@ class BetterCommandRunner /// final ConfigOptionBase option; /// } /// ``` - /// - /// If [configResolver] is not provided then [DefaultConfigResolver] will be used, - /// which uses the command line arguments and environment variables as input sources. BetterCommandRunner( super.executableName, super.description, { @@ -151,12 +153,12 @@ class BetterCommandRunner OnAnalyticsEvent? onAnalyticsEvent, int? wrapTextColumn, List? globalOptions, - ConfigResolver? configResolver, + Map? env, }) : _messageOutput = messageOutput, _setLogLevel = setLogLevel, _onBeforeRunCommand = onBeforeRunCommand, _onAnalyticsEvent = onAnalyticsEvent, - _configResolver = configResolver ?? DefaultConfigResolver(), + envVariables = env ?? Platform.environment, super( usageLineLength: wrapTextColumn, ) { @@ -180,10 +182,6 @@ class BetterCommandRunner /// It is also used for the commands unless they have their own. MessageOutput? get messageOutput => _messageOutput; - /// The configuration resolver used for the global configuration. - /// It is also used for the command configurations unless they have their own. - ConfigResolver get configResolver => _configResolver; - /// Adds a list of commands to the command runner. void addCommands(List> commands) { for (var command in commands) { @@ -208,6 +206,14 @@ class BetterCommandRunner return Future.sync(() { var argResults = parse(args); globalConfiguration = resolveConfiguration(argResults); + + if (globalConfiguration.errors.isNotEmpty) { + final buffer = StringBuffer(); + final errors = globalConfiguration.errors.map(formatConfigError); + buffer.writeAll(errors, '\n'); + usageException(buffer.toString()); + } + return runCommand(argResults); }); } @@ -293,28 +299,17 @@ class BetterCommandRunner } } - /// Resolves the global configuration for this command runner - /// using the preset [ConfigResolver]. - /// If there are errors resolving the configuration, - /// a UsageException is thrown with appropriate error messages. + /// Resolves the global configuration for this command runner. /// /// This method can be overridden to change the configuration resolution - /// or error handling behavior. + /// behavior. Configuration resolveConfiguration(ArgResults? argResults) { - final config = _configResolver.resolveConfiguration( + return Configuration.resolve( options: _globalOptions, argResults: argResults, + env: envVariables, ignoreUnexpectedPositionalArgs: true, ); - - if (config.errors.isNotEmpty) { - final buffer = StringBuffer(); - final errors = config.errors.map(formatConfigError); - buffer.writeAll(errors, '\n'); - usageException(buffer.toString()); - } - - return config; } static CommandRunnerLogLevel _determineLogLevel(Configuration config) { diff --git a/lib/src/better_command_runner/config_resolver.dart b/lib/src/better_command_runner/config_resolver.dart index 6e518bb..f17781e 100644 --- a/lib/src/better_command_runner/config_resolver.dart +++ b/lib/src/better_command_runner/config_resolver.dart @@ -1,51 +1,3 @@ -import 'dart:io' show Platform; - -import 'package:args/args.dart' show ArgResults; -import 'package:cli_tools/config.dart' show Configuration, OptionDefinition; - -/// {@template config_resolver} -/// Resolves a configuration for the provided options and arguments. -/// Subclasses can add additional configuration sources. -/// {@endtemplate} -/// -/// The purpose of this class is to delegate the configuration resolution -/// in BetterCommandRunner and BetterCommand to a separate object -/// they can be composed with. -/// -/// If invoked from global command runner or a command that has -/// subcommands, set [ignoreUnexpectedPositionalArgs] to true. -abstract interface class ConfigResolver { - /// {@macro config_resolver} - Configuration resolveConfiguration({ - required Iterable options, - ArgResults? argResults, - bool ignoreUnexpectedPositionalArgs = false, - }); -} - -/// The default behavior is to invoke this using the [argResults] and -/// [Platform.environment] as input. -class DefaultConfigResolver implements ConfigResolver { - final Map _env; - - DefaultConfigResolver({Map? env}) - : _env = env ?? Platform.environment; - - @override - Configuration resolveConfiguration({ - required Iterable options, - ArgResults? argResults, - bool ignoreUnexpectedPositionalArgs = false, - }) { - return Configuration.resolve( - options: options, - argResults: argResults, - env: _env, - ignoreUnexpectedPositionalArgs: ignoreUnexpectedPositionalArgs, - ); - } -} - /// Formats a configuration error message. String formatConfigError(final String error) { if (error.isEmpty) return error; From e504d876f53cf6ed6d9d82b9f48a14bcd131b958 Mon Sep 17 00:00:00 2001 From: Christer Date: Tue, 6 May 2025 09:44:16 +0200 Subject: [PATCH 5/7] feat: Added Configuration copy constructor --- lib/src/config/configuration.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/src/config/configuration.dart b/lib/src/config/configuration.dart index 413e5fa..75d7570 100644 --- a/lib/src/config/configuration.dart +++ b/lib/src/config/configuration.dart @@ -787,6 +787,15 @@ class Configuration { presetValues: values, ); + /// Creates a configuration by copying the contents from another. + /// + /// This is a 1:1 copy including the errors. + Configuration.from({ + required final Configuration configuration, + }) : _options = List.from(configuration.options), + _config = Map.from(configuration._config), + _errors = List.from(configuration._errors); + /// Creates a configuration with option values resolved from the provided context. /// /// [argResults] is used if provided. Otherwise [args] is used if provided. From 4777d0d875a59aeebf2c94915e3370731061a449 Mon Sep 17 00:00:00 2001 From: Christer Date: Tue, 6 May 2025 09:55:40 +0200 Subject: [PATCH 6/7] refactor: Moved formatConfigError --- lib/src/better_command_runner/better_command.dart | 1 - .../better_command_runner.dart | 14 ++++++++++++-- lib/src/better_command_runner/config_resolver.dart | 11 ----------- 3 files changed, 12 insertions(+), 14 deletions(-) delete mode 100644 lib/src/better_command_runner/config_resolver.dart diff --git a/lib/src/better_command_runner/better_command.dart b/lib/src/better_command_runner/better_command.dart index b63f7df..b62bd22 100644 --- a/lib/src/better_command_runner/better_command.dart +++ b/lib/src/better_command_runner/better_command.dart @@ -6,7 +6,6 @@ import 'package:args/command_runner.dart'; import 'package:cli_tools/config.dart'; import 'better_command_runner.dart'; -import 'config_resolver.dart'; /// An extension of [Command] with additional features. /// diff --git a/lib/src/better_command_runner/better_command_runner.dart b/lib/src/better_command_runner/better_command_runner.dart index 6e6bbd5..1618716 100644 --- a/lib/src/better_command_runner/better_command_runner.dart +++ b/lib/src/better_command_runner/better_command_runner.dart @@ -5,8 +5,6 @@ import 'package:args/args.dart'; import 'package:args/command_runner.dart'; import 'package:cli_tools/config.dart'; -import 'config_resolver.dart'; - /// A function type for executing code before running a command. typedef OnBeforeRunCommand = Future Function(BetterCommandRunner runner); @@ -379,3 +377,15 @@ abstract class BetterCommandRunnerAnalyticsEvents { /// An enum for the command runner log levels. enum CommandRunnerLogLevel { quiet, verbose, normal } + +/// Formats a configuration error message. +String formatConfigError(final String error) { + if (error.isEmpty) return error; + final suffix = _isPunctuation(error.substring(error.length - 1)) ? '' : '.'; + return '${error[0].toUpperCase()}${error.substring(1)}$suffix'; +} + +/// Returns true if the character is a punctuation mark. +bool _isPunctuation(final String char) { + return RegExp(r'\p{P}', unicode: true).hasMatch(char); +} diff --git a/lib/src/better_command_runner/config_resolver.dart b/lib/src/better_command_runner/config_resolver.dart deleted file mode 100644 index f17781e..0000000 --- a/lib/src/better_command_runner/config_resolver.dart +++ /dev/null @@ -1,11 +0,0 @@ -/// Formats a configuration error message. -String formatConfigError(final String error) { - if (error.isEmpty) return error; - final suffix = _isPunctuation(error.substring(error.length - 1)) ? '' : '.'; - return '${error[0].toUpperCase()}${error.substring(1)}$suffix'; -} - -/// Returns true if the character is a punctuation mark. -bool _isPunctuation(final String char) { - return RegExp(r'\p{P}', unicode: true).hasMatch(char); -} From cf73d3c4b022288b24a4cda7b2a3a2cfd14f4fe9 Mon Sep 17 00:00:00 2001 From: Christer Date: Tue, 6 May 2025 10:23:05 +0200 Subject: [PATCH 7/7] fix: Fixes of CodeRabbit comments --- .../better_command_runner.dart | 16 +++++++++++----- lib/src/config/configuration.dart | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/src/better_command_runner/better_command_runner.dart b/lib/src/better_command_runner/better_command_runner.dart index 1618716..e48065b 100644 --- a/lib/src/better_command_runner/better_command_runner.dart +++ b/lib/src/better_command_runner/better_command_runner.dart @@ -205,11 +205,17 @@ class BetterCommandRunner var argResults = parse(args); globalConfiguration = resolveConfiguration(argResults); - if (globalConfiguration.errors.isNotEmpty) { - final buffer = StringBuffer(); - final errors = globalConfiguration.errors.map(formatConfigError); - buffer.writeAll(errors, '\n'); - usageException(buffer.toString()); + try { + if (globalConfiguration.errors.isNotEmpty) { + final buffer = StringBuffer(); + final errors = globalConfiguration.errors.map(formatConfigError); + buffer.writeAll(errors, '\n'); + usageException(buffer.toString()); + } + } on UsageException catch (e) { + messageOutput?.logUsageException(e); + _onAnalyticsEvent?.call(BetterCommandRunnerAnalyticsEvents.invalid); + rethrow; } return runCommand(argResults); diff --git a/lib/src/config/configuration.dart b/lib/src/config/configuration.dart index 75d7570..ae73d08 100644 --- a/lib/src/config/configuration.dart +++ b/lib/src/config/configuration.dart @@ -792,7 +792,7 @@ class Configuration { /// This is a 1:1 copy including the errors. Configuration.from({ required final Configuration configuration, - }) : _options = List.from(configuration.options), + }) : _options = List.from(configuration._options), _config = Map.from(configuration._config), _errors = List.from(configuration._errors);