From be61d4c7ff950bae0caeedb659e1f6e04a4cd476 Mon Sep 17 00:00:00 2001 From: Emiliano Sanchez Date: Wed, 28 Jan 2026 14:05:05 -0300 Subject: [PATCH 1/2] prepare release --- splitio/CHANGELOG.md | 2 ++ splitio/pubspec.yaml | 14 +++++--------- splitio_android/CHANGELOG.md | 2 ++ splitio_android/pubspec.yaml | 5 ++--- splitio_ios/CHANGELOG.md | 2 ++ splitio_ios/pubspec.yaml | 5 ++--- splitio_platform_interface/CHANGELOG.md | 2 ++ splitio_platform_interface/pubspec.yaml | 2 +- splitio_web/CHANGELOG.md | 7 +++---- splitio_web/pubspec.yaml | 5 ++--- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/splitio/CHANGELOG.md b/splitio/CHANGELOG.md index 5fe4e9a..01e41b7 100644 --- a/splitio/CHANGELOG.md +++ b/splitio/CHANGELOG.md @@ -1,3 +1,5 @@ +# 1.2.0-rc.1 (Jan 28, 2026) + # 1.1.0 (Jan 16, 2026) - Added Web support via the `splitio_web` package, the Web implementation of `splitio` based on the Split Browser SDK `1.6.0`. diff --git a/splitio/pubspec.yaml b/splitio/pubspec.yaml index 79e7a0a..3166761 100644 --- a/splitio/pubspec.yaml +++ b/splitio/pubspec.yaml @@ -1,6 +1,6 @@ name: splitio description: Official plugin for split.io, the platform for controlled rollouts, which serves features to your users via feature flags to manage your complete customer experience. -version: 1.1.0 +version: 1.2.0-rc.1 homepage: https://split.io/ repository: https://github.com/splitio/flutter-sdk-plugin/tree/main/splitio/ @@ -21,14 +21,10 @@ flutter: dependencies: flutter: sdk: flutter - splitio_android: # ^1.0.0 - path: ../splitio_android - splitio_ios: # ^1.0.0 - path: ../splitio_ios - splitio_web: # ^1.0.0 - path: ../splitio_web - splitio_platform_interface: # ^2.0.0 - path: ../splitio_platform_interface + splitio_android: ^1.1.0-rc.1 + splitio_ios: ^1.1.0-rc.1 + splitio_web: ^1.1.0-rc.1 + splitio_platform_interface: ^2.1.0-rc.1 dev_dependencies: flutter_test: sdk: flutter diff --git a/splitio_android/CHANGELOG.md b/splitio_android/CHANGELOG.md index 6f47087..a6a85b8 100644 --- a/splitio_android/CHANGELOG.md +++ b/splitio_android/CHANGELOG.md @@ -1,3 +1,5 @@ +# 1.1.0-rc.1 (Jan 28, 2026) + # 1.0.0 (Aug 14, 2025) - Updated Android SDK to `5.3.1`. diff --git a/splitio_android/pubspec.yaml b/splitio_android/pubspec.yaml index 6935678..463872b 100644 --- a/splitio_android/pubspec.yaml +++ b/splitio_android/pubspec.yaml @@ -1,7 +1,7 @@ name: splitio_android description: The official Android implementation of splitio Flutter plugin. repository: https://github.com/splitio/flutter-sdk-plugin/tree/main/splitio_android -version: 1.0.0 +version: 1.1.0-rc.1 environment: sdk: ">=2.16.2 <4.0.0" @@ -19,8 +19,7 @@ flutter: dependencies: flutter: sdk: flutter - splitio_platform_interface: # ^2.0.0 - path: ../splitio_platform_interface + splitio_platform_interface: ^2.1.0-rc.1 dev_dependencies: flutter_test: diff --git a/splitio_ios/CHANGELOG.md b/splitio_ios/CHANGELOG.md index d0935b9..f72181d 100644 --- a/splitio_ios/CHANGELOG.md +++ b/splitio_ios/CHANGELOG.md @@ -1,3 +1,5 @@ +# 1.1.0-rc.1 (Jan 28, 2026) + # 1.0.0 (Aug 14, 2025) - iOS SDK to `3.3.2` diff --git a/splitio_ios/pubspec.yaml b/splitio_ios/pubspec.yaml index 1d4c6cf..e986ac0 100644 --- a/splitio_ios/pubspec.yaml +++ b/splitio_ios/pubspec.yaml @@ -1,7 +1,7 @@ name: splitio_ios description: The official iOS implementation of splitio Flutter plugin. repository: https://github.com/splitio/flutter-sdk-plugin/tree/main/splitio_ios -version: 1.0.0 +version: 1.1.0-rc.1 environment: sdk: ">=2.16.2 <4.0.0" @@ -18,8 +18,7 @@ flutter: dependencies: flutter: sdk: flutter - splitio_platform_interface: # ^2.0.0 - path: ../splitio_platform_interface + splitio_platform_interface: ^2.1.0-rc.1 dev_dependencies: flutter_test: diff --git a/splitio_platform_interface/CHANGELOG.md b/splitio_platform_interface/CHANGELOG.md index cf67b5e..9402aa4 100644 --- a/splitio_platform_interface/CHANGELOG.md +++ b/splitio_platform_interface/CHANGELOG.md @@ -1,3 +1,5 @@ +# 2.1.0-rc.1 (Jan 28, 2026) + # 2.0.0 (Aug 14, 2025) # 2.0.0-rc.1 (Aug 14, 2025) diff --git a/splitio_platform_interface/pubspec.yaml b/splitio_platform_interface/pubspec.yaml index 6b2a0e1..5273aa5 100644 --- a/splitio_platform_interface/pubspec.yaml +++ b/splitio_platform_interface/pubspec.yaml @@ -2,7 +2,7 @@ name: splitio_platform_interface description: A common platform interface for the splitio plugin. # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.0.0 +version: 2.1.0-rc.1 repository: https://github.com/splitio/flutter-sdk-plugin/tree/main/splitio_platform_interface environment: diff --git a/splitio_web/CHANGELOG.md b/splitio_web/CHANGELOG.md index ccade9c..f9989b9 100644 --- a/splitio_web/CHANGELOG.md +++ b/splitio_web/CHANGELOG.md @@ -1,7 +1,6 @@ -# 1.0.1 (January XX, 2026) -- Updated Browser SDK to `1.6.1`. +# 1.1.0-rc.1 (Jan 28, 2026) -# 1.0.0 (January 16, 2026) +# 1.0.0 (Jan 16, 2026) - Initial release. Web implementation of `splitio` based on Split Browser SDK `1.6.0`. -# 1.0.0-rc.1 (January 15, 2026) +# 1.0.0-rc.1 (Jan 15, 2026) diff --git a/splitio_web/pubspec.yaml b/splitio_web/pubspec.yaml index ae86de9..7294cb4 100644 --- a/splitio_web/pubspec.yaml +++ b/splitio_web/pubspec.yaml @@ -1,7 +1,7 @@ name: splitio_web description: The official Web implementation of splitio Flutter plugin. repository: https://github.com/splitio/flutter-sdk-plugin/tree/main/splitio_web -version: 1.0.0 +version: 1.1.0-rc.1 environment: sdk: ">=3.3.0 <4.0.0" # using Dart 3.3+ extension types for JS interop @@ -20,8 +20,7 @@ flutter: dependencies: flutter: sdk: flutter - splitio_platform_interface: # ^2.0.0 - path: ../splitio_platform_interface + splitio_platform_interface: ^2.1.0-rc.1 flutter_web_plugins: sdk: flutter web: ">=0.5.0 <2.0.0" From 408ccb8807df58d3069e87f8576cc379962f4aeb Mon Sep 17 00:00:00 2001 From: Emiliano Sanchez Date: Wed, 28 Jan 2026 16:40:56 -0300 Subject: [PATCH 2/2] add public_member_api_docs rule --- splitio/analysis_options.yaml | 4 + splitio/example/lib/main.dart | 2 + splitio/lib/split_client.dart | 3 + splitio/lib/splitio.dart | 12 ++ splitio_android/analysis_options.yaml | 4 + splitio_ios/analysis_options.yaml | 4 + .../analysis_options.yaml | 4 + .../lib/events/split_method_call_handler.dart | 8 ++ .../impressions_method_call_handler.dart | 1 + .../lib/method_call_handler.dart | 4 + .../lib/method_channel_platform.dart | 4 + ...lit_certificate_pinning_configuration.dart | 6 +- .../lib/split_configuration.dart | 37 +++++- .../lib/split_evaluation_options.dart | 5 + .../lib/split_fallback_treatment.dart | 5 + ...lit_fallback_treatments_configuration.dart | 5 + .../lib/split_impression.dart | 20 ++++ .../lib/split_prerequisite.dart | 6 + .../lib/split_result.dart | 4 + .../split_rollout_cache_configuration.dart | 9 +- .../lib/split_sync_config.dart | 7 ++ .../lib/split_view.dart | 22 ++++ .../lib/splitio_platform_interface.dart | 2 + splitio_web/analysis_options.yaml | 4 + splitio_web/lib/src/js_interop.dart | 108 +++++++++++++++++- 25 files changed, 284 insertions(+), 6 deletions(-) diff --git a/splitio/analysis_options.yaml b/splitio/analysis_options.yaml index a5744c1..5cf0db1 100644 --- a/splitio/analysis_options.yaml +++ b/splitio/analysis_options.yaml @@ -2,3 +2,7 @@ include: package:flutter_lints/flutter.yaml # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options + +linter: + rules: + - public_member_api_docs diff --git a/splitio/example/lib/main.dart b/splitio/example/lib/main.dart index 998a90b..a27a0a5 100644 --- a/splitio/example/lib/main.dart +++ b/splitio/example/lib/main.dart @@ -1,3 +1,5 @@ +// ignore_for_file: avoid_print + import 'package:flutter/material.dart'; import 'package:splitio/splitio.dart'; diff --git a/splitio/lib/split_client.dart b/splitio/lib/split_client.dart index 883a9f4..cfa2c00 100644 --- a/splitio/lib/split_client.dart +++ b/splitio/lib/split_client.dart @@ -1,5 +1,6 @@ import 'package:splitio_platform_interface/splitio_platform_interface.dart'; +/// Abstract class representing a Split client. abstract class SplitClient { /// Performs an evaluation for the [featureFlagName] feature flag. /// @@ -187,11 +188,13 @@ abstract class SplitClient { Future whenTimeout(); } +/// Default implementation of the Split client. class DefaultSplitClient implements SplitClient { final SplitioPlatform _platform; final String _matchingKey; final String? _bucketingKey; + /// Creates a new instance of the Split client. DefaultSplitClient(this._platform, this._matchingKey, this._bucketingKey); @override diff --git a/splitio/lib/splitio.dart b/splitio/lib/splitio.dart index 27cd8fe..ae56ab1 100644 --- a/splitio/lib/splitio.dart +++ b/splitio/lib/splitio.dart @@ -15,8 +15,10 @@ export 'package:splitio_platform_interface/split_rollout_cache_configuration.dar export 'package:splitio_platform_interface/split_fallback_treatment.dart'; export 'package:splitio_platform_interface/split_fallback_treatments_configuration.dart'; +/// Callback function type for client readiness events. typedef ClientReadinessCallback = void Function(SplitClient splitClient); +/// Main class for interacting with the Split Flutter SDK. class Splitio { final String _sdkKey; @@ -114,12 +116,14 @@ class Splitio { return client; } + /// Gets the list of all feature flag names. Future> splitNames() async { List splitNames = await _platform.splitNames(); return splitNames; } + /// Gets the list of all feature flag views. Future> splits() async { return _platform.splits(); } @@ -130,14 +134,22 @@ class Splitio { return _platform.impressionsStream(); } + /// Gets a specific feature flag view. + /// + /// Returns null if the provided feature flag name is not found. Future split(String splitName) async { return _platform.split(splitName: splitName); } + /// Gets the user consent status. Future getUserConsent() async { return _platform.getUserConsent(); } + /// Sets the user consent status. + /// + /// [enabled] is a boolean that enables (`UserConsent.granted`) + /// or disables (`UserConsent.declined`) data collection. Future setUserConsent(bool enabled) async { return _platform.setUserConsent(enabled); } diff --git a/splitio_android/analysis_options.yaml b/splitio_android/analysis_options.yaml index a5744c1..5cf0db1 100644 --- a/splitio_android/analysis_options.yaml +++ b/splitio_android/analysis_options.yaml @@ -2,3 +2,7 @@ include: package:flutter_lints/flutter.yaml # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options + +linter: + rules: + - public_member_api_docs diff --git a/splitio_ios/analysis_options.yaml b/splitio_ios/analysis_options.yaml index a5744c1..5cf0db1 100644 --- a/splitio_ios/analysis_options.yaml +++ b/splitio_ios/analysis_options.yaml @@ -2,3 +2,7 @@ include: package:flutter_lints/flutter.yaml # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options + +linter: + rules: + - public_member_api_docs diff --git a/splitio_platform_interface/analysis_options.yaml b/splitio_platform_interface/analysis_options.yaml index a5744c1..5cf0db1 100644 --- a/splitio_platform_interface/analysis_options.yaml +++ b/splitio_platform_interface/analysis_options.yaml @@ -2,3 +2,7 @@ include: package:flutter_lints/flutter.yaml # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options + +linter: + rules: + - public_member_api_docs diff --git a/splitio_platform_interface/lib/events/split_method_call_handler.dart b/splitio_platform_interface/lib/events/split_method_call_handler.dart index 6a0db02..4c58431 100644 --- a/splitio_platform_interface/lib/events/split_method_call_handler.dart +++ b/splitio_platform_interface/lib/events/split_method_call_handler.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:splitio_platform_interface/method_call_handler.dart'; +/// Handler for Split SDK events class SplitEventMethodCallHandler implements MethodCallHandler { static const String _eventClientReady = 'clientReady'; static const String _eventClientReadyFromCache = 'clientReadyFromCache'; @@ -24,6 +25,7 @@ class SplitEventMethodCallHandler implements MethodCallHandler { _eventClientTimeout: false, }; + /// Creates a new instance of the Split event method call handler. SplitEventMethodCallHandler(this._matchingKey, this._bucketingKey); @override @@ -48,26 +50,32 @@ class SplitEventMethodCallHandler implements MethodCallHandler { } } + /// Returns Future that is completed when the SDK client is ready. Future onReady() { return _onEvent(_eventClientReady); } + /// Returns Future that is completed when the SDK client is ready from cache. Future onReadyFromCache() { return _onEvent(_eventClientReadyFromCache); } + /// Returns Stream that emits when the SDK client is updated. Stream onUpdated() { return _updateStreamCompleter.stream; } + /// Returns Future that is completed when the SDK client times out. Future onTimeout() { return _onEvent(_eventClientTimeout); } + /// Cleans up resources. void destroy() { _updateStreamCompleter.close(); } + /// Returns Future that is completed when the specified SDK event occurs. Future _onEvent(String sdkEvent) { if (_triggeredClientEvents.containsKey(sdkEvent) && _triggeredClientEvents[sdkEvent] == true) { diff --git a/splitio_platform_interface/lib/impressions/impressions_method_call_handler.dart b/splitio_platform_interface/lib/impressions/impressions_method_call_handler.dart index ea4e4a4..c68e8fd 100644 --- a/splitio_platform_interface/lib/impressions/impressions_method_call_handler.dart +++ b/splitio_platform_interface/lib/impressions/impressions_method_call_handler.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:splitio_platform_interface/method_call_handler.dart'; import 'package:splitio_platform_interface/split_impression.dart'; +/// Handles impressions method calls. class ImpressionsMethodCallHandler extends StreamMethodCallHandler { final _streamController = StreamController(); diff --git a/splitio_platform_interface/lib/method_call_handler.dart b/splitio_platform_interface/lib/method_call_handler.dart index 6ef88ac..3a28da6 100644 --- a/splitio_platform_interface/lib/method_call_handler.dart +++ b/splitio_platform_interface/lib/method_call_handler.dart @@ -1,7 +1,11 @@ +/// Abstract class for handling method calls. abstract class MethodCallHandler { + /// Handles a method call with the given method name and arguments. Future handle(String methodName, dynamic methodArguments); } +/// Abstract class for handling stream method calls. abstract class StreamMethodCallHandler extends MethodCallHandler { + /// Returns a stream of the given type. Stream stream(); } diff --git a/splitio_platform_interface/lib/method_channel_platform.dart b/splitio_platform_interface/lib/method_channel_platform.dart index aaf0b2c..0d66439 100644 --- a/splitio_platform_interface/lib/method_channel_platform.dart +++ b/splitio_platform_interface/lib/method_channel_platform.dart @@ -6,7 +6,9 @@ const String _controlTreatment = 'control'; const SplitResult _controlResult = SplitResult(_controlTreatment, null); const MethodChannel _methodChannel = MethodChannel('splitio'); +/// Method channel platform implementation. class MethodChannelPlatform extends SplitioPlatform { + /// Returns the method channel. MethodChannel get methodChannel => _methodChannel; final Map _handlers = {}; @@ -15,6 +17,8 @@ class MethodChannelPlatform extends SplitioPlatform { ImpressionsMethodCallHandler(); @visibleForTesting + + /// Handles method calls from the platform. Future handle(MethodCall call) async { _impressionsMethodCallHandler.handle(call.method, call.arguments); for (MethodCallHandler handler in _handlers.values) { diff --git a/splitio_platform_interface/lib/split_certificate_pinning_configuration.dart b/splitio_platform_interface/lib/split_certificate_pinning_configuration.dart index 78b9a0b..0c9f839 100644 --- a/splitio_platform_interface/lib/split_certificate_pinning_configuration.dart +++ b/splitio_platform_interface/lib/split_certificate_pinning_configuration.dart @@ -1,9 +1,11 @@ +/// Certificate pinning configuration. class CertificatePinningConfiguration { - final Map> _pins = {}; + /// Returns the pins. Map> get pins => _pins; + /// Adds a pin for the given host. CertificatePinningConfiguration addPin(String host, String pin) { pin = pin.trim(); if (pin.isEmpty) { @@ -17,4 +19,4 @@ class CertificatePinningConfiguration { _pins[host]?.add(pin); return this; } -} \ No newline at end of file +} diff --git a/splitio_platform_interface/lib/split_configuration.dart b/splitio_platform_interface/lib/split_configuration.dart index c742c48..90ce1be 100644 --- a/splitio_platform_interface/lib/split_configuration.dart +++ b/splitio_platform_interface/lib/split_configuration.dart @@ -3,7 +3,9 @@ import 'package:splitio_platform_interface/split_fallback_treatments_configurati import 'package:splitio_platform_interface/split_sync_config.dart'; import 'package:splitio_platform_interface/split_rollout_cache_configuration.dart'; +/// Split configuration. class SplitConfiguration { + /// The configuration map. final Map configurationMap = {}; /// Initializes the Split configuration. @@ -211,16 +213,49 @@ class SplitConfiguration { } } +/// Impressions mode. enum ImpressionsMode { + /// Debug impressions mode. debug, + + /// Optimized impressions mode. optimized, + + /// None impressions mode. none, } +/// User consent. enum UserConsent { + /// The user grants consent for tracking events and impressions. The SDK sends them to Split cloud. granted, + + /// The user declines consent for tracking events and impressions. The SDK does not send them to Split cloud. declined, + + /// The user neither grants nor declines consent for tracking events and impressions. The SDK tracks them in its + /// internal storage, and eventually either sends them or not if the consent status is updated to 'GRANTED' or + /// 'DECLINED' respectively. The status can be updated at any time with the `UserConsent.setStatus` factory method. unknown, } -enum SplitLogLevel { verbose, debug, info, warning, error, none } +/// Split log level. +enum SplitLogLevel { + /// Verbose log level. + verbose, + + /// Debug log level. + debug, + + /// Info log level. + info, + + /// Warning log level. + warning, + + /// Error log level. + error, + + /// None log level. + none +} diff --git a/splitio_platform_interface/lib/split_evaluation_options.dart b/splitio_platform_interface/lib/split_evaluation_options.dart index 2a603a8..9986514 100644 --- a/splitio_platform_interface/lib/split_evaluation_options.dart +++ b/splitio_platform_interface/lib/split_evaluation_options.dart @@ -1,17 +1,22 @@ import 'dart:collection'; +/// Options for evaluation. class EvaluationOptions { final Map _properties; + /// Impression properties. Map get properties => UnmodifiableMapView(_properties); + /// Creates a new EvaluationOptions instance. const EvaluationOptions.empty() : _properties = const {}; + /// Creates a new EvaluationOptions instance. factory EvaluationOptions([Map properties = const {}]) { return EvaluationOptions._( Map.unmodifiable(Map.from(properties))); } + /// Converts the EvaluationOptions to a JSON map. Map toJson() => { 'properties': _properties, }; diff --git a/splitio_platform_interface/lib/split_fallback_treatment.dart b/splitio_platform_interface/lib/split_fallback_treatment.dart index bb52ed9..bca1dc5 100644 --- a/splitio_platform_interface/lib/split_fallback_treatment.dart +++ b/splitio_platform_interface/lib/split_fallback_treatment.dart @@ -1,6 +1,11 @@ +/// Fallback treatment for when the feature flag cannot be evaluated. class FallbackTreatment { + /// The treatment value. final String treatment; + + /// The treatment configuration. final String? config; + /// Creates a new FallbackTreatment instance. const FallbackTreatment(this.treatment, [this.config]); } diff --git a/splitio_platform_interface/lib/split_fallback_treatments_configuration.dart b/splitio_platform_interface/lib/split_fallback_treatments_configuration.dart index d3c3c8d..3281ae5 100644 --- a/splitio_platform_interface/lib/split_fallback_treatments_configuration.dart +++ b/splitio_platform_interface/lib/split_fallback_treatments_configuration.dart @@ -1,12 +1,17 @@ import 'package:splitio_platform_interface/split_fallback_treatment.dart'; +/// Configuration for fallback treatments. class FallbackTreatmentsConfiguration { Map? _global; Map>? _byFlag; + /// Global fallback treatment. Map? get global => _global; + + /// Fallback treatments by flag. Map>? get byFlag => _byFlag; + /// Creates a new FallbackTreatmentsConfiguration instance. FallbackTreatmentsConfiguration( {FallbackTreatment? global, Map? byFlag}) { _global = global != null diff --git a/splitio_platform_interface/lib/split_impression.dart b/splitio_platform_interface/lib/split_impression.dart index b3df44d..de7c15b 100644 --- a/splitio_platform_interface/lib/split_impression.dart +++ b/splitio_platform_interface/lib/split_impression.dart @@ -1,17 +1,37 @@ +/// Represents an impression when a feature flag is evaluated. class Impression { + /// The traffic matching key. final String? key; + + /// The traffic bucketing key. final String? bucketingKey; + + /// The name of the feature flag. final String? split; + + /// The treatment value. final String? treatment; + + /// The impression timestamp. final num? time; + + /// The rule label. final String? appliedRule; + + /// The version of the feature flag. final num? changeNumber; + + /// The attributes. final Map attributes; + + /// The impression properties. final Map? properties; + /// Creates a new Impression instance. Impression(this.key, this.bucketingKey, this.split, this.treatment, this.time, this.appliedRule, this.changeNumber, this.attributes, this.properties); + /// Creates a new Impression instance from a map. static Impression fromMap(Map map) { Map? properties; if (map['properties'] != null) { diff --git a/splitio_platform_interface/lib/split_prerequisite.dart b/splitio_platform_interface/lib/split_prerequisite.dart index b8be081..611436c 100644 --- a/splitio_platform_interface/lib/split_prerequisite.dart +++ b/splitio_platform_interface/lib/split_prerequisite.dart @@ -1,14 +1,19 @@ +/// Prerequisite class. class Prerequisite { final String _name; final Set _treatments; + /// The feature flag name of the prerequisite. String get name => _name; + /// The treatments of the prerequisite. Set get treatments => _treatments; + /// Creates a new Prerequisite instance. Prerequisite(this._name, this._treatments); + /// Creates a Prerequisite instance from a map. static Prerequisite fromEntry(el) { final String name = (el['n'] ?? el['n:'] ?? '').toString(); final List rawTreatments = (el['t'] as List?) ?? []; @@ -26,6 +31,7 @@ class Prerequisite { }'''; } + /// Checks if this Prerequisite is equal to another Prerequisite. equals(Prerequisite other) { return name == other.name && treatments == other.treatments; } diff --git a/splitio_platform_interface/lib/split_result.dart b/splitio_platform_interface/lib/split_result.dart index f1c0896..fe6c4fc 100644 --- a/splitio_platform_interface/lib/split_result.dart +++ b/splitio_platform_interface/lib/split_result.dart @@ -4,9 +4,13 @@ /// /// The [config] contains the configuration for the split, if any. May be null. class SplitResult { + /// The treatment of the split. final String treatment; + + /// The configuration of the split, if any. May be null. final String? config; + /// Creates a new SplitResult instance. const SplitResult(this.treatment, this.config); @override diff --git a/splitio_platform_interface/lib/split_rollout_cache_configuration.dart b/splitio_platform_interface/lib/split_rollout_cache_configuration.dart index 9c2b0f3..340bc5d 100644 --- a/splitio_platform_interface/lib/split_rollout_cache_configuration.dart +++ b/splitio_platform_interface/lib/split_rollout_cache_configuration.dart @@ -1,12 +1,17 @@ +/// Rollout cache configuration class. class RolloutCacheConfiguration { - late int _expirationDays; late bool _clearOnInit; + /// The expiration days of the cache. int get expirationDays => _expirationDays; + + /// Whether to clear the cache on initialization. bool get clearOnInit => _clearOnInit; - RolloutCacheConfiguration({int expirationDays = 10, bool clearOnInit = false}) { + /// Creates a new RolloutCacheConfiguration instance. + RolloutCacheConfiguration( + {int expirationDays = 10, bool clearOnInit = false}) { if (expirationDays < 1) { expirationDays = 10; } diff --git a/splitio_platform_interface/lib/split_sync_config.dart b/splitio_platform_interface/lib/split_sync_config.dart index bc47f8d..1b0ed05 100644 --- a/splitio_platform_interface/lib/split_sync_config.dart +++ b/splitio_platform_interface/lib/split_sync_config.dart @@ -1,14 +1,19 @@ +/// Sync configuration class for controlling which feature flags to fetch. class SyncConfig { late Set _names; late Set _prefixes; late Set _sets; + /// Names of the feature flags to fetch. Set get names => _names; + /// Prefixes of the feature flags to fetch. Set get prefixes => _prefixes; + /// Flag sets of the feature flags to fetch. Set get sets => _sets; + /// Creates a new SyncConfig instance passing an optional list of names and prefixes. SyncConfig( {List names = const [], List prefixes = const []}) { _names = names.toSet(); @@ -16,12 +21,14 @@ class SyncConfig { _sets = {}; } + /// Creates a new SyncConfig instance passing an optional set of names and prefixes. SyncConfig.fromSet( {Set names = const {}, Set prefixes = const {}}) { _names = names; _prefixes = prefixes; } + /// Creates a new SyncConfig instance passing a list of flag sets. SyncConfig.flagSets(List sets) { _sets = sets.toSet(); _names = {}; diff --git a/splitio_platform_interface/lib/split_view.dart b/splitio_platform_interface/lib/split_view.dart index 8908cf6..b4a2244 100644 --- a/splitio_platform_interface/lib/split_view.dart +++ b/splitio_platform_interface/lib/split_view.dart @@ -2,6 +2,7 @@ import 'dart:core'; import 'package:splitio_platform_interface/split_prerequisite.dart'; +/// Represents a feature flag class SplitView { static const String _keyName = 'name'; static const String _keyTrafficType = 'trafficType'; @@ -14,17 +15,37 @@ class SplitView { static const String _keyImpressionsDisabled = 'impressionsDisabled'; static const String _keyPrerequisites = 'prerequisites'; + /// The name of the feature flag. String name; + + /// The traffic type of the feature flag. String trafficType; + + /// Whether the feature flag is killed. bool killed = false; + + /// The treatments of the feature flag. List treatments = []; + + /// The change number of the feature flag. int? changeNumber; + + /// The configurations per treatment of the feature flag. Map configs = {}; + + /// The default treatment of the feature flag. String defaultTreatment; + + /// The sets of the feature flag. List sets = []; + + /// Whether impressions are disabled for the feature flag. bool impressionsDisabled = false; + + /// The prerequisites of the feature flag. Set prerequisites = {}; + /// Creates a new SplitView instance. SplitView(this.name, this.trafficType, this.killed, this.treatments, this.changeNumber, this.configs, [this.defaultTreatment = '', @@ -32,6 +53,7 @@ class SplitView { this.impressionsDisabled = false, this.prerequisites = const {}]); + /// Creates a SplitView instance from a map entry. static SplitView? fromEntry(Map? entry) { if (entry == null || entry.isEmpty) { return null; diff --git a/splitio_platform_interface/lib/splitio_platform_interface.dart b/splitio_platform_interface/lib/splitio_platform_interface.dart index 247c3a2..435c1a2 100644 --- a/splitio_platform_interface/lib/splitio_platform_interface.dart +++ b/splitio_platform_interface/lib/splitio_platform_interface.dart @@ -222,12 +222,14 @@ abstract class _ClientPlatform { /// [SplitioPlatform] methods. abstract class SplitioPlatform extends PlatformInterface with _FactoryPlatform, _ClientPlatform { + /// Creates a new SplitioPlatform instance. SplitioPlatform() : super(token: _token); static SplitioPlatform _instance = MethodChannelPlatform(); static final Object _token = Object(); + /// The instance of SplitioPlatform that is used to communicate with the native platform. static SplitioPlatform get instance => _instance; /// Platform-specific plugins should set this with their own platform-specific diff --git a/splitio_web/analysis_options.yaml b/splitio_web/analysis_options.yaml index a5744c1..5cf0db1 100644 --- a/splitio_web/analysis_options.yaml +++ b/splitio_web/analysis_options.yaml @@ -2,3 +2,7 @@ include: package:flutter_lints/flutter.yaml # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options + +linter: + rules: + - public_member_api_docs diff --git a/splitio_web/lib/src/js_interop.dart b/splitio_web/lib/src/js_interop.dart index 4d5076d..42bf8d1 100644 --- a/splitio_web/lib/src/js_interop.dart +++ b/splitio_web/lib/src/js_interop.dart @@ -3,6 +3,7 @@ import 'package:splitio_platform_interface/splitio_platform_interface.dart'; // JS SDK types +/// SplitIO.ImpressionDTO @JS() extension type JSImpressionDTO._(JSObject _) implements JSObject { external JSString feature; @@ -16,6 +17,7 @@ extension type JSImpressionDTO._(JSObject _) implements JSObject { external JSString? properties; } +/// SplitIO.ImpressionData @JS() extension type JSImpressionData._(JSObject _) implements JSObject { external JSImpressionDTO impression; @@ -25,30 +27,43 @@ extension type JSImpressionData._(JSObject _) implements JSObject { external JSString sdkLanguageVersion; } +/// SplitIO.ILogger @JS() extension type JSILogger._(JSObject _) implements JSObject { + /// Log a debug level message external JSAny? debug(JSString message); + + /// Log an info level message external JSAny? info(JSString message); + + /// Log a warning level message external JSAny? warn(JSString message); + + /// Log an error level message external JSAny? error(JSString message); } +/// SplitIO.IImpressionListener @JS() extension type JSImpressionListener._(JSObject _) implements JSObject { + /// Log an impression external JSVoid logImpression(JSImpressionData impression); } +/// SplitIO.IClientSideSettings['core'] @JS() extension type JSConfigurationCore._(JSObject _) implements JSObject { external JSString authorizationKey; external JSAny key; // string | SplitKey } +/// SplitIO.IClientSideSettings['startup'] @JS() extension type JSConfigurationStartup._(JSObject _) implements JSObject { external JSNumber? readyTimeout; } +/// SplitIO.IClientSideSettings['scheduler'] @JS() extension type JSConfigurationScheduler._(JSObject _) implements JSObject { external JSNumber? featuresRefreshRate; @@ -61,6 +76,7 @@ extension type JSConfigurationScheduler._(JSObject _) implements JSObject { external JSNumber? eventsPushRate; } +/// SplitIO.IClientSideSettings['urls'] @JS() extension type JSConfigurationUrls._(JSObject _) implements JSObject { external JSString? sdk; @@ -70,12 +86,14 @@ extension type JSConfigurationUrls._(JSObject _) implements JSObject { external JSString? telemetry; } +/// SplitIO.IClientSideSettings['sync']['splitFilters'] @JS() extension type JSSplitFilter._(JSObject _) implements JSObject { external JSString type; external JSArray values; } +/// SplitIO.IClientSideSettings['sync'] @JS() extension type JSConfigurationSync._(JSObject _) implements JSObject { external JSString? impressionsMode; @@ -83,6 +101,7 @@ extension type JSConfigurationSync._(JSObject _) implements JSObject { external JSArray? splitFilters; } +/// SplitIO.IClientSideSettings['storage'] @JS() extension type JSConfigurationStorage._(JSObject _) implements JSObject { external JSString? type; @@ -90,12 +109,15 @@ extension type JSConfigurationStorage._(JSObject _) implements JSObject { external JSBoolean? clearOnInit; } +/// SplitIO.IClientSideSettings['fallbackTreatments'] @JS() -extension type JSFallbackTreatmentsConfiguration._(JSObject _) implements JSObject { +extension type JSFallbackTreatmentsConfiguration._(JSObject _) + implements JSObject { external JSTreatmentWithConfig? global; external JSObject? byFlag; } +/// SplitIO.IClientSideSettings @JS() extension type JSConfiguration._(JSObject _) implements JSObject { external JSConfigurationCore core; @@ -111,18 +133,24 @@ extension type JSConfiguration._(JSObject _) implements JSObject { external JSFallbackTreatmentsConfiguration? fallbackTreatments; } +/// SplitIO.ISettings @JS() extension type JSISettings._(JSObject _) implements JSConfiguration { external JSILogger log; external JSImpressionListener? impressionListener; } +/// SplitIO.IUserConsentAPI @JS() extension type JSIUserConsentAPI._(JSObject _) implements JSObject { + /// SplitIO.IUserConsentAPI['setStatus'] external JSBoolean setStatus(JSBoolean userConsent); + + /// SplitIO.IUserConsentAPI['getStatus'] external JSString getStatus(); } +/// SplitIO.EventConsts @JS() extension type JSEventConsts._(JSObject _) implements JSObject { // ignore: non_constant_identifier_names @@ -135,6 +163,7 @@ extension type JSEventConsts._(JSObject _) implements JSObject { external JSString SDK_UPDATE; } +/// SplitIO.ReadinessStatus @JS() extension type JSReadinessStatus._(JSObject _) implements JSObject { external JSBoolean isReady; @@ -142,18 +171,21 @@ extension type JSReadinessStatus._(JSObject _) implements JSObject { external JSBoolean hasTimedout; } +/// SplitIO.TreatmentWithConfig @JS() extension type JSTreatmentWithConfig._(JSObject _) implements JSObject { external JSString treatment; external JSString? config; } +/// SplitIO.SplitView['prerequisites'] @JS() extension type JSPrerequisite._(JSObject _) implements JSObject { external JSString flagName; external JSArray treatments; } +/// SplitIO.SplitView @JS() extension type JSSplitView._(JSObject _) implements JSObject { external JSString name; @@ -168,73 +200,132 @@ extension type JSSplitView._(JSObject _) implements JSObject { external JSArray prerequisites; } +/// SplitIO.EvaluationOptions @JS() extension type JSEvaluationOptions._(JSObject _) implements JSObject { external JSObject properties; } +/// SplitIO.IBrowserClient @JS() extension type JSIBrowserClient._(JSObject _) implements JSObject { + /// SplitIO.IBrowserClient['getTreatment'] external JSString getTreatment(JSString flagName, JSObject attributes, JSEvaluationOptions evaluationOptions); + + /// SplitIO.IBrowserClient['getTreatments'] external JSObject getTreatments(JSArray flagNames, JSObject attributes, JSEvaluationOptions evaluationOptions); + + /// SplitIO.IBrowserClient['getTreatmentWithConfig'] external JSTreatmentWithConfig getTreatmentWithConfig(JSString flagName, JSObject attributes, JSEvaluationOptions evaluationOptions); + + /// SplitIO.IBrowserClient['getTreatmentsWithConfig'] external JSObject getTreatmentsWithConfig(JSArray flagNames, JSObject attributes, JSEvaluationOptions evaluationOptions); + + /// SplitIO.IBrowserClient['getTreatmentsByFlagSet'] external JSObject getTreatmentsByFlagSet(JSString flagSetName, JSObject attributes, JSEvaluationOptions evaluationOptions); + + /// SplitIO.IBrowserClient['getTreatmentsByFlagSets'] external JSObject getTreatmentsByFlagSets(JSArray flagSetNames, JSObject attributes, JSEvaluationOptions evaluationOptions); + + /// SplitIO.IBrowserClient['getTreatmentsWithConfigByFlagSet'] external JSObject getTreatmentsWithConfigByFlagSet(JSString flagSetName, JSObject attributes, JSEvaluationOptions evaluationOptions); + + /// SplitIO.IBrowserClient['getTreatmentsWithConfigByFlagSets'] external JSObject getTreatmentsWithConfigByFlagSets( JSArray flagSetNames, JSObject attributes, JSEvaluationOptions evaluationOptions); + + /// SplitIO.IBrowserClient['track'] external JSBoolean track(JSString? trafficType, JSString eventType, JSNumber? value, JSObject? attributes); + + /// SplitIO.IBrowserClient['setAttribute'] external JSBoolean setAttribute( JSString attributeName, JSAny? attributeValue); + + /// SplitIO.IBrowserClient['getAttribute'] external JSAny getAttribute(JSString attributeName); + + /// SplitIO.IBrowserClient['removeAttribute'] external JSBoolean removeAttribute(JSString attributeName); + + /// SplitIO.IBrowserClient['setAttributes'] external JSBoolean setAttributes(JSObject attributes); + + /// SplitIO.IBrowserClient['getAttributes'] external JSObject getAttributes(); + + /// SplitIO.IBrowserClient['clearAttributes'] external JSBoolean clearAttributes(); + + /// SplitIO.IBrowserClient['flush'] external JSPromise flush(); + + /// SplitIO.IBrowserClient['destroy'] external JSPromise destroy(); + + /// SplitIO.IBrowserClient['on'] external JSVoid on(JSString event, JSFunction listener); + + /// SplitIO.IBrowserClient['off'] external JSVoid off(JSString event, JSFunction listener); + + /// SplitIO.IBrowserClient['emit'] external JSVoid emit(JSString event); // ignore: non_constant_identifier_names external JSEventConsts Event; + + /// SplitIO.IBrowserClient['getStatus'] external JSReadinessStatus getStatus(); } +/// SplitIO.IManager @JS() extension type JSIManager._(JSObject _) implements JSObject { + /// SplitIO.IManager['names'] external JSArray names(); + + /// SplitIO.IManager['split'] external JSSplitView? split(JSString name); + + /// SplitIO.IManager['splits'] external JSArray splits(); } +/// SplitIO.IBrowserSDK @JS() extension type JSIBrowserSDK._(JSObject _) implements JSObject { + /// SplitIO.IBrowserSDK['client'] external JSIBrowserClient client(JSAny? key); + + /// SplitIO.IBrowserSDK['manager'] external JSIManager manager(); + + /// SplitIO.IBrowserSDK['settings'] external JSISettings settings; // ignore: non_constant_identifier_names external JSIUserConsentAPI UserConsent; } +/// SplitIO.LoggerFactory @JS() extension type JSLoggerFactory._(JSFunction _) implements JSFunction { + /// A callable function external JSObject call(); } +/// Type of the `window.splitio` object @JS() extension type JSBrowserSDKPackage._(JSObject _) implements JSObject { + /// Browser SDK factory constructor // ignore: non_constant_identifier_names external JSIBrowserSDK SplitFactory(JSConfiguration config); // ignore: non_constant_identifier_names @@ -251,41 +342,52 @@ extension type JSBrowserSDKPackage._(JSObject _) implements JSObject { // Conversion utils: JS to Dart types +/// Get the keys of a JavaScript object @JS('Object.keys') external JSArray objectKeys(JSObject obj); +/// Get a property from a JavaScript object @JS('Reflect.get') external JSAny? reflectGet(JSObject target, JSString propertyKey); +/// Set a property on a JavaScript object @JS('Reflect.set') external JSAny? reflectSet(JSObject target, JSString propertyKey, JSAny? value); +/// Parse a JSON string into a JavaScript object @JS('JSON.parse') external JSObject jsonParse(JSString obj); +/// Convert a JavaScript array to a Dart list List jsArrayToList(JSArray obj) => (obj.dartify() as List).cast(); +/// Convert a JavaScript object to a Dart map Map jsObjectToMap(JSObject obj) => (obj.dartify() as Map).cast(); +/// Convert a JavaScript value to a Dart value Object? jsAnyToDart(JSAny? value) => value.dartify(); // Conversion utils: JS SDK to Flutter SDK types +/// Convert a JavaScript SplitIO.Treatments object to a Dart map Map jsTreatmentsToMap(JSObject obj) { return jsObjectToMap(obj).map((k, v) => MapEntry(k, v as String)); } +/// Convert a JavaScript SplitIO.TreatmentsWithConfig object to a Dart map Map jsTreatmentsWithConfigToMap(JSObject obj) { return jsObjectToMap(obj).map((k, v) => MapEntry( k, SplitResult(v['treatment'] as String, v['config'] as String?))); } +/// Convert a JavaScript SplitIO.TreatmentWithConfig object to a Dart SplitResult SplitResult jsTreatmentWithConfigToSplitResult(JSTreatmentWithConfig obj) { return SplitResult(obj.treatment.toDart, obj.config?.toDart); } +/// Convert a JavaScript prerequisite object to a Dart Prerequisite Prerequisite jsPrerequisiteToPrerequisite(JSPrerequisite obj) { return Prerequisite( obj.flagName.toDart, @@ -293,6 +395,7 @@ Prerequisite jsPrerequisiteToPrerequisite(JSPrerequisite obj) { ); } +/// Convert a JavaScript SplitIO.SplitView object to a Dart SplitView SplitView jsSplitViewToSplitView(JSSplitView obj) { return SplitView( obj.name.toDart, @@ -307,6 +410,7 @@ SplitView jsSplitViewToSplitView(JSSplitView obj) { obj.prerequisites.toDart.map(jsPrerequisiteToPrerequisite).toSet()); } +/// Convert a JavaScript SplitIO.ImpressionData object to a Dart Impression Impression jsImpressionDataToImpression(JSImpressionData obj) { return Impression( obj.impression.keyName.toDart, @@ -323,6 +427,7 @@ Impression jsImpressionDataToImpression(JSImpressionData obj) { ); } +/// Build a JavaScript SplitIO.SplitKey object from a matching key and optional bucketing key JSAny buildJsKey(String matchingKey, String? bucketingKey) { if (bucketingKey != null) { return { @@ -333,6 +438,7 @@ JSAny buildJsKey(String matchingKey, String? bucketingKey) { return matchingKey.toJS; } +/// Build a string index from a matching key and optional bucketing key String buildKeyString(String matchingKey, String? bucketingKey) { return bucketingKey == null ? matchingKey : '${matchingKey}_$bucketingKey'; }