@storybook/addon-vitest 0.0.0-pr-32020-sha-dbc6ee9c → 0.0.0-pr-32047-sha-849844bb
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/vitest-plugin/index.d.ts +6 -0
- package/dist/vitest-plugin/index.js +2 -2
- package/dist/vitest-plugin/index.mjs +3 -3
- package/dist/vitest-plugin/playwright-utils.d.ts +42648 -0
- package/dist/vitest-plugin/playwright-utils.js +34 -0
- package/dist/vitest-plugin/playwright-utils.mjs +29 -0
- package/dist/vitest-plugin/test-utils.js +1 -1
- package/dist/vitest-plugin/test-utils.mjs +1 -1
- package/package.json +8 -2
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var convertToFilePath=url=>url.replace(/^file:\/\//,"").replace(/^\/+([a-zA-Z]:)/,"$1").replace(/%20/g," ");async function prepareScript(page){await page.goto("http://localhost:6006/iframe.html",{waitUntil:"load"}).catch(err=>{if(err.message?.includes("ERR_CONNECTION_REFUSED")){let errorMessage=`Could not access the Storybook instance at http://localhost:6006. Are you sure it's running?
|
|
4
|
+
|
|
5
|
+
${err.message}`;throw new Error(errorMessage)}throw err}),await page.exposeBinding("logToPage",(_,message)=>console.log(message));}async function setupPageScript(page){await page.evaluate(async()=>{let TEST_RUNNER_STORYBOOK_URL="http://localhost:6006",TEST_RUNNER_VERSION="1.0.0",TEST_RUNNER_RENDERED_EVENT="storyFinished",TEST_RUNNER_VIEW_MODE="story",TEST_RUNNER_LOG_LEVEL="verbose",bold=message=>`\x1B[1m${message}\x1B[22m`,magenta=message=>`\x1B[35m${message}\x1B[39m`,blue=message=>`\x1B[34m${message}\x1B[39m`,red=message=>`\x1B[31m${message}\x1B[39m`,yellow=message=>`\x1B[33m${message}\x1B[39m`,grey=message=>`\x1B[90m${message}\x1B[39m`,LIMIT_REPLACE_NODE="[...]",CIRCULAR_REPLACE_NODE="[Circular]",arr=[],replacerStack=[];function defaultOptions(){return {depthLimit:Number.MAX_SAFE_INTEGER,edgesLimit:Number.MAX_SAFE_INTEGER}}function stringify(obj,replacer,spacer,options){typeof options>"u"&&(options=defaultOptions()),decirc(obj,"",0,[],void 0,0,options);let res;try{replacerStack.length===0?res=JSON.stringify(obj,replacer,spacer):res=JSON.stringify(obj,replaceGetterValues(replacer),spacer);}catch{return JSON.stringify("[unable to serialize, circular reference is too complex to analyze]")}finally{for(;arr.length!==0;){let part=arr.pop();part&&part.length===4?Object.defineProperty(part[0],part[1],part[3]):part&&(part[0][part[1]]=part[2]);}}return res}function decirc(val,k,edgeIndex,stack,parent,depth,options){depth+=1;let i;if(typeof val=="object"&&val!==null){for(i=0;i<stack.length;i++)if(stack[i]===val){setReplace(CIRCULAR_REPLACE_NODE,val,k,parent);return}if(depth>options.depthLimit||edgeIndex+1>options.edgesLimit){setReplace(LIMIT_REPLACE_NODE,val,k,parent);return}if(stack.push(val),Array.isArray(val))for(i=0;i<val.length;i++)decirc(val[i],i.toString(),i,stack,val,depth,options);else {let keys=Object.keys(val);for(i=0;i<keys.length;i++){let key=keys[i];decirc(val[key],key,i,stack,val,depth,options);}}stack.pop();}}function setReplace(replace,val,k,parent){if(!parent)return;let propertyDescriptor=Object.getOwnPropertyDescriptor(parent,k);propertyDescriptor&&propertyDescriptor.get!==void 0?propertyDescriptor.configurable?(Object.defineProperty(parent,k,{value:replace}),arr.push([parent,k,val,propertyDescriptor])):replacerStack.push([val,k,replace]):(parent[k]=replace,arr.push([parent,k,val]));}function replaceGetterValues(replacer){let effectiveReplacer=replacer??((_k,v)=>v);return function(key,val){if(replacerStack.length>0)for(let i=0;i<replacerStack.length;i++){let part=replacerStack[i];if(part[1]===key&&part[0]===val){val=part[2],replacerStack.splice(i,1);break}}return effectiveReplacer.call(this,key,val)}}function composeMessage(args){return args instanceof Error?`${args.name}: ${args.message}
|
|
6
|
+
${args.stack}`:typeof args>"u"?"undefined":typeof args=="string"?args:stringify(args,null,null,{depthLimit:5,edgesLimit:100})}function truncate(input,limit){return input.length>limit?input.substring(0,limit)+"\u2026":input}function addToUserAgent(extra){let originalUserAgent=globalThis.navigator.userAgent;originalUserAgent.includes(extra)||Object.defineProperty(globalThis.navigator,"userAgent",{get:function(){return [originalUserAgent,extra].join(" ")},configurable:!0});}function getStory(){let currentRender=globalThis.__STORYBOOK_PREVIEW__.currentRender;return currentRender&&"story"in currentRender?currentRender.story:{}}class StorybookTestRunnerError extends Error{constructor(params){let{storyId,errorMessage,logs=[],isMessageFormatted=!1}=params,message=isMessageFormatted?errorMessage:StorybookTestRunnerError.buildErrorMessage({storyId,errorMessage,logs});super(message),this.name="StorybookTestRunnerError";}static buildErrorMessage(params){let{storyId,errorMessage,logs=[],panel,errorMessagePrefix=""}=params,storyUrl=`${TEST_RUNNER_STORYBOOK_URL}?path=/story/${storyId}`,finalStoryUrl=panel?`${storyUrl}&addonPanel=${panel}`:storyUrl,separator=`
|
|
7
|
+
|
|
8
|
+
--------------------------------------------------`,finalLogs=logs.filter(err=>!err.includes(errorMessage)),extraLogs=finalLogs.length>0?separator+`
|
|
9
|
+
|
|
10
|
+
Browser logs:
|
|
11
|
+
|
|
12
|
+
`+finalLogs.join(`
|
|
13
|
+
|
|
14
|
+
`):"",linkPrefix=blue(`
|
|
15
|
+
Click to debug the error directly in Storybook:
|
|
16
|
+
${finalStoryUrl}
|
|
17
|
+
|
|
18
|
+
`);return `${errorMessagePrefix}${linkPrefix}Message:
|
|
19
|
+
${truncate(errorMessage,1e3)}
|
|
20
|
+
${extraLogs}`}}async function __waitForStorybook(){return new Promise((resolve,reject)=>{let timeout=setTimeout(()=>{reject();},1e4);if(document.querySelector("#root")||document.querySelector("#storybook-root"))return clearTimeout(timeout),resolve();let observer=new MutationObserver(()=>{(document.querySelector("#root")||document.querySelector("#storybook-root"))&&(clearTimeout(timeout),resolve(),observer.disconnect());});observer.observe(document.body,{childList:!0,subtree:!0});})}function isServerComponentError(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"))}function expectToHaveNoViolations(results){let violations=filterViolations(results.violations,results.toolOptions?.impactLevels??[]);function reporter(violations2){if(violations2.length===0)return null;let lineBreak=`
|
|
21
|
+
|
|
22
|
+
`;return violations2.map(violation=>violation.nodes.map(node=>{let selector=node.target.join(", ");return red(`Expected the HTML found at $('${selector}') to have no violations:`)+lineBreak+grey(node.html)+lineBreak+red("Received:")+lineBreak+red(`"${violation.help} (${violation.id})"`)+lineBreak+yellow(node.failureSummary)+lineBreak+(violation.helpUrl?red("You can find more information on this issue here:")+`
|
|
23
|
+
${blue(violation.helpUrl)}`:"")}).join(lineBreak)).join(lineBreak+"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"+lineBreak)}return {long:reporter(violations),short:`Found ${violations.length} a11y violations, run the test with 'a11y: { test: 'error' }' parameter to see the full report or debug it directly in Storybook.`}}function filterViolations(violations,impactLevels){return impactLevels&&impactLevels.length>0?violations.filter(v=>impactLevels.includes(v.impact)):violations}async function __test(storyId){try{await __waitForStorybook();}catch{let message=`Timed out waiting for Storybook to load after 10 seconds. Are you sure the Storybook is running correctly in that URL? Is the Storybook private (e.g. under authentication layers)?
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
HTML: ${document.body.innerHTML}`;throw new StorybookTestRunnerError({storyId,errorMessage:message})}let channel=globalThis.__STORYBOOK_ADDONS_CHANNEL__;if(!channel)throw new StorybookTestRunnerError({storyId,errorMessage:"The test runner could not access the Storybook channel. Are you sure the Storybook is running correctly in that URL?"});addToUserAgent(`(StorybookTestRunner@${TEST_RUNNER_VERSION})`);let logs=[],hasErrors=!1,logLevelMapping={log:["info","verbose"],warn:["info","warn","verbose"],error:["info","warn","error","verbose"],info:["verbose"],trace:["verbose"],debug:["verbose"],group:["verbose"],groupCollapsed:["verbose"],table:["verbose"],dir:["verbose"]},spyOnConsole=(method,name)=>{let originalFn=console[method].bind(console);console[method]=function(...args){if(method==="error"&&isServerComponentError(args[0]))return;let shouldCollectError=method==="error";shouldCollectError&&(hasErrors=!0);let message=args.map(composeMessage).join(", ");if(method==="trace"){let stackTrace=new Error().stack;message+=`
|
|
27
|
+
${stackTrace}
|
|
28
|
+
`;}if(logLevelMapping[method].includes(TEST_RUNNER_LOG_LEVEL)||shouldCollectError){let prefix=`${bold(name)}: `;logs.push(prefix+message);}originalFn(...args);};};Object.entries({log:blue,info:blue,warn:yellow,error:red,dir:magenta,trace:magenta,group:magenta,groupCollapsed:magenta,table:magenta,debug:magenta}).forEach(([method,color])=>{spyOnConsole(method,color(method));});let cleanup=_listeners=>{Object.entries(_listeners).forEach(([eventName,listener])=>{channel.off(eventName,listener);});};return new Promise((resolve,reject)=>{let rejectWithFormattedError=(storyId2,message,panel)=>{let errorMessage=StorybookTestRunnerError.buildErrorMessage({storyId:storyId2,errorMessage:message,logs,panel});reject(new StorybookTestRunnerError({storyId:storyId2,errorMessage,logs,isMessageFormatted:!0}));},INTERACTIONS_PANEL="storybook/interactions/panel",A11Y_PANEL="storybook/a11y/panel",listeners={[TEST_RUNNER_RENDERED_EVENT]:data=>{if(cleanup(listeners),hasErrors){rejectWithFormattedError(storyId,"Browser console errors");return}else if(data?.reporters){let story=getStory(),a11yGlobals=story.globals?.a11y,a11yParameter=story.parameters?.a11y,a11yTestParameter=a11yParameter?.test,a11yReport=data.reporters.find(reporter=>reporter.type==="a11y");if(a11yParameter?.disable!==!0&&a11yParameter?.test!=="off"&&a11yGlobals?.manual!==!0&&a11yReport?.result?.violations?.length>0){let violations=expectToHaveNoViolations(a11yReport.result);if(violations&&a11yTestParameter==="error"){rejectWithFormattedError(storyId,violations.long,A11Y_PANEL);return}else if(violations&&a11yTestParameter==="todo"){let warningMessage=StorybookTestRunnerError.buildErrorMessage({storyId,errorMessagePrefix:`--------------------------
|
|
29
|
+
${story.title} > ${story.name}`,errorMessage:yellow(violations.short),logs,panel:A11Y_PANEL});logToPage(warningMessage);}}}resolve(document.getElementById("root"));},storyUnchanged:()=>{cleanup(listeners),resolve(document.getElementById("root"));},storyErrored:({description})=>{cleanup(listeners),rejectWithFormattedError(storyId,description,INTERACTIONS_PANEL);},storyThrewException:error=>{cleanup(listeners),rejectWithFormattedError(storyId,error.message,INTERACTIONS_PANEL);},playFunctionThrewException:error=>{cleanup(listeners),rejectWithFormattedError(storyId,error.message,INTERACTIONS_PANEL);},unhandledErrorsWhilePlaying:([error])=>{cleanup(listeners),rejectWithFormattedError(storyId,error.message,INTERACTIONS_PANEL);},storyMissing:id=>{cleanup(listeners),id===storyId&&rejectWithFormattedError(storyId,"The story was missing when trying to access it.");}};Object.entries(listeners).forEach(([eventName,listener])=>{channel.on(eventName,listener);}),channel.emit("setCurrentStory",{storyId,viewMode:TEST_RUNNER_VIEW_MODE});})}globalThis.__test=__test;});}async function testStory(storyId,page){await page.evaluate(async storyId2=>await globalThis.__test(storyId2),storyId);}
|
|
30
|
+
|
|
31
|
+
exports.convertToFilePath = convertToFilePath;
|
|
32
|
+
exports.prepareScript = prepareScript;
|
|
33
|
+
exports.setupPageScript = setupPageScript;
|
|
34
|
+
exports.testStory = testStory;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
var convertToFilePath=url=>url.replace(/^file:\/\//,"").replace(/^\/+([a-zA-Z]:)/,"$1").replace(/%20/g," ");async function prepareScript(page){await page.goto("http://localhost:6006/iframe.html",{waitUntil:"load"}).catch(err=>{if(err.message?.includes("ERR_CONNECTION_REFUSED")){let errorMessage=`Could not access the Storybook instance at http://localhost:6006. Are you sure it's running?
|
|
2
|
+
|
|
3
|
+
${err.message}`;throw new Error(errorMessage)}throw err}),await page.exposeBinding("logToPage",(_,message)=>console.log(message));}async function setupPageScript(page){await page.evaluate(async()=>{let TEST_RUNNER_STORYBOOK_URL="http://localhost:6006",TEST_RUNNER_VERSION="1.0.0",TEST_RUNNER_RENDERED_EVENT="storyFinished",TEST_RUNNER_VIEW_MODE="story",TEST_RUNNER_LOG_LEVEL="verbose",bold=message=>`\x1B[1m${message}\x1B[22m`,magenta=message=>`\x1B[35m${message}\x1B[39m`,blue=message=>`\x1B[34m${message}\x1B[39m`,red=message=>`\x1B[31m${message}\x1B[39m`,yellow=message=>`\x1B[33m${message}\x1B[39m`,grey=message=>`\x1B[90m${message}\x1B[39m`,LIMIT_REPLACE_NODE="[...]",CIRCULAR_REPLACE_NODE="[Circular]",arr=[],replacerStack=[];function defaultOptions(){return {depthLimit:Number.MAX_SAFE_INTEGER,edgesLimit:Number.MAX_SAFE_INTEGER}}function stringify(obj,replacer,spacer,options){typeof options>"u"&&(options=defaultOptions()),decirc(obj,"",0,[],void 0,0,options);let res;try{replacerStack.length===0?res=JSON.stringify(obj,replacer,spacer):res=JSON.stringify(obj,replaceGetterValues(replacer),spacer);}catch{return JSON.stringify("[unable to serialize, circular reference is too complex to analyze]")}finally{for(;arr.length!==0;){let part=arr.pop();part&&part.length===4?Object.defineProperty(part[0],part[1],part[3]):part&&(part[0][part[1]]=part[2]);}}return res}function decirc(val,k,edgeIndex,stack,parent,depth,options){depth+=1;let i;if(typeof val=="object"&&val!==null){for(i=0;i<stack.length;i++)if(stack[i]===val){setReplace(CIRCULAR_REPLACE_NODE,val,k,parent);return}if(depth>options.depthLimit||edgeIndex+1>options.edgesLimit){setReplace(LIMIT_REPLACE_NODE,val,k,parent);return}if(stack.push(val),Array.isArray(val))for(i=0;i<val.length;i++)decirc(val[i],i.toString(),i,stack,val,depth,options);else {let keys=Object.keys(val);for(i=0;i<keys.length;i++){let key=keys[i];decirc(val[key],key,i,stack,val,depth,options);}}stack.pop();}}function setReplace(replace,val,k,parent){if(!parent)return;let propertyDescriptor=Object.getOwnPropertyDescriptor(parent,k);propertyDescriptor&&propertyDescriptor.get!==void 0?propertyDescriptor.configurable?(Object.defineProperty(parent,k,{value:replace}),arr.push([parent,k,val,propertyDescriptor])):replacerStack.push([val,k,replace]):(parent[k]=replace,arr.push([parent,k,val]));}function replaceGetterValues(replacer){let effectiveReplacer=replacer??((_k,v)=>v);return function(key,val){if(replacerStack.length>0)for(let i=0;i<replacerStack.length;i++){let part=replacerStack[i];if(part[1]===key&&part[0]===val){val=part[2],replacerStack.splice(i,1);break}}return effectiveReplacer.call(this,key,val)}}function composeMessage(args){return args instanceof Error?`${args.name}: ${args.message}
|
|
4
|
+
${args.stack}`:typeof args>"u"?"undefined":typeof args=="string"?args:stringify(args,null,null,{depthLimit:5,edgesLimit:100})}function truncate(input,limit){return input.length>limit?input.substring(0,limit)+"\u2026":input}function addToUserAgent(extra){let originalUserAgent=globalThis.navigator.userAgent;originalUserAgent.includes(extra)||Object.defineProperty(globalThis.navigator,"userAgent",{get:function(){return [originalUserAgent,extra].join(" ")},configurable:!0});}function getStory(){let currentRender=globalThis.__STORYBOOK_PREVIEW__.currentRender;return currentRender&&"story"in currentRender?currentRender.story:{}}class StorybookTestRunnerError extends Error{constructor(params){let{storyId,errorMessage,logs=[],isMessageFormatted=!1}=params,message=isMessageFormatted?errorMessage:StorybookTestRunnerError.buildErrorMessage({storyId,errorMessage,logs});super(message),this.name="StorybookTestRunnerError";}static buildErrorMessage(params){let{storyId,errorMessage,logs=[],panel,errorMessagePrefix=""}=params,storyUrl=`${TEST_RUNNER_STORYBOOK_URL}?path=/story/${storyId}`,finalStoryUrl=panel?`${storyUrl}&addonPanel=${panel}`:storyUrl,separator=`
|
|
5
|
+
|
|
6
|
+
--------------------------------------------------`,finalLogs=logs.filter(err=>!err.includes(errorMessage)),extraLogs=finalLogs.length>0?separator+`
|
|
7
|
+
|
|
8
|
+
Browser logs:
|
|
9
|
+
|
|
10
|
+
`+finalLogs.join(`
|
|
11
|
+
|
|
12
|
+
`):"",linkPrefix=blue(`
|
|
13
|
+
Click to debug the error directly in Storybook:
|
|
14
|
+
${finalStoryUrl}
|
|
15
|
+
|
|
16
|
+
`);return `${errorMessagePrefix}${linkPrefix}Message:
|
|
17
|
+
${truncate(errorMessage,1e3)}
|
|
18
|
+
${extraLogs}`}}async function __waitForStorybook(){return new Promise((resolve,reject)=>{let timeout=setTimeout(()=>{reject();},1e4);if(document.querySelector("#root")||document.querySelector("#storybook-root"))return clearTimeout(timeout),resolve();let observer=new MutationObserver(()=>{(document.querySelector("#root")||document.querySelector("#storybook-root"))&&(clearTimeout(timeout),resolve(),observer.disconnect());});observer.observe(document.body,{childList:!0,subtree:!0});})}function isServerComponentError(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"))}function expectToHaveNoViolations(results){let violations=filterViolations(results.violations,results.toolOptions?.impactLevels??[]);function reporter(violations2){if(violations2.length===0)return null;let lineBreak=`
|
|
19
|
+
|
|
20
|
+
`;return violations2.map(violation=>violation.nodes.map(node=>{let selector=node.target.join(", ");return red(`Expected the HTML found at $('${selector}') to have no violations:`)+lineBreak+grey(node.html)+lineBreak+red("Received:")+lineBreak+red(`"${violation.help} (${violation.id})"`)+lineBreak+yellow(node.failureSummary)+lineBreak+(violation.helpUrl?red("You can find more information on this issue here:")+`
|
|
21
|
+
${blue(violation.helpUrl)}`:"")}).join(lineBreak)).join(lineBreak+"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"+lineBreak)}return {long:reporter(violations),short:`Found ${violations.length} a11y violations, run the test with 'a11y: { test: 'error' }' parameter to see the full report or debug it directly in Storybook.`}}function filterViolations(violations,impactLevels){return impactLevels&&impactLevels.length>0?violations.filter(v=>impactLevels.includes(v.impact)):violations}async function __test(storyId){try{await __waitForStorybook();}catch{let message=`Timed out waiting for Storybook to load after 10 seconds. Are you sure the Storybook is running correctly in that URL? Is the Storybook private (e.g. under authentication layers)?
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
HTML: ${document.body.innerHTML}`;throw new StorybookTestRunnerError({storyId,errorMessage:message})}let channel=globalThis.__STORYBOOK_ADDONS_CHANNEL__;if(!channel)throw new StorybookTestRunnerError({storyId,errorMessage:"The test runner could not access the Storybook channel. Are you sure the Storybook is running correctly in that URL?"});addToUserAgent(`(StorybookTestRunner@${TEST_RUNNER_VERSION})`);let logs=[],hasErrors=!1,logLevelMapping={log:["info","verbose"],warn:["info","warn","verbose"],error:["info","warn","error","verbose"],info:["verbose"],trace:["verbose"],debug:["verbose"],group:["verbose"],groupCollapsed:["verbose"],table:["verbose"],dir:["verbose"]},spyOnConsole=(method,name)=>{let originalFn=console[method].bind(console);console[method]=function(...args){if(method==="error"&&isServerComponentError(args[0]))return;let shouldCollectError=method==="error";shouldCollectError&&(hasErrors=!0);let message=args.map(composeMessage).join(", ");if(method==="trace"){let stackTrace=new Error().stack;message+=`
|
|
25
|
+
${stackTrace}
|
|
26
|
+
`;}if(logLevelMapping[method].includes(TEST_RUNNER_LOG_LEVEL)||shouldCollectError){let prefix=`${bold(name)}: `;logs.push(prefix+message);}originalFn(...args);};};Object.entries({log:blue,info:blue,warn:yellow,error:red,dir:magenta,trace:magenta,group:magenta,groupCollapsed:magenta,table:magenta,debug:magenta}).forEach(([method,color])=>{spyOnConsole(method,color(method));});let cleanup=_listeners=>{Object.entries(_listeners).forEach(([eventName,listener])=>{channel.off(eventName,listener);});};return new Promise((resolve,reject)=>{let rejectWithFormattedError=(storyId2,message,panel)=>{let errorMessage=StorybookTestRunnerError.buildErrorMessage({storyId:storyId2,errorMessage:message,logs,panel});reject(new StorybookTestRunnerError({storyId:storyId2,errorMessage,logs,isMessageFormatted:!0}));},INTERACTIONS_PANEL="storybook/interactions/panel",A11Y_PANEL="storybook/a11y/panel",listeners={[TEST_RUNNER_RENDERED_EVENT]:data=>{if(cleanup(listeners),hasErrors){rejectWithFormattedError(storyId,"Browser console errors");return}else if(data?.reporters){let story=getStory(),a11yGlobals=story.globals?.a11y,a11yParameter=story.parameters?.a11y,a11yTestParameter=a11yParameter?.test,a11yReport=data.reporters.find(reporter=>reporter.type==="a11y");if(a11yParameter?.disable!==!0&&a11yParameter?.test!=="off"&&a11yGlobals?.manual!==!0&&a11yReport?.result?.violations?.length>0){let violations=expectToHaveNoViolations(a11yReport.result);if(violations&&a11yTestParameter==="error"){rejectWithFormattedError(storyId,violations.long,A11Y_PANEL);return}else if(violations&&a11yTestParameter==="todo"){let warningMessage=StorybookTestRunnerError.buildErrorMessage({storyId,errorMessagePrefix:`--------------------------
|
|
27
|
+
${story.title} > ${story.name}`,errorMessage:yellow(violations.short),logs,panel:A11Y_PANEL});logToPage(warningMessage);}}}resolve(document.getElementById("root"));},storyUnchanged:()=>{cleanup(listeners),resolve(document.getElementById("root"));},storyErrored:({description})=>{cleanup(listeners),rejectWithFormattedError(storyId,description,INTERACTIONS_PANEL);},storyThrewException:error=>{cleanup(listeners),rejectWithFormattedError(storyId,error.message,INTERACTIONS_PANEL);},playFunctionThrewException:error=>{cleanup(listeners),rejectWithFormattedError(storyId,error.message,INTERACTIONS_PANEL);},unhandledErrorsWhilePlaying:([error])=>{cleanup(listeners),rejectWithFormattedError(storyId,error.message,INTERACTIONS_PANEL);},storyMissing:id=>{cleanup(listeners),id===storyId&&rejectWithFormattedError(storyId,"The story was missing when trying to access it.");}};Object.entries(listeners).forEach(([eventName,listener])=>{channel.on(eventName,listener);}),channel.emit("setCurrentStory",{storyId,viewMode:TEST_RUNNER_VIEW_MODE});})}globalThis.__test=__test;});}async function testStory(storyId,page){await page.evaluate(async storyId2=>await globalThis.__test(storyId2),storyId);}
|
|
28
|
+
|
|
29
|
+
export { convertToFilePath, prepareScript, setupPageScript, testStory };
|
|
@@ -5,7 +5,7 @@ var previewApi = require('storybook/preview-api');
|
|
|
5
5
|
var previewErrors = require('storybook/internal/preview-errors');
|
|
6
6
|
var viewport = require('storybook/viewport');
|
|
7
7
|
|
|
8
|
-
var DEFAULT_VIEWPORT_DIMENSIONS={width:1200,height:900},validPixelOrNumber=/^\d+(px)?$/,percentagePattern=/^(\d+(\.\d+)?%)$/,vwPattern=/^(\d+(\.\d+)?vw)$/,vhPattern=/^(\d+(\.\d+)?vh)$/,emRemPattern=/^(\d+)(em|rem)$/,parseDimension=(value,dimension)=>{if(validPixelOrNumber.test(value))return Number.parseInt(value,10);if(percentagePattern.test(value)){let percentageValue=parseFloat(value)/100;return Math.round(DEFAULT_VIEWPORT_DIMENSIONS[dimension]*percentageValue)}else if(vwPattern.test(value)){let vwValue=parseFloat(value)/100;return Math.round(DEFAULT_VIEWPORT_DIMENSIONS.width*vwValue)}else if(vhPattern.test(value)){let vhValue=parseFloat(value)/100;return Math.round(DEFAULT_VIEWPORT_DIMENSIONS.height*vhValue)}else {if(emRemPattern.test(value))return Number.parseInt(value,10)*16;throw new previewErrors.UnsupportedViewportDimensionError({dimension,value})}},setViewport=async(parameters={},globals={})=>{let defaultViewport,viewportsParam=parameters.viewport??{},viewportsGlobal=globals.viewport??{},isDisabled=viewportsParam.disable||viewportsParam.disabled;viewportsGlobal.value&&!isDisabled?defaultViewport=viewportsGlobal.value:isDisabled||(defaultViewport=viewportsParam.defaultViewport);let
|
|
8
|
+
var DEFAULT_VIEWPORT_DIMENSIONS={width:1200,height:900},validPixelOrNumber=/^\d+(px)?$/,percentagePattern=/^(\d+(\.\d+)?%)$/,vwPattern=/^(\d+(\.\d+)?vw)$/,vhPattern=/^(\d+(\.\d+)?vh)$/,emRemPattern=/^(\d+)(em|rem)$/,parseDimension=(value,dimension)=>{if(validPixelOrNumber.test(value))return Number.parseInt(value,10);if(percentagePattern.test(value)){let percentageValue=parseFloat(value)/100;return Math.round(DEFAULT_VIEWPORT_DIMENSIONS[dimension]*percentageValue)}else if(vwPattern.test(value)){let vwValue=parseFloat(value)/100;return Math.round(DEFAULT_VIEWPORT_DIMENSIONS.width*vwValue)}else if(vhPattern.test(value)){let vhValue=parseFloat(value)/100;return Math.round(DEFAULT_VIEWPORT_DIMENSIONS.height*vhValue)}else {if(emRemPattern.test(value))return Number.parseInt(value,10)*16;throw new previewErrors.UnsupportedViewportDimensionError({dimension,value})}},setViewport=async(parameters={},globals={},pwPage)=>{let defaultViewport,viewportsParam=parameters.viewport??{},viewportsGlobal=globals.viewport??{},isDisabled=viewportsParam.disable||viewportsParam.disabled;viewportsGlobal.value&&!isDisabled?defaultViewport=viewportsGlobal.value:isDisabled||(defaultViewport=viewportsParam.defaultViewport);let page=pwPage;if(page||(page=(await import('@vitest/browser/context').catch(()=>({page:null}))).page),!page||!globalThis.__vitest_browser__)return;let viewports={...viewport.MINIMAL_VIEWPORTS,...viewportsParam.viewports,...viewportsParam.options},viewportWidth=DEFAULT_VIEWPORT_DIMENSIONS.width,viewportHeight=DEFAULT_VIEWPORT_DIMENSIONS.height;if(defaultViewport&&defaultViewport in viewports){let styles=viewports[defaultViewport].styles;if(styles?.width&&styles?.height){let{width,height}=styles;viewportWidth=parseDimension(width,"width"),viewportHeight=parseDimension(height,"height");}}await page.viewport(viewportWidth,viewportHeight);};var {getInitialGlobals}=context.server.commands,convertToFilePath=url=>url.replace(/^file:\/\//,"").replace(/^\/+([a-zA-Z]:)/,"$1").replace(/%20/g," "),testStory=(exportName,story,meta,skipTags)=>async context=>{let annotations=previewApi.getCsfFactoryAnnotations(story,meta),composedStory=previewApi.composeStory(annotations.story,annotations.meta,{initialGlobals:await getInitialGlobals?.()??{}},annotations.preview??globalThis.globalProjectAnnotations,exportName);(composedStory===void 0||skipTags?.some(tag=>composedStory.tags.includes(tag)))&&context.skip(),context.story=composedStory;let _task=context.task;_task.meta.storyId=composedStory.id,await setViewport(composedStory.parameters,composedStory.globals),await composedStory.run(),_task.meta.reports=composedStory.reporting.reports;};
|
|
9
9
|
|
|
10
10
|
exports.convertToFilePath = convertToFilePath;
|
|
11
11
|
exports.testStory = testStory;
|
|
@@ -3,6 +3,6 @@ import { getCsfFactoryAnnotations, composeStory } from 'storybook/preview-api';
|
|
|
3
3
|
import { UnsupportedViewportDimensionError } from 'storybook/internal/preview-errors';
|
|
4
4
|
import { MINIMAL_VIEWPORTS } from 'storybook/viewport';
|
|
5
5
|
|
|
6
|
-
var DEFAULT_VIEWPORT_DIMENSIONS={width:1200,height:900},validPixelOrNumber=/^\d+(px)?$/,percentagePattern=/^(\d+(\.\d+)?%)$/,vwPattern=/^(\d+(\.\d+)?vw)$/,vhPattern=/^(\d+(\.\d+)?vh)$/,emRemPattern=/^(\d+)(em|rem)$/,parseDimension=(value,dimension)=>{if(validPixelOrNumber.test(value))return Number.parseInt(value,10);if(percentagePattern.test(value)){let percentageValue=parseFloat(value)/100;return Math.round(DEFAULT_VIEWPORT_DIMENSIONS[dimension]*percentageValue)}else if(vwPattern.test(value)){let vwValue=parseFloat(value)/100;return Math.round(DEFAULT_VIEWPORT_DIMENSIONS.width*vwValue)}else if(vhPattern.test(value)){let vhValue=parseFloat(value)/100;return Math.round(DEFAULT_VIEWPORT_DIMENSIONS.height*vhValue)}else {if(emRemPattern.test(value))return Number.parseInt(value,10)*16;throw new UnsupportedViewportDimensionError({dimension,value})}},setViewport=async(parameters={},globals={})=>{let defaultViewport,viewportsParam=parameters.viewport??{},viewportsGlobal=globals.viewport??{},isDisabled=viewportsParam.disable||viewportsParam.disabled;viewportsGlobal.value&&!isDisabled?defaultViewport=viewportsGlobal.value:isDisabled||(defaultViewport=viewportsParam.defaultViewport);let
|
|
6
|
+
var DEFAULT_VIEWPORT_DIMENSIONS={width:1200,height:900},validPixelOrNumber=/^\d+(px)?$/,percentagePattern=/^(\d+(\.\d+)?%)$/,vwPattern=/^(\d+(\.\d+)?vw)$/,vhPattern=/^(\d+(\.\d+)?vh)$/,emRemPattern=/^(\d+)(em|rem)$/,parseDimension=(value,dimension)=>{if(validPixelOrNumber.test(value))return Number.parseInt(value,10);if(percentagePattern.test(value)){let percentageValue=parseFloat(value)/100;return Math.round(DEFAULT_VIEWPORT_DIMENSIONS[dimension]*percentageValue)}else if(vwPattern.test(value)){let vwValue=parseFloat(value)/100;return Math.round(DEFAULT_VIEWPORT_DIMENSIONS.width*vwValue)}else if(vhPattern.test(value)){let vhValue=parseFloat(value)/100;return Math.round(DEFAULT_VIEWPORT_DIMENSIONS.height*vhValue)}else {if(emRemPattern.test(value))return Number.parseInt(value,10)*16;throw new UnsupportedViewportDimensionError({dimension,value})}},setViewport=async(parameters={},globals={},pwPage)=>{let defaultViewport,viewportsParam=parameters.viewport??{},viewportsGlobal=globals.viewport??{},isDisabled=viewportsParam.disable||viewportsParam.disabled;viewportsGlobal.value&&!isDisabled?defaultViewport=viewportsGlobal.value:isDisabled||(defaultViewport=viewportsParam.defaultViewport);let page=pwPage;if(page||(page=(await import('@vitest/browser/context').catch(()=>({page:null}))).page),!page||!globalThis.__vitest_browser__)return;let viewports={...MINIMAL_VIEWPORTS,...viewportsParam.viewports,...viewportsParam.options},viewportWidth=DEFAULT_VIEWPORT_DIMENSIONS.width,viewportHeight=DEFAULT_VIEWPORT_DIMENSIONS.height;if(defaultViewport&&defaultViewport in viewports){let styles=viewports[defaultViewport].styles;if(styles?.width&&styles?.height){let{width,height}=styles;viewportWidth=parseDimension(width,"width"),viewportHeight=parseDimension(height,"height");}}await page.viewport(viewportWidth,viewportHeight);};var {getInitialGlobals}=server.commands,convertToFilePath=url=>url.replace(/^file:\/\//,"").replace(/^\/+([a-zA-Z]:)/,"$1").replace(/%20/g," "),testStory=(exportName,story,meta,skipTags)=>async context=>{let annotations=getCsfFactoryAnnotations(story,meta),composedStory=composeStory(annotations.story,annotations.meta,{initialGlobals:await getInitialGlobals?.()??{}},annotations.preview??globalThis.globalProjectAnnotations,exportName);(composedStory===void 0||skipTags?.some(tag=>composedStory.tags.includes(tag)))&&context.skip(),context.story=composedStory;let _task=context.task;_task.meta.storyId=composedStory.id,await setViewport(composedStory.parameters,composedStory.globals),await composedStory.run(),_task.meta.reports=composedStory.reporting.reports;};
|
|
7
7
|
|
|
8
8
|
export { convertToFilePath, testStory };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@storybook/addon-vitest",
|
|
3
|
-
"version": "0.0.0-pr-
|
|
3
|
+
"version": "0.0.0-pr-32047-sha-849844bb",
|
|
4
4
|
"description": "Storybook addon for testing components",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"storybook-addons",
|
|
@@ -54,6 +54,11 @@
|
|
|
54
54
|
"import": "./dist/vitest-plugin/test-utils.mjs",
|
|
55
55
|
"require": "./dist/vitest-plugin/test-utils.js"
|
|
56
56
|
},
|
|
57
|
+
"./internal/playwright-utils": {
|
|
58
|
+
"types": "./dist/vitest-plugin/playwright-utils.d.ts",
|
|
59
|
+
"import": "./dist/vitest-plugin/playwright-utils.mjs",
|
|
60
|
+
"require": "./dist/vitest-plugin/playwright-utils.js"
|
|
61
|
+
},
|
|
57
62
|
"./internal/coverage-reporter": {
|
|
58
63
|
"types": "./dist/node/coverage-reporter.d.ts",
|
|
59
64
|
"import": "./dist/node/coverage-reporter.mjs",
|
|
@@ -124,7 +129,7 @@
|
|
|
124
129
|
"peerDependencies": {
|
|
125
130
|
"@vitest/browser": "^3.0.0",
|
|
126
131
|
"@vitest/runner": "^3.0.0",
|
|
127
|
-
"storybook": "^0.0.0-pr-
|
|
132
|
+
"storybook": "^0.0.0-pr-32047-sha-849844bb",
|
|
128
133
|
"vitest": "^3.0.0"
|
|
129
134
|
},
|
|
130
135
|
"peerDependenciesMeta": {
|
|
@@ -145,6 +150,7 @@
|
|
|
145
150
|
"exportEntries": [
|
|
146
151
|
"./src/index.ts",
|
|
147
152
|
"./src/vitest-plugin/test-utils.ts",
|
|
153
|
+
"./src/vitest-plugin/playwright-utils.ts",
|
|
148
154
|
"./src/vitest-plugin/setup-file.ts"
|
|
149
155
|
],
|
|
150
156
|
"managerEntries": [
|