angular/angular-cli · warning
Unable to update custom karma configuration file ("${karmaCo
Error message
Unable to update custom karma configuration file ("${karmaConfigFile}"). Reason: ${error.message}
References to the "@angular-devkit/build-angular" package within the file may need to be removed manually. What it means
During the use-application-builder migration, custom karma.conf files are rewritten to drop references to @angular-devkit/build-angular. If rewriting (require() of the config or tree.overwrite) fails, this warning reports the reason and tells you the references may need manual removal.
Source
Thrown at packages/schematics/angular/migrations/use-application-builder/migration.ts:326
continue;
}
try {
const originalKarmaConfigText = tree.readText(karmaConfigFile);
const updatedKarmaConfigText = originalKarmaConfigText
.replaceAll(`require('@angular-devkit/build-angular/plugins/karma'),`, '')
.replaceAll(`require('@angular-devkit/build-angular/plugins/karma')`, '');
if (updatedKarmaConfigText.includes('@angular-devkit/build-angular/plugins')) {
throw new Error(
'Migration does not support found usage of "@angular-devkit/build-angular".',
);
} else {
tree.overwrite(karmaConfigFile, updatedKarmaConfigText);
}
} catch (error) {
const reason = error instanceof Error ? `Reason: ${error.message}` : '';
context.logger.warn(
`Unable to update custom karma configuration file ("${karmaConfigFile}"). ` +
reason +
'\nReferences to the "@angular-devkit/build-angular" package within the file may need to be removed manually.',
);
}
}
}
return chain(rules);
});
}
function deleteFile(path: string): Rule {
return (tree) => {
tree.delete(path);
};
}
View on GitHub (pinned to bb72145f9a)
Solutions
- Open the named karma config file and manually remove/replace references to @angular-devkit/build-angular (e.g. switch to @angular/build unit-test builder).
- Simplify the karma.conf (remove conditional/dynamic code) and re-run the migration.
- Convert exotic syntax (ESM/TS) in the config to plain CommonJS JS.
- Ensure the file is writable and not read-only.
Example fix
// before (karma.conf.js)
const { customKarma } = require('@angular-devkit/build-angular');
// after
module.exports = function (config) { config.set({ basePath: '', frameworks: ['jasmine'] }); }; Defensive patterns
Strategy: try-catch
Validate before calling
const src = fs.readFileSync(karmaConfigFile, 'utf8'); if (src.includes('@angular-devkit/build-angular')) console.warn(`${karmaConfigFile} references build-angular; expect migration rewrite`); Type guard
function isErrorWithMessage(e: unknown): e is Error { return e instanceof Error; } Try / catch
try { tree.overwrite(karmaConfigFile, updatedKarmaConfigText); } catch (error) { const reason = error instanceof Error ? `Reason: ${error.message}` : ''; logger.warn(`Unable to update custom karma configuration file ("${karmaConfigFile}"). ${reason}`); } Prevention
- Keep karma.conf.js simple, synchronous CommonJS.
- Avoid dynamic requires/conditionals in karma config.
- Ensure config files are writable before migrating.
- Plan to move to the @angular/build unit-test builder to drop karma configs entirely.
When it happens
Trigger: The karma config transformation throws — e.g. the karma.conf.js uses syntax the transformer cannot handle, executes code at load time that throws, or the file cannot be parsed/written.
Common situations: Highly customized karma.conf.js with conditional logic, imports of local modules, or ES module syntax where CJS is expected; karma.conf TypeScript variants; files with unusual encodings.
Related errors
- Cannot update project "${projectName}" to use the applicatio
- Project "${options.project}" is configured to use Karma. Ple
- Failed to automatically update types in "${tsConfigPath}". P
- Project "${projectName}" uses the "kjhtml" reporter. This ha
- Project "${projectName}" uses a custom Karma reporter "${r}"
AI-assisted analysis of angular/angular-cli@bb72145f9a (2026-08-30).
Data as JSON: /api/errors/035855963955db45.
Report an issue: GitHub.