From 1d765656e8d3657baaf1b025c2571be48078171f Mon Sep 17 00:00:00 2001 From: Kasper Peulen Date: Thu, 7 Mar 2024 12:37:42 +0100 Subject: [PATCH 1/2] Fix attaching action, after a spy is restored to the original implementation --- code/addons/actions/src/loaders.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/addons/actions/src/loaders.ts b/code/addons/actions/src/loaders.ts index cc6c8494b7fc..3109b79e0322 100644 --- a/code/addons/actions/src/loaders.ts +++ b/code/addons/actions/src/loaders.ts @@ -2,6 +2,8 @@ import type { LoaderFunction } from '@storybook/types'; import { action } from './runtime'; +export const tinySpyInternalState = Symbol.for('tinyspy:spy'); + const attachActionsToFunctionMocks: LoaderFunction = (context) => { const { args, @@ -15,7 +17,9 @@ const attachActionsToFunctionMocks: LoaderFunction = (context) => { typeof value === 'function' && '_isMockFunction' in value && value._isMockFunction ) .forEach(([key, value]) => { - const previous = value.getMockImplementation(); + const previous = + value.getMockImplementation() ?? + (tinySpyInternalState in value ? value[tinySpyInternalState]?.getOriginal() : undefined); if (previous?._actionAttached !== true && previous?.isAction !== true) { const implementation = (...params: unknown[]) => { action(key)(...params); From 32de171b2c67cafe913a00f190e20b1f380941a3 Mon Sep 17 00:00:00 2001 From: Kasper Peulen Date: Thu, 7 Mar 2024 15:39:24 +0100 Subject: [PATCH 2/2] Add a comment --- code/addons/actions/src/loaders.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/addons/actions/src/loaders.ts b/code/addons/actions/src/loaders.ts index 3109b79e0322..3acfa9795eef 100644 --- a/code/addons/actions/src/loaders.ts +++ b/code/addons/actions/src/loaders.ts @@ -17,6 +17,8 @@ const attachActionsToFunctionMocks: LoaderFunction = (context) => { typeof value === 'function' && '_isMockFunction' in value && value._isMockFunction ) .forEach(([key, value]) => { + // See this discussion for context: + // https://github.com/vitest-dev/vitest/pull/5352 const previous = value.getMockImplementation() ?? (tinySpyInternalState in value ? value[tinySpyInternalState]?.getOriginal() : undefined);