In JS, the iterator returned by [Symbol. iterator]() is supposed to be iterable too, so if yours isn’t then it’s a custom iterator bug, not a spread bug. Easiest safe fix is to spread the iterable (. . . range(1, 4)) or make the iterator self-iterable by returning this from its own [Symbol. iterator].
Yep, the iterator object should implement [Symbol. iterator]() and return itself, otherwise for. . . of and spread won’t treat it as iterable even if next() works fine. The quick patch is iterator[Symbol. iterator] = function () { return this } or just spread the original iterable instead of the iterator.