{"record":{"id":"6ecfca78d063d260","repo":"angular/angular-cli","slug":"count-x-category","errorCode":null,"errorMessage":"  - ${count}x ${category}","messagePattern":"  - \\$\\{count\\}x \\$\\{category\\}","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/schematics/angular/refactor/jasmine-vitest/utils/refactor-reporter.ts","lineNumber":160,"sourceCode":"        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":142,"sourceCodeEnd":165,"githubUrl":"https://github.com/angular/angular-cli/blob/bb72145f9ab45aee29f523236b3a25cd0813a841/packages/schematics/angular/refactor/jasmine-vitest/utils/refactor-reporter.ts#L142-L165","documentation":"Detail line printed by the jasmine-vitest refactor reporter's summary: one line per TODO category showing how many TODOs of that kind were added (e.g. '3x spyOn semantics').","triggerScenarios":"printSummary iterating this.todos after a jasmine-vitest refactor run where at least one TODO category was recorded.","commonSituations":"Mixed test suites with several classes of unconvertible Jasmine constructs; each category count tells you what kind of manual work remains.","solutions":["Read the per-category counts to prioritize the manual work (e.g. many fake-timer TODOs first)","Grep for the TODO comments of each category and convert them to Vitest equivalents","Delete the TODO comments after resolving each item"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// estimate TODO volume before refactoring\nconst patterns = { clock: /jasmine\\.clock/g, fail: /\\bfail\\(/g, matchers: /toMatch|toContAin|toHaveBeenCalledWith/g };\nfor (const [cat, re] of Object.entries(patterns)) {\n  const n = testFiles.reduce((a,f) => a + (fs.readFileSync(f,'utf8').match(re)?.length || 0), 0);\n  if (n) console.log(`${n}x potential ${cat} TODO(s)`);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Read per-category counts as a work estimate and plan the conversion","Address the highest-count category first for the biggest reduction","Keep a checklist linking each TODO category to its Vitest replacement API"],"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"}