Skip to content

Chore(): Migrate to js_interop #6162

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jun 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions actions/lib/src/node/actions/exec.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@

import 'dart:convert';
import 'dart:js_interop';
//ignore: deprecated_member_use
import 'dart:js_util';

@JS()
external Exec get exec;
Expand Down Expand Up @@ -46,9 +44,14 @@ extension type Exec._(JSObject it) {
ignoreReturnCode: !failOnNonZeroExit,
);
try {
final exitCode = await promiseToFuture<int>(
_exec(commandLine, args.map((arg) => arg.toJS).toList().toJS, options),
);
final jsExitCode =
await _exec(
commandLine,
args.map((arg) => arg.toJS).toList().toJS,
options,
).toDart;

final exitCode = (jsExitCode as JSNumber).toDartInt;
return ExecResult(
exitCode: exitCode,
stdout: stdout.toString(),
Expand Down
8 changes: 7 additions & 1 deletion actions/lib/src/node/actions/http_request.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

import 'dart:js_interop';

import 'package:web/web.dart';

@JS()
extension type HttpClient._(JSObject it) {
external HttpClient([
Expand All @@ -18,7 +20,11 @@ extension type HttpClient._(JSObject it) {
String requestUrl, {
Map<String, String> headers = const {},
}) async {
final jsHeaders = headers.jsify() as JSObject;
final jsHeaders = Headers();
for(final entry in headers.entries) {
jsHeaders.append(entry.key, entry.value);
}

final response = await _getJson(requestUrl, jsHeaders).toDart;
final result = response as TypedResponse<JSObject>;
if (result.statusCode != 200) {
Expand Down
1 change: 1 addition & 0 deletions actions/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ dependencies:
source_maps: ^0.10.12
stack_trace: ^1.10.0
stream_transform: ^2.1.0
web: ^1.1.1

dev_dependencies:
amplify_lints: ^3.0.0
Expand Down
2 changes: 1 addition & 1 deletion packages/amplify_core/lib/src/platform/platform.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@

export 'platform_stub.dart'
if (dart.library.io) 'platform_io.dart'
if (dart.library.html) 'platform_html.dart';
if (dart.library.js_interop) 'platform_html.dart';
3 changes: 1 addition & 2 deletions packages/amplify_core/lib/src/platform/platform_html.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

//ignore: deprecated_member_use
import 'dart:html';
import 'package:web/web.dart';

final RegExp _edgeRegex = RegExp(r'Edg/[\d\.]+');
final RegExp _operaRegex = RegExp(r'OPR/[\d\.]+');
Expand Down
1 change: 1 addition & 0 deletions packages/amplify_core/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ dependencies:
retry: ^3.1.0
stack_trace: ^1.10.0
uuid: ">=3.0.6 <5.0.0"
web: ^1.1.1

dev_dependencies:
amplify_lints: ">=3.1.2 <3.2.0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
// SPDX-License-Identifier: Apache-2.0

export 'device_info_provider_stub.dart'
if (dart.library.html) 'device_info_provider_html.dart'
if (dart.library.js_interop) 'device_info_provider_html.dart'
if (dart.library.io) 'device_info_provider_io.dart';
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
// SPDX-License-Identifier: Apache-2.0

export 'flutter_path_provider_stub.dart'
if (dart.library.html) 'flutter_path_provider_html.dart'
if (dart.library.js_interop) 'flutter_path_provider_html.dart'
if (dart.library.io) 'flutter_path_provider_io.dart';
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
// SPDX-License-Identifier: Apache-2.0

export 'dart_queued_item_store.stub.dart'
if (dart.library.html) 'dart_queued_item_store.web.dart'
if (dart.library.js_interop) 'dart_queued_item_store.web.dart'
if (dart.library.io) 'dart_queued_item_store.vm.dart';
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@
// SPDX-License-Identifier: Apache-2.0

import 'dart:async';
//ignore: deprecated_member_use
import 'dart:js_util';
import 'dart:js_interop';
import 'dart:js_interop_unsafe';

import 'package:amplify_analytics_pinpoint_dart/src/impl/analytics_client/event_client/queued_item_store/queued_item_store.dart';
import 'package:amplify_core/amplify_core.dart';
// ignore: implementation_imports
import 'package:aws_common/src/js/indexed_db.dart';
import 'package:collection/collection.dart';
import 'package:web/web.dart';

// TODO(kylechen): Consider merging/refactoring with existing 'amplify_secure_storage_web - _IndexedDBStorage' class
/// {@template amplify_analytics_pinpoint_dart.indexed_db_adapter}
Expand Down Expand Up @@ -39,36 +40,43 @@ class IndexedDbAdapter implements QueuedItemStore {
if (db == null) {
throw const InvalidStateException('IndexedDB is not available');
}
void onUpgradeNeeded(IDBVersionChangeEvent event) {
final database = event.target?.getProperty<IDBDatabase>('result'.toJS);
final objectStoreNames = database?.objectStoreNames;
if (!(objectStoreNames?.contains(storeName) ?? false)) {
database?.createObjectStore(
storeName,
IDBObjectStoreParameters(keyPath: 'id'.toJS, autoIncrement: true),
);
}
}

final openRequest = db.open(databaseName, 1)
..onupgradeneeded = (event) {
final database = event.target.result;
final objectStoreNames = database.objectStoreNames;
if (!objectStoreNames.contains(storeName)) {
database.createObjectStore(
storeName,
keyPath: 'id',
autoIncrement: true,
);
}
};
_database = await openRequest.future;
..onupgradeneeded = onUpgradeNeeded.toJS;

final result = await openRequest.future;
if (result.isA<IDBDatabase>()) {
result as IDBDatabase;
_database = result;
} else {
throw const InvalidStateException('IDBOpenDBRequest failed');
}
}

/// Returns a new [IDBObjectStore] instance after waiting for initialization
/// to complete.
IDBObjectStore _getObjectStore() {
final transaction = _database.transaction(
storeName,
mode: IDBTransactionMode.readwrite,
);
final transaction = _database.transaction(storeName.toJS, 'readwrite');
final store = transaction.objectStore(storeName);
return store;
}

@override
Future<void> addItem(String string) async {
await _databaseOpenEvent;
await _getObjectStore().push({'value': string}).future;
final item = JSObject()..setProperty('value'.toJS, string.toJS);

await _getObjectStore().add(item).future;
}

@override
Expand All @@ -77,14 +85,26 @@ class IndexedDbAdapter implements QueuedItemStore {

await _databaseOpenEvent;
final store = _getObjectStore();
final request = store.getAll(null, count);

late IDBRequest request;
if (count == null) {
request = store.getAll();
} else {
request = store.getAll(null, count);
}

await request.future;
final jsResult = request.result;
var result = <JSObject>[];
if (jsResult.isA<JSArray<JSObject>>()) {
jsResult as JSArray<JSObject>;
result = jsResult.toDart;
}

for (final elem in result) {
final id = elem.getProperty<JSNumber>('id'.toJS).toDartInt;
final string = elem.getProperty<JSString>('value'.toJS).toDart;

for (final elem in request.result) {
final value = elem as Object;
final id = getProperty<int>(value, 'id');
final string = getProperty<String>(value, 'value');
readValues.add(QueuedItem(id: id, value: string));
}
return readValues;
Expand All @@ -101,10 +121,8 @@ class IndexedDbAdapter implements QueuedItemStore {

final ranges = idsToDelete
.splitBetween((a, b) => b != a + 1)
.map((range) => IDBKeyRange.bound(range.first, range.last));
await Future.wait<void>(
ranges.map((range) => store.deleteByKeyRange(range).future),
);
.map((range) => IDBKeyRange.bound(range.first.toJS, range.last.toJS));
await Future.wait<void>(ranges.map((range) => store.delete(range).future));
}

/// Clear the database.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ dependencies:
smithy: ">=0.7.5 <0.8.0"
smithy_aws: ">=0.7.5 <0.8.0"
uuid: ">=3.0.6 <5.0.0"
web: ^1.1.1

dev_dependencies:
amplify_lints: ">=3.1.2 <3.2.0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import 'package:amplify_auth_cognito_dart/amplify_auth_cognito_dart.dart';
import 'package:amplify_auth_cognito_dart/src/credentials/legacy_credential_provider.dart';
// ignore: implementation_imports
import 'package:amplify_auth_cognito_dart/src/flows/hosted_ui/hosted_ui_platform_stub.dart'
if (dart.library.html) 'package:amplify_auth_cognito_dart/src/flows/hosted_ui/hosted_ui_platform_html.dart'
if (dart.library.js_interop) 'package:amplify_auth_cognito_dart/src/flows/hosted_ui/hosted_ui_platform_html.dart'
if (dart.library.ui) 'flows/hosted_ui/hosted_ui_platform_flutter.dart';
// ignore: implementation_imports
import 'package:amplify_auth_cognito_dart/src/model/hosted_ui/oauth_parameters.dart';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ dependencies:
example_common:
path: ../../../example_common
qr: ^3.0.1
web: ^1.1.1

dev_dependencies:
amplify_api_dart: any
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

//ignore: deprecated_member_use
import 'dart:html';

import 'package:amplify_auth_cognito_dart/amplify_auth_cognito_dart.dart';
import 'package:amplify_core/amplify_core.dart';
import 'package:cognito_example/common.dart';
import 'package:example_common/example_common.dart';
import 'package:web/web.dart';

import 'app_component.dart';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'dart:async';
import 'package:amplify_auth_cognito_dart/src/asf/asf_context_data.dart';
import 'package:amplify_auth_cognito_dart/src/asf/asf_device_info_collector.stub.dart'
if (dart.library.io) 'package:amplify_auth_cognito_dart/src/asf/asf_device_info_collector.vm.dart'
if (dart.library.js_util) 'package:amplify_auth_cognito_dart/src/asf/asf_device_info_collector.js.dart';
if (dart.library.js_interop) 'package:amplify_auth_cognito_dart/src/asf/asf_device_info_collector.js.dart';
import 'package:amplify_core/amplify_core.dart';
// ignore: implementation_imports
import 'package:amplify_core/src/platform/platform.dart';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

// TODO(dnys1): Migrate to `js_interop`.
library;

import 'dart:convert';
import 'dart:js_interop';

import 'package:amplify_auth_cognito_dart/src/asf/asf_device_info_collector.dart';
import 'package:amplify_auth_cognito_dart/src/asf/package_info.dart';
import 'package:async/async.dart';
import 'package:aws_common/aws_common.dart';
// ignore: implementation_imports
import 'package:aws_common/src/js/common.dart';
//ignore: deprecated_member_use
import 'package:js/js.dart';
import 'package:path/path.dart';
import 'package:web/web.dart';

/// {@template amplify_auth_cognito_dart.asf.asf_device_info_js}
/// The JS/Browser implementation of [NativeASFDeviceInfoCollector].
Expand Down Expand Up @@ -65,10 +62,10 @@ final class ASFDeviceInfoPlatform extends NativeASFDeviceInfoCollector {
window.navigator.userAgentData?.platform ?? window.navigator.platform;

@override
Future<int?> get screenHeightPixels async => window.screen.height?.toInt();
Future<int?> get screenHeightPixels async => window.screen.height;

@override
Future<int?> get screenWidthPixels async => window.screen.width?.toInt();
Future<int?> get screenWidthPixels async => window.screen.width;

@override
Future<String?> get thirdPartyDeviceId async => null;
Expand All @@ -81,34 +78,11 @@ String get _baseUrl {
return url.join(window.location.origin, basePath);
}

extension on Window {
external _Screen get screen;
external _Navigator get navigator;
}

@JS('Screen')
@staticInterop
class _Screen {}

extension on _Screen {
external double? get width;
external double? get height;
}

@JS('Navigator')
@staticInterop
class _Navigator {}

extension on _Navigator {
external String? get language;
external String? get platform;
extension _PropsNavigator on Navigator {
external _NavigatorUAData? get userAgentData;
}

@JS('NavigatorUAData')
@staticInterop
class _NavigatorUAData {}

extension on _NavigatorUAData {
extension type _NavigatorUAData._(JSObject _) implements JSObject {
external String? get platform;
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
// Generated by worker_bee_builder.

export 'asf_worker.worker.vm.dart'
if (dart.library.js) 'asf_worker.worker.js.dart';
if (dart.library.js_interop) 'asf_worker.worker.js.dart';
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import 'package:amplify_auth_cognito_dart/src/credentials/device_metadata_reposi
import 'package:amplify_auth_cognito_dart/src/flows/helpers.dart';
import 'package:amplify_auth_cognito_dart/src/flows/hosted_ui/hosted_ui_platform.dart';
import 'package:amplify_auth_cognito_dart/src/flows/hosted_ui/initial_parameters_stub.dart'
if (dart.library.html) 'package:amplify_auth_cognito_dart/src/flows/hosted_ui/initial_parameters_html.dart';
if (dart.library.js_interop) 'package:amplify_auth_cognito_dart/src/flows/hosted_ui/initial_parameters_html.dart';
import 'package:amplify_auth_cognito_dart/src/model/hosted_ui/oauth_parameters.dart';
import 'package:amplify_auth_cognito_dart/src/model/session/cognito_sign_in_details.dart';
import 'package:amplify_auth_cognito_dart/src/model/sign_in_parameters.dart';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
// Generated by worker_bee_builder.

export 'confirm_device_worker.worker.vm.dart'
if (dart.library.js) 'confirm_device_worker.worker.js.dart';
if (dart.library.js_interop) 'confirm_device_worker.worker.js.dart';
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import 'package:amplify_auth_cognito_dart/src/credentials/cognito_keys.dart';
import 'package:amplify_auth_cognito_dart/src/crypto/oauth.dart';
import 'package:amplify_auth_cognito_dart/src/flows/hosted_ui/hosted_ui_config.dart';
import 'package:amplify_auth_cognito_dart/src/flows/hosted_ui/hosted_ui_platform_stub.dart'
if (dart.library.html) 'package:amplify_auth_cognito_dart/src/flows/hosted_ui/hosted_ui_platform_html.dart'
if (dart.library.js_interop) 'package:amplify_auth_cognito_dart/src/flows/hosted_ui/hosted_ui_platform_html.dart'
if (dart.library.io) 'package:amplify_auth_cognito_dart/src/flows/hosted_ui/hosted_ui_platform_io.dart';
import 'package:amplify_auth_cognito_dart/src/model/hosted_ui/oauth_parameters.dart';
import 'package:amplify_auth_cognito_dart/src/state/state.dart';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@

import 'package:amplify_auth_cognito_dart/amplify_auth_cognito_dart.dart';
import 'package:amplify_auth_cognito_dart/src/flows/hosted_ui/hosted_ui_platform.dart';
// ignore: implementation_imports
import 'package:aws_common/src/js/common.dart';
import 'package:path/path.dart' show url;
import 'package:web/web.dart';

/// {@macro amplify_auth_cognito.hosted_ui_platform}
class HostedUiPlatformImpl extends HostedUiPlatform {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
// SPDX-License-Identifier: Apache-2.0

import 'package:amplify_auth_cognito_dart/src/model/hosted_ui/oauth_parameters.dart';
// ignore:implementation_imports
import 'package:aws_common/src/js/common.dart';
import 'package:web/web.dart';

/// {@macro amplify_auth_cognito.initial_parameters}
final OAuthParameters? initialParameters = OAuthParameters.fromUri(
Expand Down
Loading
Loading