fix(ivy): prevent unknown element check for AOT-compiled components (#34024)
Prior to this commit, the unknown element can happen twice for AOT-compiled components: once during compilation and once again at runtime. Due to the fact that `schemas` information is not present on Component and NgModule defs after AOT compilation, the second check (at runtime) may fail, even though the same check was successful at compile time. This commit updates the code to avoid the second check for AOT-compiled components by checking whether `schemas` information is present in a logic that executes the unknown element check. PR Close #34024
This commit is contained in:

committed by
Miško Hevery

parent
8c33f91529
commit
658087be7e
@ -3009,6 +3009,44 @@ runInEachFileSystem(os => {
|
||||
`/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(Service, [{ type: Injectable, args: [{ providedIn: 'root' }] }], null, null); })();`);
|
||||
});
|
||||
|
||||
it('should not include `schemas` in component and module defs', () => {
|
||||
env.write('test.ts', `
|
||||
import {Component, NgModule, NO_ERRORS_SCHEMA} from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'comp',
|
||||
template: '<custom-el></custom-el>',
|
||||
schemas: [NO_ERRORS_SCHEMA],
|
||||
})
|
||||
class MyComp {}
|
||||
|
||||
@NgModule({
|
||||
declarations: [MyComp],
|
||||
schemas: [NO_ERRORS_SCHEMA],
|
||||
})
|
||||
class MyModule {}
|
||||
`);
|
||||
|
||||
env.driveMain();
|
||||
const jsContents = trim(env.getContents('test.js'));
|
||||
expect(jsContents).toContain(trim(`
|
||||
MyComp.ɵcmp = i0.ɵɵdefineComponent({
|
||||
type: MyComp,
|
||||
selectors: [["comp"]],
|
||||
decls: 1,
|
||||
vars: 0,
|
||||
template: function MyComp_Template(rf, ctx) {
|
||||
if (rf & 1) {
|
||||
i0.ɵɵelement(0, "custom-el");
|
||||
}
|
||||
},
|
||||
encapsulation: 2
|
||||
});
|
||||
`));
|
||||
expect(jsContents)
|
||||
.toContain(trim('MyModule.ɵmod = i0.ɵɵdefineNgModule({ type: MyModule });'));
|
||||
});
|
||||
|
||||
it('should emit setClassMetadata calls for all types', () => {
|
||||
env.write('test.ts', `
|
||||
import {Component, Directive, Injectable, NgModule, Pipe} from '@angular/core';
|
||||
|
Reference in New Issue
Block a user