diff --git a/packages/react-native/Libraries/Blob/FileReader.js b/packages/react-native/Libraries/Blob/FileReader.js index f8154bd2373..d68989018f1 100644 --- a/packages/react-native/Libraries/Blob/FileReader.js +++ b/packages/react-native/Libraries/Blob/FileReader.js @@ -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; diff --git a/packages/react-native/Libraries/Network/XMLHttpRequest.js b/packages/react-native/Libraries/Network/XMLHttpRequest.js index 2664f8ab890..458f0780a0f 100644 --- a/packages/react-native/Libraries/Network/XMLHttpRequest.js +++ b/packages/react-native/Libraries/Network/XMLHttpRequest.js @@ -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; diff --git a/packages/react-native/Libraries/WebSocket/WebSocket.js b/packages/react-native/Libraries/WebSocket/WebSocket.js index 3fdde2b3639..08d737493c3 100644 --- a/packages/react-native/Libraries/WebSocket/WebSocket.js +++ b/packages/react-native/Libraries/WebSocket/WebSocket.js @@ -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; diff --git a/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap b/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap index 93109e9e4ea..fdcb485b26a 100644 --- a/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap +++ b/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap @@ -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; + _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; + _subscriptions: Array; + _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, + 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"`; diff --git a/packages/react-native/Libraries/__tests__/public-api-test.js b/packages/react-native/Libraries/__tests__/public-api-test.js index ba51ace8f83..f70fb39f80c 100644 --- a/packages/react-native/Libraries/__tests__/public-api-test.js +++ b/packages/react-native/Libraries/__tests__/public-api-test.js @@ -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, ); } }