{"record":{"id":"5855ed230de71e9f","repo":"angular/angular-cli","slug":"file","errorCode":null,"errorMessage":"  - ${file}","messagePattern":"  - \\$\\{file\\}","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts","lineNumber":200,"sourceCode":"  if (migratedProjects.length > 0) {\n    context.logger.info(`  - ${migratedProjects.join(', ')}`);\n  }\n  context.logger.info(`Projects skipped (non-applications): ${skippedNonApplications.length}`);\n  if (skippedNonApplications.length > 0) {\n    context.logger.info(`  - ${skippedNonApplications.join(', ')}`);\n  }\n  context.logger.info(\n    `Projects skipped (missing application builder): ${skippedMissingAppBuilder.length}`,\n  );\n  if (skippedMissingAppBuilder.length > 0) {\n    context.logger.info(`  - ${skippedMissingAppBuilder.join(', ')}`);\n  }\n\n  const uniqueManualFiles = [...new Set(manualMigrationFiles)];\n  if (uniqueManualFiles.length > 0) {\n    context.logger.warn(`\\nThe following Karma configuration files require manual migration:`);\n    for (const file of uniqueManualFiles) {\n      context.logger.warn(`  - ${file}`);\n    }\n  }\n  if (migratedProjects.length > 0) {\n    context.logger.info(\n      `\\nNote: To refactor your test files from Jasmine to Vitest, consider running the following command:` +\n        `\\n  ng g @schematics/angular:refactor-jasmine-vitest <project_name>`,\n    );\n  }\n  context.logger.info('-----------------------------------------\\n');\n}\n\nfunction updateProjects(tree: Tree, context: SchematicContext): Rule {\n  return updateWorkspace(async (workspace) => {\n    let needsCoverage = false;\n    let needsIstanbul = false;\n    const removableKarmaConfigs = new Map<string, KarmaConfigProcessingResult>();\n    const migratedProjects: string[] = [];\n    const tsConfigsToUpdate = new Set<string>();","sourceCodeStart":182,"sourceCodeEnd":218,"githubUrl":"https://github.com/angular/angular-cli/blob/bb72145f9ab45aee29f523236b3a25cd0813a841/packages/schematics/angular/migrations/migrate-karma-to-vitest/migration.ts#L182-L218","documentation":"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.","triggerScenarios":"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.","commonSituations":"Multi-project workspaces where several apps/libs keep customized karma.conf.js files; each shows up as a listed path after migration.","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"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// same pre-check: list projects with custom karmaConfig paths\nconst projects = Object.entries(angularJson.projects)\n  .filter(([,p]) => p.architect?.test?.options?.karmaConfig)\n  .map(([name,p]) => `${name}: ${p.architect.test.options.karmaConfig}`);\nconsole.log(projects.join('\\n'));","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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"],"tags":["angular","schematics","vitest","karma-migration","manual-migration"],"backgroundTag":"karma-config-manual-migration","analyzedSha":"bb72145f9ab45aee29f523236b3a25cd0813a841","analyzedAt":"2026-08-30T02:47:34.745Z","schemaVersion":2},"datasetVersion":"2026-08-30T08:17:16.595Z"}