From 2ab76aacdc454c2337f28288128f0bedd0ffc812 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Fri, 15 Aug 2025 18:19:32 +0200 Subject: [PATCH] improv: decorate methods without destrubturing args --- packages/logger/src/Logger.ts | 14 ++++++-------- packages/metrics/src/Metrics.ts | 8 +++----- packages/parser/src/parserDecorator.ts | 19 ++++++++++--------- 3 files changed, 19 insertions(+), 22 deletions(-) diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index cc00e6ee8a..507d0879fa 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -13,7 +13,7 @@ import { getXRayTraceIdFromEnv, isDevMode, } from '@aws-lambda-powertools/commons/utils/env'; -import type { Context, Handler } from 'aws-lambda'; +import type { Callback, Context, Handler } from 'aws-lambda'; import merge from 'lodash.merge'; import { LogJsonIndent, @@ -493,19 +493,17 @@ class Logger extends Utility implements LoggerInterface { // access `myClass` as `this` in a decorated `myClass.myMethod()`. descriptor.value = async function ( this: Handler, - event, - context, - callback + ...args: [unknown, Context, Callback] ) { loggerRef.refreshSampleRateCalculation(); - loggerRef.addContext(context); - loggerRef.logEventIfEnabled(event, options?.logEvent); + loggerRef.addContext(args[1]); + loggerRef.logEventIfEnabled(args[0], options?.logEvent); if (options?.correlationIdPath) { - loggerRef.setCorrelationId(event, options?.correlationIdPath); + loggerRef.setCorrelationId(args[0], options?.correlationIdPath); } try { - return await originalMethod.apply(this, [event, context, callback]); + return await originalMethod.apply(this, args); } catch (error) { if (options?.flushBufferOnUncaughtError) { loggerRef.flushBuffer(); diff --git a/packages/metrics/src/Metrics.ts b/packages/metrics/src/Metrics.ts index a309186f0e..4513685f8b 100644 --- a/packages/metrics/src/Metrics.ts +++ b/packages/metrics/src/Metrics.ts @@ -598,17 +598,15 @@ class Metrics extends Utility implements MetricsInterface { // access `myClass` as `this` in a decorated `myClass.myMethod()`. descriptor.value = async function ( this: Handler, - event: unknown, - context: Context, - callback: Callback + ...args: [unknown, Context, Callback] ): Promise { if (captureColdStartMetric) { - metricsRef.captureColdStartMetric(context.functionName); + metricsRef.captureColdStartMetric(args[1].functionName); } let result: unknown; try { - result = await originalMethod.apply(this, [event, context, callback]); + result = await originalMethod.apply(this, args); } finally { metricsRef.publishStoredMetrics(); } diff --git a/packages/parser/src/parserDecorator.ts b/packages/parser/src/parserDecorator.ts index bb9656ca2a..2089091894 100644 --- a/packages/parser/src/parserDecorator.ts +++ b/packages/parser/src/parserDecorator.ts @@ -1,6 +1,6 @@ import type { HandlerMethodDecorator } from '@aws-lambda-powertools/commons/types'; import type { StandardSchemaV1 } from '@standard-schema/spec'; -import type { Context, Handler } from 'aws-lambda'; +import type { Callback, Context, Handler } from 'aws-lambda'; import { parse } from './parser.js'; import type { Envelope, ParserOptions } from './types/index.js'; import type { ParserOutput } from './types/parser.js'; @@ -75,21 +75,22 @@ export const parser = < >( options: ParserOptions ): HandlerMethodDecorator => { - return (_target, _propertyKey, descriptor) => { - // biome-ignore lint/style/noNonNullAssertion: The descriptor.value is the method this decorator decorates, it cannot be undefined. - const original = descriptor.value!; + return ( + _target: unknown, + _propertyKey: string | symbol, + descriptor: PropertyDescriptor + ) => { + const original = descriptor.value; const { schema, envelope, safeParse } = options; descriptor.value = async function ( this: Handler, - event: ParserOutput, - context: Context, - callback + ...args: [ParserOutput, Context, Callback] ) { - const parsedEvent = parse(event, envelope, schema, safeParse); + const parsedEvent = parse(args[0], envelope, schema, safeParse); - return original.call(this, parsedEvent, context, callback); + return original.apply(this, [parsedEvent, ...args.slice(1)]); }; return descriptor;