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

  1. Pass an array of [key, value] pairs: new WeakMap([[keyObj, value], ...]).
  2. Map flat iterables into pairs first: new WeakMap(keys.map(k => [k, defaultValue])).
  3. Filter or transform the source iterator so each element is a List/ObjectLike entry.
  4. 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

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


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)