fix(ivy): NgOnChangesFeature no longer included in hello_world (#28187)
- Wraps the NgOnChangesFeature in a factory such that no side effects occur in the module root - Adds comments to ngInherit property on feature definition interface to help guide others not to make the same mistake - Updates compiler to generate the feature properly after the change to it being a factory - Updates appropriate tests PR Close #28187
This commit is contained in:

committed by
Alex Rickabaugh

parent
a95e81978b
commit
5430d2bc66
@ -35,11 +35,18 @@ type OnChangesExpando = OnChanges & {
|
||||
* static ngComponentDef = defineComponent({
|
||||
* ...
|
||||
* inputs: {name: 'publicName'},
|
||||
* features: [NgOnChangesFeature]
|
||||
* features: [NgOnChangesFeature()]
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export function NgOnChangesFeature<T>(definition: DirectiveDef<T>): void {
|
||||
export function NgOnChangesFeature<T>(): DirectiveDefFeature {
|
||||
// This option ensures that the ngOnChanges lifecycle hook will be inherited
|
||||
// from superclasses (in InheritDefinitionFeature).
|
||||
(NgOnChangesFeatureImpl as DirectiveDefFeature).ngInherit = true;
|
||||
return NgOnChangesFeatureImpl;
|
||||
}
|
||||
|
||||
function NgOnChangesFeatureImpl<T>(definition: DirectiveDef<T>): void {
|
||||
if (definition.type.prototype.ngOnChanges) {
|
||||
definition.setInput = ngOnChangesSetInput;
|
||||
|
||||
@ -91,11 +98,6 @@ function setSimpleChangesStore(instance: any, store: NgSimpleChangesStore): NgSi
|
||||
return instance[SIMPLE_CHANGES_STORE] = store;
|
||||
}
|
||||
|
||||
// This option ensures that the ngOnChanges lifecycle hook will be inherited
|
||||
// from superclasses (in InheritDefinitionFeature).
|
||||
(NgOnChangesFeature as DirectiveDefFeature).ngInherit = true;
|
||||
|
||||
|
||||
interface NgSimpleChangesStore {
|
||||
previous: SimpleChanges;
|
||||
current: SimpleChanges|null;
|
||||
|
@ -302,11 +302,27 @@ export type PipeDefWithMeta<T, Name extends string> = PipeDef<T>;
|
||||
|
||||
export interface DirectiveDefFeature {
|
||||
<T>(directiveDef: DirectiveDef<T>): void;
|
||||
/**
|
||||
* Marks a feature as something that {@link InheritDefinitionFeature} will execute
|
||||
* during inheritance.
|
||||
*
|
||||
* NOTE: DO NOT SET IN ROOT OF MODULE! Doing so will result in tree-shakers/bundlers
|
||||
* identifying the change as a side effect, and the feature will be included in
|
||||
* every bundle.
|
||||
*/
|
||||
ngInherit?: true;
|
||||
}
|
||||
|
||||
export interface ComponentDefFeature {
|
||||
<T>(componentDef: ComponentDef<T>): void;
|
||||
/**
|
||||
* Marks a feature as something that {@link InheritDefinitionFeature} will execute
|
||||
* during inheritance.
|
||||
*
|
||||
* NOTE: DO NOT SET IN ROOT OF MODULE! Doing so will result in tree-shakers/bundlers
|
||||
* identifying the change as a side effect, and the feature will be included in
|
||||
* every bundle.
|
||||
*/
|
||||
ngInherit?: true;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user