@storybook/addon-vitest 0.0.0-pr-32047-sha-3b23261a → 0.0.0-pr-31819-sha-8c855eb3
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/_browser-chunks/chunk-A47P2DCZ.js +11 -0
- package/dist/_browser-chunks/chunk-VMSW5DPM.js +60 -0
- package/dist/_node-chunks/chunk-C4NXJJA3.js +324 -0
- package/dist/_node-chunks/chunk-CIKGVIS6.js +223 -0
- package/dist/_node-chunks/chunk-FMQIQP6D.js +96 -0
- package/dist/_node-chunks/chunk-KVKHJ5OL.js +46 -0
- package/dist/_node-chunks/chunk-N3OFRDD3.js +80 -0
- package/dist/_node-chunks/chunk-VFT2PRGV.js +5002 -0
- package/dist/_node-chunks/chunk-W26ZMSD3.js +143 -0
- package/dist/_node-chunks/chunk-XWQZZ2C3.js +1586 -0
- package/dist/index.js +9 -6
- package/dist/manager.js +5571 -8
- package/dist/node/coverage-reporter.js +1395 -4
- package/dist/node/vitest.js +564 -17
- package/dist/postinstall.js +1170 -93
- package/dist/preset.js +268 -27
- package/dist/vitest-plugin/global-setup.js +146 -6
- package/dist/vitest-plugin/index.d.ts +0 -6
- package/dist/vitest-plugin/index.js +2589 -43
- package/dist/vitest-plugin/setup-file.js +28 -9
- package/dist/vitest-plugin/test-utils.js +68 -8
- package/manager.js +1 -1
- package/package.json +17 -95
- package/preset.js +1 -1
- package/static/coverage-reporter.cjs +10 -0
- package/dist/chunk-55WZLVGN.mjs +0 -11
- package/dist/chunk-JKRQGT2U.mjs +0 -10
- package/dist/index.mjs +0 -5
- package/dist/node/coverage-reporter.d.ts +0 -184
- package/dist/node/coverage-reporter.mjs +0 -12
- package/dist/node/vitest.d.ts +0 -2
- package/dist/node/vitest.mjs +0 -19
- package/dist/vitest-plugin/global-setup.d.ts +0 -6
- package/dist/vitest-plugin/global-setup.mjs +0 -13
- package/dist/vitest-plugin/index.mjs +0 -28
- package/dist/vitest-plugin/playwright-utils.d.ts +0 -42649
- package/dist/vitest-plugin/playwright-utils.js +0 -34
- package/dist/vitest-plugin/playwright-utils.mjs +0 -29
- package/dist/vitest-plugin/setup-file.d.ts +0 -14
- package/dist/vitest-plugin/setup-file.mjs +0 -9
- package/dist/vitest-plugin/test-utils.d.ts +0 -20
- package/dist/vitest-plugin/test-utils.mjs +0 -8
- package/manager.mjs +0 -1
- package/postinstall.js +0 -1
- package/postinstall.mjs +0 -1
- package/preset.mjs +0 -1
|
@@ -1,34 +0,0 @@
|
|
|
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 __getContext(storyId){return globalThis.__STORYBOOK_PREVIEW__.storyStore.loadStory({storyId})}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,globalThis.__getContext=__getContext;});}async function testStory(storyId,page,context,playwrightFn){let _task=context.task;if(_task.meta.storyId=storyId,await page.evaluate(async storyId2=>await globalThis.__test(storyId2),storyId),playwrightFn){let storyContext=await page.evaluate(storyId2=>globalThis.__getContext(storyId2),storyId);await playwrightFn({page,context:storyContext});}}
|
|
30
|
-
|
|
31
|
-
exports.convertToFilePath = convertToFilePath;
|
|
32
|
-
exports.prepareScript = prepareScript;
|
|
33
|
-
exports.setupPageScript = setupPageScript;
|
|
34
|
-
exports.testStory = testStory;
|
|
@@ -1,29 +0,0 @@
|
|
|
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 __getContext(storyId){return globalThis.__STORYBOOK_PREVIEW__.storyStore.loadStory({storyId})}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,globalThis.__getContext=__getContext;});}async function testStory(storyId,page,context,playwrightFn){let _task=context.task;if(_task.meta.storyId=storyId,await page.evaluate(async storyId2=>await globalThis.__test(storyId2),storyId),playwrightFn){let storyContext=await page.evaluate(storyId2=>globalThis.__getContext(storyId2),storyId);await playwrightFn({page,context:storyContext});}}
|
|
28
|
-
|
|
29
|
-
export { convertToFilePath, prepareScript, setupPageScript, testStory };
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { RunnerTask } from 'vitest';
|
|
2
|
-
import { Channel } from 'storybook/internal/channels';
|
|
3
|
-
|
|
4
|
-
declare global {
|
|
5
|
-
var __STORYBOOK_ADDONS_CHANNEL__: Channel;
|
|
6
|
-
}
|
|
7
|
-
type Task = Partial<RunnerTask> & {
|
|
8
|
-
meta: Record<string, any>;
|
|
9
|
-
};
|
|
10
|
-
declare const modifyErrorMessage: ({ task }: {
|
|
11
|
-
task: Task;
|
|
12
|
-
}) => void;
|
|
13
|
-
|
|
14
|
-
export { Task, modifyErrorMessage };
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { vi, beforeAll, afterEach } from 'vitest';
|
|
2
|
-
import { Channel } from 'storybook/internal/channels';
|
|
3
|
-
|
|
4
|
-
var ADDON_ID="storybook/interactions",PANEL_ID=`${ADDON_ID}/panel`;var transport={setHandler:vi.fn(),send:vi.fn()};globalThis.__STORYBOOK_ADDONS_CHANNEL__??=new Channel({transport});var modifyErrorMessage=({task})=>{let meta=task.meta;if(task.type==="test"&&task.result?.state==="fail"&&meta.storyId&&task.result.errors?.[0]){let currentError=task.result.errors[0],storyUrl=`${import.meta.env.__STORYBOOK_URL__}/?path=/story/${meta.storyId}&addonPanel=${PANEL_ID}`;currentError.message=`
|
|
5
|
-
\x1B[34mClick to debug the error directly in Storybook: ${storyUrl}\x1B[39m
|
|
6
|
-
|
|
7
|
-
${currentError.message}`;}};beforeAll(()=>{if(globalThis.globalProjectAnnotations)return globalThis.globalProjectAnnotations.beforeAll()});afterEach(modifyErrorMessage);
|
|
8
|
-
|
|
9
|
-
export { modifyErrorMessage };
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { TestContext } from 'vitest';
|
|
2
|
-
import { ComposedStoryFn, ComponentAnnotations } from 'storybook/internal/types';
|
|
3
|
-
|
|
4
|
-
declare module '@vitest/browser/context' {
|
|
5
|
-
interface BrowserCommands {
|
|
6
|
-
getInitialGlobals: () => Promise<Record<string, any>>;
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Converts a file URL to a file path, handling URL encoding
|
|
11
|
-
*
|
|
12
|
-
* @param url The file URL to convert (e.g. file:///path/to/file.js)
|
|
13
|
-
* @returns The decoded file path
|
|
14
|
-
*/
|
|
15
|
-
declare const convertToFilePath: (url: string) => string;
|
|
16
|
-
declare const testStory: (exportName: string, story: ComposedStoryFn, meta: ComponentAnnotations, skipTags: string[]) => (context: TestContext & {
|
|
17
|
-
story: ComposedStoryFn;
|
|
18
|
-
}) => Promise<void>;
|
|
19
|
-
|
|
20
|
-
export { convertToFilePath, testStory };
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { server } from '@vitest/browser/context';
|
|
2
|
-
import { getCsfFactoryAnnotations, composeStory } from 'storybook/preview-api';
|
|
3
|
-
import { UnsupportedViewportDimensionError } from 'storybook/internal/preview-errors';
|
|
4
|
-
import { MINIMAL_VIEWPORTS } from 'storybook/viewport';
|
|
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={},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
|
-
|
|
8
|
-
export { convertToFilePath, testStory };
|
package/manager.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import './dist/manager';
|
package/postinstall.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
module.exports = require('./dist/postinstall');
|
package/postinstall.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './dist/postinstall.mjs';
|
package/preset.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './dist/preset.mjs';
|