karatelabs/karate · error · TypeError
Iterator value is not an entry object
Error message
Iterator value is not an entry object
What it means
When new WeakMap(iterable) iterates its argument, each yielded value must be an entry object: an array-like (List) or key/value-holding object (ObjectLike). Karate throws this TypeError when an iterator yields something else (a bare string, number, or plain non-entry object), mirroring V8's 'Iterator value X is not an entry object'.
Solutions
- Pass an array of [key, value] pairs: new WeakMap([[keyObj, value], ...]).
- Map flat iterables into pairs first: new WeakMap(keys.map(k => [k, defaultValue])).
- Filter or transform the source iterator so each element is a List/ObjectLike entry.
- If you only have keys, build the map with set() in a loop instead.
Example fix
// before const wm = new WeakMap([obj1, obj2]); // not entries // after const wm = new WeakMap([[obj1, 'meta1'], [obj2, 'meta2']]);
Defensive patterns
Strategy: validation
Validate before calling
if (!Array.isArray(entries) || !entries.every(e => Array.isArray(e) || (e && typeof e === 'object'))) throw new Error('WeakMap iterable must contain [key, value] entries'); Type guard
function isEntry(e) { return Array.isArray(e) || (e !== null && typeof e === 'object'); } Prevention
- Always pass [[key, value], ...] pairs to the WeakMap constructor
- Convert flat key lists with keys.map(k => [k, v]) first
- Verify generator/iterator output shape before constructing
When it happens
Trigger: new WeakMap([1, 2, 3]) or new WeakMap('ab') — passing an iterable of scalars instead of [[key, value], ...] pairs; also new WeakMap(gen()) where a generator yields non-entry values.
Common situations: Copying from a WeakSet or array of keys instead of entries; converting Map-style code but forgetting to wrap values in pairs; iterators over flat lists from config or JSON data.
Understand the failure class
Background: "Invalid ... format", "must be in format X", "does not look like a ..." — invalid argument format errors across CLI tools and libraries — this error's family across 17 libraries.
Related errors
- Result of the Symbol.iterator method is not an object
- iterator result is not an object
- The iterator does not provide a 'throw' method
- iterator.throw is not a function
- iterator. is not a function
AI-assisted analysis of karatelabs/karate@a22eb90246 (2026-09-12).
Data as JSON: /api/errors/333f2e9cd3a63987.
Report an issue: GitHub.
Appendix: source
Thrown at karate-js/src/main/java/io/karatelabs/js/JsWeakMapConstructor.java:63
if (!isNew) {
throw JsErrorException.typeError("Constructor WeakMap requires 'new'");
}
JsWeakMap map = new JsWeakMap();
if (args.length == 0 || args[0] == null || args[0] == Terms.UNDEFINED) {
return map;
}
Object setFn = map.getMember("set");
if (!(setFn instanceof JsCallable adder)) {
throw JsErrorException.typeError("WeakMap.prototype.set is not callable");
}
JsIterator iter = IterUtils.getIterator(args[0], context);
CoreContext cc = context instanceof CoreContext c ? c : null;
Object savedThis = cc != null ? cc.thisObject : null;
try {
while (iter.hasNext()) {
Object entry = iter.next();
if (!(entry instanceof List) && !(entry instanceof ObjectLike)) {
throw JsErrorException.typeError("Iterator value " + entry + " is not an entry object");
}
Object k;
Object v;
if (entry instanceof List<?> list) {
k = list.isEmpty() ? Terms.UNDEFINED : list.get(0);
v = list.size() < 2 ? Terms.UNDEFINED : list.get(1);
} else {
ObjectLike ol = (ObjectLike) entry;
k = ol.getMember("0");
v = ol.getMember("1");
if (k == null) k = Terms.UNDEFINED;
if (v == null) v = Terms.UNDEFINED;
}
if (cc != null) cc.thisObject = map;
adder.call(context, new Object[]{k, v});
if (cc != null && cc.isError()) {
return map;
}View on GitHub (pinned to a22eb90246)