{"record":{"id":"587d5c7874e210e4","repo":"karatelabs/karate","slug":"invalid-value-used-in-weak-set","errorCode":null,"errorMessage":"Invalid value used in weak set","messagePattern":"Invalid value used in weak set","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"karate-js/src/main/java/io/karatelabs/js/JsWeakSet.java","lineNumber":49,"sourceCode":" * identity-keyed.\n */\nclass JsWeakSet extends JsObject {\n\n    private static final Object PRESENT = new Object();\n\n    private final IdentityHashMap<Object, Object> elements = new IdentityHashMap<>();\n\n    JsWeakSet() {\n        super(null, JsWeakSetPrototype.INSTANCE);\n    }\n\n    boolean has(Object value) {\n        return JsWeakMap.canBeHeldWeakly(value) && elements.containsKey(value);\n    }\n\n    void addValue(Object value) {\n        if (!JsWeakMap.canBeHeldWeakly(value)) {\n            throw JsErrorException.typeError(\"Invalid value used in weak set\");\n        }\n        elements.put(value, PRESENT);\n    }\n\n    boolean deleteValue(Object value) {\n        if (!has(value)) {\n            return false;\n        }\n        elements.remove(value);\n        return true;\n    }\n\n}\n","sourceCodeStart":31,"sourceCodeEnd":63,"githubUrl":"https://github.com/karatelabs/karate/blob/a22eb90246d958d15a47bf436693d0121ad2812d/karate-js/src/main/java/io/karatelabs/js/JsWeakSet.java#L31-L63","documentation":"WeakSet can only store values eligible for weak references — objects (and registered symbols). Karate's JsWeakSet.addValue checks JsWeakMap.canBeHeldWeakly(value) and throws a TypeError when add() receives a primitive, matching V8's 'Invalid value used in weak set'.","triggerScenarios":"weakSet.add(42), weakSet.add('str'), weakSet.add(null), weakSet.add(undefined), or weakSet.add(Symbol('local')) — any non-object, non-function value passed to add().","commonSituations":"Deduplicating IDs that are strings/numbers rather than objects; adding array elements from JSON-parsed data (all primitives); variables that are unexpectedly undefined at call time.","solutions":["Add only objects/functions: weakSet.add(obj).","For primitive values use a regular Set instead of WeakSet.","Guard before adding: if (value && typeof value === 'object') weakSet.add(value).","Wrap primitives in holder objects if weak semantics are genuinely needed: weakSet.add({ v: 42 })."],"exampleFix":"// before\nconst seen = new WeakSet();\nseen.add(id); // id is a string\n\n// after\nconst seen = new Set();\nseen.add(id);","handlingStrategy":"validation","validationCode":"function isWeakValue(v) { return (typeof v === 'object' && v !== null) || typeof v === 'function'; }\nif (!isWeakValue(value)) throw new Error('WeakSet values must be objects');\nws.add(value);","typeGuard":"function isWeakValue(v) { return (typeof v === 'object' && v !== null) || typeof v === 'function'; }","tryCatchPattern":null,"preventionTips":["Use Set for primitive values","Check that values are not null/undefined before add()","Be careful with JSON-parsed arrays — elements are primitives"],"tags":["javascript","weakset","typeerror"],"backgroundTag":"invalid-argument-value","analyzedSha":"a22eb90246d958d15a47bf436693d0121ad2812d","analyzedAt":"2026-09-12T09:01:00.220Z","contentChangedAt":"2026-09-12T09:01:00.220Z","schemaVersion":2},"datasetVersion":"2026-09-16T19:17:19.609Z"}