Skip to content

Commit

Permalink
Refactor TypeScript definition to CommonJS compatible export (#31)
Browse files Browse the repository at this point in the history
  • Loading branch information
BendingBender authored and sindresorhus committed Apr 5, 2019
1 parent e53a3f4 commit 0c3b07d
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 54 deletions.
126 changes: 84 additions & 42 deletions index.d.ts
@@ -1,66 +1,108 @@
/// <reference types="node"/>
import {Stream} from 'stream';

export interface Options {
/**
* Maximum length of the returned string. If it exceeds this value before the stream ends, the promise will be rejected with a `MaxBufferError` error.
*
* @default Infinity
*/
readonly maxBuffer?: number;
declare class MaxBufferErrorClass extends Error {
readonly name: 'MaxBufferError';
constructor();
}

export interface OptionsWithEncoding<EncodingType = BufferEncoding>
extends Options {
/**
* [Encoding](https://nodejs.org/api/buffer.html#buffer_buffer) of the incoming stream.
*
* @default 'utf8'
*/
readonly encoding?: EncodingType;
declare namespace getStream {
interface Options {
/**
Maximum length of the returned string. If it exceeds this value before the stream ends, the promise will be rejected with a `MaxBufferError` error.
@default Infinity
*/
readonly maxBuffer?: number;
}

interface OptionsWithEncoding<EncodingType = BufferEncoding> extends Options {
/**
[Encoding](https://nodejs.org/api/buffer.html#buffer_buffer) of the incoming stream.
@default 'utf8'
*/
readonly encoding?: EncodingType;
}

type MaxBufferError = MaxBufferErrorClass;
}

declare const getStream: {
/**
* Get the `stream` as a string.
*
* @returns A promise that resolves when the end event fires on the stream, indicating that there is no more data to be read. The stream is switched to flowing mode.
*/
(stream: Stream, options?: OptionsWithEncoding): Promise<string>;
Get the `stream` as a string.
@returns A promise that resolves when the end event fires on the stream, indicating that there is no more data to be read. The stream is switched to flowing mode.
@example
```
import * as fs from 'fs';
import getStream = require('get-stream');
(async () => {
const stream = fs.createReadStream('unicorn.txt');
console.log(await getStream(stream));
// ,,))))))));,
// __)))))))))))))),
// \|/ -\(((((''''((((((((.
// -*-==//////(('' . `)))))),
// /|\ ))| o ;-. '((((( ,(,
// ( `| / ) ;))))' ,_))^;(~
// | | | ,))((((_ _____------~~~-. %,;(;(>';'~
// o_); ; )))(((` ~---~ `:: \ %%~~)(v;(`('~
// ; ''''```` `: `:::|\,__,%% );`'; ~
// | _ ) / `:|`----' `-'
// ______/\/~ | / /
// /~;;.____/;;' / ___--,-( `;;;/
// / // _;______;'------~~~~~ /;;/\ /
// // | | / ; \;;,\
// (<_ | ; /',/-----' _>
// \_| ||_ //~;~~~~~~~~~
// `\_| (,~~
// \~\
// ~~
})();
```
*/
(stream: Stream, options?: getStream.OptionsWithEncoding): Promise<string>;

/**
* Get the `stream` as a buffer.
*
* It honors the `maxBuffer` option as above, but it refers to byte length rather than string length.
*/
buffer(stream: Stream, options?: OptionsWithEncoding): Promise<Buffer>;
Get the `stream` as a buffer.
It honors the `maxBuffer` option as above, but it refers to byte length rather than string length.
*/
buffer(
stream: Stream,
options?: getStream.OptionsWithEncoding
): Promise<Buffer>;

/**
* Get the `stream` as an array of values.
*
* It honors both the `maxBuffer` and `encoding` options. The behavior changes slightly based on the encoding chosen:
*
* - When `encoding` is unset, it assumes an [object mode stream](https://nodesource.com/blog/understanding-object-streams/) and collects values emitted from `stream` unmodified. In this case `maxBuffer` refers to the number of items in the array (not the sum of their sizes).
* - When `encoding` is set to `buffer`, it collects an array of buffers. `maxBuffer` refers to the summed byte lengths of every buffer in the array.
* - When `encoding` is set to anything else, it collects an array of strings. `maxBuffer` refers to the summed character lengths of every string in the array.
*/
Get the `stream` as an array of values.
It honors both the `maxBuffer` and `encoding` options. The behavior changes slightly based on the encoding chosen:
- When `encoding` is unset, it assumes an [object mode stream](https://nodesource.com/blog/understanding-object-streams/) and collects values emitted from `stream` unmodified. In this case `maxBuffer` refers to the number of items in the array (not the sum of their sizes).
- When `encoding` is set to `buffer`, it collects an array of buffers. `maxBuffer` refers to the summed byte lengths of every buffer in the array.
- When `encoding` is set to anything else, it collects an array of strings. `maxBuffer` refers to the summed character lengths of every string in the array.
*/
array<StreamObjectModeType = unknown>(
stream: Stream,
options?: Options
options?: getStream.Options
): Promise<StreamObjectModeType[]>;
array(
stream: Stream,
options: OptionsWithEncoding<'buffer'>
options: getStream.OptionsWithEncoding<'buffer'>
): Promise<Buffer[]>;
array(
stream: Stream,
options: OptionsWithEncoding<BufferEncoding>
options: getStream.OptionsWithEncoding<BufferEncoding>
): Promise<string[]>;
};

export default getStream;
MaxBufferError: typeof MaxBufferErrorClass;

export class MaxBufferError extends Error {
readonly name: 'MaxBufferError';
constructor();
}
// TODO: Remove this for the next major release
default: typeof getStream;
};

export = getStream;
1 change: 1 addition & 0 deletions index.js
Expand Up @@ -51,6 +51,7 @@ async function getStream(inputStream, options) {
}

module.exports = getStream;
// TODO: Remove this for the next major release
module.exports.default = getStream;
module.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'});
module.exports.array = (stream, options) => getStream(stream, {...options, array: true});
Expand Down
8 changes: 5 additions & 3 deletions index.test-d.ts
@@ -1,6 +1,7 @@
import * as fs from 'fs';
import {expectType} from 'tsd-check';
import getStream, {MaxBufferError} from '.';
import {expectType} from 'tsd';
import getStream = require('.');
import {MaxBufferError} from '.';

const stream = fs.createReadStream('foo');

Expand All @@ -24,4 +25,5 @@ expectType<Promise<string[]>>(
getStream.array(stream, {maxBuffer: 10, encoding: 'utf8'})
);

expectType<typeof MaxBufferError>(MaxBufferError);
const maxBufferError = new MaxBufferError();
expectType<MaxBufferError>(maxBufferError);
10 changes: 5 additions & 5 deletions package.json
Expand Up @@ -13,7 +13,7 @@
"node": ">=8"
},
"scripts": {
"test": "xo && ava && tsd-check"
"test": "xo && ava && tsd"
},
"files": [
"index.js",
Expand All @@ -40,10 +40,10 @@
"pump": "^3.0.0"
},
"devDependencies": {
"@types/node": "^11.10.5",
"ava": "^1.3.1",
"into-stream": "^4.0.0",
"tsd-check": "^0.3.0",
"@types/node": "^11.13.0",
"ava": "^1.4.1",
"into-stream": "^5.0.0",
"tsd": "^0.7.2",
"xo": "^0.24.0"
}
}
8 changes: 4 additions & 4 deletions test.js
Expand Up @@ -12,7 +12,7 @@ function makeSetup(intoStream) {
}

const setup = makeSetup(intoStream);
setup.obj = makeSetup(intoStream.obj);
setup.object = makeSetup(intoStream.object);

test('get stream as a buffer', async t => {
t.true((await getStream.buffer(fs.createReadStream('fixture'))).equals(Buffer.from('unicorn\n')));
Expand All @@ -25,7 +25,7 @@ test('get stream as an array', async t => {
});

test('get object stream as an array', async t => {
const result = await setup.obj.array([{foo: true}, {bar: false}]);
const result = await setup.object.array([{foo: true}, {bar: false}]);
t.deepEqual(result, [{foo: true}, {bar: false}]);
});

Expand Down Expand Up @@ -55,8 +55,8 @@ test('maxBuffer throws when size is exceeded', async t => {
});

test('maxBuffer applies to length of arrays when in objectMode', async t => {
await t.throwsAsync(getStream.array(intoStream.obj([{a: 1}, {b: 2}, {c: 3}, {d: 4}]), {maxBuffer: 3}), /maxBuffer exceeded/);
await t.notThrowsAsync(getStream.array(intoStream.obj([{a: 1}, {b: 2}, {c: 3}]), {maxBuffer: 3}));
await t.throwsAsync(getStream.array(intoStream.object([{a: 1}, {b: 2}, {c: 3}, {d: 4}]), {maxBuffer: 3}), /maxBuffer exceeded/);
await t.notThrowsAsync(getStream.array(intoStream.object([{a: 1}, {b: 2}, {c: 3}]), {maxBuffer: 3}));
});

test('maxBuffer applies to length of data when not in objectMode', async t => {
Expand Down

0 comments on commit 0c3b07d

Please sign in to comment.