| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -166,7 +166,7 @@ function map(fn, options) { | |||
| 166 | 166 | }.call(this); | |
| 167 | 167 | } | |
| 168 | 168 | ||
| 169 | - function asIndexedPairs(options) { | ||
| 169 | + function asIndexedPairs(options = undefined) { | ||
| 170 | 170 | if (options != null && typeof options !== 'object') { | |
| 171 | 171 | throw new ERR_INVALID_ARG_TYPE('options', ['Object']); | |
| 172 | 172 | } | |
@@ -350,7 +350,7 @@ function toIntegerOrInfinity(number) { | |||
| 350 | 350 | return number; | |
| 351 | 351 | } | |
| 352 | 352 | ||
| 353 | - function drop(number, options) { | ||
| 353 | + function drop(number, options = undefined) { | ||
| 354 | 354 | if (options != null && typeof options !== 'object') { | |
| 355 | 355 | throw new ERR_INVALID_ARG_TYPE('options', ['Object']); | |
| 356 | 356 | } | |
@@ -374,7 +374,7 @@ function drop(number, options) { | |||
| 374 | 374 | }.call(this); | |
| 375 | 375 | } | |
| 376 | 376 | ||
| 377 | - function take(number, options) { | ||
| 377 | + function take(number, options = undefined) { | ||
| 378 | 378 | if (options != null && typeof options !== 'object') { | |
| 379 | 379 | throw new ERR_INVALID_ARG_TYPE('options', ['Object']); | |
| 380 | 380 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -35,6 +35,12 @@ const { | |||
| 35 | 35 | streamReturningOperators, | |
| 36 | 36 | promiseReturningOperators, | |
| 37 | 37 | } = require('internal/streams/operators'); | |
| 38 | + | ||
| 39 | + const { | ||
| 40 | + codes: { | ||
| 41 | + ERR_ILLEGAL_CONSTRUCTOR, | ||
| 42 | + }, | ||
| 43 | + } = require('internal/errors'); | ||
| 38 | 44 | const compose = require('internal/streams/compose'); | |
| 39 | 45 | const { pipeline } = require('internal/streams/pipeline'); | |
| 40 | 46 | const { destroyer } = require('internal/streams/destroy'); | |
@@ -51,15 +57,34 @@ Stream.isReadable = utils.isReadable; | |||
| 51 | 57 | Stream.Readable = require('internal/streams/readable'); | |
| 52 | 58 | for (const key of ObjectKeys(streamReturningOperators)) { | |
| 53 | 59 | const op = streamReturningOperators[key]; | |
| 54 | - Stream.Readable.prototype[key] = function(...args) { | ||
| 60 | + function fn(...args) { | ||
| 61 | + if (new.target) { | ||
| 62 | + throw ERR_ILLEGAL_CONSTRUCTOR(); | ||
| 63 | + } | ||
| 55 | 64 | return Stream.Readable.from(ReflectApply(op, this, args)); | |
| 56 | - }; | ||
| 65 | + } | ||
| 66 | + ObjectDefineProperty(fn, 'name', { value: op.name }); | ||
| 67 | + ObjectDefineProperty(fn, 'length', { value: op.length }); | ||
| 68 | + ObjectDefineProperty(Stream.Readable.prototype, key, { | ||
| 69 | + value: fn, | ||
| 70 | + enumerable: false, | ||
| 71 | + configurable: true, | ||
| 72 | + writable: false, | ||
| 73 | + }); | ||
| 57 | 74 | } | |
| 58 | 75 | for (const key of ObjectKeys(promiseReturningOperators)) { | |
| 59 | 76 | const op = promiseReturningOperators[key]; | |
| 60 | - Stream.Readable.prototype[key] = function(...args) { | ||
| 77 | + function fn(...args) { | ||
| 61 | 78 | return ReflectApply(op, this, args); | |
| 62 | - }; | ||
| 79 | + } | ||
| 80 | + ObjectDefineProperty(fn, 'name', { value: op.name }); | ||
| 81 | + ObjectDefineProperty(fn, 'length', { value: op.length }); | ||
| 82 | + ObjectDefineProperty(Stream.Readable.prototype, key, { | ||
| 83 | + value: fn, | ||
| 84 | + enumerable: false, | ||
| 85 | + configurable: true, | ||
| 86 | + writable: false, | ||
| 87 | + }); | ||
| 63 | 88 | } | |
| 64 | 89 | Stream.Writable = require('internal/streams/writable'); | |
| 65 | 90 | Stream.Duplex = require('internal/streams/duplex'); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,115 @@ | |||
| 1 | + import '../common/index.mjs'; | ||
| 2 | + import { Readable } from 'stream'; | ||
| 3 | + import assert from 'assert'; | ||
| 4 | + | ||
| 5 | + // These tests are manually ported from the draft PR for the test262 test suite | ||
| 6 | + // Authored by Rick Waldron in https://github.com/tc39/test262/pull/2818/files | ||
| 7 | + | ||
| 8 | + // test262 license: | ||
| 9 | + // The << Software identified by reference to the Ecma Standard* ("Software)">> | ||
| 10 | + // is protected by copyright and is being made available under the | ||
| 11 | + // "BSD License", included below. This Software may be subject to third party | ||
| 12 | + // rights (rights from parties other than Ecma International), including patent | ||
| 13 | + // rights, and no licenses under such third party rights are granted under this | ||
| 14 | + // license even if the third party concerned is a member of Ecma International. | ||
| 15 | + // SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT | ||
| 16 | + // http://www.ecma-international.org/memento/codeofconduct.htm FOR INFORMATION | ||
| 17 | + // REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO IMPLEMENT ECMA | ||
| 18 | + // INTERNATIONAL STANDARDS* | ||
| 19 | + | ||
| 20 | + // Copyright (C) 2012-2013 Ecma International | ||
| 21 | + // All rights reserved. | ||
| 22 | + | ||
| 23 | + // Redistribution and use in source and binary forms, with or without | ||
| 24 | + // modification, are permitted provided that the following conditions are met: | ||
| 25 | + // 1. Redistributions of source code must retain the above copyright notice, | ||
| 26 | + // this list of conditions and the following disclaimer. | ||
| 27 | + // 2. Redistributions in binary form must reproduce the above copyright | ||
| 28 | + // notice, this list of conditions and the following disclaimer in the | ||
| 29 | + // documentation and/or other materials provided with the distribution. | ||
| 30 | + // 3. Neither the name of the authors nor Ecma International may be used to | ||
| 31 | + // endorse or promote products derived from this software without specific | ||
| 32 | + // prior written permission. | ||
| 33 | + | ||
| 34 | + // THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS | ||
| 35 | + // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | ||
| 36 | + // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
| 37 | + // NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 38 | + // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| 39 | + // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, | ||
| 40 | + // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | ||
| 41 | + // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | ||
| 42 | + // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, | ||
| 43 | + // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 44 | + // | ||
| 45 | + // * Ecma International Standards hereafter means Ecma International Standards | ||
| 46 | + // as well as Ecma Technical Reports | ||
| 47 | + | ||
| 48 | + | ||
| 49 | + // Note all the tests that check AsyncIterator's prototype itself and things | ||
| 50 | + // that happen before stream conversion were not ported. | ||
| 51 | + { | ||
| 52 | + // asIndexedPairs/is-function | ||
| 53 | + assert.strictEqual(typeof Readable.prototype.asIndexedPairs, 'function'); | ||
| 54 | + // asIndexedPairs/indexed-pairs.js | ||
| 55 | + const iterator = Readable.from([0, 1]); | ||
| 56 | + const indexedPairs = iterator.asIndexedPairs(); | ||
| 57 | + | ||
| 58 | + for await (const [i, v] of indexedPairs) { | ||
| 59 | + assert.strictEqual(i, v); | ||
| 60 | + } | ||
| 61 | + // asIndexedPairs/length.js | ||
| 62 | + assert.strictEqual(Readable.prototype.asIndexedPairs.length, 0); | ||
| 63 | + // asIndexedPairs/name.js | ||
| 64 | + assert.strictEqual(Readable.prototype.asIndexedPairs.name, 'asIndexedPairs'); | ||
| 65 | + const descriptor = Object.getOwnPropertyDescriptor( | ||
| 66 | + Readable.prototype, | ||
| 67 | + 'asIndexedPairs' | ||
| 68 | + ); | ||
| 69 | + assert.strictEqual(descriptor.enumerable, false); | ||
| 70 | + assert.strictEqual(descriptor.configurable, true); | ||
| 71 | + assert.strictEqual(descriptor.writable, false); | ||
| 72 | + } | ||
| 73 | + { | ||
| 74 | + // drop/length | ||
| 75 | + assert.strictEqual(Readable.prototype.drop.length, 1); | ||
| 76 | + const descriptor = Object.getOwnPropertyDescriptor( | ||
| 77 | + Readable.prototype, | ||
| 78 | + 'drop' | ||
| 79 | + ); | ||
| 80 | + assert.strictEqual(descriptor.enumerable, false); | ||
| 81 | + assert.strictEqual(descriptor.configurable, true); | ||
| 82 | + assert.strictEqual(descriptor.writable, false); | ||
| 83 | + // drop/limit-equals-total | ||
| 84 | + const iterator = Readable.from([1, 2]).drop(2); | ||
| 85 | + const result = await iterator[Symbol.asyncIterator]().next(); | ||
| 86 | + assert.deepStrictEqual(result, { done: true, value: undefined }); | ||
| 87 | + // drop/limit-greater-than-total.js | ||
| 88 | + const iterator2 = Readable.from([1, 2]).drop(3); | ||
| 89 | + const result2 = await iterator2[Symbol.asyncIterator]().next(); | ||
| 90 | + assert.deepStrictEqual(result2, { done: true, value: undefined }); | ||
| 91 | + // drop/limit-less-than-total.js | ||
| 92 | + const iterator3 = Readable.from([1, 2]).drop(1); | ||
| 93 | + const result3 = await iterator3[Symbol.asyncIterator]().next(); | ||
| 94 | + assert.deepStrictEqual(result3, { done: false, value: 2 }); | ||
| 95 | + // drop/limit-rangeerror | ||
| 96 | + assert.throws(() => Readable.from([1]).drop(-1), RangeError); | ||
| 97 | + assert.throws(() => { | ||
| 98 | + Readable.from([1]).drop({ | ||
| 99 | + valueOf() { | ||
| 100 | + throw new Error('boom'); | ||
| 101 | + } | ||
| 102 | + }); | ||
| 103 | + }, /boom/); | ||
| 104 | + // drop/limit-tointeger | ||
| 105 | + const two = await Readable.from([1, 2]).drop({ valueOf: () => 1 }).toArray(); | ||
| 106 | + assert.deepStrictEqual(two, [2]); | ||
| 107 | + // drop/name | ||
| 108 | + assert.strictEqual(Readable.prototype.drop.name, 'drop'); | ||
| 109 | + // drop/non-constructible | ||
| 110 | + assert.throws(() => new Readable.prototype.drop(1), TypeError); | ||
| 111 | + // drop/proto | ||
| 112 | + const proto = Object.getPrototypeOf(Readable.prototype.drop); | ||
| 113 | + assert.strictEqual(proto, Function.prototype); | ||
| 114 | + | ||
| 115 | + } | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments