diff --git a/.changeset/kind-falcons-jump.md b/.changeset/kind-falcons-jump.md
new file mode 100644
index 000000000..7ed51ec7a
--- /dev/null
+++ b/.changeset/kind-falcons-jump.md
@@ -0,0 +1,5 @@
+---
+'@edge-runtime/feature-detector': patch
+---
+
+introduce hasEdgeSignature detection utility
diff --git a/docs/pages/packages/_meta.json b/docs/pages/packages/_meta.json
index 575d79b33..aabdae619 100644
--- a/docs/pages/packages/_meta.json
+++ b/docs/pages/packages/_meta.json
@@ -1,5 +1,6 @@
{
"cookies": "@edge-runtime/cookies",
+ "feature-detector": "@edge-runtime/feature-detector",
"format": "@edge-runtime/format",
"jest-environment": "@edge-runtime/jest-environment",
"jest-expect": "@edge-runtime/jest-expect",
diff --git a/docs/pages/packages/feature-detector.mdx b/docs/pages/packages/feature-detector.mdx
new file mode 100644
index 000000000..8983039f9
--- /dev/null
+++ b/docs/pages/packages/feature-detector.mdx
@@ -0,0 +1,50 @@
+import { Callout } from 'nextra-theme-docs'
+import { Tabs, Tab } from '../../components/tabs'
+
+# Edge Runtime Code analysis utilities
+
+The **@edge-runtime/feature-detector** package contains utilities to analyze code running on the edge and its used low-level APIs.
+
+It leverages the excellent [ts-morph](https://ts-morph.com/) package, which is a wrapper around TypeScript compiler API to navigate its Abstract Syntaxt Tree (AST).
+
+It can analyse JavaScript and TypeScript code.
+
+
+ Please note this is an alpha version.
+
+
+## Installation
+
+
+ ```sh npm install @edge-runtime/feature-detector --save ```
+ ```sh yarn add @edge-runtime/feature-detector ```
+ ```sh pnpm install @edge-runtime/feature-detector --save ```
+
+
+This package includes built-in TypeScript support.
+
+## Usage
+
+Here is an example of checking whether a file's default export is a function matching the edge signature, such as:
+
+```js
+export default function () {
+ return Response.json({ message: 'hello world!' })
+}
+```
+
+```ts
+import { hasEdgeSignature } from '@edge-runtime/feature-detector'
+
+const sourceFilePath = './test.js' // could be TypeScript as well. Must be in current working directory
+
+if (hasEdgeSignature(sourceFilePath)) {
+ console.log(`${sourcefilePath} can run on the edge``)
+}
+```
+
+## API
+
+
+ Work in progress
+
diff --git a/packages/feature-detector/README.md b/packages/feature-detector/README.md
new file mode 100644
index 000000000..c62ed7475
--- /dev/null
+++ b/packages/feature-detector/README.md
@@ -0,0 +1,38 @@
+
+
+
![edge-runtime logo](https://edge-runtime.vercel.app/og-image.png)
+
+
+
@edge-runtime/feature-detector: utilities to analyze code running on the edge and its used low-level APIs.
+
See @edge-runtime/feature-detector section in our website for more information.
+
+
+
+## Install
+
+**Note: this is an alpha version.**
+
+Using npm:
+
+```sh
+npm install @edge-runtime/feature-detector --save
+```
+
+or using yarn:
+
+```sh
+yarn add @edge-runtime/feature-detector --dev
+```
+
+or using pnpm:
+
+```sh
+pnpm install @edge-runtime/feature-detector --save
+```
+
+## License
+
+**@edge-runtime/feature-detector** © [Vercel](https://vercel.com), released under the [MPLv2](https://github.com/vercel/edge-runtime/blob/main/LICENSE.md) License.
+Authored and maintained by [Vercel](https://vercel.com) with help from [contributors](https://github.com/vercel/edge-runtime/contributors).
+
+> [vercel.com](https://vercel.com) · GitHub [Vercel](https://github.com/vercel) · Twitter [@vercel](https://twitter.com/vercel)
diff --git a/packages/feature-detector/jest.config.ts b/packages/feature-detector/jest.config.ts
new file mode 100644
index 000000000..737954c31
--- /dev/null
+++ b/packages/feature-detector/jest.config.ts
@@ -0,0 +1,6 @@
+import buildConfig from '../../jest.config'
+import type { Config } from '@jest/types'
+
+const config: Config.InitialOptions = buildConfig(__dirname)
+config.transform!['\\.txt$'] = 'jest-text-transformer'
+export default config
diff --git a/packages/feature-detector/package.json b/packages/feature-detector/package.json
new file mode 100644
index 000000000..b761bbe22
--- /dev/null
+++ b/packages/feature-detector/package.json
@@ -0,0 +1,40 @@
+{
+ "name": "@edge-runtime/feature-detector",
+ "description": "Helpers for analyzing code running on the edge and its used low-level APIs",
+ "homepage": "https://edge-runtime.vercel.app/packages/feature-detector",
+ "version": "1.0.0-alpha.1",
+ "main": "dist/index.js",
+ "module": "dist/index.mjs",
+ "repository": {
+ "directory": "packages/feature-detector",
+ "type": "git",
+ "url": "git+https://github.com/vercel/edge-runtime.git"
+ },
+ "bugs": {
+ "url": "https://github.com/vercel/edge-runtime/issues"
+ },
+ "keywords": [],
+ "devDependencies": {
+ "jest-text-transformer": "1.0.4",
+ "next": "^13.1.1",
+ "react": "~18.2.0",
+ "react-dom": "~18.2.0",
+ "tsup": "^6"
+ },
+ "scripts": {
+ "build": "pnpm run build:patch && pnpm run build:src",
+ "build:patch": "ts-node scripts/patch-type-definition.ts",
+ "build:src": "tsup",
+ "clean:build": "rm -rf dist",
+ "prebuild": "pnpm run clean:build",
+ "test": "jest"
+ },
+ "license": "MPLv2",
+ "publishConfig": {
+ "access": "public"
+ },
+ "types": "dist/index.d.ts",
+ "dependencies": {
+ "ts-morph": "^17.0.1"
+ }
+}
diff --git a/packages/feature-detector/scripts/patch-type-definition.ts b/packages/feature-detector/scripts/patch-type-definition.ts
new file mode 100644
index 000000000..beb782b7d
--- /dev/null
+++ b/packages/feature-detector/scripts/patch-type-definition.ts
@@ -0,0 +1,104 @@
+// assumes being ran in packages/feature-detector
+
+import { get } from 'node:https'
+import { writeFile } from 'node:fs/promises'
+import { join } from 'node:path'
+
+const repositoryBaseUrl =
+ 'https://raw.githubusercontent.com/microsoft/TypeScript/main/lib'
+const destinationFile = join('src', 'utils/type-definition.txt')
+
+async function writeTypeDefinition() {
+ const aggregatedContent = await fetchTypeDefinitions([
+ 'lib.es2022.d.ts',
+ 'lib.dom.d.ts',
+ ])
+ await writeFile(destinationFile, patchContent(aggregatedContent).join('\n'))
+}
+
+async function fetchTypeDefinitions(files: string[]) {
+ const result = []
+ for (const file of files) {
+ result.push(...(await fetchTypeDefinition(file)))
+ }
+ return result
+}
+
+async function fetchTypeDefinition(file: string): Promise {
+ // I wish we could use node@18's fetch...
+ const content = await new Promise((resolve, reject) =>
+ get(`${repositoryBaseUrl}/${file}`, (response) => {
+ let content = ''
+ response.setEncoding('utf8')
+ response.on('data', (chunk: string) => (content += chunk))
+ response.once('end', () => resolve(content))
+ response.once('error', reject)
+ })
+ )
+ const result = []
+ for (const line of content.split('\n')) {
+ const reference = hasReference(line)
+ if (reference) {
+ result.push(...(await fetchTypeDefinition(`lib.${reference}.d.ts`)))
+ } else {
+ result.push(line)
+ }
+ }
+ return result
+}
+
+function hasReference(line: string) {
+ const match = line.match(/^\/\/\/\s*/)
+ return match ? match[1] : null
+}
+
+function patchContent(lines: string[]) {
+ const result = []
+ let inComment = false
+ for (const line of lines) {
+ if (inComment) {
+ if (isMultiCommentEnd(line)) {
+ inComment = false
+ }
+ } else {
+ if (isMultiCommentStart(line)) {
+ inComment = true
+ } else if (!isSingleComment(line) && !isBlankLine(line)) {
+ result.push(...applyPatch(line))
+ }
+ }
+ }
+ return result
+}
+
+function applyPatch(line: string) {
+ if (line === 'declare var Response: {') {
+ // adding missing json static method
+ // https://fetch.spec.whatwg.org/#response-class
+ return [line, ' json(data?: any, init?: ResponseInit): Response;']
+ }
+ return [line]
+}
+
+function isMultiCommentStart(line: string) {
+ return /^\s*\/\*.*(? process.exit(0))
+ .catch((error) => {
+ console.log('Errored', error)
+ process.exit(1)
+ })
diff --git a/packages/feature-detector/src/has-edge-signature.ts b/packages/feature-detector/src/has-edge-signature.ts
new file mode 100644
index 000000000..e25fdc233
--- /dev/null
+++ b/packages/feature-detector/src/has-edge-signature.ts
@@ -0,0 +1,24 @@
+import { Project } from 'ts-morph'
+import { getDefaultExport } from './utils/exports'
+import { getReturnType } from './utils/functions'
+import { buildProject } from './utils/project'
+import { extractFromPromise, isSubClassOf } from './utils/types'
+
+/**
+ * Returns true if the default export of the provided file is a function returning a web Response object.
+ */
+export function hasEdgeSignature(
+ sourcePath: string,
+ project: Project = buildProject()
+) {
+ const sourceFile = project.addSourceFileAtPath(sourcePath)
+ const defaultExport = getDefaultExport(sourceFile)
+ if (!defaultExport) {
+ return false
+ }
+ const returnType = getReturnType(defaultExport)
+ if (!returnType) {
+ return false
+ }
+ return isSubClassOf(extractFromPromise(returnType), 'Response')
+}
diff --git a/packages/feature-detector/src/index.ts b/packages/feature-detector/src/index.ts
new file mode 100644
index 000000000..ccb422065
--- /dev/null
+++ b/packages/feature-detector/src/index.ts
@@ -0,0 +1 @@
+export * from './has-edge-signature'
diff --git a/packages/feature-detector/src/utils/exports.ts b/packages/feature-detector/src/utils/exports.ts
new file mode 100644
index 000000000..342f002fc
--- /dev/null
+++ b/packages/feature-detector/src/utils/exports.ts
@@ -0,0 +1,15 @@
+import { Node, SourceFile } from 'ts-morph'
+
+/**
+ * Get the default export of a modules, if any.
+ * Supported:
+ * - export definition: `export default function foo() {}`
+ * - exported declaration: `const foo = 'bar'; export default foo`
+ */
+export function getDefaultExport(sourceFile: SourceFile): Node | undefined {
+ const defaultExport = sourceFile.getDefaultExportSymbol()
+ return (
+ defaultExport?.getValueDeclaration() ??
+ defaultExport?.getDeclarations()?.[0] // when exporting a variable: `export default handler`
+ )
+}
diff --git a/packages/feature-detector/src/utils/functions.ts b/packages/feature-detector/src/utils/functions.ts
new file mode 100644
index 000000000..8252fd06b
--- /dev/null
+++ b/packages/feature-detector/src/utils/functions.ts
@@ -0,0 +1,25 @@
+import { Node, SyntaxKind, Type } from 'ts-morph'
+
+const { ExportAssignment, Identifier, FunctionDeclaration, ArrowFunction } =
+ SyntaxKind
+
+/**
+ * Exteracts the return type of a function, if any.
+ * Supports:
+ * - function declaration `function foo() {}`
+ * - function expression `const foo = function() {}`
+ * - arrow functions `const foo = () => {}`
+ * - module exports
+ */
+export function getReturnType(node?: Node): Type | undefined {
+ switch (node?.getKind()) {
+ case ExportAssignment:
+ return getReturnType(node.asKind(ExportAssignment)?.getExpression())
+ case Identifier:
+ return getReturnType(node.getSymbol()?.getValueDeclaration())
+ case FunctionDeclaration:
+ return node.asKind(FunctionDeclaration)?.getReturnType()
+ case ArrowFunction:
+ return node.asKind(ArrowFunction)?.getReturnType()
+ }
+}
diff --git a/packages/feature-detector/src/utils/project.ts b/packages/feature-detector/src/utils/project.ts
new file mode 100644
index 000000000..d90e742a0
--- /dev/null
+++ b/packages/feature-detector/src/utils/project.ts
@@ -0,0 +1,17 @@
+import { Project } from 'ts-morph'
+// @ts-ignore will be resolved by tsup & jest
+import typeDefinitionContent from './type-definition.txt'
+
+/**
+ * Builds a TS-morph project that allows JS code and loads our custom Response + Promise types
+ */
+export function buildProject() {
+ const project = new Project({
+ compilerOptions: {
+ allowJs: true,
+ },
+ })
+ project.createSourceFile('node_modules/index.d.ts', typeDefinitionContent)
+ project.addDirectoryAtPathIfExists('.')
+ return project
+}
diff --git a/packages/feature-detector/src/utils/type-definition.txt b/packages/feature-detector/src/utils/type-definition.txt
new file mode 100644
index 000000000..78cd5e167
--- /dev/null
+++ b/packages/feature-detector/src/utils/type-definition.txt
@@ -0,0 +1,18156 @@
+///
+///
+///
+///
+///
+///
+///
+///
+///
+declare var NaN: number;
+declare var Infinity: number;
+declare function eval(x: string): any;
+declare function parseInt(string: string, radix?: number): number;
+declare function parseFloat(string: string): number;
+declare function isNaN(number: number): boolean;
+declare function isFinite(number: number): boolean;
+declare function decodeURI(encodedURI: string): string;
+declare function decodeURIComponent(encodedURIComponent: string): string;
+declare function encodeURI(uri: string): string;
+declare function encodeURIComponent(uriComponent: string | number | boolean): string;
+declare function escape(string: string): string;
+declare function unescape(string: string): string;
+interface Symbol {
+ toString(): string;
+ valueOf(): symbol;
+}
+declare type PropertyKey = string | number | symbol;
+interface PropertyDescriptor {
+ configurable?: boolean;
+ enumerable?: boolean;
+ value?: any;
+ writable?: boolean;
+ get?(): any;
+ set?(v: any): void;
+}
+interface PropertyDescriptorMap {
+ [key: PropertyKey]: PropertyDescriptor;
+}
+interface Object {
+ constructor: Function;
+ toString(): string;
+ toLocaleString(): string;
+ valueOf(): Object;
+ hasOwnProperty(v: PropertyKey): boolean;
+ isPrototypeOf(v: Object): boolean;
+ propertyIsEnumerable(v: PropertyKey): boolean;
+}
+interface ObjectConstructor {
+ new(value?: any): Object;
+ (): any;
+ (value: any): any;
+ readonly prototype: Object;
+ getPrototypeOf(o: any): any;
+ getOwnPropertyDescriptor(o: any, p: PropertyKey): PropertyDescriptor | undefined;
+ getOwnPropertyNames(o: any): string[];
+ create(o: object | null): any;
+ create(o: object | null, properties: PropertyDescriptorMap & ThisType): any;
+ defineProperty(o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType): T;
+ defineProperties(o: T, properties: PropertyDescriptorMap & ThisType): T;
+ seal(o: T): T;
+ freeze(f: T): T;
+ freeze(o: T): Readonly;
+ freeze(o: T): Readonly;
+ preventExtensions(o: T): T;
+ isSealed(o: any): boolean;
+ isFrozen(o: any): boolean;
+ isExtensible(o: any): boolean;
+ keys(o: object): string[];
+}
+declare var Object: ObjectConstructor;
+interface Function {
+ apply(this: Function, thisArg: any, argArray?: any): any;
+ call(this: Function, thisArg: any, ...argArray: any[]): any;
+ bind(this: Function, thisArg: any, ...argArray: any[]): any;
+ toString(): string;
+ prototype: any;
+ readonly length: number;
+ arguments: any;
+ caller: Function;
+}
+interface FunctionConstructor {
+ new(...args: string[]): Function;
+ (...args: string[]): Function;
+ readonly prototype: Function;
+}
+declare var Function: FunctionConstructor;
+type ThisParameterType = T extends (this: infer U, ...args: never) => any ? U : unknown;
+type OmitThisParameter = unknown extends ThisParameterType ? T : T extends (...args: infer A) => infer R ? (...args: A) => R : T;
+interface CallableFunction extends Function {
+ apply(this: (this: T) => R, thisArg: T): R;
+ apply(this: (this: T, ...args: A) => R, thisArg: T, args: A): R;
+ call(this: (this: T, ...args: A) => R, thisArg: T, ...args: A): R;
+ bind(this: T, thisArg: ThisParameterType): OmitThisParameter;
+ bind(this: (this: T, arg0: A0, ...args: A) => R, thisArg: T, arg0: A0): (...args: A) => R;
+ bind(this: (this: T, arg0: A0, arg1: A1, ...args: A) => R, thisArg: T, arg0: A0, arg1: A1): (...args: A) => R;
+ bind(this: (this: T, arg0: A0, arg1: A1, arg2: A2, ...args: A) => R, thisArg: T, arg0: A0, arg1: A1, arg2: A2): (...args: A) => R;
+ bind(this: (this: T, arg0: A0, arg1: A1, arg2: A2, arg3: A3, ...args: A) => R, thisArg: T, arg0: A0, arg1: A1, arg2: A2, arg3: A3): (...args: A) => R;
+ bind(this: (this: T, ...args: AX[]) => R, thisArg: T, ...args: AX[]): (...args: AX[]) => R;
+}
+interface NewableFunction extends Function {
+ apply(this: new () => T, thisArg: T): void;
+ apply(this: new (...args: A) => T, thisArg: T, args: A): void;
+ call(this: new (...args: A) => T, thisArg: T, ...args: A): void;
+ bind(this: T, thisArg: any): T;
+ bind(this: new (arg0: A0, ...args: A) => R, thisArg: any, arg0: A0): new (...args: A) => R;
+ bind(this: new (arg0: A0, arg1: A1, ...args: A) => R, thisArg: any, arg0: A0, arg1: A1): new (...args: A) => R;
+ bind(this: new (arg0: A0, arg1: A1, arg2: A2, ...args: A) => R, thisArg: any, arg0: A0, arg1: A1, arg2: A2): new (...args: A) => R;
+ bind(this: new (arg0: A0, arg1: A1, arg2: A2, arg3: A3, ...args: A) => R, thisArg: any, arg0: A0, arg1: A1, arg2: A2, arg3: A3): new (...args: A) => R;
+ bind(this: new (...args: AX[]) => R, thisArg: any, ...args: AX[]): new (...args: AX[]) => R;
+}
+interface IArguments {
+ [index: number]: any;
+ length: number;
+ callee: Function;
+}
+interface String {
+ toString(): string;
+ charAt(pos: number): string;
+ charCodeAt(index: number): number;
+ concat(...strings: string[]): string;
+ indexOf(searchString: string, position?: number): number;
+ lastIndexOf(searchString: string, position?: number): number;
+ localeCompare(that: string): number;
+ match(regexp: string | RegExp): RegExpMatchArray | null;
+ replace(searchValue: string | RegExp, replaceValue: string): string;
+ replace(searchValue: string | RegExp, replacer: (substring: string, ...args: any[]) => string): string;
+ search(regexp: string | RegExp): number;
+ slice(start?: number, end?: number): string;
+ split(separator: string | RegExp, limit?: number): string[];
+ substring(start: number, end?: number): string;
+ toLowerCase(): string;
+ toLocaleLowerCase(locales?: string | string[]): string;
+ toUpperCase(): string;
+ toLocaleUpperCase(locales?: string | string[]): string;
+ trim(): string;
+ readonly length: number;
+ substr(from: number, length?: number): string;
+ valueOf(): string;
+ readonly [index: number]: string;
+}
+interface StringConstructor {
+ new(value?: any): String;
+ (value?: any): string;
+ readonly prototype: String;
+ fromCharCode(...codes: number[]): string;
+}
+declare var String: StringConstructor;
+interface Boolean {
+ valueOf(): boolean;
+}
+interface BooleanConstructor {
+ new(value?: any): Boolean;
+ (value?: T): boolean;
+ readonly prototype: Boolean;
+}
+declare var Boolean: BooleanConstructor;
+interface Number {
+ toString(radix?: number): string;
+ toFixed(fractionDigits?: number): string;
+ toExponential(fractionDigits?: number): string;
+ toPrecision(precision?: number): string;
+ valueOf(): number;
+}
+interface NumberConstructor {
+ new(value?: any): Number;
+ (value?: any): number;
+ readonly prototype: Number;
+ readonly MAX_VALUE: number;
+ readonly MIN_VALUE: number;
+ readonly NaN: number;
+ readonly NEGATIVE_INFINITY: number;
+ readonly POSITIVE_INFINITY: number;
+}
+declare var Number: NumberConstructor;
+interface TemplateStringsArray extends ReadonlyArray {
+ readonly raw: readonly string[];
+}
+interface ImportMeta {
+}
+interface ImportCallOptions {
+ assert?: ImportAssertions;
+}
+interface ImportAssertions {
+ [key: string]: string;
+}
+interface Math {
+ readonly E: number;
+ readonly LN10: number;
+ readonly LN2: number;
+ readonly LOG2E: number;
+ readonly LOG10E: number;
+ readonly PI: number;
+ readonly SQRT1_2: number;
+ readonly SQRT2: number;
+ abs(x: number): number;
+ acos(x: number): number;
+ asin(x: number): number;
+ atan(x: number): number;
+ atan2(y: number, x: number): number;
+ ceil(x: number): number;
+ cos(x: number): number;
+ exp(x: number): number;
+ floor(x: number): number;
+ log(x: number): number;
+ max(...values: number[]): number;
+ min(...values: number[]): number;
+ pow(x: number, y: number): number;
+ random(): number;
+ round(x: number): number;
+ sin(x: number): number;
+ sqrt(x: number): number;
+ tan(x: number): number;
+}
+declare var Math: Math;
+interface Date {
+ toString(): string;
+ toDateString(): string;
+ toTimeString(): string;
+ toLocaleString(): string;
+ toLocaleDateString(): string;
+ toLocaleTimeString(): string;
+ valueOf(): number;
+ getTime(): number;
+ getFullYear(): number;
+ getUTCFullYear(): number;
+ getMonth(): number;
+ getUTCMonth(): number;
+ getDate(): number;
+ getUTCDate(): number;
+ getDay(): number;
+ getUTCDay(): number;
+ getHours(): number;
+ getUTCHours(): number;
+ getMinutes(): number;
+ getUTCMinutes(): number;
+ getSeconds(): number;
+ getUTCSeconds(): number;
+ getMilliseconds(): number;
+ getUTCMilliseconds(): number;
+ getTimezoneOffset(): number;
+ setTime(time: number): number;
+ setMilliseconds(ms: number): number;
+ setUTCMilliseconds(ms: number): number;
+ setSeconds(sec: number, ms?: number): number;
+ setUTCSeconds(sec: number, ms?: number): number;
+ setMinutes(min: number, sec?: number, ms?: number): number;
+ setUTCMinutes(min: number, sec?: number, ms?: number): number;
+ setHours(hours: number, min?: number, sec?: number, ms?: number): number;
+ setUTCHours(hours: number, min?: number, sec?: number, ms?: number): number;
+ setDate(date: number): number;
+ setUTCDate(date: number): number;
+ setMonth(month: number, date?: number): number;
+ setUTCMonth(month: number, date?: number): number;
+ setFullYear(year: number, month?: number, date?: number): number;
+ setUTCFullYear(year: number, month?: number, date?: number): number;
+ toUTCString(): string;
+ toISOString(): string;
+ toJSON(key?: any): string;
+}
+interface DateConstructor {
+ new(): Date;
+ new(value: number | string): Date;
+ new(year: number, monthIndex: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date;
+ (): string;
+ readonly prototype: Date;
+ parse(s: string): number;
+ UTC(year: number, monthIndex: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): number;
+ now(): number;
+}
+declare var Date: DateConstructor;
+interface RegExpMatchArray extends Array {
+ index?: number;
+ input?: string;
+ 0: string;
+}
+interface RegExpExecArray extends Array {
+ index: number;
+ input: string;
+ 0: string;
+}
+interface RegExp {
+ exec(string: string): RegExpExecArray | null;
+ test(string: string): boolean;
+ readonly source: string;
+ readonly global: boolean;
+ readonly ignoreCase: boolean;
+ readonly multiline: boolean;
+ lastIndex: number;
+ compile(pattern: string, flags?: string): this;
+}
+interface RegExpConstructor {
+ new(pattern: RegExp | string): RegExp;
+ new(pattern: string, flags?: string): RegExp;
+ (pattern: RegExp | string): RegExp;
+ (pattern: string, flags?: string): RegExp;
+ readonly prototype: RegExp;
+ $1: string;
+ $2: string;
+ $3: string;
+ $4: string;
+ $5: string;
+ $6: string;
+ $7: string;
+ $8: string;
+ $9: string;
+ input: string;
+ $_: string;
+ lastMatch: string;
+ "$&": string;
+ lastParen: string;
+ "$+": string;
+ leftContext: string;
+ "$`": string;
+ rightContext: string;
+ "$'": string;
+}
+declare var RegExp: RegExpConstructor;
+interface Error {
+ name: string;
+ message: string;
+ stack?: string;
+}
+interface ErrorConstructor {
+ new(message?: string): Error;
+ (message?: string): Error;
+ readonly prototype: Error;
+}
+declare var Error: ErrorConstructor;
+interface EvalError extends Error {
+}
+interface EvalErrorConstructor extends ErrorConstructor {
+ new(message?: string): EvalError;
+ (message?: string): EvalError;
+ readonly prototype: EvalError;
+}
+declare var EvalError: EvalErrorConstructor;
+interface RangeError extends Error {
+}
+interface RangeErrorConstructor extends ErrorConstructor {
+ new(message?: string): RangeError;
+ (message?: string): RangeError;
+ readonly prototype: RangeError;
+}
+declare var RangeError: RangeErrorConstructor;
+interface ReferenceError extends Error {
+}
+interface ReferenceErrorConstructor extends ErrorConstructor {
+ new(message?: string): ReferenceError;
+ (message?: string): ReferenceError;
+ readonly prototype: ReferenceError;
+}
+declare var ReferenceError: ReferenceErrorConstructor;
+interface SyntaxError extends Error {
+}
+interface SyntaxErrorConstructor extends ErrorConstructor {
+ new(message?: string): SyntaxError;
+ (message?: string): SyntaxError;
+ readonly prototype: SyntaxError;
+}
+declare var SyntaxError: SyntaxErrorConstructor;
+interface TypeError extends Error {
+}
+interface TypeErrorConstructor extends ErrorConstructor {
+ new(message?: string): TypeError;
+ (message?: string): TypeError;
+ readonly prototype: TypeError;
+}
+declare var TypeError: TypeErrorConstructor;
+interface URIError extends Error {
+}
+interface URIErrorConstructor extends ErrorConstructor {
+ new(message?: string): URIError;
+ (message?: string): URIError;
+ readonly prototype: URIError;
+}
+declare var URIError: URIErrorConstructor;
+interface JSON {
+ parse(text: string, reviver?: (this: any, key: string, value: any) => any): any;
+ stringify(value: any, replacer?: (this: any, key: string, value: any) => any, space?: string | number): string;
+ stringify(value: any, replacer?: (number | string)[] | null, space?: string | number): string;
+}
+declare var JSON: JSON;
+interface ReadonlyArray {
+ readonly length: number;
+ toString(): string;
+ toLocaleString(): string;
+ concat(...items: ConcatArray[]): T[];
+ concat(...items: (T | ConcatArray)[]): T[];
+ join(separator?: string): string;
+ slice(start?: number, end?: number): T[];
+ indexOf(searchElement: T, fromIndex?: number): number;
+ lastIndexOf(searchElement: T, fromIndex?: number): number;
+ every(predicate: (value: T, index: number, array: readonly T[]) => value is S, thisArg?: any): this is readonly S[];
+ every(predicate: (value: T, index: number, array: readonly T[]) => unknown, thisArg?: any): boolean;
+ some(predicate: (value: T, index: number, array: readonly T[]) => unknown, thisArg?: any): boolean;
+ forEach(callbackfn: (value: T, index: number, array: readonly T[]) => void, thisArg?: any): void;
+ map(callbackfn: (value: T, index: number, array: readonly T[]) => U, thisArg?: any): U[];
+ filter(predicate: (value: T, index: number, array: readonly T[]) => value is S, thisArg?: any): S[];
+ filter(predicate: (value: T, index: number, array: readonly T[]) => unknown, thisArg?: any): T[];
+ reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T): T;
+ reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T, initialValue: T): T;
+ reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: readonly T[]) => U, initialValue: U): U;
+ reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T): T;
+ reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T, initialValue: T): T;
+ reduceRight(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: readonly T[]) => U, initialValue: U): U;
+ readonly [n: number]: T;
+}
+interface ConcatArray {
+ readonly length: number;
+ readonly [n: number]: T;
+ join(separator?: string): string;
+ slice(start?: number, end?: number): T[];
+}
+interface Array {
+ length: number;
+ toString(): string;
+ toLocaleString(): string;
+ pop(): T | undefined;
+ push(...items: T[]): number;
+ concat(...items: ConcatArray[]): T[];
+ concat(...items: (T | ConcatArray)[]): T[];
+ join(separator?: string): string;
+ reverse(): T[];
+ shift(): T | undefined;
+ slice(start?: number, end?: number): T[];
+ sort(compareFn?: (a: T, b: T) => number): this;
+ splice(start: number, deleteCount?: number): T[];
+ splice(start: number, deleteCount: number, ...items: T[]): T[];
+ unshift(...items: T[]): number;
+ indexOf(searchElement: T, fromIndex?: number): number;
+ lastIndexOf(searchElement: T, fromIndex?: number): number;
+ every(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): this is S[];
+ every(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean;
+ some(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean;
+ forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void;
+ map(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];
+ filter(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[];
+ filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[];
+ reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): T;
+ reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue: T): T;
+ reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;
+ reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): T;
+ reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue: T): T;
+ reduceRight(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;
+ [n: number]: T;
+}
+interface ArrayConstructor {
+ new(arrayLength?: number): any[];
+ new (arrayLength: number): T[];
+ new (...items: T[]): T[];
+ (arrayLength?: number): any[];
+ (arrayLength: number): T[];
+ (...items: T[]): T[];
+ isArray(arg: any): arg is any[];
+ readonly prototype: any[];
+}
+declare var Array: ArrayConstructor;
+interface TypedPropertyDescriptor {
+ enumerable?: boolean;
+ configurable?: boolean;
+ writable?: boolean;
+ value?: T;
+ get?: () => T;
+ set?: (value: T) => void;
+}
+declare type ClassDecorator = (target: TFunction) => TFunction | void;
+declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;
+declare type MethodDecorator = (target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor | void;
+declare type ParameterDecorator = (target: Object, propertyKey: string | symbol, parameterIndex: number) => void;
+declare type PromiseConstructorLike = new (executor: (resolve: (value: T | PromiseLike) => void, reject: (reason?: any) => void) => void) => PromiseLike;
+interface PromiseLike {
+ then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): PromiseLike;
+}
+interface Promise {
+ then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): Promise;
+ catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): Promise;
+}
+type Awaited =
+ T extends null | undefined ? T : // special case for `null | undefined` when not in `--strictNullChecks` mode
+ T extends object & { then(onfulfilled: infer F, ...args: infer _): any } ? // `await` only unwraps object types with a callable `then`. Non-object types are not unwrapped
+ F extends ((value: infer V, ...args: infer _) => any) ? // if the argument to `then` is callable, extracts the first argument
+ Awaited : // recursively unwrap the value
+ never : // the argument to `then` was not callable
+ T; // non-object or non-thenable
+interface ArrayLike {
+ readonly length: number;
+ readonly [n: number]: T;
+}
+type Partial = {
+ [P in keyof T]?: T[P];
+};
+type Required = {
+ [P in keyof T]-?: T[P];
+};
+type Readonly = {
+ readonly [P in keyof T]: T[P];
+};
+type Pick = {
+ [P in K]: T[P];
+};
+type Record = {
+ [P in K]: T;
+};
+type Exclude = T extends U ? never : T;
+type Extract = T extends U ? T : never;
+type Omit = Pick>;
+type NonNullable = T & {};
+type Parameters any> = T extends (...args: infer P) => any ? P : never;
+type ConstructorParameters any> = T extends abstract new (...args: infer P) => any ? P : never;
+type ReturnType any> = T extends (...args: any) => infer R ? R : any;
+type InstanceType any> = T extends abstract new (...args: any) => infer R ? R : any;
+type Uppercase = intrinsic;
+type Lowercase = intrinsic;
+type Capitalize = intrinsic;
+type Uncapitalize = intrinsic;
+interface ThisType { }
+interface ArrayBuffer {
+ readonly byteLength: number;
+ slice(begin: number, end?: number): ArrayBuffer;
+}
+interface ArrayBufferTypes {
+ ArrayBuffer: ArrayBuffer;
+}
+type ArrayBufferLike = ArrayBufferTypes[keyof ArrayBufferTypes];
+interface ArrayBufferConstructor {
+ readonly prototype: ArrayBuffer;
+ new(byteLength: number): ArrayBuffer;
+ isView(arg: any): arg is ArrayBufferView;
+}
+declare var ArrayBuffer: ArrayBufferConstructor;
+interface ArrayBufferView {
+ buffer: ArrayBufferLike;
+ byteLength: number;
+ byteOffset: number;
+}
+interface DataView {
+ readonly buffer: ArrayBuffer;
+ readonly byteLength: number;
+ readonly byteOffset: number;
+ getFloat32(byteOffset: number, littleEndian?: boolean): number;
+ getFloat64(byteOffset: number, littleEndian?: boolean): number;
+ getInt8(byteOffset: number): number;
+ getInt16(byteOffset: number, littleEndian?: boolean): number;
+ getInt32(byteOffset: number, littleEndian?: boolean): number;
+ getUint8(byteOffset: number): number;
+ getUint16(byteOffset: number, littleEndian?: boolean): number;
+ getUint32(byteOffset: number, littleEndian?: boolean): number;
+ setFloat32(byteOffset: number, value: number, littleEndian?: boolean): void;
+ setFloat64(byteOffset: number, value: number, littleEndian?: boolean): void;
+ setInt8(byteOffset: number, value: number): void;
+ setInt16(byteOffset: number, value: number, littleEndian?: boolean): void;
+ setInt32(byteOffset: number, value: number, littleEndian?: boolean): void;
+ setUint8(byteOffset: number, value: number): void;
+ setUint16(byteOffset: number, value: number, littleEndian?: boolean): void;
+ setUint32(byteOffset: number, value: number, littleEndian?: boolean): void;
+}
+interface DataViewConstructor {
+ readonly prototype: DataView;
+ new(buffer: ArrayBufferLike, byteOffset?: number, byteLength?: number): DataView;
+}
+declare var DataView: DataViewConstructor;
+interface Int8Array {
+ readonly BYTES_PER_ELEMENT: number;
+ readonly buffer: ArrayBufferLike;
+ readonly byteLength: number;
+ readonly byteOffset: number;
+ copyWithin(target: number, start: number, end?: number): this;
+ every(predicate: (value: number, index: number, array: Int8Array) => unknown, thisArg?: any): boolean;
+ fill(value: number, start?: number, end?: number): this;
+ filter(predicate: (value: number, index: number, array: Int8Array) => any, thisArg?: any): Int8Array;
+ find(predicate: (value: number, index: number, obj: Int8Array) => boolean, thisArg?: any): number | undefined;
+ findIndex(predicate: (value: number, index: number, obj: Int8Array) => boolean, thisArg?: any): number;
+ forEach(callbackfn: (value: number, index: number, array: Int8Array) => void, thisArg?: any): void;
+ indexOf(searchElement: number, fromIndex?: number): number;
+ join(separator?: string): string;
+ lastIndexOf(searchElement: number, fromIndex?: number): number;
+ readonly length: number;
+ map(callbackfn: (value: number, index: number, array: Int8Array) => number, thisArg?: any): Int8Array;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number): number;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue: number): number;
+ reduce(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number): number;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue: number): number;
+ reduceRight(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;
+ reverse(): Int8Array;
+ set(array: ArrayLike, offset?: number): void;
+ slice(start?: number, end?: number): Int8Array;
+ some(predicate: (value: number, index: number, array: Int8Array) => unknown, thisArg?: any): boolean;
+ sort(compareFn?: (a: number, b: number) => number): this;
+ subarray(begin?: number, end?: number): Int8Array;
+ toLocaleString(): string;
+ toString(): string;
+ valueOf(): Int8Array;
+ [index: number]: number;
+}
+interface Int8ArrayConstructor {
+ readonly prototype: Int8Array;
+ new(length: number): Int8Array;
+ new(array: ArrayLike | ArrayBufferLike): Int8Array;
+ new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int8Array;
+ readonly BYTES_PER_ELEMENT: number;
+ of(...items: number[]): Int8Array;
+ from(arrayLike: ArrayLike): Int8Array;
+ from(arrayLike: ArrayLike, mapfn: (v: T, k: number) => number, thisArg?: any): Int8Array;
+}
+declare var Int8Array: Int8ArrayConstructor;
+interface Uint8Array {
+ readonly BYTES_PER_ELEMENT: number;
+ readonly buffer: ArrayBufferLike;
+ readonly byteLength: number;
+ readonly byteOffset: number;
+ copyWithin(target: number, start: number, end?: number): this;
+ every(predicate: (value: number, index: number, array: Uint8Array) => unknown, thisArg?: any): boolean;
+ fill(value: number, start?: number, end?: number): this;
+ filter(predicate: (value: number, index: number, array: Uint8Array) => any, thisArg?: any): Uint8Array;
+ find(predicate: (value: number, index: number, obj: Uint8Array) => boolean, thisArg?: any): number | undefined;
+ findIndex(predicate: (value: number, index: number, obj: Uint8Array) => boolean, thisArg?: any): number;
+ forEach(callbackfn: (value: number, index: number, array: Uint8Array) => void, thisArg?: any): void;
+ indexOf(searchElement: number, fromIndex?: number): number;
+ join(separator?: string): string;
+ lastIndexOf(searchElement: number, fromIndex?: number): number;
+ readonly length: number;
+ map(callbackfn: (value: number, index: number, array: Uint8Array) => number, thisArg?: any): Uint8Array;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number): number;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue: number): number;
+ reduce(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number): number;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue: number): number;
+ reduceRight(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;
+ reverse(): Uint8Array;
+ set(array: ArrayLike, offset?: number): void;
+ slice(start?: number, end?: number): Uint8Array;
+ some(predicate: (value: number, index: number, array: Uint8Array) => unknown, thisArg?: any): boolean;
+ sort(compareFn?: (a: number, b: number) => number): this;
+ subarray(begin?: number, end?: number): Uint8Array;
+ toLocaleString(): string;
+ toString(): string;
+ valueOf(): Uint8Array;
+ [index: number]: number;
+}
+interface Uint8ArrayConstructor {
+ readonly prototype: Uint8Array;
+ new(length: number): Uint8Array;
+ new(array: ArrayLike | ArrayBufferLike): Uint8Array;
+ new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint8Array;
+ readonly BYTES_PER_ELEMENT: number;
+ of(...items: number[]): Uint8Array;
+ from(arrayLike: ArrayLike): Uint8Array;
+ from(arrayLike: ArrayLike, mapfn: (v: T, k: number) => number, thisArg?: any): Uint8Array;
+}
+declare var Uint8Array: Uint8ArrayConstructor;
+interface Uint8ClampedArray {
+ readonly BYTES_PER_ELEMENT: number;
+ readonly buffer: ArrayBufferLike;
+ readonly byteLength: number;
+ readonly byteOffset: number;
+ copyWithin(target: number, start: number, end?: number): this;
+ every(predicate: (value: number, index: number, array: Uint8ClampedArray) => unknown, thisArg?: any): boolean;
+ fill(value: number, start?: number, end?: number): this;
+ filter(predicate: (value: number, index: number, array: Uint8ClampedArray) => any, thisArg?: any): Uint8ClampedArray;
+ find(predicate: (value: number, index: number, obj: Uint8ClampedArray) => boolean, thisArg?: any): number | undefined;
+ findIndex(predicate: (value: number, index: number, obj: Uint8ClampedArray) => boolean, thisArg?: any): number;
+ forEach(callbackfn: (value: number, index: number, array: Uint8ClampedArray) => void, thisArg?: any): void;
+ indexOf(searchElement: number, fromIndex?: number): number;
+ join(separator?: string): string;
+ lastIndexOf(searchElement: number, fromIndex?: number): number;
+ readonly length: number;
+ map(callbackfn: (value: number, index: number, array: Uint8ClampedArray) => number, thisArg?: any): Uint8ClampedArray;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number): number;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number, initialValue: number): number;
+ reduce(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => U, initialValue: U): U;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number): number;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number, initialValue: number): number;
+ reduceRight(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => U, initialValue: U): U;
+ reverse(): Uint8ClampedArray;
+ set(array: ArrayLike, offset?: number): void;
+ slice(start?: number, end?: number): Uint8ClampedArray;
+ some(predicate: (value: number, index: number, array: Uint8ClampedArray) => unknown, thisArg?: any): boolean;
+ sort(compareFn?: (a: number, b: number) => number): this;
+ subarray(begin?: number, end?: number): Uint8ClampedArray;
+ toLocaleString(): string;
+ toString(): string;
+ valueOf(): Uint8ClampedArray;
+ [index: number]: number;
+}
+interface Uint8ClampedArrayConstructor {
+ readonly prototype: Uint8ClampedArray;
+ new(length: number): Uint8ClampedArray;
+ new(array: ArrayLike | ArrayBufferLike): Uint8ClampedArray;
+ new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint8ClampedArray;
+ readonly BYTES_PER_ELEMENT: number;
+ of(...items: number[]): Uint8ClampedArray;
+ from(arrayLike: ArrayLike): Uint8ClampedArray;
+ from(arrayLike: ArrayLike, mapfn: (v: T, k: number) => number, thisArg?: any): Uint8ClampedArray;
+}
+declare var Uint8ClampedArray: Uint8ClampedArrayConstructor;
+interface Int16Array {
+ readonly BYTES_PER_ELEMENT: number;
+ readonly buffer: ArrayBufferLike;
+ readonly byteLength: number;
+ readonly byteOffset: number;
+ copyWithin(target: number, start: number, end?: number): this;
+ every(predicate: (value: number, index: number, array: Int16Array) => unknown, thisArg?: any): boolean;
+ fill(value: number, start?: number, end?: number): this;
+ filter(predicate: (value: number, index: number, array: Int16Array) => any, thisArg?: any): Int16Array;
+ find(predicate: (value: number, index: number, obj: Int16Array) => boolean, thisArg?: any): number | undefined;
+ findIndex(predicate: (value: number, index: number, obj: Int16Array) => boolean, thisArg?: any): number;
+ forEach(callbackfn: (value: number, index: number, array: Int16Array) => void, thisArg?: any): void;
+ indexOf(searchElement: number, fromIndex?: number): number;
+ join(separator?: string): string;
+ lastIndexOf(searchElement: number, fromIndex?: number): number;
+ readonly length: number;
+ map(callbackfn: (value: number, index: number, array: Int16Array) => number, thisArg?: any): Int16Array;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number): number;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number, initialValue: number): number;
+ reduce(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int16Array) => U, initialValue: U): U;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number): number;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number, initialValue: number): number;
+ reduceRight(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int16Array) => U, initialValue: U): U;
+ reverse(): Int16Array;
+ set(array: ArrayLike, offset?: number): void;
+ slice(start?: number, end?: number): Int16Array;
+ some(predicate: (value: number, index: number, array: Int16Array) => unknown, thisArg?: any): boolean;
+ sort(compareFn?: (a: number, b: number) => number): this;
+ subarray(begin?: number, end?: number): Int16Array;
+ toLocaleString(): string;
+ toString(): string;
+ valueOf(): Int16Array;
+ [index: number]: number;
+}
+interface Int16ArrayConstructor {
+ readonly prototype: Int16Array;
+ new(length: number): Int16Array;
+ new(array: ArrayLike | ArrayBufferLike): Int16Array;
+ new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int16Array;
+ readonly BYTES_PER_ELEMENT: number;
+ of(...items: number[]): Int16Array;
+ from(arrayLike: ArrayLike): Int16Array;
+ from(arrayLike: ArrayLike, mapfn: (v: T, k: number) => number, thisArg?: any): Int16Array;
+}
+declare var Int16Array: Int16ArrayConstructor;
+interface Uint16Array {
+ readonly BYTES_PER_ELEMENT: number;
+ readonly buffer: ArrayBufferLike;
+ readonly byteLength: number;
+ readonly byteOffset: number;
+ copyWithin(target: number, start: number, end?: number): this;
+ every(predicate: (value: number, index: number, array: Uint16Array) => unknown, thisArg?: any): boolean;
+ fill(value: number, start?: number, end?: number): this;
+ filter(predicate: (value: number, index: number, array: Uint16Array) => any, thisArg?: any): Uint16Array;
+ find(predicate: (value: number, index: number, obj: Uint16Array) => boolean, thisArg?: any): number | undefined;
+ findIndex(predicate: (value: number, index: number, obj: Uint16Array) => boolean, thisArg?: any): number;
+ forEach(callbackfn: (value: number, index: number, array: Uint16Array) => void, thisArg?: any): void;
+ indexOf(searchElement: number, fromIndex?: number): number;
+ join(separator?: string): string;
+ lastIndexOf(searchElement: number, fromIndex?: number): number;
+ readonly length: number;
+ map(callbackfn: (value: number, index: number, array: Uint16Array) => number, thisArg?: any): Uint16Array;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number): number;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number, initialValue: number): number;
+ reduce(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint16Array) => U, initialValue: U): U;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number): number;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number, initialValue: number): number;
+ reduceRight(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint16Array) => U, initialValue: U): U;
+ reverse(): Uint16Array;
+ set(array: ArrayLike, offset?: number): void;
+ slice(start?: number, end?: number): Uint16Array;
+ some(predicate: (value: number, index: number, array: Uint16Array) => unknown, thisArg?: any): boolean;
+ sort(compareFn?: (a: number, b: number) => number): this;
+ subarray(begin?: number, end?: number): Uint16Array;
+ toLocaleString(): string;
+ toString(): string;
+ valueOf(): Uint16Array;
+ [index: number]: number;
+}
+interface Uint16ArrayConstructor {
+ readonly prototype: Uint16Array;
+ new(length: number): Uint16Array;
+ new(array: ArrayLike | ArrayBufferLike): Uint16Array;
+ new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint16Array;
+ readonly BYTES_PER_ELEMENT: number;
+ of(...items: number[]): Uint16Array;
+ from(arrayLike: ArrayLike): Uint16Array;
+ from(arrayLike: ArrayLike, mapfn: (v: T, k: number) => number, thisArg?: any): Uint16Array;
+}
+declare var Uint16Array: Uint16ArrayConstructor;
+interface Int32Array {
+ readonly BYTES_PER_ELEMENT: number;
+ readonly buffer: ArrayBufferLike;
+ readonly byteLength: number;
+ readonly byteOffset: number;
+ copyWithin(target: number, start: number, end?: number): this;
+ every(predicate: (value: number, index: number, array: Int32Array) => unknown, thisArg?: any): boolean;
+ fill(value: number, start?: number, end?: number): this;
+ filter(predicate: (value: number, index: number, array: Int32Array) => any, thisArg?: any): Int32Array;
+ find(predicate: (value: number, index: number, obj: Int32Array) => boolean, thisArg?: any): number | undefined;
+ findIndex(predicate: (value: number, index: number, obj: Int32Array) => boolean, thisArg?: any): number;
+ forEach(callbackfn: (value: number, index: number, array: Int32Array) => void, thisArg?: any): void;
+ indexOf(searchElement: number, fromIndex?: number): number;
+ join(separator?: string): string;
+ lastIndexOf(searchElement: number, fromIndex?: number): number;
+ readonly length: number;
+ map(callbackfn: (value: number, index: number, array: Int32Array) => number, thisArg?: any): Int32Array;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number): number;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number, initialValue: number): number;
+ reduce(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int32Array) => U, initialValue: U): U;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number): number;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number, initialValue: number): number;
+ reduceRight(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int32Array) => U, initialValue: U): U;
+ reverse(): Int32Array;
+ set(array: ArrayLike, offset?: number): void;
+ slice(start?: number, end?: number): Int32Array;
+ some(predicate: (value: number, index: number, array: Int32Array) => unknown, thisArg?: any): boolean;
+ sort(compareFn?: (a: number, b: number) => number): this;
+ subarray(begin?: number, end?: number): Int32Array;
+ toLocaleString(): string;
+ toString(): string;
+ valueOf(): Int32Array;
+ [index: number]: number;
+}
+interface Int32ArrayConstructor {
+ readonly prototype: Int32Array;
+ new(length: number): Int32Array;
+ new(array: ArrayLike | ArrayBufferLike): Int32Array;
+ new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int32Array;
+ readonly BYTES_PER_ELEMENT: number;
+ of(...items: number[]): Int32Array;
+ from(arrayLike: ArrayLike): Int32Array;
+ from(arrayLike: ArrayLike, mapfn: (v: T, k: number) => number, thisArg?: any): Int32Array;
+}
+declare var Int32Array: Int32ArrayConstructor;
+interface Uint32Array {
+ readonly BYTES_PER_ELEMENT: number;
+ readonly buffer: ArrayBufferLike;
+ readonly byteLength: number;
+ readonly byteOffset: number;
+ copyWithin(target: number, start: number, end?: number): this;
+ every(predicate: (value: number, index: number, array: Uint32Array) => unknown, thisArg?: any): boolean;
+ fill(value: number, start?: number, end?: number): this;
+ filter(predicate: (value: number, index: number, array: Uint32Array) => any, thisArg?: any): Uint32Array;
+ find(predicate: (value: number, index: number, obj: Uint32Array) => boolean, thisArg?: any): number | undefined;
+ findIndex(predicate: (value: number, index: number, obj: Uint32Array) => boolean, thisArg?: any): number;
+ forEach(callbackfn: (value: number, index: number, array: Uint32Array) => void, thisArg?: any): void;
+ indexOf(searchElement: number, fromIndex?: number): number;
+ join(separator?: string): string;
+ lastIndexOf(searchElement: number, fromIndex?: number): number;
+ readonly length: number;
+ map(callbackfn: (value: number, index: number, array: Uint32Array) => number, thisArg?: any): Uint32Array;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number): number;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number, initialValue: number): number;
+ reduce(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint32Array) => U, initialValue: U): U;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number): number;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number, initialValue: number): number;
+ reduceRight(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint32Array) => U, initialValue: U): U;
+ reverse(): Uint32Array;
+ set(array: ArrayLike, offset?: number): void;
+ slice(start?: number, end?: number): Uint32Array;
+ some(predicate: (value: number, index: number, array: Uint32Array) => unknown, thisArg?: any): boolean;
+ sort(compareFn?: (a: number, b: number) => number): this;
+ subarray(begin?: number, end?: number): Uint32Array;
+ toLocaleString(): string;
+ toString(): string;
+ valueOf(): Uint32Array;
+ [index: number]: number;
+}
+interface Uint32ArrayConstructor {
+ readonly prototype: Uint32Array;
+ new(length: number): Uint32Array;
+ new(array: ArrayLike | ArrayBufferLike): Uint32Array;
+ new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint32Array;
+ readonly BYTES_PER_ELEMENT: number;
+ of(...items: number[]): Uint32Array;
+ from(arrayLike: ArrayLike): Uint32Array;
+ from(arrayLike: ArrayLike, mapfn: (v: T, k: number) => number, thisArg?: any): Uint32Array;
+}
+declare var Uint32Array: Uint32ArrayConstructor;
+interface Float32Array {
+ readonly BYTES_PER_ELEMENT: number;
+ readonly buffer: ArrayBufferLike;
+ readonly byteLength: number;
+ readonly byteOffset: number;
+ copyWithin(target: number, start: number, end?: number): this;
+ every(predicate: (value: number, index: number, array: Float32Array) => unknown, thisArg?: any): boolean;
+ fill(value: number, start?: number, end?: number): this;
+ filter(predicate: (value: number, index: number, array: Float32Array) => any, thisArg?: any): Float32Array;
+ find(predicate: (value: number, index: number, obj: Float32Array) => boolean, thisArg?: any): number | undefined;
+ findIndex(predicate: (value: number, index: number, obj: Float32Array) => boolean, thisArg?: any): number;
+ forEach(callbackfn: (value: number, index: number, array: Float32Array) => void, thisArg?: any): void;
+ indexOf(searchElement: number, fromIndex?: number): number;
+ join(separator?: string): string;
+ lastIndexOf(searchElement: number, fromIndex?: number): number;
+ readonly length: number;
+ map(callbackfn: (value: number, index: number, array: Float32Array) => number, thisArg?: any): Float32Array;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number): number;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number, initialValue: number): number;
+ reduce(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float32Array) => U, initialValue: U): U;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number): number;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number, initialValue: number): number;
+ reduceRight(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float32Array) => U, initialValue: U): U;
+ reverse(): Float32Array;
+ set(array: ArrayLike, offset?: number): void;
+ slice(start?: number, end?: number): Float32Array;
+ some(predicate: (value: number, index: number, array: Float32Array) => unknown, thisArg?: any): boolean;
+ sort(compareFn?: (a: number, b: number) => number): this;
+ subarray(begin?: number, end?: number): Float32Array;
+ toLocaleString(): string;
+ toString(): string;
+ valueOf(): Float32Array;
+ [index: number]: number;
+}
+interface Float32ArrayConstructor {
+ readonly prototype: Float32Array;
+ new(length: number): Float32Array;
+ new(array: ArrayLike | ArrayBufferLike): Float32Array;
+ new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Float32Array;
+ readonly BYTES_PER_ELEMENT: number;
+ of(...items: number[]): Float32Array;
+ from(arrayLike: ArrayLike): Float32Array;
+ from(arrayLike: ArrayLike, mapfn: (v: T, k: number) => number, thisArg?: any): Float32Array;
+}
+declare var Float32Array: Float32ArrayConstructor;
+interface Float64Array {
+ readonly BYTES_PER_ELEMENT: number;
+ readonly buffer: ArrayBufferLike;
+ readonly byteLength: number;
+ readonly byteOffset: number;
+ copyWithin(target: number, start: number, end?: number): this;
+ every(predicate: (value: number, index: number, array: Float64Array) => unknown, thisArg?: any): boolean;
+ fill(value: number, start?: number, end?: number): this;
+ filter(predicate: (value: number, index: number, array: Float64Array) => any, thisArg?: any): Float64Array;
+ find(predicate: (value: number, index: number, obj: Float64Array) => boolean, thisArg?: any): number | undefined;
+ findIndex(predicate: (value: number, index: number, obj: Float64Array) => boolean, thisArg?: any): number;
+ forEach(callbackfn: (value: number, index: number, array: Float64Array) => void, thisArg?: any): void;
+ indexOf(searchElement: number, fromIndex?: number): number;
+ join(separator?: string): string;
+ lastIndexOf(searchElement: number, fromIndex?: number): number;
+ readonly length: number;
+ map(callbackfn: (value: number, index: number, array: Float64Array) => number, thisArg?: any): Float64Array;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number): number;
+ reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number, initialValue: number): number;
+ reduce(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float64Array) => U, initialValue: U): U;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number): number;
+ reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number, initialValue: number): number;
+ reduceRight(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float64Array) => U, initialValue: U): U;
+ reverse(): Float64Array;
+ set(array: ArrayLike, offset?: number): void;
+ slice(start?: number, end?: number): Float64Array;
+ some(predicate: (value: number, index: number, array: Float64Array) => unknown, thisArg?: any): boolean;
+ sort(compareFn?: (a: number, b: number) => number): this;
+ subarray(begin?: number, end?: number): Float64Array;
+ toString(): string;
+ valueOf(): Float64Array;
+ [index: number]: number;
+}
+interface Float64ArrayConstructor {
+ readonly prototype: Float64Array;
+ new(length: number): Float64Array;
+ new(array: ArrayLike | ArrayBufferLike): Float64Array;
+ new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Float64Array;
+ readonly BYTES_PER_ELEMENT: number;
+ of(...items: number[]): Float64Array;
+ from(arrayLike: ArrayLike): Float64Array;
+ from(arrayLike: ArrayLike, mapfn: (v: T, k: number) => number, thisArg?: any): Float64Array;
+}
+declare var Float64Array: Float64ArrayConstructor;
+declare namespace Intl {
+ interface CollatorOptions {
+ usage?: string | undefined;
+ localeMatcher?: string | undefined;
+ numeric?: boolean | undefined;
+ caseFirst?: string | undefined;
+ sensitivity?: string | undefined;
+ ignorePunctuation?: boolean | undefined;
+ }
+ interface ResolvedCollatorOptions {
+ locale: string;
+ usage: string;
+ sensitivity: string;
+ ignorePunctuation: boolean;
+ collation: string;
+ caseFirst: string;
+ numeric: boolean;
+ }
+ interface Collator {
+ compare(x: string, y: string): number;
+ resolvedOptions(): ResolvedCollatorOptions;
+ }
+ var Collator: {
+ new(locales?: string | string[], options?: CollatorOptions): Collator;
+ (locales?: string | string[], options?: CollatorOptions): Collator;
+ supportedLocalesOf(locales: string | string[], options?: CollatorOptions): string[];
+ };
+ interface NumberFormatOptions {
+ localeMatcher?: string | undefined;
+ style?: string | undefined;
+ currency?: string | undefined;
+ currencySign?: string | undefined;
+ useGrouping?: boolean | undefined;
+ minimumIntegerDigits?: number | undefined;
+ minimumFractionDigits?: number | undefined;
+ maximumFractionDigits?: number | undefined;
+ minimumSignificantDigits?: number | undefined;
+ maximumSignificantDigits?: number | undefined;
+ }
+ interface ResolvedNumberFormatOptions {
+ locale: string;
+ numberingSystem: string;
+ style: string;
+ currency?: string;
+ minimumIntegerDigits: number;
+ minimumFractionDigits: number;
+ maximumFractionDigits: number;
+ minimumSignificantDigits?: number;
+ maximumSignificantDigits?: number;
+ useGrouping: boolean;
+ }
+ interface NumberFormat {
+ format(value: number): string;
+ resolvedOptions(): ResolvedNumberFormatOptions;
+ }
+ var NumberFormat: {
+ new(locales?: string | string[], options?: NumberFormatOptions): NumberFormat;
+ (locales?: string | string[], options?: NumberFormatOptions): NumberFormat;
+ supportedLocalesOf(locales: string | string[], options?: NumberFormatOptions): string[];
+ readonly prototype: NumberFormat;
+ };
+ interface DateTimeFormatOptions {
+ localeMatcher?: "best fit" | "lookup" | undefined;
+ weekday?: "long" | "short" | "narrow" | undefined;
+ era?: "long" | "short" | "narrow" | undefined;
+ year?: "numeric" | "2-digit" | undefined;
+ month?: "numeric" | "2-digit" | "long" | "short" | "narrow" | undefined;
+ day?: "numeric" | "2-digit" | undefined;
+ hour?: "numeric" | "2-digit" | undefined;
+ minute?: "numeric" | "2-digit" | undefined;
+ second?: "numeric" | "2-digit" | undefined;
+ timeZoneName?: "short" | "long" | "shortOffset" | "longOffset" | "shortGeneric" | "longGeneric" | undefined;
+ formatMatcher?: "best fit" | "basic" | undefined;
+ hour12?: boolean | undefined;
+ timeZone?: string | undefined;
+ }
+ interface ResolvedDateTimeFormatOptions {
+ locale: string;
+ calendar: string;
+ numberingSystem: string;
+ timeZone: string;
+ hour12?: boolean;
+ weekday?: string;
+ era?: string;
+ year?: string;
+ month?: string;
+ day?: string;
+ hour?: string;
+ minute?: string;
+ second?: string;
+ timeZoneName?: string;
+ }
+ interface DateTimeFormat {
+ format(date?: Date | number): string;
+ resolvedOptions(): ResolvedDateTimeFormatOptions;
+ }
+ var DateTimeFormat: {
+ new(locales?: string | string[], options?: DateTimeFormatOptions): DateTimeFormat;
+ (locales?: string | string[], options?: DateTimeFormatOptions): DateTimeFormat;
+ supportedLocalesOf(locales: string | string[], options?: DateTimeFormatOptions): string[];
+ readonly prototype: DateTimeFormat;
+ };
+}
+interface String {
+ localeCompare(that: string, locales?: string | string[], options?: Intl.CollatorOptions): number;
+}
+interface Number {
+ toLocaleString(locales?: string | string[], options?: Intl.NumberFormatOptions): string;
+}
+interface Date {
+ toLocaleString(locales?: string | string[], options?: Intl.DateTimeFormatOptions): string;
+ toLocaleDateString(locales?: string | string[], options?: Intl.DateTimeFormatOptions): string;
+ toLocaleTimeString(locales?: string | string[], options?: Intl.DateTimeFormatOptions): string;
+}
+///
+interface Array {
+ find(predicate: (value: T, index: number, obj: T[]) => value is S, thisArg?: any): S | undefined;
+ find(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): T | undefined;
+ findIndex(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): number;
+ fill(value: T, start?: number, end?: number): this;
+ copyWithin(target: number, start: number, end?: number): this;
+}
+interface ArrayConstructor {
+ from(arrayLike: ArrayLike): T[];
+ from(arrayLike: ArrayLike, mapfn: (v: T, k: number) => U, thisArg?: any): U[];
+ of(...items: T[]): T[];
+}
+interface DateConstructor {
+ new (value: number | string | Date): Date;
+}
+interface Function {
+ readonly name: string;
+}
+interface Math {
+ clz32(x: number): number;
+ imul(x: number, y: number): number;
+ sign(x: number): number;
+ log10(x: number): number;
+ log2(x: number): number;
+ log1p(x: number): number;
+ expm1(x: number): number;
+ cosh(x: number): number;
+ sinh(x: number): number;
+ tanh(x: number): number;
+ acosh(x: number): number;
+ asinh(x: number): number;
+ atanh(x: number): number;
+ hypot(...values: number[]): number;
+ trunc(x: number): number;
+ fround(x: number): number;
+ cbrt(x: number): number;
+}
+interface NumberConstructor {
+ readonly EPSILON: number;
+ isFinite(number: unknown): boolean;
+ isInteger(number: unknown): boolean;
+ isNaN(number: unknown): boolean;
+ isSafeInteger(number: unknown): boolean;
+ readonly MAX_SAFE_INTEGER: number;
+ readonly MIN_SAFE_INTEGER: number;
+ parseFloat(string: string): number;
+ parseInt(string: string, radix?: number): number;
+}
+interface ObjectConstructor {
+ assign(target: T, source: U): T & U;
+ assign(target: T, source1: U, source2: V): T & U & V;
+ assign(target: T, source1: U, source2: V, source3: W): T & U & V & W;
+ assign(target: object, ...sources: any[]): any;
+ getOwnPropertySymbols(o: any): symbol[];
+ keys(o: {}): string[];
+ is(value1: any, value2: any): boolean;
+ setPrototypeOf(o: any, proto: object | null): any;
+}
+interface ReadonlyArray {
+ find(predicate: (value: T, index: number, obj: readonly T[]) => value is S, thisArg?: any): S | undefined;
+ find(predicate: (value: T, index: number, obj: readonly T[]) => unknown, thisArg?: any): T | undefined;
+ findIndex(predicate: (value: T, index: number, obj: readonly T[]) => unknown, thisArg?: any): number;
+}
+interface RegExp {
+ readonly flags: string;
+ readonly sticky: boolean;
+ readonly unicode: boolean;
+}
+interface RegExpConstructor {
+ new (pattern: RegExp | string, flags?: string): RegExp;
+ (pattern: RegExp | string, flags?: string): RegExp;
+}
+interface String {
+ codePointAt(pos: number): number | undefined;
+ includes(searchString: string, position?: number): boolean;
+ endsWith(searchString: string, endPosition?: number): boolean;
+ normalize(form: "NFC" | "NFD" | "NFKC" | "NFKD"): string;
+ normalize(form?: string): string;
+ repeat(count: number): string;
+ startsWith(searchString: string, position?: number): boolean;
+ anchor(name: string): string;
+ big(): string;
+ blink(): string;
+ bold(): string;
+ fixed(): string;
+ fontcolor(color: string): string;
+ fontsize(size: number): string;
+ fontsize(size: string): string;
+ italics(): string;
+ link(url: string): string;
+ small(): string;
+ strike(): string;
+ sub(): string;
+ sup(): string;
+}
+interface StringConstructor {
+ fromCodePoint(...codePoints: number[]): string;
+ raw(template: { raw: readonly string[] | ArrayLike}, ...substitutions: any[]): string;
+}
+///
+interface Map {
+ clear(): void;
+ delete(key: K): boolean;
+ forEach(callbackfn: (value: V, key: K, map: Map) => void, thisArg?: any): void;
+ get(key: K): V | undefined;
+ has(key: K): boolean;
+ set(key: K, value: V): this;
+ readonly size: number;
+}
+interface MapConstructor {
+ new(): Map;
+ new (entries?: readonly (readonly [K, V])[] | null): Map;
+ readonly prototype: Map;
+}
+declare var Map: MapConstructor;
+interface ReadonlyMap {
+ forEach(callbackfn: (value: V, key: K, map: ReadonlyMap) => void, thisArg?: any): void;
+ get(key: K): V | undefined;
+ has(key: K): boolean;
+ readonly size: number;
+}
+interface WeakMap {
+ delete(key: K): boolean;
+ get(key: K): V | undefined;
+ has(key: K): boolean;
+ set(key: K, value: V): this;
+}
+interface WeakMapConstructor {
+ new (entries?: readonly [K, V][] | null): WeakMap;
+ readonly prototype: WeakMap