summaryrefslogtreecommitdiff
path: root/std/node
diff options
context:
space:
mode:
authorCasper Beyer <caspervonb@pm.me>2021-02-02 19:05:46 +0800
committerGitHub <noreply@github.com>2021-02-02 12:05:46 +0100
commit6abf126c2a7a451cded8c6b5e6ddf1b69c84055d (patch)
treefd94c013a19fcb38954844085821ec1601c20e18 /std/node
parenta2b5d44f1aa9d64f448a2a3cc2001272e2f60b98 (diff)
chore: remove std directory (#9361)
This removes the std folder from the tree. Various parts of the tests are pretty tightly dependent on std (47 direct imports and 75 indirect imports, not counting the cli tests that use them as fixtures) so I've added std as a submodule for now.
Diffstat (limited to 'std/node')
-rw-r--r--std/node/README.md137
-rw-r--r--std/node/_crypto/constants.ts1
-rw-r--r--std/node/_crypto/pbkdf2.ts186
-rw-r--r--std/node/_crypto/pbkdf2_test.ts427
-rw-r--r--std/node/_crypto/randomBytes.ts67
-rw-r--r--std/node/_crypto/randomBytes_test.ts89
-rw-r--r--std/node/_crypto/types.ts3
-rw-r--r--std/node/_errors.ts2270
-rw-r--r--std/node/_fs/_fs_access.ts22
-rw-r--r--std/node/_fs/_fs_appendFile.ts131
-rw-r--r--std/node/_fs/_fs_appendFile_test.ts254
-rw-r--r--std/node/_fs/_fs_chmod.ts40
-rw-r--r--std/node/_fs/_fs_chmod_test.ts60
-rw-r--r--std/node/_fs/_fs_chown.ts28
-rw-r--r--std/node/_fs/_fs_chown_test.ts69
-rw-r--r--std/node/_fs/_fs_close.ts18
-rw-r--r--std/node/_fs/_fs_close_test.ts96
-rw-r--r--std/node/_fs/_fs_common.ts162
-rw-r--r--std/node/_fs/_fs_constants.ts18
-rw-r--r--std/node/_fs/_fs_copy.ts18
-rw-r--r--std/node/_fs/_fs_copy_test.ts53
-rw-r--r--std/node/_fs/_fs_dir.ts91
-rw-r--r--std/node/_fs/_fs_dir_test.ts200
-rw-r--r--std/node/_fs/_fs_dirent.ts46
-rw-r--r--std/node/_fs/_fs_dirent_test.ts79
-rw-r--r--std/node/_fs/_fs_exists.ts31
-rw-r--r--std/node/_fs/_fs_exists_test.ts58
-rw-r--r--std/node/_fs/_fs_link.ts36
-rw-r--r--std/node/_fs/_fs_link_test.ts77
-rw-r--r--std/node/_fs/_fs_lstat.ts59
-rw-r--r--std/node/_fs/_fs_lstat_test.ts70
-rw-r--r--std/node/_fs/_fs_mkdir.ts71
-rw-r--r--std/node/_fs/_fs_mkdir_test.ts44
-rw-r--r--std/node/_fs/_fs_mkdtemp.ts98
-rw-r--r--std/node/_fs/_fs_mkdtemp_test.ts84
-rw-r--r--std/node/_fs/_fs_open.ts109
-rw-r--r--std/node/_fs/_fs_open_test.ts221
-rw-r--r--std/node/_fs/_fs_readFile.ts97
-rw-r--r--std/node/_fs/_fs_readFile_test.ts118
-rw-r--r--std/node/_fs/_fs_readdir.ts116
-rw-r--r--std/node/_fs/_fs_readdir_test.ts91
-rw-r--r--std/node/_fs/_fs_readlink.ts81
-rw-r--r--std/node/_fs/_fs_readlink_test.ts75
-rw-r--r--std/node/_fs/_fs_realpath.ts23
-rw-r--r--std/node/_fs/_fs_realpath_test.ts54
-rw-r--r--std/node/_fs/_fs_rename.ts21
-rw-r--r--std/node/_fs/_fs_rename_test.ts51
-rw-r--r--std/node/_fs/_fs_rmdir.ts35
-rw-r--r--std/node/_fs/_fs_rmdir_test.ts100
-rw-r--r--std/node/_fs/_fs_stat.ts289
-rw-r--r--std/node/_fs/_fs_stat_test.ts130
-rw-r--r--std/node/_fs/_fs_unlink.ts8
-rw-r--r--std/node/_fs/_fs_unlink_test.ts39
-rw-r--r--std/node/_fs/_fs_watch.ts111
-rw-r--r--std/node/_fs/_fs_watch_test.ts26
-rw-r--r--std/node/_fs/_fs_writeFile.ts113
-rw-r--r--std/node/_fs/_fs_writeFile_test.ts310
-rw-r--r--std/node/_fs/promises/_fs_readFile.ts30
-rw-r--r--std/node/_fs/promises/_fs_readFile_test.ts62
-rw-r--r--std/node/_fs/promises/_fs_writeFile.ts18
-rw-r--r--std/node/_fs/promises/_fs_writeFile_test.ts137
-rw-r--r--std/node/_fs/promises/mod.ts2
-rw-r--r--std/node/_fs/testdata/hello.txt1
-rw-r--r--std/node/_stream/async_iterator.ts243
-rw-r--r--std/node/_stream/async_iterator_test.ts249
-rw-r--r--std/node/_stream/buffer_list.ts183
-rw-r--r--std/node/_stream/destroy.ts38
-rw-r--r--std/node/_stream/duplex.ts682
-rw-r--r--std/node/_stream/duplex_internal.ts296
-rw-r--r--std/node/_stream/duplex_test.ts698
-rw-r--r--std/node/_stream/end_of_stream.ts241
-rw-r--r--std/node/_stream/end_of_stream_test.ts97
-rw-r--r--std/node/_stream/from.ts102
-rw-r--r--std/node/_stream/passthrough.ts20
-rw-r--r--std/node/_stream/pipeline.ts308
-rw-r--r--std/node/_stream/pipeline_test.ts387
-rw-r--r--std/node/_stream/promises.ts42
-rw-r--r--std/node/_stream/promises_test.ts84
-rw-r--r--std/node/_stream/readable.ts788
-rw-r--r--std/node/_stream/readable_internal.ts438
-rw-r--r--std/node/_stream/readable_test.ts489
-rw-r--r--std/node/_stream/stream.ts81
-rw-r--r--std/node/_stream/symbols.ts4
-rw-r--r--std/node/_stream/transform.ts132
-rw-r--r--std/node/_stream/transform_test.ts68
-rw-r--r--std/node/_stream/writable.ts443
-rw-r--r--std/node/_stream/writable_internal.ts457
-rw-r--r--std/node/_stream/writable_test.ts209
-rw-r--r--std/node/_util/_util_callbackify.ts125
-rw-r--r--std/node/_util/_util_callbackify_test.ts390
-rw-r--r--std/node/_util/_util_promisify.ts125
-rw-r--r--std/node/_util/_util_promisify_test.ts236
-rw-r--r--std/node/_util/_util_types.ts233
-rw-r--r--std/node/_util/_util_types_test.ts509
-rw-r--r--std/node/_utils.ts247
-rw-r--r--std/node/assert.ts42
-rw-r--r--std/node/assert_test.ts65
-rw-r--r--std/node/assertion_error.ts576
-rw-r--r--std/node/assertion_error_test.ts176
-rw-r--r--std/node/buffer.ts601
-rw-r--r--std/node/buffer_test.ts649
-rw-r--r--std/node/crypto.ts6
-rw-r--r--std/node/events.ts558
-rw-r--r--std/node/events_test.ts687
-rw-r--r--std/node/fs.ts117
-rw-r--r--std/node/global.d.ts33
-rw-r--r--std/node/global.ts42
-rw-r--r--std/node/global_test.ts71
-rw-r--r--std/node/module.ts1163
-rw-r--r--std/node/module_test.ts76
-rw-r--r--std/node/os.ts255
-rw-r--r--std/node/os_test.ts270
-rw-r--r--std/node/path.ts4
-rw-r--r--std/node/process.ts318
-rw-r--r--std/node/process_exit_test.ts19
-rw-r--r--std/node/process_test.ts196
-rw-r--r--std/node/querystring.ts167
-rw-r--r--std/node/querystring_test.ts30
-rw-r--r--std/node/stream.ts53
-rw-r--r--std/node/stream_test.ts133
-rw-r--r--std/node/string_decoder.ts313
-rw-r--r--std/node/string_decoder_test.ts118
-rw-r--r--std/node/tests/cjs/cjs_a.js11
-rw-r--r--std/node/tests/cjs/cjs_b.js6
-rw-r--r--std/node/tests/cjs/cjs_builtin.js11
-rw-r--r--std/node/tests/cjs/cjs_cycle_a.js4
-rw-r--r--std/node/tests/cjs/cjs_cycle_b.js4
-rw-r--r--std/node/tests/cjs/cjs_throw.js6
l---------std/node/tests/cjs/dir1
-rw-r--r--std/node/tests/cjs/index.js2
-rw-r--r--std/node/tests/cjs/subdir/cjs_c.js2
-rw-r--r--std/node/tests/cjs/subdir/dir/index.js4
-rw-r--r--std/node/tests/node_modules/left-pad/README.md36
-rw-r--r--std/node/tests/node_modules/left-pad/index.js52
-rw-r--r--std/node/tests/node_modules/left-pad/package.json68
-rw-r--r--std/node/tests/package.json15
-rw-r--r--std/node/timers.ts23
-rw-r--r--std/node/url.ts145
-rw-r--r--std/node/url_test.ts10
-rw-r--r--std/node/util.ts167
-rw-r--r--std/node/util_test.ts247
141 files changed, 0 insertions, 23857 deletions
diff --git a/std/node/README.md b/std/node/README.md
deleted file mode 100644
index 5f0d8511a..000000000
--- a/std/node/README.md
+++ /dev/null
@@ -1,137 +0,0 @@
-# Deno Node compatibility
-
-This module is meant to have a compatibility layer for the
-[NodeJS standard library](https://nodejs.org/docs/latest-v12.x/api/).
-
-**Warning**: Any function of this module should not be referred anywhere in the
-deno standard library as it's a compatibility module.
-
-## Supported Builtins
-
-- [ ] assert
-- [x] buffer
-- [ ] child_process
-- [ ] cluster
-- [ ] console
-- [ ] crypto
-- [ ] dgram
-- [ ] dns
-- [x] events
-- [x] fs _partly_
-- [ ] http
-- [ ] http2
-- [ ] https
-- [x] module
-- [ ] net
-- [x] os _partly_
-- [x] path
-- [ ] perf_hooks
-- [x] process _partly_
-- [x] querystring
-- [ ] readline
-- [ ] repl
-- [ ] stream
-- [ ] string_decoder
-- [ ] sys
-- [x] timers
-- [ ] tls
-- [ ] tty
-- [ ] url
-- [x] util _partly_
-- [ ] ~~v8~~ _can't implement_
-- [ ] vm
-- [ ] worker_threads
-- [ ] zlib
-
-* [x] node globals _partly_
-
-### Deprecated
-
-These builtins are deprecated in NodeJS v13 and will probably not be polyfilled:
-
-- constants
-- domain
-- freelist
-- punycode
-
-### Experimental
-
-These builtins are experimental in NodeJS v13 and will not be polyfilled until
-they are stable:
-
-- async_hooks
-- inspector
-- policies
-- report
-- trace_events
-- wasi
-
-## CommonJS Module Loading
-
-`createRequire(...)` is provided to create a `require` function for loading CJS
-modules. It also sets supported globals.
-
-```ts
-import { createRequire } from "https://deno.land/std@$STD_VERSION/node/module.ts";
-
-const require = createRequire(import.meta.url);
-// Loads native module polyfill.
-const path = require("path");
-// Loads extensionless module.
-const cjsModule = require("./my_mod");
-// Visits node_modules.
-const leftPad = require("left-pad");
-```
-
-## Contributing
-
-When converting from promise-based to callback-based APIs, the most obvious way
-is like this:
-
-```ts
-promise.then((value) => callback(null, value)).catch(callback);
-```
-
-This has a subtle bug - if the callback throws an error, the catch statement
-will also catch _that_ error, and the callback will be called twice. The correct
-way to do it is like this:
-
-```ts
-promise.then((value) => callback(null, value), callback);
-```
-
-The second parameter of `then` can also be used to catch errors, but only errors
-from the existing promise, not the new one created by the callback.
-
-If the Deno equivalent is actually synchronous, there's a similar problem with
-try/catch statements:
-
-```ts
-try {
- const value = process();
- callback(null, value);
-} catch (err) {
- callback(err);
-}
-```
-
-Since the callback is called within the `try` block, any errors from it will be
-caught and call the callback again.
-
-The correct way to do it is like this:
-
-```ts
-let err, value;
-try {
- value = process();
-} catch (e) {
- err = e;
-}
-if (err) {
- callback(err); // Make sure arguments.length === 1
-} else {
- callback(null, value);
-}
-```
-
-It's not as clean, but prevents the callback being called twice.
diff --git a/std/node/_crypto/constants.ts b/std/node/_crypto/constants.ts
deleted file mode 100644
index cfe3f4626..000000000
--- a/std/node/_crypto/constants.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const MAX_ALLOC = Math.pow(2, 30) - 1;
diff --git a/std/node/_crypto/pbkdf2.ts b/std/node/_crypto/pbkdf2.ts
deleted file mode 100644
index 2a63802e6..000000000
--- a/std/node/_crypto/pbkdf2.ts
+++ /dev/null
@@ -1,186 +0,0 @@
-import { createHash } from "../../hash/mod.ts";
-import { Buffer } from "../buffer.ts";
-import { MAX_ALLOC } from "./constants.ts";
-import { HASH_DATA } from "./types.ts";
-
-export type NormalizedAlgorithms =
- | "md5"
- | "ripemd160"
- | "sha1"
- | "sha224"
- | "sha256"
- | "sha384"
- | "sha512";
-
-type Algorithms =
- | "md5"
- | "ripemd160"
- | "rmd160"
- | "sha1"
- | "sha224"
- | "sha256"
- | "sha384"
- | "sha512";
-
-function createHasher(alg: Algorithms) {
- let normalizedAlg: NormalizedAlgorithms;
- if (alg === "rmd160") {
- normalizedAlg = "ripemd160";
- } else {
- normalizedAlg = alg;
- }
- return (value: Uint8Array) =>
- Buffer.from(createHash(normalizedAlg).update(value).digest());
-}
-
-function getZeroes(zeros: number) {
- return Buffer.alloc(zeros);
-}
-const sizes = {
- md5: 16,
- sha1: 20,
- sha224: 28,
- sha256: 32,
- sha384: 48,
- sha512: 64,
- rmd160: 20,
- ripemd160: 20,
-};
-
-function toBuffer(bufferable: HASH_DATA) {
- if (bufferable instanceof Uint8Array || typeof bufferable === "string") {
- return Buffer.from(bufferable as Uint8Array);
- } else {
- return Buffer.from(bufferable.buffer);
- }
-}
-
-class Hmac {
- hash: (value: Uint8Array) => Buffer;
- ipad1: Buffer;
- opad: Buffer;
- alg: string;
- blocksize: number;
- size: number;
- ipad2: Buffer;
-
- constructor(alg: Algorithms, key: Buffer, saltLen: number) {
- this.hash = createHasher(alg);
-
- const blocksize = (alg === "sha512" || alg === "sha384") ? 128 : 64;
-
- if (key.length > blocksize) {
- key = this.hash(key);
- } else if (key.length < blocksize) {
- key = Buffer.concat([key, getZeroes(blocksize - key.length)], blocksize);
- }
-
- const ipad = Buffer.allocUnsafe(blocksize + sizes[alg]);
- const opad = Buffer.allocUnsafe(blocksize + sizes[alg]);
- for (let i = 0; i < blocksize; i++) {
- ipad[i] = key[i] ^ 0x36;
- opad[i] = key[i] ^ 0x5C;
- }
-
- const ipad1 = Buffer.allocUnsafe(blocksize + saltLen + 4);
- ipad.copy(ipad1, 0, 0, blocksize);
-
- this.ipad1 = ipad1;
- this.ipad2 = ipad;
- this.opad = opad;
- this.alg = alg;
- this.blocksize = blocksize;
- this.size = sizes[alg];
- }
-
- run(data: Buffer, ipad: Buffer) {
- data.copy(ipad, this.blocksize);
- const h = this.hash(ipad);
- h.copy(this.opad, this.blocksize);
- return this.hash(this.opad);
- }
-}
-
-/**
- * @param iterations Needs to be higher or equal than zero
- * @param keylen Needs to be higher or equal than zero but less than max allocation size (2^30)
- * @param digest Algorithm to be used for encryption
- */
-export function pbkdf2Sync(
- password: HASH_DATA,
- salt: HASH_DATA,
- iterations: number,
- keylen: number,
- digest: Algorithms = "sha1",
-): Buffer {
- if (typeof iterations !== "number" || iterations < 0) {
- throw new TypeError("Bad iterations");
- }
- if (typeof keylen !== "number" || keylen < 0 || keylen > MAX_ALLOC) {
- throw new TypeError("Bad key length");
- }
-
- const bufferedPassword = toBuffer(password);
- const bufferedSalt = toBuffer(salt);
-
- const hmac = new Hmac(digest, bufferedPassword, bufferedSalt.length);
-
- const DK = Buffer.allocUnsafe(keylen);
- const block1 = Buffer.allocUnsafe(bufferedSalt.length + 4);
- bufferedSalt.copy(block1, 0, 0, bufferedSalt.length);
-
- let destPos = 0;
- const hLen = sizes[digest];
- const l = Math.ceil(keylen / hLen);
-
- for (let i = 1; i <= l; i++) {
- block1.writeUInt32BE(i, bufferedSalt.length);
-
- const T = hmac.run(block1, hmac.ipad1);
- let U = T;
-
- for (let j = 1; j < iterations; j++) {
- U = hmac.run(U, hmac.ipad2);
- for (let k = 0; k < hLen; k++) T[k] ^= U[k];
- }
-
- T.copy(DK, destPos);
- destPos += hLen;
- }
-
- return DK;
-}
-
-/**
- * @param iterations Needs to be higher or equal than zero
- * @param keylen Needs to be higher or equal than zero but less than max allocation size (2^30)
- * @param digest Algorithm to be used for encryption
- */
-export function pbkdf2(
- password: HASH_DATA,
- salt: HASH_DATA,
- iterations: number,
- keylen: number,
- digest: Algorithms = "sha1",
- callback: ((err: Error | null, derivedKey?: Buffer) => void),
-): void {
- setTimeout(() => {
- let err = null, res;
- try {
- res = pbkdf2Sync(
- password,
- salt,
- iterations,
- keylen,
- digest,
- );
- } catch (e) {
- err = e;
- }
- if (err) {
- callback(err);
- } else {
- callback(null, res);
- }
- }, 0);
-}
diff --git a/std/node/_crypto/pbkdf2_test.ts b/std/node/_crypto/pbkdf2_test.ts
deleted file mode 100644
index 29f149cbe..000000000
--- a/std/node/_crypto/pbkdf2_test.ts
+++ /dev/null
@@ -1,427 +0,0 @@
-import {
- NormalizedAlgorithms as Algorithms,
- pbkdf2,
- pbkdf2Sync,
-} from "./pbkdf2.ts";
-import {
- assert,
- assertEquals,
- assertStringIncludes,
-} from "../../testing/asserts.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-
-type Pbkdf2Fixture = {
- key: string | Float64Array | Int32Array | Uint8Array;
- salt: string | Float64Array | Int32Array | Uint8Array;
- iterations: number;
- dkLen: number;
- results: { [key in Algorithms]: string };
-};
-
-const fixtures: Pbkdf2Fixture[] = [
- {
- "key": "password",
- "salt": "salt",
- "iterations": 1,
- "dkLen": 32,
- "results": {
- "md5": "f31afb6d931392daa5e3130f47f9a9b6e8e72029d8350b9fb27a9e0e00b9d991",
- "sha1":
- "0c60c80f961f0e71f3a9b524af6012062fe037a6e0f0eb94fe8fc46bdc637164",
- "sha256":
- "120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b",
- "sha512":
- "867f70cf1ade02cff3752599a3a53dc4af34c7a669815ae5d513554e1c8cf252",
- "sha224":
- "3c198cbdb9464b7857966bd05b7bc92bc1cc4e6e63155d4e490557fd85989497",
- "sha384":
- "c0e14f06e49e32d73f9f52ddf1d0c5c7191609233631dadd76a567db42b78676",
- "ripemd160":
- "b725258b125e0bacb0e2307e34feb16a4d0d6aed6cb4b0eee458fc1829020428",
- },
- },
- {
- "key": "password",
- "salt": "salt",
- "iterations": 2,
- "dkLen": 32,
- "results": {
- "md5": "042407b552be345ad6eee2cf2f7ed01dd9662d8f0c6950eaec7124aa0c82279e",
- "sha1":
- "ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957cae93136266537a8d7bf4b76",
- "sha256":
- "ae4d0c95af6b46d32d0adff928f06dd02a303f8ef3c251dfd6e2d85a95474c43",
- "sha512":
- "e1d9c16aa681708a45f5c7c4e215ceb66e011a2e9f0040713f18aefdb866d53c",
- "sha224":
- "93200ffa96c5776d38fa10abdf8f5bfc0054b9718513df472d2331d2d1e66a3f",
- "sha384":
- "54f775c6d790f21930459162fc535dbf04a939185127016a04176a0730c6f1f4",
- "ripemd160":
- "768dcc27b7bfdef794a1ff9d935090fcf598555e66913180b9ce363c615e9ed9",
- },
- },
- {
- "key": "password",
- "salt": "salt",
- "iterations": 1,
- "dkLen": 64,
- "results": {
- "md5":
- "f31afb6d931392daa5e3130f47f9a9b6e8e72029d8350b9fb27a9e0e00b9d9915a5f18928639ca8bbc3d1c1cb66d4f27b9dfe39156774c6798b42adc57ed253f",
- "sha1":
- "0c60c80f961f0e71f3a9b524af6012062fe037a6e0f0eb94fe8fc46bdc637164ac2e7a8e3f9d2e83ace57e0d50e5e1071367c179bc86c767fc3f78ddb561363f",
- "sha256":
- "120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b4dbf3a2f3dad3377264bb7b8e8330d4efc7451418617dabef683735361cdc18c",
- "sha512":
- "867f70cf1ade02cff3752599a3a53dc4af34c7a669815ae5d513554e1c8cf252c02d470a285a0501bad999bfe943c08f050235d7d68b1da55e63f73b60a57fce",
- "sha224":
- "3c198cbdb9464b7857966bd05b7bc92bc1cc4e6e63155d4e490557fd859894978ab846d52a1083ac610c36c2c5ea8ce4a024dd691064d5453bd17b15ea1ac194",
- "sha384":
- "c0e14f06e49e32d73f9f52ddf1d0c5c7191609233631dadd76a567db42b78676b38fc800cc53ddb642f5c74442e62be44d727702213e3bb9223c53b767fbfb5d",
- "ripemd160":
- "b725258b125e0bacb0e2307e34feb16a4d0d6aed6cb4b0eee458fc18290204289e55d962783bf52237d264cbbab25f18d89d8c798f90f558ea7b45bdf3d08334",
- },
- },
- {
- "key": "password",
- "salt": "salt",
- "iterations": 2,
- "dkLen": 64,
- "results": {
- "md5":
- "042407b552be345ad6eee2cf2f7ed01dd9662d8f0c6950eaec7124aa0c82279ed0b7e2a854d0f29ec82ddcabe9760368e5821af8745d74846ccbd17afbfe5ff0",
- "sha1":
- "ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957cae93136266537a8d7bf4b76c51094cc1ae010b19923ddc4395cd064acb023ffd1edd5ef4be8ffe61426c28e",
- "sha256":
- "ae4d0c95af6b46d32d0adff928f06dd02a303f8ef3c251dfd6e2d85a95474c43830651afcb5c862f0b249bd031f7a67520d136470f5ec271ece91c07773253d9",
- "sha512":
- "e1d9c16aa681708a45f5c7c4e215ceb66e011a2e9f0040713f18aefdb866d53cf76cab2868a39b9f7840edce4fef5a82be67335c77a6068e04112754f27ccf4e",
- "sha224":
- "93200ffa96c5776d38fa10abdf8f5bfc0054b9718513df472d2331d2d1e66a3f97b510224f700ce72581ffb10a1c99ec99a8cc1b951851a71f30d9265fccf912",
- "sha384":
- "54f775c6d790f21930459162fc535dbf04a939185127016a04176a0730c6f1f4fb48832ad1261baadd2cedd50814b1c806ad1bbf43ebdc9d047904bf7ceafe1e",
- "ripemd160":
- "768dcc27b7bfdef794a1ff9d935090fcf598555e66913180b9ce363c615e9ed953b95fd07169be535e38afbea29c030e06d14f40745b1513b7ccdf0e76229e50",
- },
- },
- {
- "key": "password",
- "salt": "salt",
- "iterations": 4096,
- "dkLen": 32,
- "results": {
- "md5": "15001f89b9c29ee6998c520d1a0629e893cc3f996a08d27060e4c33305bf0fb2",
- "sha1":
- "4b007901b765489abead49d926f721d065a429c12e463f6c4cd79401085b03db",
- "sha256":
- "c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a",
- "sha512":
- "d197b1b33db0143e018b12f3d1d1479e6cdebdcc97c5c0f87f6902e072f457b5",
- "sha224":
- "218c453bf90635bd0a21a75d172703ff6108ef603f65bb821aedade1d6961683",
- "sha384":
- "559726be38db125bc85ed7895f6e3cf574c7a01c080c3447db1e8a76764deb3c",
- "ripemd160":
- "99a40d3fe4ee95869791d9faa24864562782762171480b620ca8bed3dafbbcac",
- },
- },
- {
- "key": "passwordPASSWORDpassword",
- "salt": "saltSALTsaltSALTsaltSALTsaltSALTsalt",
- "iterations": 4096,
- "dkLen": 40,
- "results": {
- "md5":
- "8d5d0aad94d14420429fbc7e5b087d7a5527e65dfd0d486a310e8a7b6ff5a21bed000b118b2c26a6",
- "sha1":
- "3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038b6b89a48612c5a25284e6605e12329",
- "sha256":
- "348c89dbcbd32b2f32d814b8116e84cf2b17347ebc1800181c4e2a1fb8dd53e1c635518c7dac47e9",
- "sha512":
- "8c0511f4c6e597c6ac6315d8f0362e225f3c501495ba23b868c005174dc4ee71115b59f9e60cd953",
- "sha224":
- "056c4ba438ded91fc14e0594e6f52b87e1f3690c0dc0fbc05784ed9a754ca780e6c017e80c8de278",
- "sha384":
- "819143ad66df9a552559b9e131c52ae6c5c1b0eed18f4d283b8c5c9eaeb92b392c147cc2d2869d58",
- "ripemd160":
- "503b9a069633b261b2d3e4f21c5d0cafeb3f5008aec25ed21418d12630b6ce036ec82a0430ef1974",
- },
- },
- {
- "key": "pass\u00000word",
- "salt": "sa\u00000lt",
- "iterations": 4096,
- "dkLen": 16,
- "results": {
- "md5": "2d6b566fd00069a30dd1ffdb4d598f54",
- "sha1": "345cbad979dfccb90cac5257bea6ea46",
- "sha256": "1df6274d3c0bd2fc7f54fb46f149dda4",
- "sha512": "336d14366099e8aac2c46c94a8f178d2",
- "sha224": "0aca9ca9634db6ef4927931f633c6453",
- "sha384": "b6ab6f8f6532fd9c5c30a79e1f93dcc6",
- "ripemd160": "914d58209e6483e491571a60e433124a",
- },
- },
- {
- "key": "63ffeeddccbbaa",
- "salt": "salt",
- "iterations": 1,
- "dkLen": 32,
- "results": {
- "md5": "23a33e38c9c57ea122df372a5b96347667e843ba21c79f150ce503d947449b75",
- "sha1":
- "1a12b21aa46bd3bed3a23b8ad072a1465585344b1516252618aabbc41276dada",
- "sha256":
- "a47c9371d4d4f663c2a0d3becbd475b7eb884722c7265391381d7696151470a6",
- "sha512":
- "09328469e02fcee4f6ab88a23037de33d54f17f786eee39e1f8826109ee54e16",
- "sha224":
- "59baceb002865e57061c65dd861c309c049a97207054416c943764efc38b94ed",
- "sha384":
- "01cc52b81eda47c8bc9861ab7f7de682e92a0d5e522f4d3a06a3b97be1856580",
- "ripemd160":
- "4f04f4782f2def250005e04ef0497403330b52a085ae856f4640700b19983b7c",
- },
- },
- {
- "key":
- "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about",
- "salt":
- "6d6e656d6f6e6963e383a1e383bce38388e383abe382abe38299e3838fe38299e382a6e38299e382a1e381afe3829ae381afe38299e3818fe38299e3829de38299e381a1e381a1e38299e58d81e4babae58d81e889b2",
- "iterations": 2048,
- "dkLen": 64,
- "results": {
- "md5":
- "029d0e4484f56d9cf7ab7ca972c8991aeb2be275cba9683db4143e9b72f67d49551ec4c70ca6d051538fc7a86b8568d08244fdea24ba826b7927babac4f62cf2",
- "sha1":
- "fb3fa7c05a98ff66da2eadd69fa2ba52401ee630e04322d3c5bb018d1dda03c7e47bdea0c9e4c77c87826632eed59bbe42ce05329a838664683b1a8dae3fffd8",
- "sha256":
- "3b19907cb907d1ee6e5a0ecb80bd66e2776d1f2c73f4789eafcad94fda832e970471ceb0d200ede70e63ae021044cf4b58b1011e34252ace8d94a48c287906ec",
- "sha512":
- "0be4563c5175fd02b042251228774f34c1ccb235054a9f0f968c6d828466eae8c32433a7aa09ce922722dc808c6a1629ba8f1b6ba46f0cf7a921e125d1cc9fcd",
- "sha224":
- "dd529ad11b298cafad9209a0a620af98cf1b782bd0ba1a61efcd74a4fe2662af6c36ffd015c68ed0cd630bdb023ea61e59317eb07b342e0c6ece1bd3034b768c",
- "sha384":
- "7265c090b602b0a432b4908f70b6a5a2a6657926d09ac72ebb78d8bcc81e0d4563316f1eb5570b2850ef06a14719746a8a8397d3d56aa51b2d50489741b7ff61",
- "ripemd160":
- "c984beaf664aea5ae7f671063ef2ad1f80098e48382a916809ff9212d1a8cb7ad6cb17354422717c668726dfce294e1442bb354b6a6693db84032172e77af6ae",
- },
- },
- {
- "key": "password",
- "salt": "salt",
- "iterations": 1,
- "dkLen": 10,
- "results": {
- "md5": "f31afb6d931392daa5e3",
- "sha1": "0c60c80f961f0e71f3a9",
- "sha256": "120fb6cffcf8b32c43e7",
- "sha512": "867f70cf1ade02cff375",
- "sha224": "3c198cbdb9464b785796",
- "sha384": "c0e14f06e49e32d73f9f",
- "ripemd160": "b725258b125e0bacb0e2",
- },
- },
- {
- "key": "password",
- "salt": "salt",
- "iterations": 1,
- "dkLen": 100,
- "results": {
- "md5":
- "f31afb6d931392daa5e3130f47f9a9b6e8e72029d8350b9fb27a9e0e00b9d9915a5f18928639ca8bbc3d1c1cb66d4f27b9dfe39156774c6798b42adc57ed253f44fc731edccf067904ce2e317b9ef45767add4dfe53f8c190dac43d90cda5e66e627d4f2",
- "sha1":
- "0c60c80f961f0e71f3a9b524af6012062fe037a6e0f0eb94fe8fc46bdc637164ac2e7a8e3f9d2e83ace57e0d50e5e1071367c179bc86c767fc3f78ddb561363fc692ba406d1301e42bcccc3c520d06751d78b80c3db926b16ffa3395bd697c647f280b51",
- "sha256":
- "120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b4dbf3a2f3dad3377264bb7b8e8330d4efc7451418617dabef683735361cdc18c22cd7fe60fa40e91c65849e1f60c0d8b62a7b2dbd0d3dfd75fb8498a5c2131ab02b66de5",
- "sha512":
- "867f70cf1ade02cff3752599a3a53dc4af34c7a669815ae5d513554e1c8cf252c02d470a285a0501bad999bfe943c08f050235d7d68b1da55e63f73b60a57fce7b532e206c2967d4c7d2ffa460539fc4d4e5eec70125d74c6c7cf86d25284f297907fcea",
- "sha224":
- "3c198cbdb9464b7857966bd05b7bc92bc1cc4e6e63155d4e490557fd859894978ab846d52a1083ac610c36c2c5ea8ce4a024dd691064d5453bd17b15ea1ac1944bbfd62e61b997e7b22660f588e297186572480015f33bc2bfd2b423827bcdcdb4845914",
- "sha384":
- "c0e14f06e49e32d73f9f52ddf1d0c5c7191609233631dadd76a567db42b78676b38fc800cc53ddb642f5c74442e62be44d727702213e3bb9223c53b767fbfb5db9d270d54c45d9cb6003d2967280b22671e2dbc6375f6ebf219c36f0d127be35e19d65a8",
- "ripemd160":
- "b725258b125e0bacb0e2307e34feb16a4d0d6aed6cb4b0eee458fc18290204289e55d962783bf52237d264cbbab25f18d89d8c798f90f558ea7b45bdf3d083340c18b9d23ba842183c5364d18bc0ffde5a8a408dd7ef02dde561a08d21c6d2325a69869b",
- },
- },
- {
- "key": new Uint8Array([112, 97, 115, 115, 119, 111, 114, 100]),
- "salt": "salt",
- "iterations": 1,
- "dkLen": 32,
- "results": {
- "md5": "f31afb6d931392daa5e3130f47f9a9b6e8e72029d8350b9fb27a9e0e00b9d991",
- "sha1":
- "0c60c80f961f0e71f3a9b524af6012062fe037a6e0f0eb94fe8fc46bdc637164",
- "sha256":
- "120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b",
- "sha512":
- "867f70cf1ade02cff3752599a3a53dc4af34c7a669815ae5d513554e1c8cf252",
- "sha224":
- "3c198cbdb9464b7857966bd05b7bc92bc1cc4e6e63155d4e490557fd85989497",
- "sha384":
- "c0e14f06e49e32d73f9f52ddf1d0c5c7191609233631dadd76a567db42b78676",
- "ripemd160":
- "b725258b125e0bacb0e2307e34feb16a4d0d6aed6cb4b0eee458fc1829020428",
- },
- },
- {
- "key": "password",
- "salt": new Uint8Array([115, 97, 108, 116]),
- "iterations": 1,
- "dkLen": 32,
- "results": {
- "md5": "f31afb6d931392daa5e3130f47f9a9b6e8e72029d8350b9fb27a9e0e00b9d991",
- "sha1":
- "0c60c80f961f0e71f3a9b524af6012062fe037a6e0f0eb94fe8fc46bdc637164",
- "sha256":
- "120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b",
- "sha512":
- "867f70cf1ade02cff3752599a3a53dc4af34c7a669815ae5d513554e1c8cf252",
- "sha224":
- "3c198cbdb9464b7857966bd05b7bc92bc1cc4e6e63155d4e490557fd85989497",
- "sha384":
- "c0e14f06e49e32d73f9f52ddf1d0c5c7191609233631dadd76a567db42b78676",
- "ripemd160":
- "b725258b125e0bacb0e2307e34feb16a4d0d6aed6cb4b0eee458fc1829020428",
- },
- },
- {
- "key": new Int32Array([112, 97, 115, 115, 119, 111, 114, 100]),
- "salt": "salt",
- "iterations": 1,
- "dkLen": 32,
- "results": {
- "md5": "81de8e85b07d7969d9fe530641b63cc4ecbbf2345037cdc0ba61ad329fc7029c",
- "sha1":
- "f260ccd0bbc8fe6773119b834feec48636b716caad4180a4d0af4f9aa67c646e",
- "sha256":
- "9b4608f5eeab348f0b9d85a918b140706b24f275acf6829382dfee491015f9eb",
- "sha512":
- "c44b8f26550fe6ca0a55bce54b4a75e9530398f32ec28b59d0fded996e95e3d5",
- "sha224":
- "03d0c2b530ec6339e6418cb0f906e50591619be40aa8817aa9c7305d1773231c",
- "sha384":
- "2e69d62ae8c21ebc2de45a885b488f65fb88dfa58aaa9c57dd1fcb9d1edce96a",
- "ripemd160":
- "fc69276ba3f145492065feb0259b9edf68179f2023c95094e71ac7d01748018a",
- },
- },
- {
- "key": "password",
- "salt": new Int32Array([115, 97, 108, 116]),
- "iterations": 1,
- "dkLen": 32,
- "results": {
- "md5": "36587a57770a8eef264391786b4ddfae0723f6a64dc2fc199fe7eb6ad9def701",
- "sha1":
- "b297f1ea23008f10ba9d645961e4661109e804b10af26bea22c44244492d6252",
- "sha256":
- "f678f0772894c079f21377d9ee1e76dd77b62dfc1f0575e6aa9eb030af7a356a",
- "sha512":
- "7f8133f6937ae1d7e4a43c19aabd2de8308d5b833341281716a501334cdb2470",
- "sha224":
- "ab66d29d3dacc731e44f091a7baa051926219cf493e8b9e3934cedfb215adc8b",
- "sha384":
- "cf139d648cf63e9b85a3b9b8f23f4445b84d22201bc2544bc273a17d5dcb7b28",
- "ripemd160":
- "26142e48fae1ad1c53be54823aadda2aa7d42f5524463fb1eff0efafa08edb9d",
- },
- },
- {
- "key": new Float64Array([112, 97, 115, 115, 119, 111, 114, 100]),
- "salt": "salt",
- "iterations": 1,
- "dkLen": 32,
- "results": {
- "md5": "48336072da7d11ff203c61705b384b1c60953e7d1677fed2cd3e65738d60e67e",
- "sha1":
- "c2b17a7e98cc48690a92cd9f753a2c700229045905167571aa281aafe8230bba",
- "sha256":
- "55d62579a083a6c14b886710f81b54f567d214d343af776e5e90c467ea81b821",
- "sha512":
- "ded01ce343e2683d962fc74b7b5ceef525228f49393ce9353254f44e3dc7e9aa",
- "sha224":
- "5f10a348d320c7555b972b8d7d45a363a91e1a82dea063c3ac495cfad74a8d89",
- "sha384":
- "4b7f97dbadfd652e0579499d0e23607ec476ed4bea9d6f1740d0b110e2d08792",
- "ripemd160":
- "f92080d972a649d98d91a53922863fc7b8076c54869e9885f9a804868ef752e0",
- },
- },
- {
- "key": "password",
- "salt": new Float64Array([115, 97, 108, 116]),
- "iterations": 1,
- "dkLen": 32,
- "results": {
- "md5": "9f1716e6f9d77b0beb56758f9509edea50828d15909073c3c715f66173ac3716",
- "sha1":
- "f158b9edd28c16ad3b41e0e8197ec132a98c2ddea73b959f55ec9792e0b29d6f",
- "sha256":
- "a6154d17480547a10212f75883509842f88f2ca5d6c1a2419646e47342051852",
- "sha512":
- "b10c2ea742de7dd0525988761ee1733564c91380eeaa1b199f4fafcbf7144b0c",
- "sha224":
- "29b315ac30c7d5e1640ca0f9e27b68a794fb9f950b8dd117129824f103ffb9db",
- "sha384":
- "624b4ed6ad389b976fb7503e54a35109f249c29ac6eb8b56850152be21b3cb0e",
- "ripemd160":
- "8999b9280207bc9c76cf25327aa352da26a683fac7a2adff17a39dcc4f4c3b5b",
- },
- },
-];
-
-Deno.test("pbkdf2 hashes data correctly", () => {
- fixtures.forEach(({
- dkLen,
- iterations,
- key,
- results,
- salt,
- }) => {
- for (const algorithm in results) {
- pbkdf2(
- key,
- salt,
- iterations,
- dkLen,
- algorithm as Algorithms,
- (err, res) => {
- assert(!err);
- assertEquals(
- res?.toString("hex"),
- results[algorithm as Algorithms],
- );
- },
- );
- }
- });
-});
-
-Deno.test("pbkdf2Sync hashes data correctly", () => {
- fixtures.forEach(({
- dkLen,
- iterations,
- key,
- results,
- salt,
- }) => {
- for (const algorithm in results) {
- assertEquals(
- pbkdf2Sync(key, salt, iterations, dkLen, algorithm as Algorithms)
- .toString("hex"),
- results[algorithm as Algorithms],
- );
- }
- });
-});
-
-Deno.test("[std/node/crypto] pbkdf2 callback isn't called twice if error is thrown", async () => {
- const importUrl = new URL("./pbkdf2.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { pbkdf2 } from ${JSON.stringify(importUrl)}`,
- invocation: 'pbkdf2("password", "salt", 1, 32, "sha1", ',
- });
-});
diff --git a/std/node/_crypto/randomBytes.ts b/std/node/_crypto/randomBytes.ts
deleted file mode 100644
index 335c92d68..000000000
--- a/std/node/_crypto/randomBytes.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { Buffer } from "../buffer.ts";
-
-export const MAX_RANDOM_VALUES = 65536;
-export const MAX_SIZE = 4294967295;
-
-function generateRandomBytes(size: number) {
- if (size > MAX_SIZE) {
- throw new RangeError(
- `The value of "size" is out of range. It must be >= 0 && <= ${MAX_SIZE}. Received ${size}`,
- );
- }
-
- const bytes = Buffer.allocUnsafe(size);
-
- //Work around for getRandomValues max generation
- if (size > MAX_RANDOM_VALUES) {
- for (let generated = 0; generated < size; generated += MAX_RANDOM_VALUES) {
- crypto.getRandomValues(
- bytes.slice(generated, generated + MAX_RANDOM_VALUES),
- );
- }
- } else {
- crypto.getRandomValues(bytes);
- }
-
- return bytes;
-}
-
-/**
- * @param size Buffer length, must be equal or greater than zero
- */
-export default function randomBytes(size: number): Buffer;
-export default function randomBytes(
- size: number,
- cb?: (err: Error | null, buf?: Buffer) => void,
-): void;
-export default function randomBytes(
- size: number,
- cb?: (err: Error | null, buf?: Buffer) => void,
-): Buffer | void {
- if (typeof cb === "function") {
- let err: Error | null = null, bytes: Buffer;
- try {
- bytes = generateRandomBytes(size);
- } catch (e) {
- //NodeJS nonsense
- //If the size is out of range it will throw sync, otherwise throw async
- if (
- e instanceof RangeError &&
- e.message.includes('The value of "size" is out of range')
- ) {
- throw e;
- } else {
- err = e;
- }
- }
- setTimeout(() => {
- if (err) {
- cb(err);
- } else {
- cb(null, bytes);
- }
- }, 0);
- } else {
- return generateRandomBytes(size);
- }
-}
diff --git a/std/node/_crypto/randomBytes_test.ts b/std/node/_crypto/randomBytes_test.ts
deleted file mode 100644
index 6dd2091e1..000000000
--- a/std/node/_crypto/randomBytes_test.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import {
- assert,
- assertEquals,
- assertStringIncludes,
- assertThrows,
- assertThrowsAsync,
-} from "../../testing/asserts.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import randomBytes, { MAX_RANDOM_VALUES, MAX_SIZE } from "./randomBytes.ts";
-
-Deno.test("randomBytes sync works correctly", function () {
- assertEquals(randomBytes(0).length, 0, "len: " + 0);
- assertEquals(randomBytes(3).length, 3, "len: " + 3);
- assertEquals(randomBytes(30).length, 30, "len: " + 30);
- assertEquals(randomBytes(300).length, 300, "len: " + 300);
- assertEquals(
- randomBytes(17 + MAX_RANDOM_VALUES).length,
- 17 + MAX_RANDOM_VALUES,
- "len: " + 17 + MAX_RANDOM_VALUES,
- );
- assertEquals(
- randomBytes(MAX_RANDOM_VALUES * 100).length,
- MAX_RANDOM_VALUES * 100,
- "len: " + MAX_RANDOM_VALUES * 100,
- );
- assertThrows(() => randomBytes(MAX_SIZE + 1));
- assertThrows(() => randomBytes(-1));
-});
-
-Deno.test("randomBytes async works correctly", function () {
- randomBytes(0, function (err, resp) {
- assert(!err);
- assertEquals(resp?.length, 0, "len: " + 0);
- });
- randomBytes(3, function (err, resp) {
- assert(!err);
- assertEquals(resp?.length, 3, "len: " + 3);
- });
- randomBytes(30, function (err, resp) {
- assert(!err);
- assertEquals(resp?.length, 30, "len: " + 30);
- });
- randomBytes(300, function (err, resp) {
- assert(!err);
- assertEquals(resp?.length, 300, "len: " + 300);
- });
- randomBytes(17 + MAX_RANDOM_VALUES, function (err, resp) {
- assert(!err);
- assertEquals(
- resp?.length,
- 17 + MAX_RANDOM_VALUES,
- "len: " + 17 + MAX_RANDOM_VALUES,
- );
- });
- randomBytes(MAX_RANDOM_VALUES * 100, function (err, resp) {
- assert(!err);
- assertEquals(
- resp?.length,
- MAX_RANDOM_VALUES * 100,
- "len: " + MAX_RANDOM_VALUES * 100,
- );
- });
- assertThrows(() =>
- randomBytes(MAX_SIZE + 1, function (err) {
- //Shouldn't throw async
- assert(!err);
- })
- );
- assertThrowsAsync(() =>
- new Promise((resolve, reject) => {
- randomBytes(-1, function (err, res) {
- //Shouldn't throw async
- if (err) {
- reject(err);
- } else {
- resolve(res);
- }
- });
- })
- );
-});
-
-Deno.test("[std/node/crypto] randomBytes callback isn't called twice if error is thrown", async () => {
- const importUrl = new URL("./randomBytes.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import randomBytes from ${JSON.stringify(importUrl)}`,
- invocation: "randomBytes(0, ",
- });
-});
diff --git a/std/node/_crypto/types.ts b/std/node/_crypto/types.ts
deleted file mode 100644
index e56d8416c..000000000
--- a/std/node/_crypto/types.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { Buffer } from "../buffer.ts";
-
-export type HASH_DATA = string | ArrayBufferView | Buffer;
diff --git a/std/node/_errors.ts b/std/node/_errors.ts
deleted file mode 100644
index db37e3186..000000000
--- a/std/node/_errors.ts
+++ /dev/null
@@ -1,2270 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-/************ NOT IMPLEMENTED
-* ERR_INVALID_ARG_VALUE
-* ERR_INVALID_MODULE_SPECIFIER
-* ERR_INVALID_PACKAGE_TARGET
-* ERR_INVALID_URL_SCHEME
-* ERR_MANIFEST_ASSERT_INTEGRITY
-* ERR_MODULE_NOT_FOUND
-* ERR_PACKAGE_PATH_NOT_EXPORTED
-* ERR_QUICSESSION_VERSION_NEGOTIATION
-* ERR_REQUIRE_ESM
-* ERR_SOCKET_BAD_PORT
-* ERR_TLS_CERT_ALTNAME_INVALID
-* ERR_UNHANDLED_ERROR
-* ERR_WORKER_INVALID_EXEC_ARGV
-* ERR_WORKER_PATH
-* ERR_QUIC_ERROR
-* ERR_SOCKET_BUFFER_SIZE //System error, shouldn't ever happen inside Deno
-* ERR_SYSTEM_ERROR //System error, shouldn't ever happen inside Deno
-* ERR_TTY_INIT_FAILED //System error, shouldn't ever happen inside Deno
-* ERR_INVALID_PACKAGE_CONFIG // package.json stuff, probably useless
-*************/
-
-import { unreachable } from "../testing/asserts.ts";
-
-/**
- * All error instances in Node have additional methods and properties
- * This export class is meant to be extended by these instances abstracting native JS error instances
- */
-export class NodeErrorAbstraction extends Error {
- code: string;
-
- constructor(name: string, code: string, message: string) {
- super(message);
- this.code = code;
- this.name = name;
- //This number changes dependending on the name of this class
- //20 characters as of now
- this.stack = this.stack && `${name} [${this.code}]${this.stack.slice(20)}`;
- }
-
- toString() {
- return `${this.name} [${this.code}]: ${this.message}`;
- }
-}
-
-export class NodeError extends NodeErrorAbstraction {
- constructor(code: string, message: string) {
- super(Error.prototype.name, code, message);
- }
-}
-
-export class NodeSyntaxError extends NodeErrorAbstraction
- implements SyntaxError {
- constructor(code: string, message: string) {
- super(SyntaxError.prototype.name, code, message);
- Object.setPrototypeOf(this, SyntaxError.prototype);
- }
-}
-
-export class NodeRangeError extends NodeErrorAbstraction {
- constructor(code: string, message: string) {
- super(RangeError.prototype.name, code, message);
- Object.setPrototypeOf(this, RangeError.prototype);
- }
-}
-
-export class NodeTypeError extends NodeErrorAbstraction implements TypeError {
- constructor(code: string, message: string) {
- super(TypeError.prototype.name, code, message);
- Object.setPrototypeOf(this, TypeError.prototype);
- }
-}
-
-export class NodeURIError extends NodeErrorAbstraction implements URIError {
- constructor(code: string, message: string) {
- super(URIError.prototype.name, code, message);
- Object.setPrototypeOf(this, URIError.prototype);
- }
-}
-
-export class ERR_INVALID_ARG_TYPE extends NodeTypeError {
- constructor(a1: string, a2: string | string[], a3: unknown) {
- super(
- "ERR_INVALID_ARG_TYPE",
- `The "${a1}" argument must be of type ${
- typeof a2 === "string"
- ? a2.toLocaleLowerCase()
- : a2.map((x) => x.toLocaleLowerCase()).join(", ")
- }. Received ${typeof a3} (${a3})`,
- );
- }
-}
-
-export class ERR_OUT_OF_RANGE extends RangeError {
- code = "ERR_OUT_OF_RANGE";
-
- constructor(str: string, range: string, received: unknown) {
- super(
- `The value of "${str}" is out of range. It must be ${range}. Received ${received}`,
- );
-
- const { name } = this;
- // Add the error code to the name to include it in the stack trace.
- this.name = `${name} [${this.code}]`;
- // Access the stack to generate the error message including the error code from the name.
- this.stack;
- // Reset the name to the actual name.
- this.name = name;
- }
-}
-
-export class ERR_AMBIGUOUS_ARGUMENT extends NodeTypeError {
- constructor(x: string, y: string) {
- super("ERR_AMBIGUOUS_ARGUMENT", `The "${x}" argument is ambiguous. ${y}`);
- }
-}
-
-export class ERR_ARG_NOT_ITERABLE extends NodeTypeError {
- constructor(x: string) {
- super("ERR_ARG_NOT_ITERABLE", `${x} must be iterable`);
- }
-}
-
-export class ERR_ASSERTION extends NodeError {
- constructor(x: string) {
- super("ERR_ASSERTION", `${x}`);
- }
-}
-
-export class ERR_ASYNC_CALLBACK extends NodeTypeError {
- constructor(x: string) {
- super("ERR_ASYNC_CALLBACK", `${x} must be a function`);
- }
-}
-
-export class ERR_ASYNC_TYPE extends NodeTypeError {
- constructor(x: string) {
- super("ERR_ASYNC_TYPE", `Invalid name for async "type": ${x}`);
- }
-}
-
-export class ERR_BROTLI_INVALID_PARAM extends NodeRangeError {
- constructor(x: string) {
- super("ERR_BROTLI_INVALID_PARAM", `${x} is not a valid Brotli parameter`);
- }
-}
-
-export class ERR_BUFFER_OUT_OF_BOUNDS extends NodeRangeError {
- constructor(name?: string) {
- super(
- "ERR_BUFFER_OUT_OF_BOUNDS",
- name
- ? `"${name}" is outside of buffer bounds`
- : "Attempt to access memory outside buffer bounds",
- );
- }
-}
-
-export class ERR_BUFFER_TOO_LARGE extends NodeRangeError {
- constructor(x: string) {
- super(
- "ERR_BUFFER_TOO_LARGE",
- `Cannot create a Buffer larger than ${x} bytes`,
- );
- }
-}
-
-export class ERR_CANNOT_WATCH_SIGINT extends NodeError {
- constructor() {
- super(
- "ERR_CANNOT_WATCH_SIGINT",
- "Cannot watch for SIGINT signals",
- );
- }
-}
-
-export class ERR_CHILD_CLOSED_BEFORE_REPLY extends NodeError {
- constructor() {
- super(
- "ERR_CHILD_CLOSED_BEFORE_REPLY",
- "Child closed before reply received",
- );
- }
-}
-
-export class ERR_CHILD_PROCESS_IPC_REQUIRED extends NodeError {
- constructor(x: string) {
- super(
- "ERR_CHILD_PROCESS_IPC_REQUIRED",
- `Forked processes must have an IPC channel, missing value 'ipc' in ${x}`,
- );
- }
-}
-
-export class ERR_CHILD_PROCESS_STDIO_MAXBUFFER extends NodeRangeError {
- constructor(x: string) {
- super(
- "ERR_CHILD_PROCESS_STDIO_MAXBUFFER",
- `${x} maxBuffer length exceeded`,
- );
- }
-}
-
-export class ERR_CONSOLE_WRITABLE_STREAM extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_CONSOLE_WRITABLE_STREAM",
- `Console expects a writable stream instance for ${x}`,
- );
- }
-}
-
-export class ERR_CONTEXT_NOT_INITIALIZED extends NodeError {
- constructor() {
- super(
- "ERR_CONTEXT_NOT_INITIALIZED",
- "context used is not initialized",
- );
- }
-}
-
-export class ERR_CPU_USAGE extends NodeError {
- constructor(x: string) {
- super(
- "ERR_CPU_USAGE",
- `Unable to obtain cpu usage ${x}`,
- );
- }
-}
-
-export class ERR_CRYPTO_CUSTOM_ENGINE_NOT_SUPPORTED extends NodeError {
- constructor() {
- super(
- "ERR_CRYPTO_CUSTOM_ENGINE_NOT_SUPPORTED",
- "Custom engines not supported by this OpenSSL",
- );
- }
-}
-
-export class ERR_CRYPTO_ECDH_INVALID_FORMAT extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_CRYPTO_ECDH_INVALID_FORMAT",
- `Invalid ECDH format: ${x}`,
- );
- }
-}
-
-export class ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY extends NodeError {
- constructor() {
- super(
- "ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY",
- "Public key is not valid for specified curve",
- );
- }
-}
-
-export class ERR_CRYPTO_ENGINE_UNKNOWN extends NodeError {
- constructor(x: string) {
- super(
- "ERR_CRYPTO_ENGINE_UNKNOWN",
- `Engine "${x}" was not found`,
- );
- }
-}
-
-export class ERR_CRYPTO_FIPS_FORCED extends NodeError {
- constructor() {
- super(
- "ERR_CRYPTO_FIPS_FORCED",
- "Cannot set FIPS mode, it was forced with --force-fips at startup.",
- );
- }
-}
-
-export class ERR_CRYPTO_FIPS_UNAVAILABLE extends NodeError {
- constructor() {
- super(
- "ERR_CRYPTO_FIPS_UNAVAILABLE",
- "Cannot set FIPS mode in a non-FIPS build.",
- );
- }
-}
-
-export class ERR_CRYPTO_HASH_FINALIZED extends NodeError {
- constructor() {
- super(
- "ERR_CRYPTO_HASH_FINALIZED",
- "Digest already called",
- );
- }
-}
-
-export class ERR_CRYPTO_HASH_UPDATE_FAILED extends NodeError {
- constructor() {
- super(
- "ERR_CRYPTO_HASH_UPDATE_FAILED",
- "Hash update failed",
- );
- }
-}
-
-export class ERR_CRYPTO_INCOMPATIBLE_KEY extends NodeError {
- constructor(x: string, y: string) {
- super(
- "ERR_CRYPTO_INCOMPATIBLE_KEY",
- `Incompatible ${x}: ${y}`,
- );
- }
-}
-
-export class ERR_CRYPTO_INCOMPATIBLE_KEY_OPTIONS extends NodeError {
- constructor(x: string, y: string) {
- super(
- "ERR_CRYPTO_INCOMPATIBLE_KEY_OPTIONS",
- `The selected key encoding ${x} ${y}.`,
- );
- }
-}
-
-export class ERR_CRYPTO_INVALID_DIGEST extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_CRYPTO_INVALID_DIGEST",
- `Invalid digest: ${x}`,
- );
- }
-}
-
-export class ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE extends NodeTypeError {
- constructor(x: string, y: string) {
- super(
- "ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE",
- `Invalid key object type ${x}, expected ${y}.`,
- );
- }
-}
-
-export class ERR_CRYPTO_INVALID_STATE extends NodeError {
- constructor(x: string) {
- super(
- "ERR_CRYPTO_INVALID_STATE",
- `Invalid state for operation ${x}`,
- );
- }
-}
-
-export class ERR_CRYPTO_PBKDF2_ERROR extends NodeError {
- constructor() {
- super(
- "ERR_CRYPTO_PBKDF2_ERROR",
- "PBKDF2 error",
- );
- }
-}
-
-export class ERR_CRYPTO_SCRYPT_INVALID_PARAMETER extends NodeError {
- constructor() {
- super(
- "ERR_CRYPTO_SCRYPT_INVALID_PARAMETER",
- "Invalid scrypt parameter",
- );
- }
-}
-
-export class ERR_CRYPTO_SCRYPT_NOT_SUPPORTED extends NodeError {
- constructor() {
- super(
- "ERR_CRYPTO_SCRYPT_NOT_SUPPORTED",
- "Scrypt algorithm not supported",
- );
- }
-}
-
-export class ERR_CRYPTO_SIGN_KEY_REQUIRED extends NodeError {
- constructor() {
- super(
- "ERR_CRYPTO_SIGN_KEY_REQUIRED",
- "No key provided to sign",
- );
- }
-}
-
-export class ERR_DIR_CLOSED extends NodeError {
- constructor() {
- super(
- "ERR_DIR_CLOSED",
- "Directory handle was closed",
- );
- }
-}
-
-export class ERR_DIR_CONCURRENT_OPERATION extends NodeError {
- constructor() {
- super(
- "ERR_DIR_CONCURRENT_OPERATION",
- "Cannot do synchronous work on directory handle with concurrent asynchronous operations",
- );
- }
-}
-
-export class ERR_DNS_SET_SERVERS_FAILED extends NodeError {
- constructor(x: string, y: string) {
- super(
- "ERR_DNS_SET_SERVERS_FAILED",
- `c-ares failed to set servers: "${x}" [${y}]`,
- );
- }
-}
-
-export class ERR_DOMAIN_CALLBACK_NOT_AVAILABLE extends NodeError {
- constructor() {
- super(
- "ERR_DOMAIN_CALLBACK_NOT_AVAILABLE",
- "A callback was registered through " +
- "process.setUncaughtExceptionCaptureCallback(), which is mutually " +
- "exclusive with using the `domain` module",
- );
- }
-}
-
-export class ERR_DOMAIN_CANNOT_SET_UNCAUGHT_EXCEPTION_CAPTURE
- extends NodeError {
- constructor() {
- super(
- "ERR_DOMAIN_CANNOT_SET_UNCAUGHT_EXCEPTION_CAPTURE",
- "The `domain` module is in use, which is mutually exclusive with calling " +
- "process.setUncaughtExceptionCaptureCallback()",
- );
- }
-}
-
-export class ERR_ENCODING_INVALID_ENCODED_DATA extends NodeErrorAbstraction
- implements TypeError {
- errno: number;
- constructor(encoding: string, ret: number) {
- super(
- TypeError.prototype.name,
- "ERR_ENCODING_INVALID_ENCODED_DATA",
- `The encoded data was not valid for encoding ${encoding}`,
- );
- Object.setPrototypeOf(this, TypeError.prototype);
-
- this.errno = ret;
- }
-}
-
-// In Node these values are coming from libuv:
-// Ref: https://github.com/libuv/libuv/blob/v1.x/include/uv/errno.h
-// Ref: https://github.com/nodejs/node/blob/524123fbf064ff64bb6fcd83485cfc27db932f68/lib/internal/errors.js#L383
-// Since there is no easy way to port code from libuv and these maps are
-// changing very rarely, we simply extract them from Node and store here.
-
-// Note
-// Run the following to get the map:
-// $ node -e "console.log(process.binding('uv').getErrorMap())"
-// This setup automatically exports maps from both "win", "linux" & darwin:
-// https://github.com/schwarzkopfb/node_errno_map
-
-type ErrMapData = Array<[number, [string, string]]>;
-
-const windows: ErrMapData = [
- [-4093, ["E2BIG", "argument list too long"]],
- [-4092, ["EACCES", "permission denied"]],
- [-4091, ["EADDRINUSE", "address already in use"]],
- [-4090, ["EADDRNOTAVAIL", "address not available"]],
- [-4089, ["EAFNOSUPPORT", "address family not supported"]],
- [-4088, ["EAGAIN", "resource temporarily unavailable"]],
- [-3000, ["EAI_ADDRFAMILY", "address family not supported"]],
- [-3001, ["EAI_AGAIN", "temporary failure"]],
- [-3002, ["EAI_BADFLAGS", "bad ai_flags value"]],
- [-3013, ["EAI_BADHINTS", "invalid value for hints"]],
- [-3003, ["EAI_CANCELED", "request canceled"]],
- [-3004, ["EAI_FAIL", "permanent failure"]],
- [-3005, ["EAI_FAMILY", "ai_family not supported"]],
- [-3006, ["EAI_MEMORY", "out of memory"]],
- [-3007, ["EAI_NODATA", "no address"]],
- [-3008, ["EAI_NONAME", "unknown node or service"]],
- [-3009, ["EAI_OVERFLOW", "argument buffer overflow"]],
- [-3014, ["EAI_PROTOCOL", "resolved protocol is unknown"]],
- [-3010, ["EAI_SERVICE", "service not available for socket type"]],
- [-3011, ["EAI_SOCKTYPE", "socket type not supported"]],
- [-4084, ["EALREADY", "connection already in progress"]],
- [-4083, ["EBADF", "bad file descriptor"]],
- [-4082, ["EBUSY", "resource busy or locked"]],
- [-4081, ["ECANCELED", "operation canceled"]],
- [-4080, ["ECHARSET", "invalid Unicode character"]],
- [-4079, ["ECONNABORTED", "software caused connection abort"]],
- [-4078, ["ECONNREFUSED", "connection refused"]],
- [-4077, ["ECONNRESET", "connection reset by peer"]],
- [-4076, ["EDESTADDRREQ", "destination address required"]],
- [-4075, ["EEXIST", "file already exists"]],
- [-4074, ["EFAULT", "bad address in system call argument"]],
- [-4036, ["EFBIG", "file too large"]],
- [-4073, ["EHOSTUNREACH", "host is unreachable"]],
- [-4072, ["EINTR", "interrupted system call"]],
- [-4071, ["EINVAL", "invalid argument"]],
- [-4070, ["EIO", "i/o error"]],
- [-4069, ["EISCONN", "socket is already connected"]],
- [-4068, ["EISDIR", "illegal operation on a directory"]],
- [-4067, ["ELOOP", "too many symbolic links encountered"]],
- [-4066, ["EMFILE", "too many open files"]],
- [-4065, ["EMSGSIZE", "message too long"]],
- [-4064, ["ENAMETOOLONG", "name too long"]],
- [-4063, ["ENETDOWN", "network is down"]],
- [-4062, ["ENETUNREACH", "network is unreachable"]],
- [-4061, ["ENFILE", "file table overflow"]],
- [-4060, ["ENOBUFS", "no buffer space available"]],
- [-4059, ["ENODEV", "no such device"]],
- [-4058, ["ENOENT", "no such file or directory"]],
- [-4057, ["ENOMEM", "not enough memory"]],
- [-4056, ["ENONET", "machine is not on the network"]],
- [-4035, ["ENOPROTOOPT", "protocol not available"]],
- [-4055, ["ENOSPC", "no space left on device"]],
- [-4054, ["ENOSYS", "function not implemented"]],
- [-4053, ["ENOTCONN", "socket is not connected"]],
- [-4052, ["ENOTDIR", "not a directory"]],
- [-4051, ["ENOTEMPTY", "directory not empty"]],
- [-4050, ["ENOTSOCK", "socket operation on non-socket"]],
- [-4049, ["ENOTSUP", "operation not supported on socket"]],
- [-4048, ["EPERM", "operation not permitted"]],
- [-4047, ["EPIPE", "broken pipe"]],
- [-4046, ["EPROTO", "protocol error"]],
- [-4045, ["EPROTONOSUPPORT", "protocol not supported"]],
- [-4044, ["EPROTOTYPE", "protocol wrong type for socket"]],
- [-4034, ["ERANGE", "result too large"]],
- [-4043, ["EROFS", "read-only file system"]],
- [-4042, ["ESHUTDOWN", "cannot send after transport endpoint shutdown"]],
- [-4041, ["ESPIPE", "invalid seek"]],
- [-4040, ["ESRCH", "no such process"]],
- [-4039, ["ETIMEDOUT", "connection timed out"]],
- [-4038, ["ETXTBSY", "text file is busy"]],
- [-4037, ["EXDEV", "cross-device link not permitted"]],
- [-4094, ["UNKNOWN", "unknown error"]],
- [-4095, ["EOF", "end of file"]],
- [-4033, ["ENXIO", "no such device or address"]],
- [-4032, ["EMLINK", "too many links"]],
- [-4031, ["EHOSTDOWN", "host is down"]],
- [-4030, ["EREMOTEIO", "remote I/O error"]],
- [-4029, ["ENOTTY", "inappropriate ioctl for device"]],
- [-4028, ["EFTYPE", "inappropriate file type or format"]],
- [-4027, ["EILSEQ", "illegal byte sequence"]],
-];
-
-const darwin: ErrMapData = [
- [-7, ["E2BIG", "argument list too long"]],
- [-13, ["EACCES", "permission denied"]],
- [-48, ["EADDRINUSE", "address already in use"]],
- [-49, ["EADDRNOTAVAIL", "address not available"]],
- [-47, ["EAFNOSUPPORT", "address family not supported"]],
- [-35, ["EAGAIN", "resource temporarily unavailable"]],
- [-3000, ["EAI_ADDRFAMILY", "address family not supported"]],
- [-3001, ["EAI_AGAIN", "temporary failure"]],
- [-3002, ["EAI_BADFLAGS", "bad ai_flags value"]],
- [-3013, ["EAI_BADHINTS", "invalid value for hints"]],
- [-3003, ["EAI_CANCELED", "request canceled"]],
- [-3004, ["EAI_FAIL", "permanent failure"]],
- [-3005, ["EAI_FAMILY", "ai_family not supported"]],
- [-3006, ["EAI_MEMORY", "out of memory"]],
- [-3007, ["EAI_NODATA", "no address"]],
- [-3008, ["EAI_NONAME", "unknown node or service"]],
- [-3009, ["EAI_OVERFLOW", "argument buffer overflow"]],
- [-3014, ["EAI_PROTOCOL", "resolved protocol is unknown"]],
- [-3010, ["EAI_SERVICE", "service not available for socket type"]],
- [-3011, ["EAI_SOCKTYPE", "socket type not supported"]],
- [-37, ["EALREADY", "connection already in progress"]],
- [-9, ["EBADF", "bad file descriptor"]],
- [-16, ["EBUSY", "resource busy or locked"]],
- [-89, ["ECANCELED", "operation canceled"]],
- [-4080, ["ECHARSET", "invalid Unicode character"]],
- [-53, ["ECONNABORTED", "software caused connection abort"]],
- [-61, ["ECONNREFUSED", "connection refused"]],
- [-54, ["ECONNRESET", "connection reset by peer"]],
- [-39, ["EDESTADDRREQ", "destination address required"]],
- [-17, ["EEXIST", "file already exists"]],
- [-14, ["EFAULT", "bad address in system call argument"]],
- [-27, ["EFBIG", "file too large"]],
- [-65, ["EHOSTUNREACH", "host is unreachable"]],
- [-4, ["EINTR", "interrupted system call"]],
- [-22, ["EINVAL", "invalid argument"]],
- [-5, ["EIO", "i/o error"]],
- [-56, ["EISCONN", "socket is already connected"]],
- [-21, ["EISDIR", "illegal operation on a directory"]],
- [-62, ["ELOOP", "too many symbolic links encountered"]],
- [-24, ["EMFILE", "too many open files"]],
- [-40, ["EMSGSIZE", "message too long"]],
- [-63, ["ENAMETOOLONG", "name too long"]],
- [-50, ["ENETDOWN", "network is down"]],
- [-51, ["ENETUNREACH", "network is unreachable"]],
- [-23, ["ENFILE", "file table overflow"]],
- [-55, ["ENOBUFS", "no buffer space available"]],
- [-19, ["ENODEV", "no such device"]],
- [-2, ["ENOENT", "no such file or directory"]],
- [-12, ["ENOMEM", "not enough memory"]],
- [-4056, ["ENONET", "machine is not on the network"]],
- [-42, ["ENOPROTOOPT", "protocol not available"]],
- [-28, ["ENOSPC", "no space left on device"]],
- [-78, ["ENOSYS", "function not implemented"]],
- [-57, ["ENOTCONN", "socket is not connected"]],
- [-20, ["ENOTDIR", "not a directory"]],
- [-66, ["ENOTEMPTY", "directory not empty"]],
- [-38, ["ENOTSOCK", "socket operation on non-socket"]],
- [-45, ["ENOTSUP", "operation not supported on socket"]],
- [-1, ["EPERM", "operation not permitted"]],
- [-32, ["EPIPE", "broken pipe"]],
- [-100, ["EPROTO", "protocol error"]],
- [-43, ["EPROTONOSUPPORT", "protocol not supported"]],
- [-41, ["EPROTOTYPE", "protocol wrong type for socket"]],
- [-34, ["ERANGE", "result too large"]],
- [-30, ["EROFS", "read-only file system"]],
- [-58, ["ESHUTDOWN", "cannot send after transport endpoint shutdown"]],
- [-29, ["ESPIPE", "invalid seek"]],
- [-3, ["ESRCH", "no such process"]],
- [-60, ["ETIMEDOUT", "connection timed out"]],
- [-26, ["ETXTBSY", "text file is busy"]],
- [-18, ["EXDEV", "cross-device link not permitted"]],
- [-4094, ["UNKNOWN", "unknown error"]],
- [-4095, ["EOF", "end of file"]],
- [-6, ["ENXIO", "no such device or address"]],
- [-31, ["EMLINK", "too many links"]],
- [-64, ["EHOSTDOWN", "host is down"]],
- [-4030, ["EREMOTEIO", "remote I/O error"]],
- [-25, ["ENOTTY", "inappropriate ioctl for device"]],
- [-79, ["EFTYPE", "inappropriate file type or format"]],
- [-92, ["EILSEQ", "illegal byte sequence"]],
-];
-
-const linux: ErrMapData = [
- [-7, ["E2BIG", "argument list too long"]],
- [-13, ["EACCES", "permission denied"]],
- [-98, ["EADDRINUSE", "address already in use"]],
- [-99, ["EADDRNOTAVAIL", "address not available"]],
- [-97, ["EAFNOSUPPORT", "address family not supported"]],
- [-11, ["EAGAIN", "resource temporarily unavailable"]],
- [-3000, ["EAI_ADDRFAMILY", "address family not supported"]],
- [-3001, ["EAI_AGAIN", "temporary failure"]],
- [-3002, ["EAI_BADFLAGS", "bad ai_flags value"]],
- [-3013, ["EAI_BADHINTS", "invalid value for hints"]],
- [-3003, ["EAI_CANCELED", "request canceled"]],
- [-3004, ["EAI_FAIL", "permanent failure"]],
- [-3005, ["EAI_FAMILY", "ai_family not supported"]],
- [-3006, ["EAI_MEMORY", "out of memory"]],
- [-3007, ["EAI_NODATA", "no address"]],
- [-3008, ["EAI_NONAME", "unknown node or service"]],
- [-3009, ["EAI_OVERFLOW", "argument buffer overflow"]],
- [-3014, ["EAI_PROTOCOL", "resolved protocol is unknown"]],
- [-3010, ["EAI_SERVICE", "service not available for socket type"]],
- [-3011, ["EAI_SOCKTYPE", "socket type not supported"]],
- [-114, ["EALREADY", "connection already in progress"]],
- [-9, ["EBADF", "bad file descriptor"]],
- [-16, ["EBUSY", "resource busy or locked"]],
- [-125, ["ECANCELED", "operation canceled"]],
- [-4080, ["ECHARSET", "invalid Unicode character"]],
- [-103, ["ECONNABORTED", "software caused connection abort"]],
- [-111, ["ECONNREFUSED", "connection refused"]],
- [-104, ["ECONNRESET", "connection reset by peer"]],
- [-89, ["EDESTADDRREQ", "destination address required"]],
- [-17, ["EEXIST", "file already exists"]],
- [-14, ["EFAULT", "bad address in system call argument"]],
- [-27, ["EFBIG", "file too large"]],
- [-113, ["EHOSTUNREACH", "host is unreachable"]],
- [-4, ["EINTR", "interrupted system call"]],
- [-22, ["EINVAL", "invalid argument"]],
- [-5, ["EIO", "i/o error"]],
- [-106, ["EISCONN", "socket is already connected"]],
- [-21, ["EISDIR", "illegal operation on a directory"]],
- [-40, ["ELOOP", "too many symbolic links encountered"]],
- [-24, ["EMFILE", "too many open files"]],
- [-90, ["EMSGSIZE", "message too long"]],
- [-36, ["ENAMETOOLONG", "name too long"]],
- [-100, ["ENETDOWN", "network is down"]],
- [-101, ["ENETUNREACH", "network is unreachable"]],
- [-23, ["ENFILE", "file table overflow"]],
- [-105, ["ENOBUFS", "no buffer space available"]],
- [-19, ["ENODEV", "no such device"]],
- [-2, ["ENOENT", "no such file or directory"]],
- [-12, ["ENOMEM", "not enough memory"]],
- [-64, ["ENONET", "machine is not on the network"]],
- [-92, ["ENOPROTOOPT", "protocol not available"]],
- [-28, ["ENOSPC", "no space left on device"]],
- [-38, ["ENOSYS", "function not implemented"]],
- [-107, ["ENOTCONN", "socket is not connected"]],
- [-20, ["ENOTDIR", "not a directory"]],
- [-39, ["ENOTEMPTY", "directory not empty"]],
- [-88, ["ENOTSOCK", "socket operation on non-socket"]],
- [-95, ["ENOTSUP", "operation not supported on socket"]],
- [-1, ["EPERM", "operation not permitted"]],
- [-32, ["EPIPE", "broken pipe"]],
- [-71, ["EPROTO", "protocol error"]],
- [-93, ["EPROTONOSUPPORT", "protocol not supported"]],
- [-91, ["EPROTOTYPE", "protocol wrong type for socket"]],
- [-34, ["ERANGE", "result too large"]],
- [-30, ["EROFS", "read-only file system"]],
- [-108, ["ESHUTDOWN", "cannot send after transport endpoint shutdown"]],
- [-29, ["ESPIPE", "invalid seek"]],
- [-3, ["ESRCH", "no such process"]],
- [-110, ["ETIMEDOUT", "connection timed out"]],
- [-26, ["ETXTBSY", "text file is busy"]],
- [-18, ["EXDEV", "cross-device link not permitted"]],
- [-4094, ["UNKNOWN", "unknown error"]],
- [-4095, ["EOF", "end of file"]],
- [-6, ["ENXIO", "no such device or address"]],
- [-31, ["EMLINK", "too many links"]],
- [-112, ["EHOSTDOWN", "host is down"]],
- [-121, ["EREMOTEIO", "remote I/O error"]],
- [-25, ["ENOTTY", "inappropriate ioctl for device"]],
- [-4028, ["EFTYPE", "inappropriate file type or format"]],
- [-84, ["EILSEQ", "illegal byte sequence"]],
-];
-
-const { os } = Deno.build;
-export const errorMap = new Map<number, [string, string]>(
- os === "windows"
- ? windows
- : os === "darwin"
- ? darwin
- : os === "linux"
- ? linux
- : unreachable(),
-);
-export class ERR_ENCODING_NOT_SUPPORTED extends NodeRangeError {
- constructor(x: string) {
- super(
- "ERR_ENCODING_NOT_SUPPORTED",
- `The "${x}" encoding is not supported`,
- );
- }
-}
-export class ERR_EVAL_ESM_CANNOT_PRINT extends NodeError {
- constructor() {
- super(
- "ERR_EVAL_ESM_CANNOT_PRINT",
- `--print cannot be used with ESM input`,
- );
- }
-}
-export class ERR_EVENT_RECURSION extends NodeError {
- constructor(x: string) {
- super(
- "ERR_EVENT_RECURSION",
- `The event "${x}" is already being dispatched`,
- );
- }
-}
-export class ERR_FEATURE_UNAVAILABLE_ON_PLATFORM extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_FEATURE_UNAVAILABLE_ON_PLATFORM",
- `The feature ${x} is unavailable on the current platform, which is being used to run Node.js`,
- );
- }
-}
-export class ERR_FS_FILE_TOO_LARGE extends NodeRangeError {
- constructor(x: string) {
- super(
- "ERR_FS_FILE_TOO_LARGE",
- `File size (${x}) is greater than 2 GB`,
- );
- }
-}
-export class ERR_FS_INVALID_SYMLINK_TYPE extends NodeError {
- constructor(x: string) {
- super(
- "ERR_FS_INVALID_SYMLINK_TYPE",
- `Symlink type must be one of "dir", "file", or "junction". Received "${x}"`,
- );
- }
-}
-export class ERR_HTTP2_ALTSVC_INVALID_ORIGIN extends NodeTypeError {
- constructor() {
- super(
- "ERR_HTTP2_ALTSVC_INVALID_ORIGIN",
- `HTTP/2 ALTSVC frames require a valid origin`,
- );
- }
-}
-export class ERR_HTTP2_ALTSVC_LENGTH extends NodeTypeError {
- constructor() {
- super(
- "ERR_HTTP2_ALTSVC_LENGTH",
- `HTTP/2 ALTSVC frames are limited to 16382 bytes`,
- );
- }
-}
-export class ERR_HTTP2_CONNECT_AUTHORITY extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_CONNECT_AUTHORITY",
- `:authority header is required for CONNECT requests`,
- );
- }
-}
-export class ERR_HTTP2_CONNECT_PATH extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_CONNECT_PATH",
- `The :path header is forbidden for CONNECT requests`,
- );
- }
-}
-export class ERR_HTTP2_CONNECT_SCHEME extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_CONNECT_SCHEME",
- `The :scheme header is forbidden for CONNECT requests`,
- );
- }
-}
-export class ERR_HTTP2_GOAWAY_SESSION extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_GOAWAY_SESSION",
- `New streams cannot be created after receiving a GOAWAY`,
- );
- }
-}
-export class ERR_HTTP2_HEADERS_AFTER_RESPOND extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_HEADERS_AFTER_RESPOND",
- `Cannot specify additional headers after response initiated`,
- );
- }
-}
-export class ERR_HTTP2_HEADERS_SENT extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_HEADERS_SENT",
- `Response has already been initiated.`,
- );
- }
-}
-export class ERR_HTTP2_HEADER_SINGLE_VALUE extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_HTTP2_HEADER_SINGLE_VALUE",
- `Header field "${x}" must only have a single value`,
- );
- }
-}
-export class ERR_HTTP2_INFO_STATUS_NOT_ALLOWED extends NodeRangeError {
- constructor() {
- super(
- "ERR_HTTP2_INFO_STATUS_NOT_ALLOWED",
- `Informational status codes cannot be used`,
- );
- }
-}
-export class ERR_HTTP2_INVALID_CONNECTION_HEADERS extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_HTTP2_INVALID_CONNECTION_HEADERS",
- `HTTP/1 Connection specific headers are forbidden: "${x}"`,
- );
- }
-}
-export class ERR_HTTP2_INVALID_HEADER_VALUE extends NodeTypeError {
- constructor(x: string, y: string) {
- super(
- "ERR_HTTP2_INVALID_HEADER_VALUE",
- `Invalid value "${x}" for header "${y}"`,
- );
- }
-}
-export class ERR_HTTP2_INVALID_INFO_STATUS extends NodeRangeError {
- constructor(x: string) {
- super(
- "ERR_HTTP2_INVALID_INFO_STATUS",
- `Invalid informational status code: ${x}`,
- );
- }
-}
-export class ERR_HTTP2_INVALID_ORIGIN extends NodeTypeError {
- constructor() {
- super(
- "ERR_HTTP2_INVALID_ORIGIN",
- `HTTP/2 ORIGIN frames require a valid origin`,
- );
- }
-}
-export class ERR_HTTP2_INVALID_PACKED_SETTINGS_LENGTH extends NodeRangeError {
- constructor() {
- super(
- "ERR_HTTP2_INVALID_PACKED_SETTINGS_LENGTH",
- `Packed settings length must be a multiple of six`,
- );
- }
-}
-export class ERR_HTTP2_INVALID_PSEUDOHEADER extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_HTTP2_INVALID_PSEUDOHEADER",
- `"${x}" is an invalid pseudoheader or is used incorrectly`,
- );
- }
-}
-export class ERR_HTTP2_INVALID_SESSION extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_INVALID_SESSION",
- `The session has been destroyed`,
- );
- }
-}
-export class ERR_HTTP2_INVALID_STREAM extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_INVALID_STREAM",
- `The stream has been destroyed`,
- );
- }
-}
-export class ERR_HTTP2_MAX_PENDING_SETTINGS_ACK extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_MAX_PENDING_SETTINGS_ACK",
- `Maximum number of pending settings acknowledgements`,
- );
- }
-}
-export class ERR_HTTP2_NESTED_PUSH extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_NESTED_PUSH",
- `A push stream cannot initiate another push stream.`,
- );
- }
-}
-export class ERR_HTTP2_NO_SOCKET_MANIPULATION extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_NO_SOCKET_MANIPULATION",
- `HTTP/2 sockets should not be directly manipulated (e.g. read and written)`,
- );
- }
-}
-export class ERR_HTTP2_ORIGIN_LENGTH extends NodeTypeError {
- constructor() {
- super(
- "ERR_HTTP2_ORIGIN_LENGTH",
- `HTTP/2 ORIGIN frames are limited to 16382 bytes`,
- );
- }
-}
-export class ERR_HTTP2_OUT_OF_STREAMS extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_OUT_OF_STREAMS",
- `No stream ID is available because maximum stream ID has been reached`,
- );
- }
-}
-export class ERR_HTTP2_PAYLOAD_FORBIDDEN extends NodeError {
- constructor(x: string) {
- super(
- "ERR_HTTP2_PAYLOAD_FORBIDDEN",
- `Responses with ${x} status must not have a payload`,
- );
- }
-}
-export class ERR_HTTP2_PING_CANCEL extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_PING_CANCEL",
- `HTTP2 ping cancelled`,
- );
- }
-}
-export class ERR_HTTP2_PING_LENGTH extends NodeRangeError {
- constructor() {
- super(
- "ERR_HTTP2_PING_LENGTH",
- `HTTP2 ping payload must be 8 bytes`,
- );
- }
-}
-export class ERR_HTTP2_PSEUDOHEADER_NOT_ALLOWED extends NodeTypeError {
- constructor() {
- super(
- "ERR_HTTP2_PSEUDOHEADER_NOT_ALLOWED",
- `Cannot set HTTP/2 pseudo-headers`,
- );
- }
-}
-export class ERR_HTTP2_PUSH_DISABLED extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_PUSH_DISABLED",
- `HTTP/2 client has disabled push streams`,
- );
- }
-}
-export class ERR_HTTP2_SEND_FILE extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_SEND_FILE",
- `Directories cannot be sent`,
- );
- }
-}
-export class ERR_HTTP2_SEND_FILE_NOSEEK extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_SEND_FILE_NOSEEK",
- `Offset or length can only be specified for regular files`,
- );
- }
-}
-export class ERR_HTTP2_SESSION_ERROR extends NodeError {
- constructor(x: string) {
- super(
- "ERR_HTTP2_SESSION_ERROR",
- `Session closed with error code ${x}`,
- );
- }
-}
-export class ERR_HTTP2_SETTINGS_CANCEL extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_SETTINGS_CANCEL",
- `HTTP2 session settings canceled`,
- );
- }
-}
-export class ERR_HTTP2_SOCKET_BOUND extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_SOCKET_BOUND",
- `The socket is already bound to an Http2Session`,
- );
- }
-}
-export class ERR_HTTP2_SOCKET_UNBOUND extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_SOCKET_UNBOUND",
- `The socket has been disconnected from the Http2Session`,
- );
- }
-}
-export class ERR_HTTP2_STATUS_101 extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_STATUS_101",
- `HTTP status code 101 (Switching Protocols) is forbidden in HTTP/2`,
- );
- }
-}
-export class ERR_HTTP2_STATUS_INVALID extends NodeRangeError {
- constructor(x: string) {
- super(
- "ERR_HTTP2_STATUS_INVALID",
- `Invalid status code: ${x}`,
- );
- }
-}
-export class ERR_HTTP2_STREAM_ERROR extends NodeError {
- constructor(x: string) {
- super(
- "ERR_HTTP2_STREAM_ERROR",
- `Stream closed with error code ${x}`,
- );
- }
-}
-export class ERR_HTTP2_STREAM_SELF_DEPENDENCY extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_STREAM_SELF_DEPENDENCY",
- `A stream cannot depend on itself`,
- );
- }
-}
-export class ERR_HTTP2_TRAILERS_ALREADY_SENT extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_TRAILERS_ALREADY_SENT",
- `Trailing headers have already been sent`,
- );
- }
-}
-export class ERR_HTTP2_TRAILERS_NOT_READY extends NodeError {
- constructor() {
- super(
- "ERR_HTTP2_TRAILERS_NOT_READY",
- `Trailing headers cannot be sent until after the wantTrailers event is emitted`,
- );
- }
-}
-export class ERR_HTTP2_UNSUPPORTED_PROTOCOL extends NodeError {
- constructor(x: string) {
- super(
- "ERR_HTTP2_UNSUPPORTED_PROTOCOL",
- `protocol "${x}" is unsupported.`,
- );
- }
-}
-export class ERR_HTTP_HEADERS_SENT extends NodeError {
- constructor(x: string) {
- super(
- "ERR_HTTP_HEADERS_SENT",
- `Cannot ${x} headers after they are sent to the client`,
- );
- }
-}
-export class ERR_HTTP_INVALID_HEADER_VALUE extends NodeTypeError {
- constructor(x: string, y: string) {
- super(
- "ERR_HTTP_INVALID_HEADER_VALUE",
- `Invalid value "${x}" for header "${y}"`,
- );
- }
-}
-export class ERR_HTTP_INVALID_STATUS_CODE extends NodeRangeError {
- constructor(x: string) {
- super(
- "ERR_HTTP_INVALID_STATUS_CODE",
- `Invalid status code: ${x}`,
- );
- }
-}
-export class ERR_HTTP_SOCKET_ENCODING extends NodeError {
- constructor() {
- super(
- "ERR_HTTP_SOCKET_ENCODING",
- `Changing the socket encoding is not allowed per RFC7230 Section 3.`,
- );
- }
-}
-export class ERR_HTTP_TRAILER_INVALID extends NodeError {
- constructor() {
- super(
- "ERR_HTTP_TRAILER_INVALID",
- `Trailers are invalid with this transfer encoding`,
- );
- }
-}
-export class ERR_INCOMPATIBLE_OPTION_PAIR extends NodeTypeError {
- constructor(x: string, y: string) {
- super(
- "ERR_INCOMPATIBLE_OPTION_PAIR",
- `Option "${x}" cannot be used in combination with option "${y}"`,
- );
- }
-}
-export class ERR_INPUT_TYPE_NOT_ALLOWED extends NodeError {
- constructor() {
- super(
- "ERR_INPUT_TYPE_NOT_ALLOWED",
- `--input-type can only be used with string input via --eval, --print, or STDIN`,
- );
- }
-}
-export class ERR_INSPECTOR_ALREADY_ACTIVATED extends NodeError {
- constructor() {
- super(
- "ERR_INSPECTOR_ALREADY_ACTIVATED",
- `Inspector is already activated. Close it with inspector.close() before activating it again.`,
- );
- }
-}
-export class ERR_INSPECTOR_ALREADY_CONNECTED extends NodeError {
- constructor(x: string) {
- super(
- "ERR_INSPECTOR_ALREADY_CONNECTED",
- `${x} is already connected`,
- );
- }
-}
-export class ERR_INSPECTOR_CLOSED extends NodeError {
- constructor() {
- super(
- "ERR_INSPECTOR_CLOSED",
- `Session was closed`,
- );
- }
-}
-export class ERR_INSPECTOR_COMMAND extends NodeError {
- constructor(x: number, y: string) {
- super(
- "ERR_INSPECTOR_COMMAND",
- `Inspector error ${x}: ${y}`,
- );
- }
-}
-export class ERR_INSPECTOR_NOT_ACTIVE extends NodeError {
- constructor() {
- super(
- "ERR_INSPECTOR_NOT_ACTIVE",
- `Inspector is not active`,
- );
- }
-}
-export class ERR_INSPECTOR_NOT_AVAILABLE extends NodeError {
- constructor() {
- super(
- "ERR_INSPECTOR_NOT_AVAILABLE",
- `Inspector is not available`,
- );
- }
-}
-export class ERR_INSPECTOR_NOT_CONNECTED extends NodeError {
- constructor() {
- super(
- "ERR_INSPECTOR_NOT_CONNECTED",
- `Session is not connected`,
- );
- }
-}
-export class ERR_INSPECTOR_NOT_WORKER extends NodeError {
- constructor() {
- super(
- "ERR_INSPECTOR_NOT_WORKER",
- `Current thread is not a worker`,
- );
- }
-}
-export class ERR_INVALID_ASYNC_ID extends NodeRangeError {
- constructor(x: string, y: string) {
- super(
- "ERR_INVALID_ASYNC_ID",
- `Invalid ${x} value: ${y}`,
- );
- }
-}
-export class ERR_INVALID_BUFFER_SIZE extends NodeRangeError {
- constructor(x: string) {
- super(
- "ERR_INVALID_BUFFER_SIZE",
- `Buffer size must be a multiple of ${x}`,
- );
- }
-}
-export class ERR_INVALID_CALLBACK extends NodeTypeError {
- constructor(object: unknown) {
- super(
- "ERR_INVALID_CALLBACK",
- `Callback must be a function. Received ${JSON.stringify(object)}`,
- );
- }
-}
-export class ERR_INVALID_CURSOR_POS extends NodeTypeError {
- constructor() {
- super(
- "ERR_INVALID_CURSOR_POS",
- `Cannot set cursor row without setting its column`,
- );
- }
-}
-export class ERR_INVALID_FD extends NodeRangeError {
- constructor(x: string) {
- super(
- "ERR_INVALID_FD",
- `"fd" must be a positive integer: ${x}`,
- );
- }
-}
-export class ERR_INVALID_FD_TYPE extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_INVALID_FD_TYPE",
- `Unsupported fd type: ${x}`,
- );
- }
-}
-export class ERR_INVALID_FILE_URL_HOST extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_INVALID_FILE_URL_HOST",
- `File URL host must be "localhost" or empty on ${x}`,
- );
- }
-}
-export class ERR_INVALID_FILE_URL_PATH extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_INVALID_FILE_URL_PATH",
- `File URL path ${x}`,
- );
- }
-}
-export class ERR_INVALID_HANDLE_TYPE extends NodeTypeError {
- constructor() {
- super(
- "ERR_INVALID_HANDLE_TYPE",
- `This handle type cannot be sent`,
- );
- }
-}
-export class ERR_INVALID_HTTP_TOKEN extends NodeTypeError {
- constructor(x: string, y: string) {
- super(
- "ERR_INVALID_HTTP_TOKEN",
- `${x} must be a valid HTTP token ["${y}"]`,
- );
- }
-}
-export class ERR_INVALID_IP_ADDRESS extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_INVALID_IP_ADDRESS",
- `Invalid IP address: ${x}`,
- );
- }
-}
-export class ERR_INVALID_OPT_VALUE_ENCODING extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_INVALID_OPT_VALUE_ENCODING",
- `The value "${x}" is invalid for option "encoding"`,
- );
- }
-}
-export class ERR_INVALID_PERFORMANCE_MARK extends NodeError {
- constructor(x: string) {
- super(
- "ERR_INVALID_PERFORMANCE_MARK",
- `The "${x}" performance mark has not been set`,
- );
- }
-}
-export class ERR_INVALID_PROTOCOL extends NodeTypeError {
- constructor(x: string, y: string) {
- super(
- "ERR_INVALID_PROTOCOL",
- `Protocol "${x}" not supported. Expected "${y}"`,
- );
- }
-}
-export class ERR_INVALID_REPL_EVAL_CONFIG extends NodeTypeError {
- constructor() {
- super(
- "ERR_INVALID_REPL_EVAL_CONFIG",
- `Cannot specify both "breakEvalOnSigint" and "eval" for REPL`,
- );
- }
-}
-export class ERR_INVALID_REPL_INPUT extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_INVALID_REPL_INPUT",
- `${x}`,
- );
- }
-}
-export class ERR_INVALID_SYNC_FORK_INPUT extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_INVALID_SYNC_FORK_INPUT",
- `Asynchronous forks do not support Buffer, TypedArray, DataView or string input: ${x}`,
- );
- }
-}
-export class ERR_INVALID_THIS extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_INVALID_THIS",
- `Value of "this" must be of type ${x}`,
- );
- }
-}
-export class ERR_INVALID_TUPLE extends NodeTypeError {
- constructor(x: string, y: string) {
- super(
- "ERR_INVALID_TUPLE",
- `${x} must be an iterable ${y} tuple`,
- );
- }
-}
-export class ERR_INVALID_URI extends NodeURIError {
- constructor() {
- super(
- "ERR_INVALID_URI",
- `URI malformed`,
- );
- }
-}
-export class ERR_IPC_CHANNEL_CLOSED extends NodeError {
- constructor() {
- super(
- "ERR_IPC_CHANNEL_CLOSED",
- `Channel closed`,
- );
- }
-}
-export class ERR_IPC_DISCONNECTED extends NodeError {
- constructor() {
- super(
- "ERR_IPC_DISCONNECTED",
- `IPC channel is already disconnected`,
- );
- }
-}
-export class ERR_IPC_ONE_PIPE extends NodeError {
- constructor() {
- super(
- "ERR_IPC_ONE_PIPE",
- `Child process can have only one IPC pipe`,
- );
- }
-}
-export class ERR_IPC_SYNC_FORK extends NodeError {
- constructor() {
- super(
- "ERR_IPC_SYNC_FORK",
- `IPC cannot be used with synchronous forks`,
- );
- }
-}
-export class ERR_MANIFEST_DEPENDENCY_MISSING extends NodeError {
- constructor(x: string, y: string) {
- super(
- "ERR_MANIFEST_DEPENDENCY_MISSING",
- `Manifest resource ${x} does not list ${y} as a dependency specifier`,
- );
- }
-}
-export class ERR_MANIFEST_INTEGRITY_MISMATCH extends NodeSyntaxError {
- constructor(x: string) {
- super(
- "ERR_MANIFEST_INTEGRITY_MISMATCH",
- `Manifest resource ${x} has multiple entries but integrity lists do not match`,
- );
- }
-}
-export class ERR_MANIFEST_INVALID_RESOURCE_FIELD extends NodeTypeError {
- constructor(x: string, y: string) {
- super(
- "ERR_MANIFEST_INVALID_RESOURCE_FIELD",
- `Manifest resource ${x} has invalid property value for ${y}`,
- );
- }
-}
-export class ERR_MANIFEST_TDZ extends NodeError {
- constructor() {
- super(
- "ERR_MANIFEST_TDZ",
- `Manifest initialization has not yet run`,
- );
- }
-}
-export class ERR_MANIFEST_UNKNOWN_ONERROR extends NodeSyntaxError {
- constructor(x: string) {
- super(
- "ERR_MANIFEST_UNKNOWN_ONERROR",
- `Manifest specified unknown error behavior "${x}".`,
- );
- }
-}
-export class ERR_METHOD_NOT_IMPLEMENTED extends NodeError {
- constructor(x: string) {
- super(
- "ERR_METHOD_NOT_IMPLEMENTED",
- `The ${x} method is not implemented`,
- );
- }
-}
-export class ERR_MISSING_ARGS extends NodeTypeError {
- constructor(...args: string[]) {
- args = args.map((a) => `"${a}"`);
-
- let msg = "The ";
- switch (args.length) {
- case 1:
- msg += `${args[0]} argument`;
- break;
- case 2:
- msg += `${args[0]} and ${args[1]} arguments`;
- break;
- default:
- msg += args.slice(0, args.length - 1).join(", ");
- msg += `, and ${args[args.length - 1]} arguments`;
- break;
- }
- super(
- "ERR_MISSING_ARGS",
- `${msg} must be specified`,
- );
- }
-}
-export class ERR_MISSING_OPTION extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_MISSING_OPTION",
- `${x} is required`,
- );
- }
-}
-export class ERR_MULTIPLE_CALLBACK extends NodeError {
- constructor() {
- super(
- "ERR_MULTIPLE_CALLBACK",
- `Callback called multiple times`,
- );
- }
-}
-export class ERR_NAPI_CONS_FUNCTION extends NodeTypeError {
- constructor() {
- super(
- "ERR_NAPI_CONS_FUNCTION",
- `Constructor must be a function`,
- );
- }
-}
-export class ERR_NAPI_INVALID_DATAVIEW_ARGS extends NodeRangeError {
- constructor() {
- super(
- "ERR_NAPI_INVALID_DATAVIEW_ARGS",
- `byte_offset + byte_length should be less than or equal to the size in bytes of the array passed in`,
- );
- }
-}
-export class ERR_NAPI_INVALID_TYPEDARRAY_ALIGNMENT extends NodeRangeError {
- constructor(x: string, y: string) {
- super(
- "ERR_NAPI_INVALID_TYPEDARRAY_ALIGNMENT",
- `start offset of ${x} should be a multiple of ${y}`,
- );
- }
-}
-export class ERR_NAPI_INVALID_TYPEDARRAY_LENGTH extends NodeRangeError {
- constructor() {
- super(
- "ERR_NAPI_INVALID_TYPEDARRAY_LENGTH",
- `Invalid typed array length`,
- );
- }
-}
-export class ERR_NO_CRYPTO extends NodeError {
- constructor() {
- super(
- "ERR_NO_CRYPTO",
- `Node.js is not compiled with OpenSSL crypto support`,
- );
- }
-}
-export class ERR_NO_ICU extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_NO_ICU",
- `${x} is not supported on Node.js compiled without ICU`,
- );
- }
-}
-export class ERR_QUICCLIENTSESSION_FAILED extends NodeError {
- constructor(x: string) {
- super(
- "ERR_QUICCLIENTSESSION_FAILED",
- `Failed to create a new QuicClientSession: ${x}`,
- );
- }
-}
-export class ERR_QUICCLIENTSESSION_FAILED_SETSOCKET extends NodeError {
- constructor() {
- super(
- "ERR_QUICCLIENTSESSION_FAILED_SETSOCKET",
- `Failed to set the QuicSocket`,
- );
- }
-}
-export class ERR_QUICSESSION_DESTROYED extends NodeError {
- constructor(x: string) {
- super(
- "ERR_QUICSESSION_DESTROYED",
- `Cannot call ${x} after a QuicSession has been destroyed`,
- );
- }
-}
-export class ERR_QUICSESSION_INVALID_DCID extends NodeError {
- constructor(x: string) {
- super(
- "ERR_QUICSESSION_INVALID_DCID",
- `Invalid DCID value: ${x}`,
- );
- }
-}
-export class ERR_QUICSESSION_UPDATEKEY extends NodeError {
- constructor() {
- super(
- "ERR_QUICSESSION_UPDATEKEY",
- `Unable to update QuicSession keys`,
- );
- }
-}
-export class ERR_QUICSOCKET_DESTROYED extends NodeError {
- constructor(x: string) {
- super(
- "ERR_QUICSOCKET_DESTROYED",
- `Cannot call ${x} after a QuicSocket has been destroyed`,
- );
- }
-}
-export class ERR_QUICSOCKET_INVALID_STATELESS_RESET_SECRET_LENGTH
- extends NodeError {
- constructor() {
- super(
- "ERR_QUICSOCKET_INVALID_STATELESS_RESET_SECRET_LENGTH",
- `The stateResetToken must be exactly 16-bytes in length`,
- );
- }
-}
-export class ERR_QUICSOCKET_LISTENING extends NodeError {
- constructor() {
- super(
- "ERR_QUICSOCKET_LISTENING",
- `This QuicSocket is already listening`,
- );
- }
-}
-export class ERR_QUICSOCKET_UNBOUND extends NodeError {
- constructor(x: string) {
- super(
- "ERR_QUICSOCKET_UNBOUND",
- `Cannot call ${x} before a QuicSocket has been bound`,
- );
- }
-}
-export class ERR_QUICSTREAM_DESTROYED extends NodeError {
- constructor(x: string) {
- super(
- "ERR_QUICSTREAM_DESTROYED",
- `Cannot call ${x} after a QuicStream has been destroyed`,
- );
- }
-}
-export class ERR_QUICSTREAM_INVALID_PUSH extends NodeError {
- constructor() {
- super(
- "ERR_QUICSTREAM_INVALID_PUSH",
- `Push streams are only supported on client-initiated, bidirectional streams`,
- );
- }
-}
-export class ERR_QUICSTREAM_OPEN_FAILED extends NodeError {
- constructor() {
- super(
- "ERR_QUICSTREAM_OPEN_FAILED",
- `Opening a new QuicStream failed`,
- );
- }
-}
-export class ERR_QUICSTREAM_UNSUPPORTED_PUSH extends NodeError {
- constructor() {
- super(
- "ERR_QUICSTREAM_UNSUPPORTED_PUSH",
- `Push streams are not supported on this QuicSession`,
- );
- }
-}
-export class ERR_QUIC_TLS13_REQUIRED extends NodeError {
- constructor() {
- super(
- "ERR_QUIC_TLS13_REQUIRED",
- `QUIC requires TLS version 1.3`,
- );
- }
-}
-export class ERR_SCRIPT_EXECUTION_INTERRUPTED extends NodeError {
- constructor() {
- super(
- "ERR_SCRIPT_EXECUTION_INTERRUPTED",
- "Script execution was interrupted by `SIGINT`",
- );
- }
-}
-export class ERR_SERVER_ALREADY_LISTEN extends NodeError {
- constructor() {
- super(
- "ERR_SERVER_ALREADY_LISTEN",
- `Listen method has been called more than once without closing.`,
- );
- }
-}
-export class ERR_SERVER_NOT_RUNNING extends NodeError {
- constructor() {
- super(
- "ERR_SERVER_NOT_RUNNING",
- `Server is not running.`,
- );
- }
-}
-export class ERR_SOCKET_ALREADY_BOUND extends NodeError {
- constructor() {
- super(
- "ERR_SOCKET_ALREADY_BOUND",
- `Socket is already bound`,
- );
- }
-}
-export class ERR_SOCKET_BAD_BUFFER_SIZE extends NodeTypeError {
- constructor() {
- super(
- "ERR_SOCKET_BAD_BUFFER_SIZE",
- `Buffer size must be a positive integer`,
- );
- }
-}
-export class ERR_SOCKET_BAD_TYPE extends NodeTypeError {
- constructor() {
- super(
- "ERR_SOCKET_BAD_TYPE",
- `Bad socket type specified. Valid types are: udp4, udp6`,
- );
- }
-}
-export class ERR_SOCKET_CLOSED extends NodeError {
- constructor() {
- super(
- "ERR_SOCKET_CLOSED",
- `Socket is closed`,
- );
- }
-}
-export class ERR_SOCKET_DGRAM_IS_CONNECTED extends NodeError {
- constructor() {
- super(
- "ERR_SOCKET_DGRAM_IS_CONNECTED",
- `Already connected`,
- );
- }
-}
-export class ERR_SOCKET_DGRAM_NOT_CONNECTED extends NodeError {
- constructor() {
- super(
- "ERR_SOCKET_DGRAM_NOT_CONNECTED",
- `Not connected`,
- );
- }
-}
-export class ERR_SOCKET_DGRAM_NOT_RUNNING extends NodeError {
- constructor() {
- super(
- "ERR_SOCKET_DGRAM_NOT_RUNNING",
- `Not running`,
- );
- }
-}
-export class ERR_SRI_PARSE extends NodeSyntaxError {
- constructor(name: string, char: string, position: number) {
- super(
- "ERR_SRI_PARSE",
- `Subresource Integrity string ${name} had an unexpected ${char} at position ${position}`,
- );
- }
-}
-export class ERR_STREAM_ALREADY_FINISHED extends NodeError {
- constructor(x: string) {
- super(
- "ERR_STREAM_ALREADY_FINISHED",
- `Cannot call ${x} after a stream was finished`,
- );
- }
-}
-export class ERR_STREAM_CANNOT_PIPE extends NodeError {
- constructor() {
- super(
- "ERR_STREAM_CANNOT_PIPE",
- `Cannot pipe, not readable`,
- );
- }
-}
-export class ERR_STREAM_DESTROYED extends NodeError {
- constructor(x: string) {
- super(
- "ERR_STREAM_DESTROYED",
- `Cannot call ${x} after a stream was destroyed`,
- );
- }
-}
-export class ERR_STREAM_NULL_VALUES extends NodeTypeError {
- constructor() {
- super(
- "ERR_STREAM_NULL_VALUES",
- `May not write null values to stream`,
- );
- }
-}
-export class ERR_STREAM_PREMATURE_CLOSE extends NodeError {
- constructor() {
- super(
- "ERR_STREAM_PREMATURE_CLOSE",
- `Premature close`,
- );
- }
-}
-export class ERR_STREAM_PUSH_AFTER_EOF extends NodeError {
- constructor() {
- super(
- "ERR_STREAM_PUSH_AFTER_EOF",
- `stream.push() after EOF`,
- );
- }
-}
-export class ERR_STREAM_UNSHIFT_AFTER_END_EVENT extends NodeError {
- constructor() {
- super(
- "ERR_STREAM_UNSHIFT_AFTER_END_EVENT",
- `stream.unshift() after end event`,
- );
- }
-}
-export class ERR_STREAM_WRAP extends NodeError {
- constructor() {
- super(
- "ERR_STREAM_WRAP",
- `Stream has StringDecoder set or is in objectMode`,
- );
- }
-}
-export class ERR_STREAM_WRITE_AFTER_END extends NodeError {
- constructor() {
- super(
- "ERR_STREAM_WRITE_AFTER_END",
- `write after end`,
- );
- }
-}
-export class ERR_SYNTHETIC extends NodeError {
- constructor() {
- super(
- "ERR_SYNTHETIC",
- `JavaScript Callstack`,
- );
- }
-}
-export class ERR_TLS_DH_PARAM_SIZE extends NodeError {
- constructor(x: string) {
- super(
- "ERR_TLS_DH_PARAM_SIZE",
- `DH parameter size ${x} is less than 2048`,
- );
- }
-}
-export class ERR_TLS_HANDSHAKE_TIMEOUT extends NodeError {
- constructor() {
- super(
- "ERR_TLS_HANDSHAKE_TIMEOUT",
- `TLS handshake timeout`,
- );
- }
-}
-export class ERR_TLS_INVALID_CONTEXT extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_TLS_INVALID_CONTEXT",
- `${x} must be a SecureContext`,
- );
- }
-}
-export class ERR_TLS_INVALID_STATE extends NodeError {
- constructor() {
- super(
- "ERR_TLS_INVALID_STATE",
- `TLS socket connection must be securely established`,
- );
- }
-}
-export class ERR_TLS_INVALID_PROTOCOL_VERSION extends NodeTypeError {
- constructor(protocol: string, x: string) {
- super(
- "ERR_TLS_INVALID_PROTOCOL_VERSION",
- `${protocol} is not a valid ${x} TLS protocol version`,
- );
- }
-}
-export class ERR_TLS_PROTOCOL_VERSION_CONFLICT extends NodeTypeError {
- constructor(prevProtocol: string, protocol: string) {
- super(
- "ERR_TLS_PROTOCOL_VERSION_CONFLICT",
- `TLS protocol version ${prevProtocol} conflicts with secureProtocol ${protocol}`,
- );
- }
-}
-export class ERR_TLS_RENEGOTIATION_DISABLED extends NodeError {
- constructor() {
- super(
- "ERR_TLS_RENEGOTIATION_DISABLED",
- `TLS session renegotiation disabled for this socket`,
- );
- }
-}
-export class ERR_TLS_REQUIRED_SERVER_NAME extends NodeError {
- constructor() {
- super(
- "ERR_TLS_REQUIRED_SERVER_NAME",
- `"servername" is required parameter for Server.addContext`,
- );
- }
-}
-export class ERR_TLS_SESSION_ATTACK extends NodeError {
- constructor() {
- super(
- "ERR_TLS_SESSION_ATTACK",
- `TLS session renegotiation attack detected`,
- );
- }
-}
-export class ERR_TLS_SNI_FROM_SERVER extends NodeError {
- constructor() {
- super(
- "ERR_TLS_SNI_FROM_SERVER",
- `Cannot issue SNI from a TLS server-side socket`,
- );
- }
-}
-export class ERR_TRACE_EVENTS_CATEGORY_REQUIRED extends NodeTypeError {
- constructor() {
- super(
- "ERR_TRACE_EVENTS_CATEGORY_REQUIRED",
- `At least one category is required`,
- );
- }
-}
-export class ERR_TRACE_EVENTS_UNAVAILABLE extends NodeError {
- constructor() {
- super(
- "ERR_TRACE_EVENTS_UNAVAILABLE",
- `Trace events are unavailable`,
- );
- }
-}
-export class ERR_UNAVAILABLE_DURING_EXIT extends NodeError {
- constructor() {
- super(
- "ERR_UNAVAILABLE_DURING_EXIT",
- `Cannot call function in process exit handler`,
- );
- }
-}
-export class ERR_UNCAUGHT_EXCEPTION_CAPTURE_ALREADY_SET extends NodeError {
- constructor() {
- super(
- "ERR_UNCAUGHT_EXCEPTION_CAPTURE_ALREADY_SET",
- "`process.setupUncaughtExceptionCapture()` was called while a capture callback was already active",
- );
- }
-}
-export class ERR_UNESCAPED_CHARACTERS extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_UNESCAPED_CHARACTERS",
- `${x} contains unescaped characters`,
- );
- }
-}
-export class ERR_UNKNOWN_BUILTIN_MODULE extends NodeError {
- constructor(x: string) {
- super(
- "ERR_UNKNOWN_BUILTIN_MODULE",
- `No such built-in module: ${x}`,
- );
- }
-}
-export class ERR_UNKNOWN_CREDENTIAL extends NodeError {
- constructor(x: string, y: string) {
- super(
- "ERR_UNKNOWN_CREDENTIAL",
- `${x} identifier does not exist: ${y}`,
- );
- }
-}
-export class ERR_UNKNOWN_ENCODING extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_UNKNOWN_ENCODING",
- `Unknown encoding: ${x}`,
- );
- }
-}
-export class ERR_UNKNOWN_FILE_EXTENSION extends NodeTypeError {
- constructor(x: string, y: string) {
- super(
- "ERR_UNKNOWN_FILE_EXTENSION",
- `Unknown file extension "${x}" for ${y}`,
- );
- }
-}
-export class ERR_UNKNOWN_MODULE_FORMAT extends NodeRangeError {
- constructor(x: string) {
- super(
- "ERR_UNKNOWN_MODULE_FORMAT",
- `Unknown module format: ${x}`,
- );
- }
-}
-export class ERR_UNKNOWN_SIGNAL extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_UNKNOWN_SIGNAL",
- `Unknown signal: ${x}`,
- );
- }
-}
-export class ERR_UNSUPPORTED_DIR_IMPORT extends NodeError {
- constructor(x: string, y: string) {
- super(
- "ERR_UNSUPPORTED_DIR_IMPORT",
- `Directory import '${x}' is not supported resolving ES modules, imported from ${y}`,
- );
- }
-}
-export class ERR_UNSUPPORTED_ESM_URL_SCHEME extends NodeError {
- constructor() {
- super(
- "ERR_UNSUPPORTED_ESM_URL_SCHEME",
- `Only file and data URLs are supported by the default ESM loader`,
- );
- }
-}
-export class ERR_V8BREAKITERATOR extends NodeError {
- constructor() {
- super(
- "ERR_V8BREAKITERATOR",
- `Full ICU data not installed. See https://github.com/nodejs/node/wiki/Intl`,
- );
- }
-}
-export class ERR_VALID_PERFORMANCE_ENTRY_TYPE extends NodeError {
- constructor() {
- super(
- "ERR_VALID_PERFORMANCE_ENTRY_TYPE",
- `At least one valid performance entry type is required`,
- );
- }
-}
-export class ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING extends NodeTypeError {
- constructor() {
- super(
- "ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING",
- `A dynamic import callback was not specified.`,
- );
- }
-}
-export class ERR_VM_MODULE_ALREADY_LINKED extends NodeError {
- constructor() {
- super(
- "ERR_VM_MODULE_ALREADY_LINKED",
- `Module has already been linked`,
- );
- }
-}
-export class ERR_VM_MODULE_CANNOT_CREATE_CACHED_DATA extends NodeError {
- constructor() {
- super(
- "ERR_VM_MODULE_CANNOT_CREATE_CACHED_DATA",
- `Cached data cannot be created for a module which has been evaluated`,
- );
- }
-}
-export class ERR_VM_MODULE_DIFFERENT_CONTEXT extends NodeError {
- constructor() {
- super(
- "ERR_VM_MODULE_DIFFERENT_CONTEXT",
- `Linked modules must use the same context`,
- );
- }
-}
-export class ERR_VM_MODULE_LINKING_ERRORED extends NodeError {
- constructor() {
- super(
- "ERR_VM_MODULE_LINKING_ERRORED",
- `Linking has already failed for the provided module`,
- );
- }
-}
-export class ERR_VM_MODULE_NOT_MODULE extends NodeError {
- constructor() {
- super(
- "ERR_VM_MODULE_NOT_MODULE",
- `Provided module is not an instance of Module`,
- );
- }
-}
-export class ERR_VM_MODULE_STATUS extends NodeError {
- constructor(x: string) {
- super(
- "ERR_VM_MODULE_STATUS",
- `Module status ${x}`,
- );
- }
-}
-export class ERR_WASI_ALREADY_STARTED extends NodeError {
- constructor() {
- super(
- "ERR_WASI_ALREADY_STARTED",
- `WASI instance has already started`,
- );
- }
-}
-export class ERR_WORKER_INIT_FAILED extends NodeError {
- constructor(x: string) {
- super(
- "ERR_WORKER_INIT_FAILED",
- `Worker initialization failure: ${x}`,
- );
- }
-}
-export class ERR_WORKER_NOT_RUNNING extends NodeError {
- constructor() {
- super(
- "ERR_WORKER_NOT_RUNNING",
- `Worker instance not running`,
- );
- }
-}
-export class ERR_WORKER_OUT_OF_MEMORY extends NodeError {
- constructor(x: string) {
- super(
- "ERR_WORKER_OUT_OF_MEMORY",
- `Worker terminated due to reaching memory limit: ${x}`,
- );
- }
-}
-export class ERR_WORKER_UNSERIALIZABLE_ERROR extends NodeError {
- constructor() {
- super(
- "ERR_WORKER_UNSERIALIZABLE_ERROR",
- `Serializing an uncaught exception failed`,
- );
- }
-}
-export class ERR_WORKER_UNSUPPORTED_EXTENSION extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_WORKER_UNSUPPORTED_EXTENSION",
- `The worker script extension must be ".js", ".mjs", or ".cjs". Received "${x}"`,
- );
- }
-}
-export class ERR_WORKER_UNSUPPORTED_OPERATION extends NodeTypeError {
- constructor(x: string) {
- super(
- "ERR_WORKER_UNSUPPORTED_OPERATION",
- `${x} is not supported in workers`,
- );
- }
-}
-export class ERR_ZLIB_INITIALIZATION_FAILED extends NodeError {
- constructor() {
- super(
- "ERR_ZLIB_INITIALIZATION_FAILED",
- `Initialization failed`,
- );
- }
-}
-export class ERR_FALSY_VALUE_REJECTION extends NodeError {
- reason: string;
- constructor(reason: string) {
- super(
- "ERR_FALSY_VALUE_REJECTION",
- "Promise was rejected with falsy value",
- );
- this.reason = reason;
- }
-}
-export class ERR_HTTP2_INVALID_SETTING_VALUE extends NodeRangeError {
- actual: unknown;
- min?: number;
- max?: number;
-
- constructor(name: string, actual: unknown, min?: number, max?: number) {
- super(
- "ERR_HTTP2_INVALID_SETTING_VALUE",
- `Invalid value for setting "${name}": ${actual}`,
- );
- this.actual = actual;
- if (min !== undefined) {
- this.min = min;
- this.max = max;
- }
- }
-}
-export class ERR_HTTP2_STREAM_CANCEL extends NodeError {
- cause?: Error;
- constructor(error: Error) {
- super(
- "ERR_HTTP2_STREAM_CANCEL",
- typeof error.message === "string"
- ? `The pending stream has been canceled (caused by: ${error.message})`
- : "The pending stream has been canceled",
- );
- if (error) {
- this.cause = error;
- }
- }
-}
-
-export class ERR_INVALID_ADDRESS_FAMILY extends NodeRangeError {
- host: string;
- port: number;
- constructor(addressType: string, host: string, port: number) {
- super(
- "ERR_INVALID_ADDRESS_FAMILY",
- `Invalid address family: ${addressType} ${host}:${port}`,
- );
- this.host = host;
- this.port = port;
- }
-}
-
-export class ERR_INVALID_CHAR extends NodeTypeError {
- constructor(name: string, field?: string) {
- super(
- "ERR_INVALID_CHAR",
- field
- ? `Invalid character in ${name}`
- : `Invalid character in ${name} ["${field}"]`,
- );
- }
-}
-
-export class ERR_INVALID_OPT_VALUE extends NodeTypeError {
- constructor(name: string, value: unknown) {
- super(
- "ERR_INVALID_OPT_VALUE",
- `The value "${value}" is invalid for option "${name}"`,
- );
- }
-}
-
-export class ERR_INVALID_RETURN_PROPERTY extends NodeTypeError {
- constructor(input: string, name: string, prop: string, value: string) {
- super(
- "ERR_INVALID_RETURN_PROPERTY",
- `Expected a valid ${input} to be returned for the "${prop}" from the "${name}" function but got ${value}.`,
- );
- }
-}
-
-// deno-lint-ignore no-explicit-any
-function buildReturnPropertyType(value: any) {
- if (value && value.constructor && value.constructor.name) {
- return `instance of ${value.constructor.name}`;
- } else {
- return `type ${typeof value}`;
- }
-}
-
-export class ERR_INVALID_RETURN_PROPERTY_VALUE extends NodeTypeError {
- constructor(input: string, name: string, prop: string, value: unknown) {
- super(
- "ERR_INVALID_RETURN_PROPERTY_VALUE",
- `Expected ${input} to be returned for the "${prop}" from the "${name}" function but got ${
- buildReturnPropertyType(value)
- }.`,
- );
- }
-}
-
-export class ERR_INVALID_RETURN_VALUE extends NodeTypeError {
- constructor(input: string, name: string, value: unknown) {
- super(
- "ERR_INVALID_RETURN_VALUE",
- `Expected ${input} to be returned from the "${name}" function but got ${
- buildReturnPropertyType(value)
- }.`,
- );
- }
-}
-
-export class ERR_INVALID_URL extends NodeTypeError {
- input: string;
- constructor(input: string) {
- super(
- "ERR_INVALID_URL",
- `Invalid URL: ${input}`,
- );
- this.input = input;
- }
-}
diff --git a/std/node/_fs/_fs_access.ts b/std/node/_fs/_fs_access.ts
deleted file mode 100644
index 3211e1640..000000000
--- a/std/node/_fs/_fs_access.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import type { CallbackWithError } from "./_fs_common.ts";
-import { notImplemented } from "../_utils.ts";
-
-/** Revist once https://github.com/denoland/deno/issues/4017 lands */
-
-// TODO(bartlomieju) 'path' can also be a Buffer. Neither of these polyfills
-//is available yet. See https://github.com/denoland/deno/issues/3403
-export function access(
- _path: string | URL,
- _modeOrCallback: number | ((...args: unknown[]) => void),
- _callback?: CallbackWithError,
-): void {
- notImplemented("Not yet available");
-}
-
-// TODO(bartlomieju) 'path' can also be a Buffer. Neither of these polyfills
-// is available yet. See https://github.com/denoland/deno/issues/3403
-// eslint-disable-next-line @typescript-eslint/no-unused-vars
-export function accessSync(path: string | URL, mode?: number): void {
- notImplemented("Not yet available");
-}
diff --git a/std/node/_fs/_fs_appendFile.ts b/std/node/_fs/_fs_appendFile.ts
deleted file mode 100644
index ee01b9cc8..000000000
--- a/std/node/_fs/_fs_appendFile.ts
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import {
- CallbackWithError,
- getOpenOptions,
- isFileOptions,
- WriteFileOptions,
-} from "./_fs_common.ts";
-import { Encodings, notImplemented } from "../_utils.ts";
-import { fromFileUrl } from "../path.ts";
-
-/**
- * TODO: Also accept 'data' parameter as a Node polyfill Buffer type once these
- * are implemented. See https://github.com/denoland/deno/issues/3403
- */
-export function appendFile(
- pathOrRid: string | number | URL,
- data: string | Uint8Array,
- optionsOrCallback: Encodings | WriteFileOptions | CallbackWithError,
- callback?: CallbackWithError,
-): void {
- pathOrRid = pathOrRid instanceof URL ? fromFileUrl(pathOrRid) : pathOrRid;
- const callbackFn: CallbackWithError | undefined =
- optionsOrCallback instanceof Function ? optionsOrCallback : callback;
- const options: Encodings | WriteFileOptions | undefined =
- optionsOrCallback instanceof Function ? undefined : optionsOrCallback;
- if (!callbackFn) {
- throw new Error("No callback function supplied");
- }
-
- validateEncoding(options);
- let rid = -1;
- const buffer: Uint8Array = data instanceof Uint8Array
- ? data
- : new TextEncoder().encode(data);
- new Promise((resolve, reject) => {
- if (typeof pathOrRid === "number") {
- rid = pathOrRid;
- Deno.write(rid, buffer).then(resolve, reject);
- } else {
- const mode: number | undefined = isFileOptions(options)
- ? options.mode
- : undefined;
- const flag: string | undefined = isFileOptions(options)
- ? options.flag
- : undefined;
-
- if (mode) {
- // TODO(bartlomieju) rework once https://github.com/denoland/deno/issues/4017 completes
- notImplemented("Deno does not yet support setting mode on create");
- }
- Deno.open(pathOrRid as string, getOpenOptions(flag))
- .then(({ rid: openedFileRid }) => {
- rid = openedFileRid;
- return Deno.write(openedFileRid, buffer);
- })
- .then(resolve, reject);
- }
- })
- .then(() => {
- closeRidIfNecessary(typeof pathOrRid === "string", rid);
- callbackFn(null);
- }, (err) => {
- closeRidIfNecessary(typeof pathOrRid === "string", rid);
- callbackFn(err);
- });
-}
-
-function closeRidIfNecessary(isPathString: boolean, rid: number): void {
- if (isPathString && rid != -1) {
- //Only close if a path was supplied and a rid allocated
- Deno.close(rid);
- }
-}
-
-/**
- * TODO: Also accept 'data' parameter as a Node polyfill Buffer type once these
- * are implemented. See https://github.com/denoland/deno/issues/3403
- */
-export function appendFileSync(
- pathOrRid: string | number | URL,
- data: string | Uint8Array,
- options?: Encodings | WriteFileOptions,
-): void {
- let rid = -1;
-
- validateEncoding(options);
- pathOrRid = pathOrRid instanceof URL ? fromFileUrl(pathOrRid) : pathOrRid;
-
- 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(bartlomieju) rework once https://github.com/denoland/deno/issues/4017 completes
- notImplemented("Deno does not yet support setting mode on create");
- }
-
- const file = Deno.openSync(pathOrRid, getOpenOptions(flag));
- rid = file.rid;
- }
-
- const buffer: Uint8Array = data instanceof Uint8Array
- ? data
- : new TextEncoder().encode(data);
-
- Deno.writeSync(rid, buffer);
- } finally {
- closeRidIfNecessary(typeof pathOrRid === "string", rid);
- }
-}
-
-function validateEncoding(
- encodingOption: Encodings | WriteFileOptions | undefined,
-): void {
- if (!encodingOption) return;
-
- if (typeof encodingOption === "string") {
- if (encodingOption !== "utf8") {
- throw new Error("Only 'utf8' encoding is currently supported");
- }
- } else if (encodingOption.encoding && encodingOption.encoding !== "utf8") {
- throw new Error("Only 'utf8' encoding is currently supported");
- }
-}
diff --git a/std/node/_fs/_fs_appendFile_test.ts b/std/node/_fs/_fs_appendFile_test.ts
deleted file mode 100644
index 6a77974fd..000000000
--- a/std/node/_fs/_fs_appendFile_test.ts
+++ /dev/null
@@ -1,254 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { assertEquals, assertThrows, fail } from "../../testing/asserts.ts";
-import { appendFile, appendFileSync } from "./_fs_appendFile.ts";
-import { fromFileUrl } from "../path.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-
-const decoder = new TextDecoder("utf-8");
-
-Deno.test({
- name: "No callback Fn results in Error",
- fn() {
- assertThrows(
- () => {
- appendFile("some/path", "some data", "utf8");
- },
- Error,
- "No callback function supplied",
- );
- },
-});
-
-Deno.test({
- name: "Unsupported encoding results in error()",
- fn() {
- assertThrows(
- () => {
- // @ts-expect-error Type '"made-up-encoding"' is not assignable to type
- appendFile("some/path", "some data", "made-up-encoding", () => {});
- },
- Error,
- "Only 'utf8' encoding is currently supported",
- );
- assertThrows(
- () => {
- appendFile(
- "some/path",
- "some data",
- // @ts-expect-error Type '"made-up-encoding"' is not assignable to type
- { encoding: "made-up-encoding" },
- () => {},
- );
- },
- Error,
- "Only 'utf8' encoding is currently supported",
- );
- assertThrows(
- // @ts-expect-error Type '"made-up-encoding"' is not assignable to type
- () => appendFileSync("some/path", "some data", "made-up-encoding"),
- Error,
- "Only 'utf8' encoding is currently supported",
- );
- assertThrows(
- () =>
- appendFileSync("some/path", "some data", {
- // @ts-expect-error Type '"made-up-encoding"' is not assignable to type
- encoding: "made-up-encoding",
- }),
- Error,
- "Only 'utf8' encoding is currently supported",
- );
- },
-});
-
-Deno.test({
- name: "Async: Data is written to passed in rid",
- async fn() {
- const tempFile: string = await Deno.makeTempFile();
- const file: Deno.File = await Deno.open(tempFile, {
- create: true,
- write: true,
- read: true,
- });
- await new Promise<void>((resolve, reject) => {
- appendFile(file.rid, "hello world", (err) => {
- if (err) reject();
- else resolve();
- });
- })
- .then(async () => {
- const data = await Deno.readFile(tempFile);
- assertEquals(decoder.decode(data), "hello world");
- }, () => {
- fail("No error expected");
- })
- .finally(async () => {
- Deno.close(file.rid);
- await Deno.remove(tempFile);
- });
- },
-});
-
-Deno.test({
- name: "Async: Data is written to passed in file path",
- async fn() {
- const openResourcesBeforeAppend: Deno.ResourceMap = Deno.resources();
- await new Promise<void>((resolve, reject) => {
- appendFile("_fs_appendFile_test_file.txt", "hello world", (err) => {
- if (err) reject(err);
- else resolve();
- });
- })
- .then(async () => {
- assertEquals(Deno.resources(), openResourcesBeforeAppend);
- const data = await Deno.readFile("_fs_appendFile_test_file.txt");
- assertEquals(decoder.decode(data), "hello world");
- }, (err) => {
- fail("No error was expected: " + err);
- })
- .finally(async () => {
- await Deno.remove("_fs_appendFile_test_file.txt");
- });
- },
-});
-
-Deno.test({
- name: "Async: Data is written to passed in URL",
- async fn() {
- const openResourcesBeforeAppend: Deno.ResourceMap = Deno.resources();
- const fileURL = new URL("_fs_appendFile_test_file.txt", import.meta.url);
- await new Promise<void>((resolve, reject) => {
- appendFile(fileURL, "hello world", (err) => {
- if (err) reject(err);
- else resolve();
- });
- })
- .then(async () => {
- assertEquals(Deno.resources(), openResourcesBeforeAppend);
- const data = await Deno.readFile(fromFileUrl(fileURL));
- assertEquals(decoder.decode(data), "hello world");
- }, (err) => {
- fail("No error was expected: " + err);
- })
- .finally(async () => {
- await Deno.remove(fromFileUrl(fileURL));
- });
- },
-});
-
-Deno.test({
- name:
- "Async: Callback is made with error if attempting to append data to an existing file with 'ax' flag",
- async fn() {
- const openResourcesBeforeAppend: Deno.ResourceMap = Deno.resources();
- const tempFile: string = await Deno.makeTempFile();
- await new Promise<void>((resolve, reject) => {
- appendFile(tempFile, "hello world", { flag: "ax" }, (err) => {
- if (err) reject(err);
- else resolve();
- });
- })
- .then(() => {
- fail("Expected error to be thrown");
- }, () => {
- assertEquals(Deno.resources(), openResourcesBeforeAppend);
- })
- .finally(async () => {
- await Deno.remove(tempFile);
- });
- },
-});
-
-Deno.test({
- name: "Sync: Data is written to passed in rid",
- fn() {
- const tempFile: string = Deno.makeTempFileSync();
- const file: Deno.File = Deno.openSync(tempFile, {
- create: true,
- write: true,
- read: true,
- });
- appendFileSync(file.rid, "hello world");
- Deno.close(file.rid);
- const data = Deno.readFileSync(tempFile);
- assertEquals(decoder.decode(data), "hello world");
- Deno.removeSync(tempFile);
- },
-});
-
-Deno.test({
- name: "Sync: Data is written to passed in file path",
- fn() {
- const openResourcesBeforeAppend: Deno.ResourceMap = Deno.resources();
- appendFileSync("_fs_appendFile_test_file_sync.txt", "hello world");
- assertEquals(Deno.resources(), openResourcesBeforeAppend);
- const data = Deno.readFileSync("_fs_appendFile_test_file_sync.txt");
- assertEquals(decoder.decode(data), "hello world");
- Deno.removeSync("_fs_appendFile_test_file_sync.txt");
- },
-});
-
-Deno.test({
- name:
- "Sync: error thrown if attempting to append data to an existing file with 'ax' flag",
- fn() {
- const openResourcesBeforeAppend: Deno.ResourceMap = Deno.resources();
- const tempFile: string = Deno.makeTempFileSync();
- assertThrows(
- () => appendFileSync(tempFile, "hello world", { flag: "ax" }),
- Deno.errors.AlreadyExists,
- "",
- );
- assertEquals(Deno.resources(), openResourcesBeforeAppend);
- Deno.removeSync(tempFile);
- },
-});
-
-Deno.test({
- name: "Sync: Data is written in Uint8Array to passed in file path",
- fn() {
- const openResourcesBeforeAppend: Deno.ResourceMap = Deno.resources();
- const testData = new TextEncoder().encode("hello world");
- appendFileSync("_fs_appendFile_test_file_sync.txt", testData);
- assertEquals(Deno.resources(), openResourcesBeforeAppend);
- const data = Deno.readFileSync("_fs_appendFile_test_file_sync.txt");
- assertEquals(data, testData);
- Deno.removeSync("_fs_appendFile_test_file_sync.txt");
- },
-});
-
-Deno.test({
- name: "Async: Data is written in Uint8Array to passed in file path",
- async fn() {
- const openResourcesBeforeAppend: Deno.ResourceMap = Deno.resources();
- const testData = new TextEncoder().encode("hello world");
- await new Promise<void>((resolve, reject) => {
- appendFile("_fs_appendFile_test_file.txt", testData, (err) => {
- if (err) reject(err);
- else resolve();
- });
- })
- .then(async () => {
- assertEquals(Deno.resources(), openResourcesBeforeAppend);
- const data = await Deno.readFile("_fs_appendFile_test_file.txt");
- assertEquals(data, testData);
- }, (err) => {
- fail("No error was expected: " + err);
- })
- .finally(async () => {
- await Deno.remove("_fs_appendFile_test_file.txt");
- });
- },
-});
-
-Deno.test("[std/node/fs] appendFile callback isn't called twice if error is thrown", async () => {
- const tempFile = await Deno.makeTempFile();
- const importUrl = new URL("./_fs_appendFile.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { appendFile } from ${JSON.stringify(importUrl)}`,
- invocation: `appendFile(${JSON.stringify(tempFile)}, "hello world", `,
- async cleanup() {
- await Deno.remove(tempFile);
- },
- });
-});
diff --git a/std/node/_fs/_fs_chmod.ts b/std/node/_fs/_fs_chmod.ts
deleted file mode 100644
index bf4031d2c..000000000
--- a/std/node/_fs/_fs_chmod.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import type { CallbackWithError } from "./_fs_common.ts";
-import { fromFileUrl } from "../path.ts";
-
-const allowedModes = /^[0-7]{3}/;
-
-/**
- * TODO: Also accept 'path' parameter as a Node polyfill Buffer type once these
- * are implemented. See https://github.com/denoland/deno/issues/3403
- */
-export function chmod(
- path: string | URL,
- mode: string | number,
- callback: CallbackWithError,
-): void {
- path = path instanceof URL ? fromFileUrl(path) : path;
-
- Deno.chmod(path, getResolvedMode(mode)).then(() => callback(null), callback);
-}
-
-/**
- * TODO: Also accept 'path' parameter as a Node polyfill Buffer type once these
- * are implemented. See https://github.com/denoland/deno/issues/3403
- */
-export function chmodSync(path: string | URL, mode: string | number): void {
- path = path instanceof URL ? fromFileUrl(path) : path;
- Deno.chmodSync(path, getResolvedMode(mode));
-}
-
-function getResolvedMode(mode: string | number): number {
- if (typeof mode === "number") {
- return mode;
- }
-
- if (typeof mode === "string" && !allowedModes.test(mode)) {
- throw new Error("Unrecognized mode: " + mode);
- }
-
- return parseInt(mode, 8);
-}
diff --git a/std/node/_fs/_fs_chmod_test.ts b/std/node/_fs/_fs_chmod_test.ts
deleted file mode 100644
index 4d8647782..000000000
--- a/std/node/_fs/_fs_chmod_test.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { assert, fail } from "../../testing/asserts.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import { chmod, chmodSync } from "./_fs_chmod.ts";
-
-Deno.test({
- name: "ASYNC: Permissions are changed (non-Windows)",
- ignore: Deno.build.os === "windows",
- async fn() {
- const tempFile: string = await Deno.makeTempFile();
- const originalFileMode: number | null = (await Deno.lstat(tempFile)).mode;
- await new Promise<void>((resolve, reject) => {
- chmod(tempFile, 0o777, (err) => {
- if (err) reject(err);
- else resolve();
- });
- })
- .then(() => {
- const newFileMode: number | null = Deno.lstatSync(tempFile).mode;
- assert(newFileMode && originalFileMode);
- assert(newFileMode === 33279 && newFileMode > originalFileMode);
- }, () => {
- fail();
- })
- .finally(() => {
- Deno.removeSync(tempFile);
- });
- },
-});
-
-Deno.test({
- name: "SYNC: Permissions are changed (non-Windows)",
- ignore: Deno.build.os === "windows",
- fn() {
- const tempFile: string = Deno.makeTempFileSync();
- const originalFileMode: number | null = Deno.lstatSync(tempFile).mode;
- chmodSync(tempFile, "777");
-
- const newFileMode: number | null = Deno.lstatSync(tempFile).mode;
- assert(newFileMode && originalFileMode);
- assert(newFileMode === 33279 && newFileMode > originalFileMode);
- Deno.removeSync(tempFile);
- },
-});
-
-Deno.test({
- name: "[std/node/fs] chmod callback isn't called twice if error is thrown",
- ignore: Deno.build.os === "windows",
- async fn() {
- const tempFile = await Deno.makeTempFile();
- const importUrl = new URL("./_fs_chmod.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { chmod } from ${JSON.stringify(importUrl)}`,
- invocation: `chmod(${JSON.stringify(tempFile)}, 0o777, `,
- async cleanup() {
- await Deno.remove(tempFile);
- },
- });
- },
-});
diff --git a/std/node/_fs/_fs_chown.ts b/std/node/_fs/_fs_chown.ts
deleted file mode 100644
index f9e7326ce..000000000
--- a/std/node/_fs/_fs_chown.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import type { CallbackWithError } from "./_fs_common.ts";
-import { fromFileUrl } from "../path.ts";
-
-/**
- * TODO: Also accept 'path' parameter as a Node polyfill Buffer type once these
- * are implemented. See https://github.com/denoland/deno/issues/3403
- */
-export function chown(
- path: string | URL,
- uid: number,
- gid: number,
- callback: CallbackWithError,
-): void {
- path = path instanceof URL ? fromFileUrl(path) : path;
-
- Deno.chown(path, uid, gid).then(() => callback(null), callback);
-}
-
-/**
- * TODO: Also accept 'path' parameter as a Node polyfill Buffer type once these
- * are implemented. See https://github.com/denoland/deno/issues/3403
- */
-export function chownSync(path: string | URL, uid: number, gid: number): void {
- path = path instanceof URL ? fromFileUrl(path) : path;
-
- Deno.chownSync(path, uid, gid);
-}
diff --git a/std/node/_fs/_fs_chown_test.ts b/std/node/_fs/_fs_chown_test.ts
deleted file mode 100644
index 8d74f657a..000000000
--- a/std/node/_fs/_fs_chown_test.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { assertEquals, fail } from "../../testing/asserts.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import { chown, chownSync } from "./_fs_chown.ts";
-
-// chown is difficult to test. Best we can do is set the existing user id/group
-// id again
-const ignore = Deno.build.os == "windows";
-
-Deno.test({
- ignore,
- name: "ASYNC: setting existing uid/gid works as expected (non-Windows)",
- async fn() {
- const tempFile: string = await Deno.makeTempFile();
- const originalUserId: number | null = (await Deno.lstat(tempFile)).uid;
- const originalGroupId: number | null = (await Deno.lstat(tempFile)).gid;
- await new Promise<void>((resolve, reject) => {
- chown(tempFile, originalUserId!, originalGroupId!, (err) => {
- if (err) reject(err);
- else resolve();
- });
- })
- .then(() => {
- const newUserId: number | null = Deno.lstatSync(tempFile).uid;
- const newGroupId: number | null = Deno.lstatSync(tempFile).gid;
- assertEquals(newUserId, originalUserId);
- assertEquals(newGroupId, originalGroupId);
- }, () => {
- fail();
- })
- .finally(() => {
- Deno.removeSync(tempFile);
- });
- },
-});
-
-Deno.test({
- ignore,
- name: "SYNC: setting existing uid/gid works as expected (non-Windows)",
- fn() {
- const tempFile: string = Deno.makeTempFileSync();
- const originalUserId: number | null = Deno.lstatSync(tempFile).uid;
- const originalGroupId: number | null = Deno.lstatSync(tempFile).gid;
- chownSync(tempFile, originalUserId!, originalGroupId!);
-
- const newUserId: number | null = Deno.lstatSync(tempFile).uid;
- const newGroupId: number | null = Deno.lstatSync(tempFile).gid;
- assertEquals(newUserId, originalUserId);
- assertEquals(newGroupId, originalGroupId);
- Deno.removeSync(tempFile);
- },
-});
-
-Deno.test({
- name: "[std/node/fs] chown callback isn't called twice if error is thrown",
- ignore: Deno.build.os === "windows",
- async fn() {
- const tempFile = await Deno.makeTempFile();
- const { uid, gid } = await Deno.lstat(tempFile);
- const importUrl = new URL("./_fs_chown.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { chown } from ${JSON.stringify(importUrl)}`,
- invocation: `chown(${JSON.stringify(tempFile)}, ${uid}, ${gid}, `,
- async cleanup() {
- await Deno.remove(tempFile);
- },
- });
- },
-});
diff --git a/std/node/_fs/_fs_close.ts b/std/node/_fs/_fs_close.ts
deleted file mode 100644
index 721827421..000000000
--- a/std/node/_fs/_fs_close.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import type { CallbackWithError } from "./_fs_common.ts";
-
-export function close(fd: number, callback: CallbackWithError): void {
- setTimeout(() => {
- let error = null;
- try {
- Deno.close(fd);
- } catch (err) {
- error = err;
- }
- callback(error);
- }, 0);
-}
-
-export function closeSync(fd: number): void {
- Deno.close(fd);
-}
diff --git a/std/node/_fs/_fs_close_test.ts b/std/node/_fs/_fs_close_test.ts
deleted file mode 100644
index df5a93240..000000000
--- a/std/node/_fs/_fs_close_test.ts
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { assert, assertThrows, fail } from "../../testing/asserts.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import { close, closeSync } from "./_fs_close.ts";
-
-Deno.test({
- name: "ASYNC: File is closed",
- async fn() {
- const tempFile: string = await Deno.makeTempFile();
- const file: Deno.File = await Deno.open(tempFile);
-
- assert(Deno.resources()[file.rid]);
- await new Promise<void>((resolve, reject) => {
- close(file.rid, (err) => {
- if (err !== null) reject();
- else resolve();
- });
- })
- .then(() => {
- assert(!Deno.resources()[file.rid]);
- }, () => {
- fail("No error expected");
- })
- .finally(async () => {
- await Deno.remove(tempFile);
- });
- },
-});
-
-Deno.test({
- name: "ASYNC: Invalid fd",
- async fn() {
- await new Promise<void>((resolve, reject) => {
- close(-1, (err) => {
- if (err !== null) return resolve();
- reject();
- });
- });
- },
-});
-
-Deno.test({
- name: "close callback should be asynchronous",
- async fn() {
- const tempFile: string = Deno.makeTempFileSync();
- const file: Deno.File = Deno.openSync(tempFile);
-
- let foo: string;
- const promise = new Promise<void>((resolve) => {
- close(file.rid, () => {
- assert(foo === "bar");
- resolve();
- });
- foo = "bar";
- });
-
- await promise;
- Deno.removeSync(tempFile);
- },
-});
-
-Deno.test({
- name: "SYNC: File is closed",
- fn() {
- const tempFile: string = Deno.makeTempFileSync();
- const file: Deno.File = Deno.openSync(tempFile);
-
- assert(Deno.resources()[file.rid]);
- closeSync(file.rid);
- assert(!Deno.resources()[file.rid]);
- Deno.removeSync(tempFile);
- },
-});
-
-Deno.test({
- name: "SYNC: Invalid fd",
- fn() {
- assertThrows(() => closeSync(-1));
- },
-});
-
-Deno.test("[std/node/fs] close callback isn't called twice if error is thrown", async () => {
- const tempFile = await Deno.makeTempFile();
- const importUrl = new URL("./_fs_close.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `
- import { close } from ${JSON.stringify(importUrl)};
-
- const file = await Deno.open(${JSON.stringify(tempFile)});
- `,
- invocation: "close(file.rid, ",
- async cleanup() {
- await Deno.remove(tempFile);
- },
- });
-});
diff --git a/std/node/_fs/_fs_common.ts b/std/node/_fs/_fs_common.ts
deleted file mode 100644
index c233b2d76..000000000
--- a/std/node/_fs/_fs_common.ts
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import {
- BinaryEncodings,
- Encodings,
- notImplemented,
- TextEncodings,
-} from "../_utils.ts";
-
-export type CallbackWithError = (err: Error | null) => void;
-
-export interface FileOptions {
- encoding?: Encodings;
- flag?: string;
-}
-
-export type TextOptionsArgument =
- | TextEncodings
- | ({ encoding: TextEncodings } & FileOptions);
-export type BinaryOptionsArgument =
- | BinaryEncodings
- | ({ encoding: BinaryEncodings } & FileOptions);
-export type FileOptionsArgument = Encodings | FileOptions;
-
-export interface WriteFileOptions extends FileOptions {
- mode?: number;
-}
-
-export function isFileOptions(
- fileOptions: string | WriteFileOptions | undefined,
-): fileOptions is FileOptions {
- if (!fileOptions) return false;
-
- return (
- (fileOptions as FileOptions).encoding != undefined ||
- (fileOptions as FileOptions).flag != undefined ||
- (fileOptions as WriteFileOptions).mode != undefined
- );
-}
-
-export function getEncoding(
- optOrCallback?:
- | FileOptions
- | WriteFileOptions
- // deno-lint-ignore no-explicit-any
- | ((...args: any[]) => any)
- | Encodings
- | null,
-): Encodings | null {
- if (!optOrCallback || typeof optOrCallback === "function") {
- return null;
- }
-
- const encoding = typeof optOrCallback === "string"
- ? optOrCallback
- : optOrCallback.encoding;
- if (!encoding) return null;
- return encoding;
-}
-
-export function checkEncoding(encoding: Encodings | null): Encodings | null {
- if (!encoding) return null;
-
- encoding = encoding.toLowerCase() as Encodings;
- if (["utf8", "hex", "base64"].includes(encoding)) return encoding;
-
- if (encoding === "utf-8") {
- return "utf8";
- }
- if (encoding === "binary") {
- return "binary";
- // before this was buffer, however buffer is not used in Node
- // node -e "require('fs').readFile('../world.txt', 'buffer', console.log)"
- }
-
- const notImplementedEncodings = ["utf16le", "latin1", "ascii", "ucs2"];
-
- if (notImplementedEncodings.includes(encoding as string)) {
- notImplemented(`"${encoding}" encoding`);
- }
-
- throw new Error(`The value "${encoding}" is invalid for option "encoding"`);
-}
-
-export function getOpenOptions(flag: string | undefined): Deno.OpenOptions {
- if (!flag) {
- return { create: true, append: true };
- }
-
- let openOptions: Deno.OpenOptions;
- switch (flag) {
- case "a": {
- // 'a': Open file for appending. The file is created if it does not exist.
- openOptions = { create: true, append: true };
- break;
- }
- case "ax": {
- // 'ax': Like 'a' but fails if the path exists.
- openOptions = { createNew: true, write: true, append: true };
- break;
- }
- case "a+": {
- // 'a+': Open file for reading and appending. The file is created if it does not exist.
- openOptions = { read: true, create: true, append: true };
- break;
- }
- case "ax+": {
- // 'ax+': Like 'a+' but fails if the path exists.
- openOptions = { read: true, createNew: true, append: true };
- break;
- }
- case "r": {
- // 'r': Open file for reading. An exception occurs if the file does not exist.
- openOptions = { read: true };
- break;
- }
- case "r+": {
- // 'r+': Open file for reading and writing. An exception occurs if the file does not exist.
- openOptions = { read: true, write: true };
- break;
- }
- case "w": {
- // 'w': Open file for writing. The file is created (if it does not exist) or truncated (if it exists).
- openOptions = { create: true, write: true, truncate: true };
- break;
- }
- case "wx": {
- // 'wx': Like 'w' but fails if the path exists.
- openOptions = { createNew: true, write: true };
- break;
- }
- case "w+": {
- // 'w+': Open file for reading and writing. The file is created (if it does not exist) or truncated (if it exists).
- openOptions = { create: true, write: true, truncate: true, read: true };
- break;
- }
- case "wx+": {
- // 'wx+': Like 'w+' but fails if the path exists.
- openOptions = { createNew: true, write: true, read: true };
- break;
- }
- case "as": {
- // 'as': Open file for appending in synchronous mode. The file is created if it does not exist.
- openOptions = { create: true, append: true };
- break;
- }
- case "as+": {
- // 'as+': Open file for reading and appending in synchronous mode. The file is created if it does not exist.
- openOptions = { create: true, read: true, append: true };
- break;
- }
- case "rs+": {
- // 'rs+': Open file for reading and writing in synchronous mode. Instructs the operating system to bypass the local file system cache.
- openOptions = { create: true, read: true, write: true };
- break;
- }
- default: {
- throw new Error(`Unrecognized file system flag: ${flag}`);
- }
- }
-
- return openOptions;
-}
diff --git a/std/node/_fs/_fs_constants.ts b/std/node/_fs/_fs_constants.ts
deleted file mode 100644
index 7f740276b..000000000
--- a/std/node/_fs/_fs_constants.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-
-//File access constants
-export const F_OK = 0;
-export const R_OK = 4;
-export const W_OK = 2;
-export const X_OK = 1;
-
-//File mode constants
-export const S_IRUSR = 0o400; //read by owner
-export const S_IWUSR = 0o200; //write by owner
-export const S_IXUSR = 0o100; //execute/search by owner
-export const S_IRGRP = 0o40; //read by group
-export const S_IWGRP = 0o20; //write by group
-export const S_IXGRP = 0o10; //execute/search by group
-export const S_IROTH = 0o4; //read by others
-export const S_IWOTH = 0o2; //write by others
-export const S_IXOTH = 0o1; //execute/search by others
diff --git a/std/node/_fs/_fs_copy.ts b/std/node/_fs/_fs_copy.ts
deleted file mode 100644
index 3242b97b3..000000000
--- a/std/node/_fs/_fs_copy.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import type { CallbackWithError } from "./_fs_common.ts";
-import { fromFileUrl } from "../path.ts";
-
-export function copyFile(
- source: string | URL,
- destination: string,
- callback: CallbackWithError,
-): void {
- source = source instanceof URL ? fromFileUrl(source) : source;
-
- Deno.copyFile(source, destination).then(() => callback(null), callback);
-}
-
-export function copyFileSync(source: string | URL, destination: string): void {
- source = source instanceof URL ? fromFileUrl(source) : source;
- Deno.copyFileSync(source, destination);
-}
diff --git a/std/node/_fs/_fs_copy_test.ts b/std/node/_fs/_fs_copy_test.ts
deleted file mode 100644
index 4fdf78cb0..000000000
--- a/std/node/_fs/_fs_copy_test.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import * as path from "../../path/mod.ts";
-import { assert } from "../../testing/asserts.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import { copyFile, copyFileSync } from "./_fs_copy.ts";
-import { existsSync } from "./_fs_exists.ts";
-
-const destFile = "./destination.txt";
-
-Deno.test({
- name: "[std/node/fs] copy file",
- fn: async () => {
- const sourceFile = Deno.makeTempFileSync();
- const err = await new Promise((resolve) => {
- copyFile(sourceFile, destFile, (err?: Error | null) => resolve(err));
- });
- assert(!err);
- assert(existsSync(destFile));
- Deno.removeSync(sourceFile);
- Deno.removeSync(destFile);
- },
-});
-
-Deno.test({
- name: "[std/node/fs] copy file sync",
- fn: () => {
- const sourceFile = Deno.makeTempFileSync();
- copyFileSync(sourceFile, destFile);
- assert(existsSync(destFile));
- Deno.removeSync(sourceFile);
- Deno.removeSync(destFile);
- },
-});
-
-Deno.test("[std/node/fs] copyFile callback isn't called twice if error is thrown", async () => {
- // The correct behaviour is not to catch any errors thrown,
- // but that means there'll be an uncaught error and the test will fail.
- // So the only way to test this is to spawn a subprocess, and succeed if it has a non-zero exit code.
- // (assertThrowsAsync won't work because there's no way to catch the error.)
- const tempDir = await Deno.makeTempDir();
- const tempFile1 = path.join(tempDir, "file1.txt");
- const tempFile2 = path.join(tempDir, "file2.txt");
- await Deno.writeTextFile(tempFile1, "hello world");
- const importUrl = new URL("./_fs_copy.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { copyFile } from ${JSON.stringify(importUrl)}`,
- invocation: `copyFile(${JSON.stringify(tempFile1)},
- ${JSON.stringify(tempFile2)}, `,
- async cleanup() {
- await Deno.remove(tempDir, { recursive: true });
- },
- });
-});
diff --git a/std/node/_fs/_fs_dir.ts b/std/node/_fs/_fs_dir.ts
deleted file mode 100644
index 4f7beec31..000000000
--- a/std/node/_fs/_fs_dir.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import Dirent from "./_fs_dirent.ts";
-import { assert } from "../../_util/assert.ts";
-
-export default class Dir {
- private dirPath: string | Uint8Array;
- private syncIterator!: Iterator<Deno.DirEntry> | null;
- private asyncIterator!: AsyncIterator<Deno.DirEntry> | null;
-
- constructor(path: string | Uint8Array) {
- this.dirPath = path;
- }
-
- get path(): string {
- if (this.dirPath instanceof Uint8Array) {
- return new TextDecoder().decode(this.dirPath);
- }
- return this.dirPath;
- }
-
- // deno-lint-ignore no-explicit-any
- read(callback?: (...args: any[]) => void): Promise<Dirent | null> {
- 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);
- }
- }, (err) => {
- if (callback) {
- callback(err);
- }
- reject(err);
- });
- });
- }
-
- readSync(): Dirent | null {
- if (!this.syncIterator) {
- this.syncIterator = Deno.readDirSync(this.path)![Symbol.iterator]();
- }
-
- const file: Deno.DirEntry = this.syncIterator.next().value;
-
- return file ? new Dirent(file) : null;
- }
-
- /**
- * Unlike Node, Deno does not require managing resource ids for reading
- * directories, and therefore does not need to close directories when
- * finished reading.
- */
- // deno-lint-ignore no-explicit-any
- close(callback?: (...args: any[]) => void): Promise<void> {
- return new Promise((resolve) => {
- if (callback) {
- callback(null);
- }
- resolve();
- });
- }
-
- /**
- * Unlike Node, Deno does not require managing resource ids for reading
- * directories, and therefore does not need to close directories when
- * finished reading
- */
- closeSync(): void {
- //No op
- }
-
- async *[Symbol.asyncIterator](): AsyncIterableIterator<Dirent> {
- try {
- while (true) {
- const dirent: Dirent | null = await this.read();
- if (dirent === null) {
- break;
- }
- yield dirent;
- }
- } finally {
- await this.close();
- }
- }
-}
diff --git a/std/node/_fs/_fs_dir_test.ts b/std/node/_fs/_fs_dir_test.ts
deleted file mode 100644
index f12563fd5..000000000
--- a/std/node/_fs/_fs_dir_test.ts
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { assert, assertEquals, fail } from "../../testing/asserts.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import Dir from "./_fs_dir.ts";
-import type Dirent from "./_fs_dirent.ts";
-
-Deno.test({
- name: "Closing current directory with callback is successful",
- fn() {
- let calledBack = false;
- // deno-lint-ignore no-explicit-any
- new Dir(".").close((valOrErr: any) => {
- assert(!valOrErr);
- calledBack = true;
- });
- assert(calledBack);
- },
-});
-
-Deno.test({
- name: "Closing current directory without callback returns void Promise",
- async fn() {
- await new Dir(".").close();
- },
-});
-
-Deno.test({
- name: "Closing current directory synchronously works",
- fn() {
- new Dir(".").closeSync();
- },
-});
-
-Deno.test({
- name: "Path is correctly returned",
- fn() {
- assertEquals(new Dir("std/node").path, "std/node");
-
- const enc: Uint8Array = new TextEncoder().encode("std/node");
- assertEquals(new Dir(enc).path, "std/node");
- },
-});
-
-Deno.test({
- name: "read returns null for empty directory",
- async fn() {
- const testDir: string = Deno.makeTempDirSync();
- try {
- const file: Dirent | null = await new Dir(testDir).read();
- assert(file === null);
-
- let calledBack = false;
- const fileFromCallback: Dirent | null = await new Dir(
- testDir,
- // deno-lint-ignore no-explicit-any
- ).read((err: any, res: Dirent) => {
- assert(res === null);
- assert(err === null);
- calledBack = true;
- });
- assert(fileFromCallback === null);
- assert(calledBack);
-
- assertEquals(new Dir(testDir).readSync(), null);
- } finally {
- Deno.removeSync(testDir);
- }
- },
-});
-
-Deno.test({
- name: "Async read returns one file at a time",
- async fn() {
- const testDir: string = Deno.makeTempDirSync();
- const f1 = Deno.createSync(testDir + "/foo.txt");
- f1.close();
- const f2 = Deno.createSync(testDir + "/bar.txt");
- f2.close();
-
- try {
- let secondCallback = false;
- const dir: Dir = new Dir(testDir);
- const firstRead: Dirent | null = await dir.read();
- const secondRead: Dirent | null = await dir.read(
- // deno-lint-ignore no-explicit-any
- (err: any, secondResult: Dirent) => {
- assert(
- secondResult.name === "bar.txt" ||
- secondResult.name === "foo.txt",
- );
- secondCallback = true;
- },
- );
- const thirdRead: Dirent | null = await dir.read();
- const fourthRead: Dirent | null = await dir.read();
-
- if (firstRead?.name === "foo.txt") {
- assertEquals(secondRead?.name, "bar.txt");
- } else if (firstRead?.name === "bar.txt") {
- assertEquals(secondRead?.name, "foo.txt");
- } else {
- fail("File not found during read");
- }
- assert(secondCallback);
- assert(thirdRead === null);
- assert(fourthRead === null);
- } finally {
- Deno.removeSync(testDir, { recursive: true });
- }
- },
-});
-
-Deno.test({
- name: "Sync read returns one file at a time",
- fn() {
- const testDir: string = Deno.makeTempDirSync();
- const f1 = Deno.createSync(testDir + "/foo.txt");
- f1.close();
- const f2 = Deno.createSync(testDir + "/bar.txt");
- f2.close();
-
- try {
- const dir: Dir = new Dir(testDir);
- const firstRead: Dirent | null = dir.readSync();
- const secondRead: Dirent | null = dir.readSync();
- const thirdRead: Dirent | null = dir.readSync();
- const fourthRead: Dirent | null = dir.readSync();
-
- if (firstRead?.name === "foo.txt") {
- assertEquals(secondRead?.name, "bar.txt");
- } else if (firstRead?.name === "bar.txt") {
- assertEquals(secondRead?.name, "foo.txt");
- } else {
- fail("File not found during read");
- }
- assert(thirdRead === null);
- assert(fourthRead === null);
- } finally {
- Deno.removeSync(testDir, { recursive: true });
- }
- },
-});
-
-Deno.test({
- name: "Async iteration over existing directory",
- async fn() {
- const testDir: string = Deno.makeTempDirSync();
- const f1 = Deno.createSync(testDir + "/foo.txt");
- f1.close();
- const f2 = Deno.createSync(testDir + "/bar.txt");
- f2.close();
-
- try {
- const dir: Dir = new Dir(testDir);
- const results: Array<string | null> = [];
-
- for await (const file of dir[Symbol.asyncIterator]()) {
- results.push(file.name);
- }
-
- assert(results.length === 2);
- assert(results.includes("foo.txt"));
- assert(results.includes("bar.txt"));
- } finally {
- Deno.removeSync(testDir, { recursive: true });
- }
- },
-});
-
-Deno.test("[std/node/fs] Dir.close callback isn't called twice if error is thrown", async () => {
- const tempDir = await Deno.makeTempDir();
- const importUrl = new URL("./_fs_dir.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `
- import Dir from ${JSON.stringify(importUrl)};
-
- const dir = new Dir(${JSON.stringify(tempDir)});
- `,
- invocation: "dir.close(",
- async cleanup() {
- await Deno.remove(tempDir);
- },
- });
-});
-
-Deno.test("[std/node/fs] Dir.read callback isn't called twice if error is thrown", async () => {
- const tempDir = await Deno.makeTempDir();
- const importUrl = new URL("./_fs_dir.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `
- import Dir from ${JSON.stringify(importUrl)};
-
- const dir = new Dir(${JSON.stringify(tempDir)});
- `,
- invocation: "dir.read(",
- async cleanup() {
- await Deno.remove(tempDir);
- },
- });
-});
diff --git a/std/node/_fs/_fs_dirent.ts b/std/node/_fs/_fs_dirent.ts
deleted file mode 100644
index b44ebcb02..000000000
--- a/std/node/_fs/_fs_dirent.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { notImplemented } from "../_utils.ts";
-
-export default class Dirent {
- constructor(private entry: Deno.DirEntry) {}
-
- isBlockDevice(): boolean {
- notImplemented("Deno does not yet support identification of block devices");
- return false;
- }
-
- isCharacterDevice(): boolean {
- notImplemented(
- "Deno does not yet support identification of character devices",
- );
- return false;
- }
-
- isDirectory(): boolean {
- return this.entry.isDirectory;
- }
-
- isFIFO(): boolean {
- notImplemented(
- "Deno does not yet support identification of FIFO named pipes",
- );
- return false;
- }
-
- isFile(): boolean {
- return this.entry.isFile;
- }
-
- isSocket(): boolean {
- notImplemented("Deno does not yet support identification of sockets");
- return false;
- }
-
- isSymbolicLink(): boolean {
- return this.entry.isSymlink;
- }
-
- get name(): string | null {
- return this.entry.name;
- }
-}
diff --git a/std/node/_fs/_fs_dirent_test.ts b/std/node/_fs/_fs_dirent_test.ts
deleted file mode 100644
index ad599c84c..000000000
--- a/std/node/_fs/_fs_dirent_test.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { assert, assertEquals, assertThrows } from "../../testing/asserts.ts";
-import Dirent from "./_fs_dirent.ts";
-
-class DirEntryMock implements Deno.DirEntry {
- name = "";
- isFile = false;
- isDirectory = false;
- isSymlink = false;
-}
-
-Deno.test({
- name: "Directories are correctly identified",
- fn() {
- const entry: DirEntryMock = new DirEntryMock();
- entry.isDirectory = true;
- entry.isFile = false;
- entry.isSymlink = false;
- assert(new Dirent(entry).isDirectory());
- assert(!new Dirent(entry).isFile());
- assert(!new Dirent(entry).isSymbolicLink());
- },
-});
-
-Deno.test({
- name: "Files are correctly identified",
- fn() {
- const entry: DirEntryMock = new DirEntryMock();
- entry.isDirectory = false;
- entry.isFile = true;
- entry.isSymlink = false;
- assert(!new Dirent(entry).isDirectory());
- assert(new Dirent(entry).isFile());
- assert(!new Dirent(entry).isSymbolicLink());
- },
-});
-
-Deno.test({
- name: "Symlinks are correctly identified",
- fn() {
- const entry: DirEntryMock = new DirEntryMock();
- entry.isDirectory = false;
- entry.isFile = false;
- entry.isSymlink = true;
- assert(!new Dirent(entry).isDirectory());
- assert(!new Dirent(entry).isFile());
- assert(new Dirent(entry).isSymbolicLink());
- },
-});
-
-Deno.test({
- name: "File name is correct",
- fn() {
- const entry: DirEntryMock = new DirEntryMock();
- entry.name = "my_file";
- assertEquals(new Dirent(entry).name, "my_file");
- },
-});
-
-Deno.test({
- name: "Socket and FIFO pipes aren't yet available",
- fn() {
- const entry: DirEntryMock = new DirEntryMock();
- assertThrows(
- () => {
- new Dirent(entry).isFIFO();
- },
- Error,
- "does not yet support",
- );
- assertThrows(
- () => {
- new Dirent(entry).isSocket();
- },
- Error,
- "does not yet support",
- );
- },
-});
diff --git a/std/node/_fs/_fs_exists.ts b/std/node/_fs/_fs_exists.ts
deleted file mode 100644
index 5cfa26a9d..000000000
--- a/std/node/_fs/_fs_exists.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { fromFileUrl } from "../path.ts";
-
-type ExitsCallback = (exists: boolean) => void;
-
-/**
- * TODO: Also accept 'path' parameter as a Node polyfill Buffer type once these
- * are implemented. See https://github.com/denoland/deno/issues/3403
- * Deprecated in node api
- */
-export function exists(path: string | URL, callback: ExitsCallback): void {
- path = path instanceof URL ? fromFileUrl(path) : path;
- Deno.lstat(path).then(() => callback(true), () => 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 | URL): boolean {
- path = path instanceof URL ? fromFileUrl(path) : path;
- try {
- Deno.lstatSync(path);
- return true;
- } catch (err) {
- if (err instanceof Deno.errors.NotFound) {
- return false;
- }
- throw err;
- }
-}
diff --git a/std/node/_fs/_fs_exists_test.ts b/std/node/_fs/_fs_exists_test.ts
deleted file mode 100644
index ab0ae5c15..000000000
--- a/std/node/_fs/_fs_exists_test.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import {
- assert,
- assertEquals,
- assertStringIncludes,
-} from "../../testing/asserts.ts";
-import { exists, existsSync } from "./_fs_exists.ts";
-
-Deno.test("existsFile", async function () {
- const availableFile = await new Promise((resolve) => {
- const tmpFilePath = Deno.makeTempFileSync();
- exists(tmpFilePath, (exists: boolean) => {
- Deno.removeSync(tmpFilePath);
- resolve(exists);
- });
- });
- const notAvailableFile = await new Promise((resolve) => {
- exists("./notAvailable.txt", (exists: boolean) => resolve(exists));
- });
- assertEquals(availableFile, true);
- assertEquals(notAvailableFile, false);
-});
-
-Deno.test("existsSyncFile", function () {
- const tmpFilePath = Deno.makeTempFileSync();
- assertEquals(existsSync(tmpFilePath), true);
- Deno.removeSync(tmpFilePath);
- assertEquals(existsSync("./notAvailable.txt"), false);
-});
-
-Deno.test("[std/node/fs] exists callback isn't called twice if error is thrown", async () => {
- // This doesn't use `assertCallbackErrorUncaught()` because `exists()` doesn't return a standard node callback, which is what it expects.
- const tempFile = await Deno.makeTempFile();
- const importUrl = new URL("./_fs_exists.ts", import.meta.url);
- const p = Deno.run({
- cmd: [
- Deno.execPath(),
- "eval",
- "--no-check",
- `
- import { exists } from ${JSON.stringify(importUrl)};
-
- exists(${JSON.stringify(tempFile)}, (exists) => {
- // If the bug is present and the callback is called again with false (meaning an error occured),
- // don't throw another error, so if the subprocess fails we know it had the correct behaviour.
- if (exists) throw new Error("success");
- });`,
- ],
- stderr: "piped",
- });
- const status = await p.status();
- const stderr = new TextDecoder().decode(await Deno.readAll(p.stderr));
- p.close();
- p.stderr.close();
- await Deno.remove(tempFile);
- assert(!status.success);
- assertStringIncludes(stderr, "Error: success");
-});
diff --git a/std/node/_fs/_fs_link.ts b/std/node/_fs/_fs_link.ts
deleted file mode 100644
index 14a8189cb..000000000
--- a/std/node/_fs/_fs_link.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import type { CallbackWithError } from "./_fs_common.ts";
-import { fromFileUrl } from "../path.ts";
-
-/**
- * TODO: Also accept 'path' parameter as a Node polyfill Buffer type once these
- * are implemented. See https://github.com/denoland/deno/issues/3403
- */
-export function link(
- existingPath: string | URL,
- newPath: string | URL,
- callback: CallbackWithError,
-): void {
- existingPath = existingPath instanceof URL
- ? fromFileUrl(existingPath)
- : existingPath;
- newPath = newPath instanceof URL ? fromFileUrl(newPath) : newPath;
-
- Deno.link(existingPath, newPath).then(() => callback(null), callback);
-}
-
-/**
- * TODO: Also accept 'path' parameter as a Node polyfill Buffer type once these
- * are implemented. See https://github.com/denoland/deno/issues/3403
- */
-export function linkSync(
- existingPath: string | URL,
- newPath: string | URL,
-): void {
- existingPath = existingPath instanceof URL
- ? fromFileUrl(existingPath)
- : existingPath;
- newPath = newPath instanceof URL ? fromFileUrl(newPath) : newPath;
-
- Deno.linkSync(existingPath, newPath);
-}
diff --git a/std/node/_fs/_fs_link_test.ts b/std/node/_fs/_fs_link_test.ts
deleted file mode 100644
index 9e2aeb8b6..000000000
--- a/std/node/_fs/_fs_link_test.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import * as path from "../../path/mod.ts";
-import { assert, assertEquals, fail } from "../../testing/asserts.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import { link, linkSync } from "./_fs_link.ts";
-
-Deno.test({
- name: "ASYNC: hard linking files works as expected",
- async fn() {
- const tempFile: string = await Deno.makeTempFile();
- const linkedFile: string = tempFile + ".link";
- await new Promise<void>((res, rej) => {
- link(tempFile, linkedFile, (err) => {
- if (err) rej(err);
- else res();
- });
- })
- .then(() => {
- assertEquals(Deno.statSync(tempFile), Deno.statSync(linkedFile));
- }, () => {
- fail("Expected to succeed");
- })
- .finally(() => {
- Deno.removeSync(tempFile);
- Deno.removeSync(linkedFile);
- });
- },
-});
-
-Deno.test({
- name: "ASYNC: hard linking files passes error to callback",
- async fn() {
- let failed = false;
- await new Promise<void>((res, rej) => {
- link("no-such-file", "no-such-file", (err) => {
- if (err) rej(err);
- else res();
- });
- })
- .then(() => {
- fail("Expected to succeed");
- }, (err) => {
- assert(err);
- failed = true;
- });
- assert(failed);
- },
-});
-
-Deno.test({
- name: "SYNC: hard linking files works as expected",
- fn() {
- const tempFile: string = Deno.makeTempFileSync();
- const linkedFile: string = tempFile + ".link";
- linkSync(tempFile, linkedFile);
-
- assertEquals(Deno.statSync(tempFile), Deno.statSync(linkedFile));
- Deno.removeSync(tempFile);
- Deno.removeSync(linkedFile);
- },
-});
-
-Deno.test("[std/node/fs] link callback isn't called twice if error is thrown", async () => {
- const tempDir = await Deno.makeTempDir();
- const tempFile = path.join(tempDir, "file.txt");
- const linkFile = path.join(tempDir, "link.txt");
- await Deno.writeTextFile(tempFile, "hello world");
- const importUrl = new URL("./_fs_link.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { link } from ${JSON.stringify(importUrl)}`,
- invocation: `link(${JSON.stringify(tempFile)},
- ${JSON.stringify(linkFile)}, `,
- async cleanup() {
- await Deno.remove(tempDir, { recursive: true });
- },
- });
-});
diff --git a/std/node/_fs/_fs_lstat.ts b/std/node/_fs/_fs_lstat.ts
deleted file mode 100644
index 55624cd5e..000000000
--- a/std/node/_fs/_fs_lstat.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import {
- BigIntStats,
- CFISBIS,
- statCallback,
- statCallbackBigInt,
- statOptions,
- Stats,
-} from "./_fs_stat.ts";
-
-export function lstat(path: string | URL, callback: statCallback): void;
-export function lstat(
- path: string | URL,
- options: { bigint: false },
- callback: statCallback,
-): void;
-export function lstat(
- path: string | URL,
- options: { bigint: true },
- callback: statCallbackBigInt,
-): void;
-export function lstat(
- path: string | URL,
- optionsOrCallback: statCallback | statCallbackBigInt | statOptions,
- maybeCallback?: statCallback | statCallbackBigInt,
-) {
- const callback =
- (typeof optionsOrCallback === "function"
- ? optionsOrCallback
- : maybeCallback) as (
- ...args: [Error] | [null, BigIntStats | Stats]
- ) => void;
- const options = typeof optionsOrCallback === "object"
- ? optionsOrCallback
- : { bigint: false };
-
- if (!callback) throw new Error("No callback function supplied");
-
- Deno.lstat(path).then(
- (stat) => callback(null, CFISBIS(stat, options.bigint)),
- (err) => callback(err),
- );
-}
-
-export function lstatSync(path: string | URL): Stats;
-export function lstatSync(
- path: string | URL,
- options: { bigint: false },
-): Stats;
-export function lstatSync(
- path: string | URL,
- options: { bigint: true },
-): BigIntStats;
-export function lstatSync(
- path: string | URL,
- options?: statOptions,
-): Stats | BigIntStats {
- const origin = Deno.lstatSync(path);
- return CFISBIS(origin, options?.bigint || false);
-}
diff --git a/std/node/_fs/_fs_lstat_test.ts b/std/node/_fs/_fs_lstat_test.ts
deleted file mode 100644
index b8c562538..000000000
--- a/std/node/_fs/_fs_lstat_test.ts
+++ /dev/null
@@ -1,70 +0,0 @@
-import { lstat, lstatSync } from "./_fs_lstat.ts";
-import { fail } from "../../testing/asserts.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import { assertStats, assertStatsBigInt } from "./_fs_stat_test.ts";
-import type { BigIntStats, Stats } from "./_fs_stat.ts";
-
-Deno.test({
- name: "ASYNC: get a file Stats (lstat)",
- async fn() {
- const file = Deno.makeTempFileSync();
- await new Promise<Stats>((resolve, reject) => {
- lstat(file, (err, stat) => {
- if (err) reject(err);
- resolve(stat);
- });
- })
- .then((stat) => {
- assertStats(stat, Deno.lstatSync(file));
- }, () => fail())
- .finally(() => {
- Deno.removeSync(file);
- });
- },
-});
-
-Deno.test({
- name: "SYNC: get a file Stats (lstat)",
- fn() {
- const file = Deno.makeTempFileSync();
- assertStats(lstatSync(file), Deno.lstatSync(file));
- },
-});
-
-Deno.test({
- name: "ASYNC: get a file BigInt Stats (lstat)",
- async fn() {
- const file = Deno.makeTempFileSync();
- await new Promise<BigIntStats>((resolve, reject) => {
- lstat(file, { bigint: true }, (err, stat) => {
- if (err) reject(err);
- resolve(stat);
- });
- })
- .then(
- (stat) => assertStatsBigInt(stat, Deno.lstatSync(file)),
- () => fail(),
- )
- .finally(() => Deno.removeSync(file));
- },
-});
-
-Deno.test({
- name: "SYNC: BigInt Stats (lstat)",
- fn() {
- const file = Deno.makeTempFileSync();
- assertStatsBigInt(lstatSync(file, { bigint: true }), Deno.lstatSync(file));
- },
-});
-
-Deno.test("[std/node/fs] lstat callback isn't called twice if error is thrown", async () => {
- const tempFile = await Deno.makeTempFile();
- const importUrl = new URL("./_fs_lstat.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { lstat } from ${JSON.stringify(importUrl)}`,
- invocation: `lstat(${JSON.stringify(tempFile)}, `,
- async cleanup() {
- await Deno.remove(tempFile);
- },
- });
-});
diff --git a/std/node/_fs/_fs_mkdir.ts b/std/node/_fs/_fs_mkdir.ts
deleted file mode 100644
index 94cc24a42..000000000
--- a/std/node/_fs/_fs_mkdir.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import type { CallbackWithError } from "./_fs_common.ts";
-import { fromFileUrl } from "../path.ts";
-
-/**
- * TODO: Also accept 'path' parameter as a Node polyfill Buffer type once these
- * are implemented. See https://github.com/denoland/deno/issues/3403
- */
-type MkdirOptions =
- | { recursive?: boolean; mode?: number | undefined }
- | number
- | boolean;
-
-export function mkdir(
- path: string | URL,
- options?: MkdirOptions | CallbackWithError,
- callback?: CallbackWithError,
-): void {
- path = path instanceof URL ? fromFileUrl(path) : path;
-
- let mode = 0o777;
- let recursive = false;
-
- if (typeof options == "function") {
- callback = options;
- } else if (typeof options === "number") {
- mode = options;
- } else if (typeof options === "boolean") {
- recursive = options;
- } else if (options) {
- if (options.recursive !== undefined) recursive = options.recursive;
- if (options.mode !== undefined) mode = options.mode;
- }
- if (typeof recursive !== "boolean") {
- throw new Deno.errors.InvalidData(
- "invalid recursive option , must be a boolean",
- );
- }
- Deno.mkdir(path, { recursive, mode })
- .then(() => {
- if (typeof callback === "function") {
- callback(null);
- }
- }, (err) => {
- if (typeof callback === "function") {
- callback(err);
- }
- });
-}
-
-export function mkdirSync(path: string | URL, options?: MkdirOptions): void {
- path = path instanceof URL ? fromFileUrl(path) : path;
- let mode = 0o777;
- let recursive = false;
-
- if (typeof options === "number") {
- mode = options;
- } else if (typeof options === "boolean") {
- recursive = options;
- } else if (options) {
- if (options.recursive !== undefined) recursive = options.recursive;
- if (options.mode !== undefined) mode = options.mode;
- }
- if (typeof recursive !== "boolean") {
- throw new Deno.errors.InvalidData(
- "invalid recursive option , must be a boolean",
- );
- }
-
- Deno.mkdirSync(path, { recursive, mode });
-}
diff --git a/std/node/_fs/_fs_mkdir_test.ts b/std/node/_fs/_fs_mkdir_test.ts
deleted file mode 100644
index c13d065fe..000000000
--- a/std/node/_fs/_fs_mkdir_test.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import * as path from "../../path/mod.ts";
-import { assert } from "../../testing/asserts.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import { mkdir, mkdirSync } from "./_fs_mkdir.ts";
-import { existsSync } from "./_fs_exists.ts";
-
-const tmpDir = "./tmpdir";
-
-Deno.test({
- name: "[node/fs] mkdir",
- fn: async () => {
- const result = await new Promise((resolve) => {
- mkdir(tmpDir, (err) => {
- err && resolve(false);
- resolve(existsSync(tmpDir));
- Deno.removeSync(tmpDir);
- });
- });
- assert(result);
- },
-});
-
-Deno.test({
- name: "[node/fs] mkdirSync",
- fn: () => {
- mkdirSync(tmpDir);
- assert(existsSync(tmpDir));
- Deno.removeSync(tmpDir);
- },
-});
-
-Deno.test("[std/node/fs] mkdir callback isn't called twice if error is thrown", async () => {
- const tempDir = await Deno.makeTempDir();
- const subdir = path.join(tempDir, "subdir");
- const importUrl = new URL("./_fs_mkdir.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { mkdir } from ${JSON.stringify(importUrl)}`,
- invocation: `mkdir(${JSON.stringify(subdir)}, `,
- async cleanup() {
- await Deno.remove(tempDir, { recursive: true });
- },
- });
-});
diff --git a/std/node/_fs/_fs_mkdtemp.ts b/std/node/_fs/_fs_mkdtemp.ts
deleted file mode 100644
index 226399aa4..000000000
--- a/std/node/_fs/_fs_mkdtemp.ts
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { existsSync } from "./_fs_exists.ts";
-import { mkdir, mkdirSync } from "./_fs_mkdir.ts";
-import {
- ERR_INVALID_CALLBACK,
- ERR_INVALID_OPT_VALUE_ENCODING,
-} from "../_errors.ts";
-
-export type mkdtempCallback = (
- err: Error | null,
- directory?: string,
-) => void;
-
-// https://nodejs.org/dist/latest-v15.x/docs/api/fs.html#fs_fs_mkdtemp_prefix_options_callback
-export function mkdtemp(prefix: string, callback: mkdtempCallback): void;
-export function mkdtemp(
- prefix: string,
- options: { encoding: string } | string,
- callback: mkdtempCallback,
-): void;
-export function mkdtemp(
- prefix: string,
- optionsOrCallback: { encoding: string } | string | mkdtempCallback,
- maybeCallback?: mkdtempCallback,
-): void {
- const callback: mkdtempCallback | undefined =
- typeof optionsOrCallback == "function" ? optionsOrCallback : maybeCallback;
- if (!callback) throw new ERR_INVALID_CALLBACK(callback);
-
- const encoding: string | undefined = parseEncoding(optionsOrCallback);
- const path = tempDirPath(prefix);
-
- mkdir(
- path,
- { recursive: false, mode: 0o700 },
- (err: Error | null | undefined) => {
- if (err) callback(err);
- else callback(null, decode(path, encoding));
- },
- );
-}
-
-// https://nodejs.org/dist/latest-v15.x/docs/api/fs.html#fs_fs_mkdtempsync_prefix_options
-export function mkdtempSync(
- prefix: string,
- options?: { encoding: string } | string,
-): string {
- const encoding: string | undefined = parseEncoding(options);
- const path = tempDirPath(prefix);
-
- mkdirSync(path, { recursive: false, mode: 0o700 });
- return decode(path, encoding);
-}
-
-function parseEncoding(
- optionsOrCallback?: { encoding: string } | string | mkdtempCallback,
-): string | undefined {
- let encoding: string | undefined;
- if (typeof optionsOrCallback == "function") encoding = undefined;
- else if (optionsOrCallback instanceof Object) {
- encoding = optionsOrCallback?.encoding;
- } else encoding = optionsOrCallback;
-
- if (encoding) {
- try {
- new TextDecoder(encoding);
- } catch (error) {
- throw new ERR_INVALID_OPT_VALUE_ENCODING(encoding);
- }
- }
-
- return encoding;
-}
-
-function decode(str: string, encoding?: string): string {
- if (!encoding) return str;
- else {
- const decoder = new TextDecoder(encoding);
- const encoder = new TextEncoder();
- return decoder.decode(encoder.encode(str));
- }
-}
-
-const CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
-function randomName(): string {
- return [...Array(6)].map(() =>
- CHARS[Math.floor(Math.random() * CHARS.length)]
- ).join("");
-}
-
-function tempDirPath(prefix: string): string {
- let path: string;
- do {
- path = prefix + randomName();
- } while (existsSync(path));
-
- return path;
-}
diff --git a/std/node/_fs/_fs_mkdtemp_test.ts b/std/node/_fs/_fs_mkdtemp_test.ts
deleted file mode 100644
index d41c52794..000000000
--- a/std/node/_fs/_fs_mkdtemp_test.ts
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import {
- assert,
- assertThrows,
- assertThrowsAsync,
-} from "../../testing/asserts.ts";
-import { mkdtemp, mkdtempSync } from "./_fs_mkdtemp.ts";
-import { existsSync } from "./_fs_exists.ts";
-import { env } from "../process.ts";
-import { isWindows } from "../../_util/os.ts";
-import { promisify } from "../_util/_util_promisify.ts";
-
-const prefix = isWindows ? env.TEMP + "\\" : (env.TMPDIR || "/tmp") + "/";
-const doesNotExists = "/does/not/exists/";
-const options = { encoding: "ascii" };
-const badOptions = { encoding: "bogus" };
-
-const mkdtempP = promisify(mkdtemp);
-
-Deno.test({
- name: "[node/fs] mkdtemp",
- fn: async () => {
- const directory = await mkdtempP(prefix);
- assert(existsSync(directory));
- Deno.removeSync(directory);
- },
-});
-
-Deno.test({
- name: "[node/fs] mkdtemp (does not exists)",
- fn: async () => {
- await assertThrowsAsync(() => mkdtempP(doesNotExists));
- },
-});
-
-Deno.test({
- name: "[node/fs] mkdtemp (with options)",
- fn: async () => {
- const directory = await mkdtempP(prefix, options);
- assert(existsSync(directory));
- Deno.removeSync(directory);
- },
-});
-
-Deno.test({
- name: "[node/fs] mkdtemp (with bad options)",
- fn: async () => {
- await assertThrowsAsync(() => mkdtempP(prefix, badOptions));
- },
-});
-
-Deno.test({
- name: "[node/fs] mkdtempSync",
- fn: () => {
- const directory = mkdtempSync(prefix);
- const dirExists = existsSync(directory);
- Deno.removeSync(directory);
- assert(dirExists);
- },
-});
-
-Deno.test({
- name: "[node/fs] mkdtempSync (does not exists)",
- fn: () => {
- assertThrows(() => mkdtempSync(doesNotExists));
- },
-});
-
-Deno.test({
- name: "[node/fs] mkdtempSync (with options)",
- fn: () => {
- const directory = mkdtempSync(prefix, options);
- const dirExists = existsSync(directory);
- Deno.removeSync(directory);
- assert(dirExists);
- },
-});
-
-Deno.test({
- name: "[node/fs] mkdtempSync (with bad options)",
- fn: () => {
- assertThrows(() => mkdtempSync(prefix, badOptions));
- },
-});
diff --git a/std/node/_fs/_fs_open.ts b/std/node/_fs/_fs_open.ts
deleted file mode 100644
index 55ecbdc1e..000000000
--- a/std/node/_fs/_fs_open.ts
+++ /dev/null
@@ -1,109 +0,0 @@
-import { existsSync } from "../../fs/mod.ts";
-import { fromFileUrl } from "../path.ts";
-import { getOpenOptions } from "./_fs_common.ts";
-
-type openFlags =
- | "a"
- | "ax"
- | "a+"
- | "ax+"
- | "as"
- | "as+"
- | "r"
- | "r+"
- | "rs+"
- | "w"
- | "wx"
- | "w+"
- | "wx+";
-
-type openCallback = (err: Error | null, fd: number) => void;
-
-function convertFlagAndModeToOptions(
- flag?: openFlags,
- mode?: number,
-): Deno.OpenOptions | undefined {
- if (!flag && !mode) return undefined;
- if (!flag && mode) return { mode };
- return { ...getOpenOptions(flag), mode };
-}
-
-export function open(path: string | URL, callback: openCallback): void;
-export function open(
- path: string | URL,
- flags: openFlags,
- callback: openCallback,
-): void;
-export function open(
- path: string | URL,
- flags: openFlags,
- mode: number,
- callback: openCallback,
-): void;
-export function open(
- path: string | URL,
- flagsOrCallback: openCallback | openFlags,
- callbackOrMode?: openCallback | number,
- maybeCallback?: openCallback,
-) {
- const flags = typeof flagsOrCallback === "string"
- ? flagsOrCallback
- : undefined;
- const callback = typeof flagsOrCallback === "function"
- ? flagsOrCallback
- : typeof callbackOrMode === "function"
- ? callbackOrMode
- : maybeCallback;
- const mode = typeof callbackOrMode === "number" ? callbackOrMode : undefined;
- path = path instanceof URL ? fromFileUrl(path) : path;
-
- if (!callback) throw new Error("No callback function supplied");
-
- if (["ax", "ax+", "wx", "wx+"].includes(flags || "") && existsSync(path)) {
- const err = new Error(`EEXIST: file already exists, open '${path}'`);
- (callback as (err: Error) => void)(err);
- } else {
- if (flags === "as" || flags === "as+") {
- let err: Error | null = null, res: number;
- try {
- res = openSync(path, flags, mode);
- } catch (error) {
- err = error;
- }
- if (err) {
- (callback as (err: Error) => void)(err);
- } else {
- callback(null, res!);
- }
- return;
- }
- Deno.open(path, convertFlagAndModeToOptions(flags, mode)).then(
- (file) => callback(null, file.rid),
- (err) => (callback as (err: Error) => void)(err),
- );
- }
-}
-
-export function openSync(path: string | URL): number;
-export function openSync(path: string | URL, flags?: openFlags): number;
-export function openSync(path: string | URL, mode?: number): number;
-export function openSync(
- path: string | URL,
- flags?: openFlags,
- mode?: number,
-): number;
-export function openSync(
- path: string | URL,
- flagsOrMode?: openFlags | number,
- maybeMode?: number,
-) {
- const flags = typeof flagsOrMode === "string" ? flagsOrMode : undefined;
- const mode = typeof flagsOrMode === "number" ? flagsOrMode : maybeMode;
- path = path instanceof URL ? fromFileUrl(path) : path;
-
- if (["ax", "ax+", "wx", "wx+"].includes(flags || "") && existsSync(path)) {
- throw new Error(`EEXIST: file already exists, open '${path}'`);
- }
-
- return Deno.openSync(path, convertFlagAndModeToOptions(flags, mode)).rid;
-}
diff --git a/std/node/_fs/_fs_open_test.ts b/std/node/_fs/_fs_open_test.ts
deleted file mode 100644
index f32a8ce0a..000000000
--- a/std/node/_fs/_fs_open_test.ts
+++ /dev/null
@@ -1,221 +0,0 @@
-import {
- assert,
- assertEquals,
- assertThrows,
- fail,
-} from "../../testing/asserts.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import { open, openSync } from "./_fs_open.ts";
-import { join, parse } from "../../path/mod.ts";
-import { existsSync } from "../../fs/mod.ts";
-import { closeSync } from "./_fs_close.ts";
-
-const tempDir = parse(Deno.makeTempFileSync()).dir;
-
-Deno.test({
- name: "ASYNC: open file",
- async fn() {
- const file = Deno.makeTempFileSync();
- let fd1: number;
- await new Promise<number>((resolve, reject) => {
- open(file, (err, fd) => {
- if (err) reject(err);
- resolve(fd);
- });
- })
- .then((fd) => {
- fd1 = fd;
- assert(Deno.resources()[fd], `${fd}`);
- }, () => fail())
- .finally(() => closeSync(fd1));
- },
-});
-
-Deno.test({
- name: "SYNC: open file",
- fn() {
- const file = Deno.makeTempFileSync();
- const fd = openSync(file);
- assert(Deno.resources()[fd]);
- closeSync(fd);
- },
-});
-
-Deno.test({
- name: "open with flag 'a'",
- fn() {
- const file = join(tempDir, "some_random_file");
- const fd = openSync(file, "a");
- assertEquals(typeof fd, "number");
- assertEquals(existsSync(file), true);
- assert(Deno.resources()[fd]);
- closeSync(fd);
- },
-});
-
-Deno.test({
- name: "open with flag 'ax'",
- fn() {
- const file = Deno.makeTempFileSync();
- assertThrows(
- () => {
- openSync(file, "ax");
- },
- Error,
- `EEXIST: file already exists, open '${file}'`,
- );
- Deno.removeSync(file);
- },
-});
-
-Deno.test({
- name: "open with flag 'a+'",
- fn() {
- const file = join(tempDir, "some_random_file2");
- const fd = openSync(file, "a+");
- assertEquals(typeof fd, "number");
- assertEquals(existsSync(file), true);
- closeSync(fd);
- },
-});
-
-Deno.test({
- name: "open with flag 'ax+'",
- fn() {
- const file = Deno.makeTempFileSync();
- assertThrows(
- () => {
- openSync(file, "ax+");
- },
- Error,
- `EEXIST: file already exists, open '${file}'`,
- );
- Deno.removeSync(file);
- },
-});
-
-Deno.test({
- name: "open with flag 'as'",
- fn() {
- const file = join(tempDir, "some_random_file10");
- const fd = openSync(file, "as");
- assertEquals(existsSync(file), true);
- assertEquals(typeof fd, "number");
- closeSync(fd);
- },
-});
-
-Deno.test({
- name: "open with flag 'as+'",
- fn() {
- const file = join(tempDir, "some_random_file10");
- const fd = openSync(file, "as+");
- assertEquals(existsSync(file), true);
- assertEquals(typeof fd, "number");
- closeSync(fd);
- },
-});
-
-Deno.test({
- name: "open with flag 'r'",
- fn() {
- const file = join(tempDir, "some_random_file3");
- assertThrows(() => {
- openSync(file, "r");
- }, Error);
- },
-});
-
-Deno.test({
- name: "open with flag 'r+'",
- fn() {
- const file = join(tempDir, "some_random_file4");
- assertThrows(() => {
- openSync(file, "r+");
- }, Error);
- },
-});
-
-Deno.test({
- name: "open with flag 'w'",
- fn() {
- const file = Deno.makeTempFileSync();
- Deno.writeTextFileSync(file, "hi there");
- const fd = openSync(file, "w");
- assertEquals(typeof fd, "number");
- assertEquals(Deno.readTextFileSync(file), "");
- closeSync(fd);
-
- const file2 = join(tempDir, "some_random_file5");
- const fd2 = openSync(file2, "w");
- assertEquals(typeof fd2, "number");
- assertEquals(existsSync(file2), true);
- closeSync(fd2);
- },
-});
-
-Deno.test({
- name: "open with flag 'wx'",
- fn() {
- const file = Deno.makeTempFileSync();
- Deno.writeTextFileSync(file, "hi there");
- const fd = openSync(file, "w");
- assertEquals(typeof fd, "number");
- assertEquals(Deno.readTextFileSync(file), "");
- closeSync(fd);
-
- const file2 = Deno.makeTempFileSync();
- assertThrows(
- () => {
- openSync(file2, "wx");
- },
- Error,
- `EEXIST: file already exists, open '${file2}'`,
- );
- },
-});
-
-Deno.test({
- name: "open with flag 'w+'",
- fn() {
- const file = Deno.makeTempFileSync();
- Deno.writeTextFileSync(file, "hi there");
- const fd = openSync(file, "w+");
- assertEquals(typeof fd, "number");
- assertEquals(Deno.readTextFileSync(file), "");
- closeSync(fd);
-
- const file2 = join(tempDir, "some_random_file6");
- const fd2 = openSync(file2, "w+");
- assertEquals(typeof fd2, "number");
- assertEquals(existsSync(file2), true);
- closeSync(fd2);
- },
-});
-
-Deno.test({
- name: "open with flag 'wx+'",
- fn() {
- const file = Deno.makeTempFileSync();
- assertThrows(
- () => {
- openSync(file, "wx+");
- },
- Error,
- `EEXIST: file already exists, open '${file}'`,
- );
- Deno.removeSync(file);
- },
-});
-
-Deno.test("[std/node/fs] open callback isn't called twice if error is thrown", async () => {
- const tempFile = await Deno.makeTempFile();
- const importUrl = new URL("./_fs_open.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { open } from ${JSON.stringify(importUrl)}`,
- invocation: `open(${JSON.stringify(tempFile)}, `,
- async cleanup() {
- await Deno.remove(tempFile);
- },
- });
-});
diff --git a/std/node/_fs/_fs_readFile.ts b/std/node/_fs/_fs_readFile.ts
deleted file mode 100644
index 4ad763e25..000000000
--- a/std/node/_fs/_fs_readFile.ts
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import {
- BinaryOptionsArgument,
- FileOptionsArgument,
- getEncoding,
- TextOptionsArgument,
-} from "./_fs_common.ts";
-import { Buffer } from "../buffer.ts";
-import { fromFileUrl } from "../path.ts";
-import { BinaryEncodings, Encodings, TextEncodings } from "../_utils.ts";
-
-function maybeDecode(data: Uint8Array, encoding: TextEncodings): string;
-function maybeDecode(
- data: Uint8Array,
- encoding: BinaryEncodings | null,
-): Buffer;
-function maybeDecode(
- data: Uint8Array,
- encoding: Encodings | null,
-): string | Buffer {
- const buffer = new Buffer(data.buffer, data.byteOffset, data.byteLength);
- if (encoding && encoding !== "binary") return buffer.toString(encoding);
- return buffer;
-}
-
-type TextCallback = (err: Error | null, data?: string) => void;
-type BinaryCallback = (err: Error | null, data?: Buffer) => void;
-type GenericCallback = (err: Error | null, data?: string | Buffer) => void;
-type Callback = TextCallback | BinaryCallback | GenericCallback;
-
-export function readFile(
- path: string | URL,
- options: TextOptionsArgument,
- callback: TextCallback,
-): void;
-export function readFile(
- path: string | URL,
- options: BinaryOptionsArgument,
- callback: BinaryCallback,
-): void;
-export function readFile(
- path: string | URL,
- options: null | undefined | FileOptionsArgument,
- callback: BinaryCallback,
-): void;
-export function readFile(path: string | URL, callback: BinaryCallback): void;
-export function readFile(
- path: string | URL,
- optOrCallback?: FileOptionsArgument | Callback | null | undefined,
- callback?: Callback,
-): void {
- path = path instanceof URL ? fromFileUrl(path) : path;
- let cb: Callback | undefined;
- if (typeof optOrCallback === "function") {
- cb = optOrCallback;
- } else {
- cb = callback;
- }
-
- const encoding = getEncoding(optOrCallback);
-
- const p = Deno.readFile(path);
-
- if (cb) {
- p.then((data: Uint8Array) => {
- if (encoding && encoding !== "binary") {
- const text = maybeDecode(data, encoding);
- return (cb as TextCallback)(null, text);
- }
- const buffer = maybeDecode(data, encoding);
- (cb as BinaryCallback)(null, buffer);
- }, (err) => cb && cb(err));
- }
-}
-
-export function readFileSync(
- path: string | URL,
- opt: TextOptionsArgument,
-): string;
-export function readFileSync(
- path: string | URL,
- opt?: BinaryOptionsArgument,
-): Buffer;
-export function readFileSync(
- path: string | URL,
- opt?: FileOptionsArgument,
-): string | Buffer {
- path = path instanceof URL ? fromFileUrl(path) : path;
- const data = Deno.readFileSync(path);
- const encoding = getEncoding(opt);
- if (encoding && encoding !== "binary") {
- const text = maybeDecode(data, encoding);
- return text;
- }
- const buffer = maybeDecode(data, encoding);
- return buffer;
-}
diff --git a/std/node/_fs/_fs_readFile_test.ts b/std/node/_fs/_fs_readFile_test.ts
deleted file mode 100644
index 7af32c8a1..000000000
--- a/std/node/_fs/_fs_readFile_test.ts
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import { readFile, readFileSync } from "./_fs_readFile.ts";
-import * as path from "../../path/mod.ts";
-import { assert, assertEquals } from "../../testing/asserts.ts";
-
-const moduleDir = path.dirname(path.fromFileUrl(import.meta.url));
-const testData = path.resolve(moduleDir, "testdata", "hello.txt");
-
-Deno.test("readFileSuccess", async function () {
- const data = await new Promise((res, rej) => {
- readFile(testData, (err, data) => {
- if (err) {
- rej(err);
- }
- res(data);
- });
- });
-
- assert(data instanceof Uint8Array);
- assertEquals(new TextDecoder().decode(data as Uint8Array), "hello world");
-});
-
-Deno.test("readFileEncodeUtf8Success", async function () {
- const data = await new Promise((res, rej) => {
- readFile(testData, { encoding: "utf8" }, (err, data) => {
- if (err) {
- rej(err);
- }
- res(data);
- });
- });
- assertEquals(typeof data, "string");
- assertEquals(data as string, "hello world");
-});
-
-Deno.test("readFileEncodeHexSuccess", async function () {
- const data = await new Promise((res, rej) => {
- readFile(testData, { encoding: "hex" }, (err, data) => {
- if (err) {
- rej(err);
- }
- res(data);
- });
- });
-
- assertEquals(typeof data, "string");
- assertEquals(data as string, "68656c6c6f20776f726c64");
-});
-
-Deno.test("readFileEncodeBase64Success", async function () {
- const data = await new Promise((res, rej) => {
- readFile(testData, { encoding: "base64" }, (err, data) => {
- if (err) {
- rej(err);
- }
- res(data);
- });
- });
- assertEquals(typeof data, "string");
- assertEquals(data as string, "aGVsbG8gd29ybGQ=");
-});
-
-Deno.test("readFileEncodingAsString", async function () {
- const data = await new Promise((res, rej) => {
- readFile(testData, "utf8", (err, data) => {
- if (err) {
- rej(err);
- }
- res(data);
- });
- });
-
- assertEquals(typeof data, "string");
- assertEquals(data as string, "hello world");
-});
-
-Deno.test("readFileSyncSuccess", function () {
- const data = readFileSync(testData);
- assert(data instanceof Uint8Array);
- assertEquals(new TextDecoder().decode(data as Uint8Array), "hello world");
-});
-
-Deno.test("readFileEncodeUtf8Success", function () {
- const data = readFileSync(testData, { encoding: "utf8" });
- assertEquals(typeof data, "string");
- assertEquals(data as string, "hello world");
-});
-
-Deno.test("readFileEncodeHexSuccess", function () {
- const data = readFileSync(testData, { encoding: "hex" });
- assertEquals(typeof data, "string");
- assertEquals(data as string, "68656c6c6f20776f726c64");
-});
-
-Deno.test("readFileEncodeBase64Success", function () {
- const data = readFileSync(testData, { encoding: "base64" });
- assertEquals(typeof data, "string");
- assertEquals(data as string, "aGVsbG8gd29ybGQ=");
-});
-
-Deno.test("readFileEncodeAsString", function () {
- const data = readFileSync(testData, "utf8");
- assertEquals(typeof data, "string");
- assertEquals(data as string, "hello world");
-});
-
-Deno.test("[std/node/fs] readFile callback isn't called twice if error is thrown", async () => {
- const tempFile = await Deno.makeTempFile();
- const importUrl = new URL("./_fs_readFile.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { readFile } from ${JSON.stringify(importUrl)}`,
- invocation: `readFile(${JSON.stringify(tempFile)}, `,
- async cleanup() {
- await Deno.remove(tempFile);
- },
- });
-});
diff --git a/std/node/_fs/_fs_readdir.ts b/std/node/_fs/_fs_readdir.ts
deleted file mode 100644
index e36bf5ecf..000000000
--- a/std/node/_fs/_fs_readdir.ts
+++ /dev/null
@@ -1,116 +0,0 @@
-import { asyncIterableToCallback } from "./_fs_watch.ts";
-import Dirent from "./_fs_dirent.ts";
-import { fromFileUrl } from "../path.ts";
-
-function toDirent(val: Deno.DirEntry): Dirent {
- return new Dirent(val);
-}
-
-type readDirOptions = {
- encoding?: string;
- withFileTypes?: boolean;
-};
-
-type readDirCallback = (err: Error | null, files: string[]) => void;
-
-type readDirCallbackDirent = (err: Error | null, files: Dirent[]) => void;
-
-type readDirBoth = (
- ...args: [Error] | [null, string[] | Dirent[] | Array<string | Dirent>]
-) => void;
-
-export function readdir(
- path: string | URL,
- options: { withFileTypes?: false; encoding?: string },
- callback: readDirCallback,
-): void;
-export function readdir(
- path: string | URL,
- options: { withFileTypes: true; encoding?: string },
- callback: readDirCallbackDirent,
-): void;
-export function readdir(path: string | URL, callback: readDirCallback): void;
-export function readdir(
- path: string | URL,
- optionsOrCallback: readDirOptions | readDirCallback | readDirCallbackDirent,
- maybeCallback?: readDirCallback | readDirCallbackDirent,
-) {
- const callback =
- (typeof optionsOrCallback === "function"
- ? optionsOrCallback
- : maybeCallback) as readDirBoth | undefined;
- const options = typeof optionsOrCallback === "object"
- ? optionsOrCallback
- : null;
- const result: Array<string | Dirent> = [];
- path = path instanceof URL ? fromFileUrl(path) : path;
-
- if (!callback) throw new Error("No callback function supplied");
-
- if (options?.encoding) {
- try {
- new TextDecoder(options.encoding);
- } catch (error) {
- throw new Error(
- `TypeError [ERR_INVALID_OPT_VALUE_ENCODING]: The value "${options.encoding}" is invalid for option "encoding"`,
- );
- }
- }
-
- try {
- asyncIterableToCallback(Deno.readDir(path), (val, done) => {
- if (typeof path !== "string") return;
- if (done) {
- callback(null, result);
- return;
- }
- if (options?.withFileTypes) {
- result.push(toDirent(val));
- } else result.push(decode(val.name));
- });
- } catch (error) {
- callback(error);
- }
-}
-
-function decode(str: string, encoding?: string): string {
- if (!encoding) return str;
- else {
- const decoder = new TextDecoder(encoding);
- const encoder = new TextEncoder();
- return decoder.decode(encoder.encode(str));
- }
-}
-
-export function readdirSync(
- path: string | URL,
- options: { withFileTypes: true; encoding?: string },
-): Dirent[];
-export function readdirSync(
- path: string | URL,
- options?: { withFileTypes?: false; encoding?: string },
-): string[];
-export function readdirSync(
- path: string | URL,
- options?: readDirOptions,
-): Array<string | Dirent> {
- const result = [];
- path = path instanceof URL ? fromFileUrl(path) : path;
-
- if (options?.encoding) {
- try {
- new TextDecoder(options.encoding);
- } catch (error) {
- throw new Error(
- `TypeError [ERR_INVALID_OPT_VALUE_ENCODING]: The value "${options.encoding}" is invalid for option "encoding"`,
- );
- }
- }
-
- for (const file of Deno.readDirSync(path)) {
- if (options?.withFileTypes) {
- result.push(toDirent(file));
- } else result.push(decode(file.name));
- }
- return result;
-}
diff --git a/std/node/_fs/_fs_readdir_test.ts b/std/node/_fs/_fs_readdir_test.ts
deleted file mode 100644
index 165cb8141..000000000
--- a/std/node/_fs/_fs_readdir_test.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-import { assertEquals, assertNotEquals, fail } from "../../testing/asserts.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import { readdir, readdirSync } from "./_fs_readdir.ts";
-import { join } from "../../path/mod.ts";
-
-Deno.test({
- name: "ASYNC: reading empty directory",
- async fn() {
- const dir = Deno.makeTempDirSync();
- await new Promise<string[]>((resolve, reject) => {
- readdir(dir, (err, files) => {
- if (err) reject(err);
- resolve(files);
- });
- })
- .then((files) => assertEquals(files, []), () => fail())
- .finally(() => Deno.removeSync(dir));
- },
-});
-
-function assertEqualsArrayAnyOrder<T>(actual: T[], expected: T[]) {
- assertEquals(actual.length, expected.length);
- for (const item of expected) {
- const index = actual.indexOf(item);
- assertNotEquals(index, -1);
- expected = expected.splice(index, 1);
- }
-}
-
-Deno.test({
- name: "ASYNC: reading non-empty directory",
- async fn() {
- const dir = Deno.makeTempDirSync();
- Deno.writeTextFileSync(join(dir, "file1.txt"), "hi");
- Deno.writeTextFileSync(join(dir, "file2.txt"), "hi");
- Deno.mkdirSync(join(dir, "some_dir"));
- await new Promise<string[]>((resolve, reject) => {
- readdir(dir, (err, files) => {
- if (err) reject(err);
- resolve(files);
- });
- })
- .then(
- (files) =>
- assertEqualsArrayAnyOrder(
- files,
- ["file1.txt", "some_dir", "file2.txt"],
- ),
- () => fail(),
- )
- .finally(() => Deno.removeSync(dir, { recursive: true }));
- },
-});
-
-Deno.test({
- name: "SYNC: reading empty the directory",
- fn() {
- const dir = Deno.makeTempDirSync();
- assertEquals(readdirSync(dir), []);
- },
-});
-
-Deno.test({
- name: "SYNC: reading non-empty directory",
- fn() {
- const dir = Deno.makeTempDirSync();
- Deno.writeTextFileSync(join(dir, "file1.txt"), "hi");
- Deno.writeTextFileSync(join(dir, "file2.txt"), "hi");
- Deno.mkdirSync(join(dir, "some_dir"));
- assertEqualsArrayAnyOrder(
- readdirSync(dir),
- ["file1.txt", "some_dir", "file2.txt"],
- );
- },
-});
-
-Deno.test("[std/node/fs] readdir callback isn't called twice if error is thrown", async () => {
- // The correct behaviour is not to catch any errors thrown,
- // but that means there'll be an uncaught error and the test will fail.
- // So the only way to test this is to spawn a subprocess, and succeed if it has a non-zero exit code.
- // (assertThrowsAsync won't work because there's no way to catch the error.)
- const tempDir = await Deno.makeTempDir();
- const importUrl = new URL("./_fs_readdir.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { readdir } from ${JSON.stringify(importUrl)}`,
- invocation: `readdir(${JSON.stringify(tempDir)}, `,
- async cleanup() {
- await Deno.remove(tempDir);
- },
- });
-});
diff --git a/std/node/_fs/_fs_readlink.ts b/std/node/_fs/_fs_readlink.ts
deleted file mode 100644
index 37a7a108f..000000000
--- a/std/node/_fs/_fs_readlink.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import {
- intoCallbackAPIWithIntercept,
- MaybeEmpty,
- notImplemented,
-} from "../_utils.ts";
-import { fromFileUrl } from "../path.ts";
-
-type ReadlinkCallback = (
- err: MaybeEmpty<Error>,
- linkString: MaybeEmpty<string | Uint8Array>,
-) => void;
-
-interface ReadlinkOptions {
- encoding?: string | null;
-}
-
-function maybeEncode(
- data: string,
- encoding: string | null,
-): string | Uint8Array {
- if (encoding === "buffer") {
- return new TextEncoder().encode(data);
- }
- return data;
-}
-
-function getEncoding(
- optOrCallback?: ReadlinkOptions | ReadlinkCallback,
-): string | null {
- if (!optOrCallback || typeof optOrCallback === "function") {
- return null;
- } else {
- if (optOrCallback.encoding) {
- if (
- optOrCallback.encoding === "utf8" ||
- optOrCallback.encoding === "utf-8"
- ) {
- return "utf8";
- } else if (optOrCallback.encoding === "buffer") {
- return "buffer";
- } else {
- notImplemented();
- }
- }
- return null;
- }
-}
-
-export function readlink(
- path: string | URL,
- optOrCallback: ReadlinkCallback | ReadlinkOptions,
- callback?: ReadlinkCallback,
-): void {
- path = path instanceof URL ? fromFileUrl(path) : path;
-
- let cb: ReadlinkCallback | undefined;
- if (typeof optOrCallback === "function") {
- cb = optOrCallback;
- } else {
- cb = callback;
- }
-
- const encoding = getEncoding(optOrCallback);
-
- intoCallbackAPIWithIntercept<string, Uint8Array | string>(
- Deno.readLink,
- (data: string): string | Uint8Array => maybeEncode(data, encoding),
- cb,
- path,
- );
-}
-
-export function readlinkSync(
- path: string | URL,
- opt?: ReadlinkOptions,
-): string | Uint8Array {
- path = path instanceof URL ? fromFileUrl(path) : path;
-
- return maybeEncode(Deno.readLinkSync(path), getEncoding(opt));
-}
diff --git a/std/node/_fs/_fs_readlink_test.ts b/std/node/_fs/_fs_readlink_test.ts
deleted file mode 100644
index cb3dd25b4..000000000
--- a/std/node/_fs/_fs_readlink_test.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import { readlink, readlinkSync } from "./_fs_readlink.ts";
-import { assert, assertEquals } from "../../testing/asserts.ts";
-import * as path from "../path.ts";
-
-const testDir = Deno.makeTempDirSync();
-const oldname = path.join(testDir, "oldname");
-const newname = path.join(testDir, "newname");
-
-if (Deno.build.os === "windows") {
- Deno.symlinkSync(oldname, newname, { type: "file" });
-} else {
- Deno.symlinkSync(oldname, newname);
-}
-
-Deno.test({
- name: "readlinkSuccess",
- async fn() {
- const data = await new Promise((res, rej) => {
- readlink(newname, (err, data) => {
- if (err) {
- rej(err);
- }
- res(data);
- });
- });
-
- assertEquals(typeof data, "string");
- assertEquals(data as string, oldname);
- },
-});
-
-Deno.test({
- name: "readlinkEncodeBufferSuccess",
- async fn() {
- const data = await new Promise((res, rej) => {
- readlink(newname, { encoding: "buffer" }, (err, data) => {
- if (err) {
- rej(err);
- }
- res(data);
- });
- });
-
- assert(data instanceof Uint8Array);
- assertEquals(new TextDecoder().decode(data as Uint8Array), oldname);
- },
-});
-
-Deno.test({
- name: "readlinkSyncSuccess",
- fn() {
- const data = readlinkSync(newname);
- assertEquals(typeof data, "string");
- assertEquals(data as string, oldname);
- },
-});
-
-Deno.test({
- name: "readlinkEncodeBufferSuccess",
- fn() {
- const data = readlinkSync(newname, { encoding: "buffer" });
- assert(data instanceof Uint8Array);
- assertEquals(new TextDecoder().decode(data as Uint8Array), oldname);
- },
-});
-
-Deno.test("[std/node/fs] readlink callback isn't called twice if error is thrown", async () => {
- const importUrl = new URL("./_fs_readlink.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { readlink } from ${JSON.stringify(importUrl)}`,
- invocation: `readlink(${JSON.stringify(newname)}, `,
- });
-});
diff --git a/std/node/_fs/_fs_realpath.ts b/std/node/_fs/_fs_realpath.ts
deleted file mode 100644
index 95e699d65..000000000
--- a/std/node/_fs/_fs_realpath.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-type Options = { encoding: string };
-type Callback = (err: Error | null, path?: string) => void;
-
-export function realpath(
- path: string,
- options?: Options | Callback,
- callback?: Callback,
-) {
- if (typeof options === "function") {
- callback = options;
- }
- if (!callback) {
- throw new Error("No callback function supplied");
- }
- Deno.realPath(path).then(
- (path) => callback!(null, path),
- (err) => callback!(err),
- );
-}
-
-export function realpathSync(path: string): string {
- return Deno.realPathSync(path);
-}
diff --git a/std/node/_fs/_fs_realpath_test.ts b/std/node/_fs/_fs_realpath_test.ts
deleted file mode 100644
index 08eb3ef16..000000000
--- a/std/node/_fs/_fs_realpath_test.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import * as path from "../../path/mod.ts";
-import { assertEquals } from "../../testing/asserts.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import { realpath, realpathSync } from "./_fs_realpath.ts";
-
-Deno.test("realpath", async function () {
- const tempFile = await Deno.makeTempFile();
- const tempFileAlias = tempFile + ".alias";
- await Deno.symlink(tempFile, tempFileAlias);
- const realPath = await new Promise((resolve, reject) => {
- realpath(tempFile, (err, path) => {
- if (err) {
- reject(err);
- return;
- }
- resolve(path);
- });
- });
- const realSymLinkPath = await new Promise((resolve, reject) => {
- realpath(tempFileAlias, (err, path) => {
- if (err) {
- reject(err);
- return;
- }
- resolve(path);
- });
- });
- assertEquals(realPath, realSymLinkPath);
-});
-
-Deno.test("realpathSync", function () {
- const tempFile = Deno.makeTempFileSync();
- const tempFileAlias = tempFile + ".alias";
- Deno.symlinkSync(tempFile, tempFileAlias);
- const realPath = realpathSync(tempFile);
- const realSymLinkPath = realpathSync(tempFileAlias);
- assertEquals(realPath, realSymLinkPath);
-});
-
-Deno.test("[std/node/fs] realpath callback isn't called twice if error is thrown", async () => {
- const tempDir = await Deno.makeTempDir();
- const tempFile = path.join(tempDir, "file.txt");
- const linkFile = path.join(tempDir, "link.txt");
- await Deno.writeTextFile(tempFile, "hello world");
- await Deno.symlink(tempFile, linkFile, { type: "file" });
- const importUrl = new URL("./_fs_realpath.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { realpath } from ${JSON.stringify(importUrl)}`,
- invocation: `realpath(${JSON.stringify(`${tempDir}/link.txt`)}, `,
- async cleanup() {
- await Deno.remove(tempDir, { recursive: true });
- },
- });
-});
diff --git a/std/node/_fs/_fs_rename.ts b/std/node/_fs/_fs_rename.ts
deleted file mode 100644
index b121eacf9..000000000
--- a/std/node/_fs/_fs_rename.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { fromFileUrl } from "../path.ts";
-
-export function rename(
- oldPath: string | URL,
- newPath: string | URL,
- callback: (err?: Error) => void,
-) {
- oldPath = oldPath instanceof URL ? fromFileUrl(oldPath) : oldPath;
- newPath = newPath instanceof URL ? fromFileUrl(newPath) : newPath;
-
- if (!callback) throw new Error("No callback function supplied");
-
- Deno.rename(oldPath, newPath).then((_) => callback(), callback);
-}
-
-export function renameSync(oldPath: string | URL, newPath: string | URL) {
- oldPath = oldPath instanceof URL ? fromFileUrl(oldPath) : oldPath;
- newPath = newPath instanceof URL ? fromFileUrl(newPath) : newPath;
-
- Deno.renameSync(oldPath, newPath);
-}
diff --git a/std/node/_fs/_fs_rename_test.ts b/std/node/_fs/_fs_rename_test.ts
deleted file mode 100644
index e35e5282e..000000000
--- a/std/node/_fs/_fs_rename_test.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { assertEquals, fail } from "../../testing/asserts.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import { rename, renameSync } from "./_fs_rename.ts";
-import { existsSync } from "../../fs/mod.ts";
-import { join, parse } from "../../path/mod.ts";
-
-Deno.test({
- name: "ASYNC: renaming a file",
- async fn() {
- const file = Deno.makeTempFileSync();
- const newPath = join(parse(file).dir, `${parse(file).base}_renamed`);
- await new Promise<void>((resolve, reject) => {
- rename(file, newPath, (err) => {
- if (err) reject(err);
- resolve();
- });
- })
- .then(() => {
- assertEquals(existsSync(newPath), true);
- assertEquals(existsSync(file), false);
- }, () => fail())
- .finally(() => {
- if (existsSync(file)) Deno.removeSync(file);
- if (existsSync(newPath)) Deno.removeSync(newPath);
- });
- },
-});
-
-Deno.test({
- name: "SYNC: renaming a file",
- fn() {
- const file = Deno.makeTempFileSync();
- const newPath = join(parse(file).dir, `${parse(file).base}_renamed`);
- renameSync(file, newPath);
- assertEquals(existsSync(newPath), true);
- assertEquals(existsSync(file), false);
- },
-});
-
-Deno.test("[std/node/fs] rename callback isn't called twice if error is thrown", async () => {
- const tempFile = await Deno.makeTempFile();
- const importUrl = new URL("./_fs_rename.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { rename } from ${JSON.stringify(importUrl)}`,
- invocation: `rename(${JSON.stringify(tempFile)},
- ${JSON.stringify(`${tempFile}.newname`)}, `,
- async cleanup() {
- await Deno.remove(`${tempFile}.newname`);
- },
- });
-});
diff --git a/std/node/_fs/_fs_rmdir.ts b/std/node/_fs/_fs_rmdir.ts
deleted file mode 100644
index e82e696e3..000000000
--- a/std/node/_fs/_fs_rmdir.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-type rmdirOptions = {
- maxRetries?: number;
- recursive?: boolean;
- retryDelay?: number;
-};
-
-type rmdirCallback = (err?: Error) => void;
-
-export function rmdir(path: string | URL, callback: rmdirCallback): void;
-export function rmdir(
- path: string | URL,
- options: rmdirOptions,
- callback: rmdirCallback,
-): void;
-export function rmdir(
- path: string | URL,
- optionsOrCallback: rmdirOptions | rmdirCallback,
- maybeCallback?: rmdirCallback,
-) {
- const callback = typeof optionsOrCallback === "function"
- ? optionsOrCallback
- : maybeCallback;
- const options = typeof optionsOrCallback === "object"
- ? optionsOrCallback
- : undefined;
-
- if (!callback) throw new Error("No callback function supplied");
-
- Deno.remove(path, { recursive: options?.recursive })
- .then((_) => callback(), callback);
-}
-
-export function rmdirSync(path: string | URL, options?: rmdirOptions) {
- Deno.removeSync(path, { recursive: options?.recursive });
-}
diff --git a/std/node/_fs/_fs_rmdir_test.ts b/std/node/_fs/_fs_rmdir_test.ts
deleted file mode 100644
index 6f9c33274..000000000
--- a/std/node/_fs/_fs_rmdir_test.ts
+++ /dev/null
@@ -1,100 +0,0 @@
-import { assertEquals, fail } from "../../testing/asserts.ts";
-import { rmdir, rmdirSync } from "./_fs_rmdir.ts";
-import { closeSync } from "./_fs_close.ts";
-import { existsSync } from "../../fs/mod.ts";
-import { join } from "../../path/mod.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-
-Deno.test({
- name: "ASYNC: removing empty folder",
- async fn() {
- const dir = Deno.makeTempDirSync();
- await new Promise<void>((resolve, reject) => {
- rmdir(dir, (err) => {
- if (err) reject(err);
- resolve();
- });
- })
- .then(() => assertEquals(existsSync(dir), false), () => fail())
- .finally(() => {
- if (existsSync(dir)) Deno.removeSync(dir);
- });
- },
-});
-
-Deno.test({
- name: "SYNC: removing empty folder",
- fn() {
- const dir = Deno.makeTempDirSync();
- rmdirSync(dir);
- assertEquals(existsSync(dir), false);
- },
-});
-
-function closeRes(before: Deno.ResourceMap, after: Deno.ResourceMap) {
- for (const key in after) {
- if (!before[key]) {
- try {
- closeSync(Number(key));
- } catch (error) {
- return error;
- }
- }
- }
-}
-
-Deno.test({
- name: "ASYNC: removing non-empty folder",
- async fn() {
- const rBefore = Deno.resources();
- const dir = Deno.makeTempDirSync();
- Deno.createSync(join(dir, "file1.txt"));
- Deno.createSync(join(dir, "file2.txt"));
- Deno.mkdirSync(join(dir, "some_dir"));
- Deno.createSync(join(dir, "some_dir", "file.txt"));
- await new Promise<void>((resolve, reject) => {
- rmdir(dir, { recursive: true }, (err) => {
- if (err) reject(err);
- resolve();
- });
- })
- .then(() => assertEquals(existsSync(dir), false), () => fail())
- .finally(() => {
- if (existsSync(dir)) Deno.removeSync(dir, { recursive: true });
- const rAfter = Deno.resources();
- closeRes(rBefore, rAfter);
- });
- },
- ignore: Deno.build.os === "windows",
-});
-
-Deno.test({
- name: "SYNC: removing non-empty folder",
- fn() {
- const rBefore = Deno.resources();
- const dir = Deno.makeTempDirSync();
- Deno.createSync(join(dir, "file1.txt"));
- Deno.createSync(join(dir, "file2.txt"));
- Deno.mkdirSync(join(dir, "some_dir"));
- Deno.createSync(join(dir, "some_dir", "file.txt"));
- rmdirSync(dir, { recursive: true });
- assertEquals(existsSync(dir), false);
- // closing resources
- const rAfter = Deno.resources();
- closeRes(rBefore, rAfter);
- },
- ignore: Deno.build.os === "windows",
-});
-
-Deno.test("[std/node/fs] rmdir callback isn't called twice if error is thrown", async () => {
- // The correct behaviour is not to catch any errors thrown,
- // but that means there'll be an uncaught error and the test will fail.
- // So the only way to test this is to spawn a subprocess, and succeed if it has a non-zero exit code.
- // (assertThrowsAsync won't work because there's no way to catch the error.)
- const tempDir = await Deno.makeTempDir();
- const importUrl = new URL("./_fs_rmdir.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { rmdir } from ${JSON.stringify(importUrl)}`,
- invocation: `rmdir(${JSON.stringify(tempDir)}, `,
- });
-});
diff --git a/std/node/_fs/_fs_stat.ts b/std/node/_fs/_fs_stat.ts
deleted file mode 100644
index 4f7903d16..000000000
--- a/std/node/_fs/_fs_stat.ts
+++ /dev/null
@@ -1,289 +0,0 @@
-export type statOptions = {
- bigint: boolean;
-};
-
-export type Stats = {
- /** ID of the device containing the file.
- *
- * _Linux/Mac OS only._ */
- dev: number | null;
- /** Inode number.
- *
- * _Linux/Mac OS only._ */
- ino: number | null;
- /** **UNSTABLE**: Match behavior with Go on Windows for `mode`.
- *
- * The underlying raw `st_mode` bits that contain the standard Unix
- * permissions for this file/directory. */
- mode: number | null;
- /** Number of hard links pointing to this file.
- *
- * _Linux/Mac OS only._ */
- nlink: number | null;
- /** User ID of the owner of this file.
- *
- * _Linux/Mac OS only._ */
- uid: number | null;
- /** Group ID of the owner of this file.
- *
- * _Linux/Mac OS only._ */
- gid: number | null;
- /** Device ID of this file.
- *
- * _Linux/Mac OS only._ */
- rdev: number | null;
- /** The size of the file, in bytes. */
- size: number;
- /** Blocksize for filesystem I/O.
- *
- * _Linux/Mac OS only._ */
- blksize: number | null;
- /** Number of blocks allocated to the file, in 512-byte units.
- *
- * _Linux/Mac OS only._ */
- blocks: number | null;
- /** The last modification time of the file. This corresponds to the `mtime`
- * field from `stat` on Linux/Mac OS and `ftLastWriteTime` on Windows. This
- * may not be available on all platforms. */
- mtime: Date | null;
- /** The last access time of the file. This corresponds to the `atime`
- * field from `stat` on Unix and `ftLastAccessTime` on Windows. This may not
- * be available on all platforms. */
- atime: Date | null;
- /** The creation time of the file. This corresponds to the `birthtime`
- * field from `stat` on Mac/BSD and `ftCreationTime` on Windows. This may
- * not be available on all platforms. */
- birthtime: Date | null;
- /** change time */
- ctime: Date | null;
- /** atime in milliseconds */
- atimeMs: number | null;
- /** atime in milliseconds */
- mtimeMs: number | null;
- /** atime in milliseconds */
- ctimeMs: number | null;
- /** atime in milliseconds */
- birthtimeMs: number | null;
- isBlockDevice: () => boolean;
- isCharacterDevice: () => boolean;
- isDirectory: () => boolean;
- isFIFO: () => boolean;
- isFile: () => boolean;
- isSocket: () => boolean;
- isSymbolicLink: () => boolean;
-};
-
-export type BigIntStats = {
- /** ID of the device containing the file.
- *
- * _Linux/Mac OS only._ */
- dev: BigInt | null;
- /** Inode number.
- *
- * _Linux/Mac OS only._ */
- ino: BigInt | null;
- /** **UNSTABLE**: Match behavior with Go on Windows for `mode`.
- *
- * The underlying raw `st_mode` bits that contain the standard Unix
- * permissions for this file/directory. */
- mode: BigInt | null;
- /** Number of hard links pointing to this file.
- *
- * _Linux/Mac OS only._ */
- nlink: BigInt | null;
- /** User ID of the owner of this file.
- *
- * _Linux/Mac OS only._ */
- uid: BigInt | null;
- /** Group ID of the owner of this file.
- *
- * _Linux/Mac OS only._ */
- gid: BigInt | null;
- /** Device ID of this file.
- *
- * _Linux/Mac OS only._ */
- rdev: BigInt | null;
- /** The size of the file, in bytes. */
- size: BigInt;
- /** Blocksize for filesystem I/O.
- *
- * _Linux/Mac OS only._ */
- blksize: BigInt | null;
- /** Number of blocks allocated to the file, in 512-byte units.
- *
- * _Linux/Mac OS only._ */
- blocks: BigInt | null;
- /** The last modification time of the file. This corresponds to the `mtime`
- * field from `stat` on Linux/Mac OS and `ftLastWriteTime` on Windows. This
- * may not be available on all platforms. */
- mtime: Date | null;
- /** The last access time of the file. This corresponds to the `atime`
- * field from `stat` on Unix and `ftLastAccessTime` on Windows. This may not
- * be available on all platforms. */
- atime: Date | null;
- /** The creation time of the file. This corresponds to the `birthtime`
- * field from `stat` on Mac/BSD and `ftCreationTime` on Windows. This may
- * not be available on all platforms. */
- birthtime: Date | null;
- /** change time */
- ctime: Date | null;
- /** atime in milliseconds */
- atimeMs: BigInt | null;
- /** atime in milliseconds */
- mtimeMs: BigInt | null;
- /** atime in milliseconds */
- ctimeMs: BigInt | null;
- /** atime in nanoseconds */
- birthtimeMs: BigInt | null;
- /** atime in nanoseconds */
- atimeNs: BigInt | null;
- /** atime in nanoseconds */
- mtimeNs: BigInt | null;
- /** atime in nanoseconds */
- ctimeNs: BigInt | null;
- /** atime in nanoseconds */
- birthtimeNs: BigInt | null;
- isBlockDevice: () => boolean;
- isCharacterDevice: () => boolean;
- isDirectory: () => boolean;
- isFIFO: () => boolean;
- isFile: () => boolean;
- isSocket: () => boolean;
- isSymbolicLink: () => boolean;
-};
-
-export function convertFileInfoToStats(origin: Deno.FileInfo): Stats {
- return {
- dev: origin.dev,
- ino: origin.ino,
- mode: origin.mode,
- nlink: origin.nlink,
- uid: origin.uid,
- gid: origin.gid,
- rdev: origin.rdev,
- size: origin.size,
- blksize: origin.blksize,
- blocks: origin.blocks,
- mtime: origin.mtime,
- atime: origin.atime,
- birthtime: origin.birthtime,
- mtimeMs: origin.mtime?.getTime() || null,
- atimeMs: origin.atime?.getTime() || null,
- birthtimeMs: origin.birthtime?.getTime() || null,
- isFile: () => origin.isFile,
- isDirectory: () => origin.isDirectory,
- isSymbolicLink: () => origin.isSymlink,
- // not sure about those
- isBlockDevice: () => false,
- isFIFO: () => false,
- isCharacterDevice: () => false,
- isSocket: () => false,
- ctime: origin.mtime,
- ctimeMs: origin.mtime?.getTime() || null,
- };
-}
-
-function toBigInt(number?: number | null) {
- if (number === null || number === undefined) return null;
- return BigInt(number);
-}
-
-export function convertFileInfoToBigIntStats(
- origin: Deno.FileInfo,
-): BigIntStats {
- return {
- dev: toBigInt(origin.dev),
- ino: toBigInt(origin.ino),
- mode: toBigInt(origin.mode),
- nlink: toBigInt(origin.nlink),
- uid: toBigInt(origin.uid),
- gid: toBigInt(origin.gid),
- rdev: toBigInt(origin.rdev),
- size: toBigInt(origin.size) || 0n,
- blksize: toBigInt(origin.blksize),
- blocks: toBigInt(origin.blocks),
- mtime: origin.mtime,
- atime: origin.atime,
- birthtime: origin.birthtime,
- mtimeMs: origin.mtime ? BigInt(origin.mtime.getTime()) : null,
- atimeMs: origin.atime ? BigInt(origin.atime.getTime()) : null,
- birthtimeMs: origin.birthtime ? BigInt(origin.birthtime.getTime()) : null,
- mtimeNs: origin.mtime ? BigInt(origin.mtime.getTime()) * 1000000n : null,
- atimeNs: origin.atime ? BigInt(origin.atime.getTime()) * 1000000n : null,
- birthtimeNs: origin.birthtime
- ? BigInt(origin.birthtime.getTime()) * 1000000n
- : null,
- isFile: () => origin.isFile,
- isDirectory: () => origin.isDirectory,
- isSymbolicLink: () => origin.isSymlink,
- // not sure about those
- isBlockDevice: () => false,
- isFIFO: () => false,
- isCharacterDevice: () => false,
- isSocket: () => false,
- ctime: origin.mtime,
- ctimeMs: origin.mtime ? BigInt(origin.mtime.getTime()) : null,
- ctimeNs: origin.mtime ? BigInt(origin.mtime.getTime()) * 1000000n : null,
- };
-}
-
-// shortcut for Convert File Info to Stats or BigIntStats
-export function CFISBIS(fileInfo: Deno.FileInfo, bigInt: boolean) {
- if (bigInt) return convertFileInfoToBigIntStats(fileInfo);
- return convertFileInfoToStats(fileInfo);
-}
-
-export type statCallbackBigInt = (
- err: Error | null,
- stat: BigIntStats,
-) => void;
-
-export type statCallback = (err: Error | null, stat: Stats) => void;
-
-export function stat(path: string | URL, callback: statCallback): void;
-export function stat(
- path: string | URL,
- options: { bigint: false },
- callback: statCallback,
-): void;
-export function stat(
- path: string | URL,
- options: { bigint: true },
- callback: statCallbackBigInt,
-): void;
-export function stat(
- path: string | URL,
- optionsOrCallback: statCallback | statCallbackBigInt | statOptions,
- maybeCallback?: statCallback | statCallbackBigInt,
-) {
- const callback =
- (typeof optionsOrCallback === "function"
- ? optionsOrCallback
- : maybeCallback) as (
- ...args: [Error] | [null, BigIntStats | Stats]
- ) => void;
- const options = typeof optionsOrCallback === "object"
- ? optionsOrCallback
- : { bigint: false };
-
- if (!callback) throw new Error("No callback function supplied");
-
- Deno.stat(path).then(
- (stat) => callback(null, CFISBIS(stat, options.bigint)),
- (err) => callback(err),
- );
-}
-
-export function statSync(path: string | URL): Stats;
-export function statSync(path: string | URL, options: { bigint: false }): Stats;
-export function statSync(
- path: string | URL,
- options: { bigint: true },
-): BigIntStats;
-export function statSync(
- path: string | URL,
- options: statOptions = { bigint: false },
-): Stats | BigIntStats {
- const origin = Deno.statSync(path);
- return CFISBIS(origin, options.bigint);
-}
diff --git a/std/node/_fs/_fs_stat_test.ts b/std/node/_fs/_fs_stat_test.ts
deleted file mode 100644
index 5a25cddcc..000000000
--- a/std/node/_fs/_fs_stat_test.ts
+++ /dev/null
@@ -1,130 +0,0 @@
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import { BigIntStats, stat, Stats, statSync } from "./_fs_stat.ts";
-import { assertEquals, fail } from "../../testing/asserts.ts";
-
-export function assertStats(actual: Stats, expected: Deno.FileInfo) {
- assertEquals(actual.dev, expected.dev);
- assertEquals(actual.gid, expected.gid);
- assertEquals(actual.size, expected.size);
- assertEquals(actual.blksize, expected.blksize);
- assertEquals(actual.blocks, expected.blocks);
- assertEquals(actual.ino, expected.ino);
- assertEquals(actual.gid, expected.gid);
- assertEquals(actual.mode, expected.mode);
- assertEquals(actual.nlink, expected.nlink);
- assertEquals(actual.rdev, expected.rdev);
- assertEquals(actual.uid, expected.uid);
- assertEquals(actual.atime?.getTime(), expected.atime?.getTime());
- assertEquals(actual.mtime?.getTime(), expected.mtime?.getTime());
- assertEquals(actual.birthtime?.getTime(), expected.birthtime?.getTime());
- assertEquals(actual.atimeMs ?? undefined, expected.atime?.getTime());
- assertEquals(actual.mtimeMs ?? undefined, expected.mtime?.getTime());
- assertEquals(actual.birthtimeMs ?? undefined, expected.birthtime?.getTime());
- assertEquals(actual.isFile(), expected.isFile);
- assertEquals(actual.isDirectory(), expected.isDirectory);
- assertEquals(actual.isSymbolicLink(), expected.isSymlink);
-}
-
-function toBigInt(num?: number | null) {
- if (num === undefined || num === null) return null;
- return BigInt(num);
-}
-
-export function assertStatsBigInt(
- actual: BigIntStats,
- expected: Deno.FileInfo,
-) {
- assertEquals(actual.dev, toBigInt(expected.dev));
- assertEquals(actual.gid, toBigInt(expected.gid));
- assertEquals(actual.size, toBigInt(expected.size));
- assertEquals(actual.blksize, toBigInt(expected.blksize));
- assertEquals(actual.blocks, toBigInt(expected.blocks));
- assertEquals(actual.ino, toBigInt(expected.ino));
- assertEquals(actual.gid, toBigInt(expected.gid));
- assertEquals(actual.mode, toBigInt(expected.mode));
- assertEquals(actual.nlink, toBigInt(expected.nlink));
- assertEquals(actual.rdev, toBigInt(expected.rdev));
- assertEquals(actual.uid, toBigInt(expected.uid));
- assertEquals(actual.atime?.getTime(), expected.atime?.getTime());
- assertEquals(actual.mtime?.getTime(), expected.mtime?.getTime());
- assertEquals(actual.birthtime?.getTime(), expected.birthtime?.getTime());
- assertEquals(
- actual.atimeMs === null ? undefined : Number(actual.atimeMs),
- expected.atime?.getTime(),
- );
- assertEquals(
- actual.mtimeMs === null ? undefined : Number(actual.mtimeMs),
- expected.mtime?.getTime(),
- );
- assertEquals(
- actual.birthtimeMs === null ? undefined : Number(actual.birthtimeMs),
- expected.birthtime?.getTime(),
- );
- assertEquals(actual.atimeNs === null, actual.atime === null);
- assertEquals(actual.mtimeNs === null, actual.mtime === null);
- assertEquals(actual.birthtimeNs === null, actual.birthtime === null);
- assertEquals(actual.isFile(), expected.isFile);
- assertEquals(actual.isDirectory(), expected.isDirectory);
- assertEquals(actual.isSymbolicLink(), expected.isSymlink);
-}
-
-Deno.test({
- name: "ASYNC: get a file Stats",
- async fn() {
- const file = Deno.makeTempFileSync();
- await new Promise<Stats>((resolve, reject) => {
- stat(file, (err, stat) => {
- if (err) reject(err);
- resolve(stat);
- });
- })
- .then((stat) => assertStats(stat, Deno.statSync(file)), () => fail())
- .finally(() => Deno.removeSync(file));
- },
-});
-
-Deno.test({
- name: "SYNC: get a file Stats",
- fn() {
- const file = Deno.makeTempFileSync();
- assertStats(statSync(file), Deno.statSync(file));
- },
-});
-
-Deno.test({
- name: "ASYNC: get a file BigInt Stats",
- async fn() {
- const file = Deno.makeTempFileSync();
- await new Promise<BigIntStats>((resolve, reject) => {
- stat(file, { bigint: true }, (err, stat) => {
- if (err) reject(err);
- resolve(stat);
- });
- })
- .then(
- (stat) => assertStatsBigInt(stat, Deno.statSync(file)),
- () => fail(),
- )
- .finally(() => Deno.removeSync(file));
- },
-});
-
-Deno.test({
- name: "SYNC: get a file BigInt Stats",
- fn() {
- const file = Deno.makeTempFileSync();
- assertStatsBigInt(statSync(file, { bigint: true }), Deno.statSync(file));
- },
-});
-
-Deno.test("[std/node/fs] stat callback isn't called twice if error is thrown", async () => {
- const tempFile = await Deno.makeTempFile();
- const importUrl = new URL("./_fs_stat.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { stat } from ${JSON.stringify(importUrl)}`,
- invocation: `stat(${JSON.stringify(tempFile)}, `,
- async cleanup() {
- await Deno.remove(tempFile);
- },
- });
-});
diff --git a/std/node/_fs/_fs_unlink.ts b/std/node/_fs/_fs_unlink.ts
deleted file mode 100644
index 7349bee46..000000000
--- a/std/node/_fs/_fs_unlink.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export function unlink(path: string | URL, callback: (err?: Error) => void) {
- if (!callback) throw new Error("No callback function supplied");
- Deno.remove(path).then((_) => callback(), callback);
-}
-
-export function unlinkSync(path: string | URL) {
- Deno.removeSync(path);
-}
diff --git a/std/node/_fs/_fs_unlink_test.ts b/std/node/_fs/_fs_unlink_test.ts
deleted file mode 100644
index 5021b1c38..000000000
--- a/std/node/_fs/_fs_unlink_test.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { assertEquals, fail } from "../../testing/asserts.ts";
-import { existsSync } from "../../fs/mod.ts";
-import { assertCallbackErrorUncaught } from "../_utils.ts";
-import { unlink, unlinkSync } from "./_fs_unlink.ts";
-
-Deno.test({
- name: "ASYNC: deleting a file",
- async fn() {
- const file = Deno.makeTempFileSync();
- await new Promise<void>((resolve, reject) => {
- unlink(file, (err) => {
- if (err) reject(err);
- resolve();
- });
- })
- .then(() => assertEquals(existsSync(file), false), () => fail())
- .finally(() => {
- if (existsSync(file)) Deno.removeSync(file);
- });
- },
-});
-
-Deno.test({
- name: "SYNC: Test deleting a file",
- fn() {
- const file = Deno.makeTempFileSync();
- unlinkSync(file);
- assertEquals(existsSync(file), false);
- },
-});
-
-Deno.test("[std/node/fs] unlink callback isn't called twice if error is thrown", async () => {
- const tempFile = await Deno.makeTempFile();
- const importUrl = new URL("./_fs_unlink.ts", import.meta.url);
- await assertCallbackErrorUncaught({
- prelude: `import { unlink } from ${JSON.stringify(importUrl)}`,
- invocation: `unlink(${JSON.stringify(tempFile)}, `,
- });
-});
diff --git a/std/node/_fs/_fs_watch.ts b/std/node/_fs/_fs_watch.ts
deleted file mode 100644
index a5f3bb9c1..000000000
--- a/std/node/_fs/_fs_watch.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-import { fromFileUrl } from "../path.ts";
-import { EventEmitter } from "../events.ts";
-import { notImplemented } from "../_utils.ts";
-
-export function asyncIterableIteratorToCallback<T>(
- iterator: AsyncIterableIterator<T>,
- callback: (val: T, done?: boolean) => void,
-) {
- function next() {
- iterator.next().then((obj) => {
- if (obj.done) {
- callback(obj.value, true);
- return;
- }
- callback(obj.value);
- next();
- });
- }
- next();
-}
-
-export function asyncIterableToCallback<T>(
- iter: AsyncIterable<T>,
- callback: (val: T, done?: boolean) => void,
-) {
- const iterator = iter[Symbol.asyncIterator]();
- function next() {
- iterator.next().then((obj) => {
- if (obj.done) {
- callback(obj.value, true);
- return;
- }
- callback(obj.value);
- next();
- });
- }
- next();
-}
-
-type watchOptions = {
- persistent?: boolean;
- recursive?: boolean;
- encoding?: string;
-};
-
-type watchListener = (eventType: string, filename: string) => void;
-
-export function watch(
- filename: string | URL,
- options: watchOptions,
- listener: watchListener,
-): FSWatcher;
-export function watch(
- filename: string | URL,
- listener: watchListener,
-): FSWatcher;
-export function watch(
- filename: string | URL,
- options: watchOptions,
-): FSWatcher;
-export function watch(filename: string | URL): FSWatcher;
-export function watch(
- filename: string | URL,
- optionsOrListener?: watchOptions | watchListener,
- optionsOrListener2?: watchOptions | watchListener,
-) {
- const listener = typeof optionsOrListener === "function"
- ? optionsOrListener
- : typeof optionsOrListener2 === "function"
- ? optionsOrListener2
- : undefined;
- const options = typeof optionsOrListener === "object"
- ? optionsOrListener
- : typeof optionsOrListener2 === "object"
- ? optionsOrListener2
- : undefined;
- filename = filename instanceof URL ? fromFileUrl(filename) : filename;
-
- const iterator = Deno.watchFs(filename, {
- recursive: options?.recursive || false,
- });
-
- if (!listener) throw new Error("No callback function supplied");
-
- const fsWatcher = new FSWatcher(() => {
- if (iterator.return) iterator.return();
- });
-
- fsWatcher.on("change", listener);
-
- asyncIterableIteratorToCallback<Deno.FsEvent>(iterator, (val, done) => {
- if (done) return;
- fsWatcher.emit("change", val.kind, val.paths[0]);
- });
-
- return fsWatcher;
-}
-
-class FSWatcher extends EventEmitter {
- close: () => void;
- constructor(closer: () => void) {
- super();
- this.close = closer;
- }
- ref() {
- notImplemented("FSWatcher.ref() is not implemented");
- }
- unref() {
- notImplemented("FSWatcher.unref() is not implemented");
- }
-}
diff --git a/std/node/_fs/_fs_watch_test.ts b/std/node/_fs/_fs_watch_test.ts
deleted file mode 100644
index 00fce4ffd..000000000
--- a/std/node/_fs/_fs_watch_test.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { watch } from "./_fs_watch.ts";
-import { assertEquals, fail } from "../../testing/asserts.ts";
-
-function wait(time: number) {
- return new Promise((resolve) => {
- setTimeout(resolve, time);
- });
-}
-
-Deno.test({
- name: "watching a file",
- async fn() {
- const file = Deno.makeTempFileSync();
- const result: Array<[string, string]> = [];
- const watcher = watch(
- file,
- (eventType, filename) => result.push([eventType, filename]),
- );
- await wait(100);
- Deno.writeTextFileSync(file, "something");
- await wait(100);
- watcher.close();
- await wait(100);
- assertEquals(result.length >= 1, true);
- },
-});
diff --git a/std/node/_fs/_fs_writeFile.ts b/std/node/_fs/_fs_writeFile.ts
deleted file mode 100644
index e68bd8884..000000000
--- a/std/node/_fs/_fs_writeFile.ts
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { Encodings, notImplemented } from "../_utils.ts";
-import { fromFileUrl } from "../path.ts";
-import { Buffer } from "../buffer.ts";
-import {
- CallbackWithError,
- checkEncoding,
- getEncoding,
- getOpenOptions,
- isFileOptions,
- WriteFileOptions,
-} from "./_fs_common.ts";
-
-export function writeFile(
- pathOrRid: string | number | URL,
- data: string | Uint8Array,
- optOrCallback: Encodings | CallbackWithError | WriteFileOptions | undefined,
- callback?: CallbackWithError,
-): void {
- const callbackFn: CallbackWithError | undefined =
- optOrCallback instanceof Function ? optOrCallback : callback;
- const options: Encodings | WriteFileOptions | undefined =
- optOrCallback instanceof Function ? undefined : optOrCallback;
-
- if (!callbackFn) {
- throw new TypeError("Callback must be a function.");
- }
-
- pathOrRid = pathOrRid instanceof URL ? fromFileUrl(pathOrRid) : pathOrRid;
-
- const flag: string | undefined = isFileOptions(options)
- ? options.flag
- : undefined;
-
- const mode: number | undefined = isFileOptions(options)
- ? options.mode
- : undefined;
-
- const encoding = checkEncoding(getEncoding(options)) || "utf8";
- const openOptions = getOpenOptions(flag || "w");
-
- if (typeof data === "string") data = Buffer.from(data, encoding);
-
- const isRid = typeof pathOrRid === "number";
- let file;
-
- let error: Error | null = null;
- (async (): Promise<void> => {
- try {
- file = isRid
- ? new Deno.File(pathOrRid as number)
- : await Deno.open(pathOrRid as string, openOptions);
-
- if (!isRid && mode) {
- if (Deno.build.os === "windows") notImplemented(`"mode" on Windows`);
- await Deno.chmod(pathOrRid as string, mode);
- }
-
- await Deno.writeAll(file, data as Uint8Array);
- } catch (e) {
- error = e;
- } finally {
- // Make sure to close resource
- if (!isRid && file) file.close();
- callbackFn(error);
- }
- })();
-}
-
-export function writeFileSync(
- pathOrRid: string | number | URL,
- data: string | Uint8Array,
- options?: Encodings | WriteFileOptions,
-): void {
- pathOrRid = pathOrRid instanceof URL ? fromFileUrl(pathOrRid) : pathOrRid;
-
- const flag: string | undefined = isFileOptions(options)
- ? options.flag
- : undefined;
-
- const mode: number | undefined = isFileOptions(options)
- ? options.mode
- : undefined;
-
- const encoding = checkEncoding(getEncoding(options)) || "utf8";
- const openOptions = getOpenOptions(flag || "w");
-
- if (typeof data === "string") data = Buffer.from(data, encoding);
-
- const isRid = typeof pathOrRid === "number";
- let file;
-
- let error: Error | null = null;
- try {
- file = isRid
- ? new Deno.File(pathOrRid as number)
- : Deno.openSync(pathOrRid as string, openOptions);
-
- if (!isRid && mode) {
- if (Deno.build.os === "windows") notImplemented(`"mode" on Windows`);
- Deno.chmodSync(pathOrRid as string, mode);
- }
-
- Deno.writeAllSync(file, data as Uint8Array);
- } catch (e) {
- error = e;
- } finally {
- // Make sure to close resource
- if (!isRid && file) file.close();
-
- if (error) throw error;
- }
-}
diff --git a/std/node/_fs/_fs_writeFile_test.ts b/std/node/_fs/_fs_writeFile_test.ts
deleted file mode 100644
index 561f71f88..000000000
--- a/std/node/_fs/_fs_writeFile_test.ts
+++ /dev/null
@@ -1,310 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import {
- assert,
- assertEquals,
- assertNotEquals,
- assertThrows,
-} from "../../testing/asserts.ts";
-import { writeFile, writeFileSync } from "./_fs_writeFile.ts";
-import type { TextEncodings } from "../_utils.ts";
-import * as path from "../../path/mod.ts";
-
-const moduleDir = path.dirname(path.fromFileUrl(import.meta.url));
-const testDataDir = path.resolve(moduleDir, "testdata");
-const decoder = new TextDecoder("utf-8");
-
-Deno.test("Callback must be a function error", function fn() {
- assertThrows(
- () => {
- writeFile("some/path", "some data", "utf8");
- },
- TypeError,
- "Callback must be a function.",
- );
-});
-
-Deno.test("Invalid encoding results in error()", function testEncodingErrors() {
- assertThrows(
- () => {
- // @ts-expect-error Type '"made-up-encoding"' is not assignable to type
- writeFile("some/path", "some data", "made-up-encoding", () => {});
- },
- Error,
- `The value "made-up-encoding" is invalid for option "encoding"`,
- );
-
- assertThrows(
- () => {
- // @ts-expect-error Type '"made-up-encoding"' is not assignable to type
- writeFileSync("some/path", "some data", "made-up-encoding");
- },
- Error,
- `The value "made-up-encoding" is invalid for option "encoding"`,
- );
-
- assertThrows(
- () => {
- writeFile(
- "some/path",
- "some data",
- {
- // @ts-expect-error Type '"made-up-encoding"' is not assignable to type
- encoding: "made-up-encoding",
- },
- () => {},
- );
- },
- Error,
- `The value "made-up-encoding" is invalid for option "encoding"`,
- );
-
- assertThrows(
- () => {
- writeFileSync("some/path", "some data", {
- // @ts-expect-error Type '"made-up-encoding"' is not assignable to type
- encoding: "made-up-encoding",
- });
- },
- Error,
- `The value "made-up-encoding" is invalid for option "encoding"`,
- );
-});
-
-Deno.test(
- "Unsupported encoding results in error()",
- function testUnsupportedEncoding() {
- assertThrows(
- () => {
- writeFile("some/path", "some data", "utf16le", () => {});
- },
- Error,
- `Not implemented: "utf16le" encoding`,
- );
-
- assertThrows(
- () => {
- writeFileSync("some/path", "some data", "utf16le");
- },
- Error,
- `Not implemented: "utf16le" encoding`,
- );
- },
-);
-
-Deno.test(
- "Data is written to correct rid",
- async function testCorrectWriteUsingRid() {
- const tempFile: string = await Deno.makeTempFile();
- const file: Deno.File = await Deno.open(tempFile, {
- create: true,
- write: true,
- read: true,
- });
-
- await new Promise<void>((resolve, reject) => {
- writeFile(file.rid, "hello world", (err) => {
- if (err) return reject(err);
- resolve();
- });
- });
- Deno.close(file.rid);
-
- const data = await Deno.readFile(tempFile);
- await Deno.remove(tempFile);
- assertEquals(decoder.decode(data), "hello world");
- },
-);
-
-Deno.test(
- "Data is written to correct file",
- async function testCorrectWriteUsingPath() {
- const res = await new Promise((resolve) => {
- writeFile("_fs_writeFile_test_file.txt", "hello world", resolve);
- });
-
- const data = await Deno.readFile("_fs_writeFile_test_file.txt");
- await Deno.remove("_fs_writeFile_test_file.txt");
- assertEquals(res, null);
- assertEquals(decoder.decode(data), "hello world");
- },
-);
-
-Deno.test(
- "Data is written to correct file encodings",
- async function testCorrectWriteUsingDifferentEncodings() {
- const encodings = [
- ["hex", "68656c6c6f20776f726c64"],
- ["HEX", "68656c6c6f20776f726c64"],
- ["base64", "aGVsbG8gd29ybGQ="],
- ["BASE64", "aGVsbG8gd29ybGQ="],
- ["utf8", "hello world"],
- ["utf-8", "hello world"],
- ];
-
- for (const [encoding, value] of encodings) {
- const res = await new Promise((resolve) => {
- writeFile(
- "_fs_writeFile_test_file.txt",
- value,
- encoding as TextEncodings,
- resolve,
- );
- });
-
- const data = await Deno.readFile("_fs_writeFile_test_file.txt");
- await Deno.remove("_fs_writeFile_test_file.txt");
- assertEquals(res, null);
- assertEquals(decoder.decode(data), "hello world");
- }
- },
-);
-
-Deno.test("Path can be an URL", async function testCorrectWriteUsingURL() {
- const url = new URL(
- Deno.build.os === "windows"
- ? "file:///" +
- path
- .join(testDataDir, "_fs_writeFile_test_file_url.txt")
- .replace(/\\/g, "/")
- : "file://" + path.join(testDataDir, "_fs_writeFile_test_file_url.txt"),
- );
- const filePath = path.fromFileUrl(url);
- const res = await new Promise((resolve) => {
- writeFile(url, "hello world", resolve);
- });
- assert(res === null);
-
- const data = await Deno.readFile(filePath);
- await Deno.remove(filePath);
- assertEquals(res, null);
- assertEquals(decoder.decode(data), "hello world");
-});
-
-Deno.test("Mode is correctly set", async function testCorrectFileMode() {
- if (Deno.build.os === "windows") return;
- const filename = "_fs_writeFile_test_file.txt";
-
- const res = await new Promise((resolve) => {
- writeFile(filename, "hello world", { mode: 0o777 }, resolve);
- });
-
- const fileInfo = await Deno.stat(filename);
- await Deno.remove(filename);
- assertEquals(res, null);
- assert(fileInfo && fileInfo.mode);
- assertEquals(fileInfo.mode & 0o777, 0o777);
-});
-
-Deno.test(
- "Mode is not set when rid is passed",
- async function testCorrectFileModeRid() {
- if (Deno.build.os === "windows") return;
-
- const filename: string = await Deno.makeTempFile();
- const file: Deno.File = await Deno.open(filename, {
- create: true,
- write: true,
- read: true,
- });
-
- await new Promise<void>((resolve, reject) => {
- writeFile(file.rid, "hello world", { mode: 0o777 }, (err) => {
- if (err) return reject(err);
- resolve();
- });
- });
- Deno.close(file.rid);
-
- const fileInfo = await Deno.stat(filename);
- await Deno.remove(filename);
- assert(fileInfo.mode);
- assertNotEquals(fileInfo.mode & 0o777, 0o777);
- },
-);
-
-Deno.test(
- "Data is written synchronously to correct rid",
- function testCorrectWriteSyncUsingRid() {
- const tempFile: string = Deno.makeTempFileSync();
- const file: Deno.File = Deno.openSync(tempFile, {
- create: true,
- write: true,
- read: true,
- });
-
- writeFileSync(file.rid, "hello world");
- Deno.close(file.rid);
-
- const data = Deno.readFileSync(tempFile);
- Deno.removeSync(tempFile);
- assertEquals(decoder.decode(data), "hello world");
- },
-);
-
-Deno.test(
- "Data is written to correct file encodings",
- function testCorrectWriteSyncUsingDifferentEncodings() {
- const encodings = [
- ["hex", "68656c6c6f20776f726c64"],
- ["HEX", "68656c6c6f20776f726c64"],
- ["base64", "aGVsbG8gd29ybGQ="],
- ["BASE64", "aGVsbG8gd29ybGQ="],
- ["utf8", "hello world"],
- ["utf-8", "hello world"],
- ];
-
- for (const [encoding, value] of encodings) {
- const file = "_fs_writeFileSync_test_file";
- writeFileSync(file, value, encoding as TextEncodings);
-
- const data = Deno.readFileSync(file);
- Deno.removeSync(file);
- assertEquals(decoder.decode(data), "hello world");
- }
- },
-);
-
-Deno.test(
- "Data is written synchronously to correct file",
- function testCorrectWriteSyncUsingPath() {
- const file = "_fs_writeFileSync_test_file";
-
- writeFileSync(file, "hello world");
-
- const data = Deno.readFileSync(file);
- Deno.removeSync(file);
- assertEquals(decoder.decode(data), "hello world");
- },
-);
-
-Deno.test("sync: Path can be an URL", function testCorrectWriteSyncUsingURL() {
- const filePath = path.join(
- testDataDir,
- "_fs_writeFileSync_test_file_url.txt",
- );
- const url = new URL(
- Deno.build.os === "windows"
- ? "file:///" + filePath.replace(/\\/g, "/")
- : "file://" + filePath,
- );
- writeFileSync(url, "hello world");
-
- const data = Deno.readFileSync(filePath);
- Deno.removeSync(filePath);
- assertEquals(decoder.decode(data), "hello world");
-});
-
-Deno.test(
- "Mode is correctly set when writing synchronously",
- function testCorrectFileModeSync() {
- if (Deno.build.os === "windows") return;
- const filename = "_fs_writeFileSync_test_file.txt";
-
- writeFileSync(filename, "hello world", { mode: 0o777 });
-
- const fileInfo = Deno.statSync(filename);
- Deno.removeSync(filename);
- assert(fileInfo && fileInfo.mode);
- assertEquals(fileInfo.mode & 0o777, 0o777);
- },
-);
diff --git a/std/node/_fs/promises/_fs_readFile.ts b/std/node/_fs/promises/_fs_readFile.ts
deleted file mode 100644
index 3067b301f..000000000
--- a/std/node/_fs/promises/_fs_readFile.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import type {
- BinaryOptionsArgument,
- FileOptionsArgument,
- TextOptionsArgument,
-} from "../_fs_common.ts";
-import { readFile as readFileCallback } from "../_fs_readFile.ts";
-
-export function readFile(
- path: string | URL,
- options: TextOptionsArgument,
-): Promise<string>;
-export function readFile(
- path: string | URL,
- options?: BinaryOptionsArgument,
-): Promise<Uint8Array>;
-export function readFile(
- path: string | URL,
- options?: FileOptionsArgument,
-): Promise<string | Uint8Array> {
- return new Promise((resolve, reject) => {
- readFileCallback(path, options, (err, data): void => {
- if (err) return reject(err);
- if (data == null) {
- return reject(new Error("Invalid state: data missing, but no error"));
- }
- resolve(data);
- });
- });
-}
diff --git a/std/node/_fs/promises/_fs_readFile_test.ts b/std/node/_fs/promises/_fs_readFile_test.ts
deleted file mode 100644
index 2810d1773..000000000
--- a/std/node/_fs/promises/_fs_readFile_test.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { readFile } from "./_fs_readFile.ts";
-import * as path from "../../../path/mod.ts";
-import { assert, assertEquals } from "../../../testing/asserts.ts";
-
-const moduleDir = path.dirname(path.fromFileUrl(import.meta.url));
-const testData = path.resolve(moduleDir, "..", "testdata", "hello.txt");
-
-Deno.test("readFileSuccess", async function () {
- const data: Uint8Array = await readFile(testData);
-
- assert(data instanceof Uint8Array);
- assertEquals(new TextDecoder().decode(data), "hello world");
-});
-
-Deno.test("readFileBinarySuccess", async function () {
- const data: Uint8Array = await readFile(testData, "binary");
-
- assert(data instanceof Uint8Array);
- assertEquals(new TextDecoder().decode(data), "hello world");
-});
-
-Deno.test("readFileBinaryObjectSuccess", async function () {
- const data: Uint8Array = await readFile(testData, { encoding: "binary" });
-
- assert(data instanceof Uint8Array);
- assertEquals(new TextDecoder().decode(data), "hello world");
-});
-
-Deno.test("readFileStringObjectSuccess", async function () {
- const data: string = await readFile(testData, { encoding: "utf8" });
-
- assertEquals(typeof data, "string");
- assertEquals(data, "hello world");
-});
-
-Deno.test("readFileEncodeHexSuccess", async function () {
- const data: string = await readFile(testData, { encoding: "hex" });
- assertEquals(typeof data, "string");
- assertEquals(data as string, "68656c6c6f20776f726c64");
-});
-
-Deno.test("readFileEncodeBase64Success", async function () {
- const data: string = await readFile(testData, { encoding: "base64" });
- assertEquals(typeof data, "string");
- assertEquals(data as string, "aGVsbG8gd29ybGQ=");
-});
-
-Deno.test("readFileStringSuccess", async function () {
- const data: string = await readFile(testData, "utf8");
-
- assertEquals(typeof data, "string");
- assertEquals(data, "hello world");
-});
-
-Deno.test("readFileError", async function () {
- try {
- await readFile("invalid-file", "utf8");
- } catch (e) {
- assert(e instanceof Deno.errors.NotFound);
- }
-});
diff --git a/std/node/_fs/promises/_fs_writeFile.ts b/std/node/_fs/promises/_fs_writeFile.ts
deleted file mode 100644
index 554b65d24..000000000
--- a/std/node/_fs/promises/_fs_writeFile.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import type { WriteFileOptions } from "../_fs_common.ts";
-import type { Encodings } from "../../_utils.ts";
-
-import { writeFile as writeFileCallback } from "../_fs_writeFile.ts";
-
-export function writeFile(
- pathOrRid: string | number | URL,
- data: string | Uint8Array,
- options?: Encodings | WriteFileOptions,
-): Promise<void> {
- return new Promise((resolve, reject) => {
- writeFileCallback(pathOrRid, data, options, (err?: Error | null) => {
- if (err) return reject(err);
- resolve();
- });
- });
-}
diff --git a/std/node/_fs/promises/_fs_writeFile_test.ts b/std/node/_fs/promises/_fs_writeFile_test.ts
deleted file mode 100644
index 644a416ca..000000000
--- a/std/node/_fs/promises/_fs_writeFile_test.ts
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import {
- assert,
- assertEquals,
- assertNotEquals,
- assertThrowsAsync,
-} from "../../../testing/asserts.ts";
-import { writeFile } from "./_fs_writeFile.ts";
-import type { TextEncodings } from "../../_utils.ts";
-
-const decoder = new TextDecoder("utf-8");
-
-Deno.test("Invalid encoding results in error()", function testEncodingErrors() {
- assertThrowsAsync(
- async () => {
- // @ts-expect-error Type '"made-up-encoding"' is not assignable to type
- await writeFile("some/path", "some data", "made-up-encoding");
- },
- Error,
- `The value "made-up-encoding" is invalid for option "encoding"`,
- );
- assertThrowsAsync(
- async () => {
- await writeFile("some/path", "some data", {
- // @ts-expect-error Type '"made-up-encoding"' is not assignable to type
- encoding: "made-up-encoding",
- });
- },
- Error,
- `The value "made-up-encoding" is invalid for option "encoding"`,
- );
-});
-
-Deno.test(
- "Unsupported encoding results in error()",
- function testUnsupportedEncoding() {
- assertThrowsAsync(
- async () => {
- await writeFile("some/path", "some data", "utf16le");
- },
- Error,
- `Not implemented: "utf16le" encoding`,
- );
- },
-);
-
-Deno.test(
- "Data is written to correct rid",
- async function testCorrectWriteUsingRid() {
- const tempFile: string = await Deno.makeTempFile();
- const file: Deno.File = await Deno.open(tempFile, {
- create: true,
- write: true,
- read: true,
- });
-
- await writeFile(file.rid, "hello world");
- Deno.close(file.rid);
-
- const data = await Deno.readFile(tempFile);
- await Deno.remove(tempFile);
- assertEquals(decoder.decode(data), "hello world");
- },
-);
-
-Deno.test(
- "Data is written to correct file",
- async function testCorrectWriteUsingPath() {
- const openResourcesBeforeWrite: Deno.ResourceMap = Deno.resources();
-
- await writeFile("_fs_writeFile_test_file.txt", "hello world");
-
- assertEquals(Deno.resources(), openResourcesBeforeWrite);
- const data = await Deno.readFile("_fs_writeFile_test_file.txt");
- await Deno.remove("_fs_writeFile_test_file.txt");
- assertEquals(decoder.decode(data), "hello world");
- },
-);
-
-Deno.test(
- "Data is written to correct file encodings",
- async function testCorrectWritePromiseUsingDifferentEncodings() {
- const encodings = [
- ["hex", "68656c6c6f20776f726c64"],
- ["HEX", "68656c6c6f20776f726c64"],
- ["base64", "aGVsbG8gd29ybGQ="],
- ["BASE64", "aGVsbG8gd29ybGQ="],
- ["utf8", "hello world"],
- ["utf-8", "hello world"],
- ];
-
- for (const [encoding, value] of encodings) {
- await writeFile(
- "_fs_writeFile_test_file.txt",
- value,
- encoding as TextEncodings,
- );
-
- const data = await Deno.readFile("_fs_writeFile_test_file.txt");
- await Deno.remove("_fs_writeFile_test_file.txt");
- assertEquals(decoder.decode(data), "hello world");
- }
- },
-);
-
-Deno.test("Mode is correctly set", async function testCorrectFileMode() {
- if (Deno.build.os === "windows") return;
- const filename = "_fs_writeFile_test_file.txt";
- await writeFile(filename, "hello world", { mode: 0o777 });
-
- const fileInfo = await Deno.stat(filename);
- await Deno.remove(filename);
- assert(fileInfo && fileInfo.mode);
- assertEquals(fileInfo.mode & 0o777, 0o777);
-});
-
-Deno.test(
- "Mode is not set when rid is passed",
- async function testCorrectFileModeRid() {
- if (Deno.build.os === "windows") return;
-
- const filename: string = await Deno.makeTempFile();
- const file: Deno.File = await Deno.open(filename, {
- create: true,
- write: true,
- read: true,
- });
-
- await writeFile(file.rid, "hello world", { mode: 0o777 });
- Deno.close(file.rid);
-
- const fileInfo = await Deno.stat(filename);
- await Deno.remove(filename);
- assert(fileInfo.mode);
- assertNotEquals(fileInfo.mode & 0o777, 0o777);
- },
-);
diff --git a/std/node/_fs/promises/mod.ts b/std/node/_fs/promises/mod.ts
deleted file mode 100644
index 4cc6462b9..000000000
--- a/std/node/_fs/promises/mod.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { writeFile } from "./_fs_writeFile.ts";
-export { readFile } from "./_fs_readFile.ts";
diff --git a/std/node/_fs/testdata/hello.txt b/std/node/_fs/testdata/hello.txt
deleted file mode 100644
index 95d09f2b1..000000000
--- a/std/node/_fs/testdata/hello.txt
+++ /dev/null
@@ -1 +0,0 @@
-hello world \ No newline at end of file
diff --git a/std/node/_stream/async_iterator.ts b/std/node/_stream/async_iterator.ts
deleted file mode 100644
index 5369ef39c..000000000
--- a/std/node/_stream/async_iterator.ts
+++ /dev/null
@@ -1,243 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import type { Buffer } from "../buffer.ts";
-import finished from "./end_of_stream.ts";
-import Readable from "./readable.ts";
-import type Stream from "./stream.ts";
-import { destroyer } from "./destroy.ts";
-
-const kLastResolve = Symbol("lastResolve");
-const kLastReject = Symbol("lastReject");
-const kError = Symbol("error");
-const kEnded = Symbol("ended");
-const kLastPromise = Symbol("lastPromise");
-const kHandlePromise = Symbol("handlePromise");
-const kStream = Symbol("stream");
-
-// TODO(Soremwar)
-// Add Duplex streams
-type IterableStreams = Stream | Readable;
-
-type IterableItem = Buffer | string | Uint8Array | undefined;
-type ReadableIteratorResult = IteratorResult<IterableItem>;
-
-function initIteratorSymbols(
- o: ReadableStreamAsyncIterator,
- symbols: symbol[],
-) {
- const properties: PropertyDescriptorMap = {};
- for (const sym in symbols) {
- properties[sym] = {
- configurable: false,
- enumerable: false,
- writable: true,
- };
- }
- Object.defineProperties(o, properties);
-}
-
-function createIterResult(
- value: IterableItem,
- done: boolean,
-): ReadableIteratorResult {
- return { value, done };
-}
-
-function readAndResolve(iter: ReadableStreamAsyncIterator) {
- const resolve = iter[kLastResolve];
- if (resolve !== null) {
- const data = iter[kStream].read();
- if (data !== null) {
- iter[kLastPromise] = null;
- iter[kLastResolve] = null;
- iter[kLastReject] = null;
- resolve(createIterResult(data, false));
- }
- }
-}
-
-function onReadable(iter: ReadableStreamAsyncIterator) {
- queueMicrotask(() => readAndResolve(iter));
-}
-
-function wrapForNext(
- lastPromise: Promise<ReadableIteratorResult>,
- iter: ReadableStreamAsyncIterator,
-) {
- return (
- resolve: (value: ReadableIteratorResult) => void,
- reject: (error: Error) => void,
- ) => {
- lastPromise.then(() => {
- if (iter[kEnded]) {
- resolve(createIterResult(undefined, true));
- return;
- }
-
- iter[kHandlePromise](resolve, reject);
- }, reject);
- };
-}
-
-function finish(self: ReadableStreamAsyncIterator, err?: Error) {
- return new Promise(
- (
- resolve: (result: ReadableIteratorResult) => void,
- reject: (error: Error) => void,
- ) => {
- const stream = self[kStream];
-
- finished(stream, (err) => {
- if (err && err.code !== "ERR_STREAM_PREMATURE_CLOSE") {
- reject(err);
- } else {
- resolve(createIterResult(undefined, true));
- }
- });
- destroyer(stream, err);
- },
- );
-}
-
-const AsyncIteratorPrototype = Object.getPrototypeOf(
- Object.getPrototypeOf(async function* () {}).prototype,
-);
-
-export class ReadableStreamAsyncIterator
- implements AsyncIterableIterator<IterableItem> {
- [kEnded]: boolean;
- [kError]: Error | null = null;
- [kHandlePromise] = (
- resolve: (value: ReadableIteratorResult) => void,
- reject: (value: Error) => void,
- ) => {
- const data = this[kStream].read();
- if (data) {
- this[kLastPromise] = null;
- this[kLastResolve] = null;
- this[kLastReject] = null;
- resolve(createIterResult(data, false));
- } else {
- this[kLastResolve] = resolve;
- this[kLastReject] = reject;
- }
- };
- [kLastPromise]: null | Promise<ReadableIteratorResult>;
- [kLastReject]: null | ((value: Error) => void) = null;
- [kLastResolve]: null | ((value: ReadableIteratorResult) => void) = null;
- [kStream]: Readable;
- [Symbol.asyncIterator] = AsyncIteratorPrototype[Symbol.asyncIterator];
-
- constructor(stream: Readable) {
- this[kEnded] = stream.readableEnded || stream._readableState.endEmitted;
- this[kStream] = stream;
- initIteratorSymbols(this, [
- kEnded,
- kError,
- kHandlePromise,
- kLastPromise,
- kLastReject,
- kLastResolve,
- kStream,
- ]);
- }
-
- get stream() {
- return this[kStream];
- }
-
- next(): Promise<ReadableIteratorResult> {
- const error = this[kError];
- if (error !== null) {
- return Promise.reject(error);
- }
-
- if (this[kEnded]) {
- return Promise.resolve(createIterResult(undefined, true));
- }
-
- if (this[kStream].destroyed) {
- return new Promise((resolve, reject) => {
- if (this[kError]) {
- reject(this[kError]);
- } else if (this[kEnded]) {
- resolve(createIterResult(undefined, true));
- } else {
- finished(this[kStream], (err) => {
- if (err && err.code !== "ERR_STREAM_PREMATURE_CLOSE") {
- reject(err);
- } else {
- resolve(createIterResult(undefined, true));
- }
- });
- }
- });
- }
-
- const lastPromise = this[kLastPromise];
- let promise;
-
- if (lastPromise) {
- promise = new Promise(wrapForNext(lastPromise, this));
- } else {
- const data = this[kStream].read();
- if (data !== null) {
- return Promise.resolve(createIterResult(data, false));
- }
-
- promise = new Promise(this[kHandlePromise]);
- }
-
- this[kLastPromise] = promise;
-
- return promise;
- }
-
- return(): Promise<ReadableIteratorResult> {
- return finish(this);
- }
-
- throw(err: Error): Promise<ReadableIteratorResult> {
- return finish(this, err);
- }
-}
-
-const createReadableStreamAsyncIterator = (stream: IterableStreams) => {
- // deno-lint-ignore no-explicit-any
- if (typeof (stream as any).read !== "function") {
- const src = stream;
- stream = new Readable({ objectMode: true }).wrap(src);
- finished(stream, (err) => destroyer(src, err));
- }
-
- const iterator = new ReadableStreamAsyncIterator(stream as Readable);
- iterator[kLastPromise] = null;
-
- finished(stream, { writable: false }, (err) => {
- if (err && err.code !== "ERR_STREAM_PREMATURE_CLOSE") {
- const reject = iterator[kLastReject];
- if (reject !== null) {
- iterator[kLastPromise] = null;
- iterator[kLastResolve] = null;
- iterator[kLastReject] = null;
- reject(err);
- }
- iterator[kError] = err;
- return;
- }
-
- const resolve = iterator[kLastResolve];
- if (resolve !== null) {
- iterator[kLastPromise] = null;
- iterator[kLastResolve] = null;
- iterator[kLastReject] = null;
- resolve(createIterResult(undefined, true));
- }
- iterator[kEnded] = true;
- });
-
- stream.on("readable", onReadable.bind(null, iterator));
-
- return iterator;
-};
-
-export default createReadableStreamAsyncIterator;
diff --git a/std/node/_stream/async_iterator_test.ts b/std/node/_stream/async_iterator_test.ts
deleted file mode 100644
index 17698e0fd..000000000
--- a/std/node/_stream/async_iterator_test.ts
+++ /dev/null
@@ -1,249 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import Readable from "./readable.ts";
-import Stream from "./stream.ts";
-import toReadableAsyncIterator from "./async_iterator.ts";
-import { deferred } from "../../async/mod.ts";
-import { assertEquals, assertThrowsAsync } from "../../testing/asserts.ts";
-
-Deno.test("Stream to async iterator", async () => {
- let destroyExecuted = 0;
- const destroyExecutedExpected = 1;
- const destroyExpectedExecutions = deferred();
-
- class AsyncIteratorStream extends Stream {
- constructor() {
- super();
- }
-
- destroy() {
- destroyExecuted++;
- if (destroyExecuted == destroyExecutedExpected) {
- destroyExpectedExecutions.resolve();
- }
- }
-
- [Symbol.asyncIterator] = Readable.prototype[Symbol.asyncIterator];
- }
-
- const stream = new AsyncIteratorStream();
-
- queueMicrotask(() => {
- stream.emit("data", "hello");
- stream.emit("data", "world");
- stream.emit("end");
- });
-
- let res = "";
-
- for await (const d of stream) {
- res += d;
- }
- assertEquals(res, "helloworld");
-
- const destroyTimeout = setTimeout(
- () => destroyExpectedExecutions.reject(),
- 1000,
- );
- await destroyExpectedExecutions;
- clearTimeout(destroyTimeout);
- assertEquals(destroyExecuted, destroyExecutedExpected);
-});
-
-Deno.test("Stream to async iterator throws on 'error' emitted", async () => {
- let closeExecuted = 0;
- const closeExecutedExpected = 1;
- const closeExpectedExecutions = deferred();
-
- let errorExecuted = 0;
- const errorExecutedExpected = 1;
- const errorExpectedExecutions = deferred();
-
- class StreamImplementation extends Stream {
- close() {
- closeExecuted++;
- if (closeExecuted == closeExecutedExpected) {
- closeExpectedExecutions.resolve();
- }
- }
- }
-
- const stream = new StreamImplementation();
- queueMicrotask(() => {
- stream.emit("data", 0);
- stream.emit("data", 1);
- stream.emit("error", new Error("asd"));
- });
-
- toReadableAsyncIterator(stream)
- .next()
- .catch((err) => {
- errorExecuted++;
- if (errorExecuted == errorExecutedExpected) {
- errorExpectedExecutions.resolve();
- }
- assertEquals(err.message, "asd");
- });
-
- const closeTimeout = setTimeout(
- () => closeExpectedExecutions.reject(),
- 1000,
- );
- const errorTimeout = setTimeout(
- () => errorExpectedExecutions.reject(),
- 1000,
- );
- await closeExpectedExecutions;
- await errorExpectedExecutions;
- clearTimeout(closeTimeout);
- clearTimeout(errorTimeout);
- assertEquals(closeExecuted, closeExecutedExpected);
- assertEquals(errorExecuted, errorExecutedExpected);
-});
-
-Deno.test("Async iterator matches values of Readable", async () => {
- const readable = new Readable({
- objectMode: true,
- read() {},
- });
- readable.push(0);
- readable.push(1);
- readable.push(null);
-
- const iter = readable[Symbol.asyncIterator]();
-
- assertEquals(
- await iter.next().then(({ value }) => value),
- 0,
- );
- for await (const d of iter) {
- assertEquals(d, 1);
- }
-});
-
-Deno.test("Async iterator throws on Readable destroyed sync", async () => {
- const message = "kaboom from read";
-
- const readable = new Readable({
- objectMode: true,
- read() {
- this.destroy(new Error(message));
- },
- });
-
- await assertThrowsAsync(
- async () => {
- // deno-lint-ignore no-empty
- for await (const k of readable) {}
- },
- Error,
- message,
- );
-});
-
-Deno.test("Async iterator throws on Readable destroyed async", async () => {
- const message = "kaboom";
- const readable = new Readable({
- read() {},
- });
- const iterator = readable[Symbol.asyncIterator]();
-
- readable.destroy(new Error(message));
-
- await assertThrowsAsync(
- iterator.next.bind(iterator),
- Error,
- message,
- );
-});
-
-Deno.test("Async iterator finishes the iterator when Readable destroyed", async () => {
- const readable = new Readable({
- read() {},
- });
-
- readable.destroy();
-
- const { done } = await readable[Symbol.asyncIterator]().next();
- assertEquals(done, true);
-});
-
-Deno.test("Async iterator finishes all item promises when Readable destroyed", async () => {
- const r = new Readable({
- objectMode: true,
- read() {
- },
- });
-
- const b = r[Symbol.asyncIterator]();
- const c = b.next();
- const d = b.next();
- r.destroy();
- assertEquals(await c, { done: true, value: undefined });
- assertEquals(await d, { done: true, value: undefined });
-});
-
-Deno.test("Async iterator: 'next' is triggered by Readable push", async () => {
- const max = 42;
- let readed = 0;
- let received = 0;
- const readable = new Readable({
- objectMode: true,
- read() {
- this.push("hello");
- if (++readed === max) {
- this.push(null);
- }
- },
- });
-
- for await (const k of readable) {
- received++;
- assertEquals(k, "hello");
- }
-
- assertEquals(readed, received);
-});
-
-Deno.test("Async iterator: 'close' called on forced iteration end", async () => {
- let closeExecuted = 0;
- const closeExecutedExpected = 1;
- const closeExpectedExecutions = deferred();
-
- class IndestructibleReadable extends Readable {
- constructor() {
- super({
- autoDestroy: false,
- read() {},
- });
- }
-
- close() {
- closeExecuted++;
- if (closeExecuted == closeExecutedExpected) {
- closeExpectedExecutions.resolve();
- }
- readable.emit("close");
- }
-
- // deno-lint-ignore ban-ts-comment
- //@ts-ignore
- destroy = null;
- }
-
- const readable = new IndestructibleReadable();
- readable.push("asd");
- readable.push("asd");
-
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- for await (const d of readable) {
- break;
- }
-
- const closeTimeout = setTimeout(
- () => closeExpectedExecutions.reject(),
- 1000,
- );
- await closeExpectedExecutions;
- clearTimeout(closeTimeout);
- assertEquals(closeExecuted, closeExecutedExpected);
-});
diff --git a/std/node/_stream/buffer_list.ts b/std/node/_stream/buffer_list.ts
deleted file mode 100644
index fe1a693c0..000000000
--- a/std/node/_stream/buffer_list.ts
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { Buffer } from "../buffer.ts";
-
-type BufferListItem = {
- data: Buffer | string | Uint8Array;
- next: BufferListItem | null;
-};
-
-export default class BufferList {
- head: BufferListItem | null = null;
- tail: BufferListItem | null = null;
- length: number;
-
- constructor() {
- this.head = null;
- this.tail = null;
- this.length = 0;
- }
-
- push(v: Buffer | string | Uint8Array) {
- const entry = { data: v, next: null };
- if (this.length > 0) {
- (this.tail as BufferListItem).next = entry;
- } else {
- this.head = entry;
- }
- this.tail = entry;
- ++this.length;
- }
-
- unshift(v: Buffer | string | Uint8Array) {
- const entry = { data: v, next: this.head };
- if (this.length === 0) {
- this.tail = entry;
- }
- this.head = entry;
- ++this.length;
- }
-
- shift() {
- if (this.length === 0) {
- return;
- }
- const ret = (this.head as BufferListItem).data;
- if (this.length === 1) {
- this.head = this.tail = null;
- } else {
- this.head = (this.head as BufferListItem).next;
- }
- --this.length;
- return ret;
- }
-
- clear() {
- this.head = this.tail = null;
- this.length = 0;
- }
-
- join(s: string) {
- if (this.length === 0) {
- return "";
- }
- let p: BufferListItem | null = (this.head as BufferListItem);
- let ret = "" + p.data;
- p = p.next;
- while (p) {
- ret += s + p.data;
- p = p.next;
- }
- return ret;
- }
-
- concat(n: number) {
- if (this.length === 0) {
- return Buffer.alloc(0);
- }
- const ret = Buffer.allocUnsafe(n >>> 0);
- let p = this.head;
- let i = 0;
- while (p) {
- ret.set(p.data as Buffer, i);
- i += p.data.length;
- p = p.next;
- }
- return ret;
- }
-
- // Consumes a specified amount of bytes or characters from the buffered data.
- consume(n: number, hasStrings: boolean) {
- const data = (this.head as BufferListItem).data;
- if (n < data.length) {
- // `slice` is the same for buffers and strings.
- const slice = data.slice(0, n);
- (this.head as BufferListItem).data = data.slice(n);
- return slice;
- }
- if (n === data.length) {
- // First chunk is a perfect match.
- return this.shift();
- }
- // Result spans more than one buffer.
- return hasStrings ? this._getString(n) : this._getBuffer(n);
- }
-
- first() {
- return (this.head as BufferListItem).data;
- }
-
- *[Symbol.iterator]() {
- for (let p = this.head; p; p = p.next) {
- yield p.data;
- }
- }
-
- // Consumes a specified amount of characters from the buffered data.
- _getString(n: number) {
- let ret = "";
- let p: BufferListItem | null = (this.head as BufferListItem);
- let c = 0;
- p = p.next as BufferListItem;
- do {
- const str = p.data;
- if (n > str.length) {
- ret += str;
- n -= str.length;
- } else {
- if (n === str.length) {
- ret += str;
- ++c;
- if (p.next) {
- this.head = p.next;
- } else {
- this.head = this.tail = null;
- }
- } else {
- ret += str.slice(0, n);
- this.head = p;
- p.data = str.slice(n);
- }
- break;
- }
- ++c;
- p = p.next;
- } while (p);
- this.length -= c;
- return ret;
- }
-
- // Consumes a specified amount of bytes from the buffered data.
- _getBuffer(n: number) {
- const ret = Buffer.allocUnsafe(n);
- const retLen = n;
- let p: BufferListItem | null = (this.head as BufferListItem);
- let c = 0;
- p = p.next as BufferListItem;
- do {
- const buf = p.data as Buffer;
- if (n > buf.length) {
- ret.set(buf, retLen - n);
- n -= buf.length;
- } else {
- if (n === buf.length) {
- ret.set(buf, retLen - n);
- ++c;
- if (p.next) {
- this.head = p.next;
- } else {
- this.head = this.tail = null;
- }
- } else {
- ret.set(new Uint8Array(buf.buffer, buf.byteOffset, n), retLen - n);
- this.head = p;
- p.data = buf.slice(n);
- }
- break;
- }
- ++c;
- p = p.next;
- } while (p);
- this.length -= c;
- return ret;
- }
-}
diff --git a/std/node/_stream/destroy.ts b/std/node/_stream/destroy.ts
deleted file mode 100644
index d13e12de2..000000000
--- a/std/node/_stream/destroy.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import type Duplex from "./duplex.ts";
-import type Readable from "./readable.ts";
-import type Stream from "./stream.ts";
-import type Writable from "./writable.ts";
-
-//This whole module acts as a 'normalizer'
-//Idea behind it is you can pass any kind of streams and functions will execute anyways
-
-//TODO(Soremwar)
-//Should be any implementation of stream
-//This is a guard to check executed methods exist inside the implementation
-type StreamImplementations = Duplex | Readable | Writable;
-
-// TODO(Soremwar)
-// Bring back once requests are implemented
-// function isRequest(stream: any) {
-// return stream && stream.setHeader && typeof stream.abort === "function";
-// }
-
-export function destroyer(stream: Stream, err?: Error | null) {
- // TODO(Soremwar)
- // Bring back once requests are implemented
- // if (isRequest(stream)) return stream.abort();
- // if (isRequest(stream.req)) return stream.req.abort();
- if (
- typeof (stream as StreamImplementations).destroy === "function"
- ) {
- return (stream as StreamImplementations).destroy(err);
- }
- // A test of async iterator mocks an upcoming implementation of stream
- // his is casted to any in the meanwhile
- // deno-lint-ignore no-explicit-any
- if (typeof (stream as any).close === "function") {
- // deno-lint-ignore no-explicit-any
- return (stream as any).close();
- }
-}
diff --git a/std/node/_stream/duplex.ts b/std/node/_stream/duplex.ts
deleted file mode 100644
index b5c429f0a..000000000
--- a/std/node/_stream/duplex.ts
+++ /dev/null
@@ -1,682 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { captureRejectionSymbol } from "../events.ts";
-import Readable, { ReadableState } from "./readable.ts";
-import Stream from "./stream.ts";
-import Writable, { WritableState } from "./writable.ts";
-import { Buffer } from "../buffer.ts";
-import {
- ERR_STREAM_ALREADY_FINISHED,
- ERR_STREAM_DESTROYED,
- ERR_UNKNOWN_ENCODING,
-} from "../_errors.ts";
-import type { Encodings } from "../_utils.ts";
-import createReadableStreamAsyncIterator from "./async_iterator.ts";
-import type { ReadableStreamAsyncIterator } from "./async_iterator.ts";
-import {
- _destroy,
- computeNewHighWaterMark,
- emitReadable,
- fromList,
- howMuchToRead,
- nReadingNextTick,
- updateReadableListening,
-} from "./readable_internal.ts";
-import { kOnFinished, writeV } from "./writable_internal.ts";
-import {
- endDuplex,
- finishMaybe,
- onwrite,
- readableAddChunk,
-} from "./duplex_internal.ts";
-export { errorOrDestroy } from "./duplex_internal.ts";
-
-export interface DuplexOptions {
- allowHalfOpen?: boolean;
- autoDestroy?: boolean;
- decodeStrings?: boolean;
- defaultEncoding?: Encodings;
- destroy?(
- this: Duplex,
- error: Error | null,
- callback: (error: Error | null) => void,
- ): void;
- emitClose?: boolean;
- encoding?: Encodings;
- final?(this: Duplex, callback: (error?: Error | null) => void): void;
- highWaterMark?: number;
- objectMode?: boolean;
- read?(this: Duplex, size: number): void;
- readable?: boolean;
- readableHighWaterMark?: number;
- readableObjectMode?: boolean;
- writable?: boolean;
- writableCorked?: number;
- writableHighWaterMark?: number;
- writableObjectMode?: boolean;
- write?(
- this: Duplex,
- // deno-lint-ignore no-explicit-any
- chunk: any,
- encoding: Encodings,
- callback: (error?: Error | null) => void,
- ): void;
- writev?: writeV;
-}
-
-interface Duplex extends Readable, Writable {}
-
-/**
- * A duplex is an implementation of a stream that has both Readable and Writable
- * attributes and capabilities
- */
-class Duplex extends Stream {
- allowHalfOpen = true;
- _final?: (
- callback: (error?: Error | null | undefined) => void,
- ) => void;
- _readableState: ReadableState;
- _writableState: WritableState;
- _writev?: writeV | null;
-
- constructor(options?: DuplexOptions) {
- super();
-
- if (options) {
- if (options.allowHalfOpen === false) {
- this.allowHalfOpen = false;
- }
- if (typeof options.destroy === "function") {
- this._destroy = options.destroy;
- }
- if (typeof options.final === "function") {
- this._final = options.final;
- }
- if (typeof options.read === "function") {
- this._read = options.read;
- }
- if (options.readable === false) {
- this.readable = false;
- }
- if (options.writable === false) {
- this.writable = false;
- }
- if (typeof options.write === "function") {
- this._write = options.write;
- }
- if (typeof options.writev === "function") {
- this._writev = options.writev;
- }
- }
-
- const readableOptions = {
- autoDestroy: options?.autoDestroy,
- defaultEncoding: options?.defaultEncoding,
- destroy: options?.destroy as unknown as (
- this: Readable,
- error: Error | null,
- callback: (error: Error | null) => void,
- ) => void,
- emitClose: options?.emitClose,
- encoding: options?.encoding,
- highWaterMark: options?.highWaterMark ?? options?.readableHighWaterMark,
- objectMode: options?.objectMode ?? options?.readableObjectMode,
- read: options?.read as unknown as (this: Readable) => void,
- };
-
- const writableOptions = {
- autoDestroy: options?.autoDestroy,
- decodeStrings: options?.decodeStrings,
- defaultEncoding: options?.defaultEncoding,
- destroy: options?.destroy as unknown as (
- this: Writable,
- error: Error | null,
- callback: (error: Error | null) => void,
- ) => void,
- emitClose: options?.emitClose,
- final: options?.final as unknown as (
- this: Writable,
- callback: (error?: Error | null) => void,
- ) => void,
- highWaterMark: options?.highWaterMark ?? options?.writableHighWaterMark,
- objectMode: options?.objectMode ?? options?.writableObjectMode,
- write: options?.write as unknown as (
- this: Writable,
- // deno-lint-ignore no-explicit-any
- chunk: any,
- encoding: string,
- callback: (error?: Error | null) => void,
- ) => void,
- writev: options?.writev as unknown as (
- this: Writable,
- // deno-lint-ignore no-explicit-any
- chunks: Array<{ chunk: any; encoding: Encodings }>,
- callback: (error?: Error | null) => void,
- ) => void,
- };
-
- this._readableState = new ReadableState(readableOptions);
- this._writableState = new WritableState(
- writableOptions,
- this as unknown as Writable,
- );
- //Very important to override onwrite here, duplex implementation adds a check
- //on the readable side
- this._writableState.onwrite = onwrite.bind(undefined, this);
- }
-
- [captureRejectionSymbol](err?: Error) {
- this.destroy(err);
- }
-
- [Symbol.asyncIterator](): ReadableStreamAsyncIterator {
- return createReadableStreamAsyncIterator(this);
- }
-
- _destroy(
- error: Error | null,
- callback: (error?: Error | null) => void,
- ): void {
- callback(error);
- }
-
- _read = Readable.prototype._read;
-
- _undestroy = Readable.prototype._undestroy;
-
- destroy(err?: Error | null, cb?: (error?: Error | null) => void) {
- const r = this._readableState;
- const w = this._writableState;
-
- if (w.destroyed || r.destroyed) {
- if (typeof cb === "function") {
- cb();
- }
-
- return this;
- }
-
- if (err) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- err.stack;
-
- if (!w.errored) {
- w.errored = err;
- }
- if (!r.errored) {
- r.errored = err;
- }
- }
-
- w.destroyed = true;
- r.destroyed = true;
-
- this._destroy(err || null, (err) => {
- if (err) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- err.stack;
-
- if (!w.errored) {
- w.errored = err;
- }
- if (!r.errored) {
- r.errored = err;
- }
- }
-
- w.closed = true;
- r.closed = true;
-
- if (typeof cb === "function") {
- cb(err);
- }
-
- if (err) {
- queueMicrotask(() => {
- const r = this._readableState;
- const w = this._writableState;
-
- if (!w.errorEmitted && !r.errorEmitted) {
- w.errorEmitted = true;
- r.errorEmitted = true;
-
- this.emit("error", err);
- }
-
- r.closeEmitted = true;
-
- if (w.emitClose || r.emitClose) {
- this.emit("close");
- }
- });
- } else {
- queueMicrotask(() => {
- const r = this._readableState;
- const w = this._writableState;
-
- r.closeEmitted = true;
-
- if (w.emitClose || r.emitClose) {
- this.emit("close");
- }
- });
- }
- });
-
- return this;
- }
-
- isPaused = Readable.prototype.isPaused;
-
- off = this.removeListener;
-
- on(
- event: "close" | "end" | "pause" | "readable" | "resume",
- listener: () => void,
- ): this;
- // deno-lint-ignore no-explicit-any
- on(event: "data", listener: (chunk: any) => void): this;
- on(event: "error", listener: (err: Error) => void): this;
- // deno-lint-ignore no-explicit-any
- on(event: string | symbol, listener: (...args: any[]) => void): this;
- on(
- ev: string | symbol,
- fn:
- | (() => void)
- // deno-lint-ignore no-explicit-any
- | ((chunk: any) => void)
- | ((err: Error) => void)
- // deno-lint-ignore no-explicit-any
- | ((...args: any[]) => void),
- ) {
- const res = super.on.call(this, ev, fn);
- const state = this._readableState;
-
- if (ev === "data") {
- state.readableListening = this.listenerCount("readable") > 0;
-
- if (state.flowing !== false) {
- this.resume();
- }
- } else if (ev === "readable") {
- if (!state.endEmitted && !state.readableListening) {
- state.readableListening = state.needReadable = true;
- state.flowing = false;
- state.emittedReadable = false;
- if (state.length) {
- emitReadable(this);
- } else if (!state.reading) {
- queueMicrotask(() => nReadingNextTick(this));
- }
- }
- }
-
- return res;
- }
-
- pause = Readable.prototype.pause as () => this;
-
- pipe = Readable.prototype.pipe;
-
- // deno-lint-ignore no-explicit-any
- push(chunk: any, encoding?: Encodings): boolean {
- return readableAddChunk(this, chunk, encoding, false);
- }
-
- /** You can override either this method, or the async `_read` method */
- read(n?: number) {
- // Same as parseInt(undefined, 10), however V8 7.3 performance regressed
- // in this scenario, so we are doing it manually.
- if (n === undefined) {
- n = NaN;
- }
- const state = this._readableState;
- const nOrig = n;
-
- if (n > state.highWaterMark) {
- state.highWaterMark = computeNewHighWaterMark(n);
- }
-
- if (n !== 0) {
- state.emittedReadable = false;
- }
-
- if (
- n === 0 &&
- state.needReadable &&
- ((state.highWaterMark !== 0
- ? state.length >= state.highWaterMark
- : state.length > 0) ||
- state.ended)
- ) {
- if (state.length === 0 && state.ended) {
- endDuplex(this);
- } else {
- emitReadable(this);
- }
- return null;
- }
-
- n = howMuchToRead(n, state);
-
- if (n === 0 && state.ended) {
- if (state.length === 0) {
- endDuplex(this);
- }
- return null;
- }
-
- let doRead = state.needReadable;
- if (
- state.length === 0 || state.length - (n as number) < state.highWaterMark
- ) {
- doRead = true;
- }
-
- if (
- state.ended || state.reading || state.destroyed || state.errored ||
- !state.constructed
- ) {
- doRead = false;
- } else if (doRead) {
- state.reading = true;
- state.sync = true;
- if (state.length === 0) {
- state.needReadable = true;
- }
- this._read();
- state.sync = false;
- if (!state.reading) {
- n = howMuchToRead(nOrig, state);
- }
- }
-
- let ret;
- if ((n as number) > 0) {
- ret = fromList((n as number), state);
- } else {
- ret = null;
- }
-
- if (ret === null) {
- state.needReadable = state.length <= state.highWaterMark;
- n = 0;
- } else {
- state.length -= n as number;
- if (state.multiAwaitDrain) {
- (state.awaitDrainWriters as Set<Writable>).clear();
- } else {
- state.awaitDrainWriters = null;
- }
- }
-
- if (state.length === 0) {
- if (!state.ended) {
- state.needReadable = true;
- }
-
- if (nOrig !== n && state.ended) {
- endDuplex(this);
- }
- }
-
- if (ret !== null) {
- this.emit("data", ret);
- }
-
- return ret;
- }
-
- removeAllListeners(
- ev:
- | "close"
- | "data"
- | "end"
- | "error"
- | "pause"
- | "readable"
- | "resume"
- | symbol
- | undefined,
- ) {
- const res = super.removeAllListeners(ev);
-
- if (ev === "readable" || ev === undefined) {
- queueMicrotask(() => updateReadableListening(this));
- }
-
- return res;
- }
-
- removeListener(
- event: "close" | "end" | "pause" | "readable" | "resume",
- listener: () => void,
- ): this;
- // deno-lint-ignore no-explicit-any
- removeListener(event: "data", listener: (chunk: any) => void): this;
- removeListener(event: "error", listener: (err: Error) => void): this;
- removeListener(
- event: string | symbol,
- // deno-lint-ignore no-explicit-any
- listener: (...args: any[]) => void,
- ): this;
- removeListener(
- ev: string | symbol,
- fn:
- | (() => void)
- // deno-lint-ignore no-explicit-any
- | ((chunk: any) => void)
- | ((err: Error) => void)
- // deno-lint-ignore no-explicit-any
- | ((...args: any[]) => void),
- ) {
- const res = super.removeListener.call(this, ev, fn);
-
- if (ev === "readable") {
- queueMicrotask(() => updateReadableListening(this));
- }
-
- return res;
- }
-
- resume = Readable.prototype.resume as () => this;
-
- setEncoding = Readable.prototype.setEncoding as (enc: string) => this;
-
- // deno-lint-ignore no-explicit-any
- unshift(chunk: any, encoding?: Encodings): boolean {
- return readableAddChunk(this, chunk, encoding, true);
- }
-
- unpipe = Readable.prototype.unpipe as (dest?: Writable | undefined) => this;
-
- wrap = Readable.prototype.wrap as (stream: Stream) => this;
-
- get readable(): boolean {
- return this._readableState?.readable &&
- !this._readableState?.destroyed &&
- !this._readableState?.errorEmitted &&
- !this._readableState?.endEmitted;
- }
- set readable(val: boolean) {
- if (this._readableState) {
- this._readableState.readable = val;
- }
- }
-
- get readableHighWaterMark(): number {
- return this._readableState.highWaterMark;
- }
-
- get readableBuffer() {
- return this._readableState && this._readableState.buffer;
- }
-
- get readableFlowing(): boolean | null {
- return this._readableState.flowing;
- }
-
- set readableFlowing(state: boolean | null) {
- if (this._readableState) {
- this._readableState.flowing = state;
- }
- }
-
- get readableLength() {
- return this._readableState.length;
- }
-
- get readableObjectMode() {
- return this._readableState ? this._readableState.objectMode : false;
- }
-
- get readableEncoding() {
- return this._readableState ? this._readableState.encoding : null;
- }
-
- get readableEnded() {
- return this._readableState ? this._readableState.endEmitted : false;
- }
-
- _write = Writable.prototype._write;
-
- write = Writable.prototype.write;
-
- cork = Writable.prototype.cork;
-
- uncork = Writable.prototype.uncork;
-
- setDefaultEncoding(encoding: string) {
- // node::ParseEncoding() requires lower case.
- if (typeof encoding === "string") {
- encoding = encoding.toLowerCase();
- }
- if (!Buffer.isEncoding(encoding)) {
- throw new ERR_UNKNOWN_ENCODING(encoding);
- }
- this._writableState.defaultEncoding = encoding as Encodings;
- return this;
- }
-
- end(cb?: () => void): void;
- // deno-lint-ignore no-explicit-any
- end(chunk: any, cb?: () => void): void;
- // deno-lint-ignore no-explicit-any
- end(chunk: any, encoding: Encodings, cb?: () => void): void;
-
- end(
- // deno-lint-ignore no-explicit-any
- x?: any | (() => void),
- y?: Encodings | (() => void),
- z?: () => void,
- ) {
- const state = this._writableState;
- // deno-lint-ignore no-explicit-any
- let chunk: any | null;
- let encoding: Encodings | null;
- let cb: undefined | ((error?: Error) => void);
-
- if (typeof x === "function") {
- chunk = null;
- encoding = null;
- cb = x;
- } else if (typeof y === "function") {
- chunk = x;
- encoding = null;
- cb = y;
- } else {
- chunk = x;
- encoding = y as Encodings;
- cb = z;
- }
-
- if (chunk !== null && chunk !== undefined) {
- this.write(chunk, encoding);
- }
-
- if (state.corked) {
- state.corked = 1;
- this.uncork();
- }
-
- let err: Error | undefined;
- if (!state.errored && !state.ending) {
- state.ending = true;
- finishMaybe(this, state, true);
- state.ended = true;
- } else if (state.finished) {
- err = new ERR_STREAM_ALREADY_FINISHED("end");
- } else if (state.destroyed) {
- err = new ERR_STREAM_DESTROYED("end");
- }
-
- if (typeof cb === "function") {
- if (err || state.finished) {
- queueMicrotask(() => {
- (cb as (error?: Error | undefined) => void)(err);
- });
- } else {
- state[kOnFinished].push(cb);
- }
- }
-
- return this;
- }
-
- get destroyed() {
- if (
- this._readableState === undefined ||
- this._writableState === undefined
- ) {
- return false;
- }
- return this._readableState.destroyed && this._writableState.destroyed;
- }
-
- set destroyed(value: boolean) {
- if (this._readableState && this._writableState) {
- this._readableState.destroyed = value;
- this._writableState.destroyed = value;
- }
- }
-
- get writable() {
- const w = this._writableState;
- return !w.destroyed && !w.errored && !w.ending && !w.ended;
- }
-
- set writable(val) {
- if (this._writableState) {
- this._writableState.writable = !!val;
- }
- }
-
- get writableFinished() {
- return this._writableState ? this._writableState.finished : false;
- }
-
- get writableObjectMode() {
- return this._writableState ? this._writableState.objectMode : false;
- }
-
- get writableBuffer() {
- return this._writableState && this._writableState.getBuffer();
- }
-
- get writableEnded() {
- return this._writableState ? this._writableState.ending : false;
- }
-
- get writableHighWaterMark() {
- return this._writableState && this._writableState.highWaterMark;
- }
-
- get writableCorked() {
- return this._writableState ? this._writableState.corked : 0;
- }
-
- get writableLength() {
- return this._writableState && this._writableState.length;
- }
-}
-
-export default Duplex;
diff --git a/std/node/_stream/duplex_internal.ts b/std/node/_stream/duplex_internal.ts
deleted file mode 100644
index bfd9749f8..000000000
--- a/std/node/_stream/duplex_internal.ts
+++ /dev/null
@@ -1,296 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import type { ReadableState } from "./readable.ts";
-import { addChunk, maybeReadMore, onEofChunk } from "./readable_internal.ts";
-import type Writable from "./writable.ts";
-import type { WritableState } from "./writable.ts";
-import {
- afterWrite,
- AfterWriteTick,
- afterWriteTick,
- clearBuffer,
- errorBuffer,
- kOnFinished,
- needFinish,
- prefinish,
-} from "./writable_internal.ts";
-import { Buffer } from "../buffer.ts";
-import type Duplex from "./duplex.ts";
-import {
- ERR_MULTIPLE_CALLBACK,
- ERR_STREAM_PUSH_AFTER_EOF,
- ERR_STREAM_UNSHIFT_AFTER_END_EVENT,
-} from "../_errors.ts";
-
-export function endDuplex(stream: Duplex) {
- const state = stream._readableState;
-
- if (!state.endEmitted) {
- state.ended = true;
- queueMicrotask(() => endReadableNT(state, stream));
- }
-}
-
-function endReadableNT(state: ReadableState, stream: Duplex) {
- // Check that we didn't get one last unshift.
- if (
- !state.errorEmitted && !state.closeEmitted &&
- !state.endEmitted && state.length === 0
- ) {
- state.endEmitted = true;
- stream.emit("end");
-
- if (stream.writable && stream.allowHalfOpen === false) {
- queueMicrotask(() => endWritableNT(state, stream));
- } else if (state.autoDestroy) {
- // In case of duplex streams we need a way to detect
- // if the writable side is ready for autoDestroy as well.
- const wState = stream._writableState;
- const autoDestroy = !wState || (
- wState.autoDestroy &&
- // We don't expect the writable to ever 'finish'
- // if writable is explicitly set to false.
- (wState.finished || wState.writable === false)
- );
-
- if (autoDestroy) {
- stream.destroy();
- }
- }
- }
-}
-
-function endWritableNT(state: ReadableState, stream: Duplex) {
- const writable = stream.writable &&
- !stream.writableEnded &&
- !stream.destroyed;
- if (writable) {
- stream.end();
- }
-}
-
-export function errorOrDestroy(
- // deno-lint-ignore no-explicit-any
- this: any,
- stream: Duplex,
- err: Error,
- sync = false,
-) {
- const r = stream._readableState;
- const w = stream._writableState;
-
- if (w.destroyed || r.destroyed) {
- return this;
- }
-
- if (r.autoDestroy || w.autoDestroy) {
- stream.destroy(err);
- } else if (err) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- err.stack;
-
- if (w && !w.errored) {
- w.errored = err;
- }
- if (r && !r.errored) {
- r.errored = err;
- }
-
- if (sync) {
- queueMicrotask(() => {
- if (w.errorEmitted || r.errorEmitted) {
- return;
- }
-
- w.errorEmitted = true;
- r.errorEmitted = true;
-
- stream.emit("error", err);
- });
- } else {
- if (w.errorEmitted || r.errorEmitted) {
- return;
- }
-
- w.errorEmitted = true;
- r.errorEmitted = true;
-
- stream.emit("error", err);
- }
- }
-}
-
-function finish(stream: Duplex, state: WritableState) {
- state.pendingcb--;
- if (state.errorEmitted || state.closeEmitted) {
- return;
- }
-
- state.finished = true;
-
- for (const callback of state[kOnFinished].splice(0)) {
- callback();
- }
-
- stream.emit("finish");
-
- if (state.autoDestroy) {
- stream.destroy();
- }
-}
-
-export function finishMaybe(
- stream: Duplex,
- state: WritableState,
- sync?: boolean,
-) {
- if (needFinish(state)) {
- prefinish(stream as Writable, state);
- if (state.pendingcb === 0 && needFinish(state)) {
- state.pendingcb++;
- if (sync) {
- queueMicrotask(() => finish(stream, state));
- } else {
- finish(stream, state);
- }
- }
- }
-}
-
-export function onwrite(stream: Duplex, er?: Error | null) {
- const state = stream._writableState;
- const sync = state.sync;
- const cb = state.writecb;
-
- if (typeof cb !== "function") {
- errorOrDestroy(stream, new ERR_MULTIPLE_CALLBACK());
- return;
- }
-
- state.writing = false;
- state.writecb = null;
- state.length -= state.writelen;
- state.writelen = 0;
-
- if (er) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- er.stack;
-
- if (!state.errored) {
- state.errored = er;
- }
-
- if (stream._readableState && !stream._readableState.errored) {
- stream._readableState.errored = er;
- }
-
- if (sync) {
- queueMicrotask(() => onwriteError(stream, state, er, cb));
- } else {
- onwriteError(stream, state, er, cb);
- }
- } else {
- if (state.buffered.length > state.bufferedIndex) {
- clearBuffer(stream, state);
- }
-
- if (sync) {
- if (
- state.afterWriteTickInfo !== null &&
- state.afterWriteTickInfo.cb === cb
- ) {
- state.afterWriteTickInfo.count++;
- } else {
- state.afterWriteTickInfo = {
- count: 1,
- cb: (cb as (error?: Error) => void),
- stream: stream as Writable,
- state,
- };
- queueMicrotask(() =>
- afterWriteTick(state.afterWriteTickInfo as AfterWriteTick)
- );
- }
- } else {
- afterWrite(stream as Writable, state, 1, cb as (error?: Error) => void);
- }
- }
-}
-
-function onwriteError(
- stream: Duplex,
- state: WritableState,
- er: Error,
- cb: (error: Error) => void,
-) {
- --state.pendingcb;
-
- cb(er);
- errorBuffer(state);
- errorOrDestroy(stream, er);
-}
-
-export function readableAddChunk(
- stream: Duplex,
- chunk: string | Buffer | Uint8Array | null,
- encoding: undefined | string = undefined,
- addToFront: boolean,
-) {
- const state = stream._readableState;
- let usedEncoding = encoding;
-
- let err;
- if (!state.objectMode) {
- if (typeof chunk === "string") {
- usedEncoding = encoding || state.defaultEncoding;
- if (state.encoding !== usedEncoding) {
- if (addToFront && state.encoding) {
- chunk = Buffer.from(chunk, usedEncoding).toString(state.encoding);
- } else {
- chunk = Buffer.from(chunk, usedEncoding);
- usedEncoding = "";
- }
- }
- } else if (chunk instanceof Uint8Array) {
- chunk = Buffer.from(chunk);
- }
- }
-
- if (err) {
- errorOrDestroy(stream, err);
- } else if (chunk === null) {
- state.reading = false;
- onEofChunk(stream, state);
- } else if (state.objectMode || (chunk.length > 0)) {
- if (addToFront) {
- if (state.endEmitted) {
- errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());
- } else {
- addChunk(stream, state, chunk, true);
- }
- } else if (state.ended) {
- errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());
- } else if (state.destroyed || state.errored) {
- return false;
- } else {
- state.reading = false;
- if (state.decoder && !usedEncoding) {
- //TODO(Soremwar)
- //I don't think this cast is right
- chunk = state.decoder.write(Buffer.from(chunk as Uint8Array));
- if (state.objectMode || chunk.length !== 0) {
- addChunk(stream, state, chunk, false);
- } else {
- maybeReadMore(stream, state);
- }
- } else {
- addChunk(stream, state, chunk, false);
- }
- }
- } else if (!addToFront) {
- state.reading = false;
- maybeReadMore(stream, state);
- }
-
- return !state.ended &&
- (state.length < state.highWaterMark || state.length === 0);
-}
diff --git a/std/node/_stream/duplex_test.ts b/std/node/_stream/duplex_test.ts
deleted file mode 100644
index 1596ec218..000000000
--- a/std/node/_stream/duplex_test.ts
+++ /dev/null
@@ -1,698 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { Buffer } from "../buffer.ts";
-import Duplex from "./duplex.ts";
-import finished from "./end_of_stream.ts";
-import {
- assert,
- assertEquals,
- assertStrictEquals,
- assertThrows,
-} from "../../testing/asserts.ts";
-import { deferred, delay } from "../../async/mod.ts";
-
-Deno.test("Duplex stream works normally", () => {
- const stream = new Duplex({ objectMode: true });
-
- assert(stream._readableState.objectMode);
- assert(stream._writableState.objectMode);
- assert(stream.allowHalfOpen);
- assertEquals(stream.listenerCount("end"), 0);
-
- let written: { val: number };
- let read: { val: number };
-
- stream._write = (obj, _, cb) => {
- written = obj;
- cb();
- };
-
- stream._read = () => {};
-
- stream.on("data", (obj) => {
- read = obj;
- });
-
- stream.push({ val: 1 });
- stream.end({ val: 2 });
-
- stream.on("finish", () => {
- assertEquals(read.val, 1);
- assertEquals(written.val, 2);
- });
-});
-
-Deno.test("Duplex stream gets constructed correctly", () => {
- const d1 = new Duplex({
- objectMode: true,
- highWaterMark: 100,
- });
-
- assertEquals(d1.readableObjectMode, true);
- assertEquals(d1.readableHighWaterMark, 100);
- assertEquals(d1.writableObjectMode, true);
- assertEquals(d1.writableHighWaterMark, 100);
-
- const d2 = new Duplex({
- readableObjectMode: false,
- readableHighWaterMark: 10,
- writableObjectMode: true,
- writableHighWaterMark: 100,
- });
-
- assertEquals(d2.writableObjectMode, true);
- assertEquals(d2.writableHighWaterMark, 100);
- assertEquals(d2.readableObjectMode, false);
- assertEquals(d2.readableHighWaterMark, 10);
-});
-
-Deno.test("Duplex stream can be paused", () => {
- const readable = new Duplex();
-
- // _read is a noop, here.
- readable._read = () => {};
-
- // Default state of a stream is not "paused"
- assert(!readable.isPaused());
-
- // Make the stream start flowing...
- readable.on("data", () => {});
-
- // still not paused.
- assert(!readable.isPaused());
-
- readable.pause();
- assert(readable.isPaused());
- readable.resume();
- assert(!readable.isPaused());
-});
-
-Deno.test("Duplex stream sets enconding correctly", () => {
- const readable = new Duplex({
- read() {},
- });
-
- readable.setEncoding("utf8");
-
- readable.push(new TextEncoder().encode("DEF"));
- readable.unshift(new TextEncoder().encode("ABC"));
-
- assertStrictEquals(readable.read(), "ABCDEF");
-});
-
-Deno.test("Duplex stream sets encoding correctly", () => {
- const readable = new Duplex({
- read() {},
- });
-
- readable.setEncoding("utf8");
-
- readable.push(new TextEncoder().encode("DEF"));
- readable.unshift(new TextEncoder().encode("ABC"));
-
- assertStrictEquals(readable.read(), "ABCDEF");
-});
-
-Deno.test("Duplex stream holds up a big push", async () => {
- let readExecuted = 0;
- const readExecutedExpected = 3;
- const readExpectedExecutions = deferred();
-
- let endExecuted = 0;
- const endExecutedExpected = 1;
- const endExpectedExecutions = deferred();
-
- const str = "asdfasdfasdfasdfasdf";
-
- const r = new Duplex({
- highWaterMark: 5,
- encoding: "utf8",
- });
-
- let reads = 0;
-
- function _read() {
- if (reads === 0) {
- setTimeout(() => {
- r.push(str);
- }, 1);
- reads++;
- } else if (reads === 1) {
- const ret = r.push(str);
- assertEquals(ret, false);
- reads++;
- } else {
- r.push(null);
- }
- }
-
- r._read = () => {
- readExecuted++;
- if (readExecuted == readExecutedExpected) {
- readExpectedExecutions.resolve();
- }
- _read();
- };
-
- r.on("end", () => {
- endExecuted++;
- if (endExecuted == endExecutedExpected) {
- endExpectedExecutions.resolve();
- }
- });
-
- // Push some data in to start.
- // We've never gotten any read event at this point.
- const ret = r.push(str);
- assert(!ret);
- let chunk = r.read();
- assertEquals(chunk, str);
- chunk = r.read();
- assertEquals(chunk, null);
-
- r.once("readable", () => {
- // This time, we'll get *all* the remaining data, because
- // it's been added synchronously, as the read WOULD take
- // us below the hwm, and so it triggered a _read() again,
- // which synchronously added more, which we then return.
- chunk = r.read();
- assertEquals(chunk, str + str);
-
- chunk = r.read();
- assertEquals(chunk, null);
- });
-
- const readTimeout = setTimeout(
- () => readExpectedExecutions.reject(),
- 1000,
- );
- const endTimeout = setTimeout(
- () => endExpectedExecutions.reject(),
- 1000,
- );
- await readExpectedExecutions;
- await endExpectedExecutions;
- clearTimeout(readTimeout);
- clearTimeout(endTimeout);
- assertEquals(readExecuted, readExecutedExpected);
- assertEquals(endExecuted, endExecutedExpected);
-});
-
-Deno.test("Duplex stream: 'readable' event is emitted but 'read' is not on highWaterMark length exceeded", async () => {
- let readableExecuted = 0;
- const readableExecutedExpected = 1;
- const readableExpectedExecutions = deferred();
-
- const r = new Duplex({
- highWaterMark: 3,
- });
-
- r._read = () => {
- throw new Error("_read must not be called");
- };
- r.push(Buffer.from("blerg"));
-
- setTimeout(function () {
- assert(!r._readableState.reading);
- r.on("readable", () => {
- readableExecuted++;
- if (readableExecuted == readableExecutedExpected) {
- readableExpectedExecutions.resolve();
- }
- });
- }, 1);
-
- const readableTimeout = setTimeout(
- () => readableExpectedExecutions.reject(),
- 1000,
- );
- await readableExpectedExecutions;
- clearTimeout(readableTimeout);
- assertEquals(readableExecuted, readableExecutedExpected);
-});
-
-Deno.test("Duplex stream: 'readable' and 'read' events are emitted on highWaterMark length not reached", async () => {
- let readableExecuted = 0;
- const readableExecutedExpected = 1;
- const readableExpectedExecutions = deferred();
-
- let readExecuted = 0;
- const readExecutedExpected = 1;
- const readExpectedExecutions = deferred();
-
- const r = new Duplex({
- highWaterMark: 3,
- });
-
- r._read = () => {
- readExecuted++;
- if (readExecuted == readExecutedExpected) {
- readExpectedExecutions.resolve();
- }
- };
-
- r.push(Buffer.from("bl"));
-
- setTimeout(function () {
- assert(r._readableState.reading);
- r.on("readable", () => {
- readableExecuted++;
- if (readableExecuted == readableExecutedExpected) {
- readableExpectedExecutions.resolve();
- }
- });
- }, 1);
-
- const readableTimeout = setTimeout(
- () => readableExpectedExecutions.reject(),
- 1000,
- );
- const readTimeout = setTimeout(
- () => readExpectedExecutions.reject(),
- 1000,
- );
- await readableExpectedExecutions;
- await readExpectedExecutions;
- clearTimeout(readableTimeout);
- clearTimeout(readTimeout);
- assertEquals(readableExecuted, readableExecutedExpected);
- assertEquals(readExecuted, readExecutedExpected);
-});
-
-Deno.test("Duplex stream: 'readable' event is emitted but 'read' is not on highWaterMark length not reached and stream ended", async () => {
- let readableExecuted = 0;
- const readableExecutedExpected = 1;
- const readableExpectedExecutions = deferred();
-
- const r = new Duplex({
- highWaterMark: 30,
- });
-
- r._read = () => {
- throw new Error("Must not be executed");
- };
-
- r.push(Buffer.from("blerg"));
- //This ends the stream and triggers end
- r.push(null);
-
- setTimeout(function () {
- // Assert we're testing what we think we are
- assert(!r._readableState.reading);
- r.on("readable", () => {
- readableExecuted++;
- if (readableExecuted == readableExecutedExpected) {
- readableExpectedExecutions.resolve();
- }
- });
- }, 1);
-
- const readableTimeout = setTimeout(
- () => readableExpectedExecutions.reject(),
- 1000,
- );
- await readableExpectedExecutions;
- clearTimeout(readableTimeout);
- assertEquals(readableExecuted, readableExecutedExpected);
-});
-
-Deno.test("Duplex stream: 'read' is emitted on empty string pushed in non-object mode", async () => {
- let endExecuted = 0;
- const endExecutedExpected = 1;
- const endExpectedExecutions = deferred();
-
- const underlyingData = ["", "x", "y", "", "z"];
- const expected = underlyingData.filter((data) => data);
- const result: unknown[] = [];
-
- const r = new Duplex({
- encoding: "utf8",
- });
- r._read = function () {
- queueMicrotask(() => {
- if (!underlyingData.length) {
- this.push(null);
- } else {
- this.push(underlyingData.shift());
- }
- });
- };
-
- r.on("readable", () => {
- const data = r.read();
- if (data !== null) result.push(data);
- });
-
- r.on("end", () => {
- endExecuted++;
- if (endExecuted == endExecutedExpected) {
- endExpectedExecutions.resolve();
- }
- assertEquals(result, expected);
- });
-
- const endTimeout = setTimeout(
- () => endExpectedExecutions.reject(),
- 1000,
- );
- await endExpectedExecutions;
- clearTimeout(endTimeout);
- assertEquals(endExecuted, endExecutedExpected);
-});
-
-Deno.test("Duplex stream: listeners can be removed", () => {
- const r = new Duplex();
- r._read = () => {};
- r.on("data", () => {});
-
- r.removeAllListeners("data");
-
- assertEquals(r.eventNames().length, 0);
-});
-
-Deno.test("Duplex stream writes correctly", async () => {
- let callback: undefined | ((error?: Error | null | undefined) => void);
-
- let writeExecuted = 0;
- const writeExecutedExpected = 1;
- const writeExpectedExecutions = deferred();
-
- let writevExecuted = 0;
- const writevExecutedExpected = 1;
- const writevExpectedExecutions = deferred();
-
- const writable = new Duplex({
- write: (chunk, encoding, cb) => {
- writeExecuted++;
- if (writeExecuted == writeExecutedExpected) {
- writeExpectedExecutions.resolve();
- }
- assert(chunk instanceof Buffer);
- assertStrictEquals(encoding, "buffer");
- assertStrictEquals(String(chunk), "ABC");
- callback = cb;
- },
- writev: (chunks) => {
- writevExecuted++;
- if (writevExecuted == writevExecutedExpected) {
- writevExpectedExecutions.resolve();
- }
- assertStrictEquals(chunks.length, 2);
- assertStrictEquals(chunks[0].encoding, "buffer");
- assertStrictEquals(chunks[1].encoding, "buffer");
- assertStrictEquals(chunks[0].chunk + chunks[1].chunk, "DEFGHI");
- },
- });
-
- writable.write(new TextEncoder().encode("ABC"));
- writable.write(new TextEncoder().encode("DEF"));
- writable.end(new TextEncoder().encode("GHI"));
- callback?.();
-
- const writeTimeout = setTimeout(
- () => writeExpectedExecutions.reject(),
- 1000,
- );
- const writevTimeout = setTimeout(
- () => writevExpectedExecutions.reject(),
- 1000,
- );
- await writeExpectedExecutions;
- await writevExpectedExecutions;
- clearTimeout(writeTimeout);
- clearTimeout(writevTimeout);
- assertEquals(writeExecuted, writeExecutedExpected);
- assertEquals(writevExecuted, writevExecutedExpected);
-});
-
-Deno.test("Duplex stream writes Uint8Array in object mode", async () => {
- let writeExecuted = 0;
- const writeExecutedExpected = 1;
- const writeExpectedExecutions = deferred();
-
- const ABC = new TextEncoder().encode("ABC");
-
- const writable = new Duplex({
- objectMode: true,
- write: (chunk, encoding, cb) => {
- writeExecuted++;
- if (writeExecuted == writeExecutedExpected) {
- writeExpectedExecutions.resolve();
- }
- assert(!(chunk instanceof Buffer));
- assert(chunk instanceof Uint8Array);
- assertEquals(chunk, ABC);
- assertEquals(encoding, "utf8");
- cb();
- },
- });
-
- writable.end(ABC);
-
- const writeTimeout = setTimeout(
- () => writeExpectedExecutions.reject(),
- 1000,
- );
- await writeExpectedExecutions;
- clearTimeout(writeTimeout);
- assertEquals(writeExecuted, writeExecutedExpected);
-});
-
-Deno.test("Duplex stream throws on unexpected close", async () => {
- let finishedExecuted = 0;
- const finishedExecutedExpected = 1;
- const finishedExpectedExecutions = deferred();
-
- const writable = new Duplex({
- write: () => {},
- });
- writable.writable = false;
- writable.destroy();
-
- finished(writable, (err) => {
- finishedExecuted++;
- if (finishedExecuted == finishedExecutedExpected) {
- finishedExpectedExecutions.resolve();
- }
- assertEquals(err?.code, "ERR_STREAM_PREMATURE_CLOSE");
- });
-
- const finishedTimeout = setTimeout(
- () => finishedExpectedExecutions.reject(),
- 1000,
- );
- await finishedExpectedExecutions;
- clearTimeout(finishedTimeout);
- assertEquals(finishedExecuted, finishedExecutedExpected);
-});
-
-Deno.test("Duplex stream finishes correctly after error", async () => {
- let errorExecuted = 0;
- const errorExecutedExpected = 1;
- const errorExpectedExecutions = deferred();
-
- let finishedExecuted = 0;
- const finishedExecutedExpected = 1;
- const finishedExpectedExecutions = deferred();
-
- const w = new Duplex({
- write(_chunk, _encoding, cb) {
- cb(new Error());
- },
- autoDestroy: false,
- });
- w.write("asd");
- w.on("error", () => {
- errorExecuted++;
- if (errorExecuted == errorExecutedExpected) {
- errorExpectedExecutions.resolve();
- }
- finished(w, () => {
- finishedExecuted++;
- if (finishedExecuted == finishedExecutedExpected) {
- finishedExpectedExecutions.resolve();
- }
- });
- });
-
- const errorTimeout = setTimeout(
- () => errorExpectedExecutions.reject(),
- 1000,
- );
- const finishedTimeout = setTimeout(
- () => finishedExpectedExecutions.reject(),
- 1000,
- );
- await finishedExpectedExecutions;
- await errorExpectedExecutions;
- clearTimeout(finishedTimeout);
- clearTimeout(errorTimeout);
- assertEquals(finishedExecuted, finishedExecutedExpected);
- assertEquals(errorExecuted, errorExecutedExpected);
-});
-
-Deno.test("Duplex stream fails on 'write' null value", () => {
- const writable = new Duplex();
- assertThrows(() => writable.write(null));
-});
-
-Deno.test("Duplex stream is destroyed correctly", async () => {
- let closeExecuted = 0;
- const closeExecutedExpected = 1;
- const closeExpectedExecutions = deferred();
-
- const unexpectedExecution = deferred();
-
- const duplex = new Duplex({
- write(_chunk, _enc, cb) {
- cb();
- },
- read() {},
- });
-
- duplex.resume();
-
- function never() {
- unexpectedExecution.reject();
- }
-
- duplex.on("end", never);
- duplex.on("finish", never);
- duplex.on("close", () => {
- closeExecuted++;
- if (closeExecuted == closeExecutedExpected) {
- closeExpectedExecutions.resolve();
- }
- });
-
- duplex.destroy();
- assertEquals(duplex.destroyed, true);
-
- const closeTimeout = setTimeout(
- () => closeExpectedExecutions.reject(),
- 1000,
- );
- await Promise.race([
- unexpectedExecution,
- delay(100),
- ]);
- await closeExpectedExecutions;
- clearTimeout(closeTimeout);
- assertEquals(closeExecuted, closeExecutedExpected);
-});
-
-Deno.test("Duplex stream errors correctly on destroy", async () => {
- let errorExecuted = 0;
- const errorExecutedExpected = 1;
- const errorExpectedExecutions = deferred();
-
- const unexpectedExecution = deferred();
-
- const duplex = new Duplex({
- write(_chunk, _enc, cb) {
- cb();
- },
- read() {},
- });
- duplex.resume();
-
- const expected = new Error("kaboom");
-
- function never() {
- unexpectedExecution.reject();
- }
-
- duplex.on("end", never);
- duplex.on("finish", never);
- duplex.on("error", (err) => {
- errorExecuted++;
- if (errorExecuted == errorExecutedExpected) {
- errorExpectedExecutions.resolve();
- }
- assertStrictEquals(err, expected);
- });
-
- duplex.destroy(expected);
- assertEquals(duplex.destroyed, true);
-
- const errorTimeout = setTimeout(
- () => errorExpectedExecutions.reject(),
- 1000,
- );
- await Promise.race([
- unexpectedExecution,
- delay(100),
- ]);
- await errorExpectedExecutions;
- clearTimeout(errorTimeout);
- assertEquals(errorExecuted, errorExecutedExpected);
-});
-
-Deno.test("Duplex stream doesn't finish on allowHalfOpen", async () => {
- const unexpectedExecution = deferred();
-
- const duplex = new Duplex({
- read() {},
- });
-
- assertEquals(duplex.allowHalfOpen, true);
- duplex.on("finish", () => unexpectedExecution.reject());
- assertEquals(duplex.listenerCount("end"), 0);
- duplex.resume();
- duplex.push(null);
-
- await Promise.race([
- unexpectedExecution,
- delay(100),
- ]);
-});
-
-Deno.test("Duplex stream finishes when allowHalfOpen is disabled", async () => {
- let finishExecuted = 0;
- const finishExecutedExpected = 1;
- const finishExpectedExecutions = deferred();
-
- const duplex = new Duplex({
- read() {},
- allowHalfOpen: false,
- });
-
- assertEquals(duplex.allowHalfOpen, false);
- duplex.on("finish", () => {
- finishExecuted++;
- if (finishExecuted == finishExecutedExpected) {
- finishExpectedExecutions.resolve();
- }
- });
- assertEquals(duplex.listenerCount("end"), 0);
- duplex.resume();
- duplex.push(null);
-
- const finishTimeout = setTimeout(
- () => finishExpectedExecutions.reject(),
- 1000,
- );
- await finishExpectedExecutions;
- clearTimeout(finishTimeout);
- assertEquals(finishExecuted, finishExecutedExpected);
-});
-
-Deno.test("Duplex stream doesn't finish when allowHalfOpen is disabled but stream ended", async () => {
- const unexpectedExecution = deferred();
-
- const duplex = new Duplex({
- read() {},
- allowHalfOpen: false,
- });
-
- assertEquals(duplex.allowHalfOpen, false);
- duplex._writableState.ended = true;
- duplex.on("finish", () => unexpectedExecution.reject());
- assertEquals(duplex.listenerCount("end"), 0);
- duplex.resume();
- duplex.push(null);
-
- await Promise.race([
- unexpectedExecution,
- delay(100),
- ]);
-});
diff --git a/std/node/_stream/end_of_stream.ts b/std/node/_stream/end_of_stream.ts
deleted file mode 100644
index 6179e7fc4..000000000
--- a/std/node/_stream/end_of_stream.ts
+++ /dev/null
@@ -1,241 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { once } from "../_utils.ts";
-import type Duplex from "./duplex.ts";
-import type Readable from "./readable.ts";
-import type Stream from "./stream.ts";
-import type { ReadableState } from "./readable.ts";
-import type Writable from "./writable.ts";
-import type { WritableState } from "./writable.ts";
-import {
- ERR_INVALID_ARG_TYPE,
- ERR_STREAM_PREMATURE_CLOSE,
- NodeErrorAbstraction,
-} from "../_errors.ts";
-
-export type StreamImplementations = Duplex | Readable | Stream | Writable;
-
-// TODO(Soremwar)
-// Bring back once requests are implemented
-// function isRequest(stream: Stream) {
-// return stream.setHeader && typeof stream.abort === "function";
-// }
-
-// deno-lint-ignore no-explicit-any
-function isReadable(stream: any) {
- return typeof stream.readable === "boolean" ||
- typeof stream.readableEnded === "boolean" ||
- !!stream._readableState;
-}
-
-// deno-lint-ignore no-explicit-any
-function isWritable(stream: any) {
- return typeof stream.writable === "boolean" ||
- typeof stream.writableEnded === "boolean" ||
- !!stream._writableState;
-}
-
-function isWritableFinished(stream: Writable) {
- if (stream.writableFinished) return true;
- const wState = stream._writableState;
- if (!wState || wState.errored) return false;
- return wState.finished || (wState.ended && wState.length === 0);
-}
-
-function nop() {}
-
-function isReadableEnded(stream: Readable) {
- if (stream.readableEnded) return true;
- const rState = stream._readableState;
- if (!rState || rState.errored) return false;
- return rState.endEmitted || (rState.ended && rState.length === 0);
-}
-
-export interface FinishedOptions {
- error?: boolean;
- readable?: boolean;
- writable?: boolean;
-}
-
-/**
- * Appends an ending callback triggered when a stream is no longer readable,
- * writable or has experienced an error or a premature close event
-*/
-export default function eos(
- stream: StreamImplementations,
- options: FinishedOptions | null,
- callback: (err?: NodeErrorAbstraction | null) => void,
-): () => void;
-export default function eos(
- stream: StreamImplementations,
- callback: (err?: NodeErrorAbstraction | null) => void,
-): () => void;
-export default function eos(
- stream: StreamImplementations,
- x: FinishedOptions | ((err?: NodeErrorAbstraction | null) => void) | null,
- y?: (err?: NodeErrorAbstraction | null) => void,
-) {
- let opts: FinishedOptions;
- let callback: (err?: NodeErrorAbstraction | null) => void;
-
- if (!y) {
- if (typeof x !== "function") {
- throw new ERR_INVALID_ARG_TYPE("callback", "function", x);
- }
- opts = {};
- callback = x;
- } else {
- if (!x || Array.isArray(x) || typeof x !== "object") {
- throw new ERR_INVALID_ARG_TYPE("opts", "object", x);
- }
- opts = x;
-
- if (typeof y !== "function") {
- throw new ERR_INVALID_ARG_TYPE("callback", "function", y);
- }
- callback = y;
- }
-
- callback = once(callback);
-
- const readable = opts.readable ?? isReadable(stream);
- const writable = opts.writable ?? isWritable(stream);
-
- // deno-lint-ignore no-explicit-any
- const wState: WritableState | undefined = (stream as any)._writableState;
- // deno-lint-ignore no-explicit-any
- const rState: ReadableState | undefined = (stream as any)._readableState;
- const validState = wState || rState;
-
- const onlegacyfinish = () => {
- if (!(stream as Writable).writable) {
- onfinish();
- }
- };
-
- let willEmitClose = (
- validState?.autoDestroy &&
- validState?.emitClose &&
- validState?.closed === false &&
- isReadable(stream) === readable &&
- isWritable(stream) === writable
- );
-
- let writableFinished = (stream as Writable).writableFinished ||
- wState?.finished;
- const onfinish = () => {
- writableFinished = true;
- // deno-lint-ignore no-explicit-any
- if ((stream as any).destroyed) {
- willEmitClose = false;
- }
-
- if (willEmitClose && (!(stream as Readable).readable || readable)) {
- return;
- }
- if (!readable || readableEnded) {
- callback.call(stream);
- }
- };
-
- let readableEnded = (stream as Readable).readableEnded || rState?.endEmitted;
- const onend = () => {
- readableEnded = true;
- // deno-lint-ignore no-explicit-any
- if ((stream as any).destroyed) {
- willEmitClose = false;
- }
-
- if (willEmitClose && (!(stream as Writable).writable || writable)) {
- return;
- }
- if (!writable || writableFinished) {
- callback.call(stream);
- }
- };
-
- const onerror = (err: NodeErrorAbstraction) => {
- callback.call(stream, err);
- };
-
- const onclose = () => {
- if (readable && !readableEnded) {
- if (!isReadableEnded(stream as Readable)) {
- return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE());
- }
- }
- if (writable && !writableFinished) {
- if (!isWritableFinished(stream as Writable)) {
- return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE());
- }
- }
- callback.call(stream);
- };
-
- // TODO(Soremwar)
- // Bring back once requests are implemented
- // const onrequest = () => {
- // stream.req.on("finish", onfinish);
- // };
-
- // TODO(Soremwar)
- // Bring back once requests are implemented
- // if (isRequest(stream)) {
- // stream.on("complete", onfinish);
- // stream.on("abort", onclose);
- // if (stream.req) {
- // onrequest();
- // } else {
- // stream.on("request", onrequest);
- // }
- // } else
- if (writable && !wState) {
- stream.on("end", onlegacyfinish);
- stream.on("close", onlegacyfinish);
- }
-
- // TODO(Soremwar)
- // Bring back once requests are implemented
- // if (typeof stream.aborted === "boolean") {
- // stream.on("aborted", onclose);
- // }
-
- stream.on("end", onend);
- stream.on("finish", onfinish);
- if (opts.error !== false) stream.on("error", onerror);
- stream.on("close", onclose);
-
- const closed = (
- wState?.closed ||
- rState?.closed ||
- wState?.errorEmitted ||
- rState?.errorEmitted ||
- // TODO(Soremwar)
- // Bring back once requests are implemented
- // (rState && stream.req && stream.aborted) ||
- (
- (!writable || wState?.finished) &&
- (!readable || rState?.endEmitted)
- )
- );
-
- if (closed) {
- queueMicrotask(callback);
- }
-
- return function () {
- callback = nop;
- stream.removeListener("aborted", onclose);
- stream.removeListener("complete", onfinish);
- stream.removeListener("abort", onclose);
- // TODO(Soremwar)
- // Bring back once requests are implemented
- // stream.removeListener("request", onrequest);
- // if (stream.req) stream.req.removeListener("finish", onfinish);
- stream.removeListener("end", onlegacyfinish);
- stream.removeListener("close", onlegacyfinish);
- stream.removeListener("finish", onfinish);
- stream.removeListener("end", onend);
- stream.removeListener("error", onerror);
- stream.removeListener("close", onclose);
- };
-}
diff --git a/std/node/_stream/end_of_stream_test.ts b/std/node/_stream/end_of_stream_test.ts
deleted file mode 100644
index 571e75b99..000000000
--- a/std/node/_stream/end_of_stream_test.ts
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import finished from "./end_of_stream.ts";
-import Readable from "./readable.ts";
-import Transform from "./transform.ts";
-import Writable from "./writable.ts";
-import { mustCall } from "../_utils.ts";
-import { assert, fail } from "../../testing/asserts.ts";
-import { deferred, delay } from "../../async/mod.ts";
-
-Deno.test("Finished appends to Readable correctly", async () => {
- const rs = new Readable({
- read() {},
- });
-
- const [finishedExecution, finishedCb] = mustCall((err) => {
- assert(!err);
- });
-
- finished(rs, finishedCb);
-
- rs.push(null);
- rs.resume();
-
- await finishedExecution;
-});
-
-Deno.test("Finished appends to Writable correctly", async () => {
- const ws = new Writable({
- write(_data, _enc, cb) {
- cb();
- },
- });
-
- const [finishedExecution, finishedCb] = mustCall((err) => {
- assert(!err);
- });
-
- finished(ws, finishedCb);
-
- ws.end();
-
- await finishedExecution;
-});
-
-Deno.test("Finished appends to Transform correctly", async () => {
- const tr = new Transform({
- transform(_data, _enc, cb) {
- cb();
- },
- });
-
- let finish = false;
- let ended = false;
-
- tr.on("end", () => {
- ended = true;
- });
-
- tr.on("finish", () => {
- finish = true;
- });
-
- const [finishedExecution, finishedCb] = mustCall((err) => {
- assert(!err);
- assert(finish);
- assert(ended);
- });
-
- finished(tr, finishedCb);
-
- tr.end();
- tr.resume();
-
- await finishedExecution;
-});
-
-Deno.test("The function returned by Finished clears the listeners", async () => {
- const finishedExecution = deferred();
-
- const ws = new Writable({
- write(_data, _env, cb) {
- cb();
- },
- });
-
- const removeListener = finished(ws, () => {
- finishedExecution.reject();
- });
- removeListener();
- ws.end();
-
- await Promise.race([
- delay(100),
- finishedExecution,
- ])
- .catch(() => fail("Finished was executed"));
-});
diff --git a/std/node/_stream/from.ts b/std/node/_stream/from.ts
deleted file mode 100644
index 652c17715..000000000
--- a/std/node/_stream/from.ts
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { Buffer } from "../buffer.ts";
-import Readable from "./readable.ts";
-import type { ReadableOptions } from "./readable.ts";
-import { ERR_INVALID_ARG_TYPE, ERR_STREAM_NULL_VALUES } from "../_errors.ts";
-
-export default function from(
- // deno-lint-ignore no-explicit-any
- iterable: Iterable<any> | AsyncIterable<any>,
- opts?: ReadableOptions,
-) {
- let iterator:
- // deno-lint-ignore no-explicit-any
- | Iterator<any, any, undefined>
- // deno-lint-ignore no-explicit-any
- | AsyncIterator<any, any, undefined>;
- if (typeof iterable === "string" || iterable instanceof Buffer) {
- return new Readable({
- objectMode: true,
- ...opts,
- read() {
- this.push(iterable);
- this.push(null);
- },
- });
- }
-
- if (Symbol.asyncIterator in iterable) {
- // deno-lint-ignore no-explicit-any
- iterator = (iterable as AsyncIterable<any>)[Symbol.asyncIterator]();
- } else if (Symbol.iterator in iterable) {
- // deno-lint-ignore no-explicit-any
- iterator = (iterable as Iterable<any>)[Symbol.iterator]();
- } else {
- throw new ERR_INVALID_ARG_TYPE("iterable", ["Iterable"], iterable);
- }
-
- const readable = new Readable({
- objectMode: true,
- highWaterMark: 1,
- ...opts,
- });
-
- // Reading boolean to protect against _read
- // being called before last iteration completion.
- let reading = false;
-
- // needToClose boolean if iterator needs to be explicitly closed
- let needToClose = false;
-
- readable._read = function () {
- if (!reading) {
- reading = true;
- next();
- }
- };
-
- readable._destroy = function (error, cb) {
- if (needToClose) {
- needToClose = false;
- close().then(
- () => queueMicrotask(() => cb(error)),
- (e) => queueMicrotask(() => cb(error || e)),
- );
- } else {
- cb(error);
- }
- };
-
- async function close() {
- if (typeof iterator.return === "function") {
- const { value } = await iterator.return();
- await value;
- }
- }
-
- async function next() {
- try {
- needToClose = false;
- const { value, done } = await iterator.next();
- needToClose = !done;
- if (done) {
- readable.push(null);
- } else if (readable.destroyed) {
- await close();
- } else {
- const res = await value;
- if (res === null) {
- reading = false;
- throw new ERR_STREAM_NULL_VALUES();
- } else if (readable.push(res)) {
- next();
- } else {
- reading = false;
- }
- }
- } catch (err) {
- readable.destroy(err);
- }
- }
- return readable;
-}
diff --git a/std/node/_stream/passthrough.ts b/std/node/_stream/passthrough.ts
deleted file mode 100644
index 9126420e5..000000000
--- a/std/node/_stream/passthrough.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import Transform from "./transform.ts";
-import type { TransformOptions } from "./transform.ts";
-import type { Encodings } from "../_utils.ts";
-
-export default class PassThrough extends Transform {
- constructor(options?: TransformOptions) {
- super(options);
- }
-
- _transform(
- // deno-lint-ignore no-explicit-any
- chunk: any,
- _encoding: Encodings,
- // deno-lint-ignore no-explicit-any
- cb: (error?: Error | null, data?: any) => void,
- ) {
- cb(null, chunk);
- }
-}
diff --git a/std/node/_stream/pipeline.ts b/std/node/_stream/pipeline.ts
deleted file mode 100644
index d02a92870..000000000
--- a/std/node/_stream/pipeline.ts
+++ /dev/null
@@ -1,308 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { once } from "../_utils.ts";
-import { destroyer as implDestroyer } from "./destroy.ts";
-import eos from "./end_of_stream.ts";
-import createReadableStreamAsyncIterator from "./async_iterator.ts";
-import * as events from "../events.ts";
-import PassThrough from "./passthrough.ts";
-import {
- ERR_INVALID_ARG_TYPE,
- ERR_INVALID_CALLBACK,
- ERR_INVALID_RETURN_VALUE,
- ERR_MISSING_ARGS,
- ERR_STREAM_DESTROYED,
- NodeErrorAbstraction,
-} from "../_errors.ts";
-import type Duplex from "./duplex.ts";
-import type Readable from "./readable.ts";
-import type Stream from "./stream.ts";
-import type Transform from "./transform.ts";
-import type Writable from "./writable.ts";
-
-type Streams = Duplex | Readable | Writable;
-// deno-lint-ignore no-explicit-any
-type EndCallback = (err?: NodeErrorAbstraction | null, val?: any) => void;
-type TransformCallback =
- // deno-lint-ignore no-explicit-any
- | ((value?: any) => AsyncGenerator<any>)
- // deno-lint-ignore no-explicit-any
- | ((value?: any) => Promise<any>);
-/**
- * This type represents an array that contains a data source,
- * many Transform Streams, a writable stream destination
- * and end in an optional callback
- * */
-type DataSource =
- // deno-lint-ignore no-explicit-any
- | (() => AsyncGenerator<any>)
- | // deno-lint-ignore no-explicit-any
- AsyncIterable<any>
- | Duplex
- | // deno-lint-ignore no-explicit-any
- Iterable<any>
- | // deno-lint-ignore no-explicit-any
- (() => Generator<any>)
- | Readable;
-type Transformers = Duplex | Transform | TransformCallback | Writable;
-export type PipelineArguments = [
- DataSource,
- ...Array<Transformers | EndCallback>,
-];
-
-function destroyer(
- stream: Streams,
- reading: boolean,
- writing: boolean,
- callback: EndCallback,
-) {
- callback = once(callback);
-
- let finished = false;
- stream.on("close", () => {
- finished = true;
- });
-
- eos(stream, { readable: reading, writable: writing }, (err) => {
- finished = !err;
-
- // deno-lint-ignore no-explicit-any
- const rState = (stream as any)?._readableState;
- if (
- err &&
- err.code === "ERR_STREAM_PREMATURE_CLOSE" &&
- reading &&
- (rState?.ended && !rState?.errored && !rState?.errorEmitted)
- ) {
- stream
- .once("end", callback)
- .once("error", callback);
- } else {
- callback(err);
- }
- });
-
- return (err: NodeErrorAbstraction) => {
- if (finished) return;
- finished = true;
- implDestroyer(stream, err);
- callback(err || new ERR_STREAM_DESTROYED("pipe"));
- };
-}
-
-function popCallback(streams: PipelineArguments): EndCallback {
- if (typeof streams[streams.length - 1] !== "function") {
- throw new ERR_INVALID_CALLBACK(streams[streams.length - 1]);
- }
- return streams.pop() as EndCallback;
-}
-
-// function isPromise(obj) {
-// return !!(obj && typeof obj.then === "function");
-// }
-
-// deno-lint-ignore no-explicit-any
-function isReadable(obj: any): obj is Stream {
- return !!(obj && typeof obj.pipe === "function");
-}
-
-// deno-lint-ignore no-explicit-any
-function isWritable(obj: any) {
- return !!(obj && typeof obj.write === "function");
-}
-
-// deno-lint-ignore no-explicit-any
-function isStream(obj: any) {
- return isReadable(obj) || isWritable(obj);
-}
-
-// deno-lint-ignore no-explicit-any
-function isIterable(obj: any, isAsync?: boolean) {
- if (!obj) return false;
- if (isAsync === true) return typeof obj[Symbol.asyncIterator] === "function";
- if (isAsync === false) return typeof obj[Symbol.iterator] === "function";
- return typeof obj[Symbol.asyncIterator] === "function" ||
- typeof obj[Symbol.iterator] === "function";
-}
-
-// deno-lint-ignore no-explicit-any
-function makeAsyncIterable(val: Readable | Iterable<any> | AsyncIterable<any>) {
- if (isIterable(val)) {
- return val;
- } else if (isReadable(val)) {
- return fromReadable(val as Readable);
- }
- throw new ERR_INVALID_ARG_TYPE(
- "val",
- ["Readable", "Iterable", "AsyncIterable"],
- val,
- );
-}
-
-async function* fromReadable(val: Readable) {
- yield* createReadableStreamAsyncIterator(val);
-}
-
-async function pump(
- // deno-lint-ignore no-explicit-any
- iterable: Iterable<any>,
- writable: Duplex | Writable,
- finish: (err?: NodeErrorAbstraction | null) => void,
-) {
- let error;
- try {
- for await (const chunk of iterable) {
- if (!writable.write(chunk)) {
- if (writable.destroyed) return;
- await events.once(writable, "drain");
- }
- }
- writable.end();
- } catch (err) {
- error = err;
- } finally {
- finish(error);
- }
-}
-
-export default function pipeline(...args: PipelineArguments) {
- const callback: EndCallback = once(popCallback(args));
-
- let streams: [DataSource, ...Transformers[]];
- if (args.length > 1) {
- streams = args as [DataSource, ...Transformers[]];
- } else {
- throw new ERR_MISSING_ARGS("streams");
- }
-
- let error: NodeErrorAbstraction;
- // deno-lint-ignore no-explicit-any
- let value: any;
- const destroys: Array<(err: NodeErrorAbstraction) => void> = [];
-
- let finishCount = 0;
-
- function finish(err?: NodeErrorAbstraction | null) {
- const final = --finishCount === 0;
-
- if (err && (!error || error.code === "ERR_STREAM_PREMATURE_CLOSE")) {
- error = err;
- }
-
- if (!error && !final) {
- return;
- }
-
- while (destroys.length) {
- (destroys.shift() as (err: NodeErrorAbstraction) => void)(error);
- }
-
- if (final) {
- callback(error, value);
- }
- }
-
- // TODO(Soremwar)
- // Simplify the hell out of this
- // deno-lint-ignore no-explicit-any
- let ret: any;
- for (let i = 0; i < streams.length; i++) {
- const stream = streams[i];
- const reading = i < streams.length - 1;
- const writing = i > 0;
-
- if (isStream(stream)) {
- finishCount++;
- destroys.push(destroyer(stream as Streams, reading, writing, finish));
- }
-
- if (i === 0) {
- if (typeof stream === "function") {
- ret = stream();
- if (!isIterable(ret)) {
- throw new ERR_INVALID_RETURN_VALUE(
- "Iterable, AsyncIterable or Stream",
- "source",
- ret,
- );
- }
- } else if (isIterable(stream) || isReadable(stream)) {
- ret = stream;
- } else {
- throw new ERR_INVALID_ARG_TYPE(
- "source",
- ["Stream", "Iterable", "AsyncIterable", "Function"],
- stream,
- );
- }
- } else if (typeof stream === "function") {
- ret = makeAsyncIterable(ret);
- ret = stream(ret);
-
- if (reading) {
- if (!isIterable(ret, true)) {
- throw new ERR_INVALID_RETURN_VALUE(
- "AsyncIterable",
- `transform[${i - 1}]`,
- ret,
- );
- }
- } else {
- // If the last argument to pipeline is not a stream
- // we must create a proxy stream so that pipeline(...)
- // always returns a stream which can be further
- // composed through `.pipe(stream)`.
- const pt = new PassThrough({
- objectMode: true,
- });
- if (ret instanceof Promise) {
- ret
- .then((val) => {
- value = val;
- pt.end(val);
- }, (err) => {
- pt.destroy(err);
- });
- } else if (isIterable(ret, true)) {
- finishCount++;
- pump(ret, pt, finish);
- } else {
- throw new ERR_INVALID_RETURN_VALUE(
- "AsyncIterable or Promise",
- "destination",
- ret,
- );
- }
-
- ret = pt;
-
- finishCount++;
- destroys.push(destroyer(ret, false, true, finish));
- }
- } else if (isStream(stream)) {
- if (isReadable(ret)) {
- ret.pipe(stream as Readable);
-
- // TODO(Soremwar)
- // Reimplement after stdout and stderr are implemented
- // if (stream === process.stdout || stream === process.stderr) {
- // ret.on("end", () => stream.end());
- // }
- } else {
- ret = makeAsyncIterable(ret);
-
- finishCount++;
- pump(ret, stream as Writable, finish);
- }
- ret = stream;
- } else {
- const name = reading ? `transform[${i - 1}]` : "destination";
- throw new ERR_INVALID_ARG_TYPE(
- name,
- ["Stream", "Function"],
- ret,
- );
- }
- }
-
- return ret as unknown as Readable;
-}
diff --git a/std/node/_stream/pipeline_test.ts b/std/node/_stream/pipeline_test.ts
deleted file mode 100644
index aa1869416..000000000
--- a/std/node/_stream/pipeline_test.ts
+++ /dev/null
@@ -1,387 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { Buffer } from "../buffer.ts";
-import PassThrough from "./passthrough.ts";
-import pipeline from "./pipeline.ts";
-import Readable from "./readable.ts";
-import Transform from "./transform.ts";
-import Writable from "./writable.ts";
-import { mustCall } from "../_utils.ts";
-import {
- assert,
- assertEquals,
- assertStrictEquals,
-} from "../../testing/asserts.ts";
-import type { NodeErrorAbstraction } from "../_errors.ts";
-
-Deno.test("Pipeline ends on stream finished", async () => {
- let finished = false;
-
- // deno-lint-ignore no-explicit-any
- const processed: any[] = [];
- const expected = [
- Buffer.from("a"),
- Buffer.from("b"),
- Buffer.from("c"),
- ];
-
- const read = new Readable({
- read() {},
- });
-
- const write = new Writable({
- write(data, _enc, cb) {
- processed.push(data);
- cb();
- },
- });
-
- write.on("finish", () => {
- finished = true;
- });
-
- for (let i = 0; i < expected.length; i++) {
- read.push(expected[i]);
- }
- read.push(null);
-
- const [finishedCompleted, finishedCb] = mustCall(
- (err?: NodeErrorAbstraction | null) => {
- assert(!err);
- assert(finished);
- assertEquals(processed, expected);
- },
- 1,
- );
-
- pipeline(read, write, finishedCb);
-
- await finishedCompleted;
-});
-
-Deno.test("Pipeline fails on stream destroyed", async () => {
- const read = new Readable({
- read() {},
- });
-
- const write = new Writable({
- write(_data, _enc, cb) {
- cb();
- },
- });
-
- read.push("data");
- queueMicrotask(() => read.destroy());
-
- const [pipelineExecuted, pipelineCb] = mustCall(
- (err?: NodeErrorAbstraction | null) => {
- assert(err);
- },
- 1,
- );
- pipeline(read, write, pipelineCb);
-
- await pipelineExecuted;
-});
-
-Deno.test("Pipeline exits on stream error", async () => {
- const read = new Readable({
- read() {},
- });
-
- const transform = new Transform({
- transform(_data, _enc, cb) {
- cb(new Error("kaboom"));
- },
- });
-
- const write = new Writable({
- write(_data, _enc, cb) {
- cb();
- },
- });
-
- const [readExecution, readCb] = mustCall();
- read.on("close", readCb);
- const [closeExecution, closeCb] = mustCall();
- transform.on("close", closeCb);
- const [writeExecution, writeCb] = mustCall();
- write.on("close", writeCb);
-
- const errorExecutions = [read, transform, write]
- .map((stream) => {
- const [execution, cb] = mustCall((err?: NodeErrorAbstraction | null) => {
- assertEquals(err, new Error("kaboom"));
- });
-
- stream.on("error", cb);
- return execution;
- });
-
- const [pipelineExecution, pipelineCb] = mustCall(
- (err?: NodeErrorAbstraction | null) => {
- assertEquals(err, new Error("kaboom"));
- },
- );
- const dst = pipeline(read, transform, write, pipelineCb);
-
- assertStrictEquals(dst, write);
-
- read.push("hello");
-
- await readExecution;
- await closeExecution;
- await writeExecution;
- await Promise.all(errorExecutions);
- await pipelineExecution;
-});
-
-Deno.test("Pipeline processes iterators correctly", async () => {
- let res = "";
- const w = new Writable({
- write(chunk, _encoding, callback) {
- res += chunk;
- callback();
- },
- });
-
- const [pipelineExecution, pipelineCb] = mustCall(
- (err?: NodeErrorAbstraction | null) => {
- assert(!err);
- assertEquals(res, "helloworld");
- },
- );
- pipeline(
- function* () {
- yield "hello";
- yield "world";
- }(),
- w,
- pipelineCb,
- );
-
- await pipelineExecution;
-});
-
-Deno.test("Pipeline processes async iterators correctly", async () => {
- let res = "";
- const w = new Writable({
- write(chunk, _encoding, callback) {
- res += chunk;
- callback();
- },
- });
-
- const [pipelineExecution, pipelineCb] = mustCall(
- (err?: NodeErrorAbstraction | null) => {
- assert(!err);
- assertEquals(res, "helloworld");
- },
- );
- pipeline(
- async function* () {
- await Promise.resolve();
- yield "hello";
- yield "world";
- }(),
- w,
- pipelineCb,
- );
-
- await pipelineExecution;
-});
-
-Deno.test("Pipeline processes generators correctly", async () => {
- let res = "";
- const w = new Writable({
- write(chunk, _encoding, callback) {
- res += chunk;
- callback();
- },
- });
-
- const [pipelineExecution, pipelineCb] = mustCall(
- (err?: NodeErrorAbstraction | null) => {
- assert(!err);
- assertEquals(res, "helloworld");
- },
- );
- pipeline(
- function* () {
- yield "hello";
- yield "world";
- },
- w,
- pipelineCb,
- );
-
- await pipelineExecution;
-});
-
-Deno.test("Pipeline processes async generators correctly", async () => {
- let res = "";
- const w = new Writable({
- write(chunk, _encoding, callback) {
- res += chunk;
- callback();
- },
- });
-
- const [pipelineExecution, pipelineCb] = mustCall(
- (err?: NodeErrorAbstraction | null) => {
- assert(!err);
- assertEquals(res, "helloworld");
- },
- );
- pipeline(
- async function* () {
- await Promise.resolve();
- yield "hello";
- yield "world";
- },
- w,
- pipelineCb,
- );
-
- await pipelineExecution;
-});
-
-Deno.test("Pipeline handles generator transforms", async () => {
- let res = "";
-
- const [pipelineExecuted, pipelineCb] = mustCall(
- (err?: NodeErrorAbstraction | null) => {
- assert(!err);
- assertEquals(res, "HELLOWORLD");
- },
- );
- pipeline(
- async function* () {
- await Promise.resolve();
- yield "hello";
- yield "world";
- },
- async function* (source: string[]) {
- for await (const chunk of source) {
- yield chunk.toUpperCase();
- }
- },
- async function (source: string[]) {
- for await (const chunk of source) {
- res += chunk;
- }
- },
- pipelineCb,
- );
-
- await pipelineExecuted;
-});
-
-Deno.test("Pipeline passes result to final callback", async () => {
- const [pipelineExecuted, pipelineCb] = mustCall(
- (err?: NodeErrorAbstraction | null, val?: unknown) => {
- assert(!err);
- assertEquals(val, "HELLOWORLD");
- },
- );
- pipeline(
- async function* () {
- await Promise.resolve();
- yield "hello";
- yield "world";
- },
- async function* (source: string[]) {
- for await (const chunk of source) {
- yield chunk.toUpperCase();
- }
- },
- async function (source: string[]) {
- let ret = "";
- for await (const chunk of source) {
- ret += chunk;
- }
- return ret;
- },
- pipelineCb,
- );
-
- await pipelineExecuted;
-});
-
-Deno.test("Pipeline returns a stream after ending", async () => {
- const [pipelineExecuted, pipelineCb] = mustCall(
- (err?: NodeErrorAbstraction | null) => {
- assertEquals(err, undefined);
- },
- );
- const ret = pipeline(
- async function* () {
- await Promise.resolve();
- yield "hello";
- },
- // deno-lint-ignore require-yield
- async function* (source: string[]) {
- for await (const chunk of source) {
- chunk;
- }
- },
- pipelineCb,
- );
-
- ret.resume();
-
- assertEquals(typeof ret.pipe, "function");
-
- await pipelineExecuted;
-});
-
-Deno.test("Pipeline returns a stream after erroring", async () => {
- const errorText = "kaboom";
-
- const [pipelineExecuted, pipelineCb] = mustCall(
- (err?: NodeErrorAbstraction | null) => {
- assertEquals(err?.message, errorText);
- },
- );
- const ret = pipeline(
- // deno-lint-ignore require-yield
- async function* () {
- await Promise.resolve();
- throw new Error(errorText);
- },
- // deno-lint-ignore require-yield
- async function* (source: string[]) {
- for await (const chunk of source) {
- chunk;
- }
- },
- pipelineCb,
- );
-
- ret.resume();
-
- assertEquals(typeof ret.pipe, "function");
-
- await pipelineExecuted;
-});
-
-Deno.test("Pipeline destination gets destroyed on error", async () => {
- const errorText = "kaboom";
- const s = new PassThrough();
-
- const [pipelineExecution, pipelineCb] = mustCall(
- (err?: NodeErrorAbstraction | null) => {
- assertEquals(err?.message, errorText);
- assertEquals(s.destroyed, true);
- },
- );
- pipeline(
- // deno-lint-ignore require-yield
- async function* () {
- throw new Error(errorText);
- },
- s,
- pipelineCb,
- );
-
- await pipelineExecution;
-});
diff --git a/std/node/_stream/promises.ts b/std/node/_stream/promises.ts
deleted file mode 100644
index 1adf4ea3f..000000000
--- a/std/node/_stream/promises.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import pl from "./pipeline.ts";
-import type { PipelineArguments } from "./pipeline.ts";
-import eos from "./end_of_stream.ts";
-import type {
- FinishedOptions,
- StreamImplementations as FinishedStreams,
-} from "./end_of_stream.ts";
-
-export function pipeline(...streams: PipelineArguments) {
- return new Promise((resolve, reject) => {
- pl(
- ...streams,
- (err, value) => {
- if (err) {
- reject(err);
- } else {
- resolve(value);
- }
- },
- );
- });
-}
-
-export function finished(
- stream: FinishedStreams,
- opts?: FinishedOptions,
-) {
- return new Promise<void>((resolve, reject) => {
- eos(
- stream,
- opts || null,
- (err) => {
- if (err) {
- reject(err);
- } else {
- resolve();
- }
- },
- );
- });
-}
diff --git a/std/node/_stream/promises_test.ts b/std/node/_stream/promises_test.ts
deleted file mode 100644
index 90803b4af..000000000
--- a/std/node/_stream/promises_test.ts
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { Buffer } from "../buffer.ts";
-import Readable from "./readable.ts";
-import Writable from "./writable.ts";
-import { pipeline } from "./promises.ts";
-import { deferred } from "../../async/mod.ts";
-import {
- assert,
- assertEquals,
- assertThrowsAsync,
-} from "../../testing/asserts.ts";
-
-Deno.test("Promise pipeline works correctly", async () => {
- let pipelineExecuted = 0;
- const pipelineExecutedExpected = 1;
- const pipelineExpectedExecutions = deferred();
-
- let finished = false;
- // deno-lint-ignore no-explicit-any
- const processed: any[] = [];
- const expected = [
- Buffer.from("a"),
- Buffer.from("b"),
- Buffer.from("c"),
- ];
-
- const read = new Readable({
- read() {},
- });
-
- const write = new Writable({
- write(data, _enc, cb) {
- processed.push(data);
- cb();
- },
- });
-
- write.on("finish", () => {
- finished = true;
- });
-
- for (let i = 0; i < expected.length; i++) {
- read.push(expected[i]);
- }
- read.push(null);
-
- pipeline(read, write).then(() => {
- pipelineExecuted++;
- if (pipelineExecuted == pipelineExecutedExpected) {
- pipelineExpectedExecutions.resolve();
- }
- assert(finished);
- assertEquals(processed, expected);
- });
-
- const pipelineTimeout = setTimeout(
- () => pipelineExpectedExecutions.reject(),
- 1000,
- );
- await pipelineExpectedExecutions;
- clearTimeout(pipelineTimeout);
- assertEquals(pipelineExecuted, pipelineExecutedExpected);
-});
-
-Deno.test("Promise pipeline throws on readable destroyed", async () => {
- const read = new Readable({
- read() {},
- });
-
- const write = new Writable({
- write(_data, _enc, cb) {
- cb();
- },
- });
-
- read.push("data");
- read.destroy();
-
- await assertThrowsAsync(
- () => pipeline(read, write),
- Error,
- "Premature close",
- );
-});
diff --git a/std/node/_stream/readable.ts b/std/node/_stream/readable.ts
deleted file mode 100644
index 54e0d8ecd..000000000
--- a/std/node/_stream/readable.ts
+++ /dev/null
@@ -1,788 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { captureRejectionSymbol } from "../events.ts";
-import Stream from "./stream.ts";
-import type { Buffer } from "../buffer.ts";
-import BufferList from "./buffer_list.ts";
-import {
- ERR_INVALID_OPT_VALUE,
- ERR_METHOD_NOT_IMPLEMENTED,
-} from "../_errors.ts";
-import type { Encodings } from "../_utils.ts";
-import { StringDecoder } from "../string_decoder.ts";
-import createReadableStreamAsyncIterator from "./async_iterator.ts";
-import streamFrom from "./from.ts";
-import { kDestroy, kPaused } from "./symbols.ts";
-import {
- _destroy,
- computeNewHighWaterMark,
- emitReadable,
- endReadable,
- errorOrDestroy,
- fromList,
- howMuchToRead,
- nReadingNextTick,
- pipeOnDrain,
- prependListener,
- readableAddChunk,
- resume,
- updateReadableListening,
-} from "./readable_internal.ts";
-import Writable from "./writable.ts";
-import { errorOrDestroy as errorOrDestroyWritable } from "./writable_internal.ts";
-import Duplex, { errorOrDestroy as errorOrDestroyDuplex } from "./duplex.ts";
-
-export interface ReadableOptions {
- autoDestroy?: boolean;
- defaultEncoding?: Encodings;
- destroy?(
- this: Readable,
- error: Error | null,
- callback: (error: Error | null) => void,
- ): void;
- emitClose?: boolean;
- encoding?: Encodings;
- highWaterMark?: number;
- objectMode?: boolean;
- read?(this: Readable): void;
-}
-
-export class ReadableState {
- [kPaused]: boolean | null = null;
- awaitDrainWriters: Duplex | Writable | Set<Duplex | Writable> | null = null;
- buffer = new BufferList();
- closed = false;
- closeEmitted = false;
- constructed: boolean;
- decoder: StringDecoder | null = null;
- destroyed = false;
- emittedReadable = false;
- encoding: Encodings | null = null;
- ended = false;
- endEmitted = false;
- errored: Error | null = null;
- errorEmitted = false;
- flowing: boolean | null = null;
- highWaterMark: number;
- length = 0;
- multiAwaitDrain = false;
- needReadable = false;
- objectMode: boolean;
- pipes: Array<Duplex | Writable> = [];
- readable = true;
- readableListening = false;
- reading = false;
- readingMore = false;
- resumeScheduled = false;
- sync = true;
- emitClose: boolean;
- autoDestroy: boolean;
- defaultEncoding: string;
-
- constructor(options?: ReadableOptions) {
- this.objectMode = !!options?.objectMode;
-
- this.highWaterMark = options?.highWaterMark ??
- (this.objectMode ? 16 : 16 * 1024);
- if (Number.isInteger(this.highWaterMark) && this.highWaterMark >= 0) {
- this.highWaterMark = Math.floor(this.highWaterMark);
- } else {
- throw new ERR_INVALID_OPT_VALUE("highWaterMark", this.highWaterMark);
- }
-
- this.emitClose = options?.emitClose ?? true;
- this.autoDestroy = options?.autoDestroy ?? true;
- this.defaultEncoding = options?.defaultEncoding || "utf8";
-
- if (options?.encoding) {
- this.decoder = new StringDecoder(options.encoding);
- this.encoding = options.encoding;
- }
-
- this.constructed = true;
- }
-}
-
-class Readable extends Stream {
- _readableState: ReadableState;
-
- constructor(options?: ReadableOptions) {
- super();
- if (options) {
- if (typeof options.read === "function") {
- this._read = options.read;
- }
- if (typeof options.destroy === "function") {
- this._destroy = options.destroy;
- }
- }
- this._readableState = new ReadableState(options);
- }
-
- static from(
- // deno-lint-ignore no-explicit-any
- iterable: Iterable<any> | AsyncIterable<any>,
- opts?: ReadableOptions,
- ): Readable {
- return streamFrom(iterable, opts);
- }
-
- static ReadableState = ReadableState;
-
- static _fromList = fromList;
-
- // You can override either this method, or the async _read(n) below.
- read(n?: number) {
- // Same as parseInt(undefined, 10), however V8 7.3 performance regressed
- // in this scenario, so we are doing it manually.
- if (n === undefined) {
- n = NaN;
- }
- const state = this._readableState;
- const nOrig = n;
-
- if (n > state.highWaterMark) {
- state.highWaterMark = computeNewHighWaterMark(n);
- }
-
- if (n !== 0) {
- state.emittedReadable = false;
- }
-
- if (
- n === 0 &&
- state.needReadable &&
- ((state.highWaterMark !== 0
- ? state.length >= state.highWaterMark
- : state.length > 0) ||
- state.ended)
- ) {
- if (state.length === 0 && state.ended) {
- endReadable(this);
- } else {
- emitReadable(this);
- }
- return null;
- }
-
- n = howMuchToRead(n, state);
-
- if (n === 0 && state.ended) {
- if (state.length === 0) {
- endReadable(this);
- }
- return null;
- }
-
- let doRead = state.needReadable;
- if (
- state.length === 0 || state.length - (n as number) < state.highWaterMark
- ) {
- doRead = true;
- }
-
- if (
- state.ended || state.reading || state.destroyed || state.errored ||
- !state.constructed
- ) {
- doRead = false;
- } else if (doRead) {
- state.reading = true;
- state.sync = true;
- if (state.length === 0) {
- state.needReadable = true;
- }
- this._read();
- state.sync = false;
- if (!state.reading) {
- n = howMuchToRead(nOrig, state);
- }
- }
-
- let ret;
- if ((n as number) > 0) {
- ret = fromList((n as number), state);
- } else {
- ret = null;
- }
-
- if (ret === null) {
- state.needReadable = state.length <= state.highWaterMark;
- n = 0;
- } else {
- state.length -= n as number;
- if (state.multiAwaitDrain) {
- (state.awaitDrainWriters as Set<Writable>).clear();
- } else {
- state.awaitDrainWriters = null;
- }
- }
-
- if (state.length === 0) {
- if (!state.ended) {
- state.needReadable = true;
- }
-
- if (nOrig !== n && state.ended) {
- endReadable(this);
- }
- }
-
- if (ret !== null) {
- this.emit("data", ret);
- }
-
- return ret;
- }
-
- _read(_size?: number) {
- throw new ERR_METHOD_NOT_IMPLEMENTED("_read()");
- }
-
- pipe<T extends Duplex | Writable>(dest: T, pipeOpts?: { end?: boolean }): T {
- // deno-lint-ignore no-this-alias
- const src = this;
- const state = this._readableState;
-
- if (state.pipes.length === 1) {
- if (!state.multiAwaitDrain) {
- state.multiAwaitDrain = true;
- state.awaitDrainWriters = new Set(
- state.awaitDrainWriters ? [state.awaitDrainWriters as Writable] : [],
- );
- }
- }
-
- state.pipes.push(dest);
-
- const doEnd = (!pipeOpts || pipeOpts.end !== false);
-
- //TODO(Soremwar)
- //Part of doEnd condition
- //In node, output/input are a duplex Stream
- // &&
- // dest !== stdout &&
- // dest !== stderr
-
- const endFn = doEnd ? onend : unpipe;
- if (state.endEmitted) {
- queueMicrotask(endFn);
- } else {
- this.once("end", endFn);
- }
-
- dest.on("unpipe", onunpipe);
- function onunpipe(readable: Readable, unpipeInfo: { hasUnpiped: boolean }) {
- if (readable === src) {
- if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
- unpipeInfo.hasUnpiped = true;
- cleanup();
- }
- }
- }
-
- function onend() {
- dest.end();
- }
-
- let ondrain: () => void;
-
- let cleanedUp = false;
- function cleanup() {
- dest.removeListener("close", onclose);
- dest.removeListener("finish", onfinish);
- if (ondrain) {
- dest.removeListener("drain", ondrain);
- }
- dest.removeListener("error", onerror);
- dest.removeListener("unpipe", onunpipe);
- src.removeListener("end", onend);
- src.removeListener("end", unpipe);
- src.removeListener("data", ondata);
-
- cleanedUp = true;
- if (
- ondrain && state.awaitDrainWriters &&
- (!dest._writableState || dest._writableState.needDrain)
- ) {
- ondrain();
- }
- }
-
- this.on("data", ondata);
- // deno-lint-ignore no-explicit-any
- function ondata(chunk: any) {
- const ret = dest.write(chunk);
- if (ret === false) {
- if (!cleanedUp) {
- if (state.pipes.length === 1 && state.pipes[0] === dest) {
- state.awaitDrainWriters = dest;
- state.multiAwaitDrain = false;
- } else if (state.pipes.length > 1 && state.pipes.includes(dest)) {
- (state.awaitDrainWriters as Set<Duplex | Writable>).add(dest);
- }
- src.pause();
- }
- if (!ondrain) {
- ondrain = pipeOnDrain(src, dest);
- dest.on("drain", ondrain);
- }
- }
- }
-
- function onerror(er: Error) {
- unpipe();
- dest.removeListener("error", onerror);
- if (dest.listenerCount("error") === 0) {
- const s = dest._writableState || (dest as Duplex)._readableState;
- if (s && !s.errorEmitted) {
- if (dest instanceof Duplex) {
- errorOrDestroyDuplex(dest as unknown as Duplex, er);
- } else {
- errorOrDestroyWritable(dest as Writable, er);
- }
- } else {
- dest.emit("error", er);
- }
- }
- }
-
- prependListener(dest, "error", onerror);
-
- function onclose() {
- dest.removeListener("finish", onfinish);
- unpipe();
- }
- dest.once("close", onclose);
- function onfinish() {
- dest.removeListener("close", onclose);
- unpipe();
- }
- dest.once("finish", onfinish);
-
- function unpipe() {
- src.unpipe(dest as Writable);
- }
-
- dest.emit("pipe", this);
-
- if (!state.flowing) {
- this.resume();
- }
-
- return dest;
- }
-
- isPaused() {
- return this._readableState[kPaused] === true ||
- this._readableState.flowing === false;
- }
-
- setEncoding(enc: Encodings) {
- const decoder = new StringDecoder(enc);
- this._readableState.decoder = decoder;
- this._readableState.encoding = this._readableState.decoder
- .encoding as Encodings;
-
- const buffer = this._readableState.buffer;
- let content = "";
- for (const data of buffer) {
- content += decoder.write(data as Buffer);
- }
- buffer.clear();
- if (content !== "") {
- buffer.push(content);
- }
- this._readableState.length = content.length;
- return this;
- }
-
- on(
- event: "close" | "end" | "pause" | "readable" | "resume",
- listener: () => void,
- ): this;
- // deno-lint-ignore no-explicit-any
- on(event: "data", listener: (chunk: any) => void): this;
- on(event: "error", listener: (err: Error) => void): this;
- // deno-lint-ignore no-explicit-any
- on(event: string | symbol, listener: (...args: any[]) => void): this;
- on(
- ev: string | symbol,
- fn:
- | (() => void)
- // deno-lint-ignore no-explicit-any
- | ((chunk: any) => void)
- | ((err: Error) => void)
- // deno-lint-ignore no-explicit-any
- | ((...args: any[]) => void),
- ) {
- const res = super.on.call(this, ev, fn);
- const state = this._readableState;
-
- if (ev === "data") {
- state.readableListening = this.listenerCount("readable") > 0;
-
- if (state.flowing !== false) {
- this.resume();
- }
- } else if (ev === "readable") {
- if (!state.endEmitted && !state.readableListening) {
- state.readableListening = state.needReadable = true;
- state.flowing = false;
- state.emittedReadable = false;
- if (state.length) {
- emitReadable(this);
- } else if (!state.reading) {
- queueMicrotask(() => nReadingNextTick(this));
- }
- }
- }
-
- return res;
- }
-
- removeListener(
- event: "close" | "end" | "pause" | "readable" | "resume",
- listener: () => void,
- ): this;
- // deno-lint-ignore no-explicit-any
- removeListener(event: "data", listener: (chunk: any) => void): this;
- removeListener(event: "error", listener: (err: Error) => void): this;
- removeListener(
- event: string | symbol,
- // deno-lint-ignore no-explicit-any
- listener: (...args: any[]) => void,
- ): this;
- removeListener(
- ev: string | symbol,
- fn:
- | (() => void)
- // deno-lint-ignore no-explicit-any
- | ((chunk: any) => void)
- | ((err: Error) => void)
- // deno-lint-ignore no-explicit-any
- | ((...args: any[]) => void),
- ) {
- const res = super.removeListener.call(this, ev, fn);
-
- if (ev === "readable") {
- queueMicrotask(() => updateReadableListening(this));
- }
-
- return res;
- }
-
- off = this.removeListener;
-
- destroy(err?: Error | null, cb?: () => void) {
- const r = this._readableState;
-
- if (r.destroyed) {
- if (typeof cb === "function") {
- cb();
- }
-
- return this;
- }
-
- if (err) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- err.stack;
-
- if (!r.errored) {
- r.errored = err;
- }
- }
-
- r.destroyed = true;
-
- // If still constructing then defer calling _destroy.
- if (!r.constructed) {
- this.once(kDestroy, (er: Error) => {
- _destroy(this, err || er, cb);
- });
- } else {
- _destroy(this, err, cb);
- }
-
- return this;
- }
-
- _undestroy() {
- const r = this._readableState;
- r.constructed = true;
- r.closed = false;
- r.closeEmitted = false;
- r.destroyed = false;
- r.errored = null;
- r.errorEmitted = false;
- r.reading = false;
- r.ended = false;
- r.endEmitted = false;
- }
-
- _destroy(
- error: Error | null,
- callback: (error?: Error | null) => void,
- ): void {
- callback(error);
- }
-
- [captureRejectionSymbol](err: Error) {
- this.destroy(err);
- }
-
- // deno-lint-ignore no-explicit-any
- push(chunk: any, encoding?: Encodings): boolean {
- return readableAddChunk(this, chunk, encoding, false);
- }
-
- // deno-lint-ignore no-explicit-any
- unshift(chunk: any, encoding?: string): boolean {
- return readableAddChunk(this, chunk, encoding, true);
- }
-
- unpipe(dest?: Writable): this {
- const state = this._readableState;
- const unpipeInfo = { hasUnpiped: false };
-
- if (state.pipes.length === 0) {
- return this;
- }
-
- if (!dest) {
- // remove all.
- const dests = state.pipes;
- state.pipes = [];
- this.pause();
-
- for (const dest of dests) {
- dest.emit("unpipe", this, { hasUnpiped: false });
- }
- return this;
- }
-
- const index = state.pipes.indexOf(dest);
- if (index === -1) {
- return this;
- }
-
- state.pipes.splice(index, 1);
- if (state.pipes.length === 0) {
- this.pause();
- }
-
- dest.emit("unpipe", this, unpipeInfo);
-
- return this;
- }
-
- removeAllListeners(
- ev:
- | "close"
- | "data"
- | "end"
- | "error"
- | "pause"
- | "readable"
- | "resume"
- | symbol
- | undefined,
- ) {
- const res = super.removeAllListeners(ev);
-
- if (ev === "readable" || ev === undefined) {
- queueMicrotask(() => updateReadableListening(this));
- }
-
- return res;
- }
-
- resume() {
- const state = this._readableState;
- if (!state.flowing) {
- // We flow only if there is no one listening
- // for readable, but we still have to call
- // resume().
- state.flowing = !state.readableListening;
- resume(this, state);
- }
- state[kPaused] = false;
- return this;
- }
-
- pause() {
- if (this._readableState.flowing !== false) {
- this._readableState.flowing = false;
- this.emit("pause");
- }
- this._readableState[kPaused] = true;
- return this;
- }
-
- /** Wrap an old-style stream as the async data source. */
- wrap(stream: Stream): this {
- const state = this._readableState;
- let paused = false;
-
- stream.on("end", () => {
- if (state.decoder && !state.ended) {
- const chunk = state.decoder.end();
- if (chunk && chunk.length) {
- this.push(chunk);
- }
- }
-
- this.push(null);
- });
-
- stream.on("data", (chunk) => {
- if (state.decoder) {
- chunk = state.decoder.write(chunk);
- }
-
- if (state.objectMode && (chunk === null || chunk === undefined)) {
- return;
- } else if (!state.objectMode && (!chunk || !chunk.length)) {
- return;
- }
-
- const ret = this.push(chunk);
- if (!ret) {
- paused = true;
- // By the time this is triggered, stream will be a readable stream
- // deno-lint-ignore ban-ts-comment
- // @ts-ignore
- stream.pause();
- }
- });
-
- // TODO(Soremwar)
- // There must be a clean way to implement this on TypeScript
- // Proxy all the other methods. Important when wrapping filters and duplexes.
- for (const i in stream) {
- // deno-lint-ignore ban-ts-comment
- //@ts-ignore
- if (this[i] === undefined && typeof stream[i] === "function") {
- // deno-lint-ignore ban-ts-comment
- //@ts-ignore
- this[i] = function methodWrap(method) {
- return function methodWrapReturnFunction() {
- // deno-lint-ignore ban-ts-comment
- //@ts-ignore
- return stream[method].apply(stream);
- };
- }(i);
- }
- }
-
- stream.on("error", (err) => {
- errorOrDestroy(this, err);
- });
-
- stream.on("close", () => {
- this.emit("close");
- });
-
- stream.on("destroy", () => {
- this.emit("destroy");
- });
-
- stream.on("pause", () => {
- this.emit("pause");
- });
-
- stream.on("resume", () => {
- this.emit("resume");
- });
-
- this._read = () => {
- if (paused) {
- paused = false;
- // By the time this is triggered, stream will be a readable stream
- // deno-lint-ignore ban-ts-comment
- //@ts-ignore
- stream.resume();
- }
- };
-
- return this;
- }
-
- [Symbol.asyncIterator]() {
- return createReadableStreamAsyncIterator(this);
- }
-
- get readable(): boolean {
- return this._readableState?.readable &&
- !this._readableState?.destroyed &&
- !this._readableState?.errorEmitted &&
- !this._readableState?.endEmitted;
- }
- set readable(val: boolean) {
- if (this._readableState) {
- this._readableState.readable = val;
- }
- }
-
- get readableHighWaterMark(): number {
- return this._readableState.highWaterMark;
- }
-
- get readableBuffer() {
- return this._readableState && this._readableState.buffer;
- }
-
- get readableFlowing(): boolean | null {
- return this._readableState.flowing;
- }
-
- set readableFlowing(state: boolean | null) {
- if (this._readableState) {
- this._readableState.flowing = state;
- }
- }
-
- get readableLength() {
- return this._readableState.length;
- }
-
- get readableObjectMode() {
- return this._readableState ? this._readableState.objectMode : false;
- }
-
- get readableEncoding() {
- return this._readableState ? this._readableState.encoding : null;
- }
-
- get destroyed() {
- if (this._readableState === undefined) {
- return false;
- }
- return this._readableState.destroyed;
- }
-
- set destroyed(value: boolean) {
- if (!this._readableState) {
- return;
- }
- this._readableState.destroyed = value;
- }
-
- get readableEnded() {
- return this._readableState ? this._readableState.endEmitted : false;
- }
-}
-
-Object.defineProperties(Readable, {
- _readableState: { enumerable: false },
- destroyed: { enumerable: false },
- readableBuffer: { enumerable: false },
- readableEncoding: { enumerable: false },
- readableEnded: { enumerable: false },
- readableFlowing: { enumerable: false },
- readableHighWaterMark: { enumerable: false },
- readableLength: { enumerable: false },
- readableObjectMode: { enumerable: false },
-});
-
-export default Readable;
diff --git a/std/node/_stream/readable_internal.ts b/std/node/_stream/readable_internal.ts
deleted file mode 100644
index 0ef261d4d..000000000
--- a/std/node/_stream/readable_internal.ts
+++ /dev/null
@@ -1,438 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { Buffer } from "../buffer.ts";
-import type Duplex from "./duplex.ts";
-import type EventEmitter from "../events.ts";
-import type Readable from "./readable.ts";
-import type Writable from "./writable.ts";
-import type { ReadableState } from "./readable.ts";
-import { kPaused } from "./symbols.ts";
-import {
- ERR_STREAM_PUSH_AFTER_EOF,
- ERR_STREAM_UNSHIFT_AFTER_END_EVENT,
-} from "../_errors.ts";
-
-export function _destroy(
- self: Readable,
- err?: Error | null,
- cb?: (error?: Error | null) => void,
-) {
- self._destroy(err || null, (err) => {
- const r = (self as Readable)._readableState;
-
- if (err) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- err.stack;
-
- if (!r.errored) {
- r.errored = err;
- }
- }
-
- r.closed = true;
-
- if (typeof cb === "function") {
- cb(err);
- }
-
- if (err) {
- queueMicrotask(() => {
- if (!r.errorEmitted) {
- r.errorEmitted = true;
- self.emit("error", err);
- }
- r.closeEmitted = true;
- if (r.emitClose) {
- self.emit("close");
- }
- });
- } else {
- queueMicrotask(() => {
- r.closeEmitted = true;
- if (r.emitClose) {
- self.emit("close");
- }
- });
- }
- });
-}
-
-export function addChunk(
- stream: Duplex | Readable,
- state: ReadableState,
- chunk: string | Buffer | Uint8Array,
- addToFront: boolean,
-) {
- if (state.flowing && state.length === 0 && !state.sync) {
- if (state.multiAwaitDrain) {
- (state.awaitDrainWriters as Set<Writable>).clear();
- } else {
- state.awaitDrainWriters = null;
- }
- stream.emit("data", chunk);
- } else {
- // Update the buffer info.
- state.length += state.objectMode ? 1 : chunk.length;
- if (addToFront) {
- state.buffer.unshift(chunk);
- } else {
- state.buffer.push(chunk);
- }
-
- if (state.needReadable) {
- emitReadable(stream);
- }
- }
- maybeReadMore(stream, state);
-}
-
-// Don't raise the hwm > 1GB.
-const MAX_HWM = 0x40000000;
-export function computeNewHighWaterMark(n: number) {
- if (n >= MAX_HWM) {
- n = MAX_HWM;
- } else {
- n--;
- n |= n >>> 1;
- n |= n >>> 2;
- n |= n >>> 4;
- n |= n >>> 8;
- n |= n >>> 16;
- n++;
- }
- return n;
-}
-
-export function emitReadable(stream: Duplex | Readable) {
- const state = stream._readableState;
- state.needReadable = false;
- if (!state.emittedReadable) {
- state.emittedReadable = true;
- queueMicrotask(() => emitReadable_(stream));
- }
-}
-
-function emitReadable_(stream: Duplex | Readable) {
- const state = stream._readableState;
- if (!state.destroyed && !state.errored && (state.length || state.ended)) {
- stream.emit("readable");
- state.emittedReadable = false;
- }
-
- state.needReadable = !state.flowing &&
- !state.ended &&
- state.length <= state.highWaterMark;
- flow(stream);
-}
-
-export function endReadable(stream: Readable) {
- const state = stream._readableState;
-
- if (!state.endEmitted) {
- state.ended = true;
- queueMicrotask(() => endReadableNT(state, stream));
- }
-}
-
-function endReadableNT(state: ReadableState, stream: Readable) {
- if (
- !state.errorEmitted && !state.closeEmitted &&
- !state.endEmitted && state.length === 0
- ) {
- state.endEmitted = true;
- stream.emit("end");
-
- if (state.autoDestroy) {
- stream.destroy();
- }
- }
-}
-
-export function errorOrDestroy(
- stream: Duplex | Readable,
- err: Error,
- sync = false,
-) {
- const r = stream._readableState;
-
- if (r.destroyed) {
- return stream;
- }
-
- if (r.autoDestroy) {
- stream.destroy(err);
- } else if (err) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- err.stack;
-
- if (!r.errored) {
- r.errored = err;
- }
- if (sync) {
- queueMicrotask(() => {
- if (!r.errorEmitted) {
- r.errorEmitted = true;
- stream.emit("error", err);
- }
- });
- } else if (!r.errorEmitted) {
- r.errorEmitted = true;
- stream.emit("error", err);
- }
- }
-}
-
-function flow(stream: Duplex | Readable) {
- const state = stream._readableState;
- while (state.flowing && stream.read() !== null);
-}
-
-/** Pluck off n bytes from an array of buffers.
-* Length is the combined lengths of all the buffers in the list.
-* This function is designed to be inlinable, so please take care when making
-* changes to the function body.
-*/
-export function fromList(n: number, state: ReadableState) {
- // nothing buffered.
- if (state.length === 0) {
- return null;
- }
-
- let ret;
- if (state.objectMode) {
- ret = state.buffer.shift();
- } else if (!n || n >= state.length) {
- if (state.decoder) {
- ret = state.buffer.join("");
- } else if (state.buffer.length === 1) {
- ret = state.buffer.first();
- } else {
- ret = state.buffer.concat(state.length);
- }
- state.buffer.clear();
- } else {
- ret = state.buffer.consume(n, !!state.decoder);
- }
-
- return ret;
-}
-
-export function howMuchToRead(n: number, state: ReadableState) {
- if (n <= 0 || (state.length === 0 && state.ended)) {
- return 0;
- }
- if (state.objectMode) {
- return 1;
- }
- if (Number.isNaN(n)) {
- // Only flow one buffer at a time.
- if (state.flowing && state.length) {
- return state.buffer.first().length;
- }
- return state.length;
- }
- if (n <= state.length) {
- return n;
- }
- return state.ended ? state.length : 0;
-}
-
-export function maybeReadMore(stream: Readable, state: ReadableState) {
- if (!state.readingMore && state.constructed) {
- state.readingMore = true;
- queueMicrotask(() => maybeReadMore_(stream, state));
- }
-}
-
-function maybeReadMore_(stream: Readable, state: ReadableState) {
- while (
- !state.reading && !state.ended &&
- (state.length < state.highWaterMark ||
- (state.flowing && state.length === 0))
- ) {
- const len = state.length;
- stream.read(0);
- if (len === state.length) {
- // Didn't get any data, stop spinning.
- break;
- }
- }
- state.readingMore = false;
-}
-
-export function nReadingNextTick(self: Duplex | Readable) {
- self.read(0);
-}
-
-export function onEofChunk(stream: Duplex | Readable, state: ReadableState) {
- if (state.ended) return;
- if (state.decoder) {
- const chunk = state.decoder.end();
- if (chunk && chunk.length) {
- state.buffer.push(chunk);
- state.length += state.objectMode ? 1 : chunk.length;
- }
- }
- state.ended = true;
-
- if (state.sync) {
- emitReadable(stream);
- } else {
- state.needReadable = false;
- state.emittedReadable = true;
- emitReadable_(stream);
- }
-}
-
-export function pipeOnDrain(src: Duplex | Readable, dest: Duplex | Writable) {
- return function pipeOnDrainFunctionResult() {
- const state = src._readableState;
-
- if (state.awaitDrainWriters === dest) {
- state.awaitDrainWriters = null;
- } else if (state.multiAwaitDrain) {
- (state.awaitDrainWriters as Set<Duplex | Writable>).delete(dest);
- }
-
- if (
- (!state.awaitDrainWriters ||
- (state.awaitDrainWriters as Set<Writable>).size === 0) &&
- src.listenerCount("data")
- ) {
- state.flowing = true;
- flow(src);
- }
- };
-}
-
-export function prependListener(
- emitter: EventEmitter,
- event: string,
- // deno-lint-ignore no-explicit-any
- fn: (...args: any[]) => any,
-) {
- if (typeof emitter.prependListener === "function") {
- return emitter.prependListener(event, fn);
- }
-
- // This is a hack to make sure that our error handler is attached before any
- // userland ones. NEVER DO THIS. This is here only because this code needs
- // to continue to work with older versions of Node.js that do not include
- //the prependListener() method. The goal is to eventually remove this hack.
- // TODO(Soremwar)
- // Burn it with fire
- // deno-lint-ignore ban-ts-comment
- //@ts-ignore
- if (emitter._events.get(event)?.length) {
- // deno-lint-ignore ban-ts-comment
- //@ts-ignore
- const listeners = [fn, ...emitter._events.get(event)];
- // deno-lint-ignore ban-ts-comment
- //@ts-ignore
- emitter._events.set(event, listeners);
- } else {
- emitter.on(event, fn);
- }
-}
-
-export function readableAddChunk(
- stream: Duplex | Readable,
- chunk: string | Buffer | Uint8Array | null,
- encoding: undefined | string = undefined,
- addToFront: boolean,
-) {
- const state = stream._readableState;
- let usedEncoding = encoding;
-
- let err;
- if (!state.objectMode) {
- if (typeof chunk === "string") {
- usedEncoding = encoding || state.defaultEncoding;
- if (state.encoding !== usedEncoding) {
- if (addToFront && state.encoding) {
- chunk = Buffer.from(chunk, usedEncoding).toString(state.encoding);
- } else {
- chunk = Buffer.from(chunk, usedEncoding);
- usedEncoding = "";
- }
- }
- } else if (chunk instanceof Uint8Array) {
- chunk = Buffer.from(chunk);
- }
- }
-
- if (err) {
- errorOrDestroy(stream, err);
- } else if (chunk === null) {
- state.reading = false;
- onEofChunk(stream, state);
- } else if (state.objectMode || (chunk.length > 0)) {
- if (addToFront) {
- if (state.endEmitted) {
- errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());
- } else {
- addChunk(stream, state, chunk, true);
- }
- } else if (state.ended) {
- errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());
- } else if (state.destroyed || state.errored) {
- return false;
- } else {
- state.reading = false;
- if (state.decoder && !usedEncoding) {
- //TODO(Soremwar)
- //I don't think this cast is right
- chunk = state.decoder.write(Buffer.from(chunk as Uint8Array));
- if (state.objectMode || chunk.length !== 0) {
- addChunk(stream, state, chunk, false);
- } else {
- maybeReadMore(stream, state);
- }
- } else {
- addChunk(stream, state, chunk, false);
- }
- }
- } else if (!addToFront) {
- state.reading = false;
- maybeReadMore(stream, state);
- }
-
- return !state.ended &&
- (state.length < state.highWaterMark || state.length === 0);
-}
-
-export function resume(stream: Duplex | Readable, state: ReadableState) {
- if (!state.resumeScheduled) {
- state.resumeScheduled = true;
- queueMicrotask(() => resume_(stream, state));
- }
-}
-
-function resume_(stream: Duplex | Readable, state: ReadableState) {
- if (!state.reading) {
- stream.read(0);
- }
-
- state.resumeScheduled = false;
- stream.emit("resume");
- flow(stream);
- if (state.flowing && !state.reading) {
- stream.read(0);
- }
-}
-
-export function updateReadableListening(self: Duplex | Readable) {
- const state = self._readableState;
- state.readableListening = self.listenerCount("readable") > 0;
-
- if (state.resumeScheduled && state[kPaused] === false) {
- // Flowing needs to be set to true now, otherwise
- // the upcoming resume will not flow.
- state.flowing = true;
-
- // Crude way to check if we should resume.
- } else if (self.listenerCount("data") > 0) {
- self.resume();
- } else if (!state.readableListening) {
- state.flowing = null;
- }
-}
diff --git a/std/node/_stream/readable_test.ts b/std/node/_stream/readable_test.ts
deleted file mode 100644
index 72767e28f..000000000
--- a/std/node/_stream/readable_test.ts
+++ /dev/null
@@ -1,489 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { Buffer } from "../buffer.ts";
-import Readable from "../_stream/readable.ts";
-import { once } from "../events.ts";
-import { deferred } from "../../async/mod.ts";
-import {
- assert,
- assertEquals,
- assertStrictEquals,
-} from "../../testing/asserts.ts";
-
-Deno.test("Readable stream from iterator", async () => {
- function* generate() {
- yield "a";
- yield "b";
- yield "c";
- }
-
- const stream = Readable.from(generate());
-
- const expected = ["a", "b", "c"];
-
- for await (const chunk of stream) {
- assertStrictEquals(chunk, expected.shift());
- }
-});
-
-Deno.test("Readable stream from async iterator", async () => {
- async function* generate() {
- yield "a";
- yield "b";
- yield "c";
- }
-
- const stream = Readable.from(generate());
-
- const expected = ["a", "b", "c"];
-
- for await (const chunk of stream) {
- assertStrictEquals(chunk, expected.shift());
- }
-});
-
-Deno.test("Readable stream from promise", async () => {
- const promises = [
- Promise.resolve("a"),
- Promise.resolve("b"),
- Promise.resolve("c"),
- ];
-
- const stream = Readable.from(promises);
-
- const expected = ["a", "b", "c"];
-
- for await (const chunk of stream) {
- assertStrictEquals(chunk, expected.shift());
- }
-});
-
-Deno.test("Readable stream from string", async () => {
- const string = "abc";
- const stream = Readable.from(string);
-
- for await (const chunk of stream) {
- assertStrictEquals(chunk, string);
- }
-});
-
-Deno.test("Readable stream from Buffer", async () => {
- const string = "abc";
- const stream = Readable.from(Buffer.from(string));
-
- for await (const chunk of stream) {
- assertStrictEquals((chunk as Buffer).toString(), string);
- }
-});
-
-Deno.test("Readable stream gets destroyed on error", async () => {
- // deno-lint-ignore require-yield
- async function* generate() {
- throw new Error("kaboom");
- }
-
- const stream = Readable.from(generate());
-
- stream.read();
-
- const [err] = await once(stream, "error");
- assertStrictEquals(err.message, "kaboom");
- assertStrictEquals(stream.destroyed, true);
-});
-
-Deno.test("Readable stream works as Transform stream", async () => {
- async function* generate(stream: Readable) {
- for await (const chunk of stream) {
- yield (chunk as string).toUpperCase();
- }
- }
-
- const source = new Readable({
- objectMode: true,
- read() {
- this.push("a");
- this.push("b");
- this.push("c");
- this.push(null);
- },
- });
-
- const stream = Readable.from(generate(source));
-
- const expected = ["A", "B", "C"];
-
- for await (const chunk of stream) {
- assertStrictEquals(chunk, expected.shift());
- }
-});
-
-Deno.test("Readable stream can be paused", () => {
- const readable = new Readable();
-
- // _read is a noop, here.
- readable._read = () => {};
-
- // Default state of a stream is not "paused"
- assert(!readable.isPaused());
-
- // Make the stream start flowing...
- readable.on("data", () => {});
-
- // still not paused.
- assert(!readable.isPaused());
-
- readable.pause();
- assert(readable.isPaused());
- readable.resume();
- assert(!readable.isPaused());
-});
-
-Deno.test("Readable stream sets enconding correctly", () => {
- const readable = new Readable({
- read() {},
- });
-
- readable.setEncoding("utf8");
-
- readable.push(new TextEncoder().encode("DEF"));
- readable.unshift(new TextEncoder().encode("ABC"));
-
- assertStrictEquals(readable.read(), "ABCDEF");
-});
-
-Deno.test("Readable stream sets encoding correctly", () => {
- const readable = new Readable({
- read() {},
- });
-
- readable.setEncoding("utf8");
-
- readable.push(new TextEncoder().encode("DEF"));
- readable.unshift(new TextEncoder().encode("ABC"));
-
- assertStrictEquals(readable.read(), "ABCDEF");
-});
-
-Deno.test("Readable stream holds up a big push", async () => {
- let readExecuted = 0;
- const readExecutedExpected = 3;
- const readExpectedExecutions = deferred();
-
- let endExecuted = 0;
- const endExecutedExpected = 1;
- const endExpectedExecutions = deferred();
-
- const str = "asdfasdfasdfasdfasdf";
-
- const r = new Readable({
- highWaterMark: 5,
- encoding: "utf8",
- });
-
- let reads = 0;
-
- function _read() {
- if (reads === 0) {
- setTimeout(() => {
- r.push(str);
- }, 1);
- reads++;
- } else if (reads === 1) {
- const ret = r.push(str);
- assertEquals(ret, false);
- reads++;
- } else {
- r.push(null);
- }
- }
-
- r._read = () => {
- readExecuted++;
- if (readExecuted == readExecutedExpected) {
- readExpectedExecutions.resolve();
- }
- _read();
- };
-
- r.on("end", () => {
- endExecuted++;
- if (endExecuted == endExecutedExpected) {
- endExpectedExecutions.resolve();
- }
- });
-
- // Push some data in to start.
- // We've never gotten any read event at this point.
- const ret = r.push(str);
- assert(!ret);
- let chunk = r.read();
- assertEquals(chunk, str);
- chunk = r.read();
- assertEquals(chunk, null);
-
- r.once("readable", () => {
- // This time, we'll get *all* the remaining data, because
- // it's been added synchronously, as the read WOULD take
- // us below the hwm, and so it triggered a _read() again,
- // which synchronously added more, which we then return.
- chunk = r.read();
- assertEquals(chunk, str + str);
-
- chunk = r.read();
- assertEquals(chunk, null);
- });
-
- const readTimeout = setTimeout(
- () => readExpectedExecutions.reject(),
- 1000,
- );
- const endTimeout = setTimeout(
- () => endExpectedExecutions.reject(),
- 1000,
- );
- await readExpectedExecutions;
- await endExpectedExecutions;
- clearTimeout(readTimeout);
- clearTimeout(endTimeout);
- assertEquals(readExecuted, readExecutedExpected);
- assertEquals(endExecuted, endExecutedExpected);
-});
-
-Deno.test("Readable stream: 'on' event", async () => {
- async function* generate() {
- yield "a";
- yield "b";
- yield "c";
- }
-
- const stream = Readable.from(generate());
-
- let iterations = 0;
- const expected = ["a", "b", "c"];
-
- stream.on("data", (chunk) => {
- iterations++;
- assertStrictEquals(chunk, expected.shift());
- });
-
- await once(stream, "end");
-
- assertStrictEquals(iterations, 3);
-});
-
-Deno.test("Readable stream: 'data' event", async () => {
- async function* generate() {
- yield "a";
- yield "b";
- yield "c";
- }
-
- const stream = Readable.from(generate(), { objectMode: false });
-
- let iterations = 0;
- const expected = ["a", "b", "c"];
-
- stream.on("data", (chunk) => {
- iterations++;
- assertStrictEquals(chunk instanceof Buffer, true);
- assertStrictEquals(chunk.toString(), expected.shift());
- });
-
- await once(stream, "end");
-
- assertStrictEquals(iterations, 3);
-});
-
-Deno.test("Readable stream: 'data' event on non-object", async () => {
- async function* generate() {
- yield "a";
- yield "b";
- yield "c";
- }
-
- const stream = Readable.from(generate(), { objectMode: false });
-
- let iterations = 0;
- const expected = ["a", "b", "c"];
-
- stream.on("data", (chunk) => {
- iterations++;
- assertStrictEquals(chunk instanceof Buffer, true);
- assertStrictEquals(chunk.toString(), expected.shift());
- });
-
- await once(stream, "end");
-
- assertStrictEquals(iterations, 3);
-});
-
-Deno.test("Readable stream: 'readable' event is emitted but 'read' is not on highWaterMark length exceeded", async () => {
- let readableExecuted = 0;
- const readableExecutedExpected = 1;
- const readableExpectedExecutions = deferred();
-
- const r = new Readable({
- highWaterMark: 3,
- });
-
- r._read = () => {
- throw new Error("_read must not be called");
- };
- r.push(Buffer.from("blerg"));
-
- setTimeout(function () {
- assert(!r._readableState.reading);
- r.on("readable", () => {
- readableExecuted++;
- if (readableExecuted == readableExecutedExpected) {
- readableExpectedExecutions.resolve();
- }
- });
- }, 1);
-
- const readableTimeout = setTimeout(
- () => readableExpectedExecutions.reject(),
- 1000,
- );
- await readableExpectedExecutions;
- clearTimeout(readableTimeout);
- assertEquals(readableExecuted, readableExecutedExpected);
-});
-
-Deno.test("Readable stream: 'readable' and 'read' events are emitted on highWaterMark length not reached", async () => {
- let readableExecuted = 0;
- const readableExecutedExpected = 1;
- const readableExpectedExecutions = deferred();
-
- let readExecuted = 0;
- const readExecutedExpected = 1;
- const readExpectedExecutions = deferred();
-
- const r = new Readable({
- highWaterMark: 3,
- });
-
- r._read = () => {
- readExecuted++;
- if (readExecuted == readExecutedExpected) {
- readExpectedExecutions.resolve();
- }
- };
-
- r.push(Buffer.from("bl"));
-
- setTimeout(function () {
- assert(r._readableState.reading);
- r.on("readable", () => {
- readableExecuted++;
- if (readableExecuted == readableExecutedExpected) {
- readableExpectedExecutions.resolve();
- }
- });
- }, 1);
-
- const readableTimeout = setTimeout(
- () => readableExpectedExecutions.reject(),
- 1000,
- );
- const readTimeout = setTimeout(
- () => readExpectedExecutions.reject(),
- 1000,
- );
- await readableExpectedExecutions;
- await readExpectedExecutions;
- clearTimeout(readableTimeout);
- clearTimeout(readTimeout);
- assertEquals(readableExecuted, readableExecutedExpected);
- assertEquals(readExecuted, readExecutedExpected);
-});
-
-Deno.test("Readable stream: 'readable' event is emitted but 'read' is not on highWaterMark length not reached and stream ended", async () => {
- let readableExecuted = 0;
- const readableExecutedExpected = 1;
- const readableExpectedExecutions = deferred();
-
- const r = new Readable({
- highWaterMark: 30,
- });
-
- r._read = () => {
- throw new Error("Must not be executed");
- };
-
- r.push(Buffer.from("blerg"));
- //This ends the stream and triggers end
- r.push(null);
-
- setTimeout(function () {
- // Assert we're testing what we think we are
- assert(!r._readableState.reading);
- r.on("readable", () => {
- readableExecuted++;
- if (readableExecuted == readableExecutedExpected) {
- readableExpectedExecutions.resolve();
- }
- });
- }, 1);
-
- const readableTimeout = setTimeout(
- () => readableExpectedExecutions.reject(),
- 1000,
- );
- await readableExpectedExecutions;
- clearTimeout(readableTimeout);
- assertEquals(readableExecuted, readableExecutedExpected);
-});
-
-Deno.test("Readable stream: 'read' is emitted on empty string pushed in non-object mode", async () => {
- let endExecuted = 0;
- const endExecutedExpected = 1;
- const endExpectedExecutions = deferred();
-
- const underlyingData = ["", "x", "y", "", "z"];
- const expected = underlyingData.filter((data) => data);
- const result: unknown[] = [];
-
- const r = new Readable({
- encoding: "utf8",
- });
- r._read = function () {
- queueMicrotask(() => {
- if (!underlyingData.length) {
- this.push(null);
- } else {
- this.push(underlyingData.shift());
- }
- });
- };
-
- r.on("readable", () => {
- const data = r.read();
- if (data !== null) result.push(data);
- });
-
- r.on("end", () => {
- endExecuted++;
- if (endExecuted == endExecutedExpected) {
- endExpectedExecutions.resolve();
- }
- assertEquals(result, expected);
- });
-
- const endTimeout = setTimeout(
- () => endExpectedExecutions.reject(),
- 1000,
- );
- await endExpectedExecutions;
- clearTimeout(endTimeout);
- assertEquals(endExecuted, endExecutedExpected);
-});
-
-Deno.test("Readable stream: listeners can be removed", () => {
- const r = new Readable();
- r._read = () => {};
- r.on("data", () => {});
-
- r.removeAllListeners("data");
-
- assertEquals(r.eventNames().length, 0);
-});
diff --git a/std/node/_stream/stream.ts b/std/node/_stream/stream.ts
deleted file mode 100644
index 4daafc77b..000000000
--- a/std/node/_stream/stream.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { Buffer } from "../buffer.ts";
-import EventEmitter from "../events.ts";
-import type Readable from "./readable.ts";
-import type Writable from "./writable.ts";
-import { types } from "../util.ts";
-
-class Stream extends EventEmitter {
- constructor() {
- super();
- }
-
- static _isUint8Array = types.isUint8Array;
- static _uint8ArrayToBuffer = (chunk: Uint8Array) => Buffer.from(chunk);
-
- pipe(dest: Readable | Writable, options?: { end?: boolean }) {
- // deno-lint-ignore no-this-alias
- const source = this;
-
- //TODO(Soremwar)
- //isStdio exist on stdin || stdout only, which extend from Duplex
- //if (!dest._isStdio && (options?.end ?? true)) {
- //Find an alternative to be able to pipe streams to stdin & stdout
- //Port them as well?
- if (options?.end ?? true) {
- source.on("end", onend);
- source.on("close", onclose);
- }
-
- let didOnEnd = false;
- function onend() {
- if (didOnEnd) return;
- didOnEnd = true;
-
- // 'end' is only called on Writable streams
- (dest as Writable).end();
- }
-
- function onclose() {
- if (didOnEnd) return;
- didOnEnd = true;
-
- if (typeof dest.destroy === "function") dest.destroy();
- }
-
- // Don't leave dangling pipes when there are errors.
- function onerror(this: Stream, er: Error) {
- cleanup();
- if (this.listenerCount("error") === 0) {
- throw er; // Unhandled stream error in pipe.
- }
- }
-
- source.on("error", onerror);
- dest.on("error", onerror);
-
- // Remove all the event listeners that were added.
- function cleanup() {
- source.removeListener("end", onend);
- source.removeListener("close", onclose);
-
- source.removeListener("error", onerror);
- dest.removeListener("error", onerror);
-
- source.removeListener("end", cleanup);
- source.removeListener("close", cleanup);
-
- dest.removeListener("close", cleanup);
- }
-
- source.on("end", cleanup);
- source.on("close", cleanup);
-
- dest.on("close", cleanup);
- dest.emit("pipe", source);
-
- return dest;
- }
-}
-
-export default Stream;
diff --git a/std/node/_stream/symbols.ts b/std/node/_stream/symbols.ts
deleted file mode 100644
index addb969d3..000000000
--- a/std/node/_stream/symbols.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-export const kConstruct = Symbol("kConstruct");
-export const kDestroy = Symbol("kDestroy");
-export const kPaused = Symbol("kPaused");
diff --git a/std/node/_stream/transform.ts b/std/node/_stream/transform.ts
deleted file mode 100644
index a4246e81a..000000000
--- a/std/node/_stream/transform.ts
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { Encodings } from "../_utils.ts";
-import Duplex from "./duplex.ts";
-import type { DuplexOptions } from "./duplex.ts";
-import type { writeV } from "./writable_internal.ts";
-import { ERR_METHOD_NOT_IMPLEMENTED } from "../_errors.ts";
-
-const kCallback = Symbol("kCallback");
-
-type TransformFlush = (
- this: Transform,
- // deno-lint-ignore no-explicit-any
- callback: (error?: Error | null, data?: any) => void,
-) => void;
-
-export interface TransformOptions extends DuplexOptions {
- read?(this: Transform, size: number): void;
- write?(
- this: Transform,
- // deno-lint-ignore no-explicit-any
- chunk: any,
- encoding: Encodings,
- callback: (error?: Error | null) => void,
- ): void;
- writev?: writeV;
- final?(this: Transform, callback: (error?: Error | null) => void): void;
- destroy?(
- this: Transform,
- error: Error | null,
- callback: (error: Error | null) => void,
- ): void;
- transform?(
- this: Transform,
- // deno-lint-ignore no-explicit-any
- chunk: any,
- encoding: Encodings,
- // deno-lint-ignore no-explicit-any
- callback: (error?: Error | null, data?: any) => void,
- ): void;
- flush?: TransformFlush;
-}
-
-export default class Transform extends Duplex {
- [kCallback]: null | ((error?: Error | null) => void);
- _flush?: TransformFlush;
-
- constructor(options?: TransformOptions) {
- super(options);
- this._readableState.sync = false;
-
- this[kCallback] = null;
-
- if (options) {
- if (typeof options.transform === "function") {
- this._transform = options.transform;
- }
-
- if (typeof options.flush === "function") {
- this._flush = options.flush;
- }
- }
-
- this.on("prefinish", function (this: Transform) {
- if (typeof this._flush === "function" && !this.destroyed) {
- this._flush((er, data) => {
- if (er) {
- this.destroy(er);
- return;
- }
-
- if (data != null) {
- this.push(data);
- }
- this.push(null);
- });
- } else {
- this.push(null);
- }
- });
- }
-
- _read = () => {
- if (this[kCallback]) {
- const callback = this[kCallback] as (error?: Error | null) => void;
- this[kCallback] = null;
- callback();
- }
- };
-
- _transform(
- // deno-lint-ignore no-explicit-any
- _chunk: any,
- _encoding: string,
- // deno-lint-ignore no-explicit-any
- _callback: (error?: Error | null, data?: any) => void,
- ) {
- throw new ERR_METHOD_NOT_IMPLEMENTED("_transform()");
- }
-
- _write = (
- // deno-lint-ignore no-explicit-any
- chunk: any,
- encoding: string,
- callback: (error?: Error | null) => void,
- ) => {
- const rState = this._readableState;
- const wState = this._writableState;
- const length = rState.length;
-
- this._transform(chunk, encoding, (err, val) => {
- if (err) {
- callback(err);
- return;
- }
-
- if (val != null) {
- this.push(val);
- }
-
- if (
- wState.ended || // Backwards compat.
- length === rState.length || // Backwards compat.
- rState.length < rState.highWaterMark ||
- rState.length === 0
- ) {
- callback();
- } else {
- this[kCallback] = callback;
- }
- });
- };
-}
diff --git a/std/node/_stream/transform_test.ts b/std/node/_stream/transform_test.ts
deleted file mode 100644
index d3b90ff01..000000000
--- a/std/node/_stream/transform_test.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { Buffer } from "../buffer.ts";
-import Transform from "./transform.ts";
-import finished from "./end_of_stream.ts";
-import { deferred } from "../../async/mod.ts";
-import { assert, assertEquals } from "../../testing/asserts.ts";
-
-Deno.test("Transform stream finishes correctly", async () => {
- let finishedExecuted = 0;
- const finishedExecutedExpected = 1;
- const finishedExecution = deferred();
-
- const tr = new Transform({
- transform(_data, _enc, cb) {
- cb();
- },
- });
-
- let finish = false;
- let ended = false;
-
- tr.on("end", () => {
- ended = true;
- });
-
- tr.on("finish", () => {
- finish = true;
- });
-
- finished(tr, (err) => {
- finishedExecuted++;
- if (finishedExecuted === finishedExecutedExpected) {
- finishedExecution.resolve();
- }
- assert(!err, "no error");
- assert(finish);
- assert(ended);
- });
-
- tr.end();
- tr.resume();
-
- const finishedTimeout = setTimeout(
- () => finishedExecution.reject(),
- 1000,
- );
- await finishedExecution;
- clearTimeout(finishedTimeout);
- assertEquals(finishedExecuted, finishedExecutedExpected);
-});
-
-Deno.test("Transform stream flushes data correctly", () => {
- const expected = "asdf";
-
- const t = new Transform({
- transform: (_d, _e, n) => {
- n();
- },
- flush: (n) => {
- n(null, expected);
- },
- });
-
- t.end(Buffer.from("blerg"));
- t.on("data", (data) => {
- assertEquals(data.toString(), expected);
- });
-});
diff --git a/std/node/_stream/writable.ts b/std/node/_stream/writable.ts
deleted file mode 100644
index 534fc22fb..000000000
--- a/std/node/_stream/writable.ts
+++ /dev/null
@@ -1,443 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { Buffer } from "../buffer.ts";
-import Stream from "./stream.ts";
-import { captureRejectionSymbol } from "../events.ts";
-import {
- ERR_INVALID_ARG_TYPE,
- ERR_INVALID_OPT_VALUE,
- ERR_METHOD_NOT_IMPLEMENTED,
- ERR_STREAM_ALREADY_FINISHED,
- ERR_STREAM_CANNOT_PIPE,
- ERR_STREAM_DESTROYED,
- ERR_STREAM_NULL_VALUES,
- ERR_STREAM_WRITE_AFTER_END,
- ERR_UNKNOWN_ENCODING,
-} from "../_errors.ts";
-import type { AfterWriteTick, writeV } from "./writable_internal.ts";
-import {
- clearBuffer,
- destroy,
- errorBuffer,
- errorOrDestroy,
- finishMaybe,
- kOnFinished,
- nop,
- onwrite,
- resetBuffer,
- writeOrBuffer,
-} from "./writable_internal.ts";
-import type { Encodings } from "../_utils.ts";
-
-type WritableEncodings = Encodings | "buffer";
-
-export interface WritableOptions {
- autoDestroy?: boolean;
- decodeStrings?: boolean;
- defaultEncoding?: WritableEncodings;
- destroy?(
- this: Writable,
- error: Error | null,
- callback: (error: Error | null) => void,
- ): void;
- emitClose?: boolean;
- final?(this: Writable, callback: (error?: Error | null) => void): void;
- highWaterMark?: number;
- objectMode?: boolean;
- write?(
- this: Writable,
- // deno-lint-ignore no-explicit-any
- chunk: any,
- encoding: WritableEncodings,
- callback: (error?: Error | null) => void,
- ): void;
- writev?(
- this: Writable,
- // deno-lint-ignore no-explicit-any
- chunks: Array<{ chunk: any; encoding: string }>,
- callback: (error?: Error | null) => void,
- ): void;
-}
-
-export class WritableState {
- [kOnFinished]: Array<(error?: Error) => void> = [];
- afterWriteTickInfo: null | AfterWriteTick = null;
- allBuffers = true;
- allNoop = true;
- autoDestroy: boolean;
- buffered: Array<{
- allBuffers?: boolean;
- // deno-lint-ignore no-explicit-any
- chunk: any;
- encoding: string;
- callback: (error: Error) => void;
- }> = [];
- bufferedIndex = 0;
- bufferProcessing = false;
- closed = false;
- closeEmitted = false;
- constructed: boolean;
- corked = 0;
- decodeStrings: boolean;
- defaultEncoding: WritableEncodings;
- destroyed = false;
- emitClose: boolean;
- ended = false;
- ending = false;
- errored: Error | null = null;
- errorEmitted = false;
- finalCalled = false;
- finished = false;
- highWaterMark: number;
- length = 0;
- needDrain = false;
- objectMode: boolean;
- onwrite: (error?: Error | null) => void;
- pendingcb = 0;
- prefinished = false;
- sync = true;
- writecb: null | ((error: Error) => void) = null;
- writable = true;
- writelen = 0;
- writing = false;
-
- constructor(options: WritableOptions | undefined, stream: Writable) {
- this.objectMode = !!options?.objectMode;
-
- this.highWaterMark = options?.highWaterMark ??
- (this.objectMode ? 16 : 16 * 1024);
-
- if (Number.isInteger(this.highWaterMark) && this.highWaterMark >= 0) {
- this.highWaterMark = Math.floor(this.highWaterMark);
- } else {
- throw new ERR_INVALID_OPT_VALUE("highWaterMark", this.highWaterMark);
- }
-
- this.decodeStrings = !options?.decodeStrings === false;
-
- this.defaultEncoding = options?.defaultEncoding || "utf8";
-
- this.onwrite = onwrite.bind(undefined, stream);
-
- resetBuffer(this);
-
- this.emitClose = options?.emitClose ?? true;
- this.autoDestroy = options?.autoDestroy ?? true;
- this.constructed = true;
- }
-
- getBuffer() {
- return this.buffered.slice(this.bufferedIndex);
- }
-
- get bufferedRequestCount() {
- return this.buffered.length - this.bufferedIndex;
- }
-}
-
-/** A bit simpler than readable streams.
-* Implement an async `._write(chunk, encoding, cb)`, and it'll handle all
-* the drain event emission and buffering.
-*/
-class Writable extends Stream {
- _final?: (
- this: Writable,
- callback: (error?: Error | null | undefined) => void,
- ) => void;
- _writableState: WritableState;
- _writev?: writeV | null = null;
-
- constructor(options?: WritableOptions) {
- super();
- this._writableState = new WritableState(options, this);
-
- if (options) {
- if (typeof options.write === "function") {
- this._write = options.write;
- }
-
- if (typeof options.writev === "function") {
- this._writev = options.writev;
- }
-
- if (typeof options.destroy === "function") {
- this._destroy = options.destroy;
- }
-
- if (typeof options.final === "function") {
- this._final = options.final;
- }
- }
- }
-
- [captureRejectionSymbol](err?: Error) {
- this.destroy(err);
- }
-
- static WritableState = WritableState;
-
- get destroyed() {
- return this._writableState ? this._writableState.destroyed : false;
- }
-
- set destroyed(value) {
- if (this._writableState) {
- this._writableState.destroyed = value;
- }
- }
-
- get writable() {
- const w = this._writableState;
- return !w.destroyed && !w.errored && !w.ending && !w.ended;
- }
-
- set writable(val) {
- if (this._writableState) {
- this._writableState.writable = !!val;
- }
- }
-
- get writableFinished() {
- return this._writableState ? this._writableState.finished : false;
- }
-
- get writableObjectMode() {
- return this._writableState ? this._writableState.objectMode : false;
- }
-
- get writableBuffer() {
- return this._writableState && this._writableState.getBuffer();
- }
-
- get writableEnded() {
- return this._writableState ? this._writableState.ending : false;
- }
-
- get writableHighWaterMark() {
- return this._writableState && this._writableState.highWaterMark;
- }
-
- get writableCorked() {
- return this._writableState ? this._writableState.corked : 0;
- }
-
- get writableLength() {
- return this._writableState && this._writableState.length;
- }
-
- _undestroy() {
- const w = this._writableState;
- w.constructed = true;
- w.destroyed = false;
- w.closed = false;
- w.closeEmitted = false;
- w.errored = null;
- w.errorEmitted = false;
- w.ended = false;
- w.ending = false;
- w.finalCalled = false;
- w.prefinished = false;
- w.finished = false;
- }
-
- _destroy(err: Error | null, cb: (error?: Error | null) => void) {
- cb(err);
- }
-
- destroy(err?: Error | null, cb?: () => void) {
- const state = this._writableState;
- if (!state.destroyed) {
- queueMicrotask(() => errorBuffer(state));
- }
- destroy.call(this, err, cb);
- return this;
- }
-
- end(cb?: () => void): void;
- // deno-lint-ignore no-explicit-any
- end(chunk: any, cb?: () => void): void;
- // deno-lint-ignore no-explicit-any
- end(chunk: any, encoding: WritableEncodings, cb?: () => void): void;
-
- end(
- // deno-lint-ignore no-explicit-any
- x?: any | (() => void),
- y?: WritableEncodings | (() => void),
- z?: () => void,
- ) {
- const state = this._writableState;
- // deno-lint-ignore no-explicit-any
- let chunk: any | null;
- let encoding: WritableEncodings | null;
- let cb: undefined | ((error?: Error) => void);
-
- if (typeof x === "function") {
- chunk = null;
- encoding = null;
- cb = x;
- } else if (typeof y === "function") {
- chunk = x;
- encoding = null;
- cb = y;
- } else {
- chunk = x;
- encoding = y as WritableEncodings;
- cb = z;
- }
-
- if (chunk !== null && chunk !== undefined) {
- this.write(chunk, encoding);
- }
-
- if (state.corked) {
- state.corked = 1;
- this.uncork();
- }
-
- let err: Error | undefined;
- if (!state.errored && !state.ending) {
- state.ending = true;
- finishMaybe(this, state, true);
- state.ended = true;
- } else if (state.finished) {
- err = new ERR_STREAM_ALREADY_FINISHED("end");
- } else if (state.destroyed) {
- err = new ERR_STREAM_DESTROYED("end");
- }
-
- if (typeof cb === "function") {
- if (err || state.finished) {
- queueMicrotask(() => {
- (cb as (error?: Error | undefined) => void)(err);
- });
- } else {
- state[kOnFinished].push(cb);
- }
- }
-
- return this;
- }
-
- _write(
- // deno-lint-ignore no-explicit-any
- chunk: any,
- encoding: string,
- cb: (error?: Error | null) => void,
- ): void {
- if (this._writev) {
- this._writev([{ chunk, encoding }], cb);
- } else {
- throw new ERR_METHOD_NOT_IMPLEMENTED("_write()");
- }
- }
-
- //This signature was changed to keep inheritance coherent
- pipe(dest: Writable): Writable {
- errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());
- return dest;
- }
-
- // deno-lint-ignore no-explicit-any
- write(chunk: any, cb?: (error: Error | null | undefined) => void): boolean;
- write(
- // deno-lint-ignore no-explicit-any
- chunk: any,
- encoding: WritableEncodings | null,
- cb?: (error: Error | null | undefined) => void,
- ): boolean;
-
- write(
- // deno-lint-ignore no-explicit-any
- chunk: any,
- x?: WritableEncodings | null | ((error: Error | null | undefined) => void),
- y?: ((error: Error | null | undefined) => void),
- ) {
- const state = this._writableState;
- let encoding: WritableEncodings;
- let cb: (error?: Error | null) => void;
-
- if (typeof x === "function") {
- cb = x;
- encoding = state.defaultEncoding;
- } else {
- if (!x) {
- encoding = state.defaultEncoding;
- } else if (x !== "buffer" && !Buffer.isEncoding(x)) {
- throw new ERR_UNKNOWN_ENCODING(x);
- } else {
- encoding = x;
- }
- if (typeof y !== "function") {
- cb = nop;
- } else {
- cb = y;
- }
- }
-
- if (chunk === null) {
- throw new ERR_STREAM_NULL_VALUES();
- } else if (!state.objectMode) {
- if (typeof chunk === "string") {
- if (state.decodeStrings !== false) {
- chunk = Buffer.from(chunk, encoding);
- encoding = "buffer";
- }
- } else if (chunk instanceof Buffer) {
- encoding = "buffer";
- } else if (Stream._isUint8Array(chunk)) {
- chunk = Stream._uint8ArrayToBuffer(chunk);
- encoding = "buffer";
- } else {
- throw new ERR_INVALID_ARG_TYPE(
- "chunk",
- ["string", "Buffer", "Uint8Array"],
- chunk,
- );
- }
- }
-
- let err: Error | undefined;
- if (state.ending) {
- err = new ERR_STREAM_WRITE_AFTER_END();
- } else if (state.destroyed) {
- err = new ERR_STREAM_DESTROYED("write");
- }
-
- if (err) {
- queueMicrotask(() => cb(err));
- errorOrDestroy(this, err, true);
- return false;
- }
- state.pendingcb++;
- return writeOrBuffer(this, state, chunk, encoding, cb);
- }
-
- cork() {
- this._writableState.corked++;
- }
-
- uncork() {
- const state = this._writableState;
-
- if (state.corked) {
- state.corked--;
-
- if (!state.writing) {
- clearBuffer(this, state);
- }
- }
- }
-
- setDefaultEncoding(encoding: string) {
- // node::ParseEncoding() requires lower case.
- if (typeof encoding === "string") {
- encoding = encoding.toLowerCase();
- }
- if (!Buffer.isEncoding(encoding)) {
- throw new ERR_UNKNOWN_ENCODING(encoding);
- }
- this._writableState.defaultEncoding = encoding as WritableEncodings;
- return this;
- }
-}
-
-export default Writable;
diff --git a/std/node/_stream/writable_internal.ts b/std/node/_stream/writable_internal.ts
deleted file mode 100644
index e8c001af0..000000000
--- a/std/node/_stream/writable_internal.ts
+++ /dev/null
@@ -1,457 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import type Duplex from "./duplex.ts";
-import type Writable from "./writable.ts";
-import type { WritableState } from "./writable.ts";
-import { kDestroy } from "./symbols.ts";
-import { ERR_MULTIPLE_CALLBACK, ERR_STREAM_DESTROYED } from "../_errors.ts";
-
-export type writeV = (
- // deno-lint-ignore no-explicit-any
- chunks: Array<{ chunk: any; encoding: string }>,
- callback: (error?: Error | null) => void,
-) => void;
-
-export type AfterWriteTick = {
- cb: (error?: Error) => void;
- count: number;
- state: WritableState;
- stream: Writable;
-};
-
-export const kOnFinished = Symbol("kOnFinished");
-
-function _destroy(
- self: Writable,
- err?: Error | null,
- cb?: (error?: Error | null) => void,
-) {
- self._destroy(err || null, (err) => {
- const w = self._writableState;
-
- if (err) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- err.stack;
-
- if (!w.errored) {
- w.errored = err;
- }
- }
-
- w.closed = true;
-
- if (typeof cb === "function") {
- cb(err);
- }
-
- if (err) {
- queueMicrotask(() => {
- if (!w.errorEmitted) {
- w.errorEmitted = true;
- self.emit("error", err);
- }
- w.closeEmitted = true;
- if (w.emitClose) {
- self.emit("close");
- }
- });
- } else {
- queueMicrotask(() => {
- w.closeEmitted = true;
- if (w.emitClose) {
- self.emit("close");
- }
- });
- }
- });
-}
-
-export function afterWrite(
- stream: Writable,
- state: WritableState,
- count: number,
- cb: (error?: Error) => void,
-) {
- const needDrain = !state.ending && !stream.destroyed && state.length === 0 &&
- state.needDrain;
- if (needDrain) {
- state.needDrain = false;
- stream.emit("drain");
- }
-
- while (count-- > 0) {
- state.pendingcb--;
- cb();
- }
-
- if (state.destroyed) {
- errorBuffer(state);
- }
-
- finishMaybe(stream, state);
-}
-
-export function afterWriteTick({
- cb,
- count,
- state,
- stream,
-}: AfterWriteTick) {
- state.afterWriteTickInfo = null;
- return afterWrite(stream, state, count, cb);
-}
-
-/** If there's something in the buffer waiting, then process it.*/
-export function clearBuffer(stream: Duplex | Writable, state: WritableState) {
- if (
- state.corked ||
- state.bufferProcessing ||
- state.destroyed ||
- !state.constructed
- ) {
- return;
- }
-
- const { buffered, bufferedIndex, objectMode } = state;
- const bufferedLength = buffered.length - bufferedIndex;
-
- if (!bufferedLength) {
- return;
- }
-
- const i = bufferedIndex;
-
- state.bufferProcessing = true;
- if (bufferedLength > 1 && stream._writev) {
- state.pendingcb -= bufferedLength - 1;
-
- const callback = state.allNoop ? nop : (err: Error) => {
- for (let n = i; n < buffered.length; ++n) {
- buffered[n].callback(err);
- }
- };
- const chunks = state.allNoop && i === 0 ? buffered : buffered.slice(i);
-
- doWrite(stream, state, true, state.length, chunks, "", callback);
-
- resetBuffer(state);
- } else {
- do {
- const { chunk, encoding, callback } = buffered[i];
- const len = objectMode ? 1 : chunk.length;
- doWrite(stream, state, false, len, chunk, encoding, callback);
- } while (i < buffered.length && !state.writing);
-
- if (i === buffered.length) {
- resetBuffer(state);
- } else if (i > 256) {
- buffered.splice(0, i);
- state.bufferedIndex = 0;
- } else {
- state.bufferedIndex = i;
- }
- }
- state.bufferProcessing = false;
-}
-
-export function destroy(this: Writable, err?: Error | null, cb?: () => void) {
- const w = this._writableState;
-
- if (w.destroyed) {
- if (typeof cb === "function") {
- cb();
- }
-
- return this;
- }
-
- if (err) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- err.stack;
-
- if (!w.errored) {
- w.errored = err;
- }
- }
-
- w.destroyed = true;
-
- if (!w.constructed) {
- this.once(kDestroy, (er) => {
- _destroy(this, err || er, cb);
- });
- } else {
- _destroy(this, err, cb);
- }
-
- return this;
-}
-
-function doWrite(
- stream: Duplex | Writable,
- state: WritableState,
- writev: boolean,
- len: number,
- // deno-lint-ignore no-explicit-any
- chunk: any,
- encoding: string,
- cb: (error: Error) => void,
-) {
- state.writelen = len;
- state.writecb = cb;
- state.writing = true;
- state.sync = true;
- if (state.destroyed) {
- state.onwrite(new ERR_STREAM_DESTROYED("write"));
- } else if (writev) {
- (stream._writev as unknown as writeV)(chunk, state.onwrite);
- } else {
- stream._write(chunk, encoding, state.onwrite);
- }
- state.sync = false;
-}
-
-/** If there's something in the buffer waiting, then invoke callbacks.*/
-export function errorBuffer(state: WritableState) {
- if (state.writing) {
- return;
- }
-
- for (let n = state.bufferedIndex; n < state.buffered.length; ++n) {
- const { chunk, callback } = state.buffered[n];
- const len = state.objectMode ? 1 : chunk.length;
- state.length -= len;
- callback(new ERR_STREAM_DESTROYED("write"));
- }
-
- for (const callback of state[kOnFinished].splice(0)) {
- callback(new ERR_STREAM_DESTROYED("end"));
- }
-
- resetBuffer(state);
-}
-
-export function errorOrDestroy(stream: Writable, err: Error, sync = false) {
- const w = stream._writableState;
-
- if (w.destroyed) {
- return stream;
- }
-
- if (w.autoDestroy) {
- stream.destroy(err);
- } else if (err) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- err.stack;
-
- if (!w.errored) {
- w.errored = err;
- }
- if (sync) {
- queueMicrotask(() => {
- if (w.errorEmitted) {
- return;
- }
- w.errorEmitted = true;
- stream.emit("error", err);
- });
- } else {
- if (w.errorEmitted) {
- return;
- }
- w.errorEmitted = true;
- stream.emit("error", err);
- }
- }
-}
-
-function finish(stream: Writable, state: WritableState) {
- state.pendingcb--;
- if (state.errorEmitted || state.closeEmitted) {
- return;
- }
-
- state.finished = true;
-
- for (const callback of state[kOnFinished].splice(0)) {
- callback();
- }
-
- stream.emit("finish");
-
- if (state.autoDestroy) {
- stream.destroy();
- }
-}
-
-export function finishMaybe(
- stream: Writable,
- state: WritableState,
- sync?: boolean,
-) {
- if (needFinish(state)) {
- prefinish(stream, state);
- if (state.pendingcb === 0 && needFinish(state)) {
- state.pendingcb++;
- if (sync) {
- queueMicrotask(() => finish(stream, state));
- } else {
- finish(stream, state);
- }
- }
- }
-}
-
-export function needFinish(state: WritableState) {
- return (state.ending &&
- state.constructed &&
- state.length === 0 &&
- !state.errored &&
- state.buffered.length === 0 &&
- !state.finished &&
- !state.writing);
-}
-
-export function nop() {}
-
-export function resetBuffer(state: WritableState) {
- state.buffered = [];
- state.bufferedIndex = 0;
- state.allBuffers = true;
- state.allNoop = true;
-}
-
-function onwriteError(
- stream: Writable,
- state: WritableState,
- er: Error,
- cb: (error: Error) => void,
-) {
- --state.pendingcb;
-
- cb(er);
- errorBuffer(state);
- errorOrDestroy(stream, er);
-}
-
-export function onwrite(stream: Writable, er?: Error | null) {
- const state = stream._writableState;
- const sync = state.sync;
- const cb = state.writecb;
-
- if (typeof cb !== "function") {
- errorOrDestroy(stream, new ERR_MULTIPLE_CALLBACK());
- return;
- }
-
- state.writing = false;
- state.writecb = null;
- state.length -= state.writelen;
- state.writelen = 0;
-
- if (er) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- er.stack;
-
- if (!state.errored) {
- state.errored = er;
- }
-
- if (sync) {
- queueMicrotask(() => onwriteError(stream, state, er, cb));
- } else {
- onwriteError(stream, state, er, cb);
- }
- } else {
- if (state.buffered.length > state.bufferedIndex) {
- clearBuffer(stream, state);
- }
-
- if (sync) {
- if (
- state.afterWriteTickInfo !== null &&
- state.afterWriteTickInfo.cb === cb
- ) {
- state.afterWriteTickInfo.count++;
- } else {
- state.afterWriteTickInfo = {
- count: 1,
- cb: (cb as (error?: Error) => void),
- stream,
- state,
- };
- queueMicrotask(() =>
- afterWriteTick(state.afterWriteTickInfo as AfterWriteTick)
- );
- }
- } else {
- afterWrite(stream, state, 1, cb as (error?: Error) => void);
- }
- }
-}
-
-export function prefinish(stream: Writable, state: WritableState) {
- if (!state.prefinished && !state.finalCalled) {
- if (typeof stream._final === "function" && !state.destroyed) {
- state.finalCalled = true;
-
- state.sync = true;
- state.pendingcb++;
- stream._final((err) => {
- state.pendingcb--;
- if (err) {
- for (const callback of state[kOnFinished].splice(0)) {
- callback(err);
- }
- errorOrDestroy(stream, err, state.sync);
- } else if (needFinish(state)) {
- state.prefinished = true;
- stream.emit("prefinish");
- state.pendingcb++;
- queueMicrotask(() => finish(stream, state));
- }
- });
- state.sync = false;
- } else {
- state.prefinished = true;
- stream.emit("prefinish");
- }
- }
-}
-
-export function writeOrBuffer(
- stream: Duplex | Writable,
- state: WritableState,
- // deno-lint-ignore no-explicit-any
- chunk: any,
- encoding: string,
- callback: (error: Error) => void,
-) {
- const len = state.objectMode ? 1 : chunk.length;
-
- state.length += len;
-
- if (state.writing || state.corked || state.errored || !state.constructed) {
- state.buffered.push({ chunk, encoding, callback });
- if (state.allBuffers && encoding !== "buffer") {
- state.allBuffers = false;
- }
- if (state.allNoop && callback !== nop) {
- state.allNoop = false;
- }
- } else {
- state.writelen = len;
- state.writecb = callback;
- state.writing = true;
- state.sync = true;
- stream._write(chunk, encoding, state.onwrite);
- state.sync = false;
- }
-
- const ret = state.length < state.highWaterMark;
-
- if (!ret) {
- state.needDrain = true;
- }
-
- return ret && !state.errored && !state.destroyed;
-}
diff --git a/std/node/_stream/writable_test.ts b/std/node/_stream/writable_test.ts
deleted file mode 100644
index d6133b65f..000000000
--- a/std/node/_stream/writable_test.ts
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright Node.js contributors. All rights reserved. MIT License.
-import { Buffer } from "../buffer.ts";
-import finished from "./end_of_stream.ts";
-import Writable from "../_stream/writable.ts";
-import { deferred } from "../../async/mod.ts";
-import {
- assert,
- assertEquals,
- assertStrictEquals,
- assertThrows,
-} from "../../testing/asserts.ts";
-
-Deno.test("Writable stream writes correctly", async () => {
- let callback: undefined | ((error?: Error | null | undefined) => void);
-
- let writeExecuted = 0;
- const writeExecutedExpected = 1;
- const writeExpectedExecutions = deferred();
-
- let writevExecuted = 0;
- const writevExecutedExpected = 1;
- const writevExpectedExecutions = deferred();
-
- const writable = new Writable({
- write: (chunk, encoding, cb) => {
- writeExecuted++;
- if (writeExecuted == writeExecutedExpected) {
- writeExpectedExecutions.resolve();
- }
- assert(chunk instanceof Buffer);
- assertStrictEquals(encoding, "buffer");
- assertStrictEquals(String(chunk), "ABC");
- callback = cb;
- },
- writev: (chunks) => {
- writevExecuted++;
- if (writevExecuted == writevExecutedExpected) {
- writevExpectedExecutions.resolve();
- }
- assertStrictEquals(chunks.length, 2);
- assertStrictEquals(chunks[0].encoding, "buffer");
- assertStrictEquals(chunks[1].encoding, "buffer");
- assertStrictEquals(chunks[0].chunk + chunks[1].chunk, "DEFGHI");
- },
- });
-
- writable.write(new TextEncoder().encode("ABC"));
- writable.write(new TextEncoder().encode("DEF"));
- writable.end(new TextEncoder().encode("GHI"));
- callback?.();
-
- const writeTimeout = setTimeout(
- () => writeExpectedExecutions.reject(),
- 1000,
- );
- const writevTimeout = setTimeout(
- () => writevExpectedExecutions.reject(),
- 1000,
- );
- await writeExpectedExecutions;
- await writevExpectedExecutions;
- clearTimeout(writeTimeout);
- clearTimeout(writevTimeout);
- assertEquals(writeExecuted, writeExecutedExpected);
- assertEquals(writevExecuted, writevExecutedExpected);
-});
-
-Deno.test("Writable stream writes Uint8Array in object mode", async () => {
- let writeExecuted = 0;
- const writeExecutedExpected = 1;
- const writeExpectedExecutions = deferred();
-
- const ABC = new TextEncoder().encode("ABC");
-
- const writable = new Writable({
- objectMode: true,
- write: (chunk, encoding, cb) => {
- writeExecuted++;
- if (writeExecuted == writeExecutedExpected) {
- writeExpectedExecutions.resolve();
- }
- assert(!(chunk instanceof Buffer));
- assert(chunk instanceof Uint8Array);
- assertEquals(chunk, ABC);
- assertEquals(encoding, "utf8");
- cb();
- },
- });
-
- writable.end(ABC);
-
- const writeTimeout = setTimeout(
- () => writeExpectedExecutions.reject(),
- 1000,
- );
- await writeExpectedExecutions;
- clearTimeout(writeTimeout);
- assertEquals(writeExecuted, writeExecutedExpected);
-});
-
-Deno.test("Writable stream throws on unexpected close", async () => {
- let finishedExecuted = 0;
- const finishedExecutedExpected = 1;
- const finishedExpectedExecutions = deferred();
-
- const writable = new Writable({
- write: () => {},
- });
- writable.writable = false;
- writable.destroy();
-
- finished(writable, (err) => {
- finishedExecuted++;
- if (finishedExecuted == finishedExecutedExpected) {
- finishedExpectedExecutions.resolve();
- }
- assertEquals(err?.code, "ERR_STREAM_PREMATURE_CLOSE");
- });
-
- const finishedTimeout = setTimeout(
- () => finishedExpectedExecutions.reject(),
- 1000,
- );
- await finishedExpectedExecutions;
- clearTimeout(finishedTimeout);
- assertEquals(finishedExecuted, finishedExecutedExpected);
-});
-
-Deno.test("Writable stream finishes correctly", async () => {
- let finishedExecuted = 0;
- const finishedExecutedExpected = 1;
- const finishedExpectedExecutions = deferred();
-
- const w = new Writable({
- write(_chunk, _encoding, cb) {
- cb();
- },
- autoDestroy: false,
- });
-
- w.end("asd");
-
- queueMicrotask(() => {
- finished(w, () => {
- finishedExecuted++;
- if (finishedExecuted == finishedExecutedExpected) {
- finishedExpectedExecutions.resolve();
- }
- });
- });
-
- const finishedTimeout = setTimeout(
- () => finishedExpectedExecutions.reject(),
- 1000,
- );
- await finishedExpectedExecutions;
- clearTimeout(finishedTimeout);
- assertEquals(finishedExecuted, finishedExecutedExpected);
-});
-
-Deno.test("Writable stream finishes correctly after error", async () => {
- let errorExecuted = 0;
- const errorExecutedExpected = 1;
- const errorExpectedExecutions = deferred();
-
- let finishedExecuted = 0;
- const finishedExecutedExpected = 1;
- const finishedExpectedExecutions = deferred();
-
- const w = new Writable({
- write(_chunk, _encoding, cb) {
- cb(new Error());
- },
- autoDestroy: false,
- });
- w.write("asd");
- w.on("error", () => {
- errorExecuted++;
- if (errorExecuted == errorExecutedExpected) {
- errorExpectedExecutions.resolve();
- }
- finished(w, () => {
- finishedExecuted++;
- if (finishedExecuted == finishedExecutedExpected) {
- finishedExpectedExecutions.resolve();
- }
- });
- });
-
- const errorTimeout = setTimeout(
- () => errorExpectedExecutions.reject(),
- 1000,
- );
- const finishedTimeout = setTimeout(
- () => finishedExpectedExecutions.reject(),
- 1000,
- );
- await finishedExpectedExecutions;
- await errorExpectedExecutions;
- clearTimeout(finishedTimeout);
- clearTimeout(errorTimeout);
- assertEquals(finishedExecuted, finishedExecutedExpected);
- assertEquals(errorExecuted, errorExecutedExpected);
-});
-
-Deno.test("Writable stream fails on 'write' null value", () => {
- const writable = new Writable();
- assertThrows(() => writable.write(null));
-});
diff --git a/std/node/_util/_util_callbackify.ts b/std/node/_util/_util_callbackify.ts
deleted file mode 100644
index e0b862b0e..000000000
--- a/std/node/_util/_util_callbackify.ts
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-//
-// Adapted from Node.js. Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// These are simplified versions of the "real" errors in Node.
-class NodeFalsyValueRejectionError extends Error {
- public reason: unknown;
- public code = "ERR_FALSY_VALUE_REJECTION";
- constructor(reason: unknown) {
- super("Promise was rejected with falsy value");
- this.reason = reason;
- }
-}
-class NodeInvalidArgTypeError extends TypeError {
- public code = "ERR_INVALID_ARG_TYPE";
- constructor(argumentName: string) {
- super(`The ${argumentName} argument must be of type function.`);
- }
-}
-
-type Callback<ResultT> =
- | ((err: Error) => void)
- | ((err: null, result: ResultT) => void);
-
-function callbackify<ResultT>(
- fn: () => PromiseLike<ResultT>,
-): (callback: Callback<ResultT>) => void;
-function callbackify<ArgT, ResultT>(
- fn: (arg: ArgT) => PromiseLike<ResultT>,
-): (arg: ArgT, callback: Callback<ResultT>) => void;
-function callbackify<Arg1T, Arg2T, ResultT>(
- fn: (arg1: Arg1T, arg2: Arg2T) => PromiseLike<ResultT>,
-): (arg1: Arg1T, arg2: Arg2T, callback: Callback<ResultT>) => void;
-function callbackify<Arg1T, Arg2T, Arg3T, ResultT>(
- fn: (arg1: Arg1T, arg2: Arg2T, arg3: Arg3T) => PromiseLike<ResultT>,
-): (arg1: Arg1T, arg2: Arg2T, arg3: Arg3T, callback: Callback<ResultT>) => void;
-function callbackify<Arg1T, Arg2T, Arg3T, Arg4T, ResultT>(
- fn: (
- arg1: Arg1T,
- arg2: Arg2T,
- arg3: Arg3T,
- arg4: Arg4T,
- ) => PromiseLike<ResultT>,
-): (
- arg1: Arg1T,
- arg2: Arg2T,
- arg3: Arg3T,
- arg4: Arg4T,
- callback: Callback<ResultT>,
-) => void;
-function callbackify<Arg1T, Arg2T, Arg3T, Arg4T, Arg5T, ResultT>(
- fn: (
- arg1: Arg1T,
- arg2: Arg2T,
- arg3: Arg3T,
- arg4: Arg4T,
- arg5: Arg5T,
- ) => PromiseLike<ResultT>,
-): (
- arg1: Arg1T,
- arg2: Arg2T,
- arg3: Arg3T,
- arg4: Arg4T,
- arg5: Arg5T,
- callback: Callback<ResultT>,
-) => void;
-
-// deno-lint-ignore no-explicit-any
-function callbackify(original: any): any {
- if (typeof original !== "function") {
- throw new NodeInvalidArgTypeError('"original"');
- }
-
- const callbackified = function (this: unknown, ...args: unknown[]): void {
- const maybeCb = args.pop();
- if (typeof maybeCb !== "function") {
- throw new NodeInvalidArgTypeError("last");
- }
- const cb = (...args: unknown[]): void => {
- maybeCb.apply(this, args);
- };
- original.apply(this, args).then(
- (ret: unknown) => {
- queueMicrotask(cb.bind(this, null, ret));
- },
- (rej: unknown) => {
- rej = rej || new NodeFalsyValueRejectionError(rej);
- queueMicrotask(cb.bind(this, rej));
- },
- );
- };
-
- const descriptors = Object.getOwnPropertyDescriptors(original);
- // It is possible to manipulate a functions `length` or `name` property. This
- // guards against the manipulation.
- if (typeof descriptors.length.value === "number") {
- descriptors.length.value++;
- }
- if (typeof descriptors.name.value === "string") {
- descriptors.name.value += "Callbackified";
- }
- Object.defineProperties(callbackified, descriptors);
- return callbackified;
-}
-
-export { callbackify };
diff --git a/std/node/_util/_util_callbackify_test.ts b/std/node/_util/_util_callbackify_test.ts
deleted file mode 100644
index 9e5281409..000000000
--- a/std/node/_util/_util_callbackify_test.ts
+++ /dev/null
@@ -1,390 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-//
-// Adapted from Node.js. Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-import { assert, assertStrictEquals } from "../../testing/asserts.ts";
-import { callbackify } from "./_util_callbackify.ts";
-
-const values = [
- "hello world",
- null,
- undefined,
- false,
- 0,
- {},
- { key: "value" },
- Symbol("I am a symbol"),
- function ok(): void {},
- ["array", "with", 4, "values"],
- new Error("boo"),
-];
-
-class TestQueue {
- #waitingPromise: Promise<void>;
- #resolve?: () => void;
- #reject?: (err: unknown) => void;
- #queueSize = 0;
-
- constructor() {
- this.#waitingPromise = new Promise((resolve, reject) => {
- this.#resolve = resolve;
- this.#reject = reject;
- });
- }
-
- enqueue(fn: (done: () => void) => void): void {
- this.#queueSize++;
- try {
- fn(() => {
- this.#queueSize--;
- if (this.#queueSize === 0) {
- assert(
- this.#resolve,
- "Test setup error; async queue is missing #resolve",
- );
- this.#resolve();
- }
- });
- } catch (err) {
- assert(this.#reject, "Test setup error; async queue is missing #reject");
- this.#reject(err);
- }
- }
-
- waitForCompletion(): Promise<void> {
- return this.#waitingPromise;
- }
-}
-
-Deno.test(
- "callbackify passes the resolution value as the second argument to the callback",
- async () => {
- const testQueue = new TestQueue();
-
- for (const value of values) {
- // deno-lint-ignore require-await
- const asyncFn = async (): Promise<typeof value> => {
- return value;
- };
- const cbAsyncFn = callbackify(asyncFn);
- testQueue.enqueue((done) => {
- cbAsyncFn((err: unknown, ret: unknown) => {
- assertStrictEquals(err, null);
- assertStrictEquals(ret, value);
- done();
- });
- });
-
- const promiseFn = (): Promise<typeof value> => {
- return Promise.resolve(value);
- };
- const cbPromiseFn = callbackify(promiseFn);
- testQueue.enqueue((done) => {
- cbPromiseFn((err: unknown, ret: unknown) => {
- assertStrictEquals(err, null);
- assertStrictEquals(ret, value);
- done();
- });
- });
-
- // deno-lint-ignore no-explicit-any
- const thenableFn = (): PromiseLike<any> => {
- return {
- // deno-lint-ignore no-explicit-any
- then(onfulfilled): PromiseLike<any> {
- assert(onfulfilled);
- onfulfilled(value);
- return this;
- },
- };
- };
- const cbThenableFn = callbackify(thenableFn);
- testQueue.enqueue((done) => {
- cbThenableFn((err: unknown, ret: unknown) => {
- assertStrictEquals(err, null);
- assertStrictEquals(ret, value);
- done();
- });
- });
- }
-
- await testQueue.waitForCompletion();
- },
-);
-
-Deno.test(
- "callbackify passes the rejection value as the first argument to the callback",
- async () => {
- const testQueue = new TestQueue();
-
- for (const value of values) {
- // deno-lint-ignore require-await
- const asyncFn = async (): Promise<never> => {
- return Promise.reject(value);
- };
- const cbAsyncFn = callbackify(asyncFn);
- assertStrictEquals(cbAsyncFn.length, 1);
- assertStrictEquals(cbAsyncFn.name, "asyncFnCallbackified");
- testQueue.enqueue((done) => {
- cbAsyncFn((err: unknown, ret: unknown) => {
- assertStrictEquals(ret, undefined);
- if (err instanceof Error) {
- if ("reason" in err) {
- assert(!value);
- assertStrictEquals(
- // deno-lint-ignore no-explicit-any
- (err as any).code,
- "ERR_FALSY_VALUE_REJECTION",
- );
- // deno-lint-ignore no-explicit-any
- assertStrictEquals((err as any).reason, value);
- } else {
- assertStrictEquals(String(value).endsWith(err.message), true);
- }
- } else {
- assertStrictEquals(err, value);
- }
- done();
- });
- });
-
- const promiseFn = (): Promise<never> => {
- return Promise.reject(value);
- };
- const obj = {};
- Object.defineProperty(promiseFn, "name", {
- value: obj,
- writable: false,
- enumerable: false,
- configurable: true,
- });
-
- const cbPromiseFn = callbackify(promiseFn);
- assertStrictEquals(promiseFn.name, obj);
- testQueue.enqueue((done) => {
- cbPromiseFn((err: unknown, ret: unknown) => {
- assertStrictEquals(ret, undefined);
- if (err instanceof Error) {
- if ("reason" in err) {
- assert(!value);
- assertStrictEquals(
- // deno-lint-ignore no-explicit-any
- (err as any).code,
- "ERR_FALSY_VALUE_REJECTION",
- );
- // deno-lint-ignore no-explicit-any
- assertStrictEquals((err as any).reason, value);
- } else {
- assertStrictEquals(String(value).endsWith(err.message), true);
- }
- } else {
- assertStrictEquals(err, value);
- }
- done();
- });
- });
-
- const thenableFn = (): PromiseLike<never> => {
- return {
- then(onfulfilled, onrejected): PromiseLike<never> {
- assert(onrejected);
- onrejected(value);
- return this;
- },
- };
- };
-
- const cbThenableFn = callbackify(thenableFn);
- testQueue.enqueue((done) => {
- cbThenableFn((err: unknown, ret: unknown) => {
- assertStrictEquals(ret, undefined);
- if (err instanceof Error) {
- if ("reason" in err) {
- assert(!value);
- assertStrictEquals(
- // deno-lint-ignore no-explicit-any
- (err as any).code,
- "ERR_FALSY_VALUE_REJECTION",
- );
- // deno-lint-ignore no-explicit-any
- assertStrictEquals((err as any).reason, value);
- } else {
- assertStrictEquals(String(value).endsWith(err.message), true);
- }
- } else {
- assertStrictEquals(err, value);
- }
- done();
- });
- });
- }
-
- await testQueue.waitForCompletion();
- },
-);
-
-Deno.test("callbackify passes arguments to the original", async () => {
- const testQueue = new TestQueue();
-
- for (const value of values) {
- // deno-lint-ignore require-await
- const asyncFn = async (arg: typeof value): Promise<typeof value> => {
- assertStrictEquals(arg, value);
- return arg;
- };
-
- const cbAsyncFn = callbackify(asyncFn);
- assertStrictEquals(cbAsyncFn.length, 2);
- assert(Object.getPrototypeOf(cbAsyncFn) !== Object.getPrototypeOf(asyncFn));
- assertStrictEquals(Object.getPrototypeOf(cbAsyncFn), Function.prototype);
- testQueue.enqueue((done) => {
- cbAsyncFn(value, (err: unknown, ret: unknown) => {
- assertStrictEquals(err, null);
- assertStrictEquals(ret, value);
- done();
- });
- });
-
- const promiseFn = <T>(arg: typeof value): Promise<typeof value> => {
- assertStrictEquals(arg, value);
- return Promise.resolve(arg);
- };
- const obj = {};
- Object.defineProperty(promiseFn, "length", {
- value: obj,
- writable: false,
- enumerable: false,
- configurable: true,
- });
-
- const cbPromiseFn = callbackify(promiseFn);
- assertStrictEquals(promiseFn.length, obj);
- testQueue.enqueue((done) => {
- cbPromiseFn(value, (err: unknown, ret: unknown) => {
- assertStrictEquals(err, null);
- assertStrictEquals(ret, value);
- done();
- });
- });
- }
-
- await testQueue.waitForCompletion();
-});
-
-Deno.test("callbackify preserves the `this` binding", async () => {
- const testQueue = new TestQueue();
-
- for (const value of values) {
- const objectWithSyncFunction = {
- fn(this: unknown, arg: typeof value): Promise<typeof value> {
- assertStrictEquals(this, objectWithSyncFunction);
- return Promise.resolve(arg);
- },
- };
- const cbSyncFunction = callbackify(objectWithSyncFunction.fn);
- testQueue.enqueue((done) => {
- cbSyncFunction.call(objectWithSyncFunction, value, function (
- this: unknown,
- err: unknown,
- ret: unknown,
- ) {
- assertStrictEquals(err, null);
- assertStrictEquals(ret, value);
- assertStrictEquals(this, objectWithSyncFunction);
- done();
- });
- });
-
- const objectWithAsyncFunction = {
- // deno-lint-ignore require-await
- async fn(this: unknown, arg: typeof value): Promise<typeof value> {
- assertStrictEquals(this, objectWithAsyncFunction);
- return arg;
- },
- };
- const cbAsyncFunction = callbackify(objectWithAsyncFunction.fn);
- testQueue.enqueue((done) => {
- cbAsyncFunction.call(objectWithAsyncFunction, value, function (
- this: unknown,
- err: unknown,
- ret: unknown,
- ) {
- assertStrictEquals(err, null);
- assertStrictEquals(ret, value);
- assertStrictEquals(this, objectWithAsyncFunction);
- done();
- });
- });
- }
-
- await testQueue.waitForCompletion();
-});
-
-Deno.test("callbackify throws with non-function inputs", () => {
- ["foo", null, undefined, false, 0, {}, Symbol(), []].forEach((value) => {
- try {
- // deno-lint-ignore no-explicit-any
- callbackify(value as any);
- throw Error("We should never reach this error");
- } catch (err) {
- assert(err instanceof TypeError);
- // deno-lint-ignore no-explicit-any
- assertStrictEquals((err as any).code, "ERR_INVALID_ARG_TYPE");
- assertStrictEquals(err.name, "TypeError");
- assertStrictEquals(
- err.message,
- 'The "original" argument must be of type function.',
- );
- }
- });
-});
-
-Deno.test(
- "callbackify returns a function that throws if the last argument is not a function",
- () => {
- // deno-lint-ignore require-await
- async function asyncFn(): Promise<number> {
- return 42;
- }
-
- // deno-lint-ignore no-explicit-any
- const cb = callbackify(asyncFn) as any;
- const args: unknown[] = [];
-
- ["foo", null, undefined, false, 0, {}, Symbol(), []].forEach((value) => {
- args.push(value);
-
- try {
- cb(...args);
- throw Error("We should never reach this error");
- } catch (err) {
- assert(err instanceof TypeError);
- // deno-lint-ignore no-explicit-any
- assertStrictEquals((err as any).code, "ERR_INVALID_ARG_TYPE");
- assertStrictEquals(err.name, "TypeError");
- assertStrictEquals(
- err.message,
- "The last argument must be of type function.",
- );
- }
- });
- },
-);
diff --git a/std/node/_util/_util_promisify.ts b/std/node/_util/_util_promisify.ts
deleted file mode 100644
index 6692677ec..000000000
--- a/std/node/_util/_util_promisify.ts
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-//
-// Adapted from Node.js. Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// Hack: work around the following TypeScript error:
-// error: TS2345 [ERROR]: Argument of type 'typeof kCustomPromisifiedSymbol'
-// is not assignable to parameter of type 'typeof kCustomPromisifiedSymbol'.
-// assertStrictEquals(kCustomPromisifiedSymbol, promisify.custom);
-// ~~~~~~~~~~~~~~~~
-declare const _CustomPromisifiedSymbol: unique symbol;
-declare const _CustomPromisifyArgsSymbol: unique symbol;
-declare let Symbol: SymbolConstructor;
-interface SymbolConstructor {
- for(key: "nodejs.util.promisify.custom"): typeof _CustomPromisifiedSymbol;
- for(
- key: "nodejs.util.promisify.customArgs",
- ): typeof _CustomPromisifyArgsSymbol;
-}
-// End hack.
-
-// In addition to being accessible through util.promisify.custom,
-// this symbol is registered globally and can be accessed in any environment as
-// Symbol.for('nodejs.util.promisify.custom').
-const kCustomPromisifiedSymbol = Symbol.for("nodejs.util.promisify.custom");
-// This is an internal Node symbol used by functions returning multiple
-// arguments, e.g. ['bytesRead', 'buffer'] for fs.read().
-const kCustomPromisifyArgsSymbol = Symbol.for(
- "nodejs.util.promisify.customArgs",
-);
-
-class NodeInvalidArgTypeError extends TypeError {
- public code = "ERR_INVALID_ARG_TYPE";
- constructor(argumentName: string, type: string, received: unknown) {
- super(
- `The "${argumentName}" argument must be of type ${type}. Received ${typeof received}`,
- );
- }
-}
-
-export function promisify(
- // deno-lint-ignore no-explicit-any
- original: (...args: any[]) => void,
- // deno-lint-ignore no-explicit-any
-): (...args: any[]) => Promise<any> {
- if (typeof original !== "function") {
- throw new NodeInvalidArgTypeError("original", "Function", original);
- }
- // deno-lint-ignore no-explicit-any
- if ((original as any)[kCustomPromisifiedSymbol]) {
- // deno-lint-ignore no-explicit-any
- const fn = (original as any)[kCustomPromisifiedSymbol];
- if (typeof fn !== "function") {
- throw new NodeInvalidArgTypeError(
- "util.promisify.custom",
- "Function",
- fn,
- );
- }
- return Object.defineProperty(fn, kCustomPromisifiedSymbol, {
- value: fn,
- enumerable: false,
- writable: false,
- configurable: true,
- });
- }
-
- // Names to create an object from in case the callback receives multiple
- // arguments, e.g. ['bytesRead', 'buffer'] for fs.read.
- // deno-lint-ignore no-explicit-any
- const argumentNames = (original as any)[kCustomPromisifyArgsSymbol];
- // deno-lint-ignore no-explicit-any
- function fn(this: any, ...args: unknown[]): Promise<unknown> {
- return new Promise((resolve, reject) => {
- original.call(this, ...args, (err: Error, ...values: unknown[]) => {
- if (err) {
- return reject(err);
- }
- if (argumentNames !== undefined && values.length > 1) {
- const obj = {};
- for (let i = 0; i < argumentNames.length; i++) {
- // deno-lint-ignore no-explicit-any
- (obj as any)[argumentNames[i]] = values[i];
- }
- resolve(obj);
- } else {
- resolve(values[0]);
- }
- });
- });
- }
-
- Object.setPrototypeOf(fn, Object.getPrototypeOf(original));
-
- Object.defineProperty(fn, kCustomPromisifiedSymbol, {
- value: fn,
- enumerable: false,
- writable: false,
- configurable: true,
- });
- return Object.defineProperties(
- fn,
- Object.getOwnPropertyDescriptors(original),
- );
-}
-
-promisify.custom = kCustomPromisifiedSymbol;
diff --git a/std/node/_util/_util_promisify_test.ts b/std/node/_util/_util_promisify_test.ts
deleted file mode 100644
index 39f7de75c..000000000
--- a/std/node/_util/_util_promisify_test.ts
+++ /dev/null
@@ -1,236 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-//
-// Adapted from Node.js. Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-import {
- assert,
- assertEquals,
- assertStrictEquals,
- assertThrowsAsync,
-} from "../../testing/asserts.ts";
-import { promisify } from "./_util_promisify.ts";
-import * as fs from "../fs.ts";
-
-// deno-lint-ignore no-explicit-any
-type VoidFunction = (...args: any[]) => void;
-
-const readFile = promisify(fs.readFile);
-const customPromisifyArgs = Symbol.for("nodejs.util.promisify.customArgs");
-
-Deno.test(
- "Errors should reject the promise",
- async function testPromiseRejection() {
- await assertThrowsAsync(() => readFile("/dontexist"), Deno.errors.NotFound);
- },
-);
-
-Deno.test("Promisify.custom", async function testPromisifyCustom() {
- function fn(): void {}
-
- function promisifedFn(): void {}
- // @ts-expect-error TypeScript (as of 3.7) does not support indexing namespaces by symbol
- fn[promisify.custom] = promisifedFn;
-
- const promisifiedFnA = promisify(fn);
- const promisifiedFnB = promisify(promisifiedFnA);
- assertStrictEquals(promisifiedFnA, promisifedFn);
- assertStrictEquals(promisifiedFnB, promisifedFn);
-
- await promisifiedFnA;
- await promisifiedFnB;
-});
-
-Deno.test("promiisfy.custom symbol", function testPromisifyCustomSymbol() {
- function fn(): void {}
-
- function promisifiedFn(): void {}
-
- // util.promisify.custom is a shared symbol which can be accessed
- // as `Symbol.for("nodejs.util.promisify.custom")`.
- const kCustomPromisifiedSymbol = Symbol.for("nodejs.util.promisify.custom");
- // @ts-expect-error TypeScript (as of 3.7) does not support indexing namespaces by symbol
- fn[kCustomPromisifiedSymbol] = promisifiedFn;
-
- assertStrictEquals(kCustomPromisifiedSymbol, promisify.custom);
- assertStrictEquals(promisify(fn), promisifiedFn);
- assertStrictEquals(promisify(promisify(fn)), promisifiedFn);
-});
-
-Deno.test("Invalid argument should throw", function testThrowInvalidArgument() {
- function fn(): void {}
- // @ts-expect-error TypeScript (as of 3.7) does not support indexing namespaces by symbol
- fn[promisify.custom] = 42;
- try {
- promisify(fn);
- } catch (e) {
- assertStrictEquals(e.code, "ERR_INVALID_ARG_TYPE");
- assert(e instanceof TypeError);
- }
-});
-
-Deno.test("Custom promisify args", async function testPromisifyCustomArgs() {
- const firstValue = 5;
- const secondValue = 17;
-
- function fn(callback: VoidFunction): void {
- callback(null, firstValue, secondValue);
- }
-
- // @ts-expect-error TypeScript (as of 3.7) does not support indexing namespaces by symbol
- fn[customPromisifyArgs] = ["first", "second"];
-
- const obj = await promisify(fn)();
- assertEquals(obj, { first: firstValue, second: secondValue });
-});
-
-Deno.test(
- "Multiple callback args without custom promisify args",
- async function testPromisifyWithoutCustomArgs() {
- function fn(callback: VoidFunction): void {
- callback(null, "foo", "bar");
- }
- const value = await promisify(fn)();
- assertStrictEquals(value, "foo");
- },
-);
-
-Deno.test(
- "Undefined resolved value",
- async function testPromisifyWithUndefinedResolvedValue() {
- function fn(callback: VoidFunction): void {
- callback(null);
- }
- const value = await promisify(fn)();
- assertStrictEquals(value, undefined);
- },
-);
-
-Deno.test(
- "Undefined resolved value II",
- async function testPromisifyWithUndefinedResolvedValueII() {
- function fn(callback: VoidFunction): void {
- callback();
- }
- const value = await promisify(fn)();
- assertStrictEquals(value, undefined);
- },
-);
-
-Deno.test(
- "Resolved value: number",
- async function testPromisifyWithNumberResolvedValue() {
- function fn(err: Error | null, val: number, callback: VoidFunction): void {
- callback(err, val);
- }
- const value = await promisify(fn)(null, 42);
- assertStrictEquals(value, 42);
- },
-);
-
-Deno.test(
- "Rejected value",
- async function testPromisifyWithNumberRejectedValue() {
- function fn(err: Error | null, val: null, callback: VoidFunction): void {
- callback(err, val);
- }
- await assertThrowsAsync(
- () => promisify(fn)(new Error("oops"), null),
- Error,
- "oops",
- );
- },
-);
-
-Deno.test("Rejected value", async function testPromisifyWithAsObjectMethod() {
- const o: { fn?: VoidFunction } = {};
- const fn = promisify(function (this: unknown, cb: VoidFunction): void {
- cb(null, this === o);
- });
-
- o.fn = fn;
-
- const val = await o.fn();
- assert(val);
-});
-
-Deno.test(
- "Multiple callback",
- async function testPromisifyWithMultipleCallback() {
- const err = new Error(
- "Should not have called the callback with the error.",
- );
- const stack = err.stack;
-
- const fn = promisify(function (cb: VoidFunction): void {
- cb(null);
- cb(err);
- });
-
- await fn();
- await Promise.resolve();
- return assertStrictEquals(stack, err.stack);
- },
-);
-
-Deno.test("Promisify a promise", function testPromisifyPromise() {
- function c(): void {}
- const a = promisify(function (): void {});
- const b = promisify(a);
- assert(c !== a);
- assertStrictEquals(a, b);
-});
-
-Deno.test("Test error", async function testInvalidArguments() {
- let errToThrow;
-
- const thrower = promisify(function (
- a: number,
- b: number,
- c: number,
- cb: VoidFunction,
- ): void {
- errToThrow = new Error(`${a}-${b}-${c}-${cb}`);
- throw errToThrow;
- });
-
- try {
- await thrower(1, 2, 3);
- throw new Error(`should've failed`);
- } catch (e) {
- assertStrictEquals(e, errToThrow);
- }
-});
-
-Deno.test("Test invalid arguments", function testInvalidArguments() {
- [undefined, null, true, 0, "str", {}, [], Symbol()].forEach((input) => {
- try {
- // @ts-expect-error TypeScript
- promisify(input);
- } catch (e) {
- assertStrictEquals(e.code, "ERR_INVALID_ARG_TYPE");
- assert(e instanceof TypeError);
- assertEquals(
- e.message,
- `The "original" argument must be of type Function. Received ${typeof input}`,
- );
- }
- });
-});
diff --git a/std/node/_util/_util_types.ts b/std/node/_util/_util_types.ts
deleted file mode 100644
index f64f5377b..000000000
--- a/std/node/_util/_util_types.ts
+++ /dev/null
@@ -1,233 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-//
-// Adapted from Node.js. Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-const _toString = Object.prototype.toString;
-
-const _isObjectLike = (value: unknown): boolean =>
- value !== null && typeof value === "object";
-
-const _isFunctionLike = (value: unknown): boolean =>
- value !== null && typeof value === "function";
-
-export function isAnyArrayBuffer(value: unknown): boolean {
- return (
- _isObjectLike(value) &&
- (_toString.call(value) === "[object ArrayBuffer]" ||
- _toString.call(value) === "[object SharedArrayBuffer]")
- );
-}
-
-export function isArrayBufferView(value: unknown): boolean {
- return ArrayBuffer.isView(value);
-}
-
-export function isArgumentsObject(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object Arguments]";
-}
-
-export function isArrayBuffer(value: unknown): boolean {
- return (
- _isObjectLike(value) && _toString.call(value) === "[object ArrayBuffer]"
- );
-}
-
-export function isAsyncFunction(value: unknown): boolean {
- return (
- _isFunctionLike(value) && _toString.call(value) === "[object AsyncFunction]"
- );
-}
-
-export function isBigInt64Array(value: unknown): boolean {
- return (
- _isObjectLike(value) && _toString.call(value) === "[object BigInt64Array]"
- );
-}
-
-export function isBigUint64Array(value: unknown): boolean {
- return (
- _isObjectLike(value) && _toString.call(value) === "[object BigUint64Array]"
- );
-}
-
-export function isBooleanObject(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object Boolean]";
-}
-
-export function isBoxedPrimitive(value: unknown): boolean {
- return (
- isBooleanObject(value) ||
- isStringObject(value) ||
- isNumberObject(value) ||
- isSymbolObject(value) ||
- isBigIntObject(value)
- );
-}
-
-export function isDataView(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object DataView]";
-}
-
-export function isDate(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object Date]";
-}
-
-// isExternal: Not implemented
-
-export function isFloat32Array(value: unknown): boolean {
- return (
- _isObjectLike(value) && _toString.call(value) === "[object Float32Array]"
- );
-}
-
-export function isFloat64Array(value: unknown): boolean {
- return (
- _isObjectLike(value) && _toString.call(value) === "[object Float64Array]"
- );
-}
-
-export function isGeneratorFunction(value: unknown): boolean {
- return (
- _isFunctionLike(value) &&
- _toString.call(value) === "[object GeneratorFunction]"
- );
-}
-
-export function isGeneratorObject(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object Generator]";
-}
-
-export function isInt8Array(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object Int8Array]";
-}
-
-export function isInt16Array(value: unknown): boolean {
- return (
- _isObjectLike(value) && _toString.call(value) === "[object Int16Array]"
- );
-}
-
-export function isInt32Array(value: unknown): boolean {
- return (
- _isObjectLike(value) && _toString.call(value) === "[object Int32Array]"
- );
-}
-
-export function isMap(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object Map]";
-}
-
-export function isMapIterator(value: unknown): boolean {
- return (
- _isObjectLike(value) && _toString.call(value) === "[object Map Iterator]"
- );
-}
-
-export function isModuleNamespaceObject(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object Module]";
-}
-
-export function isNativeError(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object Error]";
-}
-
-export function isNumberObject(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object Number]";
-}
-
-export function isBigIntObject(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object BigInt]";
-}
-
-export function isPromise(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object Promise]";
-}
-
-export function isRegExp(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object RegExp]";
-}
-
-export function isSet(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object Set]";
-}
-
-export function isSetIterator(value: unknown): boolean {
- return (
- _isObjectLike(value) && _toString.call(value) === "[object Set Iterator]"
- );
-}
-
-export function isSharedArrayBuffer(value: unknown): boolean {
- return (
- _isObjectLike(value) &&
- _toString.call(value) === "[object SharedArrayBuffer]"
- );
-}
-
-export function isStringObject(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object String]";
-}
-
-export function isSymbolObject(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object Symbol]";
-}
-
-// Adapted from Lodash
-export function isTypedArray(value: unknown): boolean {
- /** Used to match `toStringTag` values of typed arrays. */
- const reTypedTag =
- /^\[object (?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)Array\]$/;
- return _isObjectLike(value) && reTypedTag.test(_toString.call(value));
-}
-
-export function isUint8Array(value: unknown): boolean {
- return (
- _isObjectLike(value) && _toString.call(value) === "[object Uint8Array]"
- );
-}
-
-export function isUint8ClampedArray(value: unknown): boolean {
- return (
- _isObjectLike(value) &&
- _toString.call(value) === "[object Uint8ClampedArray]"
- );
-}
-
-export function isUint16Array(value: unknown): boolean {
- return (
- _isObjectLike(value) && _toString.call(value) === "[object Uint16Array]"
- );
-}
-
-export function isUint32Array(value: unknown): boolean {
- return (
- _isObjectLike(value) && _toString.call(value) === "[object Uint32Array]"
- );
-}
-
-export function isWeakMap(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object WeakMap]";
-}
-
-export function isWeakSet(value: unknown): boolean {
- return _isObjectLike(value) && _toString.call(value) === "[object WeakSet]";
-}
diff --git a/std/node/_util/_util_types_test.ts b/std/node/_util/_util_types_test.ts
deleted file mode 100644
index 763969964..000000000
--- a/std/node/_util/_util_types_test.ts
+++ /dev/null
@@ -1,509 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-//
-// Adapted from Node.js. Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-import { assertStrictEquals } from "../../testing/asserts.ts";
-import {
- isAnyArrayBuffer,
- isArgumentsObject,
- isArrayBuffer,
- isArrayBufferView,
- isAsyncFunction,
- isBigInt64Array,
- isBigIntObject,
- isBigUint64Array,
- isBooleanObject,
- isBoxedPrimitive,
- isDataView,
- isDate,
- isFloat32Array,
- isFloat64Array,
- isGeneratorFunction,
- isGeneratorObject,
- isInt16Array,
- isInt32Array,
- isInt8Array,
- isMap,
- isMapIterator,
- isModuleNamespaceObject,
- isNativeError,
- isNumberObject,
- isPromise,
- isRegExp,
- isSet,
- isSetIterator,
- isSharedArrayBuffer,
- isStringObject,
- isSymbolObject,
- isTypedArray,
- isUint16Array,
- isUint32Array,
- isUint8Array,
- isUint8ClampedArray,
- isWeakMap,
- isWeakSet,
-} from "./_util_types.ts";
-
-// Used to test isModuleNamespaceObject
-import * as testModuleNamespaceOpbject from "./_util_types.ts";
-
-// isAnyArrayBuffer
-Deno.test("Should return true for valid ArrayBuffer types", () => {
- assertStrictEquals(isAnyArrayBuffer(new ArrayBuffer(0)), true);
- assertStrictEquals(isAnyArrayBuffer(new SharedArrayBuffer(0)), true);
-});
-
-Deno.test("Should return false for invalid ArrayBuffer types", () => {
- assertStrictEquals(isAnyArrayBuffer({}), false);
- assertStrictEquals(isAnyArrayBuffer([]), false);
- assertStrictEquals(isAnyArrayBuffer(new Error()), false);
-});
-
-// isArrayBufferView
-Deno.test("Should return true for valid ArrayBufferView types", () => {
- assertStrictEquals(isArrayBufferView(new Int8Array(0)), true);
- assertStrictEquals(isArrayBufferView(new Uint8Array(0)), true);
- assertStrictEquals(isArrayBufferView(new Uint8ClampedArray(0)), true);
- assertStrictEquals(isArrayBufferView(new Int16Array(0)), true);
- assertStrictEquals(isArrayBufferView(new Uint16Array(0)), true);
- assertStrictEquals(isArrayBufferView(new Int32Array(0)), true);
- assertStrictEquals(isArrayBufferView(new Uint32Array(0)), true);
- assertStrictEquals(isArrayBufferView(new Float32Array(0)), true);
- assertStrictEquals(isArrayBufferView(new Float64Array(0)), true);
- assertStrictEquals(isArrayBufferView(new DataView(new ArrayBuffer(0))), true);
-});
-
-Deno.test("Should return false for invalid ArrayBufferView types", () => {
- assertStrictEquals(isArrayBufferView({}), false);
- assertStrictEquals(isArrayBufferView([]), false);
- assertStrictEquals(isArrayBufferView(new Error()), false);
- assertStrictEquals(isArrayBufferView(new ArrayBuffer(0)), false);
-});
-
-// isArgumentsObject
-// Note: not testable in TS
-
-Deno.test("Should return false for invalid Argument types", () => {
- assertStrictEquals(isArgumentsObject({}), false);
- assertStrictEquals(isArgumentsObject([]), false);
- assertStrictEquals(isArgumentsObject(new Error()), false);
-});
-
-// isArrayBuffer
-Deno.test("Should return true for valid ArrayBuffer types", () => {
- assertStrictEquals(isArrayBuffer(new ArrayBuffer(0)), true);
-});
-
-Deno.test("Should return false for invalid ArrayBuffer types", () => {
- assertStrictEquals(isArrayBuffer(new SharedArrayBuffer(0)), false);
- assertStrictEquals(isArrayBuffer({}), false);
- assertStrictEquals(isArrayBuffer([]), false);
- assertStrictEquals(isArrayBuffer(new Error()), false);
-});
-
-// isAsyncFunction
-Deno.test("Should return true for valid async function types", () => {
- const asyncFunction = async (): Promise<void> => {};
- assertStrictEquals(isAsyncFunction(asyncFunction), true);
-});
-
-Deno.test("Should return false for invalid async function types", () => {
- const syncFunction = (): void => {};
- assertStrictEquals(isAsyncFunction(syncFunction), false);
- assertStrictEquals(isAsyncFunction({}), false);
- assertStrictEquals(isAsyncFunction([]), false);
- assertStrictEquals(isAsyncFunction(new Error()), false);
-});
-
-// isBigInt64Array
-Deno.test("Should return true for valid BigInt64Array types", () => {
- assertStrictEquals(isBigInt64Array(new BigInt64Array()), true);
-});
-
-Deno.test("Should return false for invalid BigInt64Array types", () => {
- assertStrictEquals(isBigInt64Array(new BigUint64Array()), false);
- assertStrictEquals(isBigInt64Array(new Float32Array()), false);
- assertStrictEquals(isBigInt64Array(new Int32Array()), false);
-});
-
-// isBigUint64Array
-Deno.test("Should return true for valid isBigUint64Array types", () => {
- assertStrictEquals(isBigUint64Array(new BigUint64Array()), true);
-});
-
-Deno.test("Should return false for invalid isBigUint64Array types", () => {
- assertStrictEquals(isBigUint64Array(new BigInt64Array()), false);
- assertStrictEquals(isBigUint64Array(new Float32Array()), false);
- assertStrictEquals(isBigUint64Array(new Int32Array()), false);
-});
-
-// isBooleanObject
-Deno.test("Should return true for valid Boolean object types", () => {
- assertStrictEquals(isBooleanObject(new Boolean(false)), true);
- assertStrictEquals(isBooleanObject(new Boolean(true)), true);
-});
-
-Deno.test("Should return false for invalid isBigUint64Array types", () => {
- assertStrictEquals(isBooleanObject(false), false);
- assertStrictEquals(isBooleanObject(true), false);
- assertStrictEquals(isBooleanObject(Boolean(false)), false);
- assertStrictEquals(isBooleanObject(Boolean(true)), false);
-});
-
-// isBoxedPrimitive
-Deno.test("Should return true for valid boxed primitive values", () => {
- assertStrictEquals(isBoxedPrimitive(new Boolean(false)), true);
- assertStrictEquals(isBoxedPrimitive(Object(Symbol("foo"))), true);
- assertStrictEquals(isBoxedPrimitive(Object(BigInt(5))), true);
- assertStrictEquals(isBoxedPrimitive(new String("foo")), true);
-});
-
-Deno.test("Should return false for invalid boxed primitive values", () => {
- assertStrictEquals(isBoxedPrimitive(false), false);
- assertStrictEquals(isBoxedPrimitive(Symbol("foo")), false);
-});
-
-// isDateView
-Deno.test("Should return true for valid DataView types", () => {
- assertStrictEquals(isDataView(new DataView(new ArrayBuffer(0))), true);
-});
-
-Deno.test("Should return false for invalid DataView types", () => {
- assertStrictEquals(isDataView(new Float64Array(0)), false);
-});
-
-// isDate
-Deno.test("Should return true for valid date types", () => {
- assertStrictEquals(isDate(new Date()), true);
- assertStrictEquals(isDate(new Date(0)), true);
- assertStrictEquals(isDate(new (eval("Date"))()), true);
-});
-
-Deno.test("Should return false for invalid date types", () => {
- assertStrictEquals(isDate(Date()), false);
- assertStrictEquals(isDate({}), false);
- assertStrictEquals(isDate([]), false);
- assertStrictEquals(isDate(new Error()), false);
- assertStrictEquals(isDate(Object.create(Date.prototype)), false);
-});
-
-// isFloat32Array
-Deno.test("Should return true for valid Float32Array types", () => {
- assertStrictEquals(isFloat32Array(new Float32Array(0)), true);
-});
-
-Deno.test("Should return false for invalid Float32Array types", () => {
- assertStrictEquals(isFloat32Array(new ArrayBuffer(0)), false);
- assertStrictEquals(isFloat32Array(new Float64Array(0)), false);
-});
-
-// isFloat64Array
-Deno.test("Should return true for valid Float64Array types", () => {
- assertStrictEquals(isFloat64Array(new Float64Array(0)), true);
-});
-
-Deno.test("Should return false for invalid Float64Array types", () => {
- assertStrictEquals(isFloat64Array(new ArrayBuffer(0)), false);
- assertStrictEquals(isFloat64Array(new Uint8Array(0)), false);
-});
-
-// isGeneratorFunction
-Deno.test("Should return true for valid generator functions", () => {
- assertStrictEquals(
- isGeneratorFunction(function* foo() {}),
- true,
- );
-});
-
-Deno.test("Should return false for invalid generator functions", () => {
- assertStrictEquals(
- isGeneratorFunction(function foo() {}),
- false,
- );
-});
-
-// isGeneratorObject
-Deno.test("Should return true for valid generator object types", () => {
- function* foo(): Iterator<void> {}
- assertStrictEquals(isGeneratorObject(foo()), true);
-});
-
-Deno.test("Should return false for invalid generation object types", () => {
- assertStrictEquals(
- isGeneratorObject(function* foo() {}),
- false,
- );
-});
-
-// isInt8Array
-Deno.test("Should return true for valid Int8Array types", () => {
- assertStrictEquals(isInt8Array(new Int8Array(0)), true);
-});
-
-Deno.test("Should return false for invalid Int8Array types", () => {
- assertStrictEquals(isInt8Array(new ArrayBuffer(0)), false);
- assertStrictEquals(isInt8Array(new Float64Array(0)), false);
-});
-
-// isInt16Array
-Deno.test("Should return true for valid Int16Array types", () => {
- assertStrictEquals(isInt16Array(new Int16Array(0)), true);
-});
-
-Deno.test("Should return false for invalid Int16Array type", () => {
- assertStrictEquals(isInt16Array(new ArrayBuffer(0)), false);
- assertStrictEquals(isInt16Array(new Float64Array(0)), false);
-});
-
-// isInt32Array
-Deno.test("Should return true for valid isInt32Array types", () => {
- assertStrictEquals(isInt32Array(new Int32Array(0)), true);
-});
-
-Deno.test("Should return false for invalid isInt32Array type", () => {
- assertStrictEquals(isInt32Array(new ArrayBuffer(0)), false);
- assertStrictEquals(isInt32Array(new Float64Array(0)), false);
-});
-
-// isStringObject
-Deno.test("Should return true for valid String types", () => {
- assertStrictEquals(isStringObject(new String("")), true);
- assertStrictEquals(isStringObject(new String("Foo")), true);
-});
-
-Deno.test("Should return false for invalid String types", () => {
- assertStrictEquals(isStringObject(""), false);
- assertStrictEquals(isStringObject("Foo"), false);
-});
-
-// isMap
-Deno.test("Should return true for valid Map types", () => {
- assertStrictEquals(isMap(new Map()), true);
-});
-
-Deno.test("Should return false for invalid Map types", () => {
- assertStrictEquals(isMap({}), false);
- assertStrictEquals(isMap([]), false);
- assertStrictEquals(isMap(new Date()), false);
- assertStrictEquals(isMap(new Error()), false);
-});
-
-// isMapIterator
-Deno.test("Should return true for valid Map Iterator types", () => {
- const map = new Map();
- assertStrictEquals(isMapIterator(map.keys()), true);
- assertStrictEquals(isMapIterator(map.values()), true);
- assertStrictEquals(isMapIterator(map.entries()), true);
- assertStrictEquals(isMapIterator(map[Symbol.iterator]()), true);
-});
-
-Deno.test("Should return false for invalid Map iterator types", () => {
- assertStrictEquals(isMapIterator(new Map()), false);
- assertStrictEquals(isMapIterator([]), false);
- assertStrictEquals(isMapIterator(new Date()), false);
- assertStrictEquals(isMapIterator(new Error()), false);
-});
-
-// isModuleNamespaceObject
-Deno.test("Should return true for valid module namespace objects", () => {
- assertStrictEquals(isModuleNamespaceObject(testModuleNamespaceOpbject), true);
-});
-
-Deno.test("Should return false for invalid module namespace objects", () => {
- assertStrictEquals(isModuleNamespaceObject(assertStrictEquals), false);
-});
-
-// isNativeError
-Deno.test("Should return true for valid Error types", () => {
- assertStrictEquals(isNativeError(new Error()), true);
- assertStrictEquals(isNativeError(new TypeError()), true);
- assertStrictEquals(isNativeError(new RangeError()), true);
-});
-
-Deno.test("Should return false for invalid Error types", () => {
- assertStrictEquals(isNativeError(null), false);
- assertStrictEquals(isNativeError(NaN), false);
-});
-
-// isNumberObject
-Deno.test("Should return true for valid number objects", () => {
- assertStrictEquals(isNumberObject(new Number(0)), true);
-});
-
-Deno.test("Should return false for invalid number types", () => {
- assertStrictEquals(isNumberObject(0), false);
-});
-
-// isBigIntObject
-Deno.test("Should return true for valid number objects", () => {
- assertStrictEquals(isBigIntObject(new Object(BigInt(42))), true);
-});
-
-Deno.test("Should return false for invalid number types", () => {
- assertStrictEquals(isBigIntObject(BigInt(42)), false);
-});
-
-// isPromise
-Deno.test("Should return true for valid Promise types", () => {
- assertStrictEquals(isPromise(Promise.resolve(42)), true);
-});
-
-Deno.test("Should return false for invalid Promise types", () => {
- assertStrictEquals(isPromise(new Object()), false);
-});
-
-// isRegExp
-Deno.test("Should return true for valid RegExp", () => {
- assertStrictEquals(isRegExp(/abc/), true);
- assertStrictEquals(isRegExp(new RegExp("abc")), true);
-});
-
-Deno.test("Should return false for invalid RegExp types", () => {
- assertStrictEquals(isRegExp({}), false);
- assertStrictEquals(isRegExp("/abc/"), false);
-});
-
-// isSet
-Deno.test("Should return true for valid Set types", () => {
- assertStrictEquals(isSet(new Set()), true);
-});
-
-Deno.test("Should return false for invalid Set types", () => {
- assertStrictEquals(isSet({}), false);
- assertStrictEquals(isSet([]), false);
- assertStrictEquals(isSet(new Map()), false);
- assertStrictEquals(isSet(new Error()), false);
-});
-
-// isSetIterator
-Deno.test("Should return true for valid Set Iterator types", () => {
- const set = new Set();
- assertStrictEquals(isSetIterator(set.keys()), true);
- assertStrictEquals(isSetIterator(set.values()), true);
- assertStrictEquals(isSetIterator(set.entries()), true);
- assertStrictEquals(isSetIterator(set[Symbol.iterator]()), true);
-});
-
-Deno.test("Should return false for invalid Set Iterator types", () => {
- assertStrictEquals(isSetIterator(new Set()), false);
- assertStrictEquals(isSetIterator([]), false);
- assertStrictEquals(isSetIterator(new Map()), false);
- assertStrictEquals(isSetIterator(new Error()), false);
-});
-
-// isSharedArrayBuffer
-Deno.test("Should return true for valid SharedArrayBuffer types", () => {
- assertStrictEquals(isSharedArrayBuffer(new SharedArrayBuffer(0)), true);
-});
-
-Deno.test("Should return false for invalid SharedArrayBuffer types", () => {
- assertStrictEquals(isSharedArrayBuffer(new ArrayBuffer(0)), false);
-});
-
-// isStringObject
-Deno.test("Should return true for valid String Object types", () => {
- assertStrictEquals(isStringObject(new String("")), true);
- assertStrictEquals(isStringObject(new String("Foo")), true);
-});
-
-Deno.test("Should return false for invalid String Object types", () => {
- assertStrictEquals(isStringObject(""), false);
- assertStrictEquals(isStringObject("Foo"), false);
-});
-
-// isSymbolObject
-Deno.test("Should return true for valid Symbol types", () => {
- assertStrictEquals(isSymbolObject(Object(Symbol("foo"))), true);
-});
-
-Deno.test("Should return false for invalid Symbol types", () => {
- assertStrictEquals(isSymbolObject(Symbol("foo")), false);
-});
-
-// isTypedArray
-Deno.test("Should return true for valid TypedArray types", () => {
- assertStrictEquals(isTypedArray(new Uint8Array(0)), true);
- assertStrictEquals(isTypedArray(new Float64Array(0)), true);
-});
-
-Deno.test("Should return false for invalid TypedArray types", () => {
- assertStrictEquals(isTypedArray(new ArrayBuffer(0)), false);
-});
-
-// isUint8Array
-Deno.test("Should return true for valid Uint8Array types", () => {
- assertStrictEquals(isUint8Array(new Uint8Array(0)), true);
-});
-
-Deno.test("Should return false for invalid Uint8Array types", () => {
- assertStrictEquals(isUint8Array(new ArrayBuffer(0)), false);
- assertStrictEquals(isUint8Array(new Float64Array(0)), false);
-});
-
-// isUint8ClampedArray
-Deno.test("Should return true for valid Uint8ClampedArray types", () => {
- assertStrictEquals(isUint8ClampedArray(new Uint8ClampedArray(0)), true);
-});
-
-Deno.test("Should return false for invalid Uint8Array types", () => {
- assertStrictEquals(isUint8ClampedArray(new ArrayBuffer(0)), false);
- assertStrictEquals(isUint8ClampedArray(new Float64Array(0)), false);
-});
-
-// isUint16Array
-Deno.test("Should return true for valid isUint16Array types", () => {
- assertStrictEquals(isUint16Array(new Uint16Array(0)), true);
-});
-
-Deno.test("Should return false for invalid Uint16Array types", () => {
- assertStrictEquals(isUint16Array(new ArrayBuffer(0)), false);
- assertStrictEquals(isUint16Array(new Float64Array(0)), false);
-});
-
-// isUint32Array
-Deno.test("Should return true for valid Uint32Array types", () => {
- assertStrictEquals(isUint32Array(new Uint32Array(0)), true);
-});
-
-Deno.test("Should return false for invalid isUint16Array types", () => {
- assertStrictEquals(isUint32Array(new ArrayBuffer(0)), false);
- assertStrictEquals(isUint32Array(new Float64Array(0)), false);
-});
-
-// isWeakMap
-Deno.test("Should return true for valid WeakMap types", () => {
- assertStrictEquals(isWeakMap(new WeakMap()), true);
-});
-
-Deno.test("Should return false for invalid WeakMap types", () => {
- assertStrictEquals(isWeakMap(new Set()), false);
- assertStrictEquals(isWeakMap(new Map()), false);
-});
-
-// isWeakSet
-Deno.test("Should return true for valid WeakSet types", () => {
- assertStrictEquals(isWeakSet(new WeakSet()), true);
-});
-
-Deno.test("Should return false for invalid WeakSet types", () => {
- assertStrictEquals(isWeakSet(new Set()), false);
- assertStrictEquals(isWeakSet(new Map()), false);
-});
diff --git a/std/node/_utils.ts b/std/node/_utils.ts
deleted file mode 100644
index 62a911843..000000000
--- a/std/node/_utils.ts
+++ /dev/null
@@ -1,247 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { deferred } from "../async/mod.ts";
-import { assert, assertStringIncludes, fail } from "../testing/asserts.ts";
-
-export type BinaryEncodings = "binary";
-
-export type TextEncodings =
- | "ascii"
- | "utf8"
- | "utf-8"
- | "utf16le"
- | "ucs2"
- | "ucs-2"
- | "base64"
- | "latin1"
- | "hex";
-
-export type Encodings = BinaryEncodings | TextEncodings;
-
-export function notImplemented(msg?: string): never {
- const message = msg ? `Not implemented: ${msg}` : "Not implemented";
- throw new Error(message);
-}
-
-export type _TextDecoder = typeof TextDecoder.prototype;
-export const _TextDecoder = TextDecoder;
-
-export type _TextEncoder = typeof TextEncoder.prototype;
-export const _TextEncoder = TextEncoder;
-
-// API helpers
-
-export type MaybeNull<T> = T | null;
-export type MaybeDefined<T> = T | undefined;
-export type MaybeEmpty<T> = T | null | undefined;
-
-export function intoCallbackAPI<T>(
- // deno-lint-ignore no-explicit-any
- func: (...args: any[]) => Promise<T>,
- cb: MaybeEmpty<(err: MaybeNull<Error>, value?: MaybeEmpty<T>) => void>,
- // deno-lint-ignore no-explicit-any
- ...args: any[]
-): void {
- func(...args).then(
- (value) => cb && cb(null, value),
- (err) => cb && cb(err),
- );
-}
-
-export function intoCallbackAPIWithIntercept<T1, T2>(
- // deno-lint-ignore no-explicit-any
- func: (...args: any[]) => Promise<T1>,
- interceptor: (v: T1) => T2,
- cb: MaybeEmpty<(err: MaybeNull<Error>, value?: MaybeEmpty<T2>) => void>,
- // deno-lint-ignore no-explicit-any
- ...args: any[]
-): void {
- func(...args).then(
- (value) => cb && cb(null, interceptor(value)),
- (err) => cb && cb(err),
- );
-}
-
-export function spliceOne(list: string[], index: number): void {
- for (; index + 1 < list.length; index++) list[index] = list[index + 1];
- list.pop();
-}
-
-// Taken from: https://github.com/nodejs/node/blob/ba684805b6c0eded76e5cd89ee00328ac7a59365/lib/internal/util.js#L125
-// Return undefined if there is no match.
-// Move the "slow cases" to a separate function to make sure this function gets
-// inlined properly. That prioritizes the common case.
-export function normalizeEncoding(
- enc: string | null,
-): TextEncodings | undefined {
- if (enc == null || enc === "utf8" || enc === "utf-8") return "utf8";
- return slowCases(enc);
-}
-
-// https://github.com/nodejs/node/blob/ba684805b6c0eded76e5cd89ee00328ac7a59365/lib/internal/util.js#L130
-function slowCases(enc: string): TextEncodings | undefined {
- switch (enc.length) {
- case 4:
- if (enc === "UTF8") return "utf8";
- if (enc === "ucs2" || enc === "UCS2") return "utf16le";
- enc = `${enc}`.toLowerCase();
- if (enc === "utf8") return "utf8";
- if (enc === "ucs2") return "utf16le";
- break;
- case 3:
- if (enc === "hex" || enc === "HEX" || `${enc}`.toLowerCase() === "hex") {
- return "hex";
- }
- break;
- case 5:
- if (enc === "ascii") return "ascii";
- if (enc === "ucs-2") return "utf16le";
- if (enc === "UTF-8") return "utf8";
- if (enc === "ASCII") return "ascii";
- if (enc === "UCS-2") return "utf16le";
- enc = `${enc}`.toLowerCase();
- if (enc === "utf-8") return "utf8";
- if (enc === "ascii") return "ascii";
- if (enc === "ucs-2") return "utf16le";
- break;
- case 6:
- if (enc === "base64") return "base64";
- if (enc === "latin1" || enc === "binary") return "latin1";
- if (enc === "BASE64") return "base64";
- if (enc === "LATIN1" || enc === "BINARY") return "latin1";
- enc = `${enc}`.toLowerCase();
- if (enc === "base64") return "base64";
- if (enc === "latin1" || enc === "binary") return "latin1";
- break;
- case 7:
- if (
- enc === "utf16le" ||
- enc === "UTF16LE" ||
- `${enc}`.toLowerCase() === "utf16le"
- ) {
- return "utf16le";
- }
- break;
- case 8:
- if (
- enc === "utf-16le" ||
- enc === "UTF-16LE" ||
- `${enc}`.toLowerCase() === "utf-16le"
- ) {
- return "utf16le";
- }
- break;
- default:
- if (enc === "") return "utf8";
- }
-}
-
-export function validateIntegerRange(
- value: number,
- name: string,
- min = -2147483648,
- max = 2147483647,
-): void {
- // The defaults for min and max correspond to the limits of 32-bit integers.
- if (!Number.isInteger(value)) {
- throw new Error(`${name} must be 'an integer' but was ${value}`);
- }
-
- if (value < min || value > max) {
- throw new Error(
- `${name} must be >= ${min} && <= ${max}. Value was ${value}`,
- );
- }
-}
-
-type OptionalSpread<T> = T extends undefined ? []
- : [T];
-
-export function once<T = undefined>(
- callback: (...args: OptionalSpread<T>) => void,
-) {
- let called = false;
- return function (this: unknown, ...args: OptionalSpread<T>) {
- if (called) return;
- called = true;
- callback.apply(this, args);
- };
-}
-
-/**
- * @param {number} [expectedExecutions = 1]
- * @param {number} [timeout = 1000] Milliseconds to wait before the promise is forcefully exited
-*/
-export function mustCall<T extends unknown[]>(
- fn: ((...args: T) => void) = () => {},
- expectedExecutions = 1,
- timeout = 1000,
-): [Promise<void>, (...args: T) => void] {
- if (expectedExecutions < 1) {
- throw new Error("Expected executions can't be lower than 1");
- }
- let timesExecuted = 0;
- const completed = deferred();
-
- const abort = setTimeout(() => completed.reject(), timeout);
-
- function callback(this: unknown, ...args: T) {
- timesExecuted++;
- if (timesExecuted === expectedExecutions) {
- completed.resolve();
- }
- fn.apply(this, args);
- }
-
- const result = completed
- .then(() => clearTimeout(abort))
- .catch(() =>
- fail(
- `Async operation not completed: Expected ${expectedExecutions}, executed ${timesExecuted}`,
- )
- );
-
- return [
- result,
- callback,
- ];
-}
-/** Asserts that an error thrown in a callback will not be wrongly caught. */
-export async function assertCallbackErrorUncaught(
- { prelude, invocation, cleanup }: {
- /** Any code which needs to run before the actual invocation (notably, any import statements). */
- prelude?: string;
- /**
- * The start of the invocation of the function, e.g. `open("foo.txt", `.
- * The callback will be added after it.
- */
- invocation: string;
- /** Called after the subprocess is finished but before running the assertions, e.g. to clean up created files. */
- cleanup?: () => Promise<void> | void;
- },
-) {
- // Since the error has to be uncaught, and that will kill the Deno process,
- // the only way to test this is to spawn a subprocess.
- const p = Deno.run({
- cmd: [
- Deno.execPath(),
- "eval",
- "--no-check", // Running TSC for every one of these tests would take way too long
- "--unstable",
- `${prelude ?? ""}
-
- ${invocation}(err) => {
- // If the bug is present and the callback is called again with an error,
- // don't throw another error, so if the subprocess fails we know it had the correct behaviour.
- if (!err) throw new Error("success");
- });`,
- ],
- stderr: "piped",
- });
- const status = await p.status();
- const stderr = new TextDecoder().decode(await Deno.readAll(p.stderr));
- p.close();
- p.stderr.close();
- await cleanup?.();
- assert(!status.success);
- assertStringIncludes(stderr, "Error: success");
-}
diff --git a/std/node/assert.ts b/std/node/assert.ts
deleted file mode 100644
index 7b144b690..000000000
--- a/std/node/assert.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-export { AssertionError } from "./assertion_error.ts";
-import {
- assertEquals as deepStrictEqual,
- AssertionError,
- assertMatch as match,
- assertNotEquals as notDeepStrictEqual,
- assertNotStrictEquals as notStrictEqual,
- assertStrictEquals as strictEqual,
- assertThrows as throws,
- fail,
-} from "../testing/asserts.ts";
-
-function assert(expr: unknown, msg = ""): asserts expr {
- if (!expr) {
- throw new AssertionError(msg);
- }
-}
-const ok = assert;
-export default assert;
-
-Object.assign(assert, {
- deepStrictEqual,
- fail,
- match,
- notDeepStrictEqual,
- notStrictEqual,
- ok,
- strictEqual,
- throws,
-});
-
-export {
- deepStrictEqual,
- fail,
- match,
- notDeepStrictEqual,
- notStrictEqual,
- ok,
- strictEqual,
- throws,
-};
diff --git a/std/node/assert_test.ts b/std/node/assert_test.ts
deleted file mode 100644
index ab4bec79b..000000000
--- a/std/node/assert_test.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import {
- assert as denoAssert,
- assertEquals,
- assertMatch,
- assertNotEquals,
- assertNotStrictEquals,
- assertStrictEquals,
- assertThrows,
- fail as denoFail,
-} from "../testing/asserts.ts";
-
-import AssertionError from "./assertion_error.ts";
-
-import assert, {
- AssertionError as AssertionError_,
- deepStrictEqual,
- fail,
- match,
- notDeepStrictEqual,
- notStrictEqual,
- ok,
- strictEqual,
- throws,
-} from "./assert.ts";
-
-Deno.test("API should be exposed", () => {
- assertStrictEquals(assert, ok, "`assert()` should be an alias of `ok()`");
- assertStrictEquals(
- assertEquals,
- deepStrictEqual,
- "`assertEquals()` should be exposed as `deepStrictEqual()`",
- );
- assertStrictEquals(
- assertNotEquals,
- notDeepStrictEqual,
- "`assertNotEquals()` should be exposed as `notDeepStrictEqual()`",
- );
- assertStrictEquals(
- assertStrictEquals,
- strictEqual,
- "`assertStrictEquals()` should be exposed as `strictEqual()`",
- );
- assertStrictEquals(
- assertNotStrictEquals,
- notStrictEqual,
- "`assertNotStrictEquals()` should be exposed as `notStrictEqual()`",
- );
- assertStrictEquals(
- assertMatch,
- match,
- "`assertMatch()` should be exposed as `match()`",
- );
- assertStrictEquals(
- assertThrows,
- throws,
- "`assertThrows()` should be exposed as `throws()`",
- );
- assertStrictEquals(fail, denoFail, "`fail()` should be exposed");
- assertStrictEquals(
- AssertionError,
- AssertionError_,
- "`AssertionError()` constructor should be exposed",
- );
-});
diff --git a/std/node/assertion_error.ts b/std/node/assertion_error.ts
deleted file mode 100644
index dcce1478b..000000000
--- a/std/node/assertion_error.ts
+++ /dev/null
@@ -1,576 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-
-// Adapted from Node.js. Copyright Joyent, Inc. and other Node contributors.
-
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// TODO(schwarzkopfb): change this when `Deno.consoleSize()` will be stable
-interface DenoUnstable {
- consoleSize?(rid: number): { columns: number };
-}
-function getConsoleWidth(): number {
- return (Deno as DenoUnstable).consoleSize?.(Deno.stderr.rid).columns ?? 80;
-}
-
-import { inspect } from "./util.ts";
-import { stripColor as removeColors } from "../fmt/colors.ts";
-
-// TODO(schwarzkopfb): we should implement Node's concept of "primordials"
-// Ref: https://github.com/denoland/deno/issues/6040#issuecomment-637305828
-const MathMax = Math.max;
-const { Error } = globalThis;
-const {
- create: ObjectCreate,
- defineProperty: ObjectDefineProperty,
- getPrototypeOf: ObjectGetPrototypeOf,
- getOwnPropertyDescriptor: ObjectGetOwnPropertyDescriptor,
- keys: ObjectKeys,
-} = Object;
-
-import { ERR_INVALID_ARG_TYPE } from "./_errors.ts";
-
-let blue = "";
-let green = "";
-let red = "";
-let defaultColor = "";
-
-const kReadableOperator: { [key: string]: string } = {
- deepStrictEqual: "Expected values to be strictly deep-equal:",
- strictEqual: "Expected values to be strictly equal:",
- strictEqualObject: 'Expected "actual" to be reference-equal to "expected":',
- deepEqual: "Expected values to be loosely deep-equal:",
- notDeepStrictEqual: 'Expected "actual" not to be strictly deep-equal to:',
- notStrictEqual: 'Expected "actual" to be strictly unequal to:',
- notStrictEqualObject:
- 'Expected "actual" not to be reference-equal to "expected":',
- notDeepEqual: 'Expected "actual" not to be loosely deep-equal to:',
- notIdentical: "Values have same structure but are not reference-equal:",
- notDeepEqualUnequal: "Expected values not to be loosely deep-equal:",
-};
-
-// Comparing short primitives should just show === / !== instead of using the
-// diff.
-const kMaxShortLength = 12;
-
-export function copyError(source: Error): Error {
- const keys = ObjectKeys(source);
- const target = ObjectCreate(ObjectGetPrototypeOf(source));
- for (const key of keys) {
- const desc = ObjectGetOwnPropertyDescriptor(source, key);
-
- if (desc !== undefined) {
- ObjectDefineProperty(target, key, desc);
- }
- }
- ObjectDefineProperty(target, "message", { value: source.message });
- return target;
-}
-
-export function inspectValue(val: unknown): string {
- // The util.inspect default values could be changed. This makes sure the
- // error messages contain the necessary information nevertheless.
- return inspect(
- val,
- {
- compact: false,
- customInspect: false,
- depth: 1000,
- maxArrayLength: Infinity,
- // Assert compares only enumerable properties (with a few exceptions).
- showHidden: false,
- // Assert does not detect proxies currently.
- showProxy: false,
- sorted: true,
- // Inspect getters as we also check them when comparing entries.
- getters: true,
- },
- );
-}
-
-export function createErrDiff(
- actual: unknown,
- expected: unknown,
- operator: string,
-): string {
- let other = "";
- let res = "";
- let end = "";
- let skipped = false;
- const actualInspected = inspectValue(actual);
- const actualLines = actualInspected.split("\n");
- const expectedLines = inspectValue(expected).split("\n");
-
- let i = 0;
- let indicator = "";
-
- // In case both values are objects or functions explicitly mark them as not
- // reference equal for the `strictEqual` operator.
- if (
- operator === "strictEqual" &&
- ((typeof actual === "object" && actual !== null &&
- typeof expected === "object" && expected !== null) ||
- (typeof actual === "function" && typeof expected === "function"))
- ) {
- operator = "strictEqualObject";
- }
-
- // If "actual" and "expected" fit on a single line and they are not strictly
- // equal, check further special handling.
- if (
- actualLines.length === 1 && expectedLines.length === 1 &&
- actualLines[0] !== expectedLines[0]
- ) {
- // Check for the visible length using the `removeColors()` function, if
- // appropriate.
- const c = inspect.defaultOptions.colors;
- const actualRaw = c ? removeColors(actualLines[0]) : actualLines[0];
- const expectedRaw = c ? removeColors(expectedLines[0]) : expectedLines[0];
- const inputLength = actualRaw.length + expectedRaw.length;
- // If the character length of "actual" and "expected" together is less than
- // kMaxShortLength and if neither is an object and at least one of them is
- // not `zero`, use the strict equal comparison to visualize the output.
- if (inputLength <= kMaxShortLength) {
- if (
- (typeof actual !== "object" || actual === null) &&
- (typeof expected !== "object" || expected === null) &&
- (actual !== 0 || expected !== 0)
- ) { // -0 === +0
- return `${kReadableOperator[operator]}\n\n` +
- `${actualLines[0]} !== ${expectedLines[0]}\n`;
- }
- } else if (operator !== "strictEqualObject") {
- // If the stderr is a tty and the input length is lower than the current
- // columns per line, add a mismatch indicator below the output. If it is
- // not a tty, use a default value of 80 characters.
- const maxLength = Deno.isatty(Deno.stderr.rid) ? getConsoleWidth() : 80;
- if (inputLength < maxLength) {
- while (actualRaw[i] === expectedRaw[i]) {
- i++;
- }
- // Ignore the first characters.
- if (i > 2) {
- // Add position indicator for the first mismatch in case it is a
- // single line and the input length is less than the column length.
- indicator = `\n ${" ".repeat(i)}^`;
- i = 0;
- }
- }
- }
- }
-
- // Remove all ending lines that match (this optimizes the output for
- // readability by reducing the number of total changed lines).
- let a = actualLines[actualLines.length - 1];
- let b = expectedLines[expectedLines.length - 1];
- while (a === b) {
- if (i++ < 3) {
- end = `\n ${a}${end}`;
- } else {
- other = a;
- }
- actualLines.pop();
- expectedLines.pop();
- if (actualLines.length === 0 || expectedLines.length === 0) {
- break;
- }
- a = actualLines[actualLines.length - 1];
- b = expectedLines[expectedLines.length - 1];
- }
-
- const maxLines = MathMax(actualLines.length, expectedLines.length);
- // Strict equal with identical objects that are not identical by reference.
- // E.g., assert.deepStrictEqual({ a: Symbol() }, { a: Symbol() })
- if (maxLines === 0) {
- // We have to get the result again. The lines were all removed before.
- const actualLines = actualInspected.split("\n");
-
- // Only remove lines in case it makes sense to collapse those.
- if (actualLines.length > 50) {
- actualLines[46] = `${blue}...${defaultColor}`;
- while (actualLines.length > 47) {
- actualLines.pop();
- }
- }
-
- return `${kReadableOperator.notIdentical}\n\n${actualLines.join("\n")}\n`;
- }
-
- // There were at least five identical lines at the end. Mark a couple of
- // skipped.
- if (i >= 5) {
- end = `\n${blue}...${defaultColor}${end}`;
- skipped = true;
- }
- if (other !== "") {
- end = `\n ${other}${end}`;
- other = "";
- }
-
- let printedLines = 0;
- let identical = 0;
- const msg = kReadableOperator[operator] +
- `\n${green}+ actual${defaultColor} ${red}- expected${defaultColor}`;
- const skippedMsg = ` ${blue}...${defaultColor} Lines skipped`;
-
- let lines = actualLines;
- let plusMinus = `${green}+${defaultColor}`;
- let maxLength = expectedLines.length;
- if (actualLines.length < maxLines) {
- lines = expectedLines;
- plusMinus = `${red}-${defaultColor}`;
- maxLength = actualLines.length;
- }
-
- for (i = 0; i < maxLines; i++) {
- if (maxLength < i + 1) {
- // If more than two former lines are identical, print them. Collapse them
- // in case more than five lines were identical.
- if (identical > 2) {
- if (identical > 3) {
- if (identical > 4) {
- if (identical === 5) {
- res += `\n ${lines[i - 3]}`;
- printedLines++;
- } else {
- res += `\n${blue}...${defaultColor}`;
- skipped = true;
- }
- }
- res += `\n ${lines[i - 2]}`;
- printedLines++;
- }
- res += `\n ${lines[i - 1]}`;
- printedLines++;
- }
- // No identical lines before.
- identical = 0;
- // Add the expected line to the cache.
- if (lines === actualLines) {
- res += `\n${plusMinus} ${lines[i]}`;
- } else {
- other += `\n${plusMinus} ${lines[i]}`;
- }
- printedLines++;
- // Only extra actual lines exist
- // Lines diverge
- } else {
- const expectedLine = expectedLines[i];
- let actualLine = actualLines[i];
- // If the lines diverge, specifically check for lines that only diverge by
- // a trailing comma. In that case it is actually identical and we should
- // mark it as such.
- let divergingLines = actualLine !== expectedLine &&
- (!actualLine.endsWith(",") ||
- actualLine.slice(0, -1) !== expectedLine);
- // If the expected line has a trailing comma but is otherwise identical,
- // add a comma at the end of the actual line. Otherwise the output could
- // look weird as in:
- //
- // [
- // 1 // No comma at the end!
- // + 2
- // ]
- //
- if (
- divergingLines &&
- expectedLine.endsWith(",") &&
- expectedLine.slice(0, -1) === actualLine
- ) {
- divergingLines = false;
- actualLine += ",";
- }
- if (divergingLines) {
- // If more than two former lines are identical, print them. Collapse
- // them in case more than five lines were identical.
- if (identical > 2) {
- if (identical > 3) {
- if (identical > 4) {
- if (identical === 5) {
- res += `\n ${actualLines[i - 3]}`;
- printedLines++;
- } else {
- res += `\n${blue}...${defaultColor}`;
- skipped = true;
- }
- }
- res += `\n ${actualLines[i - 2]}`;
- printedLines++;
- }
- res += `\n ${actualLines[i - 1]}`;
- printedLines++;
- }
- // No identical lines before.
- identical = 0;
- // Add the actual line to the result and cache the expected diverging
- // line so consecutive diverging lines show up as +++--- and not +-+-+-.
- res += `\n${green}+${defaultColor} ${actualLine}`;
- other += `\n${red}-${defaultColor} ${expectedLine}`;
- printedLines += 2;
- // Lines are identical
- } else {
- // Add all cached information to the result before adding other things
- // and reset the cache.
- res += other;
- other = "";
- identical++;
- // The very first identical line since the last diverging line is be
- // added to the result.
- if (identical <= 2) {
- res += `\n ${actualLine}`;
- printedLines++;
- }
- }
- }
- // Inspected object to big (Show ~50 rows max)
- if (printedLines > 50 && i < maxLines - 2) {
- return `${msg}${skippedMsg}\n${res}\n${blue}...${defaultColor}${other}\n` +
- `${blue}...${defaultColor}`;
- }
- }
-
- return `${msg}${skipped ? skippedMsg : ""}\n${res}${other}${end}${indicator}`;
-}
-
-export interface AssertionErrorDetailsDescriptor {
- message: string;
- actual: unknown;
- expected: unknown;
- operator: string;
- stack: Error;
-}
-
-export interface AssertionErrorConstructorOptions {
- message?: string;
- actual?: unknown;
- expected?: unknown;
- operator?: string;
- details?: AssertionErrorDetailsDescriptor[];
- // deno-lint-ignore ban-types
- stackStartFn?: Function;
- // Compatibility with older versions.
- // deno-lint-ignore ban-types
- stackStartFunction?: Function;
-}
-
-interface ErrorWithStackTraceLimit extends ErrorConstructor {
- stackTraceLimit: number;
-}
-
-export class AssertionError extends Error {
- [key: string]: unknown
-
- // deno-lint-ignore constructor-super
- constructor(options: AssertionErrorConstructorOptions) {
- if (typeof options !== "object" || options === null) {
- throw new ERR_INVALID_ARG_TYPE("options", "Object", options);
- }
- const {
- message,
- operator,
- stackStartFn,
- details,
- // Compatibility with older versions.
- stackStartFunction,
- } = options;
- let {
- actual,
- expected,
- } = options;
-
- // TODO(schwarzkopfb): `stackTraceLimit` should be added to `ErrorConstructor` in
- // cli/dts/lib.deno.shared_globals.d.ts
- const limit = (Error as ErrorWithStackTraceLimit).stackTraceLimit;
- (Error as ErrorWithStackTraceLimit).stackTraceLimit = 0;
-
- if (message != null) {
- super(String(message));
- } else {
- if (Deno.isatty(Deno.stderr.rid)) {
- // Reset on each call to make sure we handle dynamically set environment
- // variables correct.
- if (Deno.noColor) {
- blue = "";
- green = "";
- defaultColor = "";
- red = "";
- } else {
- blue = "\u001b[34m";
- green = "\u001b[32m";
- defaultColor = "\u001b[39m";
- red = "\u001b[31m";
- }
- }
- // Prevent the error stack from being visible by duplicating the error
- // in a very close way to the original in case both sides are actually
- // instances of Error.
- if (
- typeof actual === "object" && actual !== null &&
- typeof expected === "object" && expected !== null &&
- "stack" in actual && actual instanceof Error &&
- "stack" in expected && expected instanceof Error
- ) {
- actual = copyError(actual);
- expected = copyError(expected);
- }
-
- if (operator === "deepStrictEqual" || operator === "strictEqual") {
- super(createErrDiff(actual, expected, operator));
- } else if (
- operator === "notDeepStrictEqual" ||
- operator === "notStrictEqual"
- ) {
- // In case the objects are equal but the operator requires unequal, show
- // the first object and say A equals B
- let base = kReadableOperator[operator];
- const res = inspectValue(actual).split("\n");
-
- // In case "actual" is an object or a function, it should not be
- // reference equal.
- if (
- operator === "notStrictEqual" &&
- ((typeof actual === "object" && actual !== null) ||
- typeof actual === "function")
- ) {
- base = kReadableOperator.notStrictEqualObject;
- }
-
- // Only remove lines in case it makes sense to collapse those.
- if (res.length > 50) {
- res[46] = `${blue}...${defaultColor}`;
- while (res.length > 47) {
- res.pop();
- }
- }
-
- // Only print a single input.
- if (res.length === 1) {
- super(`${base}${res[0].length > 5 ? "\n\n" : " "}${res[0]}`);
- } else {
- super(`${base}\n\n${res.join("\n")}\n`);
- }
- } else {
- let res = inspectValue(actual);
- let other = inspectValue(expected);
- const knownOperator = kReadableOperator[operator ?? ""];
- if (operator === "notDeepEqual" && res === other) {
- res = `${knownOperator}\n\n${res}`;
- if (res.length > 1024) {
- res = `${res.slice(0, 1021)}...`;
- }
- super(res);
- } else {
- if (res.length > 512) {
- res = `${res.slice(0, 509)}...`;
- }
- if (other.length > 512) {
- other = `${other.slice(0, 509)}...`;
- }
- if (operator === "deepEqual") {
- res = `${knownOperator}\n\n${res}\n\nshould loosely deep-equal\n\n`;
- } else {
- const newOp = kReadableOperator[`${operator}Unequal`];
- if (newOp) {
- res = `${newOp}\n\n${res}\n\nshould not loosely deep-equal\n\n`;
- } else {
- other = ` ${operator} ${other}`;
- }
- }
- super(`${res}${other}`);
- }
- }
- }
-
- (Error as ErrorWithStackTraceLimit).stackTraceLimit = limit;
-
- this.generatedMessage = !message;
- ObjectDefineProperty(this, "name", {
- value: "AssertionError [ERR_ASSERTION]",
- enumerable: false,
- writable: true,
- configurable: true,
- });
- this.code = "ERR_ASSERTION";
-
- if (details) {
- this.actual = undefined;
- this.expected = undefined;
- this.operator = undefined;
-
- for (let i = 0; i < details.length; i++) {
- this["message " + i] = details[i].message;
- this["actual " + i] = details[i].actual;
- this["expected " + i] = details[i].expected;
- this["operator " + i] = details[i].operator;
- this["stack trace " + i] = details[i].stack;
- }
- } else {
- this.actual = actual;
- this.expected = expected;
- this.operator = operator;
- }
-
- Error.captureStackTrace(this, stackStartFn || stackStartFunction);
- // Create error message including the error code in the name.
- this.stack;
- // Reset the name.
- this.name = "AssertionError";
- }
-
- toString() {
- return `${this.name} [${this.code}]: ${this.message}`;
- }
-
- [inspect.custom](recurseTimes: number, ctx: Record<string, unknown>) {
- // Long strings should not be fully inspected.
- const tmpActual = this.actual;
- const tmpExpected = this.expected;
-
- for (const name of ["actual", "expected"]) {
- if (typeof this[name] === "string") {
- const value = (this[name] as string);
- const lines = value.split("\n");
- if (lines.length > 10) {
- lines.length = 10;
- this[name] = `${lines.join("\n")}\n...`;
- } else if (value.length > 512) {
- this[name] = `${value.slice(512)}...`;
- }
- }
- }
-
- // This limits the `actual` and `expected` property default inspection to
- // the minimum depth. Otherwise those values would be too verbose compared
- // to the actual error message which contains a combined view of these two
- // input values.
- const result = inspect(this, {
- ...ctx,
- customInspect: false,
- depth: 0,
- });
-
- // Reset the properties after inspection.
- this.actual = tmpActual;
- this.expected = tmpExpected;
-
- return result;
- }
-}
-
-export default AssertionError;
diff --git a/std/node/assertion_error_test.ts b/std/node/assertion_error_test.ts
deleted file mode 100644
index f4c9f2b19..000000000
--- a/std/node/assertion_error_test.ts
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { stripColor } from "../fmt/colors.ts";
-import {
- assert,
- assertEquals,
- assertNotStrictEquals,
- assertStrictEquals,
-} from "../testing/asserts.ts";
-import {
- AssertionError,
- copyError,
- createErrDiff,
- inspectValue,
-} from "./assertion_error.ts";
-
-Deno.test({
- name: "copyError()",
- fn() {
- class TestError extends Error {}
- const err = new TestError("this is a test");
- const copy = copyError(err);
-
- assert(copy instanceof Error, "Copy should inherit from Error.");
- assert(copy instanceof TestError, "Copy should inherit from TestError.");
- assertEquals(copy, err, "Copy should be equal to the original error.");
- assertNotStrictEquals(
- copy,
- err,
- "Copy should not be strictly equal to the original error.",
- );
- },
-});
-
-Deno.test({
- name: "inspectValue()",
- fn() {
- const obj = { a: 1, b: [2] };
- Object.defineProperty(obj, "c", { value: 3, enumerable: false });
- assertStrictEquals(
- stripColor(inspectValue(obj)),
- "{ a: 1, b: [ 2 ] }",
- );
- },
-});
-
-Deno.test({
- name: "createErrDiff()",
- fn() {
- assertStrictEquals(
- stripColor(
- createErrDiff({ a: 1, b: 2 }, { a: 2, b: 2 }, "strictEqual"),
- ),
- stripColor(
- 'Expected "actual" to be reference-equal to "expected":' + "\n" +
- "+ actual - expected" + "\n" +
- "\n" +
- "+ { a: 1, b: 2 }" + "\n" +
- "- { a: 2, b: 2 }",
- ),
- );
- },
-});
-
-Deno.test({
- name: "construct AssertionError() with given message",
- fn() {
- const err = new AssertionError(
- {
- message: "answer",
- actual: "42",
- expected: "42",
- operator: "notStrictEqual",
- },
- );
- assertStrictEquals(err.name, "AssertionError");
- assertStrictEquals(err.message, "answer");
- assertStrictEquals(err.generatedMessage, false);
- assertStrictEquals(err.code, "ERR_ASSERTION");
- assertStrictEquals(err.actual, "42");
- assertStrictEquals(err.expected, "42");
- assertStrictEquals(err.operator, "notStrictEqual");
- },
-});
-
-Deno.test({
- name: "construct AssertionError() with generated message",
- fn() {
- const err = new AssertionError(
- { actual: 1, expected: 2, operator: "equal" },
- );
- assertStrictEquals(err.name, "AssertionError");
- assertStrictEquals(stripColor(err.message), "1 equal 2");
- assertStrictEquals(err.generatedMessage, true);
- assertStrictEquals(err.code, "ERR_ASSERTION");
- assertStrictEquals(err.actual, 1);
- assertStrictEquals(err.expected, 2);
- assertStrictEquals(err.operator, "equal");
- },
-});
-
-Deno.test({
- name: "construct AssertionError() with stackStartFn",
- fn: function stackStartFn() {
- const expected = /node/;
- const err = new AssertionError({
- actual: "deno",
- expected,
- operator: "match",
- stackStartFn,
- });
- assertStrictEquals(err.name, "AssertionError");
- assertStrictEquals(stripColor(err.message), `"deno" match /node/`);
- assertStrictEquals(err.generatedMessage, true);
- assertStrictEquals(err.code, "ERR_ASSERTION");
- assertStrictEquals(err.actual, "deno");
- assertStrictEquals(err.expected, expected);
- assertStrictEquals(err.operator, "match");
- assert(err.stack, "error should have a stack");
- assert(
- !err.stack?.includes("stackStartFn"),
- "stackStartFn() should not present in stack trace",
- );
- },
-});
-
-Deno.test({
- name: "error details",
- fn() {
- const stack0 = new Error();
- const stack1 = new Error();
- const err = new AssertionError({
- message: "Function(s) were not called the expected number of times",
- details: [
- {
- message:
- "Expected the calls function to be executed 2 time(s) but was executed 3 time(s).",
- actual: 3,
- expected: 2,
- operator: "calls",
- stack: stack0,
- },
- {
- message:
- "Expected the fn function to be executed 1 time(s) but was executed 0 time(s).",
- actual: 0,
- expected: 1,
- operator: "fn",
- stack: stack1,
- },
- ],
- });
-
- assertStrictEquals(
- err.message,
- "Function(s) were not called the expected number of times",
- );
-
- assertStrictEquals(
- err["message 0"],
- "Expected the calls function to be executed 2 time(s) but was executed 3 time(s).",
- );
- assertStrictEquals(err["actual 0"], 3);
- assertStrictEquals(err["expected 0"], 2);
- assertStrictEquals(err["operator 0"], "calls");
- assertStrictEquals(err["stack trace 0"], stack0);
-
- assertStrictEquals(
- err["message 1"],
- "Expected the fn function to be executed 1 time(s) but was executed 0 time(s).",
- );
- assertStrictEquals(err["actual 1"], 0);
- assertStrictEquals(err["expected 1"], 1);
- assertStrictEquals(err["operator 1"], "fn");
- assertStrictEquals(err["stack trace 1"], stack1);
- },
-});
diff --git a/std/node/buffer.ts b/std/node/buffer.ts
deleted file mode 100644
index 379a2c09a..000000000
--- a/std/node/buffer.ts
+++ /dev/null
@@ -1,601 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import * as hex from "../encoding/hex.ts";
-import * as base64 from "../encoding/base64.ts";
-import { Encodings, normalizeEncoding, notImplemented } from "./_utils.ts";
-
-const notImplementedEncodings = [
- "ascii",
- "binary",
- "latin1",
- "ucs2",
- "utf16le",
-];
-
-function checkEncoding(encoding = "utf8", strict = true): Encodings {
- if (typeof encoding !== "string" || (strict && encoding === "")) {
- if (!strict) return "utf8";
- throw new TypeError(`Unkown encoding: ${encoding}`);
- }
-
- const normalized = normalizeEncoding(encoding);
-
- if (normalized === undefined) {
- throw new TypeError(`Unkown encoding: ${encoding}`);
- }
-
- if (notImplementedEncodings.includes(encoding)) {
- notImplemented(`"${encoding}" encoding`);
- }
-
- return normalized;
-}
-
-interface EncodingOp {
- byteLength(string: string): number;
-}
-
-// https://github.com/nodejs/node/blob/56dbe466fdbc598baea3bfce289bf52b97b8b8f7/lib/buffer.js#L598
-const encodingOps: { [key: string]: EncodingOp } = {
- utf8: {
- byteLength: (string: string): number =>
- new TextEncoder().encode(string).byteLength,
- },
- ucs2: {
- byteLength: (string: string): number => string.length * 2,
- },
- utf16le: {
- byteLength: (string: string): number => string.length * 2,
- },
- latin1: {
- byteLength: (string: string): number => string.length,
- },
- ascii: {
- byteLength: (string: string): number => string.length,
- },
- base64: {
- byteLength: (string: string): number =>
- base64ByteLength(string, string.length),
- },
- hex: {
- byteLength: (string: string): number => string.length >>> 1,
- },
-};
-
-function base64ByteLength(str: string, bytes: number): number {
- // Handle padding
- if (str.charCodeAt(bytes - 1) === 0x3d) bytes--;
- if (bytes > 1 && str.charCodeAt(bytes - 1) === 0x3d) bytes--;
-
- // Base64 ratio: 3/4
- return (bytes * 3) >>> 2;
-}
-
-/**
- * See also https://nodejs.org/api/buffer.html
- */
-export class Buffer extends Uint8Array {
- /**
- * Allocates a new Buffer of size bytes.
- */
- static alloc(
- size: number,
- fill?: number | string | Uint8Array | Buffer,
- encoding = "utf8",
- ): Buffer {
- if (typeof size !== "number") {
- throw new TypeError(
- `The "size" argument must be of type number. Received type ${typeof size}`,
- );
- }
-
- const buf = new Buffer(size);
- if (size === 0) return buf;
-
- let bufFill;
- if (typeof fill === "string") {
- const clearEncoding = checkEncoding(encoding);
- if (
- typeof fill === "string" &&
- fill.length === 1 &&
- clearEncoding === "utf8"
- ) {
- buf.fill(fill.charCodeAt(0));
- } else bufFill = Buffer.from(fill, clearEncoding);
- } else if (typeof fill === "number") {
- buf.fill(fill);
- } else if (fill instanceof Uint8Array) {
- if (fill.length === 0) {
- throw new TypeError(
- `The argument "value" is invalid. Received ${fill.constructor.name} []`,
- );
- }
-
- bufFill = fill;
- }
-
- if (bufFill) {
- if (bufFill.length > buf.length) {
- bufFill = bufFill.subarray(0, buf.length);
- }
-
- let offset = 0;
- while (offset < size) {
- buf.set(bufFill, offset);
- offset += bufFill.length;
- if (offset + bufFill.length >= size) break;
- }
- if (offset !== size) {
- buf.set(bufFill.subarray(0, size - offset), offset);
- }
- }
-
- return buf;
- }
-
- static allocUnsafe(size: number): Buffer {
- return new Buffer(size);
- }
-
- /**
- * Returns the byte length of a string when encoded. This is not the same as
- * String.prototype.length, which does not account for the encoding that is
- * used to convert the string into bytes.
- */
- static byteLength(
- string: string | Buffer | ArrayBufferView | ArrayBuffer | SharedArrayBuffer,
- encoding = "utf8",
- ): number {
- if (typeof string != "string") return string.byteLength;
-
- encoding = normalizeEncoding(encoding) || "utf8";
- return encodingOps[encoding].byteLength(string);
- }
-
- /**
- * Returns a new Buffer which is the result of concatenating all the Buffer
- * instances in the list together.
- */
- static concat(list: Buffer[] | Uint8Array[], totalLength?: number): Buffer {
- if (totalLength == undefined) {
- totalLength = 0;
- for (const buf of list) {
- totalLength += buf.length;
- }
- }
-
- const buffer = Buffer.allocUnsafe(totalLength);
- let pos = 0;
- for (const item of list) {
- let buf: Buffer;
- if (!(item instanceof Buffer)) {
- buf = Buffer.from(item);
- } else {
- buf = item;
- }
- buf.copy(buffer, pos);
- pos += buf.length;
- }
-
- return buffer;
- }
-
- /**
- * Allocates a new Buffer using an array of bytes in the range 0 – 255. Array
- * entries outside that range will be truncated to fit into it.
- */
- static from(array: number[]): Buffer;
- /**
- * This creates a view of the ArrayBuffer without copying the underlying
- * memory. For example, when passed a reference to the .buffer property of a
- * TypedArray instance, the newly created Buffer will share the same allocated
- * memory as the TypedArray.
- */
- static from(
- arrayBuffer: ArrayBuffer | SharedArrayBuffer,
- byteOffset?: number,
- length?: number,
- ): Buffer;
- /**
- * Copies the passed buffer data onto a new Buffer instance.
- */
- static from(buffer: Buffer | Uint8Array): Buffer;
- /**
- * Creates a new Buffer containing string.
- */
- static from(string: string, encoding?: string): Buffer;
- static from(
- // deno-lint-ignore no-explicit-any
- value: any,
- offsetOrEncoding?: number | string,
- length?: number,
- ): Buffer {
- const offset = typeof offsetOrEncoding === "string"
- ? undefined
- : offsetOrEncoding;
- let encoding = typeof offsetOrEncoding === "string"
- ? offsetOrEncoding
- : undefined;
-
- if (typeof value == "string") {
- encoding = checkEncoding(encoding, false);
- if (encoding === "hex") return new Buffer(hex.decodeString(value).buffer);
- if (encoding === "base64") return new Buffer(base64.decode(value).buffer);
- return new Buffer(new TextEncoder().encode(value).buffer);
- }
-
- // workaround for https://github.com/microsoft/TypeScript/issues/38446
- return new Buffer(value, offset!, length);
- }
-
- /**
- * Returns true if obj is a Buffer, false otherwise.
- */
- static isBuffer(obj: unknown): obj is Buffer {
- return obj instanceof Buffer;
- }
-
- // deno-lint-ignore no-explicit-any
- static isEncoding(encoding: any): boolean {
- return (
- typeof encoding === "string" &&
- encoding.length !== 0 &&
- normalizeEncoding(encoding) !== undefined
- );
- }
-
- /**
- * Copies data from a region of buf to a region in target, even if the target
- * memory region overlaps with buf.
- */
- copy(
- targetBuffer: Buffer | Uint8Array,
- targetStart = 0,
- sourceStart = 0,
- sourceEnd = this.length,
- ): number {
- const sourceBuffer = this
- .subarray(sourceStart, sourceEnd)
- .subarray(0, Math.max(0, targetBuffer.length - targetStart));
-
- if (sourceBuffer.length === 0) return 0;
-
- targetBuffer.set(sourceBuffer, targetStart);
- return sourceBuffer.length;
- }
-
- /*
- * Returns true if both buf and otherBuffer have exactly the same bytes, false otherwise.
- */
- equals(otherBuffer: Uint8Array | Buffer): boolean {
- if (!(otherBuffer instanceof Uint8Array)) {
- throw new TypeError(
- `The "otherBuffer" argument must be an instance of Buffer or Uint8Array. Received type ${typeof otherBuffer}`,
- );
- }
-
- if (this === otherBuffer) return true;
- if (this.byteLength !== otherBuffer.byteLength) return false;
-
- for (let i = 0; i < this.length; i++) {
- if (this[i] !== otherBuffer[i]) return false;
- }
-
- return true;
- }
-
- readBigInt64BE(offset = 0): bigint {
- return new DataView(
- this.buffer,
- this.byteOffset,
- this.byteLength,
- ).getBigInt64(offset);
- }
- readBigInt64LE(offset = 0): bigint {
- return new DataView(
- this.buffer,
- this.byteOffset,
- this.byteLength,
- ).getBigInt64(offset, true);
- }
-
- readBigUInt64BE(offset = 0): bigint {
- return new DataView(
- this.buffer,
- this.byteOffset,
- this.byteLength,
- ).getBigUint64(offset);
- }
- readBigUInt64LE(offset = 0): bigint {
- return new DataView(
- this.buffer,
- this.byteOffset,
- this.byteLength,
- ).getBigUint64(offset, true);
- }
-
- readDoubleBE(offset = 0): number {
- return new DataView(
- this.buffer,
- this.byteOffset,
- this.byteLength,
- ).getFloat64(offset);
- }
- readDoubleLE(offset = 0): number {
- return new DataView(
- this.buffer,
- this.byteOffset,
- this.byteLength,
- ).getFloat64(offset, true);
- }
-
- readFloatBE(offset = 0): number {
- return new DataView(
- this.buffer,
- this.byteOffset,
- this.byteLength,
- ).getFloat32(offset);
- }
- readFloatLE(offset = 0): number {
- return new DataView(
- this.buffer,
- this.byteOffset,
- this.byteLength,
- ).getFloat32(offset, true);
- }
-
- readInt8(offset = 0): number {
- return new DataView(this.buffer, this.byteOffset, this.byteLength).getInt8(
- offset,
- );
- }
-
- readInt16BE(offset = 0): number {
- return new DataView(this.buffer, this.byteOffset, this.byteLength).getInt16(
- offset,
- );
- }
- readInt16LE(offset = 0): number {
- return new DataView(this.buffer, this.byteOffset, this.byteLength).getInt16(
- offset,
- true,
- );
- }
-
- readInt32BE(offset = 0): number {
- return new DataView(this.buffer, this.byteOffset, this.byteLength).getInt32(
- offset,
- );
- }
- readInt32LE(offset = 0): number {
- return new DataView(this.buffer, this.byteOffset, this.byteLength).getInt32(
- offset,
- true,
- );
- }
-
- readUInt8(offset = 0): number {
- return new DataView(this.buffer, this.byteOffset, this.byteLength).getUint8(
- offset,
- );
- }
-
- readUInt16BE(offset = 0): number {
- return new DataView(
- this.buffer,
- this.byteOffset,
- this.byteLength,
- ).getUint16(offset);
- }
- readUInt16LE(offset = 0): number {
- return new DataView(
- this.buffer,
- this.byteOffset,
- this.byteLength,
- ).getUint16(offset, true);
- }
-
- readUInt32BE(offset = 0): number {
- return new DataView(
- this.buffer,
- this.byteOffset,
- this.byteLength,
- ).getUint32(offset);
- }
- readUInt32LE(offset = 0): number {
- return new DataView(
- this.buffer,
- this.byteOffset,
- this.byteLength,
- ).getUint32(offset, true);
- }
-
- /**
- * Returns a new Buffer that references the same memory as the original, but
- * offset and cropped by the start and end indices.
- */
- slice(begin = 0, end = this.length): Buffer {
- // workaround for https://github.com/microsoft/TypeScript/issues/38665
- return this.subarray(begin, end) as Buffer;
- }
-
- /**
- * Returns a JSON representation of buf. JSON.stringify() implicitly calls
- * this function when stringifying a Buffer instance.
- */
- toJSON(): Record<string, unknown> {
- return { type: "Buffer", data: Array.from(this) };
- }
-
- /**
- * Decodes buf to a string according to the specified character encoding in
- * encoding. start and end may be passed to decode only a subset of buf.
- */
- toString(encoding = "utf8", start = 0, end = this.length): string {
- encoding = checkEncoding(encoding);
-
- const b = this.subarray(start, end);
- if (encoding === "hex") return hex.encodeToString(b);
- if (encoding === "base64") return base64.encode(b.buffer);
-
- return new TextDecoder(encoding).decode(b);
- }
-
- /**
- * Writes string to buf at offset according to the character encoding in
- * encoding. The length parameter is the number of bytes to write. If buf did
- * not contain enough space to fit the entire string, only part of string will
- * be written. However, partially encoded characters will not be written.
- */
- write(string: string, offset = 0, length = this.length): number {
- return new TextEncoder().encodeInto(
- string,
- this.subarray(offset, offset + length),
- ).written;
- }
-
- writeBigInt64BE(value: bigint, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setBigInt64(
- offset,
- value,
- );
- return offset + 4;
- }
- writeBigInt64LE(value: bigint, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setBigInt64(
- offset,
- value,
- true,
- );
- return offset + 4;
- }
-
- writeBigUInt64BE(value: bigint, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setBigUint64(
- offset,
- value,
- );
- return offset + 4;
- }
- writeBigUInt64LE(value: bigint, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setBigUint64(
- offset,
- value,
- true,
- );
- return offset + 4;
- }
-
- writeDoubleBE(value: number, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setFloat64(
- offset,
- value,
- );
- return offset + 8;
- }
- writeDoubleLE(value: number, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setFloat64(
- offset,
- value,
- true,
- );
- return offset + 8;
- }
-
- writeFloatBE(value: number, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setFloat32(
- offset,
- value,
- );
- return offset + 4;
- }
- writeFloatLE(value: number, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setFloat32(
- offset,
- value,
- true,
- );
- return offset + 4;
- }
-
- writeInt8(value: number, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setInt8(
- offset,
- value,
- );
- return offset + 1;
- }
-
- writeInt16BE(value: number, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setInt16(
- offset,
- value,
- );
- return offset + 2;
- }
- writeInt16LE(value: number, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setInt16(
- offset,
- value,
- true,
- );
- return offset + 2;
- }
-
- writeInt32BE(value: number, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setUint32(
- offset,
- value,
- );
- return offset + 4;
- }
- writeInt32LE(value: number, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setInt32(
- offset,
- value,
- true,
- );
- return offset + 4;
- }
-
- writeUInt8(value: number, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setUint8(
- offset,
- value,
- );
- return offset + 1;
- }
-
- writeUInt16BE(value: number, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setUint16(
- offset,
- value,
- );
- return offset + 2;
- }
- writeUInt16LE(value: number, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setUint16(
- offset,
- value,
- true,
- );
- return offset + 2;
- }
-
- writeUInt32BE(value: number, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setUint32(
- offset,
- value,
- );
- return offset + 4;
- }
- writeUInt32LE(value: number, offset = 0): number {
- new DataView(this.buffer, this.byteOffset, this.byteLength).setUint32(
- offset,
- value,
- true,
- );
- return offset + 4;
- }
-}
-
-export default { Buffer };
diff --git a/std/node/buffer_test.ts b/std/node/buffer_test.ts
deleted file mode 100644
index f3fee8e29..000000000
--- a/std/node/buffer_test.ts
+++ /dev/null
@@ -1,649 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { assertEquals, assertThrows } from "../testing/asserts.ts";
-import { Buffer } from "./buffer.ts";
-
-Deno.test({
- name: "alloc fails on negative numbers",
- fn() {
- assertThrows(
- () => {
- Buffer.alloc(-1);
- },
- RangeError,
- "Invalid typed array length: -1",
- "should throw on negative numbers",
- );
- },
-});
-
-Deno.test({
- name: "alloc fails if size is not a number",
- fn() {
- const invalidSizes = [{}, "1", "foo", []];
-
- for (const size of invalidSizes) {
- assertThrows(
- () => {
- // deno-lint-ignore ban-ts-comment
- // @ts-expect-error
- Buffer.alloc(size);
- },
- TypeError,
- `The "size" argument must be of type number. Received type ${typeof size}`,
- "should throw on non-number size",
- );
- }
- },
-});
-
-Deno.test({
- name: "alloc(>0) fails if value is an empty Buffer/Uint8Array",
- fn() {
- const invalidValues = [new Uint8Array(), Buffer.alloc(0)];
-
- for (const value of invalidValues) {
- assertThrows(
- () => {
- console.log(value.constructor.name);
- Buffer.alloc(1, value);
- },
- TypeError,
- `The argument "value" is invalid. Received ${value.constructor.name} []`,
- "should throw for empty Buffer/Uint8Array",
- );
- }
- },
-});
-
-Deno.test({
- name: "alloc(0) doesn't fail if value is an empty Buffer/Uint8Array",
- fn() {
- const invalidValues = [new Uint8Array(), Buffer.alloc(0)];
-
- for (const value of invalidValues) {
- assertEquals(Buffer.alloc(0, value).length, 0);
- }
- },
-});
-
-Deno.test({
- name: "alloc allocates a buffer with the expected size",
- fn() {
- const buffer: Buffer = Buffer.alloc(1);
- assertEquals(buffer.length, 1, "Buffer size should be 1");
- assertEquals(buffer[0], 0, "Content should be filled with 0");
- },
-});
-
-Deno.test({
- name: "alloc(0) creates an empty buffer",
- fn() {
- const buffer: Buffer = Buffer.alloc(0);
- assertEquals(buffer.length, 0, "Buffer size should be 0");
- },
-});
-
-Deno.test({
- name: "allocUnsafe allocates a buffer with the expected size",
- fn() {
- const buffer: Buffer = Buffer.allocUnsafe(1);
- assertEquals(buffer.length, 1, "Buffer size should be 1");
- },
-});
-
-Deno.test({
- name: "allocUnsafe(0) creates an empty buffer",
- fn() {
- const buffer: Buffer = Buffer.allocUnsafe(0);
- assertEquals(buffer.length, 0, "Buffer size should be 0");
- },
-});
-
-Deno.test({
- name: "alloc filled correctly with integer",
- fn() {
- const buffer: Buffer = Buffer.alloc(3, 5);
- assertEquals(buffer, new Uint8Array([5, 5, 5]));
- },
-});
-
-Deno.test({
- name: "alloc filled correctly with single character",
- fn() {
- assertEquals(Buffer.alloc(5, "a"), new Uint8Array([97, 97, 97, 97, 97]));
- },
-});
-
-Deno.test({
- name: "alloc filled correctly with base64 string",
- fn() {
- assertEquals(
- Buffer.alloc(11, "aGVsbG8gd29ybGQ=", "base64"),
- new Uint8Array([104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]),
- );
- },
-});
-
-Deno.test({
- name: "alloc filled correctly with hex string",
- fn() {
- assertEquals(
- Buffer.alloc(4, "64656e6f", "hex"),
- new Uint8Array([100, 101, 110, 111]),
- );
- },
-});
-
-Deno.test({
- name: "alloc filled correctly with hex string smaller than alloc size",
- fn() {
- assertEquals(
- Buffer.alloc(13, "64656e6f", "hex").toString(),
- "denodenodenod",
- );
- },
-});
-
-Deno.test({
- name: "alloc filled correctly with Uint8Array smaller than alloc size",
- fn() {
- assertEquals(
- Buffer.alloc(7, new Uint8Array([100, 101])),
- new Uint8Array([100, 101, 100, 101, 100, 101, 100]),
- );
- assertEquals(
- Buffer.alloc(6, new Uint8Array([100, 101])),
- new Uint8Array([100, 101, 100, 101, 100, 101]),
- );
- },
-});
-
-Deno.test({
- name: "alloc filled correctly with Uint8Array bigger than alloc size",
- fn() {
- assertEquals(
- Buffer.alloc(1, new Uint8Array([100, 101])),
- new Uint8Array([100]),
- );
- },
-});
-
-Deno.test({
- name: "alloc filled correctly with Buffer",
- fn() {
- assertEquals(
- Buffer.alloc(6, new Buffer([100, 101])),
- new Uint8Array([100, 101, 100, 101, 100, 101]),
- );
- assertEquals(
- Buffer.alloc(7, new Buffer([100, 101])),
- new Uint8Array([100, 101, 100, 101, 100, 101, 100]),
- );
- },
-});
-
-// tests from:
-// https://github.com/nodejs/node/blob/56dbe466fdbc598baea3bfce289bf52b97b8b8f7/test/parallel/test-buffer-bytelength.js#L70
-Deno.test({
- name: "Byte length is the expected for strings",
- fn() {
- // Special case: zero length string
- assertEquals(Buffer.byteLength("", "ascii"), 0);
- assertEquals(Buffer.byteLength("", "HeX"), 0);
-
- // utf8
- assertEquals(Buffer.byteLength("∑éllö wørl∂!", "utf-8"), 19);
- assertEquals(Buffer.byteLength("κλμνξο", "utf8"), 12);
- assertEquals(Buffer.byteLength("挵挶挷挸挹", "utf-8"), 15);
- assertEquals(Buffer.byteLength("𠝹𠱓𠱸", "UTF8"), 12);
- // Without an encoding, utf8 should be assumed
- assertEquals(Buffer.byteLength("hey there"), 9);
- assertEquals(Buffer.byteLength("𠱸挶νξ#xx :)"), 17);
- assertEquals(Buffer.byteLength("hello world", ""), 11);
- // It should also be assumed with unrecognized encoding
- assertEquals(Buffer.byteLength("hello world", "abc"), 11);
- assertEquals(Buffer.byteLength("ßœ∑≈", "unkn0wn enc0ding"), 10);
-
- // base64
- assertEquals(Buffer.byteLength("aGVsbG8gd29ybGQ=", "base64"), 11);
- assertEquals(Buffer.byteLength("aGVsbG8gd29ybGQ=", "BASE64"), 11);
- assertEquals(Buffer.byteLength("bm9kZS5qcyByb2NrcyE=", "base64"), 14);
- assertEquals(Buffer.byteLength("aGkk", "base64"), 3);
- assertEquals(
- Buffer.byteLength("bHNrZGZsa3NqZmtsc2xrZmFqc2RsZmtqcw==", "base64"),
- 25,
- );
- // special padding
- assertEquals(Buffer.byteLength("aaa=", "base64"), 2);
- assertEquals(Buffer.byteLength("aaaa==", "base64"), 3);
-
- assertEquals(Buffer.byteLength("Il était tué"), 14);
- assertEquals(Buffer.byteLength("Il était tué", "utf8"), 14);
-
- ["ascii", "latin1", "binary"]
- .reduce((es: string[], e: string) => es.concat(e, e.toUpperCase()), [])
- .forEach((encoding: string) => {
- assertEquals(Buffer.byteLength("Il était tué", encoding), 12);
- });
-
- ["ucs2", "ucs-2", "utf16le", "utf-16le"]
- .reduce((es: string[], e: string) => es.concat(e, e.toUpperCase()), [])
- .forEach((encoding: string) => {
- assertEquals(Buffer.byteLength("Il était tué", encoding), 24);
- });
- },
-});
-
-Deno.test({
- name: "Byte length is the expected one for non-strings",
- fn() {
- assertEquals(
- Buffer.byteLength(Buffer.alloc(0)),
- Buffer.alloc(0).byteLength,
- "Byte lenght differs on buffers",
- );
- },
-});
-
-Deno.test({
- name: "Two Buffers are concatenated",
- fn() {
- const data1 = [1, 2, 3];
- const data2 = [4, 5, 6];
-
- const buffer1 = Buffer.from(data1);
- const buffer2 = Buffer.from(data2);
-
- const resultBuffer = Buffer.concat([buffer1, buffer2]);
- const expectedBuffer = Buffer.from([...data1, ...data2]);
- assertEquals(resultBuffer, expectedBuffer);
- },
-});
-
-Deno.test({
- name: "A single buffer concatenates and return the same buffer",
- fn() {
- const buffer1 = Buffer.alloc(1);
- const resultBuffer = Buffer.concat([buffer1]);
- assertEquals(resultBuffer.length, 1, "Buffer length should be 1");
- },
-});
-
-Deno.test({
- name: "No buffers concat returns an empty buffer",
- fn() {
- const resultBuffer = Buffer.concat([]);
- assertEquals(resultBuffer.length, 0, "Buffer length should be 0");
- },
-});
-
-Deno.test({
- name: "Buffer concat respects totalLenght parameter",
- fn() {
- const maxLength1 = 10;
- const buffer1 = Buffer.alloc(2);
- const buffer2 = Buffer.alloc(2);
- assertEquals(
- Buffer.concat([buffer1, buffer2], maxLength1).length,
- maxLength1,
- );
-
- const maxLength2 = 3;
- const buffer3 = Buffer.alloc(2);
- const buffer4 = Buffer.alloc(2);
- assertEquals(
- Buffer.concat([buffer3, buffer4], maxLength2).length,
- maxLength2,
- );
- },
-});
-
-Deno.test({
- name: "Buffer copy works as expected",
- fn() {
- const data1 = new Uint8Array([1, 2, 3]);
- const data2 = new Uint8Array([4, 5, 6]);
-
- const buffer1 = Buffer.from(data1);
- const buffer2 = Buffer.from(data2);
-
- //Mutates data_1
- data1.set(data2);
- //Mutates buffer_1
- buffer2.copy(buffer1);
-
- assertEquals(
- data1,
- buffer1,
- );
- },
-});
-
-Deno.test({
- name: "Buffer copy respects the starting point for copy",
- fn() {
- const buffer1 = Buffer.from([1, 2, 3]);
- const buffer2 = Buffer.alloc(8);
-
- buffer1.copy(buffer2, 5);
-
- const expected = Buffer.from([0, 0, 0, 0, 0, 1, 2, 3]);
-
- assertEquals(
- buffer2,
- expected,
- );
- },
-});
-
-Deno.test({
- name: "Buffer copy doesn't throw on offset but copies until offset reached",
- fn() {
- const buffer1 = Buffer.from([1, 2, 3]);
- const buffer2 = Buffer.alloc(8);
-
- const writtenBytes1 = buffer1.copy(buffer2, 6);
-
- assertEquals(
- writtenBytes1,
- 2,
- );
-
- assertEquals(
- buffer2,
- Buffer.from([0, 0, 0, 0, 0, 0, 1, 2]),
- );
-
- const buffer3 = Buffer.from([1, 2, 3]);
- const buffer4 = Buffer.alloc(8);
-
- const writtenBytes2 = buffer3.copy(buffer4, 8);
-
- assertEquals(
- writtenBytes2,
- 0,
- );
-
- assertEquals(
- buffer4,
- Buffer.from([0, 0, 0, 0, 0, 0, 0, 0]),
- );
- },
-});
-
-Deno.test({
- name: "Buffer from string creates a Buffer",
- fn() {
- const buffer: Buffer = Buffer.from("test");
- assertEquals(buffer.length, 4, "Buffer length should be 4");
- assertEquals(
- buffer.toString(),
- "test",
- "Buffer to string should recover the string",
- );
- },
-});
-
-Deno.test({
- name: "Buffer from string hex",
- fn() {
- for (const encoding of ["hex", "HEX"]) {
- const buffer: Buffer = Buffer.from(
- "7468697320697320612074c3a97374",
- encoding,
- );
- assertEquals(buffer.length, 15, "Buffer length should be 15");
- assertEquals(
- buffer.toString(),
- "this is a tést",
- "Buffer to string should recover the string",
- );
- }
- },
-});
-
-Deno.test({
- name: "Buffer from string base64",
- fn() {
- for (const encoding of ["base64", "BASE64"]) {
- const buffer: Buffer = Buffer.from("dGhpcyBpcyBhIHTDqXN0", encoding);
- assertEquals(buffer.length, 15, "Buffer length should be 15");
- assertEquals(
- buffer.toString(),
- "this is a tést",
- "Buffer to string should recover the string",
- );
- }
- },
-});
-
-Deno.test({
- name: "Buffer to string base64",
- fn() {
- for (const encoding of ["base64", "BASE64"]) {
- const buffer: Buffer = Buffer.from("deno land");
- assertEquals(
- buffer.toString(encoding),
- "ZGVubyBsYW5k",
- "Buffer to string should recover the string in base64",
- );
- }
- const b64 = "dGhpcyBpcyBhIHTDqXN0";
- assertEquals(Buffer.from(b64, "base64").toString("base64"), b64);
- },
-});
-
-Deno.test({
- name: "Buffer to string hex",
- fn() {
- for (const encoding of ["hex", "HEX"]) {
- const buffer: Buffer = Buffer.from("deno land");
- assertEquals(
- buffer.toString(encoding),
- "64656e6f206c616e64",
- "Buffer to string should recover the string",
- );
- }
- const hex = "64656e6f206c616e64";
- assertEquals(Buffer.from(hex, "hex").toString("hex"), hex);
- },
-});
-
-Deno.test({
- name: "Buffer to string invalid encoding",
- fn() {
- const buffer: Buffer = Buffer.from("deno land");
- const invalidEncodings = [null, 5, {}, true, false, "foo", ""];
-
- for (const encoding of invalidEncodings) {
- assertThrows(
- () => {
- // deno-lint-ignore ban-ts-comment
- // @ts-expect-error
- buffer.toString(encoding);
- },
- TypeError,
- `Unkown encoding: ${encoding}`,
- "Should throw on invalid encoding",
- );
- }
- },
-});
-
-Deno.test({
- name: "Buffer from string invalid encoding",
- fn() {
- const defaultToUtf8Encodings = [null, 5, {}, true, false, ""];
- const invalidEncodings = ["deno", "base645"];
-
- for (const encoding of defaultToUtf8Encodings) {
- // deno-lint-ignore ban-ts-comment
- // @ts-expect-error
- assertEquals(Buffer.from("yes", encoding).toString(), "yes");
- }
-
- for (const encoding of invalidEncodings) {
- assertThrows(
- () => {
- Buffer.from("yes", encoding);
- },
- TypeError,
- `Unkown encoding: ${encoding}`,
- );
- }
- },
-});
-
-Deno.test({
- name: "Buffer to/from string not implemented encodings",
- fn() {
- const buffer: Buffer = Buffer.from("deno land");
- const notImplemented = ["ascii", "binary"];
-
- for (const encoding of notImplemented) {
- assertThrows(
- () => {
- buffer.toString(encoding);
- },
- Error,
- `"${encoding}" encoding`,
- "Should throw on invalid encoding",
- );
-
- assertThrows(
- () => {
- Buffer.from("", encoding);
- },
- Error,
- `"${encoding}" encoding`,
- "Should throw on invalid encoding",
- );
- }
- },
-});
-
-Deno.test({
- name: "Buffer from another buffer creates a Buffer",
- fn() {
- const buffer: Buffer = Buffer.from(Buffer.from("test"));
- assertEquals(buffer.length, 4, "Buffer length should be 4");
- assertEquals(
- buffer.toString(),
- "test",
- "Buffer to string should recover the string",
- );
- },
-});
-
-Deno.test({
- name: "isBuffer returns true if the object is a buffer",
- fn() {
- assertEquals(Buffer.isBuffer(Buffer.from("test")), true);
- },
-});
-
-Deno.test({
- name: "isBuffer returns false if the object is not a buffer",
- fn() {
- assertEquals(Buffer.isBuffer({ test: 3 }), false);
- assertEquals(Buffer.isBuffer(new Uint8Array()), false);
- },
-});
-
-Deno.test({
- name: "Buffer toJSON",
- fn() {
- assertEquals(
- JSON.stringify(Buffer.from("deno")),
- '{"type":"Buffer","data":[100,101,110,111]}',
- );
- },
-});
-
-Deno.test({
- name: "buf.slice does not create a copy",
- fn() {
- const buf = Buffer.from("ceno");
- // This method is not compatible with the Uint8Array.prototype.slice()
- const slice = buf.slice();
- slice[0]++;
- assertEquals(slice.toString(), "deno");
- },
-});
-
-Deno.test({
- name: "isEncoding returns true for valid encodings",
- fn() {
- [
- "hex",
- "HEX",
- "HeX",
- "utf8",
- "utf-8",
- "ascii",
- "latin1",
- "binary",
- "base64",
- "BASE64",
- "BASe64",
- "ucs2",
- "ucs-2",
- "utf16le",
- "utf-16le",
- ].forEach((enc) => {
- assertEquals(Buffer.isEncoding(enc), true);
- });
- },
-});
-
-Deno.test({
- name: "isEncoding returns false for invalid encodings",
- fn() {
- [
- "utf9",
- "utf-7",
- "Unicode-FTW",
- "new gnu gun",
- false,
- NaN,
- {},
- Infinity,
- [],
- 1,
- 0,
- -1,
- ].forEach((enc) => {
- assertEquals(Buffer.isEncoding(enc), false);
- });
- },
-});
-
-// ported from:
-// https://github.com/nodejs/node/blob/56dbe466fdbc598baea3bfce289bf52b97b8b8f7/test/parallel/test-buffer-equals.js#L6
-Deno.test({
- name: "buf.equals",
- fn() {
- const b = Buffer.from("abcdf");
- const c = Buffer.from("abcdf");
- const d = Buffer.from("abcde");
- const e = Buffer.from("abcdef");
-
- assertEquals(b.equals(c), true);
- assertEquals(d.equals(d), true);
- assertEquals(
- d.equals(new Uint8Array([0x61, 0x62, 0x63, 0x64, 0x65])),
- true,
- );
-
- assertEquals(c.equals(d), false);
- assertEquals(d.equals(e), false);
-
- assertThrows(
- // deno-lint-ignore ban-ts-comment
- // @ts-expect-error
- () => Buffer.alloc(1).equals("abc"),
- TypeError,
- `The "otherBuffer" argument must be an instance of Buffer or Uint8Array. Received type string`,
- );
- },
-});
diff --git a/std/node/crypto.ts b/std/node/crypto.ts
deleted file mode 100644
index 8b933a99c..000000000
--- a/std/node/crypto.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { default as randomBytes } from "./_crypto/randomBytes.ts";
-import { pbkdf2, pbkdf2Sync } from "./_crypto/pbkdf2.ts";
-
-export default { randomBytes, pbkdf2, pbkdf2Sync };
-export { pbkdf2, pbkdf2Sync, randomBytes };
diff --git a/std/node/events.ts b/std/node/events.ts
deleted file mode 100644
index f737c884c..000000000
--- a/std/node/events.ts
+++ /dev/null
@@ -1,558 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-// Copyright (c) 2019 Denolibs authors. All rights reserved. MIT license.
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-import { validateIntegerRange } from "./_utils.ts";
-import { assert } from "../_util/assert.ts";
-
-// deno-lint-ignore no-explicit-any
-export type GenericFunction = (...args: any[]) => any;
-
-export interface WrappedFunction extends Function {
- listener: GenericFunction;
-}
-
-// deno-lint-ignore no-explicit-any
-function createIterResult(value: any, done: boolean): IteratorResult<any> {
- return { value, done };
-}
-
-interface AsyncIterable {
- // deno-lint-ignore no-explicit-any
- next(): Promise<IteratorResult<any, any>>;
- // deno-lint-ignore no-explicit-any
- return(): Promise<IteratorResult<any, any>>;
- throw(err: Error): void;
- // deno-lint-ignore no-explicit-any
- [Symbol.asyncIterator](): any;
-}
-
-export let defaultMaxListeners = 10;
-
-/**
- * See also https://nodejs.org/api/events.html
- */
-export default class EventEmitter {
- public static captureRejectionSymbol = Symbol.for("nodejs.rejection");
- public static errorMonitor = Symbol("events.errorMonitor");
- public static get defaultMaxListeners() {
- return defaultMaxListeners;
- }
- public static set defaultMaxListeners(value: number) {
- defaultMaxListeners = value;
- }
-
- private maxListeners: number | undefined;
- private _events: Map<
- string | symbol,
- Array<GenericFunction | WrappedFunction>
- >;
-
- public constructor() {
- this._events = new Map();
- }
-
- private _addListener(
- eventName: string | symbol,
- listener: GenericFunction | WrappedFunction,
- prepend: boolean,
- ): this {
- this.emit("newListener", eventName, listener);
- if (this._events.has(eventName)) {
- const listeners = this._events.get(eventName) as Array<
- GenericFunction | WrappedFunction
- >;
- if (prepend) {
- listeners.unshift(listener);
- } else {
- listeners.push(listener);
- }
- } else {
- this._events.set(eventName, [listener]);
- }
- const max = this.getMaxListeners();
- if (max > 0 && this.listenerCount(eventName) > max) {
- const warning = new Error(
- `Possible EventEmitter memory leak detected.
- ${this.listenerCount(eventName)} ${eventName.toString()} listeners.
- Use emitter.setMaxListeners() to increase limit`,
- );
- warning.name = "MaxListenersExceededWarning";
- console.warn(warning);
- }
-
- return this;
- }
-
- /** Alias for emitter.on(eventName, listener). */
- public addListener(
- eventName: string | symbol,
- listener: GenericFunction | WrappedFunction,
- ): this {
- return this._addListener(eventName, listener, false);
- }
-
- /**
- * Synchronously calls each of the listeners registered for the event named
- * eventName, in the order they were registered, passing the supplied
- * arguments to each.
- * @return true if the event had listeners, false otherwise
- */
- // deno-lint-ignore no-explicit-any
- public emit(eventName: string | symbol, ...args: any[]): boolean {
- if (this._events.has(eventName)) {
- if (
- eventName === "error" &&
- this._events.get(EventEmitter.errorMonitor)
- ) {
- this.emit(EventEmitter.errorMonitor, ...args);
- }
- const listeners = (this._events.get(
- eventName,
- ) as GenericFunction[]).slice(); // We copy with slice() so array is not mutated during emit
- for (const listener of listeners) {
- try {
- listener.apply(this, args);
- } catch (err) {
- this.emit("error", err);
- }
- }
- return true;
- } else if (eventName === "error") {
- if (this._events.get(EventEmitter.errorMonitor)) {
- this.emit(EventEmitter.errorMonitor, ...args);
- }
- const errMsg = args.length > 0 ? args[0] : Error("Unhandled error.");
- throw errMsg;
- }
- return false;
- }
-
- /**
- * Returns an array listing the events for which the emitter has
- * registered listeners.
- */
- public eventNames(): [string | symbol] {
- return Array.from(this._events.keys()) as [string | symbol];
- }
-
- /**
- * Returns the current max listener value for the EventEmitter which is
- * either set by emitter.setMaxListeners(n) or defaults to
- * EventEmitter.defaultMaxListeners.
- */
- public getMaxListeners(): number {
- return this.maxListeners || EventEmitter.defaultMaxListeners;
- }
-
- /**
- * Returns the number of listeners listening to the event named
- * eventName.
- */
- public listenerCount(eventName: string | symbol): number {
- if (this._events.has(eventName)) {
- return (this._events.get(eventName) as GenericFunction[]).length;
- } else {
- return 0;
- }
- }
-
- private _listeners(
- target: EventEmitter,
- eventName: string | symbol,
- unwrap: boolean,
- ): GenericFunction[] {
- if (!target._events.has(eventName)) {
- return [];
- }
- const eventListeners = target._events.get(eventName) as GenericFunction[];
-
- return unwrap
- ? this.unwrapListeners(eventListeners)
- : eventListeners.slice(0);
- }
-
- private unwrapListeners(arr: GenericFunction[]): GenericFunction[] {
- const unwrappedListeners = new Array(arr.length) as GenericFunction[];
- for (let i = 0; i < arr.length; i++) {
- // deno-lint-ignore no-explicit-any
- unwrappedListeners[i] = (arr[i] as any)["listener"] || arr[i];
- }
- return unwrappedListeners;
- }
-
- /** Returns a copy of the array of listeners for the event named eventName.*/
- public listeners(eventName: string | symbol): GenericFunction[] {
- return this._listeners(this, eventName, true);
- }
-
- /**
- * Returns a copy of the array of listeners for the event named eventName,
- * including any wrappers (such as those created by .once()).
- */
- public rawListeners(
- eventName: string | symbol,
- ): Array<GenericFunction | WrappedFunction> {
- return this._listeners(this, eventName, false);
- }
-
- /** Alias for emitter.removeListener(). */
- public off(eventName: string | symbol, listener: GenericFunction): this {
- return this.removeListener(eventName, listener);
- }
-
- /**
- * Adds the listener function to the end of the listeners array for the event
- * named eventName. No checks are made to see if the listener has already
- * been added. Multiple calls passing the same combination of eventName and
- * listener will result in the listener being added, and called, multiple
- * times.
- */
- public on(
- eventName: string | symbol,
- listener: GenericFunction | WrappedFunction,
- ): this {
- return this._addListener(eventName, listener, false);
- }
-
- /**
- * Adds a one-time listener function for the event named eventName. The next
- * time eventName is triggered, this listener is removed and then invoked.
- */
- public once(eventName: string | symbol, listener: GenericFunction): this {
- const wrapped: WrappedFunction = this.onceWrap(eventName, listener);
- this.on(eventName, wrapped);
- return this;
- }
-
- // Wrapped function that calls EventEmitter.removeListener(eventName, self) on execution.
- private onceWrap(
- eventName: string | symbol,
- listener: GenericFunction,
- ): WrappedFunction {
- const wrapper = function (
- this: {
- eventName: string | symbol;
- listener: GenericFunction;
- rawListener: GenericFunction | WrappedFunction;
- context: EventEmitter;
- },
- // deno-lint-ignore no-explicit-any
- ...args: any[]
- ): void {
- this.context.removeListener(
- this.eventName,
- this.rawListener as GenericFunction,
- );
- this.listener.apply(this.context, args);
- };
- const wrapperContext = {
- eventName: eventName,
- listener: listener,
- rawListener: (wrapper as unknown) as WrappedFunction,
- context: this,
- };
- const wrapped = (wrapper.bind(
- wrapperContext,
- ) as unknown) as WrappedFunction;
- wrapperContext.rawListener = wrapped;
- wrapped.listener = listener;
- return wrapped as WrappedFunction;
- }
-
- /**
- * Adds the listener function to the beginning of the listeners array for the
- * event named eventName. No checks are made to see if the listener has
- * already been added. Multiple calls passing the same combination of
- * eventName and listener will result in the listener being added, and
- * called, multiple times.
- */
- public prependListener(
- eventName: string | symbol,
- listener: GenericFunction | WrappedFunction,
- ): this {
- return this._addListener(eventName, listener, true);
- }
-
- /**
- * Adds a one-time listener function for the event named eventName to the
- * beginning of the listeners array. The next time eventName is triggered,
- * this listener is removed, and then invoked.
- */
- public prependOnceListener(
- eventName: string | symbol,
- listener: GenericFunction,
- ): this {
- const wrapped: WrappedFunction = this.onceWrap(eventName, listener);
- this.prependListener(eventName, wrapped);
- return this;
- }
-
- /** Removes all listeners, or those of the specified eventName. */
- public removeAllListeners(eventName?: string | symbol): this {
- if (this._events === undefined) {
- return this;
- }
-
- if (eventName) {
- if (this._events.has(eventName)) {
- const listeners = (this._events.get(eventName) as Array<
- GenericFunction | WrappedFunction
- >).slice(); // Create a copy; We use it AFTER it's deleted.
- this._events.delete(eventName);
- for (const listener of listeners) {
- this.emit("removeListener", eventName, listener);
- }
- }
- } else {
- const eventList: [string | symbol] = this.eventNames();
- eventList.map((value: string | symbol) => {
- this.removeAllListeners(value);
- });
- }
-
- return this;
- }
-
- /**
- * Removes the specified listener from the listener array for the event
- * named eventName.
- */
- public removeListener(
- eventName: string | symbol,
- listener: GenericFunction,
- ): this {
- if (this._events.has(eventName)) {
- const arr:
- | Array<GenericFunction | WrappedFunction>
- | undefined = this._events.get(eventName);
-
- assert(arr);
-
- let listenerIndex = -1;
- for (let i = arr.length - 1; i >= 0; i--) {
- // arr[i]["listener"] is the reference to the listener inside a bound 'once' wrapper
- if (
- arr[i] == listener ||
- (arr[i] && (arr[i] as WrappedFunction)["listener"] == listener)
- ) {
- listenerIndex = i;
- break;
- }
- }
-
- if (listenerIndex >= 0) {
- arr.splice(listenerIndex, 1);
- this.emit("removeListener", eventName, listener);
- if (arr.length === 0) {
- this._events.delete(eventName);
- }
- }
- }
- return this;
- }
-
- /**
- * By default EventEmitters will print a warning if more than 10 listeners
- * are added for a particular event. This is a useful default that helps
- * finding memory leaks. Obviously, not all events should be limited to just
- * 10 listeners. The emitter.setMaxListeners() method allows the limit to be
- * modified for this specific EventEmitter instance. The value can be set to
- * Infinity (or 0) to indicate an unlimited number of listeners.
- */
- public setMaxListeners(n: number): this {
- if (n !== Infinity) {
- if (n === 0) {
- n = Infinity;
- } else {
- validateIntegerRange(n, "maxListeners", 0);
- }
- }
-
- this.maxListeners = n;
- return this;
- }
-
- /**
- * Creates a Promise that is fulfilled when the EventEmitter emits the given
- * event or that is rejected when the EventEmitter emits 'error'. The Promise
- * will resolve with an array of all the arguments emitted to the given event.
- */
- public static once(
- emitter: EventEmitter | EventTarget,
- name: string,
- // deno-lint-ignore no-explicit-any
- ): Promise<any[]> {
- return new Promise((resolve, reject) => {
- if (emitter instanceof EventTarget) {
- // EventTarget does not have `error` event semantics like Node
- // EventEmitters, we do not listen to `error` events here.
- emitter.addEventListener(
- name,
- (...args) => {
- resolve(args);
- },
- { once: true, passive: false, capture: false },
- );
- return;
- } else if (emitter instanceof EventEmitter) {
- // deno-lint-ignore no-explicit-any
- const eventListener = (...args: any[]): void => {
- if (errorListener !== undefined) {
- emitter.removeListener("error", errorListener);
- }
- resolve(args);
- };
- let errorListener: GenericFunction;
-
- // Adding an error listener is not optional because
- // if an error is thrown on an event emitter we cannot
- // guarantee that the actual event we are waiting will
- // be fired. The result could be a silent way to create
- // memory or file descriptor leaks, which is something
- // we should avoid.
- if (name !== "error") {
- // deno-lint-ignore no-explicit-any
- errorListener = (err: any): void => {
- emitter.removeListener(name, eventListener);
- reject(err);
- };
-
- emitter.once("error", errorListener);
- }
-
- emitter.once(name, eventListener);
- return;
- }
- });
- }
-
- /**
- * Returns an AsyncIterator that iterates eventName events. It will throw if
- * the EventEmitter emits 'error'. It removes all listeners when exiting the
- * loop. The value returned by each iteration is an array composed of the
- * emitted event arguments.
- */
- public static on(
- emitter: EventEmitter,
- event: string | symbol,
- ): AsyncIterable {
- // deno-lint-ignore no-explicit-any
- const unconsumedEventValues: any[] = [];
- // deno-lint-ignore no-explicit-any
- const unconsumedPromises: any[] = [];
- let error: Error | null = null;
- let finished = false;
-
- const iterator = {
- // deno-lint-ignore no-explicit-any
- next(): Promise<IteratorResult<any>> {
- // First, we consume all unread events
- // deno-lint-ignore no-explicit-any
- const value: any = unconsumedEventValues.shift();
- if (value) {
- return Promise.resolve(createIterResult(value, false));
- }
-
- // Then we error, if an error happened
- // This happens one time if at all, because after 'error'
- // we stop listening
- if (error) {
- const p: Promise<never> = Promise.reject(error);
- // Only the first element errors
- error = null;
- return p;
- }
-
- // If the iterator is finished, resolve to done
- if (finished) {
- return Promise.resolve(createIterResult(undefined, true));
- }
-
- // Wait until an event happens
- return new Promise(function (resolve, reject) {
- unconsumedPromises.push({ resolve, reject });
- });
- },
-
- // deno-lint-ignore no-explicit-any
- return(): Promise<IteratorResult<any>> {
- emitter.removeListener(event, eventHandler);
- emitter.removeListener("error", errorHandler);
- finished = true;
-
- for (const promise of unconsumedPromises) {
- promise.resolve(createIterResult(undefined, true));
- }
-
- return Promise.resolve(createIterResult(undefined, true));
- },
-
- throw(err: Error): void {
- error = err;
- emitter.removeListener(event, eventHandler);
- emitter.removeListener("error", errorHandler);
- },
-
- // deno-lint-ignore no-explicit-any
- [Symbol.asyncIterator](): any {
- return this;
- },
- };
-
- emitter.on(event, eventHandler);
- emitter.on("error", errorHandler);
-
- return iterator;
-
- // deno-lint-ignore no-explicit-any
- function eventHandler(...args: any[]): void {
- const promise = unconsumedPromises.shift();
- if (promise) {
- promise.resolve(createIterResult(args, false));
- } else {
- unconsumedEventValues.push(args);
- }
- }
-
- // deno-lint-ignore no-explicit-any
- function errorHandler(err: any): void {
- finished = true;
-
- const toError = unconsumedPromises.shift();
- if (toError) {
- toError.reject(err);
- } else {
- // The next time we call next()
- error = err;
- }
-
- iterator.return();
- }
- }
-}
-
-export { EventEmitter };
-export const once = EventEmitter.once;
-export const on = EventEmitter.on;
-export const captureRejectionSymbol = EventEmitter.captureRejectionSymbol;
-export const errorMonitor = EventEmitter.errorMonitor;
diff --git a/std/node/events_test.ts b/std/node/events_test.ts
deleted file mode 100644
index 6942fe847..000000000
--- a/std/node/events_test.ts
+++ /dev/null
@@ -1,687 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import {
- assert,
- assertEquals,
- assertThrows,
- fail,
-} from "../testing/asserts.ts";
-import EventEmitter, { on, once, WrappedFunction } from "./events.ts";
-
-const shouldNeverBeEmitted = () => {
- fail("Should never be called");
-};
-
-Deno.test({
- name:
- 'When adding a new event, "eventListener" event is fired before adding the listener',
- fn() {
- let eventsFired: string[] = [];
- const testEmitter = new EventEmitter();
- testEmitter.on("newListener", (event: string) => {
- if (event !== "newListener") {
- eventsFired.push("newListener");
- }
- });
- testEmitter.on("event", () => {
- eventsFired.push("event");
- });
- assertEquals(eventsFired, ["newListener"]);
- eventsFired = [];
- testEmitter.emit("event");
- assertEquals(eventsFired, ["event"]);
- },
-});
-
-Deno.test({
- name:
- 'When removing a listenert, "removeListener" event is fired after removal',
- fn() {
- const eventsFired: string[] = [];
- const testEmitter = new EventEmitter();
- testEmitter.on("removeListener", () => {
- eventsFired.push("removeListener");
- });
- const eventFunction = function (): void {
- eventsFired.push("event");
- };
- testEmitter.on("event", eventFunction);
-
- assertEquals(eventsFired, []);
- testEmitter.removeListener("event", eventFunction);
- assertEquals(eventsFired, ["removeListener"]);
- },
-});
-
-Deno.test({
- name:
- "Default max listeners is 10, but can be changed by direct assignment only",
- fn() {
- assertEquals(EventEmitter.defaultMaxListeners, 10);
- new EventEmitter().setMaxListeners(20);
- assertEquals(EventEmitter.defaultMaxListeners, 10);
- EventEmitter.defaultMaxListeners = 20;
- assertEquals(EventEmitter.defaultMaxListeners, 20);
- EventEmitter.defaultMaxListeners = 10; //reset back to original value
-
- assertThrows(() => {
- new EventEmitter().setMaxListeners(-1);
- });
-
- const ee = new EventEmitter();
- const noop = (): void => {};
- const origWarn = console.warn;
-
- for (let i = 10; i--;) {
- ee.on("test", noop);
- }
-
- // there are only sync actions until it gets restored,
- // so it's safe to overwrite this
- console.warn = (): void => fail("Infinity listeners should be allowed");
-
- ee.setMaxListeners(Infinity);
- ee.on("test", noop);
-
- // 0 means that unlimited listeners are allowed
- ee.setMaxListeners(0);
- ee.on("test", noop);
-
- console.warn = origWarn;
- },
-});
-
-Deno.test({
- name: "addListener adds a listener, and listener count is correct",
- fn() {
- const testEmitter = new EventEmitter();
- testEmitter.on("event", shouldNeverBeEmitted);
- assertEquals(1, testEmitter.listenerCount("event"));
- testEmitter.on("event", shouldNeverBeEmitted);
- assertEquals(2, testEmitter.listenerCount("event"));
- },
-});
-
-Deno.test({
- name: "Emitted events are called synchronously in the order they were added",
- fn() {
- const testEmitter = new EventEmitter();
- const eventsFired: string[] = [];
- testEmitter.on("event", (oneArg: string) => {
- eventsFired.push("event(" + oneArg + ")");
- });
- testEmitter.on("event", (oneArg: string, twoArg: string) => {
- eventsFired.push("event(" + oneArg + ", " + twoArg + ")");
- });
-
- testEmitter.on("non-event", shouldNeverBeEmitted);
-
- testEmitter.on(
- "event",
- (oneArg: string, twoArg: string, threeArg: string) => {
- eventsFired.push(
- "event(" + oneArg + ", " + twoArg + ", " + threeArg + ")",
- );
- },
- );
- testEmitter.emit("event", 1, 2, 3);
- assertEquals(eventsFired, ["event(1)", "event(1, 2)", "event(1, 2, 3)"]);
- },
-});
-
-Deno.test({
- name: "Registered event names are returned as strings or Sybols",
- fn() {
- const testEmitter = new EventEmitter();
- testEmitter.on("event", shouldNeverBeEmitted);
- testEmitter.on("event", shouldNeverBeEmitted);
- const sym = Symbol("symbol");
- testEmitter.on(sym, shouldNeverBeEmitted);
- assertEquals(testEmitter.eventNames(), ["event", sym]);
- },
-});
-
-Deno.test({
- name: "You can set and get max listeners",
- fn() {
- const testEmitter = new EventEmitter();
- assertEquals(testEmitter.getMaxListeners(), 10);
- testEmitter.setMaxListeners(20);
- assertEquals(testEmitter.getMaxListeners(), 20);
- },
-});
-
-Deno.test({
- name: "You can retrieve registered functions for an event",
- fn() {
- const testEmitter = new EventEmitter();
- testEmitter.on("someOtherEvent", shouldNeverBeEmitted);
- testEmitter.on("event", shouldNeverBeEmitted);
- const testFunction = (): void => {};
- testEmitter.on("event", testFunction);
- assertEquals(testEmitter.listeners("event"), [
- shouldNeverBeEmitted,
- testFunction,
- ]);
- },
-});
-
-Deno.test({
- name: "Off is alias for removeListener",
- fn() {
- const testEmitter = new EventEmitter();
- testEmitter.on("event", shouldNeverBeEmitted);
- assertEquals(testEmitter.listenerCount("event"), 1);
- testEmitter.off("event", shouldNeverBeEmitted);
- assertEquals(testEmitter.listenerCount("event"), 0);
- },
-});
-
-Deno.test({
- name: "Event registration can be chained",
- fn() {
- const testEmitter = new EventEmitter();
- testEmitter
- .on("event", shouldNeverBeEmitted)
- .on("event", shouldNeverBeEmitted);
- assertEquals(testEmitter.listenerCount("event"), 2);
- },
-});
-
-Deno.test({
- name: "Events can be registered to only fire once",
- fn() {
- let eventsFired: string[] = [];
- const testEmitter = new EventEmitter();
- //prove multiple emits on same event first (when registered with 'on')
- testEmitter.on("multiple event", () => {
- eventsFired.push("multiple event");
- });
- testEmitter.emit("multiple event");
- testEmitter.emit("multiple event");
- assertEquals(eventsFired, ["multiple event", "multiple event"]);
-
- //now prove multiple events registered via 'once' only emit once
- eventsFired = [];
- testEmitter.once("single event", () => {
- eventsFired.push("single event");
- });
- testEmitter.emit("single event");
- testEmitter.emit("single event");
- assertEquals(eventsFired, ["single event"]);
- },
-});
-
-Deno.test({
- name:
- "You can inject a listener into the start of the stack, rather than at the end",
- fn() {
- const eventsFired: string[] = [];
- const testEmitter = new EventEmitter();
- testEmitter.on("event", () => {
- eventsFired.push("first");
- });
- testEmitter.on("event", () => {
- eventsFired.push("second");
- });
- testEmitter.prependListener("event", () => {
- eventsFired.push("third");
- });
- testEmitter.emit("event");
- assertEquals(eventsFired, ["third", "first", "second"]);
- },
-});
-
-Deno.test({
- name: 'You can prepend a "once" listener',
- fn() {
- const eventsFired: string[] = [];
- const testEmitter = new EventEmitter();
- testEmitter.on("event", () => {
- eventsFired.push("first");
- });
- testEmitter.on("event", () => {
- eventsFired.push("second");
- });
- testEmitter.prependOnceListener("event", () => {
- eventsFired.push("third");
- });
- testEmitter.emit("event");
- testEmitter.emit("event");
- assertEquals(eventsFired, ["third", "first", "second", "first", "second"]);
- },
-});
-
-Deno.test({
- name: "Remove all listeners, which can also be chained",
- fn() {
- const testEmitter = new EventEmitter();
- testEmitter.on("event", shouldNeverBeEmitted);
- testEmitter.on("event", shouldNeverBeEmitted);
- testEmitter.on("other event", shouldNeverBeEmitted);
- testEmitter.on("other event", shouldNeverBeEmitted);
- testEmitter.once("other event", shouldNeverBeEmitted);
- assertEquals(testEmitter.listenerCount("event"), 2);
- assertEquals(testEmitter.listenerCount("other event"), 3);
-
- testEmitter.removeAllListeners("event").removeAllListeners("other event");
-
- assertEquals(testEmitter.listenerCount("event"), 0);
- assertEquals(testEmitter.listenerCount("other event"), 0);
- },
-});
-
-Deno.test({
- name: "Provide a non-existent event to removeAllListeners will do nothing",
- fn() {
- const testEmitter = new EventEmitter();
- testEmitter.on("event", shouldNeverBeEmitted);
- testEmitter.on("event", shouldNeverBeEmitted);
- testEmitter.on("other event", shouldNeverBeEmitted);
- testEmitter.on("other event", shouldNeverBeEmitted);
- testEmitter.once("other event", shouldNeverBeEmitted);
- assertEquals(testEmitter.listenerCount("event"), 2);
- assertEquals(testEmitter.listenerCount("other event"), 3);
-
- testEmitter.removeAllListeners("non-existent");
-
- assertEquals(testEmitter.listenerCount("event"), 2);
- assertEquals(testEmitter.listenerCount("other event"), 3);
- },
-});
-
-Deno.test({
- name: "Remove individual listeners, which can also be chained",
- fn() {
- const testEmitter = new EventEmitter();
- testEmitter.on("event", shouldNeverBeEmitted);
- testEmitter.on("event", shouldNeverBeEmitted);
- testEmitter.once("other event", shouldNeverBeEmitted);
- assertEquals(testEmitter.listenerCount("event"), 2);
- assertEquals(testEmitter.listenerCount("other event"), 1);
-
- testEmitter.removeListener("other event", shouldNeverBeEmitted);
- assertEquals(testEmitter.listenerCount("event"), 2);
- assertEquals(testEmitter.listenerCount("other event"), 0);
-
- testEmitter
- .removeListener("event", shouldNeverBeEmitted)
- .removeListener("event", shouldNeverBeEmitted);
-
- assertEquals(testEmitter.listenerCount("event"), 0);
- assertEquals(testEmitter.listenerCount("other event"), 0);
- },
-});
-
-Deno.test({
- name: "It is OK to try to remove non-existent listener",
- fn() {
- const testEmitter = new EventEmitter();
-
- const madeUpEvent = (): void => {
- fail("Should never be called");
- };
-
- testEmitter.on("event", shouldNeverBeEmitted);
- assertEquals(testEmitter.listenerCount("event"), 1);
-
- testEmitter.removeListener("event", madeUpEvent);
- testEmitter.removeListener("non-existent event", madeUpEvent);
-
- assertEquals(testEmitter.listenerCount("event"), 1);
- },
-});
-
-Deno.test({
- name: "all listeners complete execution even if removed before execution",
- fn() {
- const testEmitter = new EventEmitter();
- let eventsProcessed: string[] = [];
- const listenerB = (): number => eventsProcessed.push("B");
- const listenerA = (): void => {
- eventsProcessed.push("A");
- testEmitter.removeListener("event", listenerB);
- };
-
- testEmitter.on("event", listenerA);
- testEmitter.on("event", listenerB);
-
- testEmitter.emit("event");
- assertEquals(eventsProcessed, ["A", "B"]);
-
- eventsProcessed = [];
- testEmitter.emit("event");
- assertEquals(eventsProcessed, ["A"]);
- },
-});
-
-Deno.test({
- name: 'Raw listener will return event listener or wrapped "once" function',
- fn() {
- const testEmitter = new EventEmitter();
- const eventsProcessed: string[] = [];
- const listenerA = (): number => eventsProcessed.push("A");
- const listenerB = (): number => eventsProcessed.push("B");
- testEmitter.on("event", listenerA);
- testEmitter.once("once-event", listenerB);
-
- const rawListenersForEvent = testEmitter.rawListeners("event");
- const rawListenersForOnceEvent = testEmitter.rawListeners("once-event");
-
- assertEquals(rawListenersForEvent.length, 1);
- assertEquals(rawListenersForOnceEvent.length, 1);
- assertEquals(rawListenersForEvent[0], listenerA);
- assertEquals(
- (rawListenersForOnceEvent[0] as WrappedFunction).listener,
- listenerB,
- );
- },
-});
-
-Deno.test({
- name:
- "Once wrapped raw listeners may be executed multiple times, until the wrapper is executed",
- fn() {
- const testEmitter = new EventEmitter();
- let eventsProcessed: string[] = [];
- const listenerA = (): number => eventsProcessed.push("A");
- testEmitter.once("once-event", listenerA);
-
- const rawListenersForOnceEvent = testEmitter.rawListeners("once-event");
- const wrappedFn: WrappedFunction =
- rawListenersForOnceEvent[0] as WrappedFunction;
- wrappedFn.listener();
- wrappedFn.listener();
- wrappedFn.listener();
- assertEquals(eventsProcessed, ["A", "A", "A"]);
-
- eventsProcessed = [];
- wrappedFn(); // executing the wrapped listener function will remove it from the event
- assertEquals(eventsProcessed, ["A"]);
- assertEquals(testEmitter.listeners("once-event").length, 0);
- },
-});
-
-Deno.test({
- name: "Can add once event listener to EventEmitter via standalone function",
- async fn() {
- const ee = new EventEmitter();
- setTimeout(() => {
- ee.emit("event", 42, "foo");
- }, 0);
- // deno-lint-ignore no-explicit-any
- const valueArr: any[] = await once(ee, "event");
- assertEquals(valueArr, [42, "foo"]);
- },
-});
-
-Deno.test({
- name: "Can add once event listener to EventTarget via standalone function",
- async fn() {
- const et: EventTarget = new EventTarget();
- setTimeout(() => {
- const event: Event = new Event("event", { composed: true });
- et.dispatchEvent(event);
- }, 0);
- // deno-lint-ignore no-explicit-any
- const eventObj: any[] = await once(et, "event");
- assert(!eventObj[0].isTrusted);
- },
-});
-
-Deno.test({
- name: "Only valid integers are allowed for max listeners",
- fn() {
- const ee = new EventEmitter();
- ee.setMaxListeners(0);
- assertThrows(
- () => {
- ee.setMaxListeners(-1);
- },
- Error,
- "must be >= 0",
- );
- assertThrows(
- () => {
- ee.setMaxListeners(3.45);
- },
- Error,
- "must be 'an integer'",
- );
- },
-});
-
-Deno.test({
- name: "ErrorMonitor can spy on error events without consuming them",
- fn() {
- const ee = new EventEmitter();
- let events: string[] = [];
- //unhandled error scenario should throw
- assertThrows(
- () => {
- ee.emit("error");
- },
- Error,
- "Unhandled error",
- );
-
- ee.on(EventEmitter.errorMonitor, () => {
- events.push("errorMonitor event");
- });
-
- //error is still unhandled but also intercepted by error monitor
- assertThrows(
- () => {
- ee.emit("error");
- },
- Error,
- "Unhandled error",
- );
- assertEquals(events, ["errorMonitor event"]);
-
- //A registered error handler won't throw, but still be monitored
- events = [];
- ee.on("error", () => {
- events.push("error");
- });
- ee.emit("error");
- assertEquals(events, ["errorMonitor event", "error"]);
- },
-});
-
-Deno.test({
- name: "asynchronous iteration of events are handled as expected",
- async fn() {
- const ee = new EventEmitter();
- setTimeout(() => {
- ee.emit("foo", "bar");
- ee.emit("bar", 24);
- ee.emit("foo", 42);
- }, 0);
-
- const iterable = on(ee, "foo");
-
- const expected = [["bar"], [42]];
-
- for await (const event of iterable) {
- const current = expected.shift();
-
- assertEquals(current, event);
-
- if (expected.length === 0) {
- break;
- }
- }
- assertEquals(ee.listenerCount("foo"), 0);
- assertEquals(ee.listenerCount("error"), 0);
- },
-});
-
-Deno.test({
- name: "asynchronous error handling of emitted events works as expected",
- async fn() {
- const ee = new EventEmitter();
- const _err = new Error("kaboom");
- setTimeout(() => {
- ee.emit("error", _err);
- }, 0);
-
- const iterable = on(ee, "foo");
- let thrown = false;
-
- try {
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- for await (const event of iterable) {
- fail("no events should be processed due to the error thrown");
- }
- } catch (err) {
- thrown = true;
- assertEquals(err, _err);
- }
- assertEquals(thrown, true);
- },
-});
-
-Deno.test({
- name: "error thrown during asynchronous processing of events is handled",
- async fn() {
- const ee = new EventEmitter();
- const _err = new Error("kaboom");
- setTimeout(() => {
- ee.emit("foo", 42);
- ee.emit("error", _err);
- }, 0);
-
- const iterable = on(ee, "foo");
- const expected = [[42]];
- let thrown = false;
-
- try {
- for await (const event of iterable) {
- const current = expected.shift();
- assertEquals(current, event);
- }
- } catch (err) {
- thrown = true;
- assertEquals(err, _err);
- }
- assertEquals(thrown, true);
- assertEquals(ee.listenerCount("foo"), 0);
- assertEquals(ee.listenerCount("error"), 0);
- },
-});
-
-Deno.test({
- name:
- "error thrown in processing loop of asynchronous event prevents processing of additional events",
- async fn() {
- const ee = new EventEmitter();
- const _err = new Error("kaboom");
-
- setTimeout(() => {
- ee.emit("foo", 42);
- ee.emit("foo", 999);
- }, 0);
-
- try {
- for await (const event of on(ee, "foo")) {
- assertEquals(event, [42]);
- throw _err;
- }
- } catch (err) {
- assertEquals(err, _err);
- }
-
- assertEquals(ee.listenerCount("foo"), 0);
- assertEquals(ee.listenerCount("error"), 0);
- },
-});
-
-Deno.test({
- name: "asynchronous iterator next() works as expected",
- async fn() {
- const ee = new EventEmitter();
- const iterable = on(ee, "foo");
-
- setTimeout(function () {
- ee.emit("foo", "bar");
- ee.emit("foo", 42);
- iterable.return();
- }, 0);
-
- const results = await Promise.all([
- iterable.next(),
- iterable.next(),
- iterable.next(),
- ]);
-
- assertEquals(results, [
- {
- value: ["bar"],
- done: false,
- },
- {
- value: [42],
- done: false,
- },
- {
- value: undefined,
- done: true,
- },
- ]);
-
- assertEquals(await iterable.next(), {
- value: undefined,
- done: true,
- });
- },
-});
-
-Deno.test({
- name: "async iterable throw handles various scenarios",
- async fn() {
- const ee = new EventEmitter();
- const iterable = on(ee, "foo");
-
- setTimeout(() => {
- ee.emit("foo", "bar");
- ee.emit("foo", 42); // lost in the queue
- iterable.throw(_err);
- }, 0);
-
- const _err = new Error("kaboom");
- let thrown = false;
-
- const expected = [["bar"], [42]];
-
- try {
- for await (const event of iterable) {
- assertEquals(event, expected.shift());
- }
- } catch (err) {
- thrown = true;
- assertEquals(err, _err);
- }
- assertEquals(thrown, true);
- assertEquals(expected.length, 0);
- assertEquals(ee.listenerCount("foo"), 0);
- assertEquals(ee.listenerCount("error"), 0);
- },
-});
-
-// Event emitter's `on` previously referenced addListener internally, so overriding addListener
-// would cause a deadlock
-// This is a regression test
-Deno.test("Elements that extend EventEmitter listener alias don't end up in a deadlock", () => {
- class X extends EventEmitter {
- addListener(eventName: string, listener: () => void) {
- return super.on(eventName, listener);
- }
- }
-
- const x = new X();
- try {
- x.on("x", () => {});
- } catch (e) {
- fail();
- }
-});
diff --git a/std/node/fs.ts b/std/node/fs.ts
deleted file mode 100644
index f62f93168..000000000
--- a/std/node/fs.ts
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { access, accessSync } from "./_fs/_fs_access.ts";
-import { appendFile, appendFileSync } from "./_fs/_fs_appendFile.ts";
-import { chmod, chmodSync } from "./_fs/_fs_chmod.ts";
-import { chown, chownSync } from "./_fs/_fs_chown.ts";
-import { close, closeSync } from "./_fs/_fs_close.ts";
-import * as constants from "./_fs/_fs_constants.ts";
-import { readFile, readFileSync } from "./_fs/_fs_readFile.ts";
-import { readlink, readlinkSync } from "./_fs/_fs_readlink.ts";
-import { exists, existsSync } from "./_fs/_fs_exists.ts";
-import { mkdir, mkdirSync } from "./_fs/_fs_mkdir.ts";
-import { mkdtemp, mkdtempSync } from "./_fs/_fs_mkdtemp.ts";
-import { copyFile, copyFileSync } from "./_fs/_fs_copy.ts";
-import { writeFile, writeFileSync } from "./_fs/_fs_writeFile.ts";
-import { readdir, readdirSync } from "./_fs/_fs_readdir.ts";
-import { realpath, realpathSync } from "./_fs/_fs_realpath.ts";
-import { rename, renameSync } from "./_fs/_fs_rename.ts";
-import { rmdir, rmdirSync } from "./_fs/_fs_rmdir.ts";
-import { unlink, unlinkSync } from "./_fs/_fs_unlink.ts";
-import { watch } from "./_fs/_fs_watch.ts";
-import { open, openSync } from "./_fs/_fs_open.ts";
-import { stat, statSync } from "./_fs/_fs_stat.ts";
-import { lstat, lstatSync } from "./_fs/_fs_lstat.ts";
-
-import * as promises from "./_fs/promises/mod.ts";
-
-export default {
- access,
- accessSync,
- appendFile,
- appendFileSync,
- chmod,
- chmodSync,
- chown,
- chownSync,
- close,
- closeSync,
- constants,
- copyFile,
- copyFileSync,
- exists,
- existsSync,
- lstat,
- lstatSync,
- mkdir,
- mkdirSync,
- mkdtemp,
- mkdtempSync,
- open,
- openSync,
- promises,
- readdir,
- readdirSync,
- readFile,
- readFileSync,
- readlink,
- readlinkSync,
- realpath,
- realpathSync,
- rename,
- renameSync,
- rmdir,
- rmdirSync,
- stat,
- statSync,
- unlink,
- unlinkSync,
- watch,
- writeFile,
- writeFileSync,
-};
-
-export {
- access,
- accessSync,
- appendFile,
- appendFileSync,
- chmod,
- chmodSync,
- chown,
- chownSync,
- close,
- closeSync,
- constants,
- copyFile,
- copyFileSync,
- exists,
- existsSync,
- lstat,
- lstatSync,
- mkdir,
- mkdirSync,
- mkdtemp,
- mkdtempSync,
- open,
- openSync,
- promises,
- readdir,
- readdirSync,
- readFile,
- readFileSync,
- readlink,
- readlinkSync,
- realpath,
- realpathSync,
- rename,
- renameSync,
- rmdir,
- rmdirSync,
- stat,
- statSync,
- unlink,
- unlinkSync,
- watch,
- writeFile,
- writeFileSync,
-};
diff --git a/std/node/global.d.ts b/std/node/global.d.ts
deleted file mode 100644
index 94baf03b7..000000000
--- a/std/node/global.d.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import processModule from "./process.ts";
-import { Buffer as bufferModule } from "./buffer.ts";
-import timers from "./timers.ts";
-
-// d.ts files allow us to declare Buffer as a value and as a type
-// type something = Buffer | something_else; is quite common
-
-type GlobalType = {
- process: typeof processModule;
- Buffer: typeof bufferModule;
- setImmediate: typeof timers.setImmediate;
- clearImmediate: typeof timers.clearImmediate;
-};
-
-declare global {
- interface Window {
- global: GlobalType;
- }
-
- interface globalThis {
- global: GlobalType;
- }
-
- var global: GlobalType;
- var process: typeof processModule;
- var Buffer: typeof bufferModule;
- type Buffer = bufferModule;
- var setImmediate: typeof timers.setImmediate;
- var clearImmediate: typeof timers.clearImmediate;
-}
-
-export {};
diff --git a/std/node/global.ts b/std/node/global.ts
deleted file mode 100644
index 550f6ddf9..000000000
--- a/std/node/global.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-/// <reference path="./global.d.ts" />
-import processModule from "./process.ts";
-import { Buffer as bufferModule } from "./buffer.ts";
-import timers from "./timers.ts";
-
-Object.defineProperty(globalThis, "global", {
- value: globalThis,
- writable: false,
- enumerable: false,
- configurable: true,
-});
-
-Object.defineProperty(globalThis, "process", {
- value: processModule,
- enumerable: false,
- writable: true,
- configurable: true,
-});
-
-Object.defineProperty(globalThis, "Buffer", {
- value: bufferModule,
- enumerable: false,
- writable: true,
- configurable: true,
-});
-
-Object.defineProperty(globalThis, "setImmediate", {
- value: timers.setImmediate,
- enumerable: true,
- writable: true,
- configurable: true,
-});
-
-Object.defineProperty(globalThis, "clearImmediate", {
- value: timers.clearImmediate,
- enumerable: true,
- writable: true,
- configurable: true,
-});
-
-export {};
diff --git a/std/node/global_test.ts b/std/node/global_test.ts
deleted file mode 100644
index 2ff768f88..000000000
--- a/std/node/global_test.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import "./global.ts";
-import { assert, assertStrictEquals } from "../testing/asserts.ts";
-import { Buffer as BufferModule } from "./buffer.ts";
-import processModule from "./process.ts";
-import timers from "./timers.ts";
-
-// Definitions for this are quite delicate
-// This ensures modifications to the global namespace don't break on TypeScript
-
-// TODO(bartlomieju):
-// Deno lint marks globals defined by this module as undefined
-// probably gonna change in the future
-
-Deno.test("global is correctly defined", () => {
- // deno-lint-ignore no-undef
- assertStrictEquals(global, globalThis);
- // deno-lint-ignore no-undef
- assertStrictEquals(global.Buffer, BufferModule);
- // deno-lint-ignore no-undef
- assertStrictEquals(global.process, process);
-});
-
-Deno.test("Buffer is correctly defined", () => {
- //Check that Buffer is defined as a type as well
- type x = Buffer;
- // deno-lint-ignore no-undef
- assertStrictEquals(Buffer, BufferModule);
- // deno-lint-ignore no-undef
- assert(Buffer.from);
- // deno-lint-ignore no-undef
- assertStrictEquals(global.Buffer, BufferModule);
- // deno-lint-ignore no-undef
- assert(global.Buffer.from);
- assertStrictEquals(globalThis.Buffer, BufferModule);
- assert(globalThis.Buffer.from);
- assertStrictEquals(window.Buffer, BufferModule);
- assert(window.Buffer.from);
-});
-
-Deno.test("process is correctly defined", () => {
- // deno-lint-ignore no-undef
- assertStrictEquals(process, processModule);
- // deno-lint-ignore no-undef
- assert(process.arch);
- // deno-lint-ignore no-undef
- assertStrictEquals(global.process, processModule);
- // deno-lint-ignore no-undef
- assert(global.process.arch);
- assertStrictEquals(globalThis.process, processModule);
- assert(globalThis.process.arch);
- assertStrictEquals(window.process, processModule);
- assert(window.process.arch);
-});
-
-Deno.test("setImmediate is correctly defined", () => {
- // deno-lint-ignore no-undef
- assertStrictEquals(setImmediate, timers.setImmediate);
- // deno-lint-ignore no-undef
- assertStrictEquals(global.setImmediate, timers.setImmediate);
- assertStrictEquals(globalThis.setImmediate, timers.setImmediate);
- assertStrictEquals(window.setImmediate, timers.setImmediate);
-});
-
-Deno.test("clearImmediate is correctly defined", () => {
- // deno-lint-ignore no-undef
- assertStrictEquals(clearImmediate, timers.clearImmediate);
- // deno-lint-ignore no-undef
- assertStrictEquals(global.clearImmediate, timers.clearImmediate);
- assertStrictEquals(globalThis.clearImmediate, timers.clearImmediate);
- assertStrictEquals(window.clearImmediate, timers.clearImmediate);
-});
diff --git a/std/node/module.ts b/std/node/module.ts
deleted file mode 100644
index 0d6ef9133..000000000
--- a/std/node/module.ts
+++ /dev/null
@@ -1,1163 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-import "./global.ts";
-
-import * as nodeBuffer from "./buffer.ts";
-import * as nodeEvents from "./events.ts";
-import * as nodeFS from "./fs.ts";
-import * as nodeOs from "./os.ts";
-import * as nodePath from "./path.ts";
-import * as nodeQueryString from "./querystring.ts";
-import * as nodeStream from "./stream.ts";
-import * as nodeStringDecoder from "./string_decoder.ts";
-import * as nodeTimers from "./timers.ts";
-import * as nodeUtil from "./util.ts";
-
-import * as path from "../path/mod.ts";
-import { assert } from "../_util/assert.ts";
-import { fileURLToPath, pathToFileURL } from "./url.ts";
-import { isWindows } from "../_util/os.ts";
-
-const CHAR_FORWARD_SLASH = "/".charCodeAt(0);
-const CHAR_BACKWARD_SLASH = "\\".charCodeAt(0);
-const CHAR_COLON = ":".charCodeAt(0);
-
-const relativeResolveCache = Object.create(null);
-
-let requireDepth = 0;
-let statCache: Map<string, StatResult> | null = null;
-
-type StatResult = -1 | 0 | 1;
-// Returns 0 if the path refers to
-// a file, 1 when it's a directory or < 0 on error.
-function stat(filename: string): StatResult {
- filename = path.toNamespacedPath(filename);
- if (statCache !== null) {
- const result = statCache.get(filename);
- if (result !== undefined) return result;
- }
- try {
- const info = Deno.statSync(filename);
- const result = info.isFile ? 0 : 1;
- if (statCache !== null) statCache.set(filename, result);
- return result;
- } catch (e) {
- if (e instanceof Deno.errors.PermissionDenied) {
- throw new Error("CJS loader requires --allow-read.");
- }
- return -1;
- }
-}
-
-function updateChildren(
- parent: Module | null,
- child: Module,
- scan: boolean,
-): void {
- const children = parent && parent.children;
- if (children && !(scan && children.includes(child))) {
- children.push(child);
- }
-}
-
-class Module {
- id: string;
- // deno-lint-ignore no-explicit-any
- exports: any;
- parent: Module | null;
- filename: string | null;
- loaded: boolean;
- children: Module[];
- paths: string[];
- path: string;
- constructor(id = "", parent?: Module | null) {
- this.id = id;
- this.exports = {};
- this.parent = parent || null;
- updateChildren(parent || null, this, false);
- this.filename = null;
- this.loaded = false;
- this.children = [];
- this.paths = [];
- this.path = path.dirname(id);
- }
- static builtinModules: string[] = [];
- static _extensions: {
- // deno-lint-ignore no-explicit-any
- [key: string]: (module: Module, filename: string) => any;
- } = Object.create(null);
- static _cache: { [key: string]: Module } = Object.create(null);
- static _pathCache = Object.create(null);
- static globalPaths: string[] = [];
- // Proxy related code removed.
- static wrapper = [
- "(function (exports, require, module, __filename, __dirname) { ",
- "\n});",
- ];
-
- // Loads a module at the given file path. Returns that module's
- // `exports` property.
- // deno-lint-ignore no-explicit-any
- require(id: string): any {
- if (id === "") {
- throw new Error(`id '${id}' must be a non-empty string`);
- }
- requireDepth++;
- try {
- return Module._load(id, this, /* isMain */ false);
- } finally {
- requireDepth--;
- }
- }
-
- // Given a file name, pass it to the proper extension handler.
- load(filename: string): void {
- assert(!this.loaded);
- this.filename = filename;
- this.paths = Module._nodeModulePaths(path.dirname(filename));
-
- const extension = findLongestRegisteredExtension(filename);
- // Removed ESM code
- Module._extensions[extension](this, filename);
- this.loaded = true;
- // Removed ESM code
- }
-
- // Run the file contents in the correct scope or sandbox. Expose
- // the correct helper variables (require, module, exports) to
- // the file.
- // Returns exception, if any.
- // deno-lint-ignore no-explicit-any
- _compile(content: string, filename: string): any {
- // manifest code removed
- const compiledWrapper = wrapSafe(filename, content);
- // inspector code remove
- const dirname = path.dirname(filename);
- const require = makeRequireFunction(this);
- const exports = this.exports;
- const thisValue = exports;
- if (requireDepth === 0) {
- statCache = new Map();
- }
- const result = compiledWrapper.call(
- thisValue,
- exports,
- require,
- this,
- filename,
- dirname,
- );
- if (requireDepth === 0) {
- statCache = null;
- }
- return result;
- }
-
- /*
- * Check for node modules paths.
- * */
- static _resolveLookupPaths(
- request: string,
- parent: Module | null,
- ): string[] | null {
- if (
- request.charAt(0) !== "." ||
- (request.length > 1 &&
- request.charAt(1) !== "." &&
- request.charAt(1) !== "/" &&
- (!isWindows || request.charAt(1) !== "\\"))
- ) {
- let paths = modulePaths;
- if (parent !== null && parent.paths && parent.paths.length) {
- paths = parent.paths.concat(paths);
- }
-
- return paths.length > 0 ? paths : null;
- }
-
- // With --eval, parent.id is not set and parent.filename is null.
- if (!parent || !parent.id || !parent.filename) {
- // Make require('./path/to/foo') work - normally the path is taken
- // from realpath(__filename) but with eval there is no filename
- return ["."].concat(Module._nodeModulePaths("."), modulePaths);
- }
- // Returns the parent path of the file
- return [path.dirname(parent.filename)];
- }
-
- static _resolveFilename(
- request: string,
- parent: Module,
- isMain: boolean,
- options?: { paths: string[] },
- ): string {
- // Polyfills.
- if (nativeModuleCanBeRequiredByUsers(request)) {
- return request;
- }
-
- let paths: string[];
-
- if (typeof options === "object" && options !== null) {
- if (Array.isArray(options.paths)) {
- const isRelative = request.startsWith("./") ||
- request.startsWith("../") ||
- (isWindows && request.startsWith(".\\")) ||
- request.startsWith("..\\");
-
- if (isRelative) {
- paths = options.paths;
- } else {
- const fakeParent = new Module("", null);
-
- paths = [];
-
- for (let i = 0; i < options.paths.length; i++) {
- const path = options.paths[i];
- fakeParent.paths = Module._nodeModulePaths(path);
- const lookupPaths = Module._resolveLookupPaths(request, fakeParent);
-
- for (let j = 0; j < lookupPaths!.length; j++) {
- if (!paths.includes(lookupPaths![j])) {
- paths.push(lookupPaths![j]);
- }
- }
- }
- }
- } else if (options.paths === undefined) {
- paths = Module._resolveLookupPaths(request, parent)!;
- } else {
- throw new Error("options.paths is invalid");
- }
- } else {
- paths = Module._resolveLookupPaths(request, parent)!;
- }
-
- // Look up the filename first, since that's the cache key.
- const filename = Module._findPath(request, paths, isMain);
- if (!filename) {
- const requireStack = [];
- for (let cursor: Module | null = parent; cursor; cursor = cursor.parent) {
- requireStack.push(cursor.filename || cursor.id);
- }
- let message = `Cannot find module '${request}'`;
- if (requireStack.length > 0) {
- message = message + "\nRequire stack:\n- " + requireStack.join("\n- ");
- }
- const err = new Error(message) as Error & {
- code: string;
- requireStack: string[];
- };
- err.code = "MODULE_NOT_FOUND";
- err.requireStack = requireStack;
- throw err;
- }
- return filename as string;
- }
-
- static _findPath(
- request: string,
- paths: string[],
- isMain: boolean,
- ): string | boolean {
- const absoluteRequest = path.isAbsolute(request);
- if (absoluteRequest) {
- paths = [""];
- } else if (!paths || paths.length === 0) {
- return false;
- }
-
- const cacheKey = request + "\x00" +
- (paths.length === 1 ? paths[0] : paths.join("\x00"));
- const entry = Module._pathCache[cacheKey];
- if (entry) {
- return entry;
- }
-
- let exts;
- let trailingSlash = request.length > 0 &&
- request.charCodeAt(request.length - 1) === CHAR_FORWARD_SLASH;
- if (!trailingSlash) {
- trailingSlash = /(?:^|\/)\.?\.$/.test(request);
- }
-
- // For each path
- for (let i = 0; i < paths.length; i++) {
- // Don't search further if path doesn't exist
- const curPath = paths[i];
-
- if (curPath && stat(curPath) < 1) continue;
- const basePath = resolveExports(curPath, request, absoluteRequest);
- let filename;
-
- const rc = stat(basePath);
- if (!trailingSlash) {
- if (rc === 0) {
- // File.
- // preserveSymlinks removed
- filename = toRealPath(basePath);
- }
-
- if (!filename) {
- // Try it with each of the extensions
- if (exts === undefined) exts = Object.keys(Module._extensions);
- filename = tryExtensions(basePath, exts, isMain);
- }
- }
-
- if (!filename && rc === 1) {
- // Directory.
- // try it with each of the extensions at "index"
- if (exts === undefined) exts = Object.keys(Module._extensions);
- filename = tryPackage(basePath, exts, isMain, request);
- }
-
- if (filename) {
- Module._pathCache[cacheKey] = filename;
- return filename;
- }
- }
- // trySelf removed.
-
- return false;
- }
-
- // Check the cache for the requested file.
- // 1. If a module already exists in the cache: return its exports object.
- // 2. If the module is native: call
- // `NativeModule.prototype.compileForPublicLoader()` and return the exports.
- // 3. Otherwise, create a new module for the file and save it to the cache.
- // Then have it load the file contents before returning its exports
- // object.
- // deno-lint-ignore no-explicit-any
- static _load(request: string, parent: Module, isMain: boolean): any {
- let relResolveCacheIdentifier: string | undefined;
- if (parent) {
- // Fast path for (lazy loaded) modules in the same directory. The indirect
- // caching is required to allow cache invalidation without changing the old
- // cache key names.
- relResolveCacheIdentifier = `${parent.path}\x00${request}`;
- const filename = relativeResolveCache[relResolveCacheIdentifier];
- if (filename !== undefined) {
- const cachedModule = Module._cache[filename];
- if (cachedModule !== undefined) {
- updateChildren(parent, cachedModule, true);
- if (!cachedModule.loaded) {
- return getExportsForCircularRequire(cachedModule);
- }
- return cachedModule.exports;
- }
- delete relativeResolveCache[relResolveCacheIdentifier];
- }
- }
-
- const filename = Module._resolveFilename(request, parent, isMain);
-
- const cachedModule = Module._cache[filename];
- if (cachedModule !== undefined) {
- updateChildren(parent, cachedModule, true);
- if (!cachedModule.loaded) {
- return getExportsForCircularRequire(cachedModule);
- }
- return cachedModule.exports;
- }
-
- // Native module polyfills
- const mod = loadNativeModule(filename, request);
- if (mod) return mod.exports;
-
- // Don't call updateChildren(), Module constructor already does.
- const module = new Module(filename, parent);
-
- if (isMain) {
- // TODO(bartlomieju): set process info
- // process.mainModule = module;
- module.id = ".";
- }
-
- Module._cache[filename] = module;
- if (parent !== undefined) {
- assert(relResolveCacheIdentifier);
- relativeResolveCache[relResolveCacheIdentifier] = filename;
- }
-
- let threw = true;
- try {
- // Source map code removed
- module.load(filename);
- threw = false;
- } finally {
- if (threw) {
- delete Module._cache[filename];
- if (parent !== undefined) {
- assert(relResolveCacheIdentifier);
- delete relativeResolveCache[relResolveCacheIdentifier];
- }
- } else if (
- module.exports &&
- Object.getPrototypeOf(module.exports) ===
- CircularRequirePrototypeWarningProxy
- ) {
- Object.setPrototypeOf(module.exports, PublicObjectPrototype);
- }
- }
-
- return module.exports;
- }
-
- static wrap(script: string): string {
- return `${Module.wrapper[0]}${script}${Module.wrapper[1]}`;
- }
-
- static _nodeModulePaths(from: string): string[] {
- if (isWindows) {
- // Guarantee that 'from' is absolute.
- from = path.resolve(from);
-
- // note: this approach *only* works when the path is guaranteed
- // to be absolute. Doing a fully-edge-case-correct path.split
- // that works on both Windows and Posix is non-trivial.
-
- // return root node_modules when path is 'D:\\'.
- // path.resolve will make sure from.length >=3 in Windows.
- if (
- from.charCodeAt(from.length - 1) === CHAR_BACKWARD_SLASH &&
- from.charCodeAt(from.length - 2) === CHAR_COLON
- ) {
- return [from + "node_modules"];
- }
-
- const paths = [];
- for (let i = from.length - 1, p = 0, last = from.length; i >= 0; --i) {
- const code = from.charCodeAt(i);
- // The path segment separator check ('\' and '/') was used to get
- // node_modules path for every path segment.
- // Use colon as an extra condition since we can get node_modules
- // path for drive root like 'C:\node_modules' and don't need to
- // parse drive name.
- if (
- code === CHAR_BACKWARD_SLASH ||
- code === CHAR_FORWARD_SLASH ||
- code === CHAR_COLON
- ) {
- if (p !== nmLen) paths.push(from.slice(0, last) + "\\node_modules");
- last = i;
- p = 0;
- } else if (p !== -1) {
- if (nmChars[p] === code) {
- ++p;
- } else {
- p = -1;
- }
- }
- }
-
- return paths;
- } else {
- // posix
- // Guarantee that 'from' is absolute.
- from = path.resolve(from);
- // Return early not only to avoid unnecessary work, but to *avoid* returning
- // an array of two items for a root: [ '//node_modules', '/node_modules' ]
- if (from === "/") return ["/node_modules"];
-
- // note: this approach *only* works when the path is guaranteed
- // to be absolute. Doing a fully-edge-case-correct path.split
- // that works on both Windows and Posix is non-trivial.
- const paths = [];
- for (let i = from.length - 1, p = 0, last = from.length; i >= 0; --i) {
- const code = from.charCodeAt(i);
- if (code === CHAR_FORWARD_SLASH) {
- if (p !== nmLen) paths.push(from.slice(0, last) + "/node_modules");
- last = i;
- p = 0;
- } else if (p !== -1) {
- if (nmChars[p] === code) {
- ++p;
- } else {
- p = -1;
- }
- }
- }
-
- // Append /node_modules to handle root paths.
- paths.push("/node_modules");
-
- return paths;
- }
- }
-
- /**
- * Create a `require` function that can be used to import CJS modules.
- * Follows CommonJS resolution similar to that of Node.js,
- * with `node_modules` lookup and `index.js` lookup support.
- * Also injects available Node.js builtin module polyfills.
- *
- * const require = createRequire(import.meta.url);
- * const fs = require("fs");
- * const leftPad = require("left-pad");
- * const cjsModule = require("./cjs_mod");
- *
- * @param filename path or URL to current module
- * @return Require function to import CJS modules
- */
- static createRequire(filename: string | URL): RequireFunction {
- let filepath: string;
- if (
- filename instanceof URL ||
- (typeof filename === "string" && !path.isAbsolute(filename))
- ) {
- filepath = fileURLToPath(filename);
- } else if (typeof filename !== "string") {
- throw new Error("filename should be a string");
- } else {
- filepath = filename;
- }
- return createRequireFromPath(filepath);
- }
-
- static _initPaths(): void {
- const homeDir = Deno.env.get("HOME");
- const nodePath = Deno.env.get("NODE_PATH");
-
- // Removed $PREFIX/bin/node case
-
- let paths = [];
-
- if (homeDir) {
- paths.unshift(path.resolve(homeDir, ".node_libraries"));
- paths.unshift(path.resolve(homeDir, ".node_modules"));
- }
-
- if (nodePath) {
- paths = nodePath
- .split(path.delimiter)
- .filter(function pathsFilterCB(path) {
- return !!path;
- })
- .concat(paths);
- }
-
- modulePaths = paths;
-
- // Clone as a shallow copy, for introspection.
- Module.globalPaths = modulePaths.slice(0);
- }
-
- static _preloadModules(requests: string[]): void {
- if (!Array.isArray(requests)) {
- return;
- }
-
- // Preloaded modules have a dummy parent module which is deemed to exist
- // in the current working directory. This seeds the search path for
- // preloaded modules.
- const parent = new Module("internal/preload", null);
- try {
- parent.paths = Module._nodeModulePaths(Deno.cwd());
- } catch (e) {
- if (e.code !== "ENOENT") {
- throw e;
- }
- }
- for (let n = 0; n < requests.length; n++) {
- parent.require(requests[n]);
- }
- }
-}
-
-// Polyfills.
-const nativeModulePolyfill = new Map<string, Module>();
-// deno-lint-ignore no-explicit-any
-function createNativeModule(id: string, exports: any): Module {
- const mod = new Module(id);
- mod.exports = exports;
- mod.loaded = true;
- return mod;
-}
-
-nativeModulePolyfill.set("buffer", createNativeModule("buffer", nodeBuffer));
-nativeModulePolyfill.set("events", createNativeModule("events", nodeEvents));
-nativeModulePolyfill.set("fs", createNativeModule("fs", nodeFS));
-nativeModulePolyfill.set("os", createNativeModule("os", nodeOs));
-nativeModulePolyfill.set("path", createNativeModule("path", nodePath));
-nativeModulePolyfill.set(
- "querystring",
- createNativeModule("querystring", nodeQueryString),
-);
-nativeModulePolyfill.set(
- "stream",
- createNativeModule("string_decoder", nodeStream),
-);
-nativeModulePolyfill.set(
- "string_decoder",
- createNativeModule("string_decoder", nodeStringDecoder),
-);
-nativeModulePolyfill.set("timers", createNativeModule("timers", nodeTimers));
-nativeModulePolyfill.set("util", createNativeModule("util", nodeUtil));
-
-function loadNativeModule(
- _filename: string,
- request: string,
-): Module | undefined {
- return nativeModulePolyfill.get(request);
-}
-function nativeModuleCanBeRequiredByUsers(request: string): boolean {
- return nativeModulePolyfill.has(request);
-}
-// Populate with polyfill names
-for (const id of nativeModulePolyfill.keys()) {
- Module.builtinModules.push(id);
-}
-
-let modulePaths: string[] = [];
-
-// Given a module name, and a list of paths to test, returns the first
-// matching file in the following precedence.
-//
-// require("a.<ext>")
-// -> a.<ext>
-//
-// require("a")
-// -> a
-// -> a.<ext>
-// -> a/index.<ext>
-
-const packageJsonCache = new Map<string, PackageInfo | null>();
-
-interface PackageInfo {
- name?: string;
- main?: string;
- // deno-lint-ignore no-explicit-any
- exports?: any;
- // deno-lint-ignore no-explicit-any
- type?: any;
-}
-
-function readPackage(requestPath: string): PackageInfo | null {
- const jsonPath = path.resolve(requestPath, "package.json");
-
- const existing = packageJsonCache.get(jsonPath);
- if (existing !== undefined) {
- return existing;
- }
-
- let json: string | undefined;
- try {
- json = new TextDecoder().decode(
- Deno.readFileSync(path.toNamespacedPath(jsonPath)),
- );
- } catch {
- // pass
- }
-
- if (json === undefined) {
- packageJsonCache.set(jsonPath, null);
- return null;
- }
-
- try {
- const parsed = JSON.parse(json);
- const filtered = {
- name: parsed.name,
- main: parsed.main,
- exports: parsed.exports,
- type: parsed.type,
- };
- packageJsonCache.set(jsonPath, filtered);
- return filtered;
- } catch (e) {
- e.path = jsonPath;
- e.message = "Error parsing " + jsonPath + ": " + e.message;
- throw e;
- }
-}
-
-function readPackageScope(
- checkPath: string,
-): { path: string; data: PackageInfo } | false {
- const rootSeparatorIndex = checkPath.indexOf(path.sep);
- let separatorIndex;
- while (
- (separatorIndex = checkPath.lastIndexOf(path.sep)) > rootSeparatorIndex
- ) {
- checkPath = checkPath.slice(0, separatorIndex);
- if (checkPath.endsWith(path.sep + "node_modules")) return false;
- const pjson = readPackage(checkPath);
- if (pjson) {
- return {
- path: checkPath,
- data: pjson,
- };
- }
- }
- return false;
-}
-
-function readPackageMain(requestPath: string): string | undefined {
- const pkg = readPackage(requestPath);
- return pkg ? pkg.main : undefined;
-}
-
-// deno-lint-ignore no-explicit-any
-function readPackageExports(requestPath: string): any | undefined {
- const pkg = readPackage(requestPath);
- return pkg ? pkg.exports : undefined;
-}
-
-function tryPackage(
- requestPath: string,
- exts: string[],
- isMain: boolean,
- _originalPath: string,
-): string | false {
- const pkg = readPackageMain(requestPath);
-
- if (!pkg) {
- return tryExtensions(path.resolve(requestPath, "index"), exts, isMain);
- }
-
- const filename = path.resolve(requestPath, pkg);
- let actual = tryFile(filename, isMain) ||
- tryExtensions(filename, exts, isMain) ||
- tryExtensions(path.resolve(filename, "index"), exts, isMain);
- if (actual === false) {
- actual = tryExtensions(path.resolve(requestPath, "index"), exts, isMain);
- if (!actual) {
- const err = new Error(
- `Cannot find module '${filename}'. ` +
- 'Please verify that the package.json has a valid "main" entry',
- ) as Error & { code: string };
- err.code = "MODULE_NOT_FOUND";
- throw err;
- }
- }
- return actual;
-}
-
-// Check if the file exists and is not a directory
-// if using --preserve-symlinks and isMain is false,
-// keep symlinks intact, otherwise resolve to the
-// absolute realpath.
-function tryFile(requestPath: string, _isMain: boolean): string | false {
- const rc = stat(requestPath);
- return rc === 0 && toRealPath(requestPath);
-}
-
-function toRealPath(requestPath: string): string {
- return Deno.realPathSync(requestPath);
-}
-
-// Given a path, check if the file exists with any of the set extensions
-function tryExtensions(
- p: string,
- exts: string[],
- isMain: boolean,
-): string | false {
- for (let i = 0; i < exts.length; i++) {
- const filename = tryFile(p + exts[i], isMain);
-
- if (filename) {
- return filename;
- }
- }
- return false;
-}
-
-// Find the longest (possibly multi-dot) extension registered in
-// Module._extensions
-function findLongestRegisteredExtension(filename: string): string {
- const name = path.basename(filename);
- let currentExtension;
- let index;
- let startIndex = 0;
- while ((index = name.indexOf(".", startIndex)) !== -1) {
- startIndex = index + 1;
- if (index === 0) continue; // Skip dotfiles like .gitignore
- currentExtension = name.slice(index);
- if (Module._extensions[currentExtension]) return currentExtension;
- }
- return ".js";
-}
-
-// --experimental-resolve-self trySelf() support removed.
-
-// deno-lint-ignore no-explicit-any
-function isConditionalDotExportSugar(exports: any, _basePath: string): boolean {
- if (typeof exports === "string") return true;
- if (Array.isArray(exports)) return true;
- if (typeof exports !== "object") return false;
- let isConditional = false;
- let firstCheck = true;
- for (const key of Object.keys(exports)) {
- const curIsConditional = key[0] !== ".";
- if (firstCheck) {
- firstCheck = false;
- isConditional = curIsConditional;
- } else if (isConditional !== curIsConditional) {
- throw new Error(
- '"exports" cannot ' +
- "contain some keys starting with '.' and some not. The exports " +
- "object must either be an object of package subpath keys or an " +
- "object of main entry condition name keys only.",
- );
- }
- }
- return isConditional;
-}
-
-function applyExports(basePath: string, expansion: string): string {
- const mappingKey = `.${expansion}`;
-
- let pkgExports = readPackageExports(basePath);
- if (pkgExports === undefined || pkgExports === null) {
- return path.resolve(basePath, mappingKey);
- }
-
- if (isConditionalDotExportSugar(pkgExports, basePath)) {
- pkgExports = { ".": pkgExports };
- }
-
- if (typeof pkgExports === "object") {
- if (Object.prototype.hasOwnProperty.call(pkgExports, mappingKey)) {
- const mapping = pkgExports[mappingKey];
- return resolveExportsTarget(
- pathToFileURL(basePath + "/"),
- mapping,
- "",
- basePath,
- mappingKey,
- );
- }
-
- // Fallback to CJS main lookup when no main export is defined
- if (mappingKey === ".") return basePath;
-
- let dirMatch = "";
- for (const candidateKey of Object.keys(pkgExports)) {
- if (candidateKey[candidateKey.length - 1] !== "/") continue;
- if (
- candidateKey.length > dirMatch.length &&
- mappingKey.startsWith(candidateKey)
- ) {
- dirMatch = candidateKey;
- }
- }
-
- if (dirMatch !== "") {
- const mapping = pkgExports[dirMatch];
- const subpath = mappingKey.slice(dirMatch.length);
- return resolveExportsTarget(
- pathToFileURL(basePath + "/"),
- mapping,
- subpath,
- basePath,
- mappingKey,
- );
- }
- }
- // Fallback to CJS main lookup when no main export is defined
- if (mappingKey === ".") return basePath;
-
- const e = new Error(
- `Package exports for '${basePath}' do not define ` +
- `a '${mappingKey}' subpath`,
- ) as Error & { code?: string };
- e.code = "MODULE_NOT_FOUND";
- throw e;
-}
-
-// This only applies to requests of a specific form:
-// 1. name/.*
-// 2. @scope/name/.*
-const EXPORTS_PATTERN = /^((?:@[^/\\%]+\/)?[^./\\%][^/\\%]*)(\/.*)?$/;
-function resolveExports(
- nmPath: string,
- request: string,
- absoluteRequest: boolean,
-): string {
- // The implementation's behavior is meant to mirror resolution in ESM.
- if (!absoluteRequest) {
- const [, name, expansion = ""] = request.match(EXPORTS_PATTERN) || [];
- if (!name) {
- return path.resolve(nmPath, request);
- }
-
- const basePath = path.resolve(nmPath, name);
- return applyExports(basePath, expansion);
- }
-
- return path.resolve(nmPath, request);
-}
-
-function resolveExportsTarget(
- pkgPath: URL,
- // deno-lint-ignore no-explicit-any
- target: any,
- subpath: string,
- basePath: string,
- mappingKey: string,
-): string {
- if (typeof target === "string") {
- if (
- target.startsWith("./") &&
- (subpath.length === 0 || target.endsWith("/"))
- ) {
- const resolvedTarget = new URL(target, pkgPath);
- const pkgPathPath = pkgPath.pathname;
- const resolvedTargetPath = resolvedTarget.pathname;
- if (
- resolvedTargetPath.startsWith(pkgPathPath) &&
- resolvedTargetPath.indexOf("/node_modules/", pkgPathPath.length - 1) ===
- -1
- ) {
- const resolved = new URL(subpath, resolvedTarget);
- const resolvedPath = resolved.pathname;
- if (
- resolvedPath.startsWith(resolvedTargetPath) &&
- resolvedPath.indexOf("/node_modules/", pkgPathPath.length - 1) === -1
- ) {
- return fileURLToPath(resolved);
- }
- }
- }
- } else if (Array.isArray(target)) {
- for (const targetValue of target) {
- if (Array.isArray(targetValue)) continue;
- try {
- return resolveExportsTarget(
- pkgPath,
- targetValue,
- subpath,
- basePath,
- mappingKey,
- );
- } catch (e) {
- if (e.code !== "MODULE_NOT_FOUND") throw e;
- }
- }
- } else if (typeof target === "object" && target !== null) {
- // removed experimentalConditionalExports
- if (Object.prototype.hasOwnProperty.call(target, "default")) {
- try {
- return resolveExportsTarget(
- pkgPath,
- target.default,
- subpath,
- basePath,
- mappingKey,
- );
- } catch (e) {
- if (e.code !== "MODULE_NOT_FOUND") throw e;
- }
- }
- }
- let e: Error & { code?: string };
- if (mappingKey !== ".") {
- e = new Error(
- `Package exports for '${basePath}' do not define a ` +
- `valid '${mappingKey}' target${subpath ? " for " + subpath : ""}`,
- );
- } else {
- e = new Error(`No valid exports main found for '${basePath}'`);
- }
- e.code = "MODULE_NOT_FOUND";
- throw e;
-}
-
-// 'node_modules' character codes reversed
-const nmChars = [115, 101, 108, 117, 100, 111, 109, 95, 101, 100, 111, 110];
-const nmLen = nmChars.length;
-
-// deno-lint-ignore no-explicit-any
-function emitCircularRequireWarning(prop: any): void {
- console.error(
- `Accessing non-existent property '${
- String(prop)
- }' of module exports inside circular dependency`,
- );
-}
-
-// A Proxy that can be used as the prototype of a module.exports object and
-// warns when non-existent properties are accessed.
-const CircularRequirePrototypeWarningProxy = new Proxy(
- {},
- {
- // deno-lint-ignore no-explicit-any
- get(target: Record<string, any>, prop: string): any {
- if (prop in target) return target[prop];
- emitCircularRequireWarning(prop);
- return undefined;
- },
-
- getOwnPropertyDescriptor(target, prop): PropertyDescriptor | undefined {
- if (Object.prototype.hasOwnProperty.call(target, prop)) {
- return Object.getOwnPropertyDescriptor(target, prop);
- }
- emitCircularRequireWarning(prop);
- return undefined;
- },
- },
-);
-
-// Object.prototype and ObjectProtoype refer to our 'primordials' versions
-// and are not identical to the versions on the global object.
-const PublicObjectPrototype = globalThis.Object.prototype;
-
-// deno-lint-ignore no-explicit-any
-function getExportsForCircularRequire(module: Module): any {
- if (
- module.exports &&
- Object.getPrototypeOf(module.exports) === PublicObjectPrototype &&
- // Exclude transpiled ES6 modules / TypeScript code because those may
- // employ unusual patterns for accessing 'module.exports'. That should be
- // okay because ES6 modules have a different approach to circular
- // dependencies anyway.
- !module.exports.__esModule
- ) {
- // This is later unset once the module is done loading.
- Object.setPrototypeOf(module.exports, CircularRequirePrototypeWarningProxy);
- }
-
- return module.exports;
-}
-
-type RequireWrapper = (
- // deno-lint-ignore no-explicit-any
- exports: any,
- // deno-lint-ignore no-explicit-any
- require: any,
- module: Module,
- __filename: string,
- __dirname: string,
-) => void;
-
-function wrapSafe(filename: string, content: string): RequireWrapper {
- // TODO(bartlomieju): fix this
- const wrapper = Module.wrap(content);
- // deno-lint-ignore no-explicit-any
- const [f, err] = (Deno as any).core.evalContext(wrapper, filename);
- if (err) {
- throw err;
- }
- return f;
- // ESM code removed.
-}
-
-// Native extension for .js
-Module._extensions[".js"] = (module: Module, filename: string): void => {
- if (filename.endsWith(".js")) {
- const pkg = readPackageScope(filename);
- if (pkg !== false && pkg.data && pkg.data.type === "module") {
- throw new Error("Importing ESM module");
- }
- }
- const content = new TextDecoder().decode(Deno.readFileSync(filename));
- module._compile(content, filename);
-};
-
-// Native extension for .json
-Module._extensions[".json"] = (module: Module, filename: string): void => {
- const content = new TextDecoder().decode(Deno.readFileSync(filename));
- // manifest code removed
- try {
- module.exports = JSON.parse(stripBOM(content));
- } catch (err) {
- err.message = filename + ": " + err.message;
- throw err;
- }
-};
-
-// .node extension is not supported
-
-function createRequireFromPath(filename: string): RequireFunction {
- // Allow a directory to be passed as the filename
- const trailingSlash = filename.endsWith("/") ||
- (isWindows && filename.endsWith("\\"));
-
- const proxyPath = trailingSlash ? path.join(filename, "noop.js") : filename;
-
- const m = new Module(proxyPath);
- m.filename = proxyPath;
-
- m.paths = Module._nodeModulePaths(m.path);
- return makeRequireFunction(m);
-}
-
-// deno-lint-ignore no-explicit-any
-type Require = (id: string) => any;
-// deno-lint-ignore no-explicit-any
-type RequireResolve = (request: string, options: any) => string;
-interface RequireResolveFunction extends RequireResolve {
- paths: (request: string) => string[] | null;
-}
-
-interface RequireFunction extends Require {
- resolve: RequireResolveFunction;
- // deno-lint-ignore no-explicit-any
- extensions: { [key: string]: (module: Module, filename: string) => any };
- cache: { [key: string]: Module };
-}
-
-function makeRequireFunction(mod: Module): RequireFunction {
- // deno-lint-ignore no-explicit-any
- const require = function require(path: string): any {
- return mod.require(path);
- };
-
- function resolve(request: string, options?: { paths: string[] }): string {
- return Module._resolveFilename(request, mod, false, options);
- }
-
- require.resolve = resolve;
-
- function paths(request: string): string[] | null {
- return Module._resolveLookupPaths(request, mod);
- }
-
- resolve.paths = paths;
- // TODO(bartlomieju): set main
- // require.main = process.mainModule;
-
- // Enable support to add extra extension types.
- require.extensions = Module._extensions;
-
- require.cache = Module._cache;
-
- return require;
-}
-
-/**
- * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
- * because the buffer-to-string conversion in `fs.readFileSync()`
- * translates it to FEFF, the UTF-16 BOM.
- */
-function stripBOM(content: string): string {
- if (content.charCodeAt(0) === 0xfeff) {
- content = content.slice(1);
- }
- return content;
-}
-
-export const builtinModules = Module.builtinModules;
-export const createRequire = Module.createRequire;
-export default Module;
diff --git a/std/node/module_test.ts b/std/node/module_test.ts
deleted file mode 100644
index 58c325f94..000000000
--- a/std/node/module_test.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import {
- assert,
- assertEquals,
- assertStringIncludes,
-} from "../testing/asserts.ts";
-
-import * as path from "../path/mod.ts";
-import { createRequire } from "./module.ts";
-
-const moduleDir = path.dirname(path.fromFileUrl(import.meta.url));
-const testdataDir = path.resolve(moduleDir, path.join("_fs", "testdata"));
-
-const require = createRequire(import.meta.url);
-
-Deno.test("requireSuccess", function () {
- // Relative to import.meta.url
- const result = require("./tests/cjs/cjs_a.js");
- assert("helloA" in result);
- assert("helloB" in result);
- assert("C" in result);
- assert("leftPad" in result);
- assertEquals(result.helloA(), "A");
- assertEquals(result.helloB(), "B");
- assertEquals(result.C, "C");
- assertEquals(result.leftPad("pad", 4), " pad");
-});
-
-Deno.test("requireCycle", function () {
- const resultA = require("./tests/cjs/cjs_cycle_a");
- const resultB = require("./tests/cjs/cjs_cycle_b");
- assert(resultA);
- assert(resultB);
-});
-
-Deno.test("requireBuiltin", function () {
- const fs = require("fs");
- assert("readFileSync" in fs);
- const { readFileSync, isNull, extname } = require("./tests/cjs/cjs_builtin");
-
- const testData = path.relative(
- Deno.cwd(),
- path.join(testdataDir, "hello.txt"),
- );
- assertEquals(
- readFileSync(testData, { encoding: "utf8" }),
- "hello world",
- );
- assert(isNull(null));
- assertEquals(extname("index.html"), ".html");
-});
-
-Deno.test("requireIndexJS", function () {
- const { isIndex } = require("./tests/cjs");
- assert(isIndex);
-});
-
-Deno.test("requireNodeOs", function () {
- const os = require("os");
- assert(os.arch);
- assert(typeof os.arch() == "string");
-});
-
-Deno.test("requireStack", function () {
- const { hello } = require("./tests/cjs/cjs_throw");
- try {
- hello();
- } catch (e) {
- assertStringIncludes(e.stack, "/tests/cjs/cjs_throw.js");
- }
-});
-
-Deno.test("requireFileInSymlinkDir", () => {
- const { C } = require("./tests/cjs/dir");
- assertEquals(C, "C");
-});
diff --git a/std/node/os.ts b/std/node/os.ts
deleted file mode 100644
index 776eff92d..000000000
--- a/std/node/os.ts
+++ /dev/null
@@ -1,255 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-import { notImplemented } from "./_utils.ts";
-import { validateIntegerRange } from "./_utils.ts";
-import { EOL as fsEOL } from "../fs/eol.ts";
-import process from "./process.ts";
-
-const SEE_GITHUB_ISSUE = "See https://github.com/denoland/deno/issues/3802";
-
-interface CPUTimes {
- /** The number of milliseconds the CPU has spent in user mode */
- user: number;
-
- /** The number of milliseconds the CPU has spent in nice mode */
- nice: number;
-
- /** The number of milliseconds the CPU has spent in sys mode */
- sys: number;
-
- /** The number of milliseconds the CPU has spent in idle mode */
- idle: number;
-
- /** The number of milliseconds the CPU has spent in irq mode */
- irq: number;
-}
-
-interface CPUCoreInfo {
- model: string;
-
- /** in MHz */
- speed: number;
-
- times: CPUTimes;
-}
-
-interface NetworkAddress {
- /** The assigned IPv4 or IPv6 address */
- address: string;
-
- /** The IPv4 or IPv6 network mask */
- netmask: string;
-
- family: "IPv4" | "IPv6";
-
- /** The MAC address of the network interface */
- mac: string;
-
- /** true if the network interface is a loopback or similar interface that is not remotely accessible; otherwise false */
- internal: boolean;
-
- /** The numeric IPv6 scope ID (only specified when family is IPv6) */
- scopeid?: number;
-
- /** The assigned IPv4 or IPv6 address with the routing prefix in CIDR notation. If the netmask is invalid, this property is set to null. */
- cidr: string;
-}
-
-interface NetworkInterfaces {
- [key: string]: NetworkAddress[];
-}
-
-export interface UserInfoOptions {
- encoding: string;
-}
-
-interface UserInfo {
- username: string;
- uid: number;
- gid: number;
- shell: string;
- homedir: string;
-}
-
-arch[Symbol.toPrimitive] = (): string => arch();
-endianness[Symbol.toPrimitive] = (): string => endianness();
-freemem[Symbol.toPrimitive] = (): number => freemem();
-homedir[Symbol.toPrimitive] = (): string | null => homedir();
-hostname[Symbol.toPrimitive] = (): string | null => hostname();
-platform[Symbol.toPrimitive] = (): string => platform();
-release[Symbol.toPrimitive] = (): string => release();
-totalmem[Symbol.toPrimitive] = (): number => totalmem();
-type[Symbol.toPrimitive] = (): string => type();
-uptime[Symbol.toPrimitive] = (): number => uptime();
-
-/** Returns the operating system CPU architecture for which the Deno binary was compiled */
-export function arch(): string {
- return Deno.build.arch;
-}
-
-/** Not yet implemented */
-export function cpus(): CPUCoreInfo[] {
- notImplemented(SEE_GITHUB_ISSUE);
-}
-
-/**
- * Returns a string identifying the endianness of the CPU for which the Deno
- * binary was compiled. Possible values are 'BE' for big endian and 'LE' for
- * little endian.
- **/
-export function endianness(): "BE" | "LE" {
- // Source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView#Endianness
- const buffer = new ArrayBuffer(2);
- new DataView(buffer).setInt16(0, 256, true /* littleEndian */);
- // Int16Array uses the platform's endianness.
- return new Int16Array(buffer)[0] === 256 ? "LE" : "BE";
-}
-
-/** Return free memory amount */
-export function freemem(): number {
- return Deno.systemMemoryInfo().free;
-}
-
-/** Not yet implemented */
-export function getPriority(pid = 0): number {
- validateIntegerRange(pid, "pid");
- notImplemented(SEE_GITHUB_ISSUE);
-}
-
-/** Returns the string path of the current user's home directory. */
-export function homedir(): string | null {
- notImplemented(SEE_GITHUB_ISSUE);
-}
-
-/** Returns the host name of the operating system as a string. */
-export function hostname(): string {
- notImplemented(SEE_GITHUB_ISSUE);
-}
-
-/** Returns an array containing the 1, 5, and 15 minute load averages */
-export function loadavg(): number[] {
- if (Deno.build.os === "windows") {
- return [0, 0, 0];
- }
- return Deno.loadavg();
-}
-
-/** Not yet implemented */
-export function networkInterfaces(): NetworkInterfaces {
- notImplemented(SEE_GITHUB_ISSUE);
-}
-/** Returns the a string identifying the operating system platform. The value is set at compile time. Possible values are 'darwin', 'linux', and 'win32'. */
-export function platform(): string {
- return process.platform;
-}
-
-/** Returns the operating system as a string */
-export function release(): string {
- return Deno.osRelease();
-}
-
-/** Not yet implemented */
-export function setPriority(pid: number, priority?: number): void {
- /* The node API has the 'pid' as the first parameter and as optional.
- This makes for a problematic implementation in Typescript. */
- if (priority === undefined) {
- priority = pid;
- pid = 0;
- }
- validateIntegerRange(pid, "pid");
- validateIntegerRange(priority, "priority", -20, 19);
-
- notImplemented(SEE_GITHUB_ISSUE);
-}
-
-/** Returns the operating system's default directory for temporary files as a string. */
-export function tmpdir(): string | null {
- notImplemented(SEE_GITHUB_ISSUE);
-}
-
-/** Return total physical memory amount */
-export function totalmem(): number {
- return Deno.systemMemoryInfo().total;
-}
-
-/** Returns operating system type (i.e. 'Windows_NT', 'Linux', 'Darwin') */
-export function type(): string {
- switch (Deno.build.os) {
- case "windows":
- return "Windows_NT";
- case "linux":
- return "Linux";
- case "darwin":
- return "Darwin";
- default:
- throw Error("unreachable");
- }
-}
-
-/** Not yet implemented */
-export function uptime(): number {
- notImplemented(SEE_GITHUB_ISSUE);
-}
-
-/** Not yet implemented */
-export function userInfo(
- options: UserInfoOptions = { encoding: "utf-8" },
-): UserInfo {
- notImplemented(SEE_GITHUB_ISSUE);
-}
-
-export const constants = {
- // UV_UDP_REUSEADDR: 4, //see https://nodejs.org/docs/latest-v12.x/api/os.html#os_libuv_constants
- dlopen: {
- // see https://nodejs.org/docs/latest-v12.x/api/os.html#os_dlopen_constants
- },
- errno: {
- // see https://nodejs.org/docs/latest-v12.x/api/os.html#os_error_constants
- },
- signals: Deno.Signal,
- priority: {
- // see https://nodejs.org/docs/latest-v12.x/api/os.html#os_priority_constants
- },
-};
-
-export const EOL = Deno.build.os == "windows" ? fsEOL.CRLF : fsEOL.LF;
-
-export default {
- arch,
- cpus,
- endianness,
- freemem,
- getPriority,
- homedir,
- hostname,
- loadavg,
- networkInterfaces,
- platform,
- release,
- setPriority,
- tmpdir,
- totalmem,
- type,
- uptime,
- userInfo,
- constants,
- EOL,
-};
diff --git a/std/node/os_test.ts b/std/node/os_test.ts
deleted file mode 100644
index 6d5c124ce..000000000
--- a/std/node/os_test.ts
+++ /dev/null
@@ -1,270 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { assert, assertEquals, assertThrows } from "../testing/asserts.ts";
-import * as os from "./os.ts";
-
-Deno.test({
- name: "build architecture is a string",
- fn() {
- assertEquals(typeof os.arch(), "string");
- },
-});
-
-Deno.test({
- name: "home directory is a string",
- ignore: true,
- fn() {
- assertEquals(typeof os.homedir(), "string");
- },
-});
-
-Deno.test({
- name: "tmp directory is a string",
- ignore: true,
- fn() {
- assertEquals(typeof os.tmpdir(), "string");
- },
-});
-
-Deno.test({
- name: "hostname is a string",
- ignore: true,
- fn() {
- assertEquals(typeof os.hostname(), "string");
- },
-});
-
-Deno.test({
- name: "platform is a string",
- fn() {
- assertEquals(typeof os.platform(), "string");
- },
-});
-
-Deno.test({
- name: "release is a string",
- fn() {
- assertEquals(typeof os.release(), "string");
- },
-});
-
-Deno.test({
- name: "type is a string",
- fn() {
- assertEquals(typeof os.type(), "string");
- },
-});
-
-Deno.test({
- name: "getPriority(): PID must be a 32 bit integer",
- fn() {
- assertThrows(
- () => {
- os.getPriority(3.15);
- },
- Error,
- "pid must be 'an integer'",
- );
- assertThrows(
- () => {
- os.getPriority(9999999999);
- },
- Error,
- "must be >= -2147483648 && <= 2147483647",
- );
- },
-});
-
-Deno.test({
- name: "setPriority(): PID must be a 32 bit integer",
- fn() {
- assertThrows(
- () => {
- os.setPriority(3.15, 0);
- },
- Error,
- "pid must be 'an integer'",
- );
- assertThrows(
- () => {
- os.setPriority(9999999999, 0);
- },
- Error,
- "pid must be >= -2147483648 && <= 2147483647",
- );
- },
-});
-
-Deno.test({
- name: "setPriority(): priority must be an integer between -20 and 19",
- fn() {
- assertThrows(
- () => {
- os.setPriority(0, 3.15);
- },
- Error,
- "priority must be 'an integer'",
- );
- assertThrows(
- () => {
- os.setPriority(0, -21);
- },
- Error,
- "priority must be >= -20 && <= 19",
- );
- assertThrows(
- () => {
- os.setPriority(0, 20);
- },
- Error,
- "priority must be >= -20 && <= 19",
- );
- assertThrows(
- () => {
- os.setPriority(0, 9999999999);
- },
- Error,
- "priority must be >= -20 && <= 19",
- );
- },
-});
-
-Deno.test({
- name:
- "setPriority(): if only one argument specified, then this is the priority, NOT the pid",
- fn() {
- assertThrows(
- () => {
- os.setPriority(3.15);
- },
- Error,
- "priority must be 'an integer'",
- );
- assertThrows(
- () => {
- os.setPriority(-21);
- },
- Error,
- "priority must be >= -20 && <= 19",
- );
- assertThrows(
- () => {
- os.setPriority(20);
- },
- Error,
- "priority must be >= -20 && <= 19",
- );
- assertThrows(
- () => {
- os.setPriority(9999999999);
- },
- Error,
- "priority must be >= -20 && <= 19",
- );
- },
-});
-
-Deno.test({
- name: "Signals are as expected",
- fn() {
- // Test a few random signals for equality
- assertEquals(os.constants.signals.SIGKILL, Deno.Signal.SIGKILL);
- assertEquals(os.constants.signals.SIGCONT, Deno.Signal.SIGCONT);
- assertEquals(os.constants.signals.SIGXFSZ, Deno.Signal.SIGXFSZ);
- },
-});
-
-Deno.test({
- name: "EOL is as expected",
- fn() {
- assert(os.EOL == "\r\n" || os.EOL == "\n");
- },
-});
-
-Deno.test({
- name: "Endianness is determined",
- fn() {
- assert(["LE", "BE"].includes(os.endianness()));
- },
-});
-
-Deno.test({
- name: "Load average is an array of 3 numbers",
- fn() {
- const result = os.loadavg();
- assert(result.length == 3);
- assertEquals(typeof result[0], "number");
- assertEquals(typeof result[1], "number");
- assertEquals(typeof result[2], "number");
- },
-});
-
-Deno.test({
- name: "Primitive coercion works as expected",
- fn() {
- assertEquals(`${os.arch}`, os.arch());
- assertEquals(`${os.endianness}`, os.endianness());
- assertEquals(`${os.platform}`, os.platform());
- },
-});
-
-Deno.test({
- name: "Total memory amount should be greater than 0",
- fn() {
- assert(os.totalmem() > 0);
- },
-});
-
-Deno.test({
- name: "Free memory amount should be greater than 0",
- fn() {
- assert(os.freemem() > 0);
- },
-});
-
-Deno.test({
- name: "APIs not yet implemented",
- fn() {
- assertThrows(
- () => {
- os.cpus();
- },
- Error,
- "Not implemented",
- );
- assertThrows(
- () => {
- os.getPriority();
- },
- Error,
- "Not implemented",
- );
- assertThrows(
- () => {
- os.networkInterfaces();
- },
- Error,
- "Not implemented",
- );
- assertThrows(
- () => {
- os.setPriority(0);
- },
- Error,
- "Not implemented",
- );
- assertThrows(
- () => {
- os.uptime();
- },
- Error,
- "Not implemented",
- );
- assertThrows(
- () => {
- os.userInfo();
- },
- Error,
- "Not implemented",
- );
- },
-});
diff --git a/std/node/path.ts b/std/node/path.ts
deleted file mode 100644
index 0f29ad9b0..000000000
--- a/std/node/path.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-export * from "../path/mod.ts";
-import * as m from "../path/mod.ts";
-export default m;
diff --git a/std/node/process.ts b/std/node/process.ts
deleted file mode 100644
index 419eb8cec..000000000
--- a/std/node/process.ts
+++ /dev/null
@@ -1,318 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { notImplemented } from "./_utils.ts";
-import EventEmitter from "./events.ts";
-import { fromFileUrl } from "../path/mod.ts";
-
-const notImplementedEvents = [
- "beforeExit",
- "disconnect",
- "message",
- "multipleResolves",
- "rejectionHandled",
- "SIGBREAK",
- "SIGBUS",
- "SIGFPE",
- "SIGHUP",
- "SIGILL",
- "SIGINT",
- "SIGSEGV",
- "SIGTERM",
- "SIGWINCH",
- "uncaughtException",
- "uncaughtExceptionMonitor",
- "unhandledRejection",
- "warning",
-];
-
-/** https://nodejs.org/api/process.html#process_process_arch */
-export const arch = Deno.build.arch;
-
-function getArguments() {
- return [Deno.execPath(), fromFileUrl(Deno.mainModule), ...Deno.args];
-}
-
-//deno-lint-ignore ban-ts-comment
-//@ts-ignore
-const _argv: {
- [Deno.customInspect]: () => string;
- [key: number]: string;
-} = [];
-
-Object.defineProperty(_argv, Deno.customInspect, {
- enumerable: false,
- configurable: false,
- get: function () {
- return getArguments();
- },
-});
-
-/**
- * https://nodejs.org/api/process.html#process_process_argv
- * Read permissions are required in order to get the executable route
- * */
-export const argv: Record<string, string> = new Proxy(_argv, {
- get(target, prop) {
- if (prop === Deno.customInspect) {
- return target[Deno.customInspect];
- }
- return getArguments()[prop as number];
- },
- ownKeys() {
- return Reflect.ownKeys(getArguments());
- },
-});
-
-/** https://nodejs.org/api/process.html#process_process_chdir_directory */
-export const chdir = Deno.chdir;
-
-/** https://nodejs.org/api/process.html#process_process_cwd */
-export const cwd = Deno.cwd;
-
-//deno-lint-ignore ban-ts-comment
-//@ts-ignore
-const _env: {
- [Deno.customInspect]: () => string;
-} = {};
-
-Object.defineProperty(_env, Deno.customInspect, {
- enumerable: false,
- configurable: false,
- get: function () {
- return Deno.env.toObject();
- },
-});
-
-/**
- * https://nodejs.org/api/process.html#process_process_env
- * Requires env permissions
- * */
-export const env: Record<string, string> = new Proxy(_env, {
- get(target, prop) {
- if (prop === Deno.customInspect) {
- return target[Deno.customInspect];
- }
- return Deno.env.get(String(prop));
- },
- ownKeys() {
- return Reflect.ownKeys(Deno.env.toObject());
- },
- set(_target, prop, value) {
- Deno.env.set(String(prop), String(value));
- return value;
- },
-});
-
-/** https://nodejs.org/api/process.html#process_process_exit_code */
-export const exit = Deno.exit;
-
-/** https://nodejs.org/api/process.html#process_process_nexttick_callback_args */
-export function nextTick(this: unknown, cb: () => void): void;
-export function nextTick<T extends Array<unknown>>(
- this: unknown,
- cb: (...args: T) => void,
- ...args: T
-): void;
-export function nextTick<T extends Array<unknown>>(
- this: unknown,
- cb: (...args: T) => void,
- ...args: T
-) {
- if (args) {
- queueMicrotask(() => cb.call(this, ...args));
- } else {
- queueMicrotask(cb);
- }
-}
-
-/** https://nodejs.org/api/process.html#process_process_pid */
-export const pid = Deno.pid;
-
-/** https://nodejs.org/api/process.html#process_process_platform */
-export const platform = Deno.build.os === "windows" ? "win32" : Deno.build.os;
-
-/** https://nodejs.org/api/process.html#process_process_version */
-export const version = `v${Deno.version.deno}`;
-
-/** https://nodejs.org/api/process.html#process_process_versions */
-export const versions = {
- node: Deno.version.deno,
- ...Deno.version,
-};
-
-class Process extends EventEmitter {
- constructor() {
- super();
-
- //This causes the exit event to be binded to the unload event
- window.addEventListener("unload", () => {
- //TODO(Soremwar)
- //Get the exit code from the unload event
- super.emit("exit", 0);
- });
- }
-
- /** https://nodejs.org/api/process.html#process_process_arch */
- arch = arch;
-
- /**
- * https://nodejs.org/api/process.html#process_process_argv
- * Read permissions are required in order to get the executable route
- * */
- argv = argv;
-
- /** https://nodejs.org/api/process.html#process_process_chdir_directory */
- chdir = chdir;
-
- /** https://nodejs.org/api/process.html#process_process_cwd */
- cwd = cwd;
-
- /** https://nodejs.org/api/process.html#process_process_exit_code */
- exit = exit;
-
- /**
- * https://nodejs.org/api/process.html#process_process_env
- * Requires env permissions
- * */
- env = env;
-
- /** https://nodejs.org/api/process.html#process_process_nexttick_callback_args */
- nextTick = nextTick;
-
- /** https://nodejs.org/api/process.html#process_process_events */
- //deno-lint-ignore ban-types
- on(event: typeof notImplementedEvents[number], listener: Function): never;
- on(event: "exit", listener: (code: number) => void): this;
- //deno-lint-ignore no-explicit-any
- on(event: string, listener: (...args: any[]) => void): this {
- if (notImplementedEvents.includes(event)) {
- notImplemented();
- }
-
- super.on(event, listener);
-
- return this;
- }
-
- /** https://nodejs.org/api/process.html#process_process_pid */
- pid = pid;
-
- /** https://nodejs.org/api/process.html#process_process_platform */
- platform = platform;
-
- removeAllListeners(_event: string): never {
- notImplemented();
- }
-
- removeListener(
- event: typeof notImplementedEvents[number],
- //deno-lint-ignore ban-types
- listener: Function,
- ): never;
- removeListener(event: "exit", listener: (code: number) => void): this;
- //deno-lint-ignore no-explicit-any
- removeListener(event: string, listener: (...args: any[]) => void): this {
- if (notImplementedEvents.includes(event)) {
- notImplemented();
- }
-
- super.removeListener("exit", listener);
-
- return this;
- }
-
- /** https://nodejs.org/api/process.html#process_process_stderr */
- get stderr() {
- return {
- fd: Deno.stderr.rid,
- get isTTY(): boolean {
- return Deno.isatty(this.fd);
- },
- pipe(_destination: Deno.Writer, _options: { end: boolean }): void {
- // TODO(JayHelton): to be implemented
- notImplemented();
- },
- // deno-lint-ignore ban-types
- write(_chunk: string | Uint8Array, _callback: Function): void {
- // TODO(JayHelton): to be implemented
- notImplemented();
- },
- // deno-lint-ignore ban-types
- on(_event: string, _callback: Function): void {
- // TODO(JayHelton): to be implemented
- notImplemented();
- },
- };
- }
-
- /** https://nodejs.org/api/process.html#process_process_stdin */
- get stdin() {
- return {
- fd: Deno.stdin.rid,
- get isTTY(): boolean {
- return Deno.isatty(this.fd);
- },
- read(_size: number): void {
- // TODO(JayHelton): to be implemented
- notImplemented();
- },
- // deno-lint-ignore ban-types
- on(_event: string, _callback: Function): void {
- // TODO(JayHelton): to be implemented
- notImplemented();
- },
- };
- }
-
- /** https://nodejs.org/api/process.html#process_process_stdout */
- get stdout() {
- return {
- fd: Deno.stdout.rid,
- get isTTY(): boolean {
- return Deno.isatty(this.fd);
- },
- pipe(_destination: Deno.Writer, _options: { end: boolean }): void {
- // TODO(JayHelton): to be implemented
- notImplemented();
- },
- // deno-lint-ignore ban-types
- write(_chunk: string | Uint8Array, _callback: Function): void {
- // TODO(JayHelton): to be implemented
- notImplemented();
- },
- // deno-lint-ignore ban-types
- on(_event: string, _callback: Function): void {
- // TODO(JayHelton): to be implemented
- notImplemented();
- },
- };
- }
-
- /** https://nodejs.org/api/process.html#process_process_version */
- version = version;
-
- /** https://nodejs.org/api/process.html#process_process_versions */
- versions = versions;
-}
-
-/** https://nodejs.org/api/process.html#process_process */
-const process = new Process();
-
-Object.defineProperty(process, Symbol.toStringTag, {
- enumerable: false,
- writable: true,
- configurable: false,
- value: "process",
-});
-
-export const removeListener = process.removeListener;
-export const removeAllListeners = process.removeAllListeners;
-export const stderr = process.stderr;
-export const stdin = process.stdin;
-export const stdout = process.stdout;
-
-export default process;
-
-//TODO(Soremwar)
-//Remove on 1.0
-//Kept for backwars compatibility with std
-export { process };
diff --git a/std/node/process_exit_test.ts b/std/node/process_exit_test.ts
deleted file mode 100644
index 54c8bcc01..000000000
--- a/std/node/process_exit_test.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import "./global.ts";
-
-//deno-lint-ignore no-undef
-process.on("exit", () => {
- console.log(1);
-});
-
-function unexpected() {
- console.log(null);
-}
-//deno-lint-ignore no-undef
-process.on("exit", unexpected);
-//deno-lint-ignore no-undef
-process.removeListener("exit", unexpected);
-
-//deno-lint-ignore no-undef
-process.on("exit", () => {
- console.log(2);
-});
diff --git a/std/node/process_test.ts b/std/node/process_test.ts
deleted file mode 100644
index 22cebf260..000000000
--- a/std/node/process_test.ts
+++ /dev/null
@@ -1,196 +0,0 @@
-// deno-lint-ignore-file no-undef
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-
-import "./global.ts";
-import { assert, assertEquals, assertThrows } from "../testing/asserts.ts";
-import { stripColor } from "../fmt/colors.ts";
-import * as path from "../path/mod.ts";
-import { delay } from "../async/delay.ts";
-import { env } from "./process.ts";
-
-Deno.test({
- name: "process.cwd and process.chdir success",
- fn() {
- assertEquals(process.cwd(), Deno.cwd());
-
- const currentDir = Deno.cwd();
-
- const tempDir = Deno.makeTempDirSync();
- process.chdir(tempDir);
- assertEquals(
- Deno.realPathSync(process.cwd()),
- Deno.realPathSync(tempDir),
- );
-
- process.chdir(currentDir);
- },
-});
-
-Deno.test({
- name: "process.chdir failure",
- fn() {
- assertThrows(
- () => {
- process.chdir("non-existent-directory-name");
- },
- Deno.errors.NotFound,
- "file",
- // On every OS Deno returns: "No such file" except for Windows, where it's:
- // "The system cannot find the file specified. (os error 2)" so "file" is
- // the only common string here.
- );
- },
-});
-
-Deno.test({
- name: "process.version",
- fn() {
- assertEquals(typeof process, "object");
- assertEquals(typeof process.version, "string");
- assertEquals(typeof process.versions, "object");
- assertEquals(typeof process.versions.node, "string");
- },
-});
-
-Deno.test({
- name: "process.platform",
- fn() {
- assertEquals(typeof process.platform, "string");
- },
-});
-
-Deno.test({
- name: "process.arch",
- fn() {
- assertEquals(typeof process.arch, "string");
- // TODO(rsp): make sure that the arch strings should be the same in Node and Deno:
- assertEquals(process.arch, Deno.build.arch);
- },
-});
-
-Deno.test({
- name: "process.pid",
- fn() {
- assertEquals(typeof process.pid, "number");
- assertEquals(process.pid, Deno.pid);
- },
-});
-
-Deno.test({
- name: "process.on",
- async fn() {
- assertEquals(typeof process.on, "function");
- assertThrows(
- () => {
- process.on("uncaughtException", (_err: Error) => {});
- },
- Error,
- "implemented",
- );
-
- let triggered = false;
- process.on("exit", () => {
- triggered = true;
- });
- process.emit("exit");
- assert(triggered);
-
- const cwd = path.dirname(path.fromFileUrl(import.meta.url));
-
- const p = Deno.run({
- cmd: [
- Deno.execPath(),
- "run",
- "./process_exit_test.ts",
- ],
- cwd,
- stdout: "piped",
- });
-
- const decoder = new TextDecoder();
- const rawOutput = await p.output();
- assertEquals(
- stripColor(decoder.decode(rawOutput).trim()),
- "1\n2",
- );
- p.close();
- },
-});
-
-Deno.test({
- name: "process.argv",
- fn() {
- assert(Array.isArray(process.argv));
- assert(
- process.argv[0].match(/[^/\\]*deno[^/\\]*$/),
- "deno included in the file name of argv[0]",
- );
- assertEquals(
- process.argv[1],
- path.fromFileUrl(Deno.mainModule),
- );
- },
-});
-
-Deno.test({
- name: "process.env",
- fn() {
- Deno.env.set("HELLO", "WORLD");
-
- assertEquals(typeof (process.env.HELLO), "string");
- assertEquals(process.env.HELLO, "WORLD");
-
- assertEquals(typeof env.HELLO, "string");
- assertEquals(env.HELLO, "WORLD");
- },
-});
-
-Deno.test({
- name: "process.stdin",
- fn() {
- assertEquals(typeof process.stdin.fd, "number");
- assertEquals(process.stdin.fd, Deno.stdin.rid);
- // TODO(jayhelton) Uncomment out this assertion once PTY is supported
- //assert(process.stdin.isTTY);
- },
-});
-
-Deno.test({
- name: "process.stdout",
- fn() {
- assertEquals(typeof process.stdout.fd, "number");
- assertEquals(process.stdout.fd, Deno.stdout.rid);
- // TODO(jayhelton) Uncomment out this assertion once PTY is supported
- // assert(process.stdout.isTTY);
- },
-});
-
-Deno.test({
- name: "process.stderr",
- fn() {
- assertEquals(typeof process.stderr.fd, "number");
- assertEquals(process.stderr.fd, Deno.stderr.rid);
- // TODO(jayhelton) Uncomment out this assertion once PTY is supported
- // assert(process.stderr.isTTY);
- },
-});
-
-Deno.test({
- name: "process.nextTick",
- async fn() {
- let withoutArguments = false;
- process.nextTick(() => {
- withoutArguments = true;
- });
-
- const expected = 12;
- let result;
- process.nextTick((x: number) => {
- result = x;
- }, 12);
-
- await delay(10);
- assert(withoutArguments);
- assertEquals(result, expected);
- },
-});
diff --git a/std/node/querystring.ts b/std/node/querystring.ts
deleted file mode 100644
index 4d9d0eb27..000000000
--- a/std/node/querystring.ts
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-
-interface ParseOptions {
- /** The function to use when decoding percent-encoded characters in the query string. */
- decodeURIComponent?: (string: string) => string;
- /** Specifies the maximum number of keys to parse. */
- maxKeys?: number;
-}
-
-export const hexTable = new Array(256);
-for (let i = 0; i < 256; ++i) {
- hexTable[i] = "%" + ((i < 16 ? "0" : "") + i.toString(16)).toUpperCase();
-}
-
-/**
- * Parses a URL query string into a collection of key and value pairs.
- * @param str The URL query string to parse
- * @param sep The substring used to delimit key and value pairs in the query string. Default: '&'.
- * @param eq The substring used to delimit keys and values in the query string. Default: '='.
- * @param options The parse options
- */
-export function parse(
- str: string,
- sep = "&",
- eq = "=",
- { decodeURIComponent = unescape, maxKeys = 1000 }: ParseOptions = {},
-): { [key: string]: string[] | string } {
- const entries = str
- .split(sep)
- .map((entry) => entry.split(eq).map(decodeURIComponent));
- const final: { [key: string]: string[] | string } = {};
-
- let i = 0;
- while (true) {
- if ((Object.keys(final).length === maxKeys && !!maxKeys) || !entries[i]) {
- break;
- }
-
- const [key, val] = entries[i];
- if (final[key]) {
- if (Array.isArray(final[key])) {
- (final[key] as string[]).push(val);
- } else {
- final[key] = [final[key] as string, val];
- }
- } else {
- final[key] = val;
- }
-
- i++;
- }
-
- return final;
-}
-
-interface StringifyOptions {
- /** The function to use when converting URL-unsafe characters to percent-encoding in the query string. */
- encodeURIComponent?: (string: string) => string;
-}
-
-export function encodeStr(
- str: string,
- noEscapeTable: number[],
- hexTable: string[],
-): string {
- const len = str.length;
- if (len === 0) return "";
-
- let out = "";
- let lastPos = 0;
-
- for (let i = 0; i < len; i++) {
- let c = str.charCodeAt(i);
- // ASCII
- if (c < 0x80) {
- if (noEscapeTable[c] === 1) continue;
- if (lastPos < i) out += str.slice(lastPos, i);
- lastPos = i + 1;
- out += hexTable[c];
- continue;
- }
-
- if (lastPos < i) out += str.slice(lastPos, i);
-
- // Multi-byte characters ...
- if (c < 0x800) {
- lastPos = i + 1;
- out += hexTable[0xc0 | (c >> 6)] + hexTable[0x80 | (c & 0x3f)];
- continue;
- }
- if (c < 0xd800 || c >= 0xe000) {
- lastPos = i + 1;
- out += hexTable[0xe0 | (c >> 12)] +
- hexTable[0x80 | ((c >> 6) & 0x3f)] +
- hexTable[0x80 | (c & 0x3f)];
- continue;
- }
- // Surrogate pair
- ++i;
-
- // This branch should never happen because all URLSearchParams entries
- // should already be converted to USVString. But, included for
- // completion's sake anyway.
- if (i >= len) throw new Deno.errors.InvalidData("invalid URI");
-
- const c2 = str.charCodeAt(i) & 0x3ff;
-
- lastPos = i + 1;
- c = 0x10000 + (((c & 0x3ff) << 10) | c2);
- out += hexTable[0xf0 | (c >> 18)] +
- hexTable[0x80 | ((c >> 12) & 0x3f)] +
- hexTable[0x80 | ((c >> 6) & 0x3f)] +
- hexTable[0x80 | (c & 0x3f)];
- }
- if (lastPos === 0) return str;
- if (lastPos < len) return out + str.slice(lastPos);
- return out;
-}
-
-/**
- * Produces a URL query string from a given obj by iterating through the object's "own properties".
- * @param obj The object to serialize into a URL query string.
- * @param sep The substring used to delimit key and value pairs in the query string. Default: '&'.
- * @param eq The substring used to delimit keys and values in the query string. Default: '='.
- * @param options The stringify options
- */
-export function stringify(
- // deno-lint-ignore no-explicit-any
- obj: Record<string, any>,
- sep = "&",
- eq = "=",
- { encodeURIComponent = escape }: StringifyOptions = {},
-): string {
- const final = [];
-
- for (const entry of Object.entries(obj)) {
- if (Array.isArray(entry[1])) {
- for (const val of entry[1]) {
- final.push(encodeURIComponent(entry[0]) + eq + encodeURIComponent(val));
- }
- } else if (typeof entry[1] !== "object" && entry[1] !== undefined) {
- final.push(entry.map(encodeURIComponent).join(eq));
- } else {
- final.push(encodeURIComponent(entry[0]) + eq);
- }
- }
-
- return final.join(sep);
-}
-
-/** Alias of querystring.parse() */
-export const decode = parse;
-/** Alias of querystring.stringify() */
-export const encode = stringify;
-export const unescape = decodeURIComponent;
-export const escape = encodeURIComponent;
-
-export default {
- parse,
- encodeStr,
- stringify,
- hexTable,
- decode,
- encode,
- unescape,
- escape,
-};
diff --git a/std/node/querystring_test.ts b/std/node/querystring_test.ts
deleted file mode 100644
index d05a75eab..000000000
--- a/std/node/querystring_test.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { assertEquals } from "../testing/asserts.ts";
-import { parse, stringify } from "./querystring.ts";
-
-Deno.test({
- name: "stringify",
- fn() {
- assertEquals(
- stringify({
- a: "hello",
- b: 5,
- c: true,
- d: ["foo", "bar"],
- }),
- "a=hello&b=5&c=true&d=foo&d=bar",
- );
- },
-});
-
-Deno.test({
- name: "parse",
- fn() {
- assertEquals(parse("a=hello&b=5&c=true&d=foo&d=bar"), {
- a: "hello",
- b: "5",
- c: "true",
- d: ["foo", "bar"],
- });
- },
-});
diff --git a/std/node/stream.ts b/std/node/stream.ts
deleted file mode 100644
index 230c5a9d6..000000000
--- a/std/node/stream.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright Node.js contributors. All rights reserved.
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-// IN THE SOFTWARE.
-import Duplex from "./_stream/duplex.ts";
-import eos from "./_stream/end_of_stream.ts";
-import PassThrough from "./_stream/passthrough.ts";
-import pipeline from "./_stream/pipeline.ts";
-import * as promises from "./_stream/promises.ts";
-import Readable from "./_stream/readable.ts";
-import Stream from "./_stream/stream.ts";
-import Transform from "./_stream/transform.ts";
-import Writable from "./_stream/writable.ts";
-
-const exports = {
- Duplex,
- finished: eos,
- PassThrough,
- pipeline,
- promises,
- Readable,
- Stream,
- Transform,
- Writable,
-};
-
-export default exports;
-export {
- Duplex,
- eos as finished,
- PassThrough,
- pipeline,
- promises,
- Readable,
- Stream,
- Transform,
- Writable,
-};
diff --git a/std/node/stream_test.ts b/std/node/stream_test.ts
deleted file mode 100644
index f8d4ecfa5..000000000
--- a/std/node/stream_test.ts
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright Node.js contributors. All rights reserved.
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-// IN THE SOFTWARE.
-import { Readable, Transform, Writable } from "./stream.ts";
-import { Buffer } from "./buffer.ts";
-import { deferred } from "../async/mod.ts";
-import { assert, assertEquals } from "../testing/asserts.ts";
-import { mustCall } from "./_utils.ts";
-
-Deno.test("Readable and Writable stream backpressure test", async () => {
- let pushes = 0;
- const total = 65500 + 40 * 1024;
-
- let rsExecuted = 0;
- const rsExecutedExpected = 11;
- const rsExpectedExecutions = deferred();
-
- let wsExecuted = 0;
- const wsExecutedExpected = 410;
- const wsExpectedExecutions = deferred();
-
- const rs = new Readable({
- read: function () {
- rsExecuted++;
- if (rsExecuted == rsExecutedExpected) {
- rsExpectedExecutions.resolve();
- }
-
- if (pushes++ === 10) {
- this.push(null);
- return;
- }
-
- assert(this._readableState.length <= total);
-
- this.push(Buffer.alloc(65500));
- for (let i = 0; i < 40; i++) {
- this.push(Buffer.alloc(1024));
- }
- },
- });
-
- const ws = new Writable({
- write: function (_data, _enc, cb) {
- wsExecuted++;
- if (wsExecuted == wsExecutedExpected) {
- wsExpectedExecutions.resolve();
- }
- cb();
- },
- });
-
- rs.pipe(ws);
-
- const rsTimeout = setTimeout(() => rsExpectedExecutions.reject(), 1000);
- const wsTimeout = setTimeout(() => wsExpectedExecutions.reject(), 1000);
- await rsExpectedExecutions;
- await wsExpectedExecutions;
- clearTimeout(rsTimeout);
- clearTimeout(wsTimeout);
- assertEquals(rsExecuted, rsExecutedExpected);
- assertEquals(wsExecuted, wsExecutedExpected);
-});
-
-Deno.test("Readable can be piped through Transform", async () => {
- const [readExecution, readCb] = mustCall(function (this: Readable) {
- this.push("content");
- this.push(null);
- });
-
- const r = new Readable({
- read: readCb,
- });
-
- const [transformExecution, transformCb] = mustCall(
- function (
- this: Transform,
- chunk: unknown,
- _e,
- callback: (error?: Error | null) => void,
- ) {
- this.push(chunk);
- callback();
- },
- );
-
- const [flushExecution, flushCb] = mustCall(
- function (this: Transform, callback: (error?: Error | null) => void) {
- callback();
- },
- );
-
- const t = new Transform({
- transform: transformCb,
- flush: flushCb,
- });
-
- r.pipe(t);
-
- const [readableExecution, readableCb] = mustCall(function () {
- while (true) {
- const chunk = t.read();
- if (!chunk) {
- break;
- }
-
- assertEquals(chunk.toString(), "content");
- }
- }, 2);
-
- t.on("readable", readableCb);
-
- await readExecution;
- await transformExecution;
- await flushExecution;
- await readableExecution;
-});
diff --git a/std/node/string_decoder.ts b/std/node/string_decoder.ts
deleted file mode 100644
index d5aba8018..000000000
--- a/std/node/string_decoder.ts
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-import { Buffer } from "./buffer.ts";
-import { normalizeEncoding as castEncoding, notImplemented } from "./_utils.ts";
-
-enum NotImplemented {
- "ascii",
- "latin1",
- "utf16le",
-}
-
-function normalizeEncoding(enc?: string): string {
- const encoding = castEncoding(enc ?? null);
- if (encoding && encoding in NotImplemented) notImplemented(encoding);
- if (!encoding && typeof enc === "string" && enc.toLowerCase() !== "raw") {
- throw new Error(`Unknown encoding: ${enc}`);
- }
- return String(encoding);
-}
-/*
- * Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
- * continuation byte. If an invalid byte is detected, -2 is returned.
- * */
-function utf8CheckByte(byte: number): number {
- if (byte <= 0x7f) return 0;
- else if (byte >> 5 === 0x06) return 2;
- else if (byte >> 4 === 0x0e) return 3;
- else if (byte >> 3 === 0x1e) return 4;
- return byte >> 6 === 0x02 ? -1 : -2;
-}
-
-/*
- * Checks at most 3 bytes at the end of a Buffer in order to detect an
- * incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
- * needed to complete the UTF-8 character (if applicable) are returned.
- * */
-function utf8CheckIncomplete(
- self: StringDecoderBase,
- buf: Buffer,
- i: number,
-): number {
- let j = buf.length - 1;
- if (j < i) return 0;
- let nb = utf8CheckByte(buf[j]);
- if (nb >= 0) {
- if (nb > 0) self.lastNeed = nb - 1;
- return nb;
- }
- if (--j < i || nb === -2) return 0;
- nb = utf8CheckByte(buf[j]);
- if (nb >= 0) {
- if (nb > 0) self.lastNeed = nb - 2;
- return nb;
- }
- if (--j < i || nb === -2) return 0;
- nb = utf8CheckByte(buf[j]);
- if (nb >= 0) {
- if (nb > 0) {
- if (nb === 2) nb = 0;
- else self.lastNeed = nb - 3;
- }
- return nb;
- }
- return 0;
-}
-
-/*
- * Validates as many continuation bytes for a multi-byte UTF-8 character as
- * needed or are available. If we see a non-continuation byte where we expect
- * one, we "replace" the validated continuation bytes we've seen so far with
- * a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
- * behavior. The continuation byte check is included three times in the case
- * where all of the continuation bytes for a character exist in the same buffer.
- * It is also done this way as a slight performance increase instead of using a
- * loop.
- * */
-function utf8CheckExtraBytes(
- self: StringDecoderBase,
- buf: Buffer,
-): string | undefined {
- if ((buf[0] & 0xc0) !== 0x80) {
- self.lastNeed = 0;
- return "\ufffd";
- }
- if (self.lastNeed > 1 && buf.length > 1) {
- if ((buf[1] & 0xc0) !== 0x80) {
- self.lastNeed = 1;
- return "\ufffd";
- }
- if (self.lastNeed > 2 && buf.length > 2) {
- if ((buf[2] & 0xc0) !== 0x80) {
- self.lastNeed = 2;
- return "\ufffd";
- }
- }
- }
-}
-
-/*
- * Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
- * */
-function utf8FillLastComplete(
- this: StringDecoderBase,
- buf: Buffer,
-): string | undefined {
- const p = this.lastTotal - this.lastNeed;
- const r = utf8CheckExtraBytes(this, buf);
- if (r !== undefined) return r;
- if (this.lastNeed <= buf.length) {
- buf.copy(this.lastChar, p, 0, this.lastNeed);
- return this.lastChar.toString(this.encoding, 0, this.lastTotal);
- }
- buf.copy(this.lastChar, p, 0, buf.length);
- this.lastNeed -= buf.length;
-}
-
-/*
- * Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
- * */
-function utf8FillLastIncomplete(
- this: StringDecoderBase,
- buf: Buffer,
-): string | undefined {
- if (this.lastNeed <= buf.length) {
- buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
- return this.lastChar.toString(this.encoding, 0, this.lastTotal);
- }
- buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
- this.lastNeed -= buf.length;
-}
-
-/*
- * Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
- * partial character, the character's bytes are buffered until the required
- * number of bytes are available.
- * */
-function utf8Text(this: StringDecoderBase, buf: Buffer, i: number): string {
- const total = utf8CheckIncomplete(this, buf, i);
- if (!this.lastNeed) return buf.toString("utf8", i);
- this.lastTotal = total;
- const end = buf.length - (total - this.lastNeed);
- buf.copy(this.lastChar, 0, end);
- return buf.toString("utf8", i, end);
-}
-
-/*
- * For UTF-8, a replacement character is added when ending on a partial
- * character.
- * */
-function utf8End(this: Utf8Decoder, buf?: Buffer): string {
- const r = buf && buf.length ? this.write(buf) : "";
- if (this.lastNeed) return r + "\ufffd";
- return r;
-}
-
-function utf8Write(
- this: Utf8Decoder | Base64Decoder,
- buf: Buffer | string,
-): string {
- if (typeof buf === "string") {
- return buf;
- }
- if (buf.length === 0) return "";
- let r;
- let i;
- if (this.lastNeed) {
- r = this.fillLast(buf);
- if (r === undefined) return "";
- i = this.lastNeed;
- this.lastNeed = 0;
- } else {
- i = 0;
- }
- if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
- return r || "";
-}
-
-function base64Text(this: StringDecoderBase, buf: Buffer, i: number): string {
- const n = (buf.length - i) % 3;
- if (n === 0) return buf.toString("base64", i);
- this.lastNeed = 3 - n;
- this.lastTotal = 3;
- if (n === 1) {
- this.lastChar[0] = buf[buf.length - 1];
- } else {
- this.lastChar[0] = buf[buf.length - 2];
- this.lastChar[1] = buf[buf.length - 1];
- }
- return buf.toString("base64", i, buf.length - n);
-}
-
-function base64End(this: Base64Decoder, buf?: Buffer): string {
- const r = buf && buf.length ? this.write(buf) : "";
- if (this.lastNeed) {
- return r + this.lastChar.toString("base64", 0, 3 - this.lastNeed);
- }
- return r;
-}
-
-function simpleWrite(
- this: StringDecoderBase,
- buf: Buffer | string,
-): string {
- if (typeof buf === "string") {
- return buf;
- }
- return buf.toString(this.encoding);
-}
-
-function simpleEnd(this: GenericDecoder, buf?: Buffer): string {
- return buf && buf.length ? this.write(buf) : "";
-}
-
-class StringDecoderBase {
- public lastChar: Buffer;
- public lastNeed = 0;
- public lastTotal = 0;
- constructor(public encoding: string, nb: number) {
- this.lastChar = Buffer.allocUnsafe(nb);
- }
-}
-
-class Base64Decoder extends StringDecoderBase {
- public end = base64End;
- public fillLast = utf8FillLastIncomplete;
- public text = base64Text;
- public write = utf8Write;
-
- constructor(encoding?: string) {
- super(normalizeEncoding(encoding), 3);
- }
-}
-
-class GenericDecoder extends StringDecoderBase {
- public end = simpleEnd;
- public fillLast = undefined;
- public text = utf8Text;
- public write = simpleWrite;
-
- constructor(encoding?: string) {
- super(normalizeEncoding(encoding), 4);
- }
-}
-
-class Utf8Decoder extends StringDecoderBase {
- public end = utf8End;
- public fillLast = utf8FillLastComplete;
- public text = utf8Text;
- public write = utf8Write;
-
- constructor(encoding?: string) {
- super(normalizeEncoding(encoding), 4);
- }
-}
-
-/*
- * StringDecoder provides an interface for efficiently splitting a series of
- * buffers into a series of JS strings without breaking apart multi-byte
- * characters.
- * */
-export class StringDecoder {
- public encoding: string;
- public end: (buf?: Buffer) => string;
- public fillLast: ((buf: Buffer) => string | undefined) | undefined;
- public lastChar: Buffer;
- public lastNeed: number;
- public lastTotal: number;
- public text: (buf: Buffer, n: number) => string;
- public write: (buf: Buffer) => string;
-
- constructor(encoding?: string) {
- let decoder;
- switch (encoding) {
- case "utf8":
- decoder = new Utf8Decoder(encoding);
- break;
- case "base64":
- decoder = new Base64Decoder(encoding);
- break;
- default:
- decoder = new GenericDecoder(encoding);
- }
- this.encoding = decoder.encoding;
- this.end = decoder.end;
- this.fillLast = decoder.fillLast;
- this.lastChar = decoder.lastChar;
- this.lastNeed = decoder.lastNeed;
- this.lastTotal = decoder.lastTotal;
- this.text = decoder.text;
- this.write = decoder.write;
- }
-}
-
-export default { StringDecoder };
diff --git a/std/node/string_decoder_test.ts b/std/node/string_decoder_test.ts
deleted file mode 100644
index 70f50820d..000000000
--- a/std/node/string_decoder_test.ts
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { assertEquals } from "../testing/asserts.ts";
-import { Buffer } from "./buffer.ts";
-import { StringDecoder } from "./string_decoder.ts";
-
-Deno.test({
- name: "String decoder is encoding utf8 correctly",
- fn() {
- let decoder;
-
- decoder = new StringDecoder("utf8");
- assertEquals(decoder.write(Buffer.from("E1", "hex")), "");
- assertEquals(decoder.end(), "\ufffd");
-
- decoder = new StringDecoder("utf8");
- assertEquals(decoder.write(Buffer.from("E18B", "hex")), "");
- assertEquals(decoder.end(), "\ufffd");
-
- decoder = new StringDecoder("utf8");
- assertEquals(decoder.write(Buffer.from("\ufffd")), "\ufffd");
- assertEquals(decoder.end(), "");
-
- decoder = new StringDecoder("utf8");
- assertEquals(
- decoder.write(Buffer.from("\ufffd\ufffd\ufffd")),
- "\ufffd\ufffd\ufffd",
- );
- assertEquals(decoder.end(), "");
-
- decoder = new StringDecoder("utf8");
- assertEquals(decoder.write(Buffer.from("EFBFBDE2", "hex")), "\ufffd");
- assertEquals(decoder.end(), "\ufffd");
-
- decoder = new StringDecoder("utf8");
- assertEquals(decoder.write(Buffer.from("F1", "hex")), "");
- assertEquals(decoder.write(Buffer.from("41F2", "hex")), "\ufffdA");
- assertEquals(decoder.end(), "\ufffd");
-
- decoder = new StringDecoder("utf8");
- assertEquals(decoder.text(Buffer.from([0x41]), 2), "");
- },
-});
-
-Deno.test({
- name: "String decoder is encoding base64 correctly",
- fn() {
- let decoder;
-
- decoder = new StringDecoder("base64");
- assertEquals(decoder.write(Buffer.from("E1", "hex")), "4Q==");
- assertEquals(decoder.end(), "4QAA");
-
- decoder = new StringDecoder("base64");
- assertEquals(decoder.write(Buffer.from("E18B", "hex")), "4Ys=");
- assertEquals(decoder.end(), "4YsA");
-
- decoder = new StringDecoder("base64");
- assertEquals(decoder.write(Buffer.from("\ufffd")), "77+9");
- assertEquals(decoder.end(), "");
-
- decoder = new StringDecoder("base64");
- assertEquals(
- decoder.write(Buffer.from("\ufffd\ufffd\ufffd")),
- "77+977+977+9",
- );
- assertEquals(decoder.end(), "");
-
- decoder = new StringDecoder("base64");
- assertEquals(decoder.write(Buffer.from("EFBFBDE2", "hex")), "77+94g==");
- assertEquals(decoder.end(), "4gAA");
-
- decoder = new StringDecoder("base64");
- assertEquals(decoder.write(Buffer.from("F1", "hex")), "8Q==");
- assertEquals(decoder.write(Buffer.from("41F2", "hex")), "8UHy");
- assertEquals(decoder.end(), "");
-
- decoder = new StringDecoder("base64");
- assertEquals(decoder.text(Buffer.from([0x41]), 2), "QQ==");
- },
-});
-
-Deno.test({
- name: "String decoder is encoding hex correctly",
- fn() {
- let decoder;
-
- decoder = new StringDecoder("hex");
- assertEquals(decoder.write(Buffer.from("E1", "hex")), "e1");
- assertEquals(decoder.end(), "");
-
- decoder = new StringDecoder("hex");
- assertEquals(decoder.write(Buffer.from("E18B", "hex")), "e18b");
- assertEquals(decoder.end(), "");
-
- decoder = new StringDecoder("hex");
- assertEquals(decoder.write(Buffer.from("\ufffd")), "efbfbd");
- assertEquals(decoder.end(), "");
-
- decoder = new StringDecoder("hex");
- assertEquals(
- decoder.write(Buffer.from("\ufffd\ufffd\ufffd")),
- "efbfbdefbfbdefbfbd",
- );
- assertEquals(decoder.end(), "");
-
- decoder = new StringDecoder("hex");
- assertEquals(decoder.write(Buffer.from("EFBFBDE2", "hex")), "efbfbde2");
- assertEquals(decoder.end(), "");
-
- decoder = new StringDecoder("hex");
- assertEquals(decoder.write(Buffer.from("F1", "hex")), "f1");
- assertEquals(decoder.write(Buffer.from("41F2", "hex")), "41f2");
- assertEquals(decoder.end(), "");
-
- decoder = new StringDecoder("hex");
- assertEquals(decoder.text(Buffer.from([0x41]), 2), "");
- },
-});
diff --git a/std/node/tests/cjs/cjs_a.js b/std/node/tests/cjs/cjs_a.js
deleted file mode 100644
index b2dae2b6b..000000000
--- a/std/node/tests/cjs/cjs_a.js
+++ /dev/null
@@ -1,11 +0,0 @@
-// deno-lint-ignore-file no-undef
-// deno-lint-ignore-file
-const { helloB } = require("./cjs_b.js");
-const C = require("./subdir/cjs_c");
-const leftPad = require("left-pad");
-
-function helloA() {
- return "A";
-}
-
-module.exports = { helloA, helloB, C, leftPad };
diff --git a/std/node/tests/cjs/cjs_b.js b/std/node/tests/cjs/cjs_b.js
deleted file mode 100644
index 2bbf75809..000000000
--- a/std/node/tests/cjs/cjs_b.js
+++ /dev/null
@@ -1,6 +0,0 @@
-function helloB() {
- return "B";
-}
-
-// deno-lint-ignore no-undef
-module.exports = { helloB };
diff --git a/std/node/tests/cjs/cjs_builtin.js b/std/node/tests/cjs/cjs_builtin.js
deleted file mode 100644
index 3a971f605..000000000
--- a/std/node/tests/cjs/cjs_builtin.js
+++ /dev/null
@@ -1,11 +0,0 @@
-// deno-lint-ignore-file no-undef
-// deno-lint-ignore-file
-const fs = require("fs");
-const util = require("util");
-const path = require("path");
-
-module.exports = {
- readFileSync: fs.readFileSync,
- isNull: util.isNull,
- extname: path.extname,
-};
diff --git a/std/node/tests/cjs/cjs_cycle_a.js b/std/node/tests/cjs/cjs_cycle_a.js
deleted file mode 100644
index d73da20b9..000000000
--- a/std/node/tests/cjs/cjs_cycle_a.js
+++ /dev/null
@@ -1,4 +0,0 @@
-// deno-lint-ignore-file no-undef
-module.exports = false;
-require("./cjs_cycle_a");
-module.exports = true;
diff --git a/std/node/tests/cjs/cjs_cycle_b.js b/std/node/tests/cjs/cjs_cycle_b.js
deleted file mode 100644
index bd18094ce..000000000
--- a/std/node/tests/cjs/cjs_cycle_b.js
+++ /dev/null
@@ -1,4 +0,0 @@
-// deno-lint-ignore-file no-undef
-module.exports = false;
-require("./cjs_cycle_b");
-module.exports = true;
diff --git a/std/node/tests/cjs/cjs_throw.js b/std/node/tests/cjs/cjs_throw.js
deleted file mode 100644
index 3def8cc85..000000000
--- a/std/node/tests/cjs/cjs_throw.js
+++ /dev/null
@@ -1,6 +0,0 @@
-function hello() {
- throw new Error("bye");
-}
-
-// deno-lint-ignore no-undef
-module.exports = { hello };
diff --git a/std/node/tests/cjs/dir b/std/node/tests/cjs/dir
deleted file mode 120000
index abec30059..000000000
--- a/std/node/tests/cjs/dir
+++ /dev/null
@@ -1 +0,0 @@
-./subdir/dir \ No newline at end of file
diff --git a/std/node/tests/cjs/index.js b/std/node/tests/cjs/index.js
deleted file mode 100644
index d55928a89..000000000
--- a/std/node/tests/cjs/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-// deno-lint-ignore no-undef
-module.exports = { isIndex: true };
diff --git a/std/node/tests/cjs/subdir/cjs_c.js b/std/node/tests/cjs/subdir/cjs_c.js
deleted file mode 100644
index b24caa0c4..000000000
--- a/std/node/tests/cjs/subdir/cjs_c.js
+++ /dev/null
@@ -1,2 +0,0 @@
-// deno-lint-ignore no-undef
-module.exports = "C";
diff --git a/std/node/tests/cjs/subdir/dir/index.js b/std/node/tests/cjs/subdir/dir/index.js
deleted file mode 100644
index 0b4d11386..000000000
--- a/std/node/tests/cjs/subdir/dir/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-// deno-lint-ignore-file no-undef
-const C = require("../cjs_c");
-
-module.exports = { C };
diff --git a/std/node/tests/node_modules/left-pad/README.md b/std/node/tests/node_modules/left-pad/README.md
deleted file mode 100644
index e86ca7cc5..000000000
--- a/std/node/tests/node_modules/left-pad/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-## left-pad
-
-String left pad
-
-[![Build Status][travis-image]][travis-url]
-
-## Install
-
-```bash
-$ npm install left-pad
-```
-
-## Usage
-
-```js
-const leftPad = require('left-pad')
-
-leftPad('foo', 5)
-// => " foo"
-
-leftPad('foobar', 6)
-// => "foobar"
-
-leftPad(1, 2, '0')
-// => "01"
-
-leftPad(17, 5, 0)
-// => "00017"
-```
-
-**NOTE:** The third argument should be a single `char`. However the module doesn't throw an error if you supply more than one `char`s. See [#28](https://github.com/stevemao/left-pad/pull/28).
-
-**NOTE:** Characters having code points outside of [BMP plan](https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_Multilingual_Plane) are considered a two distinct characters. See [#58](https://github.com/stevemao/left-pad/issues/58).
-
-[travis-image]: https://travis-ci.org/stevemao/left-pad.svg?branch=master
-[travis-url]: https://travis-ci.org/stevemao/left-pad
diff --git a/std/node/tests/node_modules/left-pad/index.js b/std/node/tests/node_modules/left-pad/index.js
deleted file mode 100644
index 8501bca1b..000000000
--- a/std/node/tests/node_modules/left-pad/index.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/* This program is free software. It comes without any warranty, to
- * the extent permitted by applicable law. You can redistribute it
- * and/or modify it under the terms of the Do What The Fuck You Want
- * To Public License, Version 2, as published by Sam Hocevar. See
- * http://www.wtfpl.net/ for more details. */
-"use strict";
-module.exports = leftPad;
-
-var cache = [
- "",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " ",
- " "
-];
-
-function leftPad(str, len, ch) {
- // convert `str` to a `string`
- str = str + "";
- // `len` is the `pad`'s length now
- len = len - str.length;
- // doesn't need to pad
- if (len <= 0) return str;
- // `ch` defaults to `' '`
- if (!ch && ch !== 0) ch = " ";
- // convert `ch` to a `string` cuz it could be a number
- ch = ch + "";
- // cache common use cases
- if (ch === " " && len < 10) return cache[len] + str;
- // `pad` starts with an empty string
- var pad = "";
- // loop
- while (true) {
- // add `ch` to `pad` if `len` is odd
- if (len & 1) pad += ch;
- // divide `len` by 2, ditch the remainder
- len >>= 1;
- // "double" the `ch` so this operation count grows logarithmically on `len`
- // each time `ch` is "doubled", the `len` would need to be "doubled" too
- // similar to finding a value in binary search tree, hence O(log(n))
- if (len) ch += ch;
- // `len` is 0, exit the loop
- else break;
- }
- // pad `str`!
- return pad + str;
-}
diff --git a/std/node/tests/node_modules/left-pad/package.json b/std/node/tests/node_modules/left-pad/package.json
deleted file mode 100644
index 57be04271..000000000
--- a/std/node/tests/node_modules/left-pad/package.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "_from": "left-pad",
- "_id": "left-pad@1.3.0",
- "_inBundle": false,
- "_integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==",
- "_location": "/left-pad",
- "_phantomChildren": {},
- "_requested": {
- "type": "tag",
- "registry": true,
- "raw": "left-pad",
- "name": "left-pad",
- "escapedName": "left-pad",
- "rawSpec": "",
- "saveSpec": null,
- "fetchSpec": "latest"
- },
- "_requiredBy": [
- "#USER",
- "/"
- ],
- "_resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz",
- "_shasum": "5b8a3a7765dfe001261dde915589e782f8c94d1e",
- "_spec": "left-pad",
- "_where": "/Users/kun/Projects/Deno/deno/std/node/tests",
- "author": {
- "name": "azer"
- },
- "bugs": {
- "url": "https://github.com/stevemao/left-pad/issues"
- },
- "bundleDependencies": false,
- "deprecated": "use String.prototype.padStart()",
- "description": "String left pad",
- "devDependencies": {
- "benchmark": "^2.1.0",
- "fast-check": "0.0.8",
- "tape": "*"
- },
- "homepage": "https://github.com/stevemao/left-pad#readme",
- "keywords": [
- "leftpad",
- "left",
- "pad",
- "padding",
- "string",
- "repeat"
- ],
- "license": "WTFPL",
- "main": "index.js",
- "maintainers": [
- {
- "name": "Cameron Westland",
- "email": "camwest@gmail.com"
- }
- ],
- "name": "left-pad",
- "repository": {
- "url": "git+ssh://git@github.com/stevemao/left-pad.git",
- "type": "git"
- },
- "scripts": {
- "bench": "node perf/perf.js",
- "test": "node test"
- },
- "types": "index.d.ts",
- "version": "1.3.0"
-}
diff --git a/std/node/tests/package.json b/std/node/tests/package.json
deleted file mode 100644
index 08c54d588..000000000
--- a/std/node/tests/package.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": "deno_std_node",
- "version": "0.0.1",
- "description": "",
- "main": "index.js",
- "dependencies": {
- "left-pad": "^1.3.0"
- },
- "devDependencies": {},
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
- },
- "author": "",
- "license": "ISC"
-}
diff --git a/std/node/timers.ts b/std/node/timers.ts
deleted file mode 100644
index e81f7e76b..000000000
--- a/std/node/timers.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-// TODO(bartlomieju): implement the 'NodeJS.Timeout' and 'NodeJS.Immediate' versions of the timers.
-// https://github.com/DefinitelyTyped/DefinitelyTyped/blob/1163ead296d84e7a3c80d71e7c81ecbd1a130e9a/types/node/v12/globals.d.ts#L1120-L1131
-export const setTimeout = globalThis.setTimeout;
-export const clearTimeout = globalThis.clearTimeout;
-export const setInterval = globalThis.setInterval;
-export const clearInterval = globalThis.clearInterval;
-export const setImmediate = (
- // deno-lint-ignore no-explicit-any
- cb: (...args: any[]) => void,
- // deno-lint-ignore no-explicit-any
- ...args: any[]
-): number => globalThis.setTimeout(cb, 0, ...args);
-export const clearImmediate = globalThis.clearTimeout;
-
-export default {
- setTimeout,
- clearTimeout,
- setInterval,
- clearInterval,
- setImmediate,
- clearImmediate,
-};
diff --git a/std/node/url.ts b/std/node/url.ts
deleted file mode 100644
index 9d2fbe757..000000000
--- a/std/node/url.ts
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-import {
- CHAR_BACKWARD_SLASH,
- CHAR_FORWARD_SLASH,
- CHAR_LOWERCASE_A,
- CHAR_LOWERCASE_Z,
-} from "../path/_constants.ts";
-import * as path from "./path.ts";
-import { isWindows } from "../_util/os.ts";
-
-const forwardSlashRegEx = /\//g;
-const percentRegEx = /%/g;
-const backslashRegEx = /\\/g;
-const newlineRegEx = /\n/g;
-const carriageReturnRegEx = /\r/g;
-const tabRegEx = /\t/g;
-
-const _url = URL;
-export { _url as URL };
-
-/**
- * Get fully resolved platform-specific file path from the given URL string/ object
- * @param path The file URL string or URL object to convert to a path
- */
-export function fileURLToPath(path: string | URL): string {
- if (typeof path === "string") path = new URL(path);
- else if (!(path instanceof URL)) {
- throw new Deno.errors.InvalidData(
- "invalid argument path , must be a string or URL",
- );
- }
- if (path.protocol !== "file:") {
- throw new Deno.errors.InvalidData("invalid url scheme");
- }
- return isWindows ? getPathFromURLWin(path) : getPathFromURLPosix(path);
-}
-
-function getPathFromURLWin(url: URL): string {
- const hostname = url.hostname;
- let pathname = url.pathname;
- for (let n = 0; n < pathname.length; n++) {
- if (pathname[n] === "%") {
- const third = pathname.codePointAt(n + 2) || 0x20;
- if (
- (pathname[n + 1] === "2" && third === 102) || // 2f 2F /
- (pathname[n + 1] === "5" && third === 99)
- ) {
- // 5c 5C \
- throw new Deno.errors.InvalidData(
- "must not include encoded \\ or / characters",
- );
- }
- }
- }
-
- pathname = pathname.replace(forwardSlashRegEx, "\\");
- pathname = decodeURIComponent(pathname);
- if (hostname !== "") {
- // TODO(bartlomieju): add support for punycode encodings
- return `\\\\${hostname}${pathname}`;
- } else {
- // Otherwise, it's a local path that requires a drive letter
- const letter = pathname.codePointAt(1)! | 0x20;
- const sep = pathname[2];
- if (
- letter < CHAR_LOWERCASE_A ||
- letter > CHAR_LOWERCASE_Z || // a..z A..Z
- sep !== ":"
- ) {
- throw new Deno.errors.InvalidData("file url path must be absolute");
- }
- return pathname.slice(1);
- }
-}
-
-function getPathFromURLPosix(url: URL): string {
- if (url.hostname !== "") {
- throw new Deno.errors.InvalidData("invalid file url hostname");
- }
- const pathname = url.pathname;
- for (let n = 0; n < pathname.length; n++) {
- if (pathname[n] === "%") {
- const third = pathname.codePointAt(n + 2) || 0x20;
- if (pathname[n + 1] === "2" && third === 102) {
- throw new Deno.errors.InvalidData(
- "must not include encoded / characters",
- );
- }
- }
- }
- return decodeURIComponent(pathname);
-}
-
-/** Get fully resolved platform-specific File URL from the given file path */
-export function pathToFileURL(filepath: string): URL {
- let resolved = path.resolve(filepath);
- // path.resolve strips trailing slashes so we must add them back
- const filePathLast = filepath.charCodeAt(filepath.length - 1);
- if (
- (filePathLast === CHAR_FORWARD_SLASH ||
- (isWindows && filePathLast === CHAR_BACKWARD_SLASH)) &&
- resolved[resolved.length - 1] !== path.sep
- ) {
- resolved += "/";
- }
- const outURL = new URL("file://");
- if (resolved.includes("%")) resolved = resolved.replace(percentRegEx, "%25");
- // In posix, "/" is a valid character in paths
- if (!isWindows && resolved.includes("\\")) {
- resolved = resolved.replace(backslashRegEx, "%5C");
- }
- if (resolved.includes("\n")) resolved = resolved.replace(newlineRegEx, "%0A");
- if (resolved.includes("\r")) {
- resolved = resolved.replace(carriageReturnRegEx, "%0D");
- }
- if (resolved.includes("\t")) resolved = resolved.replace(tabRegEx, "%09");
- outURL.pathname = resolved;
- return outURL;
-}
-
-export default {
- fileURLToPath,
- pathToFileURL,
- URL,
-};
diff --git a/std/node/url_test.ts b/std/node/url_test.ts
deleted file mode 100644
index 7da8e3bb4..000000000
--- a/std/node/url_test.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import { assertEquals } from "../testing/asserts.ts";
-import * as url from "./url.ts";
-
-Deno.test({
- name: "[url] URL",
- fn() {
- assertEquals(url.URL, URL);
- },
-});
diff --git a/std/node/util.ts b/std/node/util.ts
deleted file mode 100644
index cbc1e11c5..000000000
--- a/std/node/util.ts
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-export { promisify } from "./_util/_util_promisify.ts";
-export { callbackify } from "./_util/_util_callbackify.ts";
-import { ERR_INVALID_ARG_TYPE, ERR_OUT_OF_RANGE, errorMap } from "./_errors.ts";
-import * as types from "./_util/_util_types.ts";
-export { types };
-
-const NumberIsSafeInteger = Number.isSafeInteger;
-
-const DEFAULT_INSPECT_OPTIONS = {
- showHidden: false,
- depth: 2,
- colors: false,
- customInspect: true,
- showProxy: false,
- maxArrayLength: 100,
- maxStringLength: Infinity,
- breakLength: 80,
- compact: 3,
- sorted: false,
- getters: false,
-};
-
-inspect.defaultOptions = DEFAULT_INSPECT_OPTIONS;
-inspect.custom = Deno.customInspect;
-
-// TODO(schwarzkopfb): make it in-line with Node's implementation
-// Ref: https://nodejs.org/dist/latest-v14.x/docs/api/util.html#util_util_inspect_object_options
-// deno-lint-ignore no-explicit-any
-export function inspect(object: unknown, ...opts: any): string {
- opts = { ...DEFAULT_INSPECT_OPTIONS, ...opts };
- return Deno.inspect(object, {
- depth: opts.depth,
- iterableLimit: opts.maxArrayLength,
- compact: !!opts.compact,
- sorted: !!opts.sorted,
- showProxy: !!opts.showProxy,
- });
-}
-
-/** @deprecated - use `Array.isArray()` instead. */
-export function isArray(value: unknown): boolean {
- return Array.isArray(value);
-}
-
-/** @deprecated - use `typeof value === "boolean" || value instanceof Boolean` instead. */
-export function isBoolean(value: unknown): boolean {
- return typeof value === "boolean" || value instanceof Boolean;
-}
-
-/** @deprecated - use `value === null` instead. */
-export function isNull(value: unknown): boolean {
- return value === null;
-}
-
-/** @deprecated - use `value === null || value === undefined` instead. */
-export function isNullOrUndefined(value: unknown): boolean {
- return value === null || value === undefined;
-}
-
-/** @deprecated - use `typeof value === "number" || value instanceof Number` instead. */
-export function isNumber(value: unknown): boolean {
- return typeof value === "number" || value instanceof Number;
-}
-
-/** @deprecated - use `typeof value === "string" || value instanceof String` instead. */
-export function isString(value: unknown): boolean {
- return typeof value === "string" || value instanceof String;
-}
-
-/** @deprecated - use `typeof value === "symbol"` instead. */
-export function isSymbol(value: unknown): boolean {
- return typeof value === "symbol";
-}
-
-/** @deprecated - use `value === undefined` instead. */
-export function isUndefined(value: unknown): boolean {
- return value === undefined;
-}
-
-/** @deprecated - use `value !== null && typeof value === "object"` instead. */
-export function isObject(value: unknown): boolean {
- return value !== null && typeof value === "object";
-}
-
-/** @deprecated - use `e instanceof Error` instead. */
-export function isError(e: unknown): boolean {
- return e instanceof Error;
-}
-
-/** @deprecated - use `typeof value === "function"` instead. */
-export function isFunction(value: unknown): boolean {
- return typeof value === "function";
-}
-
-/** @deprecated - use `value instanceof RegExp` instead. */
-export function isRegExp(value: unknown): boolean {
- return value instanceof RegExp;
-}
-
-/** @deprecated - use `value === null || (typeof value !== "object" && typeof value !== "function")` instead. */
-export function isPrimitive(value: unknown): boolean {
- return (
- value === null || (typeof value !== "object" && typeof value !== "function")
- );
-}
-
-/**
- * Returns a system error name from an error code number.
- * @param code error code number
- */
-export function getSystemErrorName(code: number): string | undefined {
- if (typeof code !== "number") {
- throw new ERR_INVALID_ARG_TYPE("err", "number", code);
- }
- if (code >= 0 || !NumberIsSafeInteger(code)) {
- throw new ERR_OUT_OF_RANGE("err", "a negative integer", code);
- }
- return errorMap.get(code)?.[0];
-}
-
-/**
- * https://nodejs.org/api/util.html#util_util_deprecate_fn_msg_code
- * @param _code This implementation of deprecate won't apply the deprecation code
- */
-export function deprecate<A extends Array<unknown>, B>(
- this: unknown,
- callback: (...args: A) => B,
- msg: string,
- _code?: string,
-) {
- return function (this: unknown, ...args: A) {
- console.warn(msg);
- return callback.apply(this, args);
- };
-}
-
-import { _TextDecoder, _TextEncoder } from "./_utils.ts";
-
-/** The global TextDecoder */
-export type TextDecoder = import("./_utils.ts")._TextDecoder;
-export const TextDecoder = _TextDecoder;
-
-/** The global TextEncoder */
-export type TextEncoder = import("./_utils.ts")._TextEncoder;
-export const TextEncoder = _TextEncoder;
-
-export default {
- inspect,
- isArray,
- isBoolean,
- isNull,
- isNullOrUndefined,
- isNumber,
- isString,
- isSymbol,
- isUndefined,
- isObject,
- isError,
- isFunction,
- isRegExp,
- isPrimitive,
- getSystemErrorName,
- deprecate,
- TextDecoder,
- TextEncoder,
-};
diff --git a/std/node/util_test.ts b/std/node/util_test.ts
deleted file mode 100644
index 893994559..000000000
--- a/std/node/util_test.ts
+++ /dev/null
@@ -1,247 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-
-import {
- assert,
- assertEquals,
- assertStrictEquals,
- assertThrows,
-} from "../testing/asserts.ts";
-import { stripColor } from "../fmt/colors.ts";
-import * as util from "./util.ts";
-
-Deno.test({
- name: "[util] inspect",
- fn() {
- assertEquals(stripColor(util.inspect({ foo: 123 })), "{ foo: 123 }");
- },
-});
-
-Deno.test({
- name: "[util] isBoolean",
- fn() {
- assert(util.isBoolean(true));
- assert(util.isBoolean(new Boolean()));
- assert(util.isBoolean(new Boolean(true)));
- assert(util.isBoolean(false));
- assert(!util.isBoolean("deno"));
- assert(!util.isBoolean("true"));
- },
-});
-
-Deno.test({
- name: "[util] isNull",
- fn() {
- let n;
- assert(util.isNull(null));
- assert(!util.isNull(n));
- assert(!util.isNull(0));
- assert(!util.isNull({}));
- },
-});
-
-Deno.test({
- name: "[util] isNullOrUndefined",
- fn() {
- let n;
- assert(util.isNullOrUndefined(null));
- assert(util.isNullOrUndefined(n));
- assert(!util.isNullOrUndefined({}));
- assert(!util.isNullOrUndefined("undefined"));
- },
-});
-
-Deno.test({
- name: "[util] isNumber",
- fn() {
- assert(util.isNumber(666));
- assert(util.isNumber(new Number(666)));
- assert(!util.isNumber("999"));
- assert(!util.isNumber(null));
- },
-});
-
-Deno.test({
- name: "[util] isString",
- fn() {
- assert(util.isString("deno"));
- assert(util.isString(new String("DIO")));
- assert(!util.isString(1337));
- },
-});
-
-Deno.test({
- name: "[util] isSymbol",
- fn() {
- assert(util.isSymbol(Symbol()));
- assert(!util.isSymbol(123));
- assert(!util.isSymbol("string"));
- },
-});
-
-Deno.test({
- name: "[util] isUndefined",
- fn() {
- let t;
- assert(util.isUndefined(t));
- assert(!util.isUndefined("undefined"));
- assert(!util.isUndefined({}));
- },
-});
-
-Deno.test({
- name: "[util] isObject",
- fn() {
- const dio = { stand: "Za Warudo" };
- assert(util.isObject(dio));
- assert(util.isObject(new RegExp(/Toki Wo Tomare/)));
- assert(!util.isObject("Jotaro"));
- },
-});
-
-Deno.test({
- name: "[util] isError",
- fn() {
- const java = new Error();
- const nodejs = new TypeError();
- const deno = "Future";
- assert(util.isError(java));
- assert(util.isError(nodejs));
- assert(!util.isError(deno));
- },
-});
-
-Deno.test({
- name: "[util] isFunction",
- fn() {
- const f = function (): void {};
- assert(util.isFunction(f));
- assert(!util.isFunction({}));
- assert(!util.isFunction(new RegExp(/f/)));
- },
-});
-
-Deno.test({
- name: "[util] isRegExp",
- fn() {
- assert(util.isRegExp(new RegExp(/f/)));
- assert(util.isRegExp(/fuManchu/));
- assert(!util.isRegExp({ evil: "eye" }));
- assert(!util.isRegExp(null));
- },
-});
-
-Deno.test({
- name: "[util] isArray",
- fn() {
- assert(util.isArray([]));
- assert(!util.isArray({ yaNo: "array" }));
- assert(!util.isArray(null));
- },
-});
-
-Deno.test({
- name: "[util] isPrimitive",
- fn() {
- const stringType = "hasti";
- const booleanType = true;
- const integerType = 2;
- const symbolType = Symbol("anything");
-
- const functionType = function doBest(): void {};
- const objectType = { name: "ali" };
- const arrayType = [1, 2, 3];
-
- assert(util.isPrimitive(stringType));
- assert(util.isPrimitive(booleanType));
- assert(util.isPrimitive(integerType));
- assert(util.isPrimitive(symbolType));
- assert(util.isPrimitive(null));
- assert(util.isPrimitive(undefined));
- assert(!util.isPrimitive(functionType));
- assert(!util.isPrimitive(arrayType));
- assert(!util.isPrimitive(objectType));
- },
-});
-
-Deno.test({
- name: "[util] TextDecoder",
- fn() {
- assert(util.TextDecoder === TextDecoder);
- const td: util.TextDecoder = new util.TextDecoder();
- assert(td instanceof TextDecoder);
- },
-});
-
-Deno.test({
- name: "[util] TextEncoder",
- fn() {
- assert(util.TextEncoder === TextEncoder);
- const te: util.TextEncoder = new util.TextEncoder();
- assert(te instanceof TextEncoder);
- },
-});
-
-Deno.test({
- name: "[util] isDate",
- fn() {
- // Test verifies the method is exposed. See _util/_util_types_test for details
- assert(util.types.isDate(new Date()));
- },
-});
-
-Deno.test({
- name: "[util] getSystemErrorName()",
- fn() {
- type FnTestInvalidArg = (code?: unknown) => void;
-
- assertThrows(
- () => (util.getSystemErrorName as FnTestInvalidArg)(),
- TypeError,
- );
- assertThrows(
- () => (util.getSystemErrorName as FnTestInvalidArg)(1),
- RangeError,
- );
-
- assertStrictEquals(util.getSystemErrorName(-424242), undefined);
-
- switch (Deno.build.os) {
- case "windows":
- assertStrictEquals(util.getSystemErrorName(-4091), "EADDRINUSE");
- break;
-
- case "darwin":
- assertStrictEquals(util.getSystemErrorName(-48), "EADDRINUSE");
- break;
-
- case "linux":
- assertStrictEquals(util.getSystemErrorName(-98), "EADDRINUSE");
- break;
- }
- },
-});
-
-Deno.test("[util] deprecate", () => {
- const warn = console.warn.bind(null);
-
- let output;
- console.warn = function (str: string) {
- output = str;
- warn(output);
- };
-
- const message = "x is deprecated";
-
- const expected = 12;
- let result;
- const x = util.deprecate(() => {
- result = expected;
- }, message);
-
- x();
-
- assertEquals(expected, result);
- assertEquals(output, message);
-
- console.warn = warn;
-});