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

  1. Open each listed karma.conf.js path
  2. Port custom settings (plugins, preprocessors, proxies, reporters) into a Vitest config and set "runnerConfig": true for that project
  3. 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

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


AI-assisted analysis of angular/angular-cli@bb72145f9a (2026-08-30). Data as JSON: /api/errors/5855ed230de71e9f. Report an issue: GitHub.