UNPKG

@invisiblecities/sanity-edge-fetcher

Version:

Lightweight, Edge Runtime-compatible Sanity client for Next.js and Vercel Edge Functions

32 lines 12.2 kB
"use strict";var ne=Object.create;var P=Object.defineProperty;var re=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var se=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty;var oe=(e,t)=>{for(var n in t)P(e,n,{get:t[n],enumerable:!0})},k=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ae(t))!ie.call(e,r)&&r!==n&&P(e,r,{get:()=>t[r],enumerable:!(a=re(t,r))||a.enumerable});return e};var ce=(e,t,n)=>(n=e!=null?ne(se(e)):{},k(t||!e||!e.__esModule?P(n,"default",{value:e,enumerable:!0}):n,e)),ue=e=>k(P({},"__esModule",{value:!0}),e);var xe={};oe(xe,{cacheConfig:()=>i,config:()=>ee,createCustomFetcher:()=>ve,default:()=>we,fetchers:()=>H,rateLimitConfig:()=>G,realtimeConfig:()=>M,retryConfig:()=>L,sanityConfig:()=>f,warmupQueries:()=>Z});module.exports=ue(xe);var j={0:8203,1:8204,2:8205,3:8290,4:8291,5:8288,6:65279,7:8289,8:119155,9:119156,a:119157,b:119158,c:119159,d:119160,e:119161,f:119162},I={0:8203,1:8204,2:8205,3:65279},de=new Array(4).fill(String.fromCodePoint(I[0])).join("");function R(e){let t=JSON.stringify(e);return`${de}${Array.from(t).map(n=>{let a=n.charCodeAt(0);if(a>255)throw new Error(`Only ASCII edit info can be encoded. Error attempting to encode ${t} on character ${n} (${a})`);return Array.from(a.toString(4).padStart(4,"0")).map(r=>String.fromCodePoint(I[r])).join("")}).join("")}`}function le(e){return!Number.isNaN(Number(e))||/[a-z]/i.test(e)&&!/\d+(?:[-:\/]\d+){2}(?:T\d+(?:[-:\/]\d+){1,2}(\.\d+)?Z?)?/.test(e)?!1:!!Date.parse(e)}function fe(e){try{new URL(e,e.startsWith("/")?"https://acme.com":void 0)}catch{return!1}return!0}function B(e,t,n="auto"){return n===!0||n==="auto"&&(le(e)||fe(e))?e:`${e}${R(t)}`}var Ue=Object.fromEntries(Object.entries(I).map(e=>e.reverse())),De=Object.fromEntries(Object.entries(j).map(e=>e.reverse())),ge=`${Object.values(j).map(e=>`\\u{${e.toString(16)}}`).join("")}`,F=new RegExp(`[${ge}]{4,}`,"gu");function he(e){var t;return{cleaned:e.replace(F,""),encoded:((t=e.match(F))==null?void 0:t[0])||""}}function K(e){return e&&JSON.parse(he(JSON.stringify(e)).cleaned)}var Y=R,V=B,X=K,Q={base4:[8203,8204,8205,65279],hex:{0:8203,1:8204,2:8205,3:8290,4:8291,5:8288,6:65279,7:8289,8:119155,9:119156,a:119157,b:119158,c:119159,d:119160,e:119161,f:119162}},pe=new Array(4).fill(String.fromCodePoint(Q.base4[0])).join("");function ye(e){let t=JSON.stringify(e),n=Array.from(t).map(a=>{let r=a.charCodeAt(0);if(r>255)throw new Error(`Only ASCII can be encoded. Error on character ${a} (${r})`);return Array.from(r.toString(4).padStart(4,"0")).map(s=>{let o=parseInt(s,10);return String.fromCodePoint(Q.base4[o])}).join("")}).join("");return`${pe}${n}`}function me(e){let t=/\d+(?:[-:\/]\d+){2}(?:T\d+(?:[-:\/]\d+){1,2}(\.\d+)?Z?)?/.test(e),n=(()=>{try{return new URL(e,e.startsWith("/")?"https://example.com":void 0),!0}catch{return!1}})(),a=/^(image|file)-[A-Za-z0-9]+-\d+x\d+-[A-Za-z0-9]+$/.test(e);return t||n||a}function Se(e){if(!e.length)return!1;let t=String(e[e.length-1]);return!!(new Set(["_id","_ref","_key","_type","slug","current","asset","path","href","url","src"]).has(t)||e.length>=2&&String(e[e.length-2])==="asset")}function Te(e,t,n){if(!n.enabled||!t||me(e)||typeof e!="string"||e.trim().length===0)return e;try{if(X&&X(e)!==e)return e}catch{}return Y?V?V(e,t,"auto"):`${e}${Y(t)}`:`${e}${ye(t)}`}function v(e,t,n,a=[]){if(!n.enabled||!t||e==null)return e;if(typeof e=="string"){if(Se(a))return e;let r=be(t,a,n);return r&&(r.type===void 0||r.type==="value")?Te(e,r,n):e}if(Array.isArray(e))return e.map((r,s)=>v(r,t,n,[...a,s]));if(typeof e=="object"){let r={};for(let s in e)e.hasOwnProperty(s)&&(r[s]=v(e[s],t,n,[...a,s]));return r}return e}function be(e,t,n){if(!e?.mappings)return null;let a=`$${t.map(s=>typeof s=="number"?`[${s}]`:`['${s}']`).join("")}`;if(e.mappings[a]){let s=e.mappings[a],o=e.studioUrl||n?.studioUrl,d;try{let c=s?.source,l=typeof c?.document=="number"?e.documents?.[c.document]?._id:void 0,S=typeof c?.path=="number"?e.paths?.[c.path]:void 0;if(o&&l){let g=String(o).replace(/\/?presentation\/?$/,"").replace(/\/$/,""),p=S?`;path=${encodeURIComponent(S)}`:"";d=`${g}/intent/edit/id=${encodeURIComponent(l)}${p}`}}catch{}return{_origin:"sanity",projectId:n?.projectId,dataset:n?.dataset,studioUrl:o,path:a,source:e.source,href:d,...s}}let r=a;for(;r.includes("[")||r.includes(".");){let s=Math.max(r.lastIndexOf("["),r.lastIndexOf("."));if(s===-1)break;if(r=r.substring(0,s),e.mappings[r])return{_origin:"sanity",projectId:n?.projectId,dataset:n?.dataset,studioUrl:e.studioUrl,source:e.source,path:r,...e.mappings[r]}}return null}function q(e){if(e?.studioUrl)return e.studioUrl;let t=process.env.NEXT_PUBLIC_SANITY_STUDIO_URL||process.env.SANITY_STUDIO_URL;if(t)return t;if(process.env.NODE_ENV==="development")return"https://localhost:3334/presentation"}function J(e,t){return t?.enabled!==void 0?t.enabled:e||process.env.NODE_ENV==="development"}function z(e,t,n){if(!J(t,n))return e.result;let a=e.result,r=e.resultSourceMap;if(r&&n?.enabled){let s=q(n);s&&r&&(r.studioUrl=s);let o=w(t,n);return v(a,r,o)}return a}function w(e,t){let n=t||{},a=J(e,n),r=q(n),s=n.projectId||process.env.NEXT_PUBLIC_SANITY_PROJECT_ID,o=n.dataset||process.env.NEXT_PUBLIC_SANITY_DATASET;return{enabled:a,...r!==void 0?{studioUrl:r}:{},...n.basePath!==void 0?{basePath:n.basePath}:{},...n.filter!==void 0?{filter:n.filter}:{},...s!==void 0?{projectId:s}:{},...o!==void 0?{dataset:o}:{}}}var Ee=()=>{let e=process.env.NEXT_PUBLIC_SANITY_PROJECT_ID;if(!e)throw new Error("NEXT_PUBLIC_SANITY_PROJECT_ID environment variable is required");return e},_e=process.env.NEXT_PUBLIC_SANITY_API_VERSION||"2025-02-10",Ce=()=>process.env.SANITY_VIEWER_TOKEN||process.env.SANITY_API_READ_TOKEN||process.env.NEXT_PUBLIC_SANITY_VIEWER_TOKEN,x=class{constructor(){this.lastRequest=0;this.minInterval=100}async throttle(){let n=Date.now()-this.lastRequest;if(n<this.minInterval){let a=this.minInterval-n;await new Promise(r=>setTimeout(r,a))}this.lastRequest=Date.now()}},Pe=new x;async function m({dataset:e,query:t,params:n={},useCdn:a=!1,useAuth:r=!1,stega:s}){await Pe.throttle();let o=Ee(),d=r,c=w(d,s),S=(c.enabled?!1:a)?`https://${o}.apicdn.sanity.io`:`https://${o}.api.sanity.io`,g=new URL(`${S}/v${_e}/data/query/${e}`);g.searchParams.set("query",t),r&&g.searchParams.set("perspective","previewDrafts"),c.enabled&&g.searchParams.set("resultSourceMap","true"),Object.entries(n).forEach(([u,te])=>{g.searchParams.set(`$${u}`,JSON.stringify(te))});let p={Accept:"application/json"};if(r){let u=Ce();u&&(p.Authorization=`Bearer ${u}`)}let y=await fetch(g.toString(),{method:"GET",headers:p});if(!y.ok)throw await y.text(),new Error(`Sanity fetch failed: ${y.status} ${y.statusText}`);let T=await y.json();return z(T,d,c)}function b(e,t=!1,n){return(a,r)=>{let s={dataset:e,query:a,useAuth:t,...n!==void 0?{stega:n}:{},...r!==void 0?{params:r}:{}};return m(s)}}var U=require("@upstash/redis");var N=process.env.KV_REST_API_URL||process.env.UPSTASH_REDIS_REST_URL,E=process.env.KV_REST_API_TOKEN||process.env.UPSTASH_REDIS_REST_TOKEN,D=process.env.KV_REST_API_READ_ONLY_TOKEN,Ne=!!(N&&(E||D)),_=null,C=null;if(Ne&&N&&(E||D))try{_=new U.Redis({url:N,token:D||E,automaticDeserialization:!0}),E?C=new U.Redis({url:N,token:E,automaticDeserialization:!0}):C=_}catch{_=null,C=null}function Ae(e,t,n){let a=`sanity:${e}:${t}`;if(!n||Object.keys(n).length===0)return a;let r=Object.keys(n).sort().map(s=>`${s}=${JSON.stringify(n[s])}`).join("&");return`${a}:${r}`}var $=class{constructor(){this.cache=new Map;this.maxSize=100}get(t){let n=this.cache.get(t);return n?Date.now()>n.validUntil?(this.cache.delete(t),null):(this.cache.delete(t),this.cache.set(t,n),n.value):null}set(t,n,a){if(this.cache.size>=this.maxSize&&!this.cache.has(t)){let r=this.cache.keys().next().value;r!==void 0&&this.cache.delete(r)}this.cache.set(t,{value:n,timestamp:Date.now(),validUntil:Date.now()+a*1e3})}delete(t){this.cache.delete(t)}clear(){this.cache.clear()}size(){return this.cache.size}},O=new $;async function Ie(e){let{dataset:t,query:n,params:a,cache:r={}}=e,{ttl:s=60,prefix:o="",force:d=!1,useRedis:c=!0}=r,l=o+Ae(t,n,a);if(!d){let u=O.get(l);if(u!==null)return u}if(!d&&c&&_)try{let u=await _.get(l);if(u&&Date.now()<=u.validUntil)return O.set(l,u.value,s),u.value}catch{}let{cache:S,params:g,...p}=e,y=a!==void 0?{...p,params:a}:{...p},T=await m(y);if(O.set(l,T,s),c&&C)try{let u={value:T,timestamp:Date.now(),validUntil:Date.now()+s*1e3};await C.set(l,u,{ex:s})}catch{}return T}function h(e,t){return(n,a,r)=>Ie({dataset:e,query:n,...a!==void 0?{params:a}:{},cache:{...t||{},...r||{}}})}var A=null,Re=async()=>{if(A)return A;try{return A=await import("p-retry"),A}catch{return null}};async function W(e,t){let n=await Re();if(!n)return m(e);let a={retries:3,minTimeout:100,maxTimeout:2e3,onFailedAttempt:r=>{r.attemptNumber,r.retriesLeft}};return n.default(()=>m(e),{...a,...t})}var f={projectId:process.env.NEXT_PUBLIC_SANITY_PROJECT_ID,apiVersion:process.env.NEXT_PUBLIC_SANITY_API_VERSION||"2025-02-10",dataset:process.env.NEXT_PUBLIC_SANITY_DATASET||"production",token:process.env.SANITY_VIEWER_TOKEN,useCdn:process.env.NODE_ENV==="production"},i={ttl:{default:60,static:3600,dynamic:30,long:86400},prefixes:{page:"page:",post:"post:",author:"author:",category:"cat:",section:"section:",global:"global:"},layers:{memory:{enabled:!0,maxSize:100},redis:{enabled:!!(process.env.KV_REST_API_URL||process.env.UPSTASH_REDIS_REST_URL),url:process.env.KV_REST_API_URL||process.env.UPSTASH_REDIS_REST_URL,token:process.env.KV_REST_API_TOKEN||process.env.UPSTASH_REDIS_REST_TOKEN,readOnlyToken:process.env.KV_REST_API_READ_ONLY_TOKEN},nextCache:{enabled:typeof window>"u"}}},G={minInterval:100,maxRequestsPerSecond:10},L={retries:3,minTimeout:100,maxTimeout:2e3,factor:2},M={sse:{endpoint:"/api/sanity-updates",pollInterval:5e3,heartbeatInterval:3e4},websocket:{endpoint:process.env.NEXT_PUBLIC_WEBSOCKET_URL||"wss://your-worker.workers.dev/ws",reconnectDelay:1e3,maxReconnectAttempts:5}},H={basic:b(f.dataset,!1),authenticated:b(f.dataset,!0),cached:h(f.dataset,{ttl:i.ttl.default,useRedis:i.layers.redis.enabled,useNextCache:i.layers.nextCache.enabled}),static:h(f.dataset,{ttl:i.ttl.long,prefix:i.prefixes.global,useRedis:i.layers.redis.enabled,useNextCache:!0}),dynamic:h(f.dataset,{ttl:i.ttl.dynamic,useRedis:i.layers.redis.enabled,useNextCache:!1}),page:h(f.dataset,{ttl:i.ttl.static,prefix:i.prefixes.page,useRedis:i.layers.redis.enabled,useNextCache:!0}),section:h(f.dataset,{ttl:i.ttl.default,prefix:i.prefixes.section,useRedis:i.layers.redis.enabled,useNextCache:!0})};function ve(e){let{dataset:t=f.dataset,ttl:n=i.ttl.default,prefix:a="",useAuth:r=!1,useCache:s=!0,useRetry:o=!1}=e;return!s&&!o?b(t,r):s&&!o?h(t,{ttl:n,prefix:a,useRedis:i.layers.redis.enabled,useNextCache:i.layers.nextCache.enabled}):async(d,c)=>{let l=s?h(t,{ttl:n,prefix:a}):b(t,r);return o?W({dataset:t,query:d,params:c,useAuth:r},L):l(d,c)}}var Z=[{query:'*[_type == "siteSettings"][0]',ttl:i.ttl.long,fetcher:"static"},{query:'*[_type == "navigation"][0]',ttl:i.ttl.long,fetcher:"static"},{query:'*[_type == "post"] | order(_createdAt desc)[0..10]',ttl:i.ttl.default,fetcher:"cached"},{query:'*[_type == "page" && slug.current == "home"][0]',ttl:i.ttl.static,fetcher:"page"}],ee={sanity:f,cache:i,rateLimit:G,retry:L,realtime:M,fetchers:H,warmupQueries:Z},we=ee; /** * @file stega.ts * @description Stega encoding support for visual editing with optional @vercel/stega dependency * @author Invisible Cities Agency * @license MIT */ /** * @file core.ts * @description Next.js-native, edge-compatible Sanity data fetcher with stega support * @author Invisible Cities Agency * @license MIT */ /** * @file cache.ts * @description Multi-layer caching for Sanity Edge Fetcher * @author Invisible Cities Agency * @license MIT */ /** * @file enhanced.ts * @description Enhanced Sanity fetcher with retry and real-time capabilities * @author Invisible Cities Agency * @license MIT */ /** * @file config.ts * @description Centralized configuration for Sanity Edge Fetcher * @author Invisible Cities Agency * @license MIT */ //# sourceMappingURL=config.cjs.map