react-timeago
Version:
A simple Time-Ago component for ReactJs
1,689 lines (1,471 loc) • 73 kB
JavaScript
/* BOM */
declare class Screen {
+availHeight: number;
+availWidth: number;
+availLeft: number;
+availTop: number;
+top: number;
+left: number;
+colorDepth: number;
+pixelDepth: number;
+width: number;
+height: number;
+orientation?: {
lock(): Promise<void>;
unlock(): void;
angle: number;
onchange: () => mixed;
type: 'portrait-primary' | 'portrait-secondary' | 'landscape-primary' | 'landscape-secondary';
...
};
// deprecated
mozLockOrientation?: (orientation: string | Array<string>) => boolean;
mozUnlockOrientation?: () => void;
mozOrientation?: string;
onmozorientationchange?: (...args: any[]) => mixed;
}
declare var screen: Screen;
declare interface Crypto {
// Not using $TypedArray as that would include Float32Array and Float64Array which are not accepted
getRandomValues: <
T: Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | BigInt64Array | BigUint64Array
>(typedArray: T) => T;
randomUUID: () => string;
}
declare var crypto: Crypto;
declare var window: any;
type GamepadButton = {
pressed: boolean,
value: number,
...
}
type GamepadHapticActuator = {
type: 'vibration',
pulse(value: number, duration: number): Promise<boolean>,
...
}
type GamepadPose = {
angularAcceleration: null | Float32Array,
angularVelocity: null | Float32Array,
hasOrientation: boolean,
hasPosition: boolean,
linearAcceleration: null | Float32Array,
linearVelocity: null | Float32Array,
orientation: null | Float32Array,
position: null | Float32Array,
...
}
type Gamepad = {
axes: number[],
buttons: GamepadButton[],
connected: boolean,
displayId?: number,
hapticActuators?: GamepadHapticActuator[],
hand?: '' | 'left' | 'right',
id: string,
index: number,
mapping: string,
pose?: null | GamepadPose,
timestamp: number,
...
}
// deprecated
type BatteryManager = {
+charging: boolean,
+chargingTime: number,
+dischargingTime: number,
+level: number,
onchargingchange: ?((event: any) => mixed),
onchargingtimechange: ?((event: any) => mixed),
ondischargingtimechange: ?((event: any) => mixed),
onlevelchange: ?((event: any) => mixed),
...
}
// https://wicg.github.io/web-share
type ShareData = {
title?: string,
text?: string,
url?: string,
...
}
type PermissionName =
| "geolocation"
| "notifications"
| "push"
| "midi"
| "camera"
| "microphone"
| "speaker"
| "usb"
| "device-info"
| "background-sync"
| "bluetooth"
| "persistent-storage"
| "ambient-light-sensor"
| "accelerometer"
| "gyroscope"
| "magnetometer"
| "clipboard-read"
| "clipboard-write";
type PermissionState =
| "granted"
| "denied"
| "prompt";
type PermissionDescriptor = {|
name: PermissionName;
|}
type DevicePermissionDescriptor = {|
deviceId?: string;
name: "camera" | "microphone" | "speaker";
|}
type MidiPermissionDescriptor = {|
name: "midi";
sysex?: boolean;
|}
type PushPermissionDescriptor = {|
name: "push";
userVisibleOnly?: boolean;
|}
type ClipboardPermissionDescriptor = {|
name: "clipboard-read" | "clipboard-write";
allowWithoutGesture: boolean;
|}
type USBPermissionDescriptor = {|
name: "usb";
filters: Array<USBDeviceFilter>;
exclusionFilters: Array<USBDeviceFilter>;
|}
type FileSystemHandlePermissionDescriptor = {|
mode: "read" | "readwrite";
|}
declare class PermissionStatus extends EventTarget {
onchange: ?((event: any) => mixed);
+state: PermissionState;
}
declare class Permissions {
query(
permissionDesc:
| DevicePermissionDescriptor
| MidiPermissionDescriptor
| PushPermissionDescriptor
| ClipboardPermissionDescriptor
| USBPermissionDescriptor
| PermissionDescriptor
): Promise<PermissionStatus>;
}
type MIDIPortType = 'input' | 'output';
type MIDIPortDeviceState = 'connected' | 'disconnected';
type MIDIPortConnectionState = 'open' | 'closed' | 'pending';
type MIDIOptions = {|
sysex: boolean;
software: boolean;
|}
type MIDIMessageEvent$Init = Event$Init & {
data: Uint8Array;
...
}
declare class MIDIMessageEvent extends Event {
constructor(type: string, eventInitDict: MIDIMessageEvent$Init): void;
+data: Uint8Array;
}
type MIDIConnectionEvent$Init = Event$Init & {
port: MIDIPort;
...
}
declare class MIDIConnectionEvent extends Event {
constructor(type: string, eventInitDict: MIDIConnectionEvent$Init): void;
+port: MIDIPort;
}
declare class MIDIPort extends EventTarget {
+id: string;
+manufacturer?: string;
+name?: string;
+type: MIDIPortType;
+version?: string;
+state: MIDIPortDeviceState;
+connection: MIDIPortConnectionState;
onstatechange: ?((ev: MIDIConnectionEvent) => mixed);
open(): Promise<MIDIPort>;
close(): Promise<MIDIPort>;
}
declare class MIDIInput extends MIDIPort {
onmidimessage: ?((ev: MIDIMessageEvent) => mixed);
}
declare class MIDIOutput extends MIDIPort {
send(data: Iterable<number>, timestamp?: number): void;
clear(): void;
}
declare class MIDIInputMap extends $ReadOnlyMap<string, MIDIInput> {}
declare class MIDIOutputMap extends $ReadOnlyMap<string, MIDIOutput> {}
declare class MIDIAccess extends EventTarget {
+inputs: MIDIInputMap;
+outputs: MIDIOutputMap;
+sysexEnabled: boolean;
onstatechange: ?((ev: MIDIConnectionEvent) => mixed);
}
declare class NavigatorID {
appName: 'Netscape';
appCodeName: 'Mozilla';
product: 'Gecko';
appVersion: string;
platform: string;
userAgent: string;
}
declare class NavigatorLanguage {
+language: string;
+languages: $ReadOnlyArray<string>;
}
declare class NavigatorContentUtils {
registerContentHandler(mimeType: string, uri: string, title: string): void;
registerProtocolHandler(protocol: string, uri: string, title: string): void;
}
declare class NavigatorCookies {
+cookieEnabled: boolean;
}
declare class NavigatorPlugins {
+plugins: PluginArray;
+mimeTypes: MimeTypeArray;
javaEnabled(): boolean;
}
declare class NavigatorOnLine {
+onLine: boolean;
}
declare class NavigatorConcurrentHardware {
+hardwareConcurrency: number;
}
declare class NavigatorStorage {
storage?: StorageManager
}
declare class StorageManager {
persist: () => Promise<boolean>;
persisted: () => Promise<boolean>;
estimate?: () => Promise<StorageEstimate>;
getDirectory: () => Promise<FileSystemDirectoryHandle>;
}
type StorageManagerRegisteredEndpoint = 'caches' | 'indexedDB' | 'localStorage' | 'serviceWorkerRegistrations' | 'sessionStorage';
type StorageManagerUsageDetails = {[StorageManagerRegisteredEndpoint]: number};
declare class StorageEstimate {
constructor(usage: number, quota: number, usageDetails?: StorageManagerUsageDetails): void;
+usage: number;
+quota: number;
// Not a part of the standard
+usageDetails?: StorageManagerUsageDetails;
}
declare class Navigator mixins
NavigatorID,
NavigatorLanguage,
NavigatorOnLine,
NavigatorContentUtils,
NavigatorCookies,
NavigatorPlugins,
NavigatorConcurrentHardware,
NavigatorStorage {
productSub: '20030107' | '20100101';
vendor: '' | 'Google Inc.' | 'Apple Computer, Inc';
vendorSub: '';
activeVRDisplays?: VRDisplay[];
appCodeName: 'Mozilla';
buildID: string;
doNotTrack: string | null;
geolocation: Geolocation;
mediaDevices?: MediaDevices;
usb?: USB;
maxTouchPoints: number;
permissions: Permissions;
serviceWorker?: $FlowFixMe;
getGamepads?: () => Array<Gamepad | null>;
webkitGetGamepads?: Function;
mozGetGamepads?: Function;
mozGamepads?: any;
gamepads?: any;
webkitGamepads?: any;
getVRDisplays?: () => Promise<VRDisplay[]>;
registerContentHandler(mimeType: string, uri: string, title: string): void;
registerProtocolHandler(protocol: string, uri: string, title: string): void;
requestMIDIAccess?: (options?: MIDIOptions) => Promise<MIDIAccess>;
requestMediaKeySystemAccess?: (keySystem: string, supportedConfigurations: any[]) => Promise<any>;
sendBeacon?: (url: string, data?: BodyInit) => boolean;
vibrate?: (pattern: number | number[]) => boolean;
mozVibrate?: (pattern: number | number[]) => boolean;
webkitVibrate?: (pattern: number | number[]) => boolean;
canShare?: (shareData?: ShareData) => boolean;
share?: (shareData: ShareData) => Promise<void>;
clipboard: Clipboard;
credentials?: CredMgmtCredentialsContainer;
globalPrivacyControl?: boolean;
// deprecated
getBattery?: () => Promise<BatteryManager>;
mozGetBattery?: () => Promise<BatteryManager>;
// deprecated
getUserMedia?: Function;
webkitGetUserMedia?: Function;
mozGetUserMedia?: Function;
msGetUserMedia?: Function;
// Gecko
taintEnabled?: () => false;
oscpu: string;
}
declare class Clipboard extends EventTarget {
read(): Promise<DataTransfer>;
readText(): Promise<string>;
write(data: $ReadOnlyArray<ClipboardItem>): Promise<void>;
writeText(data: string): Promise<void>;
}
declare var navigator: Navigator;
declare class MimeType {
type: string;
description: string;
suffixes: string;
enabledPlugin: Plugin;
}
declare class MimeTypeArray {
length: number;
item(index: number): MimeType;
namedItem(name: string): MimeType;
[key: number | string]: MimeType;
}
declare class Plugin {
description: string;
filename: string;
name: string;
version?: string; // Gecko only
length: number;
item(index: number): MimeType;
namedItem(name: string): MimeType;
[key: number | string]: MimeType;
}
declare class PluginArray {
length: number;
item(index: number): Plugin;
namedItem(name: string): Plugin;
refresh(): void;
[key: number | string]: Plugin;
}
// https://www.w3.org/TR/hr-time-2/#dom-domhighrestimestamp
// https://developer.mozilla.org/en-US/docs/Web/API/DOMHighResTimeStamp
declare type DOMHighResTimeStamp = number;
// https://www.w3.org/TR/navigation-timing-2/
declare class PerformanceTiming {
connectEnd: number;
connectStart: number;
domainLookupEnd: number;
domainLookupStart: number;
domComplete: number;
domContentLoadedEventEnd: number;
domContentLoadedEventStart: number;
domInteractive: number;
domLoading: number;
fetchStart: number;
loadEventEnd: number;
loadEventStart: number;
navigationStart: number;
redirectEnd: number;
redirectStart: number;
requestStart: number;
responseEnd: number;
responseStart: number;
secureConnectionStart: number;
unloadEventEnd: number;
unloadEventStart: number;
}
declare class PerformanceNavigation {
TYPE_NAVIGATE: 0;
TYPE_RELOAD: 1;
TYPE_BACK_FORWARD: 2;
TYPE_RESERVED: 255;
type: 0 | 1 | 2 | 255;
redirectCount: number;
}
type PerformanceEntryFilterOptions = {
name: string,
entryType: string,
initiatorType: string,
...
}
// https://www.w3.org/TR/performance-timeline-2/
declare class PerformanceEntry {
name: string;
entryType: string;
startTime: DOMHighResTimeStamp;
duration: DOMHighResTimeStamp;
toJSON(): string;
}
// https://w3c.github.io/server-timing/#the-performanceservertiming-interface
declare class PerformanceServerTiming {
description: string;
duration: DOMHighResTimeStamp;
name: string;
toJSON(): string;
}
// https://www.w3.org/TR/resource-timing-2/#sec-performanceresourcetiming
// https://w3c.github.io/server-timing/#extension-to-the-performanceresourcetiming-interface
declare class PerformanceResourceTiming extends PerformanceEntry {
initiatorType: string;
nextHopProtocol: string;
workerStart: number;
redirectStart: number;
redirectEnd: number;
fetchStart: number;
domainLookupStart: number;
domainLookupEnd: number;
connectStart: number;
connectEnd: number;
secureConnectionStart: number;
requestStart: number;
responseStart: number;
responseEnd: number;
transferSize: string;
encodedBodySize: number;
decodedBodySize: number;
serverTiming: Array<PerformanceServerTiming>;
}
// https://w3c.github.io/event-timing/#sec-performance-event-timing
declare class PerformanceEventTiming extends PerformanceEntry {
processingStart: number;
processingEnd: number;
cancelable: boolean;
target: ?Node;
interactionId: number;
}
// https://w3c.github.io/longtasks/#taskattributiontiming
declare class TaskAttributionTiming extends PerformanceEntry {
containerType: string;
containerSrc: string;
containerId: string;
containerName: string;
}
// https://w3c.github.io/longtasks/#sec-PerformanceLongTaskTiming
declare class PerformanceLongTaskTiming extends PerformanceEntry {
attribution: $ReadOnlyArray<TaskAttributionTiming>;
}
// https://www.w3.org/TR/navigation-timing-2/
declare class PerformanceNavigationTiming extends PerformanceResourceTiming {
unloadEventStart: number;
unloadEventEnd: number;
domInteractive: number;
domContentLoadedEventStart: number;
domContentLoadedEventEnd: number;
domComplete: number;
loadEventStart: number;
loadEventEnd: number;
type: 'navigate' | 'reload' | 'back_forward' | 'prerender';
redirectCount: number;
}
// https://www.w3.org/TR/user-timing/#extensions-performance-interface
declare type PerformanceMarkOptions = {|
detail?: mixed,
startTime?: number,
|};
declare type PerformanceMeasureOptions = {|
detail?: mixed,
start?: number | string,
end?: number | string,
duration?: number,
|};
type EventCountsForEachCallbackType =
| (() => void)
| ((value: number) => void)
| ((value: number, key: string) => void)
| ((value: number, key: string, map: Map<string, number>) => void);
// https://www.w3.org/TR/event-timing/#eventcounts
declare interface EventCounts {
size: number;
entries(): Iterator<[string, number]>;
forEach(callback: EventCountsForEachCallbackType): void;
get(key: string): ?number;
has(key: string): boolean;
keys(): Iterator<string>;
values(): Iterator<number>;
}
declare class Performance {
eventCounts: EventCounts;
// deprecated
navigation: PerformanceNavigation;
timing: PerformanceTiming;
onresourcetimingbufferfull: (ev: any) => mixed;
clearMarks(name?: string): void;
clearMeasures(name?: string): void;
clearResourceTimings(): void;
getEntries(options?: PerformanceEntryFilterOptions): Array<PerformanceEntry>;
getEntriesByName(name: string, type?: string): Array<PerformanceEntry>;
getEntriesByType(type: string): Array<PerformanceEntry>;
mark(name: string, options?: PerformanceMarkOptions): void;
measure(name: string, startMarkOrOptions?: string | PerformanceMeasureOptions, endMark?: string): void;
now(): DOMHighResTimeStamp;
setResourceTimingBufferSize(maxSize: number): void;
toJSON(): string;
}
declare var performance: Performance;
type PerformanceEntryList = PerformanceEntry[];
declare interface PerformanceObserverEntryList {
getEntries(): PerformanceEntryList;
getEntriesByType(type: string): PerformanceEntryList;
getEntriesByName(name: string, type: ?string): PerformanceEntryList;
}
type PerformanceObserverInit = {
entryTypes?: string[];
type?: string;
buffered?: boolean;
...
}
declare class PerformanceObserver {
constructor(callback: (entries: PerformanceObserverEntryList, observer: PerformanceObserver) => mixed): void;
observe(options: ?PerformanceObserverInit): void;
disconnect(): void;
takeRecords(): PerformanceEntryList;
static supportedEntryTypes: string[];
}
declare class History {
length: number;
scrollRestoration: 'auto' | 'manual';
state: any;
back(): void;
forward(): void;
go(delta?: number): void;
pushState(statedata: any, title: string, url?: string): void;
replaceState(statedata: any, title: string, url?: string): void;
}
declare var history: History;
declare class Location {
ancestorOrigins: string[];
hash: string;
host: string;
hostname: string;
href: string;
origin: string;
pathname: string;
port: string;
protocol: string;
search: string;
assign(url: string): void;
reload(flag?: boolean): void;
replace(url: string): void;
toString(): string;
}
declare var location: Location;
///////////////////////////////////////////////////////////////////////////////
declare class DOMParser {
parseFromString(source: string | TrustedHTML, mimeType: string): Document;
}
type FormDataEntryValue = string | File
declare class FormData {
constructor(form?: HTMLFormElement, submitter?: HTMLElement | null): void;
has(name: string): boolean;
get(name: string): ?FormDataEntryValue;
getAll(name: string): Array<FormDataEntryValue>;
set(name: string, value: string): void;
set(name: string, value: Blob, filename?: string): void;
set(name: string, value: File, filename?: string): void;
append(name: string, value: string): void;
append(name: string, value: Blob, filename?: string): void;
append(name: string, value: File, filename?: string): void;
delete(name: string): void;
keys(): Iterator<string>;
values(): Iterator<FormDataEntryValue>;
entries(): Iterator<[string, FormDataEntryValue]>;
}
declare class MutationRecord {
type: 'attributes' | 'characterData' | 'childList';
target: Node;
addedNodes: NodeList<Node>;
removedNodes: NodeList<Node>;
previousSibling: ?Node;
nextSibling: ?Node;
attributeName: ?string;
attributeNamespace: ?string;
oldValue: ?string;
}
type MutationObserverInitRequired =
| { childList: true, ... }
| { attributes: true, ... }
| { characterData: true, ... }
declare type MutationObserverInit = MutationObserverInitRequired & {
subtree?: boolean,
attributeOldValue?: boolean,
characterDataOldValue?: boolean,
attributeFilter?: Array<string>,
...
}
declare class MutationObserver {
constructor(callback: (arr: Array<MutationRecord>, observer: MutationObserver) => mixed): void;
observe(target: Node, options: MutationObserverInit): void;
takeRecords(): Array<MutationRecord>;
disconnect(): void;
}
declare class DOMRectReadOnly {
static fromRect(rectangle?: {
x: number,
y: number,
width: number,
height: number,
...
}): DOMRectReadOnly;
constructor(x: number, y: number, width: number, height: number): void;
+bottom: number;
+height: number;
+left: number;
+right: number;
+top: number;
+width: number;
+x: number;
+y: number;
}
declare class DOMRect extends DOMRectReadOnly {
static fromRect(rectangle?: {
x: number,
y: number,
width: number,
height: number,
...
}): DOMRect;
bottom: number;
height: number;
left: number;
right: number;
top: number;
width: number;
x: number;
y: number;
}
declare class DOMRectList {
@@iterator(): Iterator<DOMRect>;
length: number;
item(index: number): DOMRect;
[index: number]: DOMRect;
}
declare type IntersectionObserverEntry = {
boundingClientRect: DOMRectReadOnly,
intersectionRatio: number,
intersectionRect: DOMRectReadOnly,
isIntersecting: boolean,
rootBounds: DOMRectReadOnly,
target: Element,
time: DOMHighResTimeStamp,
...
};
declare type IntersectionObserverCallback = (
entries: Array<IntersectionObserverEntry>,
observer: IntersectionObserver,
) => mixed;
declare type IntersectionObserverOptions = {
root?: Node | null,
rootMargin?: string,
threshold?: number | Array<number>,
...
};
declare class IntersectionObserver {
constructor(
callback: IntersectionObserverCallback,
options?: IntersectionObserverOptions
): void,
root: Element | null;
rootMargin: string;
scrollMargin: string;
thresholds: number[];
observe(target: Element): void,
unobserve(target: Element): void,
takeRecords(): Array<IntersectionObserverEntry>,
disconnect(): void,
}
declare interface ResizeObserverSize {
+inlineSize: number;
+blockSize: number;
}
declare interface ResizeObserverEntry {
/**
* The Element whose size has changed.
*/
+target: Element;
/**
* Element's content rect when ResizeObserverCallback is invoked.
*
* Legacy, may be deprecated in the future.
*/
+contentRect: DOMRectReadOnly;
/**
* An array containing the Element's border box size when
* ResizeObserverCallback is invoked.
*/
+borderBoxSize: $ReadOnlyArray<ResizeObserverSize>;
/**
* An array containing the Element's content rect size when
* ResizeObserverCallback is invoked.
*/
+contentBoxSize: $ReadOnlyArray<ResizeObserverSize>;
/**
* An array containing the Element's content rect size in integral device
* pixels when ResizeObserverCallback is invoked.
*
* Not implemented in Firefox or Safari as of July 2021
*/
+devicePixelContentBoxSize?: $ReadOnlyArray<ResizeObserverSize> | void;
}
/**
* ResizeObserver can observe different kinds of CSS sizes:
* - border-box : size of box border area as defined in CSS2.
* - content-box : size of content area as defined in CSS2.
* - device-pixel-content-box : size of content area as defined in CSS2, in device
* pixels, before applying any CSS transforms on the element or its ancestors.
* This size must contain integer values.
*/
type ResizeObserverBoxOptions = "border-box" | "content-box" | "device-pixel-content-box";
declare type ResizeObserverOptions = {
box?: ResizeObserverBoxOptions;
...
};
/**
* The ResizeObserver interface is used to observe changes to Element's size.
*/
declare class ResizeObserver {
constructor(callback: (entries: ResizeObserverEntry[], observer: ResizeObserver) => mixed): void;
/**
* Adds target to the list of observed elements.
*/
observe(target: Element, options?: ResizeObserverOptions): void;
/**
* Removes target from the list of observed elements.
*/
unobserve(target: Element): void;
disconnect(): void;
}
declare class CloseEvent extends Event {
code: number;
reason: string;
wasClean: boolean;
}
declare class WebSocket extends EventTarget {
static CONNECTING: 0;
static OPEN: 1;
static CLOSING: 2;
static CLOSED: 3;
constructor(url: string, protocols?: string | Array<string>): void;
protocol: string;
readyState: number;
bufferedAmount: number;
extensions: string;
onopen: (ev: any) => mixed;
onmessage: (ev: MessageEvent) => mixed;
onclose: (ev: CloseEvent) => mixed;
onerror: (ev: any) => mixed;
binaryType: 'blob' | 'arraybuffer';
url: string;
close(code?: number, reason?: string): void;
send(data: string): void;
send(data: Blob): void;
send(data: ArrayBuffer): void;
send(data: $ArrayBufferView): void;
CONNECTING: 0;
OPEN: 1;
CLOSING: 2;
CLOSED: 3;
}
type WorkerOptions = {
type?: $FlowFixMe,
credentials?: CredentialsType,
name?: string,
...
}
declare class Worker extends EventTarget {
constructor(stringUrl: string | TrustedScriptURL, workerOptions?: WorkerOptions): void;
onerror: null | (ev: any) => mixed;
onmessage: null | (ev: MessageEvent) => mixed;
onmessageerror: null | (ev: MessageEvent) => mixed;
postMessage(message: any, ports?: any): void;
terminate(): void;
}
declare class SharedWorker extends EventTarget {
constructor(stringUrl: string | TrustedScriptURL, name?: string): void;
constructor(stringUrl: string | TrustedScriptURL, workerOptions?: WorkerOptions): void;
port: MessagePort;
onerror: (ev: any) => mixed;
}
declare function importScripts(...urls: Array<string | TrustedScriptURL>): void;
declare class WorkerGlobalScope extends EventTarget {
self: this;
location: WorkerLocation;
navigator: WorkerNavigator;
close(): void;
importScripts(...urls: Array<string | TrustedScriptURL>): void;
onerror: (ev: any) => mixed;
onlanguagechange: (ev: any) => mixed;
onoffline: (ev: any) => mixed;
ononline: (ev: any) => mixed;
onrejectionhandled: (ev: PromiseRejectionEvent) => mixed;
onunhandledrejection: (ev: PromiseRejectionEvent) => mixed;
}
declare class DedicatedWorkerGlobalScope extends WorkerGlobalScope {
onmessage: (ev: MessageEvent) => mixed;
onmessageerror: (ev: MessageEvent) => mixed;
postMessage(message: any, transfer?: Iterable<any>): void;
}
declare class SharedWorkerGlobalScope extends WorkerGlobalScope {
name: string;
onconnect: (ev: MessageEvent) => mixed;
}
declare class WorkerLocation {
origin: string;
protocol: string;
host: string;
hostname: string;
port: string;
pathname: string;
search: string;
hash: string;
}
declare class WorkerNavigator mixins
NavigatorID,
NavigatorLanguage,
NavigatorOnLine,
NavigatorConcurrentHardware,
NavigatorStorage {
permissions: Permissions;
}
// deprecated
declare class XDomainRequest {
timeout: number;
onerror: () => mixed;
onload: () => mixed;
onprogress: () => mixed;
ontimeout: () => mixed;
+responseText: string;
+contentType: string;
open(method: "GET" | "POST", url: string): void;
abort(): void;
send(data?: string): void;
statics: { create(): XDomainRequest, ... }
}
declare class XMLHttpRequest extends EventTarget {
static LOADING: number;
static DONE: number;
static UNSENT: number;
static OPENED: number;
static HEADERS_RECEIVED: number;
responseBody: any;
status: number;
readyState: number;
responseText: string;
responseXML: any;
responseURL: string;
ontimeout: ProgressEventHandler;
statusText: string;
onreadystatechange: (ev: any) => mixed;
timeout: number;
onload: ProgressEventHandler;
response: any;
withCredentials: boolean;
onprogress: ProgressEventHandler;
onabort: ProgressEventHandler;
responseType: string;
onloadend: ProgressEventHandler;
upload: XMLHttpRequestEventTarget;
onerror: ProgressEventHandler;
onloadstart: ProgressEventHandler;
msCaching: string;
open(method: string, url: string, async?: boolean, user?: string, password?: string): void;
send(data?: any): void;
abort(): void;
getAllResponseHeaders(): string;
setRequestHeader(header: string, value: string): void;
getResponseHeader(header: string): string;
msCachingEnabled(): boolean;
overrideMimeType(mime: string): void;
LOADING: number;
DONE: number;
UNSENT: number;
OPENED: number;
HEADERS_RECEIVED: number;
statics: { create(): XMLHttpRequest, ... }
}
declare class XMLHttpRequestEventTarget extends EventTarget {
onprogress: ProgressEventHandler;
onerror: ProgressEventHandler;
onload: ProgressEventHandler;
ontimeout: ProgressEventHandler;
onabort: ProgressEventHandler;
onloadstart: ProgressEventHandler;
onloadend: ProgressEventHandler;
}
declare class XMLSerializer {
serializeToString(target: Node): string;
}
declare class Geolocation {
getCurrentPosition(
success: (position: Position) => mixed,
error?: (error: PositionError) => mixed,
options?: PositionOptions
): void;
watchPosition(
success: (position: Position) => mixed,
error?: (error: PositionError) => mixed,
options?: PositionOptions
): number;
clearWatch(id: number): void;
}
declare class Position {
coords: Coordinates;
timestamp: number;
}
declare class Coordinates {
latitude: number;
longitude: number;
altitude?: number;
accuracy: number;
altitudeAccuracy?: number;
heading?: number;
speed?: number;
}
declare class PositionError {
code: number;
message: string;
PERMISSION_DENIED: 1;
POSITION_UNAVAILABLE: 2;
TIMEOUT: 3;
}
type PositionOptions = {
enableHighAccuracy?: boolean,
timeout?: number,
maximumAge?: number,
...
}
type AudioContextState = 'suspended' | 'running' | 'closed';
// deprecated
type AudioProcessingEvent$Init = Event$Init & {
playbackTime: number;
inputBuffer: AudioBuffer;
outputBuffer: AudioBuffer;
...
}
// deprecated
declare class AudioProcessingEvent extends Event {
constructor(type: string, eventInitDict: AudioProcessingEvent$Init): void;
+playbackTime: number;
+inputBuffer: AudioBuffer;
+outputBuffer: AudioBuffer;
}
type OfflineAudioCompletionEvent$Init = Event$Init & {
renderedBuffer: AudioBuffer;
...
}
declare class OfflineAudioCompletionEvent extends Event {
constructor(type: string, eventInitDict: OfflineAudioCompletionEvent$Init): void;
+renderedBuffer: AudioBuffer;
}
declare class BaseAudioContext extends EventTarget {
currentTime: number;
destination: AudioDestinationNode;
listener: AudioListener;
sampleRate: number;
state: AudioContextState;
onstatechange: (ev: any) => mixed;
createBuffer(numOfChannels: number, length: number, sampleRate: number): AudioBuffer;
createBufferSource(myMediaElement?: HTMLMediaElement): AudioBufferSourceNode;
createMediaElementSource(myMediaElement: HTMLMediaElement): MediaElementAudioSourceNode;
createMediaStreamSource(stream: MediaStream): MediaStreamAudioSourceNode;
createMediaStreamDestination(): MediaStreamAudioDestinationNode;
// deprecated
createScriptProcessor(bufferSize: number, numberOfInputChannels: number, numberOfOutputChannels: number): ScriptProcessorNode;
createAnalyser(): AnalyserNode;
createBiquadFilter(): BiquadFilterNode;
createChannelMerger(numberOfInputs?: number): ChannelMergerNode;
createChannelSplitter(numberOfInputs?: number): ChannelSplitterNode;
createConstantSource(): ConstantSourceNode;
createConvolver(): ConvolverNode;
createDelay(maxDelayTime?: number): DelayNode;
createDynamicsCompressor(): DynamicsCompressorNode;
createGain(): GainNode;
createIIRFilter (feedforward: Float32Array, feedback: Float32Array): IIRFilterNode;
createOscillator(): OscillatorNode;
createPanner(): PannerNode;
createStereoPanner(): StereoPannerNode;
createPeriodicWave(real: Float32Array, img: Float32Array, options?: { disableNormalization: boolean, ... }): PeriodicWave;
createStereoPanner(): StereoPannerNode;
createWaveShaper(): WaveShaperNode;
decodeAudioData(arrayBuffer: ArrayBuffer, decodeSuccessCallback: (decodedData: AudioBuffer) => mixed, decodeErrorCallback: (err: DOMError) => mixed): void;
decodeAudioData(arrayBuffer: ArrayBuffer): Promise<AudioBuffer>;
}
declare class AudioTimestamp {
contextTime: number;
performanceTime: number;
}
declare class AudioContext extends BaseAudioContext {
constructor(options?: {| latencyHint?: 'balanced' | 'interactive' | 'playback' | number, sampleRate?: number |}): AudioContext;
baseLatency: number;
outputLatency: number;
getOutputTimestamp(): AudioTimestamp;
resume(): Promise<void>;
suspend(): Promise<void>;
close(): Promise<void>;
createMediaElementSource(myMediaElement: HTMLMediaElement): MediaElementAudioSourceNode;
createMediaStreamSource(myMediaStream: MediaStream): MediaStreamAudioSourceNode;
createMediaStreamTrackSource(myMediaStreamTrack: MediaStreamTrack): MediaStreamTrackAudioSourceNode;
createMediaStreamDestination(): MediaStreamAudioDestinationNode;
}
declare class OfflineAudioContext extends BaseAudioContext {
startRendering(): Promise<AudioBuffer>;
suspend(suspendTime: number): Promise<void>;
length: number;
oncomplete: (ev: OfflineAudioCompletionEvent) => mixed;
}
declare class AudioNode extends EventTarget {
context: AudioContext;
numberOfInputs: number;
numberOfOutputs: number;
channelCount: number;
channelCountMode: 'max' | 'clamped-max' | 'explicit';
channelInterpretation: 'speakers' | 'discrete';
connect(audioNode: AudioNode, output?: number, input?: number): AudioNode;
connect(destination: AudioParam, output?: number): void;
disconnect(destination?: AudioNode, output?: number, input?: number): void;
}
declare class AudioParam extends AudioNode {
value: number;
defaultValue: number;
setValueAtTime(value: number, startTime: number): this;
linearRampToValueAtTime(value: number, endTime: number): this;
exponentialRampToValueAtTime(value: number, endTime: number): this;
setTargetAtTime(target: number, startTime: number, timeConstant: number): this;
setValueCurveAtTime(values: Float32Array, startTime: number, duration: number): this;
cancelScheduledValues(startTime: number): this;
}
declare class AudioDestinationNode extends AudioNode {
maxChannelCount: number;
}
declare class AudioListener extends AudioNode {
positionX: AudioParam;
positionY: AudioParam;
positionZ: AudioParam;
forwardX: AudioParam;
forwardY: AudioParam;
forwardZ: AudioParam;
upX: AudioParam;
upY: AudioParam;
upZ: AudioParam;
setPosition(x: number, y: number, c: number): void;
setOrientation(x: number, y: number, z: number, xUp: number, yUp: number, zUp: number): void;
}
declare class AudioBuffer {
sampleRate: number;
length: number;
duration: number;
numberOfChannels: number;
getChannelData(channel: number): Float32Array;
copyFromChannel(destination: Float32Array, channelNumber: number, startInChannel?: number): void;
copyToChannel(source: Float32Array, channelNumber: number, startInChannel?: number): void;
}
declare class AudioBufferSourceNode extends AudioNode {
buffer: AudioBuffer;
detune: AudioParam;
loop: boolean;
loopStart: number;
loopEnd: number;
playbackRate: AudioParam;
onended: (ev: any) => mixed;
start(when?: number, offset?: number, duration?: number): void;
stop(when?: number): void;
}
declare class CanvasCaptureMediaStream extends MediaStream {
canvas: HTMLCanvasElement;
requestFrame(): void;
}
type DoubleRange = {
max?: number;
min?: number;
...
}
type LongRange = {
max?: number;
min?: number;
...
}
type ConstrainBooleanParameters = {
exact?: boolean;
ideal?: boolean;
...
}
type ConstrainDOMStringParameters = {
exact?: string | string[];
ideal?: string | string[];
...
}
type ConstrainDoubleRange = {
...DoubleRange;
exact?: number;
ideal?: number;
...
}
type ConstrainLongRange = {
...LongRange;
exact?: number;
ideal?: number;
...
}
type MediaTrackSupportedConstraints = {|
width: boolean;
height: boolean;
aspectRatio: boolean;
frameRate: boolean;
facingMode: boolean;
resizeMode: boolean;
volume: boolean;
sampleRate: boolean;
sampleSize: boolean;
echoCancellation: boolean;
autoGainControl: boolean;
noiseSuppression: boolean;
latency: boolean;
channelCount: boolean;
deviceId: boolean;
groupId: boolean;
|}
type MediaTrackConstraintSet = {
width?: number | ConstrainLongRange;
height?: number | ConstrainLongRange;
aspectRatio?: number | ConstrainDoubleRange;
frameRate?: number | ConstrainDoubleRange;
facingMode?: string | string[] | ConstrainDOMStringParameters;
resizeMode?: string | string[] | ConstrainDOMStringParameters;
volume?: number | ConstrainDoubleRange;
sampleRate?: number | ConstrainLongRange;
sampleSize?: number | ConstrainLongRange;
echoCancellation?: boolean | ConstrainBooleanParameters;
autoGainControl?: boolean | ConstrainBooleanParameters;
noiseSuppression?: boolean | ConstrainBooleanParameters;
latency?: number | ConstrainDoubleRange;
channelCount?: number | ConstrainLongRange;
deviceId?: string | string[] | ConstrainDOMStringParameters;
groupId?: string | string[] | ConstrainDOMStringParameters;
...
}
type MediaTrackConstraints = {
...MediaTrackConstraintSet;
advanced?: Array<MediaTrackConstraintSet>;
...
}
type DisplayMediaStreamConstraints = {
video?: boolean | MediaTrackConstraints;
audio?: boolean | MediaTrackConstraints;
...
}
type MediaStreamConstraints = {
audio?: boolean | MediaTrackConstraints;
video?: boolean | MediaTrackConstraints;
peerIdentity?: string;
...
}
type MediaTrackSettings = {
aspectRatio?: number;
deviceId?: string;
displaySurface?: 'application' | 'browser' | 'monitor' | 'window';
echoCancellation?: boolean;
facingMode?: string;
frameRate?: number;
groupId?: string;
height?: number;
logicalSurface?: boolean;
sampleRate?: number;
sampleSize?: number;
volume?: number;
width?: number;
...
}
type MediaTrackCapabilities = {
aspectRatio?: number | DoubleRange;
deviceId?: string;
echoCancellation?: boolean[];
facingMode?: string;
frameRate?: number | DoubleRange;
groupId?: string;
height?: number | LongRange;
sampleRate?: number | LongRange;
sampleSize?: number | LongRange;
volume?: number | DoubleRange;
width?: number | LongRange;
...
}
declare class MediaDevices extends EventTarget {
ondevicechange: (ev: any) => mixed;
enumerateDevices: () => Promise<Array<MediaDeviceInfo>>;
getSupportedConstraints: () => MediaTrackSupportedConstraints;
getDisplayMedia: (constraints?: DisplayMediaStreamConstraints) => Promise<MediaStream>;
getUserMedia: (constraints: MediaStreamConstraints) => Promise<MediaStream>;
}
declare class MediaDeviceInfo {
+deviceId: string;
+groupId: string;
+kind: 'videoinput' | 'audioinput' | 'audiooutput';
+label: string;
}
type MediaRecorderOptions = {
mimeType?: string,
audioBitsPerSecond?: number,
videoBitsPerSecond?: number,
bitsPerSecond?: number,
audioBitrateMode?: 'cbr' | 'vbr',
...
}
declare class MediaRecorder extends EventTarget {
constructor(stream: MediaStream, options?: MediaRecorderOptions): void;
+stream: MediaStream;
+mimeType: string;
+state: 'inactive' | 'recording' | 'paused';
onstart: (ev: any) => mixed;
onstop: (ev: any) => mixed;
ondataavailable: (ev: any) => mixed;
onpause: (ev: any) => mixed;
onresume: (ev: any) => mixed;
onerror: (ev: any) => mixed;
+videoBitsPerSecond: number;
+audioBitsPerSecond: number;
+audioBitrateMode: 'cbr' | 'vbr';
start(timeslice?: number): void;
stop(): void;
pause(): void;
resume(): void;
requestData(): void;
static isTypeSupported(type: string): boolean;
}
declare class MediaStream extends EventTarget {
active: boolean;
ended: boolean;
id: string;
onactive: (ev: any) => mixed;
oninactive: (ev: any) => mixed;
onended: (ev: any) => mixed;
onaddtrack: (ev: MediaStreamTrackEvent) => mixed;
onremovetrack: (ev: MediaStreamTrackEvent) => mixed;
addTrack(track: MediaStreamTrack): void;
clone(): MediaStream;
getAudioTracks(): MediaStreamTrack[];
getTrackById(trackid?: string): ?MediaStreamTrack;
getTracks(): MediaStreamTrack[];
getVideoTracks(): MediaStreamTrack[];
removeTrack(track: MediaStreamTrack): void;
}
declare class MediaStreamTrack extends EventTarget {
enabled: boolean;
id: string;
kind: string;
label: string;
muted: boolean;
readonly: boolean;
readyState: 'live' | 'ended';
remote: boolean;
contentHint?: string;
onstarted: (ev: any) => mixed;
onmute: (ev: any) => mixed;
onunmute: (ev: any) => mixed;
onoverconstrained: (ev: any) => mixed;
onended: (ev: any) => mixed;
getConstraints(): MediaTrackConstraints;
applyConstraints(constraints?: MediaTrackConstraints): Promise<void>;
getSettings(): MediaTrackSettings;
getCapabilities(): MediaTrackCapabilities;
clone(): MediaStreamTrack;
stop(): void;
}
declare class MediaStreamTrackEvent extends Event {
track: MediaStreamTrack;
}
declare class MediaElementAudioSourceNode extends AudioNode {}
declare class MediaStreamAudioSourceNode extends AudioNode {}
declare class MediaStreamTrackAudioSourceNode extends AudioNode {}
declare class MediaStreamAudioDestinationNode extends AudioNode {
stream: MediaStream;
}
// deprecated
declare class ScriptProcessorNode extends AudioNode {
bufferSize: number;
onaudioprocess: (ev: AudioProcessingEvent) => mixed;
}
declare class AnalyserNode extends AudioNode {
fftSize: number;
frequencyBinCount: number;
minDecibels: number;
maxDecibels: number;
smoothingTimeConstant: number;
getFloatFrequencyData(array: Float32Array): Float32Array;
getByteFrequencyData(array: Uint8Array): Uint8Array;
getFloatTimeDomainData(array: Float32Array): Float32Array;
getByteTimeDomainData(array: Uint8Array): Uint8Array;
}
declare class BiquadFilterNode extends AudioNode {
frequency: AudioParam;
detune: AudioParam;
Q: AudioParam;
gain: AudioParam;
type: 'lowpass'|'highpass'|'bandpass'|'lowshelf'|'highshelf'|'peaking'|'notch'|'allpass';
getFrequencyResponse(frequencyHz: Float32Array, magResponse: Float32Array, phaseResponse: Float32Array): void;
}
declare class ChannelMergerNode extends AudioNode {}
declare class ChannelSplitterNode extends AudioNode {}
type ConstantSourceOptions = { offset?: number, ... }
declare class ConstantSourceNode extends AudioNode {
constructor(context: BaseAudioContext, options?: ConstantSourceOptions): void;
offset: AudioParam;
onended: (ev: any) => mixed;
start(when?: number): void;
stop(when?: number): void;
}
declare class ConvolverNode extends AudioNode {
buffer: AudioBuffer;
normalize: boolean;
}
declare class DelayNode extends AudioNode {
delayTime: number;
}
declare class DynamicsCompressorNode extends AudioNode {
threshold: AudioParam;
knee: AudioParam;
ratio: AudioParam;
reduction: AudioParam;
attack: AudioParam;
release: AudioParam;
}
declare class GainNode extends AudioNode {
gain: AudioParam;
}
declare class IIRFilterNode extends AudioNode {
getFrequencyResponse(frequencyHz: Float32Array, magResponse: Float32Array, phaseResponse: Float32Array): void;
}
declare class OscillatorNode extends AudioNode {
frequency: AudioParam;
detune: AudioParam;
type: 'sine' | 'square' | 'sawtooth' | 'triangle' | 'custom';
start(when?: number): void;
stop(when?: number): void;
setPeriodicWave(periodicWave: PeriodicWave): void;
onended: (ev: any) => mixed;
}
declare class StereoPannerNode extends AudioNode {
pan: AudioParam;
}
declare class PannerNode extends AudioNode {
panningModel: 'equalpower'|'HRTF';
distanceModel: 'linear'|'inverse'|'exponential';
refDistance: number;
maxDistance: number;
rolloffFactor: number;
coneInnerAngle: number;
coneOuterAngle: number;
coneOuterGain: number;
setPosition(x: number, y: number, z: number): void;
setOrientation(x: number, y: number, z: number): void;
}
declare class PeriodicWave extends AudioNode {}
declare class WaveShaperNode extends AudioNode {
curve: Float32Array;
oversample: 'none'|'2x'|'4x';
}
// this part of spec is not finished yet, apparently
// https://stackoverflow.com/questions/35296664/can-fetch-get-object-as-headers
type HeadersInit = Headers | Array<[string, string]> | { [key: string]: string, ... };
// TODO Heades and URLSearchParams are almost the same thing.
// Could it somehow be abstracted away?
declare class Headers {
@@iterator(): Iterator<[string, string]>;
constructor(init?: HeadersInit): void;
append(name: string, value: string): void;
delete(name: string): void;
entries(): Iterator<[string, string]>;
forEach<This>(callback: (this : This, value: string, name: string, headers: Headers) => mixed, thisArg: This): void;
get(name: string): null | string;
has(name: string): boolean;
keys(): Iterator<string>;
set(name: string, value: string): void;
values(): Iterator<string>;
}
declare class URLSearchParams {
@@iterator(): Iterator<[string, string]>;
size: number;
constructor(init?: string | URLSearchParams | Array<[string, string]> | { [string]: string, ... } ): void;
append(name: string, value: string): void;
delete(name: string, value?: string): void;
entries(): Iterator<[string, string]>;
forEach<This>(callback: (this : This, value: string, name: string, params: URLSearchParams) => mixed, thisArg: This): void;
get(name: string): null | string;
getAll(name: string): Array<string>;
has(name: string, value?: string): boolean;
keys(): Iterator<string>;
set(name: string, value: string): void;
sort(): void;
values(): Iterator<string>;
toString(): string;
}
type CacheType = 'default' | 'no-store' | 'reload' | 'no-cache' | 'force-cache' | 'only-if-cached';
type CredentialsType = 'omit' | 'same-origin' | 'include';
type ModeType = 'cors' | 'no-cors' | 'same-origin' | 'navigate';
type RedirectType = 'follow' | 'error' | 'manual';
type ReferrerPolicyType =
'' | 'no-referrer' | 'no-referrer-when-downgrade' | 'same-origin' |
'origin' | 'strict-origin' | 'origin-when-cross-origin' |
'strict-origin-when-cross-origin' | 'unsafe-url';
type ResponseType = 'basic' | 'cors' | 'default' | 'error' | 'opaque' | 'opaqueredirect' ;
type BodyInit = string | URLSearchParams | FormData | Blob | ArrayBuffer | $ArrayBufferView | $FlowFixMe;
type RequestInfo = Request | URL | string;
type RequestOptions = {
body?: ?BodyInit,
cache?: CacheType,
credentials?: CredentialsType,
headers?: HeadersInit,
integrity?: string,
keepalive?: boolean,
method?: string,
mode?: ModeType,
redirect?: RedirectType,
referrer?: string,
referrerPolicy?: ReferrerPolicyType,
signal?: ?AbortSignal,
window?: any,
...
}
type ResponseOptions = {
status?: number,
statusText?: string,
headers?: HeadersInit,
...
}
declare class Response {
constructor(input?: ?BodyInit, init?: ResponseOptions): void;
clone(): Response;
static error(): Response;
static redirect(url: string, status?: number): Response;
redirected: boolean;
type: ResponseType;
url: string;
ok: boolean;
status: number;
statusText: string;
headers: Headers;
trailer: Promise<Headers>;
// Body methods and attributes
bodyUsed: boolean;
body: ?$FlowFixMe,
arrayBuffer(): Promise<ArrayBuffer>;
blob(): Promise<Blob>;
formData(): Promise<FormData>;
json(): Promise<any>;
text(): Promise<string>;
}
declare class Request {
constructor(input: RequestInfo, init?: RequestOptions): void;
clone(): Request;
url: string;
cache: CacheType;
credentials: CredentialsType;
headers: Headers;
integrity: string;
method: string;
mode: ModeType;
redirect: RedirectType;
referrer: string;
referrerPolicy: ReferrerPolicyType;
+signal: AbortSignal;
// Body methods and attributes
bodyUsed: boolean;
arrayBuffer(): Promise<ArrayBuffer>;
blob(): Promise<Blob>;
formData(): Promise<FormData>;
json(): Promise<any>;
text(): Promise<string>;
}
declare class AbortController {