fix(core): static-query schematic should detect static queries in getters. (#29609)
Queries can also be statically accessed within getters. e.g. ```ts ngOnInit() { this.myQueryGetter.doSomething(); } ``` In that case we need to check if the `myQueryGetter` definition accesses a query statically. As we need to use the type checker for every property acess within lifecylce hooks, the schematic might become slower than before, but considering that this is a one-time execution, it is totally fine using the type-checker extensively. PR Close #29609
This commit is contained in:

committed by
Jason Aden

parent
b2c03b8cd4
commit
33016b8929
@ -780,6 +780,67 @@ describe('static-queries migration', () => {
|
||||
.toContain(`@${queryType}('test', { static: true }) query: any;`);
|
||||
});
|
||||
|
||||
it('should detect static queries used through getter property access', () => {
|
||||
writeFile('/index.ts', `
|
||||
import {Component, ${queryType}} from '@angular/core';
|
||||
|
||||
@Component({template: '<span #test></span>'})
|
||||
export class MyComp {
|
||||
private @${queryType}('test') query: any;
|
||||
|
||||
get myProp() {
|
||||
return this.query.myValue;
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.myProp.test();
|
||||
}
|
||||
}
|
||||
`);
|
||||
|
||||
runMigration();
|
||||
|
||||
expect(tree.readContent('/index.ts'))
|
||||
.toContain(`@${queryType}('test', { static: true }) query: any;`);
|
||||
});
|
||||
|
||||
it('should detect static queries used through external getter access', () => {
|
||||
writeFile('/index.ts', `
|
||||
import {Component, ${queryType}} from '@angular/core';
|
||||
import {External} from './external';
|
||||
|
||||
@Component({template: '<span #test></span>'})
|
||||
export class MyComp {
|
||||
@${queryType}('test') query: any;
|
||||
|
||||
private external = new External(this);
|
||||
|
||||
get myProp() {
|
||||
return this.query.myValue;
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
console.log(this.external.query);
|
||||
}
|
||||
}
|
||||
`);
|
||||
|
||||
writeFile('/external.ts', `
|
||||
import {MyComp} from './index';
|
||||
|
||||
export class External {
|
||||
constructor(private comp: MyComp) {}
|
||||
|
||||
get query() { return this.comp.query; }
|
||||
}
|
||||
`);
|
||||
|
||||
runMigration();
|
||||
|
||||
expect(tree.readContent('/index.ts'))
|
||||
.toContain(`@${queryType}('test', { static: true }) query: any;`);
|
||||
});
|
||||
|
||||
it('should properly handle multiple tsconfig files', () => {
|
||||
writeFile('/src/index.ts', `
|
||||
import {Component, ${queryType}} from '@angular/core';
|
||||
|
Reference in New Issue
Block a user