angular/angular-cli · warning
- ${file}
Error message
- ${file} What it means
Per-file detail line emitted by logSummary after the 'require manual migration' header; each occurrence names one Karma configuration file the migration could not convert automatically.
Source
Thrown at packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts:200
if (migratedProjects.length > 0) {
context.logger.info(` - ${migratedProjects.join(', ')}`);
}
context.logger.info(`Projects skipped (non-applications): ${skippedNonApplications.length}`);
if (skippedNonApplications.length > 0) {
context.logger.info(` - ${skippedNonApplications.join(', ')}`);
}
context.logger.info(
`Projects skipped (missing application builder): ${skippedMissingAppBuilder.length}`,
);
if (skippedMissingAppBuilder.length > 0) {
context.logger.info(` - ${skippedMissingAppBuilder.join(', ')}`);
}
const uniqueManualFiles = [...new Set(manualMigrationFiles)];
if (uniqueManualFiles.length > 0) {
context.logger.warn(`\nThe following Karma configuration files require manual migration:`);
for (const file of uniqueManualFiles) {
context.logger.warn(` - ${file}`);
}
}
if (migratedProjects.length > 0) {
context.logger.info(
`\nNote: To refactor your test files from Jasmine to Vitest, consider running the following command:` +
`\n ng g @schematics/angular:refactor-jasmine-vitest <project_name>`,
);
}
context.logger.info('-----------------------------------------\n');
}
function updateProjects(tree: Tree, context: SchematicContext): Rule {
return updateWorkspace(async (workspace) => {
let needsCoverage = false;
let needsIstanbul = false;
const removableKarmaConfigs = new Map<string, KarmaConfigProcessingResult>();
const migratedProjects: string[] = [];
const tsConfigsToUpdate = new Set<string>();View on GitHub (pinned to bb72145f9a)
Solutions
- Open each listed karma.conf.js path
- Port custom settings (plugins, preprocessors, proxies, reporters) into a Vitest config and set "runnerConfig": true for that project
- Remove the Karma config file once fully ported
Defensive patterns
Strategy: validation
Validate before calling
// same pre-check: list projects with custom karmaConfig paths
const projects = Object.entries(angularJson.projects)
.filter(([,p]) => p.architect?.test?.options?.karmaConfig)
.map(([name,p]) => `${name}: ${p.architect.test.options.karmaConfig}`);
console.log(projects.join('\n')); Prevention
- Track each listed file in a migration checklist until ported and deleted
- Port karma webpack customizations into Vitest plugins early
- Verify with a test run after removing each karma config
When it happens
Trigger: Same as the header: migrate-karma-to-vitest ran and processKarmaConfig recorded non-removable karma config paths in manualMigrationFiles; logSummary dedupes them and prints one line per file.
Common situations: Multi-project workspaces where several apps/libs keep customized karma.conf.js files; each shows up as a listed path after migration.
Related errors
- Project "${projectName}" uses a custom Karma configuration f
- Project "${projectName}" uses a custom coverage reporter "${
- The following Karma configuration files require manual migr
- No "test" target found for project "${options.project}". A "
- Cannot add a Vitest configuration as builder for "test" targ
AI-assisted analysis of angular/angular-cli@bb72145f9a (2026-08-30).
Data as JSON: /api/errors/5855ed230de71e9f.
Report an issue: GitHub.