@chromatic-com/storybook 5.2.0-next.0 → 5.2.0-next.2

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/preset.js CHANGED
@@ -8,13 +8,15 @@ var node = require('chromatic/node');
8
8
  var coreServer = require('storybook/internal/core-server');
9
9
  var telemetry = require('storybook/internal/telemetry');
10
10
  var filesize = require('filesize');
11
+ var crypto$1 = require('crypto');
11
12
  var jsonfile = require('jsonfile');
12
13
 
13
14
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
14
- var F="@chromatic-com/storybook";var c="chromaui/addon-visual-tests",U=`${c}/test-provider`,G=`${c}/configInfo`,$=`${c}/gitInfo`,j=`${c}/gitInfoError`,H=`${c}/projectInfo`,M=`${c}/startBuild`,V=`${c}/stopBuild`,K=`${c}/localBuildProgress`,z=`${c}/telemetry`,J=`${c}/removeAddon`;var Y=`${c}/ChannelFetch/aborted`,Q=`${c}ChannelFetch/request`,L=`${c}ChannelFetch/response`,y={autoAcceptChanges:!1,exitOnceUploaded:!1,exitZeroOnChanges:!0,forceRebuild:!0,fromCI:!1,interactive:!1,isLocalBuild:!0,logPrefix:"\x1B[38;5;202mChromatic\x1B[0m:",skip:!1,skipUpdateCheck:!0,storybookBuildDir:void 0};var {CHROMATIC_INDEX_URL:me,CHROMATIC_BASE_URL:S=me||"https://www.chromatic.com",CHROMATIC_API_URL:Ke=`${S}/api`}=process.env;var E=t=>g.includes(t),X=t=>["upload","snapshot"].includes(t),g=["initialize","build","upload","verify","snapshot"],O={initialize:{key:"initialize",emoji:"\u{1F680}",renderName:()=>"Initialize build",renderProgress:()=>"Initializing build...",renderComplete:()=>"Initialized",estimateDuration:2e3},build:{key:"build",emoji:"\u{1F3D7}",renderName:()=>"Build Storybook",renderProgress:()=>"Building your Storybook...",renderComplete:()=>"Storybook built",estimateDuration:2e4},upload:{key:"upload",emoji:"\u{1F4E1}",renderName:()=>"Publish your Storybook",renderProgress:({stepProgress:t})=>{let{numerator:r,denominator:e}=t.upload;if(!e||!r)return "Uploading files...";let{value:o,exponent:n}=filesize.filesize(e,{output:"object",round:1}),{value:i,symbol:s}=filesize.filesize(r,{exponent:n,output:"object",round:1});return `Uploading files... ${i}/${o} ${s}`},renderComplete:()=>"Publish complete",estimateDuration:2e4},verify:{key:"verify",emoji:"\u{1F50D}",renderName:()=>"Verify your Storybook",renderProgress:()=>"Verifying contents...",renderComplete:()=>"Storybook verified",estimateDuration:2e4},snapshot:{key:"snapshot",emoji:"\u{1F4F8}",renderName:()=>"Run visual tests",renderProgress:({stepProgress:t})=>{let{numerator:r,denominator:e}=t.snapshot;return e?`Running visual tests... ${r}/${e}`:"Running visual tests..."},renderComplete:()=>"Tested your stories",estimateDuration:9e4},aborted:{key:"aborted",emoji:"\u270B",renderName:()=>"Build canceled",renderProgress:()=>"Build canceled",renderComplete:()=>"Build canceled",estimateDuration:0},complete:{key:"complete",emoji:"\u{1F389}",renderName:()=>"Visual tests completed!",renderProgress:()=>"Visual tests completed!",renderComplete:()=>"Visual tests completed!",estimateDuration:0},error:{key:"error",emoji:"\u{1F6A8}",renderName:()=>"Build failed",renderProgress:()=>"Build failed",renderComplete:()=>"Build failed",estimateDuration:0},limited:{key:"error",emoji:"\u{1F6A8}",renderName:()=>"Build limited",renderProgress:()=>"Build limited",renderComplete:()=>"Build limited",estimateDuration:0}},fe={buildProgressPercentage:0,currentStep:g[0],stepProgress:Object.fromEntries(g.map(t=>[t,{}]))},Z=JSON.stringify(fe);var q=2e3,b,he=(t,r)=>{if(!E(t))throw new Error(`Unknown step: ${t}`);let e=g.map(d=>{let{startedAt:p,completedAt:f}=r?.[d]||{};return p&&f?f-p:O[d].estimateDuration}),o=e.reduce((d,p)=>d+p,0),n=g.indexOf(t),i=e.slice(0,n).reduce((d,p)=>d+p,0),s=i+e[n],a=i/o*100,l=s/o*100;return {...O[t],startPercentage:a,endPercentage:l,stepPercentage:l-a}},N=(t,r)=>(e,{progress:o,total:n}={})=>{if(clearTimeout(r),!E(e.task))return;if(!t.value)throw new Error("Unexpected missing value for localBuildProgress");let{buildProgressPercentage:i,stepProgress:s,previousBuildProgress:a}=t.value;if(s[e.task]?.completedAt)return;let{startPercentage:l,endPercentage:d,stepPercentage:p}=he(e.task,a),f=l;if(o&&n&&(f+=p*(o/n)),!X(e.task)){let{estimateDuration:w}=O[e.task],T=g.indexOf(e.task);f=Math.max(f,i)+q/w*p,r=setTimeout(()=>{if(!t.value)throw new Error("Unexpected missing value for localBuildProgress");let{currentStep:_}=t.value;E(_)&&g.indexOf(_)<=T&&N(t,r)(e);},q);}s[e.task]={startedAt:Date.now(),...s[e.task],...o&&n&&{numerator:o,denominator:n}},t.value={buildId:e.announcedBuild?.id,branch:e.git?.branch,buildProgressPercentage:Math.min(f,d),currentStep:e.task,stepProgress:s};},ee=(t,r)=>(e,o)=>{if(clearTimeout(r),!t.value)throw new Error("Unexpected missing value for localBuildProgress");let{buildProgressPercentage:n,stepProgress:i}=t.value,s={buildId:e.announcedBuild?.id,branch:e.git?.branch,buildProgressPercentage:n,stepProgress:i,previousBuildProgress:i};if(o){t.value={...s,currentStep:b?.signal.aborted?"aborted":"error",formattedError:o.formattedError,originalError:o.originalError};return}e.task&&E(e.task)&&(i[e.task]={...i[e.task],completedAt:Date.now()}),e.task==="verify"&&e.build?.wasLimited&&(t.value={...s,currentStep:"limited",stepProgress:i,errorDetailsUrl:e.build?.app.account?.billingUrl}),e.build&&e.task==="snapshot"&&(t.value={...s,buildProgressPercentage:100,currentStep:"complete",stepProgress:i,changeCount:e.build.changeCount,errorCount:e.build.errorCount});},te=async(t,r)=>{if(!r.projectId)throw new Error("Missing projectId");if(!r.userToken)throw new Error("Missing userToken");t.value=JSON.parse(Z);let e;b?.abort(),b=new AbortController,process.env.SB_TESTBUILD="true",await node.run({flags:{interactive:!1},options:{...r,...y,experimental_onTaskStart:N(t,e),experimental_onTaskProgress:N(t,e),experimental_onTaskComplete:ee(t,e),experimental_onTaskError:ee(t,e),experimental_abortSignal:b?.signal}});},re=()=>{b?.abort(new Error("Build canceled from Storybook"));};var x=new Map,I=class{constructor(r,e=fetch){this.channel=r,this.abortControllers=new Map,this.channel.on(Y,({requestId:o})=>{this.abortControllers.get(o)?.abort(),this.abortControllers.delete(o);}),this.channel.on(Q,async({requestId:o,input:n,init:i})=>{let s=new AbortController;this.abortControllers.set(o,s);try{let a=await e(n,{...i,signal:s.signal}),l=await a.text(),d=Array.from(a.headers),p={body:l,headers:d,status:a.status,statusText:a.statusText};this.channel.emit(L,{requestId:o,response:p});}catch(a){let l=a instanceof Error?a.message:String(a);this.channel.emit(L,{requestId:o,error:l});}finally{this.abortControllers.delete(o);}});}static subscribe(r,e,o=fetch){let n=x.get(r)||new I(e,o);return x.has(r)||x.set(r,n),n}};var oe="experimental_useSharedState_getValue",D="experimental_useSharedState_setValue",A=new Map,m=class{constructor(r){this.channel=r,this.listeners=[],this.state={},this.channel.on(D,(e,o,n)=>{this.state?.[e]?.index>=n||(this.state[e]={index:n,value:o});}),this.channel.on(oe,e=>{let o=this.state[e]?.index??0,n=this.state[e]?.value;this.channel.emit(D,e,n,o);});}get(r){return this.state[r]||this.channel.emit(oe,r),this.state[r]?.value}set(r,e){let o=(this.state[r]?.index??0)+1;this.state[r]={index:o,value:e},this.channel.emit(D,r,e,o);}static subscribe(r,e){let o=A.get(r)||new m(e);return A.has(r)||(A.set(r,o),o.channel.on(D,(n,i)=>{n===r&&o.listeners.forEach(s=>s(i));})),{get value(){return o.get(r)},set value(n){o.set(r,n);},on(n,i){if(n!=="change")throw new Error("unsupported event");o.listeners.push(i);},off(n,i){if(n!=="change")throw new Error("unsupported event");let s=o.listeners.indexOf(i);s>=0&&o.listeners.splice(s,1);}}}};async function ne(t,r){let e=Object.entries(r).sort((o,n)=>o[0].localeCompare(n[0])).reduce((o,[n,i])=>i===null?o:Object.assign(o,{[n]:i}),{});await jsonfile.writeFile(t,e,{spaces:2});}var R=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('out.js', document.baseURI).href))),le=node.createLogger(void 0,y);function De(t=[]){return [...t,R.resolve("./manager.mjs")]}function Pe(t=[]){return [...t,R.resolve("./preview.mjs")]}var ue=async()=>{let t=(async()=>{try{let r=R.resolve("@chromatic-com/storybook/package.json"),e=await promises.readFile(r,"utf-8");return JSON.parse(e).version||null}catch{return null}})();return ue=()=>t,t},se=(t,r,e)=>Object.fromEntries(Object.entries(e).map(([o,n])=>[o,n===r[o]?null:n]).filter(([o,n])=>n!==null||t[o]!==void 0)),ae=async(t,r)=>{let e={storybookBaseDir:".",storybookConfigDir:".storybook"},o={},n={},{repositoryRootDir:i}=await node.getGitInfo({log:le}),s=i&&path.normalize(path.relative(i,process.cwd()));s!==path.normalize(t.storybookBaseDir??"")&&(o.storybookBaseDir=s);let a=path.normalize(path.relative(process.cwd(),r.configDir));return a!==path.normalize(t.storybookConfigDir??"")&&(o.storybookConfigDir=a),t.onlyChanged===void 0&&(n.onlyChanged=!0),t.zip===void 0&&(n.zip=!0),{configuration:t,problems:se(t,e,o),suggestions:se(t,e,n)}},ve=(t,r,e,o)=>{let n,i,s,a=async()=>{try{let l=await node.getGitInfo({log:le});Object.entries(l).some(([d,p])=>n?.[d]!==p)&&r(l,n),n=l,i=void 0,s=setTimeout(a,t);}catch(l){e(l),o&&i?.message!==l.message&&(console.error(`Failed to fetch git info, with error:
15
- ${l}`),n=void 0,i=l),s=setTimeout(a,t);}};return a(),{cancel:()=>clearTimeout(s)}},Re=async(t,r)=>{let e=await node.getConfiguration(t);await r(e),e.configFile&&fs.watch(e.configFile,async(o,n)=>{n&&await r(await node.getConfiguration(n));});};async function we(t,r){let{configFile:e,presets:o}=r;I.subscribe(c,t);let n=o.apply("experimental_serverAPI"),i=o.apply("core"),{projectId:s}=await node.getConfiguration(e),a=m.subscribe(H,t);a.value=s?{projectId:s}:{};let l=coreServer.experimental_getTestProviderStore(U),d=s;a.on("change",async({projectId:u}={})=>{if(!u||u===d)return;d=u;let C=e;try{let{configFile:h,...k}=await node.getConfiguration(C),B=h||C||"chromatic.config.json",{problems:de,suggestions:pe}=await ae(k,r);await ne(B,{...k,...de,...pe,projectId:u}),a.value={...a.value,written:!0,dismissed:!1,configFile:B};}catch(h){console.warn(`Failed to update your main configuration:
15
+ var $="@chromatic-com/storybook";var a="chromaui/addon-visual-tests",H=`${a}/test-provider`,j=`${a}/configInfo`,M=`${a}/gitInfo`,V=`${a}/gitInfoError`,K=`${a}/projectInfo`,Y=`${a}/startBuild`,z=`${a}/stopBuild`,J=`${a}/localBuildProgress`,W=`${a}/startShare`,q=`${a}/cancelShare`,Q=`${a}/shareProgress`,X=`${a}/telemetry`,Z=`${a}/removeAddon`;var ee=`${a}/ChannelFetch/aborted`,te=`${a}ChannelFetch/request`,N=`${a}ChannelFetch/response`,D={autoAcceptChanges:!1,exitOnceUploaded:!1,exitZeroOnChanges:!0,forceRebuild:!0,fromCI:!1,interactive:!1,isLocalBuild:!0,logPrefix:"\x1B[38;5;202mChromatic\x1B[0m:",skip:!1,skipUpdateCheck:!0,storybookBuildDir:void 0};var {CHROMATIC_INDEX_URL:_e,CHROMATIC_BASE_URL:v=_e||"https://www.chromatic.com",CHROMATIC_API_URL:it=`${v}/api`}=process.env;var R=e=>I.includes(e),oe=e=>["upload","snapshot"].includes(e),I=["initialize","build","upload","verify","snapshot"],w={initialize:{key:"initialize",emoji:"\u{1F680}",renderName:()=>"Initialize build",renderProgress:()=>"Initializing build...",renderComplete:()=>"Initialized",estimateDuration:2e3},build:{key:"build",emoji:"\u{1F3D7}",renderName:()=>"Build Storybook",renderProgress:()=>"Building your Storybook...",renderComplete:()=>"Storybook built",estimateDuration:2e4},upload:{key:"upload",emoji:"\u{1F4E1}",renderName:()=>"Publish your Storybook",renderProgress:({stepProgress:e})=>{let{numerator:r,denominator:t}=e.upload;if(!t||!r)return "Uploading files...";let{value:o,exponent:n}=filesize.filesize(t,{output:"object",round:1}),{value:s,symbol:i}=filesize.filesize(r,{exponent:n,output:"object",round:1});return `Uploading files... ${s}/${o} ${i}`},renderComplete:()=>"Publish complete",estimateDuration:2e4},verify:{key:"verify",emoji:"\u{1F50D}",renderName:()=>"Verify your Storybook",renderProgress:()=>"Verifying contents...",renderComplete:()=>"Storybook verified",estimateDuration:2e4},snapshot:{key:"snapshot",emoji:"\u{1F4F8}",renderName:()=>"Run visual tests",renderProgress:({stepProgress:e})=>{let{numerator:r,denominator:t}=e.snapshot;return t?`Running visual tests... ${r}/${t}`:"Running visual tests..."},renderComplete:()=>"Tested your stories",estimateDuration:9e4},aborted:{key:"aborted",emoji:"\u270B",renderName:()=>"Build canceled",renderProgress:()=>"Build canceled",renderComplete:()=>"Build canceled",estimateDuration:0},complete:{key:"complete",emoji:"\u{1F389}",renderName:()=>"Visual tests completed!",renderProgress:()=>"Visual tests completed!",renderComplete:()=>"Visual tests completed!",estimateDuration:0},error:{key:"error",emoji:"\u{1F6A8}",renderName:()=>"Build failed",renderProgress:()=>"Build failed",renderComplete:()=>"Build failed",estimateDuration:0},limited:{key:"error",emoji:"\u{1F6A8}",renderName:()=>"Build limited",renderProgress:()=>"Build limited",renderComplete:()=>"Build limited",estimateDuration:0}},be={buildProgressPercentage:0,currentStep:I[0],stepProgress:Object.fromEntries(I.map(e=>[e,{}]))},ne=JSON.stringify(be);var se=2e3,P,Oe=(e,r)=>{if(!R(e))throw new Error(`Unknown step: ${e}`);let t=I.map(d=>{let{startedAt:m,completedAt:f}=r?.[d]||{};return m&&f?f-m:w[d].estimateDuration}),o=t.reduce((d,m)=>d+m,0),n=I.indexOf(e),s=t.slice(0,n).reduce((d,m)=>d+m,0),i=s+t[n],l=s/o*100,u=i/o*100;return {...w[e],startPercentage:l,endPercentage:u,stepPercentage:u-l}},B=(e,r)=>(t,{progress:o,total:n}={})=>{if(clearTimeout(r),!R(t.task))return;if(!e.value)throw new Error("Unexpected missing value for localBuildProgress");let{buildProgressPercentage:s,stepProgress:i,previousBuildProgress:l}=e.value;if(i[t.task]?.completedAt)return;let{startPercentage:u,endPercentage:d,stepPercentage:m}=Oe(t.task,l),f=u;if(o&&n&&(f+=m*(o/n)),!oe(t.task)){let{estimateDuration:S}=w[t.task],E=I.indexOf(t.task);f=Math.max(f,s)+se/S*m,r=setTimeout(()=>{if(!e.value)throw new Error("Unexpected missing value for localBuildProgress");let{currentStep:b}=e.value;R(b)&&I.indexOf(b)<=E&&B(e,r)(t);},se);}i[t.task]={startedAt:Date.now(),...i[t.task],...o&&n&&{numerator:o,denominator:n}},e.value={buildId:t.announcedBuild?.id,branch:t.git?.branch,commit:t.git?.commit,uncommittedHash:t.git?.uncommittedHash,buildProgressPercentage:Math.min(f,d),currentStep:t.task,stepProgress:i};},ie=(e,r)=>(t,o)=>{if(clearTimeout(r),!e.value)throw new Error("Unexpected missing value for localBuildProgress");let{buildProgressPercentage:n,stepProgress:s}=e.value,i={buildId:t.announcedBuild?.id,branch:t.git?.branch,buildProgressPercentage:n,stepProgress:s,previousBuildProgress:s};if(o){e.value={...i,currentStep:P?.signal.aborted?"aborted":"error",formattedError:o.formattedError,originalError:o.originalError};return}t.task&&R(t.task)&&(s[t.task]={...s[t.task],completedAt:Date.now()}),t.task==="verify"&&t.build?.wasLimited&&(e.value={...i,currentStep:"limited",stepProgress:s,errorDetailsUrl:t.build?.app.account?.billingUrl}),t.build&&t.task==="snapshot"&&(e.value={...i,buildProgressPercentage:100,currentStep:"complete",stepProgress:s,changeCount:t.build.changeCount,errorCount:t.build.errorCount});},ae=async(e,r)=>{if(!r.projectId)throw new Error("Missing projectId");if(!r.userToken)throw new Error("Missing userToken");e.value=JSON.parse(ne);let t;P?.abort(),P=new AbortController,process.env.SB_TESTBUILD="true",await node.run({flags:{interactive:!1},options:{...r,...D,experimental_onTaskStart:B(e,t),experimental_onTaskProgress:B(e,t),experimental_onTaskComplete:ie(e,t),experimental_onTaskError:ie(e,t),experimental_abortSignal:P?.signal}});},le=()=>{P?.abort(new Error("Build canceled from Storybook"));};var U=new Map,_=class{constructor(r,t=fetch){this.channel=r,this.abortControllers=new Map,this.channel.on(ee,({requestId:o})=>{this.abortControllers.get(o)?.abort(),this.abortControllers.delete(o);}),this.channel.on(te,async({requestId:o,input:n,init:s})=>{let i=new AbortController;this.abortControllers.set(o,i);try{let l=await t(n,{...s,signal:i.signal}),u=await l.text(),d=Array.from(l.headers),m={body:u,headers:d,status:l.status,statusText:l.statusText};this.channel.emit(N,{requestId:o,response:m});}catch(l){let u=l instanceof Error?l.message:String(l);this.channel.emit(N,{requestId:o,error:u});}finally{this.abortControllers.delete(o);}});}static subscribe(r,t,o=fetch){let n=U.get(r)||new _(t,o);return U.has(r)||U.set(r,n),n}};var De=e=>{let o=e.trim().replace(/#.*$/,"").replace(/^.*@/,"").replace(/^.*\/\//,"");return (o.endsWith(".git")?o:`${o}.git`).replace(":","/")},ve=e=>e.replace(/\\/g,"/"),we=(e,r)=>{if(!e)return null;let t=`${De(e)}${ve(r)}`;return crypto$1.createHash("sha256").update("chromatic-storybook-id-salt").update(t).digest("hex")},ce=async()=>{try{let{executeCommandSync:e,getProjectRoot:r}=await import('storybook/internal/common'),t=path.relative(r(),process.cwd()),o=e({command:"git",args:["config","--get","remote.origin.url"],timeout:1e3});return we(o,t)}catch{return null}};var ue="experimental_useSharedState_getValue",A="experimental_useSharedState_setValue",F=new Map,g=class{constructor(r){this.channel=r,this.listeners=[],this.state={},this.channel.on(A,(t,o,n)=>{this.state?.[t]?.index>=n||(this.state[t]={index:n,value:o});}),this.channel.on(ue,t=>{let o=this.state[t]?.index??0,n=this.state[t]?.value;this.channel.emit(A,t,n,o);});}get(r){return this.state[r]||this.channel.emit(ue,r),this.state[r]?.value}set(r,t){let o=(this.state[r]?.index??0)+1;this.state[r]={index:o,value:t},this.channel.emit(A,r,t,o);}static subscribe(r,t){let o=F.get(r)||new g(t);return F.has(r)||(F.set(r,o),o.channel.on(A,(n,s)=>{n===r&&o.listeners.forEach(i=>i(s));})),{get value(){return o.get(r)},set value(n){o.set(r,n);},on(n,s){if(n!=="change")throw new Error("unsupported event");o.listeners.push(s);},off(n,s){if(n!=="change")throw new Error("unsupported event");let i=o.listeners.indexOf(s);i>=0&&o.listeners.splice(i,1);}}}};async function de(e,r){let t=Object.entries(r).sort((o,n)=>o[0].localeCompare(n[0])).reduce((o,[n,s])=>s===null?o:Object.assign(o,{[n]:s}),{});await jsonfile.writeFile(e,t,{spaces:2});}var k=module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('out.js', document.baseURI).href))),he=node.createLogger(void 0,D);function He(e=[]){return [...e,k.resolve("./manager.mjs")]}function je(e=[]){return [...e,k.resolve("./preview.mjs")]}var Ie=async()=>{let e=(async()=>{try{let r=k.resolve("@chromatic-com/storybook/package.json"),t=await promises.readFile(r,"utf-8");return JSON.parse(t).version||null}catch{return null}})();return Ie=()=>e,e},me=(e,r,t)=>Object.fromEntries(Object.entries(t).map(([o,n])=>[o,n===r[o]?null:n]).filter(([o,n])=>n!==null||e[o]!==void 0)),fe=async(e,r)=>{let t={storybookBaseDir:".",storybookConfigDir:".storybook"},o={},n={},{repositoryRootDir:s}=await node.getGitInfo({log:he}),i=s&&path.normalize(path.relative(s,process.cwd()));i!==path.normalize(e.storybookBaseDir??"")&&(o.storybookBaseDir=i);let l=path.normalize(path.relative(process.cwd(),r.configDir));return l!==path.normalize(e.storybookConfigDir??"")&&(o.storybookConfigDir=l),e.onlyChanged===void 0&&(n.onlyChanged=!0),e.zip===void 0&&(n.zip=!0),{configuration:e,problems:me(e,t,o),suggestions:me(e,t,n)}},Me=(e,r,t,o)=>{let n,s,i,l=async()=>{try{let u=await node.getGitInfo({log:he});Object.entries(u).some(([d,m])=>n?.[d]!==m)&&r(u,n),n=u,s=void 0,i=setTimeout(l,e);}catch(u){t(u),o&&s?.message!==u.message&&(console.error(`Failed to fetch git info, with error:
16
+ ${u}`),n=void 0,s=u),i=setTimeout(l,e);}};return l(),{cancel:()=>clearTimeout(i)}},Ve=async(e,r)=>{let t=await node.getConfiguration(e);await r(t),t.configFile&&fs.watch(t.configFile,async(o,n)=>{n&&await r(await node.getConfiguration(n));});};async function Ke(e,r){let{configFile:t,presets:o}=r;_.subscribe(a,e);let n=o.apply("experimental_serverAPI"),s=o.apply("core"),{projectId:i}=await node.getConfiguration(t),l=g.subscribe(K,e);l.value=i?{projectId:i}:{};let u=coreServer.experimental_getTestProviderStore(H),d=i;l.on("change",async({projectId:c}={})=>{if(!c||c===d)return;d=c;let h=t;try{let{configFile:p,...C}=await node.getConfiguration(h),T=p||h||"chromatic.config.json",{problems:y,suggestions:O}=await fe(C,r);await de(T,{...C,...y,...O,projectId:c}),l.value={...l.value,written:!0,dismissed:!1,configFile:T};}catch(p){console.warn(`Failed to update your main configuration:
16
17
 
17
- ${h}`),a.value={...a.value,written:!1,dismissed:!1,configFile:C};}});let p=m.subscribe(K,t);t.on(M,async({accessToken:u})=>{let{projectId:C}=a.value||{};l.runWithState(async()=>{try{await te(p,{configFile:e,projectId:C,userToken:u});}catch(h){throw console.error(`Failed to run Chromatic build, with error:
18
- ${h}`),h}});}),t.on(V,()=>{l.setState("test-provider-state:succeeded"),re();}),t.on(z,async u=>{(await i).disableTelemetry||telemetry.telemetry("addon-visual-tests",{...u,addonVersion:await ue()});});let f=m.subscribe(G,t),w=m.subscribe($,t),T=m.subscribe(j,t),_=ve(5e3,u=>{T.value=void 0,w.value=u;},u=>{T.value=u;});return Re(e,async u=>{d&&(f.value=await ae(u,r));}),t.on(J,()=>{n.then(u=>u.removeAddon(F)).catch(u=>console.error(u)),_.cancel();}),t}var Le={managerEntries:De,previewAnnotations:Pe,experimental_serverChannel:we,staticDirs:async t=>[...t,{from:path.join(path.dirname(R.resolve("@chromatic-com/storybook/package.json")),"assets"),to:"addon-visual-tests-assets"}],env:async(t,{configType:r})=>r==="PRODUCTION"?t:{...t,CHROMATIC_BASE_URL:S}},_t=Le;
18
+ ${p}`),l.value={...l.value,written:!1,dismissed:!1,configFile:h};}});let m=g.subscribe(J,e);e.on(Y,async({accessToken:c})=>{let{projectId:h}=l.value||{};u.runWithState(async()=>{try{await ae(m,{configFile:t,projectId:h,userToken:c});}catch(p){throw console.error(`Failed to run Chromatic build, with error:
19
+ ${p}`),p}});}),e.on(z,()=>{u.setState("test-provider-state:succeeded"),le();});let f=g.subscribe(Q,e),S=null,E=null,b=null;e.on(W,async({accessToken:c,shareRequestId:h})=>{if(E||h&&h===b)return;let p=h??crypto.randomUUID();E=p;let C=new AbortController;S=C;let T=!1;f.value={status:"pending",shareRequestId:p};try{let y=await node.share({userToken:c,abortSignal:C.signal,onUrl:O=>{f.value={status:"uploading",shareUrl:O,shareRequestId:p};},onError:O=>{T=!0,f.value={status:"error",error:O.message,shareRequestId:p};}});C.signal.aborted?f.value={status:"error",error:"canceled",canceled:!0,shareRequestId:p}:T||(f.value={status:"complete",shareUrl:y.shareUrl,daysToExpire:y.daysToExpire,shareRequestId:p},b=p);}catch(y){C.signal.aborted?f.value={status:"error",error:"canceled",canceled:!0,shareRequestId:p}:f.value={status:"error",error:y?.message||"Share failed",shareRequestId:p};}finally{S=null,E=null;}}),e.on(q,({shareRequestId:c}={})=>{c&&E&&c!==E||S?.abort();}),e.on(X,async c=>{(await s).disableTelemetry||telemetry.telemetry("addon-visual-tests",{...c,addonVersion:await Ie()});});let Ee=g.subscribe(j,e),Ce=g.subscribe(M,e),G=g.subscribe(V,e),ye=Me(5e3,c=>{G.value=void 0,Ce.value=c;},c=>{G.value=c;});return Ve(t,async c=>{d&&(Ee.value=await fe(c,r));}),e.on(Z,()=>{n.then(c=>c.removeAddon($)).catch(c=>console.error(c)),ye.cancel();}),e}async function Ye(e){let r=await ce();return r?`${e}
20
+ <script>window.__CHROMATIC_STORYBOOK_ID__ = ${JSON.stringify(r)};</script>`:e}var ze={managerEntries:He,managerHead:Ye,previewAnnotations:je,experimental_serverChannel:Ke,staticDirs:async e=>[...e,{from:path.join(path.dirname(k.resolve("@chromatic-com/storybook/package.json")),"assets"),to:"addon-visual-tests-assets"}],env:async(e,{configType:r})=>r==="PRODUCTION"?e:{...e,CHROMATIC_BASE_URL:v}},Ut=ze;
19
21
 
20
- module.exports = _t;
22
+ module.exports = Ut;
package/dist/preview.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { REMOVE_HIGHLIGHT, HIGHLIGHT } from 'storybook/highlight';
2
2
  import { useChannel, useEffect } from 'storybook/preview-api';
3
3
 
4
- var t="chromaui/addon-visual-tests";var d="highlightIgnored",s=`${t}/highlightIgnored`,h=`${t}/highlightIgnored/count`,g=`${t}/highlightIgnored/select`,p=['[data-chromatic="ignore"]','[class~="chromatic-ignore"]'];var O={backgroundColor:"rgba(255, 173, 51, 0.2)",outline:"1px solid rgba(255, 173, 51, 0.7)",outlineOffset:"-1px"},D={backgroundColor:"rgba(255, 173, 51, 0.1)",outlineWidth:"2px"},G={backgroundColor:"transparent",outlineWidth:"2px"},x=e=>{if(!e)return !1;if(typeof document>"u")return !0;try{return document.createDocumentFragment().querySelector(e),!0}catch{return console.warn(`Invalid ignoreSelector: ${e}`),!1}},u=e=>{let l=e?.ignoreSelectors??[],i=Array.from(new Set(p.concat(l.filter(x))));return {id:s,selectors:i,styles:O,hoverStyles:D,focusStyles:G,menu:i.map(o=>{let c=p.includes(o);return [{id:`${o}-info`,title:"Element ignored in visual tests",description:c?`${o} will be ignored by Chromatic`:`${o} matches an ignored selector`,selectors:[o]},{id:`${o}-link`,iconLeft:"info",iconRight:"shareAlt",title:"Learn how to configure ignored elements",clickEvent:g,selectors:[o]}]})}};var C=(e,{globals:l,parameters:i,id:o})=>{let c=!!l[d],r=useChannel({}),n=u(i.chromatic),m=n?.selectors.join(`
5
- `)??"";return useEffect(()=>{if(r(REMOVE_HIGHLIGHT,s),!n?.selectors.length){r(h,0);return}c&&r(HIGHLIGHT,n);let f=document.getElementById("storybook-root"),H=n.selectors.reduce((a,E)=>(document.querySelectorAll(`:is(${E}):not([id^="storybook-"], [id^="storybook-"] *, [class^="sb-"], [class^="sb-"] *)`).forEach(I=>a.add(I)),(f?.querySelectorAll(E)??[]).forEach(I=>a.add(I)),a),new Set);return r(h,H.size),()=>r(REMOVE_HIGHLIGHT,s)},[r,n,o,m,c]),e()},rt=[C],nt={[d]:!1};
4
+ var t="chromaui/addon-visual-tests";var E="highlightIgnored",s=`${t}/highlightIgnored`,h=`${t}/highlightIgnored/count`,g=`${t}/highlightIgnored/select`,p=['[data-chromatic="ignore"]','[class~="chromatic-ignore"]'];var O={backgroundColor:"rgba(255, 173, 51, 0.2)",outline:"1px solid rgba(255, 173, 51, 0.7)",outlineOffset:"-1px"},S={backgroundColor:"rgba(255, 173, 51, 0.1)",outlineWidth:"2px"},x={backgroundColor:"transparent",outlineWidth:"2px"},G=e=>{if(!e)return !1;if(typeof document>"u")return !0;try{return document.createDocumentFragment().querySelector(e),!0}catch{return console.warn(`Invalid ignoreSelector: ${e}`),!1}},u=e=>{let l=e?.ignoreSelectors??[],i=Array.from(new Set(p.concat(l.filter(G))));return {id:s,selectors:i,styles:O,hoverStyles:S,focusStyles:x,menu:i.map(o=>{let c=p.includes(o);return [{id:`${o}-info`,title:"Element ignored in visual tests",description:c?`${o} will be ignored by Chromatic`:`${o} matches an ignored selector`,selectors:[o]},{id:`${o}-link`,iconLeft:"info",iconRight:"shareAlt",title:"Learn how to configure ignored elements",clickEvent:g,selectors:[o]}]})}};var C=(e,{globals:l,parameters:i,id:o})=>{let c=!!l[E],r=useChannel({}),n=u(i.chromatic),m=n?.selectors.join(`
5
+ `)??"";return useEffect(()=>{if(r(REMOVE_HIGHLIGHT,s),!n?.selectors.length){r(h,0);return}c&&r(HIGHLIGHT,n);let H=document.getElementById("storybook-root"),f=n.selectors.reduce((a,d)=>(document.querySelectorAll(`:is(${d}):not([id^="storybook-"], [id^="storybook-"] *, [class^="sb-"], [class^="sb-"] *)`).forEach(I=>a.add(I)),(H?.querySelectorAll(d)??[]).forEach(I=>a.add(I)),a),new Set);return r(h,f.size),()=>r(REMOVE_HIGHLIGHT,s)},[r,n,o,m,c]),e()},st=[C],it={[E]:!1};
6
6
 
7
- export { rt as decorators, nt as initialGlobals };
7
+ export { st as decorators, it as initialGlobals };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chromatic-com/storybook",
3
- "version": "5.2.0-next.0",
3
+ "version": "5.2.0-next.2",
4
4
  "description": "Catch unexpected visual changes & UI bugs in your stories",
5
5
  "keywords": [
6
6
  "storybook-addons",
@@ -54,7 +54,7 @@
54
54
  },
55
55
  "dependencies": {
56
56
  "@neoconfetti/react": "^1.0.0",
57
- "chromatic": "^13.3.4",
57
+ "chromatic": "16.10.0",
58
58
  "filesize": "^10.0.12",
59
59
  "jsonfile": "^6.1.0",
60
60
  "strip-ansi": "^7.1.0"
@@ -67,9 +67,9 @@
67
67
  "@graphql-typed-document-node/core": "^3.2.0",
68
68
  "@parcel/watcher": "^2.4.1",
69
69
  "@storybook/addon-designs": "^11.1.1",
70
- "@storybook/addon-docs": "^10.2.1",
71
- "@storybook/icons": "^2.0.1",
72
- "@storybook/react-vite": "^10.2.1",
70
+ "@storybook/addon-docs": "^10.3.0",
71
+ "@storybook/icons": "^2.0.2",
72
+ "@storybook/react-vite": "^10.3.0",
73
73
  "@types/jsonfile": "^6.1.1",
74
74
  "@types/node": "^22.13.5",
75
75
  "@types/pluralize": "^0.0.29",
@@ -90,7 +90,7 @@
90
90
  "eslint-plugin-prettier": "^5.2.3",
91
91
  "eslint-plugin-react-hooks": "^5.0.0",
92
92
  "eslint-plugin-simple-import-sort": "^12.1.1",
93
- "eslint-plugin-storybook": "^10.2.1",
93
+ "eslint-plugin-storybook": "^10.3.0",
94
94
  "graphql": "^16.8.1",
95
95
  "msw": "^2.0.0",
96
96
  "msw-storybook-addon": "^2.0.6",
@@ -104,7 +104,7 @@
104
104
  "react-dom": "^18.3.1",
105
105
  "react-joyride": "^2.7.2",
106
106
  "rimraf": "^3.0.2",
107
- "storybook": "^10.2.1",
107
+ "storybook": "^10.3.0",
108
108
  "ts-dedent": "^2.2.0",
109
109
  "tsup": "^6.6.3",
110
110
  "typescript": "^5.7.3",