From 5ea8fe8c90eca02cce24eb5385e195e85ddee9cb Mon Sep 17 00:00:00 2001 From: Colin McDonnell Date: Tue, 6 Dec 2022 18:48:02 -0800 Subject: [PATCH] Update types (#1581) * Fix TS types, improve child_process types * Add prettier * Add ArrayBuffer types * Add namespace Bun, improve types for SharedArrayBuffer, add toStrictEqual * Improve types, add test files for types * Update type tests * Fix typo * Add stdio * Stdio types * Use latest setup-bun * Update action * Update action * Update action Co-authored-by: Colin McDonnell Co-authored-by: Ashcon Partovi --- .github/workflows/bun-landing.yml | 4 +- .github/workflows/bun-types-release.yml | 8 +- .github/workflows/bun-types-tests.yml | 4 +- packages/bun-types/.eslintrc.cjs | 1 + packages/bun-types/bun-test.d.ts | 1 + packages/bun-types/bun.d.ts | 15 +-- packages/bun-types/bun.lockb | Bin 76065 -> 43287 bytes packages/bun-types/child_process.d.ts | 89 +++++++++--------- packages/bun-types/globals.d.ts | 82 ++++++++++++++-- packages/bun-types/package.json | 9 +- .../bun-types/tests/array-buffer.test-d.ts | 12 +++ packages/bun-types/tests/array.test-d.ts | 19 ++++ packages/bun-types/tests/console.test-d.ts | 5 + packages/bun-types/tests/env.test-d.ts | 13 +++ .../tests/{index.d.ts => exports.d.ts} | 0 packages/bun-types/tests/fsrouter.test-d.ts | 13 +++ .../{index.test-d.ts => globals.test-d.ts} | 7 +- packages/bun-types/tests/headers.test-d.ts | 6 ++ packages/bun-types/tests/stdio.test-d.ts | 3 + packages/bun-types/tests/tcp.test-d.ts | 2 +- packages/bun-types/tests/test.test-d.ts | 13 +++ packages/bun-types/tsconfig.json | 4 +- test/bun.js/child_process.test.ts | 6 +- tsconfig.json | 5 +- 24 files changed, 237 insertions(+), 84 deletions(-) create mode 100644 packages/bun-types/tests/array-buffer.test-d.ts create mode 100644 packages/bun-types/tests/array.test-d.ts create mode 100644 packages/bun-types/tests/console.test-d.ts create mode 100644 packages/bun-types/tests/env.test-d.ts rename packages/bun-types/tests/{index.d.ts => exports.d.ts} (100%) create mode 100644 packages/bun-types/tests/fsrouter.test-d.ts rename packages/bun-types/tests/{index.test-d.ts => globals.test-d.ts} (94%) create mode 100644 packages/bun-types/tests/headers.test-d.ts create mode 100644 packages/bun-types/tests/stdio.test-d.ts create mode 100644 packages/bun-types/tests/test.test-d.ts diff --git a/.github/workflows/bun-landing.yml b/.github/workflows/bun-landing.yml index 86a5045fcb..7fba02e517 100644 --- a/.github/workflows/bun-landing.yml +++ b/.github/workflows/bun-landing.yml @@ -26,9 +26,9 @@ jobs: node-version: ${{ matrix.node }} - name: Install bun - uses: xhyrom/setup-bun@v0.1.2 + uses: xhyrom/setup-bun@v0.1.8 with: - bun-version: latest + bun-version: canary - name: Install global dependencies run: bun install diff --git a/.github/workflows/bun-types-release.yml b/.github/workflows/bun-types-release.yml index ebbe085861..ca80589673 100644 --- a/.github/workflows/bun-types-release.yml +++ b/.github/workflows/bun-types-release.yml @@ -14,9 +14,9 @@ jobs: - uses: actions/checkout@v3 - name: Install bun - uses: xhyrom/setup-bun@v0.1.6 + uses: xhyrom/setup-bun@v0.1.8 with: - bun-version: latest + bun-version: canary github-token: ${{ secrets.GITHUB_TOKEN }} - name: Install node @@ -88,9 +88,9 @@ jobs: scope: '@oven-sh' - name: Install bun - uses: xhyrom/setup-bun@v0.1.6 + uses: xhyrom/setup-bun@v0.1.8 with: - bun-version: latest + bun-version: canary github-token: ${{ secrets.GITHUB_TOKEN }} - name: Download all artifacts diff --git a/.github/workflows/bun-types-tests.yml b/.github/workflows/bun-types-tests.yml index 207ef91c82..152a891979 100644 --- a/.github/workflows/bun-types-tests.yml +++ b/.github/workflows/bun-types-tests.yml @@ -20,9 +20,9 @@ jobs: uses: actions/checkout@v2 - name: Install bun - uses: xhyrom/setup-bun@v0.1.6 + uses: xhyrom/setup-bun@v0.1.8 with: - bun-version: latest + bun-version: canary github-token: ${{ secrets.GITHUB_TOKEN }} - name: Install node diff --git a/packages/bun-types/.eslintrc.cjs b/packages/bun-types/.eslintrc.cjs index d38b920f4e..6fd18dcc96 100644 --- a/packages/bun-types/.eslintrc.cjs +++ b/packages/bun-types/.eslintrc.cjs @@ -19,5 +19,6 @@ module.exports = { "@typescript-eslint/no-empty-interface": "off", "@typescript-eslint/no-empty-function": "off", "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-misused-new": "off", }, }; diff --git a/packages/bun-types/bun-test.d.ts b/packages/bun-types/bun-test.d.ts index c651b0a217..0d643ea56c 100644 --- a/packages/bun-types/bun-test.d.ts +++ b/packages/bun-types/bun-test.d.ts @@ -37,6 +37,7 @@ declare module "bun:test" { toBe(value: any): void; toContain(value: any): void; toEqual(value: any): void; + toStrictEqual(value: any): void; toHaveLength(value: number): void; toHaveProperty(key: string, value?: any): void; toBeTruthy(): void; diff --git a/packages/bun-types/bun.d.ts b/packages/bun-types/bun.d.ts index 265a8ed464..804d9c861c 100644 --- a/packages/bun-types/bun.d.ts +++ b/packages/bun-types/bun.d.ts @@ -1,9 +1,13 @@ -import { SignalConstants } from "os"; - interface VoidFunction { (): void; } +declare namespace Bun { + interface Env extends Dict { + NODE_ENV: string; + } +} + /** * * Bun.js runtime APIs @@ -30,7 +34,7 @@ declare module "bun" { * Changes to `process.env` at runtime won't automatically be reflected in the default value. For that, you can pass `process.env` explicitly. * */ - export const env: Record; + export const env: Bun.Env; export const origin: string; /** @@ -2981,7 +2985,4 @@ interface BufferEncodingOption { encoding?: BufferEncoding; } -// declare var Bun: typeof import("bun"); -declare namespace Bun { - export * from "bun"; -} +declare var Bun: typeof import("bun"); diff --git a/packages/bun-types/bun.lockb b/packages/bun-types/bun.lockb index cf33f4cab6bfdf0240428a9525ed78c66457e2ba..a0b9b6b1d7dcd3391279fef07e31a10b20a3be85 100755 GIT binary patch delta 12172 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 literal 76065 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 diff --git a/packages/bun-types/child_process.d.ts b/packages/bun-types/child_process.d.ts index 639dcaf621..c36a7dd0d5 100644 --- a/packages/bun-types/child_process.d.ts +++ b/packages/bun-types/child_process.d.ts @@ -66,14 +66,15 @@ * @see [source](https://github.com/nodejs/node/blob/v18.0.0/lib/child_process.js) */ declare module "child_process" { - import { BunSpawnOptions } from "bun"; + import { SpawnOptions } from "bun"; import { ObjectEncodingOptions } from "node:fs"; import { EventEmitter, Abortable } from "node:events"; - import * as net from "node:net"; + import { Writable, Readable, Stream, Pipe } from "node:stream"; import { URL } from "node:url"; type Serializable = string | object | number | boolean | bigint; - type SendHandle = net.Socket | net.Server; + // import * as net from "node:net"; + // type SendHandle = net.Socket | net.Server; /** * Instances of the `ChildProcess` represent spawned child processes. * @@ -84,7 +85,7 @@ declare module "child_process" { */ class ChildProcess extends EventEmitter { spawn( - options: BunSpawnOptions & { cmd: string[] }, + options: SpawnOptions.OptionsObject & { args: string[]; file?: string }, ): ChildProcessWithoutNullStreams; /** @@ -464,17 +465,17 @@ declare module "child_process" { message: Serializable, callback?: (error: Error | null) => void, ): boolean; - send( - message: Serializable, - sendHandle?: SendHandle, - callback?: (error: Error | null) => void, - ): boolean; - send( - message: Serializable, - sendHandle?: SendHandle, - options?: MessageOptions, - callback?: (error: Error | null) => void, - ): boolean; + // send( + // message: Serializable, + // sendHandle?: SendHandle, + // callback?: (error: Error | null) => void, + // ): boolean; + // send( + // message: Serializable, + // sendHandle?: SendHandle, + // options?: MessageOptions, + // callback?: (error: Error | null) => void, + // ): boolean; /** * Closes the IPC channel between parent and child, allowing the child to exit * gracefully once there are no other connections keeping it alive. After calling @@ -550,10 +551,10 @@ declare module "child_process" { event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void, ): this; - addListener( - event: "message", - listener: (message: Serializable, sendHandle: SendHandle) => void, - ): this; + // addListener( + // event: "message", + // listener: (message: Serializable, sendHandle: SendHandle) => void, + // ): this; addListener(event: "spawn", listener: () => void): this; emit(event: string | symbol, ...args: any[]): boolean; emit( @@ -568,11 +569,11 @@ declare module "child_process" { code: number | null, signal: NodeJS.Signals | null, ): boolean; - emit( - event: "message", - message: Serializable, - sendHandle: SendHandle, - ): boolean; + // emit( + // event: "message", + // message: Serializable, + // sendHandle: SendHandle, + // ): boolean; emit(event: "spawn", listener: () => void): boolean; on(event: string, listener: (...args: any[]) => void): this; on( @@ -585,10 +586,10 @@ declare module "child_process" { event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void, ): this; - on( - event: "message", - listener: (message: Serializable, sendHandle: SendHandle) => void, - ): this; + // on( + // event: "message", + // listener: (message: Serializable, sendHandle: SendHandle) => void, + // ): this; on(event: "spawn", listener: () => void): this; once(event: string, listener: (...args: any[]) => void): this; once( @@ -601,10 +602,10 @@ declare module "child_process" { event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void, ): this; - once( - event: "message", - listener: (message: Serializable, sendHandle: SendHandle) => void, - ): this; + // once( + // event: "message", + // listener: (message: Serializable, sendHandle: SendHandle) => void, + // ): this; once(event: "spawn", listener: () => void): this; prependListener(event: string, listener: (...args: any[]) => void): this; prependListener( @@ -617,10 +618,10 @@ declare module "child_process" { event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void, ): this; - prependListener( - event: "message", - listener: (message: Serializable, sendHandle: SendHandle) => void, - ): this; + // prependListener( + // event: "message", + // listener: (message: Serializable, sendHandle: SendHandle) => void, + // ): this; prependListener(event: "spawn", listener: () => void): this; prependOnceListener( event: string, @@ -636,10 +637,10 @@ declare module "child_process" { event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void, ): this; - prependOnceListener( - event: "message", - listener: (message: Serializable, sendHandle: SendHandle) => void, - ): this; + // prependOnceListener( + // event: "message", + // listener: (message: Serializable, sendHandle: SendHandle) => void, + // ): this; prependOnceListener(event: "spawn", listener: () => void): this; } // return this object when stdio option is undefined or not specified @@ -703,7 +704,7 @@ declare module "child_process" { uid?: number | undefined; gid?: number | undefined; cwd?: string | URL | undefined; - env?: NodeJS.ProcessEnv | undefined; + env?: Partial | undefined; } interface CommonOptions extends ProcessEnvOptions { /** @@ -1172,7 +1173,7 @@ declare module "child_process" { interface ExecFileOptionsWithOtherEncoding extends ExecFileOptions { encoding: BufferEncoding; } - type ExecFileException = ExecException & NodeJS.ErrnoException; + type ExecFileException = ExecException & ErrnoException; /** * The `child_process.execFile()` function is similar to {@link exec} except that it does not spawn a shell by default. Rather, the specified * executable `file` is spawned directly as a new process making it slightly more @@ -1527,7 +1528,7 @@ declare module "child_process" { options?: ForkOptions, ): ChildProcess; interface SpawnSyncOptions extends CommonSpawnOptions { - input?: string | NodeJS.ArrayBufferView | undefined; + input?: string | ArrayBufferView | undefined; maxBuffer?: number | undefined; encoding?: BufferEncoding | "buffer" | null | undefined; } @@ -1594,7 +1595,7 @@ declare module "child_process" { options?: SpawnSyncOptions, ): SpawnSyncReturns; interface CommonExecOptions extends CommonOptions { - input?: string | NodeJS.ArrayBufferView | undefined; + input?: string | ArrayBufferView | undefined; stdio?: StdioOptions | undefined; killSignal?: NodeJS.Signals | number | undefined; maxBuffer?: number | undefined; diff --git a/packages/bun-types/globals.d.ts b/packages/bun-types/globals.d.ts index be58b8e023..c93265ecb1 100644 --- a/packages/bun-types/globals.d.ts +++ b/packages/bun-types/globals.d.ts @@ -65,14 +65,14 @@ type Signals = | "SIGINFO"; interface ArrayConstructor { - fromAsync( - asyncItems: AsyncIterable | Iterable | ArrayLike, + fromAsync( + asyncItems: AsyncIterable | Iterable | ArrayLike, mapfn?: (value: any, index: number) => any, thisArg?: any, - ): Array; + ): Array; } -interface console { +interface Console { /** * Asynchronously read lines from standard input (fd 0) * @@ -172,7 +172,7 @@ interface console { warn(...data: any[]): void; } -declare var console: console; +declare var console: Console; declare namespace NodeJS { interface RequireResolve { @@ -184,6 +184,44 @@ declare namespace NodeJS { (id: string): any; resolve: RequireResolve; } + type Signals = + | "SIGABRT" + | "SIGALRM" + | "SIGBUS" + | "SIGCHLD" + | "SIGCONT" + | "SIGFPE" + | "SIGHUP" + | "SIGILL" + | "SIGINT" + | "SIGIO" + | "SIGIOT" + | "SIGKILL" + | "SIGPIPE" + | "SIGPOLL" + | "SIGPROF" + | "SIGPWR" + | "SIGQUIT" + | "SIGSEGV" + | "SIGSTKFLT" + | "SIGSTOP" + | "SIGSYS" + | "SIGTERM" + | "SIGTRAP" + | "SIGTSTP" + | "SIGTTIN" + | "SIGTTOU" + | "SIGUNUSED" + | "SIGURG" + | "SIGUSR1" + | "SIGUSR2" + | "SIGVTALRM" + | "SIGWINCH" + | "SIGXCPU" + | "SIGXFSZ" + | "SIGBREAK" + | "SIGLOST" + | "SIGINFO"; } interface ImportMeta { @@ -297,9 +335,7 @@ interface Process { platform: Platform; argv: string[]; // execArgv: string[]; - env: Record & { - NODE_ENV: string; - }; + env: Bun.Env; /** Whether you are using Bun */ isBun: 1; // FIXME: this should actually return a boolean @@ -315,6 +351,9 @@ interface Process { getuid(): number; setuid(id: number | string): void; dlopen(module: { exports: any }, filename: string, flags?: number): void; + stdin: import("stream").Duplex; + stdout: import("stream").Writable; + stderr: import("stream").Writable; } declare var process: Process; @@ -2637,3 +2676,30 @@ interface CallSite { */ isConstructor(): boolean; } + +interface ArrayBufferConstructor { + new (params: { byteLength: number; maxByteLength?: number }): ArrayBuffer; +} +interface ArrayBuffer { + /** + * Read-only. The length of the ArrayBuffer (in bytes). + */ + readonly byteLength: number; + /** + * Resize an ArrayBuffer in-place. + */ + resize(byteLength: number): ArrayBuffer; + + /** + * Returns a section of an ArrayBuffer. + */ + slice(begin: number, end?: number): ArrayBuffer; + readonly [Symbol.toStringTag]: string; +} + +interface SharedArrayBuffer { + /** + * Grow the SharedArrayBuffer in-place. + */ + grow(size: number): SharedArrayBuffer; +} diff --git a/packages/bun-types/package.json b/packages/bun-types/package.json index 85efdcd569..b8c8a2e2a3 100644 --- a/packages/bun-types/package.json +++ b/packages/bun-types/package.json @@ -4,13 +4,16 @@ "private": true, "repository": "https://github.com/oven-sh/bun-types", "scripts": { - "build": "rm -rf ./dist && bun scripts/bundle.ts ./dist && bun run fmt", + "build": "rm -rf ./dist && bun run bundle && bun run fmt", + "bundle": "bun scripts/bundle.ts ./dist", "docs": "bun run build && typedoc", - "test": "tsd" + "test": "tsd", + "fmt": "prettier --write './**/*.{ts,tsx,js,jsx}'" }, "devDependencies": { "tsd": "^0.22.0", - "typedoc": "^0.23.9" + "typedoc": "^0.23.9", + "prettier": "^2.4.1" }, "tsd": { "directory": "tests" diff --git a/packages/bun-types/tests/array-buffer.test-d.ts b/packages/bun-types/tests/array-buffer.test-d.ts new file mode 100644 index 0000000000..7d28e20975 --- /dev/null +++ b/packages/bun-types/tests/array-buffer.test-d.ts @@ -0,0 +1,12 @@ +const buffer = new ArrayBuffer({ + byteLength: 1024, + maxByteLength: 2048, +}); + +console.log(buffer.byteLength); // 1024 +buffer.resize(2048); +console.log(buffer.byteLength); // 2048 +TextDecoder; + +const buf = new SharedArrayBuffer(1024); +buf.grow(2048); diff --git a/packages/bun-types/tests/array.test-d.ts b/packages/bun-types/tests/array.test-d.ts new file mode 100644 index 0000000000..ac04c6b341 --- /dev/null +++ b/packages/bun-types/tests/array.test-d.ts @@ -0,0 +1,19 @@ +import { expectType } from "tsd"; + +async function* listReleases() { + for (let page = 1; ; page++) { + const response = await fetch( + `https://api.github.com/repos/oven-sh/bun/releases?page=${page}`, + ); + const releases: { data: string }[] = await response.json(); + if (!releases.length) { + break; + } + for (const release of releases) { + yield release; + } + } +} + +const releases = await Array.fromAsync(listReleases()); +expectType<{ data: string }[]>(releases); diff --git a/packages/bun-types/tests/console.test-d.ts b/packages/bun-types/tests/console.test-d.ts new file mode 100644 index 0000000000..5a4d6efa89 --- /dev/null +++ b/packages/bun-types/tests/console.test-d.ts @@ -0,0 +1,5 @@ +for await (const line of console) { + console.log("Received:", line); +} + +export {}; diff --git a/packages/bun-types/tests/env.test-d.ts b/packages/bun-types/tests/env.test-d.ts new file mode 100644 index 0000000000..805aa4126e --- /dev/null +++ b/packages/bun-types/tests/env.test-d.ts @@ -0,0 +1,13 @@ +import { expectType } from "tsd"; + +declare global { + namespace Bun { + interface Env { + WHATEVER: "WHATEVER"; + } + } +} + +expectType<"WHATEVER">(process.env.WHATEVER); + +export {}; diff --git a/packages/bun-types/tests/index.d.ts b/packages/bun-types/tests/exports.d.ts similarity index 100% rename from packages/bun-types/tests/index.d.ts rename to packages/bun-types/tests/exports.d.ts diff --git a/packages/bun-types/tests/fsrouter.test-d.ts b/packages/bun-types/tests/fsrouter.test-d.ts new file mode 100644 index 0000000000..05556f60a6 --- /dev/null +++ b/packages/bun-types/tests/fsrouter.test-d.ts @@ -0,0 +1,13 @@ +import { FileSystemRouter } from "bun"; +import { expectType } from "tsd"; + +const router = new FileSystemRouter({ + dir: import.meta.dir + "/pages", + style: "nextjs", +}); + +const match = router.match("/"); +expectType(match?.name!); +expectType(match?.pathname!); +expectType>(match?.query!); +expectType>(match?.params!); diff --git a/packages/bun-types/tests/index.test-d.ts b/packages/bun-types/tests/globals.test-d.ts similarity index 94% rename from packages/bun-types/tests/index.test-d.ts rename to packages/bun-types/tests/globals.test-d.ts index 7a23906384..5faf9d8340 100644 --- a/packages/bun-types/tests/index.test-d.ts +++ b/packages/bun-types/tests/globals.test-d.ts @@ -1,11 +1,6 @@ import { ZlibCompressionOptions } from "bun"; import { expectAssignable, expectType } from "tsd"; -import Bun, { fs, fsPromises } from "."; -// import Bun from "bun"; -// import fs from "fs"; -// import fsPromises from "fs/promises"; - -// Testing ../bun.d.ts +import Bun, { fs, fsPromises } from "./exports"; // FileBlob expectType>(Bun.file("index.test-d.ts").stream()); diff --git a/packages/bun-types/tests/headers.test-d.ts b/packages/bun-types/tests/headers.test-d.ts new file mode 100644 index 0000000000..711384ddca --- /dev/null +++ b/packages/bun-types/tests/headers.test-d.ts @@ -0,0 +1,6 @@ +const headers = new Headers(); +headers.append("Set-Cookie", "a=1"); +headers.append("Set-Cookie", "b=1; Secure"); + +console.log(headers.getAll("Set-Cookie")); // ["a=1", "b=1; Secure"] +console.log(headers.toJSON()); // { "set-cookie": "a=1, b=1; Secure" } diff --git a/packages/bun-types/tests/stdio.test-d.ts b/packages/bun-types/tests/stdio.test-d.ts new file mode 100644 index 0000000000..d42f3b718a --- /dev/null +++ b/packages/bun-types/tests/stdio.test-d.ts @@ -0,0 +1,3 @@ +process.stdin; +process.stdout; +process.stderr; diff --git a/packages/bun-types/tests/tcp.test-d.ts b/packages/bun-types/tests/tcp.test-d.ts index 9cfcbebda7..2d5f66f524 100644 --- a/packages/bun-types/tests/tcp.test-d.ts +++ b/packages/bun-types/tests/tcp.test-d.ts @@ -116,7 +116,7 @@ const listener = Bun.listen({ unix: "asdf", }); -listener.data.arg = "asdf"; +listener.data!.arg = "asdf"; // @ts-expect-error arg is string listener.data.arg = 234; diff --git a/packages/bun-types/tests/test.test-d.ts b/packages/bun-types/tests/test.test-d.ts new file mode 100644 index 0000000000..653a41c4df --- /dev/null +++ b/packages/bun-types/tests/test.test-d.ts @@ -0,0 +1,13 @@ +import { test, expect } from "bun:test"; + +test("new expect() matchers", () => { + expect(1).not.toBe(2); + expect({ a: 1 }).toEqual({ a: 1, b: undefined }); + expect({ a: 1 }).toStrictEqual({ a: 1 }); + expect(new Set()).toHaveProperty("size"); + expect([]).toHaveLength(0); + expect(["bun"]).toContain("bun"); + expect(true).toBeTruthy(); + expect(Math.PI).toBeGreaterThan(3.14); + expect(null).toBeNull(); +}); diff --git a/packages/bun-types/tsconfig.json b/packages/bun-types/tsconfig.json index f88d23096d..7094701961 100644 --- a/packages/bun-types/tsconfig.json +++ b/packages/bun-types/tsconfig.json @@ -3,13 +3,13 @@ "lib": [ "ESNext" ], - "skipLibCheck": true, + "skipLibCheck": false, "strict": true, "target": "esnext", "module": "esnext", "moduleResolution": "node", "allowSyntheticDefaultImports": true, - "disableSolutionSearching": true + "disableSolutionSearching": true, }, "exclude": [ "dist", diff --git a/test/bun.js/child_process.test.ts b/test/bun.js/child_process.test.ts index bdb1971806..6fe5bf996c 100644 --- a/test/bun.js/child_process.test.ts +++ b/test/bun.js/child_process.test.ts @@ -36,13 +36,13 @@ const it: typeof it_ = (label, fn) => { } else if (fn.constructor.name === "AsyncFunction") { return it_(label, async () => { gcTick(); - await fn(); + await fn(() => {}); gcTick(); }); } else { return it_(label, () => { gcTick(); - fn(); + fn(() => {}); gcTick(); }); } @@ -204,7 +204,7 @@ describe("spawn()", () => { it("should allow explicit setting of argv0", async () => { var resolve; - const promise = new Promise((resolve1) => { + const promise = new Promise((resolve1) => { resolve = resolve1; }); process.env.NO_COLOR = "1"; diff --git a/tsconfig.json b/tsconfig.json index 38b67ef1d3..97bf402589 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,11 +4,12 @@ "experimentalDecorators": true, "allowSyntheticDefaultImports": true, "noEmit": true, - "skipLibCheck": true, + // "skipLibCheck": true, "allowJs": true }, "include": [ - "." + ".", + "**/*.d.ts" ], "exclude": [ "src/test",