{"record":{"id":"38368b8d7da6a752","repo":"angular/angular-cli","slug":"totaltodos-todo-s-added-for-manual-review","errorCode":null,"errorMessage":"- ${totalTodos} TODO(s) added for manual review:","messagePattern":"- (.+?) TODO\\(s\\) added for manual review:","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/schematics/angular/refactor/jasmine-vitest/utils/refactor-reporter.ts","lineNumber":158,"sourceCode":"      this.logger.info('Detailed Transformation Log:');\n      for (const [filePath, logs] of this.verboseLogs) {\n        this.logger.info(`Processing: ${filePath}`);\n        logs.forEach((log) => this.logger.info(`  - ${log}`));\n      }\n      this.logger.info(''); // Add a blank line for separation\n    }\n\n    this.logger.info('Jasmine to Vitest Refactoring Summary:');\n    this.logger.info(`- ${this.filesScanned} test file(s) scanned.`);\n    this.logger.info(`- ${this.filesTransformed} file(s) transformed.`);\n    const filesSkipped = this.filesScanned - this.filesTransformed;\n    if (filesSkipped > 0) {\n      this.logger.info(`- ${filesSkipped} file(s) skipped (no changes needed).`);\n    }\n\n    if (this.todos.size > 0) {\n      const totalTodos = [...this.todos.values()].reduce((a, b) => a + b, 0);\n      this.logger.warn(`- ${totalTodos} TODO(s) added for manual review:`);\n      for (const [category, count] of this.todos) {\n        this.logger.warn(`  - ${count}x ${category}`);\n      }\n    }\n  }\n}\n","sourceCodeStart":140,"sourceCodeEnd":165,"githubUrl":"https://github.com/angular/angular-cli/blob/bb72145f9ab45aee29f523236b3a25cd0813a841/packages/schematics/angular/refactor/jasmine-vitest/utils/refactor-reporter.ts#L140-L165","documentation":"The jasmine-to-vitest refactor schematic's reporter prints a summary of TODO comments it inserted into your test files where automatic conversion was impossible. This header reports the total number of TODO(s) that need manual review.","triggerScenarios":"Running 'ng g @schematics/angular:refactor-jasmine-vitest <project>' when printSummary finds entries in the reporter's todos map — i.e. some Jasmine constructs (e.g. certain spy/matchers/async patterns) could not be converted automatically.","commonSituations":"Test suites containing Jasmine-specific patterns (fail(), special matchers, custom equality testers, jasmine clock) that the refactor tool can only flag with // TODO comments.","solutions":["Search the refactored files for the inserted TODO comments","Resolve each TODO by rewriting the construct with Vitest APIs (vi.fn, vi.useFakeTimers, expect semantics)","Re-run the refactor summary or your test suite to confirm all TODOs are addressed"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// before refactoring, scan tests for hard-to-convert Jasmine APIs\nconst risky = /jasmine\\.clock|fail\\(|withContext|customEqualityTester|\\.calls\\.count\\(\\)/;\nfor (const f of testFiles) {\n  if (risky.test(fs.readFileSync(f,'utf8'))) console.warn(`${f} may produce TODO(s) during refactor`);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Replace exotic Jasmine APIs (jasmine.clock, fail(), custom matchers) before migrating","Keep test utilities centralized so only a few files need manual conversion","After refactor, grep for 'TODO' in test files and resolve before merging"],"tags":["angular","schematics","vitest","jasmine-refactor","todos"],"backgroundTag":"manual-review-todos-added","analyzedSha":"bb72145f9ab45aee29f523236b3a25cd0813a841","analyzedAt":"2026-08-30T02:47:34.745Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}