From 1c6b4b8c854426aa5a62eeceb3448be116afdb0d Mon Sep 17 00:00:00 2001 From: Keshav Malik Date: Fri, 14 Aug 2026 21:04:34 +0530 Subject: [PATCH] Fix TransformStream constructor arity --- javascript/externs/web/streamsapi.js | 22 +++++++++++++++++-- ...08-14-transformstream-constructor-arity.md | 4 ++++ .../SpuriousArguments.expected | 1 + .../SpuriousArguments/externs.js | 8 +++++++ .../SpuriousArguments/transformstream.ts | 15 +++++++++++++ 5 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 javascript/ql/src/change-notes/2026-08-14-transformstream-constructor-arity.md create mode 100644 javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/transformstream.ts diff --git a/javascript/externs/web/streamsapi.js b/javascript/externs/web/streamsapi.js index 4a335775aadb..2e936a1b7a13 100644 --- a/javascript/externs/web/streamsapi.js +++ b/javascript/externs/web/streamsapi.js @@ -38,9 +38,27 @@ var QueuingStrategy; /** + * A transform stream (https://streams.spec.whatwg.org/#transform-stream). * @record */ -function TransformStream() {}; +function ITransformStream() {}; + +/** @type {!WritableStream} */ +ITransformStream.prototype.writable; + +/** @type {!ReadableStream} */ +ITransformStream.prototype.readable; + + +/** + * @constructor + * @implements {ITransformStream} + * @param {Object=} transformer + * @param {!QueuingStrategy=} writableStrategy + * @param {!QueuingStrategy=} readableStrategy + * @see https://streams.spec.whatwg.org/#ts-class + */ +function TransformStream(transformer, writableStrategy, readableStrategy) {}; /** @type {!WritableStream} */ TransformStream.prototype.writable; @@ -120,7 +138,7 @@ ReadableStream.prototype.cancel = function(reason) {}; ReadableStream.prototype.getReader = function(opt_options) {}; /** - * @param {!TransformStream} transform + * @param {!ITransformStream} transform * @param {!PipeOptions=} opt_options * @return {!ReadableStream} * @see https://streams.spec.whatwg.org/#rs-pipe-through diff --git a/javascript/ql/src/change-notes/2026-08-14-transformstream-constructor-arity.md b/javascript/ql/src/change-notes/2026-08-14-transformstream-constructor-arity.md new file mode 100644 index 000000000000..a8b66c4c612b --- /dev/null +++ b/javascript/ql/src/change-notes/2026-08-14-transformstream-constructor-arity.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `js/superfluous-trailing-arguments` query no longer reports valid arguments passed to the `TransformStream` constructor. diff --git a/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/SpuriousArguments.expected b/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/SpuriousArguments.expected index b88dd7d68e80..40493b31b1ec 100644 --- a/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/SpuriousArguments.expected +++ b/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/SpuriousArguments.expected @@ -8,6 +8,7 @@ | reflection.js:7:15:7:18 | 1 | Superfluous arguments passed to $@. | reflection.js:1:1:1:23 | functio ... eturn;} | function f0 | | reflection.js:12:18:12:18 | 2 | Superfluous argument passed to $@. | reflection.js:2:1:2:24 | functio ... eturn;} | function f1 | | thisparameter.ts:4:11:4:12 | 45 | Superfluous argument passed to $@. | thisparameter.ts:1:1:1:45 | functio ... eturn;} | function foo | +| transformstream.ts:15:33:15:34 | {} | Superfluous argument passed to $@. | externs.js:48:1:48:76 | functio ... egy) {} | function TransformStream | | tst.js:10:3:10:5 | g() | Superfluous argument passed to $@. | tst.js:1:1:4:1 | functio ... x+19;\\n} | function f | | tst.js:31:15:31:18 | 2 | Superfluous arguments passed to $@. | externs.js:34:1:34:27 | functio ... str) {} | function String | | tst.js:34:4:34:5 | 42 | Superfluous argument passed to $@. | tst.js:35:4:35:23 | function() {return;} | anonymous function | diff --git a/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/externs.js b/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/externs.js index c8a88126efbf..cc3bf09cc149 100644 --- a/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/externs.js +++ b/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/externs.js @@ -39,4 +39,12 @@ function Number() {} Number.parseFloat = function(num) {}; +/** + * @param {*=} transformer + * @param {*=} writableStrategy + * @param {*=} readableStrategy + * @constructor + */ +function TransformStream(transformer, writableStrategy, readableStrategy) {} + /** @externs */ diff --git a/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/transformstream.ts b/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/transformstream.ts new file mode 100644 index 000000000000..161ffc4fcf7b --- /dev/null +++ b/javascript/ql/test/query-tests/LanguageFeatures/SpuriousArguments/transformstream.ts @@ -0,0 +1,15 @@ +class CustomTransformStream extends TransformStream { + constructor() { + super({ + transform(chunk, controller) { + controller.enqueue(chunk); + } + }); + } +} + +new TransformStream(); +new TransformStream({}); +new TransformStream({}, {}); +new TransformStream({}, {}, {}); +new TransformStream({}, {}, {}, {}); // $ Alert