From 5831295859122e5a246f31d6b92c8d5e8b551d5e Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Tue, 10 Aug 2021 12:51:00 +0200 Subject: [PATCH] Require Node.js 12.20 and move to ESM --- .github/workflows/main.yml | 1 - index.d.ts | 160 +++++++++++++++++++------------------ index.js | 49 ++++++------ index.test-d.ts | 36 ++++++--- package.json | 14 ++-- readme.md | 12 +-- test.js | 90 +++++++++++---------- 7 files changed, 192 insertions(+), 170 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 25f24ef..441975c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -11,7 +11,6 @@ jobs: matrix: node-version: - 16 - - 14 steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 diff --git a/index.d.ts b/index.d.ts index eee2e83..df994e0 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,79 +1,81 @@ -import * as stream from 'stream'; - -declare const isStream: { - /** - @returns Whether `stream` is a [`Stream`](https://nodejs.org/api/stream.html#stream_stream). - - @example - ``` - import * as fs from 'fs'; - import isStream = require('is-stream'); - - isStream(fs.createReadStream('unicorn.png')); - //=> true - - isStream({}); - //=> false - ``` - */ - (stream: unknown): stream is stream.Stream; - - /** - @returns Whether `stream` is a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable). - - @example - ``` - import * as fs from 'fs'; - import isStream = require('is-stream'); - - isStream.writable(fs.createWriteStrem('unicorn.txt')); - //=> true - ``` - */ - writable(stream: unknown): stream is stream.Writable; - - /** - @returns Whether `stream` is a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_class_stream_readable). - - @example - ``` - import * as fs from 'fs'; - import isStream = require('is-stream'); - - isStream.readable(fs.createReadStream('unicorn.png')); - //=> true - ``` - */ - readable(stream: unknown): stream is stream.Readable; - - /** - @returns Whether `stream` is a [`stream.Duplex`](https://nodejs.org/api/stream.html#stream_class_stream_duplex). - - @example - ``` - import {Duplex} from 'stream'; - import isStream = require('is-stream'); - - isStream.duplex(new Duplex()); - //=> true - ``` - */ - duplex(stream: unknown): stream is stream.Duplex; - - /** - @returns Whether `stream` is a [`stream.Transform`](https://nodejs.org/api/stream.html#stream_class_stream_transform). - - @example - ``` - import * as fs from 'fs'; - import Stringify = require('streaming-json-stringify'); - import isStream = require('is-stream'); - - isStream.transform(Stringify()); - //=> true - ``` - */ - transform(input: unknown): input is stream.Transform; -}; - -export = isStream; +import { + Stream, + Writable as WritableStream, + Readable as ReadableStream, + Duplex as DuplexStream, + Transform as TransformStream, +} from 'node:stream'; + +/** +@returns Whether `stream` is a [`Stream`](https://nodejs.org/api/stream.html#stream_stream). + +@example +``` +import fs from 'node:fs'; +import {isStream} from 'is-stream'; + +isStream(fs.createReadStream('unicorn.png')); +//=> true + +isStream({}); +//=> false +``` +*/ +export function isStream(stream: unknown): stream is Stream; + +/** +@returns Whether `stream` is a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable). + +@example +``` +import fs from 'node:fs'; +import {isWritableStream} from 'is-stream'; + +isWritableStream(fs.createWriteStrem('unicorn.txt')); +//=> true +``` +*/ +export function isWritableStream(stream: unknown): stream is WritableStream; + +/** +@returns Whether `stream` is a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_class_stream_readable). + +@example +``` +import fs from 'node:fs'; +import {isReadableStream} from 'is-stream'; + +isReadableStream(fs.createReadStream('unicorn.png')); +//=> true +``` +*/ +export function isReadableStream(stream: unknown): stream is ReadableStream; + +/** +@returns Whether `stream` is a [`stream.Duplex`](https://nodejs.org/api/stream.html#stream_class_stream_duplex). + +@example +``` +import {Duplex as DuplexStream} from 'node:stream'; +import {isDuplexStream} from 'is-stream'; + +isDuplexStream(new DuplexStream()); +//=> true +``` +*/ +export function isDuplexStream(stream: unknown): stream is DuplexStream; + +/** +@returns Whether `stream` is a [`stream.Transform`](https://nodejs.org/api/stream.html#stream_class_stream_transform). + +@example +``` +import fs from 'node:fs'; +import StringifyStream from 'streaming-json-stringify'; +import {isTransformStream} from 'is-stream'; + +isTransformStream(StringifyStream()); +//=> true +``` +*/ +export function isTransformStream(stream: unknown): stream is TransformStream; diff --git a/index.js b/index.js index 2e43434..887e601 100644 --- a/index.js +++ b/index.js @@ -1,28 +1,29 @@ -'use strict'; +export function isStream(stream) { + return stream !== null + && typeof stream === 'object' + && typeof stream.pipe === 'function'; +} -const isStream = stream => - stream !== null && - typeof stream === 'object' && - typeof stream.pipe === 'function'; +export function isWritableStream(stream) { + return isStream(stream) + && stream.writable !== false + && typeof stream._write === 'function' + && typeof stream._writableState === 'object'; +} -isStream.writable = stream => - isStream(stream) && - stream.writable !== false && - typeof stream._write === 'function' && - typeof stream._writableState === 'object'; +export function isReadableStream(stream) { + return isStream(stream) + && stream.readable !== false + && typeof stream._read === 'function' + && typeof stream._readableState === 'object'; +} -isStream.readable = stream => - isStream(stream) && - stream.readable !== false && - typeof stream._read === 'function' && - typeof stream._readableState === 'object'; +export function isDuplexStream(stream) { + return isWritableStream(stream) + && isReadableStream(stream); +} -isStream.duplex = stream => - isStream.writable(stream) && - isStream.readable(stream); - -isStream.transform = stream => - isStream.duplex(stream) && - typeof stream._transform === 'function'; - -module.exports = isStream; +export function isTransformStream(stream) { + return isDuplexStream(stream) + && typeof stream._transform === 'function'; +} diff --git a/index.test-d.ts b/index.test-d.ts index 234c632..cab00b2 100644 --- a/index.test-d.ts +++ b/index.test-d.ts @@ -1,25 +1,37 @@ -import {expectType} from 'tsd'; -import * as stream from 'stream'; -import isStream = require('.'); +import { + Stream, + Writable as WritableStream, + Readable as ReadableStream, + Duplex as DuplexStream, + Transform as TransformStream, +} from 'node:stream'; +import {expectAssignable} from 'tsd'; +import { + isStream, + isWritableStream, + isReadableStream, + isDuplexStream, + isTransformStream, +} from './index.js'; const foo = ''; if (isStream(foo)) { - expectType(foo); + expectAssignable(foo); } -if (isStream.writable(foo)) { - expectType(foo); +if (isWritableStream(foo)) { + expectAssignable(foo); } -if (isStream.readable(foo)) { - expectType(foo); +if (isReadableStream(foo)) { + expectAssignable(foo); } -if (isStream.duplex(foo)) { - expectType(new stream.Duplex()); +if (isDuplexStream(foo)) { + expectAssignable(new DuplexStream()); } -if (isStream.transform(foo)) { - expectType(foo); +if (isTransformStream(foo)) { + expectAssignable(foo); } diff --git a/package.json b/package.json index c3b5673..8cc9f4e 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,10 @@ "email": "sindresorhus@gmail.com", "url": "https://sindresorhus.com" }, + "type": "module", + "exports": "./index.js", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "scripts": { "test": "xo && ava && tsd" @@ -33,10 +35,10 @@ "is" ], "devDependencies": { - "@types/node": "^11.13.6", - "ava": "^1.4.1", - "tempy": "^0.3.0", - "tsd": "^0.7.2", - "xo": "^0.24.0" + "@types/node": "^16.4.13", + "ava": "^3.15.0", + "tempy": "^1.0.1", + "tsd": "^0.17.0", + "xo": "^0.44.0" } } diff --git a/readme.md b/readme.md index 19308e7..c6f8c1b 100644 --- a/readme.md +++ b/readme.md @@ -11,8 +11,8 @@ $ npm install is-stream ## Usage ```js -const fs = require('fs'); -const isStream = require('is-stream'); +import fs from 'node:fs'; +import {isStream} from 'is-stream'; isStream(fs.createReadStream('unicorn.png')); //=> true @@ -27,19 +27,19 @@ isStream({}); Returns a `boolean` for whether it's a [`Stream`](https://nodejs.org/api/stream.html#stream_stream). -#### isStream.writable(stream) +#### isWritableStream(stream) Returns a `boolean` for whether it's a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable). -#### isStream.readable(stream) +#### isReadableStream(stream) Returns a `boolean` for whether it's a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_class_stream_readable). -#### isStream.duplex(stream) +#### isDuplexStream(stream) Returns a `boolean` for whether it's a [`stream.Duplex`](https://nodejs.org/api/stream.html#stream_class_stream_duplex). -#### isStream.transform(stream) +#### isTransformStream(stream) Returns a `boolean` for whether it's a [`stream.Transform`](https://nodejs.org/api/stream.html#stream_class_stream_transform). diff --git a/test.js b/test.js index 6cf9653..92e79d3 100644 --- a/test.js +++ b/test.js @@ -1,9 +1,15 @@ -import fs from 'fs'; -import Stream from 'stream'; -import net from 'net'; +import fs from 'node:fs'; +import Stream from 'node:stream'; +import net from 'node:net'; import test from 'ava'; import tempy from 'tempy'; -import isStream from '.'; +import { + isStream, + isWritableStream, + isReadableStream, + isDuplexStream, + isTransformStream, +} from './index.js'; test('isStream()', t => { t.true(isStream(new Stream.Stream())); @@ -21,48 +27,48 @@ test('isStream()', t => { t.false(isStream('')); }); -test('isStream.writable()', t => { - t.true(isStream.writable(new Stream.Writable())); - t.true(isStream.writable(new Stream.Duplex())); - t.true(isStream.writable(new Stream.Transform())); - t.true(isStream.writable(new Stream.PassThrough())); - t.true(isStream.writable(fs.createWriteStream(tempy.file()))); - t.true(isStream.writable(new net.Socket())); - t.false(isStream.writable(new Stream.Stream())); - t.false(isStream.writable(new Stream.Readable())); - t.false(isStream.writable(fs.createReadStream('test.js'))); +test('isWritableStream()', t => { + t.true(isWritableStream(new Stream.Writable())); + t.true(isWritableStream(new Stream.Duplex())); + t.true(isWritableStream(new Stream.Transform())); + t.true(isWritableStream(new Stream.PassThrough())); + t.true(isWritableStream(fs.createWriteStream(tempy.file()))); + t.true(isWritableStream(new net.Socket())); + t.false(isWritableStream(new Stream.Stream())); + t.false(isWritableStream(new Stream.Readable())); + t.false(isWritableStream(fs.createReadStream('test.js'))); }); -test('isStream.readable()', t => { - t.true(isStream.readable(new Stream.Readable())); - t.true(isStream.readable(new Stream.Duplex())); - t.true(isStream.readable(new Stream.Transform())); - t.true(isStream.readable(new Stream.PassThrough())); - t.true(isStream.readable(fs.createReadStream('test.js'))); - t.true(isStream.readable(new net.Socket())); - t.false(isStream.readable(new Stream.Stream())); - t.false(isStream.readable(new Stream.Writable())); - t.false(isStream.readable(fs.createWriteStream(tempy.file()))); +test('isReadableStream()', t => { + t.true(isReadableStream(new Stream.Readable())); + t.true(isReadableStream(new Stream.Duplex())); + t.true(isReadableStream(new Stream.Transform())); + t.true(isReadableStream(new Stream.PassThrough())); + t.true(isReadableStream(fs.createReadStream('test.js'))); + t.true(isReadableStream(new net.Socket())); + t.false(isReadableStream(new Stream.Stream())); + t.false(isReadableStream(new Stream.Writable())); + t.false(isReadableStream(fs.createWriteStream(tempy.file()))); }); -test('isStream.duplex()', t => { - t.true(isStream.duplex(new Stream.Duplex())); - t.true(isStream.duplex(new Stream.Transform())); - t.true(isStream.duplex(new Stream.PassThrough())); - t.false(isStream.duplex(new Stream.Stream())); - t.false(isStream.duplex(new Stream.Readable())); - t.false(isStream.duplex(new Stream.Writable())); - t.false(isStream.duplex(fs.createReadStream('test.js'))); - t.false(isStream.duplex(fs.createWriteStream(tempy.file()))); +test('isDuplexStream()', t => { + t.true(isDuplexStream(new Stream.Duplex())); + t.true(isDuplexStream(new Stream.Transform())); + t.true(isDuplexStream(new Stream.PassThrough())); + t.false(isDuplexStream(new Stream.Stream())); + t.false(isDuplexStream(new Stream.Readable())); + t.false(isDuplexStream(new Stream.Writable())); + t.false(isDuplexStream(fs.createReadStream('test.js'))); + t.false(isDuplexStream(fs.createWriteStream(tempy.file()))); }); -test('isStream.transform()', t => { - t.true(isStream.transform(new Stream.Transform())); - t.true(isStream.transform(new Stream.PassThrough())); - t.false(isStream.transform(new Stream.Duplex())); - t.false(isStream.transform(new Stream.Stream())); - t.false(isStream.transform(new Stream.Readable())); - t.false(isStream.transform(new Stream.Writable())); - t.false(isStream.transform(fs.createReadStream('test.js'))); - t.false(isStream.transform(fs.createWriteStream(tempy.file()))); +test('isTransformStream()', t => { + t.true(isTransformStream(new Stream.Transform())); + t.true(isTransformStream(new Stream.PassThrough())); + t.false(isTransformStream(new Stream.Duplex())); + t.false(isTransformStream(new Stream.Stream())); + t.false(isTransformStream(new Stream.Readable())); + t.false(isTransformStream(new Stream.Writable())); + t.false(isTransformStream(fs.createReadStream('test.js'))); + t.false(isTransformStream(fs.createWriteStream(tempy.file()))); });