diff --git a/packages/parameters/src/base/BaseProvider.ts b/packages/parameters/src/base/BaseProvider.ts index afeabc69a6..16cbeb2019 100644 --- a/packages/parameters/src/base/BaseProvider.ts +++ b/packages/parameters/src/base/BaseProvider.ts @@ -167,11 +167,19 @@ abstract class BaseProvider implements BaseProviderInterface { entryKey ); } catch (error) { - if (configs.throwOnTransformError) - throw new TransformParameterError( + if (configs.throwOnTransformError) { + if (error instanceof TransformParameterError) { + throw error; + } + + // Otherwise wrap—but preserve the original stack + const wrapped = new TransformParameterError( configs.transform, (error as Error).message ); + wrapped.stack = (error as Error).stack; + throw wrapped; + } } } } diff --git a/packages/parameters/tests/unit/BaseProvider.test.ts b/packages/parameters/tests/unit/BaseProvider.test.ts index d69c19c969..424f8f687a 100644 --- a/packages/parameters/tests/unit/BaseProvider.test.ts +++ b/packages/parameters/tests/unit/BaseProvider.test.ts @@ -24,7 +24,7 @@ vi.mock('@aws-lambda-powertools/commons', async (importOriginal) => ({ class TestProvider extends BaseProvider { public constructor() { super({ - proto: class { + awsSdkV3ClientPrototype: class { #name = 'TestProvider'; public hello(): string { @@ -389,7 +389,7 @@ describe('Class: BaseProvider', () => { }); }); - it('throws when called with a binary transform and throwOnTransformError equal to TRUE, and at least ONE the values is NOT a valid string representation of a binary', async () => { + it('throws a TransformParameterError when trying to transform an invalid binary and throwOnTransformError is enabled', async () => { // Prepare const mockData = { A: 'qw' }; const provider = new TestProvider(); @@ -404,6 +404,22 @@ describe('Class: BaseProvider', () => { ).rejects.toThrowError(TransformParameterError); }); + it('throws a TransformParameterError when a runtime error occurs during the transformation and throwOnTransformError is enabled', async () => { + // Prepare + const mockData = { A: 'foo' }; + const provider = new TestProvider(); + vi.spyOn(provider, '_getMultiple').mockResolvedValue(mockData); + + // Act & Assess + await expect( + provider.getMultiple('my-path', { + // @ts-ignore - we want to test an unexpected runtime error + transform: 1, + throwOnTransformError: true, + }) + ).rejects.toThrowError(TransformParameterError); + }); + it('returns an object with the transformed values when auto transform is used and the key of the parameter ends with `.binary`', async () => { // Prepare const mockData = { 'A.binary': toBase64(encoder.encode('my-value')) };