Skip to content

Commit 5b026ab

Browse files
authored
Add generics to JSArrays and JSPromises (#153)
Handle generic Promises and Arrays Adds a "typeParameter" field to _RawType that keeps track of the generic type for union and emission purposes. Also handles typedefs so that the generic type is always a valid interop type and not a Dart primitive type, which we alias typedefs to.
1 parent 2d965b4 commit 5b026ab

File tree

133 files changed

+1647
-1459
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

133 files changed

+1647
-1459
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
- Contribute a markdown file for the renamed classes from `dart:html` to
77
`package:web` (see [renames.md](tool/renames.md)).
88
- Migrate classes to use interop extension types that implement `JSObject`.
9+
- Add generics to APIs that use `JSArray` and `JSPromise`. Typedefs of a Dart
10+
primitive type are instead replaced with their JS type equivalent if they
11+
appear as a type parameter in order to conform with the type bounds of
12+
`JSArray` and `JSPromise`.
913

1014
## 0.4.2
1115

lib/src/dom/anchors.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import 'dart:js_interop';
99
import 'webxr.dart';
1010

1111
extension type XRAnchor._(JSObject _) implements JSObject {
12-
external JSPromise requestPersistentHandle();
12+
external JSPromise<JSString> requestPersistentHandle();
1313
external void delete();
1414
external XRSpace get anchorSpace;
1515
}

lib/src/dom/background_fetch.dart

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,28 @@ import 'dart:js_interop';
99
import 'dom.dart';
1010
import 'fetch.dart';
1111
import 'html.dart';
12+
import 'image_resource.dart';
1213
import 'service_workers.dart';
1314

1415
typedef BackgroundFetchResult = String;
1516
typedef BackgroundFetchFailureReason = String;
1617
extension type BackgroundFetchManager._(JSObject _) implements JSObject {
17-
external JSPromise fetch(
18+
external JSPromise<BackgroundFetchRegistration> fetch(
1819
String id,
1920
JSAny requests, [
2021
BackgroundFetchOptions options,
2122
]);
22-
external JSPromise get(String id);
23-
external JSPromise getIds();
23+
external JSPromise<BackgroundFetchRegistration?> get(String id);
24+
external JSPromise<JSArray<JSString>> getIds();
2425
}
2526
extension type BackgroundFetchUIOptions._(JSObject _) implements JSObject {
2627
external factory BackgroundFetchUIOptions({
27-
JSArray icons,
28+
JSArray<ImageResource> icons,
2829
String title,
2930
});
3031

31-
external set icons(JSArray value);
32-
external JSArray get icons;
32+
external set icons(JSArray<ImageResource> value);
33+
external JSArray<ImageResource> get icons;
3334
external set title(String value);
3435
external String get title;
3536
}
@@ -42,12 +43,12 @@ extension type BackgroundFetchOptions._(JSObject _)
4243
}
4344
extension type BackgroundFetchRegistration._(JSObject _)
4445
implements EventTarget, JSObject {
45-
external JSPromise abort();
46-
external JSPromise match(
46+
external JSPromise<JSBoolean> abort();
47+
external JSPromise<BackgroundFetchRecord> match(
4748
RequestInfo request, [
4849
CacheQueryOptions options,
4950
]);
50-
external JSPromise matchAll([
51+
external JSPromise<JSArray<BackgroundFetchRecord>> matchAll([
5152
RequestInfo request,
5253
CacheQueryOptions options,
5354
]);
@@ -64,7 +65,7 @@ extension type BackgroundFetchRegistration._(JSObject _)
6465
}
6566
extension type BackgroundFetchRecord._(JSObject _) implements JSObject {
6667
external Request get request;
67-
external JSPromise get responseReady;
68+
external JSPromise<Response> get responseReady;
6869
}
6970
extension type BackgroundFetchEvent._(JSObject _)
7071
implements ExtendableEvent, JSObject {
@@ -90,5 +91,5 @@ extension type BackgroundFetchUpdateUIEvent._(JSObject _)
9091
BackgroundFetchEventInit init,
9192
);
9293

93-
external JSPromise updateUI([BackgroundFetchUIOptions options]);
94+
external JSPromise<JSAny?> updateUI([BackgroundFetchUIOptions options]);
9495
}

lib/src/dom/background_sync.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import 'dart:js_interop';
99
import 'service_workers.dart';
1010

1111
extension type SyncManager._(JSObject _) implements JSObject {
12-
external JSPromise register(String tag);
13-
external JSPromise getTags();
12+
external JSPromise<JSAny?> register(String tag);
13+
external JSPromise<JSArray<JSString>> getTags();
1414
}
1515
extension type SyncEvent._(JSObject _) implements ExtendableEvent, JSObject {
1616
external factory SyncEvent(

lib/src/dom/capture_handle_identity.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ extension type CaptureHandleConfig._(JSObject _) implements JSObject {
1010
external factory CaptureHandleConfig({
1111
bool exposeOrigin,
1212
String handle,
13-
JSArray permittedOrigins,
13+
JSArray<JSString> permittedOrigins,
1414
});
1515

1616
external set exposeOrigin(bool value);
1717
external bool get exposeOrigin;
1818
external set handle(String value);
1919
external String get handle;
20-
external set permittedOrigins(JSArray value);
21-
external JSArray get permittedOrigins;
20+
external set permittedOrigins(JSArray<JSString> value);
21+
external JSArray<JSString> get permittedOrigins;
2222
}
2323
extension type CaptureHandle._(JSObject _) implements JSObject {
2424
external factory CaptureHandle({

lib/src/dom/clipboard_apis.dart

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
import 'dart:js_interop';
88

99
import 'dom.dart';
10+
import 'fileapi.dart';
1011
import 'html.dart';
1112
import 'permissions.dart';
1213

13-
typedef ClipboardItemData = JSPromise;
14-
typedef ClipboardItems = JSArray;
14+
typedef ClipboardItemData = JSPromise<JSAny>;
15+
typedef ClipboardItems = JSArray<ClipboardItem>;
1516
typedef PresentationStyle = String;
1617
extension type ClipboardEventInit._(JSObject _) implements EventInit, JSObject {
1718
external factory ClipboardEventInit({DataTransfer? clipboardData});
@@ -34,9 +35,9 @@ extension type ClipboardItem._(JSObject _) implements JSObject {
3435
]);
3536

3637
external static bool supports(String type);
37-
external JSPromise getType(String type);
38+
external JSPromise<Blob> getType(String type);
3839
external PresentationStyle get presentationStyle;
39-
external JSArray get types;
40+
external JSArray<JSString> get types;
4041
}
4142
extension type ClipboardItemOptions._(JSObject _) implements JSObject {
4243
external factory ClipboardItemOptions({PresentationStyle presentationStyle});
@@ -45,10 +46,10 @@ extension type ClipboardItemOptions._(JSObject _) implements JSObject {
4546
external PresentationStyle get presentationStyle;
4647
}
4748
extension type Clipboard._(JSObject _) implements EventTarget, JSObject {
48-
external JSPromise read();
49-
external JSPromise readText();
50-
external JSPromise write(ClipboardItems data);
51-
external JSPromise writeText(String data);
49+
external JSPromise<ClipboardItems> read();
50+
external JSPromise<JSString> readText();
51+
external JSPromise<JSAny?> write(ClipboardItems data);
52+
external JSPromise<JSAny?> writeText(String data);
5253
}
5354
extension type ClipboardPermissionDescriptor._(JSObject _)
5455
implements PermissionDescriptor, JSObject {

lib/src/dom/compute_pressure.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ extension type PressureObserver._(JSObject _) implements JSObject {
1717
PressureObserverOptions options,
1818
]);
1919

20-
external static JSArray get supportedSources;
21-
external JSPromise observe(PressureSource source);
20+
external static JSArray<JSString> get supportedSources;
21+
external JSPromise<JSAny?> observe(PressureSource source);
2222
external void unobserve(PressureSource source);
2323
external void disconnect();
24-
external JSArray takeRecords();
24+
external JSArray<PressureRecord> takeRecords();
2525
}
2626
extension type PressureRecord._(JSObject _) implements JSObject {
2727
external JSObject toJSON();

lib/src/dom/console.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ extension type $Console._(JSObject _) implements JSObject {
2222
external void log(JSAny? data);
2323
external void table([
2424
JSAny? tabularData,
25-
JSArray properties,
25+
JSArray<JSString> properties,
2626
]);
2727
external void trace(JSAny? data);
2828
external void warn(JSAny? data);

lib/src/dom/contact_picker.dart

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import 'dart:js_interop';
88

9+
import 'fileapi.dart';
10+
911
typedef ContactProperty = String;
1012
extension type ContactAddress._(JSObject _) implements JSObject {
1113
external JSObject toJSON();
@@ -18,27 +20,27 @@ extension type ContactAddress._(JSObject _) implements JSObject {
1820
external String get recipient;
1921
external String get region;
2022
external String get sortingCode;
21-
external JSArray get addressLine;
23+
external JSArray<JSString> get addressLine;
2224
}
2325
extension type ContactInfo._(JSObject _) implements JSObject {
2426
external factory ContactInfo({
25-
JSArray address,
26-
JSArray email,
27-
JSArray icon,
28-
JSArray name,
29-
JSArray tel,
27+
JSArray<ContactAddress> address,
28+
JSArray<JSString> email,
29+
JSArray<Blob> icon,
30+
JSArray<JSString> name,
31+
JSArray<JSString> tel,
3032
});
3133

32-
external set address(JSArray value);
33-
external JSArray get address;
34-
external set email(JSArray value);
35-
external JSArray get email;
36-
external set icon(JSArray value);
37-
external JSArray get icon;
38-
external set name(JSArray value);
39-
external JSArray get name;
40-
external set tel(JSArray value);
41-
external JSArray get tel;
34+
external set address(JSArray<ContactAddress> value);
35+
external JSArray<ContactAddress> get address;
36+
external set email(JSArray<JSString> value);
37+
external JSArray<JSString> get email;
38+
external set icon(JSArray<Blob> value);
39+
external JSArray<Blob> get icon;
40+
external set name(JSArray<JSString> value);
41+
external JSArray<JSString> get name;
42+
external set tel(JSArray<JSString> value);
43+
external JSArray<JSString> get tel;
4244
}
4345
extension type ContactsSelectOptions._(JSObject _) implements JSObject {
4446
external factory ContactsSelectOptions({bool multiple});
@@ -47,9 +49,9 @@ extension type ContactsSelectOptions._(JSObject _) implements JSObject {
4749
external bool get multiple;
4850
}
4951
extension type ContactsManager._(JSObject _) implements JSObject {
50-
external JSPromise getProperties();
51-
external JSPromise select(
52-
JSArray properties, [
52+
external JSPromise<JSArray<JSString>> getProperties();
53+
external JSPromise<JSArray<ContactInfo>> select(
54+
JSArray<JSString> properties, [
5355
ContactsSelectOptions options,
5456
]);
5557
}

lib/src/dom/content_index.dart

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import 'dart:js_interop';
88

9+
import 'image_resource.dart';
910
import 'service_workers.dart';
1011

1112
typedef ContentCategory = String;
@@ -15,7 +16,7 @@ extension type ContentDescription._(JSObject _) implements JSObject {
1516
required String title,
1617
required String description,
1718
ContentCategory category,
18-
JSArray icons,
19+
JSArray<ImageResource> icons,
1920
required String url,
2021
});
2122

@@ -27,15 +28,15 @@ extension type ContentDescription._(JSObject _) implements JSObject {
2728
external String get description;
2829
external set category(ContentCategory value);
2930
external ContentCategory get category;
30-
external set icons(JSArray value);
31-
external JSArray get icons;
31+
external set icons(JSArray<ImageResource> value);
32+
external JSArray<ImageResource> get icons;
3233
external set url(String value);
3334
external String get url;
3435
}
3536
extension type ContentIndex._(JSObject _) implements JSObject {
36-
external JSPromise add(ContentDescription description);
37-
external JSPromise delete(String id);
38-
external JSPromise getAll();
37+
external JSPromise<JSAny?> add(ContentDescription description);
38+
external JSPromise<JSAny?> delete(String id);
39+
external JSPromise<JSArray<ContentDescription>> getAll();
3940
}
4041
extension type ContentIndexEventInit._(JSObject _)
4142
implements ExtendableEventInit, JSObject {

lib/src/dom/cookie_store.dart

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@ import 'hr_time.dart';
1111
import 'html.dart';
1212
import 'service_workers.dart';
1313

14-
typedef CookieList = JSArray;
14+
typedef CookieList = JSArray<CookieListItem>;
1515
typedef CookieSameSite = String;
1616
extension type CookieStore._(JSObject _) implements EventTarget, JSObject {
17-
external JSPromise get([JSAny nameOrOptions]);
18-
external JSPromise getAll([JSAny nameOrOptions]);
19-
external JSPromise set(
17+
external JSPromise<CookieListItem?> get([JSAny nameOrOptions]);
18+
external JSPromise<CookieList> getAll([JSAny nameOrOptions]);
19+
external JSPromise<JSAny?> set(
2020
JSAny nameOrOptions, [
2121
String value,
2222
]);
23-
external JSPromise delete(JSAny nameOrOptions);
23+
external JSPromise<JSAny?> delete(JSAny nameOrOptions);
2424
external set onchange(EventHandler value);
2525
external EventHandler get onchange;
2626
}
@@ -108,18 +108,20 @@ extension type CookieListItem._(JSObject _) implements JSObject {
108108
external bool get partitioned;
109109
}
110110
extension type CookieStoreManager._(JSObject _) implements JSObject {
111-
external JSPromise subscribe(JSArray subscriptions);
112-
external JSPromise getSubscriptions();
113-
external JSPromise unsubscribe(JSArray subscriptions);
111+
external JSPromise<JSAny?> subscribe(
112+
JSArray<CookieStoreGetOptions> subscriptions);
113+
external JSPromise<JSArray<CookieStoreGetOptions>> getSubscriptions();
114+
external JSPromise<JSAny?> unsubscribe(
115+
JSArray<CookieStoreGetOptions> subscriptions);
114116
}
115117
extension type CookieChangeEvent._(JSObject _) implements Event, JSObject {
116118
external factory CookieChangeEvent(
117119
String type, [
118120
CookieChangeEventInit eventInitDict,
119121
]);
120122

121-
external JSArray get changed;
122-
external JSArray get deleted;
123+
external JSArray<CookieListItem> get changed;
124+
external JSArray<CookieListItem> get deleted;
123125
}
124126
extension type CookieChangeEventInit._(JSObject _)
125127
implements EventInit, JSObject {
@@ -140,8 +142,8 @@ extension type ExtendableCookieChangeEvent._(JSObject _)
140142
ExtendableCookieChangeEventInit eventInitDict,
141143
]);
142144

143-
external JSArray get changed;
144-
external JSArray get deleted;
145+
external JSArray<CookieListItem> get changed;
146+
external JSArray<CookieListItem> get deleted;
145147
}
146148
extension type ExtendableCookieChangeEventInit._(JSObject _)
147149
implements ExtendableEventInit, JSObject {

lib/src/dom/credential_management.dart

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ import 'webauthn.dart';
1414
typedef PasswordCredentialInit = JSObject;
1515
typedef CredentialMediationRequirement = String;
1616
extension type Credential._(JSObject _) implements JSObject {
17-
external static JSPromise isConditionalMediationAvailable();
17+
external static JSPromise<JSBoolean> isConditionalMediationAvailable();
1818
external String get id;
1919
external String get type;
2020
}
2121
extension type CredentialsContainer._(JSObject _) implements JSObject {
22-
external JSPromise get([CredentialRequestOptions options]);
23-
external JSPromise store(Credential credential);
24-
external JSPromise create([CredentialCreationOptions options]);
25-
external JSPromise preventSilentAccess();
22+
external JSPromise<Credential?> get([CredentialRequestOptions options]);
23+
external JSPromise<JSAny?> store(Credential credential);
24+
external JSPromise<Credential?> create([CredentialCreationOptions options]);
25+
external JSPromise<JSAny?> preventSilentAccess();
2626
}
2727
extension type CredentialData._(JSObject _) implements JSObject {
2828
external factory CredentialData({required String id});
@@ -111,14 +111,14 @@ extension type FederatedCredential._(JSObject _)
111111
extension type FederatedCredentialRequestOptions._(JSObject _)
112112
implements JSObject {
113113
external factory FederatedCredentialRequestOptions({
114-
JSArray providers,
115-
JSArray protocols,
114+
JSArray<JSString> providers,
115+
JSArray<JSString> protocols,
116116
});
117117

118-
external set providers(JSArray value);
119-
external JSArray get providers;
120-
external set protocols(JSArray value);
121-
external JSArray get protocols;
118+
external set providers(JSArray<JSString> value);
119+
external JSArray<JSString> get providers;
120+
external set protocols(JSArray<JSString> value);
121+
external JSArray<JSString> get protocols;
122122
}
123123
extension type FederatedCredentialInit._(JSObject _)
124124
implements CredentialData, JSObject {

lib/src/dom/css_animation_worklet.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,5 @@ extension type WorkletAnimation._(JSObject _) implements Animation, JSObject {
3434
external String get animatorName;
3535
}
3636
extension type WorkletGroupEffect._(JSObject _) implements JSObject {
37-
external JSArray getChildren();
37+
external JSArray<WorkletAnimationEffect> getChildren();
3838
}

0 commit comments

Comments
 (0)