Skip to content

Commit e31e52e

Browse files
crisbetopkozlowski-opensource
authored andcommitted
fix(migrations): class content being deleted in some edge cases (#58959)
Fixes that the inject migration was deleting the class' content if a property exists after the constructor that is being rewritten. PR Close #58959
1 parent 21b993c commit e31e52e

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

packages/core/schematics/ng-generate/inject-migration/migration.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,15 @@ function migrateClass(
259259

260260
if (prependToClass.length > 0) {
261261
if (removedMembers.size === node.members.length) {
262-
tracker.insertText(sourceFile, constructor.getEnd() + 1, `${prependToClass.join('\n')}\n`);
262+
tracker.insertText(
263+
sourceFile,
264+
// If all members were deleted, insert after the last one.
265+
// This allows us to preserve the indentation.
266+
node.members.length > 0
267+
? node.members[node.members.length - 1].getEnd() + 1
268+
: node.getEnd() - 1,
269+
`${prependToClass.join('\n')}\n`,
270+
);
263271
} else {
264272
// Insert the new properties after the first member that hasn't been deleted.
265273
tracker.insertText(

packages/core/schematics/test/inject_migration_spec.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2387,5 +2387,41 @@ describe('inject migration', () => {
23872387
`}`,
23882388
]);
23892389
});
2390+
2391+
it('should handle properties being migrated both before and after the constructor', async () => {
2392+
writeFile(
2393+
'/dir.ts',
2394+
[
2395+
`import { Directive } from '@angular/core';`,
2396+
`import { Foo } from 'foo';`,
2397+
``,
2398+
`@Directive()`,
2399+
`class MyDir {`,
2400+
` private beforeConstructor: number;`,
2401+
``,
2402+
` constructor(private foo: Foo) {`,
2403+
` this.beforeConstructor = this.foo.getValue();`,
2404+
` this.afterConstructor = this.beforeConstructor + 1;`,
2405+
` }`,
2406+
``,
2407+
` private afterConstructor: number;`,
2408+
`}`,
2409+
].join('\n'),
2410+
);
2411+
2412+
await runInternalMigration();
2413+
2414+
expect(tree.readContent('/dir.ts').split('\n')).toEqual([
2415+
`import { Directive, inject } from '@angular/core';`,
2416+
`import { Foo } from 'foo';`,
2417+
``,
2418+
`@Directive()`,
2419+
`class MyDir {`,
2420+
` private foo = inject(Foo);`,
2421+
` private beforeConstructor: number = this.foo.getValue();`,
2422+
` private afterConstructor: number = this.beforeConstructor + 1;`,
2423+
`}`,
2424+
]);
2425+
});
23902426
});
23912427
});

0 commit comments

Comments
 (0)