Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

javascript.builtins.Iterator - available since deno 1.37.0 #26298

Open
ikeyan opened this issue Mar 26, 2025 · 5 comments · May be fixed by #26370
Open

javascript.builtins.Iterator - available since deno 1.37.0 #26298

ikeyan opened this issue Mar 26, 2025 · 5 comments · May be fixed by #26370
Labels
data:js Compat data for JS/ECMAScript features. https://developer.mozilla.org/docs/Web/JavaScript p3 Low priority – Community PRs encouraged.

Comments

@ikeyan
Copy link
Contributor

ikeyan commented Mar 26, 2025

What type of issue is this?

Incorrect support data (example: BrowserX says "86" but support was added in "40")

What information was incorrect, unhelpful, or incomplete?

Deno support for Iterator class and all of its methods

What browsers does this problem apply to, if applicable?

Deno

What did you expect to see?

The support for both of them was added in deno 1.37.0

Did you test this? If so, how?

  1. Wrote a test iterator-tests.js:
import { strict as assert } from "node:assert";

function* gen() {
  yield 1;
  yield 2;
  yield 3;
}

Deno.test("Iterator", () => {
  assert.equal(typeof Iterator, "function");
});

Deno.test("Iterator[Symbol.iterator]", () => {
  assert.deepEqual(typeof Iterator.prototype[Symbol.iterator], "function");
});

Deno.test("Iterator constructor", () => {
  class MyIterator extends Iterator {
    next() {
      return { done: true, value: undefined };
    }
  }
  assert.deepEqual(new MyIterator().toArray(), []);
});

Deno.test("Iterator.drop", () => {
  assert.deepEqual(Array.from(gen().drop(1)), [2, 3]);
});

Deno.test("Iterator.every", () => {
  assert(gen().every((x) => x > 0));
  assert(!gen().every((x) => x > 1));
});

Deno.test("Iterator.filter", () => {
  assert.deepEqual(Array.from(gen().filter((x) => x % 2)), [1, 3]);
});

Deno.test("Iterator.find", () => {
  assert.deepEqual(
    gen().find((x) => x === 2),
    2,
  );
  assert.deepEqual(
    gen().find((x) => x === 4),
    undefined,
  );
});

Deno.test("Iterator.flatMap", () => {
  assert.deepEqual(Array.from(gen().flatMap((x) => [x, x])), [1, 1, 2, 2, 3, 3]);
});

Deno.test("Iterator.forEach", () => {
  let sum = 0;
  // biome-ignore lint/complexity/noForEach: This is a test
  gen().forEach((x) => {
    sum += x;
  });
  assert.deepEqual(sum, 6);
});

Deno.test("Iterator.from", () => {
  assert.deepEqual(Iterator.from(gen()).toArray(), [1, 2, 3]);
});

Deno.test("Iterator.map", () => {
  assert.deepEqual(Array.from(gen().map((x) => x * 2)), [2, 4, 6]);
});

Deno.test("Iterator.reduce", () => {
  const sum = gen().reduce((acc, x) => acc + x, 0);
  assert.deepEqual(sum, 6);
});

Deno.test("Iterator.some", () => {
  assert(gen().some((x) => x === 2));
  assert(!gen().some((x) => x === 4));
});

Deno.test("Iterator.take", () => {
  assert.deepEqual(Array.from(gen().take(2)), [1, 2]);
});

Deno.test("Iterator.toArray", () => {
  assert.deepEqual(gen().toArray(), [1, 2, 3]);
});
  1. Run the test on deno 1.36.4 and deno 1.37.0 using asdf
% dvm install 1.37.0
% deno eval 'console.log(Deno.version)'
{ deno: "1.37.0", v8: "11.8.172.3", typescript: "5.2.2" }
% deno test iterator-tests.js
running 15 tests from ./iterator-tests.js
Iterator ... ok (0ms)
Iterator[Symbol.iterator] ... ok (0ms)
Iterator constructor ... ok (0ms)
Iterator.drop ... ok (0ms)
Iterator.every ... ok (0ms)
Iterator.filter ... ok (0ms)
Iterator.find ... ok (0ms)
Iterator.flatMap ... ok (0ms)
Iterator.forEach ... ok (0ms)
Iterator.from ... ok (0ms)
Iterator.map ... ok (0ms)
Iterator.reduce ... ok (0ms)
Iterator.some ... ok (0ms)
Iterator.take ... ok (0ms)
Iterator.toArray ... ok (0ms)

ok | 15 passed | 0 failed (34ms)

% dvm install 1.36.4
% deno eval 'console.log(Deno.version)'
{ deno: "1.36.4", v8: "11.6.189.12", typescript: "5.1.6" }
% deno test iterator-tests.js
running 15 tests from ./iterator-tests.js
Iterator ... FAILED (6ms)
Iterator[Symbol.iterator] ... FAILED (3ms)
Iterator constructor ... FAILED (3ms)
Iterator.drop ... FAILED (3ms)
Iterator.every ... FAILED (3ms)
Iterator.filter ... FAILED (3ms)
Iterator.find ... FAILED (3ms)
Iterator.flatMap ... FAILED (2ms)
Iterator.forEach ... FAILED (3ms)
Iterator.from ... FAILED (3ms)
Iterator.map ... FAILED (3ms)
Iterator.reduce ... FAILED (2ms)
Iterator.some ... FAILED (2ms)
Iterator.take ... FAILED (3ms)
Iterator.toArray ... FAILED (2ms)

 ERRORS

Iterator => ./iterator-tests.js:9:6
error: AssertionError: Values are not strictly equal:


    [Diff] Actual / Expected


-   undefined
+   function


    at new AssertionError (ext:deno_node/assertion_error.ts:414:11)
    at toNode (node:assert:44:15)
    at Function.strictEqual (node:assert:215:3)
    at file:///Users/me/iterator-tests.js:10:10

Iterator[Symbol.iterator] => ./iterator-tests.js:13:6
error: ReferenceError: Iterator is not defined
  assert.deepEqual(typeof Iterator.prototype[Symbol.iterator], "function");
                          ^
    at file:///Users/me/iterator-tests.js:14:27

Iterator constructor => ./iterator-tests.js:17:6
error: ReferenceError: Iterator is not defined
  class MyIterator extends Iterator {
                           ^
    at file:///Users/me/iterator-tests.js:18:28

Iterator.drop => ./iterator-tests.js:26:6
error: TypeError: gen(...).drop is not a function
  assert.deepEqual(Array.from(gen().drop(1)), [2, 3]);
                                    ^
    at file:///Users/me/iterator-tests.js:27:37

Iterator.every => ./iterator-tests.js:30:6
error: TypeError: gen(...).every is not a function
  assert(gen().every((x) => x > 0));
               ^
    at file:///Users/me/iterator-tests.js:31:16

Iterator.filter => ./iterator-tests.js:35:6
error: TypeError: gen(...).filter is not a function
  assert.deepEqual(Array.from(gen().filter((x) => x % 2)), [1, 3]);
                                    ^
    at file:///Users/me/iterator-tests.js:36:37

Iterator.find => ./iterator-tests.js:39:6
error: TypeError: gen(...).find is not a function
    gen().find((x) => x === 2),
          ^
    at file:///Users/me/iterator-tests.js:41:11

Iterator.flatMap => ./iterator-tests.js:50:6
error: TypeError: gen(...).flatMap is not a function
  assert.deepEqual(Array.from(gen().flatMap((x) => [x, x])), [1, 1, 2, 2, 3, 3]);
                                    ^
    at file:///Users/me/iterator-tests.js:51:37

Iterator.forEach => ./iterator-tests.js:54:6
error: TypeError: gen(...).forEach is not a function
  gen().forEach((x) => {
        ^
    at file:///Users/me/iterator-tests.js:57:9

Iterator.from => ./iterator-tests.js:63:6
error: ReferenceError: Iterator is not defined
  assert.deepEqual(Iterator.from(gen()).toArray(), [1, 2, 3]);
                   ^
    at file:///Users/me/iterator-tests.js:64:20

Iterator.map => ./iterator-tests.js:67:6
error: TypeError: gen(...).map is not a function
  assert.deepEqual(Array.from(gen().map((x) => x * 2)), [2, 4, 6]);
                                    ^
    at file:///Users/me/iterator-tests.js:68:37

Iterator.reduce => ./iterator-tests.js:71:6
error: TypeError: gen(...).reduce is not a function
  const sum = gen().reduce((acc, x) => acc + x, 0);
                    ^
    at file:///Users/me/iterator-tests.js:72:21

Iterator.some => ./iterator-tests.js:76:6
error: TypeError: gen(...).some is not a function
  assert(gen().some((x) => x === 2));
               ^
    at file:///Users/me/iterator-tests.js:77:16

Iterator.take => ./iterator-tests.js:81:6
error: TypeError: gen(...).take is not a function
  assert.deepEqual(Array.from(gen().take(2)), [1, 2]);
                                    ^
    at file:///Users/me/iterator-tests.js:82:37

Iterator.toArray => ./iterator-tests.js:85:6
error: TypeError: gen(...).toArray is not a function
  assert.deepEqual(gen().toArray(), [1, 2, 3]);
                         ^
    at file:///Users/me/iterator-tests.js:86:26

 FAILURES

Iterator => ./iterator-tests.js:9:6
Iterator[Symbol.iterator] => ./iterator-tests.js:13:6
Iterator constructor => ./iterator-tests.js:17:6
Iterator.drop => ./iterator-tests.js:26:6
Iterator.every => ./iterator-tests.js:30:6
Iterator.filter => ./iterator-tests.js:35:6
Iterator.find => ./iterator-tests.js:39:6
Iterator.flatMap => ./iterator-tests.js:50:6
Iterator.forEach => ./iterator-tests.js:54:6
Iterator.from => ./iterator-tests.js:63:6
Iterator.map => ./iterator-tests.js:67:6
Iterator.reduce => ./iterator-tests.js:71:6
Iterator.some => ./iterator-tests.js:76:6
Iterator.take => ./iterator-tests.js:81:6
Iterator.toArray => ./iterator-tests.js:85:6

FAILED | 0 passed | 15 failed (65ms)

error: Test failed

Can you link to any release notes, bugs, pull requests, or MDN pages related to this?

I read the release note but I could not find anything.

Do you have anything more you want to share?

No response

MDN URL

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Iterator

MDN metadata

MDN page report details
  • Query: javascript.builtins.Iterator
  • Report started: 2025-03-26T08:06:34.620Z
@ikeyan ikeyan added the needs triage This issue needs to be confirmed label Mar 26, 2025
@caugner
Copy link
Contributor

caugner commented Mar 26, 2025

I tried to verifying your findings locally with dvm, but for me the tests pass with 1.37.0, but not in 1.36.0.

% deno --version
deno 1.37.0 (release, aarch64-apple-darwin)
v8 11.8.172.3
typescript 5.2.2

This seems plausible, because iterator-helpers moved out of the --harmony flag in V8 11.8.160.

@caugner caugner added data:js Compat data for JS/ECMAScript features. https://developer.mozilla.org/docs/Web/JavaScript p3 Low priority – Community PRs encouraged. and removed needs triage This issue needs to be confirmed labels Mar 26, 2025
@ikeyan
Copy link
Contributor Author

ikeyan commented Mar 28, 2025

Confirmed all deno >= 1.37.0 from asdf except 1.38.0 has Iterator.
It looks like asdf-deno fooled me.
Updated the issue text.

@ikeyan ikeyan changed the title javascript.builtins.Iterator - available since deno 1.38.1 javascript.builtins.Iterator - available since deno 1.37.0 Mar 28, 2025
@caugner
Copy link
Contributor

caugner commented Mar 31, 2025

Thanks for confirming, @ikeyan. Would you like to open a PR? 🙏

@ikeyan ikeyan linked a pull request Apr 1, 2025 that will close this issue
@ikeyan
Copy link
Contributor Author

ikeyan commented Apr 1, 2025

@caugner Here it is

@ikeyan
Copy link
Contributor Author

ikeyan commented Apr 1, 2025

Additional evidence

deno [1.38.1, 1.38.5] has Iterator

% dvm use 1.38.5
  Now using deno 1.38.5 in 1.05s
% deno eval 'console.log(Deno.version, Iterator)'
{ deno: "1.38.5", v8: "12.0.267.1", typescript: "5.2.2" } [Function: Iterator]
% dvm use 1.38.4
  Now using deno 1.38.4 in 1.06s
% deno eval 'console.log(Deno.version, Iterator)'
{ deno: "1.38.4", v8: "12.0.267.1", typescript: "5.2.2" } [Function: Iterator]
% dvm use 1.38.3
  Now using deno 1.38.3 in 1.07s
% deno eval 'console.log(Deno.version, Iterator)'
{ deno: "1.38.3", v8: "12.0.267.1", typescript: "5.2.2" } [Function: Iterator]
% dvm use 1.38.2
  Now using deno 1.38.2 in 1.07s
% deno eval 'console.log(Deno.version, Iterator)'
{ deno: "1.38.2", v8: "12.0.267.1", typescript: "5.2.2" } [Function: Iterator]
% dvm use 1.38.1
  Now using deno 1.38.1 in 1.06s
% deno eval 'console.log(Deno.version, Iterator)'
{ deno: "1.38.1", v8: "12.0.267.1", typescript: "5.2.2" } [Function: Iterator]

but deno 1.38.0 don't have Iterator

% dvm use 1.38.0
  Now using deno 1.38.0 in 1.03s
% deno eval 'console.log(Deno.version, Iterator)'
error: Uncaught ReferenceError: Iterator is not defined
console.log(Deno.version, Iterator)
                          ^
    at file:///Users/me/hobby/vggt/$deno$eval:1:27

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
data:js Compat data for JS/ECMAScript features. https://developer.mozilla.org/docs/Web/JavaScript p3 Low priority – Community PRs encouraged.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants