@kyro-cms/core 0.12.58 → 0.12.60
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/api-handler-graphql.cjs +1 -1
- package/dist/api-handler-graphql.js +1 -1
- package/dist/api-handler-trpc.cjs +1 -1
- package/dist/api-handler-trpc.js +1 -1
- package/dist/api-handler.cjs +1 -1
- package/dist/api-handler.js +1 -1
- package/dist/bootstrap-JF6Q4L6P.cjs +1 -0
- package/dist/{bootstrap-IGHJFNYG.js → bootstrap-VUWX45QN.js} +1 -1
- package/dist/{chunk-YZNFCSCE.js → chunk-33E4YN62.js} +1 -1
- package/dist/{chunk-BAXBE4JD.js → chunk-7N6TW4JB.js} +1 -1
- package/dist/{chunk-X4RTM5AQ.js → chunk-AO2IXWV4.js} +1 -1
- package/dist/{chunk-XP56DE7A.js → chunk-KWGB3YNI.js} +90 -78
- package/dist/{chunk-ECFZEY5B.cjs → chunk-M56F4LQ5.cjs} +1 -1
- package/dist/{chunk-KBJ4XZWF.cjs → chunk-NTKIONEC.cjs} +1 -1
- package/dist/{chunk-Z2XEW5RL.cjs → chunk-OUMUIICN.cjs} +3 -3
- package/dist/{chunk-KFEJPRC4.js → chunk-T4TSELDS.js} +2 -2
- package/dist/{chunk-QLUMJS5W.cjs → chunk-WQCLLM4S.cjs} +3 -3
- package/dist/{chunk-VKXWJOWI.cjs → chunk-XTTGHN3D.cjs} +90 -78
- package/dist/cli/index.cjs +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.d.cts +6 -8
- package/dist/index.d.ts +6 -8
- package/dist/index.js +1 -1
- package/dist/rest/index.cjs +1 -1
- package/dist/rest/index.js +1 -1
- package/package.json +2 -2
- package/dist/bootstrap-FTVBJ47D.cjs +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';var chunkVKXWJOWI_cjs=require('./chunk-VKXWJOWI.cjs'),chunkBHR7OAU4_cjs=require('./chunk-BHR7OAU4.cjs'),chunkO4YE57OS_cjs=require('./chunk-O4YE57OS.cjs'),chunk35PGCW3S_cjs=require('./chunk-35PGCW3S.cjs'),chunkUNYXWPLZ_cjs=require('./chunk-UNYXWPLZ.cjs'),chunkPITMDQYN_cjs=require('./chunk-PITMDQYN.cjs'),chunkGIS6X43A_cjs=require('./chunk-GIS6X43A.cjs'),chunkLEBM6ZSZ_cjs=require('./chunk-LEBM6ZSZ.cjs'),chunkGNEVCEJU_cjs=require('./chunk-GNEVCEJU.cjs'),chunkZO3YB5DK_cjs=require('./chunk-ZO3YB5DK.cjs'),chunk3VXEK5ZW_cjs=require('./chunk-3VXEK5ZW.cjs'),chunkEZIDQBXI_cjs=require('./chunk-EZIDQBXI.cjs'),chunkLQ3YZTPU_cjs=require('./chunk-LQ3YZTPU.cjs'),chunkMVX2PYJJ_cjs=require('./chunk-MVX2PYJJ.cjs'),chunkAK754S3T_cjs=require('./chunk-AK754S3T.cjs'),chunkDUO523BH_cjs=require('./chunk-DUO523BH.cjs'),chunkTDGSIF5H_cjs=require('./chunk-TDGSIF5H.cjs'),chunkXBQ6HV3T_cjs=require('./chunk-XBQ6HV3T.cjs'),chunkVRZC4TTF_cjs=require('./chunk-VRZC4TTF.cjs'),chunk7DUKWHRN_cjs=require('./chunk-7DUKWHRN.cjs'),chunkHTYVI2HK_cjs=require('./chunk-HTYVI2HK.cjs'),chunkZOVH6QT5_cjs=require('./chunk-ZOVH6QT5.cjs'),chunk7WMMKGEO_cjs=require('./chunk-7WMMKGEO.cjs'),chunkBUNLC3II_cjs=require('./chunk-BUNLC3II.cjs'),jB=require('crypto'),ko=require('path'),fs$1=require('fs'),promises=require('fs/promises'),$w=require('process'),stream=require('stream');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var jB__default=/*#__PURE__*/_interopDefault(jB);var ko__default=/*#__PURE__*/_interopDefault(ko);var $w__default=/*#__PURE__*/_interopDefault($w);chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var Ec=(r,e,t)=>(s,n)=>{let a=-1;return i(0);async function i(c){if(c<=a)throw new Error("next() called multiple times");a=c;let d,g=false,x;if(r[c]?(x=r[c][0][0],s.req.routeIndex=c):x=c===r.length&&n||void 0,x)try{d=await x(s,()=>i(c+1));}catch(_){if(_ instanceof Error&&e)s.error=_,d=await e(_,s),g=true;else throw _}else s.finalized===false&&t&&(d=await t(s));return d&&(s.finalized===false||g)&&(s.res=d),s}};chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var nm=Symbol();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var am=(r,e)=>new Response(r,{headers:{"Content-Type":e.replace(/^[^;]+/,s=>s.toLowerCase())}}).formData();var co=r=>"headers"in r,im=async(r,e=Object.create(null))=>{let{all:t=false,dot:s=false}=e,i=(co(r)?r.headers:r.raw.headers).get("Content-Type")?.split(";")[0].trim().toLowerCase();return i==="multipart/form-data"||i==="application/x-www-form-urlencoded"?ew(r,{all:t,dot:s}):{}};async function ew(r,e){if(!co(r)&&r.bodyCache.formData)return om(await r.bodyCache.formData,e);let t=co(r)?r.headers:r.raw.headers,s=await r.arrayBuffer(),n=am(s,t.get("Content-Type")||"");co(r)||(r.bodyCache.formData=n);let a=await n;return a?om(a,e):{}}function om(r,e){let t=Object.create(null);return r.forEach((s,n)=>{e.all||n.endsWith("[]")?tw(t,n,s):t[n]=s;}),e.dot&&Object.entries(t).forEach(([s,n])=>{s.includes(".")&&(rw(t,s,n),delete t[s]);}),t}var tw=(r,e,t)=>{r[e]!==void 0?Array.isArray(r[e])?r[e].push(t):r[e]=[r[e],t]:e.endsWith("[]")?r[e]=[t]:r[e]=t;},rw=(r,e,t)=>{if(/(?:^|\.)__proto__\./.test(e))return;let s=r,n=e.split(".");n.forEach((a,i)=>{i===n.length-1?s[a]=t:((!s[a]||typeof s[a]!="object"||Array.isArray(s[a])||s[a]instanceof File)&&(s[a]=Object.create(null)),s=s[a]);});};chunkBUNLC3II_cjs.h();var Oc=r=>{let e=r.split("/");return e[0]===""&&e.shift(),e},cm=r=>{let{groups:e,path:t}=sw(r),s=Oc(t);return nw(s,e)},sw=r=>{let e=[];return r=r.replace(/\{[^}]+\}/g,(t,s)=>{let n=`@${s}`;return e.push([n,t]),n}),{groups:e,path:r}},nw=(r,e)=>{for(let t=e.length-1;t>=0;t--){let[s]=e[t];for(let n=r.length-1;n>=0;n--)if(r[n].includes(s)){r[n]=r[n].replace(s,e[t][1]);break}}return r},uo={},um=(r,e)=>{if(r==="*")return "*";let t=r.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);if(t){let s=`${r}#${e}`;return uo[s]||(t[2]?uo[s]=e&&e[0]!==":"&&e[0]!=="*"?[s,t[1],new RegExp(`^${t[2]}(?=/${e})`)]:[r,t[1],new RegExp(`^${t[2]}$`)]:uo[s]=[r,t[1],true]),uo[s]}return null},Xn=(r,e)=>{try{return e(r)}catch{return r.replace(/(?:%[0-9A-Fa-f]{2})+/g,t=>{try{return e(t)}catch{return t}})}},aw=r=>Xn(r,decodeURI),Pc=r=>{let e=r.url,t=e.indexOf("/",e.indexOf(":")+4),s=t;for(;s<e.length;s++){let n=e.charCodeAt(s);if(n===37){let a=e.indexOf("?",s),i=e.indexOf("#",s),c=a===-1?i===-1?void 0:i:i===-1?a:Math.min(a,i),d=e.slice(t,c);return aw(d.includes("%25")?d.replace(/%25/g,"%2525"):d)}else if(n===63||n===35)break}return e.slice(t,s)};var lm=r=>{let e=Pc(r);return e.length>1&&e.at(-1)==="/"?e.slice(0,-1):e},Xr=(r,e,...t)=>(t.length&&(e=Xr(e,...t)),`${r?.[0]==="/"?"":"/"}${r}${e==="/"?"":`${r?.at(-1)==="/"?"":"/"}${e?.[0]==="/"?e.slice(1):e}`}`),lo=r=>{if(r.charCodeAt(r.length-1)!==63||!r.includes(":"))return null;let e=r.split("/"),t=[],s="";return e.forEach(n=>{if(n!==""&&!/\:/.test(n))s+="/"+n;else if(/\:/.test(n))if(/\?/.test(n)){t.length===0&&s===""?t.push("/"):t.push(s);let a=n.replace("?","");s+="/"+a,t.push(s);}else s+="/"+n;}),t.filter((n,a,i)=>i.indexOf(n)===a)},Tc=r=>/[%+]/.test(r)?(r.indexOf("+")!==-1&&(r=r.replace(/\+/g," ")),r.indexOf("%")!==-1?Xn(r,po):r):r,dm=(r,e,t)=>{let s;if(!t&&e&&!/[%+]/.test(e)){let i=r.indexOf("?",8);if(i===-1)return;for(r.startsWith(e,i+1)||(i=r.indexOf(`&${e}`,i+1));i!==-1;){let c=r.charCodeAt(i+e.length+1);if(c===61){let d=i+e.length+2,g=r.indexOf("&",d);return Tc(r.slice(d,g===-1?void 0:g))}else if(c==38||isNaN(c))return "";i=r.indexOf(`&${e}`,i+1);}if(s=/[%+]/.test(r),!s)return}let n={};s??=/[%+]/.test(r);let a=r.indexOf("?",8);for(;a!==-1;){let i=r.indexOf("&",a+1),c=r.indexOf("=",a);c>i&&i!==-1&&(c=-1);let d=r.slice(a+1,c===-1?i===-1?void 0:i:c);if(s&&(d=Tc(d)),a=i,d==="")continue;let g;c===-1?g="":(g=r.slice(c+1,i===-1?void 0:i),s&&(g=Tc(g))),t?(n[d]&&Array.isArray(n[d])||(n[d]=[]),n[d].push(g)):n[d]??=g;}return e?n[e]:n},pm=dm,mm=(r,e)=>dm(r,e,true),po=decodeURIComponent;var fm=r=>Xn(r,po),hm=class{raw;#t;#e;routeIndex=0;path;bodyCache={};constructor(r,e="/",t=[[]]){this.raw=r,this.path=e,this.#e=t,this.#t={};}param(r){return r?this.#r(r):this.#a()}#r(r){let e=this.#e[0][this.routeIndex][1][r],t=this.#n(e);return t&&/\%/.test(t)?fm(t):t}#a(){let r={},e=Object.keys(this.#e[0][this.routeIndex][1]);for(let t of e){let s=this.#n(this.#e[0][this.routeIndex][1][t]);s!==void 0&&(r[t]=/\%/.test(s)?fm(s):s);}return r}#n(r){return this.#e[1]?this.#e[1][r]:r}query(r){return pm(this.url,r)}queries(r){return mm(this.url,r)}header(r){if(r)return this.raw.headers.get(r)??void 0;let e={};return this.raw.headers.forEach((t,s)=>{e[s]=t;}),e}async parseBody(r){return im(this,r)}#s=r=>{let{bodyCache:e,raw:t}=this,s=e[r];if(s)return s;let n=Object.keys(e)[0];return n?e[n].then(a=>(n==="json"&&(a=JSON.stringify(a)),new Response(a)[r]())):e[r]=t[r]()};json(){return this.#s("text").then(r=>JSON.parse(r))}text(){return this.#s("text")}arrayBuffer(){return this.#s("arrayBuffer")}bytes(){return this.#s("arrayBuffer").then(r=>new Uint8Array(r))}blob(){return this.#s("blob")}formData(){return this.#s("formData")}addValidatedData(r,e){this.#t[r]=e;}valid(r){return this.#t[r]}get url(){return this.raw.url}get method(){return this.raw.method}get[nm](){return this.#e}get matchedRoutes(){return this.#e[0].map(([[,r]])=>r)}get routePath(){return this.#e[0].map(([[,r]])=>r)[this.routeIndex].path}};chunkBUNLC3II_cjs.h();var gm={Stringify:1},iw=(r,e)=>{let t=new String(r);return t.isEscaped=true,t.callbacks=e,t};var Ic=async(r,e,t,s,n)=>{typeof r=="object"&&!(r instanceof String)&&(r instanceof Promise||(r=r.toString()),r instanceof Promise&&(r=await r));let a=r.callbacks;if(!a?.length)return Promise.resolve(r);n?n[0]+=r:n=[r];let i=Promise.all(a.map(c=>c({phase:e,buffer:n,context:s}))).then(c=>Promise.all(c.filter(Boolean).map(d=>Ic(d,e,false,s,n))).then(()=>n[0]));return t?iw(await i,a):i};var cw="text/plain; charset=UTF-8",Dc=(r,e)=>({"Content-Type":r,...e}),Jn=(r,e)=>new Response(r,e),Lc=class{#t;#e;env={};#r;finalized=false;error;#a;#n;#s;#l;#c;#u;#i;#d;#p;constructor(r,e){this.#t=r,e&&(this.#n=e.executionCtx,this.env=e.env,this.#u=e.notFoundHandler,this.#p=e.path,this.#d=e.matchResult);}get req(){return this.#e??=new hm(this.#t,this.#p,this.#d),this.#e}get event(){if(this.#n&&"respondWith"in this.#n)return this.#n;throw Error("This context has no FetchEvent")}get executionCtx(){if(this.#n)return this.#n;throw Error("This context has no ExecutionContext")}get res(){return this.#s||=Jn(null,{headers:this.#i??=new Headers})}set res(r){if(this.#s&&r){r=Jn(r.body,r);for(let[e,t]of this.#s.headers.entries())if(e!=="content-type")if(e==="set-cookie"){let s=this.#s.headers.getSetCookie();r.headers.delete("set-cookie");for(let n of s)r.headers.append("set-cookie",n);}else r.headers.set(e,t);}this.#s=r,this.finalized=true;}render=(...r)=>(this.#c??=e=>this.html(e),this.#c(...r));setLayout=r=>this.#l=r;getLayout=()=>this.#l;setRenderer=r=>{this.#c=r;};header=(r,e,t)=>{this.finalized&&(this.#s=Jn(this.#s.body,this.#s));let s=this.#s?this.#s.headers:this.#i??=new Headers;e===void 0?s.delete(r):t?.append?s.append(r,e):s.set(r,e);};status=r=>{this.#a=r;};set=(r,e)=>{this.#r??=new Map,this.#r.set(r,e);};get=r=>this.#r?this.#r.get(r):void 0;get var(){return this.#r?Object.fromEntries(this.#r):{}}#o(r,e,t){let s=this.#s?new Headers(this.#s.headers):this.#i??new Headers;if(typeof e=="object"&&"headers"in e){let a=e.headers instanceof Headers?e.headers:new Headers(e.headers);for(let[i,c]of a)i.toLowerCase()==="set-cookie"?s.append(i,c):s.set(i,c);}if(t)for(let[a,i]of Object.entries(t))if(typeof i=="string")s.set(a,i);else {s.delete(a);for(let c of i)s.append(a,c);}let n=typeof e=="number"?e:e?.status??this.#a;return Jn(r,{status:n,headers:s})}newResponse=(...r)=>this.#o(...r);body=(r,e,t)=>this.#o(r,e,t);text=(r,e,t)=>!this.#i&&!this.#a&&!e&&!t&&!this.finalized?new Response(r):this.#o(r,e,Dc(cw,t));json=(r,e,t)=>this.#o(JSON.stringify(r),e,Dc("application/json",t));html=(r,e,t)=>{let s=n=>this.#o(n,e,Dc("text/html; charset=UTF-8",t));return typeof r=="object"?Ic(r,gm.Stringify,false,{}).then(s):s(r)};redirect=(r,e)=>{let t=String(r);return this.header("Location",/[^\x00-\xFF]/.test(t)?encodeURI(t):t),this.newResponse(null,e??302)};notFound=()=>(this.#u??=()=>Jn(),this.#u(this))};chunkBUNLC3II_cjs.h();var De="ALL",ym="all",xm=["get","post","put","delete","options","patch"],mo="Can not add a route since the matcher is already built.",fo=class extends Error{};chunkBUNLC3II_cjs.h();var _m="__COMPOSED_HANDLER";var uw=r=>r.text("404 Not Found",404),wm=(r,e)=>{if("getResponse"in r){let t=r.getResponse();return e.newResponse(t.body,t)}return console.error(r),e.text("Internal Server Error",500)},bm=class vm{get;post;put;delete;options;patch;all;on;use;router;getPath;_basePath="/";#t="/";routes=[];constructor(e={}){[...xm,ym].forEach(a=>{this[a]=(i,...c)=>(typeof i=="string"?this.#t=i:this.#a(a,this.#t,i),c.forEach(d=>{this.#a(a,this.#t,d);}),this);}),this.on=(a,i,...c)=>{for(let d of [i].flat()){this.#t=d;for(let g of [a].flat())c.map(x=>{this.#a(g.toUpperCase(),this.#t,x);});}return this},this.use=(a,...i)=>(typeof a=="string"?this.#t=a:(this.#t="*",i.unshift(a)),i.forEach(c=>{this.#a(De,this.#t,c);}),this);let{strict:s,...n}=e;Object.assign(this,n),this.getPath=s??true?e.getPath??Pc:lm;}#e(){let e=new vm({router:this.router,getPath:this.getPath});return e.errorHandler=this.errorHandler,e.#r=this.#r,e.routes=this.routes,e}#r=uw;errorHandler=wm;route(e,t){let s=this.basePath(e);return t.routes.map(n=>{let a;t.errorHandler===wm?a=n.handler:(a=async(i,c)=>(await Ec([],t.errorHandler)(i,()=>n.handler(i,c))).res,a[_m]=n.handler),s.#a(n.method,n.path,a,n.basePath);}),this}basePath(e){let t=this.#e();return t._basePath=Xr(this._basePath,e),t}onError=e=>(this.errorHandler=e,this);notFound=e=>(this.#r=e,this);mount(e,t,s){let n,a;s&&(typeof s=="function"?a=s:(a=s.optionHandler,s.replaceRequest===false?n=d=>d:n=s.replaceRequest));let i=a?d=>{let g=a(d);return Array.isArray(g)?g:[g]}:d=>{let g;try{g=d.executionCtx;}catch{}return [d.env,g]};n||=(()=>{let d=Xr(this._basePath,e),g=d==="/"?0:d.length;return x=>{let _=new URL(x.url);return _.pathname=this.getPath(x).slice(g)||"/",new Request(_,x)}})();let c=async(d,g)=>{let x=await t(n(d.req.raw),...i(d));if(x)return x;await g();};return this.#a(De,Xr(e,"*"),c),this}#a(e,t,s,n){e=e.toUpperCase(),t=Xr(this._basePath,t);let a={basePath:n!==void 0?Xr(this._basePath,n):this._basePath,path:t,method:e,handler:s};this.router.add(e,t,[s,a]),this.routes.push(a);}#n(e,t){if(e instanceof Error)return this.errorHandler(e,t);throw e}#s(e,t,s,n){if(n==="HEAD")return (async()=>new Response(null,await this.#s(e,t,s,"GET")))();let a=this.getPath(e,{env:s}),i=this.router.match(n,a),c=new Lc(e,{path:a,matchResult:i,env:s,executionCtx:t,notFoundHandler:this.#r});if(i[0].length===1){let g;try{g=i[0][0][0][0](c,async()=>{c.res=await this.#r(c);});}catch(x){return this.#n(x,c)}return g instanceof Promise?g.then(x=>x||(c.finalized?c.res:this.#r(c))).catch(x=>this.#n(x,c)):g??this.#r(c)}let d=Ec(i[0],this.errorHandler,this.#r);return (async()=>{try{let g=await d(c);if(!g.finalized)throw new Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return g.res}catch(g){return this.#n(g,c)}})()}fetch=(e,...t)=>this.#s(e,t[1],t[0],e.method);request=(e,t,s,n)=>e instanceof Request?this.fetch(t?new Request(e,t):e,s,n):(e=e.toString(),this.fetch(new Request(/^https?:\/\//.test(e)?e:`http://localhost${Xr("/",e)}`,t),s,n));fire=()=>{addEventListener("fetch",e=>{e.respondWith(this.#s(e.request,e,void 0,e.request.method));});}};chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var ho=[];function $c(r,e){let t=this.buildAllMatchers(),s=((n,a)=>{let i=t[n]||t[De],c=i[2][a];if(c)return c;let d=a.match(i[0]);if(!d)return [[],ho];let g=d.indexOf("",1);return [i[1][g],d]});return this.match=s,s(r,e)}chunkBUNLC3II_cjs.h();var go="[^/]+",Qn=".*",Yn="(?:|/.*)",ds=Symbol(),lw=new Set(".\\+*[^]$()");function dw(r,e){return r.length===1?e.length===1?r<e?-1:1:-1:e.length===1||r===Qn||r===Yn?1:e===Qn||e===Yn?-1:r===go?1:e===go?-1:r.length===e.length?r<e?-1:1:e.length-r.length}var Sm=class Bc{#t;#e;#r=Object.create(null);insert(e,t,s,n,a){if(e.length===0){if(this.#t!==void 0)throw ds;if(a)return;this.#t=t;return}let[i,...c]=e,d=i==="*"?c.length===0?["","",Qn]:["","",go]:i==="/*"?["","",Yn]:i.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),g;if(d){let x=d[1],_=d[2]||go;if(x&&d[2]&&(_===".*"||(_=_.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(_))))throw ds;if(g=this.#r[_],!g){if(Object.keys(this.#r).some(O=>O!==Qn&&O!==Yn))throw ds;if(a)return;g=this.#r[_]=new Bc,x!==""&&(g.#e=n.varIndex++);}!a&&x!==""&&s.push([x,g.#e]);}else if(g=this.#r[i],!g){if(Object.keys(this.#r).some(x=>x.length>1&&x!==Qn&&x!==Yn))throw ds;if(a)return;g=this.#r[i]=new Bc;}g.insert(c,t,s,n,a);}buildRegExpStr(){let t=Object.keys(this.#r).sort(dw).map(s=>{let n=this.#r[s];return (typeof n.#e=="number"?`(${s})@${n.#e}`:lw.has(s)?`\\${s}`:s)+n.buildRegExpStr()});return typeof this.#t=="number"&&t.unshift(`#${this.#t}`),t.length===0?"":t.length===1?t[0]:"(?:"+t.join("|")+")"}};chunkBUNLC3II_cjs.h();var Am=class{#t={varIndex:0};#e=new Sm;insert(r,e,t){let s=[],n=[];for(let i=0;;){let c=false;if(r=r.replace(/\{[^}]+\}/g,d=>{let g=`@\\${i}`;return n[i]=[g,d],i++,c=true,g}),!c)break}let a=r.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let i=n.length-1;i>=0;i--){let[c]=n[i];for(let d=a.length-1;d>=0;d--)if(a[d].indexOf(c)!==-1){a[d]=a[d].replace(c,n[i][1]);break}}return this.#e.insert(a,e,s,this.#t,t),s}buildRegExp(){let r=this.#e.buildRegExpStr();if(r==="")return [/^$/,[],[]];let e=0,t=[],s=[];return r=r.replace(/#(\d+)|@(\d+)|\.\*\$/g,(n,a,i)=>a!==void 0?(t[++e]=Number(a),"$()"):(i!==void 0&&(s[Number(i)]=++e),"")),[new RegExp(`^${r}`),t,s]}};var pw=[/^$/,[],Object.create(null)],Rm=Object.create(null);function km(r){return Rm[r]??=new RegExp(r==="*"?"":`^${r.replace(/\/\*$|([.\\+*[^\]$()])/g,(e,t)=>t?`\\${t}`:"(?:|/.*)")}$`)}function mw(){Rm=Object.create(null);}function fw(r){let e=new Am,t=[];if(r.length===0)return pw;let s=r.map(g=>[!/\*|\/:/.test(g[0]),...g]).sort(([g,x],[_,O])=>g?1:_?-1:x.length-O.length),n=Object.create(null);for(let g=0,x=-1,_=s.length;g<_;g++){let[O,H,U]=s[g];O?n[H]=[U.map(([ce])=>[ce,Object.create(null)]),ho]:x++;let F;try{F=e.insert(H,x,O);}catch(ce){throw ce===ds?new fo(H):ce}O||(t[x]=U.map(([ce,re])=>{let Oe=Object.create(null);for(re-=1;re>=0;re--){let[W,vt]=F[re];Oe[W]=vt;}return [ce,Oe]}));}let[a,i,c]=e.buildRegExp();for(let g=0,x=t.length;g<x;g++)for(let _=0,O=t[g].length;_<O;_++){let H=t[g][_]?.[1];if(!H)continue;let U=Object.keys(H);for(let F=0,ce=U.length;F<ce;F++)H[U[F]]=c[H[U[F]]];}let d=[];for(let g in i)d[g]=t[i[g]];return [a,d,n]}function Ns(r,e){if(r){for(let t of Object.keys(r).sort((s,n)=>n.length-s.length))if(km(t).test(e))return [...r[t]]}}var yo=class{name="RegExpRouter";#t;#e;constructor(){this.#t={[De]:Object.create(null)},this.#e={[De]:Object.create(null)};}add(r,e,t){let s=this.#t,n=this.#e;if(!s||!n)throw new Error(mo);s[r]||[s,n].forEach(c=>{c[r]=Object.create(null),Object.keys(c[De]).forEach(d=>{c[r][d]=[...c[De][d]];});}),e==="/*"&&(e="*");let a=(e.match(/\/:/g)||[]).length;if(/\*$/.test(e)){let c=km(e);r===De?Object.keys(s).forEach(d=>{s[d][e]||=Ns(s[d],e)||Ns(s[De],e)||[];}):s[r][e]||=Ns(s[r],e)||Ns(s[De],e)||[],Object.keys(s).forEach(d=>{(r===De||r===d)&&Object.keys(s[d]).forEach(g=>{c.test(g)&&s[d][g].push([t,a]);});}),Object.keys(n).forEach(d=>{(r===De||r===d)&&Object.keys(n[d]).forEach(g=>c.test(g)&&n[d][g].push([t,a]));});return}let i=lo(e)||[e];for(let c=0,d=i.length;c<d;c++){let g=i[c];Object.keys(n).forEach(x=>{(r===De||r===x)&&(n[x][g]||=[...Ns(s[x],g)||Ns(s[De],g)||[]],n[x][g].push([t,a-d+c+1]));});}}match=$c;buildAllMatchers(){let r=Object.create(null);return Object.keys(this.#e).concat(Object.keys(this.#t)).forEach(e=>{r[e]||=this.#r(e);}),this.#t=this.#e=void 0,mw(),r}#r(r){let e=[],t=r===De;return [this.#t,this.#e].forEach(s=>{let n=s[r]?Object.keys(s[r]).map(a=>[a,s[r][a]]):[];n.length!==0?(t||=true,e.push(...n)):r!==De&&e.push(...Object.keys(s[De]).map(a=>[a,s[De][a]]));}),t?fw(e):null}};chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var jc=class{name="SmartRouter";#t=[];#e=[];constructor(r){this.#t=r.routers;}add(r,e,t){if(!this.#e)throw new Error(mo);this.#e.push([r,e,t]);}match(r,e){if(!this.#e)throw new Error("Fatal error");let t=this.#t,s=this.#e,n=t.length,a=0,i;for(;a<n;a++){let c=t[a];try{for(let d=0,g=s.length;d<g;d++)c.add(...s[d]);i=c.match(r,e);}catch(d){if(d instanceof fo)continue;throw d}this.match=c.match.bind(c),this.#t=[c],this.#e=void 0;break}if(a===n)throw new Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,i}get activeRouter(){if(this.#e||this.#t.length!==1)throw new Error("No active router has been determined yet.");return this.#t[0]}};chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var ea=Object.create(null),hw=r=>{for(let e in r)return true;return false},Cm=class Em{#t;#e;#r;#a=0;#n=ea;constructor(e,t,s){if(this.#e=s||Object.create(null),this.#t=[],e&&t){let n=Object.create(null);n[e]={handler:t,possibleKeys:[],score:0},this.#t=[n];}this.#r=[];}insert(e,t,s){this.#a=++this.#a;let n=this,a=cm(t),i=[];for(let c=0,d=a.length;c<d;c++){let g=a[c],x=a[c+1],_=um(g,x),O=Array.isArray(_)?_[0]:g;if(O in n.#e){n=n.#e[O],_&&i.push(_[1]);continue}n.#e[O]=new Em,_&&(n.#r.push(_),i.push(_[1])),n=n.#e[O];}return n.#t.push({[e]:{handler:s,possibleKeys:i.filter((c,d,g)=>g.indexOf(c)===d),score:this.#a}}),n}#s(e,t,s,n,a){for(let i=0,c=t.#t.length;i<c;i++){let d=t.#t[i],g=d[s]||d[De],x={};if(g!==void 0&&(g.params=Object.create(null),e.push(g),n!==ea||a&&a!==ea))for(let _=0,O=g.possibleKeys.length;_<O;_++){let H=g.possibleKeys[_],U=x[g.score];g.params[H]=a?.[H]&&!U?a[H]:n[H]??a?.[H],x[g.score]=true;}}}search(e,t){let s=[];this.#n=ea;let a=[this],i=Oc(t),c=[],d=i.length,g=null;for(let x=0;x<d;x++){let _=i[x],O=x===d-1,H=[];for(let F=0,ce=a.length;F<ce;F++){let re=a[F],Oe=re.#e[_];Oe&&(Oe.#n=re.#n,O?(Oe.#e["*"]&&this.#s(s,Oe.#e["*"],e,re.#n),this.#s(s,Oe,e,re.#n)):H.push(Oe));for(let W=0,vt=re.#r.length;W<vt;W++){let We=re.#r[W],q=re.#n===ea?{}:{...re.#n};if(We==="*"){let pr=re.#e["*"];pr&&(this.#s(s,pr,e,re.#n),pr.#n=q,H.push(pr));continue}let[Dt,ls,Ir]=We;if(!_&&!(Ir instanceof RegExp))continue;let Fe=re.#e[Dt];if(Ir instanceof RegExp){if(g===null){g=new Array(d);let er=t[0]==="/"?1:0;for(let _e=0;_e<d;_e++)g[_e]=er,er+=i[_e].length+1;}let pr=t.substring(g[x]),mr=Ir.exec(pr);if(mr){if(q[ls]=mr[0],this.#s(s,Fe,e,re.#n,q),mr[0].length===pr.length&&Fe.#e["*"]&&this.#s(s,Fe.#e["*"],e,re.#n,q),hw(Fe.#e)){Fe.#n=q;let er=mr[0].match(/\//)?.length??0;(c[er]||=[]).push(Fe);}continue}}(Ir===true||Ir.test(_))&&(q[ls]=_,O?(this.#s(s,Fe,e,q,re.#n),Fe.#e["*"]&&this.#s(s,Fe.#e["*"],e,q,re.#n)):(Fe.#n=q,H.push(Fe)));}}let U=c.shift();a=U?H.concat(U):H;}return s.length>1&&s.sort((x,_)=>x.score-_.score),[s.map(({handler:x,params:_})=>[x,_])]}};var Nc=class{name="TrieRouter";#t;constructor(){this.#t=new Cm;}add(r,e,t){let s=lo(e);if(s){for(let n=0,a=s.length;n<a;n++)this.#t.insert(r,s[n],t);return}this.#t.insert(r,e,t);}match(r,e){return this.#t.search(r,e)}};var Mc=class extends bm{constructor(r={}){super(r),this.router=r.router??new jc({routers:[new yo,new Nc]});}};chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var Uc=r=>Fc(r.replace(/_|-/g,e=>({_:"/","-":"+"})[e]??e)),qc=r=>gw(r).replace(/\/|\+/g,e=>({"/":"_","+":"-"})[e]??e),gw=r=>{let e="",t=new Uint8Array(r);for(let s=0,n=t.length;s<n;s++)e+=String.fromCharCode(t[s]);return btoa(e)},Fc=r=>{let e=atob(r),t=new Uint8Array(new ArrayBuffer(e.length)),s=e.length/2;for(let n=0,a=e.length-1;n<=s;n++,a--)t[n]=e.charCodeAt(n),t[a]=e.charCodeAt(a);return t};chunkBUNLC3II_cjs.h();var ps=(r=>(r.HS256="HS256",r.HS384="HS384",r.HS512="HS512",r.RS256="RS256",r.RS384="RS384",r.RS512="RS512",r.PS256="PS256",r.PS384="PS384",r.PS512="PS512",r.ES256="ES256",r.ES384="ES384",r.ES512="ES512",r.EdDSA="EdDSA",r))(ps||{});chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var yw={deno:"Deno",bun:"Bun",workerd:"Cloudflare-Workers",node:"Node.js"},Tm=()=>{let r=globalThis;if(typeof navigator<"u"&&typeof navigator.userAgent=="string"){for(let[t,s]of Object.entries(yw))if(xw(s))return t}return typeof r?.EdgeRuntime=="string"?"edge-light":r?.fastly!==void 0?"fastly":r?.process?.release?.name==="node"?"node":"other"},xw=r=>navigator.userAgent.startsWith(r);chunkBUNLC3II_cjs.h();var Om=class extends Error{constructor(r){super(`${r} is not an implemented algorithm`),this.name="JwtAlgorithmNotImplemented";}},Hc=class extends Error{constructor(){super('JWT verification requires "alg" option to be specified'),this.name="JwtAlgorithmRequired";}},Gc=class extends Error{constructor(r,e){super(`JWT algorithm mismatch: expected "${r}", got "${e}"`),this.name="JwtAlgorithmMismatch";}},ms=class extends Error{constructor(r){super(`invalid JWT token: ${r}`),this.name="JwtTokenInvalid";}},Pm=class extends Error{constructor(r){super(`token (${r}) is being used before it's valid`),this.name="JwtTokenNotBefore";}},Im=class extends Error{constructor(r){super(`token (${r}) expired`),this.name="JwtTokenExpired";}},Dm=class extends Error{constructor(r,e){super(`Invalid "iat" claim, must be a valid number lower than "${r}" (iat: "${e}")`),this.name="JwtTokenIssuedAt";}},xo=class extends Error{constructor(r,e){super(`expected issuer "${r}", got ${e?`"${e}"`:"none"} `),this.name="JwtTokenIssuer";}},zc=class extends Error{constructor(r){super(`jwt header is invalid: ${JSON.stringify(r)}`),this.name="JwtHeaderInvalid";}},jm=class extends Error{constructor(r){super(`token(${r}) signature mismatched`),this.name="JwtTokenSignatureMismatched";}},Nm=class extends Error{constructor(r){super(`required "aud" in jwt payload: ${JSON.stringify(r)}`),this.name="JwtPayloadRequiresAud";}},Mm=class extends Error{constructor(r,e){super(`expected audience "${Array.isArray(r)?r.join(", "):r}", got "${e}"`),this.name="JwtTokenAudience";}},Ms=(r=>(r.Encrypt="encrypt",r.Decrypt="decrypt",r.Sign="sign",r.Verify="verify",r.DeriveKey="deriveKey",r.DeriveBits="deriveBits",r.WrapKey="wrapKey",r.UnwrapKey="unwrapKey",r))(Ms||{});chunkBUNLC3II_cjs.h();var fs=new TextEncoder,Um=new TextDecoder;async function Fm(r,e,t){let s=Gm(e),n=await _w(r,s);return await crypto.subtle.sign(s,n,t)}async function Hm(r,e,t,s){let n=Gm(e),a=await ww(r,n);return await crypto.subtle.verify(n,a,t,s)}function Kc(r){return Fc(r.replace(/-+(BEGIN|END).*?-+/g,"").replace(/\s/g,""))}async function _w(r,e){if(!crypto.subtle||!crypto.subtle.importKey)throw new Error("`crypto.subtle.importKey` is undefined. JWT auth middleware requires it.");if(zm(r)){if(r.type!=="private"&&r.type!=="secret")throw new Error(`unexpected key type: CryptoKey.type is ${r.type}, expected private or secret`);return r}let t=[Ms.Sign];return typeof r=="object"?await crypto.subtle.importKey("jwk",r,e,false,t):r.includes("PRIVATE")?await crypto.subtle.importKey("pkcs8",Kc(r),e,false,t):await crypto.subtle.importKey("raw",fs.encode(r),e,false,t)}async function ww(r,e){if(!crypto.subtle||!crypto.subtle.importKey)throw new Error("`crypto.subtle.importKey` is undefined. JWT auth middleware requires it.");if(zm(r)){if(r.type==="public"||r.type==="secret")return r;r=await qm(r);}if(typeof r=="string"&&r.includes("PRIVATE")){let s=await crypto.subtle.importKey("pkcs8",Kc(r),e,true,[Ms.Sign]);r=await qm(s);}let t=[Ms.Verify];return typeof r=="object"?await crypto.subtle.importKey("jwk",r,e,false,t):r.includes("PUBLIC")?await crypto.subtle.importKey("spki",Kc(r),e,false,t):await crypto.subtle.importKey("raw",fs.encode(r),e,false,t)}async function qm(r){if(r.type!=="private")throw new Error(`unexpected key type: ${r.type}`);if(!r.extractable)throw new Error("unexpected private key is unextractable");let e=await crypto.subtle.exportKey("jwk",r),{kty:t}=e,{alg:s,e:n,n:a}=e,{crv:i,x:c,y:d}=e;return {kty:t,alg:s,e:n,n:a,crv:i,x:c,y:d,key_ops:[Ms.Verify]}}function Gm(r){switch(r){case "HS256":return {name:"HMAC",hash:{name:"SHA-256"}};case "HS384":return {name:"HMAC",hash:{name:"SHA-384"}};case "HS512":return {name:"HMAC",hash:{name:"SHA-512"}};case "RS256":return {name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}};case "RS384":return {name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-384"}};case "RS512":return {name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-512"}};case "PS256":return {name:"RSA-PSS",hash:{name:"SHA-256"},saltLength:32};case "PS384":return {name:"RSA-PSS",hash:{name:"SHA-384"},saltLength:48};case "PS512":return {name:"RSA-PSS",hash:{name:"SHA-512"},saltLength:64};case "ES256":return {name:"ECDSA",hash:{name:"SHA-256"},namedCurve:"P-256"};case "ES384":return {name:"ECDSA",hash:{name:"SHA-384"},namedCurve:"P-384"};case "ES512":return {name:"ECDSA",hash:{name:"SHA-512"},namedCurve:"P-521"};case "EdDSA":return {name:"Ed25519",namedCurve:"Ed25519"};default:throw new Om(r)}}function zm(r){return Tm()==="node"&&crypto.webcrypto?r instanceof crypto.webcrypto.CryptoKey:r instanceof CryptoKey}var Vc=r=>qc(fs.encode(JSON.stringify(r)).buffer).replace(/=/g,""),bw=r=>qc(r).replace(/=/g,""),Wc=r=>JSON.parse(Um.decode(Uc(r)));function Km(r){if(typeof r=="object"&&r!==null){let e=r;return "alg"in e&&Object.values(ps).includes(e.alg)&&(!("typ"in e)||e.typ==="JWT")}return false}var Vm=async(r,e,t="HS256")=>{let s=Vc(r),n;typeof e=="object"&&"alg"in e?(t=e.alg,n=Vc({alg:t,typ:"JWT",kid:e.kid})):n=Vc({alg:t,typ:"JWT"});let a=`${n}.${s}`,i=await Fm(e,t,fs.encode(a)),c=bw(i);return `${a}.${c}`},Zc=async(r,e,t)=>{if(!t)throw new Hc;let{alg:s,iss:n,nbf:a=true,exp:i=true,iat:c=true,aud:d}=typeof t=="string"?{alg:t}:t;if(!s)throw new Hc;let g=r.split(".");if(g.length!==3)throw new ms(r);let{header:x,payload:_}=Xc(r);if(!Km(x))throw new zc(x);if(x.alg!==s)throw new Gc(s,x.alg);let O=Math.floor(Date.now()/1e3);if(a&&_.nbf!==void 0&&(typeof _.nbf!="number"||!Number.isFinite(_.nbf)||_.nbf>O))throw new Pm(r);if(i&&_.exp!==void 0&&(typeof _.exp!="number"||!Number.isFinite(_.exp)||_.exp<=O))throw new Im(r);if(c&&_.iat!==void 0&&(typeof _.iat!="number"||!Number.isFinite(_.iat)||O<_.iat))throw new Dm(O,_.iat);if(n){if(!_.iss)throw new xo(n,null);if(typeof n=="string"&&_.iss!==n)throw new xo(n,_.iss);if(n instanceof RegExp&&!n.test(_.iss))throw new xo(n,_.iss)}if(d){if(!_.aud)throw new Nm(_);if(!(Array.isArray(_.aud)?_.aud:[_.aud]).some(re=>d instanceof RegExp?d.test(re):typeof d=="string"?re===d:Array.isArray(d)&&d.includes(re)))throw new Mm(d,_.aud)}let H=r.substring(0,r.lastIndexOf("."));if(!await Hm(e,s,Uc(g[2]),fs.encode(H)))throw new jm(r);return _};[ps.HS256,ps.HS384,ps.HS512];var Xc=r=>{let e=r.split(".");if(e.length!==3)throw new ms(r);try{let t=Wc(e[0]),s=Wc(e[1]);return {header:t,payload:s}}catch{throw new ms(r)}};var ta={sign:Vm,verify:Zc};var _o=ta.verify,wo=ta.sign;chunkBUNLC3II_cjs.h();function hs(r,e){for(let t of r){if(t.name===e)return t;if(t.type==="group"||t.type==="array"){let s=hs(t.fields||[],e);if(s)return s}if(t.type==="blocks")for(let s of t.blocks||[]){let n=hs(s.fields||[],e);if(n)return n}if(t.type==="tabs")for(let s of t.tabs||[]){let n=hs(s.fields||[],e);if(n)return n}if(t.type==="collapsible"||t.type==="row"){let s=hs(t.fields||[],e);if(s)return s}}return null}function ra(r){return r.map(e=>`${e.path.join(".")}: ${e.message}`).join(", ")}function Jr(r,e){if(!(!r||typeof r!="object"))for(let t of e){if(t.type==="tabs"&&Array.isArray(t.tabs)){let n=t.name?r[t.name]:r;if(n&&typeof n=="object")for(let a of t.tabs)Array.isArray(a.fields)&&Jr(n,a.fields);continue}if(!t.name||!(t.name in r))continue;if(r[t.name]===""&&(t.type==="text"||t.type==="textarea"||t.type==="code"||t.type==="markdown"||(r[t.name]=null)),(t.type==="group"||t.type==="collapsible")&&t.name&&Array.isArray(t.fields)&&r[t.name]&&typeof r[t.name]=="object")Jr(r[t.name],t.fields);else if(t.type==="array"&&t.name&&Array.isArray(t.fields)&&Array.isArray(r[t.name]))for(let n of r[t.name])n&&typeof n=="object"&&Jr(n,t.fields);else if(t.type==="blocks"&&t.name&&Array.isArray(t.blocks)&&Array.isArray(r[t.name]))for(let n of r[t.name]){if(!n||typeof n!="object")continue;let a=n.type||n.blockType;if(!a)continue;let i=t.blocks.find(d=>d.slug===a);if(!i||!Array.isArray(i.fields))continue;let c=n.data&&typeof n.data=="object"?n.data:n;Jr(c,i.fields);}}}function Qr(r,e){if(!(!e||typeof e!="object"))for(let t of r){if(t.type==="tabs"&&Array.isArray(t.tabs)){let s=t.name?e[t.name]:e;if(s&&typeof s=="object")for(let n of t.tabs)Array.isArray(n.fields)&&Qr(n.fields,s);}if(t.type==="richtext"&&t.name){let s=e[t.name];typeof s=="string"?e[t.name]=[{type:"paragraph",children:[{text:s}]}]:s&&typeof s=="object"&&!Array.isArray(s)&&s.type==="doc"&&Array.isArray(s.content)&&(e[t.name]=s.content);}if((t.type==="group"||t.type==="collapsible")&&t.name&&Array.isArray(t.fields)&&e[t.name]&&typeof e[t.name]=="object")Qr(t.fields,e[t.name]);else if(t.type==="array"&&t.name&&Array.isArray(t.fields)&&Array.isArray(e[t.name]))for(let s of e[t.name])s&&typeof s=="object"&&Qr(t.fields,s);else if(t.type==="blocks"&&t.name&&Array.isArray(t.blocks)&&Array.isArray(e[t.name]))for(let s of e[t.name]){if(!s||typeof s!="object")continue;let n=s.type||s.blockType;if(!n)continue;let a=t.blocks.find(c=>c.slug===n);if(!a||!Array.isArray(a.fields))continue;let i=s.data&&typeof s.data=="object"?s.data:s;Qr(a.fields,i);}}}function Us(r,e){if(!(!e||typeof e!="object")){for(let t of r)if(!(!t.name||!(t.name in e))){if(t.unique&&(t.type==="text"||t.type==="email"?e[t.name]=`${e[t.name]||t.name}-copy-${Date.now().toString(36)}`:delete e[t.name]),t.type==="tabs"&&t.name&&Array.isArray(t.tabs)&&e[t.name]&&typeof e[t.name]=="object")for(let s of t.tabs)Array.isArray(s.fields)&&Us(s.fields,e[t.name]);else if((t.type==="group"||t.type==="collapsible")&&t.name&&Array.isArray(t.fields)&&e[t.name]&&typeof e[t.name]=="object")Us(t.fields,e[t.name]);else if(t.type==="array"&&t.name&&Array.isArray(t.fields)&&Array.isArray(e[t.name]))for(let s of e[t.name])s&&typeof s=="object"&&(delete s.id,Us(t.fields,s));else if(t.type==="blocks"&&t.name&&Array.isArray(t.blocks)&&Array.isArray(e[t.name]))for(let s of e[t.name]){if(!s||typeof s!="object")continue;delete s.id;let n=s.type||s.blockType;if(!n)continue;let a=t.blocks.find(c=>c.slug===n);if(!a||!Array.isArray(a.fields))continue;let i=s.data&&typeof s.data=="object"?s.data:s;Us(a.fields,i);}}}}chunkBUNLC3II_cjs.h();function Xm(r){let{db:t,userLookup:s}=r;return async function(a){let i=chunkDUO523BH_cjs.f(a);if(i&&t){let d=await chunkDUO523BH_cjs.e(i,t,s);if(d.valid&&d.user)return {user:d.user,tenantContext:Zm(d.user),apiKeyContext:chunkDUO523BH_cjs.g(d),status:200,authType:"apikey"};if(d.error)return {status:401,error:d.error}}let c=chunkO4YE57OS_cjs.h(a);if(c)try{let d=await chunkO4YE57OS_cjs.n(c);if(!d.valid)return {status:401,error:d.reason||"Session invalid"};let g=await chunkO4YE57OS_cjs.t(a);if(g){let x=s?await s(g.userId):null;if(x)return {user:x,tenantContext:Zm(x),status:200,authType:"session"}}}catch(d){console.error("Session validation error:",d);}return {status:401,error:"Authentication required"}}}function Zm(r){return {tenantId:r.tenantId||"default",userId:r.id||"anonymous",role:r.role||"guest",roles:[r.role||"guest"],permissions:[],isSuperAdmin:r.role==="super_admin"}}chunkBUNLC3II_cjs.h();var bo=class{storage=new Map;userStorage=new Map;limits;userLimits;constructor(e,t){this.limits={...kw,...e},this.userLimits=t||{"user:api":{window:6e4,max:500},"user:write":{window:36e5,max:100}};}getKey(e,t){return `${e}:${t}`}getUserKey(e,t,s){return `user:${e}:${t}:${s}`}cleanupOldEntries(e,t){let n=Date.now()-t;for(;e.length>0&&e[0].timestamp<n;)e.shift();}async check(e,t){let s=this.limits[e]||this.limits["api:general"],n=this.getKey(e,t),a=this.storage.get(n);a||(a=[],this.storage.set(n,a)),this.cleanupOldEntries(a,s.window);let i=Date.now(),c=a.reduce((d,g)=>d+g.count,0);if(a.push({timestamp:i,count:1}),c>=s.max){let g=a.reduce((x,_)=>x.timestamp<_.timestamp?x:_,a[0]).timestamp+s.window;return {allowed:false,remaining:0,resetAt:g,retryAfter:Math.ceil((g-i)/1e3)}}return {allowed:true,remaining:s.max-c-1,resetAt:i+s.window}}async checkUser(e,t,s){let n=this.userLimits[e]||this.userLimits["user:api"],a=this.userStorage.get(t),i=[];a?i=a.get(this.getKey(e,s))||[]:(this.userStorage.has(t)||this.userStorage.set(t,new Map),this.userStorage.get(t).set(this.getKey(e,s),i)),this.cleanupOldEntries(i,n.window);let c=Date.now(),d=i.reduce((g,x)=>g+x.count,0);if(i.push({timestamp:c,count:1}),d>=n.max){let x=i.reduce((_,O)=>_.timestamp<O.timestamp?_:O,i[0]).timestamp+n.window;return {allowed:false,remaining:0,resetAt:x,retryAfter:Math.ceil((x-c)/1e3)}}return {allowed:true,remaining:n.max-d-1,resetAt:c+n.window}}async reset(e,t){let s=this.getKey(e,t);this.storage.delete(s);}async resetUser(e,t,s){let n=this.userStorage.get(t);if(n){let a=this.getKey(e,s);n.delete(a);}}async getStatus(e,t){let s=this.limits[e]||this.limits["api:general"],n=this.getKey(e,t),a=this.storage.get(n);a||(a=[],this.storage.set(n,a)),this.cleanupOldEntries(a,s.window);let i=Date.now(),c=a.reduce((d,g)=>d+g.count,0);return {count:c,limit:s.max,remaining:Math.max(0,s.max-c),resetAt:i+s.window}}setLimit(e,t){this.limits[e]=t;}setUserLimit(e,t){this.userLimits[e]=t;}},kw={"auth:login":{window:9e5,max:5},"auth:register":{window:36e5,max:3},"auth:forgot":{window:36e5,max:3},"auth:reset":{window:36e5,max:5},"auth:verify":{window:36e5,max:5},"api:general":{window:6e4,max:100},"api:authenticated":{window:6e4,max:200}};chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var Jc={retentionDays:30};var Jm=class{redis;prefix;retentionDays;constructor(e,t=30,s="kyro:audit:"){this.redis=e,this.prefix=s,this.retentionDays=t;}async log(e){let t=jB.randomBytes(16).toString("hex"),s=new Date,n={...e,id:t,timestamp:s},a=this.getKeyForDate(s),i=`${this.prefix}log:${t}`;await this.redis.hset(i,this.serializeLog(n)),await this.redis.expire(i,this.retentionDays*24*60*60+3600),await this.redis.zadd(a,s.getTime(),t),await this.redis.expire(a,this.retentionDays*24*60*60+3600);let c=e.userId?`${this.prefix}user:${e.userId}`:null;return c&&(await this.redis.zadd(c,s.getTime(),t),await this.redis.expire(c,this.retentionDays*24*60*60+3600)),t}async get(e){let t=`${this.prefix}log:${e}`,s=await this.redis.hgetall(t);return !s||Object.keys(s).length===0?null:this.deserializeLog(s)}async query(e={}){let{limit:t=50,offset:s=0}=e,n=[];if(e.userId)n.push(`${this.prefix}user:${e.userId}`);else if(e.startDate||e.endDate)n=this.getKeysForDateRange(e.startDate,e.endDate);else {let d=new Date;n=this.getKeysForDateRange(new Date(d.getTime()-this.retentionDays*24*60*60*1e3),d);}let a=[];for(let d of n){let g=await this.redis.zrange(d,0,-1,"WITHSCORES");for(let x=0;x<g.length;x+=2)a.push([g[x],parseInt(g[x+1],10)]);}a.sort((d,g)=>g[1]-d[1]);let i=a.length;a=a.slice(s,s+t);let c=[];for(let[d]of a){let g=await this.get(d);g&&this.matchesFilter(g,e)&&c.push(g);}return {logs:c,total:i}}async getRecent(e=50){let t=[],s=new Date,n=this.getKeysForDateRange(new Date(s.getTime()-10080*60*1e3),s),a=[];for(let i of n){let c=await this.redis.zrange(i,0,-1,"WITHSCORES");for(let d=0;d<c.length;d+=2)a.push([c[d],parseInt(c[d+1],10)]);}a.sort((i,c)=>c[1]-i[1]);for(let[i]of a.slice(0,e)){let c=await this.get(i);c&&t.push(c);}return t}async getUserActivity(e,t=50){let s=`${this.prefix}user:${e}`,n=await this.redis.zrange(s,0,t-1),a=[];for(let i of n){let c=await this.get(i);c&&a.push(c);}return a}async getStats(e,t){let s=this.getKeysForDateRange(e||new Date(Date.now()-2592e6),t||new Date),n={},a=0,i=0,c=0,d=new Set;for(let g of s){let x=await this.redis.zrange(g,0,-1);for(let _ of x){let O=await this.get(_);O&&(a++,n[O.action]=(n[O.action]||0)+1,O.success&&c++,O.action==="login_failed"&&i++,O.userId&&d.add(O.userId));}}return {totalEvents:a,byAction:n,successRate:a>0?c/a:1,failedLogins:i,uniqueUsers:d}}async cleanup(){let e=Date.now()-this.retentionDays*24*60*60*1e3,t=await this.redis.keys(`${this.prefix}date:*`),s=0;for(let n of t){let a=await this.redis.zrangebyscore(n,0,e);for(let i of a)await this.redis.del(`${this.prefix}log:${i}`),s++;await this.redis.zremrangebyscore(n,0,e);}return s}getKeyForDate(e){let t=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0");return `${this.prefix}date:${t}-${s}-${n}`}getKeysForDateRange(e,t){let s=[],n=e||new Date(Date.now()-this.retentionDays*24*60*60*1e3),a=t||new Date,i=new Date(n);for(;i<=a;)s.push(this.getKeyForDate(i)),i.setDate(i.getDate()+1);return s}matchesFilter(e,t){return !(t.action&&!(Array.isArray(t.action)?t.action:[t.action]).includes(e.action)||t.resource&&e.resource!==t.resource||t.resourceId&&e.resourceId!==t.resourceId||t.success!==void 0&&e.success!==t.success)}serializeLog(e){let t={id:e.id,timestamp:new Date(e.timestamp).toISOString(),action:e.action,resource:e.resource,success:e.success?"1":"0"};return e.userId&&(t.userId=e.userId),e.userEmail&&(t.userEmail=e.userEmail),e.role&&(t.role=e.role),e.resourceId&&(t.resourceId=e.resourceId),e.ipAddress&&(t.ipAddress=e.ipAddress),e.userAgent&&(t.userAgent=e.userAgent),e.error&&(t.error=e.error),e.changes&&(t.changes=JSON.stringify(e.changes)),e.metadata&&(t.metadata=JSON.stringify(e.metadata)),t}deserializeLog(e){return {id:e.id,timestamp:new Date(e.timestamp),action:e.action,userId:e.userId,userEmail:e.userEmail,role:e.role,resource:e.resource,resourceId:e.resourceId,ipAddress:e.ipAddress,userAgent:e.userAgent,success:e.success==="1",error:e.error,changes:e.changes?JSON.parse(e.changes):void 0,metadata:e.metadata?JSON.parse(e.metadata):void 0}}};function iU(r){return {ipAddress:r.headers.get("x-forwarded-for")?.split(",")[0]?.trim()||r.headers.get("x-real-ip")||"unknown",userAgent:r.headers.get("user-agent")||"unknown"}}var Qm=class{logs=[];retentionDays;constructor(e=Jc.retentionDays){this.retentionDays=e;}async log(e){let t=jB.randomBytes(16).toString("hex"),n={...e,id:t,timestamp:new Date};return this.logs.push(n),this.cleanupOldLogs(),t}async get(e){return this.logs.find(t=>t.id===e)||null}async query(e={}){let{limit:t=50,offset:s=0}=e,n=[...this.logs];if(e.userId&&(n=n.filter(g=>g.userId===e.userId)),e.action){let g=Array.isArray(e.action)?e.action:[e.action];n=n.filter(x=>g.includes(x.action));}e.resource&&(n=n.filter(g=>g.resource===e.resource)),e.resourceId&&(n=n.filter(g=>g.resourceId===e.resourceId)),e.success!==void 0&&(n=n.filter(g=>g.success===e.success));let a=e.startDate,i=e.endDate;a!==void 0&&(n=n.filter(g=>g.timestamp>=a)),i!==void 0&&(n=n.filter(g=>g.timestamp<=i)),n.sort((g,x)=>x.timestamp.getTime()-g.timestamp.getTime());let c=n.length;return {logs:n.slice(s,s+t),total:c}}async getRecent(e=50){let t=new Date(Date.now()-6048e5);return this.logs.filter(n=>n.timestamp>=t).sort((n,a)=>a.timestamp.getTime()-n.timestamp.getTime()).slice(0,e)}async getUserActivity(e,t=50){return this.logs.filter(n=>n.userId===e).sort((n,a)=>a.timestamp.getTime()-n.timestamp.getTime()).slice(0,t)}async getStats(e,t){let s=e||new Date(Date.now()-2592e6),n=t||new Date,a=this.logs.filter(_=>_.timestamp>=s&&_.timestamp<=n),i={},c=0,d=0,g=0,x=new Set;for(let _ of a){c++;let O=_.action;i[O]=(i[O]||0)+1,_.success&&g++,_.action==="login_failed"&&d++,_.userId&&x.add(_.userId);}return {totalEvents:c,byAction:i,successRate:c>0?g/c:1,failedLogins:d,uniqueUsers:x}}async cleanup(){let e=new Date(Date.now()-this.retentionDays*24*60*60*1e3),t=this.logs.length;return this.logs=this.logs.filter(s=>s.timestamp>=e),t-this.logs.length}cleanupOldLogs(){let e=new Date(Date.now()-this.retentionDays*24*60*60*1e3);this.logs.length;this.logs=this.logs.filter(s=>s.timestamp>=e);}};var vo=class{authAdapter;email;passwordPolicy;lockout;rateLimiter;auditLogger;baseUrl;emailVerificationRequired;jwtSecret;constructor(e){this.authAdapter=e.redis,this.email=e.email,this.passwordPolicy=e.passwordPolicy||new chunkVKXWJOWI_cjs.r,this.lockout=e.lockout,this.rateLimiter=e.rateLimiter,this.auditLogger=e.auditLogger,this.baseUrl=e.baseUrl||"http://localhost:4321",this.emailVerificationRequired=e.emailVerificationRequired??true,this.jwtSecret=e.jwtSecret||"kyro-default-secret-key-change-me-in-production";}getBaseUrl(e){if(e)try{let t=e.headers.get("x-forwarded-proto")||(e.url.startsWith("https")?"https":"http"),s=e.headers.get("x-forwarded-host")||e.headers.get("host");return s?`${t}://${s}`:new URL(e.url).origin}catch{}return process.env.KYRO_BASE_URL||process.env.SERVER_URL||process.env.PUBLIC_URL||process.env.SITE_URL||this.baseUrl||"http://localhost:4321"}async register(e){let{ipAddress:t,userAgent:s}=chunkMVX2PYJJ_cjs.a(e);if(this.rateLimiter){let n=await this.rateLimiter.check("auth:register",t);if(!n.allowed)return this.rateLimitResponse(n)}try{let n=await e.json();if(!n.email||!n.password)return this.errorResponse("Email and password are required",400);if(n.password!==n.confirmPassword)return this.errorResponse("Passwords do not match",400);let a=this.passwordPolicy.validate(n.password);if(!a.valid)return this.errorResponse(a.errors.join(". "),400);let i=await this.authAdapter.findUserByEmail(n.email);if(i){if(!i.emailVerified&&this.emailVerificationRequired&&this.email){let g=(await this.authAdapter.createEmailVerificationToken?.(i.id))?.token||jB.randomBytes(32).toString("hex"),_=`${this.getBaseUrl(e)}/admin/auth/verify-email?token=${g}`,O=this.email.getTemplates().verifyEmail(_,n.email);return await this.email.send({to:n.email,...O}),this.jsonResponse({success:!0,message:"An unverified account already exists with this email. We have resent the confirmation link to your inbox.",requiresVerification:!0},200)}return this.errorResponse("Email already registered",400)}let c=await this.authAdapter.createUser({email:n.email,password:n.password,role:n.role||"customer",tenantId:n.tenantId});if(this.emailVerificationRequired&&this.email){let d=jB.randomBytes(32).toString("hex"),x=`${this.getBaseUrl(e)}/admin/auth/verify-email?token=${d}`;await this.authAdapter.createSession(c.id,{ipAddress:t,userAgent:s});let _=this.email.getTemplates().verifyEmail(x,n.email);await this.email.send({to:n.email,..._});}return this.auditLogger&&await this.auditLogger.log({action:"register",userId:c.id,userEmail:c.email,resource:"auth",ipAddress:t,userAgent:s,success:!0}),this.jsonResponse({success:!0,message:"Registration successful",user:this.sanitizeUser(c),requiresVerification:this.emailVerificationRequired&&!!this.email},201)}catch(n){return console.error("[AuthRoutes.register] Registration error:",n),this.errorResponse("Registration failed",500)}}async login(e){let{ipAddress:t,userAgent:s}=chunkMVX2PYJJ_cjs.a(e);if(this.rateLimiter){let n=await this.rateLimiter.check("auth:login",t);if(!n.allowed)return this.rateLimitResponse(n)}try{let n=await e.json();if(!n.email||!n.password)return this.errorResponse("Email and password are required",400);let a=await this.authAdapter.findUserByEmail(n.email);if(!a)return await this.recordFailedLogin(t,s),this.errorResponse("Invalid credentials",401);if(a.locked)return this.auditLogger&&await this.auditLogger.log({action:"login_failed",userId:a.id,userEmail:a.email,resource:"auth",ipAddress:t,userAgent:s,success:!1,error:"Account locked"}),this.errorResponse("Account locked. Contact an administrator.",403);if(this.lockout){let x=await this.lockout.checkLockout(a.id);if(x.locked)return this.auditLogger&&await this.auditLogger.log({action:"login_failed",userId:a.id,userEmail:a.email,resource:"auth",ipAddress:t,userAgent:s,success:!1,error:"Account locked"}),this.errorResponse(`Account locked. Try again in ${Math.ceil((x.lockedUntil.getTime()-Date.now())/6e4)} minutes`,423)}let i=await this.authAdapter.verifyPassword(n.email,n.password);if(!i)return await this.recordFailedLogin(t,s,a.id,a.email),this.errorResponse("Invalid credentials",401);if(this.emailVerificationRequired&&i.emailVerified===!1){if(this.email){let _=(await this.authAdapter.createEmailVerificationToken?.(i.id))?.token||jB.randomBytes(32).toString("hex"),H=`${this.getBaseUrl(e)}/admin/auth/verify-email?token=${_}`,U=this.email.getTemplates().verifyEmail(H,i.email);await this.email.send({to:i.email,...U});}return this.errorResponse("Your email address is not verified yet. We have sent a new confirmation link to your email inbox.",403)}this.lockout&&await this.lockout.resetAttempts(a.id),this.auditLogger&&await this.auditLogger.log({action:"login",userId:a.id,userEmail:a.email,role:a.role,resource:"auth",ipAddress:t,userAgent:s,success:!0}),await this.authAdapter.updateUser(a.id,{lastLogin:new Date().toISOString()});let c=await chunkO4YE57OS_cjs.l({id:a.id,email:a.email,role:a.role,tenantId:a.tenantId});if(this.email&&a.email){let x=new Date().toLocaleString(),_=this.email.getTemplates().newLogin(t,x,a.email);this.email.send({to:a.email,..._}).catch(O=>console.error("Failed to send newLogin email:",O));}let d={success:!0,user:this.sanitizeUser(a)},g=this.jsonResponse(d);return chunkO4YE57OS_cjs.j(g,c)}catch(n){return console.error("[Auth] Login error:",n),this.errorResponse("Login failed",500)}}async logout(e){let t=chunkO4YE57OS_cjs.h(e);if(!t)return this.errorResponse("No session to logout",401);let{ipAddress:s,userAgent:n}=chunkMVX2PYJJ_cjs.a(e);try{let a=await chunkO4YE57OS_cjs.t(e);a&&(await chunkO4YE57OS_cjs.p(t),this.auditLogger&&await this.auditLogger.log({action:"logout",userId:a.userId,userEmail:a.email,resource:"auth",ipAddress:s,userAgent:n,success:!0}));let i=this.jsonResponse({success:!0,message:"Logged out successfully"});return chunkO4YE57OS_cjs.k(i)}catch{return this.errorResponse("Logout failed",500)}}async refresh(e){try{let t=chunkO4YE57OS_cjs.h(e);if(!t)return this.errorResponse("Not authenticated",401);let s=await chunkO4YE57OS_cjs.o(t,e);return s?this.jsonResponse({success:!0,expiresAt:s.expiresAt}):this.errorResponse("Session not found",404)}catch(t){return console.error("[Auth] Session refresh error:",t),this.errorResponse("Session refresh failed",500)}}async me(e){let t=await chunkO4YE57OS_cjs.t(e);return t?this.jsonResponse({success:true,user:{id:t.userId,email:t.email,role:t.role,tenantId:t.tenantId}}):this.errorResponse("Not authenticated",401)}async changePassword(e){let t=await chunkO4YE57OS_cjs.t(e);if(!t)return this.errorResponse("Not authenticated",401);let{ipAddress:s,userAgent:n}=chunkMVX2PYJJ_cjs.a(e);try{let a=await e.json(),{currentPassword:i,newPassword:c,confirmPassword:d}=a;if(!i||!c)return this.errorResponse("Current and new password required",400);if(c!==d)return this.errorResponse("Passwords do not match",400);let g=this.passwordPolicy.validate(c);if(!g.valid)return this.errorResponse(g.errors.join(". "),400);let x=await this.authAdapter.findUserById(t.userId);if(!x)return this.errorResponse("User not found",404);if(!(x.passwordHash?await this.authAdapter.verifyPassword(i,x.passwordHash):!1))return this.errorResponse("Current password is incorrect",401);let O=await this.authAdapter.getPasswordHistory?.(x.id,5);if(await this.authAdapter.isPasswordInHistory?.(c,x.id,5))return this.errorResponse("Password was recently used. Please choose a different password",400);let U=await this.authAdapter.hashPassword(c);if(x.passwordHash&&await this.authAdapter.addPasswordToHistory?.(x.id,x.passwordHash),await this.authAdapter.updateUser(x.id,{passwordHash:U}),await this.authAdapter.deleteUserSessions(x.id),this.email&&this.email.getTemplates){let F=this.email.getTemplates().passwordChanged(x.email);await this.email.send({to:x.email,...F});}return this.auditLogger&&await this.auditLogger.log({action:"password_change",userId:x.id,userEmail:x.email,resource:"auth",ipAddress:s,userAgent:n,success:!0}),this.jsonResponse({success:!0,message:"Password changed successfully"})}catch{return this.errorResponse("Password change failed",500)}}async forgotPassword(e){let{ipAddress:t,userAgent:s}=chunkMVX2PYJJ_cjs.a(e);if(this.rateLimiter){let n=await this.rateLimiter.check("auth:forgot",t);if(!n.allowed)return this.rateLimitResponse(n)}try{let n=await e.json(),{email:a}=n;if(!a)return this.errorResponse("Email required",400);let i=await this.authAdapter.findUserByEmail(a);if(!i)return this.jsonResponse({success:!0,message:"If the email exists, a reset link has been sent"});if(this.email){let c=jB.randomBytes(32).toString("hex");if(this.authAdapter.createPasswordResetToken){let _=await this.authAdapter.createPasswordResetToken(i.email);_.token&&(c=_.token);}let g=`${this.getBaseUrl(e)}/admin/auth/reset-password?token=${c}`,x=this.email.getTemplates().resetPassword(g,i.email);await this.email.send({to:i.email,...x});}return this.auditLogger&&await this.auditLogger.log({action:"password_reset",userId:i.id,userEmail:i.email,resource:"auth",ipAddress:t,userAgent:s,success:!0}),this.jsonResponse({success:!0,message:"If the email exists, a reset link has been sent"})}catch{return this.errorResponse("Password reset request failed",500)}}async resetPassword(e){let{ipAddress:t,userAgent:s}=chunkMVX2PYJJ_cjs.a(e);if(this.rateLimiter){let n=await this.rateLimiter.check("auth:reset",t);if(!n.allowed)return this.rateLimitResponse(n)}try{let n=await e.json(),{token:a,newPassword:i,confirmPassword:c}=n;if(!a||!i)return this.errorResponse("Reset token and new password are required",400);if(i!==c)return this.errorResponse("Passwords do not match",400);let d=this.passwordPolicy.validate(i);if(!d.valid)return this.errorResponse(d.errors.join(". "),400);if(this.authAdapter.resetPasswordWithToken){let g=await this.authAdapter.resetPasswordWithToken(a,i);if(!g.success)return this.errorResponse(g.error||"Password reset failed or token expired",400)}return this.jsonResponse({success:!0,message:"Password reset successful. You can now log in with your new password."})}catch(n){return console.error("[AuthRoutes.resetPassword] Error:",n),this.errorResponse("Password reset failed",500)}}async verifyEmail(e){let s=new URL(e.url).searchParams.get("token");if(!s)return this.errorResponse("Verification token required",400);try{if(this.authAdapter.verifyEmailToken){let n=await this.authAdapter.verifyEmailToken(s);if(!n.success)return this.errorResponse(n.error||"Invalid or expired verification token",400);if(n.userId&&this.email){let a=await this.authAdapter.findUserById(n.userId);if(a){let i=this.email.getTemplates().welcome(a.email);await this.email.send({to:a.email,...i});}}}return this.jsonResponse({success:!0,message:"Email address verified successfully"})}catch(n){return console.error("[AuthRoutes.verifyEmail] Error:",n),this.errorResponse("Email verification failed",500)}}async recordFailedLogin(e,t,s,n){if(this.lockout){let a=await this.lockout.recordFailedAttempt(s||e);if(a.locked&&a.totalAttempts===this.lockout.getConfig().maxAttempts&&this.email&&n){let i=Math.ceil(this.lockout.getConfig().lockDuration/6e4),c=this.email.getTemplates().accountLocked(a.totalAttempts,i,n);this.email.send({to:n,...c}).catch(d=>console.error("Failed to send accountLocked email:",d));}}this.auditLogger&&await this.auditLogger.log({action:"login_failed",userId:s,userEmail:n,resource:"auth",ipAddress:e,userAgent:t,success:false,error:"Invalid credentials"});}sanitizeUser(e){let{passwordHash:t,...s}=e;return s}jsonResponse(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json","Cache-Control":"no-store, no-cache, must-revalidate, max-age=0"}})}async listSessions(e){let t=await chunkO4YE57OS_cjs.t(e);if(!t)return this.errorResponse("Not authenticated",401);try{let s=await chunkO4YE57OS_cjs.r(t.userId,chunkO4YE57OS_cjs.h(e)??void 0);return this.jsonResponse({sessions:s})}catch(s){return console.error("[AuthRoutes.listSessions] Error:",s),this.errorResponse("Failed to list sessions",500)}}async revokeSession(e,t){let s=await chunkO4YE57OS_cjs.t(e);if(!s)return this.errorResponse("Not authenticated",401);try{let a=(await chunkO4YE57OS_cjs.r(s.userId)).find(i=>i.id===t);return a?a.currentSession?this.errorResponse("Cannot revoke current session",400):(await chunkO4YE57OS_cjs.p(t),this.jsonResponse({success:!0,message:"Session revoked"})):this.errorResponse("Session not found",404)}catch(n){return console.error("[AuthRoutes.revokeSession] Error:",n),this.errorResponse("Failed to revoke session",500)}}async revokeOtherSessions(e){let t=await chunkO4YE57OS_cjs.t(e);if(!t)return this.errorResponse("Not authenticated",401);try{let s=await chunkO4YE57OS_cjs.r(t.userId),n=chunkO4YE57OS_cjs.h(e);for(let a of s)a.currentSession||await chunkO4YE57OS_cjs.p(a.id);return this.jsonResponse({success:!0,message:"Other sessions revoked"})}catch(s){return console.error("[AuthRoutes.revokeOtherSessions] Error:",s),this.errorResponse("Failed to revoke sessions",500)}}async renameSession(e,t){let s=await chunkO4YE57OS_cjs.t(e);if(!s)return this.errorResponse("Not authenticated",401);try{if(!(await chunkO4YE57OS_cjs.r(s.userId)).find(d=>d.id===t))return this.errorResponse("Session not found",404);let i=await e.json(),{name:c}=i;return !c||typeof c!="string"||c.trim().length===0?this.errorResponse("Invalid session name",400):(await chunkO4YE57OS_cjs.s(t,c.trim()),this.jsonResponse({success:!0,message:"Session renamed"}))}catch(n){return console.error("[AuthRoutes.renameSession] Error:",n),this.errorResponse("Failed to rename session",500)}}async refreshSession(e){let t=chunkO4YE57OS_cjs.h(e);if(!t)return this.errorResponse("No session",401);try{let{refreshSession:s}=await import('./auth-session-DHVGXHOH.cjs'),n=await s(t,e);return n?this.jsonResponse({success:!0,expiresAt:n.expiresAt}):this.errorResponse("Session not found",404)}catch(s){return console.error("[AuthRoutes.refreshSession] Error:",s),this.errorResponse("Failed to refresh session",500)}}errorResponse(e,t){return new Response(JSON.stringify({success:false,error:e}),{status:t,headers:{"Content-Type":"application/json"}})}async rateLimitResponse(e){return new Response(JSON.stringify({error:"Too many requests. Please try again later."}),{status:429,headers:{"Content-Type":"application/json",...e.retryAfter?{"Retry-After":e.retryAfter.toString()}:{}}})}async requestMagicLink(e){let{ipAddress:t,userAgent:s}=chunkMVX2PYJJ_cjs.a(e);try{let n=await e.json();if(!n.email)return this.errorResponse("Email required",400);let a=await this.authAdapter.findUserByEmail(n.email);if(!a)return this.jsonResponse({success:!0,message:"If an account exists, a link was sent."});if(this.email){let i=Buffer.from(JSON.stringify({email:a.email,exp:Date.now()+6e5})).toString("base64url"),c=jB.createHmac("sha256",this.jwtSecret).update(i).digest("hex"),d=`${i}.${c}`,x=`${this.getBaseUrl(e)}/admin/auth/magic-link?token=${d}`,_=this.email.getTemplates().magicLink(x,void 0,a.email);this.email.send({to:a.email,..._}).catch(O=>console.error("Magic link err:",O));}return this.jsonResponse({success:!0,message:"If an account exists, a link was sent."})}catch{return this.errorResponse("Failed to process request",500)}}async verifyMagicLink(e){let{ipAddress:t,userAgent:s}=chunkMVX2PYJJ_cjs.a(e),a=new URL(e.url).searchParams.get("token");if(!a)return this.errorResponse("Token required",400);try{let[i,c]=a.split(".");if(!i||!c)return this.errorResponse("Invalid token",400);let d=jB.createHmac("sha256",this.jwtSecret).update(i).digest("hex");if(c!==d)return this.errorResponse("Invalid token",400);let g=JSON.parse(Buffer.from(i,"base64url").toString());if(Date.now()>g.exp)return this.errorResponse("Token expired",400);let x=await this.authAdapter.findUserByEmail(g.email);if(!x)return this.errorResponse("User not found",404);if(x.locked)return this.errorResponse("Account locked",403);let _=await chunkO4YE57OS_cjs.l({id:x.id,email:x.email,role:x.role,tenantId:x.tenantId});this.auditLogger&&await this.auditLogger.log({action:"login",userId:x.id,userEmail:x.email,resource:"auth",ipAddress:t,userAgent:s,success:!0});let O=this.jsonResponse({success:!0,user:this.sanitizeUser(x)});return chunkO4YE57OS_cjs.j(O,_)}catch{return this.errorResponse("Invalid token",400)}}async inviteUser(e){try{let t=await e.json();if(!t.email||!t.role)return this.errorResponse("Email and role required",400);let s=await this.authAdapter.findUserByEmail(t.email);if(s)return this.errorResponse("User already exists",409);if(s=await this.authAdapter.createUser({email:t.email,password:jB.randomBytes(16).toString("hex"),role:t.role}),this.email){let n=await this.authAdapter.createPasswordResetToken(s.email),i=`${this.getBaseUrl(e)}/admin/auth/reset-password?token=${n.token}`,c=this.email.getTemplates().userInvite(i,t.role,t.inviterName||"An administrator");this.email.send({to:s.email,...c}).catch(d=>console.error("Invite email err:",d));}return this.jsonResponse({success:!0,message:"User invited successfully"})}catch{return this.errorResponse("Failed to invite user",500)}}};chunkBUNLC3II_cjs.h();var Qc=chunkBUNLC3II_cjs.e(chunkHTYVI2HK_cjs.a(),1);var So=class{db;sessionTTL;constructor(e){this.db=e.db?.client||e.db,this.sessionTTL=e.sessionTTL||86400;}async executeSql(e,t=[]){try{if(this.db&&typeof this.db.prepare=="function"){let s=this.db.prepare(e);return (await(t.length>0?s.bind(...t):s).all()).results||[]}else if(this.db&&typeof this.db.run=="function"){let s=await this.db.run(chunkVRZC4TTF_cjs.J.raw(this.replaceParams(e,t)));return s.rows||s.results||(Array.isArray(s)?s:[])}else if(this.db&&typeof this.db.all=="function"){let s=await this.db.all(chunkVRZC4TTF_cjs.J.raw(this.replaceParams(e,t)));return Array.isArray(s)?s:s.results||[]}else if(this.db&&typeof this.db.execute=="function"){let s=await this.db.execute(chunkVRZC4TTF_cjs.J.raw(this.replaceParams(e,t)));return s.rows||s.results||(Array.isArray(s)?s:[])}}catch(s){console.warn("[D1AuthAdapter] SQL execution note:",s.message);}return []}async getOne(e,t=[]){try{if(this.db&&typeof this.db.prepare=="function"){let n=this.db.prepare(e);return await(t.length>0?n.bind(...t):n).first()||null}}catch{}let s=await this.executeSql(e,t);return s.length>0?s[0]:null}replaceParams(e,t){let s=0;return e.replace(/\?/g,()=>{let n=t[s++];return n==null?"NULL":typeof n=="number"||typeof n=="boolean"?String(n):`'${String(n).replace(/'/g,"''")}'`})}async connect(){await this.executeSql(`
|
|
1
|
+
'use strict';var chunkXTTGHN3D_cjs=require('./chunk-XTTGHN3D.cjs'),chunkBHR7OAU4_cjs=require('./chunk-BHR7OAU4.cjs'),chunkO4YE57OS_cjs=require('./chunk-O4YE57OS.cjs'),chunk35PGCW3S_cjs=require('./chunk-35PGCW3S.cjs'),chunkUNYXWPLZ_cjs=require('./chunk-UNYXWPLZ.cjs'),chunkPITMDQYN_cjs=require('./chunk-PITMDQYN.cjs'),chunkGIS6X43A_cjs=require('./chunk-GIS6X43A.cjs'),chunkLEBM6ZSZ_cjs=require('./chunk-LEBM6ZSZ.cjs'),chunkGNEVCEJU_cjs=require('./chunk-GNEVCEJU.cjs'),chunkZO3YB5DK_cjs=require('./chunk-ZO3YB5DK.cjs'),chunk3VXEK5ZW_cjs=require('./chunk-3VXEK5ZW.cjs'),chunkEZIDQBXI_cjs=require('./chunk-EZIDQBXI.cjs'),chunkLQ3YZTPU_cjs=require('./chunk-LQ3YZTPU.cjs'),chunkMVX2PYJJ_cjs=require('./chunk-MVX2PYJJ.cjs'),chunkAK754S3T_cjs=require('./chunk-AK754S3T.cjs'),chunkDUO523BH_cjs=require('./chunk-DUO523BH.cjs'),chunkTDGSIF5H_cjs=require('./chunk-TDGSIF5H.cjs'),chunkXBQ6HV3T_cjs=require('./chunk-XBQ6HV3T.cjs'),chunkVRZC4TTF_cjs=require('./chunk-VRZC4TTF.cjs'),chunk7DUKWHRN_cjs=require('./chunk-7DUKWHRN.cjs'),chunkHTYVI2HK_cjs=require('./chunk-HTYVI2HK.cjs'),chunkZOVH6QT5_cjs=require('./chunk-ZOVH6QT5.cjs'),chunk7WMMKGEO_cjs=require('./chunk-7WMMKGEO.cjs'),chunkBUNLC3II_cjs=require('./chunk-BUNLC3II.cjs'),jB=require('crypto'),ko=require('path'),fs$1=require('fs'),promises=require('fs/promises'),$w=require('process'),stream=require('stream');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var jB__default=/*#__PURE__*/_interopDefault(jB);var ko__default=/*#__PURE__*/_interopDefault(ko);var $w__default=/*#__PURE__*/_interopDefault($w);chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var Ec=(r,e,t)=>(s,n)=>{let a=-1;return i(0);async function i(c){if(c<=a)throw new Error("next() called multiple times");a=c;let d,g=false,x;if(r[c]?(x=r[c][0][0],s.req.routeIndex=c):x=c===r.length&&n||void 0,x)try{d=await x(s,()=>i(c+1));}catch(_){if(_ instanceof Error&&e)s.error=_,d=await e(_,s),g=true;else throw _}else s.finalized===false&&t&&(d=await t(s));return d&&(s.finalized===false||g)&&(s.res=d),s}};chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var nm=Symbol();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var am=(r,e)=>new Response(r,{headers:{"Content-Type":e.replace(/^[^;]+/,s=>s.toLowerCase())}}).formData();var co=r=>"headers"in r,im=async(r,e=Object.create(null))=>{let{all:t=false,dot:s=false}=e,i=(co(r)?r.headers:r.raw.headers).get("Content-Type")?.split(";")[0].trim().toLowerCase();return i==="multipart/form-data"||i==="application/x-www-form-urlencoded"?ew(r,{all:t,dot:s}):{}};async function ew(r,e){if(!co(r)&&r.bodyCache.formData)return om(await r.bodyCache.formData,e);let t=co(r)?r.headers:r.raw.headers,s=await r.arrayBuffer(),n=am(s,t.get("Content-Type")||"");co(r)||(r.bodyCache.formData=n);let a=await n;return a?om(a,e):{}}function om(r,e){let t=Object.create(null);return r.forEach((s,n)=>{e.all||n.endsWith("[]")?tw(t,n,s):t[n]=s;}),e.dot&&Object.entries(t).forEach(([s,n])=>{s.includes(".")&&(rw(t,s,n),delete t[s]);}),t}var tw=(r,e,t)=>{r[e]!==void 0?Array.isArray(r[e])?r[e].push(t):r[e]=[r[e],t]:e.endsWith("[]")?r[e]=[t]:r[e]=t;},rw=(r,e,t)=>{if(/(?:^|\.)__proto__\./.test(e))return;let s=r,n=e.split(".");n.forEach((a,i)=>{i===n.length-1?s[a]=t:((!s[a]||typeof s[a]!="object"||Array.isArray(s[a])||s[a]instanceof File)&&(s[a]=Object.create(null)),s=s[a]);});};chunkBUNLC3II_cjs.h();var Oc=r=>{let e=r.split("/");return e[0]===""&&e.shift(),e},cm=r=>{let{groups:e,path:t}=sw(r),s=Oc(t);return nw(s,e)},sw=r=>{let e=[];return r=r.replace(/\{[^}]+\}/g,(t,s)=>{let n=`@${s}`;return e.push([n,t]),n}),{groups:e,path:r}},nw=(r,e)=>{for(let t=e.length-1;t>=0;t--){let[s]=e[t];for(let n=r.length-1;n>=0;n--)if(r[n].includes(s)){r[n]=r[n].replace(s,e[t][1]);break}}return r},uo={},um=(r,e)=>{if(r==="*")return "*";let t=r.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);if(t){let s=`${r}#${e}`;return uo[s]||(t[2]?uo[s]=e&&e[0]!==":"&&e[0]!=="*"?[s,t[1],new RegExp(`^${t[2]}(?=/${e})`)]:[r,t[1],new RegExp(`^${t[2]}$`)]:uo[s]=[r,t[1],true]),uo[s]}return null},Xn=(r,e)=>{try{return e(r)}catch{return r.replace(/(?:%[0-9A-Fa-f]{2})+/g,t=>{try{return e(t)}catch{return t}})}},aw=r=>Xn(r,decodeURI),Pc=r=>{let e=r.url,t=e.indexOf("/",e.indexOf(":")+4),s=t;for(;s<e.length;s++){let n=e.charCodeAt(s);if(n===37){let a=e.indexOf("?",s),i=e.indexOf("#",s),c=a===-1?i===-1?void 0:i:i===-1?a:Math.min(a,i),d=e.slice(t,c);return aw(d.includes("%25")?d.replace(/%25/g,"%2525"):d)}else if(n===63||n===35)break}return e.slice(t,s)};var lm=r=>{let e=Pc(r);return e.length>1&&e.at(-1)==="/"?e.slice(0,-1):e},Xr=(r,e,...t)=>(t.length&&(e=Xr(e,...t)),`${r?.[0]==="/"?"":"/"}${r}${e==="/"?"":`${r?.at(-1)==="/"?"":"/"}${e?.[0]==="/"?e.slice(1):e}`}`),lo=r=>{if(r.charCodeAt(r.length-1)!==63||!r.includes(":"))return null;let e=r.split("/"),t=[],s="";return e.forEach(n=>{if(n!==""&&!/\:/.test(n))s+="/"+n;else if(/\:/.test(n))if(/\?/.test(n)){t.length===0&&s===""?t.push("/"):t.push(s);let a=n.replace("?","");s+="/"+a,t.push(s);}else s+="/"+n;}),t.filter((n,a,i)=>i.indexOf(n)===a)},Tc=r=>/[%+]/.test(r)?(r.indexOf("+")!==-1&&(r=r.replace(/\+/g," ")),r.indexOf("%")!==-1?Xn(r,po):r):r,dm=(r,e,t)=>{let s;if(!t&&e&&!/[%+]/.test(e)){let i=r.indexOf("?",8);if(i===-1)return;for(r.startsWith(e,i+1)||(i=r.indexOf(`&${e}`,i+1));i!==-1;){let c=r.charCodeAt(i+e.length+1);if(c===61){let d=i+e.length+2,g=r.indexOf("&",d);return Tc(r.slice(d,g===-1?void 0:g))}else if(c==38||isNaN(c))return "";i=r.indexOf(`&${e}`,i+1);}if(s=/[%+]/.test(r),!s)return}let n={};s??=/[%+]/.test(r);let a=r.indexOf("?",8);for(;a!==-1;){let i=r.indexOf("&",a+1),c=r.indexOf("=",a);c>i&&i!==-1&&(c=-1);let d=r.slice(a+1,c===-1?i===-1?void 0:i:c);if(s&&(d=Tc(d)),a=i,d==="")continue;let g;c===-1?g="":(g=r.slice(c+1,i===-1?void 0:i),s&&(g=Tc(g))),t?(n[d]&&Array.isArray(n[d])||(n[d]=[]),n[d].push(g)):n[d]??=g;}return e?n[e]:n},pm=dm,mm=(r,e)=>dm(r,e,true),po=decodeURIComponent;var fm=r=>Xn(r,po),hm=class{raw;#t;#e;routeIndex=0;path;bodyCache={};constructor(r,e="/",t=[[]]){this.raw=r,this.path=e,this.#e=t,this.#t={};}param(r){return r?this.#r(r):this.#a()}#r(r){let e=this.#e[0][this.routeIndex][1][r],t=this.#n(e);return t&&/\%/.test(t)?fm(t):t}#a(){let r={},e=Object.keys(this.#e[0][this.routeIndex][1]);for(let t of e){let s=this.#n(this.#e[0][this.routeIndex][1][t]);s!==void 0&&(r[t]=/\%/.test(s)?fm(s):s);}return r}#n(r){return this.#e[1]?this.#e[1][r]:r}query(r){return pm(this.url,r)}queries(r){return mm(this.url,r)}header(r){if(r)return this.raw.headers.get(r)??void 0;let e={};return this.raw.headers.forEach((t,s)=>{e[s]=t;}),e}async parseBody(r){return im(this,r)}#s=r=>{let{bodyCache:e,raw:t}=this,s=e[r];if(s)return s;let n=Object.keys(e)[0];return n?e[n].then(a=>(n==="json"&&(a=JSON.stringify(a)),new Response(a)[r]())):e[r]=t[r]()};json(){return this.#s("text").then(r=>JSON.parse(r))}text(){return this.#s("text")}arrayBuffer(){return this.#s("arrayBuffer")}bytes(){return this.#s("arrayBuffer").then(r=>new Uint8Array(r))}blob(){return this.#s("blob")}formData(){return this.#s("formData")}addValidatedData(r,e){this.#t[r]=e;}valid(r){return this.#t[r]}get url(){return this.raw.url}get method(){return this.raw.method}get[nm](){return this.#e}get matchedRoutes(){return this.#e[0].map(([[,r]])=>r)}get routePath(){return this.#e[0].map(([[,r]])=>r)[this.routeIndex].path}};chunkBUNLC3II_cjs.h();var gm={Stringify:1},iw=(r,e)=>{let t=new String(r);return t.isEscaped=true,t.callbacks=e,t};var Ic=async(r,e,t,s,n)=>{typeof r=="object"&&!(r instanceof String)&&(r instanceof Promise||(r=r.toString()),r instanceof Promise&&(r=await r));let a=r.callbacks;if(!a?.length)return Promise.resolve(r);n?n[0]+=r:n=[r];let i=Promise.all(a.map(c=>c({phase:e,buffer:n,context:s}))).then(c=>Promise.all(c.filter(Boolean).map(d=>Ic(d,e,false,s,n))).then(()=>n[0]));return t?iw(await i,a):i};var cw="text/plain; charset=UTF-8",Dc=(r,e)=>({"Content-Type":r,...e}),Jn=(r,e)=>new Response(r,e),Lc=class{#t;#e;env={};#r;finalized=false;error;#a;#n;#s;#l;#c;#u;#i;#d;#p;constructor(r,e){this.#t=r,e&&(this.#n=e.executionCtx,this.env=e.env,this.#u=e.notFoundHandler,this.#p=e.path,this.#d=e.matchResult);}get req(){return this.#e??=new hm(this.#t,this.#p,this.#d),this.#e}get event(){if(this.#n&&"respondWith"in this.#n)return this.#n;throw Error("This context has no FetchEvent")}get executionCtx(){if(this.#n)return this.#n;throw Error("This context has no ExecutionContext")}get res(){return this.#s||=Jn(null,{headers:this.#i??=new Headers})}set res(r){if(this.#s&&r){r=Jn(r.body,r);for(let[e,t]of this.#s.headers.entries())if(e!=="content-type")if(e==="set-cookie"){let s=this.#s.headers.getSetCookie();r.headers.delete("set-cookie");for(let n of s)r.headers.append("set-cookie",n);}else r.headers.set(e,t);}this.#s=r,this.finalized=true;}render=(...r)=>(this.#c??=e=>this.html(e),this.#c(...r));setLayout=r=>this.#l=r;getLayout=()=>this.#l;setRenderer=r=>{this.#c=r;};header=(r,e,t)=>{this.finalized&&(this.#s=Jn(this.#s.body,this.#s));let s=this.#s?this.#s.headers:this.#i??=new Headers;e===void 0?s.delete(r):t?.append?s.append(r,e):s.set(r,e);};status=r=>{this.#a=r;};set=(r,e)=>{this.#r??=new Map,this.#r.set(r,e);};get=r=>this.#r?this.#r.get(r):void 0;get var(){return this.#r?Object.fromEntries(this.#r):{}}#o(r,e,t){let s=this.#s?new Headers(this.#s.headers):this.#i??new Headers;if(typeof e=="object"&&"headers"in e){let a=e.headers instanceof Headers?e.headers:new Headers(e.headers);for(let[i,c]of a)i.toLowerCase()==="set-cookie"?s.append(i,c):s.set(i,c);}if(t)for(let[a,i]of Object.entries(t))if(typeof i=="string")s.set(a,i);else {s.delete(a);for(let c of i)s.append(a,c);}let n=typeof e=="number"?e:e?.status??this.#a;return Jn(r,{status:n,headers:s})}newResponse=(...r)=>this.#o(...r);body=(r,e,t)=>this.#o(r,e,t);text=(r,e,t)=>!this.#i&&!this.#a&&!e&&!t&&!this.finalized?new Response(r):this.#o(r,e,Dc(cw,t));json=(r,e,t)=>this.#o(JSON.stringify(r),e,Dc("application/json",t));html=(r,e,t)=>{let s=n=>this.#o(n,e,Dc("text/html; charset=UTF-8",t));return typeof r=="object"?Ic(r,gm.Stringify,false,{}).then(s):s(r)};redirect=(r,e)=>{let t=String(r);return this.header("Location",/[^\x00-\xFF]/.test(t)?encodeURI(t):t),this.newResponse(null,e??302)};notFound=()=>(this.#u??=()=>Jn(),this.#u(this))};chunkBUNLC3II_cjs.h();var De="ALL",ym="all",xm=["get","post","put","delete","options","patch"],mo="Can not add a route since the matcher is already built.",fo=class extends Error{};chunkBUNLC3II_cjs.h();var _m="__COMPOSED_HANDLER";var uw=r=>r.text("404 Not Found",404),wm=(r,e)=>{if("getResponse"in r){let t=r.getResponse();return e.newResponse(t.body,t)}return console.error(r),e.text("Internal Server Error",500)},bm=class vm{get;post;put;delete;options;patch;all;on;use;router;getPath;_basePath="/";#t="/";routes=[];constructor(e={}){[...xm,ym].forEach(a=>{this[a]=(i,...c)=>(typeof i=="string"?this.#t=i:this.#a(a,this.#t,i),c.forEach(d=>{this.#a(a,this.#t,d);}),this);}),this.on=(a,i,...c)=>{for(let d of [i].flat()){this.#t=d;for(let g of [a].flat())c.map(x=>{this.#a(g.toUpperCase(),this.#t,x);});}return this},this.use=(a,...i)=>(typeof a=="string"?this.#t=a:(this.#t="*",i.unshift(a)),i.forEach(c=>{this.#a(De,this.#t,c);}),this);let{strict:s,...n}=e;Object.assign(this,n),this.getPath=s??true?e.getPath??Pc:lm;}#e(){let e=new vm({router:this.router,getPath:this.getPath});return e.errorHandler=this.errorHandler,e.#r=this.#r,e.routes=this.routes,e}#r=uw;errorHandler=wm;route(e,t){let s=this.basePath(e);return t.routes.map(n=>{let a;t.errorHandler===wm?a=n.handler:(a=async(i,c)=>(await Ec([],t.errorHandler)(i,()=>n.handler(i,c))).res,a[_m]=n.handler),s.#a(n.method,n.path,a,n.basePath);}),this}basePath(e){let t=this.#e();return t._basePath=Xr(this._basePath,e),t}onError=e=>(this.errorHandler=e,this);notFound=e=>(this.#r=e,this);mount(e,t,s){let n,a;s&&(typeof s=="function"?a=s:(a=s.optionHandler,s.replaceRequest===false?n=d=>d:n=s.replaceRequest));let i=a?d=>{let g=a(d);return Array.isArray(g)?g:[g]}:d=>{let g;try{g=d.executionCtx;}catch{}return [d.env,g]};n||=(()=>{let d=Xr(this._basePath,e),g=d==="/"?0:d.length;return x=>{let _=new URL(x.url);return _.pathname=this.getPath(x).slice(g)||"/",new Request(_,x)}})();let c=async(d,g)=>{let x=await t(n(d.req.raw),...i(d));if(x)return x;await g();};return this.#a(De,Xr(e,"*"),c),this}#a(e,t,s,n){e=e.toUpperCase(),t=Xr(this._basePath,t);let a={basePath:n!==void 0?Xr(this._basePath,n):this._basePath,path:t,method:e,handler:s};this.router.add(e,t,[s,a]),this.routes.push(a);}#n(e,t){if(e instanceof Error)return this.errorHandler(e,t);throw e}#s(e,t,s,n){if(n==="HEAD")return (async()=>new Response(null,await this.#s(e,t,s,"GET")))();let a=this.getPath(e,{env:s}),i=this.router.match(n,a),c=new Lc(e,{path:a,matchResult:i,env:s,executionCtx:t,notFoundHandler:this.#r});if(i[0].length===1){let g;try{g=i[0][0][0][0](c,async()=>{c.res=await this.#r(c);});}catch(x){return this.#n(x,c)}return g instanceof Promise?g.then(x=>x||(c.finalized?c.res:this.#r(c))).catch(x=>this.#n(x,c)):g??this.#r(c)}let d=Ec(i[0],this.errorHandler,this.#r);return (async()=>{try{let g=await d(c);if(!g.finalized)throw new Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return g.res}catch(g){return this.#n(g,c)}})()}fetch=(e,...t)=>this.#s(e,t[1],t[0],e.method);request=(e,t,s,n)=>e instanceof Request?this.fetch(t?new Request(e,t):e,s,n):(e=e.toString(),this.fetch(new Request(/^https?:\/\//.test(e)?e:`http://localhost${Xr("/",e)}`,t),s,n));fire=()=>{addEventListener("fetch",e=>{e.respondWith(this.#s(e.request,e,void 0,e.request.method));});}};chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var ho=[];function $c(r,e){let t=this.buildAllMatchers(),s=((n,a)=>{let i=t[n]||t[De],c=i[2][a];if(c)return c;let d=a.match(i[0]);if(!d)return [[],ho];let g=d.indexOf("",1);return [i[1][g],d]});return this.match=s,s(r,e)}chunkBUNLC3II_cjs.h();var go="[^/]+",Qn=".*",Yn="(?:|/.*)",ds=Symbol(),lw=new Set(".\\+*[^]$()");function dw(r,e){return r.length===1?e.length===1?r<e?-1:1:-1:e.length===1||r===Qn||r===Yn?1:e===Qn||e===Yn?-1:r===go?1:e===go?-1:r.length===e.length?r<e?-1:1:e.length-r.length}var Sm=class Bc{#t;#e;#r=Object.create(null);insert(e,t,s,n,a){if(e.length===0){if(this.#t!==void 0)throw ds;if(a)return;this.#t=t;return}let[i,...c]=e,d=i==="*"?c.length===0?["","",Qn]:["","",go]:i==="/*"?["","",Yn]:i.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),g;if(d){let x=d[1],_=d[2]||go;if(x&&d[2]&&(_===".*"||(_=_.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(_))))throw ds;if(g=this.#r[_],!g){if(Object.keys(this.#r).some(O=>O!==Qn&&O!==Yn))throw ds;if(a)return;g=this.#r[_]=new Bc,x!==""&&(g.#e=n.varIndex++);}!a&&x!==""&&s.push([x,g.#e]);}else if(g=this.#r[i],!g){if(Object.keys(this.#r).some(x=>x.length>1&&x!==Qn&&x!==Yn))throw ds;if(a)return;g=this.#r[i]=new Bc;}g.insert(c,t,s,n,a);}buildRegExpStr(){let t=Object.keys(this.#r).sort(dw).map(s=>{let n=this.#r[s];return (typeof n.#e=="number"?`(${s})@${n.#e}`:lw.has(s)?`\\${s}`:s)+n.buildRegExpStr()});return typeof this.#t=="number"&&t.unshift(`#${this.#t}`),t.length===0?"":t.length===1?t[0]:"(?:"+t.join("|")+")"}};chunkBUNLC3II_cjs.h();var Am=class{#t={varIndex:0};#e=new Sm;insert(r,e,t){let s=[],n=[];for(let i=0;;){let c=false;if(r=r.replace(/\{[^}]+\}/g,d=>{let g=`@\\${i}`;return n[i]=[g,d],i++,c=true,g}),!c)break}let a=r.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let i=n.length-1;i>=0;i--){let[c]=n[i];for(let d=a.length-1;d>=0;d--)if(a[d].indexOf(c)!==-1){a[d]=a[d].replace(c,n[i][1]);break}}return this.#e.insert(a,e,s,this.#t,t),s}buildRegExp(){let r=this.#e.buildRegExpStr();if(r==="")return [/^$/,[],[]];let e=0,t=[],s=[];return r=r.replace(/#(\d+)|@(\d+)|\.\*\$/g,(n,a,i)=>a!==void 0?(t[++e]=Number(a),"$()"):(i!==void 0&&(s[Number(i)]=++e),"")),[new RegExp(`^${r}`),t,s]}};var pw=[/^$/,[],Object.create(null)],Rm=Object.create(null);function km(r){return Rm[r]??=new RegExp(r==="*"?"":`^${r.replace(/\/\*$|([.\\+*[^\]$()])/g,(e,t)=>t?`\\${t}`:"(?:|/.*)")}$`)}function mw(){Rm=Object.create(null);}function fw(r){let e=new Am,t=[];if(r.length===0)return pw;let s=r.map(g=>[!/\*|\/:/.test(g[0]),...g]).sort(([g,x],[_,O])=>g?1:_?-1:x.length-O.length),n=Object.create(null);for(let g=0,x=-1,_=s.length;g<_;g++){let[O,H,U]=s[g];O?n[H]=[U.map(([ce])=>[ce,Object.create(null)]),ho]:x++;let F;try{F=e.insert(H,x,O);}catch(ce){throw ce===ds?new fo(H):ce}O||(t[x]=U.map(([ce,re])=>{let Oe=Object.create(null);for(re-=1;re>=0;re--){let[W,vt]=F[re];Oe[W]=vt;}return [ce,Oe]}));}let[a,i,c]=e.buildRegExp();for(let g=0,x=t.length;g<x;g++)for(let _=0,O=t[g].length;_<O;_++){let H=t[g][_]?.[1];if(!H)continue;let U=Object.keys(H);for(let F=0,ce=U.length;F<ce;F++)H[U[F]]=c[H[U[F]]];}let d=[];for(let g in i)d[g]=t[i[g]];return [a,d,n]}function Ns(r,e){if(r){for(let t of Object.keys(r).sort((s,n)=>n.length-s.length))if(km(t).test(e))return [...r[t]]}}var yo=class{name="RegExpRouter";#t;#e;constructor(){this.#t={[De]:Object.create(null)},this.#e={[De]:Object.create(null)};}add(r,e,t){let s=this.#t,n=this.#e;if(!s||!n)throw new Error(mo);s[r]||[s,n].forEach(c=>{c[r]=Object.create(null),Object.keys(c[De]).forEach(d=>{c[r][d]=[...c[De][d]];});}),e==="/*"&&(e="*");let a=(e.match(/\/:/g)||[]).length;if(/\*$/.test(e)){let c=km(e);r===De?Object.keys(s).forEach(d=>{s[d][e]||=Ns(s[d],e)||Ns(s[De],e)||[];}):s[r][e]||=Ns(s[r],e)||Ns(s[De],e)||[],Object.keys(s).forEach(d=>{(r===De||r===d)&&Object.keys(s[d]).forEach(g=>{c.test(g)&&s[d][g].push([t,a]);});}),Object.keys(n).forEach(d=>{(r===De||r===d)&&Object.keys(n[d]).forEach(g=>c.test(g)&&n[d][g].push([t,a]));});return}let i=lo(e)||[e];for(let c=0,d=i.length;c<d;c++){let g=i[c];Object.keys(n).forEach(x=>{(r===De||r===x)&&(n[x][g]||=[...Ns(s[x],g)||Ns(s[De],g)||[]],n[x][g].push([t,a-d+c+1]));});}}match=$c;buildAllMatchers(){let r=Object.create(null);return Object.keys(this.#e).concat(Object.keys(this.#t)).forEach(e=>{r[e]||=this.#r(e);}),this.#t=this.#e=void 0,mw(),r}#r(r){let e=[],t=r===De;return [this.#t,this.#e].forEach(s=>{let n=s[r]?Object.keys(s[r]).map(a=>[a,s[r][a]]):[];n.length!==0?(t||=true,e.push(...n)):r!==De&&e.push(...Object.keys(s[De]).map(a=>[a,s[De][a]]));}),t?fw(e):null}};chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var jc=class{name="SmartRouter";#t=[];#e=[];constructor(r){this.#t=r.routers;}add(r,e,t){if(!this.#e)throw new Error(mo);this.#e.push([r,e,t]);}match(r,e){if(!this.#e)throw new Error("Fatal error");let t=this.#t,s=this.#e,n=t.length,a=0,i;for(;a<n;a++){let c=t[a];try{for(let d=0,g=s.length;d<g;d++)c.add(...s[d]);i=c.match(r,e);}catch(d){if(d instanceof fo)continue;throw d}this.match=c.match.bind(c),this.#t=[c],this.#e=void 0;break}if(a===n)throw new Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,i}get activeRouter(){if(this.#e||this.#t.length!==1)throw new Error("No active router has been determined yet.");return this.#t[0]}};chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var ea=Object.create(null),hw=r=>{for(let e in r)return true;return false},Cm=class Em{#t;#e;#r;#a=0;#n=ea;constructor(e,t,s){if(this.#e=s||Object.create(null),this.#t=[],e&&t){let n=Object.create(null);n[e]={handler:t,possibleKeys:[],score:0},this.#t=[n];}this.#r=[];}insert(e,t,s){this.#a=++this.#a;let n=this,a=cm(t),i=[];for(let c=0,d=a.length;c<d;c++){let g=a[c],x=a[c+1],_=um(g,x),O=Array.isArray(_)?_[0]:g;if(O in n.#e){n=n.#e[O],_&&i.push(_[1]);continue}n.#e[O]=new Em,_&&(n.#r.push(_),i.push(_[1])),n=n.#e[O];}return n.#t.push({[e]:{handler:s,possibleKeys:i.filter((c,d,g)=>g.indexOf(c)===d),score:this.#a}}),n}#s(e,t,s,n,a){for(let i=0,c=t.#t.length;i<c;i++){let d=t.#t[i],g=d[s]||d[De],x={};if(g!==void 0&&(g.params=Object.create(null),e.push(g),n!==ea||a&&a!==ea))for(let _=0,O=g.possibleKeys.length;_<O;_++){let H=g.possibleKeys[_],U=x[g.score];g.params[H]=a?.[H]&&!U?a[H]:n[H]??a?.[H],x[g.score]=true;}}}search(e,t){let s=[];this.#n=ea;let a=[this],i=Oc(t),c=[],d=i.length,g=null;for(let x=0;x<d;x++){let _=i[x],O=x===d-1,H=[];for(let F=0,ce=a.length;F<ce;F++){let re=a[F],Oe=re.#e[_];Oe&&(Oe.#n=re.#n,O?(Oe.#e["*"]&&this.#s(s,Oe.#e["*"],e,re.#n),this.#s(s,Oe,e,re.#n)):H.push(Oe));for(let W=0,vt=re.#r.length;W<vt;W++){let We=re.#r[W],q=re.#n===ea?{}:{...re.#n};if(We==="*"){let pr=re.#e["*"];pr&&(this.#s(s,pr,e,re.#n),pr.#n=q,H.push(pr));continue}let[Dt,ls,Ir]=We;if(!_&&!(Ir instanceof RegExp))continue;let Fe=re.#e[Dt];if(Ir instanceof RegExp){if(g===null){g=new Array(d);let er=t[0]==="/"?1:0;for(let _e=0;_e<d;_e++)g[_e]=er,er+=i[_e].length+1;}let pr=t.substring(g[x]),mr=Ir.exec(pr);if(mr){if(q[ls]=mr[0],this.#s(s,Fe,e,re.#n,q),mr[0].length===pr.length&&Fe.#e["*"]&&this.#s(s,Fe.#e["*"],e,re.#n,q),hw(Fe.#e)){Fe.#n=q;let er=mr[0].match(/\//)?.length??0;(c[er]||=[]).push(Fe);}continue}}(Ir===true||Ir.test(_))&&(q[ls]=_,O?(this.#s(s,Fe,e,q,re.#n),Fe.#e["*"]&&this.#s(s,Fe.#e["*"],e,q,re.#n)):(Fe.#n=q,H.push(Fe)));}}let U=c.shift();a=U?H.concat(U):H;}return s.length>1&&s.sort((x,_)=>x.score-_.score),[s.map(({handler:x,params:_})=>[x,_])]}};var Nc=class{name="TrieRouter";#t;constructor(){this.#t=new Cm;}add(r,e,t){let s=lo(e);if(s){for(let n=0,a=s.length;n<a;n++)this.#t.insert(r,s[n],t);return}this.#t.insert(r,e,t);}match(r,e){return this.#t.search(r,e)}};var Mc=class extends bm{constructor(r={}){super(r),this.router=r.router??new jc({routers:[new yo,new Nc]});}};chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var Uc=r=>Fc(r.replace(/_|-/g,e=>({_:"/","-":"+"})[e]??e)),qc=r=>gw(r).replace(/\/|\+/g,e=>({"/":"_","+":"-"})[e]??e),gw=r=>{let e="",t=new Uint8Array(r);for(let s=0,n=t.length;s<n;s++)e+=String.fromCharCode(t[s]);return btoa(e)},Fc=r=>{let e=atob(r),t=new Uint8Array(new ArrayBuffer(e.length)),s=e.length/2;for(let n=0,a=e.length-1;n<=s;n++,a--)t[n]=e.charCodeAt(n),t[a]=e.charCodeAt(a);return t};chunkBUNLC3II_cjs.h();var ps=(r=>(r.HS256="HS256",r.HS384="HS384",r.HS512="HS512",r.RS256="RS256",r.RS384="RS384",r.RS512="RS512",r.PS256="PS256",r.PS384="PS384",r.PS512="PS512",r.ES256="ES256",r.ES384="ES384",r.ES512="ES512",r.EdDSA="EdDSA",r))(ps||{});chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var yw={deno:"Deno",bun:"Bun",workerd:"Cloudflare-Workers",node:"Node.js"},Tm=()=>{let r=globalThis;if(typeof navigator<"u"&&typeof navigator.userAgent=="string"){for(let[t,s]of Object.entries(yw))if(xw(s))return t}return typeof r?.EdgeRuntime=="string"?"edge-light":r?.fastly!==void 0?"fastly":r?.process?.release?.name==="node"?"node":"other"},xw=r=>navigator.userAgent.startsWith(r);chunkBUNLC3II_cjs.h();var Om=class extends Error{constructor(r){super(`${r} is not an implemented algorithm`),this.name="JwtAlgorithmNotImplemented";}},Hc=class extends Error{constructor(){super('JWT verification requires "alg" option to be specified'),this.name="JwtAlgorithmRequired";}},Gc=class extends Error{constructor(r,e){super(`JWT algorithm mismatch: expected "${r}", got "${e}"`),this.name="JwtAlgorithmMismatch";}},ms=class extends Error{constructor(r){super(`invalid JWT token: ${r}`),this.name="JwtTokenInvalid";}},Pm=class extends Error{constructor(r){super(`token (${r}) is being used before it's valid`),this.name="JwtTokenNotBefore";}},Im=class extends Error{constructor(r){super(`token (${r}) expired`),this.name="JwtTokenExpired";}},Dm=class extends Error{constructor(r,e){super(`Invalid "iat" claim, must be a valid number lower than "${r}" (iat: "${e}")`),this.name="JwtTokenIssuedAt";}},xo=class extends Error{constructor(r,e){super(`expected issuer "${r}", got ${e?`"${e}"`:"none"} `),this.name="JwtTokenIssuer";}},zc=class extends Error{constructor(r){super(`jwt header is invalid: ${JSON.stringify(r)}`),this.name="JwtHeaderInvalid";}},jm=class extends Error{constructor(r){super(`token(${r}) signature mismatched`),this.name="JwtTokenSignatureMismatched";}},Nm=class extends Error{constructor(r){super(`required "aud" in jwt payload: ${JSON.stringify(r)}`),this.name="JwtPayloadRequiresAud";}},Mm=class extends Error{constructor(r,e){super(`expected audience "${Array.isArray(r)?r.join(", "):r}", got "${e}"`),this.name="JwtTokenAudience";}},Ms=(r=>(r.Encrypt="encrypt",r.Decrypt="decrypt",r.Sign="sign",r.Verify="verify",r.DeriveKey="deriveKey",r.DeriveBits="deriveBits",r.WrapKey="wrapKey",r.UnwrapKey="unwrapKey",r))(Ms||{});chunkBUNLC3II_cjs.h();var fs=new TextEncoder,Um=new TextDecoder;async function Fm(r,e,t){let s=Gm(e),n=await _w(r,s);return await crypto.subtle.sign(s,n,t)}async function Hm(r,e,t,s){let n=Gm(e),a=await ww(r,n);return await crypto.subtle.verify(n,a,t,s)}function Kc(r){return Fc(r.replace(/-+(BEGIN|END).*?-+/g,"").replace(/\s/g,""))}async function _w(r,e){if(!crypto.subtle||!crypto.subtle.importKey)throw new Error("`crypto.subtle.importKey` is undefined. JWT auth middleware requires it.");if(zm(r)){if(r.type!=="private"&&r.type!=="secret")throw new Error(`unexpected key type: CryptoKey.type is ${r.type}, expected private or secret`);return r}let t=[Ms.Sign];return typeof r=="object"?await crypto.subtle.importKey("jwk",r,e,false,t):r.includes("PRIVATE")?await crypto.subtle.importKey("pkcs8",Kc(r),e,false,t):await crypto.subtle.importKey("raw",fs.encode(r),e,false,t)}async function ww(r,e){if(!crypto.subtle||!crypto.subtle.importKey)throw new Error("`crypto.subtle.importKey` is undefined. JWT auth middleware requires it.");if(zm(r)){if(r.type==="public"||r.type==="secret")return r;r=await qm(r);}if(typeof r=="string"&&r.includes("PRIVATE")){let s=await crypto.subtle.importKey("pkcs8",Kc(r),e,true,[Ms.Sign]);r=await qm(s);}let t=[Ms.Verify];return typeof r=="object"?await crypto.subtle.importKey("jwk",r,e,false,t):r.includes("PUBLIC")?await crypto.subtle.importKey("spki",Kc(r),e,false,t):await crypto.subtle.importKey("raw",fs.encode(r),e,false,t)}async function qm(r){if(r.type!=="private")throw new Error(`unexpected key type: ${r.type}`);if(!r.extractable)throw new Error("unexpected private key is unextractable");let e=await crypto.subtle.exportKey("jwk",r),{kty:t}=e,{alg:s,e:n,n:a}=e,{crv:i,x:c,y:d}=e;return {kty:t,alg:s,e:n,n:a,crv:i,x:c,y:d,key_ops:[Ms.Verify]}}function Gm(r){switch(r){case "HS256":return {name:"HMAC",hash:{name:"SHA-256"}};case "HS384":return {name:"HMAC",hash:{name:"SHA-384"}};case "HS512":return {name:"HMAC",hash:{name:"SHA-512"}};case "RS256":return {name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}};case "RS384":return {name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-384"}};case "RS512":return {name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-512"}};case "PS256":return {name:"RSA-PSS",hash:{name:"SHA-256"},saltLength:32};case "PS384":return {name:"RSA-PSS",hash:{name:"SHA-384"},saltLength:48};case "PS512":return {name:"RSA-PSS",hash:{name:"SHA-512"},saltLength:64};case "ES256":return {name:"ECDSA",hash:{name:"SHA-256"},namedCurve:"P-256"};case "ES384":return {name:"ECDSA",hash:{name:"SHA-384"},namedCurve:"P-384"};case "ES512":return {name:"ECDSA",hash:{name:"SHA-512"},namedCurve:"P-521"};case "EdDSA":return {name:"Ed25519",namedCurve:"Ed25519"};default:throw new Om(r)}}function zm(r){return Tm()==="node"&&crypto.webcrypto?r instanceof crypto.webcrypto.CryptoKey:r instanceof CryptoKey}var Vc=r=>qc(fs.encode(JSON.stringify(r)).buffer).replace(/=/g,""),bw=r=>qc(r).replace(/=/g,""),Wc=r=>JSON.parse(Um.decode(Uc(r)));function Km(r){if(typeof r=="object"&&r!==null){let e=r;return "alg"in e&&Object.values(ps).includes(e.alg)&&(!("typ"in e)||e.typ==="JWT")}return false}var Vm=async(r,e,t="HS256")=>{let s=Vc(r),n;typeof e=="object"&&"alg"in e?(t=e.alg,n=Vc({alg:t,typ:"JWT",kid:e.kid})):n=Vc({alg:t,typ:"JWT"});let a=`${n}.${s}`,i=await Fm(e,t,fs.encode(a)),c=bw(i);return `${a}.${c}`},Zc=async(r,e,t)=>{if(!t)throw new Hc;let{alg:s,iss:n,nbf:a=true,exp:i=true,iat:c=true,aud:d}=typeof t=="string"?{alg:t}:t;if(!s)throw new Hc;let g=r.split(".");if(g.length!==3)throw new ms(r);let{header:x,payload:_}=Xc(r);if(!Km(x))throw new zc(x);if(x.alg!==s)throw new Gc(s,x.alg);let O=Math.floor(Date.now()/1e3);if(a&&_.nbf!==void 0&&(typeof _.nbf!="number"||!Number.isFinite(_.nbf)||_.nbf>O))throw new Pm(r);if(i&&_.exp!==void 0&&(typeof _.exp!="number"||!Number.isFinite(_.exp)||_.exp<=O))throw new Im(r);if(c&&_.iat!==void 0&&(typeof _.iat!="number"||!Number.isFinite(_.iat)||O<_.iat))throw new Dm(O,_.iat);if(n){if(!_.iss)throw new xo(n,null);if(typeof n=="string"&&_.iss!==n)throw new xo(n,_.iss);if(n instanceof RegExp&&!n.test(_.iss))throw new xo(n,_.iss)}if(d){if(!_.aud)throw new Nm(_);if(!(Array.isArray(_.aud)?_.aud:[_.aud]).some(re=>d instanceof RegExp?d.test(re):typeof d=="string"?re===d:Array.isArray(d)&&d.includes(re)))throw new Mm(d,_.aud)}let H=r.substring(0,r.lastIndexOf("."));if(!await Hm(e,s,Uc(g[2]),fs.encode(H)))throw new jm(r);return _};[ps.HS256,ps.HS384,ps.HS512];var Xc=r=>{let e=r.split(".");if(e.length!==3)throw new ms(r);try{let t=Wc(e[0]),s=Wc(e[1]);return {header:t,payload:s}}catch{throw new ms(r)}};var ta={sign:Vm,verify:Zc};var _o=ta.verify,wo=ta.sign;chunkBUNLC3II_cjs.h();function hs(r,e){for(let t of r){if(t.name===e)return t;if(t.type==="group"||t.type==="array"){let s=hs(t.fields||[],e);if(s)return s}if(t.type==="blocks")for(let s of t.blocks||[]){let n=hs(s.fields||[],e);if(n)return n}if(t.type==="tabs")for(let s of t.tabs||[]){let n=hs(s.fields||[],e);if(n)return n}if(t.type==="collapsible"||t.type==="row"){let s=hs(t.fields||[],e);if(s)return s}}return null}function ra(r){return r.map(e=>`${e.path.join(".")}: ${e.message}`).join(", ")}function Jr(r,e){if(!(!r||typeof r!="object"))for(let t of e){if(t.type==="tabs"&&Array.isArray(t.tabs)){let n=t.name?r[t.name]:r;if(n&&typeof n=="object")for(let a of t.tabs)Array.isArray(a.fields)&&Jr(n,a.fields);continue}if(!t.name||!(t.name in r))continue;if(r[t.name]===""&&(t.type==="text"||t.type==="textarea"||t.type==="code"||t.type==="markdown"||(r[t.name]=null)),(t.type==="group"||t.type==="collapsible")&&t.name&&Array.isArray(t.fields)&&r[t.name]&&typeof r[t.name]=="object")Jr(r[t.name],t.fields);else if(t.type==="array"&&t.name&&Array.isArray(t.fields)&&Array.isArray(r[t.name]))for(let n of r[t.name])n&&typeof n=="object"&&Jr(n,t.fields);else if(t.type==="blocks"&&t.name&&Array.isArray(t.blocks)&&Array.isArray(r[t.name]))for(let n of r[t.name]){if(!n||typeof n!="object")continue;let a=n.type||n.blockType;if(!a)continue;let i=t.blocks.find(d=>d.slug===a);if(!i||!Array.isArray(i.fields))continue;let c=n.data&&typeof n.data=="object"?n.data:n;Jr(c,i.fields);}}}function Qr(r,e){if(!(!e||typeof e!="object"))for(let t of r){if(t.type==="tabs"&&Array.isArray(t.tabs)){let s=t.name?e[t.name]:e;if(s&&typeof s=="object")for(let n of t.tabs)Array.isArray(n.fields)&&Qr(n.fields,s);}if(t.type==="richtext"&&t.name){let s=e[t.name];typeof s=="string"?e[t.name]=[{type:"paragraph",children:[{text:s}]}]:s&&typeof s=="object"&&!Array.isArray(s)&&s.type==="doc"&&Array.isArray(s.content)&&(e[t.name]=s.content);}if((t.type==="group"||t.type==="collapsible")&&t.name&&Array.isArray(t.fields)&&e[t.name]&&typeof e[t.name]=="object")Qr(t.fields,e[t.name]);else if(t.type==="array"&&t.name&&Array.isArray(t.fields)&&Array.isArray(e[t.name]))for(let s of e[t.name])s&&typeof s=="object"&&Qr(t.fields,s);else if(t.type==="blocks"&&t.name&&Array.isArray(t.blocks)&&Array.isArray(e[t.name]))for(let s of e[t.name]){if(!s||typeof s!="object")continue;let n=s.type||s.blockType;if(!n)continue;let a=t.blocks.find(c=>c.slug===n);if(!a||!Array.isArray(a.fields))continue;let i=s.data&&typeof s.data=="object"?s.data:s;Qr(a.fields,i);}}}function Us(r,e){if(!(!e||typeof e!="object")){for(let t of r)if(!(!t.name||!(t.name in e))){if(t.unique&&(t.type==="text"||t.type==="email"?e[t.name]=`${e[t.name]||t.name}-copy-${Date.now().toString(36)}`:delete e[t.name]),t.type==="tabs"&&t.name&&Array.isArray(t.tabs)&&e[t.name]&&typeof e[t.name]=="object")for(let s of t.tabs)Array.isArray(s.fields)&&Us(s.fields,e[t.name]);else if((t.type==="group"||t.type==="collapsible")&&t.name&&Array.isArray(t.fields)&&e[t.name]&&typeof e[t.name]=="object")Us(t.fields,e[t.name]);else if(t.type==="array"&&t.name&&Array.isArray(t.fields)&&Array.isArray(e[t.name]))for(let s of e[t.name])s&&typeof s=="object"&&(delete s.id,Us(t.fields,s));else if(t.type==="blocks"&&t.name&&Array.isArray(t.blocks)&&Array.isArray(e[t.name]))for(let s of e[t.name]){if(!s||typeof s!="object")continue;delete s.id;let n=s.type||s.blockType;if(!n)continue;let a=t.blocks.find(c=>c.slug===n);if(!a||!Array.isArray(a.fields))continue;let i=s.data&&typeof s.data=="object"?s.data:s;Us(a.fields,i);}}}}chunkBUNLC3II_cjs.h();function Xm(r){let{db:t,userLookup:s}=r;return async function(a){let i=chunkDUO523BH_cjs.f(a);if(i&&t){let d=await chunkDUO523BH_cjs.e(i,t,s);if(d.valid&&d.user)return {user:d.user,tenantContext:Zm(d.user),apiKeyContext:chunkDUO523BH_cjs.g(d),status:200,authType:"apikey"};if(d.error)return {status:401,error:d.error}}let c=chunkO4YE57OS_cjs.h(a);if(c)try{let d=await chunkO4YE57OS_cjs.n(c);if(!d.valid)return {status:401,error:d.reason||"Session invalid"};let g=await chunkO4YE57OS_cjs.t(a);if(g){let x=s?await s(g.userId):null;if(x)return {user:x,tenantContext:Zm(x),status:200,authType:"session"}}}catch(d){console.error("Session validation error:",d);}return {status:401,error:"Authentication required"}}}function Zm(r){return {tenantId:r.tenantId||"default",userId:r.id||"anonymous",role:r.role||"guest",roles:[r.role||"guest"],permissions:[],isSuperAdmin:r.role==="super_admin"}}chunkBUNLC3II_cjs.h();var bo=class{storage=new Map;userStorage=new Map;limits;userLimits;constructor(e,t){this.limits={...kw,...e},this.userLimits=t||{"user:api":{window:6e4,max:500},"user:write":{window:36e5,max:100}};}getKey(e,t){return `${e}:${t}`}getUserKey(e,t,s){return `user:${e}:${t}:${s}`}cleanupOldEntries(e,t){let n=Date.now()-t;for(;e.length>0&&e[0].timestamp<n;)e.shift();}async check(e,t){let s=this.limits[e]||this.limits["api:general"],n=this.getKey(e,t),a=this.storage.get(n);a||(a=[],this.storage.set(n,a)),this.cleanupOldEntries(a,s.window);let i=Date.now(),c=a.reduce((d,g)=>d+g.count,0);if(a.push({timestamp:i,count:1}),c>=s.max){let g=a.reduce((x,_)=>x.timestamp<_.timestamp?x:_,a[0]).timestamp+s.window;return {allowed:false,remaining:0,resetAt:g,retryAfter:Math.ceil((g-i)/1e3)}}return {allowed:true,remaining:s.max-c-1,resetAt:i+s.window}}async checkUser(e,t,s){let n=this.userLimits[e]||this.userLimits["user:api"],a=this.userStorage.get(t),i=[];a?i=a.get(this.getKey(e,s))||[]:(this.userStorage.has(t)||this.userStorage.set(t,new Map),this.userStorage.get(t).set(this.getKey(e,s),i)),this.cleanupOldEntries(i,n.window);let c=Date.now(),d=i.reduce((g,x)=>g+x.count,0);if(i.push({timestamp:c,count:1}),d>=n.max){let x=i.reduce((_,O)=>_.timestamp<O.timestamp?_:O,i[0]).timestamp+n.window;return {allowed:false,remaining:0,resetAt:x,retryAfter:Math.ceil((x-c)/1e3)}}return {allowed:true,remaining:n.max-d-1,resetAt:c+n.window}}async reset(e,t){let s=this.getKey(e,t);this.storage.delete(s);}async resetUser(e,t,s){let n=this.userStorage.get(t);if(n){let a=this.getKey(e,s);n.delete(a);}}async getStatus(e,t){let s=this.limits[e]||this.limits["api:general"],n=this.getKey(e,t),a=this.storage.get(n);a||(a=[],this.storage.set(n,a)),this.cleanupOldEntries(a,s.window);let i=Date.now(),c=a.reduce((d,g)=>d+g.count,0);return {count:c,limit:s.max,remaining:Math.max(0,s.max-c),resetAt:i+s.window}}setLimit(e,t){this.limits[e]=t;}setUserLimit(e,t){this.userLimits[e]=t;}},kw={"auth:login":{window:9e5,max:5},"auth:register":{window:36e5,max:3},"auth:forgot":{window:36e5,max:3},"auth:reset":{window:36e5,max:5},"auth:verify":{window:36e5,max:5},"api:general":{window:6e4,max:100},"api:authenticated":{window:6e4,max:200}};chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var Jc={retentionDays:30};var Jm=class{redis;prefix;retentionDays;constructor(e,t=30,s="kyro:audit:"){this.redis=e,this.prefix=s,this.retentionDays=t;}async log(e){let t=jB.randomBytes(16).toString("hex"),s=new Date,n={...e,id:t,timestamp:s},a=this.getKeyForDate(s),i=`${this.prefix}log:${t}`;await this.redis.hset(i,this.serializeLog(n)),await this.redis.expire(i,this.retentionDays*24*60*60+3600),await this.redis.zadd(a,s.getTime(),t),await this.redis.expire(a,this.retentionDays*24*60*60+3600);let c=e.userId?`${this.prefix}user:${e.userId}`:null;return c&&(await this.redis.zadd(c,s.getTime(),t),await this.redis.expire(c,this.retentionDays*24*60*60+3600)),t}async get(e){let t=`${this.prefix}log:${e}`,s=await this.redis.hgetall(t);return !s||Object.keys(s).length===0?null:this.deserializeLog(s)}async query(e={}){let{limit:t=50,offset:s=0}=e,n=[];if(e.userId)n.push(`${this.prefix}user:${e.userId}`);else if(e.startDate||e.endDate)n=this.getKeysForDateRange(e.startDate,e.endDate);else {let d=new Date;n=this.getKeysForDateRange(new Date(d.getTime()-this.retentionDays*24*60*60*1e3),d);}let a=[];for(let d of n){let g=await this.redis.zrange(d,0,-1,"WITHSCORES");for(let x=0;x<g.length;x+=2)a.push([g[x],parseInt(g[x+1],10)]);}a.sort((d,g)=>g[1]-d[1]);let i=a.length;a=a.slice(s,s+t);let c=[];for(let[d]of a){let g=await this.get(d);g&&this.matchesFilter(g,e)&&c.push(g);}return {logs:c,total:i}}async getRecent(e=50){let t=[],s=new Date,n=this.getKeysForDateRange(new Date(s.getTime()-10080*60*1e3),s),a=[];for(let i of n){let c=await this.redis.zrange(i,0,-1,"WITHSCORES");for(let d=0;d<c.length;d+=2)a.push([c[d],parseInt(c[d+1],10)]);}a.sort((i,c)=>c[1]-i[1]);for(let[i]of a.slice(0,e)){let c=await this.get(i);c&&t.push(c);}return t}async getUserActivity(e,t=50){let s=`${this.prefix}user:${e}`,n=await this.redis.zrange(s,0,t-1),a=[];for(let i of n){let c=await this.get(i);c&&a.push(c);}return a}async getStats(e,t){let s=this.getKeysForDateRange(e||new Date(Date.now()-2592e6),t||new Date),n={},a=0,i=0,c=0,d=new Set;for(let g of s){let x=await this.redis.zrange(g,0,-1);for(let _ of x){let O=await this.get(_);O&&(a++,n[O.action]=(n[O.action]||0)+1,O.success&&c++,O.action==="login_failed"&&i++,O.userId&&d.add(O.userId));}}return {totalEvents:a,byAction:n,successRate:a>0?c/a:1,failedLogins:i,uniqueUsers:d}}async cleanup(){let e=Date.now()-this.retentionDays*24*60*60*1e3,t=await this.redis.keys(`${this.prefix}date:*`),s=0;for(let n of t){let a=await this.redis.zrangebyscore(n,0,e);for(let i of a)await this.redis.del(`${this.prefix}log:${i}`),s++;await this.redis.zremrangebyscore(n,0,e);}return s}getKeyForDate(e){let t=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0");return `${this.prefix}date:${t}-${s}-${n}`}getKeysForDateRange(e,t){let s=[],n=e||new Date(Date.now()-this.retentionDays*24*60*60*1e3),a=t||new Date,i=new Date(n);for(;i<=a;)s.push(this.getKeyForDate(i)),i.setDate(i.getDate()+1);return s}matchesFilter(e,t){return !(t.action&&!(Array.isArray(t.action)?t.action:[t.action]).includes(e.action)||t.resource&&e.resource!==t.resource||t.resourceId&&e.resourceId!==t.resourceId||t.success!==void 0&&e.success!==t.success)}serializeLog(e){let t={id:e.id,timestamp:new Date(e.timestamp).toISOString(),action:e.action,resource:e.resource,success:e.success?"1":"0"};return e.userId&&(t.userId=e.userId),e.userEmail&&(t.userEmail=e.userEmail),e.role&&(t.role=e.role),e.resourceId&&(t.resourceId=e.resourceId),e.ipAddress&&(t.ipAddress=e.ipAddress),e.userAgent&&(t.userAgent=e.userAgent),e.error&&(t.error=e.error),e.changes&&(t.changes=JSON.stringify(e.changes)),e.metadata&&(t.metadata=JSON.stringify(e.metadata)),t}deserializeLog(e){return {id:e.id,timestamp:new Date(e.timestamp),action:e.action,userId:e.userId,userEmail:e.userEmail,role:e.role,resource:e.resource,resourceId:e.resourceId,ipAddress:e.ipAddress,userAgent:e.userAgent,success:e.success==="1",error:e.error,changes:e.changes?JSON.parse(e.changes):void 0,metadata:e.metadata?JSON.parse(e.metadata):void 0}}};function iU(r){return {ipAddress:r.headers.get("x-forwarded-for")?.split(",")[0]?.trim()||r.headers.get("x-real-ip")||"unknown",userAgent:r.headers.get("user-agent")||"unknown"}}var Qm=class{logs=[];retentionDays;constructor(e=Jc.retentionDays){this.retentionDays=e;}async log(e){let t=jB.randomBytes(16).toString("hex"),n={...e,id:t,timestamp:new Date};return this.logs.push(n),this.cleanupOldLogs(),t}async get(e){return this.logs.find(t=>t.id===e)||null}async query(e={}){let{limit:t=50,offset:s=0}=e,n=[...this.logs];if(e.userId&&(n=n.filter(g=>g.userId===e.userId)),e.action){let g=Array.isArray(e.action)?e.action:[e.action];n=n.filter(x=>g.includes(x.action));}e.resource&&(n=n.filter(g=>g.resource===e.resource)),e.resourceId&&(n=n.filter(g=>g.resourceId===e.resourceId)),e.success!==void 0&&(n=n.filter(g=>g.success===e.success));let a=e.startDate,i=e.endDate;a!==void 0&&(n=n.filter(g=>g.timestamp>=a)),i!==void 0&&(n=n.filter(g=>g.timestamp<=i)),n.sort((g,x)=>x.timestamp.getTime()-g.timestamp.getTime());let c=n.length;return {logs:n.slice(s,s+t),total:c}}async getRecent(e=50){let t=new Date(Date.now()-6048e5);return this.logs.filter(n=>n.timestamp>=t).sort((n,a)=>a.timestamp.getTime()-n.timestamp.getTime()).slice(0,e)}async getUserActivity(e,t=50){return this.logs.filter(n=>n.userId===e).sort((n,a)=>a.timestamp.getTime()-n.timestamp.getTime()).slice(0,t)}async getStats(e,t){let s=e||new Date(Date.now()-2592e6),n=t||new Date,a=this.logs.filter(_=>_.timestamp>=s&&_.timestamp<=n),i={},c=0,d=0,g=0,x=new Set;for(let _ of a){c++;let O=_.action;i[O]=(i[O]||0)+1,_.success&&g++,_.action==="login_failed"&&d++,_.userId&&x.add(_.userId);}return {totalEvents:c,byAction:i,successRate:c>0?g/c:1,failedLogins:d,uniqueUsers:x}}async cleanup(){let e=new Date(Date.now()-this.retentionDays*24*60*60*1e3),t=this.logs.length;return this.logs=this.logs.filter(s=>s.timestamp>=e),t-this.logs.length}cleanupOldLogs(){let e=new Date(Date.now()-this.retentionDays*24*60*60*1e3);this.logs.length;this.logs=this.logs.filter(s=>s.timestamp>=e);}};var vo=class{authAdapter;email;passwordPolicy;lockout;rateLimiter;auditLogger;baseUrl;emailVerificationRequired;jwtSecret;constructor(e){this.authAdapter=e.redis,this.email=e.email,this.passwordPolicy=e.passwordPolicy||new chunkXTTGHN3D_cjs.r,this.lockout=e.lockout,this.rateLimiter=e.rateLimiter,this.auditLogger=e.auditLogger,this.baseUrl=e.baseUrl||"http://localhost:4321",this.emailVerificationRequired=e.emailVerificationRequired??true,this.jwtSecret=e.jwtSecret||"kyro-default-secret-key-change-me-in-production";}getBaseUrl(e){if(e)try{let t=e.headers.get("x-forwarded-proto")||(e.url.startsWith("https")?"https":"http"),s=e.headers.get("x-forwarded-host")||e.headers.get("host");return s?`${t}://${s}`:new URL(e.url).origin}catch{}return process.env.KYRO_BASE_URL||process.env.SERVER_URL||process.env.PUBLIC_URL||process.env.SITE_URL||this.baseUrl||"http://localhost:4321"}async register(e){let{ipAddress:t,userAgent:s}=chunkMVX2PYJJ_cjs.a(e);if(this.rateLimiter){let n=await this.rateLimiter.check("auth:register",t);if(!n.allowed)return this.rateLimitResponse(n)}try{let n=await e.json();if(!n.email||!n.password)return this.errorResponse("Email and password are required",400);if(n.password!==n.confirmPassword)return this.errorResponse("Passwords do not match",400);let a=this.passwordPolicy.validate(n.password);if(!a.valid)return this.errorResponse(a.errors.join(". "),400);let i=await this.authAdapter.findUserByEmail(n.email);if(i){if(!i.emailVerified&&this.emailVerificationRequired&&this.email){let g=(await this.authAdapter.createEmailVerificationToken?.(i.id))?.token||jB.randomBytes(32).toString("hex"),_=`${this.getBaseUrl(e)}/admin/auth/verify-email?token=${g}`,O=this.email.getTemplates().verifyEmail(_,n.email);return await this.email.send({to:n.email,...O}),this.jsonResponse({success:!0,message:"An unverified account already exists with this email. We have resent the confirmation link to your inbox.",requiresVerification:!0},200)}return this.errorResponse("Email already registered",400)}let c=await this.authAdapter.createUser({email:n.email,password:n.password,role:n.role||"customer",tenantId:n.tenantId});if(this.emailVerificationRequired&&this.email){let d=jB.randomBytes(32).toString("hex"),x=`${this.getBaseUrl(e)}/admin/auth/verify-email?token=${d}`;await this.authAdapter.createSession(c.id,{ipAddress:t,userAgent:s});let _=this.email.getTemplates().verifyEmail(x,n.email);await this.email.send({to:n.email,..._});}return this.auditLogger&&await this.auditLogger.log({action:"register",userId:c.id,userEmail:c.email,resource:"auth",ipAddress:t,userAgent:s,success:!0}),this.jsonResponse({success:!0,message:"Registration successful",user:this.sanitizeUser(c),requiresVerification:this.emailVerificationRequired&&!!this.email},201)}catch(n){return console.error("[AuthRoutes.register] Registration error:",n),this.errorResponse("Registration failed",500)}}async login(e){let{ipAddress:t,userAgent:s}=chunkMVX2PYJJ_cjs.a(e);if(this.rateLimiter){let n=await this.rateLimiter.check("auth:login",t);if(!n.allowed)return this.rateLimitResponse(n)}try{let n=await e.json();if(!n.email||!n.password)return this.errorResponse("Email and password are required",400);let a=await this.authAdapter.findUserByEmail(n.email);if(!a)return await this.recordFailedLogin(t,s),this.errorResponse("Invalid credentials",401);if(a.locked)return this.auditLogger&&await this.auditLogger.log({action:"login_failed",userId:a.id,userEmail:a.email,resource:"auth",ipAddress:t,userAgent:s,success:!1,error:"Account locked"}),this.errorResponse("Account locked. Contact an administrator.",403);if(this.lockout){let x=await this.lockout.checkLockout(a.id);if(x.locked)return this.auditLogger&&await this.auditLogger.log({action:"login_failed",userId:a.id,userEmail:a.email,resource:"auth",ipAddress:t,userAgent:s,success:!1,error:"Account locked"}),this.errorResponse(`Account locked. Try again in ${Math.ceil((x.lockedUntil.getTime()-Date.now())/6e4)} minutes`,423)}let i=await this.authAdapter.verifyPassword(n.email,n.password);if(!i)return await this.recordFailedLogin(t,s,a.id,a.email),this.errorResponse("Invalid credentials",401);if(this.emailVerificationRequired&&i.emailVerified===!1){if(this.email){let _=(await this.authAdapter.createEmailVerificationToken?.(i.id))?.token||jB.randomBytes(32).toString("hex"),H=`${this.getBaseUrl(e)}/admin/auth/verify-email?token=${_}`,U=this.email.getTemplates().verifyEmail(H,i.email);await this.email.send({to:i.email,...U});}return this.errorResponse("Your email address is not verified yet. We have sent a new confirmation link to your email inbox.",403)}this.lockout&&await this.lockout.resetAttempts(a.id),this.auditLogger&&await this.auditLogger.log({action:"login",userId:a.id,userEmail:a.email,role:a.role,resource:"auth",ipAddress:t,userAgent:s,success:!0}),await this.authAdapter.updateUser(a.id,{lastLogin:new Date().toISOString()});let c=await chunkO4YE57OS_cjs.l({id:a.id,email:a.email,role:a.role,tenantId:a.tenantId});if(this.email&&a.email){let x=new Date().toLocaleString(),_=this.email.getTemplates().newLogin(t,x,a.email,void 0,s);this.email.send({to:a.email,..._}).catch(O=>console.error("Failed to send newLogin email:",O));}let d={success:!0,user:this.sanitizeUser(a)},g=this.jsonResponse(d);return chunkO4YE57OS_cjs.j(g,c)}catch(n){return console.error("[Auth] Login error:",n),this.errorResponse("Login failed",500)}}async logout(e){let t=chunkO4YE57OS_cjs.h(e);if(!t)return this.errorResponse("No session to logout",401);let{ipAddress:s,userAgent:n}=chunkMVX2PYJJ_cjs.a(e);try{let a=await chunkO4YE57OS_cjs.t(e);a&&(await chunkO4YE57OS_cjs.p(t),this.auditLogger&&await this.auditLogger.log({action:"logout",userId:a.userId,userEmail:a.email,resource:"auth",ipAddress:s,userAgent:n,success:!0}));let i=this.jsonResponse({success:!0,message:"Logged out successfully"});return chunkO4YE57OS_cjs.k(i)}catch{return this.errorResponse("Logout failed",500)}}async refresh(e){try{let t=chunkO4YE57OS_cjs.h(e);if(!t)return this.errorResponse("Not authenticated",401);let s=await chunkO4YE57OS_cjs.o(t,e);return s?this.jsonResponse({success:!0,expiresAt:s.expiresAt}):this.errorResponse("Session not found",404)}catch(t){return console.error("[Auth] Session refresh error:",t),this.errorResponse("Session refresh failed",500)}}async me(e){let t=await chunkO4YE57OS_cjs.t(e);return t?this.jsonResponse({success:true,user:{id:t.userId,email:t.email,role:t.role,tenantId:t.tenantId}}):this.errorResponse("Not authenticated",401)}async changePassword(e){let t=await chunkO4YE57OS_cjs.t(e);if(!t)return this.errorResponse("Not authenticated",401);let{ipAddress:s,userAgent:n}=chunkMVX2PYJJ_cjs.a(e);try{let a=await e.json(),{currentPassword:i,newPassword:c,confirmPassword:d}=a;if(!i||!c)return this.errorResponse("Current and new password required",400);if(c!==d)return this.errorResponse("Passwords do not match",400);let g=this.passwordPolicy.validate(c);if(!g.valid)return this.errorResponse(g.errors.join(". "),400);let x=await this.authAdapter.findUserById(t.userId);if(!x)return this.errorResponse("User not found",404);if(!(x.passwordHash?await this.authAdapter.verifyPassword(i,x.passwordHash):!1))return this.errorResponse("Current password is incorrect",401);let O=await this.authAdapter.getPasswordHistory?.(x.id,5);if(await this.authAdapter.isPasswordInHistory?.(c,x.id,5))return this.errorResponse("Password was recently used. Please choose a different password",400);let U=await this.authAdapter.hashPassword(c);if(x.passwordHash&&await this.authAdapter.addPasswordToHistory?.(x.id,x.passwordHash),await this.authAdapter.updateUser(x.id,{passwordHash:U}),await this.authAdapter.deleteUserSessions(x.id),this.email&&this.email.getTemplates){let F=this.email.getTemplates().passwordChanged(x.email,void 0,s,n);await this.email.send({to:x.email,...F});}return this.auditLogger&&await this.auditLogger.log({action:"password_change",userId:x.id,userEmail:x.email,resource:"auth",ipAddress:s,userAgent:n,success:!0}),this.jsonResponse({success:!0,message:"Password changed successfully"})}catch{return this.errorResponse("Password change failed",500)}}async forgotPassword(e){let{ipAddress:t,userAgent:s}=chunkMVX2PYJJ_cjs.a(e);if(this.rateLimiter){let n=await this.rateLimiter.check("auth:forgot",t);if(!n.allowed)return this.rateLimitResponse(n)}try{let n=await e.json(),{email:a}=n;if(!a)return this.errorResponse("Email required",400);let i=await this.authAdapter.findUserByEmail(a);if(!i)return this.jsonResponse({success:!0,message:"If the email exists, a reset link has been sent"});if(this.email){let c=jB.randomBytes(32).toString("hex");if(this.authAdapter.createPasswordResetToken){let _=await this.authAdapter.createPasswordResetToken(i.email);_.token&&(c=_.token);}let g=`${this.getBaseUrl(e)}/admin/auth/reset-password?token=${c}`,x=this.email.getTemplates().resetPassword(g,i.email);await this.email.send({to:i.email,...x});}return this.auditLogger&&await this.auditLogger.log({action:"password_reset",userId:i.id,userEmail:i.email,resource:"auth",ipAddress:t,userAgent:s,success:!0}),this.jsonResponse({success:!0,message:"If the email exists, a reset link has been sent"})}catch{return this.errorResponse("Password reset request failed",500)}}async resetPassword(e){let{ipAddress:t,userAgent:s}=chunkMVX2PYJJ_cjs.a(e);if(this.rateLimiter){let n=await this.rateLimiter.check("auth:reset",t);if(!n.allowed)return this.rateLimitResponse(n)}try{let n=await e.json(),{token:a,newPassword:i,confirmPassword:c}=n;if(!a||!i)return this.errorResponse("Reset token and new password are required",400);if(i!==c)return this.errorResponse("Passwords do not match",400);let d=this.passwordPolicy.validate(i);if(!d.valid)return this.errorResponse(d.errors.join(". "),400);if(this.authAdapter.resetPasswordWithToken){let g=await this.authAdapter.resetPasswordWithToken(a,i);if(!g.success)return this.errorResponse(g.error||"Password reset failed or token expired",400)}return this.jsonResponse({success:!0,message:"Password reset successful. You can now log in with your new password."})}catch(n){return console.error("[AuthRoutes.resetPassword] Error:",n),this.errorResponse("Password reset failed",500)}}async verifyEmail(e){let s=new URL(e.url).searchParams.get("token");if(!s)return this.errorResponse("Verification token required",400);try{if(this.authAdapter.verifyEmailToken){let n=await this.authAdapter.verifyEmailToken(s);if(!n.success)return this.errorResponse(n.error||"Invalid or expired verification token",400);if(n.userId&&this.email){let a=await this.authAdapter.findUserById(n.userId);if(a){let i=this.email.getTemplates().welcome(a.email);await this.email.send({to:a.email,...i});}}}return this.jsonResponse({success:!0,message:"Email address verified successfully"})}catch(n){return console.error("[AuthRoutes.verifyEmail] Error:",n),this.errorResponse("Email verification failed",500)}}async recordFailedLogin(e,t,s,n){if(this.lockout){let a=await this.lockout.recordFailedAttempt(s||e);if(a.locked&&a.totalAttempts===this.lockout.getConfig().maxAttempts&&this.email&&n){let i=Math.ceil(this.lockout.getConfig().lockDuration/6e4),c=this.email.getTemplates().accountLocked(a.totalAttempts,i,n,void 0,e,t);this.email.send({to:n,...c}).catch(d=>console.error("Failed to send accountLocked email:",d));}}this.auditLogger&&await this.auditLogger.log({action:"login_failed",userId:s,userEmail:n,resource:"auth",ipAddress:e,userAgent:t,success:false,error:"Invalid credentials"});}sanitizeUser(e){let{passwordHash:t,...s}=e;return s}jsonResponse(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json","Cache-Control":"no-store, no-cache, must-revalidate, max-age=0"}})}async listSessions(e){let t=await chunkO4YE57OS_cjs.t(e);if(!t)return this.errorResponse("Not authenticated",401);try{let s=await chunkO4YE57OS_cjs.r(t.userId,chunkO4YE57OS_cjs.h(e)??void 0);return this.jsonResponse({sessions:s})}catch(s){return console.error("[AuthRoutes.listSessions] Error:",s),this.errorResponse("Failed to list sessions",500)}}async revokeSession(e,t){let s=await chunkO4YE57OS_cjs.t(e);if(!s)return this.errorResponse("Not authenticated",401);try{let a=(await chunkO4YE57OS_cjs.r(s.userId)).find(i=>i.id===t);return a?a.currentSession?this.errorResponse("Cannot revoke current session",400):(await chunkO4YE57OS_cjs.p(t),this.jsonResponse({success:!0,message:"Session revoked"})):this.errorResponse("Session not found",404)}catch(n){return console.error("[AuthRoutes.revokeSession] Error:",n),this.errorResponse("Failed to revoke session",500)}}async revokeOtherSessions(e){let t=await chunkO4YE57OS_cjs.t(e);if(!t)return this.errorResponse("Not authenticated",401);try{let s=await chunkO4YE57OS_cjs.r(t.userId),n=chunkO4YE57OS_cjs.h(e);for(let a of s)a.currentSession||await chunkO4YE57OS_cjs.p(a.id);return this.jsonResponse({success:!0,message:"Other sessions revoked"})}catch(s){return console.error("[AuthRoutes.revokeOtherSessions] Error:",s),this.errorResponse("Failed to revoke sessions",500)}}async renameSession(e,t){let s=await chunkO4YE57OS_cjs.t(e);if(!s)return this.errorResponse("Not authenticated",401);try{if(!(await chunkO4YE57OS_cjs.r(s.userId)).find(d=>d.id===t))return this.errorResponse("Session not found",404);let i=await e.json(),{name:c}=i;return !c||typeof c!="string"||c.trim().length===0?this.errorResponse("Invalid session name",400):(await chunkO4YE57OS_cjs.s(t,c.trim()),this.jsonResponse({success:!0,message:"Session renamed"}))}catch(n){return console.error("[AuthRoutes.renameSession] Error:",n),this.errorResponse("Failed to rename session",500)}}async refreshSession(e){let t=chunkO4YE57OS_cjs.h(e);if(!t)return this.errorResponse("No session",401);try{let{refreshSession:s}=await import('./auth-session-DHVGXHOH.cjs'),n=await s(t,e);return n?this.jsonResponse({success:!0,expiresAt:n.expiresAt}):this.errorResponse("Session not found",404)}catch(s){return console.error("[AuthRoutes.refreshSession] Error:",s),this.errorResponse("Failed to refresh session",500)}}errorResponse(e,t){return new Response(JSON.stringify({success:false,error:e}),{status:t,headers:{"Content-Type":"application/json"}})}async rateLimitResponse(e){return new Response(JSON.stringify({error:"Too many requests. Please try again later."}),{status:429,headers:{"Content-Type":"application/json",...e.retryAfter?{"Retry-After":e.retryAfter.toString()}:{}}})}async requestMagicLink(e){let{ipAddress:t,userAgent:s}=chunkMVX2PYJJ_cjs.a(e);try{let n=await e.json();if(!n.email)return this.errorResponse("Email required",400);let a=await this.authAdapter.findUserByEmail(n.email);if(!a)return this.jsonResponse({success:!0,message:"If an account exists, a link was sent."});if(this.email){let i=Buffer.from(JSON.stringify({email:a.email,exp:Date.now()+6e5})).toString("base64url"),c=jB.createHmac("sha256",this.jwtSecret).update(i).digest("hex"),d=`${i}.${c}`,x=`${this.getBaseUrl(e)}/admin/auth/magic-link?token=${d}`,_=this.email.getTemplates().magicLink(x,void 0,a.email);this.email.send({to:a.email,..._}).catch(O=>console.error("Magic link err:",O));}return this.jsonResponse({success:!0,message:"If an account exists, a link was sent."})}catch{return this.errorResponse("Failed to process request",500)}}async verifyMagicLink(e){let{ipAddress:t,userAgent:s}=chunkMVX2PYJJ_cjs.a(e),a=new URL(e.url).searchParams.get("token");if(!a)return this.errorResponse("Token required",400);try{let[i,c]=a.split(".");if(!i||!c)return this.errorResponse("Invalid token",400);let d=jB.createHmac("sha256",this.jwtSecret).update(i).digest("hex");if(c!==d)return this.errorResponse("Invalid token",400);let g=JSON.parse(Buffer.from(i,"base64url").toString());if(Date.now()>g.exp)return this.errorResponse("Token expired",400);let x=await this.authAdapter.findUserByEmail(g.email);if(!x)return this.errorResponse("User not found",404);if(x.locked)return this.errorResponse("Account locked",403);let _=await chunkO4YE57OS_cjs.l({id:x.id,email:x.email,role:x.role,tenantId:x.tenantId});this.auditLogger&&await this.auditLogger.log({action:"login",userId:x.id,userEmail:x.email,resource:"auth",ipAddress:t,userAgent:s,success:!0});let O=this.jsonResponse({success:!0,user:this.sanitizeUser(x)});return chunkO4YE57OS_cjs.j(O,_)}catch{return this.errorResponse("Invalid token",400)}}async inviteUser(e){try{let t=await e.json();if(!t.email||!t.role)return this.errorResponse("Email and role required",400);let s=await this.authAdapter.findUserByEmail(t.email);if(s)return this.errorResponse("User already exists",409);if(s=await this.authAdapter.createUser({email:t.email,password:jB.randomBytes(16).toString("hex"),role:t.role}),this.email){let n=await this.authAdapter.createPasswordResetToken(s.email),i=`${this.getBaseUrl(e)}/admin/auth/reset-password?token=${n.token}`,c=this.email.getTemplates().userInvite(i,t.role,t.inviterName||"An administrator");this.email.send({to:s.email,...c}).catch(d=>console.error("Invite email err:",d));}return this.jsonResponse({success:!0,message:"User invited successfully"})}catch{return this.errorResponse("Failed to invite user",500)}}};chunkBUNLC3II_cjs.h();var Qc=chunkBUNLC3II_cjs.e(chunkHTYVI2HK_cjs.a(),1);var So=class{db;sessionTTL;constructor(e){this.db=e.db?.client||e.db,this.sessionTTL=e.sessionTTL||86400;}async executeSql(e,t=[]){try{if(this.db&&typeof this.db.prepare=="function"){let s=this.db.prepare(e);return (await(t.length>0?s.bind(...t):s).all()).results||[]}else if(this.db&&typeof this.db.run=="function"){let s=await this.db.run(chunkVRZC4TTF_cjs.J.raw(this.replaceParams(e,t)));return s.rows||s.results||(Array.isArray(s)?s:[])}else if(this.db&&typeof this.db.all=="function"){let s=await this.db.all(chunkVRZC4TTF_cjs.J.raw(this.replaceParams(e,t)));return Array.isArray(s)?s:s.results||[]}else if(this.db&&typeof this.db.execute=="function"){let s=await this.db.execute(chunkVRZC4TTF_cjs.J.raw(this.replaceParams(e,t)));return s.rows||s.results||(Array.isArray(s)?s:[])}}catch(s){console.warn("[D1AuthAdapter] SQL execution note:",s.message);}return []}async getOne(e,t=[]){try{if(this.db&&typeof this.db.prepare=="function"){let n=this.db.prepare(e);return await(t.length>0?n.bind(...t):n).first()||null}}catch{}let s=await this.executeSql(e,t);return s.length>0?s[0]:null}replaceParams(e,t){let s=0;return e.replace(/\?/g,()=>{let n=t[s++];return n==null?"NULL":typeof n=="number"||typeof n=="boolean"?String(n):`'${String(n).replace(/'/g,"''")}'`})}async connect(){await this.executeSql(`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS users (
|
|
3
3
|
id TEXT PRIMARY KEY,
|
|
4
4
|
email TEXT UNIQUE NOT NULL,
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
However, a future version may change this behavior to prefer the ENV static credentials.
|
|
49
49
|
Please ensure that your environment only sets either the AWS_PROFILE or the
|
|
50
50
|
AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY pair.
|
|
51
|
-
`),Vx=true)),new chunkGNEVCEJU_cjs.p("AWS_PROFILE is set, skipping fromEnv provider.",{logger:r.logger,tryNextLink:true});return r.logger?.debug("@aws-sdk/credential-provider-node - defaultProvider::fromEnv"),chunk35PGCW3S_cjs.g(r)()},async e=>{r.logger?.debug("@aws-sdk/credential-provider-node - defaultProvider::fromSSO");let{ssoStartUrl:t,ssoAccountId:s,ssoRegion:n,ssoRoleName:a,ssoSession:i}=r;if(!t&&!s&&!n&&!a&&!i)throw new chunkGNEVCEJU_cjs.p("Skipping SSO provider in default chain (inputs do not include SSO fields).",{logger:r.logger});let{fromSSO:c}=await import('./dist-es-T2H2W5BX.cjs');return c(r)(e)},async e=>{r.logger?.debug("@aws-sdk/credential-provider-node - defaultProvider::fromIni");let{fromIni:t}=await import('./dist-es-SRPWSAF4.cjs');return t(r)(e)},async e=>{r.logger?.debug("@aws-sdk/credential-provider-node - defaultProvider::fromProcess");let{fromProcess:t}=await import('./dist-es-3SSNUZST.cjs');return t(r)(e)},async e=>{r.logger?.debug("@aws-sdk/credential-provider-node - defaultProvider::fromTokenFile");let{fromTokenFile:t}=await import('./dist-es-DL3VLVP6.cjs');return t(r)(e)},async()=>(r.logger?.debug("@aws-sdk/credential-provider-node - defaultProvider::remoteProvider"),(await zx(r))()),async()=>{throw new chunkGNEVCEJU_cjs.p("Could not load credentials from any providers",{tryNextLink:false,logger:r.logger})}],Wx);var Wx=r=>r?.expiration!==void 0&&r.expiration.getTime()-Date.now()<3e5;chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var Ue=64,Zx=20,Xx=new Int32Array([1732584193,4023233417,2562383102,271733878,3285377520]),V$=new Int32Array([1518500249,1859775393,2400959708,3395469782]),oc=class r{digestLength=Zx;state=Int32Array.from(Xx);w;buffer=new Uint8Array(Ue);bufferLength=0;bytesHashed=0;finished=false;inner;outer;constructor(e){if(e){let t=r.normalizeKey(e);this.inner=new r,this.outer=new r;let s=new Uint8Array(Ue*2);for(let n=0;n<Ue;++n)s[n]=54^t[n],s[n+Ue]=92^t[n];this.inner.update(s.subarray(0,Ue)),this.outer.update(s.subarray(Ue));}}update(e){if(this.finished)throw new Error("Attempted to update an already finished HMAC.");if(this.inner){this.inner.update(e);return}let t=0,{length:s}=e;if(this.bytesHashed+=s,this.bufferLength>0){for(;s>0&&this.bufferLength<Ue;)this.buffer[this.bufferLength++]=e[t++],--s;this.bufferLength===Ue&&(this.hashBuffer(this.buffer,0),this.bufferLength=0);}for(;s>=Ue;)this.hashBuffer(e,t),t+=Ue,s-=Ue;for(;s>0;)this.buffer[this.bufferLength++]=e[t++],--s;}async digest(){if(this.inner&&this.outer){if(this.finished)throw new Error("Attempted to digest an already finished HMAC.");this.finished=true;let e=this.inner.digestSync();return this.outer.update(e),this.outer.digestSync()}return this.digestSync()}reset(){this.state=Int32Array.from(Xx),this.buffer=new Uint8Array(Ue),this.bufferLength=0,this.bytesHashed=0;}digestSync(){let e=this.state.slice(),t=this.buffer.slice(),s=this.bufferLength,n=this.bytesHashed/536870912|0,a=this.bytesHashed<<3;if(t[s++]=128,s>Ue-8){for(let d=s;d<Ue;++d)t[d]=0;this.hashBufferWith(e,t,0),s=0;}for(let d=s;d<Ue-8;++d)t[d]=0;let i=new DataView(t.buffer,t.byteOffset,Ue);i.setUint32(Ue-8,n,false),i.setUint32(Ue-4,a,false),this.hashBufferWith(e,t,0);let c=new Uint8Array(Zx);return c[0]=e[0]>>>24&255,c[1]=e[0]>>>16&255,c[2]=e[0]>>>8&255,c[3]=e[0]&255,c[4]=e[1]>>>24&255,c[5]=e[1]>>>16&255,c[6]=e[1]>>>8&255,c[7]=e[1]&255,c[8]=e[2]>>>24&255,c[9]=e[2]>>>16&255,c[10]=e[2]>>>8&255,c[11]=e[2]&255,c[12]=e[3]>>>24&255,c[13]=e[3]>>>16&255,c[14]=e[3]>>>8&255,c[15]=e[3]&255,c[16]=e[4]>>>24&255,c[17]=e[4]>>>16&255,c[18]=e[4]>>>8&255,c[19]=e[4]&255,c}static normalizeKey(e){let t=chunkLQ3YZTPU_cjs.v(e);if(t.byteLength>Ue){let n=new r;n.update(t);let a=n.digestSync(),i=new Uint8Array(Ue);return i.set(a),i}let s=new Uint8Array(Ue);return s.set(t),s}hashBuffer(e,t){this.hashBufferWith(this.state,e,t);}hashBufferWith(e,t,s){let n=this.w??=new Int32Array(80),a=e[0],i=e[1],c=e[2],d=e[3],g=e[4];for(let x=0;x<16;++x)n[x]=(t[s+x*4]&255)<<24|(t[s+x*4+1]&255)<<16|(t[s+x*4+2]&255)<<8|t[s+x*4+3]&255;for(let x=16;x<80;++x){let _=n[x-3]^n[x-8]^n[x-14]^n[x-16];n[x]=_<<1|_>>>31;}for(let x=0;x<80;++x){let _=x<20?0:x<40?1:x<60?2:3,O=((a<<5|a>>>27)+(_===0?i&c^~i&d:_===2?i&c^i&d^c&d:i^c^d)|0)+(g+(V$[_]+n[x]|0)|0)|0;g=d,d=c,c=i<<30|i>>>2,i=a,a=O;}e[0]=e[0]+a|0,e[1]=e[1]+i|0,e[2]=e[2]+c|0,e[3]=e[3]+d|0,e[4]=e[4]+g|0;}};chunkBUNLC3II_cjs.h();var Z$=(()=>{try{return jB.createHash("sha1"),!0}catch{return false}})(),ic=Z$?X$():oc;function X$(){return class{digestLength=20;secret;hash;isHmac;finished=false;constructor(e){this.secret=e,this.isHmac=!!e,this.hash=this.createHash();}update(e){if(this.finished)throw new Error("Attempted to update an already finished hash.");this.hash.update(e);}async digest(){let e;return this.isHmac?(this.finished=true,e=this.hash.digest()):e=this.hash.copy().digest(),new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}reset(){this.hash=this.createHash(),this.finished=false;}createHash(){return this.secret?jB.createHmac("sha1",J$(this.secret)):jB.createHash("sha1")}}}function J$(r){return typeof r=="string"?r:ArrayBuffer.isView(r)?Buffer.from(r.buffer,r.byteOffset,r.byteLength):Buffer.from(r)}var Qx=r=>({apiVersion:"2006-03-01",base64Decoder:r?.base64Decoder??chunkLQ3YZTPU_cjs.b,base64Encoder:r?.base64Encoder??chunkLQ3YZTPU_cjs.d,disableHostPrefix:r?.disableHostPrefix??false,endpointProvider:r?.endpointProvider??Go,extensions:r?.extensions??[],getAwsChunkedEncodingStream:r?.getAwsChunkedEncodingStream??chunkLQ3YZTPU_cjs.y,httpAuthSchemeProvider:r?.httpAuthSchemeProvider??Mh,httpAuthSchemes:r?.httpAuthSchemes??[{schemeId:"aws.auth#sigv4",identityProvider:e=>e.getIdentityProvider("aws.auth#sigv4"),signer:new chunkPITMDQYN_cjs.f},{schemeId:"aws.auth#sigv4a",identityProvider:e=>e.getIdentityProvider("aws.auth#sigv4a"),signer:new chunkPITMDQYN_cjs.g}],logger:r?.logger??new chunkLEBM6ZSZ_cjs.m,md5:r?.md5??chunkEZIDQBXI_cjs.b,protocol:r?.protocol??ia,protocolSettings:r?.protocolSettings??{defaultNamespace:"com.amazonaws.s3",errorTypeRegistries:ux,xmlNamespace:"http://s3.amazonaws.com/doc/2006-03-01/",version:"2006-03-01",serviceTarget:"AmazonS3"},sdkStreamMixin:r?.sdkStreamMixin??chunkLQ3YZTPU_cjs.A,serviceId:r?.serviceId??"S3",sha1:r?.sha1??ic,sha256:r?.sha256??chunkEZIDQBXI_cjs.d,signerConstructor:r?.signerConstructor??chunkUNYXWPLZ_cjs.a,signingEscapePath:r?.signingEscapePath??false,urlParser:r?.urlParser??chunkGNEVCEJU_cjs.i,useArnRegion:r?.useArnRegion??void 0,utf8Decoder:r?.utf8Decoder??chunkLQ3YZTPU_cjs.c,utf8Encoder:r?.utf8Encoder??chunkLQ3YZTPU_cjs.e});var Yx=r=>{chunkLEBM6ZSZ_cjs.i(process.version);let e=chunkGNEVCEJU_cjs.I(r),t=()=>e().then(chunkLEBM6ZSZ_cjs.h),s=Qx(r);chunkLEBM6ZSZ_cjs.a(process.version);let n={profile:r?.profile,logger:s.logger};return {...s,...r,runtime:"node",defaultsMode:e,authSchemePreference:r?.authSchemePreference??chunkGNEVCEJU_cjs.C(chunkPITMDQYN_cjs.h,n),bodyLengthChecker:r?.bodyLengthChecker??chunkLQ3YZTPU_cjs.u,credentialDefaultProvider:r?.credentialDefaultProvider??td,defaultUserAgentProvider:r?.defaultUserAgentProvider??chunkLEBM6ZSZ_cjs.P({serviceId:s.serviceId,clientVersion:Hx.version}),disableS3ExpressSessionAuth:r?.disableS3ExpressSessionAuth??chunkGNEVCEJU_cjs.C(vu,n),eventStreamSerdeProvider:r?.eventStreamSerdeProvider??chunk3VXEK5ZW_cjs.n,maxAttempts:r?.maxAttempts??chunkGNEVCEJU_cjs.C(chunkLEBM6ZSZ_cjs.w,r),region:r?.region??chunkGNEVCEJU_cjs.C(chunkGNEVCEJU_cjs.F,{...chunkGNEVCEJU_cjs.G,...n}),requestChecksumCalculation:r?.requestChecksumCalculation??chunkGNEVCEJU_cjs.C(ou,n),requestHandler:chunkGIS6X43A_cjs.a.create(r?.requestHandler??t),responseChecksumValidation:r?.responseChecksumValidation??chunkGNEVCEJU_cjs.C(iu,n),retryMode:r?.retryMode??chunkGNEVCEJU_cjs.C({...chunkLEBM6ZSZ_cjs.y,default:async()=>(await t()).retryMode||chunkLEBM6ZSZ_cjs.v},r),sigv4aSigningRegionSet:r?.sigv4aSigningRegionSet??chunkGNEVCEJU_cjs.C(chunkPITMDQYN_cjs.j,n),streamCollector:r?.streamCollector??chunkLQ3YZTPU_cjs.z,streamHasher:r?.streamHasher??chunkEZIDQBXI_cjs.a,useArnRegion:r?.useArnRegion??chunkGNEVCEJU_cjs.C(Cu,n),useDualstackEndpoint:r?.useDualstackEndpoint??chunkGNEVCEJU_cjs.C(chunkGNEVCEJU_cjs.D,n),useFipsEndpoint:r?.useFipsEndpoint??chunkGNEVCEJU_cjs.C(chunkGNEVCEJU_cjs.E,n),userAgentAppId:r?.userAgentAppId??chunkGNEVCEJU_cjs.C(chunkLEBM6ZSZ_cjs.Q,n)}};chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var e_=r=>{let e=r.httpAuthSchemes,t=r.httpAuthSchemeProvider,s=r.credentials;return {setHttpAuthScheme(n){let a=e.findIndex(i=>i.schemeId===n.schemeId);a===-1?e.push(n):e.splice(a,1,n);},httpAuthSchemes(){return e},setHttpAuthSchemeProvider(n){t=n;},httpAuthSchemeProvider(){return t},setCredentials(n){s=n;},credentials(){return s}}},t_=r=>({httpAuthSchemes:r.httpAuthSchemes(),httpAuthSchemeProvider:r.httpAuthSchemeProvider(),credentials:r.credentials()});var r_=(r,e)=>{let t=Object.assign(chunkLEBM6ZSZ_cjs.T(r),chunkLEBM6ZSZ_cjs.j(r),chunkGNEVCEJU_cjs.R(r),e_(r));return e.forEach(s=>s.configure(t)),Object.assign(r,chunkLEBM6ZSZ_cjs.U(t),chunkLEBM6ZSZ_cjs.k(t),chunkGNEVCEJU_cjs.S(t),t_(t))};var cc=class extends chunkLEBM6ZSZ_cjs.c{config;constructor(...[e]){let t=Yx(e||{});super(t),this.initConfig=t;let s=qh(t),n=chunkLEBM6ZSZ_cjs.N(s),a=yu(n),i=chunkLEBM6ZSZ_cjs.x(a),c=chunkGNEVCEJU_cjs.H(i),d=c,g=chunkLEBM6ZSZ_cjs.t(d),x=chunk3VXEK5ZW_cjs.q(g),_=Uh(x),O=wu(_,{session:[()=>this,ac]}),H=r_(O,e?.extensions||[]);this.config=H,this.middlewareStack.use(chunkGNEVCEJU_cjs.l(this.config)),this.middlewareStack.use(chunkLEBM6ZSZ_cjs.O(this.config)),this.middlewareStack.use(chunkLEBM6ZSZ_cjs.z(this.config)),this.middlewareStack.use(chunkGNEVCEJU_cjs.T(this.config)),this.middlewareStack.use(chunkLEBM6ZSZ_cjs.B(this.config)),this.middlewareStack.use(chunkLEBM6ZSZ_cjs.C(this.config)),this.middlewareStack.use(chunkLEBM6ZSZ_cjs.D(this.config)),this.middlewareStack.use(chunkLEBM6ZSZ_cjs.E(this.config,{httpAuthSchemeParametersProvider:Bh,identityProviderConfigProvider:async U=>new chunkLEBM6ZSZ_cjs.I({"aws.auth#sigv4":U.credentials,"aws.auth#sigv4a":U.credentials})})),this.middlewareStack.use(chunkLEBM6ZSZ_cjs.G(this.config)),this.middlewareStack.use(ku(this.config)),this.middlewareStack.use(Eu(this.config)),this.middlewareStack.use(_u(this.config)),this.middlewareStack.use(Su(this.config)),this.middlewareStack.use(Au(this.config));}destroy(){super.destroy();}};chunkBUNLC3II_cjs.h();var uc=class extends It(Hh,Vh,"CopyObject",Bx){};chunkBUNLC3II_cjs.h();var Cn=class extends It(Gs,zs,"DeleteObject",Nx){};chunkBUNLC3II_cjs.h();var lc=class extends It(zh,Wh,"DeleteObjects",Mx){};chunkBUNLC3II_cjs.h();var Ma=class extends It(Gs,Zh,"HeadObject",Ux){};chunkBUNLC3II_cjs.h();var Ua=class extends It(Kh,zs,"ListObjectsV2",qx){};chunkBUNLC3II_cjs.h();var qa=class extends It(Gs,Xh,"PutObject",Fx){};function s_(r){if(!r)return "";if(r.startsWith("pub-"))return r;let e=r.match(/pub-[a-zA-Z0-9]+/i);return e?e[0]:""}function Q$(r,e){let t=r.startsWith("/")?r.slice(1):r;if(e.cdnUrl)return `${e.cdnUrl.replace(/\/$/,"")}/${t}`;switch(e.provider){case "r2":{let s=s_(e.publicDevUrl);return s?`https://${s}.r2.dev/${t}`:`https://${e.bucket}.${e.accountId}.r2.cloudflarestorage.com/${t}`}case "gcs":return `https://storage.googleapis.com/${e.bucket}/${t}`;case "digitalocean":return `https://${e.bucket}.${e.region}.cdn.digitaloceanspaces.com/${t}`;case "backblaze":return `https://${e.bucket}.s3.backblazeb2.com/${t}`;case "wasabi":return `https://${e.bucket}.s3.wasabisys.com/${t}`;default:return `https://${e.bucket}.s3.${e.region}.amazonaws.com/${t}`}}function rd(r){if(r.cdnUrl)return r.cdnUrl.replace(/\/$/,"")+"/";switch(r.provider){case "r2":{let e=s_(r.publicDevUrl);return e?`https://${e}.r2.dev/`:`https://${r.bucket}.${r.accountId}.r2.cloudflarestorage.com/`}case "gcs":return `https://storage.googleapis.com/${r.bucket}/`;case "digitalocean":return `https://${r.bucket}.${r.region}.cdn.digitaloceanspaces.com/`;case "backblaze":return `https://${r.bucket}.s3.backblazeb2.com/`;case "wasabi":return `https://${r.bucket}.s3.wasabisys.com/`;default:return `https://${r.bucket}.s3.${r.region}.amazonaws.com/`}}function Y$(r){switch(r){case "r2":return "Cloudflare R2";case "gcs":return "Google Cloud Storage";case "digitalocean":return "DigitalOcean Spaces";case "backblaze":return "Backblaze B2";case "wasabi":return "Wasabi";default:return "AWS S3"}}function eB(r){let e=new cc({region:r.region||"auto",endpoint:r.endpoint,credentials:{accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey},forcePathStyle:true,tls:true,...r.provider==="r2"&&{requestHandler:new chunkGIS6X43A_cjs.a}}),t=n=>`${r.prefix?`${r.prefix}/`:""}${n}`.replace(/\/+/g,"/"),s=n=>Q$(n,r);return Lr({name:r.provider,displayName:Y$(r.provider),supportsDynamicResize:true,async upload(n,a){let i=t(`${a?.folder?`${a.folder}/`:""}${a?.filename||n.name}`),c=Buffer.from(await n.arrayBuffer());await e.send(new qa({Bucket:r.bucket,Key:i,Body:c,ContentType:n.type,Metadata:a?.metadata}));let d=await e.send(new Ma({Bucket:r.bucket,Key:i}));return {id:Buffer.from(i).toString("base64url"),filename:a?.filename||n.name,originalName:n.name,mimeType:n.type,size:c.length,url:s(i),thumbnailUrl:n.type.startsWith("image/")?s(i):void 0,folder:a?.folder,provider:r.provider,metadata:{...a?.metadata,etag:d.ETag},createdAt:new Date().toISOString()}},async delete(n){let a=n.replace(rd(r),"");await e.send(new Cn({Bucket:r.bucket,Key:a}));},async rename(n,a){let i=n.replace(rd(r),""),c=r.prefix?`${r.prefix}/${a}`:a;return await e.send(new uc({Bucket:r.bucket,CopySource:`${r.bucket}/${i}`,Key:c})),await e.send(new Cn({Bucket:r.bucket,Key:i})),s(c)},async list(n){let a=t(n||"");return ((await e.send(new Ua({Bucket:r.bucket,Prefix:a}))).Contents||[]).map(c=>({id:Buffer.from(c.Key||"").toString("base64url"),filename:c.Key?.split("/").pop()||"",originalName:c.Key?.split("/").pop()||"",mimeType:"application/octet-stream",size:c.Size||0,url:s(c.Key||""),provider:r.provider,createdAt:c.LastModified?.toISOString()||new Date().toISOString()}))},async exists(n){try{let a=n.replace(rd(r),"");return await e.send(new Ma({Bucket:r.bucket,Key:a})),!0}catch{return false}},async createFolder(n){let a=t(`${n}/`);await e.send(new qa({Bucket:r.bucket,Key:a,Body:""}));},async deleteFolder(n){let a=t(`${n}/`),i;do{let c=await e.send(new Ua({Bucket:r.bucket,Prefix:a,ContinuationToken:i}));if(c.Contents?.length){let d=c.Contents.map(g=>({Key:g.Key}));await e.send(new lc({Bucket:r.bucket,Delete:{Objects:d}}));}i=c.IsTruncated?c.NextContinuationToken:void 0;}while(i);await e.send(new Cn({Bucket:r.bucket,Key:a}));}})}chunkBUNLC3II_cjs.h();function tB(r){let e=()=>`https://api.cloudinary.com/v1_1/${r.cloudName}/upload`,t=async s=>{let n=await import('crypto'),a=Object.keys(s).sort().map(i=>`${i}=${s[i]}`).join("&");return n.createHash("sha256").update(a+r.apiSecret).digest("hex")};return {name:"cloudinary",displayName:"Cloudinary",supportsDynamicResize:true,async upload(s,n){let a=new FormData;if(a.append("file",s),r.uploadPreset)a.append("upload_preset",r.uploadPreset);else {let d=Math.round(Date.now()/1e3),g={timestamp:String(d)};(n?.folder||r.folder)&&(g.folder=n?.folder||r.folder||"");let x=await t(g);a.append("timestamp",String(d)),a.append("signature",x),a.append("api_key",r.apiKey);}(n?.folder||r.folder)&&a.append("folder",n?.folder||r.folder||"");let i=await fetch(e(),{method:"POST",body:a});if(!i.ok){let d=await i.json();throw new Error(`Cloudinary upload failed: ${d.error?.message||i.statusText}`)}let c=await i.json();return {id:c.public_id,filename:`${c.public_id}.${c.format}`,originalName:c.original_filename||s.name,mimeType:s.type||`image/${c.format}`,size:c.bytes,url:c.secure_url,thumbnailUrl:this.getImageUrl(c.secure_url,{width:200,height:200,fit:"crop"}),width:c.width,height:c.height,folder:n?.folder||r.folder,provider:"cloudinary",createdAt:new Date().toISOString()}},async uploadFromUrl(s,n){let a=new FormData;a.append("file",s),a.append("upload_preset","ml_default"),(n?.folder||r.folder)&&a.append("folder",n?.folder||r.folder||"");let i=await fetch(e(),{method:"POST",body:a});if(!i.ok)throw new Error("Cloudinary upload failed");let c=await i.json();return {id:c.public_id,filename:`${c.public_id}.${c.format}`,originalName:c.original_filename||s.split("/").pop()||"file",mimeType:`image/${c.format}`,size:c.bytes,url:c.secure_url,thumbnailUrl:this.getImageUrl(c.secure_url,{width:200,height:200,fit:"crop"}),width:c.width,height:c.height,provider:"cloudinary",createdAt:new Date().toISOString()}},async delete(s){try{let n=s.split("/image/upload/");if(n.length!==2){console.warn("[Cloudinary delete] Could not parse URL:",s);return}let a=n[1].replace(/^v\d+\//,"").replace(/\.[^.]+$/,""),i=Math.round(Date.now()/1e3),c={timestamp:String(i),public_id:a},d=Object.keys(c).sort().map(U=>`${U}=${c[U]}`).join("&"),x=(await import('crypto')).createHash("sha256").update(d+r.apiSecret).digest("hex"),_=`https://api.cloudinary.com/v1_1/${r.cloudName}/image/destroy`,O=new FormData;O.append("public_id",a),O.append("timestamp",String(i)),O.append("signature",x),O.append("api_key",r.apiKey);let H=await fetch(_,{method:"POST",body:O});if(!H.ok){let U=await H.json();console.warn("[Cloudinary delete] Failed:",U);}}catch(n){console.warn("[Cloudinary delete] Error:",n.message);}},async rename(s,n){let a="",i=n.replace(/\.[^.]+$/,""),c="";try{let d=s.split("/image/upload/");if(d.length!==2)return console.warn("[Cloudinary rename] Could not parse old URL:",s),s;let g=d[1],x=g.match(/^(v\d+)\//);a=x?x[1]:"";let _=g.replace(/^v\d+\//,"").replace(/\.[^.]+$/,""),O=_.split("/");c=O.length>1?O.slice(0,-1).join("/"):"";let H=n.replace(/\.[^.]+$/,"");i=c?`${c}/${H}`:H;let U=Math.round(Date.now()/1e3),F={from_public_id:_,to_public_id:i,timestamp:String(U)},ce=Object.keys(F).sort().map(We=>`${We}=${F[We]}`).join("&"),Oe=(await import('crypto')).createHash("sha256").update(ce+r.apiSecret).digest("hex"),W=new FormData;W.append("from_public_id",_),W.append("to_public_id",i),W.append("timestamp",String(U)),W.append("signature",Oe),W.append("api_key",r.apiKey);let vt=await fetch(`https://api.cloudinary.com/v1_1/${r.cloudName}/image/rename`,{method:"POST",body:W});if(vt.ok)return (await vt.json()).secure_url;{let We=await vt.json();console.warn("[Cloudinary rename] Failed:",We);let q=a?`/${a}/`:"/";return `https://res.cloudinary.com/${r.cloudName}/image/upload${q}${i}.${n.split(".").pop()}`}}catch(d){console.warn("[Cloudinary rename] Error:",d.message);let g=a?`/${a}/`:"/";return `https://res.cloudinary.com/${r.cloudName}/image/upload${g}${i}.${n.split(".").pop()}`}},getImageUrl(s,n){if(!n)return s;let a=s.split("/upload/");if(a.length!==2)return s;let i=[];if(n.width&&i.push(`w_${n.width}`),n.height&&i.push(`h_${n.height}`),n.fit){let d={crop:"c_fill",clip:"c_fit",scale:"c_scale",fill:"c_fill"};i.push(d[n.fit]||"c_limit");}n.quality&&i.push(`q_${n.quality}`),n.format&&i.push(`f_${n.format}`);let c=i.join(",");return `${a[0]}/upload/${c}/${a[1]}`},async generateThumbnail(s){return this.getImageUrl(s.url,{width:200,height:200,fit:"crop"})},async list(){return []},async exists(s){return (await fetch(s,{method:"HEAD"})).ok},async createFolder(){},async deleteFolder(){}}}chunkBUNLC3II_cjs.h();async function n_(r){let e=r.getStorageConfig(),t=au();try{return await t.resolve(e.type,e)}catch(s){return console.warn(`[resolveProvider] ${s.message} \u2014 falling back to local storage`),gs({uploadDir:ko__default.default.join(process.cwd(),"public","uploads"),baseUrl:"/uploads"})}}function Lr(r){return {async uploadFromUrl(e,t){let s=await fetch(e);if(!s.ok)throw new Error(`Failed to fetch: ${s.statusText}`);let n=await s.blob(),a=e.split("/").pop()||"file",i=new File([n],a,{type:n.type});return this.upload(i,t)},getImageUrl(e,t){if(!t||Object.keys(t).length===0)return e;let s=new URLSearchParams({url:e});return t.width&&s.set("w",String(t.width)),t.height&&s.set("h",String(t.height)),t.quality&&s.set("q",String(t.quality)),t.format&&s.set("f",t.format),t.cropWidth&&t.cropHeight&&(s.set("cx",String(t.cropX??0)),s.set("cy",String(t.cropY??0)),s.set("cw",String(t.cropWidth)),s.set("ch",String(t.cropHeight))),`/api/media/resize?${s.toString()}`},async generateThumbnail(e){return this.getImageUrl(e.url,{width:400,height:400})},...r}}async function a_(r){if(!r)return console.warn("[resolveProviderWithConfig] No config, using local"),gs({uploadDir:ko__default.default.join(process.cwd(),"public","uploads"),baseUrl:"/uploads"});let e=r.type||"local",t=au();try{return await t.resolveWithConfig(e,r)}catch(s){return console.warn(`[resolveProviderWithConfig] ${s.message} \u2014 falling back to local storage`),gs({uploadDir:ko__default.default.join(process.cwd(),"public","uploads"),baseUrl:"/uploads"})}}chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();function o_(){return typeof globalThis>"u"?false:typeof globalThis.EdgeRuntime=="string"||typeof globalThis.WebSocketPair<"u"||typeof globalThis.Deno<"u"||typeof process<"u"&&process.env?.NEXT_RUNTIME==="edge"}async function i_(r){if(!o_())try{let{default:e}=await import('sharp'),t=await e(r).metadata(),s=e(r).webp({quality:85}),n=e(r).resize({width:500,withoutEnlargement:!0}).webp({quality:80});return {buffer:await s.toBuffer(),thumbnailBuffer:await n.toBuffer(),width:t.width,height:t.height,format:"webp"}}catch{}return {buffer:r,thumbnailBuffer:r,format:"passthrough"}}var nd=false;function Fa(r){if(typeof r!="string")return r;let e=r.replace(/-/g,"").toLowerCase();return e.length===32?`${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20)}`:r}var dc=class r{db;storage;dialect;genId;mediaTable="media";foldersTable="media_folders";constructor(e,t,s){this.db=e,this.storage=t,this.dialect=s?.dialect||"sqlite",this.genId=s?.genId||chunkTDGSIF5H_cjs.e;}static async init(e,t){let s;if(t?.storageConfig)s=await a_(t.storageConfig);else {let a=new chunkVKXWJOWI_cjs.p(e);await a.load(),s=await n_(a);}let n=new r(e,s,t);return await n.ensureTables(),n}async ensureTables(){if(this.dialect==="mongodb"){let e=this.db.db;await e.collection(this.mediaTable).createIndex({filename:1},{unique:true}),await e.collection(this.foldersTable).createIndex({path:1},{unique:true}),nd=true;return}if(this.dialect==="sqlite"){this.db.exec(`
|
|
51
|
+
`),Vx=true)),new chunkGNEVCEJU_cjs.p("AWS_PROFILE is set, skipping fromEnv provider.",{logger:r.logger,tryNextLink:true});return r.logger?.debug("@aws-sdk/credential-provider-node - defaultProvider::fromEnv"),chunk35PGCW3S_cjs.g(r)()},async e=>{r.logger?.debug("@aws-sdk/credential-provider-node - defaultProvider::fromSSO");let{ssoStartUrl:t,ssoAccountId:s,ssoRegion:n,ssoRoleName:a,ssoSession:i}=r;if(!t&&!s&&!n&&!a&&!i)throw new chunkGNEVCEJU_cjs.p("Skipping SSO provider in default chain (inputs do not include SSO fields).",{logger:r.logger});let{fromSSO:c}=await import('./dist-es-T2H2W5BX.cjs');return c(r)(e)},async e=>{r.logger?.debug("@aws-sdk/credential-provider-node - defaultProvider::fromIni");let{fromIni:t}=await import('./dist-es-SRPWSAF4.cjs');return t(r)(e)},async e=>{r.logger?.debug("@aws-sdk/credential-provider-node - defaultProvider::fromProcess");let{fromProcess:t}=await import('./dist-es-3SSNUZST.cjs');return t(r)(e)},async e=>{r.logger?.debug("@aws-sdk/credential-provider-node - defaultProvider::fromTokenFile");let{fromTokenFile:t}=await import('./dist-es-DL3VLVP6.cjs');return t(r)(e)},async()=>(r.logger?.debug("@aws-sdk/credential-provider-node - defaultProvider::remoteProvider"),(await zx(r))()),async()=>{throw new chunkGNEVCEJU_cjs.p("Could not load credentials from any providers",{tryNextLink:false,logger:r.logger})}],Wx);var Wx=r=>r?.expiration!==void 0&&r.expiration.getTime()-Date.now()<3e5;chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var Ue=64,Zx=20,Xx=new Int32Array([1732584193,4023233417,2562383102,271733878,3285377520]),V$=new Int32Array([1518500249,1859775393,2400959708,3395469782]),oc=class r{digestLength=Zx;state=Int32Array.from(Xx);w;buffer=new Uint8Array(Ue);bufferLength=0;bytesHashed=0;finished=false;inner;outer;constructor(e){if(e){let t=r.normalizeKey(e);this.inner=new r,this.outer=new r;let s=new Uint8Array(Ue*2);for(let n=0;n<Ue;++n)s[n]=54^t[n],s[n+Ue]=92^t[n];this.inner.update(s.subarray(0,Ue)),this.outer.update(s.subarray(Ue));}}update(e){if(this.finished)throw new Error("Attempted to update an already finished HMAC.");if(this.inner){this.inner.update(e);return}let t=0,{length:s}=e;if(this.bytesHashed+=s,this.bufferLength>0){for(;s>0&&this.bufferLength<Ue;)this.buffer[this.bufferLength++]=e[t++],--s;this.bufferLength===Ue&&(this.hashBuffer(this.buffer,0),this.bufferLength=0);}for(;s>=Ue;)this.hashBuffer(e,t),t+=Ue,s-=Ue;for(;s>0;)this.buffer[this.bufferLength++]=e[t++],--s;}async digest(){if(this.inner&&this.outer){if(this.finished)throw new Error("Attempted to digest an already finished HMAC.");this.finished=true;let e=this.inner.digestSync();return this.outer.update(e),this.outer.digestSync()}return this.digestSync()}reset(){this.state=Int32Array.from(Xx),this.buffer=new Uint8Array(Ue),this.bufferLength=0,this.bytesHashed=0;}digestSync(){let e=this.state.slice(),t=this.buffer.slice(),s=this.bufferLength,n=this.bytesHashed/536870912|0,a=this.bytesHashed<<3;if(t[s++]=128,s>Ue-8){for(let d=s;d<Ue;++d)t[d]=0;this.hashBufferWith(e,t,0),s=0;}for(let d=s;d<Ue-8;++d)t[d]=0;let i=new DataView(t.buffer,t.byteOffset,Ue);i.setUint32(Ue-8,n,false),i.setUint32(Ue-4,a,false),this.hashBufferWith(e,t,0);let c=new Uint8Array(Zx);return c[0]=e[0]>>>24&255,c[1]=e[0]>>>16&255,c[2]=e[0]>>>8&255,c[3]=e[0]&255,c[4]=e[1]>>>24&255,c[5]=e[1]>>>16&255,c[6]=e[1]>>>8&255,c[7]=e[1]&255,c[8]=e[2]>>>24&255,c[9]=e[2]>>>16&255,c[10]=e[2]>>>8&255,c[11]=e[2]&255,c[12]=e[3]>>>24&255,c[13]=e[3]>>>16&255,c[14]=e[3]>>>8&255,c[15]=e[3]&255,c[16]=e[4]>>>24&255,c[17]=e[4]>>>16&255,c[18]=e[4]>>>8&255,c[19]=e[4]&255,c}static normalizeKey(e){let t=chunkLQ3YZTPU_cjs.v(e);if(t.byteLength>Ue){let n=new r;n.update(t);let a=n.digestSync(),i=new Uint8Array(Ue);return i.set(a),i}let s=new Uint8Array(Ue);return s.set(t),s}hashBuffer(e,t){this.hashBufferWith(this.state,e,t);}hashBufferWith(e,t,s){let n=this.w??=new Int32Array(80),a=e[0],i=e[1],c=e[2],d=e[3],g=e[4];for(let x=0;x<16;++x)n[x]=(t[s+x*4]&255)<<24|(t[s+x*4+1]&255)<<16|(t[s+x*4+2]&255)<<8|t[s+x*4+3]&255;for(let x=16;x<80;++x){let _=n[x-3]^n[x-8]^n[x-14]^n[x-16];n[x]=_<<1|_>>>31;}for(let x=0;x<80;++x){let _=x<20?0:x<40?1:x<60?2:3,O=((a<<5|a>>>27)+(_===0?i&c^~i&d:_===2?i&c^i&d^c&d:i^c^d)|0)+(g+(V$[_]+n[x]|0)|0)|0;g=d,d=c,c=i<<30|i>>>2,i=a,a=O;}e[0]=e[0]+a|0,e[1]=e[1]+i|0,e[2]=e[2]+c|0,e[3]=e[3]+d|0,e[4]=e[4]+g|0;}};chunkBUNLC3II_cjs.h();var Z$=(()=>{try{return jB.createHash("sha1"),!0}catch{return false}})(),ic=Z$?X$():oc;function X$(){return class{digestLength=20;secret;hash;isHmac;finished=false;constructor(e){this.secret=e,this.isHmac=!!e,this.hash=this.createHash();}update(e){if(this.finished)throw new Error("Attempted to update an already finished hash.");this.hash.update(e);}async digest(){let e;return this.isHmac?(this.finished=true,e=this.hash.digest()):e=this.hash.copy().digest(),new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}reset(){this.hash=this.createHash(),this.finished=false;}createHash(){return this.secret?jB.createHmac("sha1",J$(this.secret)):jB.createHash("sha1")}}}function J$(r){return typeof r=="string"?r:ArrayBuffer.isView(r)?Buffer.from(r.buffer,r.byteOffset,r.byteLength):Buffer.from(r)}var Qx=r=>({apiVersion:"2006-03-01",base64Decoder:r?.base64Decoder??chunkLQ3YZTPU_cjs.b,base64Encoder:r?.base64Encoder??chunkLQ3YZTPU_cjs.d,disableHostPrefix:r?.disableHostPrefix??false,endpointProvider:r?.endpointProvider??Go,extensions:r?.extensions??[],getAwsChunkedEncodingStream:r?.getAwsChunkedEncodingStream??chunkLQ3YZTPU_cjs.y,httpAuthSchemeProvider:r?.httpAuthSchemeProvider??Mh,httpAuthSchemes:r?.httpAuthSchemes??[{schemeId:"aws.auth#sigv4",identityProvider:e=>e.getIdentityProvider("aws.auth#sigv4"),signer:new chunkPITMDQYN_cjs.f},{schemeId:"aws.auth#sigv4a",identityProvider:e=>e.getIdentityProvider("aws.auth#sigv4a"),signer:new chunkPITMDQYN_cjs.g}],logger:r?.logger??new chunkLEBM6ZSZ_cjs.m,md5:r?.md5??chunkEZIDQBXI_cjs.b,protocol:r?.protocol??ia,protocolSettings:r?.protocolSettings??{defaultNamespace:"com.amazonaws.s3",errorTypeRegistries:ux,xmlNamespace:"http://s3.amazonaws.com/doc/2006-03-01/",version:"2006-03-01",serviceTarget:"AmazonS3"},sdkStreamMixin:r?.sdkStreamMixin??chunkLQ3YZTPU_cjs.A,serviceId:r?.serviceId??"S3",sha1:r?.sha1??ic,sha256:r?.sha256??chunkEZIDQBXI_cjs.d,signerConstructor:r?.signerConstructor??chunkUNYXWPLZ_cjs.a,signingEscapePath:r?.signingEscapePath??false,urlParser:r?.urlParser??chunkGNEVCEJU_cjs.i,useArnRegion:r?.useArnRegion??void 0,utf8Decoder:r?.utf8Decoder??chunkLQ3YZTPU_cjs.c,utf8Encoder:r?.utf8Encoder??chunkLQ3YZTPU_cjs.e});var Yx=r=>{chunkLEBM6ZSZ_cjs.i(process.version);let e=chunkGNEVCEJU_cjs.I(r),t=()=>e().then(chunkLEBM6ZSZ_cjs.h),s=Qx(r);chunkLEBM6ZSZ_cjs.a(process.version);let n={profile:r?.profile,logger:s.logger};return {...s,...r,runtime:"node",defaultsMode:e,authSchemePreference:r?.authSchemePreference??chunkGNEVCEJU_cjs.C(chunkPITMDQYN_cjs.h,n),bodyLengthChecker:r?.bodyLengthChecker??chunkLQ3YZTPU_cjs.u,credentialDefaultProvider:r?.credentialDefaultProvider??td,defaultUserAgentProvider:r?.defaultUserAgentProvider??chunkLEBM6ZSZ_cjs.P({serviceId:s.serviceId,clientVersion:Hx.version}),disableS3ExpressSessionAuth:r?.disableS3ExpressSessionAuth??chunkGNEVCEJU_cjs.C(vu,n),eventStreamSerdeProvider:r?.eventStreamSerdeProvider??chunk3VXEK5ZW_cjs.n,maxAttempts:r?.maxAttempts??chunkGNEVCEJU_cjs.C(chunkLEBM6ZSZ_cjs.w,r),region:r?.region??chunkGNEVCEJU_cjs.C(chunkGNEVCEJU_cjs.F,{...chunkGNEVCEJU_cjs.G,...n}),requestChecksumCalculation:r?.requestChecksumCalculation??chunkGNEVCEJU_cjs.C(ou,n),requestHandler:chunkGIS6X43A_cjs.a.create(r?.requestHandler??t),responseChecksumValidation:r?.responseChecksumValidation??chunkGNEVCEJU_cjs.C(iu,n),retryMode:r?.retryMode??chunkGNEVCEJU_cjs.C({...chunkLEBM6ZSZ_cjs.y,default:async()=>(await t()).retryMode||chunkLEBM6ZSZ_cjs.v},r),sigv4aSigningRegionSet:r?.sigv4aSigningRegionSet??chunkGNEVCEJU_cjs.C(chunkPITMDQYN_cjs.j,n),streamCollector:r?.streamCollector??chunkLQ3YZTPU_cjs.z,streamHasher:r?.streamHasher??chunkEZIDQBXI_cjs.a,useArnRegion:r?.useArnRegion??chunkGNEVCEJU_cjs.C(Cu,n),useDualstackEndpoint:r?.useDualstackEndpoint??chunkGNEVCEJU_cjs.C(chunkGNEVCEJU_cjs.D,n),useFipsEndpoint:r?.useFipsEndpoint??chunkGNEVCEJU_cjs.C(chunkGNEVCEJU_cjs.E,n),userAgentAppId:r?.userAgentAppId??chunkGNEVCEJU_cjs.C(chunkLEBM6ZSZ_cjs.Q,n)}};chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var e_=r=>{let e=r.httpAuthSchemes,t=r.httpAuthSchemeProvider,s=r.credentials;return {setHttpAuthScheme(n){let a=e.findIndex(i=>i.schemeId===n.schemeId);a===-1?e.push(n):e.splice(a,1,n);},httpAuthSchemes(){return e},setHttpAuthSchemeProvider(n){t=n;},httpAuthSchemeProvider(){return t},setCredentials(n){s=n;},credentials(){return s}}},t_=r=>({httpAuthSchemes:r.httpAuthSchemes(),httpAuthSchemeProvider:r.httpAuthSchemeProvider(),credentials:r.credentials()});var r_=(r,e)=>{let t=Object.assign(chunkLEBM6ZSZ_cjs.T(r),chunkLEBM6ZSZ_cjs.j(r),chunkGNEVCEJU_cjs.R(r),e_(r));return e.forEach(s=>s.configure(t)),Object.assign(r,chunkLEBM6ZSZ_cjs.U(t),chunkLEBM6ZSZ_cjs.k(t),chunkGNEVCEJU_cjs.S(t),t_(t))};var cc=class extends chunkLEBM6ZSZ_cjs.c{config;constructor(...[e]){let t=Yx(e||{});super(t),this.initConfig=t;let s=qh(t),n=chunkLEBM6ZSZ_cjs.N(s),a=yu(n),i=chunkLEBM6ZSZ_cjs.x(a),c=chunkGNEVCEJU_cjs.H(i),d=c,g=chunkLEBM6ZSZ_cjs.t(d),x=chunk3VXEK5ZW_cjs.q(g),_=Uh(x),O=wu(_,{session:[()=>this,ac]}),H=r_(O,e?.extensions||[]);this.config=H,this.middlewareStack.use(chunkGNEVCEJU_cjs.l(this.config)),this.middlewareStack.use(chunkLEBM6ZSZ_cjs.O(this.config)),this.middlewareStack.use(chunkLEBM6ZSZ_cjs.z(this.config)),this.middlewareStack.use(chunkGNEVCEJU_cjs.T(this.config)),this.middlewareStack.use(chunkLEBM6ZSZ_cjs.B(this.config)),this.middlewareStack.use(chunkLEBM6ZSZ_cjs.C(this.config)),this.middlewareStack.use(chunkLEBM6ZSZ_cjs.D(this.config)),this.middlewareStack.use(chunkLEBM6ZSZ_cjs.E(this.config,{httpAuthSchemeParametersProvider:Bh,identityProviderConfigProvider:async U=>new chunkLEBM6ZSZ_cjs.I({"aws.auth#sigv4":U.credentials,"aws.auth#sigv4a":U.credentials})})),this.middlewareStack.use(chunkLEBM6ZSZ_cjs.G(this.config)),this.middlewareStack.use(ku(this.config)),this.middlewareStack.use(Eu(this.config)),this.middlewareStack.use(_u(this.config)),this.middlewareStack.use(Su(this.config)),this.middlewareStack.use(Au(this.config));}destroy(){super.destroy();}};chunkBUNLC3II_cjs.h();var uc=class extends It(Hh,Vh,"CopyObject",Bx){};chunkBUNLC3II_cjs.h();var Cn=class extends It(Gs,zs,"DeleteObject",Nx){};chunkBUNLC3II_cjs.h();var lc=class extends It(zh,Wh,"DeleteObjects",Mx){};chunkBUNLC3II_cjs.h();var Ma=class extends It(Gs,Zh,"HeadObject",Ux){};chunkBUNLC3II_cjs.h();var Ua=class extends It(Kh,zs,"ListObjectsV2",qx){};chunkBUNLC3II_cjs.h();var qa=class extends It(Gs,Xh,"PutObject",Fx){};function s_(r){if(!r)return "";if(r.startsWith("pub-"))return r;let e=r.match(/pub-[a-zA-Z0-9]+/i);return e?e[0]:""}function Q$(r,e){let t=r.startsWith("/")?r.slice(1):r;if(e.cdnUrl)return `${e.cdnUrl.replace(/\/$/,"")}/${t}`;switch(e.provider){case "r2":{let s=s_(e.publicDevUrl);return s?`https://${s}.r2.dev/${t}`:`https://${e.bucket}.${e.accountId}.r2.cloudflarestorage.com/${t}`}case "gcs":return `https://storage.googleapis.com/${e.bucket}/${t}`;case "digitalocean":return `https://${e.bucket}.${e.region}.cdn.digitaloceanspaces.com/${t}`;case "backblaze":return `https://${e.bucket}.s3.backblazeb2.com/${t}`;case "wasabi":return `https://${e.bucket}.s3.wasabisys.com/${t}`;default:return `https://${e.bucket}.s3.${e.region}.amazonaws.com/${t}`}}function rd(r){if(r.cdnUrl)return r.cdnUrl.replace(/\/$/,"")+"/";switch(r.provider){case "r2":{let e=s_(r.publicDevUrl);return e?`https://${e}.r2.dev/`:`https://${r.bucket}.${r.accountId}.r2.cloudflarestorage.com/`}case "gcs":return `https://storage.googleapis.com/${r.bucket}/`;case "digitalocean":return `https://${r.bucket}.${r.region}.cdn.digitaloceanspaces.com/`;case "backblaze":return `https://${r.bucket}.s3.backblazeb2.com/`;case "wasabi":return `https://${r.bucket}.s3.wasabisys.com/`;default:return `https://${r.bucket}.s3.${r.region}.amazonaws.com/`}}function Y$(r){switch(r){case "r2":return "Cloudflare R2";case "gcs":return "Google Cloud Storage";case "digitalocean":return "DigitalOcean Spaces";case "backblaze":return "Backblaze B2";case "wasabi":return "Wasabi";default:return "AWS S3"}}function eB(r){let e=new cc({region:r.region||"auto",endpoint:r.endpoint,credentials:{accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey},forcePathStyle:true,tls:true,...r.provider==="r2"&&{requestHandler:new chunkGIS6X43A_cjs.a}}),t=n=>`${r.prefix?`${r.prefix}/`:""}${n}`.replace(/\/+/g,"/"),s=n=>Q$(n,r);return Lr({name:r.provider,displayName:Y$(r.provider),supportsDynamicResize:true,async upload(n,a){let i=t(`${a?.folder?`${a.folder}/`:""}${a?.filename||n.name}`),c=Buffer.from(await n.arrayBuffer());await e.send(new qa({Bucket:r.bucket,Key:i,Body:c,ContentType:n.type,Metadata:a?.metadata}));let d=await e.send(new Ma({Bucket:r.bucket,Key:i}));return {id:Buffer.from(i).toString("base64url"),filename:a?.filename||n.name,originalName:n.name,mimeType:n.type,size:c.length,url:s(i),thumbnailUrl:n.type.startsWith("image/")?s(i):void 0,folder:a?.folder,provider:r.provider,metadata:{...a?.metadata,etag:d.ETag},createdAt:new Date().toISOString()}},async delete(n){let a=n.replace(rd(r),"");await e.send(new Cn({Bucket:r.bucket,Key:a}));},async rename(n,a){let i=n.replace(rd(r),""),c=r.prefix?`${r.prefix}/${a}`:a;return await e.send(new uc({Bucket:r.bucket,CopySource:`${r.bucket}/${i}`,Key:c})),await e.send(new Cn({Bucket:r.bucket,Key:i})),s(c)},async list(n){let a=t(n||"");return ((await e.send(new Ua({Bucket:r.bucket,Prefix:a}))).Contents||[]).map(c=>({id:Buffer.from(c.Key||"").toString("base64url"),filename:c.Key?.split("/").pop()||"",originalName:c.Key?.split("/").pop()||"",mimeType:"application/octet-stream",size:c.Size||0,url:s(c.Key||""),provider:r.provider,createdAt:c.LastModified?.toISOString()||new Date().toISOString()}))},async exists(n){try{let a=n.replace(rd(r),"");return await e.send(new Ma({Bucket:r.bucket,Key:a})),!0}catch{return false}},async createFolder(n){let a=t(`${n}/`);await e.send(new qa({Bucket:r.bucket,Key:a,Body:""}));},async deleteFolder(n){let a=t(`${n}/`),i;do{let c=await e.send(new Ua({Bucket:r.bucket,Prefix:a,ContinuationToken:i}));if(c.Contents?.length){let d=c.Contents.map(g=>({Key:g.Key}));await e.send(new lc({Bucket:r.bucket,Delete:{Objects:d}}));}i=c.IsTruncated?c.NextContinuationToken:void 0;}while(i);await e.send(new Cn({Bucket:r.bucket,Key:a}));}})}chunkBUNLC3II_cjs.h();function tB(r){let e=()=>`https://api.cloudinary.com/v1_1/${r.cloudName}/upload`,t=async s=>{let n=await import('crypto'),a=Object.keys(s).sort().map(i=>`${i}=${s[i]}`).join("&");return n.createHash("sha256").update(a+r.apiSecret).digest("hex")};return {name:"cloudinary",displayName:"Cloudinary",supportsDynamicResize:true,async upload(s,n){let a=new FormData;if(a.append("file",s),r.uploadPreset)a.append("upload_preset",r.uploadPreset);else {let d=Math.round(Date.now()/1e3),g={timestamp:String(d)};(n?.folder||r.folder)&&(g.folder=n?.folder||r.folder||"");let x=await t(g);a.append("timestamp",String(d)),a.append("signature",x),a.append("api_key",r.apiKey);}(n?.folder||r.folder)&&a.append("folder",n?.folder||r.folder||"");let i=await fetch(e(),{method:"POST",body:a});if(!i.ok){let d=await i.json();throw new Error(`Cloudinary upload failed: ${d.error?.message||i.statusText}`)}let c=await i.json();return {id:c.public_id,filename:`${c.public_id}.${c.format}`,originalName:c.original_filename||s.name,mimeType:s.type||`image/${c.format}`,size:c.bytes,url:c.secure_url,thumbnailUrl:this.getImageUrl(c.secure_url,{width:200,height:200,fit:"crop"}),width:c.width,height:c.height,folder:n?.folder||r.folder,provider:"cloudinary",createdAt:new Date().toISOString()}},async uploadFromUrl(s,n){let a=new FormData;a.append("file",s),a.append("upload_preset","ml_default"),(n?.folder||r.folder)&&a.append("folder",n?.folder||r.folder||"");let i=await fetch(e(),{method:"POST",body:a});if(!i.ok)throw new Error("Cloudinary upload failed");let c=await i.json();return {id:c.public_id,filename:`${c.public_id}.${c.format}`,originalName:c.original_filename||s.split("/").pop()||"file",mimeType:`image/${c.format}`,size:c.bytes,url:c.secure_url,thumbnailUrl:this.getImageUrl(c.secure_url,{width:200,height:200,fit:"crop"}),width:c.width,height:c.height,provider:"cloudinary",createdAt:new Date().toISOString()}},async delete(s){try{let n=s.split("/image/upload/");if(n.length!==2){console.warn("[Cloudinary delete] Could not parse URL:",s);return}let a=n[1].replace(/^v\d+\//,"").replace(/\.[^.]+$/,""),i=Math.round(Date.now()/1e3),c={timestamp:String(i),public_id:a},d=Object.keys(c).sort().map(U=>`${U}=${c[U]}`).join("&"),x=(await import('crypto')).createHash("sha256").update(d+r.apiSecret).digest("hex"),_=`https://api.cloudinary.com/v1_1/${r.cloudName}/image/destroy`,O=new FormData;O.append("public_id",a),O.append("timestamp",String(i)),O.append("signature",x),O.append("api_key",r.apiKey);let H=await fetch(_,{method:"POST",body:O});if(!H.ok){let U=await H.json();console.warn("[Cloudinary delete] Failed:",U);}}catch(n){console.warn("[Cloudinary delete] Error:",n.message);}},async rename(s,n){let a="",i=n.replace(/\.[^.]+$/,""),c="";try{let d=s.split("/image/upload/");if(d.length!==2)return console.warn("[Cloudinary rename] Could not parse old URL:",s),s;let g=d[1],x=g.match(/^(v\d+)\//);a=x?x[1]:"";let _=g.replace(/^v\d+\//,"").replace(/\.[^.]+$/,""),O=_.split("/");c=O.length>1?O.slice(0,-1).join("/"):"";let H=n.replace(/\.[^.]+$/,"");i=c?`${c}/${H}`:H;let U=Math.round(Date.now()/1e3),F={from_public_id:_,to_public_id:i,timestamp:String(U)},ce=Object.keys(F).sort().map(We=>`${We}=${F[We]}`).join("&"),Oe=(await import('crypto')).createHash("sha256").update(ce+r.apiSecret).digest("hex"),W=new FormData;W.append("from_public_id",_),W.append("to_public_id",i),W.append("timestamp",String(U)),W.append("signature",Oe),W.append("api_key",r.apiKey);let vt=await fetch(`https://api.cloudinary.com/v1_1/${r.cloudName}/image/rename`,{method:"POST",body:W});if(vt.ok)return (await vt.json()).secure_url;{let We=await vt.json();console.warn("[Cloudinary rename] Failed:",We);let q=a?`/${a}/`:"/";return `https://res.cloudinary.com/${r.cloudName}/image/upload${q}${i}.${n.split(".").pop()}`}}catch(d){console.warn("[Cloudinary rename] Error:",d.message);let g=a?`/${a}/`:"/";return `https://res.cloudinary.com/${r.cloudName}/image/upload${g}${i}.${n.split(".").pop()}`}},getImageUrl(s,n){if(!n)return s;let a=s.split("/upload/");if(a.length!==2)return s;let i=[];if(n.width&&i.push(`w_${n.width}`),n.height&&i.push(`h_${n.height}`),n.fit){let d={crop:"c_fill",clip:"c_fit",scale:"c_scale",fill:"c_fill"};i.push(d[n.fit]||"c_limit");}n.quality&&i.push(`q_${n.quality}`),n.format&&i.push(`f_${n.format}`);let c=i.join(",");return `${a[0]}/upload/${c}/${a[1]}`},async generateThumbnail(s){return this.getImageUrl(s.url,{width:200,height:200,fit:"crop"})},async list(){return []},async exists(s){return (await fetch(s,{method:"HEAD"})).ok},async createFolder(){},async deleteFolder(){}}}chunkBUNLC3II_cjs.h();async function n_(r){let e=r.getStorageConfig(),t=au();try{return await t.resolve(e.type,e)}catch(s){return console.warn(`[resolveProvider] ${s.message} \u2014 falling back to local storage`),gs({uploadDir:ko__default.default.join(process.cwd(),"public","uploads"),baseUrl:"/uploads"})}}function Lr(r){return {async uploadFromUrl(e,t){let s=await fetch(e);if(!s.ok)throw new Error(`Failed to fetch: ${s.statusText}`);let n=await s.blob(),a=e.split("/").pop()||"file",i=new File([n],a,{type:n.type});return this.upload(i,t)},getImageUrl(e,t){if(!t||Object.keys(t).length===0)return e;let s=new URLSearchParams({url:e});return t.width&&s.set("w",String(t.width)),t.height&&s.set("h",String(t.height)),t.quality&&s.set("q",String(t.quality)),t.format&&s.set("f",t.format),t.cropWidth&&t.cropHeight&&(s.set("cx",String(t.cropX??0)),s.set("cy",String(t.cropY??0)),s.set("cw",String(t.cropWidth)),s.set("ch",String(t.cropHeight))),`/api/media/resize?${s.toString()}`},async generateThumbnail(e){return this.getImageUrl(e.url,{width:400,height:400})},...r}}async function a_(r){if(!r)return console.warn("[resolveProviderWithConfig] No config, using local"),gs({uploadDir:ko__default.default.join(process.cwd(),"public","uploads"),baseUrl:"/uploads"});let e=r.type||"local",t=au();try{return await t.resolveWithConfig(e,r)}catch(s){return console.warn(`[resolveProviderWithConfig] ${s.message} \u2014 falling back to local storage`),gs({uploadDir:ko__default.default.join(process.cwd(),"public","uploads"),baseUrl:"/uploads"})}}chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();function o_(){return typeof globalThis>"u"?false:typeof globalThis.EdgeRuntime=="string"||typeof globalThis.WebSocketPair<"u"||typeof globalThis.Deno<"u"||typeof process<"u"&&process.env?.NEXT_RUNTIME==="edge"}async function i_(r){if(!o_())try{let{default:e}=await import('sharp'),t=await e(r).metadata(),s=e(r).webp({quality:85}),n=e(r).resize({width:500,withoutEnlargement:!0}).webp({quality:80});return {buffer:await s.toBuffer(),thumbnailBuffer:await n.toBuffer(),width:t.width,height:t.height,format:"webp"}}catch{}return {buffer:r,thumbnailBuffer:r,format:"passthrough"}}var nd=false;function Fa(r){if(typeof r!="string")return r;let e=r.replace(/-/g,"").toLowerCase();return e.length===32?`${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20)}`:r}var dc=class r{db;storage;dialect;genId;mediaTable="media";foldersTable="media_folders";constructor(e,t,s){this.db=e,this.storage=t,this.dialect=s?.dialect||"sqlite",this.genId=s?.genId||chunkTDGSIF5H_cjs.e;}static async init(e,t){let s;if(t?.storageConfig)s=await a_(t.storageConfig);else {let a=new chunkXTTGHN3D_cjs.p(e);await a.load(),s=await n_(a);}let n=new r(e,s,t);return await n.ensureTables(),n}async ensureTables(){if(this.dialect==="mongodb"){let e=this.db.db;await e.collection(this.mediaTable).createIndex({filename:1},{unique:true}),await e.collection(this.foldersTable).createIndex({path:1},{unique:true}),nd=true;return}if(this.dialect==="sqlite"){this.db.exec(`
|
|
52
52
|
CREATE TABLE IF NOT EXISTS media (
|
|
53
53
|
id TEXT PRIMARY KEY,
|
|
54
54
|
filename TEXT NOT NULL UNIQUE,
|
|
@@ -116,7 +116,7 @@
|
|
|
116
116
|
]))`;continue}}if(t.s&&s[d]==="."){n+=i?`${s[d]}\r
|
|
117
117
|
`:`[${s[d]}\r
|
|
118
118
|
]`;continue}n+=s[d],s[d]==="\\"?a=true:i&&s[d]==="]"?i=false:!i&&s[d]==="["&&(i=true);}try{new RegExp(n);}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),r.source}return n}function xc(r,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&r.keyType?._def.typeName===exports.ia.ZodEnum)return {type:"object",required:r.keyType._def.values,properties:r.keyType._def.values.reduce((s,n)=>({...s,[n]:te(r.valueType._def,{...e,currentPath:[...e.currentPath,"properties",n]})??Le(e)}),{}),additionalProperties:e.rejectedAdditionalProperties};let t={type:"object",additionalProperties:te(r.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return t;if(r.keyType?._def.typeName===exports.ia.ZodString&&r.keyType._def.checks?.length){let{type:s,...n}=yc(r.keyType._def,e);return {...t,propertyNames:n}}else {if(r.keyType?._def.typeName===exports.ia.ZodEnum)return {...t,propertyNames:{enum:r.keyType._def.values}};if(r.keyType?._def.typeName===exports.ia.ZodBranded&&r.keyType._def.type._def.typeName===exports.ia.ZodString&&r.keyType._def.type._def.checks?.length){let{type:s,...n}=gc(r.keyType._def,e);return {...t,propertyNames:n}}}return t}function T_(r,e){if(e.mapStrategy==="record")return xc(r,e);let t=te(r.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||Le(e),s=te(r.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||Le(e);return {type:"array",maxItems:125,items:{type:"array",items:[t,s],minItems:2,maxItems:2}}}chunkBUNLC3II_cjs.h();function O_(r){let e=r.values,s=Object.keys(r.values).filter(a=>typeof e[e[a]]!="number").map(a=>e[a]),n=Array.from(new Set(s.map(a=>typeof a)));return {type:n.length===1?n[0]==="string"?"string":"number":["string","number"],enum:s}}chunkBUNLC3II_cjs.h();function P_(r){return r.target==="openAi"?void 0:{not:Le({...r,currentPath:[...r.currentPath,"not"]})}}chunkBUNLC3II_cjs.h();function I_(r){return r.target==="openApi3"?{enum:["null"],nullable:true}:{type:"null"}}chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var Xa={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function L_(r,e){if(e.target==="openApi3")return D_(r,e);let t=r.options instanceof Map?Array.from(r.options.values()):r.options;if(t.every(s=>s._def.typeName in Xa&&(!s._def.checks||!s._def.checks.length))){let s=t.reduce((n,a)=>{let i=Xa[a._def.typeName];return i&&!n.includes(i)?[...n,i]:n},[]);return {type:s.length>1?s:s[0]}}else if(t.every(s=>s._def.typeName==="ZodLiteral"&&!s.description)){let s=t.reduce((n,a)=>{let i=typeof a._def.value;switch(i){case "string":case "number":case "boolean":return [...n,i];case "bigint":return [...n,"integer"];case "object":if(a._def.value===null)return [...n,"null"];default:return n}},[]);if(s.length===t.length){let n=s.filter((a,i,c)=>c.indexOf(a)===i);return {type:n.length>1?n:n[0],enum:t.reduce((a,i)=>a.includes(i._def.value)?a:[...a,i._def.value],[])}}}else if(t.every(s=>s._def.typeName==="ZodEnum"))return {type:"string",enum:t.reduce((s,n)=>[...s,...n._def.values.filter(a=>!s.includes(a))],[])};return D_(r,e)}var D_=(r,e)=>{let t=(r.options instanceof Map?Array.from(r.options.values()):r.options).map((s,n)=>te(s._def,{...e,currentPath:[...e.currentPath,"anyOf",`${n}`]})).filter(s=>!!s&&(!e.strictUnions||typeof s=="object"&&Object.keys(s).length>0));return t.length?{anyOf:t}:void 0};function $_(r,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(r.innerType._def.typeName)&&(!r.innerType._def.checks||!r.innerType._def.checks.length))return e.target==="openApi3"?{type:Xa[r.innerType._def.typeName],nullable:true}:{type:[Xa[r.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let s=te(r.innerType._def,{...e,currentPath:[...e.currentPath]});return s&&"$ref"in s?{allOf:[s],nullable:true}:s&&{...s,nullable:true}}let t=te(r.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return t&&{anyOf:[t,{type:"null"}]}}chunkBUNLC3II_cjs.h();function B_(r,e){let t={type:"number"};if(!r.checks)return t;for(let s of r.checks)switch(s.kind){case "int":t.type="integer",ad(t,"type",s.message,e);break;case "min":e.target==="jsonSchema7"?s.inclusive?fe(t,"minimum",s.value,s.message,e):fe(t,"exclusiveMinimum",s.value,s.message,e):(s.inclusive||(t.exclusiveMinimum=true),fe(t,"minimum",s.value,s.message,e));break;case "max":e.target==="jsonSchema7"?s.inclusive?fe(t,"maximum",s.value,s.message,e):fe(t,"exclusiveMaximum",s.value,s.message,e):(s.inclusive||(t.exclusiveMaximum=true),fe(t,"maximum",s.value,s.message,e));break;case "multipleOf":fe(t,"multipleOf",s.value,s.message,e);break}return t}chunkBUNLC3II_cjs.h();function j_(r,e){let t=e.target==="openAi",s={type:"object",properties:{}},n=[],a=r.shape();for(let c in a){let d=a[c];if(d===void 0||d._def===void 0)continue;let g=LB(d);g&&t&&(d._def.typeName==="ZodOptional"&&(d=d._def.innerType),d.isNullable()||(d=d.nullable()),g=false);let x=te(d._def,{...e,currentPath:[...e.currentPath,"properties",c],propertyPath:[...e.currentPath,"properties",c]});x!==void 0&&(s.properties[c]=x,g||n.push(c));}n.length&&(s.required=n);let i=DB(r,e);return i!==void 0&&(s.additionalProperties=i),s}function DB(r,e){if(r.catchall._def.typeName!=="ZodNever")return te(r.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(r.unknownKeys){case "passthrough":return e.allowedAdditionalProperties;case "strict":return e.rejectedAdditionalProperties;case "strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function LB(r){try{return r.isOptional()}catch{return true}}chunkBUNLC3II_cjs.h();var N_=(r,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return te(r.innerType._def,e);let t=te(r.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return t?{anyOf:[{not:Le(e)},t]}:Le(e)};chunkBUNLC3II_cjs.h();var M_=(r,e)=>{if(e.pipeStrategy==="input")return te(r.in._def,e);if(e.pipeStrategy==="output")return te(r.out._def,e);let t=te(r.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),s=te(r.out._def,{...e,currentPath:[...e.currentPath,"allOf",t?"1":"0"]});return {allOf:[t,s].filter(n=>n!==void 0)}};chunkBUNLC3II_cjs.h();function U_(r,e){return te(r.type._def,e)}chunkBUNLC3II_cjs.h();function q_(r,e){let s={type:"array",uniqueItems:true,items:te(r.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return r.minSize&&fe(s,"minItems",r.minSize.value,r.minSize.message,e),r.maxSize&&fe(s,"maxItems",r.maxSize.value,r.maxSize.message,e),s}chunkBUNLC3II_cjs.h();function F_(r,e){return r.rest?{type:"array",minItems:r.items.length,items:r.items.map((t,s)=>te(t._def,{...e,currentPath:[...e.currentPath,"items",`${s}`]})).reduce((t,s)=>s===void 0?t:[...t,s],[]),additionalItems:te(r.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:r.items.length,maxItems:r.items.length,items:r.items.map((t,s)=>te(t._def,{...e,currentPath:[...e.currentPath,"items",`${s}`]})).reduce((t,s)=>s===void 0?t:[...t,s],[])}}chunkBUNLC3II_cjs.h();function H_(r){return {not:Le(r)}}chunkBUNLC3II_cjs.h();function G_(r){return Le(r)}chunkBUNLC3II_cjs.h();var z_=(r,e)=>te(r.innerType._def,e);var K_=(r,e,t)=>{switch(e){case exports.ia.ZodString:return yc(r,t);case exports.ia.ZodNumber:return B_(r,t);case exports.ia.ZodObject:return j_(r,t);case exports.ia.ZodBigInt:return w_(r,t);case exports.ia.ZodBoolean:return b_();case exports.ia.ZodDate:return md(r,t);case exports.ia.ZodUndefined:return H_(t);case exports.ia.ZodNull:return I_(t);case exports.ia.ZodArray:return __(r,t);case exports.ia.ZodUnion:case exports.ia.ZodDiscriminatedUnion:return L_(r,t);case exports.ia.ZodIntersection:return k_(r,t);case exports.ia.ZodTuple:return F_(r,t);case exports.ia.ZodRecord:return xc(r,t);case exports.ia.ZodLiteral:return C_(r,t);case exports.ia.ZodEnum:return R_(r);case exports.ia.ZodNativeEnum:return O_(r);case exports.ia.ZodNullable:return $_(r,t);case exports.ia.ZodOptional:return N_(r,t);case exports.ia.ZodMap:return T_(r,t);case exports.ia.ZodSet:return q_(r,t);case exports.ia.ZodLazy:return ()=>r.getter()._def;case exports.ia.ZodPromise:return U_(r,t);case exports.ia.ZodNaN:case exports.ia.ZodNever:return P_(t);case exports.ia.ZodEffects:return A_(r,t);case exports.ia.ZodAny:return Le(t);case exports.ia.ZodUnknown:return G_(t);case exports.ia.ZodDefault:return S_(r,t);case exports.ia.ZodBranded:return gc(r,t);case exports.ia.ZodReadonly:return z_(r,t);case exports.ia.ZodCatch:return v_(r,t);case exports.ia.ZodPipeline:return M_(r,t);case exports.ia.ZodFunction:case exports.ia.ZodVoid:case exports.ia.ZodSymbol:return;default:return (s=>{})()}};function te(r,e,t=false){let s=e.seen.get(r);if(e.override){let c=e.override?.(r,e,s,t);if(c!==u_)return c}if(s&&!t){let c=$B(s,e);if(c!==void 0)return c}let n={def:r,path:e.currentPath,jsonSchema:void 0};e.seen.set(r,n);let a=K_(r,r.typeName,e),i=typeof a=="function"?te(a(),e):a;if(i&&BB(r,e,i),e.postProcess){let c=e.postProcess(i,r,e);return n.jsonSchema=i,c}return n.jsonSchema=i,i}var $B=(r,e)=>{switch(e.$refStrategy){case "root":return {$ref:r.path.join("/")};case "relative":return {$ref:pc(e.currentPath,r.path)};case "none":case "seen":return r.path.length<e.currentPath.length&&r.path.every((t,s)=>e.currentPath[s]===t)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),Le(e)):e.$refStrategy==="seen"?Le(e):void 0}},BB=(r,e,t)=>(r.description&&(t.description=r.description,e.markdownDescription&&(t.markdownDescription=r.description)),t);chunkBUNLC3II_cjs.h();chunkBUNLC3II_cjs.h();var zn=(r,e)=>{let t=d_(e),s=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((d,[g,x])=>({...d,[g]:te(x._def,{...t,currentPath:[...t.basePath,t.definitionPath,g]},true)??Le(t)}),{}):void 0,n=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,a=te(r._def,n===void 0?t:{...t,currentPath:[...t.basePath,t.definitionPath,n]},false)??Le(t),i=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;i!==void 0&&(a.title=i),t.flags.hasReferencedOpenAiAnyType&&(s||(s={}),s[t.openAiAnyTypeName]||(s[t.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:t.$refStrategy==="relative"?"1":[...t.basePath,t.definitionPath,t.openAiAnyTypeName].join("/")}}));let c=n===void 0?s?{...a,[t.definitionPath]:s}:a:{$ref:[...t.$refStrategy==="relative"?[]:t.basePath,t.definitionPath,n].join("/"),[t.definitionPath]:{...s,[n]:a}};return t.target==="jsonSchema7"?c.$schema="http://json-schema.org/draft-07/schema#":(t.target==="jsonSchema2019-09"||t.target==="openAi")&&(c.$schema="https://json-schema.org/draft/2019-09/schema#"),t.target==="openAi"&&("anyOf"in c||"oneOf"in c||"allOf"in c||"type"in c&&Array.isArray(c.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),c};var UB={_media:{create:chunkAK754S3T_cjs.d.MEDIA_UPLOAD,update:chunkAK754S3T_cjs.d.MEDIA_UPLOAD,delete:chunkAK754S3T_cjs.d.MEDIA_DELETE}};function Ja(r,e){let t=UB[r];return t?t[e]:`collection.${e}`}function qB(r){let e=r.headers.get("x-forwarded-for");return e?e.split(",")[0].trim():r.headers.get("x-real-ip")||"unknown"}function _c(r,e,t,s,n){e?.apiKeyId&&r&&r.createAuditLog({action:"api_request",userId:e.userId||"",resource:"api_key",resourceId:e.apiKeyId,success:true,metadata:{endpoint:t,method:s,ip:qB(n)}});}function wc(r){return r.baseUpdatedAt??r._baseUpdatedAt}function gd(r){let{baseUpdatedAt:e,_baseUpdatedAt:t,...s}=r;return s}function yd(r,e){return {error:"Document has changed since you started editing",code:"REVISION_CONFLICT",conflict:{expectedUpdatedAt:r??null,actualUpdatedAt:e.updatedAt??null,current:e}}}async function Ie(r,e,t,s,n,a,i=true,c="none"){return await chunkAK754S3T_cjs.b(r,e,{user:s,req:t,tenantId:n,apiKey:a},{enablePublicAccess:i,defaultAccess:c})}async function Yt(r,e,t,s,n,a=true){return await chunkAK754S3T_cjs.c(r,e,{user:s,req:t,tenantId:n},{enablePublicAccess:a})}async function V(r,e,t,s){if(t)return {user:t,tenantId:s,apiKeyContext:void 0,authType:"static"};if(e){let n=await e(r);if(n.status===200&&n.user)return {user:n.user,tenantId:n.tenantContext?.tenantId,apiKeyContext:n.apiKeyContext,authType:n.authType}}return {user:void 0,tenantId:void 0,apiKeyContext:void 0,authType:void 0}}async function FB(r,e){if("dialect"in r&&r.dialect==="postgres")return new chunkXBQ6HV3T_cjs.a({db:r.client});if("dialect"in r&&r.dialect==="sqlite")return new So({db:r.client});if("dialect"in r&&r.dialect==="mongodb"){let s=r;return new chunk7DUKWHRN_cjs.a({db:()=>s.db,adapter:s})}let t=ko.resolve(e,"data","auth.db");return new chunkBHR7OAU4_cjs.a({path:process.env.KYRO_AUTH_DB_PATH||t})}async function Z_(r){let{registry:e,db:t,authSecret:s,authAdapter:n,checkSession:a,user:i,tenantId:c,cors:d,webhookService:g,settings:x}=r,_=new Mc;function O(l){if(Array.isArray(l))return l.map(O);if(l!==null&&typeof l=="object"){let y={};for(let b in l)b!=="attrs"&&(y[b]=O(l[b]));return y}return l}_.use("*",async(l,y)=>{await y();let b=l.req.header("referer")||"";if(!(l.req.header("x-kyro-admin")==="true"||b.includes("/admin"))){let f=l.res.headers.get("Content-Type");if(f&&f.includes("application/json"))try{let w=await l.res.clone().json(),k=O(w);l.res=l.json(k,l.res.status);}catch{}}});for(let l of e.getPlugins())typeof l.serverMiddleware=="function"&&l.serverMiddleware(_);let H=x?.access?.apiAccess,U=x?.access?.enablePublicAccess??false,F=x?.access?.defaultCollectionAccess??"none";H?.requireAuth;let re=process.cwd(),Oe=re.endsWith("admin")?ko.resolve(re,".."):re,W=n||await FB(t,Oe),q=Xm({db:t,userLookup:async l=>await W.findUserById(l)||null}),Dt=H?.cors?.allowedOrigins,ls=d?.origins,Ir=Array.isArray(Dt)?Dt:typeof Dt=="string"&&Dt?Dt.split(`
|
|
119
|
-
`).map(l=>l.trim()).filter(Boolean):[],Fe=Ir.length>0?Ir:ls||[];(Fe.length>0||d)&&_.use("*",async(l,y)=>{let b=l.req.header("Origin")||"*";if(Fe.length>0&&!Fe.includes(b))return l.json({error:"Origin not allowed"},403);let A=Fe.length>0?b:"*";if(l.header("Access-Control-Allow-Origin",A),l.header("Access-Control-Allow-Methods","GET, POST, PATCH, DELETE, OPTIONS"),l.header("Access-Control-Allow-Headers","Content-Type, Authorization, X-API-Key"),d?.credentials&&l.header("Access-Control-Allow-Credentials","true"),l.req.method==="OPTIONS")return l.text("");await y();});let mr=x?.access?.rateLimiting,er;if(mr?.enabled){let l=mr.maxRequests||100,y=mr.windowMs||6e4;er=new bo({"api:general":{window:y,max:l}}),_.use("/api/*",async(b,A)=>{if(!er)return A();let f=b.req.header("CF-Connecting-IP")||b.req.header("X-Forwarded-For")?.split(",")[0]?.trim()||b.req.header("X-Real-IP")||"unknown",p=await er.check("api:general",f);if(b.header("X-RateLimit-Limit",String(l)),b.header("X-RateLimit-Remaining",String(p.remaining)),b.header("X-RateLimit-Reset",String(p.resetAt)),!p.allowed)return b.json({error:"Too many requests",retryAfter:p.retryAfter},429);await A();});}let _e=new vo({redis:W,jwtSecret:s||"change-me",baseUrl:process.env.KYRO_BASE_URL||"http://localhost:4321",rateLimiter:er});chunkVKXWJOWI_cjs.q.fromConfig(t).then(l=>{l&&(_e.email=l);}).catch(l=>{console.error("[Email] Failed to initialize transport from config:",l);}),_.post("/api/auth/login",async l=>_e.login(l.req.raw)),_.post("/api/auth/register",async l=>{try{let y=await t.findOne({collection:"_globals_system",where:{}});if(y&&y.enableRegistration===!1)return l.json({error:"User registration is currently disabled by administrator."},403);if(y?.defaultRegistrationRole){let b=l.req.raw;if((b.headers.get("content-type")||"").includes("application/json")){let f=await l.req.json();f.role||(f.role=y.defaultRegistrationRole);let p=new Request(b.url,{method:b.method,headers:b.headers,body:JSON.stringify(f)});return _e.register(p)}}}catch{}return _e.register(l.req.raw)}),_.post("/api/auth/logout",async l=>_e.logout(l.req.raw)),_.post("/api/auth/refresh",async l=>_e.refresh(l.req.raw)),_.get("/api/auth/me",async l=>_e.me(l.req.raw)),_.post("/api/auth/forgot-password",async l=>_e.forgotPassword(l.req.raw)),_.post("/api/auth/reset-password",async l=>_e.resetPassword(l.req.raw)),_.post("/api/auth/change-password",async l=>_e.changePassword(l.req.raw)),_.get("/api/auth/verify-email",async l=>_e.verifyEmail(l.req.raw)),_.post("/api/auth/verify-email",async l=>_e.verifyEmail(l.req.raw)),_.get("/api/auth/verify",async l=>_e.verifyEmail(l.req.raw)),_.post("/api/auth/verify",async l=>_e.verifyEmail(l.req.raw)),_.post("/api/auth/magic-link",async l=>_e.requestMagicLink(l.req.raw)),_.get("/api/auth/magic-link",async l=>_e.verifyMagicLink(l.req.raw)),_.post("/api/auth/invite",async l=>_e.inviteUser(l.req.raw)),_.get("/api/auth/sessions",async l=>_e.listSessions(l.req.raw)),_.post("/api/auth/sessions/refresh",async l=>_e.refreshSession(l.req.raw)),_.delete("/api/auth/sessions",async l=>_e.revokeOtherSessions(l.req.raw)),_.delete("/api/auth/sessions/:id",async l=>_e.revokeSession(l.req.raw,l.req.param("id"))),_.put("/api/auth/sessions/:id/name",async l=>_e.renameSession(l.req.raw,l.req.param("id"))),_.get("/api/auth/access",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Not authenticated"},401);let A={},f={};for(let p of e.getCollections()){let w={read:(await Ie(p,"read",l.req.raw,y,b,void 0,U,F)).allowed,create:(await Ie(p,"create",l.req.raw,y,b,void 0,U,F)).allowed,update:(await Ie(p,"update",l.req.raw,y,b,void 0,U,F)).allowed,delete:(await Ie(p,"delete",l.req.raw,y,b,void 0,U,F)).allowed};A[p.slug]=w;}for(let p of e.getGlobals()){let w={read:(await Yt(p,"read",l.req.raw,y,b,U)).allowed,update:(await Yt(p,"update",l.req.raw,y,b,U)).allowed};f[p.slug]=w;}return l.json({collections:A,globals:f})}catch(y){return l.json({error:y.message},500)}});let Lt=typeof e.hasCollection=="function"&&e.hasCollection("users")?e.getCollection("users"):(()=>{try{return e.getCollection("users")}catch{return chunkZO3YB5DK_cjs.a}})();_.get("/api/users",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c),A=await Ie(Lt,"read",l.req.raw,y,b,void 0,U,F);if(!A.allowed)return l.json({error:A.error},A.status||403);let f=parseInt(l.req.query("page")||"1"),p=Math.min(parseInt(l.req.query("limit")||"10"),100),w=l.req.query("search")||void 0,k=[],v=0;if(typeof W.findUsers=="function"){let R=await W.findUsers({page:f,limit:p,search:w});k=R.users||[],v=R.total||0;}else {let R=await t.find({collection:"users",page:f,limit:p,where:w?{email:{contains:w}}:{},tenantId:b});k=R.docs||[],v=R.totalDocs||0;}return l.json({docs:k,totalDocs:v,limit:p,totalPages:Math.ceil(v/p)||1,page:f,pagingCounter:(f-1)*p+1,hasPrevPage:f>1,hasNextPage:f<Math.ceil(v/p),prevPage:f>1?f-1:null,nextPage:f<Math.ceil(v/p)?f+1:null})}catch(y){return console.error("[API] Error listing users:",y),l.json({error:y.message},500)}}),_.get("/api/users/:id",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c),A=l.req.param("id"),f=await W.findUserById(A);return f?l.json({data:f}):l.json({error:"User not found"},404)}catch(y){return l.json({error:y.message},500)}}),_.post("/api/users",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c),A=await Ie(Lt,"create",l.req.raw,y,b,void 0,U,F);if(!A.allowed)return l.json({error:A.error},A.status||403);let f=await l.req.json();if(!f.email||!f.password)return l.json({error:"Email and password are required"},400);if(await W.findUserByEmail(f.email))return l.json({error:"Email already in use"},400);let w=f.role||"customer";if(w!=="customer"&&y?.role!=="super_admin")return l.json({error:"Forbidden: Only super_admin can assign administrative roles"},403);let k=await W.createUser({email:f.email,password:f.password,name:f.name,role:w,avatar:f.avatar,tenantId:f.tenantId});return y&&W?.createAuditLog({action:"user_create",userId:y.id,resource:"users",resourceId:k.id,success:!0}),l.json({data:k,message:"User created successfully"},201)}catch(y){return l.json({error:y.message},500)}}),_.patch("/api/users/:id",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c),A=await Ie(Lt,"update",l.req.raw,y,b,void 0,U,F);if(!A.allowed)return l.json({error:A.error},A.status||403);let f=l.req.param("id"),p=await l.req.json(),w=await W.findUserById(f);if(!w)return l.json({error:"User not found"},404);let k={};if(p.name!==void 0&&(k.name=p.name),p.email!==void 0&&(k.email=p.email),p.role!==void 0&&p.role!==w.role){if(y?.role!=="super_admin")return l.json({error:"Forbidden: Only super_admin can modify user roles"},403);k.role=p.role;}p.avatar!==void 0&&(k.avatar=typeof p.avatar=="object"&&p.avatar!==null?p.avatar.id||String(p.avatar):p.avatar),p.tenantId!==void 0&&(k.tenantId=p.tenantId),p.emailVerified!==void 0&&(k.emailVerified=p.emailVerified),p.locked!==void 0&&(k.locked=p.locked),p.failedLoginAttempts!==void 0&&(k.failedLoginAttempts=p.failedLoginAttempts),p.lastLogin!==void 0&&(k.lastLogin=p.lastLogin);let v=await W.updateUser(f,k);return v?(y&&(W?.createAuditLog({action:"user_update",userId:y.id,resource:"users",resourceId:f,success:!0}),p.role&&w.role!==p.role&&W?.createAuditLog({action:"role_change",userId:y.id,resource:"users",resourceId:f,success:!0,metadata:{oldRole:w.role,newRole:p.role}})),l.json({data:v,message:"User updated successfully"})):l.json({error:"User update failed"},500)}catch(y){return l.json({error:y.message},500)}}),_.delete("/api/users/:id",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c),A=await Ie(Lt,"delete",l.req.raw,y,b,void 0,U,F);if(!A.allowed)return l.json({error:A.error},A.status||403);let f=l.req.param("id");if(y&&y.id===f)return l.json({error:"You cannot delete your own account"},403);let p=await W.findUserById(f);return p?await W.deleteUser(f)?(y&&W?.createAuditLog({action:"user_delete",userId:y.id,resource:"users",resourceId:f,success:!0}),l.json({data:p,message:"User deleted successfully"})):l.json({error:"User deletion failed"},500):l.json({error:"User not found"},404)}catch(y){return l.json({error:y.message},500)}}),_.get("/api/auth/audit-logs",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c),A=e.getCollection("audit_logs");if(A){let I=await Ie(A,"read",l.req.raw,y,b,void 0,U,F);if(!I.allowed)return l.json({error:I.error},I.status||403)}else if(!y)return l.json({error:"Authentication required"},401);let f=parseInt(l.req.query("page")||"1"),p=Math.min(parseInt(l.req.query("limit")||"50"),100),w=l.req.query("action")||void 0,k=l.req.query("userId")||void 0,v=l.req.query("resource")||void 0,R=await W.findAuditLogs({action:w,userId:k,resource:v,limit:p,offset:(f-1)*p});return l.json({docs:R.logs,totalDocs:R.total,limit:p,totalPages:Math.ceil(R.total/p),page:f,pagingCounter:(f-1)*p+1,hasPrevPage:f>1,hasNextPage:f<Math.ceil(R.total/p),prevPage:f>1?f-1:null,nextPage:f<Math.ceil(R.total/p)?f+1:null})}catch(y){return console.error("[API] Error listing audit logs:",y),l.json({error:y.message},500)}});let $t=null,Dr=null,ft=async()=>{if(Dr)throw Dr;if(!$t)try{let l="sqlite";"dialect"in t&&t.dialect==="postgres"&&t instanceof chunkTDGSIF5H_cjs.c?l=t.dialect:"dialect"in t&&t.dialect==="mongodb"&&(l="mongodb");let y=l==="postgres"&&t instanceof chunkTDGSIF5H_cjs.c?t.client:t;$t=await dc.init(y,{dialect:l});}catch(l){throw console.error("[getMedia] Init error:",l),Dr=l,l}return $t};_.get("/api/media",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=await ft(),A=new URL(l.req.url).origin,f=parseInt(l.req.query("page")||"1"),p=parseInt(l.req.query("limit")||"30"),w=l.req.query("search")||"",k=l.req.query("type")||"",v=l.req.query("folder")||"",R=await b.find({page:f,limit:p,search:w,type:k,folder:v},A);return l.json(R)}catch(y){return console.error("[Media] find error:",y),l.json({error:y.message},500)}}),_.post("/api/media/upload",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=await ft(),A=l.req.header("content-type")||"",f=new URL(l.req.url).origin;if(A.includes("multipart/form-data")){let R=await l.req.formData(),I=R.get("file"),T=R.get("folder")||"";if(!I)return l.json({error:"No file uploaded"},400);let j=await b.upload(I,T,f);return l.json(j)}let p=await l.req.json(),{url:w}=p,k=p.folder||"";if(!w)return l.json({error:"No URL provided"},400);let v=await b.uploadFromUrl(w,k,f);return l.json(v)}catch(y){return console.error("[Media] upload error:",y),l.json({error:y.message},500)}}),_.get("/api/media/folders",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let A=await(await ft()).listFolders();return l.json(A)}catch(y){return console.error("[Media] folders error:",y),l.json({error:y.message},500)}}),_.post("/api/media/folders",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=await ft(),A=await l.req.json(),{name:f,parentPath:p}=A;return f?(await b.createFolder(f,p||""),l.json({message:"Folder created",path:p?`${p}/${f}`:f})):l.json({error:"Folder name is required"},400)}catch(y){return console.error("[Media] create folder error:",y),l.json({error:y.message},500)}}),_.delete("/api/media/folders",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=await ft(),A=l.req.query("path");return A?(await b.deleteFolder(A),l.json({message:"Folder deleted"})):l.json({error:"Path is required"},400)}catch(y){return console.error("[Media] delete folder error:",y),l.json({error:y.message},500)}}),_.delete("/api/media/:id",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=await ft(),A=l.req.param("id"),f=new URL(l.req.url).origin;return await b.delete(A,f),l.json({success:!0})}catch(y){return console.error("[Media] delete error:",y),l.json({error:y.message},500)}}),_.get("/api/media/file/:key{.+$}",async l=>{let y=l.req.param("key"),b=globalThis.STORAGE_BUCKET;if(b){let A=await b.get(y);if(!A)return l.notFound();let f=new Headers;return A.writeHttpMetadata(f),f.set("etag",A.httpEtag),new Response(A.body,{headers:f})}return l.notFound()}),_.get("/api/media/resize",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=l.req.query("url"),A=parseInt(l.req.query("w")||"0"),f=parseInt(l.req.query("h")||"0"),p=l.req.query("fit")||"cover",w=parseFloat(l.req.query("cx")||"0"),k=parseFloat(l.req.query("cy")||"0"),v=parseFloat(l.req.query("cw")||"0"),R=parseFloat(l.req.query("ch")||"0");if(!b)return l.json({error:"URL is required"},400);let T=(await ft()).storage;if(T.name!=="local")return l.redirect(b);let j=T.config?.uploadDir||ko.join(process.cwd(),"public","uploads"),$=T.config?.baseUrl||"/uploads";if(!b.startsWith($))return l.redirect(b);let z=b.replace($,""),Q=ko.join(j,z);if(!fs$1.existsSync(Q))return l.json({error:"File not found"},404);let ue=fs$1.readFileSync(Q),{default:X}=await import('sharp'),ye=X(ue);if(v>0&&R>0){let Je=await X(ue).metadata(),Wr=Je.width||0,St=Je.height||0;if(Wr>0&&St>0){let Pt=Math.max(0,Math.min(Math.round(w/100*Wr),Wr-1)),Is=Math.max(0,Math.min(Math.round(k/100*St),St-1)),X_=Math.max(1,Math.min(Math.round(v/100*Wr),Wr-Pt)),J_=Math.max(1,Math.min(Math.round(R/100*St),St-Is));ye=ye.extract({left:Pt,top:Is,width:X_,height:J_});}}(A>0||f>0)&&(ye=ye.resize({width:A>0?A:void 0,height:f>0?f:void 0,fit:p}));let Ze=await ye.toBuffer(),Xe=await X(ue).metadata();return l.header("Content-Type",`image/${Xe.format||"webp"}`),l.header("Cache-Control","public, max-age=31536000, immutable"),l.body(Ze)}catch(y){return console.error("[Media] resize error:",y),l.json({error:y.message},500)}}),_.get("/api/media/:id",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=await ft(),A=l.req.param("id"),f=new URL(l.req.url).origin,p=await b.findById(A,f);return p?l.json(p):l.json({error:"Media not found"},404)}catch(y){return console.error("[Media] get error:",y),l.json({error:y.message},500)}}),_.patch("/api/media/:id",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=await ft(),A=l.req.param("id"),f=await l.req.json(),p=new URL(l.req.url).origin,w=["folder","metadata","title","alt","caption","originalName"],k={};for(let v of w)f[v]!==void 0&&(k[v]=f[v]);if(Object.keys(k).length>0){let v=await b.update(A,k,p);return l.json({doc:v})}return l.json({error:"No valid fields to update"},400)}catch(y){return console.error("[Media] update error:",y),l.json({error:y.message},500)}}),_.get("/api/media/test",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=await ft();return l.json({status:b?"initialized":"failed",serviceType:b?.constructor?.name})}catch(y){return console.error("[test] Error:",y),l.json({error:y.message,type:y.constructor?.name,stack:y.stack},500)}}),_.get("/api/storage-status",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=typeof globalThis.STORAGE_BUCKET<"u"||typeof l.env?.STORAGE_BUCKET<"u",A=b,f=b?"cloudflare_r2":"local";if(t)try{let p=t.prepare('SELECT provider FROM "_globals_storage-settings" LIMIT 1').get();p&&p.provider&&(A=!0,f=p.provider==="aws"?"s3":p.provider);}catch{try{let p=await t.findOne({collection:"_globals_storage-settings",where:{},draft:!0});p&&p.provider&&(A=!0,f=p.provider==="aws"?"s3":p.provider);}catch{}}return l.json({provider:f,configured:A,usage:0,limit:"unlimited"})}catch(y){return console.error("[Storage] status error:",y),l.json({error:y.message},500)}}),_.get("/api/plugins",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=e.getPlugins(),A=e.storageProviders,f=await Promise.all(b.map(async p=>{let w=!0,k=p.name,v={};try{let T=await t.findOne({collection:"_globals_plugin-settings",where:{},draft:!0});T&&T.states&&(v=T.states);}catch{}v[k]!==void 0&&(w=v[k]),A.setPluginEnabled(k,w);let R=k.replace(/^@[^/]+\//,"");R=R.replace(/^(plugin|kyro)-/,"");let I={ai:"AI",seo:"SEO",s3:"S3",aws:"AWS",api:"API",ui:"UI",ftp:"FTP"};if(R=R.split("-").map(T=>{let j=T.toLowerCase();return I[j]?I[j]:T.charAt(0).toUpperCase()+T.slice(1)}).join(" "),R.toLowerCase().startsWith("storage ")){let T=R.split(" ");T.length===2&&(R=`${T[1]} Storage`);}return {id:k,name:p.displayName||R,version:p.version||"1.0.0",description:p.description||"",enabled:w,status:w?"active":"disabled"}}));return l.json(f)}catch(y){return console.error("[Plugins] list error:",y),l.json({error:y.message},500)}}),_.put("/api/plugins/:name/toggle",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=l.req.param("name"),A=e.storageProviders,p=!A.isPluginEnabled(b),w=[];if(!p)for(let v of A.getAll())v.pluginName===b&&w.push(v.type);if(!(l.req.query("force")==="1")&&!p&&w.length>0){let v="local";try{let R=t?.prepare?.('SELECT provider FROM "_globals_storage-settings" LIMIT 1')?.get();R?.provider&&(v=R.provider);}catch{try{let R=await t?.findOne?.({collection:"_globals_storage-settings",where:{},draft:!0});R?.provider&&(v=R.provider);}catch{}}if(w.includes(v))return l.json({error:`Cannot disable "${b}" \u2014 storage provider "${v}" is currently active. Switch to Local storage first.`,requiresAction:!0,activeProvider:v},409)}try{let v={},R="global",I=await t.findOne({collection:"_globals_plugin-settings",where:{},draft:!0});I&&(v=I.states||{},R=I.id),v[b]=p,I?await t.update({collection:"_globals_plugin-settings",id:R,data:{states:v}}):await t.create({collection:"_globals_plugin-settings",data:{states:v,id:"global"}});}catch(v){console.warn(`[Plugins] Could not persist state for "${b}":`,v);}return A.setPluginEnabled(b,p),l.json({name:b,enabled:p})}catch(y){return console.error("[Plugins] toggle error:",y),l.json({error:y.message},500)}}),_.get("/api/health",l=>l.json({status:"ok",version:"0.12.58",collections:e.getCollectionSlugs(),timestamp:new Date().toISOString()})),_.get("/api/metrics",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let A=y.role==="admin"||y.role==="super_admin",p=e.getCollectionSlugs().filter($=>!["users","audit_logs","media","_globals_access-settings","_globals_brand-settings"].includes($)&&!$.startsWith("_globals_")).filter($=>A||chunk7WMMKGEO_cjs.a(y,`${$}:read`)),w=0,k={};await Promise.all(p.map(async $=>{try{let Q=(await t.find({collection:$,where:{},limit:1,page:1,tenantId:b})).totalDocs??0;w+=Q,k[$]=Q;}catch{}}));let v=0;try{v=(await t.find({collection:"media",where:{},limit:1,page:1,tenantId:b})).totalDocs??0;}catch{}let R=0;try{R=(await t.find({collection:"users",where:{},limit:1,page:1,tenantId:b})).totalDocs??0;}catch{}let I=0;try{if(g){let $=await g.getWebhooks();I=Array.isArray($)?$.length:0;}}catch{}let T=0;try{T=(await t.find({collection:chunkDUO523BH_cjs.d,where:{},limit:1,page:1,tenantId:b})).totalDocs??0;}catch{}let j=w+v+R;return l.json({totalDocuments:w,totalMedia:A||chunk7WMMKGEO_cjs.a(y,"media:read")?v:void 0,totalUsers:A||chunk7WMMKGEO_cjs.a(y,"users:read")?R:void 0,totalWebhooks:A?I:void 0,totalApiKeys:A?T:void 0,totalStoredRecords:j,collectionCounts:k,collections:p.length,timestamp:new Date().toISOString()})}catch(y){return console.error("[API] Metrics error:",y),l.json({error:y.message},500)}}),_.get("/api/analytics",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);if(!(y.role==="admin"||y.role==="super_admin"))return l.json({error:"Unauthorized"},403);let p=(await t.find({collection:"orders",where:{},limit:1e3,page:1,tenantId:b})).docs||[],w=await t.findOne({collection:"_globals_store-settings",where:{},tenantId:b}),k=w?.currency?.code||w?.currency||"USD",v={},R={},I={};p.forEach($=>{let z=$.createdAt||$.updatedAt,Q=z?new Date(z).toISOString().split("T")[0]:new Date().toISOString().split("T")[0];v[Q]||(v[Q]=0),R[Q]||(R[Q]=0);let ue=typeof $.total=="number"?$.total:parseFloat(String($.total||0));v[Q]+=isNaN(ue)?0:ue,R[Q]+=1;let X=$.orderStatus||$.status||"pending";I[X]=(I[X]||0)+1;});let T=Object.keys(v).sort().map($=>({date:$,revenue:Math.round(v[$]*100)/100,orders:R[$]})),j=Math.round(T.reduce(($,z)=>$+z.revenue,0)*100)/100;return l.json({chartData:T,totalRevenue:j,totalOrders:p.length,ordersByStatus:I,currencyCode:typeof k=="string"?k:"USD"})}catch(y){return l.json({error:y.message},500)}}),_.get("/api/kyro/schema",async l=>{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=f=>f.map(p=>{let w={name:p.name,type:p.type,label:p.label,required:p.required??false,unique:p.unique??false,indexed:p.indexed??false,defaultValue:p.defaultValue,admin:p.admin?{...p.admin}:void 0};return p.minLength!==void 0&&(w.minLength=p.minLength),p.maxLength!==void 0&&(w.maxLength=p.maxLength),p.pattern!==void 0&&(w.pattern=p.pattern),p.variant!==void 0&&(w.variant=p.variant),p.hasMany!==void 0&&(w.hasMany=p.hasMany),p.min!==void 0&&(w.min=p.min),p.max!==void 0&&(w.max=p.max),p.step!==void 0&&(w.step=p.step),p.integer!==void 0&&(w.integer=p.integer),p.options&&(w.options=p.options),p.relationTo&&(w.relationTo=p.relationTo),p.maxDepth!==void 0&&(w.maxDepth=p.maxDepth),p.minRows!==void 0&&(w.minRows=p.minRows),p.maxRows!==void 0&&(w.maxRows=p.maxRows),p.localized!==void 0&&(w.localized=p.localized),p.language&&(w.language=p.language),p.format&&(w.format=p.format),p.allowedTypes&&(w.allowedTypes=p.allowedTypes),p.maxSize&&(w.maxSize=p.maxSize),(p.type==="group"||p.type==="row"||p.type==="collapsible"&&p.fields)&&(w.fields=b(p.fields)),p.type==="array"&&p.fields&&(w.fields=b(p.fields)),p.type==="blocks"&&p.blocks&&(w.blocks=p.blocks.map(k=>({slug:k.slug,label:k.label,fields:b(k.fields)}))),p.type==="tabs"&&p.tabs&&(w.tabs=p.tabs.map(k=>({label:k.label,name:k.name,fields:b(k.fields)}))),w}),A={collections:{},globals:{}};for(let f of e.getCollections()){let p=f.slug;try{A.collections[p]={slug:p,label:f.label||p,fields:b(f.fields),jsonSchema:zn(e.getZodSchema(p),{target:"openApi3"}),createSchema:zn(e.getCreateZodSchema(p),{target:"openApi3"}),updateSchema:zn(e.getUpdateZodSchema(p),{target:"openApi3"}),procedures:{find:{collection:p,where:"Record<string,any>",sort:"string",limit:"number",page:"number",depth:"number",select:"string[]",draft:"boolean"},findByID:{collection:p,id:"string",depth:"number",select:"string[]",draft:"boolean"},create:{collection:p,data:"Record<string,any>",depth:"number",select:"string[]"},update:{collection:p,id:"string",data:"Record<string,any>",depth:"number",select:"string[]",baseUpdatedAt:"string"},delete:{collection:p,id:"string"},count:{collection:p,where:"Record<string,any>"}}};}catch{}}for(let f of e.getGlobals()){let p=f.slug,w=f.fields;if(p==="storage-settings"){let k=e.storageProviders,v=k.getAll(),R=new Set(k.getAllAvailable(T=>k.isPluginEnabled(T)).map(T=>T.type));R.add("local");let I=new Set(v.map(T=>T.type));w=w.filter(T=>T.type==="group"&&T.name&&I.has(T.name)?R.has(T.name):true).map(T=>T.name==="provider"&&T.type==="select"?{...T,options:T.options.filter(j=>R.has(j.value))}:T);}try{A.globals[p]={slug:p,label:f.label||p,fields:b(w),jsonSchema:zn(e.getZodSchema(p),{target:"openApi3"}),procedures:{get:{},update:{data:"Record<string,any>"}}};}catch{}}return l.json(A)}),_.get("/api/collections",async l=>{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=e.getCollections().map(A=>({slug:A.slug,label:A.label||A.slug,fields:A.fields.filter(f=>f.name).map(f=>({name:f.name,type:f.type,required:f.required,label:f.label}))}));return l.json(b)});function Kn(l,y,b){if(b in y)return y[b];for(let A of l)if(A.name){if(A.type==="tabs"&&A.tabs){let f=y[A.name];if(f&&typeof f=="object"&&b in f)return f[b]}if((A.type==="group"||A.type==="collapsible")&&A.fields){let f=y[A.name];if(f&&typeof f=="object"){if(b in f)return f[b];let p=Kn(A.fields,f,b);if(p!==void 0)return p}}}}_.get("/api/search",async l=>{try{let y=l.req.query("q")||"",b=l.req.query("collections")||"",A=Math.min(parseInt(l.req.query("limit")||"10"),50);if(!y||y.length<2)return l.json({results:[],message:"Query too short"});let{user:f,tenantId:p}=await V(l.req.raw,q,i,c),w=b?b.split(",").filter(Boolean):e.getCollectionSlugs(),k=[],v=new RegExp(y.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"i");for(let R of e.getCollections()){if(!w.includes(R.slug)||!(await Ie(R,"read",l.req.raw,f,p,void 0,U,F)).allowed)continue;let T=R.fields.filter(j=>j.name&&j.name!=="id"&&(j.type==="text"||j.type==="email"||j.type==="textarea"||j.type==="richtext"||j.indexed)&&!j.admin?.hidden).map(j=>j.name);if(T.length!==0)try{let j=T.map(z=>{let Q={};return Q[z]={like:`%${y}%`},Q}),$=await t.find({collection:R.slug,where:{OR:j},limit:A,tenantId:p});await chunkAK754S3T_cjs.a($.docs,R.fields,t,e,1,0);for(let z of $.docs){let Q=R.admin?.useAsTitle||T.find(X=>X==="title"||X==="name"||X==="heading"||X==="slug"),ue=Q?Kn(R.fields,z,Q)??z.id:z.id;k.push({collection:R.slug,label:R.label||R.slug,id:z.id,title:String(ue||"Untitled"),doc:z});}}catch(j){console.error(`Search error for ${R.slug}:`,j);}}return k.sort((R,I)=>R.label.localeCompare(I.label)),l.json({results:k})}catch(y){return l.json({error:y.message,results:[]},500)}}),_.get("/api/keys",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:read"))return l.json({error:"Forbidden"},403);let A=parseInt(l.req.query("page")||"1"),f=Math.min(parseInt(l.req.query("limit")||"50"),100),p=await t.find({collection:chunkDUO523BH_cjs.d,where:{},page:A,limit:f,tenantId:b}),w=(p.docs||[]).map(k=>({id:k.id,name:k.name,keyPrefix:k.keyPrefix,permissions:k.permissions||[],lastUsed:k.lastUsedAt,createdAt:k.createdAt}));return l.json({docs:w,totalDocs:p.totalDocs||w.length,totalPages:p.totalPages||1})}catch(y){return console.error("[ApiKeys] GET error:",y),l.json({error:y.message},500)}}),_.post("/api/keys",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:admin"))return l.json({error:"Forbidden"},403);let b=await l.req.json();if(!b.name||typeof b.name!="string")return l.json({error:"name is required"},400);let A=chunkDUO523BH_cjs.i(),f=await t.create({collection:chunkDUO523BH_cjs.d,data:{userId:y.id,name:b.name,key:A,keyPrefix:chunkDUO523BH_cjs.j(A),permissions:Array.isArray(b.permissions)?b.permissions:["*"],expiresAt:b.expiresAt||null,createdAt:new Date().toISOString()}});return await W?.createAuditLog({action:"api_key_create",userId:y.id,resource:"api_key",resourceId:f.id,success:!0,metadata:{keyName:b.name}}),l.json({...f,key:A,permissions:Array.isArray(b.permissions)?b.permissions:["*"]},201)}catch(y){return console.error("[ApiKeys] POST error:",y),l.json({error:y.message},500)}}),_.delete("/api/keys/:id",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:admin"))return l.json({error:"Forbidden"},403);let b=l.req.param("id"),A=await t.findByID({collection:chunkDUO523BH_cjs.d,id:b});return A?(await t.delete({collection:chunkDUO523BH_cjs.d,id:b}),await W?.createAuditLog({action:"api_key_delete",userId:y.id,resource:"api_key",resourceId:b,success:!0,metadata:{keyName:A.name}}),l.json({message:"API key deleted"})):l.json({error:"API key not found"},404)}catch(y){return console.error("[ApiKeys] DELETE error:",y),l.json({error:y.message},500)}}),_.patch("/api/keys/:id",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:admin"))return l.json({error:"Forbidden"},403);let b=l.req.param("id"),A=await l.req.json(),f=await t.findByID({collection:chunkDUO523BH_cjs.d,id:b});if(!f)return l.json({error:"API key not found"},404);let p={};if(typeof A.name=="string"&&A.name.trim()&&(p.name=A.name.trim()),Array.isArray(A.permissions)&&(p.permissions=A.permissions),A.expiresAt!==void 0&&(p.expiresAt=A.expiresAt||null),Object.keys(p).length===0)return l.json({error:"Nothing to update"},400);let w=await t.update({collection:chunkDUO523BH_cjs.d,id:b,data:p});return l.json({...w,keyPrefix:f.keyPrefix})}catch(y){return console.error("[ApiKeys] PATCH error:",y),l.json({error:y.message},500)}}),_.post("/api/keys/:id/rotate",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:admin"))return l.json({error:"Forbidden"},403);let b=l.req.param("id"),A=await t.findByID({collection:chunkDUO523BH_cjs.d,id:b});if(!A)return l.json({error:"API key not found"},404);let f=chunkDUO523BH_cjs.i(),p=await t.update({collection:chunkDUO523BH_cjs.d,id:b,data:{key:f,keyPrefix:chunkDUO523BH_cjs.j(f),lastUsedAt:null}});return await W?.createAuditLog({action:"api_key_rotate",userId:y.id,resource:"api_key",resourceId:b,success:!0,metadata:{keyName:A.name}}),l.json({...p,key:f,permissions:A.permissions,expiresAt:A.expiresAt})}catch(y){return console.error("[ApiKeys] rotate error:",y),l.json({error:y.message},500)}}),_.get("/api/webhooks/actions",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:read"))return l.json({error:"Forbidden"},403);let b={generic:{label:"Custom URL",description:"POST to any endpoint with Kyro payload",configFields:[],envVars:[]},"github-push":{label:"GitHub Push",description:"Push an empty commit to simulate a push event",configFields:[{name:"githubOwner",label:"Owner",required:!0,placeholder:"e.g., kyro-dev"},{name:"githubRepo",label:"Repository",required:!0,placeholder:"e.g., my-website"},{name:"githubBranch",label:"Branch",required:!1,placeholder:"main"}],envVars:["GITHUB_TOKEN"]}};return l.json({actions:b})}catch(y){return console.error("[Webhooks] actions error:",y),l.json({error:y.message},500)}}),_.get("/api/webhooks",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:read"))return l.json({error:"Forbidden"},403);if(!g)return l.json({error:"Webhook service not available"},503);let b=await g.getWebhooks();return l.json({docs:b})}catch(y){return console.error("[Webhooks] GET error:",y),l.json({error:y.message},500)}}),_.post("/api/webhooks",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:admin"))return l.json({error:"Forbidden"},403);if(!g)return l.json({error:"Webhook service not available"},503);let b=await l.req.json(),A=await g.createWebhook(b);return await W?.createAuditLog({action:"webhook_create",userId:y.id,resource:"webhook",resourceId:A.id,success:!0,metadata:{name:A.name,url:A.url}}),l.json(A,201)}catch(y){return console.error("[Webhooks] POST error:",y),l.json({error:y.message},500)}}),_.get("/api/webhooks/:id",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:read"))return l.json({error:"Forbidden"},403);if(!g)return l.json({error:"Webhook service not available"},503);let b=l.req.param("id"),A=await g.getWebhookById(b);return A?l.json(A):l.json({error:"Webhook not found"},404)}catch(y){return console.error("[Webhooks] GET :id error:",y),l.json({error:y.message},500)}}),_.patch("/api/webhooks/:id",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:admin"))return l.json({error:"Forbidden"},403);if(!g)return l.json({error:"Webhook service not available"},503);let b=l.req.param("id"),A=await l.req.json(),f=await g.updateWebhook(b,A);return f?(await W?.createAuditLog({action:"webhook_update",userId:y.id,resource:"webhook",resourceId:b,success:!0,metadata:{name:f.name}}),l.json(f)):l.json({error:"Webhook not found"},404)}catch(y){return console.error("[Webhooks] PATCH error:",y),l.json({error:y.message},500)}}),_.delete("/api/webhooks/:id",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:admin"))return l.json({error:"Forbidden"},403);if(!g)return l.json({error:"Webhook service not available"},503);let b=l.req.param("id"),A=await g.getWebhookById(b);return A?(await g.deleteWebhook(b),await W?.createAuditLog({action:"webhook_delete",userId:y.id,resource:"webhook",resourceId:b,success:!0,metadata:{name:A.name}}),l.json({message:"Webhook deleted"})):l.json({error:"Webhook not found"},404)}catch(y){return console.error("[Webhooks] DELETE error:",y),l.json({error:y.message},500)}}),_.post("/api/webhooks/:id/test",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:admin"))return l.json({error:"Forbidden"},403);if(!g)return l.json({error:"Webhook service not available"},503);let b=l.req.param("id"),A=await g.testWebhook(b);return A?l.json(A):l.json({error:"Webhook not found"},404)}catch(y){return console.error("[Webhooks] test error:",y),l.json({error:y.message},500)}}),_.get("/api/webhooks/:id/history",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:read"))return l.json({error:"Forbidden"},403);if(!g)return l.json({error:"Webhook service not available"},503);let b=l.req.param("id"),A=Math.min(parseInt(l.req.query("limit")||"50"),100),f=await g.getDeliveryHistory(b,A);return l.json({docs:f})}catch(y){return console.error("[Webhooks] history error:",y),l.json({error:y.message},500)}});function Vn(l){let y={},b=["name","type","required","hasMany","relationTo","options","min","max","minLength","maxLength","defaultValue","label","localized","admin","unique","index","hidden","readOnly","deprecated"];for(let A of b)A in l&&(y[A]=l[A]);return l.fields&&(y.fields=l.fields.map(Vn)),l.tabs&&(y.tabs=l.tabs.map(A=>({label:A.label,name:A.name,fields:A.fields.map(Vn)}))),y}_.get("/api/__schema",async l=>{try{let{user:y,apiKeyContext:b}=await V(l.req.raw,q,i,c);if(!y&&!b)return l.json({error:"Unauthorized"},401);let f=e.getCollections().filter(p=>p.slug!=="users"&&p.slug!=="audit_logs").map(p=>({slug:p.slug,label:p.label,labelPlural:p.labelPlural,singularLabel:p.singularLabel,timestamps:p.timestamps,auth:!!p.auth,tenantScoped:!!p.tenantScoped,upload:p.upload?{staticDir:p.upload.staticDir,imageSizes:p.upload.imageSizes,mimeTypes:p.upload.mimeTypes}:void 0,fields:p.fields.map(Vn)}));return l.json(f)}catch(y){return console.error("[Schema] error:",y),l.json({error:y.message},500)}});let xd=e.getCollections();for(let l of xd){let A=function(f,p){let w=[],k=new Set([...Object.keys(f),...Object.keys(p)]);for(let v of k)v==="id"||v==="createdAt"||v==="updatedAt"||JSON.stringify(f[v])!==JSON.stringify(p[v])&&w.push({field:v,oldValue:v in f?f[v]:void 0,newValue:v in p?p[v]:void 0});return w};let y=l.slug;if(y==="users"||y==="audit_logs")continue;let b=`/api/${y}`;_.post(`${b}/dynamic-options/:fieldName`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"read",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);let R=f.req.param("fieldName"),I=await f.req.json(),{data:T,siblingData:j}=I,$=hs(l.fields,R);if(!$)return f.json({error:"Field not found"},404);if($.type!=="select")return f.json({error:"Field is not a select field"},400);let z=[];return typeof $.options=="function"?z=await $.options({data:T||{},siblingData:j||{}}):Array.isArray($.options)&&(z=$.options),f.json({options:z})}catch(p){return f.json({error:p.message},500)}}),_.get(b,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"read",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);w&&t.setTenantContext({tenantId:w,userId:p?.id??"",role:p?.role,isSuperAdmin:p?.role==="super_admin"});let R=new URL(f.req.url),I=parseInt(R.searchParams.get("page")||"1"),T=Math.min(parseInt(R.searchParams.get("limit")||"10"),100),j=R.searchParams.get("sort")||void 0,$=parseInt(R.searchParams.get("depth")||"0"),z=R.searchParams.get("select")?.split(",")||void 0,Q=R.searchParams.get("draft"),ue=Q==="true"?!0:Q==="false"?!1:!!p,X={},ye=R.searchParams.get("where");if(ye)try{X=JSON.parse(ye);}catch{return f.json({error:"Invalid JSON in where parameter"},400)}let Ze=await t.find({collection:y,where:X,sort:j,limit:T,page:I,depth:$,tenantId:w,select:z,draft:ue});return await chunkAK754S3T_cjs.a(Ze.docs,l.fields,t,e,1,$),f.json(chunkZOVH6QT5_cjs.a(Ze))}catch(p){return console.error("[API] list error:",p),f.json({error:p.message},500)}}),_.get(`${b}/:id/versions`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"read",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);let R=f.req.param("id");if(!R)return f.json({error:"Missing document ID"},400);let I=new URL(f.req.url),T=I.searchParams.get("compareA"),j=I.searchParams.get("compareB");if(_c(W,k,`${b}/${R}/versions`,"GET",f.req.raw),T&&j){let[ue,X]=await Promise.all([t.findVersionByID({collection:y,versionId:T,tenantId:w}),t.findVersionByID({collection:y,versionId:j,tenantId:w})]);if(!ue||!X)return f.json({error:"Version not found"},404);let ye=A(ue.data,X.data);return f.json({diffs:ye})}let $=parseInt(I.searchParams.get("page")||"1"),z=Math.min(parseInt(I.searchParams.get("limit")||"10"),100),Q=await t.findVersions({collection:y,documentId:R,page:$,limit:z,tenantId:w});return f.json(Q)}catch(p){return console.error("[API] versions error:",p),f.json({error:p.message},500)}}),_.put(`${b}/:id/draft`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"update",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);let R=f.req.param("id"),I=await f.req.json(),T=wc(I),j=await t.findByID({collection:y,id:R,tenantId:w,draft:!0});if(!j)return f.json({error:"Document not found"},404);let $;I.delta?$={...j,...I.delta}:$=I.data??gd(I);let z=await t.updateLatestVersion({collection:y,documentId:R,data:$,status:"draft",tenantId:w});return p&&W?.createAuditLog({action:"document_update",userId:p.id,resource:y,resourceId:R,success:!0,metadata:{type:"draft_save"}}),f.json({data:z,message:"Draft saved successfully"})}catch(p){return f.json({error:p.message},500)}}),_.delete(`${b}/:id/draft`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"update",f.req.raw,p,w,k,U,F);return v.allowed?(p&&W?.createAuditLog({action:"document_update",userId:p.id,resource:y,resourceId:f.req.param("id"),success:!0,metadata:{type:"draft_discard"}}),f.json({message:"Draft discarded successfully"})):f.json({error:v.error},v.status||403)}catch(p){return f.json({error:p.message},500)}}),_.get(`${b}/:id`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=new URL(f.req.url),R=v.searchParams.get("draft"),I=v.searchParams.get("kyroToken"),T=!1;if(R==="true"&&I&&s)try{let X=await _o(I,s,"HS256");X&&X.type==="preview"&&X.collection===l.slug&&(T=!0);}catch(X){console.warn("Invalid preview token",X);}if(!T){let X=await Ie(l,"read",f.req.raw,p,w,k,U,F);if(!X.allowed)return f.json({error:X.error},X.status||403)}let j=f.req.param("id"),$=parseInt(v.searchParams.get("depth")||"0"),z=v.searchParams.get("select")?.split(",")||void 0,Q=R==="true"?!0:R==="false"?!1:!!p,ue=await t.findByID({collection:y,id:j,depth:$,tenantId:w,select:z,draft:Q});return !ue&&l.fields.some(X=>X.name==="slug")&&(ue=await t.findOne({collection:y,where:{slug:j},tenantId:w,draft:Q})),ue?(await chunkAK754S3T_cjs.a([ue],l.fields,t,e,1,$),f.json({data:chunkZOVH6QT5_cjs.a(ue)})):f.json({error:"Document not found"},404)}catch(p){return f.json({error:p.message},500)}}),_.post(`${b}/preview-url`,async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=await Ie(l,"read",f.req.raw,p,w);if(!k.allowed)return f.json({error:k.error||"Forbidden"},k.status||403);let v=await f.req.json().catch(()=>({})),R="";s&&(R=await wo({type:"preview",collection:l.slug,id:v.id,exp:Math.floor(Date.now()/1e3)+3600},s,"HS256"));let I="";if(l.admin?.preview){I=await l.admin.preview(v,{req:f.req.raw,token:R});try{let T=new URL(I,"http://localhost");T.searchParams.has("preview")||T.searchParams.set("preview","true"),!T.searchParams.has("kyroToken")&&R&&T.searchParams.set("kyroToken",R),I=I.startsWith("http")?T.toString():`${T.pathname}${T.search}`;}catch{}}else {let T="";try{let $=await t.findOne({collection:"_globals_site-settings",where:{}});$?.siteUrl&&(T=$.siteUrl);}catch{}if(!T)return f.json({error:"No site URL configured in settings, and no custom preview function defined for this collection."},400);T=T.replace(/\/$/,"");let j=v.slug||v.id||"";I=`${T}/${l.slug}/${j}?preview=true&kyroToken=${R}`;}return f.json({url:I})}catch(p){return f.json({error:p.message},500)}}),_.post(b,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"create",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);w&&t.setTenantContext({tenantId:w,userId:p?.id??"",role:p?.role,isSuperAdmin:p?.role==="super_admin"}),_c(W,k,b,"POST",f.req.raw);let I=await f.req.json();Jr(I,l.fields),Qr(l.fields,I);let T=f.req.raw;if(l.hooks?.beforeValidate)for(let X of l.hooks.beforeValidate){let ye=await X({collection:y,data:I,req:T,user:p,tenantId:w,operation:"create"});ye&&typeof ye=="object"&&!Array.isArray(ye)&&Object.assign(I,ye);}let j=e.getCreateZodSchema(y);try{I=j.parse(I);}catch(X){return f.json({error:`Validation failed: ${ra(X.errors)}`,details:X.errors},400)}l.tenantScoped&&w&&(I.tenantId=w);let $=l.versions?.drafts===!0,z=l.fields.find(X=>X.name==="status"),Q=z?.type==="select"&&Array.isArray(z.options)&&z.options.some(X=>X.value==="published");if($?I.status="draft":Q&&!I.status&&(I.status="published"),l.hooks?.beforeChange)for(let X of l.hooks.beforeChange){let ye=await X({collection:y,data:I,req:T,user:p,tenantId:w,operation:"create"});ye&&typeof ye=="object"&&!Array.isArray(ye)&&Object.assign(I,ye);}let ue=await t.create({collection:y,data:I,tenantId:w});if($&&await t.createVersion({collection:y,documentId:ue.id,data:I,status:"draft",createdBy:p?.id,changeDescription:"Created",tenantId:w}),l.hooks?.afterChange)for(let X of l.hooks.afterChange)await X({collection:y,doc:ue,data:I,req:T,user:p,tenantId:w,operation:"create"});return g&&g.trigger(Ja(y,"create"),{collection:y,operation:"create",data:ue,user:p?{id:p.id,email:p.email,role:p.role}:void 0,tenantId:w}).catch(X=>console.error("[Webhook] Failed to trigger:",X)),p&&W?.createAuditLog({action:"document_create",userId:p.id,resource:y,resourceId:ue.id,success:!0}),f.json({data:ue,message:"Created successfully"},201)}catch(p){return p.name==="ZodError"?f.json({error:`Validation failed: ${ra(p.errors)}`,details:p.errors},400):f.json({error:p.message},500)}}),_.patch(`${b}/:id`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"update",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);let R=f.req.param("id"),I=await f.req.json(),T=wc(I),j=await t.findByID({collection:y,id:R,tenantId:w,draft:!0});if(!j)return f.json({error:"Document not found"},404);if(T&&j.updatedAt&&T!==j.updatedAt)return f.json(yd(T,j),409);let $=Object.fromEntries(Object.entries(gd(I)).filter(([Xe,Je])=>Je!=="null"&&Je!==void 0));Jr($,l.fields),Qr(l.fields,$);let z=f.req.raw;if(l.hooks?.beforeValidate)for(let Xe of l.hooks.beforeValidate){let Je=await Xe({collection:y,data:$,originalDoc:j,req:z,user:p,tenantId:w,operation:"update"});Je&&typeof Je=="object"&&!Array.isArray(Je)&&Object.assign($,Je);}if($=e.getUpdateZodSchema(y).parse($),l.hooks?.beforeChange)for(let Xe of l.hooks.beforeChange){let Je=await Xe({collection:y,data:$,originalDoc:j,req:z,user:p,tenantId:w,operation:"update"});Je&&typeof Je=="object"&&!Array.isArray(Je)&&Object.assign($,Je);}let ue=f.req.header("X-Draft")==="true",X=l.versions?.drafts===!0,ye=f.req.query("autosave")==="true",Ze;if(X&&ue)await t.createVersion({collection:y,documentId:R,data:$,status:"draft",autosave:ye,createdBy:p?.id,changeDescription:ye?"Autosave":"Draft saved",tenantId:w});else if(X){let Xe=I.status==="draft"?"draft":"published";await t.update({collection:y,id:R,data:{...$,status:Xe},tenantId:w}),await t.createVersion({collection:y,documentId:R,data:{...$,status:Xe},status:Xe,createdBy:p?.id,changeDescription:Xe==="published"?"Published":"Unpublished",tenantId:w});}else await t.update({collection:y,id:R,data:$,tenantId:w});if(Ze=await t.findByID({collection:y,id:R,tenantId:w,draft:!0}),l.hooks?.afterChange)for(let Xe of l.hooks.afterChange)await Xe({collection:y,doc:Ze,data:$,originalDoc:j,req:z,user:p,tenantId:w,operation:"update"});return g&&!ye&&g.trigger(Ja(y,"update"),{collection:y,operation:"update",data:Ze,previousData:j,user:p?{id:p.id,email:p.email,role:p.role}:void 0,tenantId:w}).catch(Xe=>console.error("[Webhook] Failed to trigger:",Xe)),_c(W,k,`${b}/${R}`,"PATCH",f.req.raw),p&&W?.createAuditLog({action:"document_update",userId:p.id,resource:y,resourceId:R,success:!0}),f.json({data:Ze,message:X?"Draft saved":"Updated successfully"})}catch(p){return p.name==="ZodError"?(console.error(`[PATCH ${b}/:id] Validation failed:`,p.errors),f.json({error:`Validation failed: ${ra(p.errors)}`,details:p.errors},400)):(console.error(`[PATCH ${b}/:id] ERROR:`,p.message,"CAUSE:",p.cause?.message||p.cause,"QUERY:",p.query),f.json({error:p.message},500))}}),_.delete(`${b}/:id`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"delete",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);w&&t.setTenantContext({tenantId:w,userId:p?.id??"",role:p?.role,isSuperAdmin:p?.role==="super_admin"});let R=f.req.param("id"),I=f.req.raw,T=await t.findByID({collection:y,id:R,tenantId:w,draft:!0});if(!T)return f.json({error:"Document not found"},404);if(l.hooks?.beforeDelete)for(let $ of l.hooks.beforeDelete)await $({collection:y,doc:T,req:I,user:p,tenantId:w,operation:"delete"});let j=await t.delete({collection:y,id:R,tenantId:w});if(l.hooks?.afterDelete)for(let $ of l.hooks.afterDelete)await $({collection:y,doc:j,originalDoc:T,req:I,user:p,tenantId:w,operation:"delete"});return g&&g.trigger(Ja(y,"delete"),{collection:y,operation:"delete",data:j,previousData:T,user:p?{id:p.id,email:p.email,role:p.role}:void 0,tenantId:w}).catch($=>console.error("[Webhook] Failed to trigger:",$)),_c(W,k,`${b}/${R}`,"DELETE",f.req.raw),p&&W?.createAuditLog({action:"document_delete",userId:p.id,resource:y,resourceId:R,success:!0}),f.json({data:j,message:"Deleted successfully"})}catch(p){return console.error(`[DELETE] Error deleting ${y}:`,p),f.json({error:p.message||String(p)},500)}}),_.post(`${b}/:id/duplicate`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"create",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);let R=f.req.param("id"),I=await t.findByID({collection:y,id:R,tenantId:w,draft:!0});if(!I)return f.json({error:"Document not found"},404);let{id:T,createdAt:j,updatedAt:$,...z}=I;Us(l.fields,z);let Q=Date.now().toString(36);"slug"in z&&typeof z.slug=="string"&&(z.slug=`${z.slug||"document"}-copy-${Q}`),"title"in z&&typeof z.title=="string"?z.title=`${z.title||"Copy"} (Copy)`:"name"in z&&typeof z.name=="string"&&(z.name=`${z.name||"Copy"} (Copy)`);let ue=await t.create({collection:y,data:{...z,status:"draft"},tenantId:w});return f.json({data:ue,message:"Document duplicated successfully"})}catch(p){return console.error("[Duplicate] Error:",p),f.json({error:p.message||String(p)},500)}}),_.post(`${b}/:id/versions/:versionId/restore`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"update",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);let R=f.req.param("id"),I=f.req.param("versionId"),T=await t.findVersionByID({collection:y,versionId:I,tenantId:w});if(!T)return f.json({error:"Version not found"},404);let j=await t.update({collection:y,id:R,data:{...T.data,status:"draft"},tenantId:w});return f.json({data:j,message:"Version restored successfully"})}catch(p){return f.json({error:p.message},500)}}),_.post(`${b}/:id/versions`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"update",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);let R=await f.req.json(),{versionId:I,action:T}=R;if(T==="restore"&&I){let j=await t.findVersionByID({collection:y,versionId:I,tenantId:w});if(!j)return f.json({error:"Version not found"},404);let $=await t.update({collection:y,id:f.req.param("id"),data:{...j.data,status:"draft"},tenantId:w});return f.json({data:$,message:"Version restored successfully"})}return f.json({error:"Invalid action"},400)}catch(p){return f.json({error:p.message},500)}}),_.post(`${b}/:id/publish`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"update",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);w&&t.setTenantContext({tenantId:w,userId:p?.id??"",role:p?.role,isSuperAdmin:p?.role==="super_admin"});let R=f.req.param("id"),I=await f.req.json().catch(()=>({})),T=wc(I),j=await t.findByID({collection:y,id:R,tenantId:w,draft:!0});if(!j)return f.json({error:"Document not found"},404);if(T&&j.updatedAt&&T!==j.updatedAt)return f.json(yd(T,j),409);let $={status:"published"},z=j;if(l.versions?.drafts){let ue=await t.findVersions({collection:y,documentId:R,limit:1,sort:"-createdAt",tenantId:w});if(ue.docs.length>0){let X=ue.docs[0];z={...j,...X.data},$={...X.data,...$};}}let Q=await t.update({collection:y,id:R,data:$,tenantId:w});return l.versions?.drafts&&await t.createVersion({collection:y,documentId:R,data:{...z,status:"published"},status:"published",createdBy:p?.id,changeDescription:"Published",tenantId:w}),g&&g.trigger(Ja(y,"update"),{collection:y,operation:"update",data:Q,user:p?{id:p.id,email:p.email,role:p.role}:void 0,tenantId:w}).catch(ue=>console.error("[Webhook] Failed to trigger:",ue)),f.json({data:Q,message:"Published successfully"})}catch(p){return f.json({error:p.message},500)}}),_.post(`${b}/:id/unpublish`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"update",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);let R=f.req.param("id");if(!await t.findByID({collection:y,id:R,tenantId:w,draft:!0}))return f.json({error:"Document not found"},404);let T=await t.update({collection:y,id:R,data:{status:"draft"},tenantId:w});return g&&g.trigger(Ja(y,"update"),{collection:y,operation:"update",data:T,user:p?{id:p.id,email:p.email,role:p.role}:void 0,tenantId:w}).catch(j=>console.error("[Webhook] Failed to trigger:",j)),f.json({data:T,message:"Unpublished successfully"})}catch(p){return f.json({error:p.message},500)}});}for(let l of e.getGlobals()){let y=l.slug,b=`/api/globals/${y}`;_.post(`${b}/dynamic-options/:fieldName`,async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=await Yt(l,"read",f.req.raw,p,w,U);if(!k.allowed)return f.json({error:k.error},k.status||403);let v=f.req.param("fieldName"),R=await f.req.json(),{data:I,siblingData:T}=R,j=hs(l.fields,v);if(!j)return f.json({error:"Field not found"},404);if(j.type!=="select")return f.json({error:"Field is not a select field"},400);let $=[];return typeof j.options=="function"?$=await j.options({data:I||{},siblingData:T||{}}):Array.isArray(j.options)&&($=j.options),f.json({options:$})}catch(p){return f.json({error:p.message},500)}}),_.get(b,async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=new URL(f.req.url),v=k.searchParams.get("kyroToken"),R=k.searchParams.get("draft"),I=!1;if(R==="true"&&v&&s)try{let Q=await _o(v,s,"HS256");Q&&Q.type==="preview"&&Q.collection===`_globals_${l.slug}`&&(I=!0);}catch(Q){console.warn("Invalid preview token",Q);}if(!I){let Q=await Yt(l,"read",f.req.raw,p,w,U);if(!Q.allowed)return f.json({error:Q.error},Q.status||403)}let T=R==="true"?!0:R==="false"?!1:!!p,j=parseInt(k.searchParams.get("depth")||"0"),z=(await t.find({collection:`_globals_${y}`,where:{},tenantId:w,draft:T,depth:j,limit:1})).docs[0];if(z&&j>0&&await chunkAK754S3T_cjs.a([z],l.fields,t,e,1,j),y==="storage-settings"&&(typeof globalThis.STORAGE_BUCKET<"u"||typeof f.env?.STORAGE_BUCKET<"u")&&(z?z.provider||(z.provider="cloudflare_r2"):z={id:y,provider:"cloudflare_r2"}),y==="system"){let Q=jB__default.default.randomBytes(32).toString("hex");z?z.appSecret||(await t.update({collection:`_globals_${y}`,id:y,data:{appSecret:Q},tenantId:w}),z.appSecret=Q):z=await t.create({collection:`_globals_${y}`,data:{id:y,appSecret:Q},tenantId:w});}return f.json({data:z||{}})}catch(p){return f.json({error:p.message},500)}});let A=async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=await Yt(l,"update",f.req.raw,p,w,U);if(!k.allowed)return f.json({error:k.error},k.status||403);let v=new URL(f.req.url),R=parseInt(v.searchParams.get("depth")||"0"),I=await f.req.json(),T=wc(I),j=gd(I),$=Object.fromEntries(Object.entries(j).filter(([Pt,Is])=>Is!==null&&Is!=="null"&&Is!==void 0));Jr($,l.fields),Qr(l.fields,$);let z=e.getUpdateZodSchema(y),Q;try{Q=z.parse($);}catch(Pt){return f.json({error:`Validation failed: ${ra(Pt.errors)}`,details:Pt.errors},400)}let ue=new Set(["id","createdAt","updatedAt","status","baseUpdatedAt","_baseUpdatedAt"]),X=Object.fromEntries(Object.entries(Q).filter(([Pt])=>!ue.has(Pt))),ye=`_globals_${y}`,Ze=await t.findOne({collection:ye,where:{},tenantId:w,draft:!0});if(Ze&&T&&Ze.updatedAt&&T!==Ze.updatedAt)return f.json(yd(T,Ze),409);let Xe=f.req.header("X-Draft")==="true",Je=l.versions?.drafts===!0,Wr=f.req.query("autosave")==="true",St;if(Je&&Xe)await t.createVersion({collection:ye,documentId:y,data:X,status:"draft",autosave:Wr,createdBy:p?.id,changeDescription:Wr?"Autosave":"Manual save",tenantId:w}),Ze?St=Ze:St=await t.create({collection:ye,data:{...X,id:y,status:"draft"},tenantId:w});else if(Je&&!Xe){let Pt="published";Ze?St=await t.update({collection:ye,id:y,data:{...X,status:Pt},tenantId:w}):St=await t.create({collection:ye,data:{...X,id:y,status:Pt},tenantId:w}),await t.createVersion({collection:ye,documentId:y,data:X,status:Pt,autosave:!1,createdBy:p?.id,changeDescription:"Published",tenantId:w});}else Ze?St=await t.update({collection:ye,id:y,data:X,tenantId:w}):St=await t.create({collection:ye,data:{...X,id:y},tenantId:w});if(y==="storage-settings"&&($t=null,Dr=null),y==="email-settings"){let Pt=await chunkVKXWJOWI_cjs.q.fromConfig(t);_e.email=Pt||void 0;}return y==="system"&&await chunkO4YE57OS_cjs.b(),p&&W?.createAuditLog({action:"settings_change",userId:p.id,resource:`global:${y}`,resourceId:y,success:!0}),St&&R>0&&await chunkAK754S3T_cjs.a([St],l.fields,t,e,1,R),f.json({data:St,message:"Updated successfully"})}catch(p){return console.error(`[API] Save global "${y}" failed:`,p),f.json({error:p.message||"Save failed",stack:process.env.NODE_ENV==="development"?p.stack:void 0},500)}};_.post(b,A),_.patch(b,A),_.post(`${b}/preview-url`,async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=await Yt(l,"read",f.req.raw,p,w);if(!k.allowed)return f.json({error:k.error||"Forbidden"},k.status||403);let v=await f.req.json().catch(()=>({})),R="";s&&(R=await wo({type:"preview",collection:`_globals_${l.slug}`,exp:Math.floor(Date.now()/1e3)+3600},s,"HS256"));let I="";if(l.admin?.preview)I=await l.admin.preview(v,{req:f.req.raw,token:R});else {let T="";try{let j=await t.findOne({collection:"_globals_site-settings",where:{}});j?.siteUrl&&(T=j.siteUrl);}catch{}if(!T)return f.json({error:"No site URL configured in settings, and no custom preview function defined."},400);T=T.replace(/\/$/,""),I=`${T}/?preview=true&kyroToken=${R}`;}return f.json({url:I})}catch(p){return f.json({error:p.message},500)}}),_.post(`${b}/publish`,async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=await Yt(l,"update",f.req.raw,p,w,U);if(!k.allowed)return f.json({error:k.error},403);let v=`_globals_${y}`,R=await t.findOne({collection:v,where:{},tenantId:w,draft:!0});if(!R)return f.json({error:"Global not found"},404);let I={status:"published"},T=R;if(l.versions?.drafts){let $=await t.findVersions({collection:v,documentId:y,limit:1,sort:"-createdAt",tenantId:w});$.docs.length>0&&(T={...R,...$.docs[0].data},I={...$.docs[0].data,...I});}let j=await t.update({collection:v,id:y,data:I,tenantId:w});return l.versions?.drafts&&await t.createVersion({collection:v,documentId:y,data:{...T,status:"published"},status:"published",createdBy:p?.id,changeDescription:"Published",tenantId:w}),f.json({data:j,message:"Published successfully"})}catch(p){return f.json({error:p.message},500)}}),_.post(`${b}/unpublish`,async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=await Yt(l,"update",f.req.raw,p,w,U);if(!k.allowed)return f.json({error:k.error},403);let v=await t.update({collection:`_globals_${y}`,id:y,data:{status:"draft"},tenantId:w});return f.json({data:v,message:"Unpublished successfully"})}catch(p){return f.json({error:p.message},500)}}),_.get(`${b}/versions`,async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=await Yt(l,"read",f.req.raw,p,w,U);if(!k.allowed)return f.json({error:k.error},403);let v=parseInt(f.req.query("limit")||"10"),R=parseInt(f.req.query("page")||"1"),I=await t.findVersions({collection:`_globals_${y}`,documentId:y,limit:v,page:R,tenantId:w});return f.json(I)}catch(p){return f.json({error:p.message},500)}}),_.get(`${b}/versions/:versionId`,async f=>{try{let p=f.req.param("versionId"),{user:w,tenantId:k}=await V(f.req.raw,q,i,c),v=await Yt(l,"read",f.req.raw,w,k,U);if(!v.allowed)return f.json({error:v.error},403);let R=await t.findVersionByID({collection:`_globals_${y}`,versionId:p,tenantId:k});return R?f.json({data:R}):f.json({error:"Version not found"},404)}catch(p){return f.json({error:p.message},500)}}),_.post(`${b}/versions/:versionId/restore`,async f=>{try{let p=f.req.param("versionId"),{user:w,tenantId:k}=await V(f.req.raw,q,i,c),v=await Yt(l,"update",f.req.raw,w,k,U);if(!v.allowed)return f.json({error:v.error},403);let R=`_globals_${y}`,I=await t.findVersionByID({collection:R,versionId:p,tenantId:k});if(!I)return f.json({error:"Version not found"},404);let T=await t.update({collection:R,id:y,data:{...I.data,status:"draft"},tenantId:k});return f.json({data:T,message:"Version restored successfully"})}catch(p){return f.json({error:p.message},500)}}),y==="email-settings"&&_.post(`${b}/test`,async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=await Yt(l,"update",f.req.raw,p,w,U);if(!k.allowed)return f.json({error:k.error},k.status||403);let v=await f.req.json(),R={provider:v.provider,from:v.fromEmail||v.from,fromName:v.fromName,replyTo:v.replyTo,smtp:v.smtp?{host:v.smtp.host,port:v.smtp.port,secure:v.smtp.secure,auth:{user:v.smtp.username||v.smtp.user,pass:v.smtp.password||v.smtp.pass}}:void 0,resend:v.resend,sendgrid:v.sendgrid,mailgun:v.mailgun,ses:v.ses},I=new chunkVKXWJOWI_cjs.q(R),T=v.email||v.testEmail||v.testEmailSection&&v.testEmailSection.testEmail;if(!T)return f.json({error:"No test recipient email provided"},400);let j=v.provider?v.provider.charAt(0).toUpperCase()+v.provider.slice(1):"SMTP",$=v.fromName?`${v.fromName} <${v.fromEmail||v.from||"default"}>`:v.fromEmail||v.from||"Configured Sender",z=new Date().toUTCString();return await I.send({to:T,subject:"Kyro CMS \u2014 Email Connection Test",html:`<!DOCTYPE html>
|
|
119
|
+
`).map(l=>l.trim()).filter(Boolean):[],Fe=Ir.length>0?Ir:ls||[];(Fe.length>0||d)&&_.use("*",async(l,y)=>{let b=l.req.header("Origin")||"*";if(Fe.length>0&&!Fe.includes(b))return l.json({error:"Origin not allowed"},403);let A=Fe.length>0?b:"*";if(l.header("Access-Control-Allow-Origin",A),l.header("Access-Control-Allow-Methods","GET, POST, PATCH, DELETE, OPTIONS"),l.header("Access-Control-Allow-Headers","Content-Type, Authorization, X-API-Key"),d?.credentials&&l.header("Access-Control-Allow-Credentials","true"),l.req.method==="OPTIONS")return l.text("");await y();});let mr=x?.access?.rateLimiting,er;if(mr?.enabled){let l=mr.maxRequests||100,y=mr.windowMs||6e4;er=new bo({"api:general":{window:y,max:l}}),_.use("/api/*",async(b,A)=>{if(!er)return A();let f=b.req.header("CF-Connecting-IP")||b.req.header("X-Forwarded-For")?.split(",")[0]?.trim()||b.req.header("X-Real-IP")||"unknown",p=await er.check("api:general",f);if(b.header("X-RateLimit-Limit",String(l)),b.header("X-RateLimit-Remaining",String(p.remaining)),b.header("X-RateLimit-Reset",String(p.resetAt)),!p.allowed)return b.json({error:"Too many requests",retryAfter:p.retryAfter},429);await A();});}let _e=new vo({redis:W,jwtSecret:s||"change-me",baseUrl:process.env.KYRO_BASE_URL||"http://localhost:4321",rateLimiter:er});chunkXTTGHN3D_cjs.q.fromConfig(t).then(l=>{l&&(_e.email=l);}).catch(l=>{console.error("[Email] Failed to initialize transport from config:",l);}),_.post("/api/auth/login",async l=>_e.login(l.req.raw)),_.post("/api/auth/register",async l=>{try{let y=await t.findOne({collection:"_globals_system",where:{}});if(y&&y.enableRegistration===!1)return l.json({error:"User registration is currently disabled by administrator."},403);if(y?.defaultRegistrationRole){let b=l.req.raw;if((b.headers.get("content-type")||"").includes("application/json")){let f=await l.req.json();f.role||(f.role=y.defaultRegistrationRole);let p=new Request(b.url,{method:b.method,headers:b.headers,body:JSON.stringify(f)});return _e.register(p)}}}catch{}return _e.register(l.req.raw)}),_.post("/api/auth/logout",async l=>_e.logout(l.req.raw)),_.post("/api/auth/refresh",async l=>_e.refresh(l.req.raw)),_.get("/api/auth/me",async l=>_e.me(l.req.raw)),_.post("/api/auth/forgot-password",async l=>_e.forgotPassword(l.req.raw)),_.post("/api/auth/reset-password",async l=>_e.resetPassword(l.req.raw)),_.post("/api/auth/change-password",async l=>_e.changePassword(l.req.raw)),_.get("/api/auth/verify-email",async l=>_e.verifyEmail(l.req.raw)),_.post("/api/auth/verify-email",async l=>_e.verifyEmail(l.req.raw)),_.get("/api/auth/verify",async l=>_e.verifyEmail(l.req.raw)),_.post("/api/auth/verify",async l=>_e.verifyEmail(l.req.raw)),_.post("/api/auth/magic-link",async l=>_e.requestMagicLink(l.req.raw)),_.get("/api/auth/magic-link",async l=>_e.verifyMagicLink(l.req.raw)),_.post("/api/auth/invite",async l=>_e.inviteUser(l.req.raw)),_.get("/api/auth/sessions",async l=>_e.listSessions(l.req.raw)),_.post("/api/auth/sessions/refresh",async l=>_e.refreshSession(l.req.raw)),_.delete("/api/auth/sessions",async l=>_e.revokeOtherSessions(l.req.raw)),_.delete("/api/auth/sessions/:id",async l=>_e.revokeSession(l.req.raw,l.req.param("id"))),_.put("/api/auth/sessions/:id/name",async l=>_e.renameSession(l.req.raw,l.req.param("id"))),_.get("/api/auth/access",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Not authenticated"},401);let A={},f={};for(let p of e.getCollections()){let w={read:(await Ie(p,"read",l.req.raw,y,b,void 0,U,F)).allowed,create:(await Ie(p,"create",l.req.raw,y,b,void 0,U,F)).allowed,update:(await Ie(p,"update",l.req.raw,y,b,void 0,U,F)).allowed,delete:(await Ie(p,"delete",l.req.raw,y,b,void 0,U,F)).allowed};A[p.slug]=w;}for(let p of e.getGlobals()){let w={read:(await Yt(p,"read",l.req.raw,y,b,U)).allowed,update:(await Yt(p,"update",l.req.raw,y,b,U)).allowed};f[p.slug]=w;}return l.json({collections:A,globals:f})}catch(y){return l.json({error:y.message},500)}});let Lt=typeof e.hasCollection=="function"&&e.hasCollection("users")?e.getCollection("users"):(()=>{try{return e.getCollection("users")}catch{return chunkZO3YB5DK_cjs.a}})();_.get("/api/users",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c),A=await Ie(Lt,"read",l.req.raw,y,b,void 0,U,F);if(!A.allowed)return l.json({error:A.error},A.status||403);let f=parseInt(l.req.query("page")||"1"),p=Math.min(parseInt(l.req.query("limit")||"10"),100),w=l.req.query("search")||void 0,k=[],v=0;if(typeof W.findUsers=="function"){let R=await W.findUsers({page:f,limit:p,search:w});k=R.users||[],v=R.total||0;}else {let R=await t.find({collection:"users",page:f,limit:p,where:w?{email:{contains:w}}:{},tenantId:b});k=R.docs||[],v=R.totalDocs||0;}return l.json({docs:k,totalDocs:v,limit:p,totalPages:Math.ceil(v/p)||1,page:f,pagingCounter:(f-1)*p+1,hasPrevPage:f>1,hasNextPage:f<Math.ceil(v/p),prevPage:f>1?f-1:null,nextPage:f<Math.ceil(v/p)?f+1:null})}catch(y){return console.error("[API] Error listing users:",y),l.json({error:y.message},500)}}),_.get("/api/users/:id",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c),A=l.req.param("id"),f=await W.findUserById(A);return f?l.json({data:f}):l.json({error:"User not found"},404)}catch(y){return l.json({error:y.message},500)}}),_.post("/api/users",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c),A=await Ie(Lt,"create",l.req.raw,y,b,void 0,U,F);if(!A.allowed)return l.json({error:A.error},A.status||403);let f=await l.req.json();if(!f.email||!f.password)return l.json({error:"Email and password are required"},400);if(await W.findUserByEmail(f.email))return l.json({error:"Email already in use"},400);let w=f.role||"customer";if(w!=="customer"&&y?.role!=="super_admin")return l.json({error:"Forbidden: Only super_admin can assign administrative roles"},403);let k=await W.createUser({email:f.email,password:f.password,name:f.name,role:w,avatar:f.avatar,tenantId:f.tenantId});return y&&W?.createAuditLog({action:"user_create",userId:y.id,resource:"users",resourceId:k.id,success:!0}),l.json({data:k,message:"User created successfully"},201)}catch(y){return l.json({error:y.message},500)}}),_.patch("/api/users/:id",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c),A=await Ie(Lt,"update",l.req.raw,y,b,void 0,U,F);if(!A.allowed)return l.json({error:A.error},A.status||403);let f=l.req.param("id"),p=await l.req.json(),w=await W.findUserById(f);if(!w)return l.json({error:"User not found"},404);let k={};if(p.name!==void 0&&(k.name=p.name),p.email!==void 0&&(k.email=p.email),p.role!==void 0&&p.role!==w.role){if(y?.role!=="super_admin")return l.json({error:"Forbidden: Only super_admin can modify user roles"},403);k.role=p.role;}p.avatar!==void 0&&(k.avatar=typeof p.avatar=="object"&&p.avatar!==null?p.avatar.id||String(p.avatar):p.avatar),p.tenantId!==void 0&&(k.tenantId=p.tenantId),p.emailVerified!==void 0&&(k.emailVerified=p.emailVerified),p.locked!==void 0&&(k.locked=p.locked),p.failedLoginAttempts!==void 0&&(k.failedLoginAttempts=p.failedLoginAttempts),p.lastLogin!==void 0&&(k.lastLogin=p.lastLogin);let v=await W.updateUser(f,k);return v?(y&&(W?.createAuditLog({action:"user_update",userId:y.id,resource:"users",resourceId:f,success:!0}),p.role&&w.role!==p.role&&W?.createAuditLog({action:"role_change",userId:y.id,resource:"users",resourceId:f,success:!0,metadata:{oldRole:w.role,newRole:p.role}})),l.json({data:v,message:"User updated successfully"})):l.json({error:"User update failed"},500)}catch(y){return l.json({error:y.message},500)}}),_.delete("/api/users/:id",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c),A=await Ie(Lt,"delete",l.req.raw,y,b,void 0,U,F);if(!A.allowed)return l.json({error:A.error},A.status||403);let f=l.req.param("id");if(y&&y.id===f)return l.json({error:"You cannot delete your own account"},403);let p=await W.findUserById(f);return p?await W.deleteUser(f)?(y&&W?.createAuditLog({action:"user_delete",userId:y.id,resource:"users",resourceId:f,success:!0}),l.json({data:p,message:"User deleted successfully"})):l.json({error:"User deletion failed"},500):l.json({error:"User not found"},404)}catch(y){return l.json({error:y.message},500)}}),_.get("/api/auth/audit-logs",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c),A=e.getCollection("audit_logs");if(A){let I=await Ie(A,"read",l.req.raw,y,b,void 0,U,F);if(!I.allowed)return l.json({error:I.error},I.status||403)}else if(!y)return l.json({error:"Authentication required"},401);let f=parseInt(l.req.query("page")||"1"),p=Math.min(parseInt(l.req.query("limit")||"50"),100),w=l.req.query("action")||void 0,k=l.req.query("userId")||void 0,v=l.req.query("resource")||void 0,R=await W.findAuditLogs({action:w,userId:k,resource:v,limit:p,offset:(f-1)*p});return l.json({docs:R.logs,totalDocs:R.total,limit:p,totalPages:Math.ceil(R.total/p),page:f,pagingCounter:(f-1)*p+1,hasPrevPage:f>1,hasNextPage:f<Math.ceil(R.total/p),prevPage:f>1?f-1:null,nextPage:f<Math.ceil(R.total/p)?f+1:null})}catch(y){return console.error("[API] Error listing audit logs:",y),l.json({error:y.message},500)}});let $t=null,Dr=null,ft=async()=>{if(Dr)throw Dr;if(!$t)try{let l="sqlite";"dialect"in t&&t.dialect==="postgres"&&t instanceof chunkTDGSIF5H_cjs.c?l=t.dialect:"dialect"in t&&t.dialect==="mongodb"&&(l="mongodb");let y=l==="postgres"&&t instanceof chunkTDGSIF5H_cjs.c?t.client:t;$t=await dc.init(y,{dialect:l});}catch(l){throw console.error("[getMedia] Init error:",l),Dr=l,l}return $t};_.get("/api/media",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=await ft(),A=new URL(l.req.url).origin,f=parseInt(l.req.query("page")||"1"),p=parseInt(l.req.query("limit")||"30"),w=l.req.query("search")||"",k=l.req.query("type")||"",v=l.req.query("folder")||"",R=await b.find({page:f,limit:p,search:w,type:k,folder:v},A);return l.json(R)}catch(y){return console.error("[Media] find error:",y),l.json({error:y.message},500)}}),_.post("/api/media/upload",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=await ft(),A=l.req.header("content-type")||"",f=new URL(l.req.url).origin;if(A.includes("multipart/form-data")){let R=await l.req.formData(),I=R.get("file"),T=R.get("folder")||"";if(!I)return l.json({error:"No file uploaded"},400);let j=await b.upload(I,T,f);return l.json(j)}let p=await l.req.json(),{url:w}=p,k=p.folder||"";if(!w)return l.json({error:"No URL provided"},400);let v=await b.uploadFromUrl(w,k,f);return l.json(v)}catch(y){return console.error("[Media] upload error:",y),l.json({error:y.message},500)}}),_.get("/api/media/folders",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let A=await(await ft()).listFolders();return l.json(A)}catch(y){return console.error("[Media] folders error:",y),l.json({error:y.message},500)}}),_.post("/api/media/folders",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=await ft(),A=await l.req.json(),{name:f,parentPath:p}=A;return f?(await b.createFolder(f,p||""),l.json({message:"Folder created",path:p?`${p}/${f}`:f})):l.json({error:"Folder name is required"},400)}catch(y){return console.error("[Media] create folder error:",y),l.json({error:y.message},500)}}),_.delete("/api/media/folders",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=await ft(),A=l.req.query("path");return A?(await b.deleteFolder(A),l.json({message:"Folder deleted"})):l.json({error:"Path is required"},400)}catch(y){return console.error("[Media] delete folder error:",y),l.json({error:y.message},500)}}),_.delete("/api/media/:id",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=await ft(),A=l.req.param("id"),f=new URL(l.req.url).origin;return await b.delete(A,f),l.json({success:!0})}catch(y){return console.error("[Media] delete error:",y),l.json({error:y.message},500)}}),_.get("/api/media/file/:key{.+$}",async l=>{let y=l.req.param("key"),b=globalThis.STORAGE_BUCKET;if(b){let A=await b.get(y);if(!A)return l.notFound();let f=new Headers;return A.writeHttpMetadata(f),f.set("etag",A.httpEtag),new Response(A.body,{headers:f})}return l.notFound()}),_.get("/api/media/resize",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=l.req.query("url"),A=parseInt(l.req.query("w")||"0"),f=parseInt(l.req.query("h")||"0"),p=l.req.query("fit")||"cover",w=parseFloat(l.req.query("cx")||"0"),k=parseFloat(l.req.query("cy")||"0"),v=parseFloat(l.req.query("cw")||"0"),R=parseFloat(l.req.query("ch")||"0");if(!b)return l.json({error:"URL is required"},400);let T=(await ft()).storage;if(T.name!=="local")return l.redirect(b);let j=T.config?.uploadDir||ko.join(process.cwd(),"public","uploads"),$=T.config?.baseUrl||"/uploads";if(!b.startsWith($))return l.redirect(b);let z=b.replace($,""),Q=ko.join(j,z);if(!fs$1.existsSync(Q))return l.json({error:"File not found"},404);let ue=fs$1.readFileSync(Q),{default:X}=await import('sharp'),ye=X(ue);if(v>0&&R>0){let Je=await X(ue).metadata(),Wr=Je.width||0,St=Je.height||0;if(Wr>0&&St>0){let Pt=Math.max(0,Math.min(Math.round(w/100*Wr),Wr-1)),Is=Math.max(0,Math.min(Math.round(k/100*St),St-1)),X_=Math.max(1,Math.min(Math.round(v/100*Wr),Wr-Pt)),J_=Math.max(1,Math.min(Math.round(R/100*St),St-Is));ye=ye.extract({left:Pt,top:Is,width:X_,height:J_});}}(A>0||f>0)&&(ye=ye.resize({width:A>0?A:void 0,height:f>0?f:void 0,fit:p}));let Ze=await ye.toBuffer(),Xe=await X(ue).metadata();return l.header("Content-Type",`image/${Xe.format||"webp"}`),l.header("Cache-Control","public, max-age=31536000, immutable"),l.body(Ze)}catch(y){return console.error("[Media] resize error:",y),l.json({error:y.message},500)}}),_.get("/api/media/:id",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=await ft(),A=l.req.param("id"),f=new URL(l.req.url).origin,p=await b.findById(A,f);return p?l.json(p):l.json({error:"Media not found"},404)}catch(y){return console.error("[Media] get error:",y),l.json({error:y.message},500)}}),_.patch("/api/media/:id",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=await ft(),A=l.req.param("id"),f=await l.req.json(),p=new URL(l.req.url).origin,w=["folder","metadata","title","alt","caption","originalName"],k={};for(let v of w)f[v]!==void 0&&(k[v]=f[v]);if(Object.keys(k).length>0){let v=await b.update(A,k,p);return l.json({doc:v})}return l.json({error:"No valid fields to update"},400)}catch(y){return console.error("[Media] update error:",y),l.json({error:y.message},500)}}),_.get("/api/media/test",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=await ft();return l.json({status:b?"initialized":"failed",serviceType:b?.constructor?.name})}catch(y){return console.error("[test] Error:",y),l.json({error:y.message,type:y.constructor?.name,stack:y.stack},500)}}),_.get("/api/storage-status",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=typeof globalThis.STORAGE_BUCKET<"u"||typeof l.env?.STORAGE_BUCKET<"u",A=b,f=b?"cloudflare_r2":"local";if(t)try{let p=t.prepare('SELECT provider FROM "_globals_storage-settings" LIMIT 1').get();p&&p.provider&&(A=!0,f=p.provider==="aws"?"s3":p.provider);}catch{try{let p=await t.findOne({collection:"_globals_storage-settings",where:{},draft:!0});p&&p.provider&&(A=!0,f=p.provider==="aws"?"s3":p.provider);}catch{}}return l.json({provider:f,configured:A,usage:0,limit:"unlimited"})}catch(y){return console.error("[Storage] status error:",y),l.json({error:y.message},500)}}),_.get("/api/plugins",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=e.getPlugins(),A=e.storageProviders,f=await Promise.all(b.map(async p=>{let w=!0,k=p.name,v={};try{let T=await t.findOne({collection:"_globals_plugin-settings",where:{},draft:!0});T&&T.states&&(v=T.states);}catch{}v[k]!==void 0&&(w=v[k]),A.setPluginEnabled(k,w);let R=k.replace(/^@[^/]+\//,"");R=R.replace(/^(plugin|kyro)-/,"");let I={ai:"AI",seo:"SEO",s3:"S3",aws:"AWS",api:"API",ui:"UI",ftp:"FTP"};if(R=R.split("-").map(T=>{let j=T.toLowerCase();return I[j]?I[j]:T.charAt(0).toUpperCase()+T.slice(1)}).join(" "),R.toLowerCase().startsWith("storage ")){let T=R.split(" ");T.length===2&&(R=`${T[1]} Storage`);}return {id:k,name:p.displayName||R,version:p.version||"1.0.0",description:p.description||"",enabled:w,status:w?"active":"disabled"}}));return l.json(f)}catch(y){return console.error("[Plugins] list error:",y),l.json({error:y.message},500)}}),_.put("/api/plugins/:name/toggle",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=l.req.param("name"),A=e.storageProviders,p=!A.isPluginEnabled(b),w=[];if(!p)for(let v of A.getAll())v.pluginName===b&&w.push(v.type);if(!(l.req.query("force")==="1")&&!p&&w.length>0){let v="local";try{let R=t?.prepare?.('SELECT provider FROM "_globals_storage-settings" LIMIT 1')?.get();R?.provider&&(v=R.provider);}catch{try{let R=await t?.findOne?.({collection:"_globals_storage-settings",where:{},draft:!0});R?.provider&&(v=R.provider);}catch{}}if(w.includes(v))return l.json({error:`Cannot disable "${b}" \u2014 storage provider "${v}" is currently active. Switch to Local storage first.`,requiresAction:!0,activeProvider:v},409)}try{let v={},R="global",I=await t.findOne({collection:"_globals_plugin-settings",where:{},draft:!0});I&&(v=I.states||{},R=I.id),v[b]=p,I?await t.update({collection:"_globals_plugin-settings",id:R,data:{states:v}}):await t.create({collection:"_globals_plugin-settings",data:{states:v,id:"global"}});}catch(v){console.warn(`[Plugins] Could not persist state for "${b}":`,v);}return A.setPluginEnabled(b,p),l.json({name:b,enabled:p})}catch(y){return console.error("[Plugins] toggle error:",y),l.json({error:y.message},500)}}),_.get("/api/health",l=>l.json({status:"ok",version:"0.12.58",collections:e.getCollectionSlugs(),timestamp:new Date().toISOString()})),_.get("/api/metrics",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let A=y.role==="admin"||y.role==="super_admin",p=e.getCollectionSlugs().filter($=>!["users","audit_logs","media","_globals_access-settings","_globals_brand-settings"].includes($)&&!$.startsWith("_globals_")).filter($=>A||chunk7WMMKGEO_cjs.a(y,`${$}:read`)),w=0,k={};await Promise.all(p.map(async $=>{try{let Q=(await t.find({collection:$,where:{},limit:1,page:1,tenantId:b})).totalDocs??0;w+=Q,k[$]=Q;}catch{}}));let v=0;try{v=(await t.find({collection:"media",where:{},limit:1,page:1,tenantId:b})).totalDocs??0;}catch{}let R=0;try{R=(await t.find({collection:"users",where:{},limit:1,page:1,tenantId:b})).totalDocs??0;}catch{}let I=0;try{if(g){let $=await g.getWebhooks();I=Array.isArray($)?$.length:0;}}catch{}let T=0;try{T=(await t.find({collection:chunkDUO523BH_cjs.d,where:{},limit:1,page:1,tenantId:b})).totalDocs??0;}catch{}let j=w+v+R;return l.json({totalDocuments:w,totalMedia:A||chunk7WMMKGEO_cjs.a(y,"media:read")?v:void 0,totalUsers:A||chunk7WMMKGEO_cjs.a(y,"users:read")?R:void 0,totalWebhooks:A?I:void 0,totalApiKeys:A?T:void 0,totalStoredRecords:j,collectionCounts:k,collections:p.length,timestamp:new Date().toISOString()})}catch(y){return console.error("[API] Metrics error:",y),l.json({error:y.message},500)}}),_.get("/api/analytics",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);if(!(y.role==="admin"||y.role==="super_admin"))return l.json({error:"Unauthorized"},403);let p=(await t.find({collection:"orders",where:{},limit:1e3,page:1,tenantId:b})).docs||[],w=await t.findOne({collection:"_globals_store-settings",where:{},tenantId:b}),k=w?.currency?.code||w?.currency||"USD",v={},R={},I={};p.forEach($=>{let z=$.createdAt||$.updatedAt,Q=z?new Date(z).toISOString().split("T")[0]:new Date().toISOString().split("T")[0];v[Q]||(v[Q]=0),R[Q]||(R[Q]=0);let ue=typeof $.total=="number"?$.total:parseFloat(String($.total||0));v[Q]+=isNaN(ue)?0:ue,R[Q]+=1;let X=$.orderStatus||$.status||"pending";I[X]=(I[X]||0)+1;});let T=Object.keys(v).sort().map($=>({date:$,revenue:Math.round(v[$]*100)/100,orders:R[$]})),j=Math.round(T.reduce(($,z)=>$+z.revenue,0)*100)/100;return l.json({chartData:T,totalRevenue:j,totalOrders:p.length,ordersByStatus:I,currencyCode:typeof k=="string"?k:"USD"})}catch(y){return l.json({error:y.message},500)}}),_.get("/api/kyro/schema",async l=>{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=f=>f.map(p=>{let w={name:p.name,type:p.type,label:p.label,required:p.required??false,unique:p.unique??false,indexed:p.indexed??false,defaultValue:p.defaultValue,admin:p.admin?{...p.admin}:void 0};return p.minLength!==void 0&&(w.minLength=p.minLength),p.maxLength!==void 0&&(w.maxLength=p.maxLength),p.pattern!==void 0&&(w.pattern=p.pattern),p.variant!==void 0&&(w.variant=p.variant),p.hasMany!==void 0&&(w.hasMany=p.hasMany),p.min!==void 0&&(w.min=p.min),p.max!==void 0&&(w.max=p.max),p.step!==void 0&&(w.step=p.step),p.integer!==void 0&&(w.integer=p.integer),p.options&&(w.options=p.options),p.relationTo&&(w.relationTo=p.relationTo),p.maxDepth!==void 0&&(w.maxDepth=p.maxDepth),p.minRows!==void 0&&(w.minRows=p.minRows),p.maxRows!==void 0&&(w.maxRows=p.maxRows),p.localized!==void 0&&(w.localized=p.localized),p.language&&(w.language=p.language),p.format&&(w.format=p.format),p.allowedTypes&&(w.allowedTypes=p.allowedTypes),p.maxSize&&(w.maxSize=p.maxSize),(p.type==="group"||p.type==="row"||p.type==="collapsible"&&p.fields)&&(w.fields=b(p.fields)),p.type==="array"&&p.fields&&(w.fields=b(p.fields)),p.type==="blocks"&&p.blocks&&(w.blocks=p.blocks.map(k=>({slug:k.slug,label:k.label,fields:b(k.fields)}))),p.type==="tabs"&&p.tabs&&(w.tabs=p.tabs.map(k=>({label:k.label,name:k.name,fields:b(k.fields)}))),w}),A={collections:{},globals:{}};for(let f of e.getCollections()){let p=f.slug;try{A.collections[p]={slug:p,label:f.label||p,fields:b(f.fields),jsonSchema:zn(e.getZodSchema(p),{target:"openApi3"}),createSchema:zn(e.getCreateZodSchema(p),{target:"openApi3"}),updateSchema:zn(e.getUpdateZodSchema(p),{target:"openApi3"}),procedures:{find:{collection:p,where:"Record<string,any>",sort:"string",limit:"number",page:"number",depth:"number",select:"string[]",draft:"boolean"},findByID:{collection:p,id:"string",depth:"number",select:"string[]",draft:"boolean"},create:{collection:p,data:"Record<string,any>",depth:"number",select:"string[]"},update:{collection:p,id:"string",data:"Record<string,any>",depth:"number",select:"string[]",baseUpdatedAt:"string"},delete:{collection:p,id:"string"},count:{collection:p,where:"Record<string,any>"}}};}catch{}}for(let f of e.getGlobals()){let p=f.slug,w=f.fields;if(p==="storage-settings"){let k=e.storageProviders,v=k.getAll(),R=new Set(k.getAllAvailable(T=>k.isPluginEnabled(T)).map(T=>T.type));R.add("local");let I=new Set(v.map(T=>T.type));w=w.filter(T=>T.type==="group"&&T.name&&I.has(T.name)?R.has(T.name):true).map(T=>T.name==="provider"&&T.type==="select"?{...T,options:T.options.filter(j=>R.has(j.value))}:T);}try{A.globals[p]={slug:p,label:f.label||p,fields:b(w),jsonSchema:zn(e.getZodSchema(p),{target:"openApi3"}),procedures:{get:{},update:{data:"Record<string,any>"}}};}catch{}}return l.json(A)}),_.get("/api/collections",async l=>{let{user:y}=await V(l.req.raw,q,i,c);if(!y)return l.json({error:"Authentication required"},401);let b=e.getCollections().map(A=>({slug:A.slug,label:A.label||A.slug,fields:A.fields.filter(f=>f.name).map(f=>({name:f.name,type:f.type,required:f.required,label:f.label}))}));return l.json(b)});function Kn(l,y,b){if(b in y)return y[b];for(let A of l)if(A.name){if(A.type==="tabs"&&A.tabs){let f=y[A.name];if(f&&typeof f=="object"&&b in f)return f[b]}if((A.type==="group"||A.type==="collapsible")&&A.fields){let f=y[A.name];if(f&&typeof f=="object"){if(b in f)return f[b];let p=Kn(A.fields,f,b);if(p!==void 0)return p}}}}_.get("/api/search",async l=>{try{let y=l.req.query("q")||"",b=l.req.query("collections")||"",A=Math.min(parseInt(l.req.query("limit")||"10"),50);if(!y||y.length<2)return l.json({results:[],message:"Query too short"});let{user:f,tenantId:p}=await V(l.req.raw,q,i,c),w=b?b.split(",").filter(Boolean):e.getCollectionSlugs(),k=[],v=new RegExp(y.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"i");for(let R of e.getCollections()){if(!w.includes(R.slug)||!(await Ie(R,"read",l.req.raw,f,p,void 0,U,F)).allowed)continue;let T=R.fields.filter(j=>j.name&&j.name!=="id"&&(j.type==="text"||j.type==="email"||j.type==="textarea"||j.type==="richtext"||j.indexed)&&!j.admin?.hidden).map(j=>j.name);if(T.length!==0)try{let j=T.map(z=>{let Q={};return Q[z]={like:`%${y}%`},Q}),$=await t.find({collection:R.slug,where:{OR:j},limit:A,tenantId:p});await chunkAK754S3T_cjs.a($.docs,R.fields,t,e,1,0);for(let z of $.docs){let Q=R.admin?.useAsTitle||T.find(X=>X==="title"||X==="name"||X==="heading"||X==="slug"),ue=Q?Kn(R.fields,z,Q)??z.id:z.id;k.push({collection:R.slug,label:R.label||R.slug,id:z.id,title:String(ue||"Untitled"),doc:z});}}catch(j){console.error(`Search error for ${R.slug}:`,j);}}return k.sort((R,I)=>R.label.localeCompare(I.label)),l.json({results:k})}catch(y){return l.json({error:y.message,results:[]},500)}}),_.get("/api/keys",async l=>{try{let{user:y,tenantId:b}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:read"))return l.json({error:"Forbidden"},403);let A=parseInt(l.req.query("page")||"1"),f=Math.min(parseInt(l.req.query("limit")||"50"),100),p=await t.find({collection:chunkDUO523BH_cjs.d,where:{},page:A,limit:f,tenantId:b}),w=(p.docs||[]).map(k=>({id:k.id,name:k.name,keyPrefix:k.keyPrefix,permissions:k.permissions||[],lastUsed:k.lastUsedAt,createdAt:k.createdAt}));return l.json({docs:w,totalDocs:p.totalDocs||w.length,totalPages:p.totalPages||1})}catch(y){return console.error("[ApiKeys] GET error:",y),l.json({error:y.message},500)}}),_.post("/api/keys",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:admin"))return l.json({error:"Forbidden"},403);let b=await l.req.json();if(!b.name||typeof b.name!="string")return l.json({error:"name is required"},400);let A=chunkDUO523BH_cjs.i(),f=await t.create({collection:chunkDUO523BH_cjs.d,data:{userId:y.id,name:b.name,key:A,keyPrefix:chunkDUO523BH_cjs.j(A),permissions:Array.isArray(b.permissions)?b.permissions:["*"],expiresAt:b.expiresAt||null,createdAt:new Date().toISOString()}});return await W?.createAuditLog({action:"api_key_create",userId:y.id,resource:"api_key",resourceId:f.id,success:!0,metadata:{keyName:b.name}}),l.json({...f,key:A,permissions:Array.isArray(b.permissions)?b.permissions:["*"]},201)}catch(y){return console.error("[ApiKeys] POST error:",y),l.json({error:y.message},500)}}),_.delete("/api/keys/:id",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:admin"))return l.json({error:"Forbidden"},403);let b=l.req.param("id"),A=await t.findByID({collection:chunkDUO523BH_cjs.d,id:b});return A?(await t.delete({collection:chunkDUO523BH_cjs.d,id:b}),await W?.createAuditLog({action:"api_key_delete",userId:y.id,resource:"api_key",resourceId:b,success:!0,metadata:{keyName:A.name}}),l.json({message:"API key deleted"})):l.json({error:"API key not found"},404)}catch(y){return console.error("[ApiKeys] DELETE error:",y),l.json({error:y.message},500)}}),_.patch("/api/keys/:id",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:admin"))return l.json({error:"Forbidden"},403);let b=l.req.param("id"),A=await l.req.json(),f=await t.findByID({collection:chunkDUO523BH_cjs.d,id:b});if(!f)return l.json({error:"API key not found"},404);let p={};if(typeof A.name=="string"&&A.name.trim()&&(p.name=A.name.trim()),Array.isArray(A.permissions)&&(p.permissions=A.permissions),A.expiresAt!==void 0&&(p.expiresAt=A.expiresAt||null),Object.keys(p).length===0)return l.json({error:"Nothing to update"},400);let w=await t.update({collection:chunkDUO523BH_cjs.d,id:b,data:p});return l.json({...w,keyPrefix:f.keyPrefix})}catch(y){return console.error("[ApiKeys] PATCH error:",y),l.json({error:y.message},500)}}),_.post("/api/keys/:id/rotate",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:admin"))return l.json({error:"Forbidden"},403);let b=l.req.param("id"),A=await t.findByID({collection:chunkDUO523BH_cjs.d,id:b});if(!A)return l.json({error:"API key not found"},404);let f=chunkDUO523BH_cjs.i(),p=await t.update({collection:chunkDUO523BH_cjs.d,id:b,data:{key:f,keyPrefix:chunkDUO523BH_cjs.j(f),lastUsedAt:null}});return await W?.createAuditLog({action:"api_key_rotate",userId:y.id,resource:"api_key",resourceId:b,success:!0,metadata:{keyName:A.name}}),l.json({...p,key:f,permissions:A.permissions,expiresAt:A.expiresAt})}catch(y){return console.error("[ApiKeys] rotate error:",y),l.json({error:y.message},500)}}),_.get("/api/webhooks/actions",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:read"))return l.json({error:"Forbidden"},403);let b={generic:{label:"Custom URL",description:"POST to any endpoint with Kyro payload",configFields:[],envVars:[]},"github-push":{label:"GitHub Push",description:"Push an empty commit to simulate a push event",configFields:[{name:"githubOwner",label:"Owner",required:!0,placeholder:"e.g., kyro-dev"},{name:"githubRepo",label:"Repository",required:!0,placeholder:"e.g., my-website"},{name:"githubBranch",label:"Branch",required:!1,placeholder:"main"}],envVars:["GITHUB_TOKEN"]}};return l.json({actions:b})}catch(y){return console.error("[Webhooks] actions error:",y),l.json({error:y.message},500)}}),_.get("/api/webhooks",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:read"))return l.json({error:"Forbidden"},403);if(!g)return l.json({error:"Webhook service not available"},503);let b=await g.getWebhooks();return l.json({docs:b})}catch(y){return console.error("[Webhooks] GET error:",y),l.json({error:y.message},500)}}),_.post("/api/webhooks",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:admin"))return l.json({error:"Forbidden"},403);if(!g)return l.json({error:"Webhook service not available"},503);let b=await l.req.json(),A=await g.createWebhook(b);return await W?.createAuditLog({action:"webhook_create",userId:y.id,resource:"webhook",resourceId:A.id,success:!0,metadata:{name:A.name,url:A.url}}),l.json(A,201)}catch(y){return console.error("[Webhooks] POST error:",y),l.json({error:y.message},500)}}),_.get("/api/webhooks/:id",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:read"))return l.json({error:"Forbidden"},403);if(!g)return l.json({error:"Webhook service not available"},503);let b=l.req.param("id"),A=await g.getWebhookById(b);return A?l.json(A):l.json({error:"Webhook not found"},404)}catch(y){return console.error("[Webhooks] GET :id error:",y),l.json({error:y.message},500)}}),_.patch("/api/webhooks/:id",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:admin"))return l.json({error:"Forbidden"},403);if(!g)return l.json({error:"Webhook service not available"},503);let b=l.req.param("id"),A=await l.req.json(),f=await g.updateWebhook(b,A);return f?(await W?.createAuditLog({action:"webhook_update",userId:y.id,resource:"webhook",resourceId:b,success:!0,metadata:{name:f.name}}),l.json(f)):l.json({error:"Webhook not found"},404)}catch(y){return console.error("[Webhooks] PATCH error:",y),l.json({error:y.message},500)}}),_.delete("/api/webhooks/:id",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:admin"))return l.json({error:"Forbidden"},403);if(!g)return l.json({error:"Webhook service not available"},503);let b=l.req.param("id"),A=await g.getWebhookById(b);return A?(await g.deleteWebhook(b),await W?.createAuditLog({action:"webhook_delete",userId:y.id,resource:"webhook",resourceId:b,success:!0,metadata:{name:A.name}}),l.json({message:"Webhook deleted"})):l.json({error:"Webhook not found"},404)}catch(y){return console.error("[Webhooks] DELETE error:",y),l.json({error:y.message},500)}}),_.post("/api/webhooks/:id/test",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:admin"))return l.json({error:"Forbidden"},403);if(!g)return l.json({error:"Webhook service not available"},503);let b=l.req.param("id"),A=await g.testWebhook(b);return A?l.json(A):l.json({error:"Webhook not found"},404)}catch(y){return console.error("[Webhooks] test error:",y),l.json({error:y.message},500)}}),_.get("/api/webhooks/:id/history",async l=>{try{let{user:y}=await V(l.req.raw,q,i,c);if(!y||!chunk7WMMKGEO_cjs.a(y,"users:read"))return l.json({error:"Forbidden"},403);if(!g)return l.json({error:"Webhook service not available"},503);let b=l.req.param("id"),A=Math.min(parseInt(l.req.query("limit")||"50"),100),f=await g.getDeliveryHistory(b,A);return l.json({docs:f})}catch(y){return console.error("[Webhooks] history error:",y),l.json({error:y.message},500)}});function Vn(l){let y={},b=["name","type","required","hasMany","relationTo","options","min","max","minLength","maxLength","defaultValue","label","localized","admin","unique","index","hidden","readOnly","deprecated"];for(let A of b)A in l&&(y[A]=l[A]);return l.fields&&(y.fields=l.fields.map(Vn)),l.tabs&&(y.tabs=l.tabs.map(A=>({label:A.label,name:A.name,fields:A.fields.map(Vn)}))),y}_.get("/api/__schema",async l=>{try{let{user:y,apiKeyContext:b}=await V(l.req.raw,q,i,c);if(!y&&!b)return l.json({error:"Unauthorized"},401);let f=e.getCollections().filter(p=>p.slug!=="users"&&p.slug!=="audit_logs").map(p=>({slug:p.slug,label:p.label,labelPlural:p.labelPlural,singularLabel:p.singularLabel,timestamps:p.timestamps,auth:!!p.auth,tenantScoped:!!p.tenantScoped,upload:p.upload?{staticDir:p.upload.staticDir,imageSizes:p.upload.imageSizes,mimeTypes:p.upload.mimeTypes}:void 0,fields:p.fields.map(Vn)}));return l.json(f)}catch(y){return console.error("[Schema] error:",y),l.json({error:y.message},500)}});let xd=e.getCollections();for(let l of xd){let A=function(f,p){let w=[],k=new Set([...Object.keys(f),...Object.keys(p)]);for(let v of k)v==="id"||v==="createdAt"||v==="updatedAt"||JSON.stringify(f[v])!==JSON.stringify(p[v])&&w.push({field:v,oldValue:v in f?f[v]:void 0,newValue:v in p?p[v]:void 0});return w};let y=l.slug;if(y==="users"||y==="audit_logs")continue;let b=`/api/${y}`;_.post(`${b}/dynamic-options/:fieldName`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"read",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);let R=f.req.param("fieldName"),I=await f.req.json(),{data:T,siblingData:j}=I,$=hs(l.fields,R);if(!$)return f.json({error:"Field not found"},404);if($.type!=="select")return f.json({error:"Field is not a select field"},400);let z=[];return typeof $.options=="function"?z=await $.options({data:T||{},siblingData:j||{}}):Array.isArray($.options)&&(z=$.options),f.json({options:z})}catch(p){return f.json({error:p.message},500)}}),_.get(b,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"read",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);w&&t.setTenantContext({tenantId:w,userId:p?.id??"",role:p?.role,isSuperAdmin:p?.role==="super_admin"});let R=new URL(f.req.url),I=parseInt(R.searchParams.get("page")||"1"),T=Math.min(parseInt(R.searchParams.get("limit")||"10"),100),j=R.searchParams.get("sort")||void 0,$=parseInt(R.searchParams.get("depth")||"0"),z=R.searchParams.get("select")?.split(",")||void 0,Q=R.searchParams.get("draft"),ue=Q==="true"?!0:Q==="false"?!1:!!p,X={},ye=R.searchParams.get("where");if(ye)try{X=JSON.parse(ye);}catch{return f.json({error:"Invalid JSON in where parameter"},400)}let Ze=await t.find({collection:y,where:X,sort:j,limit:T,page:I,depth:$,tenantId:w,select:z,draft:ue});return await chunkAK754S3T_cjs.a(Ze.docs,l.fields,t,e,1,$),f.json(chunkZOVH6QT5_cjs.a(Ze))}catch(p){return console.error("[API] list error:",p),f.json({error:p.message},500)}}),_.get(`${b}/:id/versions`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"read",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);let R=f.req.param("id");if(!R)return f.json({error:"Missing document ID"},400);let I=new URL(f.req.url),T=I.searchParams.get("compareA"),j=I.searchParams.get("compareB");if(_c(W,k,`${b}/${R}/versions`,"GET",f.req.raw),T&&j){let[ue,X]=await Promise.all([t.findVersionByID({collection:y,versionId:T,tenantId:w}),t.findVersionByID({collection:y,versionId:j,tenantId:w})]);if(!ue||!X)return f.json({error:"Version not found"},404);let ye=A(ue.data,X.data);return f.json({diffs:ye})}let $=parseInt(I.searchParams.get("page")||"1"),z=Math.min(parseInt(I.searchParams.get("limit")||"10"),100),Q=await t.findVersions({collection:y,documentId:R,page:$,limit:z,tenantId:w});return f.json(Q)}catch(p){return console.error("[API] versions error:",p),f.json({error:p.message},500)}}),_.put(`${b}/:id/draft`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"update",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);let R=f.req.param("id"),I=await f.req.json(),T=wc(I),j=await t.findByID({collection:y,id:R,tenantId:w,draft:!0});if(!j)return f.json({error:"Document not found"},404);let $;I.delta?$={...j,...I.delta}:$=I.data??gd(I);let z=await t.updateLatestVersion({collection:y,documentId:R,data:$,status:"draft",tenantId:w});return p&&W?.createAuditLog({action:"document_update",userId:p.id,resource:y,resourceId:R,success:!0,metadata:{type:"draft_save"}}),f.json({data:z,message:"Draft saved successfully"})}catch(p){return f.json({error:p.message},500)}}),_.delete(`${b}/:id/draft`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"update",f.req.raw,p,w,k,U,F);return v.allowed?(p&&W?.createAuditLog({action:"document_update",userId:p.id,resource:y,resourceId:f.req.param("id"),success:!0,metadata:{type:"draft_discard"}}),f.json({message:"Draft discarded successfully"})):f.json({error:v.error},v.status||403)}catch(p){return f.json({error:p.message},500)}}),_.get(`${b}/:id`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=new URL(f.req.url),R=v.searchParams.get("draft"),I=v.searchParams.get("kyroToken"),T=!1;if(R==="true"&&I&&s)try{let X=await _o(I,s,"HS256");X&&X.type==="preview"&&X.collection===l.slug&&(T=!0);}catch(X){console.warn("Invalid preview token",X);}if(!T){let X=await Ie(l,"read",f.req.raw,p,w,k,U,F);if(!X.allowed)return f.json({error:X.error},X.status||403)}let j=f.req.param("id"),$=parseInt(v.searchParams.get("depth")||"0"),z=v.searchParams.get("select")?.split(",")||void 0,Q=R==="true"?!0:R==="false"?!1:!!p,ue=await t.findByID({collection:y,id:j,depth:$,tenantId:w,select:z,draft:Q});return !ue&&l.fields.some(X=>X.name==="slug")&&(ue=await t.findOne({collection:y,where:{slug:j},tenantId:w,draft:Q})),ue?(await chunkAK754S3T_cjs.a([ue],l.fields,t,e,1,$),f.json({data:chunkZOVH6QT5_cjs.a(ue)})):f.json({error:"Document not found"},404)}catch(p){return f.json({error:p.message},500)}}),_.post(`${b}/preview-url`,async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=await Ie(l,"read",f.req.raw,p,w);if(!k.allowed)return f.json({error:k.error||"Forbidden"},k.status||403);let v=await f.req.json().catch(()=>({})),R="";s&&(R=await wo({type:"preview",collection:l.slug,id:v.id,exp:Math.floor(Date.now()/1e3)+3600},s,"HS256"));let I="";if(l.admin?.preview){I=await l.admin.preview(v,{req:f.req.raw,token:R});try{let T=new URL(I,"http://localhost");T.searchParams.has("preview")||T.searchParams.set("preview","true"),!T.searchParams.has("kyroToken")&&R&&T.searchParams.set("kyroToken",R),I=I.startsWith("http")?T.toString():`${T.pathname}${T.search}`;}catch{}}else {let T="";try{let $=await t.findOne({collection:"_globals_site-settings",where:{}});$?.siteUrl&&(T=$.siteUrl);}catch{}if(!T)return f.json({error:"No site URL configured in settings, and no custom preview function defined for this collection."},400);T=T.replace(/\/$/,"");let j=v.slug||v.id||"";I=`${T}/${l.slug}/${j}?preview=true&kyroToken=${R}`;}return f.json({url:I})}catch(p){return f.json({error:p.message},500)}}),_.post(b,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"create",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);w&&t.setTenantContext({tenantId:w,userId:p?.id??"",role:p?.role,isSuperAdmin:p?.role==="super_admin"}),_c(W,k,b,"POST",f.req.raw);let I=await f.req.json();Jr(I,l.fields),Qr(l.fields,I);let T=f.req.raw;if(l.hooks?.beforeValidate)for(let X of l.hooks.beforeValidate){let ye=await X({collection:y,data:I,req:T,user:p,tenantId:w,operation:"create"});ye&&typeof ye=="object"&&!Array.isArray(ye)&&Object.assign(I,ye);}let j=e.getCreateZodSchema(y);try{I=j.parse(I);}catch(X){return f.json({error:`Validation failed: ${ra(X.errors)}`,details:X.errors},400)}l.tenantScoped&&w&&(I.tenantId=w);let $=l.versions?.drafts===!0,z=l.fields.find(X=>X.name==="status"),Q=z?.type==="select"&&Array.isArray(z.options)&&z.options.some(X=>X.value==="published");if($?I.status="draft":Q&&!I.status&&(I.status="published"),l.hooks?.beforeChange)for(let X of l.hooks.beforeChange){let ye=await X({collection:y,data:I,req:T,user:p,tenantId:w,operation:"create"});ye&&typeof ye=="object"&&!Array.isArray(ye)&&Object.assign(I,ye);}let ue=await t.create({collection:y,data:I,tenantId:w});if($&&await t.createVersion({collection:y,documentId:ue.id,data:I,status:"draft",createdBy:p?.id,changeDescription:"Created",tenantId:w}),l.hooks?.afterChange)for(let X of l.hooks.afterChange)await X({collection:y,doc:ue,data:I,req:T,user:p,tenantId:w,operation:"create"});return g&&g.trigger(Ja(y,"create"),{collection:y,operation:"create",data:ue,user:p?{id:p.id,email:p.email,role:p.role}:void 0,tenantId:w}).catch(X=>console.error("[Webhook] Failed to trigger:",X)),p&&W?.createAuditLog({action:"document_create",userId:p.id,resource:y,resourceId:ue.id,success:!0}),f.json({data:ue,message:"Created successfully"},201)}catch(p){return p.name==="ZodError"?f.json({error:`Validation failed: ${ra(p.errors)}`,details:p.errors},400):f.json({error:p.message},500)}}),_.patch(`${b}/:id`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"update",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);let R=f.req.param("id"),I=await f.req.json(),T=wc(I),j=await t.findByID({collection:y,id:R,tenantId:w,draft:!0});if(!j)return f.json({error:"Document not found"},404);if(T&&j.updatedAt&&T!==j.updatedAt)return f.json(yd(T,j),409);let $=Object.fromEntries(Object.entries(gd(I)).filter(([Xe,Je])=>Je!=="null"&&Je!==void 0));Jr($,l.fields),Qr(l.fields,$);let z=f.req.raw;if(l.hooks?.beforeValidate)for(let Xe of l.hooks.beforeValidate){let Je=await Xe({collection:y,data:$,originalDoc:j,req:z,user:p,tenantId:w,operation:"update"});Je&&typeof Je=="object"&&!Array.isArray(Je)&&Object.assign($,Je);}if($=e.getUpdateZodSchema(y).parse($),l.hooks?.beforeChange)for(let Xe of l.hooks.beforeChange){let Je=await Xe({collection:y,data:$,originalDoc:j,req:z,user:p,tenantId:w,operation:"update"});Je&&typeof Je=="object"&&!Array.isArray(Je)&&Object.assign($,Je);}let ue=f.req.header("X-Draft")==="true",X=l.versions?.drafts===!0,ye=f.req.query("autosave")==="true",Ze;if(X&&ue)await t.createVersion({collection:y,documentId:R,data:$,status:"draft",autosave:ye,createdBy:p?.id,changeDescription:ye?"Autosave":"Draft saved",tenantId:w});else if(X){let Xe=I.status==="draft"?"draft":"published";await t.update({collection:y,id:R,data:{...$,status:Xe},tenantId:w}),await t.createVersion({collection:y,documentId:R,data:{...$,status:Xe},status:Xe,createdBy:p?.id,changeDescription:Xe==="published"?"Published":"Unpublished",tenantId:w});}else await t.update({collection:y,id:R,data:$,tenantId:w});if(Ze=await t.findByID({collection:y,id:R,tenantId:w,draft:!0}),l.hooks?.afterChange)for(let Xe of l.hooks.afterChange)await Xe({collection:y,doc:Ze,data:$,originalDoc:j,req:z,user:p,tenantId:w,operation:"update"});return g&&!ye&&g.trigger(Ja(y,"update"),{collection:y,operation:"update",data:Ze,previousData:j,user:p?{id:p.id,email:p.email,role:p.role}:void 0,tenantId:w}).catch(Xe=>console.error("[Webhook] Failed to trigger:",Xe)),_c(W,k,`${b}/${R}`,"PATCH",f.req.raw),p&&W?.createAuditLog({action:"document_update",userId:p.id,resource:y,resourceId:R,success:!0}),f.json({data:Ze,message:X?"Draft saved":"Updated successfully"})}catch(p){return p.name==="ZodError"?(console.error(`[PATCH ${b}/:id] Validation failed:`,p.errors),f.json({error:`Validation failed: ${ra(p.errors)}`,details:p.errors},400)):(console.error(`[PATCH ${b}/:id] ERROR:`,p.message,"CAUSE:",p.cause?.message||p.cause,"QUERY:",p.query),f.json({error:p.message},500))}}),_.delete(`${b}/:id`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"delete",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);w&&t.setTenantContext({tenantId:w,userId:p?.id??"",role:p?.role,isSuperAdmin:p?.role==="super_admin"});let R=f.req.param("id"),I=f.req.raw,T=await t.findByID({collection:y,id:R,tenantId:w,draft:!0});if(!T)return f.json({error:"Document not found"},404);if(l.hooks?.beforeDelete)for(let $ of l.hooks.beforeDelete)await $({collection:y,doc:T,req:I,user:p,tenantId:w,operation:"delete"});let j=await t.delete({collection:y,id:R,tenantId:w});if(l.hooks?.afterDelete)for(let $ of l.hooks.afterDelete)await $({collection:y,doc:j,originalDoc:T,req:I,user:p,tenantId:w,operation:"delete"});return g&&g.trigger(Ja(y,"delete"),{collection:y,operation:"delete",data:j,previousData:T,user:p?{id:p.id,email:p.email,role:p.role}:void 0,tenantId:w}).catch($=>console.error("[Webhook] Failed to trigger:",$)),_c(W,k,`${b}/${R}`,"DELETE",f.req.raw),p&&W?.createAuditLog({action:"document_delete",userId:p.id,resource:y,resourceId:R,success:!0}),f.json({data:j,message:"Deleted successfully"})}catch(p){return console.error(`[DELETE] Error deleting ${y}:`,p),f.json({error:p.message||String(p)},500)}}),_.post(`${b}/:id/duplicate`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"create",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);let R=f.req.param("id"),I=await t.findByID({collection:y,id:R,tenantId:w,draft:!0});if(!I)return f.json({error:"Document not found"},404);let{id:T,createdAt:j,updatedAt:$,...z}=I;Us(l.fields,z);let Q=Date.now().toString(36);"slug"in z&&typeof z.slug=="string"&&(z.slug=`${z.slug||"document"}-copy-${Q}`),"title"in z&&typeof z.title=="string"?z.title=`${z.title||"Copy"} (Copy)`:"name"in z&&typeof z.name=="string"&&(z.name=`${z.name||"Copy"} (Copy)`);let ue=await t.create({collection:y,data:{...z,status:"draft"},tenantId:w});return f.json({data:ue,message:"Document duplicated successfully"})}catch(p){return console.error("[Duplicate] Error:",p),f.json({error:p.message||String(p)},500)}}),_.post(`${b}/:id/versions/:versionId/restore`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"update",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);let R=f.req.param("id"),I=f.req.param("versionId"),T=await t.findVersionByID({collection:y,versionId:I,tenantId:w});if(!T)return f.json({error:"Version not found"},404);let j=await t.update({collection:y,id:R,data:{...T.data,status:"draft"},tenantId:w});return f.json({data:j,message:"Version restored successfully"})}catch(p){return f.json({error:p.message},500)}}),_.post(`${b}/:id/versions`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"update",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);let R=await f.req.json(),{versionId:I,action:T}=R;if(T==="restore"&&I){let j=await t.findVersionByID({collection:y,versionId:I,tenantId:w});if(!j)return f.json({error:"Version not found"},404);let $=await t.update({collection:y,id:f.req.param("id"),data:{...j.data,status:"draft"},tenantId:w});return f.json({data:$,message:"Version restored successfully"})}return f.json({error:"Invalid action"},400)}catch(p){return f.json({error:p.message},500)}}),_.post(`${b}/:id/publish`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"update",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);w&&t.setTenantContext({tenantId:w,userId:p?.id??"",role:p?.role,isSuperAdmin:p?.role==="super_admin"});let R=f.req.param("id"),I=await f.req.json().catch(()=>({})),T=wc(I),j=await t.findByID({collection:y,id:R,tenantId:w,draft:!0});if(!j)return f.json({error:"Document not found"},404);if(T&&j.updatedAt&&T!==j.updatedAt)return f.json(yd(T,j),409);let $={status:"published"},z=j;if(l.versions?.drafts){let ue=await t.findVersions({collection:y,documentId:R,limit:1,sort:"-createdAt",tenantId:w});if(ue.docs.length>0){let X=ue.docs[0];z={...j,...X.data},$={...X.data,...$};}}let Q=await t.update({collection:y,id:R,data:$,tenantId:w});return l.versions?.drafts&&await t.createVersion({collection:y,documentId:R,data:{...z,status:"published"},status:"published",createdBy:p?.id,changeDescription:"Published",tenantId:w}),g&&g.trigger(Ja(y,"update"),{collection:y,operation:"update",data:Q,user:p?{id:p.id,email:p.email,role:p.role}:void 0,tenantId:w}).catch(ue=>console.error("[Webhook] Failed to trigger:",ue)),f.json({data:Q,message:"Published successfully"})}catch(p){return f.json({error:p.message},500)}}),_.post(`${b}/:id/unpublish`,async f=>{try{let{user:p,tenantId:w,apiKeyContext:k}=await V(f.req.raw,q,i,c),v=await Ie(l,"update",f.req.raw,p,w,k,U,F);if(!v.allowed)return f.json({error:v.error},v.status||403);let R=f.req.param("id");if(!await t.findByID({collection:y,id:R,tenantId:w,draft:!0}))return f.json({error:"Document not found"},404);let T=await t.update({collection:y,id:R,data:{status:"draft"},tenantId:w});return g&&g.trigger(Ja(y,"update"),{collection:y,operation:"update",data:T,user:p?{id:p.id,email:p.email,role:p.role}:void 0,tenantId:w}).catch(j=>console.error("[Webhook] Failed to trigger:",j)),f.json({data:T,message:"Unpublished successfully"})}catch(p){return f.json({error:p.message},500)}});}for(let l of e.getGlobals()){let y=l.slug,b=`/api/globals/${y}`;_.post(`${b}/dynamic-options/:fieldName`,async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=await Yt(l,"read",f.req.raw,p,w,U);if(!k.allowed)return f.json({error:k.error},k.status||403);let v=f.req.param("fieldName"),R=await f.req.json(),{data:I,siblingData:T}=R,j=hs(l.fields,v);if(!j)return f.json({error:"Field not found"},404);if(j.type!=="select")return f.json({error:"Field is not a select field"},400);let $=[];return typeof j.options=="function"?$=await j.options({data:I||{},siblingData:T||{}}):Array.isArray(j.options)&&($=j.options),f.json({options:$})}catch(p){return f.json({error:p.message},500)}}),_.get(b,async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=new URL(f.req.url),v=k.searchParams.get("kyroToken"),R=k.searchParams.get("draft"),I=!1;if(R==="true"&&v&&s)try{let Q=await _o(v,s,"HS256");Q&&Q.type==="preview"&&Q.collection===`_globals_${l.slug}`&&(I=!0);}catch(Q){console.warn("Invalid preview token",Q);}if(!I){let Q=await Yt(l,"read",f.req.raw,p,w,U);if(!Q.allowed)return f.json({error:Q.error},Q.status||403)}let T=R==="true"?!0:R==="false"?!1:!!p,j=parseInt(k.searchParams.get("depth")||"0"),z=(await t.find({collection:`_globals_${y}`,where:{},tenantId:w,draft:T,depth:j,limit:1})).docs[0];if(z&&j>0&&await chunkAK754S3T_cjs.a([z],l.fields,t,e,1,j),y==="storage-settings"&&(typeof globalThis.STORAGE_BUCKET<"u"||typeof f.env?.STORAGE_BUCKET<"u")&&(z?z.provider||(z.provider="cloudflare_r2"):z={id:y,provider:"cloudflare_r2"}),y==="system"){let Q=jB__default.default.randomBytes(32).toString("hex");z?z.appSecret||(await t.update({collection:`_globals_${y}`,id:y,data:{appSecret:Q},tenantId:w}),z.appSecret=Q):z=await t.create({collection:`_globals_${y}`,data:{id:y,appSecret:Q},tenantId:w});}return f.json({data:z||{}})}catch(p){return f.json({error:p.message},500)}});let A=async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=await Yt(l,"update",f.req.raw,p,w,U);if(!k.allowed)return f.json({error:k.error},k.status||403);let v=new URL(f.req.url),R=parseInt(v.searchParams.get("depth")||"0"),I=await f.req.json(),T=wc(I),j=gd(I),$=Object.fromEntries(Object.entries(j).filter(([Pt,Is])=>Is!==null&&Is!=="null"&&Is!==void 0));Jr($,l.fields),Qr(l.fields,$);let z=e.getUpdateZodSchema(y),Q;try{Q=z.parse($);}catch(Pt){return f.json({error:`Validation failed: ${ra(Pt.errors)}`,details:Pt.errors},400)}let ue=new Set(["id","createdAt","updatedAt","status","baseUpdatedAt","_baseUpdatedAt"]),X=Object.fromEntries(Object.entries(Q).filter(([Pt])=>!ue.has(Pt))),ye=`_globals_${y}`,Ze=await t.findOne({collection:ye,where:{},tenantId:w,draft:!0});if(Ze&&T&&Ze.updatedAt&&T!==Ze.updatedAt)return f.json(yd(T,Ze),409);let Xe=f.req.header("X-Draft")==="true",Je=l.versions?.drafts===!0,Wr=f.req.query("autosave")==="true",St;if(Je&&Xe)await t.createVersion({collection:ye,documentId:y,data:X,status:"draft",autosave:Wr,createdBy:p?.id,changeDescription:Wr?"Autosave":"Manual save",tenantId:w}),Ze?St=Ze:St=await t.create({collection:ye,data:{...X,id:y,status:"draft"},tenantId:w});else if(Je&&!Xe){let Pt="published";Ze?St=await t.update({collection:ye,id:y,data:{...X,status:Pt},tenantId:w}):St=await t.create({collection:ye,data:{...X,id:y,status:Pt},tenantId:w}),await t.createVersion({collection:ye,documentId:y,data:X,status:Pt,autosave:!1,createdBy:p?.id,changeDescription:"Published",tenantId:w});}else Ze?St=await t.update({collection:ye,id:y,data:X,tenantId:w}):St=await t.create({collection:ye,data:{...X,id:y},tenantId:w});if(y==="storage-settings"&&($t=null,Dr=null),y==="email-settings"){let Pt=await chunkXTTGHN3D_cjs.q.fromConfig(t);_e.email=Pt||void 0;}return y==="system"&&await chunkO4YE57OS_cjs.b(),p&&W?.createAuditLog({action:"settings_change",userId:p.id,resource:`global:${y}`,resourceId:y,success:!0}),St&&R>0&&await chunkAK754S3T_cjs.a([St],l.fields,t,e,1,R),f.json({data:St,message:"Updated successfully"})}catch(p){return console.error(`[API] Save global "${y}" failed:`,p),f.json({error:p.message||"Save failed",stack:process.env.NODE_ENV==="development"?p.stack:void 0},500)}};_.post(b,A),_.patch(b,A),_.post(`${b}/preview-url`,async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=await Yt(l,"read",f.req.raw,p,w);if(!k.allowed)return f.json({error:k.error||"Forbidden"},k.status||403);let v=await f.req.json().catch(()=>({})),R="";s&&(R=await wo({type:"preview",collection:`_globals_${l.slug}`,exp:Math.floor(Date.now()/1e3)+3600},s,"HS256"));let I="";if(l.admin?.preview)I=await l.admin.preview(v,{req:f.req.raw,token:R});else {let T="";try{let j=await t.findOne({collection:"_globals_site-settings",where:{}});j?.siteUrl&&(T=j.siteUrl);}catch{}if(!T)return f.json({error:"No site URL configured in settings, and no custom preview function defined."},400);T=T.replace(/\/$/,""),I=`${T}/?preview=true&kyroToken=${R}`;}return f.json({url:I})}catch(p){return f.json({error:p.message},500)}}),_.post(`${b}/publish`,async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=await Yt(l,"update",f.req.raw,p,w,U);if(!k.allowed)return f.json({error:k.error},403);let v=`_globals_${y}`,R=await t.findOne({collection:v,where:{},tenantId:w,draft:!0});if(!R)return f.json({error:"Global not found"},404);let I={status:"published"},T=R;if(l.versions?.drafts){let $=await t.findVersions({collection:v,documentId:y,limit:1,sort:"-createdAt",tenantId:w});$.docs.length>0&&(T={...R,...$.docs[0].data},I={...$.docs[0].data,...I});}let j=await t.update({collection:v,id:y,data:I,tenantId:w});return l.versions?.drafts&&await t.createVersion({collection:v,documentId:y,data:{...T,status:"published"},status:"published",createdBy:p?.id,changeDescription:"Published",tenantId:w}),f.json({data:j,message:"Published successfully"})}catch(p){return f.json({error:p.message},500)}}),_.post(`${b}/unpublish`,async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=await Yt(l,"update",f.req.raw,p,w,U);if(!k.allowed)return f.json({error:k.error},403);let v=await t.update({collection:`_globals_${y}`,id:y,data:{status:"draft"},tenantId:w});return f.json({data:v,message:"Unpublished successfully"})}catch(p){return f.json({error:p.message},500)}}),_.get(`${b}/versions`,async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=await Yt(l,"read",f.req.raw,p,w,U);if(!k.allowed)return f.json({error:k.error},403);let v=parseInt(f.req.query("limit")||"10"),R=parseInt(f.req.query("page")||"1"),I=await t.findVersions({collection:`_globals_${y}`,documentId:y,limit:v,page:R,tenantId:w});return f.json(I)}catch(p){return f.json({error:p.message},500)}}),_.get(`${b}/versions/:versionId`,async f=>{try{let p=f.req.param("versionId"),{user:w,tenantId:k}=await V(f.req.raw,q,i,c),v=await Yt(l,"read",f.req.raw,w,k,U);if(!v.allowed)return f.json({error:v.error},403);let R=await t.findVersionByID({collection:`_globals_${y}`,versionId:p,tenantId:k});return R?f.json({data:R}):f.json({error:"Version not found"},404)}catch(p){return f.json({error:p.message},500)}}),_.post(`${b}/versions/:versionId/restore`,async f=>{try{let p=f.req.param("versionId"),{user:w,tenantId:k}=await V(f.req.raw,q,i,c),v=await Yt(l,"update",f.req.raw,w,k,U);if(!v.allowed)return f.json({error:v.error},403);let R=`_globals_${y}`,I=await t.findVersionByID({collection:R,versionId:p,tenantId:k});if(!I)return f.json({error:"Version not found"},404);let T=await t.update({collection:R,id:y,data:{...I.data,status:"draft"},tenantId:k});return f.json({data:T,message:"Version restored successfully"})}catch(p){return f.json({error:p.message},500)}}),y==="email-settings"&&_.post(`${b}/test`,async f=>{try{let{user:p,tenantId:w}=await V(f.req.raw,q,i,c),k=await Yt(l,"update",f.req.raw,p,w,U);if(!k.allowed)return f.json({error:k.error},k.status||403);let v=await f.req.json(),R={provider:v.provider,from:v.fromEmail||v.from,fromName:v.fromName,replyTo:v.replyTo,smtp:v.smtp?{host:v.smtp.host,port:v.smtp.port,secure:v.smtp.secure,auth:{user:v.smtp.username||v.smtp.user,pass:v.smtp.password||v.smtp.pass}}:void 0,resend:v.resend,sendgrid:v.sendgrid,mailgun:v.mailgun,ses:v.ses},I=new chunkXTTGHN3D_cjs.q(R),T=v.email||v.testEmail||v.testEmailSection&&v.testEmailSection.testEmail;if(!T)return f.json({error:"No test recipient email provided"},400);let j=v.provider?v.provider.charAt(0).toUpperCase()+v.provider.slice(1):"SMTP",$=v.fromName?`${v.fromName} <${v.fromEmail||v.from||"default"}>`:v.fromEmail||v.from||"Configured Sender",z=new Date().toUTCString();return await I.send({to:T,subject:"Kyro CMS \u2014 Email Connection Test",html:`<!DOCTYPE html>
|
|
120
120
|
<html lang="en">
|
|
121
121
|
<head>
|
|
122
122
|
<meta charset="UTF-8">
|