UNPKG

storybook-addon-module-mock

Version:

[![](https://img.shields.io/npm/l/storybook-addon-module-mock)](https://www.npmjs.com/package/storybook-addon-module-mock) [![](https://img.shields.io/npm/v/storybook-addon-module-mock)](https://www.npmjs.com/package/storybook-addon-module-mock) [![](http

69 lines (68 loc) 2.02 kB
/* eslint-disable @typescript-eslint/no-explicit-any */ import { fn, mocks } from 'storybook/test'; const hookFn = (hook) => { const fnSrc = fn(); mocks.delete(fnSrc); const func = Object.assign((...args) => { const result = fnSrc(...args); hook(fnSrc); return result; }, fnSrc); func.bind(fnSrc); Object.defineProperty(func, '_isMockFunction', { value: true }); Object.defineProperty(func, 'mock', { get: () => { return fnSrc.mock; }, }); return func; }; export const createMock = (module, name = 'default') => { const moduleName = module.constructor.prototype.__moduleId__; const funcName = name; const fn = hookFn(() => { fn.__module.event?.(); }); const descriptor = Object.getOwnPropertyDescriptor(module, name); let original; if (descriptor?.writable) { const f = module[name]; module[name] = fn; original = f; fn.mockRestore = () => { module[name] = f; }; } else { throw new Error('Failed to write mock'); } return Object.assign(fn, { __module: { module, name }, __name: `[${moduleName ?? 'unknown'}]:${String(funcName)}`, __original: original, }); }; export const getOriginal = (mock) => { return mock.__original; }; export const getMock = (parameters, module, name = 'default') => { const mock = parameters.moduleMock.mocks?.find((mock) => { return mock.__module?.module === module && mock.__module?.name === name; }); if (!mock) throw new Error("Can't find mock"); return mock; }; export const resetMock = (parameters) => { parameters.moduleMock.mocks?.forEach((mock) => { return mock.mockReset(); }); }; export const clearMock = (parameters) => { parameters.moduleMock.mocks?.forEach((mock) => { return mock.mockClear(); }); }; export const render = (parameters, args) => { parameters.moduleMock.render(args); };