Skip to content

Commit d2a38c0

Browse files
committed
feat: use getOwnMetadata to prevent parent class mutation in decorators
1 parent 8b4a478 commit d2a38c0

2 files changed

Lines changed: 6 additions & 2 deletions

File tree

ts/src/decorators/event.dec.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ import {EventSettingProps} from "../models/event.model";
22

33
export const EventSetting = (setting: EventSettingProps): ClassDecorator =>
44
(target) => {
5-
const settings = Reflect.getMetadata('hercules:flow_settings', target) || [];
5+
// getOwnMetadata: getMetadata would return the parent class's array on subclasses,
6+
// and unshift would mutate the parent's settings.
7+
const settings = Reflect.getOwnMetadata('hercules:flow_settings', target) || [];
68
settings.unshift(setting);
79
Reflect.defineMetadata('hercules:flow_settings', settings, target);
810
}

ts/src/decorators/function.dec.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ export const ThrowsError = (throwsError: boolean = true): ClassDecorator =>
1111

1212
export const Parameter = (parameter: FunctionParameterProps): ClassDecorator =>
1313
(target) => {
14-
const parameters = Reflect.getMetadata('hercules:function_parameters', target) || [];
14+
// getOwnMetadata: getMetadata would return the parent class's array on subclasses,
15+
// and unshift would mutate the parent's parameters.
16+
const parameters = Reflect.getOwnMetadata('hercules:function_parameters', target) || [];
1517
parameters.unshift(parameter);
1618
Reflect.defineMetadata('hercules:function_parameters', parameters, target);
1719
}

0 commit comments

Comments
 (0)