{"record":{"id":"289756ab542b265c","repo":"bettercap/bettercap","slug":"dependency-array-must-have-arguments","errorCode":null,"errorMessage":"Dependency array must have arguments.","messagePattern":"Dependency array must have arguments\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"modules/ui/ui/vendor.js","lineNumber":55063,"sourceCode":"    var compiler = getCompilerFacade();\n    return deps.map(function (dep) { return reflectDependency(compiler, dep); });\n}\nfunction reflectDependency(compiler, dep) {\n    var meta = {\n        token: null,\n        host: false,\n        optional: false,\n        resolved: compiler.R3ResolvedDependencyType.Token,\n        self: false,\n        skipSelf: false,\n    };\n    function setTokenAndResolvedType(token) {\n        meta.resolved = compiler.R3ResolvedDependencyType.Token;\n        meta.token = token;\n    }\n    if (Array.isArray(dep)) {\n        if (dep.length === 0) {\n            throw new Error('Dependency array must have arguments.');\n        }\n        for (var j = 0; j < dep.length; j++) {\n            var param = dep[j];\n            if (param === undefined) {\n                // param may be undefined if type of dep is not set by ngtsc\n                continue;\n            }\n            else if (param instanceof Optional || param.__proto__.ngMetadataName === 'Optional') {\n                meta.optional = true;\n            }\n            else if (param instanceof SkipSelf || param.__proto__.ngMetadataName === 'SkipSelf') {\n                meta.skipSelf = true;\n            }\n            else if (param instanceof Self || param.__proto__.ngMetadataName === 'Self') {\n                meta.self = true;\n            }\n            else if (param instanceof Host || param.__proto__.ngMetadataName === 'Host') {\n                meta.host = true;","sourceCodeStart":55045,"sourceCodeEnd":55081,"githubUrl":"https://github.com/bettercap/bettercap/blob/8eca2820f3c41d2004434ed5a291d87462caeeb7/modules/ui/ui/vendor.js#L55045-L55081","documentation":"Thrown during Angular dependency resolution when a dependency is expressed as an array (the legacy multi-provider/`deps` style, e.g. `deps: [[Token]]` wrapping) but the inner array is empty. Angular resolves each `dep` entry and refuses an empty dependency array because there is nothing to inject.","triggerScenarios":"Declaring a provider or injection metadata with a nested empty array, e.g. `provide: X, useFactory: f, deps: []` in a position where a nested `[]` array is passed (e.g. `deps: [[]]`), or generated JIT metadata where ngtsc left an empty `[]`.","commonSituations":"Hand-written provider objects in `providers: []` of a module with accidental `deps: [[]]`, code-generated factories from older toolchains, or migrations from Angular 4-5 style provider syntax leaving stale empty arrays.","solutions":["Remove the empty nested array or replace it with the actual token(s) the factory/class needs.","If the dependency is optional, list the token and mark it `@Optional()` rather than leaving the array empty.","Regenerate JIT-generated metadata (rebuild with ngtsc/AOT) so `deps` is populated correctly.","Search codebase for `deps: []` / `deps: [[]]` patterns and fix them."],"exampleFix":"// before\n{ provide: MyService, useFactory: createMyService, deps: [] }\n// after\n{ provide: MyService, useFactory: createMyService, deps: [HttpClient, [new Optional(), CONFIG_TOKEN]] }","handlingStrategy":"validation","validationCode":"function validateDeps(deps: unknown[]) {\n  deps.forEach((d, i) => {\n    if (Array.isArray(d) && d.length === 0) {\n      throw new Error(`deps[${i}] is an empty array`);\n    }\n  });\n}","typeGuard":"function isNonEmptyDep(dep: unknown): dep is [unknown, ...unknown[]] {\n  return Array.isArray(dep) && dep.length > 0;\n}","tryCatchPattern":"try {\n  injector.get(MyService);\n} catch (e) {\n  if (e.message === 'Dependency array must have arguments.') {\n    console.error('Fix provider deps for MyService');\n  } else { throw e; }\n}","preventionTips":["Never nest empty arrays inside provider deps.","Type provider definitions with ProviderToken types so empty deps fail type-check.","Lint for `deps: []` / `deps: [[]]` patterns."],"tags":["angular","dependency-injection","providers","jit"],"backgroundTag":"empty-dependency-array","analyzedSha":"8eca2820f3c41d2004434ed5a291d87462caeeb7","analyzedAt":"2026-09-02T12:49:00.712Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T16:17:10.729Z"}