{"record":{"id":"f5abbf0443d0255b","repo":"karatelabs/karate","slug":"init-script-name-depends-on-unregistered-dep","errorCode":null,"errorMessage":"init script '{name}' depends on unregistered '{dep}'","messagePattern":"init script '(.+?)' depends on unregistered '(.+?)'","errorType":"exception","errorClass":"DriverException","httpStatus":null,"severity":"error","filePath":"karate-core/src/main/java/io/karatelabs/driver/cdp/CdpDriver.java","lineNumber":347,"sourceCode":"     * registered it stays injected lazily on demand, so the default page footprint is unchanged.\n     * <p>\n     * Idempotent by {@code name} — a second call for an already-registered name is a no-op (so a\n     * module may carry its own re-entry guard and be safely re-evaluated on each navigation).\n     * Pair with {@link #removeInitScript(String)}.\n     *\n     * @param name   a stable identifier for the module\n     * @param source the JavaScript source\n     * @param deps   names of already-registered modules that must run before this one\n     * @throws DriverException if a declared dependency has not been registered\n     */\n    public void addInitScript(String name, String source, String... deps) {\n        synchronized (initScriptLock) {\n            if (initScripts.containsKey(name)) {\n                return;\n            }\n            for (String dep : deps) {\n                if (!initScripts.containsKey(dep)) {\n                    throw new DriverException(\"init script '\" + name + \"' depends on unregistered '\" + dep + \"'\");\n                }\n            }\n            // install the built-in runtime first so every module can rely on its window utilities\n            if (runtimeInitId == null) {\n                runtimeInitId = addScriptToEvaluateOnNewDocument(DRIVER_JS);\n            }\n            String cdpId = addScriptToEvaluateOnNewDocument(source);\n            initScripts.put(name, new InitScript(source, List.of(deps), cdpId));\n            // new-document installs fire on the NEXT document — also inject into the current one\n            try {\n                ensureKjsRuntime();\n                evalDirect(source);\n            } catch (Exception e) {\n                logger.debug(\"init script '{}' inject into current document deferred: {}\", name, e.getMessage());\n            }\n        }\n    }\n","sourceCodeStart":329,"sourceCodeEnd":365,"githubUrl":"https://github.com/karatelabs/karate/blob/a22eb90246d958d15a47bf436693d0121ad2812d/karate-core/src/main/java/io/karatelabs/driver/cdp/CdpDriver.java#L329-L365","documentation":"CdpDriver.addInitScript(name, fn, deps) requires all dependency init scripts to be registered before a script that declares them. If a listed dep is missing from initScripts, it throws DriverException 'init script \"<name>\" depends on unregistered \"<dep>\"'. This enforces registration order for scripts injected into every new document.","triggerScenarios":"Calling addInitScript with a deps array naming a script never registered (or registered later); custom init scripts depending on built-in modules without registering/adding them first; renaming/removing a built-in dependency script in a newer version.","commonSituations":"Users adding custom init scripts on top of Karate's built-ins but omitting the required base dependency; copy-pasted setup code referencing a dep that was never added; upgrading Karate where an internal script name changed.","solutions":["Register the dependency script first (call addInitScript for the dep before the dependent script)","Check the deps array spelling against registered script names","If depending on Karate's built-in runtime, note DRIVER_JS is installed automatically — don't list it as an unregistered dep","Reorder initialization so dependencies precede dependents in your setup/config code"],"exampleFix":"// before: dep not registered\nkarate.driver.addInitScript(\"myscript\", myFn, new String[]{\"base-utils\"}); // base-utils never added\n// after: register dep first\nkarate.driver.addInitScript(\"base-utils\", baseUtilsFn);\nkarate.driver.addInitScript(\"myscript\", myFn, new String[]{\"base-utils\"});","handlingStrategy":"validation","validationCode":"// before adding a dependent script, verify deps registered\nSet<String> registered = getRegisteredInitScriptNames(); // your own tracking\nfor (String dep : deps) {\n    if (!registered.contains(dep)) {\n        throw new IllegalStateException(\"register dep first: \" + dep);\n    }\n}","typeGuard":"null","tryCatchPattern":"try { driver.addInitScript(\"name\", fn, deps); }\ncatch (DriverException e) {\n    if (e.getMessage().contains(\"depends on unregistered\")) {\n        registerMissingDeps(deps); // add deps, then retry once\n        driver.addInitScript(\"name\", fn, deps);\n    } else throw e;\n}","preventionTips":["Always register dependency init scripts before dependents","Keep deps arrays in sync with actual registered names","Centralize init-script setup in one ordered helper","After Karate upgrades, re-check built-in script names your scripts depend on"],"tags":["init-script","dependency-order","driver"],"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-19T12:17:13.211Z"}