From c499c1a72b2e2438c379ce7ead44beacafa5fe0e Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Thu, 26 Oct 2023 11:02:58 -0400 Subject: [PATCH] fix(migrations): fix broken migration when no control flow is present This addresses a bug that caused the control flow migration to crash when no control flow was present in the template. --- .../control-flow-migration/util.ts | 11 ++++++---- .../test/control_flow_migration_spec.ts | 22 +++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/packages/core/schematics/ng-generate/control-flow-migration/util.ts b/packages/core/schematics/ng-generate/control-flow-migration/util.ts index 18b3227565625..b76e410c10b92 100644 --- a/packages/core/schematics/ng-generate/control-flow-migration/util.ts +++ b/packages/core/schematics/ng-generate/control-flow-migration/util.ts @@ -134,11 +134,14 @@ export function migrateTemplate(template: string): {migrated: string|null, error // start from top of template // loop through each element - visitor.elements[0].hasLineBreaks = hasLineBreaks; - let prevElEnd = visitor.elements[0]?.el.sourceSpan.end.offset ?? result.length - 1; - let nestedQueue: number[] = [prevElEnd]; - for (let i = 1; i < visitor.elements.length; i++) { + let nestedQueue: number[] = []; + for (let i = 0; i < visitor.elements.length; i++) { let currEl = visitor.elements[i]; + if (i === 0) { + nestedQueue.push(currEl.el.sourceSpan.end.offset); + currEl.hasLineBreaks = hasLineBreaks; + continue; + } currEl.hasLineBreaks = hasLineBreaks; currEl.nestCount = getNestedCount(currEl, nestedQueue); if (currEl.el.sourceSpan.end.offset !== nestedQueue[nestedQueue.length - 1]) { diff --git a/packages/core/schematics/test/control_flow_migration_spec.ts b/packages/core/schematics/test/control_flow_migration_spec.ts index 2335120fe3e34..fdb709652b26f 100644 --- a/packages/core/schematics/test/control_flow_migration_spec.ts +++ b/packages/core/schematics/test/control_flow_migration_spec.ts @@ -2063,4 +2063,26 @@ describe('control flow migration', () => { expect(content).toContain(''); }); }); + + describe('no migration needed', () => { + it('should do nothing when no control flow is present', async () => { + writeFile('/comp.ts', ` + import {Component} from '@angular/core'; + import {NgIf} from '@angular/common'; + + @Component({ + imports: [NgIf], + template: \`
shrug
\` + }) + class Comp { + toggle = false; + } + `); + + await runMigration(); + const content = tree.readContent('/comp.ts'); + + expect(content).toContain('template: `
shrug
`'); + }); + }); });