@storyblok/js 4.1.1 → 4.1.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.
@@ -4,4 +4,4 @@
4
4
  * description: SDK to integrate Storyblok into your project using JavaScript.
5
5
  * author: undefined
6
6
  */
7
- (function(w,S){typeof exports=="object"&&typeof module<"u"?S(exports):typeof define=="function"&&define.amd?define(["exports"],S):(w=typeof globalThis<"u"?globalThis:w||self,S(w.storyblok={}))})(this,function(w){"use strict";function S(r,e){if(!e)return{src:r,attrs:{}};let t=0,o=0;const s={},n=[];function l(a,h,d,y,R){typeof a!="number"||a<=h||a>=d?console.warn(`[StoryblokRichText] - ${y.charAt(0).toUpperCase()+y.slice(1)} value must be a number between ${h} and ${d} (inclusive)`):R.push(`${y}(${a})`)}if(typeof e=="object"){if(typeof e.width=="number"&&e.width>0?(s.width=e.width,t=e.width):console.warn("[StoryblokRichText] - Width value must be a number greater than 0"),e.height&&typeof e.height=="number"&&e.height>0?(s.height=e.height,o=e.height):console.warn("[StoryblokRichText] - Height value must be a number greater than 0"),e.loading&&["lazy","eager"].includes(e.loading)&&(s.loading=e.loading),e.class&&(s.class=e.class),e.filters){const{filters:a}=e||{},{blur:h,brightness:d,fill:y,format:R,grayscale:_,quality:L,rotate:C}=a||{};h&&l(h,0,100,"blur",n),L&&l(L,0,100,"quality",n),d&&l(d,0,100,"brightness",n),y&&n.push(`fill(${y})`),_&&n.push("grayscale()"),C&&[0,90,180,270].includes(e.filters.rotate||0)&&n.push(`rotate(${C})`),R&&["webp","png","jpeg"].includes(R)&&n.push(`format(${R})`)}e.srcset&&(s.srcset=e.srcset.map(a=>{if(typeof a=="number")return`${r}/m/${a}x0/${n.length>0?`filters:${n.join(":")}`:""} ${a}w`;if(Array.isArray(a)&&a.length===2){const[h,d]=a;return`${r}/m/${h}x${d}/${n.length>0?`filters:${n.join(":")}`:""} ${h}w`}else{console.warn("[StoryblokRichText] - srcset entry must be a number or a tuple of two numbers");return}}).join(", ")),e.sizes&&(s.sizes=e.sizes.join(", "))}let c=`${r}/m/`;return t>0&&o>0&&(c=`${c}${t}x${o}/`),n.length>0&&(c=`${c}filters:${n.join(":")}`),{src:c,attrs:s}}var b=(r=>(r.DOCUMENT="doc",r.HEADING="heading",r.PARAGRAPH="paragraph",r.QUOTE="blockquote",r.OL_LIST="ordered_list",r.UL_LIST="bullet_list",r.LIST_ITEM="list_item",r.CODE_BLOCK="code_block",r.HR="horizontal_rule",r.BR="hard_break",r.IMAGE="image",r.EMOJI="emoji",r.COMPONENT="blok",r.TABLE="table",r.TABLE_ROW="tableRow",r.TABLE_CELL="tableCell",r.TABLE_HEADER="tableHeader",r))(b||{}),$=(r=>(r.BOLD="bold",r.STRONG="strong",r.STRIKE="strike",r.UNDERLINE="underline",r.ITALIC="italic",r.CODE="code",r.LINK="link",r.ANCHOR="anchor",r.STYLED="styled",r.SUPERSCRIPT="superscript",r.SUBSCRIPT="subscript",r.TEXT_STYLE="textStyle",r.HIGHLIGHT="highlight",r))($||{}),N=(r=>(r.TEXT="text",r))(N||{}),I=(r=>(r.URL="url",r.STORY="story",r.ASSET="asset",r.EMAIL="email",r))(I||{});const Q=["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"],Z=(r={})=>Object.keys(r).map(e=>`${e}="${r[e]}"`).join(" "),ee=(r={})=>Object.keys(r).map(e=>`${e}: ${r[e]}`).join("; ");function te(r){return r.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}const O=r=>Object.fromEntries(Object.entries(r).filter(([e,t])=>t!==void 0));function D(r,e={},t){const o=Z(e),s=o?`${r} ${o}`:r,n=Array.isArray(t)?t.join(""):t||"";if(r){if(Q.includes(r))return`<${s}>`}else return n;return`<${s}>${n}</${r}>`}function M(r={}){const e=new Map,{renderFn:t=D,textFn:o=te,resolvers:s={},optimizeImages:n=!1,keyedResolvers:l=!1}=r,c=t!==D,a=i=>(u,p)=>{const f=u.attrs||{};return p.render(i,f,u.children||null)},h=(i,u)=>{const{src:p,alt:f,title:m,srcset:T,sizes:v}=i.attrs||{};let k=p,E={};if(n){const{src:Ae,attrs:Se}=S(p,n);k=Ae,E=Se}const Ee={src:k,alt:f,title:m,srcset:T,sizes:v,...E};return u.render("img",O(Ee))},d=(i,u)=>{const{level:p,...f}=i.attrs||{};return u.render(`h${p}`,f,i.children)},y=(i,u)=>{var p,f,m,T;const v=u.render("img",{src:(p=i.attrs)==null?void 0:p.fallbackImage,alt:(f=i.attrs)==null?void 0:f.alt,style:"width: 1.25em; height: 1.25em; vertical-align: text-top",draggable:"false",loading:"lazy"});return u.render("span",{"data-type":"emoji","data-name":(m=i.attrs)==null?void 0:m.name,"data-emoji":(T=i.attrs)==null?void 0:T.emoji},v)},R=(i,u)=>u.render("pre",i.attrs||{},u.render("code",{},i.children||"")),_=(i,u=!1)=>({text:p,attrs:f},m)=>{const{class:T,id:v,...k}=f||{},E=u?{class:T,id:v,style:ee(k)||void 0}:f||{};return m.render(i,O(E),p)},L=i=>U(i),C=i=>{const{marks:u,...p}=i;if("text"in i){if(u)return u.reduce((m,T)=>L({...T,text:m}),L({...p,children:p.children}));const f=i.attrs||{};if(l){const m=e.get("txt")||0;e.set("txt",m+1),f.key=`txt-${m}`}return o(p.text,f)}return""},K=(i,u)=>{const{linktype:p,href:f,anchor:m,...T}=i.attrs||{};let v="";switch(p){case I.ASSET:case I.URL:v=f;break;case I.EMAIL:v=`mailto:${f}`;break;case I.STORY:v=f,m&&(v=`${v}#${m}`);break;default:v=f;break}const k={...T};return v&&(k.href=v),u.render("a",k,i.text)},ke=(i,u)=>{var p,f;return console.warn("[StoryblokRichtText] - BLOK resolver is not available for vanilla usage"),u.render("span",{blok:(p=i==null?void 0:i.attrs)==null?void 0:p.body[0],id:(f=i.attrs)==null?void 0:f.id,style:"display: none"})},we=(i,u)=>{const p={},f=u.render("tbody",{},i.children);return u.render("table",p,f)},Te=(i,u)=>{const p={};return u.render("tr",p,i.children)},Re=(i,u)=>{const{colspan:p,rowspan:f,colwidth:m,backgroundColor:T,...v}=i.attrs||{},k={...v};p>1&&(k.colspan=p),f>1&&(k.rowspan=f);const E=[];return m&&E.push(`width: ${m}px;`),T&&E.push(`background-color: ${T};`),E.length>0&&(k.style=E.join(" ")),u.render("td",O(k),i.children)},$e=(i,u)=>{const{colspan:p,rowspan:f,colwidth:m,backgroundColor:T,...v}=i.attrs||{},k={...v};p>1&&(k.colspan=p),f>1&&(k.rowspan=f);const E=[];return m&&E.push(`width: ${m}px;`),T&&E.push(`background-color: ${T};`),E.length>0&&(k.style=E.join(" ")),u.render("th",O(k),i.children)},W=new Map([[b.DOCUMENT,a("")],[b.HEADING,d],[b.PARAGRAPH,a("p")],[b.UL_LIST,a("ul")],[b.OL_LIST,a("ol")],[b.LIST_ITEM,a("li")],[b.IMAGE,h],[b.EMOJI,y],[b.CODE_BLOCK,R],[b.HR,a("hr")],[b.BR,a("br")],[b.QUOTE,a("blockquote")],[b.COMPONENT,ke],[N.TEXT,C],[$.LINK,K],[$.ANCHOR,K],[$.STYLED,_("span",!0)],[$.BOLD,_("strong")],[$.TEXT_STYLE,_("span",!0)],[$.ITALIC,_("em")],[$.UNDERLINE,_("u")],[$.STRIKE,_("s")],[$.CODE,_("code")],[$.SUPERSCRIPT,_("sup")],[$.SUBSCRIPT,_("sub")],[$.HIGHLIGHT,_("mark")],[b.TABLE,we],[b.TABLE_ROW,Te],[b.TABLE_CELL,Re],[b.TABLE_HEADER,$e]]),X=new Map([...W,...Object.entries(s).map(([i,u])=>[i,u])]),_e=()=>({render:(i,u={},p)=>{if(l&&i){const f=e.get(i)||0;e.set(i,f+1),u.key=`${i}-${f}`}return t(i,u,p)},originalResolvers:W,mergedResolvers:X});function P(i){const u=X.get(i.type);if(!u)return console.error("<Storyblok>",`No resolver found for node type ${i.type}`),"";const p=_e();if(i.type==="text")return u(i,p);const f=i.content?i.content.map(U):void 0;return u({...i,children:f},p)}function U(i){return i.type==="doc"?c?i.content.map(P):i.content.map(P).join(""):Array.isArray(i)?i.map(P):P(i)}return{render:U}}let z=!1;const G=[],V=r=>new Promise((e,t)=>{if(typeof window>"u"){t(new Error("Cannot load Storyblok bridge: window is undefined (server-side environment)"));return}if(window.storyblokRegisterEvent=s=>{if(window.location===window.parent.location){console.warn("You are not in Draft Mode or in the Visual Editor.");return}z?s():G.push(s)},document.getElementById("storyblok-javascript-bridge")){e(void 0);return}const o=document.createElement("script");o.async=!0,o.src=r,o.id="storyblok-javascript-bridge",o.onerror=s=>t(s),o.onload=s=>{G.forEach(n=>n()),z=!0,e(s)},document.getElementsByTagName("head")[0].appendChild(o)});var se=Object.defineProperty,re=(r,e,t)=>e in r?se(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,g=(r,e,t)=>re(r,typeof e!="symbol"?e+"":e,t);class oe extends Error{constructor(e){super(e),this.name="AbortError"}}function ne(r,e,t){if(!Number.isFinite(e))throw new TypeError("Expected `limit` to be a finite number");if(!Number.isFinite(t))throw new TypeError("Expected `interval` to be a finite number");const o=[];let s=[],n=0,l=!1;const c=async()=>{n++;const h=o.shift();if(h)try{const y=await r(...h.args);h.resolve(y)}catch(y){h.reject(y)}const d=setTimeout(()=>{n--,o.length>0&&c(),s=s.filter(y=>y!==d)},t);s.includes(d)||s.push(d)},a=(...h)=>l?Promise.reject(new Error("Throttled function is already aborted and not accepting new promises")):new Promise((d,y)=>{o.push({resolve:d,reject:y,args:h}),n<e&&c()});return a.abort=()=>{l=!0,s.forEach(clearTimeout),s=[],o.forEach(h=>h.reject(()=>new oe("Throttle function aborted"))),o.length=0},a}const q=(r="")=>r.includes("/cdn/"),ie=(r,e=25,t=1)=>({...r,per_page:e,page:t}),ae=r=>new Promise(e=>setTimeout(e,r)),le=(r=0,e)=>Array.from({length:r},e),ce=(r=0,e=r)=>{const t=Math.abs(e-r)||0,o=r<e?1:-1;return le(t,(s,n)=>n*o+r)},he=async(r,e)=>Promise.all(r.map(e)),ue=(r=[],e)=>r.map(e).reduce((t,o)=>[...t,...o],[]),B=(r,e,t)=>{const o=[];for(const s in r){if(!Object.prototype.hasOwnProperty.call(r,s))continue;const n=r[s];if(n==null)continue;const l=t?"":encodeURIComponent(s);let c;typeof n=="object"?c=B(n,e?e+encodeURIComponent(`[${l}]`):l,Array.isArray(n)):c=`${e?e+encodeURIComponent(`[${l}]`):l}=${encodeURIComponent(n)}`,o.push(c)}return o.join("&")},F=r=>{const e={eu:"api.storyblok.com",us:"api-us.storyblok.com",cn:"app.storyblokchina.cn",ap:"api-ap.storyblok.com",ca:"api-ca.storyblok.com"};return e[r]??e.eu};class de{constructor(e){g(this,"baseURL"),g(this,"timeout"),g(this,"headers"),g(this,"responseInterceptor"),g(this,"fetch"),g(this,"ejectInterceptor"),g(this,"url"),g(this,"parameters"),g(this,"fetchOptions"),this.baseURL=e.baseURL,this.headers=e.headers||new Headers,this.timeout=e!=null&&e.timeout?e.timeout*1e3:0,this.responseInterceptor=e.responseInterceptor,this.fetch=(...t)=>e.fetch?e.fetch(...t):fetch(...t),this.ejectInterceptor=!1,this.url="",this.parameters={},this.fetchOptions={}}get(e,t){return this.url=e,this.parameters=t,this._methodHandler("get")}post(e,t){return this.url=e,this.parameters=t,this._methodHandler("post")}put(e,t){return this.url=e,this.parameters=t,this._methodHandler("put")}delete(e,t){return this.url=e,this.parameters=t??{},this._methodHandler("delete")}async _responseHandler(e){const t=[],o={data:{},headers:{},status:0,statusText:""};e.status!==204&&await e.json().then(s=>{o.data=s});for(const s of e.headers.entries())t[s[0]]=s[1];return o.headers={...t},o.status=e.status,o.statusText=e.statusText,o}async _methodHandler(e){let t=`${this.baseURL}${this.url}`,o=null;e==="get"?t=`${this.baseURL}${this.url}?${B(this.parameters)}`:o=JSON.stringify(this.parameters);const s=new URL(t),n=new AbortController,{signal:l}=n;let c;this.timeout&&(c=setTimeout(()=>n.abort(),this.timeout));try{const a=await this.fetch(`${s}`,{method:e,headers:this.headers,body:o,signal:l,...this.fetchOptions});this.timeout&&clearTimeout(c);const h=await this._responseHandler(a);return this.responseInterceptor&&!this.ejectInterceptor?this._statusHandler(this.responseInterceptor(h)):this._statusHandler(h)}catch(a){return{message:a}}}setFetchOptions(e={}){Object.keys(e).length>0&&"method"in e&&delete e.method,this.fetchOptions={...e}}eject(){this.ejectInterceptor=!0}_normalizeErrorMessage(e){if(Array.isArray(e))return e[0]||"Unknown error";if(e&&typeof e=="object"){if(e.error)return e.error;for(const t in e){if(Array.isArray(e[t]))return`${t}: ${e[t][0]}`;if(typeof e[t]=="string")return`${t}: ${e[t]}`}if(e.slug)return e.slug}return"Unknown error"}_statusHandler(e){const t=/20[0-6]/g;return new Promise((o,s)=>{if(t.test(`${e.status}`))return o(e);const n={message:this._normalizeErrorMessage(e.data),status:e.status,response:e};s(n)})}}const J="SB-Agent",H={defaultAgentName:"SB-JS-CLIENT",defaultAgentVersion:"SB-Agent-Version",packageVersion:"7.0.0"},pe={PUBLISHED:"published"};let j={};const A={};class fe{constructor(e,t){g(this,"client"),g(this,"maxRetries"),g(this,"retriesDelay"),g(this,"throttle"),g(this,"accessToken"),g(this,"cache"),g(this,"resolveCounter"),g(this,"relations"),g(this,"links"),g(this,"version"),g(this,"richTextResolver"),g(this,"resolveNestedRelations"),g(this,"stringifiedStoriesCache"),g(this,"inlineAssets");let o=e.endpoint||t;if(!o){const l=e.https===!1?"http":"https";e.oauthToken?o=`${l}://${F(e.region)}/v1`:o=`${l}://${F(e.region)}/v2`}const s=new Headers;s.set("Content-Type","application/json"),s.set("Accept","application/json"),e.headers&&(e.headers.constructor.name==="Headers"?e.headers.entries().toArray():Object.entries(e.headers)).forEach(([l,c])=>{s.set(l,c)}),s.has(J)||(s.set(J,H.defaultAgentName),s.set(H.defaultAgentVersion,H.packageVersion));let n=5;e.oauthToken&&(s.set("Authorization",e.oauthToken),n=3),e.rateLimit&&(n=e.rateLimit),this.maxRetries=e.maxRetries||10,this.retriesDelay=300,this.throttle=ne(this.throttledRequest.bind(this),n,1e3),this.accessToken=e.accessToken||"",this.relations={},this.links={},this.cache=e.cache||{clear:"manual"},this.resolveCounter=0,this.resolveNestedRelations=e.resolveNestedRelations||!0,this.stringifiedStoriesCache={},this.version=e.version||pe.PUBLISHED,this.inlineAssets=e.inlineAssets||!1,this.client=new de({baseURL:o,timeout:e.timeout||0,headers:s,responseInterceptor:e.responseInterceptor,fetch:e.fetch})}parseParams(e){return e.token||(e.token=this.getToken()),e.cv||(e.cv=A[e.token]),Array.isArray(e.resolve_relations)&&(e.resolve_relations=e.resolve_relations.join(",")),typeof e.resolve_relations<"u"&&(e.resolve_level=2),e}factoryParamOptions(e,t){return q(e)?this.parseParams(t):t}makeRequest(e,t,o,s,n){const l=this.factoryParamOptions(e,ie(t,o,s));return this.cacheResponse(e,l,void 0,n)}get(e,t={},o){t||(t={});const s=`/${e}`;q(s)&&(t.version=t.version||this.version);const n=this.factoryParamOptions(s,t);return this.cacheResponse(s,n,void 0,o)}async getAll(e,t={},o,s){const n=(t==null?void 0:t.per_page)||25,l=`/${e}`.replace(/\/$/,""),c=o??l.substring(l.lastIndexOf("/")+1);t.version=t.version||this.version;const a=1,h=await this.makeRequest(l,t,n,a,s),d=h.total?Math.ceil(h.total/n):1,y=await he(ce(a,d),R=>this.makeRequest(l,t,n,R+1,s));return ue([h,...y],R=>Object.values(R.data[c]))}post(e,t={},o){const s=`/${e}`;return this.throttle("post",s,t,o)}put(e,t={},o){const s=`/${e}`;return this.throttle("put",s,t,o)}delete(e,t={},o){t||(t={});const s=`/${e}`;return this.throttle("delete",s,t,o)}getStories(e={},t){return this._addResolveLevel(e),this.get("cdn/stories",e,t)}getStory(e,t={},o){return this._addResolveLevel(t),this.get(`cdn/stories/${e}`,t,o)}getToken(){return this.accessToken}ejectInterceptor(){this.client.eject()}_addResolveLevel(e){typeof e.resolve_relations<"u"&&(e.resolve_level=2)}_cleanCopy(e){return JSON.parse(JSON.stringify(e))}_insertLinks(e,t,o){const s=e[t];s&&s.fieldtype==="multilink"&&s.linktype==="story"&&typeof s.id=="string"&&this.links[o][s.id]?s.story=this._cleanCopy(this.links[o][s.id]):s&&s.linktype==="story"&&typeof s.uuid=="string"&&this.links[o][s.uuid]&&(s.story=this._cleanCopy(this.links[o][s.uuid]))}getStoryReference(e,t){return this.relations[e][t]?JSON.parse(this.stringifiedStoriesCache[t]||JSON.stringify(this.relations[e][t])):t}_resolveField(e,t,o){const s=e[t];typeof s=="string"?e[t]=this.getStoryReference(o,s):Array.isArray(s)&&(e[t]=s.map(n=>this.getStoryReference(o,n)).filter(Boolean))}_insertRelations(e,t,o,s){if(Array.isArray(o)?o.find(l=>l.endsWith(`.${t}`)):o.endsWith(`.${t}`)){this._resolveField(e,t,s);return}const n=e.component?`${e.component}.${t}`:t;(Array.isArray(o)?o.includes(n):o===n)&&this._resolveField(e,t,s)}iterateTree(e,t,o){const s=(n,l="")=>{if(!(!n||n._stopResolving)){if(Array.isArray(n))n.forEach((c,a)=>s(c,`${l}[${a}]`));else if(typeof n=="object")for(const c in n){const a=l?`${l}.${c}`:c;(n.component&&n._uid||n.type==="link")&&(this._insertRelations(n,c,t,o),this._insertLinks(n,c,o)),s(n[c],a)}}};s(e.content)}async resolveLinks(e,t,o){let s=[];if(e.link_uuids){const n=e.link_uuids.length,l=[],c=50;for(let a=0;a<n;a+=c){const h=Math.min(n,a+c);l.push(e.link_uuids.slice(a,h))}for(let a=0;a<l.length;a++)(await this.getStories({per_page:c,language:t.language,version:t.version,starts_with:t.starts_with,by_uuids:l[a].join(",")})).data.stories.forEach(h=>{s.push(h)})}else s=e.links;s.forEach(n=>{this.links[o][n.uuid]={...n,_stopResolving:!0}})}async resolveRelations(e,t,o){let s=[];if(e.rel_uuids){const n=e.rel_uuids.length,l=[],c=50;for(let a=0;a<n;a+=c){const h=Math.min(n,a+c);l.push(e.rel_uuids.slice(a,h))}for(let a=0;a<l.length;a++)(await this.getStories({per_page:c,language:t.language,version:t.version,starts_with:t.starts_with,by_uuids:l[a].join(","),excluding_fields:t.excluding_fields})).data.stories.forEach(h=>{s.push(h)});s.length>0&&(e.rels=s,delete e.rel_uuids)}else s=e.rels;s&&s.length>0&&s.forEach(n=>{this.relations[o][n.uuid]={...n,_stopResolving:!0}})}async resolveStories(e,t,o){var s,n;let l=[];if(this.links[o]={},this.relations[o]={},typeof t.resolve_relations<"u"&&t.resolve_relations.length>0&&(typeof t.resolve_relations=="string"&&(l=t.resolve_relations.split(",")),await this.resolveRelations(e,t,o)),t.resolve_links&&["1","story","url","link"].includes(t.resolve_links)&&((s=e.links)!=null&&s.length||(n=e.link_uuids)!=null&&n.length)&&await this.resolveLinks(e,t,o),this.resolveNestedRelations)for(const c in this.relations[o])this.iterateTree(this.relations[o][c],l,o);e.story?this.iterateTree(e.story,l,o):e.stories.forEach(c=>{this.iterateTree(c,l,o)}),this.stringifiedStoriesCache={},delete this.links[o],delete this.relations[o]}async cacheResponse(e,t,o,s){const n=B({url:e,params:t}),l=this.cacheProvider();if(t.version==="published"&&e!=="/cdn/spaces/me"){const c=await l.get(n);if(c)return Promise.resolve(c)}return new Promise(async(c,a)=>{var h;try{const d=await this.throttle("get",e,t,s);if(d.status!==200)return a(d);let y={data:d.data,headers:d.headers};if((h=d.headers)!=null&&h["per-page"]&&(y=Object.assign({},y,{perPage:d.headers["per-page"]?Number.parseInt(d.headers["per-page"]):0,total:d.headers["per-page"]?Number.parseInt(d.headers.total):0})),y.data.story||y.data.stories){const _=this.resolveCounter=++this.resolveCounter%1e3;await this.resolveStories(y.data,t,`${_}`),y=await this.processInlineAssets(y)}t.version==="published"&&e!=="/cdn/spaces/me"&&await l.set(n,y);const R=this.cache.clear==="onpreview"&&t.version==="draft"||this.cache.clear==="auto";return t.token&&y.data.cv&&(R&&A[t.token]&&A[t.token]!==y.data.cv&&await this.flushCache(),A[t.token]=y.data.cv),c(y)}catch(d){if(d.response&&d.status===429&&(o=typeof o>"u"?0:o+1,o<this.maxRetries))return console.log(`Hit rate limit. Retrying in ${this.retriesDelay/1e3} seconds.`),await ae(this.retriesDelay),this.cacheResponse(e,t,o).then(c).catch(a);a(d)}})}throttledRequest(e,t,o,s){return this.client.setFetchOptions(s),this.client[e](t,o)}cacheVersions(){return A}cacheVersion(){return A[this.accessToken]}setCacheVersion(e){this.accessToken&&(A[this.accessToken]=e)}clearCacheVersion(){this.accessToken&&(A[this.accessToken]=0)}cacheProvider(){switch(this.cache.type){case"memory":return{get(e){return Promise.resolve(j[e])},getAll(){return Promise.resolve(j)},set(e,t){return j[e]=t,Promise.resolve(void 0)},flush(){return j={},Promise.resolve(void 0)}};case"custom":if(this.cache.custom)return this.cache.custom;default:return{get(){return Promise.resolve()},getAll(){return Promise.resolve(void 0)},set(){return Promise.resolve(void 0)},flush(){return Promise.resolve(void 0)}}}}async flushCache(){return await this.cacheProvider().flush(),this.clearCacheVersion(),this}async processInlineAssets(e){if(!this.inlineAssets)return e;const t=o=>{if(!o||typeof o!="object")return o;if(Array.isArray(o))return o.map(n=>t(n));let s={...o};s.fieldtype==="asset"&&Array.isArray(e.data.assets)&&(s={...s,...e.data.assets.find(n=>n.id===s.id)});for(const n in s)typeof s[n]=="object"&&(s[n]=t(s[n]));return s};return e.data.story&&(e.data.story.content=t(e.data.story.content)),e.data.stories&&(e.data.stories=e.data.stories.map(o=>(o.content=t(o.content),o))),e}}const ye=(r={})=>{const{apiOptions:e}=r;if(!e||!e.accessToken){console.error("You need to provide an access token to interact with Storyblok API. Read https://www.storyblok.com/docs/api/content-delivery#topics/authentication");return}return{storyblokApi:new fe(e)}},ge=r=>{if(typeof r!="object"||typeof r._editable>"u")return{};try{const e=JSON.parse(r._editable.replace(/^<!--#storyblok#/,"").replace(/-->$/,""));return e?{"data-blok-c":JSON.stringify(e),"data-blok-uid":`${e.id}-${e.uid}`}:{}}catch{return{}}};let x="https://app.storyblok.com/f/storyblok-v2-latest.js";const Y=(r,e,t={})=>{var c;const s=!(typeof window>"u")&&typeof window.storyblokRegisterEvent<"u",n=new URL((c=window.location)==null?void 0:c.href).searchParams.get("_storyblok"),l=n!==null&&+n===r;if(!(!s||!l)){if(!r){console.warn("Story ID is not defined. Please provide a valid ID.");return}window.storyblokRegisterEvent(()=>{new window.StoryblokBridge(t).on(["input","published","change"],h=>{var d;h&&(h.action==="input"&&((d=h.story)==null?void 0:d.id)===r?e(h.story):(h.action==="change"||h.action==="published")&&h.storyId===r&&window.location.reload())})})}},me=(r={})=>{var d,y;const{bridge:e,accessToken:t,use:o=[],apiOptions:s={},bridgeUrl:n}=r;s.accessToken=s.accessToken||t;const l={bridge:e,apiOptions:s};let c={};o.forEach(R=>{c={...c,...R(l)}}),n&&(x=n);const h=!(typeof window>"u")&&((y=(d=window.location)==null?void 0:d.search)==null?void 0:y.includes("_storyblok_tk"));return e!==!1&&h&&V(x),c};function be(r,e){return M(e).render(r)}const ve=()=>V(x);w.BlockTypes=b,w.MarkTypes=$,w.TextTypes=N,w.apiPlugin=ye,w.loadStoryblokBridge=ve,w.registerStoryblokBridge=Y,w.renderRichText=be,w.richTextResolver=M,w.storyblokEditable=ge,w.storyblokInit=me,w.useStoryblokBridge=Y,Object.defineProperty(w,Symbol.toStringTag,{value:"Module"})});
7
+ (function(w,S){typeof exports=="object"&&typeof module<"u"?S(exports):typeof define=="function"&&define.amd?define(["exports"],S):(w=typeof globalThis<"u"?globalThis:w||self,S(w.storyblok={}))})(this,function(w){"use strict";function S(r,e){if(!e)return{src:r,attrs:{}};let t=0,o=0;const s={},n=[];function l(a,h,d,y,R){typeof a!="number"||a<=h||a>=d?console.warn(`[StoryblokRichText] - ${y.charAt(0).toUpperCase()+y.slice(1)} value must be a number between ${h} and ${d} (inclusive)`):R.push(`${y}(${a})`)}if(typeof e=="object"){if(typeof e.width=="number"&&e.width>0?(s.width=e.width,t=e.width):console.warn("[StoryblokRichText] - Width value must be a number greater than 0"),e.height&&typeof e.height=="number"&&e.height>0?(s.height=e.height,o=e.height):console.warn("[StoryblokRichText] - Height value must be a number greater than 0"),e.loading&&["lazy","eager"].includes(e.loading)&&(s.loading=e.loading),e.class&&(s.class=e.class),e.filters){const{filters:a}=e||{},{blur:h,brightness:d,fill:y,format:R,grayscale:$,quality:L,rotate:C}=a||{};h&&l(h,0,100,"blur",n),L&&l(L,0,100,"quality",n),d&&l(d,0,100,"brightness",n),y&&n.push(`fill(${y})`),$&&n.push("grayscale()"),C&&[0,90,180,270].includes(e.filters.rotate||0)&&n.push(`rotate(${C})`),R&&["webp","png","jpeg"].includes(R)&&n.push(`format(${R})`)}e.srcset&&(s.srcset=e.srcset.map(a=>{if(typeof a=="number")return`${r}/m/${a}x0/${n.length>0?`filters:${n.join(":")}`:""} ${a}w`;if(Array.isArray(a)&&a.length===2){const[h,d]=a;return`${r}/m/${h}x${d}/${n.length>0?`filters:${n.join(":")}`:""} ${h}w`}else{console.warn("[StoryblokRichText] - srcset entry must be a number or a tuple of two numbers");return}}).join(", ")),e.sizes&&(s.sizes=e.sizes.join(", "))}let c=`${r}/m/`;return t>0&&o>0&&(c=`${c}${t}x${o}/`),n.length>0&&(c=`${c}filters:${n.join(":")}`),{src:c,attrs:s}}var b=(r=>(r.DOCUMENT="doc",r.HEADING="heading",r.PARAGRAPH="paragraph",r.QUOTE="blockquote",r.OL_LIST="ordered_list",r.UL_LIST="bullet_list",r.LIST_ITEM="list_item",r.CODE_BLOCK="code_block",r.HR="horizontal_rule",r.BR="hard_break",r.IMAGE="image",r.EMOJI="emoji",r.COMPONENT="blok",r.TABLE="table",r.TABLE_ROW="tableRow",r.TABLE_CELL="tableCell",r.TABLE_HEADER="tableHeader",r))(b||{}),_=(r=>(r.BOLD="bold",r.STRONG="strong",r.STRIKE="strike",r.UNDERLINE="underline",r.ITALIC="italic",r.CODE="code",r.LINK="link",r.ANCHOR="anchor",r.STYLED="styled",r.SUPERSCRIPT="superscript",r.SUBSCRIPT="subscript",r.TEXT_STYLE="textStyle",r.HIGHLIGHT="highlight",r))(_||{}),N=(r=>(r.TEXT="text",r))(N||{}),I=(r=>(r.URL="url",r.STORY="story",r.ASSET="asset",r.EMAIL="email",r))(I||{});const Q=["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"],Z=(r={})=>Object.keys(r).map(e=>`${e}="${r[e]}"`).join(" "),ee=(r={})=>Object.keys(r).map(e=>`${e}: ${r[e]}`).join("; ");function te(r){return r.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}const O=r=>Object.fromEntries(Object.entries(r).filter(([e,t])=>t!==void 0));function D(r,e={},t){const o=Z(e),s=o?`${r} ${o}`:r,n=Array.isArray(t)?t.join(""):t||"";if(r){if(Q.includes(r))return`<${s}>`}else return n;return`<${s}>${n}</${r}>`}function M(r={}){const e=new Map,{renderFn:t=D,textFn:o=te,resolvers:s={},optimizeImages:n=!1,keyedResolvers:l=!1}=r,c=t!==D,a=i=>(u,p)=>{const f=u.attrs||{};return p.render(i,f,u.children||null)},h=(i,u)=>{const{src:p,alt:f,title:m,srcset:T,sizes:v}=i.attrs||{};let k=p,E={};if(n){const{src:Ae,attrs:Se}=S(p,n);k=Ae,E=Se}const Ee={src:k,alt:f,title:m,srcset:T,sizes:v,...E};return u.render("img",O(Ee))},d=(i,u)=>{const{level:p,...f}=i.attrs||{};return u.render(`h${p}`,f,i.children)},y=(i,u)=>{var p,f,m,T;const v=u.render("img",{src:(p=i.attrs)==null?void 0:p.fallbackImage,alt:(f=i.attrs)==null?void 0:f.alt,style:"width: 1.25em; height: 1.25em; vertical-align: text-top",draggable:"false",loading:"lazy"});return u.render("span",{"data-type":"emoji","data-name":(m=i.attrs)==null?void 0:m.name,"data-emoji":(T=i.attrs)==null?void 0:T.emoji},v)},R=(i,u)=>u.render("pre",i.attrs||{},u.render("code",{},i.children||"")),$=(i,u=!1)=>({text:p,attrs:f},m)=>{const{class:T,id:v,...k}=f||{},E=u?{class:T,id:v,style:ee(k)||void 0}:f||{};return m.render(i,O(E),p)},L=i=>U(i),C=i=>{const{marks:u,...p}=i;if("text"in i){if(u)return u.reduce((m,T)=>L({...T,text:m}),L({...p,children:p.children}));const f=i.attrs||{};if(l){const m=e.get("txt")||0;e.set("txt",m+1),f.key=`txt-${m}`}return o(p.text,f)}return""},K=(i,u)=>{const{linktype:p,href:f,anchor:m,...T}=i.attrs||{};let v="";switch(p){case I.ASSET:case I.URL:v=f;break;case I.EMAIL:v=`mailto:${f}`;break;case I.STORY:v=f,m&&(v=`${v}#${m}`);break;default:v=f;break}const k={...T};return v&&(k.href=v),u.render("a",k,i.text)},ke=(i,u)=>{var p,f;return console.warn("[StoryblokRichtText] - BLOK resolver is not available for vanilla usage"),u.render("span",{blok:(p=i==null?void 0:i.attrs)==null?void 0:p.body[0],id:(f=i.attrs)==null?void 0:f.id,style:"display: none"})},we=(i,u)=>{const p={},f=u.render("tbody",{},i.children);return u.render("table",p,f)},Te=(i,u)=>{const p={};return u.render("tr",p,i.children)},Re=(i,u)=>{const{colspan:p,rowspan:f,colwidth:m,backgroundColor:T,...v}=i.attrs||{},k={...v};p>1&&(k.colspan=p),f>1&&(k.rowspan=f);const E=[];return m&&E.push(`width: ${m}px;`),T&&E.push(`background-color: ${T};`),E.length>0&&(k.style=E.join(" ")),u.render("td",O(k),i.children)},_e=(i,u)=>{const{colspan:p,rowspan:f,colwidth:m,backgroundColor:T,...v}=i.attrs||{},k={...v};p>1&&(k.colspan=p),f>1&&(k.rowspan=f);const E=[];return m&&E.push(`width: ${m}px;`),T&&E.push(`background-color: ${T};`),E.length>0&&(k.style=E.join(" ")),u.render("th",O(k),i.children)},W=new Map([[b.DOCUMENT,a("")],[b.HEADING,d],[b.PARAGRAPH,a("p")],[b.UL_LIST,a("ul")],[b.OL_LIST,a("ol")],[b.LIST_ITEM,a("li")],[b.IMAGE,h],[b.EMOJI,y],[b.CODE_BLOCK,R],[b.HR,a("hr")],[b.BR,a("br")],[b.QUOTE,a("blockquote")],[b.COMPONENT,ke],[N.TEXT,C],[_.LINK,K],[_.ANCHOR,K],[_.STYLED,$("span",!0)],[_.BOLD,$("strong")],[_.TEXT_STYLE,$("span",!0)],[_.ITALIC,$("em")],[_.UNDERLINE,$("u")],[_.STRIKE,$("s")],[_.CODE,$("code")],[_.SUPERSCRIPT,$("sup")],[_.SUBSCRIPT,$("sub")],[_.HIGHLIGHT,$("mark")],[b.TABLE,we],[b.TABLE_ROW,Te],[b.TABLE_CELL,Re],[b.TABLE_HEADER,_e]]),X=new Map([...W,...Object.entries(s).map(([i,u])=>[i,u])]),$e=()=>({render:(i,u={},p)=>{if(l&&i){const f=e.get(i)||0;e.set(i,f+1),u.key=`${i}-${f}`}return t(i,u,p)},originalResolvers:W,mergedResolvers:X});function P(i){const u=X.get(i.type);if(!u)return console.error("<Storyblok>",`No resolver found for node type ${i.type}`),"";const p=$e();if(i.type==="text")return u(i,p);const f=i.content?i.content.map(U):void 0;return u({...i,children:f},p)}function U(i){return i.type==="doc"?c?i.content.map(P):i.content.map(P).join(""):Array.isArray(i)?i.map(P):P(i)}return{render:U}}let z=!1;const G=[],V=r=>new Promise((e,t)=>{if(typeof window>"u"){t(new Error("Cannot load Storyblok bridge: window is undefined (server-side environment)"));return}if(window.storyblokRegisterEvent=s=>{if(!window.location.search.includes("_storyblok")){console.warn("You are not in Draft Mode or in the Visual Editor.");return}z?s():G.push(s)},document.getElementById("storyblok-javascript-bridge")){e(void 0);return}const o=document.createElement("script");o.async=!0,o.src=r,o.id="storyblok-javascript-bridge",o.onerror=s=>t(s),o.onload=s=>{G.forEach(n=>n()),z=!0,e(s)},document.getElementsByTagName("head")[0].appendChild(o)});var se=Object.defineProperty,re=(r,e,t)=>e in r?se(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,g=(r,e,t)=>re(r,typeof e!="symbol"?e+"":e,t);class oe extends Error{constructor(e){super(e),this.name="AbortError"}}function ne(r,e,t){if(!Number.isFinite(e))throw new TypeError("Expected `limit` to be a finite number");if(!Number.isFinite(t))throw new TypeError("Expected `interval` to be a finite number");const o=[];let s=[],n=0,l=!1;const c=async()=>{n++;const h=o.shift();if(h)try{const y=await r(...h.args);h.resolve(y)}catch(y){h.reject(y)}const d=setTimeout(()=>{n--,o.length>0&&c(),s=s.filter(y=>y!==d)},t);s.includes(d)||s.push(d)},a=(...h)=>l?Promise.reject(new Error("Throttled function is already aborted and not accepting new promises")):new Promise((d,y)=>{o.push({resolve:d,reject:y,args:h}),n<e&&c()});return a.abort=()=>{l=!0,s.forEach(clearTimeout),s=[],o.forEach(h=>h.reject(()=>new oe("Throttle function aborted"))),o.length=0},a}const q=(r="")=>r.includes("/cdn/"),ie=(r,e=25,t=1)=>({...r,per_page:e,page:t}),ae=r=>new Promise(e=>setTimeout(e,r)),le=(r=0,e)=>Array.from({length:r},e),ce=(r=0,e=r)=>{const t=Math.abs(e-r)||0,o=r<e?1:-1;return le(t,(s,n)=>n*o+r)},he=async(r,e)=>Promise.all(r.map(e)),ue=(r=[],e)=>r.map(e).reduce((t,o)=>[...t,...o],[]),B=(r,e,t)=>{const o=[];for(const s in r){if(!Object.prototype.hasOwnProperty.call(r,s))continue;const n=r[s];if(n==null)continue;const l=t?"":encodeURIComponent(s);let c;typeof n=="object"?c=B(n,e?e+encodeURIComponent(`[${l}]`):l,Array.isArray(n)):c=`${e?e+encodeURIComponent(`[${l}]`):l}=${encodeURIComponent(n)}`,o.push(c)}return o.join("&")},F=r=>{const e={eu:"api.storyblok.com",us:"api-us.storyblok.com",cn:"app.storyblokchina.cn",ap:"api-ap.storyblok.com",ca:"api-ca.storyblok.com"};return e[r]??e.eu};class de{constructor(e){g(this,"baseURL"),g(this,"timeout"),g(this,"headers"),g(this,"responseInterceptor"),g(this,"fetch"),g(this,"ejectInterceptor"),g(this,"url"),g(this,"parameters"),g(this,"fetchOptions"),this.baseURL=e.baseURL,this.headers=e.headers||new Headers,this.timeout=e!=null&&e.timeout?e.timeout*1e3:0,this.responseInterceptor=e.responseInterceptor,this.fetch=(...t)=>e.fetch?e.fetch(...t):fetch(...t),this.ejectInterceptor=!1,this.url="",this.parameters={},this.fetchOptions={}}get(e,t){return this.url=e,this.parameters=t,this._methodHandler("get")}post(e,t){return this.url=e,this.parameters=t,this._methodHandler("post")}put(e,t){return this.url=e,this.parameters=t,this._methodHandler("put")}delete(e,t){return this.url=e,this.parameters=t??{},this._methodHandler("delete")}async _responseHandler(e){const t=[],o={data:{},headers:{},status:0,statusText:""};e.status!==204&&await e.json().then(s=>{o.data=s});for(const s of e.headers.entries())t[s[0]]=s[1];return o.headers={...t},o.status=e.status,o.statusText=e.statusText,o}async _methodHandler(e){let t=`${this.baseURL}${this.url}`,o=null;e==="get"?t=`${this.baseURL}${this.url}?${B(this.parameters)}`:o=JSON.stringify(this.parameters);const s=new URL(t),n=new AbortController,{signal:l}=n;let c;this.timeout&&(c=setTimeout(()=>n.abort(),this.timeout));try{const a=await this.fetch(`${s}`,{method:e,headers:this.headers,body:o,signal:l,...this.fetchOptions});this.timeout&&clearTimeout(c);const h=await this._responseHandler(a);return this.responseInterceptor&&!this.ejectInterceptor?this._statusHandler(this.responseInterceptor(h)):this._statusHandler(h)}catch(a){return{message:a}}}setFetchOptions(e={}){Object.keys(e).length>0&&"method"in e&&delete e.method,this.fetchOptions={...e}}eject(){this.ejectInterceptor=!0}_normalizeErrorMessage(e){if(Array.isArray(e))return e[0]||"Unknown error";if(e&&typeof e=="object"){if(e.error)return e.error;for(const t in e){if(Array.isArray(e[t]))return`${t}: ${e[t][0]}`;if(typeof e[t]=="string")return`${t}: ${e[t]}`}if(e.slug)return e.slug}return"Unknown error"}_statusHandler(e){const t=/20[0-6]/g;return new Promise((o,s)=>{if(t.test(`${e.status}`))return o(e);const n={message:this._normalizeErrorMessage(e.data),status:e.status,response:e};s(n)})}}const J="SB-Agent",H={defaultAgentName:"SB-JS-CLIENT",defaultAgentVersion:"SB-Agent-Version",packageVersion:"7.0.0"},pe={PUBLISHED:"published"};let j={};const A={};class fe{constructor(e,t){g(this,"client"),g(this,"maxRetries"),g(this,"retriesDelay"),g(this,"throttle"),g(this,"accessToken"),g(this,"cache"),g(this,"resolveCounter"),g(this,"relations"),g(this,"links"),g(this,"version"),g(this,"richTextResolver"),g(this,"resolveNestedRelations"),g(this,"stringifiedStoriesCache"),g(this,"inlineAssets");let o=e.endpoint||t;if(!o){const l=e.https===!1?"http":"https";e.oauthToken?o=`${l}://${F(e.region)}/v1`:o=`${l}://${F(e.region)}/v2`}const s=new Headers;s.set("Content-Type","application/json"),s.set("Accept","application/json"),e.headers&&(e.headers.constructor.name==="Headers"?e.headers.entries().toArray():Object.entries(e.headers)).forEach(([l,c])=>{s.set(l,c)}),s.has(J)||(s.set(J,H.defaultAgentName),s.set(H.defaultAgentVersion,H.packageVersion));let n=5;e.oauthToken&&(s.set("Authorization",e.oauthToken),n=3),e.rateLimit&&(n=e.rateLimit),this.maxRetries=e.maxRetries||10,this.retriesDelay=300,this.throttle=ne(this.throttledRequest.bind(this),n,1e3),this.accessToken=e.accessToken||"",this.relations={},this.links={},this.cache=e.cache||{clear:"manual"},this.resolveCounter=0,this.resolveNestedRelations=e.resolveNestedRelations||!0,this.stringifiedStoriesCache={},this.version=e.version||pe.PUBLISHED,this.inlineAssets=e.inlineAssets||!1,this.client=new de({baseURL:o,timeout:e.timeout||0,headers:s,responseInterceptor:e.responseInterceptor,fetch:e.fetch})}parseParams(e){return e.token||(e.token=this.getToken()),e.cv||(e.cv=A[e.token]),Array.isArray(e.resolve_relations)&&(e.resolve_relations=e.resolve_relations.join(",")),typeof e.resolve_relations<"u"&&(e.resolve_level=2),e}factoryParamOptions(e,t){return q(e)?this.parseParams(t):t}makeRequest(e,t,o,s,n){const l=this.factoryParamOptions(e,ie(t,o,s));return this.cacheResponse(e,l,void 0,n)}get(e,t={},o){t||(t={});const s=`/${e}`;q(s)&&(t.version=t.version||this.version);const n=this.factoryParamOptions(s,t);return this.cacheResponse(s,n,void 0,o)}async getAll(e,t={},o,s){const n=(t==null?void 0:t.per_page)||25,l=`/${e}`.replace(/\/$/,""),c=o??l.substring(l.lastIndexOf("/")+1);t.version=t.version||this.version;const a=1,h=await this.makeRequest(l,t,n,a,s),d=h.total?Math.ceil(h.total/n):1,y=await he(ce(a,d),R=>this.makeRequest(l,t,n,R+1,s));return ue([h,...y],R=>Object.values(R.data[c]))}post(e,t={},o){const s=`/${e}`;return this.throttle("post",s,t,o)}put(e,t={},o){const s=`/${e}`;return this.throttle("put",s,t,o)}delete(e,t={},o){t||(t={});const s=`/${e}`;return this.throttle("delete",s,t,o)}getStories(e={},t){return this._addResolveLevel(e),this.get("cdn/stories",e,t)}getStory(e,t={},o){return this._addResolveLevel(t),this.get(`cdn/stories/${e}`,t,o)}getToken(){return this.accessToken}ejectInterceptor(){this.client.eject()}_addResolveLevel(e){typeof e.resolve_relations<"u"&&(e.resolve_level=2)}_cleanCopy(e){return JSON.parse(JSON.stringify(e))}_insertLinks(e,t,o){const s=e[t];s&&s.fieldtype==="multilink"&&s.linktype==="story"&&typeof s.id=="string"&&this.links[o][s.id]?s.story=this._cleanCopy(this.links[o][s.id]):s&&s.linktype==="story"&&typeof s.uuid=="string"&&this.links[o][s.uuid]&&(s.story=this._cleanCopy(this.links[o][s.uuid]))}getStoryReference(e,t){return this.relations[e][t]?JSON.parse(this.stringifiedStoriesCache[t]||JSON.stringify(this.relations[e][t])):t}_resolveField(e,t,o){const s=e[t];typeof s=="string"?e[t]=this.getStoryReference(o,s):Array.isArray(s)&&(e[t]=s.map(n=>this.getStoryReference(o,n)).filter(Boolean))}_insertRelations(e,t,o,s){if(Array.isArray(o)?o.find(l=>l.endsWith(`.${t}`)):o.endsWith(`.${t}`)){this._resolveField(e,t,s);return}const n=e.component?`${e.component}.${t}`:t;(Array.isArray(o)?o.includes(n):o===n)&&this._resolveField(e,t,s)}iterateTree(e,t,o){const s=(n,l="")=>{if(!(!n||n._stopResolving)){if(Array.isArray(n))n.forEach((c,a)=>s(c,`${l}[${a}]`));else if(typeof n=="object")for(const c in n){const a=l?`${l}.${c}`:c;(n.component&&n._uid||n.type==="link")&&(this._insertRelations(n,c,t,o),this._insertLinks(n,c,o)),s(n[c],a)}}};s(e.content)}async resolveLinks(e,t,o){let s=[];if(e.link_uuids){const n=e.link_uuids.length,l=[],c=50;for(let a=0;a<n;a+=c){const h=Math.min(n,a+c);l.push(e.link_uuids.slice(a,h))}for(let a=0;a<l.length;a++)(await this.getStories({per_page:c,language:t.language,version:t.version,starts_with:t.starts_with,by_uuids:l[a].join(",")})).data.stories.forEach(h=>{s.push(h)})}else s=e.links;s.forEach(n=>{this.links[o][n.uuid]={...n,_stopResolving:!0}})}async resolveRelations(e,t,o){let s=[];if(e.rel_uuids){const n=e.rel_uuids.length,l=[],c=50;for(let a=0;a<n;a+=c){const h=Math.min(n,a+c);l.push(e.rel_uuids.slice(a,h))}for(let a=0;a<l.length;a++)(await this.getStories({per_page:c,language:t.language,version:t.version,starts_with:t.starts_with,by_uuids:l[a].join(","),excluding_fields:t.excluding_fields})).data.stories.forEach(h=>{s.push(h)});s.length>0&&(e.rels=s,delete e.rel_uuids)}else s=e.rels;s&&s.length>0&&s.forEach(n=>{this.relations[o][n.uuid]={...n,_stopResolving:!0}})}async resolveStories(e,t,o){var s,n;let l=[];if(this.links[o]={},this.relations[o]={},typeof t.resolve_relations<"u"&&t.resolve_relations.length>0&&(typeof t.resolve_relations=="string"&&(l=t.resolve_relations.split(",")),await this.resolveRelations(e,t,o)),t.resolve_links&&["1","story","url","link"].includes(t.resolve_links)&&((s=e.links)!=null&&s.length||(n=e.link_uuids)!=null&&n.length)&&await this.resolveLinks(e,t,o),this.resolveNestedRelations)for(const c in this.relations[o])this.iterateTree(this.relations[o][c],l,o);e.story?this.iterateTree(e.story,l,o):e.stories.forEach(c=>{this.iterateTree(c,l,o)}),this.stringifiedStoriesCache={},delete this.links[o],delete this.relations[o]}async cacheResponse(e,t,o,s){const n=B({url:e,params:t}),l=this.cacheProvider();if(t.version==="published"&&e!=="/cdn/spaces/me"){const c=await l.get(n);if(c)return Promise.resolve(c)}return new Promise(async(c,a)=>{var h;try{const d=await this.throttle("get",e,t,s);if(d.status!==200)return a(d);let y={data:d.data,headers:d.headers};if((h=d.headers)!=null&&h["per-page"]&&(y=Object.assign({},y,{perPage:d.headers["per-page"]?Number.parseInt(d.headers["per-page"]):0,total:d.headers["per-page"]?Number.parseInt(d.headers.total):0})),y.data.story||y.data.stories){const $=this.resolveCounter=++this.resolveCounter%1e3;await this.resolveStories(y.data,t,`${$}`),y=await this.processInlineAssets(y)}t.version==="published"&&e!=="/cdn/spaces/me"&&await l.set(n,y);const R=this.cache.clear==="onpreview"&&t.version==="draft"||this.cache.clear==="auto";return t.token&&y.data.cv&&(R&&A[t.token]&&A[t.token]!==y.data.cv&&await this.flushCache(),A[t.token]=y.data.cv),c(y)}catch(d){if(d.response&&d.status===429&&(o=typeof o>"u"?0:o+1,o<this.maxRetries))return console.log(`Hit rate limit. Retrying in ${this.retriesDelay/1e3} seconds.`),await ae(this.retriesDelay),this.cacheResponse(e,t,o).then(c).catch(a);a(d)}})}throttledRequest(e,t,o,s){return this.client.setFetchOptions(s),this.client[e](t,o)}cacheVersions(){return A}cacheVersion(){return A[this.accessToken]}setCacheVersion(e){this.accessToken&&(A[this.accessToken]=e)}clearCacheVersion(){this.accessToken&&(A[this.accessToken]=0)}cacheProvider(){switch(this.cache.type){case"memory":return{get(e){return Promise.resolve(j[e])},getAll(){return Promise.resolve(j)},set(e,t){return j[e]=t,Promise.resolve(void 0)},flush(){return j={},Promise.resolve(void 0)}};case"custom":if(this.cache.custom)return this.cache.custom;default:return{get(){return Promise.resolve()},getAll(){return Promise.resolve(void 0)},set(){return Promise.resolve(void 0)},flush(){return Promise.resolve(void 0)}}}}async flushCache(){return await this.cacheProvider().flush(),this.clearCacheVersion(),this}async processInlineAssets(e){if(!this.inlineAssets)return e;const t=o=>{if(!o||typeof o!="object")return o;if(Array.isArray(o))return o.map(n=>t(n));let s={...o};s.fieldtype==="asset"&&Array.isArray(e.data.assets)&&(s={...s,...e.data.assets.find(n=>n.id===s.id)});for(const n in s)typeof s[n]=="object"&&(s[n]=t(s[n]));return s};return e.data.story&&(e.data.story.content=t(e.data.story.content)),e.data.stories&&(e.data.stories=e.data.stories.map(o=>(o.content=t(o.content),o))),e}}const ye=(r={})=>{const{apiOptions:e}=r;if(!e||!e.accessToken){console.error("You need to provide an access token to interact with Storyblok API. Read https://www.storyblok.com/docs/api/content-delivery#topics/authentication");return}return{storyblokApi:new fe(e)}},ge=r=>{if(typeof r!="object"||typeof r._editable>"u")return{};try{const e=JSON.parse(r._editable.replace(/^<!--#storyblok#/,"").replace(/-->$/,""));return e?{"data-blok-c":JSON.stringify(e),"data-blok-uid":`${e.id}-${e.uid}`}:{}}catch{return{}}};let x="https://app.storyblok.com/f/storyblok-v2-latest.js";const Y=(r,e,t={})=>{var c;const s=!(typeof window>"u")&&typeof window.storyblokRegisterEvent<"u",n=new URL((c=window.location)==null?void 0:c.href).searchParams.get("_storyblok"),l=n!==null&&+n===r;if(!(!s||!l)){if(!r){console.warn("Story ID is not defined. Please provide a valid ID.");return}window.storyblokRegisterEvent(()=>{new window.StoryblokBridge(t).on(["input","published","change"],h=>{var d;h&&(h.action==="input"&&((d=h.story)==null?void 0:d.id)===r?e(h.story):(h.action==="change"||h.action==="published")&&h.storyId===r&&window.location.reload())})})}},me=(r={})=>{var d,y;const{bridge:e,accessToken:t,use:o=[],apiOptions:s={},bridgeUrl:n}=r;s.accessToken=s.accessToken||t;const l={bridge:e,apiOptions:s};let c={};o.forEach(R=>{c={...c,...R(l)}}),n&&(x=n);const h=!(typeof window>"u")&&((y=(d=window.location)==null?void 0:d.search)==null?void 0:y.includes("_storyblok_tk"));return e!==!1&&h&&V(x),c};function be(r,e){return M(e).render(r)}const ve=()=>V(x);w.BlockTypes=b,w.MarkTypes=_,w.TextTypes=N,w.apiPlugin=ye,w.loadStoryblokBridge=ve,w.registerStoryblokBridge=Y,w.renderRichText=be,w.richTextResolver=M,w.storyblokEditable=ge,w.storyblokInit=me,w.useStoryblokBridge=Y,Object.defineProperty(w,Symbol.toStringTag,{value:"Module"})});
@@ -14,8 +14,8 @@ function re(r, e) {
14
14
  }
15
15
  if (typeof e == "object") {
16
16
  if (typeof e.width == "number" && e.width > 0 ? (s.width = e.width, t = e.width) : console.warn("[StoryblokRichText] - Width value must be a number greater than 0"), e.height && typeof e.height == "number" && e.height > 0 ? (s.height = e.height, o = e.height) : console.warn("[StoryblokRichText] - Height value must be a number greater than 0"), e.loading && ["lazy", "eager"].includes(e.loading) && (s.loading = e.loading), e.class && (s.class = e.class), e.filters) {
17
- const { filters: a } = e || {}, { blur: h, brightness: d, fill: y, format: T, grayscale: $, quality: A, rotate: I } = a || {};
18
- h && l(h, 0, 100, "blur", n), A && l(A, 0, 100, "quality", n), d && l(d, 0, 100, "brightness", n), y && n.push(`fill(${y})`), $ && n.push("grayscale()"), I && [0, 90, 180, 270].includes(e.filters.rotate || 0) && n.push(`rotate(${I})`), T && ["webp", "png", "jpeg"].includes(T) && n.push(`format(${T})`);
17
+ const { filters: a } = e || {}, { blur: h, brightness: d, fill: y, format: T, grayscale: _, quality: A, rotate: I } = a || {};
18
+ h && l(h, 0, 100, "blur", n), A && l(A, 0, 100, "quality", n), d && l(d, 0, 100, "brightness", n), y && n.push(`fill(${y})`), _ && n.push("grayscale()"), I && [0, 90, 180, 270].includes(e.filters.rotate || 0) && n.push(`rotate(${I})`), T && ["webp", "png", "jpeg"].includes(T) && n.push(`format(${T})`);
19
19
  }
20
20
  e.srcset && (s.srcset = e.srcset.map((a) => {
21
21
  if (typeof a == "number")
@@ -35,7 +35,7 @@ function re(r, e) {
35
35
  attrs: s
36
36
  };
37
37
  }
38
- var v = /* @__PURE__ */ ((r) => (r.DOCUMENT = "doc", r.HEADING = "heading", r.PARAGRAPH = "paragraph", r.QUOTE = "blockquote", r.OL_LIST = "ordered_list", r.UL_LIST = "bullet_list", r.LIST_ITEM = "list_item", r.CODE_BLOCK = "code_block", r.HR = "horizontal_rule", r.BR = "hard_break", r.IMAGE = "image", r.EMOJI = "emoji", r.COMPONENT = "blok", r.TABLE = "table", r.TABLE_ROW = "tableRow", r.TABLE_CELL = "tableCell", r.TABLE_HEADER = "tableHeader", r))(v || {}), _ = /* @__PURE__ */ ((r) => (r.BOLD = "bold", r.STRONG = "strong", r.STRIKE = "strike", r.UNDERLINE = "underline", r.ITALIC = "italic", r.CODE = "code", r.LINK = "link", r.ANCHOR = "anchor", r.STYLED = "styled", r.SUPERSCRIPT = "superscript", r.SUBSCRIPT = "subscript", r.TEXT_STYLE = "textStyle", r.HIGHLIGHT = "highlight", r))(_ || {}), F = /* @__PURE__ */ ((r) => (r.TEXT = "text", r))(F || {}), S = /* @__PURE__ */ ((r) => (r.URL = "url", r.STORY = "story", r.ASSET = "asset", r.EMAIL = "email", r))(S || {});
38
+ var v = /* @__PURE__ */ ((r) => (r.DOCUMENT = "doc", r.HEADING = "heading", r.PARAGRAPH = "paragraph", r.QUOTE = "blockquote", r.OL_LIST = "ordered_list", r.UL_LIST = "bullet_list", r.LIST_ITEM = "list_item", r.CODE_BLOCK = "code_block", r.HR = "horizontal_rule", r.BR = "hard_break", r.IMAGE = "image", r.EMOJI = "emoji", r.COMPONENT = "blok", r.TABLE = "table", r.TABLE_ROW = "tableRow", r.TABLE_CELL = "tableCell", r.TABLE_HEADER = "tableHeader", r))(v || {}), R = /* @__PURE__ */ ((r) => (r.BOLD = "bold", r.STRONG = "strong", r.STRIKE = "strike", r.UNDERLINE = "underline", r.ITALIC = "italic", r.CODE = "code", r.LINK = "link", r.ANCHOR = "anchor", r.STYLED = "styled", r.SUPERSCRIPT = "superscript", r.SUBSCRIPT = "subscript", r.TEXT_STYLE = "textStyle", r.HIGHLIGHT = "highlight", r))(R || {}), F = /* @__PURE__ */ ((r) => (r.TEXT = "text", r))(F || {}), S = /* @__PURE__ */ ((r) => (r.URL = "url", r.STORY = "story", r.ASSET = "asset", r.EMAIL = "email", r))(S || {});
39
39
  const oe = [
40
40
  "area",
41
41
  "base",
@@ -76,10 +76,10 @@ function le(r = {}) {
76
76
  return p.render(i, f, u.children || null);
77
77
  }, h = (i, u) => {
78
78
  const { src: p, alt: f, title: m, srcset: w, sizes: b } = i.attrs || {};
79
- let k = p, R = {};
79
+ let k = p, $ = {};
80
80
  if (n) {
81
81
  const { src: te, attrs: se } = re(p, n);
82
- k = te, R = se;
82
+ k = te, $ = se;
83
83
  }
84
84
  const ee = {
85
85
  src: k,
@@ -87,7 +87,7 @@ function le(r = {}) {
87
87
  title: m,
88
88
  srcset: w,
89
89
  sizes: b,
90
- ...R
90
+ ...$
91
91
  };
92
92
  return u.render("img", O(ee));
93
93
  }, d = (i, u) => {
@@ -111,13 +111,13 @@ function le(r = {}) {
111
111
  "pre",
112
112
  i.attrs || {},
113
113
  u.render("code", {}, i.children || "")
114
- ), $ = (i, u = !1) => ({ text: p, attrs: f }, m) => {
115
- const { class: w, id: b, ...k } = f || {}, R = u ? {
114
+ ), _ = (i, u = !1) => ({ text: p, attrs: f }, m) => {
115
+ const { class: w, id: b, ...k } = f || {}, $ = u ? {
116
116
  class: w,
117
117
  id: b,
118
118
  style: ie(k) || void 0
119
119
  } : f || {};
120
- return m.render(i, O(R), p);
120
+ return m.render(i, O($), p);
121
121
  }, A = (i) => C(i), I = (i) => {
122
122
  const { marks: u, ...p } = i;
123
123
  if ("text" in i) {
@@ -172,15 +172,15 @@ function le(r = {}) {
172
172
  ...b
173
173
  };
174
174
  p > 1 && (k.colspan = p), f > 1 && (k.rowspan = f);
175
- const R = [];
176
- return m && R.push(`width: ${m}px;`), w && R.push(`background-color: ${w};`), R.length > 0 && (k.style = R.join(" ")), u.render("td", O(k), i.children);
175
+ const $ = [];
176
+ return m && $.push(`width: ${m}px;`), w && $.push(`background-color: ${w};`), $.length > 0 && (k.style = $.join(" ")), u.render("td", O(k), i.children);
177
177
  }, Q = (i, u) => {
178
178
  const { colspan: p, rowspan: f, colwidth: m, backgroundColor: w, ...b } = i.attrs || {}, k = {
179
179
  ...b
180
180
  };
181
181
  p > 1 && (k.colspan = p), f > 1 && (k.rowspan = f);
182
- const R = [];
183
- return m && R.push(`width: ${m}px;`), w && R.push(`background-color: ${w};`), R.length > 0 && (k.style = R.join(" ")), u.render("th", O(k), i.children);
182
+ const $ = [];
183
+ return m && $.push(`width: ${m}px;`), w && $.push(`background-color: ${w};`), $.length > 0 && (k.style = $.join(" ")), u.render("th", O(k), i.children);
184
184
  }, B = /* @__PURE__ */ new Map([
185
185
  [v.DOCUMENT, a("")],
186
186
  [v.HEADING, d],
@@ -196,18 +196,18 @@ function le(r = {}) {
196
196
  [v.QUOTE, a("blockquote")],
197
197
  [v.COMPONENT, Y],
198
198
  [F.TEXT, I],
199
- [_.LINK, H],
200
- [_.ANCHOR, H],
201
- [_.STYLED, $("span", !0)],
202
- [_.BOLD, $("strong")],
203
- [_.TEXT_STYLE, $("span", !0)],
204
- [_.ITALIC, $("em")],
205
- [_.UNDERLINE, $("u")],
206
- [_.STRIKE, $("s")],
207
- [_.CODE, $("code")],
208
- [_.SUPERSCRIPT, $("sup")],
209
- [_.SUBSCRIPT, $("sub")],
210
- [_.HIGHLIGHT, $("mark")],
199
+ [R.LINK, H],
200
+ [R.ANCHOR, H],
201
+ [R.STYLED, _("span", !0)],
202
+ [R.BOLD, _("strong")],
203
+ [R.TEXT_STYLE, _("span", !0)],
204
+ [R.ITALIC, _("em")],
205
+ [R.UNDERLINE, _("u")],
206
+ [R.STRIKE, _("s")],
207
+ [R.CODE, _("code")],
208
+ [R.SUPERSCRIPT, _("sup")],
209
+ [R.SUBSCRIPT, _("sub")],
210
+ [R.HIGHLIGHT, _("mark")],
211
211
  [v.TABLE, K],
212
212
  [v.TABLE_ROW, W],
213
213
  [v.TABLE_CELL, X],
@@ -253,7 +253,7 @@ const z = [], J = (r) => new Promise((e, t) => {
253
253
  return;
254
254
  }
255
255
  if (window.storyblokRegisterEvent = (s) => {
256
- if (window.location === window.parent.location) {
256
+ if (!window.location.search.includes("_storyblok")) {
257
257
  console.warn("You are not in Draft Mode or in the Visual Editor.");
258
258
  return;
259
259
  }
@@ -734,8 +734,8 @@ class we {
734
734
  perPage: d.headers["per-page"] ? Number.parseInt(d.headers["per-page"]) : 0,
735
735
  total: d.headers["per-page"] ? Number.parseInt(d.headers.total) : 0
736
736
  })), y.data.story || y.data.stories) {
737
- const $ = this.resolveCounter = ++this.resolveCounter % 1e3;
738
- await this.resolveStories(y.data, t, `${$}`), y = await this.processInlineAssets(y);
737
+ const _ = this.resolveCounter = ++this.resolveCounter % 1e3;
738
+ await this.resolveStories(y.data, t, `${_}`), y = await this.processInlineAssets(y);
739
739
  }
740
740
  t.version === "published" && e !== "/cdn/spaces/me" && await l.set(n, y);
741
741
  const T = this.cache.clear === "onpreview" && t.version === "draft" || this.cache.clear === "auto";
@@ -834,7 +834,7 @@ const Te = (r = {}) => {
834
834
  return;
835
835
  }
836
836
  return { storyblokApi: new we(e) };
837
- }, $e = (r) => {
837
+ }, _e = (r) => {
838
838
  if (typeof r != "object" || typeof r._editable > "u")
839
839
  return {};
840
840
  try {
@@ -850,7 +850,7 @@ const Te = (r = {}) => {
850
850
  }
851
851
  };
852
852
  let x = "https://app.storyblok.com/f/storyblok-v2-latest.js";
853
- const Re = (r, e, t = {}) => {
853
+ const $e = (r, e, t = {}) => {
854
854
  var c;
855
855
  const s = !(typeof window > "u") && typeof window.storyblokRegisterEvent < "u", n = new URL((c = window.location) == null ? void 0 : c.href).searchParams.get(
856
856
  "_storyblok"
@@ -867,7 +867,7 @@ const Re = (r, e, t = {}) => {
867
867
  });
868
868
  });
869
869
  }
870
- }, _e = (r = {}) => {
870
+ }, Re = (r = {}) => {
871
871
  var d, y;
872
872
  const {
873
873
  bridge: e,
@@ -891,14 +891,14 @@ function Ee(r, e) {
891
891
  const Ae = () => J(x);
892
892
  export {
893
893
  v as BlockTypes,
894
- _ as MarkTypes,
894
+ R as MarkTypes,
895
895
  F as TextTypes,
896
896
  Te as apiPlugin,
897
897
  Ae as loadStoryblokBridge,
898
- Re as registerStoryblokBridge,
898
+ $e as registerStoryblokBridge,
899
899
  Ee as renderRichText,
900
900
  le as richTextResolver,
901
- $e as storyblokEditable,
902
- _e as storyblokInit,
903
- Re as useStoryblokBridge
901
+ _e as storyblokEditable,
902
+ Re as storyblokInit,
903
+ $e as useStoryblokBridge
904
904
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@storyblok/js",
3
3
  "type": "module",
4
- "version": "4.1.1",
4
+ "version": "4.1.2",
5
5
  "private": false,
6
6
  "description": "SDK to integrate Storyblok into your project using JavaScript.",
7
7
  "license": "MIT",
@@ -32,7 +32,6 @@
32
32
  "storyblok-js-client": "7.0.2"
33
33
  },
34
34
  "devDependencies": {
35
- "@storyblok/eslint-config": "^0.3.0",
36
35
  "@tsconfig/recommended": "^1.0.8",
37
36
  "@types/node": "^22.15.18",
38
37
  "@vitest/ui": "^3.1.3",
@@ -48,7 +47,8 @@
48
47
  "vite-plugin-banner": "^0.8.0",
49
48
  "vite-plugin-dts": "^4.5.3",
50
49
  "vite-plugin-qrcode": "^0.2.4",
51
- "vitest": "^3.1.3"
50
+ "vitest": "^3.1.3",
51
+ "@storyblok/eslint-config": "0.3.0"
52
52
  },
53
53
  "release": {
54
54
  "branches": [