@heyo-sh/heyo-cms 0.1.0 → 0.3.0
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/adapters/astro.d.ts +12 -5
- package/dist/adapters/astro.d.ts.map +1 -1
- package/dist/adapters/astro.js +1 -1
- package/dist/adapters/deliver.d.ts +26 -0
- package/dist/adapters/deliver.d.ts.map +1 -0
- package/dist/adapters/next.d.ts +26 -12
- package/dist/adapters/next.d.ts.map +1 -1
- package/dist/adapters/next.js +1 -1
- package/dist/adapters/nuxt.d.ts +10 -6
- package/dist/adapters/nuxt.d.ts.map +1 -1
- package/dist/adapters/nuxt.js +1 -1
- package/dist/adapters/react-router.d.ts +12 -5
- package/dist/adapters/react-router.d.ts.map +1 -1
- package/dist/adapters/react-router.js +1 -1
- package/dist/adapters/sveltekit.d.ts +9 -5
- package/dist/adapters/sveltekit.d.ts.map +1 -1
- package/dist/adapters/sveltekit.js +1 -1
- package/dist/ai/assistant/schema.d.ts +10 -0
- package/dist/ai/assistant/schema.d.ts.map +1 -1
- package/dist/ai/service.d.ts.map +1 -1
- package/dist/ai.js +1 -1
- package/dist/auth.js +1 -1
- package/dist/cli.js +2 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/types.d.ts +24 -1
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client.js +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/content/import.d.ts.map +1 -1
- package/dist/content.js +1 -1
- package/dist/db/d1.js +1 -1
- package/dist/db/mongodb.js +2 -2
- package/dist/db/postgres.js +1 -1
- package/dist/db/sql/dialect.d.ts +2 -0
- package/dist/db/sql/dialect.d.ts.map +1 -1
- package/dist/db/sqlite.d.ts +13 -2
- package/dist/db/sqlite.d.ts.map +1 -1
- package/dist/db/sqlite.js +1 -1
- package/dist/editor/builtin.d.ts.map +1 -1
- package/dist/editor/serialize.d.ts.map +1 -1
- package/dist/editor.d.ts +1 -1
- package/dist/editor.d.ts.map +1 -1
- package/dist/editor.js +1 -1
- package/dist/engine/documents.d.ts.map +1 -1
- package/dist/engine/engine.d.ts +19 -0
- package/dist/engine/engine.d.ts.map +1 -1
- package/dist/engine/slugs.d.ts +124 -0
- package/dist/engine/slugs.d.ts.map +1 -0
- package/dist/fields/builtin.d.ts +86 -16
- package/dist/fields/builtin.d.ts.map +1 -1
- package/dist/fields/registry.d.ts.map +1 -1
- package/dist/fields.d.ts +1 -0
- package/dist/fields.d.ts.map +1 -1
- package/dist/fields.js +1 -1
- package/dist/http/handler.d.ts.map +1 -1
- package/dist/http/rich-text.d.ts +12 -1
- package/dist/http/rich-text.d.ts.map +1 -1
- package/dist/http/routes/ai.d.ts +1 -1
- package/dist/http/routes/documents.d.ts.map +1 -1
- package/dist/http/routes/media.d.ts +30 -0
- package/dist/http/routes/media.d.ts.map +1 -1
- package/dist/http.js +1 -1
- package/dist/index-1xz3pmtk.js +3 -0
- package/dist/index-2ddk43me.js +2 -0
- package/dist/index-385ggnge.js +2 -0
- package/dist/{index-7k091gpe.js → index-466cwb0b.js} +2 -2
- package/dist/{index-b2ecggck.js → index-4qrep5f0.js} +6 -6
- package/dist/{index-vq2978e7.js → index-63x90ejh.js} +8 -8
- package/dist/index-6m1kjq9g.js +2 -0
- package/dist/index-761dec5z.js +2 -0
- package/dist/{index-2kb5nbxx.js → index-8nzmqy0f.js} +2 -2
- package/dist/index-91fa1gzf.js +2 -0
- package/dist/index-a1jv6396.js +18 -0
- package/dist/index-a8jcwqsf.js +2 -0
- package/dist/index-abfzb1ve.js +2 -0
- package/dist/index-axpzy2hj.js +2 -0
- package/dist/index-b79c3k6g.js +2 -0
- package/dist/index-dtwe2z69.js +5 -0
- package/dist/index-eqfcxn71.js +2 -0
- package/dist/{index-9x1z3b85.js → index-mpkhjgvk.js} +4 -4
- package/dist/index-p2cqsmvw.js +2 -0
- package/dist/index-ptttzgtp.js +7 -0
- package/dist/{index-cbwwtcm4.js → index-rw0hze6x.js} +2 -2
- package/dist/index-s9x07zb3.js +2 -0
- package/dist/{index-34s342fz.js → index-szaq03qq.js} +2 -2
- package/dist/index-vf163r10.js +2 -0
- package/dist/{index-gpwcmmvr.js → index-vzhxn50e.js} +2 -2
- package/dist/index-wbc2xh4h.js +40 -0
- package/dist/index-y8kzzn94.js +2 -0
- package/dist/{index-7a231xfp.js → index-ypcmns0v.js} +2 -2
- package/dist/index-zyg6bfdq.js +2 -0
- package/dist/index.js +1 -1
- package/dist/jobs.js +1 -1
- package/dist/media/cloudflare.d.ts +58 -0
- package/dist/media/cloudflare.d.ts.map +1 -0
- package/dist/media/document.d.ts +7 -6
- package/dist/media/document.d.ts.map +1 -1
- package/dist/media/gc.d.ts.map +1 -1
- package/dist/media/pipeline.d.ts +19 -0
- package/dist/media/pipeline.d.ts.map +1 -1
- package/dist/media/service.d.ts.map +1 -1
- package/dist/media/urls.d.ts +77 -0
- package/dist/media/urls.d.ts.map +1 -0
- package/dist/media/usages.d.ts +9 -1
- package/dist/media/usages.d.ts.map +1 -1
- package/dist/media/variants.d.ts +11 -0
- package/dist/media/variants.d.ts.map +1 -1
- package/dist/migrations.js +1 -1
- package/dist/plugins/indexnow.d.ts +82 -0
- package/dist/plugins/indexnow.d.ts.map +1 -0
- package/dist/plugins.d.ts +9 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +1 -0
- package/dist/query.js +1 -1
- package/dist/{run-3r72dwhs.js → run-rqmtv3cn.js} +4 -4
- package/dist/schema/snapshot.d.ts +2 -0
- package/dist/schema/snapshot.d.ts.map +1 -1
- package/dist/schema/system.d.ts +9 -0
- package/dist/schema/system.d.ts.map +1 -1
- package/dist/schema.js +1 -1
- package/dist/slugify.d.ts +31 -0
- package/dist/slugify.d.ts.map +1 -0
- package/dist/telemetry.js +1 -1
- package/dist/types/api.d.ts +56 -0
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/config.d.ts +15 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/editor.d.ts +26 -0
- package/dist/types/editor.d.ts.map +1 -1
- package/dist/types/fields.d.ts +2 -2
- package/dist/types/fields.d.ts.map +1 -1
- package/dist/types/media.d.ts +97 -0
- package/dist/types/media.d.ts.map +1 -1
- package/dist/types/panel.d.ts +2 -0
- package/dist/types/panel.d.ts.map +1 -1
- package/dist/types/plugin.d.ts +23 -1
- package/dist/types/plugin.d.ts.map +1 -1
- package/dist/uploads.d.ts +1 -0
- package/dist/uploads.d.ts.map +1 -1
- package/dist/uploads.js +4 -4
- package/dist/webhooks.js +1 -1
- package/package.json +9 -5
- package/dist/index-2757kej5.js +0 -2
- package/dist/index-2z1qe5mw.js +0 -2
- package/dist/index-5ngtc7gy.js +0 -2
- package/dist/index-9zqnf6gx.js +0 -23
- package/dist/index-hq05mc1n.js +0 -3
- package/dist/index-hy1x46nf.js +0 -2
- package/dist/index-k8wbg1dw.js +0 -2
- package/dist/index-kbsgt44t.js +0 -2
- package/dist/index-m82a0shw.js +0 -2
- package/dist/index-md79xr6h.js +0 -5
- package/dist/index-nvgwyykk.js +0 -40
- package/dist/index-ty698y02.js +0 -2
- package/dist/index-vxw0a03g.js +0 -2
- package/dist/index-wj8y1xcj.js +0 -2
- package/dist/index-y5mwknr9.js +0 -2
- package/dist/index-ymq6jsar.js +0 -2
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Z,me,_,on,fe,j}from"./index-63x90ejh.js";import{_e,O,A,$e,Je,go,yo,je,hn,l,u}from"./index-axpzy2hj.js";import{s,R,t,We,H,M,S,le,m}from"./index-6m1kjq9g.js";import{sn,ye}from"./index-abfzb1ve.js";import{to,qe}from"./index-wbc2xh4h.js";import{V,J,Zt,Yt}from"./index-zyg6bfdq.js";import{Rt}from"./index-1xz3pmtk.js";import{Ae,ke}from"./index-466cwb0b.js";import{en,tn,nn}from"./index-91fa1gzf.js";import{d}from"./index-9g2n7xa6.js";import{Te}from"./index-ptttzgtp.js";import{ge,et,tt}from"./index-y8kzzn94.js";import{p,Pt}from"./index-s9x07zb3.js";import{ot}from"./index-761dec5z.js";import{un}from"./index-eqfcxn71.js";import{w,se}from"./index-rw0hze6x.js";import{x}from"./index-2ddk43me.js";import{b,ve}from"./index-8nzmqy0f.js";import{e,n}from"./index-x72d1hzh.js";var rt="activity",at=50,lt=200;function De(o){return{async list(i={}){let r=gt(i.limit),a=[];if(i.collection)a.push(t("collection",i.collection));if(i.documentId)a.push(t("document_id",i.documentId));if(i.actorId)a.push(t("actor_id",i.actorId));if(i.action)a.push(t("action",i.action));if(i.source)a.push(t("source",i.source));if(i.cursor)a.push(H("id",i.cursor));let c=await o.database(),f=await c.transaction((v)=>c.query(v,{table:rt,...a.length===0?{}:{where:s(...a)},orderBy:[{path:"id",direction:"desc"}],limit:r+1})),h=f.length>r,g=f.slice(0,r),C=g.at(-1);return{entries:g.map(ct),limit:r,hasNextPage:h,cursor:h&&C?String(C.id):null}}}}function ct(o){let i=o.changes===null||o.changes===void 0?null:u(o.changes);return{id:String(o.id),action:String(o.action),actorId:Y(o.actor_id),actorSource:Y(o.actor_source),source:Y(o.source),collection:Y(o.collection),documentId:Y(o.document_id),locale:Y(o.locale),changes:i,ip:Y(o.ip),createdAt:l(o.created_at)}}function Y(o){return o===null||o===void 0?null:String(o)}function gt(o){if(o===void 0)return at;if(!Number.isInteger(o)||o<1)throw new e(`limit must be a positive integer, received ${o}`,{status:400,code:"invalid_pagination"});return Math.min(o,lt)}function dt(o,i){let r={createBefore:[],createAfter:[],updateBefore:[],updateAfter:[],deleteBefore:[],deleteAfter:[]},a=o.plugins.flatMap((f)=>(f.hooks??[]).filter((h)=>h.collection===i).map((h)=>({plugin:f.id,hook:h}))).sort((f,h)=>(f.hook.priority??0)-(h.hook.priority??0)||f.plugin.localeCompare(h.plugin));for(let{plugin:f,hook:h}of a){let g={source:f,priority:h.priority??0};if(h.timing==="before"){if(h.operation==="create")r.createBefore.push({...g,run:(v,D)=>h.handler(v.data,D)});else if(h.operation==="update")r.updateBefore.push({...g,run:(v,D)=>h.handler(v.data,D)});else r.deleteBefore.push({...g,run:(v,D)=>h.handler(v,D)});continue}let C=async(v,D)=>{await h.handler(v,D)};if(h.operation==="create")r.createAfter.push({...g,run:C});else if(h.operation==="update")r.updateAfter.push({...g,run:(v,D)=>C(v.doc,D)});else r.deleteAfter.push({...g,run:C})}let c=o.pluginHooks.filter((f)=>f.collection===i).sort((f,h)=>f.priority-h.priority||f.plugin.localeCompare(h.plugin));for(let f of c)Ee(r,f.hooks,{source:f.plugin,priority:f.priority});return Ee(r,o.databaseHooks?.[i],{source:"config",priority:bt}),r}var bt=100;function Ee(o,i,r){if(i?.create?.before){let a=i.create.before;o.createBefore.push({...r,run:(c,f)=>a(c,f)})}if(i?.create?.after){let a=i.create.after;o.createAfter.push({...r,run:(c,f)=>a(c,f)})}if(i?.update?.before){let a=i.update.before;o.updateBefore.push({...r,run:async(c,f)=>await a(c,f)})}if(i?.update?.after){let a=i.update.after;o.updateAfter.push({...r,run:(c,f)=>a(c,f)})}if(i?.delete?.before){let a=i.delete.before;o.deleteBefore.push({...r,run:(c,f)=>a(c,f)})}if(i?.delete?.after){let a=i.delete.after;o.deleteAfter.push({...r,run:(c,f)=>a(c,f)})}}async function Ie(o,i,r,a){let c=i;for(let f of o){let h=await f.run(c,r);if(h===!1)return!1;if(h&&typeof h==="object"&&"data"in h)c=a(c,h.data)}return c}async function He(o,i,r){for(let a of o)await a.run(i,r)}function Wt(o){let i=new Set([...Object.keys(o.collections),...Object.keys(o.globals),...o.plugins.flatMap((a)=>(a.hooks??[]).map((c)=>c.collection)),...o.pluginHooks.map((a)=>a.collection)]),r=[];for(let a of[...i].sort()){let c=dt(o,a),f=[["create","before",c.createBefore],["create","after",c.createAfter],["delete","before",c.deleteBefore],["delete","after",c.deleteAfter],["update","before",c.updateBefore],["update","after",c.updateAfter]];for(let[h,g,C]of f)for(let v of C)r.push({collection:a,operation:h,timing:g,source:v.source,priority:v.priority})}return r}var vt="jobs",wt=100,Ct={name:"scheduled-changes",failureType:"document.schedule",failurePayload:(o)=>{let i=je(o);return{collection:String(o.collection),documentId:String(o.id),...i===null?{}:{locale:i.locale,patch:i.data},...o.scheduled_at instanceof Date?{scheduledFor:o.scheduled_at.toISOString()}:{}}},due:async(o,i,r)=>{let a=await o.database();return a.transaction((c)=>a.query(c,{table:p,where:s(le("scheduled_at",!0),M("scheduled_at",i),t("deleted_at",null)),orderBy:[m("scheduled_at","asc"),m("id","asc")],limit:r}))},run:(o,i)=>o.applyScheduled(i)},St={name:"trash-purge",failureType:"trash.purge",failurePayload:(o)=>({collection:String(o.collection),documentId:String(o.id)}),due:async(o,i,r)=>{if(o.config.trash.purgeAfter===!1)return[];let a=await o.database();return a.transaction((c)=>a.query(c,{table:p,where:s(le("deleted_at",!0),le("purge_after",!0),M("purge_after",i)),orderBy:[m("purge_after","asc"),m("id","asc")],limit:r}))},run:(o,i)=>o.purgeExpired(i)};class ut{host;jobs=[Ct,St];constructor(o){this.host=o}list(){return this.jobs.map((o)=>o.name)}register(o){this.jobs.push(o)}async run(o={}){let i=o.now??new Date,r=o.limit??wt,a=o.only?this.jobs.filter((f)=>o.only?.includes(f.name)):this.jobs,c=[];for(let f of a){let h=await f.due(this.host,i,r+1),g=h.slice(0,r),C=0,v=0;for(let D of g)try{await f.run(this.host,D,i),C+=1}catch(I){v+=1,await this.host.recordFailure(f.failureType,f.failurePayload(D),I).catch(()=>{return})}c.push({job:f.name,processed:C,failed:v,more:h.length>r})}return{ranAt:i.toISOString(),processed:c.reduce((f,h)=>f+h.processed,0),failed:c.reduce((f,h)=>f+h.failed,0),results:c}}async failures(o={}){let i=await this.host.database();return(await i.transaction((a)=>i.query(a,{table:vt,where:o.type===void 0?t("status","failed"):s(t("status","failed"),t("type",o.type)),orderBy:[m("created_at","desc"),m("id","desc")],limit:o.limit??50}))).map((a)=>({id:String(a.id),type:String(a.type),payload:a.payload===null||a.payload===void 0?null:u(a.payload),error:a.error===null||a.error===void 0?null:String(a.error),attempts:Number(a.attempts??0),createdAt:l(a.created_at)}))}}var oe="outbox";class pt{queued=[];emit(o,i,r=null){this.queued.push({type:o,data:i,previous:r})}take(){return this.queued.splice(0,this.queued.length)}}class mt{adapter;dispatch;maxAttempts;backoff;leaseMs;now;constructor(o,i,r={}){this.adapter=o;this.dispatch=i;this.maxAttempts=r.maxAttempts??5,this.backoff=r.backoff??((a)=>1000*2**(a-1)),this.leaseMs=r.leaseMs??300000,this.now=r.now??(()=>new Date)}async append(o,i,r){let a=this.now();for(let c of i)await this.adapter.mutate(o,{kind:"insert",table:oe,returning:!1,values:{id:ve("obx"),event_id:b("evt"),type:c.type,payload:c.data,previous:c.previous,actor:r.actor?{id:r.actor.id,source:r.actor.source}:null,collection:r.collection??null,document_id:r.documentId??null,status:"pending",attempts:0,available_at:a,processed_at:null,error:null,created_at:a}})}async drain(o=50){let i=await this.adapter.transaction((a)=>this.adapter.query(a,{table:oe,where:s(S("status",["pending","delivering"]),M("available_at",this.now())),orderBy:[m("created_at","asc"),m("id","asc")],limit:o})),r=0;for(let a of i){if(await this.hasPredecessor(a))continue;let c=await this.claim(a);if(!c)continue;if(Number(c.attempts)>this.maxAttempts){await this.settle(c,!1,Error("Delivery lease expired; attempt budget exhausted."));continue}try{await this.dispatch(kt(c)),await this.settle(c,!0),r+=1}catch(f){await this.settle(c,!1,f)}}return r}async hasPredecessor(o){if(!o.document_id)return!1;return(await this.adapter.transaction((r)=>this.adapter.query(r,{table:oe,where:s(t("collection",o.collection==null?null:String(o.collection)),t("document_id",String(o.document_id)),H("id",String(o.id)),S("status",["pending","delivering"])),limit:1}))).length>0}async claim(o){let i={status:"delivering",attempts:Number(o.attempts??0)+1,available_at:new Date(this.now().getTime()+this.leaseMs)};return(await this.adapter.transaction((a)=>this.adapter.mutate(a,{kind:"update",table:oe,where:s(t("id",String(o.id)),t("status",String(o.status)),t("attempts",Number(o.attempts??0)),M("available_at",this.now())),set:i,returning:!1}))).count===1?{...o,...i}:null}async settle(o,i,r){let a=Number(o.attempts??0),c=a>=this.maxAttempts,f=i?{status:"delivered",attempts:a,processed_at:this.now(),error:null}:{status:c?"failed":"pending",attempts:a,available_at:new Date(this.now().getTime()+this.backoff(a)),error:r instanceof Error?r.message:String(r)};await this.adapter.transaction((h)=>this.adapter.mutate(h,{kind:"update",table:oe,where:s(t("id",String(o.id)),t("status","delivering"),t("attempts",a)),set:f,returning:!1}))}}function kt(o){let i=u(o.actor);return{id:String(o.event_id),type:String(o.type),createdAt:l(o.created_at)??new Date().toISOString(),actor:typeof i.id==="string"?{id:i.id,source:i.source==="api-key"?"api-key":"session"}:null,data:u(o.payload),previous:o.previous===null||o.previous===void 0?null:u(o.previous)}}class ft{options;cache=new Map;queries=0;constructor(o){this.options=o}get queryCount(){return this.queries}async expand(o,i,r){if(r<=0||o.length===0)return;let a=Object.entries(i.fields).map(([h,g])=>({name:h,target:vn(g)})).filter((h)=>Boolean(h.target));if(a.length===0)return;let c=new Map;for(let h of o)for(let g of a)for(let C of At(h[g.name])){if(this.cache.has(Q(g.target,C)))continue;let v=c.get(g.target)??new Set;v.add(C),c.set(g.target,v)}for(let[h,g]of c)await this.load(h,[...g]);let f=new Map;for(let h of o)for(let g of a){let C=h[g.name];h[g.name]=this.substitute(g.target,C,f)}for(let[h,g]of f){let C=this.options.collections[h];if(C)await this.expand(g,C,r-1)}}async load(o,i){let r=this.options.collections[o];if(this.queries+=1,r){for(let g of i)this.cache.set(Q(o,g),null);let c;try{c=await _(r,{actor:this.options.actor??null,operation:"read",locale:this.options.locale.locale,rbac:this.options.rbac})}catch(g){if(g instanceof e&&(g.status===401||g.status===403))return;throw g}let f=[c,t("collection",r.slug),S("id",i),...this.options.includeTrashed?[]:[t("deleted_at",null)]],h=await this.options.adapter.query(this.options.tx,{table:p,where:s(...f)});for(let g of i)this.cache.set(Q(o,g),null);for(let g of h){let C=A(g,r,this.options.locale);this.cache.set(Q(o,String(g.id)),fe(C,r,this.options.actor??null,this.options.locale.locale))}return}for(let c of i)this.cache.set(Q(o,c),null);if(o!=="media"&&o!=="cms_users")return;let a=await this.options.adapter.query(this.options.tx,{table:o,where:S("id",i),...o==="cms_users"?{select:["id","name"]}:{}});for(let c of i)this.cache.set(Q(o,c),null);for(let c of a)this.cache.set(Q(o,String(c.id)),yo(c))}substitute(o,i,r){let a=(c)=>{let f=structuredClone(c),h=r.get(o)??[];return h.push(f),r.set(o,h),f};if(typeof i==="string"){let c=this.cache.get(Q(o,i));return c?a(c):i}if(Array.isArray(i))return i.map((c)=>{if(typeof c!=="string")return c;let f=this.cache.get(Q(o,c));return f?a(f):c});return i??null}}function vn(o){if(o.relationTo)return o.relationTo;return o.type==="media"?"media":void 0}function At(o){if(typeof o==="string")return o.length>0?[o]:[];if(Array.isArray(o))return o.filter((i)=>typeof i==="string");return[]}function Q(o,i){return`${o}:${i}`}var X="slug_history",Fe=50;function he(o){let i=ee(o);if(typeof i.slugify==="function")return i.slugify;let r=i.maxLength;return(a)=>ye(a,r===void 0?{}:{maxLength:r})}function ae(o){return Object.entries(o.fields).filter(([,i])=>i.type==="slug")}function ee(o){return o.options}async function be(o){let i=ae(o.collection);if(i.length===0)return{input:o.input,moves:[]};let r={...o.input},a=[];for(let[c,f]of i){let h=ee(f),g=f.localized?o.locale:"",C=Ot(o.stored,c,f,o.locale),v=r[c],D=he(f),I;if(typeof v==="string"&&v.trim()!==""){if(I=D(v),I==="")throw e.validation(`${o.collection.name}.${c}: "${v}" has no letters or digits to make a slug from`);if(h.unique!==!1)await Ce({...o,field:c,locale:g,slug:I})}else if(v===null||v===""||v===void 0&&C===null){let F=h.from===void 0?null:Tt(o,h.from),B=F===null?"":D(F);if(B!=="")I=h.unique===!1?B:await xt({...o,field:c,locale:g,base:B});else if(v!==void 0)I=null}if(I===void 0)continue;if(r[c]=I,h.history===!0&&C!==null&&I!==null&&I!==C)a.push({field:c,locale:g,from:C,to:I})}return{input:r,moves:a}}async function we(o,i,r,a,c){for(let f of a){let h=s(t("collection",i.name),t("field",f.field),t("locale",f.locale));if(await o.delete(X,s(h,t("document_id",r),t("slug",f.to))),await o.findOne(X,s(h,t("slug",f.from))))continue;await o.insert(X,{id:b("slg"),collection:i.name,field:f.field,locale:f.locale,slug:f.from,document_id:r,created_at:c})}}async function Le(o,i,r,a,c,f){await o.delete(X,s(t("collection",i.name),t("document_id",r),t("field",a),t("locale",c),t("slug",f)))}async function Me(o,i,r){await o.delete(X,s(t("collection",i.name),t("document_id",r)))}function _t(o){let i=o.collection.fields[o.field];return i!==void 0&&ee(i).history===!0}async function Ce(o){let i=o.locale?` in "${o.locale}"`:"",r=await Be(o,o.slug);if(r!==null)throw e.conflict(`The slug "${o.slug}" is already used${i} by another document of ${o.collection.label} (${r}).`);let a=await Ne(o,o.slug);if(a!==null)throw e.conflict(`The slug "${o.slug}" is a previous slug of another document of ${o.collection.label} (${a})${i} and redirects there. Remove it from that document's previous slugs first.`)}async function xt(o){for(let i=1;i<=Fe;i+=1){let r=i===1?o.base:`${o.base}-${i}`;if(await Be(o,r)===null&&await Ne(o,r)===null)return r}throw e.conflict(`No free slug for "${o.base}" after ${Fe} tries; set one explicitly.`)}async function Be(o,i){let r=o.locale?`${o.field}.${o.locale}`:o.field,a=await o.db.query({table:p,where:s(t("collection",o.collection.slug),t(r,i),...o.documentId===null?[]:[We("id",o.documentId)]),limit:1});return a[0]?String(a[0].id):null}async function Ne(o,i){if(!_t(o))return null;let r=await o.db.findOne(X,s(t("collection",o.collection.name),t("field",o.field),t("locale",o.locale),t("slug",i),...o.documentId===null?[]:[We("document_id",o.documentId)]));return r?String(r.document_id):null}function Ot(o,i,r,a){if(!o)return null;let c=r.localized?u(o[i])[a]:o[i];return typeof c==="string"&&c!==""?c:null}function Tt(o,i){let r=o.collection.fields[i];if(!r)return null;let a=o.input[i],c=a!==void 0?a:r.localized?u(o.stored?.[i])[o.locale]??null:o.stored?.[i]??null;return typeof c==="string"&&c.trim()!==""?c:null}async function ze(o){let{db:i,collection:r,field:a,slug:c}=o,f=r.fields[a];if(!f||!sn(c))return[];let h=f.localized,g=[],C=await i.query({table:p,where:s(t("collection",r.slug),t("deleted_at",null),h?R(...o.locales.map((I)=>t(`${a}.${I}`,c))):t(a,c)),limit:20});for(let I of C){let F=u(I.data)[a];if(!h){g.push({id:String(I.id),locale:null,current:!0});continue}for(let B of o.locales)if(u(F)[B]===c)g.push({id:String(I.id),locale:B,current:!0})}let v=[];if(ee(f).history===!0){let I=await i.find(X,s(t("collection",r.name),t("field",a),t("slug",c))),F=await Dt(i,r,I.map((B)=>String(B.document_id)));for(let B of I){let y=String(B.document_id);if(!F.has(y))continue;let P=String(B.locale??"");v.push({id:y,locale:P===""?null:P,current:!1})}}let D=(I)=>I.locale===null||I.locale===o.locale?0:1;return[...g.sort((I,F)=>D(I)-D(F)),...v.sort((I,F)=>D(I)-D(F))]}async function Dt(o,i,r){if(r.length===0)return new Set;let a=await o.query({table:p,where:s(t("collection",i.slug),t("deleted_at",null),S("id",[...new Set(r)]))});return new Set(a.map((c)=>String(c.id)))}async function Ge(o){let i=[t("collection",o.collection.name),t("document_id",o.documentId)];if(o.field!==void 0)i.push(t("field",o.field));if(o.locale!==void 0)i.push(t("locale",o.locale??""));return(await o.db.find(X,s(...i))).map((a)=>({slug:String(a.slug),field:String(a.field),locale:a.locale?String(a.locale):null,createdAt:l(a.created_at)})).sort((a,c)=>(c.createdAt??"").localeCompare(a.createdAt??"")||a.slug.localeCompare(c.slug))}var jt=25,$t=200,Se=[m("deleted_at","desc"),m("id","desc")];async function zt(o){let{adapter:i,config:r,collections:a,args:c}=o,f=O(r,c),h=c.actor??null,g=Jt(c.limit),C=c.collection?[It(a,c.collection)]:Object.values(a),v=[],D=new Map;for(let k of C){let T;try{T=await _(k,{actor:h,operation:"read",locale:f.locale,rbac:r.rbac})}catch(L){if(c.collection)throw L;continue}D.set(k.slug,k),v.push(T?s(t("collection",k.slug),T):t("collection",k.slug))}if(v.length===0)return{entries:[],limit:g,hasNextPage:!1,cursor:null};let I=v.length===D.size&&v.every((k)=>k.kind==="compare")?S("collection",[...D.keys()]):R(...v),F=s(le("deleted_at",!0),I),B=await i.transaction((k)=>i.query(k,{table:p,where:c.cursor?s(F,J(c.cursor,Se)):F,orderBy:Se,limit:g+1})),y=B.length>g,P=B.slice(0,g),W=P.flatMap((k)=>{let T=D.get(String(k.collection));if(!T)return[];let L=A(k,T,f);if(on(T))fe(L,T,h,f.locale);return[{collection:T.name,id:String(k.id),deletedAt:l(k.deleted_at),purgeAfter:l(k.purge_after),document:L}]}),E=P.at(-1);return{entries:W,limit:g,hasNextPage:y,cursor:E?V(E,Se):null}}function It(o,i){let r=o[i];if(!r)throw e.notFound(`No collection named "${i}"`);return r}function Jt(o){if(o===void 0)return jt;if(!Number.isInteger(o)||o<1)throw new e(`limit must be a positive integer, received ${o}`,{status:400,code:"invalid_pagination"});return Math.min(o,$t)}var Et=25,Ft=500,Lt="activity",Mt="media_usages",Ue="cms_ai_mutations",Ke={create:"create",update:"update",trash:"delete",purge:"delete",restore:"update",schedule:"update",unschedule:"update"};class ht{options;cms;pipelines=new Map;byName;bySlug;media=new Map;outbox;delivery=Promise.resolve();constructor(o){this.options=o;this.byName={...o.config.collections,...o.config.globals},this.bySlug=Object.fromEntries(Object.values(this.byName).map((i)=>[i.slug,i]))}bind(o){this.cms=o}buildApi(){let o={};for(let i of Object.values(this.options.config.collections))o[i.name]=this.collectionApi(i);return o}buildGlobals(){let o={};for(let i of Object.values(this.options.config.globals))o[i.name]=this.globalApi(i);return o}buildTrash(){return{list:async(o={})=>{let i=await this.options.database();return zt({adapter:i,config:this.options.config,collections:this.byName,args:o})},restore:(o)=>this.restore(this.requireCollection(o.collection),{...o,id:o.id}),purge:(o)=>this.purge(this.requireCollection(o.collection),{...o,id:o.id})}}buildJobs(){return new ut({config:this.options.config,database:()=>this.options.database(),applyScheduled:(o)=>this.applyScheduled(o),purgeExpired:(o)=>this.purgeExpired(o),recordFailure:(o,i,r)=>this.recordFailure(o,i,r)})}async drainEvents(o){return await this.delivery,(await this.outboxWorker()).drain(o)}async settle(){await this.delivery}async appendEvents(o,i,r){await(await this.outboxWorker()).append(o,i,r)}deliverSoon(){this.scheduleDelivery()}collectionApi(o){return{find:(i)=>this.find(o,i),findOne:(i)=>this.findOne(o,i),findById:(i,r)=>this.findById(o,i,r),count:(i)=>this.count(o,i),create:(i)=>this.create(o,i),update:(i)=>this.update(o,i),delete:(i)=>this.remove(o,i),restore:(i)=>this.restore(o,i),purge:(i)=>this.purge(o,i),schedule:(i)=>this.schedule(o,i),unschedule:(i)=>this.unschedule(o,i),resolveSlug:(i,r)=>this.resolveSlug(o,i,r),previousSlugs:(i)=>this.previousSlugs(o,i),addPreviousSlug:(i)=>this.changePreviousSlug(o,i,"add"),removePreviousSlug:(i)=>this.changePreviousSlug(o,i,"remove")}}slugField(o,i,r){let a=ae(o).filter(([,f])=>!r||ee(f).history===!0),c=i===void 0?a[0]?.[0]:a.find(([f])=>f===i)?.[0];if(c===void 0)throw e.validation(i===void 0?`${o.name} has no slug field${r?" with history":""}`:`${o.name}.${i} is not a slug field${r?" with history":""}`);return c}async resolveSlug(o,i,r={}){let a=this.slugField(o,r.field,!1),c=O(this.options.config,r),f=await this.options.database(),h=await f.transaction((v)=>ze({db:d(f,v),collection:o,field:a,slug:i,locale:c.locale,locales:this.options.config.i18n.locales})),{field:g,...C}=r;for(let v of h){let D=await this.findById(o,v.id,C);if(!D)continue;return{id:v.id,field:a,locale:v.locale,current:v.current,document:D}}return null}async previousSlugs(o,i){let r=this.slugField(o,i.field,!0);if(!await this.findById(o,i.id,{...i,includeTrashed:!0}))throw e.notFound(`No ${o.name} with id "${i.id}"`);let c=o.fields[r],f=await this.options.database();return f.transaction((h)=>Ge({db:d(f,h),collection:o,documentId:i.id,field:r,...i.locale===void 0?{}:{locale:c?.localized?i.locale:null}}))}async changePreviousSlug(o,i,r){let a=this.slugField(o,i.field,!0),c=o.fields[a],f=O(this.options.config,i),h=i.actor??null,g=c.localized?f.locale:"",C=r==="add"?he(c)(i.slug):i.slug;if(C==="")throw e.validation(`"${i.slug}" has no letters or digits to make a slug from`);let v=await this.options.database();return await v.transaction(async(D)=>{let I=d(v,D),F=await this.load(v,D,o,i.id,{actor:h,operation:"update",locale:f,includeTrashed:!1}),B=A(F,o,f);await this.assertAllowed(o,"update",h,f,B),j(o,{[a]:null},h,f.locale,B);let y=c.localized?u(u(F.data)[a])[f.locale]:u(F.data)[a];if(r==="add"){if(y===C)throw e.conflict(`"${C}" is this document's slug already, not a previous one.`);await Ce({db:I,collection:o,documentId:String(F.id),field:a,locale:g,slug:C}),await we(I,o,String(F.id),[{field:a,locale:g,from:C,to:String(y??"")}],new Date)}else await Le(I,o,String(F.id),a,g,C)}),this.previousSlugs(o,{id:i.id,field:a,...i.actor===void 0?{}:{actor:i.actor},...c.localized?{locale:f.locale}:{}})}async find(o,i={}){let r=await this.options.database(),a=O(this.options.config,i),c=i.actor??null,f=await _(o,{actor:c,operation:"read",locale:a.locale,rbac:this.options.config.rbac}),h=this.scope(o,i.where,f,i.includeTrashed),g=Nt(i.orderBy),C=qt(i.limit);return r.transaction(async(v)=>{let D=await r.query(v,{table:p,where:i.cursor?s(h,J(i.cursor,g)):h,orderBy:g,limit:C+1,...i.offset===void 0?{}:{offset:i.offset}}),I=D.length>C,F=D.slice(0,C),B=F.map((W)=>A(W,o,a));await this.expand(r,v,B,o,a,i,c),this.redact(B,o,c,a);let y=null;if(i.count===!0){let W=await r.query(v,{table:p,where:h,count:!0});y=Number(W[0]?.count??0)}let P=F.at(-1);return{docs:B,limit:C,totalDocs:y,hasNextPage:I,cursor:P?V(P,g):null}})}async findOne(o,i={}){return(await this.find(o,{...i,limit:1})).docs[0]??null}async findById(o,i,r={}){return this.findOne(o,{...r,where:t("id",i)})}async count(o,i={}){let r=await this.options.database(),a=O(this.options.config,i),c=await _(o,{actor:i.actor??null,operation:"read",locale:a.locale,rbac:this.options.config.rbac}),f=this.scope(o,i.where,c,i.includeTrashed);return r.transaction(async(h)=>{let g=await r.query(h,{table:p,where:f,count:!0});return Number(g[0]?.count??0)})}async create(o,i){let r=O(this.options.config,i),a=i.actor??null,c={...i.data};return this.runWrite({collection:o,intent:"create",actor:a,source:i.source??"local",locale:r,depth:i.depth,includeTrashed:i.includeTrashed,runId:i.runId,idempotencyKey:i.idempotencyKey,step:async({db:f,hooks:h,context:g})=>{await this.assertAllowed(o,"create",a,r),j(o,c,a,r.locale);let C=await Ie(h.createBefore,{data:c},g,(P,W)=>({...P,data:W}));if(C===!1)return null;let v=i.id??b("doc"),D=await be({db:f,collection:o,input:C.data,stored:null,locale:r.locale,documentId:v}),{data:I,touched:F}=$e(o,D.input,r);Je(o,I,r,Object.keys(o.fields));let B=new Date,y=await f.insert(p,{id:v,collection:o.slug,data:I,created_at:B,updated_at:B,updated_by:a?.id??null,deleted_at:null,purge_after:null,scheduled_at:null,scheduled_patch:null,revision:1});return{doc:A(y,o,r),previous:null,changed:F,stored:I}}})}async update(o,i,r){let a=O(this.options.config,i),c=i.actor??null,f={...i.data};return this.runWrite({collection:o,intent:"update",actor:c,source:i.source??"local",locale:a,depth:i.depth,includeTrashed:i.includeTrashed,runId:i.runId,idempotencyKey:i.idempotencyKey,...r===void 0?{}:{emit:r},step:async({adapter:h,tx:g,db:C,hooks:v,context:D})=>{let I=await this.load(h,g,o,i.id,{actor:c,operation:"update",locale:a,includeTrashed:i.includeTrashed});Re(i.expectedRevision,I);let F=A(I,o,a);await this.assertAllowed(o,"update",c,a,F),j(o,f,c,a.locale,F);let B=await Ie(v.updateBefore,{data:f,previous:F},D,(L,N)=>({...L,data:N}));if(B===!1)return null;let y=await be({db:C,collection:o,input:B.data,stored:u(I.data),locale:a.locale,documentId:String(I.id)}),{data:P,touched:W}=$e(o,y.input,a,u(I.data));Je(o,P,a,W);let E=new Date,k=await this.patch(h,g,I,{data:P,updated_at:E,updated_by:c?.id??null},i.expectedRevision),T=A(k,o,a);return{doc:T,previous:F,changed:go(o,F,T),stored:P,slugMoves:y.moves}}})}async remove(o,i){if(!this.options.config.trash.enabled||i.permanent===!0)return this.purge(o,i);let a=O(this.options.config,i),c=i.actor??null;return this.runWrite({collection:o,intent:"trash",actor:c,source:i.source??"local",locale:a,depth:i.depth,includeTrashed:!0,runId:i.runId,idempotencyKey:i.idempotencyKey,step:async({adapter:f,tx:h,hooks:g,context:C})=>{let v=await this.load(f,h,o,i.id,{actor:c,operation:"delete",locale:a,includeTrashed:!1});Re(i.expectedRevision,v);let D=A(v,o,a);await this.assertAllowed(o,"delete",c,a,D);let I=await Ie(g.deleteBefore,D,C,(y,P)=>P);if(I===!1)return null;let F=new Date,B=await this.patch(f,h,v,{deleted_at:F,purge_after:this.purgeAt(F),scheduled_at:null,scheduled_patch:null,updated_at:F,updated_by:c?.id??null});return{doc:A(B,o,a),previous:I,changed:[]}}})}async restore(o,i){let r=O(this.options.config,i),a=i.actor??null;return this.runWrite({collection:o,intent:"restore",actor:a,source:i.source??"local",locale:r,depth:i.depth,includeTrashed:!0,runId:i.runId,idempotencyKey:i.idempotencyKey,step:async({adapter:c,tx:f})=>{let h=await this.load(c,f,o,i.id,{actor:a,operation:"restore",locale:r,includeTrashed:!0});if(Re(i.expectedRevision,h),h.deleted_at===null||h.deleted_at===void 0)throw e.conflict(`${o.name} "${i.id}" is not in the trash`);let g=A(h,o,r);await this.assertAllowed(o,"restore",a,r,g);let C=new Date,v=await this.patch(c,f,h,{deleted_at:null,purge_after:null,updated_at:C,updated_by:a?.id??null});return{doc:A(v,o,r),previous:g,changed:[],after:!1}}})}async purge(o,i,r={}){let a=O(this.options.config,i),c=i.actor??null;return this.runWrite({collection:o,intent:"purge",actor:c,source:i.source??"local",locale:a,depth:i.depth,includeTrashed:!0,step:async({adapter:f,tx:h,db:g,hooks:C,context:v})=>{let D=await this.load(f,h,o,i.id,{actor:c,operation:"purge",locale:a,includeTrashed:!0,bypassAccess:r.retention===!0}),I=A(D,o,a),F=D.deleted_at!==null&&D.deleted_at!==void 0;if(r.retention!==!0)await this.assertAllowed(o,F?"purge":"delete",c,a,I);let B=F?I:await Ie(C.deleteBefore,I,v,(y,P)=>P);if(B===!1)return null;return await g.delete(p,t("id",String(D.id))),{doc:B,previous:B,changed:[],after:!F,releaseMedia:!0}}})}async schedule(o,i){let r=O(this.options.config,i),a=i.actor??null,c=Ut(i.at),f={...i.data};if(Object.keys(f).length===0)throw e.validation("A scheduled change needs at least one field.");return this.runWrite({collection:o,intent:"schedule",actor:a,source:i.source??"local",locale:r,depth:i.depth,includeTrashed:!1,step:async({adapter:h,tx:g})=>{let C=await this.load(h,g,o,i.id,{actor:a,operation:"update",locale:r,includeTrashed:!1}),v=A(C,o,r);await this.assertAllowed(o,"update",a,r,v),j(o,f,a,r.locale,v);let D=$e(o,f,r,u(C.data));Je(o,D.data,r,D.touched);let I=new Date,F=await this.patch(h,g,C,{scheduled_at:c,scheduled_patch:{data:f,locale:r.locale,actor:a===null?null:{...a}},updated_at:I,updated_by:a?.id??null});return{doc:A(F,o,r),previous:v,changed:[],after:!1}}})}async unschedule(o,i){let r=O(this.options.config,i),a=i.actor??null;return this.runWrite({collection:o,intent:"unschedule",actor:a,source:i.source??"local",locale:r,depth:i.depth,includeTrashed:!1,step:async({adapter:c,tx:f})=>{let h=await this.load(c,f,o,i.id,{actor:a,operation:"update",locale:r,includeTrashed:!1});if(h.scheduled_at===null||h.scheduled_at===void 0)throw e.conflict(`${o.name} "${i.id}" has nothing scheduled`);let g=A(h,o,r);await this.assertAllowed(o,"update",a,r,g);let C=new Date,v=await this.patch(c,f,h,{scheduled_at:null,scheduled_patch:null,updated_at:C,updated_by:a?.id??null});return{doc:A(v,o,r),previous:g,changed:[],after:!1}}})}globalApi(o){return{get:(i)=>this.globalGet(o,i),update:async(i)=>{let r=await this.ensureGlobalRow(o,i);return this.update(o,{...i,id:r})},schedule:async(i)=>{let r=await this.ensureGlobalRow(o,i);return this.schedule(o,{...i,id:r})},unschedule:async(i={})=>this.unschedule(o,{...i,id:te(o)})}}async globalGet(o,i={}){let r=await this.options.database(),a=O(this.options.config,i),c=i.actor??null,f=await _(o,{actor:c,operation:"read",locale:a.locale,rbac:this.options.config.rbac});return r.transaction(async(h)=>{let C=(await r.query(h,{table:p,where:this.scope(o,t("id",te(o)),f,!1),limit:1}))[0]??this.emptyGlobalRow(o,a,null),v=A(C,o,a);return await this.expand(r,h,[v],o,a,i,c),this.redact([v],o,c,a),v})}async ensureGlobalRow(o,i){let r=await this.options.database(),a=O(this.options.config,i),c=te(o);if(await r.transaction(async(h)=>(await r.query(h,{table:p,where:t("id",c),limit:1})).length>0))return c;try{await r.transaction((h)=>r.mutate(h,{kind:"insert",table:p,returning:!1,values:this.emptyGlobalRow(o,a,new Date)}))}catch(h){if(!await r.transaction(async(C)=>(await r.query(C,{table:p,where:t("id",c),limit:1})).length>0))throw h}return c}emptyGlobalRow(o,i,r){let{data:a}=$e(o,{},i);return{id:te(o),collection:o.slug,data:a,created_at:r,updated_at:r,updated_by:null,deleted_at:null,purge_after:null,scheduled_at:null,scheduled_patch:null,revision:1}}async applyScheduled(o){let i=this.bySlug[String(o.collection)],r=je(o),a=o.scheduled_at;if(!i||!r||!(a instanceof Date)){await this.clearSchedule(String(o.id));return}let c=await this.options.database();if((await c.transaction((h)=>c.mutate(h,{kind:"update",table:p,where:s(t("id",String(o.id)),t("scheduled_at",a)),set:{scheduled_at:null,scheduled_patch:null},returning:!1}))).count!==1)return;await this.update(i,{id:String(o.id),data:r.data,locale:r.locale,actor:r.actor,source:"job"},(h,g)=>{h.emit("document.schedule.applied",{collection:i.name,documentId:String(g.doc.id),locale:r.locale,scheduledFor:a.toISOString(),patch:r.data})})}async purgeExpired(o){let i=this.bySlug[String(o.collection)];if(!i){let r=await this.options.database();await r.transaction(async(a)=>{let c=d(r,a);await c.delete(Mt,t("document_id",String(o.id))),await c.delete(p,t("id",String(o.id)))});return}await this.purge(i,{id:String(o.id),actor:null,source:"job",includeTrashed:!0},{retention:!0})}async clearSchedule(o){let i=await this.options.database();await i.transaction((r)=>i.mutate(r,{kind:"update",table:p,where:t("id",o),set:{scheduled_at:null,scheduled_patch:null},returning:!1}))}async recordFailure(o,i,r){let a=r instanceof Error?r.message:String(r),c=await this.options.database(),f=new Date;await c.transaction(async(h)=>{await d(c,h).insert("jobs",{id:ve("job"),type:o,payload:i,status:"failed",run_at:f,attempts:1,locked_at:null,locked_by:null,completed_at:null,error:a,created_at:f}),await this.appendEvents(h,[{type:"job.failed",data:{job:o,error:a,...i},previous:null}],{actor:null})}),this.scheduleDelivery()}async runWrite(o){let i=await this.options.database(),r=await this.outboxWorker(),a=this.pipeline(o.collection.name),c=new pt,f=await i.transaction(async(h)=>{let g=d(i,h),C=await this.replay(g,o);if(C)return C;let v={actor:o.actor,collection:o.collection.name,operation:Ke[o.intent],locale:o.locale.locale,tx:h,db:g,cms:this.instance(),events:c,source:o.source,meta:{}},D=await o.step({adapter:i,tx:h,db:g,hooks:a,context:v});if(D===null)return null;if(this.emitDocumentEvents(c,o,D),await this.syncMedia(g,o,D,c),await this.syncSlugs(g,o,D),o.emit?.(c,D),await r.append(h,c.take(),this.outboxMeta(o,D)),D.after!==!1)await this.runAfter(a,o,D,v);return await r.append(h,c.take(),this.outboxMeta(o,D)),await this.writeActivity(g,o,D),await this.recordIdempotency(g,o,D),await this.expand(i,h,[D.doc],o.collection,o.locale,o,o.actor),D});if(!f)return null;if(!("replayed"in f))this.scheduleDelivery();return this.redact([f.doc],o.collection,o.actor,o.locale),f.doc}async replay(o,i){let r=i.idempotencyKey;if(r===void 0)return null;let a=await o.findOne(Ue,t("idempotency_key",r));if(!a)return null;return{doc:u(a.result),previous:null,changed:[],replayed:!0}}async recordIdempotency(o,i,r){let a=i.idempotencyKey;if(a===void 0)return;await o.insert(Ue,{id:b("aim"),idempotency_key:a,run_id:i.runId??"",collection:i.collection.name,document_id:String(r.doc.id),result:r.doc,created_at:new Date})}async runAfter(o,i,r,a){let c=Ke[i.intent];if(c==="create"){await He(o.createAfter,r.doc,a);return}if(c==="update"){await He(o.updateAfter,{doc:r.doc,previous:r.previous},a);return}await He(o.deleteAfter,r.doc,a)}emitDocumentEvents(o,i,r){let a=(f)=>({collection:i.collection.name,documentId:String(r.doc.id),locale:i.locale.locale,document:ce(f)});switch(i.intent){case"create":{o.emit("document.created",a(r.doc),null);return}case"trash":{o.emit("document.trashed",{...a(r.doc),purgeAfter:r.doc.purgeAfter??null},null);return}case"restore":{o.emit("document.restored",a(r.doc),null);return}case"purge":{o.emit("document.purged",a(r.doc),null);return}case"schedule":{o.emit("document.scheduled",{...a(r.doc),scheduledAt:r.doc.scheduledAt??null,patch:ce(r.doc.scheduledPatch??null)},null);return}case"unschedule":{o.emit("document.schedule.cancelled",{...a(r.doc),scheduledAt:r.previous?.scheduledAt??null},null);return}case"update":break}let c=r.previous;o.emit("document.updated",a(r.doc),a(c));for(let f of r.changed)o.emit("document.field.changed",{collection:i.collection.name,documentId:String(r.doc.id),locale:i.locale.locale,field:f,value:ce(r.doc[f]??null)},{field:f,value:ce(c[f]??null)})}async syncMedia(o,i,r,a){let c=this.options.config.uploads,f=r.releaseMedia===!0;if(!f&&r.stored===void 0)return;if(!f&&!this.referencesMedia(i.collection))return;let h=await nn({db:o,collection:i.collection.name,documentId:String(r.doc.id),references:f?null:tn(i.collection,r.stored??{}),lifecycle:c!==void 0,retention:c?.retention,now:new Date}),g=(C)=>({mediaId:C,collection:i.collection.name,documentId:String(r.doc.id)});for(let C of h.orphaned)a.emit("media.orphaned",g(C));for(let C of h.reclaimed)a.emit("media.reclaimed",g(C))}async syncSlugs(o,i,r){if(!this.keepsSlugHistory(i.collection))return;let a=String(r.doc.id);if(r.releaseMedia===!0){await Me(o,i.collection,a);return}if(r.slugMoves&&r.slugMoves.length>0)await we(o,i.collection,a,r.slugMoves,new Date)}keepsSlugHistory(o){return ae(o).some(([,i])=>ee(i).history===!0)}referencesMedia(o){let i=this.media.get(o.name);if(i!==void 0)return i;let r=en(o);return this.media.set(o.name,r),r}async writeActivity(o,i,r){await o.insert(Lt,{id:ve("act"),actor_id:i.actor?.id??null,actor_source:i.actor?.source??null,action:Qt(i.intent),source:i.source,collection:i.collection.name,document_id:String(r.doc.id),locale:i.locale.locale,changes:{fields:r.changed,...i.runId===void 0?{}:{runId:i.runId}},ip:null,created_at:new Date})}scope(o,i,r,a){let c=[t("collection",o.slug)];if(a!==!0)c.push(t("deleted_at",null));if(i)c.push(i);if(r)c.push(r);return s(...c)}async load(o,i,r,a,c){let f=c.bypassAccess===!0?void 0:await _(r,{actor:c.actor,operation:c.operation,locale:c.locale.locale,rbac:this.options.config.rbac}),g=(await o.query(i,{table:p,where:this.scope(r,t("id",a),f,c.includeTrashed),limit:1}))[0];if(!g)throw e.notFound(`No ${r.name} with id "${a}"`);return g}async patch(o,i,r,a,c){let f=hn(r.revision),h=f+1,g=String(r.id),C=await o.mutate(i,{kind:"update",table:p,where:c===void 0?t("id",g):s(t("id",g),t("revision",c)),set:{...a,revision:h}});if(c!==void 0&&C.count===0)throw Ve(c,f);return C.rows[0]??{...r,...a,revision:h}}async assertAllowed(o,i,r,a,c){if(await _(o,{actor:r,operation:i,locale:a.locale,rbac:this.options.config.rbac,...c===void 0?{}:{record:c}})&&i==="create")throw new e(`access.create on "${o.name}" returned a filter; a create has no row to filter. Return true or false.`,{status:500,code:"invalid_access_rule"})}requireCollection(o){let i=this.byName[o];if(!i)throw e.notFound(`No collection named "${o}"`);return i}purgeAt(o){let i=this.options.config.trash.purgeAfter;if(i===!1)return null;return new Date(o.getTime()+w(i))}async expand(o,i,r,a,c,f,h){if(!f.depth)return;await new ft({adapter:o,tx:i,locale:c,actor:h,rbac:this.options.config.rbac,collections:this.byName,...f.includeTrashed===void 0?{}:{includeTrashed:f.includeTrashed}}).expand(r,a,f.depth)}redact(o,i,r,a){if(!on(i))return;for(let c of o)fe(c,i,r,a.locale)}pipeline(o){let i=this.pipelines.get(o);if(i)return i;let r=dt(this.options.config,o);return this.pipelines.set(o,r),r}outboxMeta(o,i){return{actor:o.actor,collection:o.collection.name,documentId:String(i.doc.id)}}async outboxWorker(){if(this.outbox)return this.outbox;let o=await this.options.database();return this.outbox=new mt(o,this.options.dispatch),this.outbox}scheduleDelivery(){this.delivery=this.delivery.then(async()=>{await(await this.outboxWorker()).drain()}).catch(()=>{return})}instance(){if(!this.cms)throw new e("The engine was used before it was bound.",{status:500,code:"engine_unbound"});return this.cms}}function te(o){return`glb_${o.slug}`}function Nt(o){let i=o&&o.length>0?[...o]:[{path:"updated_at",direction:"desc"}];if(!i.some((r)=>r.path==="id"))i.push({path:"id",direction:i[i.length-1]?.direction??"desc"});return i}function qt(o){if(o===void 0)return Et;if(!Number.isInteger(o)||o<1)throw new e(`limit must be a positive integer, received ${o}`,{status:400,code:"invalid_pagination"});return Math.min(o,Ft)}function Ut(o){let i=o instanceof Date?o:new Date(o);if(Number.isNaN(i.getTime()))throw e.validation(`"${String(o)}" is not a date`);return i}function Ve(o,i){return new e(`This document has changed since you read it (expected revision ${o}, found ${i}). Reload it and apply your change again.`,{status:409,code:"revision_conflict",details:{expectedRevision:o,revision:i}})}function Re(o,i){if(o===void 0)return;if(!Number.isInteger(o)||o<1)throw e.validation(`expectedRevision has to be a positive integer, received ${String(o)}.`);let r=hn(i.revision);if(r!==o)throw Ve(o,r)}function Qt(o){switch(o){case"create":return"document.created";case"update":return"document.updated";case"trash":return"document.trashed";case"restore":return"document.restored";case"purge":return"document.purged";case"schedule":return"document.scheduled";case"unschedule":return"document.schedule.cancelled"}}function ce(o){return JSON.parse(JSON.stringify(o??null))}var Ht={af:"Afrikaans",am:"Amharic",ar:"Arabic",az:"Azerbaijani",be:"Belarusian",bg:"Bulgarian",bn:"Bengali",bs:"Bosnian",ca:"Catalan",cs:"Czech",cy:"Welsh",da:"Danish",de:"German",el:"Greek",en:"English",eo:"Esperanto",es:"Spanish",et:"Estonian",eu:"Basque",fa:"Persian",fi:"Finnish",fil:"Filipino",fo:"Faroese",fr:"French",ga:"Irish",gl:"Galician",gu:"Gujarati",he:"Hebrew",hi:"Hindi",hr:"Croatian",hu:"Hungarian",hy:"Armenian",id:"Indonesian",is:"Icelandic",it:"Italian",ja:"Japanese",ka:"Georgian",kk:"Kazakh",km:"Khmer",kn:"Kannada",ko:"Korean",ku:"Kurdish",ky:"Kyrgyz",lo:"Lao",lt:"Lithuanian",lv:"Latvian",mk:"Macedonian",ml:"Malayalam",mn:"Mongolian",mr:"Marathi",ms:"Malay",mt:"Maltese",my:"Burmese",nb:"Norwegian Bokmål",ne:"Nepali",nl:"Dutch",nn:"Norwegian Nynorsk",no:"Norwegian",pa:"Punjabi",pl:"Polish",ps:"Pashto",pt:"Portuguese",ro:"Romanian",ru:"Russian",si:"Sinhala",sk:"Slovak",sl:"Slovenian",sq:"Albanian",sr:"Serbian",sv:"Swedish",sw:"Swahili",ta:"Tamil",te:"Telugu",th:"Thai",tk:"Turkmen",tl:"Tagalog",tr:"Turkish",tt:"Tatar",uk:"Ukrainian",ur:"Urdu",uz:"Uzbek",vi:"Vietnamese",zh:"Chinese",zu:"Zulu"},Xt={AR:"Argentina",AT:"Austria",AU:"Australia",BE:"Belgium",BR:"Brazil",CA:"Canada",CH:"Switzerland",CL:"Chile",CN:"China",CO:"Colombia",CZ:"Czechia",DE:"Germany",DK:"Denmark",ES:"Spain",FI:"Finland",FR:"France",GB:"United Kingdom",HK:"Hong Kong",IE:"Ireland",IN:"India",IT:"Italy",JP:"Japan",KR:"South Korea",MX:"Mexico",NL:"Netherlands",NO:"Norway",NZ:"New Zealand",PL:"Poland",PT:"Portugal",RU:"Russia",SE:"Sweden",TW:"Taiwan",UA:"Ukraine",US:"United States",ZA:"South Africa"},rn=new Set(["ar","arc","dv","fa","he","ku","ps","sd","ug","ur","yi"]);function Bt(o){let i=Ht[o];if(i)return i;let[r,a]=o.split("-"),c=r===void 0?void 0:Ht[r.toLowerCase()];if(!c)return o;if(a===void 0)return c;let f=a.toUpperCase();return`${c} (${Xt[f]??f})`}function Vt(o){let i=o.split("-")[0];return i!==void 0&&rn.has(i.toLowerCase())}function xn(o){return o.i18n.locales.map((i)=>({code:i,name:Bt(i),rtl:Vt(i),isDefault:i===o.i18n.defaultLocale}))}var q="webhooks",U="webhook_deliveries",an=25,ln=200,cn=5,dn="10s";function Gt(o){let{config:i}=o,r=(y,P)=>(o.fetch??globalThis.fetch)(y,P),a=o.now??(()=>new Date),c=i.webhooks,f=c?.delivery?.retries??cn,h=w(c?.delivery?.timeout??dn),g=c?.delivery?.dlq!==!1,C=c?.delivery?.backoff==="linear",v=()=>{if(c?.enabled)return;throw new e("Webhooks are switched off; set webhooks.enabled to true.",{status:501,code:"webhooks_disabled"})},D=(y)=>C?y*30000:Math.min(3600000,1000*2**y),I=async()=>{let y=await o.database();return y.transaction((P)=>y.query(P,{table:q,where:t("active",!0)}))},F=async(y,P,W,E=a())=>{let k=await o.database(),T=Number(y.attempt??0)+1;if((await k.transaction((z)=>k.mutate(z,{kind:"update",table:U,where:s(t("id",String(y.id)),t("status","pending"),t("attempt",Number(y.attempt??0)),t("next_attempt_at",y.next_attempt_at==null?null:new Date(l(y.next_attempt_at))),R(t("next_attempt_at",null),M("next_attempt_at",E))),set:{attempt:T,next_attempt_at:new Date(E.getTime()+h+30000)},returning:!1}))).count!==1)return ie(y);if(T>f){let z={status:"failed",next_attempt_at:null,error:"Delivery lease expired; attempt budget exhausted."};return await k.transaction((re)=>d(k,re).update(U,s(t("id",String(y.id)),t("attempt",T)),z)),ie({...y,...z,attempt:T})}let N=typeof P.secret==="string"&&P.secret||c?.signing?.secret||"",G={"content-type":"application/json","user-agent":"heyo-cms","x-heyo-event-id":String(y.event_id),"x-heyo-event-type":String(y.event_type),"x-heyo-delivery-id":String(y.id),"x-heyo-attempt":String(T),...gn(P.headers)};if(N.length>0)G[Ae]=await ke(W,N);let K=null,ue=null,ne=null;try{let z=await r(String(P.url),{method:"POST",headers:G,body:W,signal:AbortSignal.timeout(h)});if(K=z.status,ue=await pn(z),!z.ok)ne=`Responded ${z.status}.`}catch(z){ne=z instanceof Error?z.message:String(z)}let xe=ne===null,pe=T>=f,Oe=a(),Pe=xe?{status:"delivered",attempt:T,response_status:K,response_body:ue,error:null,next_attempt_at:null,delivered_at:Oe}:{status:pe?"failed":"pending",attempt:T,response_status:K,response_body:ue,error:ne,next_attempt_at:pe?null:new Date(Oe.getTime()+D(T)),delivered_at:null},st=await k.transaction(async(z)=>(await d(k,z).update(U,s(t("id",String(y.id)),t("status","pending"),t("attempt",T)),Pe),{...y,...Pe}));if(!xe&&pe&&g)await(await o.database()).transaction((re)=>o.emit(re,[{type:"job.failed",data:{job:"webhook-delivery",webhookId:String(y.webhook_id),deliveryId:String(y.id),eventId:String(y.event_id),eventType:String(y.event_type),attempts:T,error:ne??"unknown"},previous:null}],{actor:null})),o.deliver();return ie(st)},B=async(y,P)=>{let W=await o.database(),E=JSON.stringify(P),k=`whd_${P.id}_${String(y.id)}`,T=await W.transaction((N)=>d(W,N).findOne(U,t("id",k)));if(T)return ie(T);let L=await W.transaction(async(N)=>d(W,N).insert(U,{id:k,webhook_id:String(y.id),event_id:P.id,event_type:P.type,status:"pending",attempt:0,request_body:P,response_status:null,response_body:null,error:null,next_attempt_at:a(),delivered_at:null,created_at:a()}));return F(L,y,E)};return{get enabled(){return c?.enabled===!0},async list(y={}){v();let P=await o.database();return(await P.transaction((E)=>P.query(E,{table:q,...y.active===void 0?{}:{where:t("active",y.active)},orderBy:[m("created_at","desc"),m("id","desc")]}))).map(de)},async get(y){v();let P=await o.database(),W=await P.transaction(async(E)=>d(P,E).findOne(q,t("id",y)));return W?de(W):null},async create(y){v(),Ze(y.url),Qe(y.events);let P=await o.database(),W=a();return await P.transaction(async(k)=>{let L=await d(P,k).insert(q,{id:b("whk"),url:y.url,events:y.events,filters:y.filters??null,headers:y.headers??null,secret:y.secret??null,active:y.active!==!1,created_at:W,updated_at:W});return de(L)})},async update(y){if(v(),y.url!==void 0)Ze(y.url);if(y.events!==void 0)Qe(y.events);let P=await o.database();return P.transaction(async(W)=>{let E=d(P,W),k=await E.findOne(q,t("id",y.id));if(!k)throw e.notFound("No such webhook.");let T={updated_at:a()};if(y.url!==void 0)T.url=y.url;if(y.events!==void 0)T.events=y.events;if(y.filters!==void 0)T.filters=y.filters;if(y.headers!==void 0)T.headers=y.headers;if(y.secret!==void 0)T.secret=y.secret;if(y.active!==void 0)T.active=y.active;await E.update(q,t("id",y.id),T);let L=await E.findOne(q,t("id",y.id));return de(L??{...k,...T})})},async remove(y){v();let P=await o.database();return P.transaction(async(W)=>{let E=d(P,W);return await E.delete(U,t("webhook_id",y.id)),await E.delete(q,t("id",y.id))>0})},async deliveries(y={}){v();let P=await o.database(),W=Math.min(ln,Math.max(1,y.limit??an)),E=[m("created_at","desc"),m("id","desc")],k=[];if(y.webhookId)k.push(t("webhook_id",y.webhookId));if(y.status)k.push(t("status",y.status));if(y.eventId)k.push(t("event_id",y.eventId));let T=k.length===0?void 0:s(...k),L=await P.transaction((K)=>P.query(K,{table:U,...y.cursor?{where:T===void 0?J(y.cursor,E):s(T,J(y.cursor,E))}:T===void 0?{}:{where:T},orderBy:E,limit:W+1})),N=L.slice(0,W),G=N.at(-1);return{entries:N.map((K)=>ie(K,y.includeBody===!0)),limit:W,hasNextPage:L.length>W,cursor:G?V(G,E):null}},async test(y){v();let P=await o.database(),W=await P.transaction(async(T)=>d(P,T).findOne(q,t("id",y.id)));if(!W)throw e.notFound("No such webhook.");let E=y.actor??null,k={id:b("evt"),type:"webhook.test",createdAt:a().toISOString(),actor:E?{id:E.id,source:E.source}:null,data:{message:"A test delivery from Heyo CMS. Verify the signature exactly as you would for a real event.",webhookId:String(W.id)},previous:null};return B(W,k)},async retry(y){v();let P=await o.database(),{delivery:W,subscription:E}=await P.transaction(async(L)=>{let N=d(P,L),G=await N.findOne(U,t("id",y.id));if(!G)throw e.notFound("No such delivery.");let K=await N.findOne(q,t("id",String(G.webhook_id)));if(!K)throw e.notFound("That webhook is gone.");return{delivery:G,subscription:K}}),k=JSON.stringify(W.request_body??{}),T=await P.transaction(async(L)=>d(P,L).insert(U,{id:ve("whd"),webhook_id:String(E.id),event_id:String(W.event_id),event_type:String(W.event_type),status:"pending",attempt:0,request_body:W.request_body??null,response_status:null,response_body:null,error:null,next_attempt_at:a(),delivered_at:null,created_at:a()}));return F(T,E,k)},async attemptDelivery(y,P=a()){let W=await o.database(),E=await W.transaction(async(k)=>{let T=d(W,k),L=await T.findOne(U,t("id",y));if(!L||L.status!=="pending")return null;let N=await T.findOne(q,t("id",String(L.webhook_id)));return N?{row:L,subscription:N}:null});if(!E)return null;return F(E.row,E.subscription,JSON.stringify(E.row.request_body??{}),P)},async dispatch(y){if(c?.enabled!==!0)return;let P=await I();for(let W of P){if(!fn(W,y))continue;await B(W,y)}},async drain(y={}){let P={attempted:0,delivered:0,failed:0};if(c?.enabled!==!0)return P;let W=await o.database(),E=y.now??a(),k=await W.transaction((T)=>W.query(T,{table:U,where:s(t("status","pending"),R(t("next_attempt_at",null),M("next_attempt_at",E))),orderBy:[m("next_attempt_at","asc"),m("id","asc")],limit:y.limit??50}));for(let T of k){let L=await W.transaction(async(G)=>d(W,G).findOne(q,t("id",String(T.webhook_id))));if(!L)continue;P.attempted+=1;let N=await F(T,L,JSON.stringify(T.request_body??{}),E);if(N.status==="delivered")P.delivered+=1;else if(N.status==="failed")P.failed+=1}return P},async wants(y){if(c?.enabled!==!0)return!1;return(await I()).some((W)=>Xe(W,y))}}}async function pn(o){let i=o.body?.getReader();if(!i)return"";let r=[],a=0;try{while(a<2000){let{value:h,done:g}=await i.read();if(g)break;let C=h.slice(0,2000-a);r.push(C),a+=C.length}}finally{await i.cancel().catch(()=>{}),i.releaseLock()}let c=new Uint8Array(a),f=0;for(let h of r)c.set(h,f),f+=h.length;return new TextDecoder().decode(c)}function Xe(o,i){return Ye(o.events).some((a)=>{if(a==="*"||a===i)return!0;if(!a.endsWith("*"))return!1;return i.startsWith(a.slice(0,-1))})}function fn(o,i){if(!Xe(o,i.type))return!1;let r=o.filters??null;if(!r)return!0;let a=i.data;if(r.collections?.length){let c=typeof a.collection==="string"?a.collection:null;if(!c||!r.collections.includes(c))return!1}if(r.locales?.length){let c=mn(a);if(c.length>0&&!c.some((f)=>r.locales?.includes(f)))return!1}return!0}function mn(o){if(typeof o.locale==="string")return[o.locale];if(Array.isArray(o.locales))return o.locales.filter((i)=>typeof i==="string");return[]}function de(o){return{id:String(o.id),url:String(o.url),events:Ye(o.events),filters:o.filters?u(o.filters):null,headers:o.headers?u(o.headers):null,hasSecret:typeof o.secret==="string"&&o.secret.length>0,active:o.active===!0||o.active===1,createdAt:l(o.created_at),updatedAt:l(o.updated_at)}}function ie(o,i=!1){return{id:String(o.id),webhookId:String(o.webhook_id),eventId:String(o.event_id),eventType:String(o.event_type),status:String(o.status)??"pending",attempt:Number(o.attempt??0),responseStatus:o.response_status===null||o.response_status===void 0?null:Number(o.response_status),responseBody:o.response_body===null||o.response_body===void 0?null:String(o.response_body),error:o.error===null||o.error===void 0?null:String(o.error),nextAttemptAt:l(o.next_attempt_at),deliveredAt:l(o.delivered_at),createdAt:l(o.created_at),...i?{requestBody:o.request_body===null||o.request_body===void 0?null:u(o.request_body)}:{}}}function Ye(o){if(!Array.isArray(o))return[];return o.filter((i)=>typeof i==="string")}function gn(o){if(typeof o!=="object"||o===null)return{};let i={};for(let[r,a]of Object.entries(o)){if(r.toLowerCase().startsWith("x-heyo-"))continue;if(r.toLowerCase()===Ae)continue;if(typeof a==="string")i[r]=a}return i}function Ze(o){let i;try{i=new URL(o)}catch{throw e.validation(`"${o}" is not a URL.`)}if(i.protocol!=="https:"&&i.protocol!=="http:")throw e.validation("A webhook URL has to be http or https.")}function Qe(o){if(o.length===0)throw e.validation("A webhook has to subscribe to at least one event type.");for(let i of o)if(!/^[a-z][a-z0-9.]*\*?$|^\*$/.test(i))throw e.validation(`"${i}" is not an event type; use "document.updated", "document.*" or "*".`)}var bn="webhook_deliveries";function Kt(o){return{name:"webhook-retries",failureType:"webhook.delivery",failurePayload:(i)=>({deliveryId:String(i.id),webhookId:String(i.webhook_id),eventId:String(i.event_id),eventType:String(i.event_type),attempt:Number(i.attempt??0)}),due:async(i,r,a)=>{let c=await i.database();return c.transaction((f)=>c.query(f,{table:bn,where:s(t("status","pending"),R(t("next_attempt_at",null),M("next_attempt_at",r))),orderBy:[m("next_attempt_at","asc"),m("id","asc")],limit:a}))},run:async(i,r,a)=>{await o.attemptDelivery(String(r.id),a)}}}var yn=new Set(["activity","admin","ai","auth","globals","jobs","locales","media","openapi.json","panel","roles","trash","users","webhooks"]),wn=/^[a-z][a-z0-9_]*$/,Cn=/^[a-z][a-zA-Z0-9_]*$/,Sn=/^[a-z][a-z0-9-]*$/,kn=/^[a-z]{2,3}(-[A-Za-z0-9]{2,8})*$/;function Vn(o){return{...o,kind:"collection"}}function Gn(o){return{...o,kind:"global"}}function Kn(o){let i=An(o),r=Pt({collections:i.collections,globals:i.globals,pluginTables:i.plugins.flatMap((k)=>k.schema?.tables??[])}),a=new Map;for(let k of i.plugins)for(let[T,L]of Object.entries(k.events??{})){if(!L)continue;let N=a.get(T)??new Set;N.add(L),a.set(T,N)}let c,f,g=new ht({config:i,database:()=>E.database(),dispatch:async(k)=>{let T=[...a.get(k.type)??[],...a.get("*")??[]];for(let L of T)await L(k);await F.dispatch(k)}}),C=un({config:i,database:()=>E.database(),emit:(k,T,L)=>g.appendEvents(k,T,L),deliver:()=>g.deliverSoon()}),v=Yt({config:i,database:()=>E.database(),emit:(k,T,L)=>g.appendEvents(k,T,L),deliver:()=>g.deliverSoon()}),D=xn(i),I=De({database:()=>E.database()}),F=Gt({config:i,database:()=>E.database(),emit:(k,T,L)=>g.appendEvents(k,T,L),deliver:()=>g.deliverSoon()}),B=Rt({config:i,database:()=>E.database(),cms:()=>E,emit:(k,T,L)=>g.appendEvents(k,T,L),deliver:()=>g.deliverSoon()}),y=g.buildJobs();if(i.webhooks?.enabled)y.register(Kt(F));if(i.uploads)y.register(Zt({config:i,database:()=>E.database(),storage:()=>v.storage(),emit:(k,T,L)=>g.appendEvents(k,T,L),deliver:()=>g.deliverSoon()}));let P,W=()=>(P??=qe(E),P),E={_config:Object.freeze(i),schema:r,collections:o.collections,handler:(k)=>W().handler(k),_router:{routes:()=>W().routes()},api:g.buildApi(),globals:g.buildGlobals(),auth:C,media:v,ai:B,webhooks:F,trash:g.buildTrash(),jobs:y,locales:{list:()=>D},activity:I,inspect(){return{basePath:i.basePath,database:{id:c?.id??"unresolved",capabilities:c?.capabilities??{transactions:!1,sqlMigrations:!1,jsonQuery:!1}},storage:qn(i),collections:zn(i),schema:r,hooks:Wt(i),routes:W().routes(),admin:{path:`${i.basePath}${i.admin.path}`,panel:i.admin.assets?.id??null},plugins:Un(i),auth:Zn(i),ai:{enabled:i.ai!==void 0,defaultModel:i.ai?.defaultModel??null,assistant:i.ai!==void 0&&i.ai.assistant?.enabled!==!1,actions:me(),providers:Object.keys(i.ai?.auth??{}).sort(),panelManagedKeys:i.ai?.storage?.secret!==void 0},webhooks:{enabled:i.webhooks?.enabled===!0,signed:i.webhooks?.signing?.secret!==void 0,retries:i.webhooks?.delivery?.retries??5},editor:Te(),jobs:E.jobs.list(),trash:{enabled:i.trash.enabled,purgeAfter:i.trash.purgeAfter===!1?null:i.trash.purgeAfter}}},async database(){if(c)return c;return f??=Promise.resolve(typeof i.database==="function"?i.database():i.database).then((k)=>(k.useSchema(r),c=k,k)),f},on(k,T){let L=a.get(k)??new Set;return L.add(T),a.set(k,L),()=>{L.delete(T)}},drainEvents(k){return g.drainEvents(k)},async close(){await g.settle(),await c?.close?.(),c=void 0,f=void 0,a.clear()}};return g.bind(E),E}function An(o){let i=Nn(o.basePath??ge),r=new Set(ot()),a=o.plugins??[];jn(a);let c=Pn(o.collections,a),f=Tn({plugins:a,collections:c,globals:o.globals??{},basePath:i}),h={};for(let[v,D]of Object.entries(c))h[v]=nt(v,D,"collection",r);let g={};for(let[v,D]of Object.entries(o.globals??{}))g[v]=nt(v,D,"global",r);Rn({...h,...g}),Fn({...h,...g}),_n({...h,...g}),On(o,h,g),Dn({...h,...g}),In(o),Jn(o),Wn(o),En(o,i),Mn(o),Hn(o);let C=o.trash?.purgeAfter??"30d";if(typeof C==="string")w(C,"trash.purgeAfter");return{basePath:i,database:o.database,admin:{...o.admin,path:Bn(o.admin?.path??et)},...o.rbac===void 0?{}:{rbac:o.rbac},i18n:$n(o.i18n),...o.uploads===void 0?{}:{uploads:o.uploads.publicPath===void 0?o.uploads:{...o.uploads,publicPath:x(o.uploads.publicPath.trim())}},...o.ai===void 0?{}:{ai:o.ai},...o.webhooks===void 0?{}:{webhooks:o.webhooks},trash:{enabled:o.trash?.enabled??!0,purgeAfter:C},collections:h,globals:g,...o.hooks===void 0?{}:{hooks:o.hooks},...o.databaseHooks===void 0?{}:{databaseHooks:o.databaseHooks},plugins:a,pluginHooks:f,...o.telemetry===void 0?{}:{telemetry:o.telemetry},migrationsDirectory:o.migrations?.directory??tt}}function nt(o,i,r,a){if(!wn.test(o))throw new n(`collections.${o}`,"a collection name must be lowercase letters, digits and underscores, starting with a letter");let c=i.slug??o.replaceAll("_","-");if(!Sn.test(c))throw new n(`collections.${o}.slug`,`"${c}" is not a URL-safe slug`);if(a.has(o)||a.has(c))throw new n(`collections.${o}`,`"${o}" is a reserved system name; pick another`);if(yn.has(c))throw new n(`collections.${o}`,`"${c}" is a URL the CMS serves itself; give the collection another slug`);let f={};for(let[h,g]of Object.entries(i.fields)){if(!Cn.test(h))throw new n(`collections.${o}.fields.${h}`,"a field name must be letters, digits and underscores, starting with a lowercase letter");if(g.required&&g.admin?.hidden===!0)throw new n(`collections.${o}.fields.${h}.admin.hidden`,"a hidden field cannot be required; remove required or show the field");f[h]=g}if(Object.keys(f).length===0)throw new n(`collections.${o}.fields`,"a collection needs at least one field");return{name:o,slug:c,label:i.label??Qn(o),kind:r,fields:f,access:i.access??{},...i.admin===void 0?{}:{admin:i.admin}}}function Rn(o){let i=new Map;for(let r of Object.values(o)){let a=i.get(r.slug);if(a)throw new n(`collections.${r.name}.slug`,`"${r.slug}" is already used by "${a}"; slugs are URLs and index names`);i.set(r.slug,r.name)}}function _n(o){let i=new Set([...Object.keys(o),...ot()]);for(let r of Object.values(o))for(let[a,c]of Object.entries(r.fields)){if(!c.relationTo)continue;if(!i.has(c.relationTo))throw new n(`collections.${r.name}.fields.${a}`,`relation points at "${c.relationTo}", which is not a collection`)}}function On(o,i,r){for(let a of Object.keys(o.databaseHooks??{}))if(!(a in i)&&!(a in r))throw new n(`databaseHooks.${a}`,"no collection or global with this name")}function Pn(o,i){let r={...o},a=new Map;for(let c of i)for(let[f,h]of Object.entries(c.schema?.collections??{})){if(f in o)throw new n(`plugins.${c.id}.schema.collections.${f}`,`the configuration already declares a collection called "${f}"`);let g=a.get(f);if(g)throw new n(`plugins.${c.id}.schema.collections.${f}`,`"${g}" already declares a collection called "${f}"`);a.set(f,c.id),r[f]=h}return r}function Tn(o){let i=[],r=new Map;for(let a of o.plugins){if(!a.extendCollections)continue;let c=a.extendCollections({collections:o.collections,basePath:o.basePath});for(let f of c){let h=o.collections[f.collection]??o.globals[f.collection];if(!h)throw new n(`plugins.${a.id}.extendCollections`,`patches "${f.collection}", which is not a collection or a global`);for(let[g,C]of Object.entries(f.fields??{})){let v=r.get(`${f.collection}.${g}`);if(g in h.fields)throw new n(`plugins.${a.id}.extendCollections`,v?`"${v}" already added "${g}" to ${f.collection}`:`${f.collection} already has a field called "${g}"`);r.set(`${f.collection}.${g}`,a.id),h.fields={...h.fields,[g]:C}}if(f.hooks)i.push({plugin:a.id,collection:f.collection,hooks:f.hooks,priority:0})}}return i}function Dn(o){for(let i of Object.values(o))for(let[r,a]of Object.entries(i.fields)){if(a.aiGenerate!==void 0)it(i,r,a.aiGenerate,`collections.${i.name}.fields.${r}.aiGenerate`);for(let[c,f]of Object.entries(a.ai??{})){if(f!==!0)it(i,r,f,`collections.${i.name}.fields.${r}.ai.${c}`);let h=Z(c),g=`collections.${i.name}.fields.${r}.ai.${c}`;if(!h){if(f===!0||f.prompt===void 0)throw new n(g,"is not a registered AI action; register it with defineAiAction() or give it a prompt");continue}if(!h.appliesTo.includes("*")&&!h.appliesTo.includes(a.type))throw new n(g,`does not apply to a ${a.type} field; it applies to ${h.appliesTo.join(", ")}`);if(h.requiresLocalized&&!a.localized)throw new n(g,"needs a localized field; this one stores a single value for every language")}}}function it(o,i,r,a){if(r.context!==void 0&&!Array.isArray(r.context))throw new n(`${a}.context`,"must be an array of field names");let c=new Set;for(let f of r.context??[]){if(typeof f!=="string"||!o.fields[f]||f===i||c.has(f))throw new n(`${a}.context`,`"${f}" must name a different, existing field of ${o.name} (only once)`);c.add(f)}if(r.maxLength!==void 0&&(!Number.isInteger(r.maxLength)||r.maxLength<1))throw new n(`${a}.maxLength`,"must be a positive integer");if(r.model&&(!r.model.provider||!r.model.model))throw new n(`${a}.model`,"needs a provider and a model")}function jn(o){let i=new Set;for(let a of o){if(i.has(a.id))throw new n(`plugins.${a.id}`,"two plugins share this id");i.add(a.id)}let r=new Map;for(let a of o)for(let c of a.routes??[]){let f=`${c.method} ${c.root===!0?"(root) ":""}${c.path}`,h=r.get(f);if(h)throw new n(`plugins.${a.id}.routes`,`"${f}" is already registered by "${h}"`);r.set(f,a.id)}}function $n(o){let i=o?.locales,r=o?.defaultLocale??i?.[0]??"en";return{defaultLocale:r,locales:i??[r]}}function In(o){let i=o.i18n;if(!i)return;let r=i.locales;if(r!==void 0){if(r.length===0)throw new n("i18n.locales","at least one locale; leave the section out for a single-language site");for(let c of r)if(!kn.test(c))throw new n("i18n.locales",`"${c}" is not a locale code; use a BCP 47 tag such as "en" or "pt-BR"`);if(new Set(r).size!==r.length)throw new n("i18n.locales","duplicate locale codes")}let a=i.defaultLocale;if(a!==void 0&&r&&!r.includes(a))throw new n("i18n.defaultLocale",`"${a}" is not in i18n.locales (${r.map((c)=>`"${c}"`).join(", ")})`)}function Jn(o){let i=o.rbac;if(!i)return;for(let[r,a]of Object.entries(i.roles)){if(!/^[a-z][a-z0-9_-]*$/.test(r))throw new n(`rbac.roles.${r}`,"a role name must be lowercase letters, digits, dashes and underscores, starting with a letter");for(let c of a){if(c==="*")continue;if(!/^[a-z0-9_*-]+:[a-z0-9_*-]+$/.test(c))throw new n(`rbac.roles.${r}`,`"${c}" is not a permission; use "collection:action" or "*"`)}}if(i.defaultRole&&!(i.defaultRole in i.roles))throw new n("rbac.defaultRole",`"${i.defaultRole}" is not one of the configured roles`)}function Wn(o){let i=o.admin?.auth;if(!i)return;let r=new Set;for(let a of i.methods){if(r.has(a))throw new n("admin.auth.methods",`"${a}" is listed twice`);r.add(a)}for(let a of i.apiKeys?.scopes??[])if(!_e(a))throw new n("admin.auth.apiKeys.scopes",`"${a}" is not a scope; use "read", "write", "delete", "*" or "collection:action"`);if(i.sso?.mapRoles&&!o.rbac)throw new n("admin.auth.sso.mapRoles","maps claims onto roles, but no roles are configured; add rbac.roles")}function En(o,i){let r=o.uploads;if(!r)return;if(r.publicPath!==void 0)Ln(r.publicPath,i);if(r.limits?.maxFileSize)se(r.limits.maxFileSize,"uploads.limits.maxFileSize");let a=r.retention?.purgeAfter;if(typeof a==="string")w(a,"uploads.retention.purgeAfter");let c=r.images,f=c?.quality;if(f!==void 0&&(f<1||f>100))throw new n("uploads.images.quality","must be between 1 and 100");for(let[h,g]of Object.entries(c?.variants?.sizes??{})){if(!/^[a-z][a-z0-9-]*$/.test(h))throw new n(`uploads.images.variants.sizes.${h}`,"a size name ends up in a URL; use lowercase letters, digits and dashes");if(to.includes(h))throw new n(`uploads.images.variants.sizes.${h}`,`"${h}" is a media endpoint; pick another size name`);if(g.width===void 0&&g.height===void 0)throw new n(`uploads.images.variants.sizes.${h}`,"needs a width, a height, or both");if(g.fit==="cover"&&(g.width===void 0||g.height===void 0))throw new n(`uploads.images.variants.sizes.${h}`,'fit: "cover" needs both a width and a height')}if(c&&!c.processor){let h=c.convert!==void 0?"convert":c.maxDimensions!==void 0?"maxDimensions":c.variants?.mode==="pregenerate"?'variants.mode: "pregenerate"':null;if(h)throw new n("uploads.images.processor",`${h} has to render pixels, and nothing here can. Add a processor from "@heyo-sh/heyo-cms/uploads" (sharpImages() on Node, cloudflareImages() on Workers), or drop the option.`)}}function Fn(o){for(let i of Object.values(o))for(let[r,a]of Object.entries(i.fields)){if(a.type!=="slug")continue;let c=a.options.from;if(c===void 0)continue;let f=i.fields[String(c)],h=`collections.${i.name}.fields.${r}.from`;if(!f||c===r)throw new n(h,`"${String(c)}" is not another field of ${i.name}`);if(!["text","textarea","email","url","select"].includes(f.type))throw new n(h,`"${String(c)}" is a ${f.type} field; a slug is made from text`)}}function Ln(o,i){let r=x(o.trim()),a="uploads.publicPath";if(r.length===0&&o.trim().startsWith("/"))throw new n("uploads.publicPath",'cannot be "/"; use a path such as "/media"');if(!r.startsWith("/"))throw new n("uploads.publicPath",'must start with "/"');if(!r.split("/").slice(1).every((h)=>/^[A-Za-z0-9._~-]+$/.test(h)))throw new n("uploads.publicPath","may only contain letters, digits, dots, dashes, underscores and tildes between slashes");let f=(h,g)=>h===g||h.startsWith(`${g}/`);if(f(r,i)||f(i,r))throw new n("uploads.publicPath",`"${r}" overlaps basePath "${i}"; files are served from <basePath>/media already — pick a path outside it, such as "/media"`)}function Mn(o){let i=o.ai;if(!i)return;let r=new Set(Object.keys(i.auth??{})),a=i.storage?.secret!==void 0;if(r.size===0&&!a&&i.complete===void 0)throw new n("ai.auth","AI is configured without credentials. Add ai.auth, set ai.storage.secret to manage keys in the panel, or remove the section to disable AI");if(!a&&i.complete===void 0&&!r.has(i.defaultModel.provider))throw new n("ai.defaultModel.provider",`"${i.defaultModel.provider}" has no entry in ai.auth`);let c=i.assistant,f=c?.model?.provider;if(f&&!a&&i.complete===void 0&&!r.has(f))throw new n("ai.assistant.model.provider",`"${f}" has no entry in ai.auth`);for(let[h,g]of[["maxTurns",1],["maxToolCalls",1],["timeoutMs",1000]]){let C=c?.[h];if(C===void 0)continue;if(!Number.isInteger(C)||C<g)throw new n(`ai.assistant.${h}`,`must be an integer of at least ${g}; it is a budget the server enforces, not a hint to the model`)}if(i.storage&&i.storage.secret.length<16)throw new n("ai.storage.secret","must be at least 16 characters; it encrypts the provider keys in the database")}function Hn(o){let i=o.webhooks;if(!i?.enabled)return;if(!i.signing?.secret)throw new n("webhooks.signing.secret","webhooks must be signed; set a secret");if(i.delivery?.timeout)w(i.delivery.timeout,"webhooks.delivery.timeout")}function Bn(o){let i=o.trim();if(!i.startsWith("/"))throw new n("admin.path",'must start with "/"');if(/[?#]/.test(i)||i.includes("//"))throw new n("admin.path","cannot contain a query, a fragment or an empty segment");let r=x(i);if(r.length===0)return"";return r}function Nn(o){let i=o.trim();if(!i.startsWith("/"))throw new n("basePath",'must start with "/"');if(/[?#]/.test(i))throw new n("basePath","cannot contain a query or fragment");if(i.includes("//"))throw new n("basePath","cannot contain empty segments");let r=x(i);if(r.length===0)throw new n("basePath",'cannot be "/"');return r}function zn(o){return[...Object.values(o.collections),...Object.values(o.globals)].map((i)=>({name:i.name,slug:i.slug,kind:i.kind,fields:Object.entries(i.fields).map(([r,a])=>({name:r,type:a.type,localized:a.localized,required:a.required}))}))}function qn(o){let i=o.uploads;if(!i)return null;let r=i.retention?.purgeAfter??"30d";return{id:typeof i.storage==="function"?"unresolved":i.storage.id,variants:i.images?.variants?.mode??null,processor:i.images?.processor?.id??null,purgeAfter:r===!1?null:r}}function Un(o){return o.plugins.map((i)=>({id:i.id,collections:Object.keys(i.schema?.collections??{}).sort(),tables:(i.schema?.tables??[]).map((r)=>r.name).sort(),routes:i.routes?.length??0,hooks:(i.hooks?.length??0)+o.pluginHooks.filter((r)=>r.plugin===i.id).length,migrations:(i.migrations??[]).map((r)=>r.id),client:i.client!==void 0,admin:i.admin!==void 0}))}function Zn(o){let i=o.admin.auth;return{methods:i?.methods??[],twoFactor:i?.twoFactor===!0,apiKeys:i?.apiKeys?.enabled===!0,sso:i?.sso?.issuer??null,roles:Object.keys(o.rbac?.roles??{}).sort(),customRoles:o.rbac?.customRoles===!0}}function Qn(o){return o.replaceAll("_"," ").replace(/^./,(i)=>i.toUpperCase())}function yt(o="system"){return{id:o,source:"session",roles:["admin"],permissions:["*"]}}
|
|
2
|
+
export{dt,Ie,He,Wt,ut,pt,mt,ft,vn,zt,ht,te,Ht,Bt,Vt,xn,Gt,Kt,Vn,Gn,Kn,yt};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{l,u}from"./index-axpzy2hj.js";import{s,t,it,S}from"./index-6m1kjq9g.js";import{te,yt}from"./index-b79c3k6g.js";import{p}from"./index-s9x07zb3.js";var at="heyo-cms/export",ze=1;function Bn(n,e){let o;try{o=JSON.parse(n)}catch{throw Error(`Line ${e} is not JSON.`)}if(!h(o)||typeof o.kind!=="string")throw Error(`Line ${e} has no "kind".`);if(!["header","document","global"].includes(o.kind))throw Error(`Line ${e} has an unknown kind: ${o.kind}.`);if(o.kind==="header"){if(typeof o.format!=="string"||!Number.isInteger(o.version))throw Error(`Line ${e} has an invalid export header.`)}else{let r=o.kind==="document"?o.collection:o.global;if(typeof r!=="string"||r.length===0||!h(o.data))throw Error(`Line ${e} needs a collection/global name and an object "data".`);if(o.kind==="document"&&(typeof o.id!=="string"||o.id.length===0))throw Error(`Line ${e} needs a non-empty document "id".`)}return o}async function*Dt(n){let e=0;for await(let o of n){e+=1;let r=o.trim();if(r.length===0)continue;yield Bn(r,e)}}async function*qt(n){let e="";for await(let o of n){e+=o;let r=e.indexOf(`
|
|
2
|
+
`);while(r!==-1)yield e.slice(0,r),e=e.slice(r+1),r=e.indexOf(`
|
|
3
|
+
`)}if(e.length>0)yield e}function Lt(n){return`${JSON.stringify(n)}
|
|
4
|
+
`}function h(n){return typeof n==="object"&&n!==null&&!Array.isArray(n)}async function*Ft(n,e={}){let o=n._config,r=w(o.collections,e.collections,"collection"),a=w(o.globals,e.globals,"global"),c=await n.database();yield{kind:"header",format:at,version:ze,exportedAt:new Date().toISOString(),database:c.id,defaultLocale:o.i18n.defaultLocale,collections:r.map((d)=>d.name),globals:a.map((d)=>d.name)};let i=Math.max(1,e.batchSize??200);for(let d of r){let m;for(;;){let b=await y(n,{where:s(t("collection",d.slug),e.includeTrashed?void 0:t("deleted_at",null),m===void 0?void 0:it("id",m)),limit:i});if(b.length===0)break;for(let g of b)yield k(d,g,e);if(m=String(b[b.length-1]?.id),b.length<i)break}}if(a.length>0){let d=await y(n,{where:S("id",a.map((b)=>te(b))),limit:a.length}),m=new Map(d.map((b)=>[String(b.id),b]));for(let b of a){let g=m.get(te(b));yield{kind:"global",global:b.name,data:g?u(g.data):{},updatedAt:g?l(g.updated_at):null}}}}function k(n,e,o){let r={kind:"document",collection:n.name,id:String(e.id),data:u(e.data),createdAt:l(e.created_at),updatedAt:l(e.updated_at)};if(o.includeTrashed)r.deletedAt=l(e.deleted_at);let a=l(e.scheduled_at);if(a!==null)r.scheduledAt=a,r.scheduledPatch=u(e.scheduled_patch).data??null;return r}async function y(n,e){let o=await n.database();return o.transaction((r)=>o.query(r,{table:p,...e.where===void 0?{}:{where:e.where},orderBy:[{path:"id",direction:"asc"}],limit:e.limit}))}function w(n,e,o){if(!e)return Object.values(n);return e.map((r)=>{let a=n[r];if(!a){let c=Object.keys(n).join(", ")||"none";throw Error(`Unknown ${o}: ${r}. Declared: ${c}.`)}return a})}async function Nt(n,e,o={}){let r={documents:{created:0,updated:0,skipped:0},globals:{updated:0,skipped:0},errors:[]},a=o.actor===void 0?yt():o.actor,c=o.onConflict??"skip",f=!1;for await(let i of e){if(i.kind==="header"){A(i.format,i.version),f=!0;continue}if(!f)throw Error("The file does not start with an export header. Was it produced by `heyo-cms export`?");try{if(i.kind==="document")await x(n,i,{actor:a,onConflict:c,...o},r);else await O(n,i,{actor:a,...o},r)}catch(d){let m=i.kind==="document"?`${i.collection}/${i.id}`:`globals/${i.global}`;if(r.errors.push(`${m}: ${I(d)}`),i.kind==="document")r.documents.skipped+=1;else r.globals.skipped+=1}}if(!f)throw Error("The file is empty.");if(!o.dryRun)await n.drainEvents();return r}async function x(n,e,o,r){let a=n._config.collections[e.collection];if(!a)throw Error(`no collection named "${e.collection}" is declared`);if(e.deletedAt){r.documents.skipped+=1;return}let c=C(n,e.collection),f=await c.findById(e.id,{actor:o.actor??null,includeTrashed:!0});if(f&&o.onConflict==="fail")throw Error("a document with this id is already here");if(f&&o.onConflict==="skip"){r.documents.skipped+=1;return}if(o.dryRun){if(f)r.documents.updated+=1;else r.documents.created+=1;return}let i=gn(a,e.data,n._config.i18n.defaultLocale);if(f){if(await c.update({id:e.id,data:i.base,actor:o.actor??null,source:"cli"})===null){r.documents.skipped+=1;return}r.documents.updated+=1}else{if(await c.create({id:e.id,data:i.base,actor:o.actor??null,source:"cli"})===null){r.documents.skipped+=1;return}r.documents.created+=1}for(let[d,m]of Object.entries(i.translations))await c.update({id:e.id,data:m,locale:d,actor:o.actor??null,source:"cli"});if(e.scheduledAt&&R(e.scheduledPatch))await c.schedule({id:e.id,at:e.scheduledAt,data:e.scheduledPatch,actor:o.actor??null,source:"cli"})}async function O(n,e,o,r){let a=n._config.globals[e.global];if(!a)throw Error(`no global named "${e.global}" is declared`);if(o.dryRun){r.globals.updated+=1;return}let c=j(n,e.global),f=gn(a,e.data,n._config.i18n.defaultLocale);await c.update({data:f.base,actor:o.actor??null,source:"cli"});for(let[i,d]of Object.entries(f.translations))await c.update({data:d,locale:i,actor:o.actor??null,source:"cli"});r.globals.updated+=1}function gn(n,e,o){let r=Object.create(null),a=Object.create(null);for(let[c,f]of Object.entries(n.fields)){let i=e[c];if(i===void 0)continue;if(!f.localized){r[c]=i;continue}if(!R(i))throw Error(`${c} is localized, but the file holds one value instead of one per language`);for(let[d,m]of Object.entries(i)){if(m===void 0)continue;if(d===o){r[c]=m;continue}(a[d]??=Object.create(null))[c]=m}}return{base:r,translations:a}}function A(n,e){if(n!==at)throw Error(`Unknown export format: ${n}.`);if(!Number.isInteger(e)||e<1)throw Error(`Invalid export version: ${e}.`);if(e>ze)throw Error(`This file is version ${e}; this CMS reads up to ${ze}. Upgrade @heyo-sh/heyo-cms.`)}function C(n,e){return n.api[e]}function j(n,e){return n.globals[e]}function R(n){return typeof n==="object"&&n!==null&&!Array.isArray(n)}function I(n){return n instanceof Error?n.message:String(n)}
|
|
5
|
+
export{at,ze,Bn,Dt,qt,Lt,Ft,Nt,gn};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{s,R,t,H,ae,m}from"./index-6m1kjq9g.js";import{ho,rt,It,Et,l,u}from"./index-axpzy2hj.js";import{Pe,pn,we,re,fo}from"./index-p2cqsmvw.js";import{w}from"./index-rw0hze6x.js";import{x}from"./index-2ddk43me.js";import{b}from"./index-8nzmqy0f.js";import{e}from"./index-x72d1hzh.js";var Nn={github:{id:"github",endpoints:{authorization:"https://github.com/login/oauth/authorize",token:"https://github.com/login/oauth/access_token",userinfo:"https://api.github.com/user"},scope:"read:user user:email",pkce:!1,async profile(c,f){let p=await pe(f,"https://api.github.com/user",c.accessToken),g=typeof p.email==="string"?p.email:await Me(f,c.accessToken);return{id:String(p.id??""),email:g,name:M(p.name)??M(p.login),avatarUrl:M(p.avatar_url),claims:p}}},google:{id:"google",endpoints:{authorization:"https://accounts.google.com/o/oauth2/v2/auth",token:"https://oauth2.googleapis.com/token",userinfo:"https://openidconnect.googleapis.com/v1/userinfo"},scope:"openid email profile",pkce:!0,async profile(c,f){let p=c.idToken?$t(c.idToken):await pe(f,"https://openidconnect.googleapis.com/v1/userinfo",c.accessToken);return X(p)}},microsoft:{id:"microsoft",endpoints:{authorization:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",token:"https://login.microsoftonline.com/common/oauth2/v2.0/token",userinfo:"https://graph.microsoft.com/oidc/userinfo"},scope:"openid email profile",pkce:!0,async profile(c,f){let p=c.idToken?$t(c.idToken):await pe(f,"https://graph.microsoft.com/oidc/userinfo",c.accessToken);return X(p)}}};function X(c){return{id:String(c.sub??""),email:M(c.email),name:M(c.name)??M(c.preferred_username),avatarUrl:M(c.picture),claims:c}}function $t(c){let f=c.split(".")[1];if(!f)return{};let p=f.replaceAll("-","+").replaceAll("_","/");try{let g=atob(p.padEnd(Math.ceil(p.length/4)*4,"=")),k=Uint8Array.from(g,(v)=>v.charCodeAt(0));return JSON.parse(new TextDecoder().decode(k))}catch{return{}}}var fe=new Map;function Ce(c,f){let p=`${x(c)}/.well-known/openid-configuration`,g=fe.get(p);if(g)return g;let k=(async()=>{let v=await f(p,{headers:{accept:"application/json"}});if(!v.ok)throw new e(`OIDC discovery failed for ${c} (${v.status})`,{status:502,code:"oidc_discovery_failed"});let T=await v.json();return{authorization:String(T.authorization_endpoint??""),token:String(T.token_endpoint??""),...typeof T.userinfo_endpoint==="string"?{userinfo:T.userinfo_endpoint}:{}}})();return fe.set(p,k),k.catch(()=>fe.delete(p)),k}function Ue(c){let f=new URL(c.endpoints.authorization);if(f.searchParams.set("response_type","code"),f.searchParams.set("client_id",c.clientId),f.searchParams.set("redirect_uri",c.redirectUri),f.searchParams.set("scope",c.scope),f.searchParams.set("state",c.state),c.codeChallenge)f.searchParams.set("code_challenge",c.codeChallenge),f.searchParams.set("code_challenge_method","S256");for(let[p,g]of Object.entries(c.extra??{}))f.searchParams.set(p,g);return f.toString()}async function Oe(c){return{verifier:c,challenge:await fo(c)}}async function xe(c){let f=new URLSearchParams({grant_type:"authorization_code",code:c.code,redirect_uri:c.redirectUri,client_id:c.clientId,client_secret:c.clientSecret});if(c.codeVerifier)f.set("code_verifier",c.codeVerifier);let p=await c.fetchImpl(c.endpoints.token,{method:"POST",headers:{accept:"application/json","content-type":"application/x-www-form-urlencoded"},body:f.toString()}),g=await p.json().catch(()=>({}));if(!p.ok||typeof g.access_token!=="string"){let k=M(g.error_description)??M(g.error)??`HTTP ${p.status}`;throw new e(`OAuth token exchange failed: ${k}`,{status:401,code:"oauth_exchange_failed"})}return{accessToken:g.access_token,...typeof g.id_token==="string"?{idToken:g.id_token}:{},...typeof g.token_type==="string"?{tokenType:g.token_type}:{}}}async function pe(c,f,p){let g=await c(f,{headers:{authorization:`Bearer ${p}`,accept:"application/json","user-agent":"heyo-cms"}});if(!g.ok)throw new e(`OAuth profile request failed (${g.status})`,{status:502,code:"oauth_profile_failed"});return await g.json()}async function Me(c,f){let p=await c("https://api.github.com/user/emails",{headers:{authorization:`Bearer ${f}`,accept:"application/json","user-agent":"heyo-cms"}});if(!p.ok)return null;let g=await p.json();return(g.find((v)=>v.primary&&v.verified)??g.find((v)=>v.verified))?.email??null}function M(c){return typeof c==="string"&&c.length>0?c:null}function Un(){return qe(crypto.getRandomValues(new Uint8Array(20)))}function Jn(c){let f=`${encodeURIComponent(c.issuer)}:${encodeURIComponent(c.account)}`,p=new URLSearchParams({secret:c.secret,issuer:c.issuer,algorithm:"SHA1",digits:String(6),period:String(30)});return`otpauth://totp/${f}?${p.toString()}`}async function Qo(c,f=Date.now()){return De(c,Math.floor(f/1000/30))}async function cn(c,f,p={}){if(!c)return!1;let g=f.replaceAll(/\s/g,"");if(!/^\d{6}$/.test(g))return!1;let k=Math.floor((p.at??Date.now())/1000/30),v=p.window??1;for(let T=-v;T<=v;T+=1){let C=await De(c,k+T),U=0;for(let E=0;E<C.length;E+=1)U|=C.charCodeAt(E)^g.charCodeAt(E);if(U===0)return!0}return!1}async function De(c,f){let p=await crypto.subtle.importKey("raw",Ne(c),{name:"HMAC",hash:"SHA-1"},!1,["sign"]),g=new Uint8Array(8),k=f;for(let U=7;U>=0;U-=1)g[U]=k&255,k=Math.floor(k/256);let v=new Uint8Array(await crypto.subtle.sign("HMAC",p,g)),T=(v[v.length-1]??0)&15,C=((v[T]??0)&127)<<24|((v[T+1]??0)&255)<<16|((v[T+2]??0)&255)<<8|(v[T+3]??0)&255;return String(C%1e6).padStart(6,"0")}function qe(c){let f=0,p=0,g="";for(let k of c){p=p<<8|k,f+=8;while(f>=5)g+="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"[p>>>f-5&31],f-=5}if(f>0)g+="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"[p<<5-f&31];return g}function Ne(c){let f=c.replaceAll("=","").replaceAll(/\s/g,"").toUpperCase(),p=[],g=0,k=0;for(let v of f){let T="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567".indexOf(v);if(T===-1)continue;if(k=k<<5|T,g+=5,g>=8)p.push(k>>>g-8&255),g-=8}return new Uint8Array(p)}var A="cms_users",z="cms_sessions",q="cms_tokens",he="cms_accounts",V="cms_api_keys",N="cms_roles",be="heyo_cms_session",dn="hck_",Je={session:"7d",invite:"7d",magicLink:"15m",passwordReset:"1h",twoFactor:"10m",oauth:"10m"},Be=8,$e=5,Ke=/^[^@\s]+@[^@\s.]+\.[^@\s]+$/,He=/^[a-z][a-z0-9_-]*$/,Ve=1e4;function un(c){let{config:f}=c,p=c.fetch??((...n)=>fetch(...n)),g,k=()=>g??=Pe(we(16)),v,T=!1,C=()=>f.admin.auth,U=(n,i)=>w(i??Je[n]),E=(n)=>{let i=C();if(!i||!i.methods.includes(n))throw new e(`The "${n}" sign-in method is not enabled; add it to admin.auth.methods`,{status:400,code:"method_not_enabled"});return i};async function y(n){let i=await c.database();return i.transaction((r)=>n(r,i))}async function O(n,i,r,o){return(await i.query(n,{table:r,where:o,limit:1}))[0]??null}async function B(n,i,r,o){let d=(await i.mutate(n,{kind:"insert",table:r,values:o})).rows[0];if(!d)throw new e(`Insert into ${r} returned no row.`,{status:500,code:"insert_without_row"});return d}async function S(n,i,r,o,a){return(await i.mutate(n,{kind:"update",table:r,where:o,set:a,returning:!1})).count}async function F(n,i,r,o){return(await i.mutate(n,{kind:"delete",table:r,where:o})).count}async function j(n,i,r,o=null){let a={type:i,data:r,previous:null},d={actor:o};await c.emit(n,[a],d)}async function le(){let n=f.rbac?.roles??{};if(f.rbac?.customRoles!==!0)return n;let i=Date.now();if(v&&i-v.at<Ve)return v.map;let r=await y((d,h)=>h.query(d,{table:N})),o={};for(let d of r)o[String(d.name)]=J(d.permissions);let a={...o,...n};return v={at:i,map:a},a}async function Z(n){let i=n.roles.length>0?n.roles:f.rbac?.defaultRole?[f.rbac.defaultRole]:[];return{id:n.id,source:"session",roles:i,permissions:rt(i,await le())}}async function Y(n,i,r){let o=r.token??we(),a=new Date(Date.now()+r.ttlMs);return await B(n,i,q,{id:b("tok"),type:r.type,user_id:r.userId??null,email:r.email??null,token_hash:await re(o),data:r.data??null,expires_at:a,consumed_at:null,created_at:new Date}),{token:o,expiresAt:a}}async function _e(n,i,r,o){let a=await O(n,i,q,s(t("token_hash",await re(o)),t("type",r)));if(!a||ye(a.expires_at))throw e.unauthorized("This link is invalid or has expired");if(a.consumed_at!==null)throw e.unauthorized("This link has already been used");return a}async function ve(n,i,r){if(await S(n,i,q,s(t("id",String(r.id)),t("consumed_at",null)),{consumed_at:new Date})!==1)throw e.unauthorized("This link has already been used")}async function ee(n,i,r,o){let a=await _e(n,i,r,o);return await ve(n,i,a),a}async function te(n,i,r,o){let a=we(),d=new Date,h=new Date(d.getTime()+U("session",C()?.session?.expiresIn)),_=await B(n,i,z,{id:b("ses"),user_id:r.id,token_hash:await re(a),ip:o.ip??null,user_agent:o.userAgent??null,expires_at:h,created_at:d});return await S(n,i,A,t("id",r.id),{last_login_at:d}),{status:"signed-in",token:a,expiresAt:h.toISOString(),session:ge(_),user:{...r,lastLoginAt:d.toISOString()},actor:await Z(r)}}async function ne(n,i,r,o){if(!r.twoFactorEnabled)return te(n,i,r,o);let a=await Y(n,i,{type:"two-factor",ttlMs:U("twoFactor",void 0),userId:r.id,email:r.email});return{status:"two-factor-required",challenge:a.token,expiresAt:a.expiresAt.toISOString(),userId:r.id}}async function D(n,i,r){let o=await O(n,i,A,t("id",r));return o?W(o):null}async function K(n,i,r){let o=await O(n,i,A,t("email",ce(r)));return o?{user:W(o),row:o}:null}function se(n){if(n.status==="disabled")throw e.forbidden("This account has been disabled")}async function ke(n){let i=C();if(n==="oidc"){let a=i?.sso;if(!a)throw new e("SSO is not configured; set admin.auth.sso",{status:400,code:"method_not_enabled"});let d=await Ce(a.issuer,p),h=Ae("oidc",{...a.clientId===void 0?{}:{clientId:a.clientId},...a.clientSecret===void 0?{}:{clientSecret:a.clientSecret}});return{id:"oidc",endpoints:d,scope:a.scope??"openid email profile",pkce:!0,...h,provision:a.provision!==!1,...a.mapRoles?{mapRoles:a.mapRoles}:{},profile:async(_)=>_.idToken?X($t(_.idToken)):X(await je(d,_.accessToken))}}E(n);let r=Nn[n];if(!r)throw new e(`Unknown OAuth provider "${n}"`,{status:400,code:"unknown_provider"});let o=Ae(n);return{id:n,endpoints:r.endpoints,scope:i?.providers?.[n]?.scope??r.scope,pkce:r.pkce,...o,provision:!1,profile:r.profile}}async function je(n,i){if(!n.userinfo)return{};let r=await p(n.userinfo,{headers:{authorization:`Bearer ${i}`,accept:"application/json"}});if(!r.ok)return{};return await r.json()}function Ae(n,i={}){let r=C()?.providers?.[n],o=n.toUpperCase(),a=i.clientId??r?.clientId??ue(`HEYO_CMS_${o}_CLIENT_ID`)??ue(`${o}_CLIENT_ID`),d=i.clientSecret??r?.clientSecret??ue(`HEYO_CMS_${o}_CLIENT_SECRET`)??ue(`${o}_CLIENT_SECRET`);if(!a||!d)throw new e(`No credentials for "${n}": set admin.auth.providers.${n} or ${o}_CLIENT_ID and ${o}_CLIENT_SECRET`,{status:500,code:"provider_not_configured"});return{clientId:a,clientSecret:d}}async function ze(n,i,r,o){let a=await O(n,i,he,s(t("provider",r.id),t("provider_account_id",o.id)));if(a){let P=await D(n,i,String(a.user_id));if(!P)throw e.unauthorized("The linked account no longer exists");return Te(n,i,r,o,P)}let d=o.email?ce(o.email):null;if(!d)throw new e(`${r.id} did not return a verified email address, so the account cannot be matched`,{status:400,code:"oauth_without_email"});let _=(await K(n,i,d))?.user??null;if(!_){if(!r.provision)throw e.forbidden(`No CMS account for ${d}. An administrator has to invite this address first.`);_=await ie(n,i,{email:d,...o.name?{name:o.name}:{},roles:r.mapRoles?r.mapRoles(o.claims):f.rbac?.defaultRole?[f.rbac.defaultRole]:[],status:"active"}),await j(n,"user.joined",{userId:_.id,email:d,provider:r.id,provisioned:!0})}else if(_.status==="invited")await S(n,i,A,t("id",_.id),{status:"active",updated_at:new Date}),_={..._,status:"active"},await j(n,"user.joined",{userId:_.id,email:_.email});return await B(n,i,he,{id:b("acc"),user_id:_.id,provider:r.id,provider_account_id:o.id,email:d,created_at:new Date,updated_at:new Date}),Te(n,i,r,o,_)}async function Te(n,i,r,o,a){if(!r.mapRoles)return a;let d=r.mapRoles(o.claims);if(Fe(d,a.roles))return a;return await S(n,i,A,t("id",a.id),{roles:d,updated_at:new Date}),await j(n,"role.changed",{userId:a.id,roles:d,previous:a.roles,source:r.id}),{...a,roles:d}}async function ie(n,i,r){let o=ce(r.email);if(await O(n,i,A,t("email",o)))throw e.conflict(`A user with the email ${o} already exists`);if(r.password!==void 0)G(r.password);let d=new Date,h=await B(n,i,A,{id:b("usr"),email:o,name:r.name??null,password_hash:r.password===void 0?null:await Pe(r.password),two_factor_secret:null,two_factor_enabled:!1,status:r.status??"active",roles:r.roles??[],avatar_url:null,locale:r.locale??null,last_login_at:null,created_at:d,updated_at:d});return W(h)}function G(n){let i=C()?.password?.minLength??Be;if(n.length<i)throw e.validation(`The password must be at least ${i} characters`)}function Se(){let n=C();if(!n||!n.methods.includes("password"))return null;let i=n.firstUser??!0;if(i===!1)return null;if(i!==!0&&i.roles)return i.roles;let r=f.rbac?.roles;if(!r||"admin"in r)return["admin"];let o=Object.entries(r).find(([,a])=>a.includes(ho));return o?[o[0]]:["admin"]}async function oe(n){if(n.length===0||!f.rbac)return;let i=await le(),r=n.filter((o)=>!(o in i));if(r.length>0)throw e.validation(`Unknown role ${r.map((o)=>`"${o}"`).join(", ")}`)}let Q={async actorFromRequest(n){let i=n.headers.get("authorization"),o=(i?.toLowerCase().startsWith("bearer ")?i.slice(7).trim():null)??We(n,be);return o?Q.actorFromToken(o):null},async actorFromToken(n){if(n.startsWith(dn))return Q.apiKeys.verify(n);return(await Q.sessions.verify(n))?.actor??null},actorForUser:Z,users:{async list(n={}){let i=[];if(n.status)i.push(t("status",n.status));if(n.search){let o=`%${n.search}%`;i.push(R(ae("email",o,!0),ae("name",o,!0)))}return(await y((o,a)=>a.query(o,{table:A,...i.length>0?{where:s(...i)}:{},orderBy:[m("created_at","asc"),m("id","asc")],limit:n.limit??50,...n.offset===void 0?{}:{offset:n.offset}}))).map(W)},async get(n){return y((i,r)=>D(i,r,n))},async byEmail(n){return y(async(i,r)=>(await K(i,r,n))?.user??null)},async count(){let n=await y((i,r)=>r.query(i,{table:A,count:!0}));return Number(n[0]?.count??0)},async create(n){return await oe(n.roles??[]),y((i,r)=>ie(i,r,n))},async update(n,i){if(i.roles)await oe(i.roles);let r=await y(async(o,a)=>{let d=await D(o,a,n);if(!d)throw e.notFound(`No user with id "${n}"`);let h={updated_at:new Date};if(i.name!==void 0)h.name=i.name;if(i.status!==void 0)h.status=i.status;if(i.locale!==void 0)h.locale=i.locale;if(i.avatarUrl!==void 0)h.avatar_url=i.avatarUrl;if(i.roles!==void 0)h.roles=i.roles;if(await S(o,a,A,t("id",n),h),i.roles&&!Fe(i.roles,d.roles))await j(o,"role.changed",{userId:n,roles:i.roles,previous:d.roles},i.actor??null);if(i.status==="disabled")await F(o,a,z,t("user_id",n));return await D(o,a,n)});return c.deliver(),r},async remove(n,i={}){await y(async(r,o)=>{let a=await D(r,o,n);if(!a)throw e.notFound(`No user with id "${n}"`);for(let d of[z,q,he,V])await F(r,o,d,t("user_id",n));await F(r,o,A,t("id",n)),await j(r,"user.removed",{userId:n,email:a.email},i.actor??null)}),c.deliver()},async setPassword(n,i){G(i),await y(async(r,o)=>{let a=await Pe(i);if(await S(r,o,A,t("id",n),{password_hash:a,updated_at:new Date})===0)throw e.notFound(`No user with id "${n}"`);await F(r,o,z,t("user_id",n))})},async invite(n){await oe(n.roles??[]);let i=await y(async(r,o)=>{let a=ce(n.email),d=await K(r,o,a);if(d&&d.user.status==="active")throw e.conflict(`${a} is already an active user`);let h=d?.user??await ie(r,o,{email:a,...n.name?{name:n.name}:{},roles:n.roles??(f.rbac?.defaultRole?[f.rbac.defaultRole]:[]),status:"invited"}),_=await Y(r,o,{type:"invite",ttlMs:U("invite",C()?.invites?.expiresIn),userId:h.id,email:a});return await j(r,"user.invited",{userId:h.id,email:a,roles:h.roles},n.actor??null),{user:h,token:_.token,expiresAt:_.expiresAt.toISOString(),userId:h.id,email:a}});return c.deliver(),i},async acceptInvite(n){let i=await y(async(r,o)=>{let a=await ee(r,o,"invite",n.token),d=await D(r,o,String(a.user_id));if(!d)throw e.unauthorized("This invitation is no longer valid");let h={status:"active",updated_at:new Date};if(n.password!==void 0)G(n.password),h.password_hash=await Pe(n.password);if(n.name!==void 0)h.name=n.name;await S(r,o,A,t("id",d.id),h);let _={...d,status:"active",...n.name===void 0?{}:{name:n.name}};return await j(r,"user.joined",{userId:d.id,email:d.email}),te(r,o,_,n)});return c.deliver(),i}},setup:{async required(){if(Se()===null)return!1;if(T)return!1;let n=await Q.users.count();if(n>0)T=!0;return n===0},async claim(n){let i=Se();if(i===null)throw e.forbidden("This deployment does not accept a first account over HTTP; use heyo-cms create-admin");try{await oe(i)}catch(o){if(o instanceof e&&o.code==="validation_failed")throw e.validation(`The first account would be given the role ${i.map((a)=>`"${a}"`).join(", ")}, which rbac.roles does not define; set admin.auth.firstUser.roles`);throw o}G(n.password);let r=await y(async(o,a)=>{let d=await a.query(o,{table:A,count:!0});if(Number(d[0]?.count??0)>0)throw e.conflict("This CMS already has an account; sign in instead");let h=await ie(o,a,{email:n.email,password:n.password,roles:i,status:"active",...n.name===void 0?{}:{name:n.name}});return await j(o,"user.joined",{userId:h.id,email:h.email,first:!0}),te(o,a,h,n)});return T=!0,c.deliver(),r}},sessions:{async verify(n){return y(async(i,r)=>{let o=await O(i,r,z,t("token_hash",await re(n)));if(!o||ye(o.expires_at))return null;let a=await D(i,r,String(o.user_id));if(!a||a.status!=="active")return null;return{status:"signed-in",token:n,expiresAt:l(o.expires_at)??"",session:ge(o),user:a,actor:await Z(a)}})},async list(n){return(await y((r,o)=>o.query(r,{table:z,where:t("user_id",n),orderBy:[m("created_at","desc")]}))).map(ge)},async revoke(n){let i=await re(n);return await y((o,a)=>F(o,a,z,t("token_hash",i)))>0},async revokeById(n){return await y((r,o)=>F(r,o,z,t("id",n)))>0},async revokeAll(n){return y((i,r)=>F(i,r,z,t("user_id",n)))},async cleanup(){let n=new Date;return y(async(i,r)=>{let o=await F(i,r,z,H("expires_at",n));return await F(i,r,q,H("expires_at",n)),o})}},password:{async signIn(n){E("password");let i=await y(async(r,o)=>{let a=await K(r,o,n.email),d=a?a.row.password_hash:await k(),h=await pn(n.password,d);if(!a||!h)throw e.unauthorized("Invalid email or password");if(se(a.user),a.user.status==="invited")throw e.forbidden("This invitation has not been accepted yet");return ne(r,o,a.user,n)});return c.deliver(),i},async requestReset(n){return E("password"),y(async(i,r)=>{let o=await K(i,r,n.email);if(!o||o.user.status==="disabled")return null;let a=await Y(i,r,{type:"password-reset",ttlMs:U("passwordReset",C()?.passwordReset?.expiresIn),userId:o.user.id,email:o.user.email});return{token:a.token,expiresAt:a.expiresAt.toISOString(),userId:o.user.id,email:o.user.email}})},async reset(n){return E("password"),G(n.password),y(async(i,r)=>{let o=await ee(i,r,"password-reset",n.token),a=String(o.user_id);await S(i,r,A,t("id",a),{password_hash:await Pe(n.password),status:"active",updated_at:new Date}),await F(i,r,z,t("user_id",a));let d=await D(i,r,a);if(!d)throw e.unauthorized("This link is no longer valid");return d})}},magicLink:{async request(n){return E("magic-link"),y(async(i,r)=>{let o=await K(i,r,n.email);if(!o||o.user.status==="disabled")return null;let a=await Y(i,r,{type:"magic-link",ttlMs:U("magicLink",C()?.magicLink?.expiresIn),userId:o.user.id,email:o.user.email});return{token:a.token,expiresAt:a.expiresAt.toISOString(),userId:o.user.id,email:o.user.email}})},async verify(n){E("magic-link");let i=await y(async(r,o)=>{let a=await ee(r,o,"magic-link",n.token),d=await D(r,o,String(a.user_id));if(!d)throw e.unauthorized("This link is no longer valid");if(se(d),d.status==="invited")return await S(r,o,A,t("id",d.id),{status:"active",updated_at:new Date}),await j(r,"user.joined",{userId:d.id,email:d.email}),ne(r,o,{...d,status:"active"},n);return ne(r,o,d,n)});return c.deliver(),i}},oauth:{async authorize(n){let i=await ke(n.provider),r=we(24),o=we(),a=i.pkce?(await Oe(o)).challenge:void 0;return await y((d,h)=>Y(d,h,{type:"oauth",ttlMs:U("oauth",void 0),token:r,data:{provider:i.id,redirectUri:n.redirectUri,verifier:o,redirectTo:n.redirectTo??null}})),{url:Ue({endpoints:i.endpoints,clientId:i.clientId,redirectUri:n.redirectUri,scope:i.scope,state:r,...a===void 0?{}:{codeChallenge:a}}),state:r}},async callback(n){let i=await ke(n.provider),r=await y(async(o,a)=>{let d=await ee(o,a,"oauth",n.state),h=u(d.data);if(h.provider!==i.id)throw e.unauthorized("This sign-in request does not match");if(h.redirectUri!==n.redirectUri)throw e.unauthorized("The redirect URI does not match");let _=await xe({endpoints:i.endpoints,clientId:i.clientId,clientSecret:i.clientSecret,code:n.code,redirectUri:n.redirectUri,...i.pkce&&typeof h.verifier==="string"?{codeVerifier:h.verifier}:{},fetchImpl:p}),P=await i.profile(_,p),I=await ze(o,a,i,P);return se(I),{...await ne(o,a,I,n),redirectTo:typeof h.redirectTo==="string"?h.redirectTo:null}});return c.deliver(),r}},twoFactor:{async begin(n){let i=Un();return y(async(r,o)=>{let a=await D(r,o,n);if(!a)throw e.notFound(`No user with id "${n}"`);if(a.twoFactorEnabled)throw e.conflict("Disable the existing authenticator before enrolling another.");return await S(r,o,A,t("id",n),{two_factor_secret:i,updated_at:new Date}),{secret:i,uri:Jn({secret:i,account:a.email,issuer:f.admin.title??"Heyo CMS"})}})},async enable(n){return y(async(i,r)=>{let o=await O(i,r,A,t("id",n.userId));if(!o)throw e.notFound(`No user with id "${n.userId}"`);let a=o.two_factor_secret;if(!a)throw e.validation("Start the setup before enabling it");if(!await cn(a,n.code))throw e.unauthorized("That code is not valid");return await S(i,r,A,t("id",n.userId),{two_factor_enabled:!0,updated_at:new Date}),{...W(o),twoFactorEnabled:!0}})},async disable(n){return y(async(i,r)=>{if(await S(i,r,A,t("id",n),{two_factor_enabled:!1,two_factor_secret:null,updated_at:new Date})===0)throw e.notFound(`No user with id "${n}"`);return await D(i,r,n)})},async complete(n){let i=await y(async(r,o)=>{let a=await _e(r,o,"two-factor",n.challenge),d=await O(r,o,A,t("id",String(a.user_id)));if(!d)throw e.unauthorized("This challenge is no longer valid");if(!await cn(d.two_factor_secret,n.code)){let P=a;for(let I=0;I<$e;I+=1){let L=u(P.data).attempts,Ie=typeof L==="number"?L:null,Re=Number(Ie??0)+1;if(await S(r,o,q,s(t("id",String(P.id)),t("consumed_at",null),t("data.attempts",Ie)),{data:{...u(P.data),attempts:Re},...Re>=$e?{consumed_at:new Date}:{}})===1)break;let me=await O(r,o,q,t("id",String(P.id)));if(!me||me.consumed_at!==null)break;P=me}return null}await ve(r,o,a);let _=W(d);return se(_),te(r,o,_,n)});if(i===null)throw e.unauthorized("That code is not valid");return c.deliver(),i}},apiKeys:{async create(n){let i=C()?.apiKeys;if(!i?.enabled)throw new e("API keys are not enabled; set admin.auth.apiKeys.enabled",{status:400,code:"method_not_enabled"});let r=n.scopes??i.scopes??["read"],o=i.scopes;if(o){let P=r.filter((I)=>!o.includes(I));if(P.length>0)throw e.validation(`Scope ${P.map((I)=>`"${I}"`).join(", ")} is not in admin.auth.apiKeys.scopes`)}let a=`${dn}${we()}`,d=n.expiresIn??i.expiresIn,h=d?new Date(Date.now()+w(d)):null,_=await y(async(P,I)=>{let L=await B(P,I,V,{id:b("key"),name:n.name,user_id:n.userId??null,key_hash:await re(a),prefix:a.slice(0,dn.length+6),scopes:r,last_used_at:null,expires_at:h,revoked_at:null,created_at:new Date});return await j(P,"apikey.created",{id:String(L.id),name:n.name,scopes:r,userId:n.userId??null},n.actor??null),Ee(L)});return c.deliver(),{..._,key:a}},async list(n={}){return(await y((r,o)=>o.query(r,{table:V,...n.userId?{where:t("user_id",n.userId)}:{},orderBy:[m("created_at","desc")]}))).map(Ee)},async revoke(n,i={}){let r=await y(async(o,a)=>{let d=await S(o,a,V,s(t("id",n),t("revoked_at",null)),{revoked_at:new Date});if(d>0)await j(o,"apikey.revoked",{id:n},i.actor??null);return d>0});return c.deliver(),r},async verify(n){return y(async(i,r)=>{let o=await O(i,r,V,t("key_hash",await re(n)));if(!o)return null;if(o.revoked_at!==null)return null;if(o.expires_at!==null&&ye(o.expires_at))return null;let a=J(o.scopes),d=Et(a),h=[],_=d,P=String(o.id);if(o.user_id!==null&&o.user_id!==void 0){let I=await D(i,r,String(o.user_id));if(!I||I.status!=="active")return null;let L=await Z(I);h=L.roles,_=It(L.permissions,d),P=I.id}return await S(i,r,V,t("id",String(o.id)),{last_used_at:new Date}),{id:P,source:"api-key",roles:h,permissions:_}})}},roles:{async list(){let n=Object.entries(f.rbac?.roles??{}).map(([a,d])=>({name:a,label:null,permissions:d,source:"config"}));if(f.rbac?.customRoles!==!0)return n;let i=await y((a,d)=>d.query(a,{table:N,orderBy:[m("name")]})),r=new Set(n.map((a)=>a.name)),o=i.filter((a)=>!r.has(String(a.name))).map((a)=>({name:String(a.name),label:a.label??null,permissions:J(a.permissions),source:"database"}));return[...n,...o].sort((a,d)=>a.name.localeCompare(d.name))},async create(n){if(de(),Le(n.name),f.rbac?.roles[n.name])throw e.conflict(`"${n.name}" is defined in the configuration; change it there`);let i=await y(async(r,o)=>{if(await O(r,o,N,t("name",n.name)))throw e.conflict(`The role "${n.name}" already exists`);return B(r,o,N,{id:b("rol"),name:n.name,label:n.label??null,permissions:n.permissions,created_at:new Date,updated_at:new Date})});return v=void 0,{name:String(i.name),label:i.label??null,permissions:J(i.permissions),source:"database"}},async update(n,i){de();let r=await y(async(o,a)=>{let d={updated_at:new Date};if(i.permissions)d.permissions=i.permissions;if(i.label!==void 0)d.label=i.label;if(await S(o,a,N,t("name",n),d)===0)throw e.notFound(`No role named "${n}"`);return O(o,a,N,t("name",n))});return v=void 0,{name:n,label:r?.label??null,permissions:J(r?.permissions),source:"database"}},async remove(n){de();let i=await y((r,o)=>F(r,o,N,t("name",n)));return v=void 0,i>0},async permissionsFor(n){return rt(n,await le())}}};function de(){if(f.rbac?.customRoles!==!0)throw new e("Roles are defined in the configuration; set rbac.customRoles to manage them in the panel",{status:400,code:"custom_roles_disabled"})}function Le(n){if(!He.test(n))throw e.validation(`"${n}" is not a role name; use lowercase letters, digits, dashes and underscores`)}return Q}function W(c){return{id:String(c.id),email:String(c.email),name:c.name??null,status:c.status??"active",roles:J(c.roles),avatarUrl:c.avatar_url??null,locale:c.locale??null,twoFactorEnabled:c.two_factor_enabled===!0,lastLoginAt:l(c.last_login_at),createdAt:l(c.created_at)??"",updatedAt:l(c.updated_at)??""}}function ge(c){return{id:String(c.id),userId:String(c.user_id),expiresAt:l(c.expires_at)??"",createdAt:l(c.created_at)??"",ip:c.ip??null,userAgent:c.user_agent??null}}function Ee(c){return{id:String(c.id),name:String(c.name),prefix:String(c.prefix),userId:c.user_id??null,scopes:J(c.scopes),lastUsedAt:l(c.last_used_at),expiresAt:l(c.expires_at),revokedAt:l(c.revoked_at),createdAt:l(c.created_at)??""}}function J(c){if(!Array.isArray(c))return[];return c.filter((f)=>typeof f==="string")}function ye(c){if(c===null||c===void 0)return!1;return(c instanceof Date?c:new Date(String(c))).getTime()<=Date.now()}function ce(c){let f=c.trim().toLowerCase();if(!Ke.test(f))throw e.validation(`"${c}" is not an email address`);return f}function Fe(c,f){if(c.length!==f.length)return!1;let p=[...f].sort();return[...c].sort().every((g,k)=>g===p[k])}function We(c,f){let p=c.headers.get("cookie");if(!p)return null;for(let g of p.split(";")){let k=g.indexOf("=");if(k===-1)continue;if(g.slice(0,k).trim()!==f)continue;return decodeURIComponent(g.slice(k+1).trim())}return null}function ue(c){return globalThis.process?.env?.[c]}
|
|
2
|
+
export{Nn,$t,Un,Jn,Qo,cn,be,dn,un};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Ue,Fn}from"./index-vzhxn50e.js";import{_t}from"./index-s9x07zb3.js";import{bo}from"./index-8nzmqy0f.js";import{n}from"./index-x72d1hzh.js";import{mkdir as m,readdir as M,readFile as f,writeFile as h}from"node:fs/promises";import{join as p}from"node:path";var y="meta/snapshot.json",w="meta/plugins.json";class an{directory;constructor(t){this.directory=t}async readSnapshot(){try{let t=await f(p(this.directory,y),"utf8");return JSON.parse(t)}catch{return _t()}}async writeSnapshot(t){await m(p(this.directory,"meta"),{recursive:!0}),await h(p(this.directory,y),`${JSON.stringify(t,null,2)}
|
|
2
2
|
`,"utf8")}async readPluginLog(){try{let t=await f(p(this.directory,w),"utf8"),r=JSON.parse(t);return Array.isArray(r)?r.filter((i)=>typeof i==="string"):[]}catch{return[]}}async writePluginLog(t){await m(p(this.directory,"meta"),{recursive:!0}),await h(p(this.directory,w),`${JSON.stringify(t,null,2)}
|
|
3
|
-
`,"utf8")}async list(){let t;try{t=await M(this.directory)}catch{return[]}let r=[];for(let i of t.sort()){let c=/^(\d{4}_[a-z0-9_]+)\.(sql|json)$/.exec(i);if(!c)continue;let o=await f(p(this.directory,i),"utf8"),s=c[1],a=c[2];r.push({id:s,file:i,checksum:
|
|
4
|
-
`).filter((i)=>i.startsWith("-- ")&&!/^-- \d{4}_/.test(i)).map((i)=>i.slice(3))}async function
|
|
5
|
-
export{
|
|
3
|
+
`,"utf8")}async list(){let t;try{t=await M(this.directory)}catch{return[]}let r=[];for(let i of t.sort()){let c=/^(\d{4}_[a-z0-9_]+)\.(sql|json)$/.exec(i);if(!c)continue;let o=await f(p(this.directory,i),"utf8"),s=c[1],a=c[2];r.push({id:s,file:i,checksum:bo(o),artifact:{id:s,extension:a,content:o,summary:P(o,a)}})}return r}async write(t){await m(this.directory,{recursive:!0});let r=`${t.id}.${t.extension}`;return await h(p(this.directory,r),t.content,"utf8"),r}async nextSequence(){let r=(await this.list()).at(-1),i=r?Number(r.id.slice(0,4))+1:0;return String(i).padStart(4,"0")}}function P(t,r){if(r==="json")return JSON.parse(t).summary??[];return t.split(`
|
|
4
|
+
`).filter((i)=>i.startsWith("-- ")&&!/^-- \d{4}_/.test(i)).map((i)=>i.slice(3))}async function Yo(t){let{adapter:r,store:i}=t;if(t.plugins.length===0)return[];let c=await i.readPluginLog(),o=[],s=new Set(c);for(let a of t.plugins){let e=`${a.plugin}:${a.id}`;if(s.has(e))continue;if(a.steps.length===0){s.add(e);continue}let u=`${await i.nextSequence()}_${S(a.plugin)}_${S(a.id)}`,d=r.render(a.steps,u),l=await i.write(d);s.add(e),o.push({id:u,file:l})}if(o.length>0)await i.writePluginLog([...s]);return o}function S(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_|_$/g,"")}async function Dn(t){let{adapter:r,store:i,target:c}=t,o=await i.readSnapshot(),s=r.plan(o,c),a;if(s.length>0){let u=`${await i.nextSequence()}_${t.name??Fn(s)}`,d=r.render(s,u),l=await i.write(d);await i.writeSnapshot(c),a={id:u,file:l,summary:d.summary}}let e=await Yo({adapter:r,store:i,plugins:t.plugins??[]});if(!a)return{created:!1,summary:[],...e.length===0?{}:{plugins:e}};return{created:!0,id:a.id,file:a.file,summary:a.summary,...e.length===0?{}:{plugins:e}}}async function qn(t){let{adapter:r,store:i}=t,[c,o]=await Promise.all([i.list(),r.listAppliedMigrations()]),s=new Map(o.map((e)=>[e.id,e])),a={applied:[],alreadyApplied:0};for(let e of c){let g=s.get(e.id);if(g){x(e,g.checksum),a.alreadyApplied+=1;continue}await r.applyMigration(e.artifact),await r.recordMigration(e.id,e.checksum),a.applied.push(e.id)}return a}async function Ln(t){let{adapter:r,store:i}=t,[c,o]=await Promise.all([i.list(),r.listAppliedMigrations()]),s=new Map(o.map((e)=>[e.id,e])),a={applied:[],pending:[],modified:[],unplanned:[]};for(let e of c){let g=s.get(e.id);if(!g){a.pending.push(e.id);continue}if(a.applied.push(e.id),g.checksum!==e.checksum)a.modified.push(e.id)}if(t.target){let e=await i.readSnapshot();a.unplanned=r.plan(e,t.target).map((g)=>Ue(g))}return a}function x(t,r){if(t.checksum===r)return;throw new n(t.file,"was modified after it was applied; revert it and write a new migration instead")}
|
|
5
|
+
export{an,Yo,Dn,qn,Ln};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
async function Pe(e){let t=crypto.getRandomValues(new Uint8Array(16)),n=await o(e,t,1e5);return["pbkdf2-sha256",1e5,ie(t),ie(n)].join("$")}async function pn(e,t){if(!t)return!1;let[n,r,s,i]=t.split("$");if(n!=="pbkdf2-sha256"||!r||!s||!i)return!1;let a=await o(e,mn(s),Number(r));return c(ie(a),i)}async function o(e,t,n){let r=await crypto.subtle.importKey("raw",new TextEncoder().encode(e),"PBKDF2",!1,["deriveBits"]),s=await crypto.subtle.deriveBits({name:"PBKDF2",salt:t,iterations:n,hash:"SHA-256"},r,256);return new Uint8Array(s)}function we(e=32){return ie(crypto.getRandomValues(new Uint8Array(e)))}async function re(e){let t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e));return l(new Uint8Array(t))}function c(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r+=1)n|=e.charCodeAt(r)^t.charCodeAt(r);return n===0}function ie(e){let t="";for(let n of e)t+=String.fromCharCode(n);return btoa(t).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function mn(e){let t=e.replaceAll("-","+").replaceAll("_","/"),n=atob(t.padEnd(Math.ceil(t.length/4)*4,"=")),r=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)r[s]=n.charCodeAt(s);return r}function l(e){let t="";for(let n of e)t+=n.toString(16).padStart(2,"0");return t}async function fo(e){let t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e));return ie(new Uint8Array(t))}
|
|
2
|
+
export{Pe,pn,we,re,ie,mn,fo};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{n}from"./index-x72d1hzh.js";var d=new Map,m=new Map;function k(e){if(!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(e.name))throw new n(`editor.nodes.${e.name}`,"a node name must be letters, digits and underscores, starting with a letter");if(typeof e.toHtml!=="function")throw new n(`editor.nodes.${e.name}`,"needs a toHtml serialiser; a node that cannot render as HTML is a node the REST API cannot answer with");if(typeof e.toMarkdown!=="function")throw new n(`editor.nodes.${e.name}`,"needs a toMarkdown serialiser; Markdown is what exports and AI prompts speak");let t=d.get(e.name);if(t&&t!==e)throw new n(`editor.nodes.${e.name}`,"a different node with this name is already registered");return d.set(e.name,e),e}function Y(e){if(typeof e.toHtml!=="function"||typeof e.toMarkdown!=="function")throw new n(`editor.marks.${e.name}`,"needs both a toHtml and a toMarkdown serialiser");let t=m.get(e.name);if(t&&t!==e)throw new n(`editor.marks.${e.name}`,"a different mark with this name is already registered");return m.set(e.name,e),e}function Ot(e){return d.get(e)}function rn(e){return m.get(e)}function ao(){return[...d.keys()].sort()}function lo(){return[...m.keys()].sort()}function Te(){return{nodes:[...d.values()].sort((e,t)=>e.name.localeCompare(t.name)).map((e)=>({name:e.name,...e.group===void 0?{}:{group:e.group},...e.content===void 0?{}:{content:e.content},inline:e.inline===!0,atom:e.atom===!0,attrs:e.attrs??{},...e.marks===void 0?{}:{marks:e.marks},component:e.Component!==void 0})),marks:[...m.values()].sort((e,t)=>e.name.localeCompare(t.name)).map((e)=>({name:e.name,attrs:e.attrs??{}}))}}function Q(e,t){if(!w(e))return"";let r=c(e,{format:t.format,index:0,depth:0,...t.mediaUrl===void 0?{}:{mediaUrl:t.mediaUrl},...t.mediaImage===void 0?{}:{mediaImage:t.mediaImage},...t.images===void 0?{}:{images:t.images}});return t.format==="html"?r:r.trim()}function co(e,t={}){return Q(e,{...t,format:"html"})}function X(e,t={}){return Q(e,{...t,format:"markdown"})}function uo(e,t={}){return Q(e,{...t,format:"text"})}function c(e,t){let{format:r}=t;if(e.type==="text")return h(e.text??"",e.marks??[],r);let i=e.content??[],a=i.map((u,l)=>c(u,{...t,index:l,depth:t.depth+1})),o=p(i,a,r),s=Ot(e.type);if(!s)return o;return(r==="html"?s.toHtml:r==="markdown"?s.toMarkdown:s.toText??((u)=>u.children))({node:e,children:o,childStrings:a,childNodes:i,depth:t.depth,index:t.index,...t.mediaUrl===void 0?{}:{mediaUrl:t.mediaUrl},...t.mediaImage===void 0?{}:{mediaImage:t.mediaImage},...t.images===void 0?{}:{images:t.images}})}function p(e,t,r){if(r==="html")return t.join("");if(!e.some((o)=>g(o)))return t.join("");let a=r==="markdown"?`
|
|
2
|
+
|
|
3
|
+
`:`
|
|
4
|
+
`;return t.filter((o)=>o.length>0).join(a)}function g(e){if(e.type==="text")return!1;let t=Ot(e.type);if(!t)return!0;return t.inline!==!0}function h(e,t,r){let i=t.some((o)=>o.type==="code"),a=r==="html"?Fe(e):r==="markdown"&&!i?Go(e):e;if(r==="text")return a;for(let o of t){let s=rn(o.type);if(!s)continue;a=(r==="html"?s.toHtml:s.toMarkdown)({mark:o,text:a})}return a}function Fe(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function Go(e){return e.replace(/([\\`*_[\]])/g,"\\$1")}function Ne(e){let t=[];for(let[r,i]of Object.entries(e)){if(i===void 0||i===null||i===!1)continue;if(i===!0){t.push(` ${r}`);continue}t.push(` ${r}="${Fe(String(i))}"`)}return t.join("")}function Xe(e,t){let r=" ".repeat(t);return e.split(`
|
|
5
|
+
`).join(`
|
|
6
|
+
${r}`)}function x(e,t){return e.attrs?.[t]}function ee(e,t){let r=x(e,t);return typeof r==="string"?r:void 0}function w(e){return typeof e==="object"&&e!==null&&typeof e.type==="string"}
|
|
7
|
+
export{k,Y,Ot,rn,ao,lo,Te,Q,co,X,uo,Fe,Go,Ne,Xe,ee};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n}from"./index-x72d1hzh.js";var e={ms:1,s:1000,m:60000,h:3600000,d:86400000,w:604800000};function
|
|
2
|
-
export{
|
|
1
|
+
import{n}from"./index-x72d1hzh.js";var e={ms:1,s:1000,m:60000,h:3600000,d:86400000,w:604800000};function w(t,s=""){let r=/^(\d+(?:\.\d+)?)(ms|s|m|h|d|w)$/.exec(t.trim());if(!r)throw new n(s,`"${t}" is not a duration; use 30d, 10s, 1h`);return Number(r[1])*e[r[2]]}var i={b:1,kb:1024,mb:1048576,gb:1073741824};function se(t,s=""){let r=/^(\d+(?:\.\d+)?)(b|kb|mb|gb)$/i.exec(t.trim());if(!r)throw new n(s,`"${t}" is not a size; use 25mb, 512kb`);return Math.floor(Number(r[1])*i[r[2].toLowerCase()])}
|
|
2
|
+
export{w,se};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{nt,mo}from"./index-761dec5z.js";var p="documents",ln="data";function Pt(n){let e=[...Object.values(n.collections),...Object.values(n.globals)].sort((t,l)=>t.name.localeCompare(l.name)),o=e.flatMap(m),s=nt().map((t)=>t.name===p?{...t,indexes:[...t.indexes,...o].sort((l,a)=>l.name.localeCompare(a.name))}:t);if(r(e))s.push(mo());for(let t of n.pluginTables??[])s.push(u(t));return{version:1,tables:s.sort((t,l)=>t.name.localeCompare(l.name)),collections:e.map(i)}}function r(n){for(let e of n)for(let o of Object.values(e.fields))if(o.type==="slug"&&o.options.history===!0)return!0;return!1}function _t(){return{version:1,tables:[],collections:[]}}function u(n){return{...n,columns:[...n.columns].sort((e,o)=>e.name.localeCompare(o.name)),indexes:[...n.indexes].sort((e,o)=>e.name.localeCompare(o.name))}}function i(n){return{name:n.name,slug:n.slug,kind:n.kind,table:p,documentColumn:ln,fields:Object.entries(n.fields).map(([e,o])=>c(e,o)).sort((e,o)=>e.name.localeCompare(o.name))}}function c(n,e){let o=e.defaultValue??e.column.default;return{name:n,type:e.type,localized:e.localized,required:e.required,unique:e.column.unique===!0,index:e.column.index===!0||e.column.unique===!0,...o===void 0?{}:{default:o},...e.relationTo===void 0?{}:{relationTo:e.relationTo},column:e.column}}function m(n){let e=[];for(let[o,s]of Object.entries(n.fields)){let t=s.column.unique===!0;if(!(t||s.column.index===!0)||s.localized)continue;e.push({name:d(n.slug,o,t),table:p,targets:[{kind:"json",column:ln,path:[o],type:s.column.type}],unique:t,where:{column:"collection",equals:n.slug}})}return e.sort((o,s)=>o.name.localeCompare(s.name))}function d(n,e,o){return`${o?"uniq":"idx"}_documents_${n}_${e}`}
|
|
2
|
+
export{p,ln,Pt,_t};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createHash as u}from"node:crypto";import{arch as f,platform as m,release as p}from"node:os";var
|
|
2
|
-
export{
|
|
1
|
+
import{createHash as u}from"node:crypto";import{arch as f,platform as m,release as p}from"node:os";var wo="https://telemetry.heyo.sh/v1/cms";function Ut(e,n=process.env){if(e?.enabled===!1)return{enabled:!1,reason:"telemetry: { enabled: false } in the configuration"};if(l(n.HEYO_TELEMETRY_DISABLED))return{enabled:!1,reason:"HEYO_TELEMETRY_DISABLED is set"};if(l(n.DO_NOT_TRACK))return{enabled:!1,reason:"DO_NOT_TRACK is set"};if(l(n.CI))return{enabled:!1,reason:"this is CI"};if(n.NODE_ENV==="test")return{enabled:!1,reason:"NODE_ENV is test"};return{enabled:!0,reason:"on by default; see `heyo-cms telemetry`"}}function Jt(e,n,o){let t=n._config,r=Object.values(t.collections),i=Object.values(t.globals),c=r.reduce((s,a)=>s+Object.keys(a.fields).length,0)+i.reduce((s,a)=>s+Object.keys(a.fields).length,0),d=typeof t.database==="function"?"lazy":t.database.id;return{event:e,version:o,project:y([t.basePath,d,...r.map((s)=>s.slug).sort(),...i.map((s)=>s.slug).sort()]),runtime:b(),system:{platform:m(),arch:f(),release:p()},database:d,usage:{collections:r.length,globals:i.length,fields:c,plugins:t.plugins.length,locales:t.i18n.locales.length},features:{panel:t.admin.assets!==void 0,auth:t.admin.auth!==void 0,uploads:g(t.uploads?.storage),ai:t.ai!==void 0,webhooks:t.webhooks?.enabled===!0,trash:t.trash.enabled}}}async function vo(e,n={}){let o=n.fetch??globalThis.fetch;try{return(await o(n.endpoint??wo,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e),signal:AbortSignal.timeout(n.timeout??2000)})).ok?"sent":"failed"}catch{return"failed"}}async function yn(e){let n=Ut(e.config,e.environment);if(!n.enabled)return{decision:n,result:"skipped"};let o=Jt(e.event,e.cms,e.version),t=await vo(o,{...e.send,...e.config?.endpoint?{endpoint:e.config.endpoint}:{}});return{decision:n,result:t}}function g(e){if(e===void 0)return null;return typeof e==="function"?"lazy":e.id}function y(e){return u("sha256").update(e.join("|")).digest("hex").slice(0,16)}function b(){let e=globalThis.Bun;if(e)return{name:"bun",version:e.version};let n=globalThis.Deno;if(n)return{name:"deno",version:n.version.deno};return{name:"node",version:process.versions.node}}function l(e){return e!==void 0&&e!==""&&e!=="0"&&e!=="false"}
|
|
2
|
+
export{wo,Ut,Jt,vo,yn};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{n}from"./index-x72d1hzh.js";var r=new Map;function po(i){let t=r.get(i.name);if(t!==void 0&&t!==i)throw new n(`fields.${i.name}`,"a different field type with this name is already registered");r.set(i.name,i)}function Ko(i){return r.get(i)}function Zo(){return[...r.keys()].sort()}function C(i){return po(i),(t)=>{let e=t??{},o=i.optionsSchema?l(i.name,i.optionsSchema,e):e;if(e.admin!==void 0){for(let u of Object.keys(e.admin))if(u!=="hidden"&&u!=="placeholder")throw new n(`fields.${i.name}.admin.${u}`,"unsupported admin option; use only hidden or placeholder")}if(e.generate!==void 0&&typeof e.generate!=="function")throw new n(`fields.${i.name}.generate`,"must be a function");let d=e.required===!0;if(d&&e.admin?.hidden===!0)throw new n(`fields.${i.name}.admin.hidden`,"a hidden field cannot be required; remove required or show the field");let a=e.localized===!0,s=i.column(o);if(a&&(e.unique===!0||s.unique===!0))throw new n(`fields.${i.name}`,"a localized field cannot be unique in v1; enforce it in a hook instead");if(c(i.name,i.aiActions,e.ai),e.aiGenerate!==void 0){if(!["text","textarea","richText","email","url"].includes(i.name))throw new n(`fields.${i.name}.aiGenerate`,"generation currently supports text, textarea, richText, email and url fields")}return{type:i.name,options:e,schema:f(i.schema(o),d),column:{...s,nullable:s.nullable??!d,...e.unique===void 0?{}:{unique:e.unique},...e.index===void 0?{}:{index:e.index},storage:s.storage??"document"},localized:a,required:d,...e.default===void 0?{}:{defaultValue:e.default},...e.generate===void 0?{}:{generate:e.generate},...e.aiGenerate===void 0?{}:{aiGenerate:e.aiGenerate},...e.ai===void 0?{}:{ai:e.ai},...e.access===void 0?{}:{access:e.access},...e.admin===void 0?{}:{admin:e.admin},...typeof e.relationTo==="string"?{relationTo:e.relationTo}:{}}}}function l(i,t,e){let o=t.safeParse(e);if(!o.success){let d=o.error.issues[0],a=d?.path.length?` (${d.path.join(".")})`:"";throw new n(`fields.${i}`,`${d?.message??"invalid options"}${a}`)}return o.data}function f(i,t){return t?i:i.nullable()}function c(i,t,e){if(!e)return;if(e.generate!==void 0)throw new n(`fields.${i}.ai.generate`,"generation is configured with aiGenerate, not as an ai action");if(!t)return;for(let o of Object.keys(e)){let d=t.includes(o),a=typeof e[o]==="object";if(!d&&!a)throw new n(`fields.${i}.ai.${o}`,`unknown AI action; ${i} supports ${t.join(", ")}. Custom actions need an object with a prompt.`)}}
|
|
2
|
+
export{po,Ko,Zo,C};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function
|
|
2
|
-
export{
|
|
1
|
+
function Ce(e,n){let t=[],a=[],r=[],i=[],c=[],o=[],s=[],f=[],p=d(e.tables),x=d(n.tables),g=[];for(let u of l(n.tables)){let h=p.get(u.name);if(!h){g.push(u);for(let M of l(u.indexes))c.push({kind:"create_index",index:M});continue}C(h,u,a,r,s),T(h,u,i,c)}for(let u of _(g))t.push({kind:"create_table",table:u});let y=l(e.tables).filter((u)=>!x.has(u.name));for(let u of _(y).reverse())f.push({kind:"drop_table",table:u.name});return w(e,n,o),[...t,...a,...r,...i,...c,...o,...s,...f]}function _(e){let n=new Map(l(e).map((i)=>[i.name,i])),t=[],a=new Set,r=(i)=>{if(!n.has(i.name))return;if(a.has(i.name))return;a.add(i.name);for(let c of l(i.columns)){let o=c.references?.table;if(o===void 0||o===i.name)continue;let s=n.get(o);if(s)r(s)}if(a.delete(i.name),n.delete(i.name))t.push(i)};for(let i of l(e))r(i);return t}function C(e,n,t,a,r){let i=d(e.columns),c=d(n.columns);for(let o of l(n.columns)){let s=i.get(o.name);if(!s){t.push({kind:"add_column",table:n.name,column:o});continue}let f=k(s,o);if(f.length>0)a.push({kind:"alter_column",table:n.name,column:o,previous:s,changes:f})}for(let o of l(e.columns))if(!c.has(o.name))r.push({kind:"drop_column",table:e.name,column:o.name})}function k(e,n){let t=[];if(e.type!==n.type||e.array!==n.array)t.push("type");if(e.nullable!==n.nullable)t.push("nullable");if(!m(e.default,n.default))t.push("default");if(!m(e.references,n.references))t.push("references");return t}function T(e,n,t,a){let r=d(e.indexes),i=d(n.indexes);for(let c of l(e.indexes)){let o=i.get(c.name);if(!o){t.push({kind:"drop_index",table:e.name,index:c.name});continue}if(!b(c,o))t.push({kind:"drop_index",table:e.name,index:c.name})}for(let c of l(n.indexes)){let o=r.get(c.name);if(!o||!b(o,c))a.push({kind:"create_index",index:c})}}function b(e,n){return e.unique===n.unique&&m(e.targets,n.targets)&&m(e.where,n.where)}function w(e,n,t){let a=d(e.collections);for(let r of l(n.collections)){let i=a.get(r.name),c=d(i?.fields??[]);for(let o of l(r.fields)){let s=c.get(o.name),f=!m(s?.default,o.default),p=s===void 0;if(o.localized)continue;if(o.default!==void 0&&(p||f))t.push({kind:"set_document_field",table:r.table,collection:r.slug,documentColumn:r.documentColumn,path:S(o),value:o.default})}if(i){let o=d(r.fields);for(let s of l(i.fields))if(!o.has(s.name)&&!s.localized)t.push({kind:"unset_document_field",table:r.table,collection:r.slug,documentColumn:r.documentColumn,path:S(s)})}}}function S(e){return[e.name]}function d(e){return new Map(e.map((n)=>[n.name,n]))}function l(e){return[...e].sort((n,t)=>n.name.localeCompare(t.name))}function m(e,n){if(e===n)return!0;if(e===void 0||n===void 0)return!1;return Ue(e)===Ue(n)}function Ue(e){if(e===null||typeof e!=="object")return JSON.stringify(e)??"null";if(Array.isArray(e))return`[${e.map((t)=>Ue(t)).join(",")}]`;return`{${Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[a])=>t.localeCompare(a)).map(([t,a])=>`${JSON.stringify(t)}:${Ue(a)}`).join(",")}}`}function Oe(e){switch(e.kind){case"create_table":return`create table ${e.table.name}`;case"drop_table":return`drop table ${e.table}`;case"add_column":return`add ${e.table}.${e.column.name} (${v(e.column.type,e.column.array)})`;case"drop_column":return`drop ${e.table}.${e.column}`;case"alter_column":return`alter ${e.table}.${e.column.name} (${e.changes.join(", ")})`;case"create_index":return`create ${e.index.unique?"unique ":""}index ${e.index.name}`;case"drop_index":return`drop index ${e.index}`;case"set_document_field":return`backfill ${e.collection}.${e.path.join(".")} = ${JSON.stringify(e.value)}`;case"unset_document_field":return`remove ${e.collection}.${e.path.join(".")} from stored documents`}}function v(e,n){return n===!0?`${e}[]`:e}function Fn(e){if(e.length===0)return"empty";let n=e[0],t=(()=>{switch(n.kind){case"create_table":return e.filter((a)=>a.kind==="create_table").length>1?"create_schema":`create_${n.table.name}`;case"drop_table":return`drop_${n.table}`;case"add_column":return`add_${n.table}_${n.column.name}`;case"drop_column":return`drop_${n.table}_${n.column}`;case"alter_column":return`alter_${n.table}_${n.column.name}`;case"create_index":return`index_${n.index.name.replace(/^(idx|uniq)_/,"")}`;case"drop_index":return`drop_index_${n.index.replace(/^(idx|uniq)_/,"")}`;case"set_document_field":return`backfill_${n.collection}_${n.path.join("_")}`;case"unset_document_field":return`remove_${n.collection}_${n.path.join("_")}`}})();return j(e.length>1?`${t}_and_${e.length-1}_more`:t)}function j(e){let n=e.toLowerCase().replace(/[^a-z0-9]+/g,"_"),t=0,a=n.length;while(t<a&&n[t]==="_")t++;while(a>t&&n[a-1]==="_")a--;return n.slice(t,a).slice(0,60)}
|
|
2
|
+
export{Ce,Ue,Oe,Fn};
|