Skip to content

Commit f96f81b

Browse files
committed
fix(ivy): support inputs/outputs in decorator metadata in JIT
1 parent 9b94685 commit f96f81b

File tree

1 file changed

+20
-5
lines changed

1 file changed

+20
-5
lines changed

packages/core/src/render3/jit/directive.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -144,17 +144,20 @@ export function awaitCurrentlyCompilingComponents(): Promise<void> {
144144
function directiveMetadata(type: Type<any>, metadata: Directive): R3DirectiveMetadata {
145145
// Reflect inputs and outputs.
146146
const propMetadata = getReflect().propMetadata(type);
147-
const inputs: StringMap = {};
148-
const outputs: StringMap = {};
149147

150148
const host = extractHostBindings(metadata, propMetadata);
151149

150+
const inputsFromMetadata = parseInputOutputs(metadata.inputs || []);
151+
const outputsFromMetadata = parseInputOutputs(metadata.outputs || []);
152+
153+
const inputsFromType: StringMap = {};
154+
const outputsFromType: StringMap = {};
152155
for (let field in propMetadata) {
153156
propMetadata[field].forEach(ann => {
154157
if (isInput(ann)) {
155-
inputs[field] = ann.bindingPropertyName || field;
158+
inputsFromType[field] = ann.bindingPropertyName || field;
156159
} else if (isOutput(ann)) {
157-
outputs[field] = ann.bindingPropertyName || field;
160+
outputsFromType[field] = ann.bindingPropertyName || field;
158161
}
159162
});
160163
}
@@ -163,7 +166,9 @@ function directiveMetadata(type: Type<any>, metadata: Directive): R3DirectiveMet
163166
name: type.name,
164167
type: new WrappedNodeExpr(type),
165168
selector: metadata.selector !,
166-
deps: reflectDependencies(type), host, inputs, outputs,
169+
deps: reflectDependencies(type), host,
170+
inputs: {...inputsFromMetadata, ...inputsFromType},
171+
outputs: {...outputsFromMetadata, ...outputsFromType},
167172
queries: [],
168173
lifecycle: {
169174
usesOnChanges: type.prototype.ngOnChanges !== undefined,
@@ -213,3 +218,13 @@ function isHostBinding(value: any): value is HostBinding {
213218
function isHostListener(value: any): value is HostListener {
214219
return value.ngMetadataName === 'HostListener';
215220
}
221+
222+
function parseInputOutputs(values: string[]): StringMap {
223+
return values.reduce(
224+
(map, value) => {
225+
const [field, property] = value.split(',').map(piece => piece.trim());
226+
map[field] = property || field;
227+
return map;
228+
},
229+
{} as StringMap);
230+
}

0 commit comments

Comments
 (0)