@storybook/experimental-nextjs-vite 9.0.0-alpha.1 → 9.0.0-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-PIRL4JPH.mjs → chunk-HFILGZ5B.mjs} +1 -1
- package/dist/export-mocks/cache/index.d.ts +1 -1
- package/dist/export-mocks/cache/index.js +1 -1
- package/dist/export-mocks/cache/index.mjs +1 -1
- package/dist/export-mocks/headers/index.d.ts +1 -1
- package/dist/export-mocks/headers/index.js +1 -1
- package/dist/export-mocks/headers/index.mjs +1 -1
- package/dist/export-mocks/navigation/index.d.ts +2 -2
- package/dist/export-mocks/navigation/index.js +1 -1
- package/dist/export-mocks/navigation/index.mjs +1 -1
- package/dist/export-mocks/router/index.d.ts +2 -2
- package/dist/export-mocks/router/index.js +1 -1
- package/dist/export-mocks/router/index.mjs +1 -1
- package/dist/index.d-98b9eb06.d.ts +296 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +4 -4
- package/dist/preview.d.ts +4 -3
- package/dist/preview.js +1 -1
- package/dist/preview.mjs +1 -1
- package/package.json +6 -11
- package/template/cli/js/Button.jsx +0 -2
- package/template/cli/js/Button.stories.js +1 -1
- package/template/cli/js/Header.jsx +0 -2
- package/template/cli/js/Header.stories.js +1 -1
- package/template/cli/js/Page.stories.js +1 -1
- package/template/cli/ts-4-9/Button.stories.ts +3 -2
- package/template/cli/ts-4-9/Button.tsx +0 -2
- package/template/cli/ts-4-9/Header.stories.ts +3 -2
- package/template/cli/ts-4-9/Header.tsx +0 -2
- package/template/cli/ts-4-9/Page.stories.ts +3 -2
- package/dist/index.d-5a935e77.d.ts +0 -266
- package/template/cli/ts-3-8/Button.stories.ts +0 -53
- package/template/cli/ts-3-8/Button.tsx +0 -41
- package/template/cli/ts-3-8/Configure.mdx +0 -446
- package/template/cli/ts-3-8/Header.stories.ts +0 -33
- package/template/cli/ts-3-8/Header.tsx +0 -56
- package/template/cli/ts-3-8/Page.stories.ts +0 -32
- package/template/cli/ts-3-8/Page.tsx +0 -73
package/dist/preview.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
"use strict";var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var preview_exports={};__export(preview_exports,{decorators:()=>decorators,loaders:()=>loaders,parameters:()=>parameters});module.exports=__toCommonJS(preview_exports);var import_navigation2=require("@storybook/experimental-nextjs-vite/navigation.mock"),import_router2=require("@storybook/experimental-nextjs-vite/router.mock"),import_is_next_router_error=require("next/dist/client/components/is-next-router-error");var import_config=require("next/config");(0,import_config.setConfig)(process.env.__NEXT_RUNTIME_CONFIG);var React2=__toESM(require("react"));var import_react=__toESM(require("react")),import_head_manager=__toESM(require("next/dist/client/head-manager")),import_head_manager_context=require("next/dist/shared/lib/head-manager-context.shared-runtime"),HeadManagerProvider=({children})=>{let headManager=(0,import_react.useMemo)(import_head_manager.default,[]);return headManager.getIsSsr=()=>!1,import_react.default.createElement(import_head_manager_context.HeadManagerContext.Provider,{value:headManager},children)},head_manager_provider_default=HeadManagerProvider;var HeadManagerDecorator=Story=>React2.createElement(head_manager_provider_default,null,React2.createElement(Story,null));var React3=__toESM(require("react")),import_image_context=require("sb-original/image-context"),ImageDecorator=(Story,{parameters:parameters2})=>parameters2.nextjs?.image?React3.createElement(import_image_context.ImageContext.Provider,{value:parameters2.nextjs.image},React3.createElement(Story,null)):React3.createElement(Story,null);var React6=__toESM(require("react")),import_redirect_boundary=require("next/dist/client/components/redirect-boundary");var import_react2=__toESM(require("react")),import_navigation=require("@storybook/experimental-nextjs-vite/navigation.mock"),import_app_router_context=require("next/dist/shared/lib/app-router-context.shared-runtime"),import_hooks_client_context=require("next/dist/shared/lib/hooks-client-context.shared-runtime"),import_segment=require("next/dist/shared/lib/segment");function getSelectedParams(currentTree,params={}){let parallelRoutes=currentTree[1];for(let parallelRoute of Object.values(parallelRoutes)){let segment=parallelRoute[0],isDynamicParameter=Array.isArray(segment),segmentValue=isDynamicParameter?segment[1]:segment;if(!segmentValue||segmentValue.startsWith(import_segment.PAGE_SEGMENT_KEY))continue;isDynamicParameter&&(segment[2]==="c"||segment[2]==="oc")?params[segment[0]]=segment[1].split("/"):isDynamicParameter&&(params[segment[0]]=segment[1]),params=getSelectedParams(parallelRoute,params)}return params}var getParallelRoutes=segmentsList=>{let segment=segmentsList.shift();return segment?[segment,{children:getParallelRoutes(segmentsList)}]:[]},AppRouterProvider=({children,routeParams})=>{let{pathname,query,segments=[]}=routeParams,tree=[pathname,{children:getParallelRoutes([...segments])}],pathParams=(0,import_react2.useMemo)(()=>getSelectedParams(tree),[tree]),newLazyCacheNode={lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,loading:null};return import_react2.default.createElement(import_hooks_client_context.PathParamsContext.Provider,{value:pathParams},import_react2.default.createElement(import_hooks_client_context.PathnameContext.Provider,{value:pathname},import_react2.default.createElement(import_hooks_client_context.SearchParamsContext.Provider,{value:new URLSearchParams(query)},import_react2.default.createElement(import_app_router_context.GlobalLayoutRouterContext.Provider,{value:{changeByServerResponse(){},buildId:"storybook",tree,focusAndScrollRef:{apply:!1,hashFragment:null,segmentPaths:[tree],onlyHashChange:!1},nextUrl:pathname}},import_react2.default.createElement(import_app_router_context.AppRouterContext.Provider,{value:(0,import_navigation.getRouter)()},import_react2.default.createElement(import_app_router_context.LayoutRouterContext.Provider,{value:{childNodes:new Map,tree,parentTree:tree,parentCacheNode:newLazyCacheNode,url:pathname,loading:null}},children))))))};var import_react3=__toESM(require("react")),import_router=require("@storybook/experimental-nextjs-vite/router.mock"),import_router_context=require("next/dist/shared/lib/router-context.shared-runtime"),PageRouterProvider=({children})=>import_react3.default.createElement(import_router_context.RouterContext.Provider,{value:(0,import_router.getRouter)()},children);var defaultRouterParams={pathname:"/",query:{}},RouterDecorator=(Story,{parameters:parameters2})=>parameters2.nextjs?.appDirectory??!1?AppRouterProvider?React6.createElement(AppRouterProvider,{routeParams:{...defaultRouterParams,...parameters2.nextjs?.navigation}},React6.createElement(import_redirect_boundary.RedirectBoundary,null,React6.createElement(Story,null))):null:React6.createElement(PageRouterProvider,null,React6.createElement(Story,null));var React7=__toESM(require("react")),import_styled_jsx=require("styled-jsx"),StyledJsxDecorator=Story=>React7.createElement(import_styled_jsx.StyleRegistry,null,React7.createElement(Story,null));function addNextHeadCount(){let meta=document.createElement("meta");meta.name="next-head-count",meta.content="0",document.head.appendChild(meta)}function isAsyncClientComponentError(error){return typeof error=="string"&&(error.includes("A component was suspended by an uncached promise.")||error.includes("async/await is not yet supported in Client Components"))}addNextHeadCount();var origConsoleError=globalThis.console.error;globalThis.console.error=(...args)=>{let error=args[0];(0,import_is_next_router_error.isNextRouterError)(error)||isAsyncClientComponentError(error)||origConsoleError.apply(globalThis.console,args)};globalThis.addEventListener("error",ev=>{if((0,import_is_next_router_error.isNextRouterError)(ev.error)||isAsyncClientComponentError(ev.error)){ev.preventDefault();return}});var decorators=[StyledJsxDecorator,ImageDecorator,RouterDecorator,HeadManagerDecorator],loaders=async({globals,parameters:parameters2})=>{let{router,appDirectory}=parameters2.nextjs??{};appDirectory?(0,import_navigation2.createNavigation)(router):(0,import_router2.createRouter)({locale:globals.locale,...router})},parameters={docs:{source:{excludeDecorators:!0}},react:{rootOptions:{onCaughtError(error){(0,import_is_next_router_error.isNextRouterError)(error)||console.error(error)}}}};0&&(module.exports={decorators,loaders,parameters});
|
1
|
+
"use strict";var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var preview_exports={};__export(preview_exports,{decorators:()=>decorators,loaders:()=>loaders,parameters:()=>parameters});module.exports=__toCommonJS(preview_exports);var import_navigation2=require("@storybook/experimental-nextjs-vite/navigation.mock"),import_router2=require("@storybook/experimental-nextjs-vite/router.mock"),import_is_next_router_error=require("next/dist/client/components/is-next-router-error");var import_config=require("next/config");(0,import_config.setConfig)(process.env.__NEXT_RUNTIME_CONFIG);var React2=__toESM(require("react"));var import_react=__toESM(require("react")),import_head_manager=__toESM(require("next/dist/client/head-manager")),import_head_manager_context=require("next/dist/shared/lib/head-manager-context.shared-runtime"),HeadManagerProvider=({children})=>{let headManager=(0,import_react.useMemo)(import_head_manager.default,[]);return headManager.getIsSsr=()=>!1,import_react.default.createElement(import_head_manager_context.HeadManagerContext.Provider,{value:headManager},children)},head_manager_provider_default=HeadManagerProvider;var HeadManagerDecorator=Story=>React2.createElement(head_manager_provider_default,null,React2.createElement(Story,null));var React3=__toESM(require("react")),import_image_context=require("sb-original/image-context"),ImageDecorator=(Story,{parameters:parameters2})=>parameters2.nextjs?.image?React3.createElement(import_image_context.ImageContext.Provider,{value:parameters2.nextjs.image},React3.createElement(Story,null)):React3.createElement(Story,null);var React6=__toESM(require("react")),import_redirect_boundary=require("next/dist/client/components/redirect-boundary");var import_react2=__toESM(require("react")),import_navigation=require("@storybook/experimental-nextjs-vite/navigation.mock"),import_app_router_context=require("next/dist/shared/lib/app-router-context.shared-runtime"),import_hooks_client_context=require("next/dist/shared/lib/hooks-client-context.shared-runtime"),import_segment=require("next/dist/shared/lib/segment");function getSelectedParams(currentTree,params={}){let parallelRoutes=currentTree[1];for(let parallelRoute of Object.values(parallelRoutes)){let segment=parallelRoute[0],isDynamicParameter=Array.isArray(segment),segmentValue=isDynamicParameter?segment[1]:segment;if(!segmentValue||segmentValue.startsWith(import_segment.PAGE_SEGMENT_KEY))continue;isDynamicParameter&&(segment[2]==="c"||segment[2]==="oc")?params[segment[0]]=segment[1].split("/"):isDynamicParameter&&(params[segment[0]]=segment[1]),params=getSelectedParams(parallelRoute,params)}return params}var getParallelRoutes=segmentsList=>{let segment=segmentsList.shift();return segment?[segment,{children:getParallelRoutes(segmentsList)}]:[]},AppRouterProvider=({children,routeParams})=>{let{pathname,query,segments=[]}=routeParams,tree=[pathname,{children:getParallelRoutes([...segments])}],pathParams=(0,import_react2.useMemo)(()=>getSelectedParams(tree),[tree]),newLazyCacheNode={lazyData:null,rsc:null,prefetchRsc:null,head:null,prefetchHead:null,parallelRoutes:new Map,loading:null};return import_react2.default.createElement(import_hooks_client_context.PathParamsContext.Provider,{value:pathParams},import_react2.default.createElement(import_hooks_client_context.PathnameContext.Provider,{value:pathname},import_react2.default.createElement(import_hooks_client_context.SearchParamsContext.Provider,{value:new URLSearchParams(query)},import_react2.default.createElement(import_app_router_context.GlobalLayoutRouterContext.Provider,{value:{changeByServerResponse(){},buildId:"storybook",tree,focusAndScrollRef:{apply:!1,hashFragment:null,segmentPaths:[tree],onlyHashChange:!1},nextUrl:pathname}},import_react2.default.createElement(import_app_router_context.AppRouterContext.Provider,{value:(0,import_navigation.getRouter)()},import_react2.default.createElement(import_app_router_context.LayoutRouterContext.Provider,{value:{childNodes:new Map,tree,parentTree:tree,parentCacheNode:newLazyCacheNode,url:pathname,loading:null}},children))))))};var import_react3=__toESM(require("react")),import_router=require("@storybook/experimental-nextjs-vite/router.mock"),import_router_context=require("next/dist/shared/lib/router-context.shared-runtime"),PageRouterProvider=({children})=>import_react3.default.createElement(import_router_context.RouterContext.Provider,{value:(0,import_router.getRouter)()},children);var defaultRouterParams={pathname:"/",query:{}},RouterDecorator=(Story,{parameters:parameters2})=>parameters2.nextjs?.appDirectory??!1?AppRouterProvider?React6.createElement(AppRouterProvider,{routeParams:{...defaultRouterParams,...parameters2.nextjs?.navigation}},React6.createElement(import_redirect_boundary.RedirectBoundary,null,React6.createElement(Story,null))):null:React6.createElement(PageRouterProvider,null,React6.createElement(Story,null));var React7=__toESM(require("react")),import_styled_jsx=require("styled-jsx"),StyledJsxDecorator=Story=>React7.createElement(import_styled_jsx.StyleRegistry,null,React7.createElement(Story,null));function addNextHeadCount(){let meta=document.createElement("meta");meta.name="next-head-count",meta.content="0",document.head.appendChild(meta)}function isAsyncClientComponentError(error){return typeof error=="string"&&(error.includes("Only Server Components can be async at the moment.")||error.includes("A component was suspended by an uncached promise.")||error.includes("async/await is not yet supported in Client Components"))}addNextHeadCount();var origConsoleError=globalThis.console.error;globalThis.console.error=(...args)=>{let error=args[0];(0,import_is_next_router_error.isNextRouterError)(error)||isAsyncClientComponentError(error)||origConsoleError.apply(globalThis.console,args)};globalThis.addEventListener("error",ev=>{if((0,import_is_next_router_error.isNextRouterError)(ev.error)||isAsyncClientComponentError(ev.error)){ev.preventDefault();return}});var asDecorator=decorator=>decorator,decorators=[asDecorator(StyledJsxDecorator),asDecorator(ImageDecorator),asDecorator(RouterDecorator),asDecorator(HeadManagerDecorator)],loaders=async({globals,parameters:parameters2})=>{let{router,appDirectory}=parameters2.nextjs??{};appDirectory?(0,import_navigation2.createNavigation)(router):(0,import_router2.createRouter)({locale:globals.locale,...router})},parameters={docs:{source:{excludeDecorators:!0}},react:{rootOptions:{onCaughtError(error){(0,import_is_next_router_error.isNextRouterError)(error)||console.error(error)}}}};0&&(module.exports={decorators,loaders,parameters});
|
package/dist/preview.mjs
CHANGED
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@storybook/experimental-nextjs-vite",
|
3
|
-
"version": "9.0.0-alpha.
|
3
|
+
"version": "9.0.0-alpha.11",
|
4
4
|
"description": "Storybook for Next.js and Vite",
|
5
5
|
"keywords": [
|
6
6
|
"storybook",
|
@@ -104,12 +104,11 @@
|
|
104
104
|
"prep": "jiti ../../../scripts/prepare/bundle.ts"
|
105
105
|
},
|
106
106
|
"dependencies": {
|
107
|
-
"@storybook/builder-vite": "9.0.0-alpha.
|
108
|
-
"@storybook/react": "9.0.0-alpha.
|
109
|
-
"@storybook/react-vite": "9.0.0-alpha.
|
110
|
-
"@storybook/test": "9.0.0-alpha.1",
|
107
|
+
"@storybook/builder-vite": "9.0.0-alpha.11",
|
108
|
+
"@storybook/react": "9.0.0-alpha.11",
|
109
|
+
"@storybook/react-vite": "9.0.0-alpha.11",
|
111
110
|
"styled-jsx": "5.1.6",
|
112
|
-
"vite-plugin-storybook-nextjs": "
|
111
|
+
"vite-plugin-storybook-nextjs": "2.0.0--canary.33.7c1f48f.0"
|
113
112
|
},
|
114
113
|
"devDependencies": {
|
115
114
|
"@types/node": "^22.0.0",
|
@@ -117,11 +116,10 @@
|
|
117
116
|
"typescript": "^5.7.3"
|
118
117
|
},
|
119
118
|
"peerDependencies": {
|
120
|
-
"@storybook/test": "9.0.0-alpha.1",
|
121
119
|
"next": "^14.1.0 || ^15.0.0",
|
122
120
|
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
|
123
121
|
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
|
124
|
-
"storybook": "^9.0.0-alpha.
|
122
|
+
"storybook": "^9.0.0-alpha.11",
|
125
123
|
"vite": "^5.0.0 || ^6.0.0"
|
126
124
|
},
|
127
125
|
"peerDependenciesMeta": {
|
@@ -129,9 +127,6 @@
|
|
129
127
|
"optional": true
|
130
128
|
}
|
131
129
|
},
|
132
|
-
"optionalDependencies": {
|
133
|
-
"sharp": "^0.33.3"
|
134
|
-
},
|
135
130
|
"engines": {
|
136
131
|
"node": ">=18.0.0"
|
137
132
|
},
|
@@ -1,5 +1,6 @@
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/
|
2
|
-
|
1
|
+
import type { Meta, StoryObj } from '@storybook/experimental-nextjs-vite';
|
2
|
+
|
3
|
+
import { expect, userEvent, within } from 'storybook/test';
|
3
4
|
|
4
5
|
import { Page } from './Page';
|
5
6
|
|
@@ -1,266 +0,0 @@
|
|
1
|
-
interface MockResultReturn<T> {
|
2
|
-
type: 'return';
|
3
|
-
/**
|
4
|
-
* The value that was returned from the function. If function returned a Promise, then this will be a resolved value.
|
5
|
-
*/
|
6
|
-
value: T;
|
7
|
-
}
|
8
|
-
interface MockResultIncomplete {
|
9
|
-
type: 'incomplete';
|
10
|
-
value: undefined;
|
11
|
-
}
|
12
|
-
interface MockResultThrow {
|
13
|
-
type: 'throw';
|
14
|
-
/**
|
15
|
-
* An error that was thrown during function execution.
|
16
|
-
*/
|
17
|
-
value: any;
|
18
|
-
}
|
19
|
-
interface MockSettledResultFulfilled<T> {
|
20
|
-
type: 'fulfilled';
|
21
|
-
value: T;
|
22
|
-
}
|
23
|
-
interface MockSettledResultRejected {
|
24
|
-
type: 'rejected';
|
25
|
-
value: any;
|
26
|
-
}
|
27
|
-
type MockResult<T> = MockResultReturn<T> | MockResultThrow | MockResultIncomplete;
|
28
|
-
type MockSettledResult<T> = MockSettledResultFulfilled<T> | MockSettledResultRejected;
|
29
|
-
interface MockContext<T extends Procedure> {
|
30
|
-
/**
|
31
|
-
* This is an array containing all arguments for each call. One item of the array is the arguments of that call.
|
32
|
-
*
|
33
|
-
* @example
|
34
|
-
* const fn = vi.fn()
|
35
|
-
*
|
36
|
-
* fn('arg1', 'arg2')
|
37
|
-
* fn('arg3')
|
38
|
-
*
|
39
|
-
* fn.mock.calls === [
|
40
|
-
* ['arg1', 'arg2'], // first call
|
41
|
-
* ['arg3'], // second call
|
42
|
-
* ]
|
43
|
-
*/
|
44
|
-
calls: Parameters<T>[];
|
45
|
-
/**
|
46
|
-
* This is an array containing all instances that were instantiated when mock was called with a `new` keyword. Note that this is an actual context (`this`) of the function, not a return value.
|
47
|
-
*/
|
48
|
-
instances: ReturnType<T>[];
|
49
|
-
/**
|
50
|
-
* An array of `this` values that were used during each call to the mock function.
|
51
|
-
*/
|
52
|
-
contexts: ThisParameterType<T>[];
|
53
|
-
/**
|
54
|
-
* The order of mock's execution. This returns an array of numbers which are shared between all defined mocks.
|
55
|
-
*
|
56
|
-
* @example
|
57
|
-
* const fn1 = vi.fn()
|
58
|
-
* const fn2 = vi.fn()
|
59
|
-
*
|
60
|
-
* fn1()
|
61
|
-
* fn2()
|
62
|
-
* fn1()
|
63
|
-
*
|
64
|
-
* fn1.mock.invocationCallOrder === [1, 3]
|
65
|
-
* fn2.mock.invocationCallOrder === [2]
|
66
|
-
*/
|
67
|
-
invocationCallOrder: number[];
|
68
|
-
/**
|
69
|
-
* This is an array containing all values that were `returned` from the function.
|
70
|
-
*
|
71
|
-
* The `value` property contains the returned value or thrown error. If the function returned a `Promise`, then `result` will always be `'return'` even if the promise was rejected.
|
72
|
-
*
|
73
|
-
* @example
|
74
|
-
* const fn = vi.fn()
|
75
|
-
* .mockReturnValueOnce('result')
|
76
|
-
* .mockImplementationOnce(() => { throw new Error('thrown error') })
|
77
|
-
*
|
78
|
-
* const result = fn()
|
79
|
-
*
|
80
|
-
* try {
|
81
|
-
* fn()
|
82
|
-
* }
|
83
|
-
* catch {}
|
84
|
-
*
|
85
|
-
* fn.mock.results === [
|
86
|
-
* {
|
87
|
-
* type: 'return',
|
88
|
-
* value: 'result',
|
89
|
-
* },
|
90
|
-
* {
|
91
|
-
* type: 'throw',
|
92
|
-
* value: Error,
|
93
|
-
* },
|
94
|
-
* ]
|
95
|
-
*/
|
96
|
-
results: MockResult<ReturnType<T>>[];
|
97
|
-
/**
|
98
|
-
* An array containing all values that were `resolved` or `rejected` from the function.
|
99
|
-
*
|
100
|
-
* This array will be empty if the function was never resolved or rejected.
|
101
|
-
*
|
102
|
-
* @example
|
103
|
-
* const fn = vi.fn().mockResolvedValueOnce('result')
|
104
|
-
*
|
105
|
-
* const result = fn()
|
106
|
-
*
|
107
|
-
* fn.mock.settledResults === []
|
108
|
-
* fn.mock.results === [
|
109
|
-
* {
|
110
|
-
* type: 'return',
|
111
|
-
* value: Promise<'result'>,
|
112
|
-
* },
|
113
|
-
* ]
|
114
|
-
*
|
115
|
-
* await result
|
116
|
-
*
|
117
|
-
* fn.mock.settledResults === [
|
118
|
-
* {
|
119
|
-
* type: 'fulfilled',
|
120
|
-
* value: 'result',
|
121
|
-
* },
|
122
|
-
* ]
|
123
|
-
*/
|
124
|
-
settledResults: MockSettledResult<Awaited<ReturnType<T>>>[];
|
125
|
-
/**
|
126
|
-
* This contains the arguments of the last call. If spy wasn't called, will return `undefined`.
|
127
|
-
*/
|
128
|
-
lastCall: Parameters<T> | undefined;
|
129
|
-
}
|
130
|
-
type Procedure = (...args: any[]) => any;
|
131
|
-
type NormalizedPrecedure<T extends Procedure> = (...args: Parameters<T>) => ReturnType<T>;
|
132
|
-
interface MockInstance<T extends Procedure = Procedure> {
|
133
|
-
/**
|
134
|
-
* Use it to return the name given to mock with method `.mockName(name)`.
|
135
|
-
*/
|
136
|
-
getMockName(): string;
|
137
|
-
/**
|
138
|
-
* Sets internal mock name. Useful to see the name of the mock if an assertion fails.
|
139
|
-
*/
|
140
|
-
mockName(n: string): this;
|
141
|
-
/**
|
142
|
-
* Current context of the mock. It stores information about all invocation calls, instances, and results.
|
143
|
-
*/
|
144
|
-
mock: MockContext<T>;
|
145
|
-
/**
|
146
|
-
* Clears all information about every call. After calling it, all properties on `.mock` will return an empty state. This method does not reset implementations.
|
147
|
-
*
|
148
|
-
* It is useful if you need to clean up mock between different assertions.
|
149
|
-
*/
|
150
|
-
mockClear(): this;
|
151
|
-
/**
|
152
|
-
* Does what `mockClear` does and makes inner implementation an empty function (returning `undefined` when invoked). This also resets all "once" implementations.
|
153
|
-
*
|
154
|
-
* This is useful when you want to completely reset a mock to the default state.
|
155
|
-
*/
|
156
|
-
mockReset(): this;
|
157
|
-
/**
|
158
|
-
* Does what `mockReset` does and restores inner implementation to the original function.
|
159
|
-
*
|
160
|
-
* Note that restoring mock from `vi.fn()` will set implementation to an empty function that returns `undefined`. Restoring a `vi.fn(impl)` will restore implementation to `impl`.
|
161
|
-
*/
|
162
|
-
mockRestore(): void;
|
163
|
-
/**
|
164
|
-
* Returns current mock implementation if there is one.
|
165
|
-
*
|
166
|
-
* If mock was created with `vi.fn`, it will consider passed down method as a mock implementation.
|
167
|
-
*
|
168
|
-
* If mock was created with `vi.spyOn`, it will return `undefined` unless a custom implementation was provided.
|
169
|
-
*/
|
170
|
-
getMockImplementation(): NormalizedPrecedure<T> | undefined;
|
171
|
-
/**
|
172
|
-
* Accepts a function that will be used as an implementation of the mock.
|
173
|
-
* @example
|
174
|
-
* const increment = vi.fn().mockImplementation(count => count + 1);
|
175
|
-
* expect(increment(3)).toBe(4);
|
176
|
-
*/
|
177
|
-
mockImplementation(fn: NormalizedPrecedure<T>): this;
|
178
|
-
/**
|
179
|
-
* Accepts a function that will be used as a mock implementation during the next call. Can be chained so that multiple function calls produce different results.
|
180
|
-
* @example
|
181
|
-
* const fn = vi.fn(count => count).mockImplementationOnce(count => count + 1);
|
182
|
-
* expect(fn(3)).toBe(4);
|
183
|
-
* expect(fn(3)).toBe(3);
|
184
|
-
*/
|
185
|
-
mockImplementationOnce(fn: NormalizedPrecedure<T>): this;
|
186
|
-
/**
|
187
|
-
* Overrides the original mock implementation temporarily while the callback is being executed.
|
188
|
-
* @example
|
189
|
-
* const myMockFn = vi.fn(() => 'original')
|
190
|
-
*
|
191
|
-
* myMockFn.withImplementation(() => 'temp', () => {
|
192
|
-
* myMockFn() // 'temp'
|
193
|
-
* })
|
194
|
-
*
|
195
|
-
* myMockFn() // 'original'
|
196
|
-
*/
|
197
|
-
withImplementation<T2>(fn: NormalizedPrecedure<T>, cb: () => T2): T2 extends Promise<unknown> ? Promise<this> : this;
|
198
|
-
/**
|
199
|
-
* Use this if you need to return `this` context from the method without invoking actual implementation.
|
200
|
-
*/
|
201
|
-
mockReturnThis(): this;
|
202
|
-
/**
|
203
|
-
* Accepts a value that will be returned whenever the mock function is called.
|
204
|
-
*/
|
205
|
-
mockReturnValue(obj: ReturnType<T>): this;
|
206
|
-
/**
|
207
|
-
* Accepts a value that will be returned during the next function call. If chained, every consecutive call will return the specified value.
|
208
|
-
*
|
209
|
-
* When there are no more `mockReturnValueOnce` values to use, mock will fallback to the previously defined implementation if there is one.
|
210
|
-
* @example
|
211
|
-
* const myMockFn = vi
|
212
|
-
* .fn()
|
213
|
-
* .mockReturnValue('default')
|
214
|
-
* .mockReturnValueOnce('first call')
|
215
|
-
* .mockReturnValueOnce('second call')
|
216
|
-
*
|
217
|
-
* // 'first call', 'second call', 'default'
|
218
|
-
* console.log(myMockFn(), myMockFn(), myMockFn())
|
219
|
-
*/
|
220
|
-
mockReturnValueOnce(obj: ReturnType<T>): this;
|
221
|
-
/**
|
222
|
-
* Accepts a value that will be resolved when async function is called.
|
223
|
-
* @example
|
224
|
-
* const asyncMock = vi.fn().mockResolvedValue(42)
|
225
|
-
* asyncMock() // Promise<42>
|
226
|
-
*/
|
227
|
-
mockResolvedValue(obj: Awaited<ReturnType<T>>): this;
|
228
|
-
/**
|
229
|
-
* Accepts a value that will be resolved during the next function call. If chained, every consecutive call will resolve specified value.
|
230
|
-
* @example
|
231
|
-
* const myMockFn = vi
|
232
|
-
* .fn()
|
233
|
-
* .mockResolvedValue('default')
|
234
|
-
* .mockResolvedValueOnce('first call')
|
235
|
-
* .mockResolvedValueOnce('second call')
|
236
|
-
*
|
237
|
-
* // Promise<'first call'>, Promise<'second call'>, Promise<'default'>
|
238
|
-
* console.log(myMockFn(), myMockFn(), myMockFn())
|
239
|
-
*/
|
240
|
-
mockResolvedValueOnce(obj: Awaited<ReturnType<T>>): this;
|
241
|
-
/**
|
242
|
-
* Accepts an error that will be rejected when async function is called.
|
243
|
-
* @example
|
244
|
-
* const asyncMock = vi.fn().mockRejectedValue(new Error('Async error'))
|
245
|
-
* await asyncMock() // throws 'Async error'
|
246
|
-
*/
|
247
|
-
mockRejectedValue(obj: any): this;
|
248
|
-
/**
|
249
|
-
* Accepts a value that will be rejected during the next function call. If chained, every consecutive call will reject specified value.
|
250
|
-
* @example
|
251
|
-
* const asyncMock = vi
|
252
|
-
* .fn()
|
253
|
-
* .mockResolvedValueOnce('first call')
|
254
|
-
* .mockRejectedValueOnce(new Error('Async error'))
|
255
|
-
*
|
256
|
-
* await asyncMock() // first call
|
257
|
-
* await asyncMock() // throws "Async error"
|
258
|
-
*/
|
259
|
-
mockRejectedValueOnce(obj: any): this;
|
260
|
-
}
|
261
|
-
interface Mock<T extends Procedure = Procedure> extends MockInstance<T> {
|
262
|
-
new (...args: Parameters<T>): ReturnType<T>;
|
263
|
-
(...args: Parameters<T>): ReturnType<T>;
|
264
|
-
}
|
265
|
-
|
266
|
-
export { Mock as M };
|
@@ -1,53 +0,0 @@
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react';
|
2
|
-
import { fn } from '@storybook/test';
|
3
|
-
|
4
|
-
import { Button } from './Button';
|
5
|
-
|
6
|
-
// More on how to set up stories at: https://storybook.js.org/docs/writing-stories#default-export
|
7
|
-
const meta: Meta<typeof Button> = {
|
8
|
-
title: 'Example/Button',
|
9
|
-
component: Button,
|
10
|
-
parameters: {
|
11
|
-
// Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout
|
12
|
-
layout: 'centered',
|
13
|
-
},
|
14
|
-
// This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs
|
15
|
-
tags: ['autodocs'],
|
16
|
-
// More on argTypes: https://storybook.js.org/docs/api/argtypes
|
17
|
-
argTypes: {
|
18
|
-
backgroundColor: { control: 'color' },
|
19
|
-
},
|
20
|
-
// Use `fn` to spy on the onClick arg, which will appear in the actions panel once invoked: https://storybook.js.org/docs/essentials/actions#action-args
|
21
|
-
args: { onClick: fn() },
|
22
|
-
};
|
23
|
-
|
24
|
-
export default meta;
|
25
|
-
type Story = StoryObj<typeof Button>;
|
26
|
-
|
27
|
-
// More on writing stories with args: https://storybook.js.org/docs/writing-stories/args
|
28
|
-
export const Primary: Story = {
|
29
|
-
args: {
|
30
|
-
primary: true,
|
31
|
-
label: 'Button',
|
32
|
-
},
|
33
|
-
};
|
34
|
-
|
35
|
-
export const Secondary: Story = {
|
36
|
-
args: {
|
37
|
-
label: 'Button',
|
38
|
-
},
|
39
|
-
};
|
40
|
-
|
41
|
-
export const Large: Story = {
|
42
|
-
args: {
|
43
|
-
size: 'large',
|
44
|
-
label: 'Button',
|
45
|
-
},
|
46
|
-
};
|
47
|
-
|
48
|
-
export const Small: Story = {
|
49
|
-
args: {
|
50
|
-
size: 'small',
|
51
|
-
label: 'Button',
|
52
|
-
},
|
53
|
-
};
|
@@ -1,41 +0,0 @@
|
|
1
|
-
import React from 'react';
|
2
|
-
|
3
|
-
import './button.css';
|
4
|
-
|
5
|
-
export interface ButtonProps {
|
6
|
-
/** Is this the principal call to action on the page? */
|
7
|
-
primary?: boolean;
|
8
|
-
/** What background color to use */
|
9
|
-
backgroundColor?: string;
|
10
|
-
/** How large should the button be? */
|
11
|
-
size?: 'small' | 'medium' | 'large';
|
12
|
-
/** Button contents */
|
13
|
-
label: string;
|
14
|
-
/** Optional click handler */
|
15
|
-
onClick?: () => void;
|
16
|
-
}
|
17
|
-
|
18
|
-
/** Primary UI component for user interaction */
|
19
|
-
export const Button = ({
|
20
|
-
primary = false,
|
21
|
-
size = 'medium',
|
22
|
-
backgroundColor,
|
23
|
-
label,
|
24
|
-
...props
|
25
|
-
}: ButtonProps) => {
|
26
|
-
const mode = primary ? 'storybook-button--primary' : 'storybook-button--secondary';
|
27
|
-
return (
|
28
|
-
<button
|
29
|
-
type="button"
|
30
|
-
className={['storybook-button', `storybook-button--${size}`, mode].join(' ')}
|
31
|
-
{...props}
|
32
|
-
>
|
33
|
-
{label}
|
34
|
-
<style jsx>{`
|
35
|
-
button {
|
36
|
-
background-color: ${backgroundColor};
|
37
|
-
}
|
38
|
-
`}</style>
|
39
|
-
</button>
|
40
|
-
);
|
41
|
-
};
|