diff --git a/splitio_web/analysis_options.yaml b/splitio_web/analysis_options.yaml new file mode 100644 index 0000000..a5744c1 --- /dev/null +++ b/splitio_web/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/splitio_web/lib/splitio_web.dart b/splitio_web/lib/splitio_web.dart index fb938f9..6a0102f 100644 --- a/splitio_web/lib/splitio_web.dart +++ b/splitio_web/lib/splitio_web.dart @@ -7,7 +7,7 @@ import 'package:web/web.dart'; extension on Window { @JS() - external JS_BrowserSDKPackage? splitio; + external JSBrowserSDKPackage? splitio; } /// Web implementation of [SplitioPlatform]. @@ -20,13 +20,13 @@ class SplitioWeb extends SplitioPlatform { // Future to queue method calls until SDK is initialized Future? _initFuture; - late JS_IBrowserSDK _factory; + late JSIBrowserSDK _factory; String? _trafficType; // Broadcast to allow users to subscribe multiple listeners final StreamController _impressionsStreamController = StreamController.broadcast(); - final Map _clients = {}; + final Map _clients = {}; @override Future init({ @@ -35,14 +35,11 @@ class SplitioWeb extends SplitioPlatform { required String? bucketingKey, SplitConfiguration? sdkConfiguration, }) { - if (_initFuture == null) { - _initFuture = this._init( - apiKey: apiKey, - matchingKey: matchingKey, - bucketingKey: bucketingKey, - sdkConfiguration: sdkConfiguration); - } - return _initFuture!; + return _initFuture ??= _init( + apiKey: apiKey, + matchingKey: matchingKey, + bucketingKey: bucketingKey, + sdkConfiguration: sdkConfiguration); } Future _init({ @@ -57,11 +54,11 @@ class SplitioWeb extends SplitioPlatform { _buildConfig(apiKey, matchingKey, bucketingKey, sdkConfiguration); // Create factory instance - this._factory = window.splitio!.SplitFactory(config); + _factory = window.splitio!.SplitFactory(config); if (sdkConfiguration != null) { if (sdkConfiguration.configurationMap['trafficType'] is String) { - this._trafficType = sdkConfiguration.configurationMap['trafficType']; + _trafficType = sdkConfiguration.configurationMap['trafficType']; } // Log warnings regarding unsupported configs. Not done in _buildConfig to reuse the factory logger @@ -73,7 +70,7 @@ class SplitioWeb extends SplitioPlatform { ]; for (final configName in unsupportedConfigs) { if (sdkConfiguration.configurationMap[configName] != null) { - this._factory.settings.log.warn( + _factory.settings.log.warn( 'Config $configName is not supported by the Web package. This config will be ignored.' .toJS); } @@ -118,54 +115,65 @@ class SplitioWeb extends SplitioPlatform { } // Map SplitConfiguration to JS equivalent object - JS_Configuration _buildConfig(String apiKey, String matchingKey, + JSConfiguration _buildConfig(String apiKey, String matchingKey, String? bucketingKey, SplitConfiguration? configuration) { - final config = JSObject() as JS_Configuration; + final config = JSObject() as JSConfiguration; - final core = JSObject() as JS_ConfigurationCore; + final core = JSObject() as JSConfigurationCore; core.authorizationKey = apiKey.toJS; core.key = buildJsKey(matchingKey, bucketingKey); config.core = core; if (configuration != null) { - final scheduler = JSObject() as JS_ConfigurationScheduler; - if (configuration.configurationMap.containsKey('featuresRefreshRate')) + final scheduler = JSObject() as JSConfigurationScheduler; + if (configuration.configurationMap.containsKey('featuresRefreshRate')) { scheduler.featuresRefreshRate = (configuration.configurationMap['featuresRefreshRate'] as int).toJS; - if (configuration.configurationMap.containsKey('segmentsRefreshRate')) + } + if (configuration.configurationMap.containsKey('segmentsRefreshRate')) { scheduler.segmentsRefreshRate = (configuration.configurationMap['segmentsRefreshRate'] as int).toJS; - if (configuration.configurationMap.containsKey('impressionsRefreshRate')) + } + if (configuration.configurationMap + .containsKey('impressionsRefreshRate')) { scheduler.impressionsRefreshRate = (configuration.configurationMap['impressionsRefreshRate'] as int) .toJS; - if (configuration.configurationMap.containsKey('telemetryRefreshRate')) + } + if (configuration.configurationMap.containsKey('telemetryRefreshRate')) { scheduler.telemetryRefreshRate = (configuration.configurationMap['telemetryRefreshRate'] as int) .toJS; - if (configuration.configurationMap.containsKey('eventsQueueSize')) + } + if (configuration.configurationMap.containsKey('eventsQueueSize')) { scheduler.eventsQueueSize = (configuration.configurationMap['eventsQueueSize'] as int).toJS; - if (configuration.configurationMap.containsKey('impressionsQueueSize')) + } + if (configuration.configurationMap.containsKey('impressionsQueueSize')) { scheduler.impressionsQueueSize = (configuration.configurationMap['impressionsQueueSize'] as int) .toJS; - if (configuration.configurationMap.containsKey('eventFlushInterval')) + } + if (configuration.configurationMap.containsKey('eventFlushInterval')) { scheduler.eventsPushRate = (configuration.configurationMap['eventFlushInterval'] as int).toJS; + } config.scheduler = scheduler; - if (configuration.configurationMap.containsKey('streamingEnabled')) + if (configuration.configurationMap.containsKey('streamingEnabled')) { config.streamingEnabled = (configuration.configurationMap['streamingEnabled'] as bool).toJS; + } - final urls = JSObject() as JS_ConfigurationUrls; - if (configuration.configurationMap.containsKey('sdkEndpoint')) + final urls = JSObject() as JSConfigurationUrls; + if (configuration.configurationMap.containsKey('sdkEndpoint')) { urls.sdk = (configuration.configurationMap['sdkEndpoint'] as String).toJS; - if (configuration.configurationMap.containsKey('eventsEndpoint')) + } + if (configuration.configurationMap.containsKey('eventsEndpoint')) { urls.events = (configuration.configurationMap['eventsEndpoint'] as String).toJS; + } // Convert urls for consistency between Browser SDK and Android/iOS SDK if (configuration.configurationMap.containsKey('authServiceEndpoint')) { @@ -195,7 +203,7 @@ class SplitioWeb extends SplitioPlatform { } config.urls = urls; - final sync = JSObject() as JS_ConfigurationSync; + final sync = JSObject() as JSConfigurationSync; if (configuration.configurationMap['impressionsMode'] != null) { sync.impressionsMode = (configuration.configurationMap['impressionsMode'] as String) @@ -230,7 +238,7 @@ class SplitioWeb extends SplitioPlatform { splitFilters.add( {'type': 'bySet', 'values': syncConfig['syncConfigFlagSets']}); } - sync.splitFilters = splitFilters.jsify() as JSArray; + sync.splitFilters = splitFilters.jsify() as JSArray; } config.sync = sync; @@ -275,13 +283,13 @@ class SplitioWeb extends SplitioPlatform { } if (configuration.configurationMap['readyTimeout'] != null) { - final startup = JSObject() as JS_ConfigurationStartup; + final startup = JSObject() as JSConfigurationStartup; startup.readyTimeout = (configuration.configurationMap['readyTimeout'] as int).toJS; config.startup = startup; } - final storageOptions = JSObject() as JS_ConfigurationStorage; + final storageOptions = JSObject() as JSConfigurationStorage; storageOptions.type = 'LOCALSTORAGE'.toJS; if (configuration.configurationMap['rolloutCacheConfiguration'] != null) { final rolloutCacheConfiguration = @@ -304,11 +312,11 @@ class SplitioWeb extends SplitioPlatform { } if (configuration.configurationMap['impressionListener'] is bool) { - final JSFunction logImpression = ((JS_ImpressionData data) { + final JSFunction logImpression = ((JSImpressionData data) { _impressionsStreamController.add(jsImpressionDataToImpression(data)); }).toJS; - final impressionListener = JSObject() as JS_IImpressionListener; + final impressionListener = JSObject() as JSImpressionListener; reflectSet(impressionListener, 'logImpression'.toJS, logImpression); config.impressionListener = impressionListener; @@ -326,11 +334,11 @@ class SplitioWeb extends SplitioPlatform { await _getClient(matchingKey: matchingKey, bucketingKey: bucketingKey); } - Future _getClient({ + Future _getClient({ required String matchingKey, required String? bucketingKey, }) async { - await this._initFuture; + await _initFuture; final key = buildKeyString(matchingKey, bucketingKey); @@ -338,8 +346,8 @@ class SplitioWeb extends SplitioPlatform { _factory.client(buildJsKey(matchingKey, bucketingKey))); } - Future _getManager() async { - await this._initFuture; + Future _getManager() async { + await _initFuture; return _factory.manager(); } @@ -367,7 +375,7 @@ class SplitioWeb extends SplitioPlatform { if (jsValue != null) { reflectSet(jsMap, key.toJS, jsValue); } else { - this._factory.settings.log.warn( + _factory.settings.log.warn( 'Invalid ${isAttribute ? 'attribute' : 'property'} value: $value, for key: $key, will be ignored' .toJS); } @@ -376,9 +384,9 @@ class SplitioWeb extends SplitioPlatform { return jsMap; } - JS_EvaluationOptions _convertEvaluationOptions( + JSEvaluationOptions _convertEvaluationOptions( EvaluationOptions evaluationOptions) { - final jsEvalOptions = JSObject() as JS_EvaluationOptions; + final jsEvalOptions = JSObject() as JSEvaluationOptions; if (evaluationOptions.properties.isNotEmpty) { jsEvalOptions.properties = @@ -570,13 +578,9 @@ class SplitioWeb extends SplitioPlatform { ); final result = client.track( - trafficType != null - ? trafficType.toJS - : this._trafficType != null - ? this._trafficType!.toJS - : null, + trafficType != null ? trafficType.toJS : _trafficType?.toJS, eventType.toJS, - value != null ? value.toJS : null, + value?.toJS, _convertMap(properties, false)); return result.toDart; @@ -722,7 +726,7 @@ class SplitioWeb extends SplitioPlatform { @override Future getUserConsent() async { - await this._initFuture; + await _initFuture; final userConsentStatus = _factory.UserConsent.getStatus(); @@ -738,7 +742,7 @@ class SplitioWeb extends SplitioPlatform { @override Future setUserConsent(bool enabled) async { - await this._initFuture; + await _initFuture; _factory.UserConsent.setStatus(enabled.toJS); } @@ -828,20 +832,21 @@ class SplitioWeb extends SplitioPlatform { controller.add(null); } }).toJS; - final registerJsCallback = () async { + Future registerJsCallback() async { final client = await _getClient( matchingKey: matchingKey, bucketingKey: bucketingKey, ); client.on(client.Event.SDK_UPDATE, jsCallback); - }; - final deregisterJsCallback = () async { + } + + Future deregisterJsCallback() async { final client = await _getClient( matchingKey: matchingKey, bucketingKey: bucketingKey, ); client.off(client.Event.SDK_UPDATE, jsCallback); - }; + } // No broadcast to support pause and resume of individual subscriptions controller = StreamController( diff --git a/splitio_web/lib/src/js_interop.dart b/splitio_web/lib/src/js_interop.dart index 95a4870..df58d6e 100644 --- a/splitio_web/lib/src/js_interop.dart +++ b/splitio_web/lib/src/js_interop.dart @@ -4,7 +4,7 @@ import 'package:splitio_platform_interface/splitio_platform_interface.dart'; // JS SDK types @JS() -extension type JS_ImpressionDTO._(JSObject _) implements JSObject { +extension type JSImpressionDTO._(JSObject _) implements JSObject { external JSString feature; external JSString keyName; external JSString treatment; @@ -17,8 +17,8 @@ extension type JS_ImpressionDTO._(JSObject _) implements JSObject { } @JS() -extension type JS_ImpressionData._(JSObject _) implements JSObject { - external JS_ImpressionDTO impression; +extension type JSImpressionData._(JSObject _) implements JSObject { + external JSImpressionDTO impression; external JSObject? attributes; external JSAny ip; // string | false external JSAny hostname; // string | false @@ -26,7 +26,7 @@ extension type JS_ImpressionData._(JSObject _) implements JSObject { } @JS() -extension type JS_ILogger._(JSObject _) implements JSObject { +extension type JSILogger._(JSObject _) implements JSObject { external JSAny? debug(JSString message); external JSAny? info(JSString message); external JSAny? warn(JSString message); @@ -34,23 +34,23 @@ extension type JS_ILogger._(JSObject _) implements JSObject { } @JS() -extension type JS_IImpressionListener._(JSObject _) implements JSObject { - external JSVoid logImpression(JS_ImpressionData impression); +extension type JSImpressionListener._(JSObject _) implements JSObject { + external JSVoid logImpression(JSImpressionData impression); } @JS() -extension type JS_ConfigurationCore._(JSObject _) implements JSObject { +extension type JSConfigurationCore._(JSObject _) implements JSObject { external JSString authorizationKey; external JSAny key; // string | SplitKey } @JS() -extension type JS_ConfigurationStartup._(JSObject _) implements JSObject { +extension type JSConfigurationStartup._(JSObject _) implements JSObject { external JSNumber? readyTimeout; } @JS() -extension type JS_ConfigurationScheduler._(JSObject _) implements JSObject { +extension type JSConfigurationScheduler._(JSObject _) implements JSObject { external JSNumber? featuresRefreshRate; external JSNumber? segmentsRefreshRate; external JSNumber? impressionsRefreshRate; @@ -62,7 +62,7 @@ extension type JS_ConfigurationScheduler._(JSObject _) implements JSObject { } @JS() -extension type JS_ConfigurationUrls._(JSObject _) implements JSObject { +extension type JSConfigurationUrls._(JSObject _) implements JSObject { external JSString? sdk; external JSString? events; external JSString? auth; @@ -71,80 +71,84 @@ extension type JS_ConfigurationUrls._(JSObject _) implements JSObject { } @JS() -extension type JS_SplitFilter._(JSObject _) implements JSObject { +extension type JSSplitFilter._(JSObject _) implements JSObject { external JSString type; external JSArray values; } @JS() -extension type JS_ConfigurationSync._(JSObject _) implements JSObject { +extension type JSConfigurationSync._(JSObject _) implements JSObject { external JSString? impressionsMode; external JSBoolean? enabled; - external JSArray? splitFilters; + external JSArray? splitFilters; } @JS() -extension type JS_ConfigurationStorage._(JSObject _) implements JSObject { +extension type JSConfigurationStorage._(JSObject _) implements JSObject { external JSString? type; external JSNumber? expirationDays; external JSBoolean? clearOnInit; } @JS() -extension type JS_Configuration._(JSObject _) implements JSObject { - external JS_ConfigurationCore core; - external JS_ConfigurationStartup? startup; - external JS_ConfigurationScheduler? scheduler; - external JS_ConfigurationUrls? urls; - external JS_ConfigurationSync? sync; +extension type JSConfiguration._(JSObject _) implements JSObject { + external JSConfigurationCore core; + external JSConfigurationStartup? startup; + external JSConfigurationScheduler? scheduler; + external JSConfigurationUrls? urls; + external JSConfigurationSync? sync; external JSBoolean? streamingEnabled; external JSString? userConsent; - external JS_IImpressionListener? impressionListener; + external JSImpressionListener? impressionListener; external JSAny? debug; external JSAny? storage; } @JS() -extension type JS_ISettings._(JSObject _) implements JS_Configuration { - external JS_ILogger log; - external JS_IImpressionListener? impressionListener; +extension type JSISettings._(JSObject _) implements JSConfiguration { + external JSILogger log; + external JSImpressionListener? impressionListener; } @JS() -extension type JS_IUserConsentAPI._(JSObject _) implements JSObject { +extension type JSIUserConsentAPI._(JSObject _) implements JSObject { external JSBoolean setStatus(JSBoolean userConsent); external JSString getStatus(); } @JS() -extension type JS_EventConsts._(JSObject _) implements JSObject { +extension type JSEventConsts._(JSObject _) implements JSObject { + // ignore: non_constant_identifier_names external JSString SDK_READY; + // ignore: non_constant_identifier_names external JSString SDK_READY_FROM_CACHE; + // ignore: non_constant_identifier_names external JSString SDK_READY_TIMED_OUT; + // ignore: non_constant_identifier_names external JSString SDK_UPDATE; } @JS() -extension type JS_ReadinessStatus._(JSObject _) implements JSObject { +extension type JSReadinessStatus._(JSObject _) implements JSObject { external JSBoolean isReady; external JSBoolean isReadyFromCache; external JSBoolean hasTimedout; } @JS() -extension type JS_TreatmentWithConfig._(JSObject _) implements JSObject { +extension type JSTreatmentWithConfig._(JSObject _) implements JSObject { external JSString treatment; external JSString? config; } @JS() -extension type JS_Prerequisite._(JSObject _) implements JSObject { +extension type JSPrerequisite._(JSObject _) implements JSObject { external JSString flagName; external JSArray treatments; } @JS() -extension type JS_SplitView._(JSObject _) implements JSObject { +extension type JSSplitView._(JSObject _) implements JSObject { external JSString name; external JSString trafficType; external JSBoolean killed; @@ -154,34 +158,34 @@ extension type JS_SplitView._(JSObject _) implements JSObject { external JSArray sets; external JSString defaultTreatment; external JSBoolean impressionsDisabled; - external JSArray prerequisites; + external JSArray prerequisites; } @JS() -extension type JS_EvaluationOptions._(JSObject _) implements JSObject { +extension type JSEvaluationOptions._(JSObject _) implements JSObject { external JSObject properties; } @JS() -extension type JS_IBrowserClient._(JSObject _) implements JSObject { +extension type JSIBrowserClient._(JSObject _) implements JSObject { external JSString getTreatment(JSString flagName, JSObject attributes, - JS_EvaluationOptions evaluationOptions); + JSEvaluationOptions evaluationOptions); external JSObject getTreatments(JSArray flagNames, - JSObject attributes, JS_EvaluationOptions evaluationOptions); - external JS_TreatmentWithConfig getTreatmentWithConfig(JSString flagName, - JSObject attributes, JS_EvaluationOptions evaluationOptions); + JSObject attributes, JSEvaluationOptions evaluationOptions); + external JSTreatmentWithConfig getTreatmentWithConfig(JSString flagName, + JSObject attributes, JSEvaluationOptions evaluationOptions); external JSObject getTreatmentsWithConfig(JSArray flagNames, - JSObject attributes, JS_EvaluationOptions evaluationOptions); + JSObject attributes, JSEvaluationOptions evaluationOptions); external JSObject getTreatmentsByFlagSet(JSString flagSetName, - JSObject attributes, JS_EvaluationOptions evaluationOptions); + JSObject attributes, JSEvaluationOptions evaluationOptions); external JSObject getTreatmentsByFlagSets(JSArray flagSetNames, - JSObject attributes, JS_EvaluationOptions evaluationOptions); + JSObject attributes, JSEvaluationOptions evaluationOptions); external JSObject getTreatmentsWithConfigByFlagSet(JSString flagSetName, - JSObject attributes, JS_EvaluationOptions evaluationOptions); + JSObject attributes, JSEvaluationOptions evaluationOptions); external JSObject getTreatmentsWithConfigByFlagSets( JSArray flagSetNames, JSObject attributes, - JS_EvaluationOptions evaluationOptions); + JSEvaluationOptions evaluationOptions); external JSBoolean track(JSString? trafficType, JSString eventType, JSNumber? value, JSObject? attributes); external JSBoolean setAttribute( @@ -191,43 +195,51 @@ extension type JS_IBrowserClient._(JSObject _) implements JSObject { external JSBoolean setAttributes(JSObject attributes); external JSObject getAttributes(); external JSBoolean clearAttributes(); - external JSPromise flush(); - external JSPromise destroy(); + external JSPromise flush(); + external JSPromise destroy(); external JSVoid on(JSString event, JSFunction listener); external JSVoid off(JSString event, JSFunction listener); external JSVoid emit(JSString event); - external JS_EventConsts Event; - external JS_ReadinessStatus getStatus(); + // ignore: non_constant_identifier_names + external JSEventConsts Event; + external JSReadinessStatus getStatus(); } @JS() -extension type JS_IManager._(JSObject _) implements JSObject { +extension type JSIManager._(JSObject _) implements JSObject { external JSArray names(); - external JS_SplitView? split(JSString name); - external JSArray splits(); + external JSSplitView? split(JSString name); + external JSArray splits(); } @JS() -extension type JS_IBrowserSDK._(JSObject _) implements JSObject { - external JS_IBrowserClient client(JSAny? key); - external JS_IManager manager(); - external JS_ISettings settings; - external JS_IUserConsentAPI UserConsent; +extension type JSIBrowserSDK._(JSObject _) implements JSObject { + external JSIBrowserClient client(JSAny? key); + external JSIManager manager(); + external JSISettings settings; + // ignore: non_constant_identifier_names + external JSIUserConsentAPI UserConsent; } @JS() -extension type JS_LoggerFactory._(JSFunction _) implements JSFunction { +extension type JSLoggerFactory._(JSFunction _) implements JSFunction { external JSObject call(); } @JS() -extension type JS_BrowserSDKPackage._(JSObject _) implements JSObject { - external JS_IBrowserSDK SplitFactory(JS_Configuration config); +extension type JSBrowserSDKPackage._(JSObject _) implements JSObject { + // ignore: non_constant_identifier_names + external JSIBrowserSDK SplitFactory(JSConfiguration config); + // ignore: non_constant_identifier_names external JSFunction? InLocalStorage; - external JS_LoggerFactory? DebugLogger; - external JS_LoggerFactory? InfoLogger; - external JS_LoggerFactory? WarnLogger; - external JS_LoggerFactory? ErrorLogger; + // ignore: non_constant_identifier_names + external JSLoggerFactory? DebugLogger; + // ignore: non_constant_identifier_names + external JSLoggerFactory? InfoLogger; + // ignore: non_constant_identifier_names + external JSLoggerFactory? WarnLogger; + // ignore: non_constant_identifier_names + external JSLoggerFactory? ErrorLogger; } // Conversion utils: JS to Dart types @@ -263,18 +275,18 @@ Map jsTreatmentsWithConfigToMap(JSObject obj) { k, SplitResult(v['treatment'] as String, v['config'] as String?))); } -SplitResult jsTreatmentWithConfigToSplitResult(JS_TreatmentWithConfig obj) { +SplitResult jsTreatmentWithConfigToSplitResult(JSTreatmentWithConfig obj) { return SplitResult(obj.treatment.toDart, obj.config?.toDart); } -Prerequisite jsPrerequisiteToPrerequisite(JS_Prerequisite obj) { +Prerequisite jsPrerequisiteToPrerequisite(JSPrerequisite obj) { return Prerequisite( obj.flagName.toDart, jsArrayToList(obj.treatments).toSet().cast(), ); } -SplitView jsSplitViewToSplitView(JS_SplitView obj) { +SplitView jsSplitViewToSplitView(JSSplitView obj) { return SplitView( obj.name.toDart, obj.trafficType.toDart, @@ -288,12 +300,10 @@ SplitView jsSplitViewToSplitView(JS_SplitView obj) { obj.prerequisites.toDart.map(jsPrerequisiteToPrerequisite).toSet()); } -Impression jsImpressionDataToImpression(JS_ImpressionData obj) { +Impression jsImpressionDataToImpression(JSImpressionData obj) { return Impression( obj.impression.keyName.toDart, - obj.impression.bucketingKey != null - ? obj.impression.bucketingKey!.toDart - : null, + obj.impression.bucketingKey?.toDart, obj.impression.feature.toDart, obj.impression.treatment.toDart, obj.impression.time.toDartInt, diff --git a/splitio_web/pubspec.yaml b/splitio_web/pubspec.yaml index 814cf3c..e2752e6 100644 --- a/splitio_web/pubspec.yaml +++ b/splitio_web/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: splitio_platform_interface: ^2.0.0 flutter_web_plugins: sdk: flutter - web: ^0.5.0 + web: ">=0.5.0 <2.0.0" dev_dependencies: flutter_test: diff --git a/splitio_web/test/splitio_web_test.dart b/splitio_web/test/splitio_web_test.dart index 9a3f3ca..13c386e 100644 --- a/splitio_web/test/splitio_web_test.dart +++ b/splitio_web/test/splitio_web_test.dart @@ -11,7 +11,7 @@ import 'utils/js_interop_test_utils.dart'; extension on web.Window { @JS() - external JS_BrowserSDKPackage? splitio; + external JSBrowserSDKPackage? splitio; } void main() { @@ -202,7 +202,8 @@ void main() { bucketingKey: 'bucketing-key', splitName: 'split1'); - expect(result.toString(), SplitResult('on', 'some-config').toString()); + expect( + result.toString(), const SplitResult('on', 'some-config').toString()); expect(mock.calls.last.methodName, 'getTreatmentWithConfig'); expect( mock.calls.last.methodArguments.map(jsAnyToDart), ['split1', {}, {}]); @@ -217,7 +218,8 @@ void main() { attributes: {'attr1': true}, evaluationOptions: EvaluationOptions({'prop1': true})); - expect(result.toString(), SplitResult('on', 'some-config').toString()); + expect( + result.toString(), const SplitResult('on', 'some-config').toString()); expect(mock.calls.last.methodName, 'getTreatmentWithConfig'); expect(mock.calls.last.methodArguments.map(jsAnyToDart), [ 'split1', @@ -237,9 +239,9 @@ void main() { expect(result, predicate>((result) { return result.length == 2 && result['split1'].toString() == - SplitResult('on', 'some-config').toString() && + const SplitResult('on', 'some-config').toString() && result['split2'].toString() == - SplitResult('on', 'some-config').toString(); + const SplitResult('on', 'some-config').toString(); })); expect(mock.calls.last.methodName, 'getTreatmentsWithConfig'); expect(mock.calls.last.methodArguments.map(jsAnyToDart), [ @@ -261,9 +263,9 @@ void main() { expect(result, predicate>((result) { return result.length == 2 && result['split1'].toString() == - SplitResult('on', 'some-config').toString() && + const SplitResult('on', 'some-config').toString() && result['split2'].toString() == - SplitResult('on', 'some-config').toString(); + const SplitResult('on', 'some-config').toString(); })); expect(mock.calls.last.methodName, 'getTreatmentsWithConfig'); expect(mock.calls.last.methodArguments.map(jsAnyToDart), [ @@ -351,9 +353,9 @@ void main() { expect(result, predicate>((result) { return result.length == 2 && result['split1'].toString() == - SplitResult('on', 'some-config').toString() && + const SplitResult('on', 'some-config').toString() && result['split2'].toString() == - SplitResult('on', 'some-config').toString(); + const SplitResult('on', 'some-config').toString(); })); expect(mock.calls.last.methodName, 'getTreatmentsWithConfigByFlagSet'); expect( @@ -373,9 +375,9 @@ void main() { expect(result, predicate>((result) { return result.length == 2 && result['split1'].toString() == - SplitResult('on', 'some-config').toString() && + const SplitResult('on', 'some-config').toString() && result['split2'].toString() == - SplitResult('on', 'some-config').toString(); + const SplitResult('on', 'some-config').toString(); })); expect(mock.calls.last.methodName, 'getTreatmentsWithConfigByFlagSet'); expect(mock.calls.last.methodArguments.map(jsAnyToDart), [ @@ -396,9 +398,9 @@ void main() { expect(result, predicate>((result) { return result.length == 2 && result['split1'].toString() == - SplitResult('on', 'some-config').toString() && + const SplitResult('on', 'some-config').toString() && result['split2'].toString() == - SplitResult('on', 'some-config').toString(); + const SplitResult('on', 'some-config').toString(); })); expect(mock.calls.last.methodName, 'getTreatmentsWithConfigByFlagSets'); expect(mock.calls.last.methodArguments.map(jsAnyToDart), [ @@ -421,9 +423,9 @@ void main() { expect(result, predicate>((result) { return result.length == 2 && result['split1'].toString() == - SplitResult('on', 'some-config').toString() && + const SplitResult('on', 'some-config').toString() && result['split2'].toString() == - SplitResult('on', 'some-config').toString(); + const SplitResult('on', 'some-config').toString(); })); expect(mock.calls.last.methodName, 'getTreatmentsWithConfigByFlagSets'); expect(mock.calls.last.methodArguments.map(jsAnyToDart), [ @@ -692,6 +694,7 @@ void main() { eventFlushInterval: 7, eventsPerPush: 8, // unsupported in Web trafficType: 'user', + // ignore: deprecated_member_use enableDebug: false, // deprecated, logLevel has precedence streamingEnabled: false, persistentAttributesEnabled: true, // unsupported in Web @@ -1102,7 +1105,7 @@ void main() { 'ip': false, 'hostname': false, 'sdkLanguageVersion': 'browserjs-1.0.0', - }.jsify() as JS_ImpressionData); + }.jsify() as JSImpressionData); }); group('userConsent', () { diff --git a/splitio_web/test/utils/js_interop_test_utils.dart b/splitio_web/test/utils/js_interop_test_utils.dart index 667fbc9..0e73218 100644 --- a/splitio_web/test/utils/js_interop_test_utils.dart +++ b/splitio_web/test/utils/js_interop_test_utils.dart @@ -2,7 +2,7 @@ import 'dart:js_interop'; import 'package:splitio_web/src/js_interop.dart'; @JS('Promise.resolve') -external JSPromise _promiseResolve(); +external JSPromise _promiseResolve(); @JS('Object.assign') external JSObject _objectAssign(JSObject target, JSObject source); @@ -22,21 +22,21 @@ external JSObject _objectAssign(JSObject target, JSObject source); class SplitioMock { // JS Browser SDK API mock - final JS_BrowserSDKPackage splitio = JSObject() as JS_BrowserSDKPackage; + final JSBrowserSDKPackage splitio = JSObject() as JSBrowserSDKPackage; // Test utils final List<({String methodName, List methodArguments})> calls = []; - final JS_IBrowserSDK mockFactory = JSObject() as JS_IBrowserSDK; + final JSIBrowserSDK mockFactory = JSObject() as JSIBrowserSDK; final _mockEvents = { 'SDK_READY': 'init::ready', 'SDK_READY_FROM_CACHE': 'init::cache-ready', 'SDK_READY_TIMED_OUT': 'init::timeout', 'SDK_UPDATE': 'state::update' - }.jsify() as JS_EventConsts; - final _mockClients = {}; + }.jsify() as JSEventConsts; + final _mockClients = {}; - JS_Configuration? _config; + JSConfiguration? _config; JSString _userConsent = 'UNKNOWN'.toJS; JSObject _createSplitViewJSObject(JSString splitName) { @@ -60,7 +60,7 @@ class SplitioMock { } SplitioMock() { - final mockManager = JSObject() as JS_IManager; + final mockManager = JSObject() as JSIManager; reflectSet( mockManager, 'split'.toJS, @@ -90,7 +90,7 @@ class SplitioMock { return ['split1'.toJS, 'split2'.toJS].jsify(); }.toJS); - final mockLog = JSObject() as JS_ILogger; + final mockLog = JSObject() as JSILogger; reflectSet( mockLog, 'warn'.toJS, @@ -98,7 +98,7 @@ class SplitioMock { calls.add((methodName: 'warn', methodArguments: [arg1])); }.toJS); - final mockUserConsent = JSObject() as JS_IUserConsentAPI; + final mockUserConsent = JSObject() as JSIUserConsentAPI; reflectSet( mockUserConsent, 'setStatus'.toJS, @@ -139,11 +139,10 @@ class SplitioMock { reflectSet( splitio, 'SplitFactory'.toJS, - (JS_Configuration config) { + (JSConfiguration config) { calls.add((methodName: 'SplitFactory', methodArguments: [config])); - final mockSettings = - _objectAssign(JSObject(), config) as JS_ISettings; + final mockSettings = _objectAssign(JSObject(), config) as JSISettings; mockSettings.log = mockLog; mockFactory.settings = mockSettings; @@ -153,14 +152,14 @@ class SplitioMock { }.toJS); } - JS_IBrowserClient _buildMockClient() { - final JS_ReadinessStatus _readinessStatus = { + JSIBrowserClient _buildMockClient() { + final JSReadinessStatus _readinessStatus = { 'isReady': false, 'isReadyFromCache': false, 'hasTimedout': false, - }.jsify() as JS_ReadinessStatus; + }.jsify() as JSReadinessStatus; final Map> _eventListeners = {}; - final mockClient = JSObject() as JS_IBrowserClient; + final mockClient = JSObject() as JSIBrowserClient; mockClient.Event = _mockEvents; reflectSet( @@ -168,7 +167,7 @@ class SplitioMock { 'on'.toJS, (JSString event, JSFunction listener) { calls.add((methodName: 'on', methodArguments: [event, listener])); - _eventListeners[event] ??= Set(); + _eventListeners[event] ??= {}; _eventListeners[event]!.add(listener); }.toJS); reflectSet( @@ -176,7 +175,7 @@ class SplitioMock { 'off'.toJS, (JSString event, JSFunction listener) { calls.add((methodName: 'off', methodArguments: [event, listener])); - _eventListeners[event] ??= Set(); + _eventListeners[event] ??= {}; _eventListeners[event]!.remove(listener); }.toJS); reflectSet( @@ -238,7 +237,7 @@ class SplitioMock { methodName: 'getTreatmentWithConfig', methodArguments: [flagName, attributes, evaluationOptions] )); - final result = JSObject() as JS_TreatmentWithConfig; + final result = JSObject() as JSTreatmentWithConfig; result.treatment = 'on'.toJS; result.config = 'some-config'.toJS; return result; @@ -254,7 +253,7 @@ class SplitioMock { if (flagNames is JSArray) { return flagNames.toDart.fold(JSObject(), (previousValue, flagName) { if (flagName is JSString) { - final result = JSObject() as JS_TreatmentWithConfig; + final result = JSObject() as JSTreatmentWithConfig; result.treatment = 'on'.toJS; result.config = 'some-config'.toJS; reflectSet(previousValue, flagName, result); @@ -299,7 +298,7 @@ class SplitioMock { methodArguments: [flagSetName, attributes, evaluationOptions] )); - final treatmentWithConfig = JSObject() as JS_TreatmentWithConfig; + final treatmentWithConfig = JSObject() as JSTreatmentWithConfig; treatmentWithConfig.treatment = 'on'.toJS; treatmentWithConfig.config = 'some-config'.toJS; @@ -317,7 +316,7 @@ class SplitioMock { methodArguments: [flagSetNames, attributes, evaluationOptions] )); - final treatmentWithConfig = JSObject() as JS_TreatmentWithConfig; + final treatmentWithConfig = JSObject() as JSTreatmentWithConfig; treatmentWithConfig.treatment = 'on'.toJS; treatmentWithConfig.config = 'some-config'.toJS; @@ -443,7 +442,7 @@ class SplitioMock { reflectSet( splitio, 'InLocalStorage'.toJS, - (JS_ConfigurationStorage storageConfig) { + (JSConfigurationStorage storageConfig) { calls.add( (methodName: 'InLocalStorage', methodArguments: [storageConfig])); return JSObject();