diff --git a/.eslintrc.json b/.eslintrc.json index 43a0b8caef01a32db27748fd12d0ed9e22e22020..6bab124cfe1aa2ef062431700dab355cf1a60c77 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -23,7 +23,8 @@ "@typescript-eslint/ban-ts-ignore": ["off"], "@typescript-eslint/no-empty-function": ["off"], "no-return-await": "error", - "require-await": "error" + "require-await": "error", + "no-async-promise-executor": "error" }, "overrides": [ { diff --git a/std/node/_fs/_fs_appendFile.ts b/std/node/_fs/_fs_appendFile.ts index f3b44dd7b7220fe52fa315db13401506f49634c8..48b05ff80551125f42daa0b3b90fc2583eaf60de 100644 --- a/std/node/_fs/_fs_appendFile.ts +++ b/std/node/_fs/_fs_appendFile.ts @@ -21,34 +21,31 @@ export function appendFile( } validateEncoding(options); - let rid = -1; - new Promise(async (resolve, reject) => { - try { - if (typeof pathOrRid === "number") { - rid = pathOrRid; - } else { - const mode: number | undefined = isFileOptions(options) - ? options.mode - : undefined; - const flag: string | undefined = isFileOptions(options) - ? options.flag - : undefined; - - if (mode) { - //TODO rework once https://github.com/denoland/deno/issues/4017 completes - notImplemented("Deno does not yet support setting mode on create"); - } - const file = await Deno.open(pathOrRid, getOpenOptions(flag)); - rid = file.rid; - } - - const buffer: Uint8Array = new TextEncoder().encode(data); + const buffer: Uint8Array = new TextEncoder().encode(data); + new Promise((resolve, reject) => { + if (typeof pathOrRid === "number") { + rid = pathOrRid; + Deno.write(rid, buffer).then(resolve).catch(reject); + } else { + const mode: number | undefined = isFileOptions(options) + ? options.mode + : undefined; + const flag: string | undefined = isFileOptions(options) + ? options.flag + : undefined; - await Deno.write(rid, buffer); - resolve(); - } catch (err) { - reject(err); + if (mode) { + //TODO rework once https://github.com/denoland/deno/issues/4017 completes + notImplemented("Deno does not yet support setting mode on create"); + } + Deno.open(pathOrRid, getOpenOptions(flag)) + .then(({ rid: openedFileRid }) => { + rid = openedFileRid; + return Deno.write(openedFileRid, buffer); + }) + .then(resolve) + .catch(reject); } }) .then(() => { diff --git a/std/node/_fs/_fs_chmod.ts b/std/node/_fs/_fs_chmod.ts index 0eb01a8a6f4fb258e568d1a7f514573b7802928a..30611304784e9f7e0fa6703e1fcc7f1b85676eb6 100644 --- a/std/node/_fs/_fs_chmod.ts +++ b/std/node/_fs/_fs_chmod.ts @@ -13,20 +13,9 @@ export function chmod( mode: string | number, callback: CallbackWithError ): void { - new Promise(async (resolve, reject) => { - try { - await Deno.chmod(path, getResolvedMode(mode)); - resolve(); - } catch (err) { - reject(err); - } - }) - .then(() => { - callback(); - }) - .catch((err) => { - callback(err); - }); + Deno.chmod(path, getResolvedMode(mode)) + .then(() => callback()) + .catch(callback); } /** diff --git a/std/node/_fs/_fs_chown.ts b/std/node/_fs/_fs_chown.ts index 94b7401d08fa8d2cac59723db18cf654c4548d83..c6baa4722b6ec30564ea199c196e26136986a957 100644 --- a/std/node/_fs/_fs_chown.ts +++ b/std/node/_fs/_fs_chown.ts @@ -12,20 +12,9 @@ export function chown( gid: number, callback: CallbackWithError ): void { - new Promise(async (resolve, reject) => { - try { - await Deno.chown(path, uid, gid); - resolve(); - } catch (err) { - reject(err); - } - }) - .then(() => { - callback(); - }) - .catch((err) => { - callback(err); - }); + Deno.chown(path, uid, gid) + .then(() => callback()) + .catch(callback); } /** diff --git a/std/node/_fs/_fs_copy.ts b/std/node/_fs/_fs_copy.ts index 4fdc63008f87e6952ad0e9ec1e163ea048cf0c51..320c2fb3e87ae212cd324c4c545c5ac5532b85cd 100644 --- a/std/node/_fs/_fs_copy.ts +++ b/std/node/_fs/_fs_copy.ts @@ -7,20 +7,9 @@ export function copyFile( destination: string, callback: CallbackWithError ): void { - new Promise(async (resolve, reject) => { - try { - await Deno.copyFile(source, destination); - resolve(); - } catch (err) { - reject(err); - } - }) - .then(() => { - callback(); - }) - .catch((err) => { - callback(err); - }); + Deno.copyFile(source, destination) + .then(() => callback()) + .catch(callback); } export function copyFileSync(source: string, destination: string): void { diff --git a/std/node/_fs/_fs_dir.ts b/std/node/_fs/_fs_dir.ts index 144014cce08fcbaca7601b2694f575b7ac8a1421..543cf14eed390ce1130b29c329373be8db5475be 100644 --- a/std/node/_fs/_fs_dir.ts +++ b/std/node/_fs/_fs_dir.ts @@ -1,4 +1,5 @@ import Dirent from "./_fs_dirent.ts"; +import { assert } from "../../testing/asserts.ts"; export default class Dir { private dirPath: string | Uint8Array; @@ -17,25 +18,25 @@ export default class Dir { } read(callback?: Function): Promise { - return new Promise(async (resolve, reject) => { - try { - if (!this.asyncIterator) { - this.asyncIterator = Deno.readdir(this.path)[Symbol.asyncIterator](); - } - - const result: Dirent | null = await (await this.asyncIterator?.next()) - .value; - resolve(result ? result : null); - - if (callback) { - callback(null, result ? result : null); - } - } catch (err) { - if (callback) { - callback(err, null); - } - reject(err); + return new Promise((resolve, reject) => { + if (!this.asyncIterator) { + this.asyncIterator = Deno.readdir(this.path)[Symbol.asyncIterator](); } + assert(this.asyncIterator); + this.asyncIterator + .next() + .then(({ value }) => { + resolve(value ? value : null); + if (callback) { + callback(null, value ? value : null); + } + }) + .catch((err) => { + if (callback) { + callback(err, null); + } + reject(err); + }); }); } diff --git a/std/node/_fs/_fs_exists.ts b/std/node/_fs/_fs_exists.ts index cc4f6573646c66e0e90f3a533babbecfb598e678..c3bea0d4ea2fde949482f9aa67ee0c44bcfca1af 100644 --- a/std/node/_fs/_fs_exists.ts +++ b/std/node/_fs/_fs_exists.ts @@ -2,25 +2,23 @@ type ExitsCallback = (exists: boolean) => void; -/* Deprecated in node api */ - +/** + * TODO: Also accept 'path' parameter as a Node polyfill Buffer or URL type once these + * are implemented. See https://github.com/denoland/deno/issues/3403 + * Deprecated in node api + */ export function exists(path: string, callback: ExitsCallback): void { - new Promise(async (resolve, reject) => { - try { - await Deno.lstat(path); - resolve(); - } catch (err) { - reject(err); - } - }) + Deno.lstat(path) .then(() => { callback(true); }) - .catch(() => { - callback(false); - }); + .catch(() => callback(false)); } +/** + * TODO: Also accept 'path' parameter as a Node polyfill Buffer or URL type once these + * are implemented. See https://github.com/denoland/deno/issues/3403 + */ export function existsSync(path: string): boolean { try { Deno.lstatSync(path); diff --git a/std/node/_fs/_fs_mkdir.ts b/std/node/_fs/_fs_mkdir.ts index 47c6c935a9b5feaa81c6fce2379c55b5b55f2473..5add5778d913e1dde38eadcbfd9ec572fef7d69d 100644 --- a/std/node/_fs/_fs_mkdir.ts +++ b/std/node/_fs/_fs_mkdir.ts @@ -1,7 +1,11 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. import { CallbackWithError } from "./_fs_common.ts"; -type Path = string; // TODO path can also be a Buffer or URL. +/** + * TODO: Also accept 'path' parameter as a Node polyfill Buffer or URL type once these + * are implemented. See https://github.com/denoland/deno/issues/3403 + */ +type Path = string; type MkdirOptions = | { recursive?: boolean; mode?: number | undefined } | number @@ -29,14 +33,7 @@ export function mkdir( throw new Deno.errors.InvalidData( "invalid recursive option , must be a boolean" ); - new Promise(async (resolve, reject) => { - try { - await Deno.mkdir(path, { recursive, mode }); - resolve(); - } catch (err) { - reject(err); - } - }) + Deno.mkdir(path, { recursive, mode }) .then(() => { if (callback && typeof callback == "function") { callback();