Fix translatability of modules using event-target-shim (#45646)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45646

As titled. This is adapted from https://github.com/facebook/react-native/pull/45056.

Changelog: [Internal]

Reviewed By: GijsWeterings

Differential Revision: D60173075

fbshipit-source-id: 9ce1c96d333b7e6b84d9b7650bc4179ebf86d267
This commit is contained in:
Alex Hunt
2024-07-24 14:46:39 -07:00
committed by Facebook GitHub Bot
parent 7aff1b9bd8
commit 5cf72ca046
5 changed files with 228 additions and 12 deletions
+1 -1
View File
@@ -34,7 +34,7 @@ const EMPTY = 0;
const LOADING = 1;
const DONE = 2;
class FileReader extends (EventTarget(...READER_EVENTS): any) {
class FileReader extends (EventTarget(...READER_EVENTS): typeof EventTarget) {
static EMPTY: number = EMPTY;
static LOADING: number = LOADING;
static DONE: number = DONE;
+4 -2
View File
@@ -78,7 +78,9 @@ const REQUEST_EVENTS = [
const XHR_EVENTS = REQUEST_EVENTS.concat('readystatechange');
class XMLHttpRequestEventTarget extends (EventTarget(...REQUEST_EVENTS): any) {
class XMLHttpRequestEventTarget extends (EventTarget(
...REQUEST_EVENTS,
): typeof EventTarget) {
onload: ?Function;
onloadstart: ?Function;
onprogress: ?Function;
@@ -91,7 +93,7 @@ class XMLHttpRequestEventTarget extends (EventTarget(...REQUEST_EVENTS): any) {
/**
* Shared base for platform-specific XMLHttpRequest implementations.
*/
class XMLHttpRequest extends (EventTarget(...XHR_EVENTS): any) {
class XMLHttpRequest extends (EventTarget(...XHR_EVENTS): typeof EventTarget) {
static UNSENT: number = UNSENT;
static OPENED: number = OPENED;
static HEADERS_RECEIVED: number = HEADERS_RECEIVED;
+1 -1
View File
@@ -68,7 +68,7 @@ type WebSocketEventDefinitions = {
* See https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
* See https://github.com/websockets/ws
*/
class WebSocket extends (EventTarget(...WEBSOCKET_EVENTS): any) {
class WebSocket extends (EventTarget(...WEBSOCKET_EVENTS): typeof EventTarget) {
static CONNECTING: number = CONNECTING;
static OPEN: number = OPEN;
static CLOSING: number = CLOSING;
@@ -1476,6 +1476,35 @@ declare module.exports: File;
"
`;
exports[`public API should not change unintentionally Libraries/Blob/FileReader.js 1`] = `
"type ReadyState = 0 | 1 | 2;
type ReaderResult = string | ArrayBuffer;
declare class FileReader extends EventTarget {
static EMPTY: number;
static LOADING: number;
static DONE: number;
EMPTY: number;
LOADING: number;
DONE: number;
_readyState: ReadyState;
_error: ?Error;
_result: ?ReaderResult;
_aborted: boolean;
constructor(): void;
_reset(): void;
_setReadyState(newState: ReadyState): void;
readAsArrayBuffer(blob: ?Blob): void;
readAsDataURL(blob: ?Blob): void;
readAsText(blob: ?Blob, encoding: string): void;
abort(): void;
get readyState(): ReadyState;
get error(): ?Error;
get result(): ?ReaderResult;
}
declare module.exports: FileReader;
"
`;
exports[`public API should not change unintentionally Libraries/Blob/NativeBlobModule.js 1`] = `
"export * from \\"../../src/private/specs/modules/NativeBlobModule\\";
declare export default typeof NativeBlobModule;
@@ -6966,6 +6995,130 @@ declare export default typeof RCTNetworking;
exports[`public API should not change unintentionally Libraries/Network/XHRInterceptor.js 1`] = `"UNTYPED MODULE"`;
exports[`public API should not change unintentionally Libraries/Network/XMLHttpRequest.js 1`] = `
"export type NativeResponseType = \\"base64\\" | \\"blob\\" | \\"text\\";
export type ResponseType =
| \\"\\"
| \\"arraybuffer\\"
| \\"blob\\"
| \\"document\\"
| \\"json\\"
| \\"text\\";
export type Response = ?Object | string;
type XHRInterceptor = interface {
requestSent(id: number, url: string, method: string, headers: Object): void,
responseReceived(
id: number,
url: string,
status: number,
headers: Object
): void,
dataReceived(id: number, data: string): void,
loadingFinished(id: number, encodedDataLength: number): void,
loadingFailed(id: number, error: string): void,
};
declare class XMLHttpRequestEventTarget extends EventTarget {
onload: ?Function;
onloadstart: ?Function;
onprogress: ?Function;
ontimeout: ?Function;
onerror: ?Function;
onabort: ?Function;
onloadend: ?Function;
}
declare class XMLHttpRequest extends EventTarget {
static UNSENT: number;
static OPENED: number;
static HEADERS_RECEIVED: number;
static LOADING: number;
static DONE: number;
static _interceptor: ?XHRInterceptor;
UNSENT: number;
OPENED: number;
HEADERS_RECEIVED: number;
LOADING: number;
DONE: number;
onload: ?Function;
onloadstart: ?Function;
onprogress: ?Function;
ontimeout: ?Function;
onerror: ?Function;
onabort: ?Function;
onloadend: ?Function;
onreadystatechange: ?Function;
readyState: number;
responseHeaders: ?Object;
status: number;
timeout: number;
responseURL: ?string;
withCredentials: boolean;
upload: XMLHttpRequestEventTarget;
_requestId: ?number;
_subscriptions: Array<EventSubscription>;
_aborted: boolean;
_cachedResponse: Response;
_hasError: boolean;
_headers: Object;
_lowerCaseResponseHeaders: Object;
_method: ?string;
_perfKey: ?string;
_responseType: ResponseType;
_response: string;
_sent: boolean;
_url: ?string;
_timedOut: boolean;
_trackingName: string;
_incrementalEvents: boolean;
_performanceLogger: IPerformanceLogger;
static setInterceptor(interceptor: ?XHRInterceptor): void;
constructor(): void;
_reset(): void;
get responseType(): ResponseType;
set responseType(responseType: ResponseType): void;
get responseText(): string;
get response(): Response;
__didCreateRequest(requestId: number): void;
__didUploadProgress(requestId: number, progress: number, total: number): void;
__didReceiveResponse(
requestId: number,
status: number,
responseHeaders: ?Object,
responseURL: ?string
): void;
__didReceiveData(requestId: number, response: string): void;
__didReceiveIncrementalData(
requestId: number,
responseText: string,
progress: number,
total: number
): void;
__didReceiveDataProgress(
requestId: number,
loaded: number,
total: number
): void;
__didCompleteResponse(
requestId: number,
error: string,
timeOutError: boolean
): void;
_clearSubscriptions(): void;
getAllResponseHeaders(): ?string;
getResponseHeader(header: string): ?string;
setRequestHeader(header: string, value: any): void;
setTrackingName(trackingName: string): XMLHttpRequest;
setPerformanceLogger(performanceLogger: IPerformanceLogger): XMLHttpRequest;
open(method: string, url: string, async: ?boolean): void;
send(data: any): void;
abort(): void;
setResponseHeaders(responseHeaders: ?Object): void;
setReadyState(newState: number): void;
addEventListener(type: string, listener: EventListener): void;
}
declare module.exports: XMLHttpRequest;
"
`;
exports[`public API should not change unintentionally Libraries/Network/convertRequestBody.js 1`] = `
"export type RequestBody =
| string
@@ -9994,6 +10147,69 @@ declare export default typeof NativeWebSocketModule;
"
`;
exports[`public API should not change unintentionally Libraries/WebSocket/WebSocket.js 1`] = `
"type ArrayBufferView =
| Int8Array
| Uint8Array
| Uint8ClampedArray
| Int16Array
| Uint16Array
| Int32Array
| Uint32Array
| Float32Array
| Float64Array
| DataView;
type BinaryType = \\"blob\\" | \\"arraybuffer\\";
type WebSocketEventDefinitions = {
websocketOpen: [{ id: number, protocol: string }],
websocketClosed: [{ id: number, code: number, reason: string }],
websocketMessage: [
| { type: \\"binary\\", id: number, data: string }
| { type: \\"text\\", id: number, data: string }
| { type: \\"blob\\", id: number, data: BlobData },
],
websocketFailed: [{ id: number, message: string }],
};
declare class WebSocket extends EventTarget {
static CONNECTING: number;
static OPEN: number;
static CLOSING: number;
static CLOSED: number;
CONNECTING: number;
OPEN: number;
CLOSING: number;
CLOSED: number;
_socketId: number;
_eventEmitter: NativeEventEmitter<WebSocketEventDefinitions>;
_subscriptions: Array<EventSubscription>;
_binaryType: ?BinaryType;
onclose: ?Function;
onerror: ?Function;
onmessage: ?Function;
onopen: ?Function;
bufferedAmount: number;
extension: ?string;
protocol: ?string;
readyState: number;
url: ?string;
constructor(
url: string,
protocols: ?string | ?Array<string>,
options: ?{ headers?: { origin?: string, ... }, ... }
): void;
get binaryType(): ?BinaryType;
set binaryType(binaryType: BinaryType): void;
close(code?: number, reason?: string): void;
send(data: string | ArrayBuffer | ArrayBufferView | Blob): void;
ping(): void;
_close(code?: number, reason?: string): void;
_unregisterEvents(): void;
_registerEvents(): void;
}
declare module.exports: WebSocket;
"
`;
exports[`public API should not change unintentionally Libraries/WebSocket/WebSocketEvent.js 1`] = `"UNTYPED MODULE"`;
exports[`public API should not change unintentionally Libraries/WebSocket/WebSocketInterceptor.js 1`] = `"UNTYPED MODULE"`;
@@ -29,10 +29,6 @@ const IGNORE_PATTERNS = [
// Exclude list for files that fail to parse under flow-api-translator. Please
// review your changes before adding new entries.
const FILES_WITH_KNOWN_ERRORS = new Set([
'Libraries/Blob/FileReader.js',
'Libraries/Network/XMLHttpRequest.js',
'Libraries/WebSocket/WebSocket.js',
// Parse errors introduced in hermes-parser 0.23.0: Error: Comment location overlaps with node location
'Libraries/Core/checkNativeVersion.js',
'Libraries/Core/InitializeCore.js',
@@ -84,13 +80,15 @@ describe('public API', () => {
success = true;
} catch (e) {
if (!FILES_WITH_KNOWN_ERRORS.has(file)) {
console.error('Unable to parse file:', file, '\n' + e);
throw new Error(
'Unable to parse file: ' + file + '\n\n' + e.message,
);
}
} finally {
if (success && FILES_WITH_KNOWN_ERRORS.has(file)) {
console.error(
'Expected parse error, please remove file exclude from FILES_WITH_KNOWN_ERRORS:',
file,
throw new Error(
'Expected parse error, please remove file exclude from FILES_WITH_KNOWN_ERRORS: ' +
file,
);
}
}