{"record":{"id":"045c61411af9dda0","repo":"karatelabs/karate","slug":"cannot-delete-private-member-name","errorCode":null,"errorMessage":"cannot delete private member ${name}","messagePattern":"cannot delete private member (.+?)","errorType":"exception","errorClass":"ParserException","httpStatus":null,"severity":"error","filePath":"karate-js/src/main/java/io/karatelabs/parser/JsParser.java","lineNumber":294,"sourceCode":"                if (key != null && key.isToken() && key.token.type == PRIVATE_NAME) {\n                    requirePrivateDeclared(key.getText(), privates);\n                }\n            }\n            case PRIVATE_NAME_EXPR -> {\n                Node parent = node.getParent();\n                if (parent == null || parent.type != NodeType.IN_EXPR || parent.getFirst() != node) {\n                    throw new ParserException(\"unexpected private name '\" + node.getText()\n                            + \"': only valid as the left operand of `in`\");\n                }\n                requirePrivateDeclared(node.getText(), privates);\n            }\n            case DELETE_EXPR -> {\n                Node target = node.size() > 1 ? node.get(1) : null;\n                while (target != null && !target.isToken()) {\n                    if (target.type == NodeType.REF_DOT_EXPR) {\n                        Node key = target.size() > 2 ? target.get(2) : null;\n                        if (key != null && key.isToken() && key.token.type == PRIVATE_NAME) {\n                            throw new ParserException(\"cannot delete private member \" + key.getText());\n                        }\n                        break;\n                    }\n                    if (target.type == NodeType.PAREN_EXPR) {\n                        target = target.size() > 1 ? target.get(1) : null;\n                    } else if (target.type == NodeType.EXPR || target.type == NodeType.EXPR_LIST) {\n                        target = target.size() == 1 ? target.getFirst() : null;\n                    } else {\n                        break;\n                    }\n                }\n            }\n            default -> {\n            }\n        }\n        return privates;\n    }\n","sourceCodeStart":276,"sourceCodeEnd":312,"githubUrl":"https://github.com/karatelabs/karate/blob/a22eb90246d958d15a47bf436693d0121ad2812d/karate-js/src/main/java/io/karatelabs/parser/JsParser.java#L276-L312","documentation":"Per the class-fields spec, `delete` is not permitted on private field/method/accessor references. Karate's parser statically detects a PRIVATE_NAME key in a dot-reference under a DELETE_EXPR and rejects it at parse time, because deleting a private member would break class encapsulation invariants.","triggerScenarios":"Writing `delete obj.#field;` (or the same inside parentheses) anywhere the parser runs privateNodeChecks. The check descends through PAREN_EXPR/EXPR/EXPR_LIST wrappers to find a REF_DOT_EXPR whose key token is a PRIVATE_NAME.","commonSituations":"Attempting to 'reset' or remove a private field on an object; porting code that deleted plain properties and mechanically adding `#`; misunderstanding private fields as configurable properties.","solutions":["Remove the delete statement and instead assign a sentinel (e.g. `obj.#field = null`) if the field's semantics allow it","Expose an explicit class method that performs the invalidation/reset the private member needs","If the property must be deletable, make it a regular (non-private) property"],"exampleFix":"// before\ndelete obj.#cache;\n// after\nobj.#cache = null; // or call an explicit reset method","handlingStrategy":"validation","validationCode":"// Scan for delete of private members:\nconst hasBadDelete = /delete\\s+(?:\\(\\s*)?[\\w$.]*\\.#\\w+/.test(src);","typeGuard":null,"tryCatchPattern":"try { eval(js); } catch (e) { if (String(e).includes('cannot delete private member')) { /* replace with assignment/nulling */ } throw e; }","preventionTips":["Treat private fields as non-configurable: never `delete` them","Provide explicit reset/clear methods on the class","Keep deletes limited to ordinary public properties"],"tags":["javascript","parser","private-fields","delete"],"backgroundTag":"invalid-private-field-usage","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"}