@zeno-cms/sdk 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/angular.js CHANGED
@@ -1,8 +1,8 @@
1
- 'use strict';var core=require('@angular/core'),supabaseJs=require('@supabase/supabase-js');var Z={endpoint:"https://kvpowojjhuprhxdyzmml.supabase.co",publicKey:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Imt2cG93b2pqaHVwcmh4ZHl6bW1sIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTI3ODEwNzAsImV4cCI6MjA2ODM1NzA3MH0.cCPzDNdfTb3WBtYL79GBlw4hfypl4tjnqu7XfEvdKBg"};function n(r,t=null,s){let e=null;return t&&(typeof t=="string"?e=t:t instanceof Error?e=t.message:typeof t=="object"&&t!==null&&"message"in t&&(e=String(t.message))),{data:r,error:e,meta:{...s,timestamp:new Date().toISOString()}}}var A=class{constructor(t={}){this.projectId=null;this.isValidated=false;this.resolvedDefaultLocale=null;let s=t.apiKey||this.getEnvApiKey();if(!s)throw new Error("Missing API key. Provide it via config.apiKey or set an environment variable: ZENO_API_KEY, VITE_ZENO_API_KEY, NEXT_PUBLIC_ZENO_API_KEY, or PUBLIC_ZENO_API_KEY.");let e=this.parseApiKey(s);this.apiKey=s,this.projectSlug=e.projectSlug,this.apiToken=e.token,this.configDefaultLocale=t.defaultLocale,this.supabase=supabaseJs.createClient(Z.endpoint,Z.publicKey,{auth:{persistSession:false,autoRefreshToken:false}});}getEnvApiKey(){let t=["ZENO_API_KEY","NEXT_PUBLIC_ZENO_API_KEY","VITE_ZENO_API_KEY","PUBLIC_ZENO_API_KEY"],s=["ZENO_API_KEY","VITE_ZENO_API_KEY","PUBLIC_ZENO_API_KEY","NEXT_PUBLIC_ZENO_API_KEY"];if(typeof process<"u"&&process.env){for(let e of t)if(process.env[e])return process.env[e]}try{let e=undefined;if(e){for(let a of s)if(e[a])return e[a]}}catch{}}parseApiKey(t){if(!t.startsWith("zeno_"))throw new Error("Invalid API key format. Expected: zeno_<projectSlug>_<token>");let s=t.slice(5),e=s.indexOf("_");if(e===-1)throw new Error("Invalid API key format. Expected: zeno_<projectSlug>_<token>");let a=s.slice(0,e),o=s.slice(e+1);if(!a||!o)throw new Error("Invalid API key format. Expected: zeno_<projectSlug>_<token>");return {projectSlug:a,token:o}}async getDefaultLocale(){if(this.configDefaultLocale)return this.configDefaultLocale;if(this.resolvedDefaultLocale)return this.resolvedDefaultLocale;try{let t=await this.resolveProjectId(),{data:s}=await this.supabase.from("project_locales").select("locale_code").eq("project_id",t).eq("is_default",!0).single();if(s?.locale_code)return this.resolvedDefaultLocale=s.locale_code,s.locale_code}catch{}return this.resolvedDefaultLocale="en","en"}async resolveProjectId(){if(this.projectId&&this.isValidated)return this.projectId;let{data:t,error:s}=await this.supabase.rpc("validate_sdk_api_key",{p_project_slug:this.projectSlug,p_token:this.apiToken});if(s)throw new Error("API key validation failed: "+s.message);let e=t?.[0];if(!e||!e.is_valid)throw new Error(e?.error_message||"Invalid API key or project not found");return this.projectId=e.project_id,this.isValidated=true,e.project_id}async getProject(){try{let t=await this.resolveProjectId(),{data:s,error:e}=await this.supabase.from("projects").select("id, name, description, slug, status, created_at, updated_at").eq("id",t).single();return n(s,e)}catch(t){return n(null,t)}}async getCollections(t={}){try{let s=await this.resolveProjectId(),{page:e=1,limit:a=50,sortBy:o="created_at",sortOrder:g="desc"}=t,m=(e-1)*a,{count:d}=await this.supabase.from("collections").select("*",{count:"exact",head:!0}).eq("project_id",s),{data:i,error:u}=await this.supabase.from("collections").select("id, name, slug, description, fields, created_at, updated_at").eq("project_id",s).order(o,{ascending:g==="asc"}).range(m,m+a-1),P=i?.map(l=>({...l,fields:typeof l.fields=="string"?JSON.parse(l.fields):l.fields}));return n(P,u,{total:d||0,page:e,limit:a,totalPages:Math.ceil((d||0)/a)})}catch(s){return n(null,s)}}async getCollection(t){try{let s=await this.resolveProjectId(),{data:e,error:a}=await this.supabase.from("collections").select("id, name, slug, description, fields, created_at, updated_at").eq("project_id",s).eq("slug",t).single(),o=e?{...e,fields:typeof e.fields=="string"?JSON.parse(e.fields):e.fields}:null;return n(o,a)}catch(s){return n(null,s)}}async getEntries(t,s={}){try{let e=await this.resolveProjectId(),{page:a=1,limit:o=50,sortBy:g="created_at",sortOrder:m="desc",status:d,search:i,locale:u,fallback_locale:P,dateFrom:l,dateTo:y,dateField:p}=s,v=P||await this.getDefaultLocale(),q=(a-1)*o,f=this.supabase.from("entries").select(`
1
+ 'use strict';var core=require('@angular/core'),supabaseJs=require('@supabase/supabase-js');var k={endpoint:"https://kvpowojjhuprhxdyzmml.supabase.co",publicKey:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Imt2cG93b2pqaHVwcmh4ZHl6bW1sIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTI3ODEwNzAsImV4cCI6MjA2ODM1NzA3MH0.cCPzDNdfTb3WBtYL79GBlw4hfypl4tjnqu7XfEvdKBg"};function n(r,e=null,a){let t=null;return e&&(typeof e=="string"?t=e:e instanceof Error?t=e.message:typeof e=="object"&&e!==null&&"message"in e&&(t=String(e.message))),{data:r,error:t,meta:{...a,timestamp:new Date().toISOString()}}}var b=class{constructor(e={}){this.projectId=null;this.isValidated=false;this.resolvedDefaultLocale=null;let a=e.apiKey||this.getEnvApiKey();if(!a)throw new Error("Missing API key. Provide it via config.apiKey or set an environment variable: ZENO_API_KEY, VITE_ZENO_API_KEY, NEXT_PUBLIC_ZENO_API_KEY, or PUBLIC_ZENO_API_KEY.");let t=this.parseApiKey(a);this.apiKey=a,this.projectSlug=t.projectSlug,this.apiToken=t.token,this.configDefaultLocale=e.defaultLocale,this.supabase=supabaseJs.createClient(k.endpoint,k.publicKey,{auth:{persistSession:false,autoRefreshToken:false}});}getEnvApiKey(){if(typeof process<"u"&&process.env){if(process.env.ZENO_API_KEY)return process.env.ZENO_API_KEY;if(process.env.NEXT_PUBLIC_ZENO_API_KEY)return process.env.NEXT_PUBLIC_ZENO_API_KEY;if(process.env.VITE_ZENO_API_KEY)return process.env.VITE_ZENO_API_KEY;if(process.env.PUBLIC_ZENO_API_KEY)return process.env.PUBLIC_ZENO_API_KEY}try{if(undefined?.ZENO_API_KEY)return undefined.ZENO_API_KEY;if(undefined?.VITE_ZENO_API_KEY)return undefined.VITE_ZENO_API_KEY;if(undefined?.PUBLIC_ZENO_API_KEY)return undefined.PUBLIC_ZENO_API_KEY;if(undefined?.NEXT_PUBLIC_ZENO_API_KEY)return undefined.NEXT_PUBLIC_ZENO_API_KEY}catch{}}parseApiKey(e){if(!e.startsWith("zeno_"))throw new Error("Invalid API key format. Expected: zeno_<projectSlug>_<token>");let a=e.slice(5),t=a.indexOf("_");if(t===-1)throw new Error("Invalid API key format. Expected: zeno_<projectSlug>_<token>");let s=a.slice(0,t),o=a.slice(t+1);if(!s||!o)throw new Error("Invalid API key format. Expected: zeno_<projectSlug>_<token>");return {projectSlug:s,token:o}}async getDefaultLocale(){if(this.configDefaultLocale)return this.configDefaultLocale;if(this.resolvedDefaultLocale)return this.resolvedDefaultLocale;try{let e=await this.resolveProjectId(),{data:a}=await this.supabase.from("project_locales").select("locale_code").eq("project_id",e).eq("is_default",!0).single();if(a?.locale_code)return this.resolvedDefaultLocale=a.locale_code,a.locale_code}catch{}return this.resolvedDefaultLocale="en","en"}async resolveProjectId(){if(this.projectId&&this.isValidated)return this.projectId;let{data:e,error:a}=await this.supabase.rpc("validate_sdk_api_key",{p_project_slug:this.projectSlug,p_token:this.apiToken});if(a)throw new Error("API key validation failed: "+a.message);let t=e?.[0];if(!t||!t.is_valid)throw new Error(t?.error_message||"Invalid API key or project not found");return this.projectId=t.project_id,this.isValidated=true,t.project_id}async getProject(){try{let e=await this.resolveProjectId(),{data:a,error:t}=await this.supabase.from("projects").select("id, name, description, slug, status, created_at, updated_at").eq("id",e).single();return n(a,t)}catch(e){return n(null,e)}}async getCollections(e={}){try{let a=await this.resolveProjectId(),{page:t=1,limit:s=50,sortBy:o="created_at",sortOrder:m="desc"}=e,g=(t-1)*s,{count:u}=await this.supabase.from("collections").select("*",{count:"exact",head:!0}).eq("project_id",a),{data:i,error:d}=await this.supabase.from("collections").select("id, name, slug, description, fields, created_at, updated_at").eq("project_id",a).order(o,{ascending:m==="asc"}).range(g,g+s-1),P=i?.map(l=>({...l,fields:typeof l.fields=="string"?JSON.parse(l.fields):l.fields}));return n(P,d,{total:u||0,page:t,limit:s,totalPages:Math.ceil((u||0)/s)})}catch(a){return n(null,a)}}async getCollection(e){try{let a=await this.resolveProjectId(),{data:t,error:s}=await this.supabase.from("collections").select("id, name, slug, description, fields, created_at, updated_at").eq("project_id",a).eq("slug",e).single(),o=t?{...t,fields:typeof t.fields=="string"?JSON.parse(t.fields):t.fields}:null;return n(o,s)}catch(a){return n(null,a)}}async getEntries(e,a={}){try{let t=await this.resolveProjectId(),{page:s=1,limit:o=50,sortBy:m="created_at",sortOrder:g="desc",status:u,search:i,locale:d,fallback_locale:P,dateFrom:l,dateTo:y,dateField:p}=a,I=P||await this.getDefaultLocale(),N=(s-1)*o,f=this.supabase.from("entries").select(`
2
2
  id, data, status, collection_id, project_id, created_at, updated_at,
3
3
  collections ( id, name, slug )
4
- `).eq("project_id",e);if(t){let{data:c}=await this.supabase.from("collections").select("id").eq("project_id",e).eq("slug",t).single();if(!c)return n(null,"Collection not found");f=f.eq("collection_id",c.id);}d&&(f=f.eq("status",d)),i&&(f=f.textSearch("data",i)),l&&(f=p?f.gte(`data->${p}`,l):f.gte("created_at",l)),y&&(f=p?f.lte(`data->${p}`,y):f.lte("created_at",y));let _=this.supabase.from("entries").select("*",{count:"exact",head:!0}).eq("project_id",e);if(t){let{data:c}=await this.supabase.from("collections").select("id").eq("project_id",e).eq("slug",t).single();c&&(_=_.eq("collection_id",c.id));}d&&(_=_.eq("status",d)),i&&(_=_.textSearch("data",i)),l&&(_=p?_.gte(`data->${p}`,l):_.gte("created_at",l)),y&&(_=p?_.lte(`data->${p}`,y):_.lte("created_at",y));let{count:N}=await _,{data:T,error:O}=await f.order(g,{ascending:m==="asc"}).range(q,q+o-1);if(O)throw O;let I=(T??[]).map(c=>({...c,collections:Array.isArray(c.collections)?c.collections[0]:c.collections})),R=I,K=!1;if(u&&I.length>0)try{let c=I.map(w=>w.id),k=await this.supabase.rpc("get_localized_entries_batch",{entry_uuids:c,locale:u,fallback_locale:v});if(k.data&&k.data.length>0){let w=new Map;for(let E of k.data)w.set(E.entry_id,{data:E.data,locale_code:E.locale_code,is_fallback:E.is_fallback});R=I.map(E=>{let b=w.get(E.id);return b?(b.is_fallback&&(K=!0),{...E,data:b.data,locale_code:b.locale_code}):E});}}catch{}let{data:x}=await this.supabase.from("project_locales").select("locale_code").eq("project_id",e).eq("is_active",!0);return n(R,null,{total:N||0,page:a,limit:o,totalPages:Math.ceil((N||0)/o),locale:u||v,fallback_used:K,available_locales:x?.map(c=>c.locale_code)||[]})}catch(e){return n(null,e)}}async getEntry(t,s={}){try{let e=await this.resolveProjectId(),{locale:a,fallback_locale:o}=s,g=o||await this.getDefaultLocale(),{data:m,error:d}=await this.supabase.from("entries").select(`
4
+ `).eq("project_id",t);if(e){let{data:c}=await this.supabase.from("collections").select("id").eq("project_id",t).eq("slug",e).single();if(!c)return n(null,"Collection not found");f=f.eq("collection_id",c.id);}u&&(f=f.eq("status",u)),i&&(f=f.textSearch("data",i)),l&&(f=p?f.gte(`data->${p}`,l):f.gte("created_at",l)),y&&(f=p?f.lte(`data->${p}`,y):f.lte("created_at",y));let _=this.supabase.from("entries").select("*",{count:"exact",head:!0}).eq("project_id",t);if(e){let{data:c}=await this.supabase.from("collections").select("id").eq("project_id",t).eq("slug",e).single();c&&(_=_.eq("collection_id",c.id));}u&&(_=_.eq("status",u)),i&&(_=_.textSearch("data",i)),l&&(_=p?_.gte(`data->${p}`,l):_.gte("created_at",l)),y&&(_=p?_.lte(`data->${p}`,y):_.lte("created_at",y));let{count:O}=await _,{data:R,error:K}=await f.order(m,{ascending:g==="asc"}).range(N,N+o-1);if(K)throw K;let j=(R??[]).map(c=>({...c,collections:Array.isArray(c.collections)?c.collections[0]:c.collections})),T=j,q=!1;if(d&&j.length>0)try{let c=j.map(A=>A.id),Z=await this.supabase.rpc("get_localized_entries_batch",{entry_uuids:c,locale:d,fallback_locale:I});if(Z.data&&Z.data.length>0){let A=new Map;for(let E of Z.data)A.set(E.entry_id,{data:E.data,locale_code:E.locale_code,is_fallback:E.is_fallback});T=j.map(E=>{let w=A.get(E.id);return w?(w.is_fallback&&(q=!0),{...E,data:w.data,locale_code:w.locale_code}):E});}}catch{}let{data:x}=await this.supabase.from("project_locales").select("locale_code").eq("project_id",t).eq("is_active",!0);return n(T,null,{total:O||0,page:s,limit:o,totalPages:Math.ceil((O||0)/o),locale:d||I,fallback_used:q,available_locales:x?.map(c=>c.locale_code)||[]})}catch(t){return n(null,t)}}async getEntry(e,a={}){try{let t=await this.resolveProjectId(),{locale:s,fallback_locale:o}=a,m=o||await this.getDefaultLocale(),{data:g,error:u}=await this.supabase.from("entries").select(`
5
5
  id, data, status, collection_id, project_id, created_at, updated_at,
6
6
  collections ( id, name, slug, fields )
7
- `).eq("project_id",e).eq("id",t).single();if(d)throw d;let i=m,u=i?{...i,collections:Array.isArray(i.collections)?i.collections[0]:i.collections}:null,P=u,l=!1;if(a&&u)try{let p=await this.supabase.rpc("get_localized_entry",{entry_uuid:t,locale:a,fallback_locale:g});if(p.data?.[0]){let v=p.data[0];v.locale_code!==a&&(l=!0),P={...u,data:v.data,locale_code:v.locale_code};}}catch{}let{data:y}=await this.supabase.from("project_locales").select("locale_code").eq("project_id",e).eq("is_active",!0);return n(P,null,{locale:a||g,fallback_used:l,available_locales:y?.map(p=>p.locale_code)||[]})}catch(e){return n(null,e)}}async getAssets(t={}){try{let s=await this.resolveProjectId(),{page:e=1,limit:a=50,sortBy:o="created_at",sortOrder:g="desc",mimeType:m}=t,d=(e-1)*a,i=this.supabase.from("assets").select("id, filename, original_filename, mime_type, size_bytes, metadata, created_at").eq("project_id",s);m&&(i=i.like("mime_type",`${m}%`));let u=this.supabase.from("assets").select("*",{count:"exact",head:!0}).eq("project_id",s);m&&(u=u.like("mime_type",`${m}%`));let{count:P}=await u,{data:l,error:y}=await i.order(o,{ascending:g==="asc"}).range(d,d+a-1);return n(l,y,{total:P||0,page:e,limit:a,totalPages:Math.ceil((P||0)/a)})}catch(s){return n(null,s)}}async getAssetUrl(t){try{let s=await this.resolveProjectId(),{data:e,error:a}=await this.supabase.from("assets").select("storage_path").eq("project_id",s).eq("id",t).single();if(a||!e)return n(null,"Asset not found");let{data:o,error:g}=await this.supabase.storage.from("assets").createSignedUrl(e.storage_path,3600);return g?n(null,g):n({downloadUrl:o.signedUrl,expiresIn:3600})}catch(s){return n(null,s)}}async sendEmail(t){try{let s=await fetch(`${Z.endpoint}/functions/v1/api/email/send`,{method:"POST",headers:{Authorization:`Bearer ${this.apiKey}`,"X-API-Key":this.apiKey,"Content-Type":"application/json"},body:JSON.stringify(t)}),e=await s.json();return s.ok?n(e.data):n(null,e.error||"Email sending failed")}catch(s){return n(null,s)}}async getLocales(){try{let t=await this.resolveProjectId(),{data:s,error:e}=await this.supabase.from("project_locales").select("locale_code, locale_name, locale_native_name, is_default").eq("project_id",t).eq("is_active",!0).order("is_default",{ascending:!1}).order("locale_name",{ascending:!0});if(e)throw e;let a=s?.map(o=>({code:o.locale_code,name:o.locale_name,native_name:o.locale_native_name,is_default:o.is_default}))||[];return n(a)}catch(t){return n(null,t)}}async health(){return n({status:"healthy",version:"1.0.0"})}};var C=new core.InjectionToken("ZenoCMS");function Q(r={}){return core.makeEnvironmentProviders([{provide:C,useFactory:()=>new A({apiKey:r.apiKey,defaultLocale:r.defaultLocale})}])}function h(){return core.inject(C)}function j(r){let t=core.signal(null),s=core.signal(null),e=core.signal(true),a=async()=>{e.set(true),s.set(null);try{let o=await r();t.set(o.data),s.set(o.error);}catch(o){s.set(o instanceof Error?o.message:String(o)),t.set(null);}finally{e.set(false);}};return a(),{data:t.asReadonly(),error:s.asReadonly(),loading:e.asReadonly(),refresh:a}}function Y(r,t){let s=h();return j(()=>s.getEntries(r,t))}function B(r,t){let s=h();return j(()=>s.getEntry(r,t))}function M(r){let t=h();return j(()=>t.getCollections(r))}function F(r){let t=h();return j(()=>t.getCollection(r))}function $(r){let t=h();return j(()=>t.getAssets(r))}function V(r){let t=h();return j(()=>t.getAssetUrl(r))}function X(){let r=h();return j(()=>r.getProject())}function H(){let r=h();return j(()=>r.getLocales())}exports.ZENO_CLIENT=C;exports.injectZeno=h;exports.provideZeno=Q;exports.useAssetUrl=V;exports.useAssets=$;exports.useCollection=F;exports.useCollections=M;exports.useEntries=Y;exports.useEntry=B;exports.useLocales=H;exports.useProject=X;//# sourceMappingURL=angular.js.map
7
+ `).eq("project_id",t).eq("id",e).single();if(u)throw u;let i=g,d=i?{...i,collections:Array.isArray(i.collections)?i.collections[0]:i.collections}:null,P=d,l=!1;if(s&&d)try{let p=await this.supabase.rpc("get_localized_entry",{entry_uuid:e,locale:s,fallback_locale:m});if(p.data?.[0]){let I=p.data[0];I.locale_code!==s&&(l=!0),P={...d,data:I.data,locale_code:I.locale_code};}}catch{}let{data:y}=await this.supabase.from("project_locales").select("locale_code").eq("project_id",t).eq("is_active",!0);return n(P,null,{locale:s||m,fallback_used:l,available_locales:y?.map(p=>p.locale_code)||[]})}catch(t){return n(null,t)}}async getAssets(e={}){try{let a=await this.resolveProjectId(),{page:t=1,limit:s=50,sortBy:o="created_at",sortOrder:m="desc",mimeType:g}=e,u=(t-1)*s,i=this.supabase.from("assets").select("id, filename, original_filename, mime_type, size_bytes, metadata, created_at").eq("project_id",a);g&&(i=i.like("mime_type",`${g}%`));let d=this.supabase.from("assets").select("*",{count:"exact",head:!0}).eq("project_id",a);g&&(d=d.like("mime_type",`${g}%`));let{count:P}=await d,{data:l,error:y}=await i.order(o,{ascending:m==="asc"}).range(u,u+s-1);return n(l,y,{total:P||0,page:t,limit:s,totalPages:Math.ceil((P||0)/s)})}catch(a){return n(null,a)}}async getAssetUrl(e){try{let a=await this.resolveProjectId(),{data:t,error:s}=await this.supabase.from("assets").select("storage_path").eq("project_id",a).eq("id",e).single();if(s||!t)return n(null,"Asset not found");let{data:o,error:m}=await this.supabase.storage.from("assets").createSignedUrl(t.storage_path,3600);return m?n(null,m):n({downloadUrl:o.signedUrl,expiresIn:3600})}catch(a){return n(null,a)}}async sendEmail(e){try{let a=await fetch(`${k.endpoint}/functions/v1/api/email/send`,{method:"POST",headers:{Authorization:`Bearer ${this.apiKey}`,"X-API-Key":this.apiKey,"Content-Type":"application/json"},body:JSON.stringify(e)}),t=await a.json();return a.ok?n(t.data):n(null,t.error||"Email sending failed")}catch(a){return n(null,a)}}async getLocales(){try{let e=await this.resolveProjectId(),{data:a,error:t}=await this.supabase.from("project_locales").select("locale_code, locale_name, locale_native_name, is_default").eq("project_id",e).eq("is_active",!0).order("is_default",{ascending:!1}).order("locale_name",{ascending:!0});if(t)throw t;let s=a?.map(o=>({code:o.locale_code,name:o.locale_name,native_name:o.locale_native_name,is_default:o.is_default}))||[];return n(s)}catch(e){return n(null,e)}}async health(){return n({status:"healthy",version:"1.0.0"})}};var C=new core.InjectionToken("ZenoCMS");function D(r={}){return core.makeEnvironmentProviders([{provide:C,useFactory:()=>new b({apiKey:r.apiKey,defaultLocale:r.defaultLocale})}])}function h(){return core.inject(C)}function v(r){let e=core.signal(null),a=core.signal(null),t=core.signal(true),s=async()=>{t.set(true),a.set(null);try{let o=await r();e.set(o.data),a.set(o.error);}catch(o){a.set(o instanceof Error?o.message:String(o)),e.set(null);}finally{t.set(false);}};return s(),{data:e.asReadonly(),error:a.asReadonly(),loading:t.asReadonly(),refresh:s}}function B(r,e){let a=h();return v(()=>a.getEntries(r,e))}function Q(r,e){let a=h();return v(()=>a.getEntry(r,e))}function M(r){let e=h();return v(()=>e.getCollections(r))}function F(r){let e=h();return v(()=>e.getCollection(r))}function V(r){let e=h();return v(()=>e.getAssets(r))}function $(r){let e=h();return v(()=>e.getAssetUrl(r))}function X(){let r=h();return v(()=>r.getProject())}function H(){let r=h();return v(()=>r.getLocales())}exports.ZENO_CLIENT=C;exports.injectZeno=h;exports.provideZeno=D;exports.useAssetUrl=$;exports.useAssets=V;exports.useCollection=F;exports.useCollections=M;exports.useEntries=B;exports.useEntry=Q;exports.useLocales=H;exports.useProject=X;//# sourceMappingURL=angular.js.map
8
8
  //# sourceMappingURL=angular.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/angular/provider.ts","../src/angular/signals.ts"],"names":["ZENO_INTERNAL","createResponse","data","error","meta","errorMessage","ZenoCMS","config","apiKey","parsed","createClient","processEnvKeys","importMetaKeys","key","metaEnv","withoutPrefix","separatorIndex","projectSlug","token","projectId","result","params","page","limit","sortBy","sortOrder","offset","count","processedData","c","slug","collectionSlug","status","search","locale","fallback_locale","dateFrom","dateTo","dateField","effectiveFallback","query","collection","countQuery","normalized","row","fallbackUsed","entryIds","e","localeMap","loc","entry","localized","availableLocales","l","entryId","mimeType","assetId","asset","assetError","urlData","urlError","emailParams","response","ZENO_CLIENT","InjectionToken","provideZeno","options","makeEnvironmentProviders","injectZeno","inject","useAsyncQuery","fetcher","signal","loading","execute","err","useEntries","zeno","useEntry","useCollections","useCollection","useAssets","useAssetUrl","useProject","useLocales"],"mappings":"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","file":"angular.js","sourcesContent":["import { createClient, type SupabaseClient } from '@supabase/supabase-js';\r\nimport type {\r\n ZenoConfig,\r\n ZenoResponse,\r\n PaginationParams,\r\n FilterParams,\r\n EmailParams,\r\n Collection,\r\n Entry,\r\n Asset,\r\n AssetUrl,\r\n Locale,\r\n Project,\r\n HealthStatus,\r\n} from './types';\r\n\r\n// Internal configuration - injected at build time from environment variables\r\nconst ZENO_INTERNAL = {\r\n endpoint: process.env.ZENO_ENDPOINT!,\r\n publicKey: process.env.ZENO_PUBLIC_KEY!,\r\n};\r\n\r\nfunction createResponse<T>(\r\n data: T | null,\r\n error: unknown = null,\r\n meta?: Omit<NonNullable<ZenoResponse<T>['meta']>, 'timestamp'>\r\n): ZenoResponse<T> {\r\n let errorMessage: string | null = null;\r\n if (error) {\r\n if (typeof error === 'string') errorMessage = error;\r\n else if (error instanceof Error) errorMessage = error.message;\r\n else if (typeof error === 'object' && error !== null && 'message' in error) {\r\n errorMessage = String((error as { message: unknown }).message);\r\n }\r\n }\r\n\r\n return {\r\n data,\r\n error: errorMessage,\r\n meta: {\r\n ...meta,\r\n timestamp: new Date().toISOString(),\r\n },\r\n };\r\n}\r\n\r\nexport class ZenoCMS {\r\n private supabase: SupabaseClient;\r\n private apiKey: string;\r\n private projectSlug: string;\r\n private apiToken: string;\r\n private projectId: string | null = null;\r\n private isValidated: boolean = false;\r\n private configDefaultLocale: string | undefined;\r\n private resolvedDefaultLocale: string | null = null;\r\n\r\n constructor(config: ZenoConfig = {}) {\r\n // Resolve API key: explicit config > environment variable\r\n const apiKey = config.apiKey || this.getEnvApiKey();\r\n\r\n if (!apiKey) {\r\n throw new Error(\r\n 'Missing API key. Provide it via config.apiKey or set an environment variable: ' +\r\n 'ZENO_API_KEY, VITE_ZENO_API_KEY, NEXT_PUBLIC_ZENO_API_KEY, or PUBLIC_ZENO_API_KEY.'\r\n );\r\n }\r\n\r\n // Parse and validate API key format: zeno_<projectSlug>_<token>\r\n const parsed = this.parseApiKey(apiKey);\r\n this.apiKey = apiKey;\r\n this.projectSlug = parsed.projectSlug;\r\n this.apiToken = parsed.token;\r\n this.configDefaultLocale = config.defaultLocale;\r\n\r\n this.supabase = createClient(ZENO_INTERNAL.endpoint, ZENO_INTERNAL.publicKey, {\r\n auth: {\r\n persistSession: false,\r\n autoRefreshToken: false,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Reads the API key from environment variables.\r\n * Checks multiple naming conventions so each framework only needs one .env variable:\r\n * ZENO_API_KEY — Node.js / server-side\r\n * NEXT_PUBLIC_ZENO_API_KEY — Next.js client\r\n * VITE_ZENO_API_KEY — Vite (React, Vue, Svelte)\r\n * PUBLIC_ZENO_API_KEY — Astro client\r\n */\r\n private getEnvApiKey(): string | undefined {\r\n const processEnvKeys = [\r\n 'ZENO_API_KEY',\r\n 'NEXT_PUBLIC_ZENO_API_KEY',\r\n 'VITE_ZENO_API_KEY',\r\n 'PUBLIC_ZENO_API_KEY',\r\n ];\r\n\r\n const importMetaKeys = [\r\n 'ZENO_API_KEY',\r\n 'VITE_ZENO_API_KEY',\r\n 'PUBLIC_ZENO_API_KEY',\r\n 'NEXT_PUBLIC_ZENO_API_KEY',\r\n ];\r\n\r\n // Node.js / Next.js (process.env)\r\n if (typeof process !== 'undefined' && process.env) {\r\n for (const key of processEnvKeys) {\r\n if (process.env[key]) return process.env[key];\r\n }\r\n }\r\n\r\n // Vite / Astro / SvelteKit (import.meta.env)\r\n try {\r\n // @ts-expect-error - import.meta.env may not exist in all environments\r\n const metaEnv = import.meta?.env;\r\n if (metaEnv) {\r\n for (const key of importMetaKeys) {\r\n if (metaEnv[key]) return metaEnv[key];\r\n }\r\n }\r\n } catch {\r\n // import.meta not available\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Parse and validate the API key format.\r\n * Expected format: zeno_<projectSlug>_<token>\r\n */\r\n private parseApiKey(apiKey: string): { projectSlug: string; token: string } {\r\n if (!apiKey.startsWith('zeno_')) {\r\n throw new Error('Invalid API key format. Expected: zeno_<projectSlug>_<token>');\r\n }\r\n\r\n const withoutPrefix = apiKey.slice(5); // Remove 'zeno_'\r\n const separatorIndex = withoutPrefix.indexOf('_');\r\n\r\n if (separatorIndex === -1) {\r\n throw new Error('Invalid API key format. Expected: zeno_<projectSlug>_<token>');\r\n }\r\n\r\n const projectSlug = withoutPrefix.slice(0, separatorIndex);\r\n const token = withoutPrefix.slice(separatorIndex + 1);\r\n\r\n if (!projectSlug || !token) {\r\n throw new Error('Invalid API key format. Expected: zeno_<projectSlug>_<token>');\r\n }\r\n\r\n return { projectSlug, token };\r\n }\r\n\r\n /**\r\n * Returns the fallback locale to use.\r\n * Priority: config.defaultLocale > project's default locale from DB > 'en'.\r\n */\r\n private async getDefaultLocale(): Promise<string> {\r\n if (this.configDefaultLocale) return this.configDefaultLocale;\r\n if (this.resolvedDefaultLocale) return this.resolvedDefaultLocale;\r\n\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n const { data } = await this.supabase\r\n .from('project_locales')\r\n .select('locale_code')\r\n .eq('project_id', projectId)\r\n .eq('is_default', true)\r\n .single();\r\n\r\n if (data?.locale_code) {\r\n this.resolvedDefaultLocale = data.locale_code;\r\n return data.locale_code;\r\n }\r\n } catch {\r\n // Fall through to 'en'\r\n }\r\n\r\n this.resolvedDefaultLocale = 'en';\r\n return 'en';\r\n }\r\n\r\n /**\r\n * Resolves and validates the project ID using the API key.\r\n * Validates the token server-side for security.\r\n */\r\n private async resolveProjectId(): Promise<string> {\r\n // Return cached project ID if already validated\r\n if (this.projectId && this.isValidated) return this.projectId;\r\n\r\n // Call server-side validation function\r\n const { data, error } = await this.supabase.rpc('validate_sdk_api_key', {\r\n p_project_slug: this.projectSlug,\r\n p_token: this.apiToken,\r\n });\r\n\r\n if (error) {\r\n throw new Error('API key validation failed: ' + error.message);\r\n }\r\n\r\n // The RPC returns a single row with project_id, is_valid, error_message\r\n const result = data?.[0];\r\n\r\n if (!result || !result.is_valid) {\r\n throw new Error(result?.error_message || 'Invalid API key or project not found');\r\n }\r\n\r\n this.projectId = result.project_id;\r\n this.isValidated = true;\r\n return result.project_id;\r\n }\r\n\r\n /** Get project information */\r\n async getProject(): Promise<ZenoResponse<Project>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n\r\n const { data, error } = await this.supabase\r\n .from('projects')\r\n .select('id, name, description, slug, status, created_at, updated_at')\r\n .eq('id', projectId)\r\n .single();\r\n\r\n return createResponse(data, error);\r\n } catch (error) {\r\n return createResponse<Project>(null, error);\r\n }\r\n }\r\n\r\n /** Get all collections for the project */\r\n async getCollections(params: PaginationParams = {}): Promise<ZenoResponse<Collection[]>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n const { page = 1, limit = 50, sortBy = 'created_at', sortOrder = 'desc' } = params;\r\n const offset = (page - 1) * limit;\r\n\r\n const { count } = await this.supabase\r\n .from('collections')\r\n .select('*', { count: 'exact', head: true })\r\n .eq('project_id', projectId);\r\n\r\n const { data, error } = await this.supabase\r\n .from('collections')\r\n .select('id, name, slug, description, fields, created_at, updated_at')\r\n .eq('project_id', projectId)\r\n .order(sortBy, { ascending: sortOrder === 'asc' })\r\n .range(offset, offset + limit - 1);\r\n\r\n const processedData = data?.map((c) => ({\r\n ...c,\r\n fields: typeof c.fields === 'string' ? JSON.parse(c.fields) : c.fields,\r\n }));\r\n\r\n return createResponse(processedData as Collection[] | null, error, {\r\n total: count || 0,\r\n page,\r\n limit,\r\n totalPages: Math.ceil((count || 0) / limit),\r\n });\r\n } catch (error) {\r\n return createResponse<Collection[]>(null, error);\r\n }\r\n }\r\n\r\n /** Get a single collection by slug */\r\n async getCollection(slug: string): Promise<ZenoResponse<Collection>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n\r\n const { data, error } = await this.supabase\r\n .from('collections')\r\n .select('id, name, slug, description, fields, created_at, updated_at')\r\n .eq('project_id', projectId)\r\n .eq('slug', slug)\r\n .single();\r\n\r\n const processedData = data\r\n ? { ...data, fields: typeof data.fields === 'string' ? JSON.parse(data.fields) : data.fields }\r\n : null;\r\n\r\n return createResponse(processedData as Collection | null, error);\r\n } catch (error) {\r\n return createResponse<Collection>(null, error);\r\n }\r\n }\r\n\r\n /** Get entries, optionally filtered by collection slug */\r\n async getEntries(\r\n collectionSlug?: string,\r\n params: PaginationParams & FilterParams = {}\r\n ): Promise<ZenoResponse<Entry[]>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n const {\r\n page = 1,\r\n limit = 50,\r\n sortBy = 'created_at',\r\n sortOrder = 'desc',\r\n status,\r\n search,\r\n locale,\r\n fallback_locale,\r\n dateFrom,\r\n dateTo,\r\n dateField,\r\n } = params;\r\n const effectiveFallback = fallback_locale || await this.getDefaultLocale();\r\n const offset = (page - 1) * limit;\r\n\r\n let query = this.supabase\r\n .from('entries')\r\n .select(`\r\n id, data, status, collection_id, project_id, created_at, updated_at,\r\n collections ( id, name, slug )\r\n `)\r\n .eq('project_id', projectId);\r\n\r\n // Filter by collection\r\n if (collectionSlug) {\r\n const { data: collection } = await this.supabase\r\n .from('collections')\r\n .select('id')\r\n .eq('project_id', projectId)\r\n .eq('slug', collectionSlug)\r\n .single();\r\n\r\n if (!collection) {\r\n return createResponse<Entry[]>(null, 'Collection not found');\r\n }\r\n query = query.eq('collection_id', collection.id);\r\n }\r\n\r\n if (status) query = query.eq('status', status);\r\n if (search) query = query.textSearch('data', search);\r\n\r\n // Date filtering: use dateField inside data if specified, otherwise use created_at\r\n if (dateFrom) {\r\n query = dateField\r\n ? query.gte(`data->${dateField}`, dateFrom)\r\n : query.gte('created_at', dateFrom);\r\n }\r\n if (dateTo) {\r\n query = dateField\r\n ? query.lte(`data->${dateField}`, dateTo)\r\n : query.lte('created_at', dateTo);\r\n }\r\n\r\n // Count query\r\n let countQuery = this.supabase\r\n .from('entries')\r\n .select('*', { count: 'exact', head: true })\r\n .eq('project_id', projectId);\r\n\r\n if (collectionSlug) {\r\n const { data: collection } = await this.supabase\r\n .from('collections')\r\n .select('id')\r\n .eq('project_id', projectId)\r\n .eq('slug', collectionSlug)\r\n .single();\r\n\r\n if (collection) countQuery = countQuery.eq('collection_id', collection.id);\r\n }\r\n if (status) countQuery = countQuery.eq('status', status);\r\n if (search) countQuery = countQuery.textSearch('data', search);\r\n\r\n // Date filtering for count query\r\n if (dateFrom) {\r\n countQuery = dateField\r\n ? countQuery.gte(`data->${dateField}`, dateFrom)\r\n : countQuery.gte('created_at', dateFrom);\r\n }\r\n if (dateTo) {\r\n countQuery = dateField\r\n ? countQuery.lte(`data->${dateField}`, dateTo)\r\n : countQuery.lte('created_at', dateTo);\r\n }\r\n\r\n const { count } = await countQuery;\r\n\r\n const { data, error } = await query\r\n .order(sortBy, { ascending: sortOrder === 'asc' })\r\n .range(offset, offset + limit - 1);\r\n\r\n if (error) throw error;\r\n\r\n // Normalize Supabase join (returns array for relations) and apply localization\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const rows = (data as any[]) ?? [];\r\n const normalized = rows.map((row) => ({\r\n ...row,\r\n collections: Array.isArray(row.collections) ? row.collections[0] : row.collections,\r\n }));\r\n\r\n let processedData = normalized;\r\n let fallbackUsed = false;\r\n\r\n if (locale && normalized.length > 0) {\r\n try {\r\n // Use batch function to avoid N+1 queries\r\n const entryIds = normalized.map((e) => e.id);\r\n const result = await this.supabase.rpc('get_localized_entries_batch', {\r\n entry_uuids: entryIds,\r\n locale,\r\n fallback_locale: effectiveFallback,\r\n });\r\n\r\n if (result.data && result.data.length > 0) {\r\n // Create a map for quick lookup\r\n const localeMap = new Map<string, { data: Record<string, unknown>; locale_code: string; is_fallback: boolean }>();\r\n for (const loc of result.data) {\r\n localeMap.set(loc.entry_id, {\r\n data: loc.data,\r\n locale_code: loc.locale_code,\r\n is_fallback: loc.is_fallback,\r\n });\r\n }\r\n\r\n // Merge localized data with entries\r\n processedData = normalized.map((entry) => {\r\n const localized = localeMap.get(entry.id);\r\n if (localized) {\r\n if (localized.is_fallback) fallbackUsed = true;\r\n return { ...entry, data: localized.data, locale_code: localized.locale_code };\r\n }\r\n return entry;\r\n });\r\n }\r\n } catch {\r\n // Fallback to base data if batch function fails\r\n }\r\n }\r\n\r\n // Available locales\r\n const { data: availableLocales } = await this.supabase\r\n .from('project_locales')\r\n .select('locale_code')\r\n .eq('project_id', projectId)\r\n .eq('is_active', true);\r\n\r\n return createResponse(processedData as Entry[] | null, null, {\r\n total: count || 0,\r\n page,\r\n limit,\r\n totalPages: Math.ceil((count || 0) / limit),\r\n locale: locale || effectiveFallback,\r\n fallback_used: fallbackUsed,\r\n available_locales: availableLocales?.map((l) => l.locale_code) || [],\r\n });\r\n } catch (error) {\r\n return createResponse<Entry[]>(null, error);\r\n }\r\n }\r\n\r\n /** Get a single entry by ID */\r\n async getEntry(\r\n entryId: string,\r\n params: { locale?: string; fallback_locale?: string } = {}\r\n ): Promise<ZenoResponse<Entry>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n const { locale, fallback_locale } = params;\r\n const effectiveFallback = fallback_locale || await this.getDefaultLocale();\r\n\r\n const { data, error } = await this.supabase\r\n .from('entries')\r\n .select(`\r\n id, data, status, collection_id, project_id, created_at, updated_at,\r\n collections ( id, name, slug, fields )\r\n `)\r\n .eq('project_id', projectId)\r\n .eq('id', entryId)\r\n .single();\r\n\r\n if (error) throw error;\r\n\r\n // Normalize Supabase join (returns array for relations)\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const row = data as any;\r\n const normalized = row ? {\r\n ...row,\r\n collections: Array.isArray(row.collections) ? row.collections[0] : row.collections,\r\n } : null;\r\n\r\n let processedData = normalized;\r\n let fallbackUsed = false;\r\n\r\n if (locale && normalized) {\r\n try {\r\n const result = await this.supabase.rpc('get_localized_entry', {\r\n entry_uuid: entryId,\r\n locale,\r\n fallback_locale: effectiveFallback,\r\n });\r\n\r\n if (result.data?.[0]) {\r\n const localized = result.data[0];\r\n if (localized.locale_code !== locale) fallbackUsed = true;\r\n processedData = { ...normalized, data: localized.data, locale_code: localized.locale_code };\r\n }\r\n } catch {\r\n // Fallback to base data\r\n }\r\n }\r\n\r\n const { data: availableLocales } = await this.supabase\r\n .from('project_locales')\r\n .select('locale_code')\r\n .eq('project_id', projectId)\r\n .eq('is_active', true);\r\n\r\n return createResponse(processedData as Entry | null, null, {\r\n locale: locale || effectiveFallback,\r\n fallback_used: fallbackUsed,\r\n available_locales: availableLocales?.map((l) => l.locale_code) || [],\r\n });\r\n } catch (error) {\r\n return createResponse<Entry>(null, error);\r\n }\r\n }\r\n\r\n /** Get assets for the project */\r\n async getAssets(\r\n params: PaginationParams & { mimeType?: string } = {}\r\n ): Promise<ZenoResponse<Asset[]>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n const { page = 1, limit = 50, sortBy = 'created_at', sortOrder = 'desc', mimeType } = params;\r\n const offset = (page - 1) * limit;\r\n\r\n let query = this.supabase\r\n .from('assets')\r\n .select('id, filename, original_filename, mime_type, size_bytes, metadata, created_at')\r\n .eq('project_id', projectId);\r\n\r\n if (mimeType) query = query.like('mime_type', `${mimeType}%`);\r\n\r\n let countQuery = this.supabase\r\n .from('assets')\r\n .select('*', { count: 'exact', head: true })\r\n .eq('project_id', projectId);\r\n\r\n if (mimeType) countQuery = countQuery.like('mime_type', `${mimeType}%`);\r\n\r\n const { count } = await countQuery;\r\n\r\n const { data, error } = await query\r\n .order(sortBy, { ascending: sortOrder === 'asc' })\r\n .range(offset, offset + limit - 1);\r\n\r\n return createResponse(data as Asset[] | null, error, {\r\n total: count || 0,\r\n page,\r\n limit,\r\n totalPages: Math.ceil((count || 0) / limit),\r\n });\r\n } catch (error) {\r\n return createResponse<Asset[]>(null, error);\r\n }\r\n }\r\n\r\n /** Get a signed download URL for an asset */\r\n async getAssetUrl(assetId: string): Promise<ZenoResponse<AssetUrl>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n\r\n const { data: asset, error: assetError } = await this.supabase\r\n .from('assets')\r\n .select('storage_path')\r\n .eq('project_id', projectId)\r\n .eq('id', assetId)\r\n .single();\r\n\r\n if (assetError || !asset) {\r\n return createResponse<AssetUrl>(null, 'Asset not found');\r\n }\r\n\r\n const { data: urlData, error: urlError } = await this.supabase\r\n .storage\r\n .from('assets')\r\n .createSignedUrl(asset.storage_path, 3600);\r\n\r\n if (urlError) {\r\n return createResponse<AssetUrl>(null, urlError);\r\n }\r\n\r\n return createResponse<AssetUrl>({\r\n downloadUrl: urlData.signedUrl,\r\n expiresIn: 3600,\r\n });\r\n } catch (error) {\r\n return createResponse<AssetUrl>(null, error);\r\n }\r\n }\r\n\r\n /** Send an email via the Zeno edge function */\r\n async sendEmail(emailParams: EmailParams): Promise<ZenoResponse<{ messageId: string }>> {\r\n try {\r\n const response = await fetch(`${ZENO_INTERNAL.endpoint}/functions/v1/api/email/send`, {\r\n method: 'POST',\r\n headers: {\r\n 'Authorization': `Bearer ${this.apiKey}`,\r\n 'X-API-Key': this.apiKey,\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(emailParams),\r\n });\r\n\r\n const result = await response.json();\r\n\r\n if (!response.ok) {\r\n return createResponse<{ messageId: string }>(null, result.error || 'Email sending failed');\r\n }\r\n\r\n return createResponse(result.data);\r\n } catch (error) {\r\n return createResponse<{ messageId: string }>(null, error);\r\n }\r\n }\r\n\r\n /** Get available locales for the project */\r\n async getLocales(): Promise<ZenoResponse<Locale[]>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n\r\n const { data, error } = await this.supabase\r\n .from('project_locales')\r\n .select('locale_code, locale_name, locale_native_name, is_default')\r\n .eq('project_id', projectId)\r\n .eq('is_active', true)\r\n .order('is_default', { ascending: false })\r\n .order('locale_name', { ascending: true });\r\n\r\n if (error) throw error;\r\n\r\n const processedData = data?.map((l) => ({\r\n code: l.locale_code,\r\n name: l.locale_name,\r\n native_name: l.locale_native_name,\r\n is_default: l.is_default,\r\n })) || [];\r\n\r\n return createResponse<Locale[]>(processedData);\r\n } catch (error) {\r\n return createResponse<Locale[]>(null, error);\r\n }\r\n }\r\n\r\n /** Health check */\r\n async health(): Promise<ZenoResponse<HealthStatus>> {\r\n return createResponse<HealthStatus>({\r\n status: 'healthy',\r\n version: '1.0.0',\r\n });\r\n }\r\n}\r\n","import { InjectionToken, inject, makeEnvironmentProviders, type EnvironmentProviders } from '@angular/core';\r\nimport { ZenoCMS } from '../client';\r\nimport type { ZenoOptions } from './types';\r\n\r\n/** Injection token for the ZenoCMS client */\r\nexport const ZENO_CLIENT = new InjectionToken<ZenoCMS>('ZenoCMS');\r\n\r\n/**\r\n * Provide the Zeno CMS client at the application level.\r\n * Use in your app config or root module providers.\r\n *\r\n * @example\r\n * ```ts\r\n * // app.config.ts\r\n * import { provideZeno } from '@zeno/sdk/angular'\r\n *\r\n * export const appConfig = {\r\n * providers: [\r\n * provideZeno({ apiKey: environment.zenoApiKey })\r\n * ]\r\n * }\r\n * ```\r\n */\r\nexport function provideZeno(options: ZenoOptions = {}): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: ZENO_CLIENT,\r\n useFactory: () => new ZenoCMS({\r\n apiKey: options.apiKey,\r\n defaultLocale: options.defaultLocale,\r\n }),\r\n },\r\n ]);\r\n}\r\n\r\n/**\r\n * Inject the ZenoCMS client instance.\r\n * Requires `provideZeno()` in your app providers.\r\n *\r\n * @example\r\n * ```ts\r\n * import { injectZeno } from '@zeno/sdk/angular'\r\n *\r\n * const zeno = injectZeno()\r\n * await zeno.sendEmail({ ... })\r\n * ```\r\n */\r\nexport function injectZeno(): ZenoCMS {\r\n return inject(ZENO_CLIENT);\r\n}\r\n","import { signal, type Signal } from '@angular/core';\r\nimport { injectZeno } from './provider';\r\nimport type { QueryResult } from './types';\r\nimport type {\r\n Entry,\r\n Collection,\r\n Asset,\r\n AssetUrl,\r\n Project,\r\n Locale,\r\n PaginationParams,\r\n FilterParams,\r\n} from '../types';\r\n\r\n/**\r\n * Internal helper: wraps an async SDK call with Angular signals.\r\n * Auto-fetches on creation and exposes a refresh function.\r\n */\r\nfunction useAsyncQuery<T>(\r\n fetcher: () => Promise<{ data: T | null; error: string | null }>\r\n): QueryResult<T> {\r\n const data = signal<T | null>(null);\r\n const error = signal<string | null>(null);\r\n const loading = signal(true);\r\n\r\n const execute = async () => {\r\n loading.set(true);\r\n error.set(null);\r\n try {\r\n const result = await fetcher();\r\n data.set(result.data);\r\n error.set(result.error);\r\n } catch (err) {\r\n error.set(err instanceof Error ? err.message : String(err));\r\n data.set(null);\r\n } finally {\r\n loading.set(false);\r\n }\r\n };\r\n\r\n // Auto-fetch immediately\r\n execute();\r\n\r\n return {\r\n data: data.asReadonly(),\r\n error: error.asReadonly(),\r\n loading: loading.asReadonly(),\r\n refresh: execute,\r\n };\r\n}\r\n\r\n/** Fetch entries, optionally filtered by collection slug */\r\nexport function useEntries(\r\n collectionSlug?: string,\r\n params?: PaginationParams & FilterParams\r\n): QueryResult<Entry[]> {\r\n const zeno = injectZeno();\r\n return useAsyncQuery(() => zeno.getEntries(collectionSlug, params));\r\n}\r\n\r\n/** Fetch a single entry by ID */\r\nexport function useEntry(\r\n entryId: string,\r\n params?: { locale?: string; fallback_locale?: string }\r\n): QueryResult<Entry> {\r\n const zeno = injectZeno();\r\n return useAsyncQuery(() => zeno.getEntry(entryId, params));\r\n}\r\n\r\n/** Fetch all collections */\r\nexport function useCollections(\r\n params?: PaginationParams\r\n): QueryResult<Collection[]> {\r\n const zeno = injectZeno();\r\n return useAsyncQuery(() => zeno.getCollections(params));\r\n}\r\n\r\n/** Fetch a single collection by slug */\r\nexport function useCollection(slug: string): QueryResult<Collection> {\r\n const zeno = injectZeno();\r\n return useAsyncQuery(() => zeno.getCollection(slug));\r\n}\r\n\r\n/** Fetch assets */\r\nexport function useAssets(\r\n params?: PaginationParams & { mimeType?: string }\r\n): QueryResult<Asset[]> {\r\n const zeno = injectZeno();\r\n return useAsyncQuery(() => zeno.getAssets(params));\r\n}\r\n\r\n/** Get a signed download URL for an asset */\r\nexport function useAssetUrl(assetId: string): QueryResult<AssetUrl> {\r\n const zeno = injectZeno();\r\n return useAsyncQuery(() => zeno.getAssetUrl(assetId));\r\n}\r\n\r\n/** Fetch project information */\r\nexport function useProject(): QueryResult<Project> {\r\n const zeno = injectZeno();\r\n return useAsyncQuery(() => zeno.getProject());\r\n}\r\n\r\n/** Fetch available locales */\r\nexport function useLocales(): QueryResult<Locale[]> {\r\n const zeno = injectZeno();\r\n return useAsyncQuery(() => zeno.getLocales());\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/angular/provider.ts","../src/angular/signals.ts"],"names":["ZENO_INTERNAL","createResponse","data","error","meta","errorMessage","ZenoCMS","config","apiKey","parsed","createClient","withoutPrefix","separatorIndex","projectSlug","token","projectId","result","params","page","limit","sortBy","sortOrder","offset","count","processedData","c","slug","collectionSlug","status","search","locale","fallback_locale","dateFrom","dateTo","dateField","effectiveFallback","query","collection","countQuery","normalized","row","fallbackUsed","entryIds","e","localeMap","loc","entry","localized","availableLocales","l","entryId","mimeType","assetId","asset","assetError","urlData","urlError","emailParams","response","ZENO_CLIENT","InjectionToken","provideZeno","options","makeEnvironmentProviders","injectZeno","inject","useAsyncQuery","fetcher","signal","loading","execute","err","useEntries","zeno","useEntry","useCollections","useCollection","useAssets","useAssetUrl","useProject","useLocales"],"mappings":"2FAiBA,IAAMA,EAAgB,CACpB,QAAA,CAAU,2CACV,SAAA,CAAW,kNACb,EAEA,SAASC,CAAAA,CACPC,CAAAA,CACAC,CAAAA,CAAiB,KACjBC,CAAAA,CACiB,CACjB,IAAIC,CAAAA,CAA8B,IAAA,CAClC,OAAIF,CAAAA,GACE,OAAOA,GAAU,QAAA,CAAUE,CAAAA,CAAeF,EACrCA,CAAAA,YAAiB,KAAA,CAAOE,EAAeF,CAAAA,CAAM,OAAA,CAC7C,OAAOA,CAAAA,EAAU,QAAA,EAAYA,CAAAA,GAAU,IAAA,EAAQ,YAAaA,CAAAA,GACnEE,CAAAA,CAAe,OAAQF,CAAAA,CAA+B,OAAO,IAI1D,CACL,IAAA,CAAAD,EACA,KAAA,CAAOG,CAAAA,CACP,KAAM,CACJ,GAAGD,EACH,SAAA,CAAW,IAAI,MAAK,CAAE,WAAA,EACxB,CACF,CACF,CAEO,IAAME,EAAN,KAAc,CAUnB,YAAYC,CAAAA,CAAqB,GAAI,CALrC,IAAA,CAAQ,UAA2B,IAAA,CACnC,IAAA,CAAQ,YAAuB,KAAA,CAE/B,IAAA,CAAQ,sBAAuC,IAAA,CAI7C,IAAMC,CAAAA,CAASD,CAAAA,CAAO,QAAU,IAAA,CAAK,YAAA,GAErC,GAAI,CAACC,EACH,MAAM,IAAI,MACR,kKAEF,CAAA,CAIF,IAAMC,CAAAA,CAAS,IAAA,CAAK,YAAYD,CAAM,CAAA,CACtC,KAAK,MAAA,CAASA,CAAAA,CACd,IAAA,CAAK,WAAA,CAAcC,EAAO,WAAA,CAC1B,IAAA,CAAK,SAAWA,CAAAA,CAAO,KAAA,CACvB,KAAK,mBAAA,CAAsBF,CAAAA,CAAO,cAElC,IAAA,CAAK,QAAA,CAAWG,wBAAaV,CAAAA,CAAc,QAAA,CAAUA,EAAc,SAAA,CAAW,CAC5E,KAAM,CACJ,cAAA,CAAgB,KAAA,CAChB,gBAAA,CAAkB,KACpB,CACF,CAAC,EACH,CAUQ,YAAA,EAAmC,CAEzC,GAAI,OAAO,QAAY,GAAA,EAAe,OAAA,CAAQ,IAAK,CACjD,GAAI,QAAQ,GAAA,CAAI,YAAA,CAAc,OAAO,OAAA,CAAQ,GAAA,CAAI,aACjD,GAAI,OAAA,CAAQ,IAAI,wBAAA,CAA0B,OAAO,QAAQ,GAAA,CAAI,wBAAA,CAC7D,GAAI,OAAA,CAAQ,GAAA,CAAI,kBAAmB,OAAO,OAAA,CAAQ,IAAI,iBAAA,CACtD,GAAI,QAAQ,GAAA,CAAI,mBAAA,CAAqB,OAAO,OAAA,CAAQ,GAAA,CAAI,mBAC1D,CAMA,GAAI,CAEF,GAAI,SAAY,EAAK,YAAA,CAAc,OAAO,SAAY,CAAI,aAE1D,GAAI,WAAiB,iBAAA,CAAmB,OAAO,SAAY,CAAI,iBAAA,CAE/D,GAAI,SAAY,EAAK,mBAAA,CAAqB,OAAO,SAAY,CAAI,mBAAA,CAEjE,GAAI,SAAY,EAAK,yBAA0B,OAAO,UAAgB,wBACxE,CAAA,KAAQ,CAER,CAGF,CAMQ,YAAYQ,CAAAA,CAAwD,CAC1E,GAAI,CAACA,CAAAA,CAAO,UAAA,CAAW,OAAO,EAC5B,MAAM,IAAI,MAAM,8DAA8D,CAAA,CAGhF,IAAMG,CAAAA,CAAgBH,CAAAA,CAAO,MAAM,CAAC,CAAA,CAC9BI,EAAiBD,CAAAA,CAAc,OAAA,CAAQ,GAAG,CAAA,CAEhD,GAAIC,IAAmB,EAAA,CACrB,MAAM,IAAI,KAAA,CAAM,8DAA8D,EAGhF,IAAMC,CAAAA,CAAcF,EAAc,KAAA,CAAM,CAAA,CAAGC,CAAc,CAAA,CACnDE,CAAAA,CAAQH,EAAc,KAAA,CAAMC,CAAAA,CAAiB,CAAC,CAAA,CAEpD,GAAI,CAACC,CAAAA,EAAe,CAACC,EACnB,MAAM,IAAI,KAAA,CAAM,8DAA8D,EAGhF,OAAO,CAAE,YAAAD,CAAAA,CAAa,KAAA,CAAAC,CAAM,CAC9B,CAMA,MAAc,gBAAA,EAAoC,CAChD,GAAI,IAAA,CAAK,mBAAA,CAAqB,OAAO,IAAA,CAAK,mBAAA,CAC1C,GAAI,IAAA,CAAK,qBAAA,CAAuB,OAAO,IAAA,CAAK,sBAE5C,GAAI,CACF,IAAMC,CAAAA,CAAY,MAAM,KAAK,gBAAA,EAAiB,CACxC,CAAE,IAAA,CAAAb,CAAK,EAAI,MAAM,IAAA,CAAK,SACzB,IAAA,CAAK,iBAAiB,EACtB,MAAA,CAAO,aAAa,CAAA,CACpB,EAAA,CAAG,aAAca,CAAS,CAAA,CAC1B,GAAG,YAAA,CAAc,CAAA,CAAI,EACrB,MAAA,EAAO,CAEV,GAAIb,CAAAA,EAAM,WAAA,CACR,YAAK,qBAAA,CAAwBA,CAAAA,CAAK,YAC3BA,CAAAA,CAAK,WAEhB,MAAQ,CAER,CAEA,YAAK,qBAAA,CAAwB,IAAA,CACtB,IACT,CAMA,MAAc,kBAAoC,CAEhD,GAAI,KAAK,SAAA,EAAa,IAAA,CAAK,YAAa,OAAO,IAAA,CAAK,UAGpD,GAAM,CAAE,KAAAA,CAAAA,CAAM,KAAA,CAAAC,CAAM,CAAA,CAAI,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,sBAAA,CAAwB,CACtE,eAAgB,IAAA,CAAK,WAAA,CACrB,QAAS,IAAA,CAAK,QAChB,CAAC,CAAA,CAED,GAAIA,EACF,MAAM,IAAI,MAAM,6BAAA,CAAgCA,CAAAA,CAAM,OAAO,CAAA,CAI/D,IAAMa,CAAAA,CAASd,CAAAA,GAAO,CAAC,CAAA,CAEvB,GAAI,CAACc,CAAAA,EAAU,CAACA,EAAO,QAAA,CACrB,MAAM,IAAI,KAAA,CAAMA,CAAAA,EAAQ,eAAiB,sCAAsC,CAAA,CAGjF,YAAK,SAAA,CAAYA,CAAAA,CAAO,WACxB,IAAA,CAAK,WAAA,CAAc,IAAA,CACZA,CAAAA,CAAO,UAChB,CAGA,MAAM,YAA6C,CACjD,GAAI,CACF,IAAMD,CAAAA,CAAY,MAAM,IAAA,CAAK,gBAAA,GAEvB,CAAE,IAAA,CAAAb,EAAM,KAAA,CAAAC,CAAM,EAAI,MAAM,IAAA,CAAK,QAAA,CAChC,IAAA,CAAK,UAAU,CAAA,CACf,MAAA,CAAO,6DAA6D,CAAA,CACpE,EAAA,CAAG,KAAMY,CAAS,CAAA,CAClB,QAAO,CAEV,OAAOd,EAAeC,CAAAA,CAAMC,CAAK,CACnC,CAAA,MAASA,CAAAA,CAAO,CACd,OAAOF,CAAAA,CAAwB,IAAA,CAAME,CAAK,CAC5C,CACF,CAGA,MAAM,cAAA,CAAec,CAAAA,CAA2B,EAAC,CAAwC,CACvF,GAAI,CACF,IAAMF,EAAY,MAAM,IAAA,CAAK,kBAAiB,CACxC,CAAE,KAAAG,CAAAA,CAAO,CAAA,CAAG,KAAA,CAAAC,CAAAA,CAAQ,GAAI,MAAA,CAAAC,CAAAA,CAAS,aAAc,SAAA,CAAAC,CAAAA,CAAY,MAAO,CAAA,CAAIJ,CAAAA,CACtEK,GAAUJ,CAAAA,CAAO,CAAA,EAAKC,EAEtB,CAAE,KAAA,CAAAI,CAAM,CAAA,CAAI,MAAM,KAAK,QAAA,CAC1B,IAAA,CAAK,aAAa,CAAA,CAClB,OAAO,GAAA,CAAK,CAAE,MAAO,OAAA,CAAS,IAAA,CAAM,EAAK,CAAC,CAAA,CAC1C,GAAG,YAAA,CAAcR,CAAS,EAEvB,CAAE,IAAA,CAAAb,EAAM,KAAA,CAAAC,CAAM,EAAI,MAAM,IAAA,CAAK,SAChC,IAAA,CAAK,aAAa,EAClB,MAAA,CAAO,6DAA6D,EACpE,EAAA,CAAG,YAAA,CAAcY,CAAS,CAAA,CAC1B,KAAA,CAAMK,EAAQ,CAAE,SAAA,CAAWC,IAAc,KAAM,CAAC,EAChD,KAAA,CAAMC,CAAAA,CAAQA,EAASH,CAAAA,CAAQ,CAAC,CAAA,CAE7BK,CAAAA,CAAgBtB,GAAM,GAAA,CAAKuB,CAAAA,GAAO,CACtC,GAAGA,CAAAA,CACH,OAAQ,OAAOA,CAAAA,CAAE,QAAW,QAAA,CAAW,IAAA,CAAK,MAAMA,CAAAA,CAAE,MAAM,EAAIA,CAAAA,CAAE,MAClE,EAAE,CAAA,CAEF,OAAOxB,CAAAA,CAAeuB,CAAAA,CAAsCrB,EAAO,CACjE,KAAA,CAAOoB,GAAS,CAAA,CAChB,IAAA,CAAAL,EACA,KAAA,CAAAC,CAAAA,CACA,WAAY,IAAA,CAAK,IAAA,CAAA,CAAMI,GAAS,CAAA,EAAKJ,CAAK,CAC5C,CAAC,CACH,OAAShB,CAAAA,CAAO,CACd,OAAOF,CAAAA,CAA6B,KAAME,CAAK,CACjD,CACF,CAGA,MAAM,cAAcuB,CAAAA,CAAiD,CACnE,GAAI,CACF,IAAMX,EAAY,MAAM,IAAA,CAAK,kBAAiB,CAExC,CAAE,KAAAb,CAAAA,CAAM,KAAA,CAAAC,CAAM,CAAA,CAAI,MAAM,KAAK,QAAA,CAChC,IAAA,CAAK,aAAa,CAAA,CAClB,MAAA,CAAO,6DAA6D,CAAA,CACpE,EAAA,CAAG,aAAcY,CAAS,CAAA,CAC1B,GAAG,MAAA,CAAQW,CAAI,EACf,MAAA,EAAO,CAEJF,EAAgBtB,CAAAA,CAClB,CAAE,GAAGA,CAAAA,CAAM,OAAQ,OAAOA,CAAAA,CAAK,QAAW,QAAA,CAAW,IAAA,CAAK,MAAMA,CAAAA,CAAK,MAAM,EAAIA,CAAAA,CAAK,MAAO,EAC3F,IAAA,CAEJ,OAAOD,EAAeuB,CAAAA,CAAoCrB,CAAK,CACjE,CAAA,MAASA,CAAAA,CAAO,CACd,OAAOF,EAA2B,IAAA,CAAME,CAAK,CAC/C,CACF,CAGA,MAAM,UAAA,CACJwB,CAAAA,CACAV,EAA0C,EAAC,CACX,CAChC,GAAI,CACF,IAAMF,CAAAA,CAAY,MAAM,KAAK,gBAAA,EAAiB,CACxC,CACJ,IAAA,CAAAG,EAAO,CAAA,CACP,KAAA,CAAAC,EAAQ,EAAA,CACR,MAAA,CAAAC,EAAS,YAAA,CACT,SAAA,CAAAC,EAAY,MAAA,CACZ,MAAA,CAAAO,EACA,MAAA,CAAAC,CAAAA,CACA,OAAAC,CAAAA,CACA,eAAA,CAAAC,EACA,QAAA,CAAAC,CAAAA,CACA,OAAAC,CAAAA,CACA,SAAA,CAAAC,CACF,CAAA,CAAIjB,CAAAA,CACEkB,EAAoBJ,CAAAA,EAAmB,MAAM,KAAK,gBAAA,EAAiB,CACnET,GAAUJ,CAAAA,CAAO,CAAA,EAAKC,EAExBiB,CAAAA,CAAQ,IAAA,CAAK,SACd,IAAA,CAAK,SAAS,EACd,MAAA,CAAO;AAAA;AAAA;AAAA,QAAA,CAGP,CAAA,CACA,EAAA,CAAG,YAAA,CAAcrB,CAAS,CAAA,CAG7B,GAAIY,CAAAA,CAAgB,CAClB,GAAM,CAAE,IAAA,CAAMU,CAAW,EAAI,MAAM,IAAA,CAAK,QAAA,CACrC,IAAA,CAAK,aAAa,CAAA,CAClB,OAAO,IAAI,CAAA,CACX,EAAA,CAAG,YAAA,CAActB,CAAS,CAAA,CAC1B,GAAG,MAAA,CAAQY,CAAc,CAAA,CACzB,MAAA,EAAO,CAEV,GAAI,CAACU,CAAAA,CACH,OAAOpC,CAAAA,CAAwB,IAAA,CAAM,sBAAsB,CAAA,CAE7DmC,EAAQA,CAAAA,CAAM,EAAA,CAAG,eAAA,CAAiBC,CAAAA,CAAW,EAAE,EACjD,CAEIT,CAAAA,GAAQQ,CAAAA,CAAQA,CAAAA,CAAM,EAAA,CAAG,QAAA,CAAUR,CAAM,CAAA,CAAA,CACzCC,IAAQO,CAAAA,CAAQA,CAAAA,CAAM,UAAA,CAAW,MAAA,CAAQP,CAAM,CAAA,CAAA,CAG/CG,IACFI,CAAAA,CAAQF,CAAAA,CACJE,CAAAA,CAAM,GAAA,CAAI,CAAA,MAAA,EAASF,CAAS,GAAIF,CAAQ,CAAA,CACxCI,CAAAA,CAAM,GAAA,CAAI,YAAA,CAAcJ,CAAQ,CAAA,CAAA,CAElCC,CAAAA,GACFG,CAAAA,CAAQF,CAAAA,CACJE,CAAAA,CAAM,GAAA,CAAI,CAAA,MAAA,EAASF,CAAS,GAAID,CAAM,CAAA,CACtCG,CAAAA,CAAM,GAAA,CAAI,YAAA,CAAcH,CAAM,GAIpC,IAAIK,CAAAA,CAAa,IAAA,CAAK,QAAA,CACnB,IAAA,CAAK,SAAS,EACd,MAAA,CAAO,GAAA,CAAK,CAAE,KAAA,CAAO,OAAA,CAAS,IAAA,CAAM,CAAA,CAAK,CAAC,CAAA,CAC1C,EAAA,CAAG,YAAA,CAAcvB,CAAS,CAAA,CAE7B,GAAIY,EAAgB,CAClB,GAAM,CAAE,IAAA,CAAMU,CAAW,CAAA,CAAI,MAAM,IAAA,CAAK,QAAA,CACrC,IAAA,CAAK,aAAa,CAAA,CAClB,MAAA,CAAO,IAAI,CAAA,CACX,EAAA,CAAG,YAAA,CAActB,CAAS,CAAA,CAC1B,EAAA,CAAG,OAAQY,CAAc,CAAA,CACzB,MAAA,EAAO,CAENU,CAAAA,GAAYC,CAAAA,CAAaA,EAAW,EAAA,CAAG,eAAA,CAAiBD,CAAAA,CAAW,EAAE,CAAA,EAC3E,CACIT,IAAQU,CAAAA,CAAaA,CAAAA,CAAW,EAAA,CAAG,QAAA,CAAUV,CAAM,CAAA,CAAA,CACnDC,IAAQS,CAAAA,CAAaA,CAAAA,CAAW,UAAA,CAAW,MAAA,CAAQT,CAAM,CAAA,CAAA,CAGzDG,CAAAA,GACFM,CAAAA,CAAaJ,CAAAA,CACTI,CAAAA,CAAW,GAAA,CAAI,CAAA,MAAA,EAASJ,CAAS,CAAA,CAAA,CAAIF,CAAQ,CAAA,CAC7CM,CAAAA,CAAW,GAAA,CAAI,YAAA,CAAcN,CAAQ,CAAA,CAAA,CAEvCC,IACFK,CAAAA,CAAaJ,CAAAA,CACTI,CAAAA,CAAW,GAAA,CAAI,CAAA,MAAA,EAASJ,CAAS,GAAID,CAAM,CAAA,CAC3CK,CAAAA,CAAW,GAAA,CAAI,YAAA,CAAcL,CAAM,CAAA,CAAA,CAGzC,GAAM,CAAE,KAAA,CAAAV,CAAM,CAAA,CAAI,MAAMe,CAAAA,CAElB,CAAE,IAAA,CAAApC,CAAAA,CAAM,KAAA,CAAAC,CAAM,CAAA,CAAI,MAAMiC,EAC3B,KAAA,CAAMhB,CAAAA,CAAQ,CAAE,SAAA,CAAWC,CAAAA,GAAc,KAAM,CAAC,CAAA,CAChD,KAAA,CAAMC,CAAAA,CAAQA,CAAAA,CAASH,CAAAA,CAAQ,CAAC,CAAA,CAEnC,GAAIhB,CAAAA,CAAO,MAAMA,CAAAA,CAKjB,IAAMoC,CAAAA,CAAAA,CADQrC,CAAAA,EAAkB,EAAC,EACT,GAAA,CAAKsC,CAAAA,GAAS,CACpC,GAAGA,CAAAA,CACH,YAAa,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAI,WAAW,CAAA,CAAIA,CAAAA,CAAI,YAAY,CAAC,CAAA,CAAIA,CAAAA,CAAI,WACzE,CAAA,CAAE,CAAA,CAEEhB,EAAgBe,CAAAA,CAChBE,CAAAA,CAAe,CAAA,CAAA,CAEnB,GAAIX,CAAAA,EAAUS,CAAAA,CAAW,OAAS,CAAA,CAChC,GAAI,CAEF,IAAMG,CAAAA,CAAWH,CAAAA,CAAW,IAAKI,CAAAA,EAAMA,CAAAA,CAAE,EAAE,CAAA,CACrC3B,CAAAA,CAAS,MAAM,KAAK,QAAA,CAAS,GAAA,CAAI,6BAAA,CAA+B,CACpE,WAAA,CAAa0B,CAAAA,CACb,MAAA,CAAAZ,CAAAA,CACA,eAAA,CAAiBK,CACnB,CAAC,CAAA,CAED,GAAInB,CAAAA,CAAO,MAAQA,CAAAA,CAAO,IAAA,CAAK,MAAA,CAAS,CAAA,CAAG,CAEzC,IAAM4B,EAAY,IAAI,GAAA,CACtB,IAAA,IAAWC,CAAAA,IAAO7B,CAAAA,CAAO,IAAA,CACvB4B,EAAU,GAAA,CAAIC,CAAAA,CAAI,QAAA,CAAU,CAC1B,IAAA,CAAMA,CAAAA,CAAI,IAAA,CACV,WAAA,CAAaA,CAAAA,CAAI,WAAA,CACjB,WAAA,CAAaA,CAAAA,CAAI,WACnB,CAAC,EAIHrB,CAAAA,CAAgBe,CAAAA,CAAW,GAAA,CAAKO,CAAAA,EAAU,CACxC,IAAMC,EAAYH,CAAAA,CAAU,GAAA,CAAIE,CAAAA,CAAM,EAAE,CAAA,CACxC,OAAIC,GACEA,CAAAA,CAAU,WAAA,GAAaN,CAAAA,CAAe,CAAA,CAAA,CAAA,CACnC,CAAE,GAAGK,CAAAA,CAAO,IAAA,CAAMC,CAAAA,CAAU,IAAA,CAAM,WAAA,CAAaA,CAAAA,CAAU,WAAY,CAAA,EAEvED,CACT,CAAC,EACH,CACF,CAAA,KAAQ,CAER,CAIF,GAAM,CAAE,IAAA,CAAME,CAAiB,CAAA,CAAI,MAAM,IAAA,CAAK,SAC3C,IAAA,CAAK,iBAAiB,CAAA,CACtB,MAAA,CAAO,aAAa,CAAA,CACpB,EAAA,CAAG,YAAA,CAAcjC,CAAS,CAAA,CAC1B,EAAA,CAAG,WAAA,CAAa,CAAA,CAAI,CAAA,CAEvB,OAAOd,CAAAA,CAAeuB,CAAAA,CAAiC,IAAA,CAAM,CAC3D,KAAA,CAAOD,CAAAA,EAAS,EAChB,IAAA,CAAAL,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,UAAA,CAAY,IAAA,CAAK,MAAMI,CAAAA,EAAS,CAAA,EAAKJ,CAAK,CAAA,CAC1C,MAAA,CAAQW,CAAAA,EAAUK,CAAAA,CAClB,aAAA,CAAeM,CAAAA,CACf,iBAAA,CAAmBO,CAAAA,EAAkB,GAAA,CAAKC,CAAAA,EAAMA,CAAAA,CAAE,WAAW,CAAA,EAAK,EACpE,CAAC,CACH,CAAA,MAAS9C,EAAO,CACd,OAAOF,CAAAA,CAAwB,IAAA,CAAME,CAAK,CAC5C,CACF,CAGA,MAAM,QAAA,CACJ+C,CAAAA,CACAjC,CAAAA,CAAwD,EAAC,CAC3B,CAC9B,GAAI,CACF,IAAMF,CAAAA,CAAY,MAAM,IAAA,CAAK,kBAAiB,CACxC,CAAE,MAAA,CAAAe,CAAAA,CAAQ,eAAA,CAAAC,CAAgB,EAAId,CAAAA,CAC9BkB,CAAAA,CAAoBJ,CAAAA,EAAmB,MAAM,IAAA,CAAK,gBAAA,GAElD,CAAE,IAAA,CAAA7B,CAAAA,CAAM,KAAA,CAAAC,CAAM,CAAA,CAAI,MAAM,IAAA,CAAK,QAAA,CAChC,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO;AAAA;AAAA;AAAA,QAAA,CAGP,CAAA,CACA,GAAG,YAAA,CAAcY,CAAS,EAC1B,EAAA,CAAG,IAAA,CAAMmC,CAAO,CAAA,CAChB,MAAA,GAEH,GAAI/C,CAAAA,CAAO,MAAMA,CAAAA,CAIjB,IAAMqC,EAAMtC,CAAAA,CACNqC,CAAAA,CAAaC,CAAAA,CAAM,CACvB,GAAGA,CAAAA,CACH,YAAa,KAAA,CAAM,OAAA,CAAQA,EAAI,WAAW,CAAA,CAAIA,EAAI,WAAA,CAAY,CAAC,CAAA,CAAIA,CAAAA,CAAI,WACzE,CAAA,CAAI,KAEAhB,CAAAA,CAAgBe,CAAAA,CAChBE,EAAe,CAAA,CAAA,CAEnB,GAAIX,GAAUS,CAAAA,CACZ,GAAI,CACF,IAAMvB,CAAAA,CAAS,MAAM,KAAK,QAAA,CAAS,GAAA,CAAI,sBAAuB,CAC5D,UAAA,CAAYkC,EACZ,MAAA,CAAApB,CAAAA,CACA,eAAA,CAAiBK,CACnB,CAAC,CAAA,CAED,GAAInB,CAAAA,CAAO,IAAA,GAAO,CAAC,CAAA,CAAG,CACpB,IAAM+B,CAAAA,CAAY/B,CAAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAC3B+B,CAAAA,CAAU,cAAgBjB,CAAAA,GAAQW,CAAAA,CAAe,IACrDjB,CAAAA,CAAgB,CAAE,GAAGe,CAAAA,CAAY,IAAA,CAAMQ,CAAAA,CAAU,IAAA,CAAM,WAAA,CAAaA,CAAAA,CAAU,WAAY,EAC5F,CACF,MAAQ,CAER,CAGF,GAAM,CAAE,IAAA,CAAMC,CAAiB,CAAA,CAAI,MAAM,IAAA,CAAK,SAC3C,IAAA,CAAK,iBAAiB,EACtB,MAAA,CAAO,aAAa,EACpB,EAAA,CAAG,YAAA,CAAcjC,CAAS,CAAA,CAC1B,EAAA,CAAG,YAAa,CAAA,CAAI,CAAA,CAEvB,OAAOd,CAAAA,CAAeuB,CAAAA,CAA+B,KAAM,CACzD,MAAA,CAAQM,CAAAA,EAAUK,CAAAA,CAClB,aAAA,CAAeM,CAAAA,CACf,kBAAmBO,CAAAA,EAAkB,GAAA,CAAKC,GAAMA,CAAAA,CAAE,WAAW,GAAK,EACpE,CAAC,CACH,CAAA,MAAS9C,CAAAA,CAAO,CACd,OAAOF,CAAAA,CAAsB,KAAME,CAAK,CAC1C,CACF,CAGA,MAAM,SAAA,CACJc,CAAAA,CAAmD,EAAC,CACpB,CAChC,GAAI,CACF,IAAMF,CAAAA,CAAY,MAAM,KAAK,gBAAA,EAAiB,CACxC,CAAE,IAAA,CAAAG,CAAAA,CAAO,CAAA,CAAG,MAAAC,CAAAA,CAAQ,EAAA,CAAI,OAAAC,CAAAA,CAAS,YAAA,CAAc,UAAAC,CAAAA,CAAY,MAAA,CAAQ,QAAA,CAAA8B,CAAS,CAAA,CAAIlC,CAAAA,CAChFK,GAAUJ,CAAAA,CAAO,CAAA,EAAKC,EAExBiB,CAAAA,CAAQ,IAAA,CAAK,SACd,IAAA,CAAK,QAAQ,CAAA,CACb,MAAA,CAAO,8EAA8E,CAAA,CACrF,GAAG,YAAA,CAAcrB,CAAS,EAEzBoC,CAAAA,GAAUf,CAAAA,CAAQA,EAAM,IAAA,CAAK,WAAA,CAAa,CAAA,EAAGe,CAAQ,CAAA,CAAA,CAAG,CAAA,CAAA,CAE5D,IAAIb,CAAAA,CAAa,IAAA,CAAK,SACnB,IAAA,CAAK,QAAQ,EACb,MAAA,CAAO,GAAA,CAAK,CAAE,KAAA,CAAO,OAAA,CAAS,KAAM,CAAA,CAAK,CAAC,EAC1C,EAAA,CAAG,YAAA,CAAcvB,CAAS,CAAA,CAEzBoC,CAAAA,GAAUb,CAAAA,CAAaA,CAAAA,CAAW,IAAA,CAAK,WAAA,CAAa,GAAGa,CAAQ,CAAA,CAAA,CAAG,GAEtE,GAAM,CAAE,MAAA5B,CAAM,CAAA,CAAI,MAAMe,CAAAA,CAElB,CAAE,IAAA,CAAApC,EAAM,KAAA,CAAAC,CAAM,EAAI,MAAMiC,CAAAA,CAC3B,MAAMhB,CAAAA,CAAQ,CAAE,SAAA,CAAWC,CAAAA,GAAc,KAAM,CAAC,EAChD,KAAA,CAAMC,CAAAA,CAAQA,EAASH,CAAAA,CAAQ,CAAC,EAEnC,OAAOlB,CAAAA,CAAeC,CAAAA,CAAwBC,CAAAA,CAAO,CACnD,KAAA,CAAOoB,GAAS,CAAA,CAChB,IAAA,CAAAL,EACA,KAAA,CAAAC,CAAAA,CACA,WAAY,IAAA,CAAK,IAAA,CAAA,CAAMI,CAAAA,EAAS,CAAA,EAAKJ,CAAK,CAC5C,CAAC,CACH,CAAA,MAAShB,EAAO,CACd,OAAOF,EAAwB,IAAA,CAAME,CAAK,CAC5C,CACF,CAGA,MAAM,YAAYiD,CAAAA,CAAkD,CAClE,GAAI,CACF,IAAMrC,EAAY,MAAM,IAAA,CAAK,gBAAA,EAAiB,CAExC,CAAE,IAAA,CAAMsC,EAAO,KAAA,CAAOC,CAAW,EAAI,MAAM,IAAA,CAAK,SACnD,IAAA,CAAK,QAAQ,EACb,MAAA,CAAO,cAAc,EACrB,EAAA,CAAG,YAAA,CAAcvC,CAAS,CAAA,CAC1B,EAAA,CAAG,KAAMqC,CAAO,CAAA,CAChB,MAAA,EAAO,CAEV,GAAIE,CAAAA,EAAc,CAACD,CAAAA,CACjB,OAAOpD,EAAyB,IAAA,CAAM,iBAAiB,EAGzD,GAAM,CAAE,IAAA,CAAMsD,CAAAA,CAAS,KAAA,CAAOC,CAAS,EAAI,MAAM,IAAA,CAAK,SACnD,OAAA,CACA,IAAA,CAAK,QAAQ,CAAA,CACb,eAAA,CAAgBH,CAAAA,CAAM,YAAA,CAAc,IAAI,CAAA,CAE3C,OAAIG,CAAAA,CACKvD,CAAAA,CAAyB,KAAMuD,CAAQ,CAAA,CAGzCvD,EAAyB,CAC9B,WAAA,CAAasD,CAAAA,CAAQ,SAAA,CACrB,SAAA,CAAW,IACb,CAAC,CACH,CAAA,MAASpD,EAAO,CACd,OAAOF,EAAyB,IAAA,CAAME,CAAK,CAC7C,CACF,CAGA,MAAM,UAAUsD,CAAAA,CAAwE,CACtF,GAAI,CACF,IAAMC,EAAW,MAAM,KAAA,CAAM,CAAA,EAAG1D,CAAAA,CAAc,QAAQ,CAAA,4BAAA,CAAA,CAAgC,CACpF,MAAA,CAAQ,MAAA,CACR,QAAS,CACP,aAAA,CAAiB,UAAU,IAAA,CAAK,MAAM,CAAA,CAAA,CACtC,WAAA,CAAa,IAAA,CAAK,MAAA,CAClB,eAAgB,kBAClB,CAAA,CACA,KAAM,IAAA,CAAK,SAAA,CAAUyD,CAAW,CAClC,CAAC,EAEKzC,CAAAA,CAAS,MAAM0C,EAAS,IAAA,EAAK,CAEnC,OAAKA,CAAAA,CAAS,EAAA,CAIPzD,EAAee,CAAAA,CAAO,IAAI,CAAA,CAHxBf,CAAAA,CAAsC,IAAA,CAAMe,CAAAA,CAAO,OAAS,sBAAsB,CAI7F,OAASb,CAAAA,CAAO,CACd,OAAOF,CAAAA,CAAsC,IAAA,CAAME,CAAK,CAC1D,CACF,CAGA,MAAM,UAAA,EAA8C,CAClD,GAAI,CACF,IAAMY,EAAY,MAAM,IAAA,CAAK,gBAAA,EAAiB,CAExC,CAAE,IAAA,CAAAb,EAAM,KAAA,CAAAC,CAAM,EAAI,MAAM,IAAA,CAAK,SAChC,IAAA,CAAK,iBAAiB,CAAA,CACtB,MAAA,CAAO,0DAA0D,CAAA,CACjE,GAAG,YAAA,CAAcY,CAAS,EAC1B,EAAA,CAAG,WAAA,CAAa,EAAI,CAAA,CACpB,KAAA,CAAM,YAAA,CAAc,CAAE,SAAA,CAAW,CAAA,CAAM,CAAC,CAAA,CACxC,KAAA,CAAM,cAAe,CAAE,SAAA,CAAW,EAAK,CAAC,CAAA,CAE3C,GAAIZ,CAAAA,CAAO,MAAMA,CAAAA,CAEjB,IAAMqB,CAAAA,CAAgBtB,CAAAA,EAAM,IAAK+C,CAAAA,GAAO,CACtC,KAAMA,CAAAA,CAAE,WAAA,CACR,IAAA,CAAMA,CAAAA,CAAE,WAAA,CACR,WAAA,CAAaA,EAAE,kBAAA,CACf,UAAA,CAAYA,EAAE,UAChB,CAAA,CAAE,GAAK,EAAC,CAER,OAAOhD,CAAAA,CAAyBuB,CAAa,CAC/C,CAAA,MAASrB,CAAAA,CAAO,CACd,OAAOF,CAAAA,CAAyB,KAAME,CAAK,CAC7C,CACF,CAGA,MAAM,MAAA,EAA8C,CAClD,OAAOF,CAAAA,CAA6B,CAClC,MAAA,CAAQ,SAAA,CACR,QAAS,OACX,CAAC,CACH,CACF,CAAA,CCloBO,IAAM0D,EAAc,IAAIC,mBAAAA,CAAwB,SAAS,EAkBzD,SAASC,EAAYC,CAAAA,CAAuB,EAAC,CAAyB,CAC3E,OAAOC,6BAAAA,CAAyB,CAC9B,CACE,OAAA,CAASJ,EACT,UAAA,CAAY,IAAM,IAAIrD,CAAAA,CAAQ,CAC5B,MAAA,CAAQwD,CAAAA,CAAQ,MAAA,CAChB,aAAA,CAAeA,EAAQ,aACzB,CAAC,CACH,CACF,CAAC,CACH,CAcO,SAASE,CAAAA,EAAsB,CACpC,OAAOC,WAAAA,CAAON,CAAW,CAC3B,CC/BA,SAASO,CAAAA,CACPC,CAAAA,CACgB,CAChB,IAAMjE,CAAAA,CAAOkE,YAAiB,IAAI,CAAA,CAC5BjE,EAAQiE,WAAAA,CAAsB,IAAI,EAClCC,CAAAA,CAAUD,WAAAA,CAAO,IAAI,CAAA,CAErBE,CAAAA,CAAU,SAAY,CAC1BD,CAAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,CAChBlE,CAAAA,CAAM,IAAI,IAAI,CAAA,CACd,GAAI,CACF,IAAMa,EAAS,MAAMmD,CAAAA,GACrBjE,CAAAA,CAAK,GAAA,CAAIc,EAAO,IAAI,CAAA,CACpBb,CAAAA,CAAM,GAAA,CAAIa,CAAAA,CAAO,KAAK,EACxB,CAAA,MAASuD,CAAAA,CAAK,CACZpE,CAAAA,CAAM,GAAA,CAAIoE,aAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,MAAA,CAAOA,CAAG,CAAC,EAC1DrE,CAAAA,CAAK,GAAA,CAAI,IAAI,EACf,CAAA,OAAE,CACAmE,CAAAA,CAAQ,GAAA,CAAI,KAAK,EACnB,CACF,CAAA,CAGA,OAAAC,CAAAA,EAAQ,CAED,CACL,IAAA,CAAMpE,CAAAA,CAAK,YAAW,CACtB,KAAA,CAAOC,CAAAA,CAAM,UAAA,EAAW,CACxB,OAAA,CAASkE,EAAQ,UAAA,EAAW,CAC5B,QAASC,CACX,CACF,CAGO,SAASE,CAAAA,CACd7C,CAAAA,CACAV,CAAAA,CACsB,CACtB,IAAMwD,EAAOT,CAAAA,EAAW,CACxB,OAAOE,CAAAA,CAAc,IAAMO,EAAK,UAAA,CAAW9C,CAAAA,CAAgBV,CAAM,CAAC,CACpE,CAGO,SAASyD,CAAAA,CACdxB,CAAAA,CACAjC,EACoB,CACpB,IAAMwD,EAAOT,CAAAA,EAAW,CACxB,OAAOE,CAAAA,CAAc,IAAMO,CAAAA,CAAK,SAASvB,CAAAA,CAASjC,CAAM,CAAC,CAC3D,CAGO,SAAS0D,CAAAA,CACd1D,CAAAA,CAC2B,CAC3B,IAAMwD,CAAAA,CAAOT,CAAAA,GACb,OAAOE,CAAAA,CAAc,IAAMO,CAAAA,CAAK,cAAA,CAAexD,CAAM,CAAC,CACxD,CAGO,SAAS2D,CAAAA,CAAclD,CAAAA,CAAuC,CACnE,IAAM+C,CAAAA,CAAOT,GAAW,CACxB,OAAOE,EAAc,IAAMO,CAAAA,CAAK,aAAA,CAAc/C,CAAI,CAAC,CACrD,CAGO,SAASmD,CAAAA,CACd5D,EACsB,CACtB,IAAMwD,EAAOT,CAAAA,EAAW,CACxB,OAAOE,CAAAA,CAAc,IAAMO,CAAAA,CAAK,UAAUxD,CAAM,CAAC,CACnD,CAGO,SAAS6D,EAAY1B,CAAAA,CAAwC,CAClE,IAAMqB,CAAAA,CAAOT,CAAAA,EAAW,CACxB,OAAOE,CAAAA,CAAc,IAAMO,EAAK,WAAA,CAAYrB,CAAO,CAAC,CACtD,CAGO,SAAS2B,CAAAA,EAAmC,CACjD,IAAMN,EAAOT,CAAAA,EAAW,CACxB,OAAOE,CAAAA,CAAc,IAAMO,EAAK,UAAA,EAAY,CAC9C,CAGO,SAASO,CAAAA,EAAoC,CAClD,IAAMP,CAAAA,CAAOT,GAAW,CACxB,OAAOE,EAAc,IAAMO,CAAAA,CAAK,UAAA,EAAY,CAC9C","file":"angular.js","sourcesContent":["import { createClient, type SupabaseClient } from '@supabase/supabase-js';\r\nimport type {\r\n ZenoConfig,\r\n ZenoResponse,\r\n PaginationParams,\r\n FilterParams,\r\n EmailParams,\r\n Collection,\r\n Entry,\r\n Asset,\r\n AssetUrl,\r\n Locale,\r\n Project,\r\n HealthStatus,\r\n} from './types';\r\n\r\n// Internal configuration - injected at build time from environment variables\r\nconst ZENO_INTERNAL = {\r\n endpoint: process.env.ZENO_ENDPOINT!,\r\n publicKey: process.env.ZENO_PUBLIC_KEY!,\r\n};\r\n\r\nfunction createResponse<T>(\r\n data: T | null,\r\n error: unknown = null,\r\n meta?: Omit<NonNullable<ZenoResponse<T>['meta']>, 'timestamp'>\r\n): ZenoResponse<T> {\r\n let errorMessage: string | null = null;\r\n if (error) {\r\n if (typeof error === 'string') errorMessage = error;\r\n else if (error instanceof Error) errorMessage = error.message;\r\n else if (typeof error === 'object' && error !== null && 'message' in error) {\r\n errorMessage = String((error as { message: unknown }).message);\r\n }\r\n }\r\n\r\n return {\r\n data,\r\n error: errorMessage,\r\n meta: {\r\n ...meta,\r\n timestamp: new Date().toISOString(),\r\n },\r\n };\r\n}\r\n\r\nexport class ZenoCMS {\r\n private supabase: SupabaseClient;\r\n private apiKey: string;\r\n private projectSlug: string;\r\n private apiToken: string;\r\n private projectId: string | null = null;\r\n private isValidated: boolean = false;\r\n private configDefaultLocale: string | undefined;\r\n private resolvedDefaultLocale: string | null = null;\r\n\r\n constructor(config: ZenoConfig = {}) {\r\n // Resolve API key: explicit config > environment variable\r\n const apiKey = config.apiKey || this.getEnvApiKey();\r\n\r\n if (!apiKey) {\r\n throw new Error(\r\n 'Missing API key. Provide it via config.apiKey or set an environment variable: ' +\r\n 'ZENO_API_KEY, VITE_ZENO_API_KEY, NEXT_PUBLIC_ZENO_API_KEY, or PUBLIC_ZENO_API_KEY.'\r\n );\r\n }\r\n\r\n // Parse and validate API key format: zeno_<projectSlug>_<token>\r\n const parsed = this.parseApiKey(apiKey);\r\n this.apiKey = apiKey;\r\n this.projectSlug = parsed.projectSlug;\r\n this.apiToken = parsed.token;\r\n this.configDefaultLocale = config.defaultLocale;\r\n\r\n this.supabase = createClient(ZENO_INTERNAL.endpoint, ZENO_INTERNAL.publicKey, {\r\n auth: {\r\n persistSession: false,\r\n autoRefreshToken: false,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Reads the API key from environment variables.\r\n * Checks multiple naming conventions so each framework only needs one .env variable:\r\n * ZENO_API_KEY — Node.js / server-side\r\n * NEXT_PUBLIC_ZENO_API_KEY — Next.js client\r\n * VITE_ZENO_API_KEY — Vite (React, Vue, Svelte)\r\n * PUBLIC_ZENO_API_KEY — Astro client\r\n */\r\n private getEnvApiKey(): string | undefined {\r\n // Node.js / Next.js (process.env)\r\n if (typeof process !== 'undefined' && process.env) {\r\n if (process.env.ZENO_API_KEY) return process.env.ZENO_API_KEY;\r\n if (process.env.NEXT_PUBLIC_ZENO_API_KEY) return process.env.NEXT_PUBLIC_ZENO_API_KEY;\r\n if (process.env.VITE_ZENO_API_KEY) return process.env.VITE_ZENO_API_KEY;\r\n if (process.env.PUBLIC_ZENO_API_KEY) return process.env.PUBLIC_ZENO_API_KEY;\r\n }\r\n\r\n // Vite / Astro / SvelteKit (import.meta.env)\r\n // IMPORTANT: Each variable must be accessed as a literal expression (import.meta.env.VAR_NAME)\r\n // so that Vite can statically replace them at build time, even inside node_modules.\r\n // Dynamic access like import.meta.env[key] will NOT be transformed by Vite.\r\n try {\r\n // @ts-expect-error - import.meta.env may not exist in all environments\r\n if (import.meta.env?.ZENO_API_KEY) return import.meta.env.ZENO_API_KEY;\r\n // @ts-expect-error\r\n if (import.meta.env?.VITE_ZENO_API_KEY) return import.meta.env.VITE_ZENO_API_KEY;\r\n // @ts-expect-error\r\n if (import.meta.env?.PUBLIC_ZENO_API_KEY) return import.meta.env.PUBLIC_ZENO_API_KEY;\r\n // @ts-expect-error\r\n if (import.meta.env?.NEXT_PUBLIC_ZENO_API_KEY) return import.meta.env.NEXT_PUBLIC_ZENO_API_KEY;\r\n } catch {\r\n // import.meta not available\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Parse and validate the API key format.\r\n * Expected format: zeno_<projectSlug>_<token>\r\n */\r\n private parseApiKey(apiKey: string): { projectSlug: string; token: string } {\r\n if (!apiKey.startsWith('zeno_')) {\r\n throw new Error('Invalid API key format. Expected: zeno_<projectSlug>_<token>');\r\n }\r\n\r\n const withoutPrefix = apiKey.slice(5); // Remove 'zeno_'\r\n const separatorIndex = withoutPrefix.indexOf('_');\r\n\r\n if (separatorIndex === -1) {\r\n throw new Error('Invalid API key format. Expected: zeno_<projectSlug>_<token>');\r\n }\r\n\r\n const projectSlug = withoutPrefix.slice(0, separatorIndex);\r\n const token = withoutPrefix.slice(separatorIndex + 1);\r\n\r\n if (!projectSlug || !token) {\r\n throw new Error('Invalid API key format. Expected: zeno_<projectSlug>_<token>');\r\n }\r\n\r\n return { projectSlug, token };\r\n }\r\n\r\n /**\r\n * Returns the fallback locale to use.\r\n * Priority: config.defaultLocale > project's default locale from DB > 'en'.\r\n */\r\n private async getDefaultLocale(): Promise<string> {\r\n if (this.configDefaultLocale) return this.configDefaultLocale;\r\n if (this.resolvedDefaultLocale) return this.resolvedDefaultLocale;\r\n\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n const { data } = await this.supabase\r\n .from('project_locales')\r\n .select('locale_code')\r\n .eq('project_id', projectId)\r\n .eq('is_default', true)\r\n .single();\r\n\r\n if (data?.locale_code) {\r\n this.resolvedDefaultLocale = data.locale_code;\r\n return data.locale_code;\r\n }\r\n } catch {\r\n // Fall through to 'en'\r\n }\r\n\r\n this.resolvedDefaultLocale = 'en';\r\n return 'en';\r\n }\r\n\r\n /**\r\n * Resolves and validates the project ID using the API key.\r\n * Validates the token server-side for security.\r\n */\r\n private async resolveProjectId(): Promise<string> {\r\n // Return cached project ID if already validated\r\n if (this.projectId && this.isValidated) return this.projectId;\r\n\r\n // Call server-side validation function\r\n const { data, error } = await this.supabase.rpc('validate_sdk_api_key', {\r\n p_project_slug: this.projectSlug,\r\n p_token: this.apiToken,\r\n });\r\n\r\n if (error) {\r\n throw new Error('API key validation failed: ' + error.message);\r\n }\r\n\r\n // The RPC returns a single row with project_id, is_valid, error_message\r\n const result = data?.[0];\r\n\r\n if (!result || !result.is_valid) {\r\n throw new Error(result?.error_message || 'Invalid API key or project not found');\r\n }\r\n\r\n this.projectId = result.project_id;\r\n this.isValidated = true;\r\n return result.project_id;\r\n }\r\n\r\n /** Get project information */\r\n async getProject(): Promise<ZenoResponse<Project>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n\r\n const { data, error } = await this.supabase\r\n .from('projects')\r\n .select('id, name, description, slug, status, created_at, updated_at')\r\n .eq('id', projectId)\r\n .single();\r\n\r\n return createResponse(data, error);\r\n } catch (error) {\r\n return createResponse<Project>(null, error);\r\n }\r\n }\r\n\r\n /** Get all collections for the project */\r\n async getCollections(params: PaginationParams = {}): Promise<ZenoResponse<Collection[]>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n const { page = 1, limit = 50, sortBy = 'created_at', sortOrder = 'desc' } = params;\r\n const offset = (page - 1) * limit;\r\n\r\n const { count } = await this.supabase\r\n .from('collections')\r\n .select('*', { count: 'exact', head: true })\r\n .eq('project_id', projectId);\r\n\r\n const { data, error } = await this.supabase\r\n .from('collections')\r\n .select('id, name, slug, description, fields, created_at, updated_at')\r\n .eq('project_id', projectId)\r\n .order(sortBy, { ascending: sortOrder === 'asc' })\r\n .range(offset, offset + limit - 1);\r\n\r\n const processedData = data?.map((c) => ({\r\n ...c,\r\n fields: typeof c.fields === 'string' ? JSON.parse(c.fields) : c.fields,\r\n }));\r\n\r\n return createResponse(processedData as Collection[] | null, error, {\r\n total: count || 0,\r\n page,\r\n limit,\r\n totalPages: Math.ceil((count || 0) / limit),\r\n });\r\n } catch (error) {\r\n return createResponse<Collection[]>(null, error);\r\n }\r\n }\r\n\r\n /** Get a single collection by slug */\r\n async getCollection(slug: string): Promise<ZenoResponse<Collection>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n\r\n const { data, error } = await this.supabase\r\n .from('collections')\r\n .select('id, name, slug, description, fields, created_at, updated_at')\r\n .eq('project_id', projectId)\r\n .eq('slug', slug)\r\n .single();\r\n\r\n const processedData = data\r\n ? { ...data, fields: typeof data.fields === 'string' ? JSON.parse(data.fields) : data.fields }\r\n : null;\r\n\r\n return createResponse(processedData as Collection | null, error);\r\n } catch (error) {\r\n return createResponse<Collection>(null, error);\r\n }\r\n }\r\n\r\n /** Get entries, optionally filtered by collection slug */\r\n async getEntries(\r\n collectionSlug?: string,\r\n params: PaginationParams & FilterParams = {}\r\n ): Promise<ZenoResponse<Entry[]>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n const {\r\n page = 1,\r\n limit = 50,\r\n sortBy = 'created_at',\r\n sortOrder = 'desc',\r\n status,\r\n search,\r\n locale,\r\n fallback_locale,\r\n dateFrom,\r\n dateTo,\r\n dateField,\r\n } = params;\r\n const effectiveFallback = fallback_locale || await this.getDefaultLocale();\r\n const offset = (page - 1) * limit;\r\n\r\n let query = this.supabase\r\n .from('entries')\r\n .select(`\r\n id, data, status, collection_id, project_id, created_at, updated_at,\r\n collections ( id, name, slug )\r\n `)\r\n .eq('project_id', projectId);\r\n\r\n // Filter by collection\r\n if (collectionSlug) {\r\n const { data: collection } = await this.supabase\r\n .from('collections')\r\n .select('id')\r\n .eq('project_id', projectId)\r\n .eq('slug', collectionSlug)\r\n .single();\r\n\r\n if (!collection) {\r\n return createResponse<Entry[]>(null, 'Collection not found');\r\n }\r\n query = query.eq('collection_id', collection.id);\r\n }\r\n\r\n if (status) query = query.eq('status', status);\r\n if (search) query = query.textSearch('data', search);\r\n\r\n // Date filtering: use dateField inside data if specified, otherwise use created_at\r\n if (dateFrom) {\r\n query = dateField\r\n ? query.gte(`data->${dateField}`, dateFrom)\r\n : query.gte('created_at', dateFrom);\r\n }\r\n if (dateTo) {\r\n query = dateField\r\n ? query.lte(`data->${dateField}`, dateTo)\r\n : query.lte('created_at', dateTo);\r\n }\r\n\r\n // Count query\r\n let countQuery = this.supabase\r\n .from('entries')\r\n .select('*', { count: 'exact', head: true })\r\n .eq('project_id', projectId);\r\n\r\n if (collectionSlug) {\r\n const { data: collection } = await this.supabase\r\n .from('collections')\r\n .select('id')\r\n .eq('project_id', projectId)\r\n .eq('slug', collectionSlug)\r\n .single();\r\n\r\n if (collection) countQuery = countQuery.eq('collection_id', collection.id);\r\n }\r\n if (status) countQuery = countQuery.eq('status', status);\r\n if (search) countQuery = countQuery.textSearch('data', search);\r\n\r\n // Date filtering for count query\r\n if (dateFrom) {\r\n countQuery = dateField\r\n ? countQuery.gte(`data->${dateField}`, dateFrom)\r\n : countQuery.gte('created_at', dateFrom);\r\n }\r\n if (dateTo) {\r\n countQuery = dateField\r\n ? countQuery.lte(`data->${dateField}`, dateTo)\r\n : countQuery.lte('created_at', dateTo);\r\n }\r\n\r\n const { count } = await countQuery;\r\n\r\n const { data, error } = await query\r\n .order(sortBy, { ascending: sortOrder === 'asc' })\r\n .range(offset, offset + limit - 1);\r\n\r\n if (error) throw error;\r\n\r\n // Normalize Supabase join (returns array for relations) and apply localization\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const rows = (data as any[]) ?? [];\r\n const normalized = rows.map((row) => ({\r\n ...row,\r\n collections: Array.isArray(row.collections) ? row.collections[0] : row.collections,\r\n }));\r\n\r\n let processedData = normalized;\r\n let fallbackUsed = false;\r\n\r\n if (locale && normalized.length > 0) {\r\n try {\r\n // Use batch function to avoid N+1 queries\r\n const entryIds = normalized.map((e) => e.id);\r\n const result = await this.supabase.rpc('get_localized_entries_batch', {\r\n entry_uuids: entryIds,\r\n locale,\r\n fallback_locale: effectiveFallback,\r\n });\r\n\r\n if (result.data && result.data.length > 0) {\r\n // Create a map for quick lookup\r\n const localeMap = new Map<string, { data: Record<string, unknown>; locale_code: string; is_fallback: boolean }>();\r\n for (const loc of result.data) {\r\n localeMap.set(loc.entry_id, {\r\n data: loc.data,\r\n locale_code: loc.locale_code,\r\n is_fallback: loc.is_fallback,\r\n });\r\n }\r\n\r\n // Merge localized data with entries\r\n processedData = normalized.map((entry) => {\r\n const localized = localeMap.get(entry.id);\r\n if (localized) {\r\n if (localized.is_fallback) fallbackUsed = true;\r\n return { ...entry, data: localized.data, locale_code: localized.locale_code };\r\n }\r\n return entry;\r\n });\r\n }\r\n } catch {\r\n // Fallback to base data if batch function fails\r\n }\r\n }\r\n\r\n // Available locales\r\n const { data: availableLocales } = await this.supabase\r\n .from('project_locales')\r\n .select('locale_code')\r\n .eq('project_id', projectId)\r\n .eq('is_active', true);\r\n\r\n return createResponse(processedData as Entry[] | null, null, {\r\n total: count || 0,\r\n page,\r\n limit,\r\n totalPages: Math.ceil((count || 0) / limit),\r\n locale: locale || effectiveFallback,\r\n fallback_used: fallbackUsed,\r\n available_locales: availableLocales?.map((l) => l.locale_code) || [],\r\n });\r\n } catch (error) {\r\n return createResponse<Entry[]>(null, error);\r\n }\r\n }\r\n\r\n /** Get a single entry by ID */\r\n async getEntry(\r\n entryId: string,\r\n params: { locale?: string; fallback_locale?: string } = {}\r\n ): Promise<ZenoResponse<Entry>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n const { locale, fallback_locale } = params;\r\n const effectiveFallback = fallback_locale || await this.getDefaultLocale();\r\n\r\n const { data, error } = await this.supabase\r\n .from('entries')\r\n .select(`\r\n id, data, status, collection_id, project_id, created_at, updated_at,\r\n collections ( id, name, slug, fields )\r\n `)\r\n .eq('project_id', projectId)\r\n .eq('id', entryId)\r\n .single();\r\n\r\n if (error) throw error;\r\n\r\n // Normalize Supabase join (returns array for relations)\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const row = data as any;\r\n const normalized = row ? {\r\n ...row,\r\n collections: Array.isArray(row.collections) ? row.collections[0] : row.collections,\r\n } : null;\r\n\r\n let processedData = normalized;\r\n let fallbackUsed = false;\r\n\r\n if (locale && normalized) {\r\n try {\r\n const result = await this.supabase.rpc('get_localized_entry', {\r\n entry_uuid: entryId,\r\n locale,\r\n fallback_locale: effectiveFallback,\r\n });\r\n\r\n if (result.data?.[0]) {\r\n const localized = result.data[0];\r\n if (localized.locale_code !== locale) fallbackUsed = true;\r\n processedData = { ...normalized, data: localized.data, locale_code: localized.locale_code };\r\n }\r\n } catch {\r\n // Fallback to base data\r\n }\r\n }\r\n\r\n const { data: availableLocales } = await this.supabase\r\n .from('project_locales')\r\n .select('locale_code')\r\n .eq('project_id', projectId)\r\n .eq('is_active', true);\r\n\r\n return createResponse(processedData as Entry | null, null, {\r\n locale: locale || effectiveFallback,\r\n fallback_used: fallbackUsed,\r\n available_locales: availableLocales?.map((l) => l.locale_code) || [],\r\n });\r\n } catch (error) {\r\n return createResponse<Entry>(null, error);\r\n }\r\n }\r\n\r\n /** Get assets for the project */\r\n async getAssets(\r\n params: PaginationParams & { mimeType?: string } = {}\r\n ): Promise<ZenoResponse<Asset[]>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n const { page = 1, limit = 50, sortBy = 'created_at', sortOrder = 'desc', mimeType } = params;\r\n const offset = (page - 1) * limit;\r\n\r\n let query = this.supabase\r\n .from('assets')\r\n .select('id, filename, original_filename, mime_type, size_bytes, metadata, created_at')\r\n .eq('project_id', projectId);\r\n\r\n if (mimeType) query = query.like('mime_type', `${mimeType}%`);\r\n\r\n let countQuery = this.supabase\r\n .from('assets')\r\n .select('*', { count: 'exact', head: true })\r\n .eq('project_id', projectId);\r\n\r\n if (mimeType) countQuery = countQuery.like('mime_type', `${mimeType}%`);\r\n\r\n const { count } = await countQuery;\r\n\r\n const { data, error } = await query\r\n .order(sortBy, { ascending: sortOrder === 'asc' })\r\n .range(offset, offset + limit - 1);\r\n\r\n return createResponse(data as Asset[] | null, error, {\r\n total: count || 0,\r\n page,\r\n limit,\r\n totalPages: Math.ceil((count || 0) / limit),\r\n });\r\n } catch (error) {\r\n return createResponse<Asset[]>(null, error);\r\n }\r\n }\r\n\r\n /** Get a signed download URL for an asset */\r\n async getAssetUrl(assetId: string): Promise<ZenoResponse<AssetUrl>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n\r\n const { data: asset, error: assetError } = await this.supabase\r\n .from('assets')\r\n .select('storage_path')\r\n .eq('project_id', projectId)\r\n .eq('id', assetId)\r\n .single();\r\n\r\n if (assetError || !asset) {\r\n return createResponse<AssetUrl>(null, 'Asset not found');\r\n }\r\n\r\n const { data: urlData, error: urlError } = await this.supabase\r\n .storage\r\n .from('assets')\r\n .createSignedUrl(asset.storage_path, 3600);\r\n\r\n if (urlError) {\r\n return createResponse<AssetUrl>(null, urlError);\r\n }\r\n\r\n return createResponse<AssetUrl>({\r\n downloadUrl: urlData.signedUrl,\r\n expiresIn: 3600,\r\n });\r\n } catch (error) {\r\n return createResponse<AssetUrl>(null, error);\r\n }\r\n }\r\n\r\n /** Send an email via the Zeno edge function */\r\n async sendEmail(emailParams: EmailParams): Promise<ZenoResponse<{ messageId: string }>> {\r\n try {\r\n const response = await fetch(`${ZENO_INTERNAL.endpoint}/functions/v1/api/email/send`, {\r\n method: 'POST',\r\n headers: {\r\n 'Authorization': `Bearer ${this.apiKey}`,\r\n 'X-API-Key': this.apiKey,\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(emailParams),\r\n });\r\n\r\n const result = await response.json();\r\n\r\n if (!response.ok) {\r\n return createResponse<{ messageId: string }>(null, result.error || 'Email sending failed');\r\n }\r\n\r\n return createResponse(result.data);\r\n } catch (error) {\r\n return createResponse<{ messageId: string }>(null, error);\r\n }\r\n }\r\n\r\n /** Get available locales for the project */\r\n async getLocales(): Promise<ZenoResponse<Locale[]>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n\r\n const { data, error } = await this.supabase\r\n .from('project_locales')\r\n .select('locale_code, locale_name, locale_native_name, is_default')\r\n .eq('project_id', projectId)\r\n .eq('is_active', true)\r\n .order('is_default', { ascending: false })\r\n .order('locale_name', { ascending: true });\r\n\r\n if (error) throw error;\r\n\r\n const processedData = data?.map((l) => ({\r\n code: l.locale_code,\r\n name: l.locale_name,\r\n native_name: l.locale_native_name,\r\n is_default: l.is_default,\r\n })) || [];\r\n\r\n return createResponse<Locale[]>(processedData);\r\n } catch (error) {\r\n return createResponse<Locale[]>(null, error);\r\n }\r\n }\r\n\r\n /** Health check */\r\n async health(): Promise<ZenoResponse<HealthStatus>> {\r\n return createResponse<HealthStatus>({\r\n status: 'healthy',\r\n version: '1.0.0',\r\n });\r\n }\r\n}\r\n","import { InjectionToken, inject, makeEnvironmentProviders, type EnvironmentProviders } from '@angular/core';\r\nimport { ZenoCMS } from '../client';\r\nimport type { ZenoOptions } from './types';\r\n\r\n/** Injection token for the ZenoCMS client */\r\nexport const ZENO_CLIENT = new InjectionToken<ZenoCMS>('ZenoCMS');\r\n\r\n/**\r\n * Provide the Zeno CMS client at the application level.\r\n * Use in your app config or root module providers.\r\n *\r\n * @example\r\n * ```ts\r\n * // app.config.ts\r\n * import { provideZeno } from '@zeno/sdk/angular'\r\n *\r\n * export const appConfig = {\r\n * providers: [\r\n * provideZeno({ apiKey: environment.zenoApiKey })\r\n * ]\r\n * }\r\n * ```\r\n */\r\nexport function provideZeno(options: ZenoOptions = {}): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: ZENO_CLIENT,\r\n useFactory: () => new ZenoCMS({\r\n apiKey: options.apiKey,\r\n defaultLocale: options.defaultLocale,\r\n }),\r\n },\r\n ]);\r\n}\r\n\r\n/**\r\n * Inject the ZenoCMS client instance.\r\n * Requires `provideZeno()` in your app providers.\r\n *\r\n * @example\r\n * ```ts\r\n * import { injectZeno } from '@zeno/sdk/angular'\r\n *\r\n * const zeno = injectZeno()\r\n * await zeno.sendEmail({ ... })\r\n * ```\r\n */\r\nexport function injectZeno(): ZenoCMS {\r\n return inject(ZENO_CLIENT);\r\n}\r\n","import { signal, type Signal } from '@angular/core';\r\nimport { injectZeno } from './provider';\r\nimport type { QueryResult } from './types';\r\nimport type {\r\n Entry,\r\n Collection,\r\n Asset,\r\n AssetUrl,\r\n Project,\r\n Locale,\r\n PaginationParams,\r\n FilterParams,\r\n} from '../types';\r\n\r\n/**\r\n * Internal helper: wraps an async SDK call with Angular signals.\r\n * Auto-fetches on creation and exposes a refresh function.\r\n */\r\nfunction useAsyncQuery<T>(\r\n fetcher: () => Promise<{ data: T | null; error: string | null }>\r\n): QueryResult<T> {\r\n const data = signal<T | null>(null);\r\n const error = signal<string | null>(null);\r\n const loading = signal(true);\r\n\r\n const execute = async () => {\r\n loading.set(true);\r\n error.set(null);\r\n try {\r\n const result = await fetcher();\r\n data.set(result.data);\r\n error.set(result.error);\r\n } catch (err) {\r\n error.set(err instanceof Error ? err.message : String(err));\r\n data.set(null);\r\n } finally {\r\n loading.set(false);\r\n }\r\n };\r\n\r\n // Auto-fetch immediately\r\n execute();\r\n\r\n return {\r\n data: data.asReadonly(),\r\n error: error.asReadonly(),\r\n loading: loading.asReadonly(),\r\n refresh: execute,\r\n };\r\n}\r\n\r\n/** Fetch entries, optionally filtered by collection slug */\r\nexport function useEntries(\r\n collectionSlug?: string,\r\n params?: PaginationParams & FilterParams\r\n): QueryResult<Entry[]> {\r\n const zeno = injectZeno();\r\n return useAsyncQuery(() => zeno.getEntries(collectionSlug, params));\r\n}\r\n\r\n/** Fetch a single entry by ID */\r\nexport function useEntry(\r\n entryId: string,\r\n params?: { locale?: string; fallback_locale?: string }\r\n): QueryResult<Entry> {\r\n const zeno = injectZeno();\r\n return useAsyncQuery(() => zeno.getEntry(entryId, params));\r\n}\r\n\r\n/** Fetch all collections */\r\nexport function useCollections(\r\n params?: PaginationParams\r\n): QueryResult<Collection[]> {\r\n const zeno = injectZeno();\r\n return useAsyncQuery(() => zeno.getCollections(params));\r\n}\r\n\r\n/** Fetch a single collection by slug */\r\nexport function useCollection(slug: string): QueryResult<Collection> {\r\n const zeno = injectZeno();\r\n return useAsyncQuery(() => zeno.getCollection(slug));\r\n}\r\n\r\n/** Fetch assets */\r\nexport function useAssets(\r\n params?: PaginationParams & { mimeType?: string }\r\n): QueryResult<Asset[]> {\r\n const zeno = injectZeno();\r\n return useAsyncQuery(() => zeno.getAssets(params));\r\n}\r\n\r\n/** Get a signed download URL for an asset */\r\nexport function useAssetUrl(assetId: string): QueryResult<AssetUrl> {\r\n const zeno = injectZeno();\r\n return useAsyncQuery(() => zeno.getAssetUrl(assetId));\r\n}\r\n\r\n/** Fetch project information */\r\nexport function useProject(): QueryResult<Project> {\r\n const zeno = injectZeno();\r\n return useAsyncQuery(() => zeno.getProject());\r\n}\r\n\r\n/** Fetch available locales */\r\nexport function useLocales(): QueryResult<Locale[]> {\r\n const zeno = injectZeno();\r\n return useAsyncQuery(() => zeno.getLocales());\r\n}\r\n"]}
package/dist/angular.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import {a}from'./chunk-4ROHQDX7.mjs';import {InjectionToken,makeEnvironmentProviders,inject,signal}from'@angular/core';var i=new InjectionToken("ZenoCMS");function f(e={}){return makeEnvironmentProviders([{provide:i,useFactory:()=>new a({apiKey:e.apiKey,defaultLocale:e.defaultLocale})}])}function n(){return inject(i)}function o(e){let t=signal(null),r=signal(null),l=signal(true),a=async()=>{l.set(true),r.set(null);try{let s=await e();t.set(s.data),r.set(s.error);}catch(s){r.set(s instanceof Error?s.message:String(s)),t.set(null);}finally{l.set(false);}};return a(),{data:t.asReadonly(),error:r.asReadonly(),loading:l.asReadonly(),refresh:a}}function g(e,t){let r=n();return o(()=>r.getEntries(e,t))}function P(e,t){let r=n();return o(()=>r.getEntry(e,t))}function d(e){let t=n();return o(()=>t.getCollections(e))}function E(e){let t=n();return o(()=>t.getCollection(e))}function x(e){let t=n();return o(()=>t.getAssets(e))}function C(e){let t=n();return o(()=>t.getAssetUrl(e))}function R(){let e=n();return o(()=>e.getProject())}function Z(){let e=n();return o(()=>e.getLocales())}export{i as ZENO_CLIENT,n as injectZeno,f as provideZeno,C as useAssetUrl,x as useAssets,E as useCollection,d as useCollections,g as useEntries,P as useEntry,Z as useLocales,R as useProject};//# sourceMappingURL=angular.mjs.map
1
+ import {a}from'./chunk-JS2R67EO.mjs';import {InjectionToken,makeEnvironmentProviders,inject,signal}from'@angular/core';var i=new InjectionToken("ZenoCMS");function f(e={}){return makeEnvironmentProviders([{provide:i,useFactory:()=>new a({apiKey:e.apiKey,defaultLocale:e.defaultLocale})}])}function n(){return inject(i)}function o(e){let t=signal(null),r=signal(null),l=signal(true),a=async()=>{l.set(true),r.set(null);try{let s=await e();t.set(s.data),r.set(s.error);}catch(s){r.set(s instanceof Error?s.message:String(s)),t.set(null);}finally{l.set(false);}};return a(),{data:t.asReadonly(),error:r.asReadonly(),loading:l.asReadonly(),refresh:a}}function g(e,t){let r=n();return o(()=>r.getEntries(e,t))}function P(e,t){let r=n();return o(()=>r.getEntry(e,t))}function d(e){let t=n();return o(()=>t.getCollections(e))}function E(e){let t=n();return o(()=>t.getCollection(e))}function x(e){let t=n();return o(()=>t.getAssets(e))}function C(e){let t=n();return o(()=>t.getAssetUrl(e))}function R(){let e=n();return o(()=>e.getProject())}function Z(){let e=n();return o(()=>e.getLocales())}export{i as ZENO_CLIENT,n as injectZeno,f as provideZeno,C as useAssetUrl,x as useAssets,E as useCollection,d as useCollections,g as useEntries,P as useEntry,Z as useLocales,R as useProject};//# sourceMappingURL=angular.mjs.map
2
2
  //# sourceMappingURL=angular.mjs.map
@@ -0,0 +1,8 @@
1
+ import {createClient}from'@supabase/supabase-js';var w={endpoint:"https://kvpowojjhuprhxdyzmml.supabase.co",publicKey:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Imt2cG93b2pqaHVwcmh4ZHl6bW1sIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTI3ODEwNzAsImV4cCI6MjA2ODM1NzA3MH0.cCPzDNdfTb3WBtYL79GBlw4hfypl4tjnqu7XfEvdKBg"};function o(b,a=null,t){let e=null;return a&&(typeof a=="string"?e=a:a instanceof Error?e=a.message:typeof a=="object"&&a!==null&&"message"in a&&(e=String(a.message))),{data:b,error:e,meta:{...t,timestamp:new Date().toISOString()}}}var O=class{constructor(a={}){this.projectId=null;this.isValidated=false;this.resolvedDefaultLocale=null;let t=a.apiKey||this.getEnvApiKey();if(!t)throw new Error("Missing API key. Provide it via config.apiKey or set an environment variable: ZENO_API_KEY, VITE_ZENO_API_KEY, NEXT_PUBLIC_ZENO_API_KEY, or PUBLIC_ZENO_API_KEY.");let e=this.parseApiKey(t);this.apiKey=t,this.projectSlug=e.projectSlug,this.apiToken=e.token,this.configDefaultLocale=a.defaultLocale,this.supabase=createClient(w.endpoint,w.publicKey,{auth:{persistSession:false,autoRefreshToken:false}});}getEnvApiKey(){if(typeof process<"u"&&process.env){if(process.env.ZENO_API_KEY)return process.env.ZENO_API_KEY;if(process.env.NEXT_PUBLIC_ZENO_API_KEY)return process.env.NEXT_PUBLIC_ZENO_API_KEY;if(process.env.VITE_ZENO_API_KEY)return process.env.VITE_ZENO_API_KEY;if(process.env.PUBLIC_ZENO_API_KEY)return process.env.PUBLIC_ZENO_API_KEY}try{if(import.meta.env?.ZENO_API_KEY)return import.meta.env.ZENO_API_KEY;if(import.meta.env?.VITE_ZENO_API_KEY)return import.meta.env.VITE_ZENO_API_KEY;if(import.meta.env?.PUBLIC_ZENO_API_KEY)return import.meta.env.PUBLIC_ZENO_API_KEY;if(import.meta.env?.NEXT_PUBLIC_ZENO_API_KEY)return import.meta.env.NEXT_PUBLIC_ZENO_API_KEY}catch{}}parseApiKey(a){if(!a.startsWith("zeno_"))throw new Error("Invalid API key format. Expected: zeno_<projectSlug>_<token>");let t=a.slice(5),e=t.indexOf("_");if(e===-1)throw new Error("Invalid API key format. Expected: zeno_<projectSlug>_<token>");let s=t.slice(0,e),r=t.slice(e+1);if(!s||!r)throw new Error("Invalid API key format. Expected: zeno_<projectSlug>_<token>");return {projectSlug:s,token:r}}async getDefaultLocale(){if(this.configDefaultLocale)return this.configDefaultLocale;if(this.resolvedDefaultLocale)return this.resolvedDefaultLocale;try{let a=await this.resolveProjectId(),{data:t}=await this.supabase.from("project_locales").select("locale_code").eq("project_id",a).eq("is_default",!0).single();if(t?.locale_code)return this.resolvedDefaultLocale=t.locale_code,t.locale_code}catch{}return this.resolvedDefaultLocale="en","en"}async resolveProjectId(){if(this.projectId&&this.isValidated)return this.projectId;let{data:a,error:t}=await this.supabase.rpc("validate_sdk_api_key",{p_project_slug:this.projectSlug,p_token:this.apiToken});if(t)throw new Error("API key validation failed: "+t.message);let e=a?.[0];if(!e||!e.is_valid)throw new Error(e?.error_message||"Invalid API key or project not found");return this.projectId=e.project_id,this.isValidated=true,e.project_id}async getProject(){try{let a=await this.resolveProjectId(),{data:t,error:e}=await this.supabase.from("projects").select("id, name, description, slug, status, created_at, updated_at").eq("id",a).single();return o(t,e)}catch(a){return o(null,a)}}async getCollections(a={}){try{let t=await this.resolveProjectId(),{page:e=1,limit:s=50,sortBy:r="created_at",sortOrder:f="desc"}=a,m=(e-1)*s,{count:c}=await this.supabase.from("collections").select("*",{count:"exact",head:!0}).eq("project_id",t),{data:i,error:d}=await this.supabase.from("collections").select("id, name, slug, description, fields, created_at, updated_at").eq("project_id",t).order(r,{ascending:f==="asc"}).range(m,m+s-1),h=i?.map(l=>({...l,fields:typeof l.fields=="string"?JSON.parse(l.fields):l.fields}));return o(h,d,{total:c||0,page:e,limit:s,totalPages:Math.ceil((c||0)/s)})}catch(t){return o(null,t)}}async getCollection(a){try{let t=await this.resolveProjectId(),{data:e,error:s}=await this.supabase.from("collections").select("id, name, slug, description, fields, created_at, updated_at").eq("project_id",t).eq("slug",a).single(),r=e?{...e,fields:typeof e.fields=="string"?JSON.parse(e.fields):e.fields}:null;return o(r,s)}catch(t){return o(null,t)}}async getEntries(a,t={}){try{let e=await this.resolveProjectId(),{page:s=1,limit:r=50,sortBy:f="created_at",sortOrder:m="desc",status:c,search:i,locale:d,fallback_locale:h,dateFrom:l,dateTo:g,dateField:p}=t,E=h||await this.getDefaultLocale(),A=(s-1)*r,u=this.supabase.from("entries").select(`
2
+ id, data, status, collection_id, project_id, created_at, updated_at,
3
+ collections ( id, name, slug )
4
+ `).eq("project_id",e);if(a){let{data:n}=await this.supabase.from("collections").select("id").eq("project_id",e).eq("slug",a).single();if(!n)return o(null,"Collection not found");u=u.eq("collection_id",n.id);}c&&(u=u.eq("status",c)),i&&(u=u.textSearch("data",i)),l&&(u=p?u.gte(`data->${p}`,l):u.gte("created_at",l)),g&&(u=p?u.lte(`data->${p}`,g):u.lte("created_at",g));let _=this.supabase.from("entries").select("*",{count:"exact",head:!0}).eq("project_id",e);if(a){let{data:n}=await this.supabase.from("collections").select("id").eq("project_id",e).eq("slug",a).single();n&&(_=_.eq("collection_id",n.id));}c&&(_=_.eq("status",c)),i&&(_=_.textSearch("data",i)),l&&(_=p?_.gte(`data->${p}`,l):_.gte("created_at",l)),g&&(_=p?_.lte(`data->${p}`,g):_.lte("created_at",g));let{count:k}=await _,{data:L,error:N}=await u.order(f,{ascending:m==="asc"}).range(A,A+r-1);if(N)throw N;let P=(L??[]).map(n=>({...n,collections:Array.isArray(n.collections)?n.collections[0]:n.collections})),Z=P,K=!1;if(d&&P.length>0)try{let n=P.map(I=>I.id),j=await this.supabase.rpc("get_localized_entries_batch",{entry_uuids:n,locale:d,fallback_locale:E});if(j.data&&j.data.length>0){let I=new Map;for(let y of j.data)I.set(y.entry_id,{data:y.data,locale_code:y.locale_code,is_fallback:y.is_fallback});Z=P.map(y=>{let v=I.get(y.id);return v?(v.is_fallback&&(K=!0),{...y,data:v.data,locale_code:v.locale_code}):y});}}catch{}let{data:q}=await this.supabase.from("project_locales").select("locale_code").eq("project_id",e).eq("is_active",!0);return o(Z,null,{total:k||0,page:s,limit:r,totalPages:Math.ceil((k||0)/r),locale:d||E,fallback_used:K,available_locales:q?.map(n=>n.locale_code)||[]})}catch(e){return o(null,e)}}async getEntry(a,t={}){try{let e=await this.resolveProjectId(),{locale:s,fallback_locale:r}=t,f=r||await this.getDefaultLocale(),{data:m,error:c}=await this.supabase.from("entries").select(`
5
+ id, data, status, collection_id, project_id, created_at, updated_at,
6
+ collections ( id, name, slug, fields )
7
+ `).eq("project_id",e).eq("id",a).single();if(c)throw c;let i=m,d=i?{...i,collections:Array.isArray(i.collections)?i.collections[0]:i.collections}:null,h=d,l=!1;if(s&&d)try{let p=await this.supabase.rpc("get_localized_entry",{entry_uuid:a,locale:s,fallback_locale:f});if(p.data?.[0]){let E=p.data[0];E.locale_code!==s&&(l=!0),h={...d,data:E.data,locale_code:E.locale_code};}}catch{}let{data:g}=await this.supabase.from("project_locales").select("locale_code").eq("project_id",e).eq("is_active",!0);return o(h,null,{locale:s||f,fallback_used:l,available_locales:g?.map(p=>p.locale_code)||[]})}catch(e){return o(null,e)}}async getAssets(a={}){try{let t=await this.resolveProjectId(),{page:e=1,limit:s=50,sortBy:r="created_at",sortOrder:f="desc",mimeType:m}=a,c=(e-1)*s,i=this.supabase.from("assets").select("id, filename, original_filename, mime_type, size_bytes, metadata, created_at").eq("project_id",t);m&&(i=i.like("mime_type",`${m}%`));let d=this.supabase.from("assets").select("*",{count:"exact",head:!0}).eq("project_id",t);m&&(d=d.like("mime_type",`${m}%`));let{count:h}=await d,{data:l,error:g}=await i.order(r,{ascending:f==="asc"}).range(c,c+s-1);return o(l,g,{total:h||0,page:e,limit:s,totalPages:Math.ceil((h||0)/s)})}catch(t){return o(null,t)}}async getAssetUrl(a){try{let t=await this.resolveProjectId(),{data:e,error:s}=await this.supabase.from("assets").select("storage_path").eq("project_id",t).eq("id",a).single();if(s||!e)return o(null,"Asset not found");let{data:r,error:f}=await this.supabase.storage.from("assets").createSignedUrl(e.storage_path,3600);return f?o(null,f):o({downloadUrl:r.signedUrl,expiresIn:3600})}catch(t){return o(null,t)}}async sendEmail(a){try{let t=await fetch(`${w.endpoint}/functions/v1/api/email/send`,{method:"POST",headers:{Authorization:`Bearer ${this.apiKey}`,"X-API-Key":this.apiKey,"Content-Type":"application/json"},body:JSON.stringify(a)}),e=await t.json();return t.ok?o(e.data):o(null,e.error||"Email sending failed")}catch(t){return o(null,t)}}async getLocales(){try{let a=await this.resolveProjectId(),{data:t,error:e}=await this.supabase.from("project_locales").select("locale_code, locale_name, locale_native_name, is_default").eq("project_id",a).eq("is_active",!0).order("is_default",{ascending:!1}).order("locale_name",{ascending:!0});if(e)throw e;let s=t?.map(r=>({code:r.locale_code,name:r.locale_name,native_name:r.locale_native_name,is_default:r.is_default}))||[];return o(s)}catch(a){return o(null,a)}}async health(){return o({status:"healthy",version:"1.0.0"})}};export{O as a};//# sourceMappingURL=chunk-JS2R67EO.mjs.map
8
+ //# sourceMappingURL=chunk-JS2R67EO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.ts"],"names":["ZENO_INTERNAL","createResponse","data","error","meta","errorMessage","ZenoCMS","config","apiKey","parsed","createClient","withoutPrefix","separatorIndex","projectSlug","token","projectId","result","params","page","limit","sortBy","sortOrder","offset","count","processedData","c","slug","collectionSlug","status","search","locale","fallback_locale","dateFrom","dateTo","dateField","effectiveFallback","query","collection","countQuery","normalized","row","fallbackUsed","entryIds","e","localeMap","loc","entry","localized","availableLocales","l","entryId","mimeType","assetId","asset","assetError","urlData","urlError","emailParams","response"],"mappings":"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","file":"chunk-JS2R67EO.mjs","sourcesContent":["import { createClient, type SupabaseClient } from '@supabase/supabase-js';\r\nimport type {\r\n ZenoConfig,\r\n ZenoResponse,\r\n PaginationParams,\r\n FilterParams,\r\n EmailParams,\r\n Collection,\r\n Entry,\r\n Asset,\r\n AssetUrl,\r\n Locale,\r\n Project,\r\n HealthStatus,\r\n} from './types';\r\n\r\n// Internal configuration - injected at build time from environment variables\r\nconst ZENO_INTERNAL = {\r\n endpoint: process.env.ZENO_ENDPOINT!,\r\n publicKey: process.env.ZENO_PUBLIC_KEY!,\r\n};\r\n\r\nfunction createResponse<T>(\r\n data: T | null,\r\n error: unknown = null,\r\n meta?: Omit<NonNullable<ZenoResponse<T>['meta']>, 'timestamp'>\r\n): ZenoResponse<T> {\r\n let errorMessage: string | null = null;\r\n if (error) {\r\n if (typeof error === 'string') errorMessage = error;\r\n else if (error instanceof Error) errorMessage = error.message;\r\n else if (typeof error === 'object' && error !== null && 'message' in error) {\r\n errorMessage = String((error as { message: unknown }).message);\r\n }\r\n }\r\n\r\n return {\r\n data,\r\n error: errorMessage,\r\n meta: {\r\n ...meta,\r\n timestamp: new Date().toISOString(),\r\n },\r\n };\r\n}\r\n\r\nexport class ZenoCMS {\r\n private supabase: SupabaseClient;\r\n private apiKey: string;\r\n private projectSlug: string;\r\n private apiToken: string;\r\n private projectId: string | null = null;\r\n private isValidated: boolean = false;\r\n private configDefaultLocale: string | undefined;\r\n private resolvedDefaultLocale: string | null = null;\r\n\r\n constructor(config: ZenoConfig = {}) {\r\n // Resolve API key: explicit config > environment variable\r\n const apiKey = config.apiKey || this.getEnvApiKey();\r\n\r\n if (!apiKey) {\r\n throw new Error(\r\n 'Missing API key. Provide it via config.apiKey or set an environment variable: ' +\r\n 'ZENO_API_KEY, VITE_ZENO_API_KEY, NEXT_PUBLIC_ZENO_API_KEY, or PUBLIC_ZENO_API_KEY.'\r\n );\r\n }\r\n\r\n // Parse and validate API key format: zeno_<projectSlug>_<token>\r\n const parsed = this.parseApiKey(apiKey);\r\n this.apiKey = apiKey;\r\n this.projectSlug = parsed.projectSlug;\r\n this.apiToken = parsed.token;\r\n this.configDefaultLocale = config.defaultLocale;\r\n\r\n this.supabase = createClient(ZENO_INTERNAL.endpoint, ZENO_INTERNAL.publicKey, {\r\n auth: {\r\n persistSession: false,\r\n autoRefreshToken: false,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Reads the API key from environment variables.\r\n * Checks multiple naming conventions so each framework only needs one .env variable:\r\n * ZENO_API_KEY — Node.js / server-side\r\n * NEXT_PUBLIC_ZENO_API_KEY — Next.js client\r\n * VITE_ZENO_API_KEY — Vite (React, Vue, Svelte)\r\n * PUBLIC_ZENO_API_KEY — Astro client\r\n */\r\n private getEnvApiKey(): string | undefined {\r\n // Node.js / Next.js (process.env)\r\n if (typeof process !== 'undefined' && process.env) {\r\n if (process.env.ZENO_API_KEY) return process.env.ZENO_API_KEY;\r\n if (process.env.NEXT_PUBLIC_ZENO_API_KEY) return process.env.NEXT_PUBLIC_ZENO_API_KEY;\r\n if (process.env.VITE_ZENO_API_KEY) return process.env.VITE_ZENO_API_KEY;\r\n if (process.env.PUBLIC_ZENO_API_KEY) return process.env.PUBLIC_ZENO_API_KEY;\r\n }\r\n\r\n // Vite / Astro / SvelteKit (import.meta.env)\r\n // IMPORTANT: Each variable must be accessed as a literal expression (import.meta.env.VAR_NAME)\r\n // so that Vite can statically replace them at build time, even inside node_modules.\r\n // Dynamic access like import.meta.env[key] will NOT be transformed by Vite.\r\n try {\r\n // @ts-expect-error - import.meta.env may not exist in all environments\r\n if (import.meta.env?.ZENO_API_KEY) return import.meta.env.ZENO_API_KEY;\r\n // @ts-expect-error\r\n if (import.meta.env?.VITE_ZENO_API_KEY) return import.meta.env.VITE_ZENO_API_KEY;\r\n // @ts-expect-error\r\n if (import.meta.env?.PUBLIC_ZENO_API_KEY) return import.meta.env.PUBLIC_ZENO_API_KEY;\r\n // @ts-expect-error\r\n if (import.meta.env?.NEXT_PUBLIC_ZENO_API_KEY) return import.meta.env.NEXT_PUBLIC_ZENO_API_KEY;\r\n } catch {\r\n // import.meta not available\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Parse and validate the API key format.\r\n * Expected format: zeno_<projectSlug>_<token>\r\n */\r\n private parseApiKey(apiKey: string): { projectSlug: string; token: string } {\r\n if (!apiKey.startsWith('zeno_')) {\r\n throw new Error('Invalid API key format. Expected: zeno_<projectSlug>_<token>');\r\n }\r\n\r\n const withoutPrefix = apiKey.slice(5); // Remove 'zeno_'\r\n const separatorIndex = withoutPrefix.indexOf('_');\r\n\r\n if (separatorIndex === -1) {\r\n throw new Error('Invalid API key format. Expected: zeno_<projectSlug>_<token>');\r\n }\r\n\r\n const projectSlug = withoutPrefix.slice(0, separatorIndex);\r\n const token = withoutPrefix.slice(separatorIndex + 1);\r\n\r\n if (!projectSlug || !token) {\r\n throw new Error('Invalid API key format. Expected: zeno_<projectSlug>_<token>');\r\n }\r\n\r\n return { projectSlug, token };\r\n }\r\n\r\n /**\r\n * Returns the fallback locale to use.\r\n * Priority: config.defaultLocale > project's default locale from DB > 'en'.\r\n */\r\n private async getDefaultLocale(): Promise<string> {\r\n if (this.configDefaultLocale) return this.configDefaultLocale;\r\n if (this.resolvedDefaultLocale) return this.resolvedDefaultLocale;\r\n\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n const { data } = await this.supabase\r\n .from('project_locales')\r\n .select('locale_code')\r\n .eq('project_id', projectId)\r\n .eq('is_default', true)\r\n .single();\r\n\r\n if (data?.locale_code) {\r\n this.resolvedDefaultLocale = data.locale_code;\r\n return data.locale_code;\r\n }\r\n } catch {\r\n // Fall through to 'en'\r\n }\r\n\r\n this.resolvedDefaultLocale = 'en';\r\n return 'en';\r\n }\r\n\r\n /**\r\n * Resolves and validates the project ID using the API key.\r\n * Validates the token server-side for security.\r\n */\r\n private async resolveProjectId(): Promise<string> {\r\n // Return cached project ID if already validated\r\n if (this.projectId && this.isValidated) return this.projectId;\r\n\r\n // Call server-side validation function\r\n const { data, error } = await this.supabase.rpc('validate_sdk_api_key', {\r\n p_project_slug: this.projectSlug,\r\n p_token: this.apiToken,\r\n });\r\n\r\n if (error) {\r\n throw new Error('API key validation failed: ' + error.message);\r\n }\r\n\r\n // The RPC returns a single row with project_id, is_valid, error_message\r\n const result = data?.[0];\r\n\r\n if (!result || !result.is_valid) {\r\n throw new Error(result?.error_message || 'Invalid API key or project not found');\r\n }\r\n\r\n this.projectId = result.project_id;\r\n this.isValidated = true;\r\n return result.project_id;\r\n }\r\n\r\n /** Get project information */\r\n async getProject(): Promise<ZenoResponse<Project>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n\r\n const { data, error } = await this.supabase\r\n .from('projects')\r\n .select('id, name, description, slug, status, created_at, updated_at')\r\n .eq('id', projectId)\r\n .single();\r\n\r\n return createResponse(data, error);\r\n } catch (error) {\r\n return createResponse<Project>(null, error);\r\n }\r\n }\r\n\r\n /** Get all collections for the project */\r\n async getCollections(params: PaginationParams = {}): Promise<ZenoResponse<Collection[]>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n const { page = 1, limit = 50, sortBy = 'created_at', sortOrder = 'desc' } = params;\r\n const offset = (page - 1) * limit;\r\n\r\n const { count } = await this.supabase\r\n .from('collections')\r\n .select('*', { count: 'exact', head: true })\r\n .eq('project_id', projectId);\r\n\r\n const { data, error } = await this.supabase\r\n .from('collections')\r\n .select('id, name, slug, description, fields, created_at, updated_at')\r\n .eq('project_id', projectId)\r\n .order(sortBy, { ascending: sortOrder === 'asc' })\r\n .range(offset, offset + limit - 1);\r\n\r\n const processedData = data?.map((c) => ({\r\n ...c,\r\n fields: typeof c.fields === 'string' ? JSON.parse(c.fields) : c.fields,\r\n }));\r\n\r\n return createResponse(processedData as Collection[] | null, error, {\r\n total: count || 0,\r\n page,\r\n limit,\r\n totalPages: Math.ceil((count || 0) / limit),\r\n });\r\n } catch (error) {\r\n return createResponse<Collection[]>(null, error);\r\n }\r\n }\r\n\r\n /** Get a single collection by slug */\r\n async getCollection(slug: string): Promise<ZenoResponse<Collection>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n\r\n const { data, error } = await this.supabase\r\n .from('collections')\r\n .select('id, name, slug, description, fields, created_at, updated_at')\r\n .eq('project_id', projectId)\r\n .eq('slug', slug)\r\n .single();\r\n\r\n const processedData = data\r\n ? { ...data, fields: typeof data.fields === 'string' ? JSON.parse(data.fields) : data.fields }\r\n : null;\r\n\r\n return createResponse(processedData as Collection | null, error);\r\n } catch (error) {\r\n return createResponse<Collection>(null, error);\r\n }\r\n }\r\n\r\n /** Get entries, optionally filtered by collection slug */\r\n async getEntries(\r\n collectionSlug?: string,\r\n params: PaginationParams & FilterParams = {}\r\n ): Promise<ZenoResponse<Entry[]>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n const {\r\n page = 1,\r\n limit = 50,\r\n sortBy = 'created_at',\r\n sortOrder = 'desc',\r\n status,\r\n search,\r\n locale,\r\n fallback_locale,\r\n dateFrom,\r\n dateTo,\r\n dateField,\r\n } = params;\r\n const effectiveFallback = fallback_locale || await this.getDefaultLocale();\r\n const offset = (page - 1) * limit;\r\n\r\n let query = this.supabase\r\n .from('entries')\r\n .select(`\r\n id, data, status, collection_id, project_id, created_at, updated_at,\r\n collections ( id, name, slug )\r\n `)\r\n .eq('project_id', projectId);\r\n\r\n // Filter by collection\r\n if (collectionSlug) {\r\n const { data: collection } = await this.supabase\r\n .from('collections')\r\n .select('id')\r\n .eq('project_id', projectId)\r\n .eq('slug', collectionSlug)\r\n .single();\r\n\r\n if (!collection) {\r\n return createResponse<Entry[]>(null, 'Collection not found');\r\n }\r\n query = query.eq('collection_id', collection.id);\r\n }\r\n\r\n if (status) query = query.eq('status', status);\r\n if (search) query = query.textSearch('data', search);\r\n\r\n // Date filtering: use dateField inside data if specified, otherwise use created_at\r\n if (dateFrom) {\r\n query = dateField\r\n ? query.gte(`data->${dateField}`, dateFrom)\r\n : query.gte('created_at', dateFrom);\r\n }\r\n if (dateTo) {\r\n query = dateField\r\n ? query.lte(`data->${dateField}`, dateTo)\r\n : query.lte('created_at', dateTo);\r\n }\r\n\r\n // Count query\r\n let countQuery = this.supabase\r\n .from('entries')\r\n .select('*', { count: 'exact', head: true })\r\n .eq('project_id', projectId);\r\n\r\n if (collectionSlug) {\r\n const { data: collection } = await this.supabase\r\n .from('collections')\r\n .select('id')\r\n .eq('project_id', projectId)\r\n .eq('slug', collectionSlug)\r\n .single();\r\n\r\n if (collection) countQuery = countQuery.eq('collection_id', collection.id);\r\n }\r\n if (status) countQuery = countQuery.eq('status', status);\r\n if (search) countQuery = countQuery.textSearch('data', search);\r\n\r\n // Date filtering for count query\r\n if (dateFrom) {\r\n countQuery = dateField\r\n ? countQuery.gte(`data->${dateField}`, dateFrom)\r\n : countQuery.gte('created_at', dateFrom);\r\n }\r\n if (dateTo) {\r\n countQuery = dateField\r\n ? countQuery.lte(`data->${dateField}`, dateTo)\r\n : countQuery.lte('created_at', dateTo);\r\n }\r\n\r\n const { count } = await countQuery;\r\n\r\n const { data, error } = await query\r\n .order(sortBy, { ascending: sortOrder === 'asc' })\r\n .range(offset, offset + limit - 1);\r\n\r\n if (error) throw error;\r\n\r\n // Normalize Supabase join (returns array for relations) and apply localization\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const rows = (data as any[]) ?? [];\r\n const normalized = rows.map((row) => ({\r\n ...row,\r\n collections: Array.isArray(row.collections) ? row.collections[0] : row.collections,\r\n }));\r\n\r\n let processedData = normalized;\r\n let fallbackUsed = false;\r\n\r\n if (locale && normalized.length > 0) {\r\n try {\r\n // Use batch function to avoid N+1 queries\r\n const entryIds = normalized.map((e) => e.id);\r\n const result = await this.supabase.rpc('get_localized_entries_batch', {\r\n entry_uuids: entryIds,\r\n locale,\r\n fallback_locale: effectiveFallback,\r\n });\r\n\r\n if (result.data && result.data.length > 0) {\r\n // Create a map for quick lookup\r\n const localeMap = new Map<string, { data: Record<string, unknown>; locale_code: string; is_fallback: boolean }>();\r\n for (const loc of result.data) {\r\n localeMap.set(loc.entry_id, {\r\n data: loc.data,\r\n locale_code: loc.locale_code,\r\n is_fallback: loc.is_fallback,\r\n });\r\n }\r\n\r\n // Merge localized data with entries\r\n processedData = normalized.map((entry) => {\r\n const localized = localeMap.get(entry.id);\r\n if (localized) {\r\n if (localized.is_fallback) fallbackUsed = true;\r\n return { ...entry, data: localized.data, locale_code: localized.locale_code };\r\n }\r\n return entry;\r\n });\r\n }\r\n } catch {\r\n // Fallback to base data if batch function fails\r\n }\r\n }\r\n\r\n // Available locales\r\n const { data: availableLocales } = await this.supabase\r\n .from('project_locales')\r\n .select('locale_code')\r\n .eq('project_id', projectId)\r\n .eq('is_active', true);\r\n\r\n return createResponse(processedData as Entry[] | null, null, {\r\n total: count || 0,\r\n page,\r\n limit,\r\n totalPages: Math.ceil((count || 0) / limit),\r\n locale: locale || effectiveFallback,\r\n fallback_used: fallbackUsed,\r\n available_locales: availableLocales?.map((l) => l.locale_code) || [],\r\n });\r\n } catch (error) {\r\n return createResponse<Entry[]>(null, error);\r\n }\r\n }\r\n\r\n /** Get a single entry by ID */\r\n async getEntry(\r\n entryId: string,\r\n params: { locale?: string; fallback_locale?: string } = {}\r\n ): Promise<ZenoResponse<Entry>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n const { locale, fallback_locale } = params;\r\n const effectiveFallback = fallback_locale || await this.getDefaultLocale();\r\n\r\n const { data, error } = await this.supabase\r\n .from('entries')\r\n .select(`\r\n id, data, status, collection_id, project_id, created_at, updated_at,\r\n collections ( id, name, slug, fields )\r\n `)\r\n .eq('project_id', projectId)\r\n .eq('id', entryId)\r\n .single();\r\n\r\n if (error) throw error;\r\n\r\n // Normalize Supabase join (returns array for relations)\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const row = data as any;\r\n const normalized = row ? {\r\n ...row,\r\n collections: Array.isArray(row.collections) ? row.collections[0] : row.collections,\r\n } : null;\r\n\r\n let processedData = normalized;\r\n let fallbackUsed = false;\r\n\r\n if (locale && normalized) {\r\n try {\r\n const result = await this.supabase.rpc('get_localized_entry', {\r\n entry_uuid: entryId,\r\n locale,\r\n fallback_locale: effectiveFallback,\r\n });\r\n\r\n if (result.data?.[0]) {\r\n const localized = result.data[0];\r\n if (localized.locale_code !== locale) fallbackUsed = true;\r\n processedData = { ...normalized, data: localized.data, locale_code: localized.locale_code };\r\n }\r\n } catch {\r\n // Fallback to base data\r\n }\r\n }\r\n\r\n const { data: availableLocales } = await this.supabase\r\n .from('project_locales')\r\n .select('locale_code')\r\n .eq('project_id', projectId)\r\n .eq('is_active', true);\r\n\r\n return createResponse(processedData as Entry | null, null, {\r\n locale: locale || effectiveFallback,\r\n fallback_used: fallbackUsed,\r\n available_locales: availableLocales?.map((l) => l.locale_code) || [],\r\n });\r\n } catch (error) {\r\n return createResponse<Entry>(null, error);\r\n }\r\n }\r\n\r\n /** Get assets for the project */\r\n async getAssets(\r\n params: PaginationParams & { mimeType?: string } = {}\r\n ): Promise<ZenoResponse<Asset[]>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n const { page = 1, limit = 50, sortBy = 'created_at', sortOrder = 'desc', mimeType } = params;\r\n const offset = (page - 1) * limit;\r\n\r\n let query = this.supabase\r\n .from('assets')\r\n .select('id, filename, original_filename, mime_type, size_bytes, metadata, created_at')\r\n .eq('project_id', projectId);\r\n\r\n if (mimeType) query = query.like('mime_type', `${mimeType}%`);\r\n\r\n let countQuery = this.supabase\r\n .from('assets')\r\n .select('*', { count: 'exact', head: true })\r\n .eq('project_id', projectId);\r\n\r\n if (mimeType) countQuery = countQuery.like('mime_type', `${mimeType}%`);\r\n\r\n const { count } = await countQuery;\r\n\r\n const { data, error } = await query\r\n .order(sortBy, { ascending: sortOrder === 'asc' })\r\n .range(offset, offset + limit - 1);\r\n\r\n return createResponse(data as Asset[] | null, error, {\r\n total: count || 0,\r\n page,\r\n limit,\r\n totalPages: Math.ceil((count || 0) / limit),\r\n });\r\n } catch (error) {\r\n return createResponse<Asset[]>(null, error);\r\n }\r\n }\r\n\r\n /** Get a signed download URL for an asset */\r\n async getAssetUrl(assetId: string): Promise<ZenoResponse<AssetUrl>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n\r\n const { data: asset, error: assetError } = await this.supabase\r\n .from('assets')\r\n .select('storage_path')\r\n .eq('project_id', projectId)\r\n .eq('id', assetId)\r\n .single();\r\n\r\n if (assetError || !asset) {\r\n return createResponse<AssetUrl>(null, 'Asset not found');\r\n }\r\n\r\n const { data: urlData, error: urlError } = await this.supabase\r\n .storage\r\n .from('assets')\r\n .createSignedUrl(asset.storage_path, 3600);\r\n\r\n if (urlError) {\r\n return createResponse<AssetUrl>(null, urlError);\r\n }\r\n\r\n return createResponse<AssetUrl>({\r\n downloadUrl: urlData.signedUrl,\r\n expiresIn: 3600,\r\n });\r\n } catch (error) {\r\n return createResponse<AssetUrl>(null, error);\r\n }\r\n }\r\n\r\n /** Send an email via the Zeno edge function */\r\n async sendEmail(emailParams: EmailParams): Promise<ZenoResponse<{ messageId: string }>> {\r\n try {\r\n const response = await fetch(`${ZENO_INTERNAL.endpoint}/functions/v1/api/email/send`, {\r\n method: 'POST',\r\n headers: {\r\n 'Authorization': `Bearer ${this.apiKey}`,\r\n 'X-API-Key': this.apiKey,\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(emailParams),\r\n });\r\n\r\n const result = await response.json();\r\n\r\n if (!response.ok) {\r\n return createResponse<{ messageId: string }>(null, result.error || 'Email sending failed');\r\n }\r\n\r\n return createResponse(result.data);\r\n } catch (error) {\r\n return createResponse<{ messageId: string }>(null, error);\r\n }\r\n }\r\n\r\n /** Get available locales for the project */\r\n async getLocales(): Promise<ZenoResponse<Locale[]>> {\r\n try {\r\n const projectId = await this.resolveProjectId();\r\n\r\n const { data, error } = await this.supabase\r\n .from('project_locales')\r\n .select('locale_code, locale_name, locale_native_name, is_default')\r\n .eq('project_id', projectId)\r\n .eq('is_active', true)\r\n .order('is_default', { ascending: false })\r\n .order('locale_name', { ascending: true });\r\n\r\n if (error) throw error;\r\n\r\n const processedData = data?.map((l) => ({\r\n code: l.locale_code,\r\n name: l.locale_name,\r\n native_name: l.locale_native_name,\r\n is_default: l.is_default,\r\n })) || [];\r\n\r\n return createResponse<Locale[]>(processedData);\r\n } catch (error) {\r\n return createResponse<Locale[]>(null, error);\r\n }\r\n }\r\n\r\n /** Health check */\r\n async health(): Promise<ZenoResponse<HealthStatus>> {\r\n return createResponse<HealthStatus>({\r\n status: 'healthy',\r\n version: '1.0.0',\r\n });\r\n }\r\n}\r\n"]}
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- 'use strict';var supabaseJs=require('@supabase/supabase-js');var w={endpoint:"https://kvpowojjhuprhxdyzmml.supabase.co",publicKey:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Imt2cG93b2pqaHVwcmh4ZHl6bW1sIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTI3ODEwNzAsImV4cCI6MjA2ODM1NzA3MH0.cCPzDNdfTb3WBtYL79GBlw4hfypl4tjnqu7XfEvdKBg"};function o(A,a=null,t){let e=null;return a&&(typeof a=="string"?e=a:a instanceof Error?e=a.message:typeof a=="object"&&a!==null&&"message"in a&&(e=String(a.message))),{data:A,error:e,meta:{...t,timestamp:new Date().toISOString()}}}var b=class{constructor(a={}){this.projectId=null;this.isValidated=false;this.resolvedDefaultLocale=null;let t=a.apiKey||this.getEnvApiKey();if(!t)throw new Error("Missing API key. Provide it via config.apiKey or set an environment variable: ZENO_API_KEY, VITE_ZENO_API_KEY, NEXT_PUBLIC_ZENO_API_KEY, or PUBLIC_ZENO_API_KEY.");let e=this.parseApiKey(t);this.apiKey=t,this.projectSlug=e.projectSlug,this.apiToken=e.token,this.configDefaultLocale=a.defaultLocale,this.supabase=supabaseJs.createClient(w.endpoint,w.publicKey,{auth:{persistSession:false,autoRefreshToken:false}});}getEnvApiKey(){let a=["ZENO_API_KEY","NEXT_PUBLIC_ZENO_API_KEY","VITE_ZENO_API_KEY","PUBLIC_ZENO_API_KEY"],t=["ZENO_API_KEY","VITE_ZENO_API_KEY","PUBLIC_ZENO_API_KEY","NEXT_PUBLIC_ZENO_API_KEY"];if(typeof process<"u"&&process.env){for(let e of a)if(process.env[e])return process.env[e]}try{let e=undefined;if(e){for(let s of t)if(e[s])return e[s]}}catch{}}parseApiKey(a){if(!a.startsWith("zeno_"))throw new Error("Invalid API key format. Expected: zeno_<projectSlug>_<token>");let t=a.slice(5),e=t.indexOf("_");if(e===-1)throw new Error("Invalid API key format. Expected: zeno_<projectSlug>_<token>");let s=t.slice(0,e),r=t.slice(e+1);if(!s||!r)throw new Error("Invalid API key format. Expected: zeno_<projectSlug>_<token>");return {projectSlug:s,token:r}}async getDefaultLocale(){if(this.configDefaultLocale)return this.configDefaultLocale;if(this.resolvedDefaultLocale)return this.resolvedDefaultLocale;try{let a=await this.resolveProjectId(),{data:t}=await this.supabase.from("project_locales").select("locale_code").eq("project_id",a).eq("is_default",!0).single();if(t?.locale_code)return this.resolvedDefaultLocale=t.locale_code,t.locale_code}catch{}return this.resolvedDefaultLocale="en","en"}async resolveProjectId(){if(this.projectId&&this.isValidated)return this.projectId;let{data:a,error:t}=await this.supabase.rpc("validate_sdk_api_key",{p_project_slug:this.projectSlug,p_token:this.apiToken});if(t)throw new Error("API key validation failed: "+t.message);let e=a?.[0];if(!e||!e.is_valid)throw new Error(e?.error_message||"Invalid API key or project not found");return this.projectId=e.project_id,this.isValidated=true,e.project_id}async getProject(){try{let a=await this.resolveProjectId(),{data:t,error:e}=await this.supabase.from("projects").select("id, name, description, slug, status, created_at, updated_at").eq("id",a).single();return o(t,e)}catch(a){return o(null,a)}}async getCollections(a={}){try{let t=await this.resolveProjectId(),{page:e=1,limit:s=50,sortBy:r="created_at",sortOrder:_="desc"}=a,g=(e-1)*s,{count:c}=await this.supabase.from("collections").select("*",{count:"exact",head:!0}).eq("project_id",t),{data:i,error:d}=await this.supabase.from("collections").select("id, name, slug, description, fields, created_at, updated_at").eq("project_id",t).order(r,{ascending:_==="asc"}).range(g,g+s-1),h=i?.map(l=>({...l,fields:typeof l.fields=="string"?JSON.parse(l.fields):l.fields}));return o(h,d,{total:c||0,page:e,limit:s,totalPages:Math.ceil((c||0)/s)})}catch(t){return o(null,t)}}async getCollection(a){try{let t=await this.resolveProjectId(),{data:e,error:s}=await this.supabase.from("collections").select("id, name, slug, description, fields, created_at, updated_at").eq("project_id",t).eq("slug",a).single(),r=e?{...e,fields:typeof e.fields=="string"?JSON.parse(e.fields):e.fields}:null;return o(r,s)}catch(t){return o(null,t)}}async getEntries(a,t={}){try{let e=await this.resolveProjectId(),{page:s=1,limit:r=50,sortBy:_="created_at",sortOrder:g="desc",status:c,search:i,locale:d,fallback_locale:h,dateFrom:l,dateTo:m,dateField:p}=t,P=h||await this.getDefaultLocale(),k=(s-1)*r,u=this.supabase.from("entries").select(`
1
+ 'use strict';var supabaseJs=require('@supabase/supabase-js');var w={endpoint:"https://kvpowojjhuprhxdyzmml.supabase.co",publicKey:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Imt2cG93b2pqaHVwcmh4ZHl6bW1sIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTI3ODEwNzAsImV4cCI6MjA2ODM1NzA3MH0.cCPzDNdfTb3WBtYL79GBlw4hfypl4tjnqu7XfEvdKBg"};function o(A,a=null,t){let e=null;return a&&(typeof a=="string"?e=a:a instanceof Error?e=a.message:typeof a=="object"&&a!==null&&"message"in a&&(e=String(a.message))),{data:A,error:e,meta:{...t,timestamp:new Date().toISOString()}}}var b=class{constructor(a={}){this.projectId=null;this.isValidated=false;this.resolvedDefaultLocale=null;let t=a.apiKey||this.getEnvApiKey();if(!t)throw new Error("Missing API key. Provide it via config.apiKey or set an environment variable: ZENO_API_KEY, VITE_ZENO_API_KEY, NEXT_PUBLIC_ZENO_API_KEY, or PUBLIC_ZENO_API_KEY.");let e=this.parseApiKey(t);this.apiKey=t,this.projectSlug=e.projectSlug,this.apiToken=e.token,this.configDefaultLocale=a.defaultLocale,this.supabase=supabaseJs.createClient(w.endpoint,w.publicKey,{auth:{persistSession:false,autoRefreshToken:false}});}getEnvApiKey(){if(typeof process<"u"&&process.env){if(process.env.ZENO_API_KEY)return process.env.ZENO_API_KEY;if(process.env.NEXT_PUBLIC_ZENO_API_KEY)return process.env.NEXT_PUBLIC_ZENO_API_KEY;if(process.env.VITE_ZENO_API_KEY)return process.env.VITE_ZENO_API_KEY;if(process.env.PUBLIC_ZENO_API_KEY)return process.env.PUBLIC_ZENO_API_KEY}try{if(undefined?.ZENO_API_KEY)return undefined.ZENO_API_KEY;if(undefined?.VITE_ZENO_API_KEY)return undefined.VITE_ZENO_API_KEY;if(undefined?.PUBLIC_ZENO_API_KEY)return undefined.PUBLIC_ZENO_API_KEY;if(undefined?.NEXT_PUBLIC_ZENO_API_KEY)return undefined.NEXT_PUBLIC_ZENO_API_KEY}catch{}}parseApiKey(a){if(!a.startsWith("zeno_"))throw new Error("Invalid API key format. Expected: zeno_<projectSlug>_<token>");let t=a.slice(5),e=t.indexOf("_");if(e===-1)throw new Error("Invalid API key format. Expected: zeno_<projectSlug>_<token>");let s=t.slice(0,e),r=t.slice(e+1);if(!s||!r)throw new Error("Invalid API key format. Expected: zeno_<projectSlug>_<token>");return {projectSlug:s,token:r}}async getDefaultLocale(){if(this.configDefaultLocale)return this.configDefaultLocale;if(this.resolvedDefaultLocale)return this.resolvedDefaultLocale;try{let a=await this.resolveProjectId(),{data:t}=await this.supabase.from("project_locales").select("locale_code").eq("project_id",a).eq("is_default",!0).single();if(t?.locale_code)return this.resolvedDefaultLocale=t.locale_code,t.locale_code}catch{}return this.resolvedDefaultLocale="en","en"}async resolveProjectId(){if(this.projectId&&this.isValidated)return this.projectId;let{data:a,error:t}=await this.supabase.rpc("validate_sdk_api_key",{p_project_slug:this.projectSlug,p_token:this.apiToken});if(t)throw new Error("API key validation failed: "+t.message);let e=a?.[0];if(!e||!e.is_valid)throw new Error(e?.error_message||"Invalid API key or project not found");return this.projectId=e.project_id,this.isValidated=true,e.project_id}async getProject(){try{let a=await this.resolveProjectId(),{data:t,error:e}=await this.supabase.from("projects").select("id, name, description, slug, status, created_at, updated_at").eq("id",a).single();return o(t,e)}catch(a){return o(null,a)}}async getCollections(a={}){try{let t=await this.resolveProjectId(),{page:e=1,limit:s=50,sortBy:r="created_at",sortOrder:f="desc"}=a,m=(e-1)*s,{count:c}=await this.supabase.from("collections").select("*",{count:"exact",head:!0}).eq("project_id",t),{data:i,error:d}=await this.supabase.from("collections").select("id, name, slug, description, fields, created_at, updated_at").eq("project_id",t).order(r,{ascending:f==="asc"}).range(m,m+s-1),h=i?.map(l=>({...l,fields:typeof l.fields=="string"?JSON.parse(l.fields):l.fields}));return o(h,d,{total:c||0,page:e,limit:s,totalPages:Math.ceil((c||0)/s)})}catch(t){return o(null,t)}}async getCollection(a){try{let t=await this.resolveProjectId(),{data:e,error:s}=await this.supabase.from("collections").select("id, name, slug, description, fields, created_at, updated_at").eq("project_id",t).eq("slug",a).single(),r=e?{...e,fields:typeof e.fields=="string"?JSON.parse(e.fields):e.fields}:null;return o(r,s)}catch(t){return o(null,t)}}async getEntries(a,t={}){try{let e=await this.resolveProjectId(),{page:s=1,limit:r=50,sortBy:f="created_at",sortOrder:m="desc",status:c,search:i,locale:d,fallback_locale:h,dateFrom:l,dateTo:g,dateField:p}=t,P=h||await this.getDefaultLocale(),k=(s-1)*r,u=this.supabase.from("entries").select(`
2
2
  id, data, status, collection_id, project_id, created_at, updated_at,
3
3
  collections ( id, name, slug )
4
- `).eq("project_id",e);if(a){let{data:n}=await this.supabase.from("collections").select("id").eq("project_id",e).eq("slug",a).single();if(!n)return o(null,"Collection not found");u=u.eq("collection_id",n.id);}c&&(u=u.eq("status",c)),i&&(u=u.textSearch("data",i)),l&&(u=p?u.gte(`data->${p}`,l):u.gte("created_at",l)),m&&(u=p?u.lte(`data->${p}`,m):u.lte("created_at",m));let f=this.supabase.from("entries").select("*",{count:"exact",head:!0}).eq("project_id",e);if(a){let{data:n}=await this.supabase.from("collections").select("id").eq("project_id",e).eq("slug",a).single();n&&(f=f.eq("collection_id",n.id));}c&&(f=f.eq("status",c)),i&&(f=f.textSearch("data",i)),l&&(f=p?f.gte(`data->${p}`,l):f.gte("created_at",l)),m&&(f=p?f.lte(`data->${p}`,m):f.lte("created_at",m));let{count:Z}=await f,{data:N,error:q}=await u.order(_,{ascending:g==="asc"}).range(k,k+r-1);if(q)throw q;let E=(N??[]).map(n=>({...n,collections:Array.isArray(n.collections)?n.collections[0]:n.collections})),L=E,K=!1;if(d&&E.length>0)try{let n=E.map(j=>j.id),v=await this.supabase.rpc("get_localized_entries_batch",{entry_uuids:n,locale:d,fallback_locale:P});if(v.data&&v.data.length>0){let j=new Map;for(let y of v.data)j.set(y.entry_id,{data:y.data,locale_code:y.locale_code,is_fallback:y.is_fallback});L=E.map(y=>{let I=j.get(y.id);return I?(I.is_fallback&&(K=!0),{...y,data:I.data,locale_code:I.locale_code}):y});}}catch{}let{data:O}=await this.supabase.from("project_locales").select("locale_code").eq("project_id",e).eq("is_active",!0);return o(L,null,{total:Z||0,page:s,limit:r,totalPages:Math.ceil((Z||0)/r),locale:d||P,fallback_used:K,available_locales:O?.map(n=>n.locale_code)||[]})}catch(e){return o(null,e)}}async getEntry(a,t={}){try{let e=await this.resolveProjectId(),{locale:s,fallback_locale:r}=t,_=r||await this.getDefaultLocale(),{data:g,error:c}=await this.supabase.from("entries").select(`
4
+ `).eq("project_id",e);if(a){let{data:n}=await this.supabase.from("collections").select("id").eq("project_id",e).eq("slug",a).single();if(!n)return o(null,"Collection not found");u=u.eq("collection_id",n.id);}c&&(u=u.eq("status",c)),i&&(u=u.textSearch("data",i)),l&&(u=p?u.gte(`data->${p}`,l):u.gte("created_at",l)),g&&(u=p?u.lte(`data->${p}`,g):u.lte("created_at",g));let _=this.supabase.from("entries").select("*",{count:"exact",head:!0}).eq("project_id",e);if(a){let{data:n}=await this.supabase.from("collections").select("id").eq("project_id",e).eq("slug",a).single();n&&(_=_.eq("collection_id",n.id));}c&&(_=_.eq("status",c)),i&&(_=_.textSearch("data",i)),l&&(_=p?_.gte(`data->${p}`,l):_.gte("created_at",l)),g&&(_=p?_.lte(`data->${p}`,g):_.lte("created_at",g));let{count:Z}=await _,{data:L,error:N}=await u.order(f,{ascending:m==="asc"}).range(k,k+r-1);if(N)throw N;let E=(L??[]).map(n=>({...n,collections:Array.isArray(n.collections)?n.collections[0]:n.collections})),K=E,O=!1;if(d&&E.length>0)try{let n=E.map(I=>I.id),j=await this.supabase.rpc("get_localized_entries_batch",{entry_uuids:n,locale:d,fallback_locale:P});if(j.data&&j.data.length>0){let I=new Map;for(let y of j.data)I.set(y.entry_id,{data:y.data,locale_code:y.locale_code,is_fallback:y.is_fallback});K=E.map(y=>{let v=I.get(y.id);return v?(v.is_fallback&&(O=!0),{...y,data:v.data,locale_code:v.locale_code}):y});}}catch{}let{data:q}=await this.supabase.from("project_locales").select("locale_code").eq("project_id",e).eq("is_active",!0);return o(K,null,{total:Z||0,page:s,limit:r,totalPages:Math.ceil((Z||0)/r),locale:d||P,fallback_used:O,available_locales:q?.map(n=>n.locale_code)||[]})}catch(e){return o(null,e)}}async getEntry(a,t={}){try{let e=await this.resolveProjectId(),{locale:s,fallback_locale:r}=t,f=r||await this.getDefaultLocale(),{data:m,error:c}=await this.supabase.from("entries").select(`
5
5
  id, data, status, collection_id, project_id, created_at, updated_at,
6
6
  collections ( id, name, slug, fields )
7
- `).eq("project_id",e).eq("id",a).single();if(c)throw c;let i=g,d=i?{...i,collections:Array.isArray(i.collections)?i.collections[0]:i.collections}:null,h=d,l=!1;if(s&&d)try{let p=await this.supabase.rpc("get_localized_entry",{entry_uuid:a,locale:s,fallback_locale:_});if(p.data?.[0]){let P=p.data[0];P.locale_code!==s&&(l=!0),h={...d,data:P.data,locale_code:P.locale_code};}}catch{}let{data:m}=await this.supabase.from("project_locales").select("locale_code").eq("project_id",e).eq("is_active",!0);return o(h,null,{locale:s||_,fallback_used:l,available_locales:m?.map(p=>p.locale_code)||[]})}catch(e){return o(null,e)}}async getAssets(a={}){try{let t=await this.resolveProjectId(),{page:e=1,limit:s=50,sortBy:r="created_at",sortOrder:_="desc",mimeType:g}=a,c=(e-1)*s,i=this.supabase.from("assets").select("id, filename, original_filename, mime_type, size_bytes, metadata, created_at").eq("project_id",t);g&&(i=i.like("mime_type",`${g}%`));let d=this.supabase.from("assets").select("*",{count:"exact",head:!0}).eq("project_id",t);g&&(d=d.like("mime_type",`${g}%`));let{count:h}=await d,{data:l,error:m}=await i.order(r,{ascending:_==="asc"}).range(c,c+s-1);return o(l,m,{total:h||0,page:e,limit:s,totalPages:Math.ceil((h||0)/s)})}catch(t){return o(null,t)}}async getAssetUrl(a){try{let t=await this.resolveProjectId(),{data:e,error:s}=await this.supabase.from("assets").select("storage_path").eq("project_id",t).eq("id",a).single();if(s||!e)return o(null,"Asset not found");let{data:r,error:_}=await this.supabase.storage.from("assets").createSignedUrl(e.storage_path,3600);return _?o(null,_):o({downloadUrl:r.signedUrl,expiresIn:3600})}catch(t){return o(null,t)}}async sendEmail(a){try{let t=await fetch(`${w.endpoint}/functions/v1/api/email/send`,{method:"POST",headers:{Authorization:`Bearer ${this.apiKey}`,"X-API-Key":this.apiKey,"Content-Type":"application/json"},body:JSON.stringify(a)}),e=await t.json();return t.ok?o(e.data):o(null,e.error||"Email sending failed")}catch(t){return o(null,t)}}async getLocales(){try{let a=await this.resolveProjectId(),{data:t,error:e}=await this.supabase.from("project_locales").select("locale_code, locale_name, locale_native_name, is_default").eq("project_id",a).eq("is_active",!0).order("is_default",{ascending:!1}).order("locale_name",{ascending:!0});if(e)throw e;let s=t?.map(r=>({code:r.locale_code,name:r.locale_name,native_name:r.locale_native_name,is_default:r.is_default}))||[];return o(s)}catch(a){return o(null,a)}}async health(){return o({status:"healthy",version:"1.0.0"})}};exports.ZenoCMS=b;//# sourceMappingURL=index.js.map
7
+ `).eq("project_id",e).eq("id",a).single();if(c)throw c;let i=m,d=i?{...i,collections:Array.isArray(i.collections)?i.collections[0]:i.collections}:null,h=d,l=!1;if(s&&d)try{let p=await this.supabase.rpc("get_localized_entry",{entry_uuid:a,locale:s,fallback_locale:f});if(p.data?.[0]){let P=p.data[0];P.locale_code!==s&&(l=!0),h={...d,data:P.data,locale_code:P.locale_code};}}catch{}let{data:g}=await this.supabase.from("project_locales").select("locale_code").eq("project_id",e).eq("is_active",!0);return o(h,null,{locale:s||f,fallback_used:l,available_locales:g?.map(p=>p.locale_code)||[]})}catch(e){return o(null,e)}}async getAssets(a={}){try{let t=await this.resolveProjectId(),{page:e=1,limit:s=50,sortBy:r="created_at",sortOrder:f="desc",mimeType:m}=a,c=(e-1)*s,i=this.supabase.from("assets").select("id, filename, original_filename, mime_type, size_bytes, metadata, created_at").eq("project_id",t);m&&(i=i.like("mime_type",`${m}%`));let d=this.supabase.from("assets").select("*",{count:"exact",head:!0}).eq("project_id",t);m&&(d=d.like("mime_type",`${m}%`));let{count:h}=await d,{data:l,error:g}=await i.order(r,{ascending:f==="asc"}).range(c,c+s-1);return o(l,g,{total:h||0,page:e,limit:s,totalPages:Math.ceil((h||0)/s)})}catch(t){return o(null,t)}}async getAssetUrl(a){try{let t=await this.resolveProjectId(),{data:e,error:s}=await this.supabase.from("assets").select("storage_path").eq("project_id",t).eq("id",a).single();if(s||!e)return o(null,"Asset not found");let{data:r,error:f}=await this.supabase.storage.from("assets").createSignedUrl(e.storage_path,3600);return f?o(null,f):o({downloadUrl:r.signedUrl,expiresIn:3600})}catch(t){return o(null,t)}}async sendEmail(a){try{let t=await fetch(`${w.endpoint}/functions/v1/api/email/send`,{method:"POST",headers:{Authorization:`Bearer ${this.apiKey}`,"X-API-Key":this.apiKey,"Content-Type":"application/json"},body:JSON.stringify(a)}),e=await t.json();return t.ok?o(e.data):o(null,e.error||"Email sending failed")}catch(t){return o(null,t)}}async getLocales(){try{let a=await this.resolveProjectId(),{data:t,error:e}=await this.supabase.from("project_locales").select("locale_code, locale_name, locale_native_name, is_default").eq("project_id",a).eq("is_active",!0).order("is_default",{ascending:!1}).order("locale_name",{ascending:!0});if(e)throw e;let s=t?.map(r=>({code:r.locale_code,name:r.locale_name,native_name:r.locale_native_name,is_default:r.is_default}))||[];return o(s)}catch(a){return o(null,a)}}async health(){return o({status:"healthy",version:"1.0.0"})}};exports.ZenoCMS=b;//# sourceMappingURL=index.js.map
8
8
  //# sourceMappingURL=index.js.map