11 |
12 | // Registers Flutter plugins.
13 | void RegisterPlugins(flutter::PluginRegistry* registry);
14 |
15 | #endif // GENERATED_PLUGIN_REGISTRANT_
16 |
--------------------------------------------------------------------------------
/packages/clean_framework/example/windows/runner/resource.h:
--------------------------------------------------------------------------------
1 | //{{NO_DEPENDENCIES}}
2 | // Microsoft Visual C++ generated include file.
3 | // Used by Runner.rc
4 | //
5 | #define IDI_APP_ICON 101
6 |
7 | // Next default values for new objects
8 | //
9 | #ifdef APSTUDIO_INVOKED
10 | #ifndef APSTUDIO_READONLY_SYMBOLS
11 | #define _APS_NEXT_RESOURCE_VALUE 102
12 | #define _APS_NEXT_COMMAND_VALUE 40001
13 | #define _APS_NEXT_CONTROL_VALUE 1001
14 | #define _APS_NEXT_SYMED_VALUE 101
15 | #endif
16 | #endif
17 |
--------------------------------------------------------------------------------
/packages/clean_framework/example/windows/runner/resources/app_icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AcmeSoftwareLLC/clean_framework/6ca5a2bfed316060cfa50fc6cbc1dfb228088bb5/packages/clean_framework/example/windows/runner/resources/app_icon.ico
--------------------------------------------------------------------------------
/packages/clean_framework/lib/clean_framework_defaults.dart:
--------------------------------------------------------------------------------
1 | /// Clean Framework Defaults
2 | library clean_framework_defaults;
3 |
4 | export 'package:clean_framework/src/defaults/feature_provider/json_feature_provider.dart';
5 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/core/clean_framework_provider.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_riverpod/flutter_riverpod.dart';
2 |
3 | abstract class CleanFrameworkProvider> {
4 | CleanFrameworkProvider({required P provider}) : _provider = provider;
5 |
6 | final P _provider;
7 |
8 | P call() => _provider;
9 | }
10 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/core/core.dart:
--------------------------------------------------------------------------------
1 | export 'app_provider_scope.dart';
2 | export 'dependency/dependency_provider.dart';
3 | export 'external_interface/external_interface.dart';
4 | export 'external_interface/external_interface_provider.dart';
5 | export 'external_interface/request.dart';
6 | export 'external_interface/response.dart';
7 | export 'gateway/gateway.dart';
8 | export 'gateway/gateway_provider.dart';
9 | export 'use_case/entity.dart';
10 | export 'use_case/provider/use_case_provider.dart';
11 | export 'use_case/use_case.dart';
12 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/core/external_interface/external_interface_delegate.dart:
--------------------------------------------------------------------------------
1 | part of 'external_interface.dart';
2 |
3 | abstract class ExternalInterfaceDelegate {
4 | ExternalInterface? _externalInterface;
5 |
6 | @nonVirtual
7 | // ignore: use_setters_to_change_properties
8 | void attachTo(ExternalInterface externalInterface) {
9 | _externalInterface = externalInterface;
10 | }
11 |
12 | /// Locates dependency from the [provider].
13 |
14 | @nonVirtual
15 | T locate(DependencyProvider provider) {
16 | final ref = _externalInterface?._ref;
17 | assert(ref != null, '$runtimeType has not been attached!');
18 | return ref!.read(provider);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/core/external_interface/request.dart:
--------------------------------------------------------------------------------
1 | import 'package:meta/meta.dart';
2 |
3 | @immutable
4 | abstract class Request {
5 | const Request();
6 | }
7 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/core/use_case/entity.dart:
--------------------------------------------------------------------------------
1 | import 'package:equatable/equatable.dart';
2 | import 'package:meta/meta.dart';
3 |
4 | /// Represents the current state of the domain layer (use case).
5 | @immutable
6 | abstract class Entity extends Equatable {
7 | const Entity();
8 |
9 | @override
10 | bool get stringify => true;
11 |
12 | @useResult
13 | Entity copyWith() => throw UnimplementedError('copyWith() not implemented');
14 | }
15 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/core/use_case/helpers/domain_dto.dart:
--------------------------------------------------------------------------------
1 | import 'package:clean_framework/clean_framework.dart';
2 | import 'package:meta/meta.dart';
3 |
4 | /// Base class for Data Transfer Objects (DTOs) that move data into or out of the domain layer/use case.
5 | @immutable
6 | abstract class DomainDTO extends Equatable {
7 | const DomainDTO();
8 | }
9 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/core/use_case/helpers/domain_model.dart:
--------------------------------------------------------------------------------
1 | import 'package:clean_framework/src/core/use_case/helpers/domain_dto.dart';
2 | import 'package:meta/meta.dart';
3 |
4 | /// Represents the state of the domain (or part of the domain) at a particular
5 | /// point in time. Used for the transfer of data from the domain layer to
6 | /// other layers.
7 | @immutable
8 | abstract class DomainModel extends DomainDTO {
9 | const DomainModel();
10 |
11 | @override
12 | bool get stringify => true;
13 | }
14 |
15 | @Deprecated('Use DomainModel instead.')
16 | abstract class Output extends DomainModel {
17 | @Deprecated('Use DomainModel instead.')
18 | const Output() : super();
19 | }
20 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/core/use_case/use_case_helpers.dart:
--------------------------------------------------------------------------------
1 | export 'helpers/domain_input.dart';
2 | export 'helpers/domain_model.dart';
3 | export 'helpers/request_subscription_map.dart';
4 | export 'helpers/use_case_transformer.dart';
5 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/defaults/feature_provider/engine/evaluation_engine.dart:
--------------------------------------------------------------------------------
1 | import 'package:clean_framework/src/defaults/feature_provider/engine/open_feature_flags.dart';
2 | import 'package:clean_framework/src/open_feature/open_feature.dart';
3 |
4 | abstract class EvaluationEngine {
5 | ResolutionDetails evaluate({
6 | required OpenFeatureFlags flags,
7 | required String flagKey,
8 | required FlagValueType returnType,
9 | required EvaluationContext context,
10 | });
11 | }
12 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/open_feature/src/core/enums.dart:
--------------------------------------------------------------------------------
1 | export 'enums/error_code.dart';
2 | export 'enums/flag_value_type.dart';
3 | export 'enums/reason.dart';
4 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/open_feature/src/core/enums/flag_value_type.dart:
--------------------------------------------------------------------------------
1 | /// The value type of a flag.
2 | enum FlagValueType {
3 | /// Boolean Value.
4 | boolean,
5 |
6 | /// String Value.
7 | string,
8 |
9 | /// Numeric Value.
10 | number,
11 |
12 | /// Object Value.
13 | object,
14 | }
15 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/open_feature/src/core/enums/reason.dart:
--------------------------------------------------------------------------------
1 | enum Reason {
2 | disabled,
3 | split,
4 | targetingMatch,
5 | unknown,
6 | error,
7 | noop,
8 | }
9 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/open_feature/src/core/feature_client.dart:
--------------------------------------------------------------------------------
1 | import 'package:clean_framework/src/open_feature/src/core/features.dart';
2 | import 'package:clean_framework/src/open_feature/src/core/flag_evaluation_lifecycle.dart';
3 |
4 | abstract class FeatureClient extends Features
5 | implements FlagEvaluationLifecycle {}
6 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/open_feature/src/core/flag_evaluation_lifecycle.dart:
--------------------------------------------------------------------------------
1 | import 'package:clean_framework/src/open_feature/src/hook/hook.dart';
2 |
3 | abstract class FlagEvaluationLifecycle {
4 | List get hooks;
5 |
6 | void addHooks(List hooks);
7 |
8 | void clearHooks();
9 | }
10 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/open_feature/src/core/resolution_details.dart:
--------------------------------------------------------------------------------
1 | import 'package:clean_framework/src/open_feature/src/core/enums.dart';
2 |
3 | class ResolutionDetails {
4 | ResolutionDetails({
5 | required this.value,
6 | this.errorCode,
7 | this.reason,
8 | this.variant,
9 | });
10 |
11 | final T value;
12 | final ErrorCode? errorCode;
13 | final Reason? reason;
14 | final String? variant;
15 | }
16 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/open_feature/src/evaluation_context/context_transformation_mixin.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 |
3 | import 'package:clean_framework/src/open_feature/src/evaluation_context/evaluation_context.dart';
4 | import 'package:clean_framework/src/open_feature/src/provider/feature_provider.dart';
5 |
6 | mixin ContextTransformationMixin on FeatureProvider {
7 | FutureOr transformContext(EvaluationContext context);
8 | }
9 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/open_feature/src/exceptions/open_feature_exception.dart:
--------------------------------------------------------------------------------
1 | // coverage:ignore-file
2 |
3 | import 'package:clean_framework/src/open_feature/src/core/enums/error_code.dart';
4 |
5 | export '../core/enums/error_code.dart';
6 | export 'src/flag_not_found_exception.dart';
7 | export 'src/parse_exception.dart';
8 | export 'src/type_mismatch_exception.dart';
9 |
10 | abstract class OpenFeatureException implements Exception {
11 | OpenFeatureException(this.message, {required this.code});
12 |
13 | final String message;
14 | final ErrorCode code;
15 | }
16 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/open_feature/src/exceptions/src/flag_not_found_exception.dart:
--------------------------------------------------------------------------------
1 | // coverage:ignore-file
2 |
3 | import 'package:clean_framework/src/open_feature/src/exceptions/open_feature_exception.dart';
4 |
5 | class FlagNotFoundException extends OpenFeatureException {
6 | FlagNotFoundException(super.message) : super(code: ErrorCode.flagNotFound);
7 | }
8 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/open_feature/src/exceptions/src/parse_exception.dart:
--------------------------------------------------------------------------------
1 | // coverage:ignore-file
2 |
3 | import 'package:clean_framework/src/open_feature/src/exceptions/open_feature_exception.dart';
4 |
5 | class ParseException extends OpenFeatureException {
6 | ParseException(super.message) : super(code: ErrorCode.flagNotFound);
7 | }
8 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/open_feature/src/exceptions/src/type_mismatch_exception.dart:
--------------------------------------------------------------------------------
1 | // coverage:ignore-file
2 |
3 | import 'package:clean_framework/src/open_feature/src/exceptions/open_feature_exception.dart';
4 |
5 | class TypeMismatchException extends OpenFeatureException {
6 | TypeMismatchException(super.message) : super(code: ErrorCode.typeMismatch);
7 | }
8 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/open_feature/src/flag_evaluation/flag_evaluation_details.dart:
--------------------------------------------------------------------------------
1 | import 'package:clean_framework/src/open_feature/src/core/enums.dart';
2 |
3 | class FlagEvaluationDetails {
4 | FlagEvaluationDetails({
5 | required this.key,
6 | required this.value,
7 | this.errorCode,
8 | this.reason,
9 | this.variant,
10 | });
11 |
12 | final String key;
13 | final T value;
14 | final ErrorCode? errorCode;
15 | final Reason? reason;
16 | final String? variant;
17 | }
18 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/open_feature/src/flag_evaluation/flag_evaluation_options.dart:
--------------------------------------------------------------------------------
1 | import 'package:clean_framework/src/open_feature/src/hook/hook.dart';
2 |
3 | class FlagEvaluationOptions {
4 | const FlagEvaluationOptions({
5 | this.hooks = const [],
6 | this.hookHints,
7 | });
8 |
9 | final List hooks;
10 | final HookHints? hookHints;
11 | }
12 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/open_feature/src/hook/hook_hints.dart:
--------------------------------------------------------------------------------
1 | // coverage:ignore-file
2 |
3 | import 'dart:collection';
4 |
5 | class HookHints extends UnmodifiableMapBase {
6 | HookHints(this._map);
7 |
8 | final Map _map;
9 |
10 | @override
11 | Iterable get keys => _map.keys;
12 |
13 | @override
14 | T? operator [](Object? key) => _map[key];
15 | }
16 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/presentation/presentation.dart:
--------------------------------------------------------------------------------
1 | export 'presenter/presenter.dart';
2 | export 'presenter/view_model.dart';
3 | export 'ui/ui.dart';
4 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/presentation/presenter/view_model.dart:
--------------------------------------------------------------------------------
1 | import 'package:equatable/equatable.dart';
2 | import 'package:flutter/foundation.dart';
3 |
4 | @immutable
5 | abstract class ViewModel extends Equatable {
6 | const ViewModel();
7 | }
8 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/providers/bridge_gateway_provider.dart:
--------------------------------------------------------------------------------
1 | import 'package:clean_framework/clean_framework.dart';
2 | import 'package:clean_framework/src/providers/gateway.dart';
3 | import 'package:clean_framework/src/providers/overridable_provider.dart';
4 | import 'package:flutter_riverpod/flutter_riverpod.dart';
5 |
6 | class BridgeGatewayProvider
7 | implements OverridableProvider {
8 | BridgeGatewayProvider(this.create) : _provider = Provider(create);
9 | final Provider _provider;
10 | final G Function(Ref) create;
11 |
12 | @override
13 | Override overrideWith(G gateway) => _provider.overrideWithValue(gateway);
14 |
15 | G getBridgeGateway(ProvidersContext context) => context().read(_provider);
16 | }
17 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/providers/external_interface_provider.dart:
--------------------------------------------------------------------------------
1 | import 'package:clean_framework/clean_framework_legacy.dart';
2 | import 'package:clean_framework/src/providers/overridable_provider.dart';
3 | import 'package:flutter_riverpod/flutter_riverpod.dart';
4 |
5 | class ExternalInterfaceProvider
6 | implements OverridableProvider {
7 | ExternalInterfaceProvider(this.create) : _provider = Provider(create);
8 | final Provider _provider;
9 | final I Function(Ref) create;
10 |
11 | @override
12 | Override overrideWith(I interface) => _provider.overrideWithValue(interface);
13 |
14 | I getExternalInterface(ProvidersContext context) => context().read(_provider);
15 | }
16 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/providers/gateway_provider.dart:
--------------------------------------------------------------------------------
1 | import 'package:clean_framework/clean_framework_legacy.dart';
2 | import 'package:clean_framework/src/providers/overridable_provider.dart';
3 | import 'package:flutter_riverpod/flutter_riverpod.dart';
4 |
5 | class GatewayProvider implements OverridableProvider {
6 | GatewayProvider(this.create) : _provider = Provider(create);
7 | final Provider _provider;
8 | final G Function(Ref) create;
9 |
10 | @override
11 | Override overrideWith(G gateway) => _provider.overrideWithValue(gateway);
12 |
13 | G getGateway(ProvidersContext context) => context().read(_provider);
14 | }
15 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/providers/overridable_provider.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_riverpod/flutter_riverpod.dart';
2 | import 'package:meta/meta.dart';
3 |
4 | abstract class OverridableProvider {
5 | @visibleForTesting
6 | Override overrideWith(V value);
7 | }
8 |
--------------------------------------------------------------------------------
/packages/clean_framework/lib/src/widgets/widgets.dart:
--------------------------------------------------------------------------------
1 | export 'src/feature_builder.dart';
2 | export 'src/feature_scope.dart';
3 |
--------------------------------------------------------------------------------
/packages/clean_framework/screenshots/clean-framework.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AcmeSoftwareLLC/clean_framework/6ca5a2bfed316060cfa50fc6cbc1dfb228088bb5/packages/clean_framework/screenshots/clean-framework.png
--------------------------------------------------------------------------------
/packages/clean_framework/test/providers/entity_test.dart:
--------------------------------------------------------------------------------
1 | import 'package:clean_framework/clean_framework_legacy.dart';
2 | import 'package:flutter_test/flutter_test.dart';
3 |
4 | void main() {
5 | test('Entity test', () {
6 | final entity = EntityFake();
7 | expect(entity.stringify, isTrue);
8 | expect(entity.toString(), 'EntityFake()');
9 | });
10 | }
11 |
12 | class EntityFake extends Entity {
13 | @override
14 | List