@framerauth/sdk 2.0.2-b → 2.0.3-b

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.
@@ -1 +1 @@
1
- "use strict";(()=>{var be=Object.defineProperty,ve=Object.defineProperties,Re=Object.getOwnPropertyDescriptors,z=Object.getOwnPropertySymbols,we=Object.prototype.hasOwnProperty,Pe=Object.prototype.propertyIsEnumerable,I=(t,e,r)=>e in t?be(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,L=(t,e)=>{for(var r in e||(e={}))we.call(e,r)&&I(t,r,e[r]);if(z)for(var r of z(e))Pe.call(e,r)&&I(t,r,e[r]);return t},E=(t,e)=>ve(t,Re(e)),Se=class extends Error{constructor(t,e,r){super(e||t.toString(),{cause:r}),this.status=t,this.statusText=e,this.error=r}},ke=async(t,e)=>{var r,o,s,n,a,g;let p=e||{},i={onRequest:[e?.onRequest],onResponse:[e?.onResponse],onSuccess:[e?.onSuccess],onError:[e?.onError],onRetry:[e?.onRetry]};if(!e||!e?.plugins)return{url:t,options:p,hooks:i};for(let u of e?.plugins||[]){if(u.init){let b=await((r=u.init)==null?void 0:r.call(u,t.toString(),e));p=b.options||p,t=b.url}i.onRequest.push((o=u.hooks)==null?void 0:o.onRequest),i.onResponse.push((s=u.hooks)==null?void 0:s.onResponse),i.onSuccess.push((n=u.hooks)==null?void 0:n.onSuccess),i.onError.push((a=u.hooks)==null?void 0:a.onError),i.onRetry.push((g=u.hooks)==null?void 0:g.onRetry)}return{url:t,options:p,hooks:i}},H=class{constructor(t){this.options=t}shouldAttemptRetry(t,e){return this.options.shouldRetry?Promise.resolve(t<this.options.attempts&&this.options.shouldRetry(e)):Promise.resolve(t<this.options.attempts)}getDelay(){return this.options.delay}},Le=class{constructor(t){this.options=t}shouldAttemptRetry(t,e){return this.options.shouldRetry?Promise.resolve(t<this.options.attempts&&this.options.shouldRetry(e)):Promise.resolve(t<this.options.attempts)}getDelay(t){return Math.min(this.options.maxDelay,this.options.baseDelay*2**t)}};function Ee(t){if(typeof t=="number")return new H({type:"linear",attempts:t,delay:1e3});switch(t.type){case"linear":return new H(t);case"exponential":return new Le(t);default:throw new Error("Invalid retry strategy")}}var Te=async t=>{let e={},r=async o=>typeof o=="function"?await o():o;if(t?.auth){if(t.auth.type==="Bearer"){let o=await r(t.auth.token);if(!o)return e;e.authorization=`Bearer ${o}`}else if(t.auth.type==="Basic"){let o=r(t.auth.username),s=r(t.auth.password);if(!o||!s)return e;e.authorization=`Basic ${btoa(`${o}:${s}`)}`}else if(t.auth.type==="Custom"){let o=r(t.auth.value);if(!o)return e;e.authorization=`${r(t.auth.prefix)} ${o}`}}return e},Ue=/^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i;function Ae(t){let e=t.headers.get("content-type"),r=new Set(["image/svg","application/xml","application/xhtml","application/html"]);if(!e)return"json";let o=e.split(";").shift()||"";return Ue.test(o)?"json":r.has(o)||o.startsWith("text/")?"text":"blob"}function Oe(t){try{return JSON.parse(t),!0}catch{return!1}}function K(t){if(t===void 0)return!1;let e=typeof t;return e==="string"||e==="number"||e==="boolean"||e===null?!0:e!=="object"?!1:Array.isArray(t)?!0:t.buffer?!1:t.constructor&&t.constructor.name==="Object"||typeof t.toJSON=="function"}function q(t){try{return JSON.parse(t)}catch{return t}}function J(t){return typeof t=="function"}function xe(t){if(t?.customFetchImpl)return t.customFetchImpl;if(typeof globalThis<"u"&&J(globalThis.fetch))return globalThis.fetch;if(typeof window<"u"&&J(window.fetch))return window.fetch;throw new Error("No fetch implementation found")}async function De(t){let e=new Headers(t?.headers),r=await Te(t);for(let[o,s]of Object.entries(r||{}))e.set(o,s);if(!e.has("content-type")){let o=_e(t?.body);o&&e.set("content-type",o)}return e}function _e(t){return K(t)?"application/json":null}function Ce(t){if(!t?.body)return null;let e=new Headers(t?.headers);if(K(t.body)&&!e.has("content-type")){for(let[r,o]of Object.entries(t?.body))o instanceof Date&&(t.body[r]=o.toISOString());return JSON.stringify(t.body)}return t.body}function Be(t,e){var r;if(e?.method)return e.method.toUpperCase();if(t.startsWith("@")){let o=(r=t.split("@")[1])==null?void 0:r.split("/")[0];return V.includes(o)?o.toUpperCase():e?.body?"POST":"GET"}return e?.body?"POST":"GET"}function Ne(t,e){let r;return!t?.signal&&t?.timeout&&(r=setTimeout(()=>e?.abort(),t?.timeout)),{abortTimeout:r,clearTimeout:()=>{r&&clearTimeout(r)}}}var je=class G extends Error{constructor(e,r){super(r||JSON.stringify(e,null,2)),this.issues=e,Object.setPrototypeOf(this,G.prototype)}};async function Fe(t,e){let r=await t["~standard"].validate(e);if(r.issues)throw new je(r.issues);return r.value}var V=["get","post","put","patch","delete"];function $e(t,e){let{baseURL:r,params:o,query:s}=e||{query:{},params:{},baseURL:""},n=t.startsWith("http")?t.split("/").slice(0,3).join("/"):r||"";if(t.startsWith("@")){let b=t.toString().split("@")[1].split("/")[0];V.includes(b)&&(t=t.replace(`@${b}/`,"/"))}n.endsWith("/")||(n+="/");let[a,g]=t.replace(n,"").split("?"),p=new URLSearchParams(g);for(let[b,f]of Object.entries(s||{}))f!=null&&p.set(b,String(f));if(o)if(Array.isArray(o)){let b=a.split("/").filter(f=>f.startsWith(":"));for(let[f,N]of b.entries()){let U=o[f];a=a.replace(N,U)}}else for(let[b,f]of Object.entries(o))a=a.replace(`:${b}`,String(f));a=a.split("/").map(encodeURIComponent).join("/"),a.startsWith("/")&&(a=a.slice(1));let i=p.toString();return i=i.length>0?`?${i}`.replace(/\+/g,"%20"):"",n.startsWith("http")?new URL(`${a}${i}`,n):`${n}${a}${i}`}var c=async(t,e)=>{var r,o,s,n,a,g,p,i;let{hooks:u,url:b,options:f}=await ke(t,e),N=xe(f),U=new AbortController,ce=(r=f.signal)!=null?r:U.signal,ue=$e(b,f),de=Ce(f),fe=await De(f),he=Be(b,f),d=E(L({},f),{url:ue,headers:fe,body:de,method:he,signal:ce});for(let v of u.onRequest)if(v){let y=await v(d);y instanceof Object&&(d=y)}("pipeTo"in d&&typeof d.pipeTo=="function"||typeof((o=e?.body)==null?void 0:o.pipe)=="function")&&("duplex"in d||(d.duplex="half"));let{clearTimeout:pe}=Ne(f,U),l=await N(d.url,d);pe();let W={response:l,request:d};for(let v of u.onResponse)if(v){let y=await v(E(L({},W),{response:(s=e?.hookOptions)!=null&&s.cloneResponse?l.clone():l}));y instanceof Response?l=y:y instanceof Object&&(l=y.response)}if(l.ok){if(!(d.method!=="HEAD"))return{data:"",error:null};let y=Ae(l),P={data:"",response:l,request:d};if(y==="json"||y==="text"){let S=await l.text(),ye=await((n=d.jsonParser)!=null?n:q)(S);P.data=ye}else P.data=await l[y]();d?.output&&d.output&&!d.disableValidation&&(P.data=await Fe(d.output,P.data));for(let S of u.onSuccess)S&&await S(E(L({},P),{response:(a=e?.hookOptions)!=null&&a.cloneResponse?l.clone():l}));return e?.throw?P.data:{data:P.data,error:null}}let me=(g=e?.jsonParser)!=null?g:q,A=await l.text(),M=Oe(A),j=M?await me(A):null,ge={response:l,responseText:A,request:d,error:E(L({},j),{status:l.status,statusText:l.statusText})};for(let v of u.onError)v&&await v(E(L({},ge),{response:(p=e?.hookOptions)!=null&&p.cloneResponse?l.clone():l}));if(e?.retry){let v=Ee(e.retry),y=(i=e.retryAttempt)!=null?i:0;if(await v.shouldAttemptRetry(y,l)){for(let S of u.onRetry)S&&await S(W);let P=v.getDelay(y);return await new Promise(S=>setTimeout(S,P)),await c(t,E(L({},e),{retryAttempt:y+1}))}}if(e?.throw)throw new Se(l.status,l.statusText,M?j:A);return{data:null,error:E(L({},j),{status:l.status,statusText:l.statusText})}};var O=class{baseURL=null;data;state;api;auth;constructor(e){this.baseURL=null,this.data=e.data,this.state=e.state,this.api={fetchTags:async()=>{if(!this.baseURL)throw new Error("Auth client not initialized");return await c(`${this.baseURL}/profile/tags`,{credentials:"include"})},fetchBookmarks:async()=>{if(!this.baseURL)throw new Error("Auth client not initialized");let r=await c(`${this.baseURL}/profile/bookmarks`,{credentials:"include"});if(!r.data)return r;let o=new Set(r.data),s={};for(let n of o)s[n]=!0;return{data:s,error:null}},fetchProject:async()=>await c("https://core.framerauth.com/v2/public/project/config")},this.auth={getSession:async()=>{if(!this.baseURL)throw new Error("Auth client not initialized");let r=await c(`${this.baseURL}/get-session`,{method:"GET",credentials:"include",query:{disableCookieCache:!0}});return r.data&&(this.data.user.set(r.data.user),this.data.session.set(r.data.session)),r},signUp:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=await c(`${this.baseURL}/sign-up/email`,{method:"POST",credentials:"include",body:r});return o.data&&(setTimeout(()=>this.auth.getSession(),10),this.api.fetchTags().then(s=>{this.data.tags.set(s.data??[])})),o},signIn:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=await c(`${this.baseURL}/sign-in/email`,{method:"POST",credentials:"include",body:r});return o.data&&(setTimeout(()=>this.auth.getSession(),10),this.api.fetchTags().then(s=>{this.data.tags.set(s.data??[])}),this.api.fetchBookmarks().then(s=>{this.data.bookmarks.set(s.data??{})})),o},signInSocial:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=r.provider||"social",s=await c(`${this.baseURL}/sign-in/${o}`,{method:"POST",credentials:"include",body:r});return s.data?.url&&(window.location.href=s.data.url),s},signOut:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=await c(`${this.baseURL}/sign-out`,{method:"POST",credentials:"include",body:{}});return this.data.user.set(null),this.data.session.set(null),this.data.tags.set([]),this.data.bookmarks.set({}),r?.redirectTo&&(window.location.href=r.redirectTo),o},sendOTP:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/email-otp/send-verification-otp`;return await c(o,{body:r,credentials:"include",method:"POST"})},signInOTP:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/sign-in/email-otp`,s=await c(o,{body:r,credentials:"include",method:"POST"});return s.error||(this.data.user.set(s.data.user),this.auth.getSession()),s},updateProfile:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/profile`;return await c(o,{body:r,credentials:"include",method:"PATCH"})},updateProfilePicture:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/profile/avatar`;return await c(o,{method:"POST",body:r,credentials:"include"})},createBookmark:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/profile/bookmarks`;return await c(o,{body:r,credentials:"include",method:"POST"})},deleteBookmark:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/profile/bookmarks/${r.bookmark_type}/${r.id}`;return await c(o,{credentials:"include",method:"DELETE"})},sendForgotPasswordEmail:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/forget-password`;return await c(o,{body:r,credentials:"include",method:"POST"})},resetPassword:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/reset-password`;return await c(o,{body:r,credentials:"include",method:"POST"})},storeCheckout:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/store/checkout/session`;return await c(o,{body:r,credentials:"include",method:"POST"})}}}updateBaseURL(e){this.baseURL=e}};var R=[],k=0,x=4,We=0,h=t=>{let e=[],r={get(){return r.lc||r.listen(()=>{})(),r.value},lc:0,listen(o){return r.lc=e.push(o),()=>{for(let n=k+x;n<R.length;)R[n]===o?R.splice(n,x):n+=x;let s=e.indexOf(o);~s&&(e.splice(s,1),--r.lc||r.off())}},notify(o,s){We++;let n=!R.length;for(let a of e)R.push(a,r.value,o,s);if(n){for(k=0;k<R.length;k+=x)R[k](R[k+1],R[k+2],R[k+3]);R.length=0}},off(){},set(o){let s=r.value;s!==o&&(r.value=o,r.notify(s))},subscribe(o){let s=r.listen(o);return o(r.value),s},value:t};return r};var Me=5,D=6,_=10,ze=(t,e,r,o)=>(t.events=t.events||{},t.events[r+_]||(t.events[r+_]=o(s=>{t.events[r].reduceRight((n,a)=>(a(n),n),{shared:{},...s})})),t.events[r]=t.events[r]||[],t.events[r].push(e),()=>{let s=t.events[r],n=s.indexOf(e);s.splice(n,1),s.length||(delete t.events[r],t.events[r+_](),delete t.events[r+_])});var Q=1e3,F=(t,e)=>ze(t,o=>{let s=e(o);s&&t.events[D].push(s)},Me,o=>{let s=t.listen;t.listen=(...a)=>(!t.lc&&!t.active&&(t.active=!0,o()),s(...a));let n=t.off;return t.events[D]=[],t.off=()=>{n(),setTimeout(()=>{if(t.active&&!t.lc){t.active=!1;for(let a of t.events[D])a();t.events[D]=[]}},Q)},()=>{t.listen=s,t.off=n}});var C=(t={})=>{let e=h(t);return e.setKey=function(r,o){let s=e.value;typeof o>"u"&&r in e.value?(e.value={...e.value},delete e.value[r],e.notify(s,r)):e.value[r]!==o&&(e.value={...e.value,[r]:o},e.notify(s,r))},e};var Y=t=>t,T={},$={addEventListener(){},removeEventListener(){}};function Ie(){try{return typeof localStorage<"u"}catch{return!1}}Ie()&&(T=localStorage);var He={addEventListener(t,e,r){window.addEventListener("storage",e),window.addEventListener("pageshow",r)},removeEventListener(t,e,r){window.removeEventListener("storage",e),window.removeEventListener("pageshow",r)}};typeof window<"u"&&($=He);function w(t,e=void 0,r={}){let o=r.encode||Y,s=r.decode||Y,n=h(e),a=n.set;n.set=i=>{let u=o(i);typeof u>"u"?delete T[t]:T[t]=u,a(i)};function g(i){i.key===t?i.newValue===null?a(e):a(s(i.newValue)):T[t]||a(e)}function p(){n.set(T[t]?s(T[t]):e)}return F(n,()=>{if(p(),r.listen!==!1)return $.addEventListener(t,g,p),()=>{$.removeEventListener(t,g,p)}}),n}var X=w("fa-project",null,{encode:JSON.stringify,decode:JSON.parse}),Z=h(!1);var ee=w("fa-tags",[],{encode:JSON.stringify,decode:JSON.parse}),te=h(!1);var re=w("fa-user",null,{encode:JSON.stringify,decode:JSON.parse}),oe=h(!1);var se=w("fa-session",null,{encode:JSON.stringify,decode:JSON.parse}),ne=h(!1);var ae=h(!0);var B=class{hasAccess;errorUrl;onError;observer=null;currentCanonical;originalPushState;originalReplaceState;isMonkeyPatched=!1;constructor(e,r,o){this.hasAccess=e,this.errorUrl=r,this.onError=o,this.currentCanonical=this.getCurrentCanonical(),this.originalPushState=history.pushState.bind(history),this.originalReplaceState=history.replaceState.bind(history)}getCurrentCanonical(){return document.querySelector('link[rel="canonical"]')?.href??null}hideBody(){console.log("[Router] Hiding body"),document.body.style.visibility="hidden"}showBody(){console.log("[Router] Showing body"),document.body.style.visibility="visible"}normalizeToPath(e){if(e instanceof URL)return e.pathname;if(e.startsWith("./"))return e.slice(1);if(e.startsWith("/"))return e;try{return new URL(e).pathname}catch{return e.startsWith("/")?e:"/"+e}}async checkAccess(e){console.log("[Router] Checking access for path:",e);try{return await this.hasAccess(e)}catch(r){return console.error("[Router] Error checking access:",r),!1}}redirectToError(){console.log("[Router] Access denied, redirecting to:",this.errorUrl),window.location.replace(this.errorUrl)}handleAccessDenied(e){e&&this.onError&&this.onError(new Error(String(e))),this.redirectToError()}monkeyPatchHistory(){if(this.isMonkeyPatched)return;let e=this;history.pushState=async function(r,o,s){if(s){let n=e.normalizeToPath(s);console.log("[Router] Push state to path:",n);let a=await e.checkAccess(n);console.log("[Router] [push state] Has access:",a),a||(console.warn("Access denied to:",n),e.hideBody())}return e.originalPushState.call(this,r,o,s)},history.replaceState=async function(r,o,s){if(s){let n=e.normalizeToPath(s);console.log("[Router] Replace state with path:",n);let a=await e.checkAccess(n);console.log("[Router] [replace state] Has access:",a),a||(console.warn("Access denied to:",n),e.hideBody())}return e.originalReplaceState.call(this,r,o,s)},this.isMonkeyPatched=!0}restoreHistory(){this.isMonkeyPatched&&(history.pushState=this.originalPushState,history.replaceState=this.originalReplaceState,this.isMonkeyPatched=!1)}start(){console.log("[Router] Starting router"),this.stop(),this.observer=new MutationObserver(e=>{this.handleMutations(e)}),this.observer.observe(document.head,{childList:!0,attributes:!0,attributeFilter:["rel","href"],subtree:!0}),this.monkeyPatchHistory(),console.log("[Router] Router started")}stop(){console.log("[Router] Stopping router"),this.observer&&(this.observer.disconnect(),this.observer=null,console.log("[Router] Router stopped")),this.restoreHistory(),this.showBody()}handleMutations(e){let r=!1;for(let o of e){if(o.type==="childList"){let s=[...Array.from(o.addedNodes),...Array.from(o.removedNodes)];for(let n of s)if(n.nodeType===Node.ELEMENT_NODE){let a=n;if(this.isCanonicalLink(a)){r=!0;break}}}else if(o.type==="attributes"){let s=o.target;(this.isCanonicalLink(s)||o.oldValue==="canonical")&&(r=!0)}if(r)break}r&&this.checkCanonicalChange().catch(o=>{console.error("Error checking canonical change:",o),this.showBody()})}isCanonicalLink(e){return e.tagName==="LINK"&&e.getAttribute("rel")==="canonical"}async checkCanonicalChange(){let e=this.getCurrentCanonical();if(e!==this.currentCanonical)if(this.currentCanonical=e,e){let r=this.normalizeToPath(e);try{if(!await this.checkAccess(r)){console.warn("Access denied to canonical URL:",r),this.redirectToError();return}console.log("[Router] Access granted for:",r),this.showBody()}catch(o){this.handleAccessDenied(o instanceof Error?o:new Error(String(o)))}}else this.showBody()}};var ie=w("fa-bookmarks",C(),{encode:JSON.stringify,decode:JSON.parse}),le=h(!1);var m=new O({data:{user:re,project:X,tags:ee,bookmarks:ie,session:se},state:{initializing:ae,userLoading:oe,projectLoading:Z,tagsLoading:te,bookmarksLoading:le,sessionLoading:ne}});window.FramerAuth=m;var qe=async()=>{m.state.initializing.set(!0);try{let{data:t,error:e}=await m.api.fetchProject();if(e||!t)throw new Error(`Failed to fetch project: ${e?.message||"Project data is null"}`);m.data.project.set(t);let r=`https://${t.slug}.framerauth.io/v2`;m.updateBaseURL(r);let{data:o,error:s}=await m.auth.getSession();if(!s&&o!==null){let{user:n,session:a}=o;if(m.data.user.set(n),m.data.session.set(a),n)try{let[g,p]=await Promise.all([m.api.fetchTags(),m.api.fetchBookmarks()]);m.data.tags.set(g.data??[]),m.data.bookmarks.set(p.data??{})}catch(g){console.warn("Failed to fetch tags or bookmarks:",g),m.data.tags.set([]),m.data.bookmarks.set({})}}return window.dispatchEvent(new CustomEvent("framerauth:initialized")),m}catch(t){throw console.error("Failed to initialize FramerAuth:",t),window.dispatchEvent(new CustomEvent("framerauth:initialization-failed",{detail:{error:t}})),t}finally{m.state.initializing.set(!1)}},Je=async()=>{try{let t=await qe();new B(async r=>(console.log("[Router] [Callback] Checking access for:",r),!(!t.data.user.get()&&(r==="/locked"||r==="/blog/diversify-then-focus"))),"/sign-in",r=>{console.error("[Router] Error in router:",r)}).start()}catch(t){console.error("Failed to initialize app:",t)}};Je();})();
1
+ "use strict";(()=>{var Pe=Object.defineProperty,Se=Object.defineProperties,ke=Object.getOwnPropertyDescriptors,H=Object.getOwnPropertySymbols,Ee=Object.prototype.hasOwnProperty,Le=Object.prototype.propertyIsEnumerable,q=(t,e,r)=>e in t?Pe(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,T=(t,e)=>{for(var r in e||(e={}))Ee.call(e,r)&&q(t,r,e[r]);if(H)for(var r of H(e))Le.call(e,r)&&q(t,r,e[r]);return t},U=(t,e)=>Se(t,ke(e)),Te=class extends Error{constructor(t,e,r){super(e||t.toString(),{cause:r}),this.status=t,this.statusText=e,this.error=r}},Ue=async(t,e)=>{var r,o,s,a,n,g;let p=e||{},i={onRequest:[e?.onRequest],onResponse:[e?.onResponse],onSuccess:[e?.onSuccess],onError:[e?.onError],onRetry:[e?.onRetry]};if(!e||!e?.plugins)return{url:t,options:p,hooks:i};for(let u of e?.plugins||[]){if(u.init){let b=await((r=u.init)==null?void 0:r.call(u,t.toString(),e));p=b.options||p,t=b.url}i.onRequest.push((o=u.hooks)==null?void 0:o.onRequest),i.onResponse.push((s=u.hooks)==null?void 0:s.onResponse),i.onSuccess.push((a=u.hooks)==null?void 0:a.onSuccess),i.onError.push((n=u.hooks)==null?void 0:n.onError),i.onRetry.push((g=u.hooks)==null?void 0:g.onRetry)}return{url:t,options:p,hooks:i}},J=class{constructor(t){this.options=t}shouldAttemptRetry(t,e){return this.options.shouldRetry?Promise.resolve(t<this.options.attempts&&this.options.shouldRetry(e)):Promise.resolve(t<this.options.attempts)}getDelay(){return this.options.delay}},Ae=class{constructor(t){this.options=t}shouldAttemptRetry(t,e){return this.options.shouldRetry?Promise.resolve(t<this.options.attempts&&this.options.shouldRetry(e)):Promise.resolve(t<this.options.attempts)}getDelay(t){return Math.min(this.options.maxDelay,this.options.baseDelay*2**t)}};function Oe(t){if(typeof t=="number")return new J({type:"linear",attempts:t,delay:1e3});switch(t.type){case"linear":return new J(t);case"exponential":return new Ae(t);default:throw new Error("Invalid retry strategy")}}var xe=async t=>{let e={},r=async o=>typeof o=="function"?await o():o;if(t?.auth){if(t.auth.type==="Bearer"){let o=await r(t.auth.token);if(!o)return e;e.authorization=`Bearer ${o}`}else if(t.auth.type==="Basic"){let o=r(t.auth.username),s=r(t.auth.password);if(!o||!s)return e;e.authorization=`Basic ${btoa(`${o}:${s}`)}`}else if(t.auth.type==="Custom"){let o=r(t.auth.value);if(!o)return e;e.authorization=`${r(t.auth.prefix)} ${o}`}}return e},De=/^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i;function Ce(t){let e=t.headers.get("content-type"),r=new Set(["image/svg","application/xml","application/xhtml","application/html"]);if(!e)return"json";let o=e.split(";").shift()||"";return De.test(o)?"json":r.has(o)||o.startsWith("text/")?"text":"blob"}function _e(t){try{return JSON.parse(t),!0}catch{return!1}}function V(t){if(t===void 0)return!1;let e=typeof t;return e==="string"||e==="number"||e==="boolean"||e===null?!0:e!=="object"?!1:Array.isArray(t)?!0:t.buffer?!1:t.constructor&&t.constructor.name==="Object"||typeof t.toJSON=="function"}function K(t){try{return JSON.parse(t)}catch{return t}}function G(t){return typeof t=="function"}function Be(t){if(t?.customFetchImpl)return t.customFetchImpl;if(typeof globalThis<"u"&&G(globalThis.fetch))return globalThis.fetch;if(typeof window<"u"&&G(window.fetch))return window.fetch;throw new Error("No fetch implementation found")}async function je(t){let e=new Headers(t?.headers),r=await xe(t);for(let[o,s]of Object.entries(r||{}))e.set(o,s);if(!e.has("content-type")){let o=Fe(t?.body);o&&e.set("content-type",o)}return e}function Fe(t){return V(t)?"application/json":null}function Ne(t){if(!t?.body)return null;let e=new Headers(t?.headers);if(V(t.body)&&!e.has("content-type")){for(let[r,o]of Object.entries(t?.body))o instanceof Date&&(t.body[r]=o.toISOString());return JSON.stringify(t.body)}return t.body}function We(t,e){var r;if(e?.method)return e.method.toUpperCase();if(t.startsWith("@")){let o=(r=t.split("@")[1])==null?void 0:r.split("/")[0];return Y.includes(o)?o.toUpperCase():e?.body?"POST":"GET"}return e?.body?"POST":"GET"}function $e(t,e){let r;return!t?.signal&&t?.timeout&&(r=setTimeout(()=>e?.abort(),t?.timeout)),{abortTimeout:r,clearTimeout:()=>{r&&clearTimeout(r)}}}var Me=class Q extends Error{constructor(e,r){super(r||JSON.stringify(e,null,2)),this.issues=e,Object.setPrototypeOf(this,Q.prototype)}};async function ze(t,e){let r=await t["~standard"].validate(e);if(r.issues)throw new Me(r.issues);return r.value}var Y=["get","post","put","patch","delete"];function Ie(t,e){let{baseURL:r,params:o,query:s}=e||{query:{},params:{},baseURL:""},a=t.startsWith("http")?t.split("/").slice(0,3).join("/"):r||"";if(t.startsWith("@")){let b=t.toString().split("@")[1].split("/")[0];Y.includes(b)&&(t=t.replace(`@${b}/`,"/"))}a.endsWith("/")||(a+="/");let[n,g]=t.replace(a,"").split("?"),p=new URLSearchParams(g);for(let[b,f]of Object.entries(s||{}))f!=null&&p.set(b,String(f));if(o)if(Array.isArray(o)){let b=n.split("/").filter(f=>f.startsWith(":"));for(let[f,N]of b.entries()){let O=o[f];n=n.replace(N,O)}}else for(let[b,f]of Object.entries(o))n=n.replace(`:${b}`,String(f));n=n.split("/").map(encodeURIComponent).join("/"),n.startsWith("/")&&(n=n.slice(1));let i=p.toString();return i=i.length>0?`?${i}`.replace(/\+/g,"%20"):"",a.startsWith("http")?new URL(`${n}${i}`,a):`${a}${n}${i}`}var c=async(t,e)=>{var r,o,s,a,n,g,p,i;let{hooks:u,url:b,options:f}=await Ue(t,e),N=Be(f),O=new AbortController,he=(r=f.signal)!=null?r:O.signal,pe=Ie(b,f),me=Ne(f),ge=await je(f),ye=We(b,f),d=U(T({},f),{url:pe,headers:ge,body:me,method:ye,signal:he});for(let v of u.onRequest)if(v){let y=await v(d);y instanceof Object&&(d=y)}("pipeTo"in d&&typeof d.pipeTo=="function"||typeof((o=e?.body)==null?void 0:o.pipe)=="function")&&("duplex"in d||(d.duplex="half"));let{clearTimeout:be}=$e(f,O),l=await N(d.url,d);be();let z={response:l,request:d};for(let v of u.onResponse)if(v){let y=await v(U(T({},z),{response:(s=e?.hookOptions)!=null&&s.cloneResponse?l.clone():l}));y instanceof Response?l=y:y instanceof Object&&(l=y.response)}if(l.ok){if(!(d.method!=="HEAD"))return{data:"",error:null};let y=Ce(l),k={data:"",response:l,request:d};if(y==="json"||y==="text"){let E=await l.text(),we=await((a=d.jsonParser)!=null?a:K)(E);k.data=we}else k.data=await l[y]();d?.output&&d.output&&!d.disableValidation&&(k.data=await ze(d.output,k.data));for(let E of u.onSuccess)E&&await E(U(T({},k),{response:(n=e?.hookOptions)!=null&&n.cloneResponse?l.clone():l}));return e?.throw?k.data:{data:k.data,error:null}}let ve=(g=e?.jsonParser)!=null?g:K,x=await l.text(),I=_e(x),W=I?await ve(x):null,Re={response:l,responseText:x,request:d,error:U(T({},W),{status:l.status,statusText:l.statusText})};for(let v of u.onError)v&&await v(U(T({},Re),{response:(p=e?.hookOptions)!=null&&p.cloneResponse?l.clone():l}));if(e?.retry){let v=Oe(e.retry),y=(i=e.retryAttempt)!=null?i:0;if(await v.shouldAttemptRetry(y,l)){for(let E of u.onRetry)E&&await E(z);let k=v.getDelay(y);return await new Promise(E=>setTimeout(E,k)),await c(t,U(T({},e),{retryAttempt:y+1}))}}if(e?.throw)throw new Te(l.status,l.statusText,I?W:x);return{data:null,error:U(T({},W),{status:l.status,statusText:l.statusText})}};var D=class{baseURL=null;data;state;api;auth;constructor(e){this.baseURL=null,this.data=e.data,this.state=e.state,this.api={fetchTags:async()=>{if(!this.baseURL)throw new Error("Auth client not initialized");return await c(`${this.baseURL}/profile/tags`,{credentials:"include"})},fetchBookmarks:async()=>{if(!this.baseURL)throw new Error("Auth client not initialized");let r=await c(`${this.baseURL}/profile/bookmarks`,{credentials:"include"});if(!r.data)return r;let o=new Set(r.data),s={};for(let a of o)s[a]=!0;return{data:s,error:null}},fetchProject:async()=>await c("https://core.framerauth.com/v2/public/project/config")},this.auth={getSession:async()=>{if(!this.baseURL)throw new Error("Auth client not initialized");let r=await c(`${this.baseURL}/get-session`,{method:"GET",credentials:"include",query:{disableCookieCache:!0}});return r.data&&(this.data.user.set(r.data.user),this.data.session.set(r.data.session)),r},signUp:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=await c(`${this.baseURL}/sign-up/email`,{method:"POST",credentials:"include",body:r});if(o.data){await new Promise(n=>setTimeout(n,50)),await this.auth.getSession();let[s,a]=await Promise.all([this.api.fetchTags(),this.api.fetchBookmarks()]);this.data.tags.set(s.data??[]),this.data.bookmarks.set(a.data??{})}return o},signIn:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=await c(`${this.baseURL}/sign-in/email`,{method:"POST",credentials:"include",body:r});return o.data&&(setTimeout(()=>this.auth.getSession(),10),this.api.fetchTags().then(s=>{this.data.tags.set(s.data??[])}),this.api.fetchBookmarks().then(s=>{this.data.bookmarks.set(s.data??{})})),o},signInSocial:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=await c(`${this.baseURL}/sign-in/social`,{method:"POST",credentials:"include",body:r});return o.data?.url&&(window.location.href=o.data.url),o},signOut:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=await c(`${this.baseURL}/sign-out`,{method:"POST",credentials:"include",body:{}});return this.data.user.set(null),this.data.session.set(null),this.data.tags.set([]),this.data.bookmarks.set({}),r?.redirectTo&&(window.location.href=r.redirectTo),o},sendOTP:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/email-otp/send-verification-otp`;return await c(o,{body:r,credentials:"include",method:"POST"})},signInOTP:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/sign-in/email-otp`,s=await c(o,{body:r,credentials:"include",method:"POST"});return s.error||(this.data.user.set(s.data.user),this.auth.getSession()),s},updateProfile:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/profile`;return await c(o,{body:r,credentials:"include",method:"PATCH"})},updateProfilePicture:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/profile/avatar`;return await c(o,{method:"POST",body:r,credentials:"include"})},createBookmark:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/profile/bookmarks`;return await c(o,{body:r,credentials:"include",method:"POST"})},deleteBookmark:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/profile/bookmarks/${r.bookmark_type}/${r.id}`;return await c(o,{credentials:"include",method:"DELETE"})},sendForgotPasswordEmail:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/forget-password`;return await c(o,{body:r,credentials:"include",method:"POST"})},resetPassword:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/reset-password`;return await c(o,{body:r,credentials:"include",method:"POST"})},storeCheckout:async r=>{if(!this.baseURL)throw new Error("Auth client not initialized");let o=`${this.baseURL}/store/checkout/session`;return await c(o,{body:r,credentials:"include",method:"POST"})}}}updateBaseURL(e){this.baseURL=e}};var R=[],L=0,C=4,He=0,h=t=>{let e=[],r={get(){return r.lc||r.listen(()=>{})(),r.value},lc:0,listen(o){return r.lc=e.push(o),()=>{for(let a=L+C;a<R.length;)R[a]===o?R.splice(a,C):a+=C;let s=e.indexOf(o);~s&&(e.splice(s,1),--r.lc||r.off())}},notify(o,s){He++;let a=!R.length;for(let n of e)R.push(n,r.value,o,s);if(a){for(L=0;L<R.length;L+=C)R[L](R[L+1],R[L+2],R[L+3]);R.length=0}},off(){},set(o){let s=r.value;s!==o&&(r.value=o,r.notify(s))},subscribe(o){let s=r.listen(o);return o(r.value),s},value:t};return r};var qe=5,_=6,B=10,Je=(t,e,r,o)=>(t.events=t.events||{},t.events[r+B]||(t.events[r+B]=o(s=>{t.events[r].reduceRight((a,n)=>(n(a),a),{shared:{},...s})})),t.events[r]=t.events[r]||[],t.events[r].push(e),()=>{let s=t.events[r],a=s.indexOf(e);s.splice(a,1),s.length||(delete t.events[r],t.events[r+B](),delete t.events[r+B])});var X=1e3,$=(t,e)=>Je(t,o=>{let s=e(o);s&&t.events[_].push(s)},qe,o=>{let s=t.listen;t.listen=(...n)=>(!t.lc&&!t.active&&(t.active=!0,o()),s(...n));let a=t.off;return t.events[_]=[],t.off=()=>{a(),setTimeout(()=>{if(t.active&&!t.lc){t.active=!1;for(let n of t.events[_])n();t.events[_]=[]}},X)},()=>{t.listen=s,t.off=a}});var j=(t={})=>{let e=h(t);return e.setKey=function(r,o){let s=e.value;typeof o>"u"&&r in e.value?(e.value={...e.value},delete e.value[r],e.notify(s,r)):e.value[r]!==o&&(e.value={...e.value,[r]:o},e.notify(s,r))},e};var Z=t=>t,A={},M={addEventListener(){},removeEventListener(){}};function Ke(){try{return typeof localStorage<"u"}catch{return!1}}Ke()&&(A=localStorage);var Ge={addEventListener(t,e,r){window.addEventListener("storage",e),window.addEventListener("pageshow",r)},removeEventListener(t,e,r){window.removeEventListener("storage",e),window.removeEventListener("pageshow",r)}};typeof window<"u"&&(M=Ge);function w(t,e=void 0,r={}){let o=r.encode||Z,s=r.decode||Z,a=h(e),n=a.set;a.set=i=>{let u=o(i);typeof u>"u"?delete A[t]:A[t]=u,n(i)};function g(i){i.key===t?i.newValue===null?n(e):n(s(i.newValue)):A[t]||n(e)}function p(){a.set(A[t]?s(A[t]):e)}return $(a,()=>{if(p(),r.listen!==!1)return M.addEventListener(t,g,p),()=>{M.removeEventListener(t,g,p)}}),a}var ee="1f8cXd6c7b4a3vL4z5746oUgQ28190adbef";function te(t){let e="";for(let r=0;r<t.length;r++)e+=String.fromCharCode(t.charCodeAt(r)^ee.charCodeAt(r%ee.length));return e}function P(t){let e=JSON.stringify(t),r=te(e);return btoa(r)}function S(t){try{let e=atob(t),r=te(e);return JSON.parse(r)}catch{return{}}}var re=w("fa-project",null,{encode:P,decode:S}),oe=h(!1);var se=w("fa-tags",[],{encode:P,decode:S}),ae=h(!1);var ne=w("fa-user",null,{encode:P,decode:S}),ie=h(!1);var le=w("fa-session",null,{encode:P,decode:S}),ce=h(!1);var ue=h(!0);var F=class{hasAccess;errorUrl;onError;observer=null;currentCanonical;originalPushState;originalReplaceState;isMonkeyPatched=!1;constructor(e,r,o){this.hasAccess=e,this.errorUrl=r,this.onError=o,this.currentCanonical=this.getCurrentCanonical(),this.originalPushState=history.pushState.bind(history),this.originalReplaceState=history.replaceState.bind(history)}getCurrentCanonical(){return document.querySelector('link[rel="canonical"]')?.href??null}hideBody(){console.log("[Router] Hiding body"),document.body.style.visibility="hidden"}showBody(){console.log("[Router] Showing body"),document.body.style.visibility="visible"}normalizeToPath(e){if(e instanceof URL)return e.pathname;if(e.startsWith("./"))return e.slice(1);if(e.startsWith("/"))return e;try{return new URL(e).pathname}catch{return e.startsWith("/")?e:"/"+e}}async checkAccess(e){console.log("[Router] Checking access for path:",e);try{return await this.hasAccess(e)}catch(r){return console.error("[Router] Error checking access:",r),!1}}redirectToError(){console.log("[Router] Access denied, redirecting to:",this.errorUrl),window.location.replace(this.errorUrl)}handleAccessDenied(e){e&&this.onError&&this.onError(new Error(String(e))),this.redirectToError()}monkeyPatchHistory(){if(this.isMonkeyPatched)return;let e=this;history.pushState=async function(r,o,s){if(s){let a=e.normalizeToPath(s);console.log("[Router] Push state to path:",a);let n=await e.checkAccess(a);console.log("[Router] [push state] Has access:",n),n||(console.warn("Access denied to:",a),e.hideBody())}return e.originalPushState.call(this,r,o,s)},history.replaceState=async function(r,o,s){if(s){let a=e.normalizeToPath(s);console.log("[Router] Replace state with path:",a);let n=await e.checkAccess(a);console.log("[Router] [replace state] Has access:",n),n||(console.warn("Access denied to:",a),e.hideBody())}return e.originalReplaceState.call(this,r,o,s)},this.isMonkeyPatched=!0}restoreHistory(){this.isMonkeyPatched&&(history.pushState=this.originalPushState,history.replaceState=this.originalReplaceState,this.isMonkeyPatched=!1)}start(){console.log("[Router] Starting router"),this.stop(),this.observer=new MutationObserver(e=>{this.handleMutations(e)}),this.observer.observe(document.head,{childList:!0,attributes:!0,attributeFilter:["rel","href"],subtree:!0}),this.monkeyPatchHistory(),console.log("[Router] Router started")}stop(){console.log("[Router] Stopping router"),this.observer&&(this.observer.disconnect(),this.observer=null,console.log("[Router] Router stopped")),this.restoreHistory(),this.showBody()}handleMutations(e){let r=!1;for(let o of e){if(o.type==="childList"){let s=[...Array.from(o.addedNodes),...Array.from(o.removedNodes)];for(let a of s)if(a.nodeType===Node.ELEMENT_NODE){let n=a;if(this.isCanonicalLink(n)){r=!0;break}}}else if(o.type==="attributes"){let s=o.target;(this.isCanonicalLink(s)||o.oldValue==="canonical")&&(r=!0)}if(r)break}r&&this.checkCanonicalChange().catch(o=>{console.error("Error checking canonical change:",o),this.showBody()})}isCanonicalLink(e){return e.tagName==="LINK"&&e.getAttribute("rel")==="canonical"}async checkCanonicalChange(){let e=this.getCurrentCanonical();if(e!==this.currentCanonical)if(this.currentCanonical=e,e){let r=this.normalizeToPath(e);try{if(!await this.checkAccess(r)){console.warn("Access denied to canonical URL:",r),this.redirectToError();return}console.log("[Router] Access granted for:",r),this.showBody()}catch(o){this.handleAccessDenied(o instanceof Error?o:new Error(String(o)))}}else this.showBody()}};var de=w("fa-bookmarks",j(),{encode:P,decode:S}),fe=h(!1);var m=new D({data:{user:ne,project:re,tags:se,bookmarks:de,session:le},state:{initializing:ue,userLoading:ie,projectLoading:oe,tagsLoading:ae,bookmarksLoading:fe,sessionLoading:ce}});window.FramerAuth=m;var Ve=async()=>{m.state.initializing.set(!0);try{let{data:t,error:e}=await m.api.fetchProject();if(e||!t)throw new Error(`Failed to fetch project: ${e?.message||"Project data is null"}`);m.data.project.set(t);let r=`https://${t.slug}.framerauth.io/v2`;m.updateBaseURL(r);let{data:o,error:s}=await m.auth.getSession();if(!s&&o!==null){let{user:a,session:n}=o;if(m.data.user.set(a),m.data.session.set(n),a)try{let[g,p]=await Promise.all([m.api.fetchTags(),m.api.fetchBookmarks()]);m.data.tags.set(g.data??[]),m.data.bookmarks.set(p.data??{})}catch(g){console.warn("Failed to fetch tags or bookmarks:",g),m.data.tags.set([]),m.data.bookmarks.set({})}}return window.dispatchEvent(new CustomEvent("framerauth:initialized")),m}catch(t){throw console.error("Failed to initialize FramerAuth:",t),window.dispatchEvent(new CustomEvent("framerauth:initialization-failed",{detail:{error:t}})),t}finally{m.state.initializing.set(!1)}},Qe=async()=>{try{let t=await Ve();new F(async r=>(console.log("[Router] [Callback] Checking access for:",r),!(!t.data.user.get()&&(r==="/locked"||r==="/blog/diversify-then-focus"))),"/sign-in",r=>{console.error("[Router] Error in router:",r)}).start()}catch(t){console.error("Failed to initialize app:",t)}};Qe();})();
@@ -1 +1 @@
1
- var ie=()=>typeof window<"u",ue=()=>window.location.host.endsWith("framercanvas.com"),k=()=>!ie()||ue()||!window?.FramerAuth?null:window.FramerAuth;async function qe(){let t=k();if(!t)return{data:null,error:{message:"FramerAuth not available"}};try{return await t.auth.getSession()}catch(e){return{data:null,error:{message:e instanceof Error?e.message:"Unknown error"}}}}async function He(t){let e=k();if(!e)return{data:null,error:{message:"FramerAuth not available"}};try{return await e.auth.signUp(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function We(t){let e=k();if(!e)return{data:null,error:{message:"FramerAuth not available"}};try{return await e.auth.signIn(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function Ne(t){let e=k();if(!e)return{data:null,error:{message:"FramerAuth not available"}};try{return await e.auth.signInOTP(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function De(t){let e=k();if(!e)return{data:null,error:{message:"FramerAuth not available"}};try{return await e.auth.sendOTP(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function ze(t){let e=k();if(!e)return{data:null,error:{message:"FramerAuth not available"}};try{return await e.auth.signOut(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function Je(t){let e=k();if(!e)return{data:null,error:{message:"FramerAuth not available"}};try{return await e.auth.updateProfile(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function Ve(t){let e=k();if(!e)return{data:null,error:{message:"FramerAuth not available"}};try{return await e.auth.updateProfilePicture(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function Ke(t){let e=k();if(!e)return{data:null,error:{message:"FramerAuth not available"}};try{return await e.auth.sendForgotPasswordEmail(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function Ge(t){let e=k();if(!e)return{data:null,error:{message:"FramerAuth not available"}};try{return await e.auth.resetPassword(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function Qe(t){let e=k();if(!e)return{data:null,error:{message:"FramerAuth not available"}};try{return await e.auth.signInSocial(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function Ye(t){let e=k();if(!e)return{data:null,error:{message:"FramerAuth not available"}};try{return await e.auth.storeCheckout(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}var ce=Object.defineProperty,le=Object.defineProperties,fe=Object.getOwnPropertyDescriptors,D=Object.getOwnPropertySymbols,de=Object.prototype.hasOwnProperty,me=Object.prototype.propertyIsEnumerable,z=(t,e,r)=>e in t?ce(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,F=(t,e)=>{for(var r in e||(e={}))de.call(e,r)&&z(t,r,e[r]);if(D)for(var r of D(e))me.call(e,r)&&z(t,r,e[r]);return t},R=(t,e)=>le(t,fe(e)),he=class extends Error{constructor(t,e,r){super(e||t.toString(),{cause:r}),this.status=t,this.statusText=e,this.error=r}},pe=async(t,e)=>{var r,n,o,a,s,u;let i=e||{},c={onRequest:[e?.onRequest],onResponse:[e?.onResponse],onSuccess:[e?.onSuccess],onError:[e?.onError],onRetry:[e?.onRetry]};if(!e||!e?.plugins)return{url:t,options:i,hooks:c};for(let f of e?.plugins||[]){if(f.init){let l=await((r=f.init)==null?void 0:r.call(f,t.toString(),e));i=l.options||i,t=l.url}c.onRequest.push((n=f.hooks)==null?void 0:n.onRequest),c.onResponse.push((o=f.hooks)==null?void 0:o.onResponse),c.onSuccess.push((a=f.hooks)==null?void 0:a.onSuccess),c.onError.push((s=f.hooks)==null?void 0:s.onError),c.onRetry.push((u=f.hooks)==null?void 0:u.onRetry)}return{url:t,options:i,hooks:c}},J=class{constructor(t){this.options=t}shouldAttemptRetry(t,e){return this.options.shouldRetry?Promise.resolve(t<this.options.attempts&&this.options.shouldRetry(e)):Promise.resolve(t<this.options.attempts)}getDelay(){return this.options.delay}},ge=class{constructor(t){this.options=t}shouldAttemptRetry(t,e){return this.options.shouldRetry?Promise.resolve(t<this.options.attempts&&this.options.shouldRetry(e)):Promise.resolve(t<this.options.attempts)}getDelay(t){return Math.min(this.options.maxDelay,this.options.baseDelay*2**t)}};function ye(t){if(typeof t=="number")return new J({type:"linear",attempts:t,delay:1e3});switch(t.type){case"linear":return new J(t);case"exponential":return new ge(t);default:throw new Error("Invalid retry strategy")}}var we=async t=>{let e={},r=async n=>typeof n=="function"?await n():n;if(t?.auth){if(t.auth.type==="Bearer"){let n=await r(t.auth.token);if(!n)return e;e.authorization=`Bearer ${n}`}else if(t.auth.type==="Basic"){let n=r(t.auth.username),o=r(t.auth.password);if(!n||!o)return e;e.authorization=`Basic ${btoa(`${n}:${o}`)}`}else if(t.auth.type==="Custom"){let n=r(t.auth.value);if(!n)return e;e.authorization=`${r(t.auth.prefix)} ${n}`}}return e},ve=/^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i;function ke(t){let e=t.headers.get("content-type"),r=new Set(["image/svg","application/xml","application/xhtml","application/html"]);if(!e)return"json";let n=e.split(";").shift()||"";return ve.test(n)?"json":r.has(n)||n.startsWith("text/")?"text":"blob"}function be(t){try{return JSON.parse(t),!0}catch{return!1}}function G(t){if(t===void 0)return!1;let e=typeof t;return e==="string"||e==="number"||e==="boolean"||e===null?!0:e!=="object"?!1:Array.isArray(t)?!0:t.buffer?!1:t.constructor&&t.constructor.name==="Object"||typeof t.toJSON=="function"}function V(t){try{return JSON.parse(t)}catch{return t}}function K(t){return typeof t=="function"}function Te(t){if(t?.customFetchImpl)return t.customFetchImpl;if(typeof globalThis<"u"&&K(globalThis.fetch))return globalThis.fetch;if(typeof window<"u"&&K(window.fetch))return window.fetch;throw new Error("No fetch implementation found")}async function Pe(t){let e=new Headers(t?.headers),r=await we(t);for(let[n,o]of Object.entries(r||{}))e.set(n,o);if(!e.has("content-type")){let n=Se(t?.body);n&&e.set("content-type",n)}return e}function Se(t){return G(t)?"application/json":null}function Ae(t){if(!t?.body)return null;let e=new Headers(t?.headers);if(G(t.body)&&!e.has("content-type")){for(let[r,n]of Object.entries(t?.body))n instanceof Date&&(t.body[r]=n.toISOString());return JSON.stringify(t.body)}return t.body}function xe(t,e){var r;if(e?.method)return e.method.toUpperCase();if(t.startsWith("@")){let n=(r=t.split("@")[1])==null?void 0:r.split("/")[0];return Y.includes(n)?n.toUpperCase():e?.body?"POST":"GET"}return e?.body?"POST":"GET"}function Fe(t,e){let r;return!t?.signal&&t?.timeout&&(r=setTimeout(()=>e?.abort(),t?.timeout)),{abortTimeout:r,clearTimeout:()=>{r&&clearTimeout(r)}}}var Re=class Q extends Error{constructor(e,r){super(r||JSON.stringify(e,null,2)),this.issues=e,Object.setPrototypeOf(this,Q.prototype)}};async function Oe(t,e){let r=await t["~standard"].validate(e);if(r.issues)throw new Re(r.issues);return r.value}var Y=["get","post","put","patch","delete"];function Ee(t,e){let{baseURL:r,params:n,query:o}=e||{query:{},params:{},baseURL:""},a=t.startsWith("http")?t.split("/").slice(0,3).join("/"):r||"";if(t.startsWith("@")){let l=t.toString().split("@")[1].split("/")[0];Y.includes(l)&&(t=t.replace(`@${l}/`,"/"))}a.endsWith("/")||(a+="/");let[s,u]=t.replace(a,"").split("?"),i=new URLSearchParams(u);for(let[l,m]of Object.entries(o||{}))m!=null&&i.set(l,String(m));if(n)if(Array.isArray(n)){let l=s.split("/").filter(m=>m.startsWith(":"));for(let[m,A]of l.entries()){let y=n[m];s=s.replace(A,y)}}else for(let[l,m]of Object.entries(n))s=s.replace(`:${l}`,String(m));s=s.split("/").map(encodeURIComponent).join("/"),s.startsWith("/")&&(s=s.slice(1));let c=i.toString();return c=c.length>0?`?${c}`.replace(/\+/g,"%20"):"",a.startsWith("http")?new URL(`${s}${c}`,a):`${a}${s}${c}`}var B=async(t,e)=>{var r,n,o,a,s,u,i,c;let{hooks:f,url:l,options:m}=await pe(t,e),A=Te(m),y=new AbortController,j=(r=m.signal)!=null?r:y.signal,_=Ee(l,m),ee=Ae(m),te=await Pe(m),re=xe(l,m),p=R(F({},m),{url:_,headers:te,body:ee,method:re,signal:j});for(let v of f.onRequest)if(v){let g=await v(p);g instanceof Object&&(p=g)}("pipeTo"in p&&typeof p.pipeTo=="function"||typeof((n=e?.body)==null?void 0:n.pipe)=="function")&&("duplex"in p||(p.duplex="half"));let{clearTimeout:ne}=Fe(m,y),d=await A(p.url,p);ne();let W={response:d,request:p};for(let v of f.onResponse)if(v){let g=await v(R(F({},W),{response:(o=e?.hookOptions)!=null&&o.cloneResponse?d.clone():d}));g instanceof Response?d=g:g instanceof Object&&(d=g.response)}if(d.ok){if(!(p.method!=="HEAD"))return{data:"",error:null};let g=ke(d),P={data:"",response:d,request:p};if(g==="json"||g==="text"){let S=await d.text(),se=await((a=p.jsonParser)!=null?a:V)(S);P.data=se}else P.data=await d[g]();p?.output&&p.output&&!p.disableValidation&&(P.data=await Oe(p.output,P.data));for(let S of f.onSuccess)S&&await S(R(F({},P),{response:(s=e?.hookOptions)!=null&&s.cloneResponse?d.clone():d}));return e?.throw?P.data:{data:P.data,error:null}}let ae=(u=e?.jsonParser)!=null?u:V,C=await d.text(),N=be(C),I=N?await ae(C):null,oe={response:d,responseText:C,request:p,error:R(F({},I),{status:d.status,statusText:d.statusText})};for(let v of f.onError)v&&await v(R(F({},oe),{response:(i=e?.hookOptions)!=null&&i.cloneResponse?d.clone():d}));if(e?.retry){let v=ye(e.retry),g=(c=e.retryAttempt)!=null?c:0;if(await v.shouldAttemptRetry(g,d)){for(let S of f.onRetry)S&&await S(W);let P=v.getDelay(g);return await new Promise(S=>setTimeout(S,P)),await B(t,R(F({},e),{retryAttempt:g+1}))}}if(e?.throw)throw new he(d.status,d.statusText,N?I:C);return{data:null,error:R(F({},I),{status:d.status,statusText:d.statusText})}};function $(t,e,r){let n=new Set(e).add(void 0);return t.listen((o,a,s)=>{n.has(s)&&r(o,a,s)})}import{useCallback as Ue,useRef as je,useSyncExternalStore as Ce}from"react";var M=(t,e)=>r=>{t.current!==r&&(t.current=r,e())};function b(t,{keys:e,deps:r=[t,e]}={}){let n=je();n.current=t.get();let o=Ue(s=>(M(n,s)(t.value),e?.length>0?$(t,e,M(n,s)):t.listen(M(n,s))),r),a=()=>n.current;return Ce(o,a,a)}import{useState as X}from"react";var O=()=>typeof window<"u",E=()=>window.location.host.endsWith("framercanvas.com"),Le=()=>{let t=Object.keys(window.parent);for(let e=t.length-1;e>=0;e--)try{let r=new URLSearchParams(window.parent[t[e]].location.search).get("siteId");if(r)return r}catch{}},_e=async()=>{let t=Le()||"";return await B("https://core.framerauth.com/v2/public/project/config",{headers:{"x-framer-project-id":t}})};function mt(){if(!O()||E()||!window?.FramerAuth)return{initializing:!0,setInitializing:()=>{}};let t=window.FramerAuth;return{initializing:b(t.state.initializing)}}function ht(){if(!O()||E()||!window?.FramerAuth)return{session:null,loading:!1,setSession:()=>{},setLoading:()=>{}};let t=window.FramerAuth,e=b(t.data.session),r=b(t.state.sessionLoading);return{session:e,loading:r,setSession:a=>t.data.session.set(a),setLoading:a=>t.state.sessionLoading.set(a)}}function T(){if(!O()||E()||!window?.FramerAuth)return{user:null,loading:!1,setUser:()=>{},setLoading:()=>{}};let t=window.FramerAuth,e=b(t.data.user),r=b(t.state.userLoading);return{user:e,loading:r,setUser:a=>t.data.user.set(a),setLoading:a=>t.state.userLoading.set(a)}}function pt(){let[t,e]=X(null),[r,n]=X(!1);if(!O())return{project:null,loading:!1,setProject:()=>{},setLoading:()=>{},fetchProject:async()=>({data:null,error:{message:"Browser not available"}})};if(E()&&!window?.FramerAuth){let l=y=>e(y),m=y=>n(y);return{project:t,loading:r,setProject:l,setLoading:m,fetchProject:async()=>{m(!0);let y=await _e();return y.data&&l(y.data),m(!1),y}}}let a=window.FramerAuth,s=b(a.data.project),u=b(a.state.projectLoading),i=l=>a.data.project.set(l),c=l=>a.state.projectLoading.set(l);return{project:s,loading:u,setProject:i,setLoading:c,fetchProject:async()=>{c(!0);let l=await a.api.fetchProject();return l.data&&i(l.data),c(!1),l}}}function x(){if(!O()||E()||!window?.FramerAuth)return{tags:null,loading:!1,setTags:()=>{},setLoading:()=>{}};let t=window.FramerAuth,e=b(t.data.tags),r=b(t.state.tagsLoading);return{tags:e,loading:r,setTags:a=>t.data.tags.set(a),setLoading:a=>t.state.tagsLoading.set(a)}}function L(t){if(!O()||E()||!window?.FramerAuth)return{bookmarks:null,loading:!1,createBookmark:a=>{},deleteBookmark:a=>{},setLoading:()=>{}};let e=window.FramerAuth;return{bookmarks:b(e.data.bookmarks,{keys:t}),createBookmark:a=>{let u={...e.data.bookmarks.get(),[a]:!0};e.data.bookmarks.set(u)},deleteBookmark:a=>{let u={...e.data.bookmarks.get()};delete u[a],e.data.bookmarks.set(u)}}}import{useEffect as q,useMemo as w,useRef as H}from"react";import{useRouter as Ie,RenderTarget as Z,inferInitialRouteFromPath as Be}from"framer";import{jsx as h}from"react/jsx-runtime";function U(t,e,r){let{operator:n="all",tags:o}=r,a=!1;return t&&Array.isArray(e)&&Array.isArray(o)&&(n==="any"?a=o.some(s=>e.some(u=>u.name===s)):a=o.every(s=>e.some(u=>u.name===s))),a}function Tt(t){return e=>{let{user:r}=T();return r?h(t,{...e}):null}}function Pt(t){return e=>{let{user:r}=T();return r?null:h(t,{...e})}}function St(t){return e=>{let{user:r}=T(),n=r?.id?null:e?.variant;return h(t,{...e,variant:n})}}function At(t,e){return r=>{let{user:n}=T(),{tags:o}=x();return U(n,o,e)?h(t,{...r}):null}}function xt(t,e){return r=>{let{user:n}=T(),{tags:o}=x();return U(n,o,e)?null:h(t,{...r})}}function Ft(t){return e=>{let{user:r}=T(),{tags:n}=x(),o=H(null),a=e?.tags,s=w(()=>!a||typeof a!="string"?null:a.replaceAll(" ","").split(","),[a]),u=e?.require||"any",i=w(()=>s?U(r,n,{operator:u,tags:s}):!1,[r,n,s,u]);return q(()=>{if(o.current){let f=o.current.parentElement;if(!f)return;i?f.style.display="":f.style.display="none"}},[o.current,i]),w(()=>i!==!0?h("div",{ref:o}):h(t,{ref:o,...e}),[e,i,void 0])}}function Rt(t){return e=>{let{user:r}=T(),{tags:n}=x(),o=H(null),a=e?.tags,s=w(()=>!a||typeof a!="string"?null:a.replaceAll(" ","").split(","),[a]),u=e?.require||"any",i=w(()=>s?U(r,n,{operator:u,tags:s}):!1,[r,n,s,u]);return q(()=>{if(o.current){let f=o.current.parentElement;if(!f)return;i?f.style.display="none":f.style.display=""}},[o.current,i]),w(()=>i===!0?h("div",{ref:o}):h(t,{ref:o,...e}),[e,i,void 0])}}function Ot(t){return e=>{let{user:r}=T(),{tags:n}=x(),o=e?.variant,a=e?.tags;if(!a||typeof a!="string"||a.replaceAll(" ","").trim().length===0){let c=null;return(!n||n.length===0)&&(c=o),h(t,{...e,variant:c})}let s=a.replaceAll(" ","").split(","),i=U(r,n,{operator:"any",tags:s})?null:o;return h(t,{...e,variant:i})}}function Et(t,e){return r=>{let{tags:n}=x();return n&&e.every(a=>n.some(s=>s.name===a))?h(t,{...r}):null}}function Ut(t,e){return r=>{let{tags:n}=x();return n&&e.some(a=>n.some(s=>s.name===a))?null:h(t,{...r})}}function jt(t,e="saved-for-later"){return r=>{let{bookmarks:n}=L(),a=w(()=>n?Object.keys(n).some(u=>u.startsWith(`${e}:`))===!0:!1,[n])?null:"Empty State";return h(t,{...r,variant:a})}}function Ct(t,e="saved-for-later"){return r=>{let{bookmarks:n}=L(),o=H(null),a=w(()=>`${e}:${r?.slug}`,[r]),s=w(()=>$e()?!0:n?a in n:!1,[n?.[a],a]);return q(()=>{if(o.current){let i=o.current.parentElement;if(!i)return;s?i.style.display="":i.style.display="none"}},[o.current,s]),w(()=>s!==!0?h("div",{ref:o}):h(t,{ref:o,...r}),[r,s,void 0])}}function Lt(t,e="saved-for-later"){return r=>{let n=Ie(),{user:o}=T(),{bookmarks:a,createBookmark:s,deleteBookmark:u}=L([`${e}:${r?.slug}`]),i=w(()=>`${e}:${r?.slug}`,[r]),c=w(()=>a?i in a:!1,[a?.[i],i]),f=async m=>{try{if(c)u(i),window?.FramerAuth.auth.deleteBookmark({id:r?.slug,bookmark_type:e});else if(s(i),window?.FramerAuth.auth.createBookmark({id:r?.slug,bookmark_type:e}),r?.link){let[A,y]=r.link.split("#"),{routeId:j,pathVariables:_}=Be(n.routes,A);j&&n.navigate(j,y,_)}}catch(A){console.error(A)}},l=w(()=>c?r?.variant:void 0,[c,r?.variant]);return o?h(t,{...r,variant:l,onClick:f}):null}}function _t(t){return e=>h(t,{...e,onClick:async n=>{window?.FramerAuth.auth.signInSocial({provider:"github",callbackURL:window.location.origin+"/account"})}})}function It(t,e){return r=>{let{user:n}=T();return n?h(t,{...r,onClick:async a=>{window?.FramerAuth.auth.signOut({redirectTo:e.redirectTo})}}):null}}function Bt(t){return e=>{let{style:r,...n}=e;return h(t,{...n,style:{...r,gridAutoRows:"auto"}})}}function $e(){return Z.current()===Z.canvas}export{_t as buttonSignInSocial,It as buttonSignOut,qe as getSession,Et as hasTagName,$e as isCanvas,Ut as missingTagName,Ge as resetPassword,Ke as sendForgotPasswordEmail,De as sendOTP,At as showIfHasTags,xt as showIfNotHasTags,Tt as showIfSignedIn,Pt as showIfSignedOut,Ft as showIfWithTag,Rt as showIfWithoutTag,We as signIn,Ne as signInOTP,Qe as signInSocial,ze as signOut,He as signUp,Ye as storeCheckout,St as toggleVariant,Ot as toggleVariantIfWithTag,Je as updateProfile,Ve as updateProfilePicture,L as useBookmarks,mt as useIsInitializing,pt as useProject,ht as useSession,x as useTags,T as useUser,jt as withBookmarks,Bt as withDynamicGridHeight,Ct as withIsBookmarked,Lt as withToggleBookmark};
1
+ var ue=()=>typeof window<"u",ce=()=>window.location.host.endsWith("framercanvas.com"),k="FramerAuth snippet missing from start of <body>",b=()=>!ue()||ce()||!window?.FramerAuth?null:window.FramerAuth;async function He(){let t=b();if(!t)return{data:null,error:{message:k}};try{return await t.auth.getSession()}catch(e){return{data:null,error:{message:e instanceof Error?e.message:"Unknown error"}}}}async function We(t){let e=b();if(!e)return{data:null,error:{message:k}};try{return await e.auth.signUp(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function Ne(t){let e=b();if(!e)return{data:null,error:{message:k}};try{return await e.auth.signIn(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function De(t){let e=b();if(!e)return{data:null,error:{message:k}};try{return await e.auth.signInOTP(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function ze(t){let e=b();if(!e)return{data:null,error:{message:k}};try{return await e.auth.sendOTP(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function Je(t){let e=b();if(!e)return{data:null,error:{message:k}};try{return await e.auth.signOut(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function Ve(t){let e=b();if(!e)return{data:null,error:{message:k}};try{return await e.auth.updateProfile(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function Ke(t){let e=b();if(!e)return{data:null,error:{message:k}};try{return await e.auth.updateProfilePicture(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function Ge(t){let e=b();if(!e)return{data:null,error:{message:k}};try{return await e.auth.sendForgotPasswordEmail(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function Qe(t){let e=b();if(!e)return{data:null,error:{message:k}};try{return await e.auth.resetPassword(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function Ye(t){let e=b();if(!e)return{data:null,error:{message:k}};try{return await e.auth.signInSocial(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}async function Xe(t){let e=b();if(!e)return{data:null,error:{message:k}};try{return await e.auth.storeCheckout(t)}catch(r){return{data:null,error:{message:r instanceof Error?r.message:"Unknown error"}}}}var le=Object.defineProperty,fe=Object.defineProperties,de=Object.getOwnPropertyDescriptors,z=Object.getOwnPropertySymbols,me=Object.prototype.hasOwnProperty,pe=Object.prototype.propertyIsEnumerable,J=(t,e,r)=>e in t?le(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,F=(t,e)=>{for(var r in e||(e={}))me.call(e,r)&&J(t,r,e[r]);if(z)for(var r of z(e))pe.call(e,r)&&J(t,r,e[r]);return t},O=(t,e)=>fe(t,de(e)),he=class extends Error{constructor(t,e,r){super(e||t.toString(),{cause:r}),this.status=t,this.statusText=e,this.error=r}},ge=async(t,e)=>{var r,n,o,a,s,u;let i=e||{},c={onRequest:[e?.onRequest],onResponse:[e?.onResponse],onSuccess:[e?.onSuccess],onError:[e?.onError],onRetry:[e?.onRetry]};if(!e||!e?.plugins)return{url:t,options:i,hooks:c};for(let f of e?.plugins||[]){if(f.init){let l=await((r=f.init)==null?void 0:r.call(f,t.toString(),e));i=l.options||i,t=l.url}c.onRequest.push((n=f.hooks)==null?void 0:n.onRequest),c.onResponse.push((o=f.hooks)==null?void 0:o.onResponse),c.onSuccess.push((a=f.hooks)==null?void 0:a.onSuccess),c.onError.push((s=f.hooks)==null?void 0:s.onError),c.onRetry.push((u=f.hooks)==null?void 0:u.onRetry)}return{url:t,options:i,hooks:c}},V=class{constructor(t){this.options=t}shouldAttemptRetry(t,e){return this.options.shouldRetry?Promise.resolve(t<this.options.attempts&&this.options.shouldRetry(e)):Promise.resolve(t<this.options.attempts)}getDelay(){return this.options.delay}},ye=class{constructor(t){this.options=t}shouldAttemptRetry(t,e){return this.options.shouldRetry?Promise.resolve(t<this.options.attempts&&this.options.shouldRetry(e)):Promise.resolve(t<this.options.attempts)}getDelay(t){return Math.min(this.options.maxDelay,this.options.baseDelay*2**t)}};function we(t){if(typeof t=="number")return new V({type:"linear",attempts:t,delay:1e3});switch(t.type){case"linear":return new V(t);case"exponential":return new ye(t);default:throw new Error("Invalid retry strategy")}}var ve=async t=>{let e={},r=async n=>typeof n=="function"?await n():n;if(t?.auth){if(t.auth.type==="Bearer"){let n=await r(t.auth.token);if(!n)return e;e.authorization=`Bearer ${n}`}else if(t.auth.type==="Basic"){let n=r(t.auth.username),o=r(t.auth.password);if(!n||!o)return e;e.authorization=`Basic ${btoa(`${n}:${o}`)}`}else if(t.auth.type==="Custom"){let n=r(t.auth.value);if(!n)return e;e.authorization=`${r(t.auth.prefix)} ${n}`}}return e},ke=/^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i;function be(t){let e=t.headers.get("content-type"),r=new Set(["image/svg","application/xml","application/xhtml","application/html"]);if(!e)return"json";let n=e.split(";").shift()||"";return ke.test(n)?"json":r.has(n)||n.startsWith("text/")?"text":"blob"}function Te(t){try{return JSON.parse(t),!0}catch{return!1}}function Q(t){if(t===void 0)return!1;let e=typeof t;return e==="string"||e==="number"||e==="boolean"||e===null?!0:e!=="object"?!1:Array.isArray(t)?!0:t.buffer?!1:t.constructor&&t.constructor.name==="Object"||typeof t.toJSON=="function"}function K(t){try{return JSON.parse(t)}catch{return t}}function G(t){return typeof t=="function"}function Pe(t){if(t?.customFetchImpl)return t.customFetchImpl;if(typeof globalThis<"u"&&G(globalThis.fetch))return globalThis.fetch;if(typeof window<"u"&&G(window.fetch))return window.fetch;throw new Error("No fetch implementation found")}async function Se(t){let e=new Headers(t?.headers),r=await ve(t);for(let[n,o]of Object.entries(r||{}))e.set(n,o);if(!e.has("content-type")){let n=xe(t?.body);n&&e.set("content-type",n)}return e}function xe(t){return Q(t)?"application/json":null}function Ae(t){if(!t?.body)return null;let e=new Headers(t?.headers);if(Q(t.body)&&!e.has("content-type")){for(let[r,n]of Object.entries(t?.body))n instanceof Date&&(t.body[r]=n.toISOString());return JSON.stringify(t.body)}return t.body}function Re(t,e){var r;if(e?.method)return e.method.toUpperCase();if(t.startsWith("@")){let n=(r=t.split("@")[1])==null?void 0:r.split("/")[0];return X.includes(n)?n.toUpperCase():e?.body?"POST":"GET"}return e?.body?"POST":"GET"}function Fe(t,e){let r;return!t?.signal&&t?.timeout&&(r=setTimeout(()=>e?.abort(),t?.timeout)),{abortTimeout:r,clearTimeout:()=>{r&&clearTimeout(r)}}}var Oe=class Y extends Error{constructor(e,r){super(r||JSON.stringify(e,null,2)),this.issues=e,Object.setPrototypeOf(this,Y.prototype)}};async function Ee(t,e){let r=await t["~standard"].validate(e);if(r.issues)throw new Oe(r.issues);return r.value}var X=["get","post","put","patch","delete"];function Ue(t,e){let{baseURL:r,params:n,query:o}=e||{query:{},params:{},baseURL:""},a=t.startsWith("http")?t.split("/").slice(0,3).join("/"):r||"";if(t.startsWith("@")){let l=t.toString().split("@")[1].split("/")[0];X.includes(l)&&(t=t.replace(`@${l}/`,"/"))}a.endsWith("/")||(a+="/");let[s,u]=t.replace(a,"").split("?"),i=new URLSearchParams(u);for(let[l,m]of Object.entries(o||{}))m!=null&&i.set(l,String(m));if(n)if(Array.isArray(n)){let l=s.split("/").filter(m=>m.startsWith(":"));for(let[m,A]of l.entries()){let y=n[m];s=s.replace(A,y)}}else for(let[l,m]of Object.entries(n))s=s.replace(`:${l}`,String(m));s=s.split("/").map(encodeURIComponent).join("/"),s.startsWith("/")&&(s=s.slice(1));let c=i.toString();return c=c.length>0?`?${c}`.replace(/\+/g,"%20"):"",a.startsWith("http")?new URL(`${s}${c}`,a):`${a}${s}${c}`}var $=async(t,e)=>{var r,n,o,a,s,u,i,c;let{hooks:f,url:l,options:m}=await ge(t,e),A=Pe(m),y=new AbortController,C=(r=m.signal)!=null?r:y.signal,I=Ue(l,m),te=Ae(m),re=await Se(m),ne=Re(l,m),h=O(F({},m),{url:I,headers:re,body:te,method:ne,signal:C});for(let v of f.onRequest)if(v){let g=await v(h);g instanceof Object&&(h=g)}("pipeTo"in h&&typeof h.pipeTo=="function"||typeof((n=e?.body)==null?void 0:n.pipe)=="function")&&("duplex"in h||(h.duplex="half"));let{clearTimeout:ae}=Fe(m,y),d=await A(h.url,h);ae();let N={response:d,request:h};for(let v of f.onResponse)if(v){let g=await v(O(F({},N),{response:(o=e?.hookOptions)!=null&&o.cloneResponse?d.clone():d}));g instanceof Response?d=g:g instanceof Object&&(d=g.response)}if(d.ok){if(!(h.method!=="HEAD"))return{data:"",error:null};let g=be(d),S={data:"",response:d,request:h};if(g==="json"||g==="text"){let x=await d.text(),ie=await((a=h.jsonParser)!=null?a:K)(x);S.data=ie}else S.data=await d[g]();h?.output&&h.output&&!h.disableValidation&&(S.data=await Ee(h.output,S.data));for(let x of f.onSuccess)x&&await x(O(F({},S),{response:(s=e?.hookOptions)!=null&&s.cloneResponse?d.clone():d}));return e?.throw?S.data:{data:S.data,error:null}}let oe=(u=e?.jsonParser)!=null?u:K,L=await d.text(),D=Te(L),B=D?await oe(L):null,se={response:d,responseText:L,request:h,error:O(F({},B),{status:d.status,statusText:d.statusText})};for(let v of f.onError)v&&await v(O(F({},se),{response:(i=e?.hookOptions)!=null&&i.cloneResponse?d.clone():d}));if(e?.retry){let v=we(e.retry),g=(c=e.retryAttempt)!=null?c:0;if(await v.shouldAttemptRetry(g,d)){for(let x of f.onRetry)x&&await x(N);let S=v.getDelay(g);return await new Promise(x=>setTimeout(x,S)),await $(t,O(F({},e),{retryAttempt:g+1}))}}if(e?.throw)throw new he(d.status,d.statusText,D?B:L);return{data:null,error:O(F({},B),{status:d.status,statusText:d.statusText})}};function M(t,e,r){let n=new Set(e).add(void 0);return t.listen((o,a,s)=>{n.has(s)&&r(o,a,s)})}import{useCallback as je,useRef as Ce,useSyncExternalStore as Le}from"react";var q=(t,e)=>r=>{t.current!==r&&(t.current=r,e())};function T(t,{keys:e,deps:r=[t,e]}={}){let n=Ce();n.current=t.get();let o=je(s=>(q(n,s)(t.value),e?.length>0?M(t,e,q(n,s)):t.listen(q(n,s))),r),a=()=>n.current;return Le(o,a,a)}import{useState as Z}from"react";var E=()=>typeof window<"u",U=()=>window.location.host.endsWith("framercanvas.com"),_e=()=>{let t=Object.keys(window.parent);for(let e=t.length-1;e>=0;e--)try{let r=new URLSearchParams(window.parent[t[e]].location.search).get("siteId");if(r)return r}catch{}},Ie=async()=>{let t=_e()||"";return await $("https://core.framerauth.com/v2/public/project/config",{headers:{"x-framer-project-id":t}})};function pt(){if(!E()||U()||!window?.FramerAuth)return{initializing:!0,setInitializing:()=>{}};let t=window.FramerAuth;return{initializing:T(t.state.initializing)}}function ht(){if(!E()||U()||!window?.FramerAuth)return{session:null,loading:!1,setSession:()=>{},setLoading:()=>{}};let t=window.FramerAuth,e=T(t.data.session),r=T(t.state.sessionLoading);return{session:e,loading:r,setSession:a=>t.data.session.set(a),setLoading:a=>t.state.sessionLoading.set(a)}}function P(){if(!E()||U()||!window?.FramerAuth)return{user:null,loading:!1,setUser:()=>{},setLoading:()=>{}};let t=window.FramerAuth,e=T(t.data.user),r=T(t.state.userLoading);return{user:e,loading:r,setUser:a=>t.data.user.set(a),setLoading:a=>t.state.userLoading.set(a)}}function gt(){let[t,e]=Z(null),[r,n]=Z(!1);if(!E())return{project:null,loading:!1,setProject:()=>{},setLoading:()=>{},fetchProject:async()=>({data:null,error:{message:"Browser not available"}})};if(U()&&!window?.FramerAuth){let l=y=>e(y),m=y=>n(y);return{project:t,loading:r,setProject:l,setLoading:m,fetchProject:async()=>{m(!0);let y=await Ie();return y.data&&l(y.data),m(!1),y}}}let a=window.FramerAuth,s=T(a.data.project),u=T(a.state.projectLoading),i=l=>a.data.project.set(l),c=l=>a.state.projectLoading.set(l);return{project:s,loading:u,setProject:i,setLoading:c,fetchProject:async()=>{c(!0);let l=await a.api.fetchProject();return l.data&&i(l.data),c(!1),l}}}function R(){if(!E()||U()||!window?.FramerAuth)return{tags:null,loading:!1,setTags:()=>{},setLoading:()=>{}};let t=window.FramerAuth,e=T(t.data.tags),r=T(t.state.tagsLoading);return{tags:e,loading:r,setTags:a=>t.data.tags.set(a),setLoading:a=>t.state.tagsLoading.set(a)}}function _(t){if(!E()||U()||!window?.FramerAuth)return{bookmarks:null,loading:!1,createBookmark:a=>{},deleteBookmark:a=>{},setLoading:()=>{}};let e=window.FramerAuth;return{bookmarks:T(e.data.bookmarks,{keys:t}),createBookmark:a=>{let u={...e.data.bookmarks.get(),[a]:!0};e.data.bookmarks.set(u)},deleteBookmark:a=>{let u={...e.data.bookmarks.get()};delete u[a],e.data.bookmarks.set(u)}}}import{useEffect as H,useMemo as w,useRef as W}from"react";import{useRouter as Be,RenderTarget as ee,inferInitialRouteFromPath as $e}from"framer";import{jsx as p}from"react/jsx-runtime";function j(t,e,r){let{operator:n="all",tags:o}=r,a=!1;return t&&Array.isArray(e)&&Array.isArray(o)&&(n==="any"?a=o.some(s=>e.some(u=>u.name===s)):a=o.every(s=>e.some(u=>u.name===s))),a}function Pt(t){return e=>{let{user:r}=P();return r?p(t,{...e}):null}}function St(t){return e=>{let{user:r}=P();return r?null:p(t,{...e})}}function xt(t){return e=>{let{user:r}=P(),n=r?.id?null:e?.variant;return p(t,{...e,variant:n})}}function At(t,e){return r=>{let{user:n}=P(),{tags:o}=R();return j(n,o,e)?p(t,{...r}):null}}function Rt(t,e){return r=>{let{user:n}=P(),{tags:o}=R();return j(n,o,e)?null:p(t,{...r})}}function Ft(t){return e=>{let{user:r}=P(),{tags:n}=R(),o=W(null),a=e?.tags,s=w(()=>!a||typeof a!="string"?null:a.replaceAll(" ","").split(","),[a]),u=e?.require||"any",i=w(()=>s?j(r,n,{operator:u,tags:s}):!1,[r,n,s,u]);return H(()=>{if(o.current){let f=o.current.parentElement;if(!f)return;i?f.style.display="":f.style.display="none"}},[o.current,i]),w(()=>i!==!0?p("div",{ref:o}):p(t,{ref:o,...e}),[e,i,void 0])}}function Ot(t){return e=>{let{user:r}=P(),{tags:n}=R(),o=W(null),a=e?.tags,s=w(()=>!a||typeof a!="string"?null:a.replaceAll(" ","").split(","),[a]),u=e?.require||"any",i=w(()=>s?j(r,n,{operator:u,tags:s}):!1,[r,n,s,u]);return H(()=>{if(o.current){let f=o.current.parentElement;if(!f)return;i?f.style.display="none":f.style.display=""}},[o.current,i]),w(()=>i===!0?p("div",{ref:o}):p(t,{ref:o,...e}),[e,i,void 0])}}function Et(t){return e=>{let{user:r}=P(),{tags:n}=R(),o=e?.variant,a=e?.tags;if(!a||typeof a!="string"||a.replaceAll(" ","").trim().length===0){let c=null;return(!n||n.length===0)&&(c=o),p(t,{...e,variant:c})}let s=a.replaceAll(" ","").split(","),i=j(r,n,{operator:"any",tags:s})?null:o;return p(t,{...e,variant:i})}}function Ut(t,e){return r=>{let{tags:n}=R();return n&&e.every(a=>n.some(s=>s.name===a))?p(t,{...r}):null}}function jt(t,e){return r=>{let{tags:n}=R();return n&&e.some(a=>n.some(s=>s.name===a))?null:p(t,{...r})}}function Ct(t,e="saved-for-later"){return r=>{let{bookmarks:n}=_(),a=w(()=>n?Object.keys(n).some(u=>u.startsWith(`${e}:`))===!0:!1,[n])?null:"Empty State";return p(t,{...r,variant:a})}}function Lt(t,e="saved-for-later"){return r=>{let{bookmarks:n}=_(),o=W(null),a=w(()=>`${e}:${r?.slug}`,[r]),s=w(()=>Me()?!0:n?a in n:!1,[n?.[a],a]);return H(()=>{if(o.current){let i=o.current.parentElement;if(!i)return;s?i.style.display="":i.style.display="none"}},[o.current,s]),w(()=>s!==!0?p("div",{ref:o}):p(t,{ref:o,...r}),[r,s,void 0])}}function _t(t,e="saved-for-later"){return r=>{let n=Be(),{user:o}=P(),{bookmarks:a,createBookmark:s,deleteBookmark:u}=_([`${e}:${r?.slug}`]),i=w(()=>`${e}:${r?.slug}`,[r]),c=w(()=>a?i in a:!1,[a?.[i],i]),f=async m=>{try{if(c)u(i),window?.FramerAuth.auth.deleteBookmark({id:r?.slug,bookmark_type:e});else if(s(i),window?.FramerAuth.auth.createBookmark({id:r?.slug,bookmark_type:e}),r?.link){let[A,y]=r.link.split("#"),{routeId:C,pathVariables:I}=$e(n.routes,A);C&&n.navigate(C,y,I)}}catch(A){console.error(A)}},l=w(()=>c?r?.variant:void 0,[c,r?.variant]);return o?p(t,{...r,variant:l,onClick:f}):null}}function It(t){return e=>p(t,{...e,onClick:async n=>{window?.FramerAuth.auth.signInSocial({provider:"github",callbackURL:window.location.origin+"/account"})}})}function Bt(t,e){return r=>{let{user:n}=P();return n?p(t,{...r,onClick:async a=>{window?.FramerAuth.auth.signOut({redirectTo:e.redirectTo})}}):null}}function $t(t){return e=>{let{style:r,...n}=e;return p(t,{...n,style:{...r,gridAutoRows:"auto"}})}}function Me(){return ee.current()===ee.canvas}export{It as buttonSignInSocial,Bt as buttonSignOut,He as getSession,Ut as hasTagName,Me as isCanvas,jt as missingTagName,Qe as resetPassword,Ge as sendForgotPasswordEmail,ze as sendOTP,At as showIfHasTags,Rt as showIfNotHasTags,Pt as showIfSignedIn,St as showIfSignedOut,Ft as showIfWithTag,Ot as showIfWithoutTag,Ne as signIn,De as signInOTP,Ye as signInSocial,Je as signOut,We as signUp,Xe as storeCheckout,xt as toggleVariant,Et as toggleVariantIfWithTag,Ve as updateProfile,Ke as updateProfilePicture,_ as useBookmarks,pt as useIsInitializing,gt as useProject,ht as useSession,R as useTags,P as useUser,Ct as withBookmarks,$t as withDynamicGridHeight,Lt as withIsBookmarked,_t as withToggleBookmark};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@framerauth/sdk",
3
3
  "license": "MIT",
4
- "version": "2.0.2-b",
4
+ "version": "2.0.3-b",
5
5
  "type": "module",
6
6
  "types": "TODO:dist/framerauth.d.ts",
7
7
  "files": [