@kyro-cms/core 0.12.65 → 0.12.66
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/{chunk-ZDMJOFKR.cjs → chunk-6VMTMVGV.cjs} +1 -1
- package/dist/{chunk-7JCRN5ZH.cjs → chunk-EQDO2U65.cjs} +3 -3
- package/dist/{chunk-QBYXAKHH.js → chunk-EUOOUY3K.js} +1 -1
- package/dist/{chunk-2F4WPCVA.cjs → chunk-FX3Y3ZT5.cjs} +1 -1
- package/dist/{chunk-HOX6BHKS.js → chunk-RVWHGHST.js} +1 -1
- package/dist/chunk-X6HUA6EF.cjs +20 -0
- package/dist/chunk-XDPLVJRO.js +21 -0
- package/dist/{chunk-H5BTDZXQ.js → chunk-YLJYAAXH.js} +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.js +1 -1
- package/dist/integration.cjs +1 -1
- package/dist/integration.js +1 -1
- package/dist/rest/index.cjs +1 -1
- package/dist/rest/index.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-JW4HRIVP.cjs +0 -20
- package/dist/chunk-QXWQELAM.js +0 -21
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {D,A}from'./chunk-
|
|
1
|
+
import {D,A}from'./chunk-YLJYAAXH.js';import {e}from'./chunk-TBTQXIHP.js';import {hb}from'./chunk-RVWHGHST.js';import {a as a$1}from'./chunk-N6MNQIQU.js';import {c}from'./chunk-AXT3QPVM.js';import {a}from'./chunk-ZWDBPEXL.js';import {a as a$2}from'./chunk-5ZEYOFAK.js';import {g}from'./chunk-Y2YAKDEQ.js';import w from'kyro:config';if (typeof window === "undefined") { const { createRequire } = await import(/* @vite-ignore */ 'module'); createRequire(import.meta.url); }
|
|
2
2
|
g();var r=null,l=null;async function b(){if(!r){if(globalThis.__KYRO_INSTANCE__)try{await globalThis.__KYRO_INSTANCE__.shutdown();}catch{}try{let e$1=w.default||w,t=e$1.adapter,o=t&&!t.dialect&&typeof t.connect=="function";if(globalThis.DB&&(!t||o)){let s=globalThis.DB;e$1.adapter=new c({type:"sqlite",client:s}),D.info("Hot-swapped to D1 DrizzleAdapter");}r=A(e$1),await r.init();let a$3=e$1.adapter,p=a$3&&a$3.dialect&&(a$3.dialect==="postgres"||a$3.dialect==="sqlite"),c$1=a$3&&a$3.dialect==="mongodb",n;if(p)a$3.dialect==="postgres"?n=new a({db:a$3.client}):a$3.dialect==="sqlite"&&(n=new hb({db:a$3.rawClient||a$3.client}));else if(o&&!globalThis.DB){let s=process.env.KYRO_AUTH_DB_PATH||"./data/auth.db";n=new a$1({path:s});}else c$1&&(n=new a$2({adapter:a$3}));if(n?.connect)try{await n.connect();}catch(s){D.warn("Auth connect warning:",s);}try{await r.loadSettings();}catch(s){D.warn("loadSettings warning:",s);}try{await e(n);}catch(s){D.warn("autoBootstrap warning:",s);}globalThis.__KYRO_INSTANCE__=r;}catch(e){throw r=null,l=null,D.error("Init failed, will retry:",e),e}}}async function E(e){let t=globalThis.DB?globalThis:null;try{let{env:o}=await import('cloudflare:workers');o&&(t=o);}catch{}if(e)try{t=e.locals?.cfContext?.env||e?.env||t;}catch{}if(!t)try{t=process.env;}catch{}t?.DB&&(globalThis.DB=t.DB),t?.STORAGE_BUCKET&&(globalThis.STORAGE_BUCKET=t.STORAGE_BUCKET),l||(l=b()),await l;}var _={graphqlEnabled:false,trpcEnabled:false,wsEnabled:false,requireAuth:false};function T(e){return r?r.settings?.access?.apiAccess?.[e]??_[e]??true:_[e]??true}var R=async e=>{if(!r)try{await Promise.race([E(e),new Promise((t,o)=>setTimeout(()=>o(new Error("Initialization timeout")),3e4))]);}catch(t){return console.error("[Kyro API] Warm error:",t?.stack||t?.message||t),new Response(JSON.stringify({error:"Service Unavailable",message:"Kyro CMS is still starting up. Please try again in a moment."}),{status:503,headers:{"Content-Type":"application/json","Retry-After":"5"}})}try{let o=new URL(e.request.url).pathname,a=__KYRO_API_PATH__;if(o===`${a}/graphql`&&typeof r.getGraphQL=="function"){if(!T("graphqlEnabled"))return new Response(JSON.stringify({error:"GraphQL is disabled"}),{status:503,headers:{"Content-Type":"application/json"}});let n=await r.getGraphQL().fetch(e.request,e.locals);return new Response(n.body,n)}if(o.startsWith(`${a}/trpc/`)&&typeof r.getTRPC=="function"){if(!T("trpcEnabled"))return new Response(JSON.stringify({error:"tRPC is disabled"}),{status:503,headers:{"Content-Type":"application/json"}});let n=await r.getTRPC().fetch(e.request,e.locals);return new Response(n.body,n)}return await(await r.getREST()).fetch(e.request,e.locals)}catch(t){return console.error("[Kyro API Execution Error]:",t?.stack||t?.message||t),new Response(JSON.stringify({error:"Internal Server Error",message:t?.message||String(t),stack:t?.stack}),{status:500,headers:{"Content-Type":"application/json"}})}},N=R;export{r as a,E as b,R as c,N as d};
|
|
@@ -116,5 +116,5 @@
|
|
|
116
116
|
timestamp TEXT DEFAULT CURRENT_TIMESTAMP
|
|
117
117
|
);
|
|
118
118
|
`);}async hashPassword(e){return Ql.default.hashSync(e,10)}async verifyPassword(e,r){let s=await this.findUserByEmail(e);return !s||!s.passwordHash?null:Ql.default.compareSync(r,s.passwordHash)?s:null}async findUserByEmail(e){let r=await this.getOne("SELECT * FROM users WHERE LOWER(email) = LOWER(?) LIMIT 1",[e]);return r?this.mapUser(r):null}async findUserById(e){let r=await this.getOne("SELECT * FROM users WHERE id = ? LIMIT 1",[e]);return r?this.mapUser(r):null}async createUser(e){let r=`user-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,s=await this.hashPassword(e.password),n=e.email.toLowerCase(),o=e.role||"customer",i=new Date().toISOString();await this.executeSql("INSERT INTO users (id, email, password_hash, name, role, avatar, tenant_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",[r,n,s,e.name||null,o,e.avatar||null,e.tenantId||null,i,i]);let c=await this.findUserById(r);if(!c)throw new Error("Failed to create user in D1");return c}async updateUser(e,r){if(!await this.findUserById(e))return null;let n=["updated_at = ?"],o=[new Date().toISOString()];return r.email&&(n.push("email = ?"),o.push(r.email.toLowerCase())),r.name!==void 0&&(n.push("name = ?"),o.push(r.name)),r.password&&(n.push("password_hash = ?"),o.push(await this.hashPassword(r.password))),r.passwordHash&&(n.push("password_hash = ?"),o.push(r.passwordHash)),r.role&&(n.push("role = ?"),o.push(r.role)),r.avatar!==void 0&&(n.push("avatar = ?"),o.push(r.avatar)),r.tenantId!==void 0&&(n.push("tenant_id = ?"),o.push(r.tenantId)),o.push(e),await this.executeSql(`UPDATE users SET ${n.join(", ")} WHERE id = ?`,o),this.findUserById(e)}async deleteUser(e){return await this.executeSql("DELETE FROM users WHERE id = ?",[e]),true}async createSession(e,r){let s=`sess-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,n=`token-${Date.now()}-${Math.random().toString(36).substring(2,16)}`,o=new Date(Date.now()+this.sessionTTL*1e3).toISOString(),i=new Date().toISOString();return await this.executeSql("INSERT INTO sessions (id, user_id, token, expires_at, created_at, ip_address, user_agent) VALUES (?, ?, ?, ?, ?, ?, ?)",[s,e,n,o,i,r?.ipAddress||null,r?.userAgent||null]),{id:s,userId:e,token:n,expiresAt:o,createdAt:i,ipAddress:r?.ipAddress,userAgent:r?.userAgent}}async findSessionByToken(e){let r=await this.getOne("SELECT * FROM sessions WHERE token = ? LIMIT 1",[e]);return r?{id:r.id,userId:r.user_id||r.userId,token:r.token,expiresAt:r.expires_at||r.expiresAt,createdAt:r.created_at||r.createdAt,ipAddress:r.ip_address||r.ipAddress,userAgent:r.user_agent||r.userAgent}:null}async findSessionByRefreshToken(e){let r=await this.getOne("SELECT * FROM sessions WHERE refresh_token = ? LIMIT 1",[e]);return r?{id:r.id,userId:r.user_id||r.userId,token:r.token,refreshToken:r.refresh_token,expiresAt:r.expires_at||r.expiresAt,createdAt:r.created_at||r.createdAt}:null}async deleteSession(e){return await this.executeSql("DELETE FROM sessions WHERE id = ?",[e]),true}async deleteUserSessions(e){return await this.executeSql("DELETE FROM sessions WHERE user_id = ?",[e]),1}async hasAnyUsers(){return ((await this.getOne("SELECT COUNT(*) as count FROM users"))?.count||0)>0}async createEmailVerificationToken(e){return {token:`verify-${Date.now()}`,expiresAt:new Date(Date.now()+864e5)}}async verifyEmailToken(e){return {success:true}}async createPasswordResetToken(e){return {token:`reset-${Date.now()}`,expiresAt:new Date(Date.now()+36e5)}}async resetPasswordWithToken(e,r){return {success:true}}async findAuditLogs(e){let s=(await this.executeSql("SELECT * FROM audit_logs ORDER BY timestamp DESC LIMIT ?",[e.limit||50])).map(n=>({id:n.id,action:n.action,userId:n.user_id||n.userId,userEmail:n.user_email||n.userEmail,role:n.role,resource:n.resource,resourceId:n.resource_id||n.resourceId,ipAddress:n.ip_address||n.ipAddress,userAgent:n.user_agent||n.userAgent,success:!!(n.success??true),error:n.error||void 0,metadata:n.details?JSON.parse(n.details):void 0,timestamp:new Date(n.timestamp||Date.now())}));return {logs:s,total:s.length}}async createAuditLog(e){let r=`audit-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,s=new Date;return await this.executeSql("INSERT INTO audit_logs (id, action, user_id, user_email, role, resource, details, ip_address, status, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[r,e.action,e.userId||null,e.userEmail||null,e.role||null,e.resource,e.metadata?JSON.stringify(e.metadata):null,e.ipAddress||null,e.success?"success":"failed",s.toISOString()]),{id:r,timestamp:s,...e}}mapUser(e){return {id:e.id,email:e.email,name:e.name||void 0,passwordHash:e.password_hash||e.passwordHash||void 0,role:e.role,avatar:e.avatar||void 0,tenantId:e.tenant_id||e.tenantId||void 0,emailVerified:!!(e.email_verified||e.emailVerified),locked:!!e.locked,lastLogin:e.last_login||e.lastLogin||void 0,failedLoginAttempts:Number(e.failed_login_attempts||e.failedLoginAttempts||0),createdAt:e.created_at||e.createdAt||new Date().toISOString(),updatedAt:e.updated_at||e.updatedAt||new Date().toISOString()}}};async function RB(t,e){if("dialect"in t&&t.dialect==="postgres")return new chunkXBQ6HV3T_cjs.a({db:t.client});if("dialect"in t&&t.dialect==="sqlite")return new Yi({db:t.client});if("dialect"in t&&t.dialect==="mongodb"){let s=t;return new chunk7DUKWHRN_cjs.a({db:()=>s.db,adapter:s})}let r=aa.resolve(e,"data","auth.db");return new chunkOPTVCCQQ_cjs.a({path:process.env.KYRO_AUTH_DB_PATH||r})}async function L_(t){let{registry:e,db:r,authSecret:s,authAdapter:n,checkSession:o,user:i,tenantId:c,cors:d,webhookService:u,settings:f}=t,h=new gc;function g(A){if(Array.isArray(A))return A.map(g);if(A!==null&&typeof A=="object"){let U={};for(let K in A)K!=="attrs"&&(U[K]=g(A[K]));return U}return A}h.use("*",async(A,U)=>{await U();let K=A.req.header("referer")||"";if(!(A.req.header("x-kyro-admin")==="true"||K.includes("/admin"))&&A.res.status<400){let V=A.res.headers.get("Content-Type");if(V&&V.includes("application/json"))try{let ye=await A.res.clone().json(),ue=g(ye);A.res=A.json(ue,A.res.status);}catch{}}}),h.onError((A,U)=>A instanceof k||A&&typeof A.statusCode=="number"?U.json({error:A.message,...A.metadata},A.statusCode||A.status||500):A.name==="ZodError"?U.json({error:`Validation failed: ${um(A.errors)}`,details:A.errors},400):(console.error("[Kyro API Error]",A),U.json({error:A.message||"Internal Server Error"},500)));for(let A of e.getPlugins())typeof A.serverMiddleware=="function"&&A.serverMiddleware(h);let _=f?.access?.apiAccess,y=f?.access?.enablePublicAccess??false,w=f?.access?.defaultCollectionAccess??"none";_?.requireAuth;let E=process.cwd(),P=E.endsWith("admin")?aa.resolve(E,".."):E,S=n||await RB(r,P),I=dm({db:r,userLookup:async A=>await S.findUserById(A)||null}),G=_?.cors?.allowedOrigins,X=d?.origins,q=Array.isArray(G)?G:typeof G=="string"&&G?G.split(`
|
|
119
|
-
`).map(A=>A.trim()).filter(Boolean):[],F=q.length>0?q:X||[];(F.length>0||d)&&h.use("*",async(A,U)=>{let K=A.req.header("Origin")||"*";if(F.length>0&&!F.includes(K))throw new k(403,"Origin not allowed");let Q=F.length>0?K:"*";if(A.header("Access-Control-Allow-Origin",Q),A.header("Access-Control-Allow-Methods","GET, POST, PATCH, DELETE, OPTIONS"),A.header("Access-Control-Allow-Headers","Content-Type, Authorization, X-API-Key"),d?.credentials&&A.header("Access-Control-Allow-Credentials","true"),A.req.method==="OPTIONS")return A.text("");await U();});let ne=f?.access?.rateLimiting,oe;if(ne?.enabled){let A=ne.maxRequests||100,U=ne.windowMs||6e4;oe=new ea({"api:general":{window:U,max:A}}),h.use("/api/*",async(K,Q)=>{if(!oe)return Q();let V=K.req.header("CF-Connecting-IP")||K.req.header("X-Forwarded-For")?.split(",")[0]?.trim()||K.req.header("X-Real-IP")||"unknown",N=await oe.check("api:general",V);if(K.header("X-RateLimit-Limit",String(A)),K.header("X-RateLimit-Remaining",String(N.remaining)),K.header("X-RateLimit-Reset",String(N.resetAt)),!N.allowed)return K.json({error:"Too many requests",retryAfter:N.retryAfter},429);await Q();});}let be=new ta({redis:S,jwtSecret:s||"change-me",baseUrl:process.env.KYRO_BASE_URL||"http://localhost:4321",rateLimiter:oe});chunkXTTGHN3D_cjs.q.fromConfig(r).then(A=>{A&&(be.email=A);}).catch(A=>{console.error("[Email] Failed to initialize transport from config:",A);}),Xl(h,be,r,e,I,i,c,y,w);let Ne=typeof e.hasCollection=="function"&&e.hasCollection("users")?e.getCollection("users"):(()=>{try{return e.getCollection("users")}catch{return chunkZO3YB5DK_cjs.a}})();return h.get("/api/users",async A=>{let{user:U,tenantId:K}=await Z(A.req.raw,I,i,c),Q=await Le(Ne,"read",A.req.raw,U,K,void 0,y,w);if(!Q.allowed)throw new k(Q.status||403,Q.error||"Access denied");let V=parseInt(A.req.query("page")||"1"),N=Math.min(parseInt(A.req.query("limit")||"10"),100),ye=A.req.query("search")||void 0,ue=[],le=0;if(typeof S.findUsers=="function"){let me=await S.findUsers({page:V,limit:N,search:ye});ue=me.users||[],le=me.total||0;}else {let me=await r.find({collection:"users",page:V,limit:N,where:ye?{email:{contains:ye}}:{},tenantId:K});ue=me.docs||[],le=me.totalDocs||0;}return A.json({docs:ue,totalDocs:le,limit:N,totalPages:Math.ceil(le/N)||1,page:V,pagingCounter:(V-1)*N+1,hasPrevPage:V>1,hasNextPage:V<Math.ceil(le/N),prevPage:V>1?V-1:null,nextPage:V<Math.ceil(le/N)?V+1:null})}),h.get("/api/users/:id",async A=>{let{user:U,tenantId:K}=await Z(A.req.raw,I,i,c),Q=A.req.param("id"),V=await S.findUserById(Q);if(!V)throw new k(404,"User not found");return A.json({data:V})}),h.post("/api/users",async A=>{let{user:U,tenantId:K}=await Z(A.req.raw,I,i,c),Q=await Le(Ne,"create",A.req.raw,U,K,void 0,y,w);if(!Q.allowed)throw new k(Q.status||403,Q.error||"Access denied");let V=await A.req.json();if(!V.email||!V.password)throw new k(400,"Email and password are required");if(await S.findUserByEmail(V.email))throw new k(400,"Email already in use");let ye=V.role||"customer";if(ye!=="customer"&&U?.role!=="super_admin")throw new k(403,"Forbidden: Only super_admin can assign administrative roles");let ue=await S.createUser({email:V.email,password:V.password,name:V.name,role:ye,avatar:V.avatar,tenantId:V.tenantId});return U&&S?.createAuditLog({action:"user_create",userId:U.id,resource:"users",resourceId:ue.id,success:true}),A.json({data:ue,message:"User created successfully"},201)}),h.patch("/api/users/:id",async A=>{let{user:U,tenantId:K}=await Z(A.req.raw,I,i,c),Q=await Le(Ne,"update",A.req.raw,U,K,void 0,y,w);if(!Q.allowed)throw new k(Q.status||403,Q.error||"Access denied");let V=A.req.param("id"),N=await A.req.json(),ye=await S.findUserById(V);if(!ye)throw new k(404,"User not found");let ue={};if(N.name!==void 0&&(ue.name=N.name),N.email!==void 0&&(ue.email=N.email),N.role!==void 0&&N.role!==ye.role){if(U?.role!=="super_admin")throw new k(403,"Forbidden: Only super_admin can modify user roles");ue.role=N.role;}N.avatar!==void 0&&(ue.avatar=typeof N.avatar=="object"&&N.avatar!==null?N.avatar.id||String(N.avatar):N.avatar),N.tenantId!==void 0&&(ue.tenantId=N.tenantId),N.emailVerified!==void 0&&(ue.emailVerified=N.emailVerified),N.locked!==void 0&&(ue.locked=N.locked),N.failedLoginAttempts!==void 0&&(ue.failedLoginAttempts=N.failedLoginAttempts),N.lastLogin!==void 0&&(ue.lastLogin=N.lastLogin);let le=await S.updateUser(V,ue);if(!le)throw new k(500,"User update failed");return U&&(S?.createAuditLog({action:"user_update",userId:U.id,resource:"users",resourceId:V,success:true}),N.role&&ye.role!==N.role&&S?.createAuditLog({action:"role_change",userId:U.id,resource:"users",resourceId:V,success:true,metadata:{oldRole:ye.role,newRole:N.role}})),A.json({data:le,message:"User updated successfully"})}),h.delete("/api/users/:id",async A=>{let{user:U,tenantId:K}=await Z(A.req.raw,I,i,c),Q=await Le(Ne,"delete",A.req.raw,U,K,void 0,y,w);if(!Q.allowed)throw new k(Q.status||403,Q.error||"Access denied");let V=A.req.param("id");if(U&&U.id===V)throw new k(403,"You cannot delete your own account");let N=await S.findUserById(V);if(!N)throw new k(404,"User not found");if(!await S.deleteUser(V))throw new k(500,"User deletion failed");return U&&S?.createAuditLog({action:"user_delete",userId:U.id,resource:"users",resourceId:V,success:true}),A.json({data:N,message:"User deleted successfully"})}),h.get("/api/auth/audit-logs",async A=>{let{user:U,tenantId:K}=await Z(A.req.raw,I,i,c),Q=e.getCollection("audit_logs");if(Q){let Rt=await Le(Q,"read",A.req.raw,U,K,void 0,y,w);if(!Rt.allowed)throw new k(Rt.status||403,Rt.error||"Access denied")}else if(!U)throw new k(401,"Authentication required");let V=parseInt(A.req.query("page")||"1"),N=Math.min(parseInt(A.req.query("limit")||"50"),100),ye=A.req.query("action")||void 0,ue=A.req.query("userId")||void 0,le=A.req.query("resource")||void 0,me=await S.findAuditLogs({action:ye,userId:ue,resource:le,limit:N,offset:(V-1)*N});return A.json({docs:me.logs,totalDocs:me.total,limit:N,totalPages:Math.ceil(me.total/N),page:V,pagingCounter:(V-1)*N+1,hasPrevPage:V>1,hasNextPage:V<Math.ceil(me.total/N),prevPage:V>1?V-1:null,nextPage:V<Math.ceil(me.total/N)?V+1:null})}),Nl(h,t,I),h.get("/api/storage-status",async A=>{let{user:U}=await Z(A.req.raw,I,i,c);if(!U)throw new k(401,"Authentication required");let K=typeof globalThis.STORAGE_BUCKET<"u"||typeof A.env?.STORAGE_BUCKET<"u",Q=K,V=K?"cloudflare_r2":"local";if(r)try{let N=r.prepare('SELECT provider FROM "_globals_storage-settings" LIMIT 1').get();N&&N.provider&&(Q=!0,V=N.provider==="aws"?"s3":N.provider);}catch{try{let N=await r.findOne({collection:"_globals_storage-settings",where:{},draft:!0});N&&N.provider&&(Q=!0,V=N.provider==="aws"?"s3":N.provider);}catch{}}return A.json({provider:V,configured:Q,usage:0,limit:"unlimited"})}),h.get("/api/plugins",async A=>{let{user:U}=await Z(A.req.raw,I,i,c);if(!U)throw new k(401,"Authentication required");let K=e.getPlugins(),Q=e.storageProviders,V=await Promise.all(K.map(async N=>{let ye=true,ue=N.name,le={};try{let Et=await r.findOne({collection:"_globals_plugin-settings",where:{},draft:!0});Et&&Et.states&&(le=Et.states);}catch{}le[ue]!==void 0&&(ye=le[ue]),Q.setPluginEnabled(ue,ye);let me=ue.replace(/^@[^/]+\//,"");me=me.replace(/^(plugin|kyro)-/,"");let Rt={ai:"AI",seo:"SEO",s3:"S3",aws:"AWS",api:"API",ui:"UI",ftp:"FTP"};if(me=me.split("-").map(Et=>{let $o=Et.toLowerCase();return Rt[$o]?Rt[$o]:Et.charAt(0).toUpperCase()+Et.slice(1)}).join(" "),me.toLowerCase().startsWith("storage ")){let Et=me.split(" ");Et.length===2&&(me=`${Et[1]} Storage`);}return {id:ue,name:N.displayName||me,version:N.version||"1.0.0",description:N.description||"",enabled:ye,status:ye?"active":"disabled"}}));return A.json(V)}),h.put("/api/plugins/:name/toggle",async A=>{let{user:U}=await Z(A.req.raw,I,i,c);if(!U)throw new k(401,"Authentication required");let K=A.req.param("name"),Q=e.storageProviders,N=!Q.isPluginEnabled(K),ye=[];if(!N)for(let le of Q.getAll())le.pluginName===K&&ye.push(le.type);if(!(A.req.query("force")==="1")&&!N&&ye.length>0){let le="local";try{let me=r?.prepare?.('SELECT provider FROM "_globals_storage-settings" LIMIT 1')?.get();me?.provider&&(le=me.provider);}catch{try{let me=await r?.findOne?.({collection:"_globals_storage-settings",where:{},draft:!0});me?.provider&&(le=me.provider);}catch{}}if(ye.includes(le))return A.json({error:`Cannot disable "${K}" \u2014 storage provider "${le}" is currently active. Switch to Local storage first.`,requiresAction:true,activeProvider:le},409)}try{let le={},me="global",Rt=await r.findOne({collection:"_globals_plugin-settings",where:{},draft:!0});Rt&&(le=Rt.states||{},me=Rt.id),le[K]=N,Rt?await r.update({collection:"_globals_plugin-settings",id:me,data:{states:le}}):await r.create({collection:"_globals_plugin-settings",data:{states:le,id:"global"}});}catch(le){console.warn(`[Plugins] Could not persist state for "${K}":`,le);}return Q.setPluginEnabled(K,N),A.json({name:K,enabled:N})}),h.get("/api/health",A=>A.json({status:"ok",version:"0.12.65",collections:e.getCollectionSlugs(),timestamp:new Date().toISOString()})),h.get("/api/metrics",async A=>{let{user:U,tenantId:K}=await Z(A.req.raw,I,i,c);if(!U)throw new k(401,"Authentication required");let Q=U.role==="admin"||U.role==="super_admin",N=e.getCollectionSlugs().filter(kt=>!["users","audit_logs","media","_globals_access-settings","_globals_brand-settings"].includes(kt)&&!kt.startsWith("_globals_")).filter(kt=>Q||chunk7WMMKGEO_cjs.a(U,`${kt}:read`)),ye=0,ue={};await Promise.all(N.map(async kt=>{try{let Yl=(await r.find({collection:kt,where:{},limit:1,page:1,tenantId:K})).totalDocs??0;ye+=Yl,ue[kt]=Yl;}catch{}}));let le=0;try{le=(await r.find({collection:"media",where:{},limit:1,page:1,tenantId:K})).totalDocs??0;}catch{}let me=0;try{me=(await r.find({collection:"users",where:{},limit:1,page:1,tenantId:K})).totalDocs??0;}catch{}let Rt=0;try{if(u){let kt=await u.getWebhooks();Rt=Array.isArray(kt)?kt.length:0;}}catch{}let Et=0;try{Et=(await r.find({collection:chunkZHA446FA_cjs.a,where:{},limit:1,page:1,tenantId:K})).totalDocs??0;}catch{}let $o=ye+le+me;return A.json({totalDocuments:ye,totalMedia:Q||chunk7WMMKGEO_cjs.a(U,"media:read")?le:void 0,totalUsers:Q||chunk7WMMKGEO_cjs.a(U,"users:read")?me:void 0,totalWebhooks:Q?Rt:void 0,totalApiKeys:Q?Et:void 0,totalStoredRecords:$o,collectionCounts:ue,collections:N.length,timestamp:new Date().toISOString()})}),Ml(h,t,I),Jl(h,t,I),Tc(h,t,I),Oc(h,t,I),h.onError((A,U)=>{let K=A?.statusCode||A?.status||500;return K>=500&&console.error(`[API Error] ${U.req.method} ${U.req.path}:`,A),U.json({error:A.message||"Internal server error",code:K>=500?"INTERNAL_ERROR":"BAD_REQUEST"},K)}),h}async function CB(t,e,r){return L_({registry:t,db:e,authSecret:r?.authSecret,user:r?.user,req:r?.req,tenantId:r?.tenantId,cors:r?.cors,webhookService:r?.webhookService})}
|
|
119
|
+
`).map(A=>A.trim()).filter(Boolean):[],F=q.length>0?q:X||[];(F.length>0||d)&&h.use("*",async(A,U)=>{let K=A.req.header("Origin")||"*";if(F.length>0&&!F.includes(K))throw new k(403,"Origin not allowed");let Q=F.length>0?K:"*";if(A.header("Access-Control-Allow-Origin",Q),A.header("Access-Control-Allow-Methods","GET, POST, PATCH, DELETE, OPTIONS"),A.header("Access-Control-Allow-Headers","Content-Type, Authorization, X-API-Key"),d?.credentials&&A.header("Access-Control-Allow-Credentials","true"),A.req.method==="OPTIONS")return A.text("");await U();});let ne=f?.access?.rateLimiting,oe;if(ne?.enabled){let A=ne.maxRequests||100,U=ne.windowMs||6e4;oe=new ea({"api:general":{window:U,max:A}}),h.use("/api/*",async(K,Q)=>{if(!oe)return Q();let V=K.req.header("CF-Connecting-IP")||K.req.header("X-Forwarded-For")?.split(",")[0]?.trim()||K.req.header("X-Real-IP")||"unknown",N=await oe.check("api:general",V);if(K.header("X-RateLimit-Limit",String(A)),K.header("X-RateLimit-Remaining",String(N.remaining)),K.header("X-RateLimit-Reset",String(N.resetAt)),!N.allowed)return K.json({error:"Too many requests",retryAfter:N.retryAfter},429);await Q();});}let be=new ta({redis:S,jwtSecret:s||"change-me",baseUrl:process.env.KYRO_BASE_URL||"http://localhost:4321",rateLimiter:oe});chunkXTTGHN3D_cjs.q.fromConfig(r).then(A=>{A&&(be.email=A);}).catch(A=>{console.error("[Email] Failed to initialize transport from config:",A);}),Xl(h,be,r,e,I,i,c,y,w);let Ne=typeof e.hasCollection=="function"&&e.hasCollection("users")?e.getCollection("users"):(()=>{try{return e.getCollection("users")}catch{return chunkZO3YB5DK_cjs.a}})();return h.get("/api/users",async A=>{let{user:U,tenantId:K}=await Z(A.req.raw,I,i,c),Q=await Le(Ne,"read",A.req.raw,U,K,void 0,y,w);if(!Q.allowed)throw new k(Q.status||403,Q.error||"Access denied");let V=parseInt(A.req.query("page")||"1"),N=Math.min(parseInt(A.req.query("limit")||"10"),100),ye=A.req.query("search")||void 0,ue=[],le=0;if(typeof S.findUsers=="function"){let me=await S.findUsers({page:V,limit:N,search:ye});ue=me.users||[],le=me.total||0;}else {let me=await r.find({collection:"users",page:V,limit:N,where:ye?{email:{contains:ye}}:{},tenantId:K});ue=me.docs||[],le=me.totalDocs||0;}return A.json({docs:ue,totalDocs:le,limit:N,totalPages:Math.ceil(le/N)||1,page:V,pagingCounter:(V-1)*N+1,hasPrevPage:V>1,hasNextPage:V<Math.ceil(le/N),prevPage:V>1?V-1:null,nextPage:V<Math.ceil(le/N)?V+1:null})}),h.get("/api/users/:id",async A=>{let{user:U,tenantId:K}=await Z(A.req.raw,I,i,c),Q=A.req.param("id"),V=await S.findUserById(Q);if(!V)throw new k(404,"User not found");return A.json({data:V})}),h.post("/api/users",async A=>{let{user:U,tenantId:K}=await Z(A.req.raw,I,i,c),Q=await Le(Ne,"create",A.req.raw,U,K,void 0,y,w);if(!Q.allowed)throw new k(Q.status||403,Q.error||"Access denied");let V=await A.req.json();if(!V.email||!V.password)throw new k(400,"Email and password are required");if(await S.findUserByEmail(V.email))throw new k(400,"Email already in use");let ye=V.role||"customer";if(ye!=="customer"&&U?.role!=="super_admin")throw new k(403,"Forbidden: Only super_admin can assign administrative roles");let ue=await S.createUser({email:V.email,password:V.password,name:V.name,role:ye,avatar:V.avatar,tenantId:V.tenantId});return U&&S?.createAuditLog({action:"user_create",userId:U.id,resource:"users",resourceId:ue.id,success:true}),A.json({data:ue,message:"User created successfully"},201)}),h.patch("/api/users/:id",async A=>{let{user:U,tenantId:K}=await Z(A.req.raw,I,i,c),Q=await Le(Ne,"update",A.req.raw,U,K,void 0,y,w);if(!Q.allowed)throw new k(Q.status||403,Q.error||"Access denied");let V=A.req.param("id"),N=await A.req.json(),ye=await S.findUserById(V);if(!ye)throw new k(404,"User not found");let ue={};if(N.name!==void 0&&(ue.name=N.name),N.email!==void 0&&(ue.email=N.email),N.role!==void 0&&N.role!==ye.role){if(U?.role!=="super_admin")throw new k(403,"Forbidden: Only super_admin can modify user roles");ue.role=N.role;}N.avatar!==void 0&&(ue.avatar=typeof N.avatar=="object"&&N.avatar!==null?N.avatar.id||String(N.avatar):N.avatar),N.tenantId!==void 0&&(ue.tenantId=N.tenantId),N.emailVerified!==void 0&&(ue.emailVerified=N.emailVerified),N.locked!==void 0&&(ue.locked=N.locked),N.failedLoginAttempts!==void 0&&(ue.failedLoginAttempts=N.failedLoginAttempts),N.lastLogin!==void 0&&(ue.lastLogin=N.lastLogin);let le=await S.updateUser(V,ue);if(!le)throw new k(500,"User update failed");return U&&(S?.createAuditLog({action:"user_update",userId:U.id,resource:"users",resourceId:V,success:true}),N.role&&ye.role!==N.role&&S?.createAuditLog({action:"role_change",userId:U.id,resource:"users",resourceId:V,success:true,metadata:{oldRole:ye.role,newRole:N.role}})),A.json({data:le,message:"User updated successfully"})}),h.delete("/api/users/:id",async A=>{let{user:U,tenantId:K}=await Z(A.req.raw,I,i,c),Q=await Le(Ne,"delete",A.req.raw,U,K,void 0,y,w);if(!Q.allowed)throw new k(Q.status||403,Q.error||"Access denied");let V=A.req.param("id");if(U&&U.id===V)throw new k(403,"You cannot delete your own account");let N=await S.findUserById(V);if(!N)throw new k(404,"User not found");if(!await S.deleteUser(V))throw new k(500,"User deletion failed");return U&&S?.createAuditLog({action:"user_delete",userId:U.id,resource:"users",resourceId:V,success:true}),A.json({data:N,message:"User deleted successfully"})}),h.get("/api/auth/audit-logs",async A=>{let{user:U,tenantId:K}=await Z(A.req.raw,I,i,c),Q=e.getCollection("audit_logs");if(Q){let Rt=await Le(Q,"read",A.req.raw,U,K,void 0,y,w);if(!Rt.allowed)throw new k(Rt.status||403,Rt.error||"Access denied")}else if(!U)throw new k(401,"Authentication required");let V=parseInt(A.req.query("page")||"1"),N=Math.min(parseInt(A.req.query("limit")||"50"),100),ye=A.req.query("action")||void 0,ue=A.req.query("userId")||void 0,le=A.req.query("resource")||void 0,me=await S.findAuditLogs({action:ye,userId:ue,resource:le,limit:N,offset:(V-1)*N});return A.json({docs:me.logs,totalDocs:me.total,limit:N,totalPages:Math.ceil(me.total/N),page:V,pagingCounter:(V-1)*N+1,hasPrevPage:V>1,hasNextPage:V<Math.ceil(me.total/N),prevPage:V>1?V-1:null,nextPage:V<Math.ceil(me.total/N)?V+1:null})}),Nl(h,t,I),h.get("/api/storage-status",async A=>{let{user:U}=await Z(A.req.raw,I,i,c);if(!U)throw new k(401,"Authentication required");let K=typeof globalThis.STORAGE_BUCKET<"u"||typeof A.env?.STORAGE_BUCKET<"u",Q=K,V=K?"cloudflare_r2":"local";if(r)try{let N=r.prepare('SELECT provider FROM "_globals_storage-settings" LIMIT 1').get();N&&N.provider&&(Q=!0,V=N.provider==="aws"?"s3":N.provider);}catch{try{let N=await r.findOne({collection:"_globals_storage-settings",where:{},draft:!0});N&&N.provider&&(Q=!0,V=N.provider==="aws"?"s3":N.provider);}catch{}}return A.json({provider:V,configured:Q,usage:0,limit:"unlimited"})}),h.get("/api/plugins",async A=>{let{user:U}=await Z(A.req.raw,I,i,c);if(!U)throw new k(401,"Authentication required");let K=e.getPlugins(),Q=e.storageProviders,V=await Promise.all(K.map(async N=>{let ye=true,ue=N.name,le={};try{let Et=await r.findOne({collection:"_globals_plugin-settings",where:{},draft:!0});Et&&Et.states&&(le=Et.states);}catch{}le[ue]!==void 0&&(ye=le[ue]),Q.setPluginEnabled(ue,ye);let me=ue.replace(/^@[^/]+\//,"");me=me.replace(/^(plugin|kyro)-/,"");let Rt={ai:"AI",seo:"SEO",s3:"S3",aws:"AWS",api:"API",ui:"UI",ftp:"FTP"};if(me=me.split("-").map(Et=>{let $o=Et.toLowerCase();return Rt[$o]?Rt[$o]:Et.charAt(0).toUpperCase()+Et.slice(1)}).join(" "),me.toLowerCase().startsWith("storage ")){let Et=me.split(" ");Et.length===2&&(me=`${Et[1]} Storage`);}return {id:ue,name:N.displayName||me,version:N.version||"1.0.0",description:N.description||"",enabled:ye,status:ye?"active":"disabled"}}));return A.json(V)}),h.put("/api/plugins/:name/toggle",async A=>{let{user:U}=await Z(A.req.raw,I,i,c);if(!U)throw new k(401,"Authentication required");let K=A.req.param("name"),Q=e.storageProviders,N=!Q.isPluginEnabled(K),ye=[];if(!N)for(let le of Q.getAll())le.pluginName===K&&ye.push(le.type);if(!(A.req.query("force")==="1")&&!N&&ye.length>0){let le="local";try{let me=r?.prepare?.('SELECT provider FROM "_globals_storage-settings" LIMIT 1')?.get();me?.provider&&(le=me.provider);}catch{try{let me=await r?.findOne?.({collection:"_globals_storage-settings",where:{},draft:!0});me?.provider&&(le=me.provider);}catch{}}if(ye.includes(le))return A.json({error:`Cannot disable "${K}" \u2014 storage provider "${le}" is currently active. Switch to Local storage first.`,requiresAction:true,activeProvider:le},409)}try{let le={},me="global",Rt=await r.findOne({collection:"_globals_plugin-settings",where:{},draft:!0});Rt&&(le=Rt.states||{},me=Rt.id),le[K]=N,Rt?await r.update({collection:"_globals_plugin-settings",id:me,data:{states:le}}):await r.create({collection:"_globals_plugin-settings",data:{states:le,id:"global"}});}catch(le){console.warn(`[Plugins] Could not persist state for "${K}":`,le);}return Q.setPluginEnabled(K,N),A.json({name:K,enabled:N})}),h.get("/api/health",A=>A.json({status:"ok",version:"0.12.66",collections:e.getCollectionSlugs(),timestamp:new Date().toISOString()})),h.get("/api/metrics",async A=>{let{user:U,tenantId:K}=await Z(A.req.raw,I,i,c);if(!U)throw new k(401,"Authentication required");let Q=U.role==="admin"||U.role==="super_admin",N=e.getCollectionSlugs().filter(kt=>!["users","audit_logs","media","_globals_access-settings","_globals_brand-settings"].includes(kt)&&!kt.startsWith("_globals_")).filter(kt=>Q||chunk7WMMKGEO_cjs.a(U,`${kt}:read`)),ye=0,ue={};await Promise.all(N.map(async kt=>{try{let Yl=(await r.find({collection:kt,where:{},limit:1,page:1,tenantId:K})).totalDocs??0;ye+=Yl,ue[kt]=Yl;}catch{}}));let le=0;try{le=(await r.find({collection:"media",where:{},limit:1,page:1,tenantId:K})).totalDocs??0;}catch{}let me=0;try{me=(await r.find({collection:"users",where:{},limit:1,page:1,tenantId:K})).totalDocs??0;}catch{}let Rt=0;try{if(u){let kt=await u.getWebhooks();Rt=Array.isArray(kt)?kt.length:0;}}catch{}let Et=0;try{Et=(await r.find({collection:chunkZHA446FA_cjs.a,where:{},limit:1,page:1,tenantId:K})).totalDocs??0;}catch{}let $o=ye+le+me;return A.json({totalDocuments:ye,totalMedia:Q||chunk7WMMKGEO_cjs.a(U,"media:read")?le:void 0,totalUsers:Q||chunk7WMMKGEO_cjs.a(U,"users:read")?me:void 0,totalWebhooks:Q?Rt:void 0,totalApiKeys:Q?Et:void 0,totalStoredRecords:$o,collectionCounts:ue,collections:N.length,timestamp:new Date().toISOString()})}),Ml(h,t,I),Jl(h,t,I),Tc(h,t,I),Oc(h,t,I),h.onError((A,U)=>{let K=A?.statusCode||A?.status||500;return K>=500&&console.error(`[API Error] ${U.req.method} ${U.req.path}:`,A),U.json({error:A.message||"Internal server error",code:K>=500?"INTERNAL_ERROR":"BAD_REQUEST"},K)}),h}async function CB(t,e,r){return L_({registry:t,db:e,authSecret:r?.authSecret,user:r?.user,req:r?.req,tenantId:r?.tenantId,cors:r?.cors,webhookService:r?.webhookService})}
|
|
120
120
|
exports.$=kn;exports.$a=Nc;exports.A=xn;exports.Aa=vV;exports.B=_n;exports.Ba=bV;exports.C=To;exports.Ca=AV;exports.D=wn;exports.Da=SV;exports.E=vn;exports.Ea=RV;exports.F=hs;exports.Fa=CV;exports.G=Vr;exports.Ga=EV;exports.H=vr;exports.Ha=kV;exports.I=Oo;exports.Ia=TV;exports.J=Wr;exports.Ja=OV;exports.K=$t;exports.Ka=PV;exports.L=bn;exports.La=IV;exports.M=Fl;exports.Ma=DV;exports.N=An;exports.Na=LV;exports.O=Lr;exports.Oa=$V;exports.P=zl;exports.Pa=BV;exports.Q=Po;exports.Qa=NV;exports.R=Io;exports.Ra=MV;exports.S=Kl;exports.Sa=UV;exports.T=Sn;exports.Ta=jV;exports.U=Rn;exports.Ua=qV;exports.V=Cn;exports.Va=HV;exports.W=En;exports.Wa=FV;exports.X=gs;exports.Xa=M$;exports.Y=rr;exports.Ya=U$;exports.Z=tr;exports.Za=jx;exports._=$r;exports._a=ts;exports.aa=Tn;exports.ab=ea;exports.ba=Do;exports.bb=pm;exports.c=H;exports.ca=oV;exports.cb=$M;exports.d=Ir;exports.da=Wi;exports.db=mm;exports.e=L;exports.ea=Zi;exports.eb=ta;exports.f=BK;exports.fa=On;exports.fb=Hx;exports.g=Lt;exports.ga=mB;exports.gb=zi;exports.h=Kr;exports.ha=aV;exports.hb=Yi;exports.i=GK;exports.ib=L_;exports.j=Eo;exports.ja=iV;exports.jb=CB;exports.k=Vi;exports.ka=fB;exports.l=ZK;exports.la=hB;exports.m=j;exports.ma=cV;exports.n=yt;exports.na=uV;exports.o=Y;exports.oa=gB;exports.p=fn;exports.pa=lV;exports.q=At;exports.qa=dV;exports.r=jl;exports.ra=pV;exports.s=ql;exports.sa=mV;exports.t=ms;exports.ta=fV;exports.u=ko;exports.ua=hV;exports.v=ce;exports.va=gV;exports.w=cB;exports.wa=yV;exports.x=fs;exports.xa=xV;exports.y=gn;exports.ya=_V;exports.z=yn;exports.za=wV;
|
|
@@ -117,5 +117,5 @@ g();g();g();g();g();g();var ac=(t,e,r)=>(s,n)=>{let o=-1;return i(0);async funct
|
|
|
117
117
|
timestamp TEXT DEFAULT CURRENT_TIMESTAMP
|
|
118
118
|
);
|
|
119
119
|
`);}async hashPassword(e){return Yl.default.hashSync(e,10)}async verifyPassword(e,r){let s=await this.findUserByEmail(e);return !s||!s.passwordHash?null:Yl.default.compareSync(r,s.passwordHash)?s:null}async findUserByEmail(e){let r=await this.getOne("SELECT * FROM users WHERE LOWER(email) = LOWER(?) LIMIT 1",[e]);return r?this.mapUser(r):null}async findUserById(e){let r=await this.getOne("SELECT * FROM users WHERE id = ? LIMIT 1",[e]);return r?this.mapUser(r):null}async createUser(e){let r=`user-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,s=await this.hashPassword(e.password),n=e.email.toLowerCase(),o=e.role||"customer",i=new Date().toISOString();await this.executeSql("INSERT INTO users (id, email, password_hash, name, role, avatar, tenant_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",[r,n,s,e.name||null,o,e.avatar||null,e.tenantId||null,i,i]);let c=await this.findUserById(r);if(!c)throw new Error("Failed to create user in D1");return c}async updateUser(e,r){if(!await this.findUserById(e))return null;let n=["updated_at = ?"],o=[new Date().toISOString()];return r.email&&(n.push("email = ?"),o.push(r.email.toLowerCase())),r.name!==void 0&&(n.push("name = ?"),o.push(r.name)),r.password&&(n.push("password_hash = ?"),o.push(await this.hashPassword(r.password))),r.passwordHash&&(n.push("password_hash = ?"),o.push(r.passwordHash)),r.role&&(n.push("role = ?"),o.push(r.role)),r.avatar!==void 0&&(n.push("avatar = ?"),o.push(r.avatar)),r.tenantId!==void 0&&(n.push("tenant_id = ?"),o.push(r.tenantId)),o.push(e),await this.executeSql(`UPDATE users SET ${n.join(", ")} WHERE id = ?`,o),this.findUserById(e)}async deleteUser(e){return await this.executeSql("DELETE FROM users WHERE id = ?",[e]),true}async createSession(e,r){let s=`sess-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,n=`token-${Date.now()}-${Math.random().toString(36).substring(2,16)}`,o=new Date(Date.now()+this.sessionTTL*1e3).toISOString(),i=new Date().toISOString();return await this.executeSql("INSERT INTO sessions (id, user_id, token, expires_at, created_at, ip_address, user_agent) VALUES (?, ?, ?, ?, ?, ?, ?)",[s,e,n,o,i,r?.ipAddress||null,r?.userAgent||null]),{id:s,userId:e,token:n,expiresAt:o,createdAt:i,ipAddress:r?.ipAddress,userAgent:r?.userAgent}}async findSessionByToken(e){let r=await this.getOne("SELECT * FROM sessions WHERE token = ? LIMIT 1",[e]);return r?{id:r.id,userId:r.user_id||r.userId,token:r.token,expiresAt:r.expires_at||r.expiresAt,createdAt:r.created_at||r.createdAt,ipAddress:r.ip_address||r.ipAddress,userAgent:r.user_agent||r.userAgent}:null}async findSessionByRefreshToken(e){let r=await this.getOne("SELECT * FROM sessions WHERE refresh_token = ? LIMIT 1",[e]);return r?{id:r.id,userId:r.user_id||r.userId,token:r.token,refreshToken:r.refresh_token,expiresAt:r.expires_at||r.expiresAt,createdAt:r.created_at||r.createdAt}:null}async deleteSession(e){return await this.executeSql("DELETE FROM sessions WHERE id = ?",[e]),true}async deleteUserSessions(e){return await this.executeSql("DELETE FROM sessions WHERE user_id = ?",[e]),1}async hasAnyUsers(){return ((await this.getOne("SELECT COUNT(*) as count FROM users"))?.count||0)>0}async createEmailVerificationToken(e){return {token:`verify-${Date.now()}`,expiresAt:new Date(Date.now()+864e5)}}async verifyEmailToken(e){return {success:true}}async createPasswordResetToken(e){return {token:`reset-${Date.now()}`,expiresAt:new Date(Date.now()+36e5)}}async resetPasswordWithToken(e,r){return {success:true}}async findAuditLogs(e){let s=(await this.executeSql("SELECT * FROM audit_logs ORDER BY timestamp DESC LIMIT ?",[e.limit||50])).map(n=>({id:n.id,action:n.action,userId:n.user_id||n.userId,userEmail:n.user_email||n.userEmail,role:n.role,resource:n.resource,resourceId:n.resource_id||n.resourceId,ipAddress:n.ip_address||n.ipAddress,userAgent:n.user_agent||n.userAgent,success:!!(n.success??true),error:n.error||void 0,metadata:n.details?JSON.parse(n.details):void 0,timestamp:new Date(n.timestamp||Date.now())}));return {logs:s,total:s.length}}async createAuditLog(e){let r=`audit-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,s=new Date;return await this.executeSql("INSERT INTO audit_logs (id, action, user_id, user_email, role, resource, details, ip_address, status, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",[r,e.action,e.userId||null,e.userEmail||null,e.role||null,e.resource,e.metadata?JSON.stringify(e.metadata):null,e.ipAddress||null,e.success?"success":"failed",s.toISOString()]),{id:r,timestamp:s,...e}}mapUser(e){return {id:e.id,email:e.email,name:e.name||void 0,passwordHash:e.password_hash||e.passwordHash||void 0,role:e.role,avatar:e.avatar||void 0,tenantId:e.tenant_id||e.tenantId||void 0,emailVerified:!!(e.email_verified||e.emailVerified),locked:!!e.locked,lastLogin:e.last_login||e.lastLogin||void 0,failedLoginAttempts:Number(e.failed_login_attempts||e.failedLoginAttempts||0),createdAt:e.created_at||e.createdAt||new Date().toISOString(),updatedAt:e.updated_at||e.updatedAt||new Date().toISOString()}}};async function CB(t,e){if("dialect"in t&&t.dialect==="postgres")return new a$9({db:t.client});if("dialect"in t&&t.dialect==="sqlite")return new ec({db:t.client});if("dialect"in t&&t.dialect==="mongodb"){let s=t;return new a$a({db:()=>s.db,adapter:s})}let r=resolve(e,"data","auth.db");return new a$b({path:process.env.KYRO_AUTH_DB_PATH||r})}async function $_(t){let{registry:e,db:r,authSecret:s,authAdapter:n,checkSession:o,user:i,tenantId:c,cors:d,webhookService:u,settings:f}=t,h=new yc;function g(S){if(Array.isArray(S))return S.map(g);if(S!==null&&typeof S=="object"){let j={};for(let V in S)V!=="attrs"&&(j[V]=g(S[V]));return j}return S}h.use("*",async(S,j)=>{await j();let V=S.req.header("referer")||"";if(!(S.req.header("x-kyro-admin")==="true"||V.includes("/admin"))&&S.res.status<400){let W=S.res.headers.get("Content-Type");if(W&&W.includes("application/json"))try{let xe=await S.res.clone().json(),le=g(xe);S.res=S.json(le,S.res.status);}catch{}}}),h.onError((S,j)=>S instanceof T||S&&typeof S.statusCode=="number"?j.json({error:S.message,...S.metadata},S.statusCode||S.status||500):S.name==="ZodError"?j.json({error:`Validation failed: ${lm(S.errors)}`,details:S.errors},400):(console.error("[Kyro API Error]",S),j.json({error:S.message||"Internal Server Error"},500)));for(let S of e.getPlugins())typeof S.serverMiddleware=="function"&&S.serverMiddleware(h);let w=f?.access?.apiAccess,y=f?.access?.enablePublicAccess??false,v=f?.access?.defaultCollectionAccess??"none";w?.requireAuth;let k=process.cwd(),I=k.endsWith("admin")?resolve(k,".."):k,R=n||await CB(r,I),D=pm({db:r,userLookup:async S=>await R.findUserById(S)||null}),z=w?.cors?.allowedOrigins,Q=d?.origins,H=Array.isArray(z)?z:typeof z=="string"&&z?z.split(`
|
|
120
|
-
`).map(S=>S.trim()).filter(Boolean):[],G=H.length>0?H:Q||[];(G.length>0||d)&&h.use("*",async(S,j)=>{let V=S.req.header("Origin")||"*";if(G.length>0&&!G.includes(V))throw new T(403,"Origin not allowed");let Y=G.length>0?V:"*";if(S.header("Access-Control-Allow-Origin",Y),S.header("Access-Control-Allow-Methods","GET, POST, PATCH, DELETE, OPTIONS"),S.header("Access-Control-Allow-Headers","Content-Type, Authorization, X-API-Key"),d?.credentials&&S.header("Access-Control-Allow-Credentials","true"),S.req.method==="OPTIONS")return S.text("");await j();});let oe=f?.access?.rateLimiting,ae;if(oe?.enabled){let S=oe.maxRequests||100,j=oe.windowMs||6e4;ae=new ta({"api:general":{window:j,max:S}}),h.use("/api/*",async(V,Y)=>{if(!ae)return Y();let W=V.req.header("CF-Connecting-IP")||V.req.header("X-Forwarded-For")?.split(",")[0]?.trim()||V.req.header("X-Real-IP")||"unknown",M=await ae.check("api:general",W);if(V.header("X-RateLimit-Limit",String(S)),V.header("X-RateLimit-Remaining",String(M.remaining)),V.header("X-RateLimit-Reset",String(M.resetAt)),!M.allowed)return V.json({error:"Too many requests",retryAfter:M.retryAfter},429);await Y();});}let Ae=new ra({redis:R,jwtSecret:s||"change-me",baseUrl:process.env.KYRO_BASE_URL||"http://localhost:4321",rateLimiter:ae});q$2.fromConfig(r).then(S=>{S&&(Ae.email=S);}).catch(S=>{console.error("[Email] Failed to initialize transport from config:",S);}),Ql(h,Ae,r,e,D,i,c,y,v);let Me=typeof e.hasCollection=="function"&&e.hasCollection("users")?e.getCollection("users"):(()=>{try{return e.getCollection("users")}catch{return a$6}})();return h.get("/api/users",async S=>{let{user:j,tenantId:V}=await J(S.req.raw,D,i,c),Y=await $e(Me,"read",S.req.raw,j,V,void 0,y,v);if(!Y.allowed)throw new T(Y.status||403,Y.error||"Access denied");let W=parseInt(S.req.query("page")||"1"),M=Math.min(parseInt(S.req.query("limit")||"10"),100),xe=S.req.query("search")||void 0,le=[],de=0;if(typeof R.findUsers=="function"){let fe=await R.findUsers({page:W,limit:M,search:xe});le=fe.users||[],de=fe.total||0;}else {let fe=await r.find({collection:"users",page:W,limit:M,where:xe?{email:{contains:xe}}:{},tenantId:V});le=fe.docs||[],de=fe.totalDocs||0;}return S.json({docs:le,totalDocs:de,limit:M,totalPages:Math.ceil(de/M)||1,page:W,pagingCounter:(W-1)*M+1,hasPrevPage:W>1,hasNextPage:W<Math.ceil(de/M),prevPage:W>1?W-1:null,nextPage:W<Math.ceil(de/M)?W+1:null})}),h.get("/api/users/:id",async S=>{let{user:j,tenantId:V}=await J(S.req.raw,D,i,c),Y=S.req.param("id"),W=await R.findUserById(Y);if(!W)throw new T(404,"User not found");return S.json({data:W})}),h.post("/api/users",async S=>{let{user:j,tenantId:V}=await J(S.req.raw,D,i,c),Y=await $e(Me,"create",S.req.raw,j,V,void 0,y,v);if(!Y.allowed)throw new T(Y.status||403,Y.error||"Access denied");let W=await S.req.json();if(!W.email||!W.password)throw new T(400,"Email and password are required");if(await R.findUserByEmail(W.email))throw new T(400,"Email already in use");let xe=W.role||"customer";if(xe!=="customer"&&j?.role!=="super_admin")throw new T(403,"Forbidden: Only super_admin can assign administrative roles");let le=await R.createUser({email:W.email,password:W.password,name:W.name,role:xe,avatar:W.avatar,tenantId:W.tenantId});return j&&R?.createAuditLog({action:"user_create",userId:j.id,resource:"users",resourceId:le.id,success:true}),S.json({data:le,message:"User created successfully"},201)}),h.patch("/api/users/:id",async S=>{let{user:j,tenantId:V}=await J(S.req.raw,D,i,c),Y=await $e(Me,"update",S.req.raw,j,V,void 0,y,v);if(!Y.allowed)throw new T(Y.status||403,Y.error||"Access denied");let W=S.req.param("id"),M=await S.req.json(),xe=await R.findUserById(W);if(!xe)throw new T(404,"User not found");let le={};if(M.name!==void 0&&(le.name=M.name),M.email!==void 0&&(le.email=M.email),M.role!==void 0&&M.role!==xe.role){if(j?.role!=="super_admin")throw new T(403,"Forbidden: Only super_admin can modify user roles");le.role=M.role;}M.avatar!==void 0&&(le.avatar=typeof M.avatar=="object"&&M.avatar!==null?M.avatar.id||String(M.avatar):M.avatar),M.tenantId!==void 0&&(le.tenantId=M.tenantId),M.emailVerified!==void 0&&(le.emailVerified=M.emailVerified),M.locked!==void 0&&(le.locked=M.locked),M.failedLoginAttempts!==void 0&&(le.failedLoginAttempts=M.failedLoginAttempts),M.lastLogin!==void 0&&(le.lastLogin=M.lastLogin);let de=await R.updateUser(W,le);if(!de)throw new T(500,"User update failed");return j&&(R?.createAuditLog({action:"user_update",userId:j.id,resource:"users",resourceId:W,success:true}),M.role&&xe.role!==M.role&&R?.createAuditLog({action:"role_change",userId:j.id,resource:"users",resourceId:W,success:true,metadata:{oldRole:xe.role,newRole:M.role}})),S.json({data:de,message:"User updated successfully"})}),h.delete("/api/users/:id",async S=>{let{user:j,tenantId:V}=await J(S.req.raw,D,i,c),Y=await $e(Me,"delete",S.req.raw,j,V,void 0,y,v);if(!Y.allowed)throw new T(Y.status||403,Y.error||"Access denied");let W=S.req.param("id");if(j&&j.id===W)throw new T(403,"You cannot delete your own account");let M=await R.findUserById(W);if(!M)throw new T(404,"User not found");if(!await R.deleteUser(W))throw new T(500,"User deletion failed");return j&&R?.createAuditLog({action:"user_delete",userId:j.id,resource:"users",resourceId:W,success:true}),S.json({data:M,message:"User deleted successfully"})}),h.get("/api/auth/audit-logs",async S=>{let{user:j,tenantId:V}=await J(S.req.raw,D,i,c),Y=e.getCollection("audit_logs");if(Y){let Ct=await $e(Y,"read",S.req.raw,j,V,void 0,y,v);if(!Ct.allowed)throw new T(Ct.status||403,Ct.error||"Access denied")}else if(!j)throw new T(401,"Authentication required");let W=parseInt(S.req.query("page")||"1"),M=Math.min(parseInt(S.req.query("limit")||"50"),100),xe=S.req.query("action")||void 0,le=S.req.query("userId")||void 0,de=S.req.query("resource")||void 0,fe=await R.findAuditLogs({action:xe,userId:le,resource:de,limit:M,offset:(W-1)*M});return S.json({docs:fe.logs,totalDocs:fe.total,limit:M,totalPages:Math.ceil(fe.total/M),page:W,pagingCounter:(W-1)*M+1,hasPrevPage:W>1,hasNextPage:W<Math.ceil(fe.total/M),prevPage:W>1?W-1:null,nextPage:W<Math.ceil(fe.total/M)?W+1:null})}),Ml(h,t,D),h.get("/api/storage-status",async S=>{let{user:j}=await J(S.req.raw,D,i,c);if(!j)throw new T(401,"Authentication required");let V=typeof globalThis.STORAGE_BUCKET<"u"||typeof S.env?.STORAGE_BUCKET<"u",Y=V,W=V?"cloudflare_r2":"local";if(r)try{let M=r.prepare('SELECT provider FROM "_globals_storage-settings" LIMIT 1').get();M&&M.provider&&(Y=!0,W=M.provider==="aws"?"s3":M.provider);}catch{try{let M=await r.findOne({collection:"_globals_storage-settings",where:{},draft:!0});M&&M.provider&&(Y=!0,W=M.provider==="aws"?"s3":M.provider);}catch{}}return S.json({provider:W,configured:Y,usage:0,limit:"unlimited"})}),h.get("/api/plugins",async S=>{let{user:j}=await J(S.req.raw,D,i,c);if(!j)throw new T(401,"Authentication required");let V=e.getPlugins(),Y=e.storageProviders,W=await Promise.all(V.map(async M=>{let xe=true,le=M.name,de={};try{let kt=await r.findOne({collection:"_globals_plugin-settings",where:{},draft:!0});kt&&kt.states&&(de=kt.states);}catch{}de[le]!==void 0&&(xe=de[le]),Y.setPluginEnabled(le,xe);let fe=le.replace(/^@[^/]+\//,"");fe=fe.replace(/^(plugin|kyro)-/,"");let Ct={ai:"AI",seo:"SEO",s3:"S3",aws:"AWS",api:"API",ui:"UI",ftp:"FTP"};if(fe=fe.split("-").map(kt=>{let Bo=kt.toLowerCase();return Ct[Bo]?Ct[Bo]:kt.charAt(0).toUpperCase()+kt.slice(1)}).join(" "),fe.toLowerCase().startsWith("storage ")){let kt=fe.split(" ");kt.length===2&&(fe=`${kt[1]} Storage`);}return {id:le,name:M.displayName||fe,version:M.version||"1.0.0",description:M.description||"",enabled:xe,status:xe?"active":"disabled"}}));return S.json(W)}),h.put("/api/plugins/:name/toggle",async S=>{let{user:j}=await J(S.req.raw,D,i,c);if(!j)throw new T(401,"Authentication required");let V=S.req.param("name"),Y=e.storageProviders,M=!Y.isPluginEnabled(V),xe=[];if(!M)for(let de of Y.getAll())de.pluginName===V&&xe.push(de.type);if(!(S.req.query("force")==="1")&&!M&&xe.length>0){let de="local";try{let fe=r?.prepare?.('SELECT provider FROM "_globals_storage-settings" LIMIT 1')?.get();fe?.provider&&(de=fe.provider);}catch{try{let fe=await r?.findOne?.({collection:"_globals_storage-settings",where:{},draft:!0});fe?.provider&&(de=fe.provider);}catch{}}if(xe.includes(de))return S.json({error:`Cannot disable "${V}" \u2014 storage provider "${de}" is currently active. Switch to Local storage first.`,requiresAction:true,activeProvider:de},409)}try{let de={},fe="global",Ct=await r.findOne({collection:"_globals_plugin-settings",where:{},draft:!0});Ct&&(de=Ct.states||{},fe=Ct.id),de[V]=M,Ct?await r.update({collection:"_globals_plugin-settings",id:fe,data:{states:de}}):await r.create({collection:"_globals_plugin-settings",data:{states:de,id:"global"}});}catch(de){console.warn(`[Plugins] Could not persist state for "${V}":`,de);}return Y.setPluginEnabled(V,M),S.json({name:V,enabled:M})}),h.get("/api/health",S=>S.json({status:"ok",version:"0.12.65",collections:e.getCollectionSlugs(),timestamp:new Date().toISOString()})),h.get("/api/metrics",async S=>{let{user:j,tenantId:V}=await J(S.req.raw,D,i,c);if(!j)throw new T(401,"Authentication required");let Y=j.role==="admin"||j.role==="super_admin",M=e.getCollectionSlugs().filter(Tt=>!["users","audit_logs","media","_globals_access-settings","_globals_brand-settings"].includes(Tt)&&!Tt.startsWith("_globals_")).filter(Tt=>Y||a$7(j,`${Tt}:read`)),xe=0,le={};await Promise.all(M.map(async Tt=>{try{let ed=(await r.find({collection:Tt,where:{},limit:1,page:1,tenantId:V})).totalDocs??0;xe+=ed,le[Tt]=ed;}catch{}}));let de=0;try{de=(await r.find({collection:"media",where:{},limit:1,page:1,tenantId:V})).totalDocs??0;}catch{}let fe=0;try{fe=(await r.find({collection:"users",where:{},limit:1,page:1,tenantId:V})).totalDocs??0;}catch{}let Ct=0;try{if(u){let Tt=await u.getWebhooks();Ct=Array.isArray(Tt)?Tt.length:0;}}catch{}let kt=0;try{kt=(await r.find({collection:a$8,where:{},limit:1,page:1,tenantId:V})).totalDocs??0;}catch{}let Bo=xe+de+fe;return S.json({totalDocuments:xe,totalMedia:Y||a$7(j,"media:read")?de:void 0,totalUsers:Y||a$7(j,"users:read")?fe:void 0,totalWebhooks:Y?Ct:void 0,totalApiKeys:Y?kt:void 0,totalStoredRecords:Bo,collectionCounts:le,collections:M.length,timestamp:new Date().toISOString()})}),Ul(h,t,D),Xl(h,t,D),Oc(h,t,D),Pc(h,t,D),h.onError((S,j)=>{let V=S?.statusCode||S?.status||500;return V>=500&&console.error(`[API Error] ${j.req.method} ${j.req.path}:`,S),j.json({error:S.message||"Internal server error",code:V>=500?"INTERNAL_ERROR":"BAD_REQUEST"},V)}),h}async function EB(t,e,r){return $_({registry:t,db:e,authSecret:r?.authSecret,user:r?.user,req:r?.req,tenantId:r?.tenantId,cors:r?.cors,webhookService:r?.webhookService})}
|
|
120
|
+
`).map(S=>S.trim()).filter(Boolean):[],G=H.length>0?H:Q||[];(G.length>0||d)&&h.use("*",async(S,j)=>{let V=S.req.header("Origin")||"*";if(G.length>0&&!G.includes(V))throw new T(403,"Origin not allowed");let Y=G.length>0?V:"*";if(S.header("Access-Control-Allow-Origin",Y),S.header("Access-Control-Allow-Methods","GET, POST, PATCH, DELETE, OPTIONS"),S.header("Access-Control-Allow-Headers","Content-Type, Authorization, X-API-Key"),d?.credentials&&S.header("Access-Control-Allow-Credentials","true"),S.req.method==="OPTIONS")return S.text("");await j();});let oe=f?.access?.rateLimiting,ae;if(oe?.enabled){let S=oe.maxRequests||100,j=oe.windowMs||6e4;ae=new ta({"api:general":{window:j,max:S}}),h.use("/api/*",async(V,Y)=>{if(!ae)return Y();let W=V.req.header("CF-Connecting-IP")||V.req.header("X-Forwarded-For")?.split(",")[0]?.trim()||V.req.header("X-Real-IP")||"unknown",M=await ae.check("api:general",W);if(V.header("X-RateLimit-Limit",String(S)),V.header("X-RateLimit-Remaining",String(M.remaining)),V.header("X-RateLimit-Reset",String(M.resetAt)),!M.allowed)return V.json({error:"Too many requests",retryAfter:M.retryAfter},429);await Y();});}let Ae=new ra({redis:R,jwtSecret:s||"change-me",baseUrl:process.env.KYRO_BASE_URL||"http://localhost:4321",rateLimiter:ae});q$2.fromConfig(r).then(S=>{S&&(Ae.email=S);}).catch(S=>{console.error("[Email] Failed to initialize transport from config:",S);}),Ql(h,Ae,r,e,D,i,c,y,v);let Me=typeof e.hasCollection=="function"&&e.hasCollection("users")?e.getCollection("users"):(()=>{try{return e.getCollection("users")}catch{return a$6}})();return h.get("/api/users",async S=>{let{user:j,tenantId:V}=await J(S.req.raw,D,i,c),Y=await $e(Me,"read",S.req.raw,j,V,void 0,y,v);if(!Y.allowed)throw new T(Y.status||403,Y.error||"Access denied");let W=parseInt(S.req.query("page")||"1"),M=Math.min(parseInt(S.req.query("limit")||"10"),100),xe=S.req.query("search")||void 0,le=[],de=0;if(typeof R.findUsers=="function"){let fe=await R.findUsers({page:W,limit:M,search:xe});le=fe.users||[],de=fe.total||0;}else {let fe=await r.find({collection:"users",page:W,limit:M,where:xe?{email:{contains:xe}}:{},tenantId:V});le=fe.docs||[],de=fe.totalDocs||0;}return S.json({docs:le,totalDocs:de,limit:M,totalPages:Math.ceil(de/M)||1,page:W,pagingCounter:(W-1)*M+1,hasPrevPage:W>1,hasNextPage:W<Math.ceil(de/M),prevPage:W>1?W-1:null,nextPage:W<Math.ceil(de/M)?W+1:null})}),h.get("/api/users/:id",async S=>{let{user:j,tenantId:V}=await J(S.req.raw,D,i,c),Y=S.req.param("id"),W=await R.findUserById(Y);if(!W)throw new T(404,"User not found");return S.json({data:W})}),h.post("/api/users",async S=>{let{user:j,tenantId:V}=await J(S.req.raw,D,i,c),Y=await $e(Me,"create",S.req.raw,j,V,void 0,y,v);if(!Y.allowed)throw new T(Y.status||403,Y.error||"Access denied");let W=await S.req.json();if(!W.email||!W.password)throw new T(400,"Email and password are required");if(await R.findUserByEmail(W.email))throw new T(400,"Email already in use");let xe=W.role||"customer";if(xe!=="customer"&&j?.role!=="super_admin")throw new T(403,"Forbidden: Only super_admin can assign administrative roles");let le=await R.createUser({email:W.email,password:W.password,name:W.name,role:xe,avatar:W.avatar,tenantId:W.tenantId});return j&&R?.createAuditLog({action:"user_create",userId:j.id,resource:"users",resourceId:le.id,success:true}),S.json({data:le,message:"User created successfully"},201)}),h.patch("/api/users/:id",async S=>{let{user:j,tenantId:V}=await J(S.req.raw,D,i,c),Y=await $e(Me,"update",S.req.raw,j,V,void 0,y,v);if(!Y.allowed)throw new T(Y.status||403,Y.error||"Access denied");let W=S.req.param("id"),M=await S.req.json(),xe=await R.findUserById(W);if(!xe)throw new T(404,"User not found");let le={};if(M.name!==void 0&&(le.name=M.name),M.email!==void 0&&(le.email=M.email),M.role!==void 0&&M.role!==xe.role){if(j?.role!=="super_admin")throw new T(403,"Forbidden: Only super_admin can modify user roles");le.role=M.role;}M.avatar!==void 0&&(le.avatar=typeof M.avatar=="object"&&M.avatar!==null?M.avatar.id||String(M.avatar):M.avatar),M.tenantId!==void 0&&(le.tenantId=M.tenantId),M.emailVerified!==void 0&&(le.emailVerified=M.emailVerified),M.locked!==void 0&&(le.locked=M.locked),M.failedLoginAttempts!==void 0&&(le.failedLoginAttempts=M.failedLoginAttempts),M.lastLogin!==void 0&&(le.lastLogin=M.lastLogin);let de=await R.updateUser(W,le);if(!de)throw new T(500,"User update failed");return j&&(R?.createAuditLog({action:"user_update",userId:j.id,resource:"users",resourceId:W,success:true}),M.role&&xe.role!==M.role&&R?.createAuditLog({action:"role_change",userId:j.id,resource:"users",resourceId:W,success:true,metadata:{oldRole:xe.role,newRole:M.role}})),S.json({data:de,message:"User updated successfully"})}),h.delete("/api/users/:id",async S=>{let{user:j,tenantId:V}=await J(S.req.raw,D,i,c),Y=await $e(Me,"delete",S.req.raw,j,V,void 0,y,v);if(!Y.allowed)throw new T(Y.status||403,Y.error||"Access denied");let W=S.req.param("id");if(j&&j.id===W)throw new T(403,"You cannot delete your own account");let M=await R.findUserById(W);if(!M)throw new T(404,"User not found");if(!await R.deleteUser(W))throw new T(500,"User deletion failed");return j&&R?.createAuditLog({action:"user_delete",userId:j.id,resource:"users",resourceId:W,success:true}),S.json({data:M,message:"User deleted successfully"})}),h.get("/api/auth/audit-logs",async S=>{let{user:j,tenantId:V}=await J(S.req.raw,D,i,c),Y=e.getCollection("audit_logs");if(Y){let Ct=await $e(Y,"read",S.req.raw,j,V,void 0,y,v);if(!Ct.allowed)throw new T(Ct.status||403,Ct.error||"Access denied")}else if(!j)throw new T(401,"Authentication required");let W=parseInt(S.req.query("page")||"1"),M=Math.min(parseInt(S.req.query("limit")||"50"),100),xe=S.req.query("action")||void 0,le=S.req.query("userId")||void 0,de=S.req.query("resource")||void 0,fe=await R.findAuditLogs({action:xe,userId:le,resource:de,limit:M,offset:(W-1)*M});return S.json({docs:fe.logs,totalDocs:fe.total,limit:M,totalPages:Math.ceil(fe.total/M),page:W,pagingCounter:(W-1)*M+1,hasPrevPage:W>1,hasNextPage:W<Math.ceil(fe.total/M),prevPage:W>1?W-1:null,nextPage:W<Math.ceil(fe.total/M)?W+1:null})}),Ml(h,t,D),h.get("/api/storage-status",async S=>{let{user:j}=await J(S.req.raw,D,i,c);if(!j)throw new T(401,"Authentication required");let V=typeof globalThis.STORAGE_BUCKET<"u"||typeof S.env?.STORAGE_BUCKET<"u",Y=V,W=V?"cloudflare_r2":"local";if(r)try{let M=r.prepare('SELECT provider FROM "_globals_storage-settings" LIMIT 1').get();M&&M.provider&&(Y=!0,W=M.provider==="aws"?"s3":M.provider);}catch{try{let M=await r.findOne({collection:"_globals_storage-settings",where:{},draft:!0});M&&M.provider&&(Y=!0,W=M.provider==="aws"?"s3":M.provider);}catch{}}return S.json({provider:W,configured:Y,usage:0,limit:"unlimited"})}),h.get("/api/plugins",async S=>{let{user:j}=await J(S.req.raw,D,i,c);if(!j)throw new T(401,"Authentication required");let V=e.getPlugins(),Y=e.storageProviders,W=await Promise.all(V.map(async M=>{let xe=true,le=M.name,de={};try{let kt=await r.findOne({collection:"_globals_plugin-settings",where:{},draft:!0});kt&&kt.states&&(de=kt.states);}catch{}de[le]!==void 0&&(xe=de[le]),Y.setPluginEnabled(le,xe);let fe=le.replace(/^@[^/]+\//,"");fe=fe.replace(/^(plugin|kyro)-/,"");let Ct={ai:"AI",seo:"SEO",s3:"S3",aws:"AWS",api:"API",ui:"UI",ftp:"FTP"};if(fe=fe.split("-").map(kt=>{let Bo=kt.toLowerCase();return Ct[Bo]?Ct[Bo]:kt.charAt(0).toUpperCase()+kt.slice(1)}).join(" "),fe.toLowerCase().startsWith("storage ")){let kt=fe.split(" ");kt.length===2&&(fe=`${kt[1]} Storage`);}return {id:le,name:M.displayName||fe,version:M.version||"1.0.0",description:M.description||"",enabled:xe,status:xe?"active":"disabled"}}));return S.json(W)}),h.put("/api/plugins/:name/toggle",async S=>{let{user:j}=await J(S.req.raw,D,i,c);if(!j)throw new T(401,"Authentication required");let V=S.req.param("name"),Y=e.storageProviders,M=!Y.isPluginEnabled(V),xe=[];if(!M)for(let de of Y.getAll())de.pluginName===V&&xe.push(de.type);if(!(S.req.query("force")==="1")&&!M&&xe.length>0){let de="local";try{let fe=r?.prepare?.('SELECT provider FROM "_globals_storage-settings" LIMIT 1')?.get();fe?.provider&&(de=fe.provider);}catch{try{let fe=await r?.findOne?.({collection:"_globals_storage-settings",where:{},draft:!0});fe?.provider&&(de=fe.provider);}catch{}}if(xe.includes(de))return S.json({error:`Cannot disable "${V}" \u2014 storage provider "${de}" is currently active. Switch to Local storage first.`,requiresAction:true,activeProvider:de},409)}try{let de={},fe="global",Ct=await r.findOne({collection:"_globals_plugin-settings",where:{},draft:!0});Ct&&(de=Ct.states||{},fe=Ct.id),de[V]=M,Ct?await r.update({collection:"_globals_plugin-settings",id:fe,data:{states:de}}):await r.create({collection:"_globals_plugin-settings",data:{states:de,id:"global"}});}catch(de){console.warn(`[Plugins] Could not persist state for "${V}":`,de);}return Y.setPluginEnabled(V,M),S.json({name:V,enabled:M})}),h.get("/api/health",S=>S.json({status:"ok",version:"0.12.66",collections:e.getCollectionSlugs(),timestamp:new Date().toISOString()})),h.get("/api/metrics",async S=>{let{user:j,tenantId:V}=await J(S.req.raw,D,i,c);if(!j)throw new T(401,"Authentication required");let Y=j.role==="admin"||j.role==="super_admin",M=e.getCollectionSlugs().filter(Tt=>!["users","audit_logs","media","_globals_access-settings","_globals_brand-settings"].includes(Tt)&&!Tt.startsWith("_globals_")).filter(Tt=>Y||a$7(j,`${Tt}:read`)),xe=0,le={};await Promise.all(M.map(async Tt=>{try{let ed=(await r.find({collection:Tt,where:{},limit:1,page:1,tenantId:V})).totalDocs??0;xe+=ed,le[Tt]=ed;}catch{}}));let de=0;try{de=(await r.find({collection:"media",where:{},limit:1,page:1,tenantId:V})).totalDocs??0;}catch{}let fe=0;try{fe=(await r.find({collection:"users",where:{},limit:1,page:1,tenantId:V})).totalDocs??0;}catch{}let Ct=0;try{if(u){let Tt=await u.getWebhooks();Ct=Array.isArray(Tt)?Tt.length:0;}}catch{}let kt=0;try{kt=(await r.find({collection:a$8,where:{},limit:1,page:1,tenantId:V})).totalDocs??0;}catch{}let Bo=xe+de+fe;return S.json({totalDocuments:xe,totalMedia:Y||a$7(j,"media:read")?de:void 0,totalUsers:Y||a$7(j,"users:read")?fe:void 0,totalWebhooks:Y?Ct:void 0,totalApiKeys:Y?kt:void 0,totalStoredRecords:Bo,collectionCounts:le,collections:M.length,timestamp:new Date().toISOString()})}),Ul(h,t,D),Xl(h,t,D),Oc(h,t,D),Pc(h,t,D),h.onError((S,j)=>{let V=S?.statusCode||S?.status||500;return V>=500&&console.error(`[API Error] ${j.req.method} ${j.req.path}:`,S),j.json({error:S.message||"Internal server error",code:V>=500?"INTERNAL_ERROR":"BAD_REQUEST"},V)}),h}async function EB(t,e,r){return $_({registry:t,db:e,authSecret:r?.authSecret,user:r?.user,req:r?.req,tenantId:r?.tenantId,cors:r?.cors,webhookService:r?.webhookService})}
|
|
121
121
|
export{Tn as $,Mc as $a,_n as A,bV as Aa,wn as B,AV as Ba,Oo as C,SV as Ca,vn as D,RV as Da,bn as E,CV as Ea,gs as F,EV as Fa,Wr as G,kV as Ga,br as H,TV as Ha,Po as I,OV as Ia,Zr as J,PV as Ja,Bt as K,IV as Ka,An as L,DV as La,Gl as M,LV as Ma,Sn as N,$V as Na,$r as O,BV as Oa,Kl as P,NV as Pa,Io as Q,MV as Qa,Do as R,UV as Ra,Vl as S,jV as Sa,Rn as T,qV as Ta,Cn as U,HV as Ua,En as V,FV as Va,kn as W,GV as Wa,ys as X,U$ as Xa,sr as Y,j$ as Ya,rr as Z,qx as Za,Br as _,rs as _a,me as a,On as aa,ta as ab,Qx as b,Lo as ba,mm as bb,F as c,aV as ca,BM as cb,Dr as d,Zi as da,fm as db,$ as e,Ji as ea,ra as eb,NK as f,Pn as fa,Fx as fb,$t as g,fB as ga,Ki as gb,Vr as h,iV as ha,ec as hb,zK as i,N as ia,$_ as ib,ko as j,cV as ja,EB as jb,Wi as k,hB as ka,JK as l,gB as la,q as m,uV as ma,xt as n,lV as na,ee as o,yB as oa,hn as p,dV as pa,St as q,pV as qa,ql as r,mV as ra,Hl as s,fV as sa,fs as t,hV as ta,To as u,gV as ua,ue as v,yV as va,uB as w,xV as wa,hs as x,_V as xa,yn as y,wV as ya,xn as z,vV as za};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';var chunkBUNLC3II_cjs=require('./chunk-BUNLC3II.cjs'),r=require('path'),m=require('fs');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var r__default=/*#__PURE__*/_interopDefault(r);var m__default=/*#__PURE__*/_interopDefault(m);chunkBUNLC3II_cjs.h();var l=o=>{let s=r__default.default.join(process.cwd(),"node_modules","@kyro-cms","core"),e=r__default.default.resolve(s,"src",`${o}.ts`);return m__default.default.existsSync(e)?e:r__default.default.resolve(s,"dist",`${o}.js`)},E=l("api-handler"),A=l("api-handler-graphql"),P=l("api-handler-trpc"),S=["@kyro-cms/core","@kyro-cms/admin","@kyro-cms/astro","@kyro-cms/ai"],x=["@kyro-cms/connect"],R=[...S,...x],_=["better-sqlite3","pg","mongodb","ioredis","sharp","ssh2","cpu-features","ssh2-sftp-client","nodemailer","jsonwebtoken","@mapbox/node-pre-gyp","mock-aws-s3","aws-sdk","nock","cloudflare:workers"],N=["crypto","node:crypto","module","node:module","fs","node:fs","fs/promises","node:fs/promises","path","node:path","util","node:util","stream","node:stream","events","node:events","url","node:url","http","node:http","https","node:https","os","node:os","child_process","node:child_process","assert","node:assert","zlib","node:zlib","buffer","node:buffer"],h=[...S,..._],O=[...R,...N,..._];function k(o={}){let{configPath:s="./kyro.config.ts",apiPath:e="/api",adminPath:a="/admin",admin:v=true,enableGraphQL:c=false,enableTRPC:p=false,enableWebSocket:d=false}=o;return {name:"@kyro-cms/core",hooks:{"astro:config:setup":async({config:y,updateConfig:b,injectRoute:i,logger:n,addDevToolbarApp:T})=>{if(n.info(`Setting up Kyro CMS (API: ${e}, Admin: ${a})`),e===a)throw new Error(`Kyro CMS: apiPath and adminPath cannot be the same ("${e}")`);let u=r__default.default.resolve(y.root.pathname,s),g=u;m__default.default.existsSync(u)||n.warn(`Kyro config file not found at ${s}. The API will fail to boot if collections are needed.`),b({security:{checkOrigin:false},vite:{ssr:{external:O},build:{rollupOptions:{external:h}},optimizeDeps:{exclude:h},server:{watch:{ignored:["**/*.db","**/*.db-*","**/data/**","**/public/uploads/**","**/.kyro/**"]}},plugins:[{name:"use-sync-external-store-shim-fix",enforce:"pre",resolveId(t){if(t==="use-sync-external-store/shim"||t==="use-sync-external-store/shim/index.js")return "\0virtual:use-sync-external-store-shim";if(t==="use-sync-external-store/shim/with-selector"||t==="use-sync-external-store/shim/with-selector.js")return "\0virtual:use-sync-external-store-shim-with-selector"},load(t){if(t==="\0virtual:use-sync-external-store-shim")return 'export { useSyncExternalStore } from "react";';if(t==="\0virtual:use-sync-external-store-shim-with-selector")return `
|
|
2
|
+
import { useSyncExternalStore, useMemo } from "react";
|
|
3
|
+
export function useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) {
|
|
4
|
+
const memoizedSelector = useMemo(() => {
|
|
5
|
+
let last, lastSnap, hasMemo = false;
|
|
6
|
+
return (snap) => {
|
|
7
|
+
if (!hasMemo || !Object.is(lastSnap, snap)) {
|
|
8
|
+
const next = selector(snap);
|
|
9
|
+
if (!hasMemo || !(isEqual ? isEqual(last, next) : Object.is(last, next))) {
|
|
10
|
+
last = next; lastSnap = snap; hasMemo = true;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return last;
|
|
14
|
+
};
|
|
15
|
+
}, [selector, isEqual]);
|
|
16
|
+
const getSelection = () => memoizedSelector(getSnapshot());
|
|
17
|
+
const getServerSelection = getServerSnapshot != null ? () => memoizedSelector(getServerSnapshot()) : undefined;
|
|
18
|
+
return useSyncExternalStore(subscribe, getSelection, getServerSelection);
|
|
19
|
+
}
|
|
20
|
+
`}}],resolve:{alias:{debug:"debug/src/node.js","kyro:config":g}},define:{__KYRO_API_PATH__:JSON.stringify(e),__KYRO_ADMIN_PATH__:JSON.stringify(a),__KYRO_ENABLE_GRAPHQL__:JSON.stringify(c),__KYRO_ENABLE_TRPC__:JSON.stringify(p),__KYRO_ENABLE_WS__:JSON.stringify(d)}}}),i({pattern:`${e}/[...path]`,entrypoint:E}),c&&(i({pattern:`${e}/graphql`,entrypoint:A}),n.info(`GraphQL endpoint enabled at ${e}/graphql`)),p&&(i({pattern:`${e}/trpc/[...path]`,entrypoint:P}),n.info(`tRPC endpoint enabled at ${e}/trpc`)),d&&n.info("WebSocket support enabled (auto-starts at first request)");}}}}exports.a=k;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {g}from'./chunk-Y2YAKDEQ.js';import r from'path';import m from'fs';if (typeof window === "undefined") { const { createRequire } = await import(/* @vite-ignore */ 'module'); createRequire(import.meta.url); }
|
|
2
|
+
g();var l=o=>{let s=r.join(process.cwd(),"node_modules","@kyro-cms","core"),e=r.resolve(s,"src",`${o}.ts`);return m.existsSync(e)?e:r.resolve(s,"dist",`${o}.js`)},E=l("api-handler"),A=l("api-handler-graphql"),P=l("api-handler-trpc"),S=["@kyro-cms/core","@kyro-cms/admin","@kyro-cms/astro","@kyro-cms/ai"],x=["@kyro-cms/connect"],R=[...S,...x],_=["better-sqlite3","pg","mongodb","ioredis","sharp","ssh2","cpu-features","ssh2-sftp-client","nodemailer","jsonwebtoken","@mapbox/node-pre-gyp","mock-aws-s3","aws-sdk","nock","cloudflare:workers"],N=["crypto","node:crypto","module","node:module","fs","node:fs","fs/promises","node:fs/promises","path","node:path","util","node:util","stream","node:stream","events","node:events","url","node:url","http","node:http","https","node:https","os","node:os","child_process","node:child_process","assert","node:assert","zlib","node:zlib","buffer","node:buffer"],h=[...S,..._],O=[...R,...N,..._];function k(o={}){let{configPath:s="./kyro.config.ts",apiPath:e="/api",adminPath:a="/admin",admin:v=true,enableGraphQL:c=false,enableTRPC:p=false,enableWebSocket:d=false}=o;return {name:"@kyro-cms/core",hooks:{"astro:config:setup":async({config:y,updateConfig:b,injectRoute:i,logger:n,addDevToolbarApp:T})=>{if(n.info(`Setting up Kyro CMS (API: ${e}, Admin: ${a})`),e===a)throw new Error(`Kyro CMS: apiPath and adminPath cannot be the same ("${e}")`);let u=r.resolve(y.root.pathname,s),g=u;m.existsSync(u)||n.warn(`Kyro config file not found at ${s}. The API will fail to boot if collections are needed.`),b({security:{checkOrigin:false},vite:{ssr:{external:O},build:{rollupOptions:{external:h}},optimizeDeps:{exclude:h},server:{watch:{ignored:["**/*.db","**/*.db-*","**/data/**","**/public/uploads/**","**/.kyro/**"]}},plugins:[{name:"use-sync-external-store-shim-fix",enforce:"pre",resolveId(t){if(t==="use-sync-external-store/shim"||t==="use-sync-external-store/shim/index.js")return "\0virtual:use-sync-external-store-shim";if(t==="use-sync-external-store/shim/with-selector"||t==="use-sync-external-store/shim/with-selector.js")return "\0virtual:use-sync-external-store-shim-with-selector"},load(t){if(t==="\0virtual:use-sync-external-store-shim")return 'export { useSyncExternalStore } from "react";';if(t==="\0virtual:use-sync-external-store-shim-with-selector")return `
|
|
3
|
+
import { useSyncExternalStore, useMemo } from "react";
|
|
4
|
+
export function useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) {
|
|
5
|
+
const memoizedSelector = useMemo(() => {
|
|
6
|
+
let last, lastSnap, hasMemo = false;
|
|
7
|
+
return (snap) => {
|
|
8
|
+
if (!hasMemo || !Object.is(lastSnap, snap)) {
|
|
9
|
+
const next = selector(snap);
|
|
10
|
+
if (!hasMemo || !(isEqual ? isEqual(last, next) : Object.is(last, next))) {
|
|
11
|
+
last = next; lastSnap = snap; hasMemo = true;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return last;
|
|
15
|
+
};
|
|
16
|
+
}, [selector, isEqual]);
|
|
17
|
+
const getSelection = () => memoizedSelector(getSnapshot());
|
|
18
|
+
const getServerSelection = getServerSnapshot != null ? () => memoizedSelector(getServerSnapshot()) : undefined;
|
|
19
|
+
return useSyncExternalStore(subscribe, getSelection, getServerSelection);
|
|
20
|
+
}
|
|
21
|
+
`}}],resolve:{alias:{debug:"debug/src/node.js","kyro:config":g}},define:{__KYRO_API_PATH__:JSON.stringify(e),__KYRO_ADMIN_PATH__:JSON.stringify(a),__KYRO_ENABLE_GRAPHQL__:JSON.stringify(c),__KYRO_ENABLE_TRPC__:JSON.stringify(p),__KYRO_ENABLE_WS__:JSON.stringify(d)}}}),i({pattern:`${e}/[...path]`,entrypoint:E}),c&&(i({pattern:`${e}/graphql`,entrypoint:A}),n.info(`GraphQL endpoint enabled at ${e}/graphql`)),p&&(i({pattern:`${e}/trpc/[...path]`,entrypoint:P}),n.info(`tRPC endpoint enabled at ${e}/trpc`)),d&&n.info("WebSocket support enabled (auto-starts at first request)");}}}}export{k as a};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {a as a$3}from'./chunk-LWM4WABU.js';import {a as a$2}from'./chunk-D6SDGHY6.js';import {a as a$5,i as i$1}from'./chunk-4ZWLNGLS.js';import {r as r$1,p as p$1,n as n$1,c as c$2,q as q$1,o as o$1,J as J$1,b as b$4,a as a$6,F as F$2,D as D$1,C as C$2,e as e$3,H as H$2,x as x$1,d as d$4,y as y$2,k as k$1,f as f$3,A as A$1,j as j$1,z as z$2,u as u$1,v as v$1,w as w$1,g as g$3,E as E$1,B as B$1,t as t$1,s as s$1,m as m$1,i as i$2,l as l$1,h as h$1}from'./chunk-X473JI7Z.js';import {wa as wa$1,a as a$1,ua as ua$1,Aa as Aa$1,ra as ra$1,Da as Da$1,Na as Na$1,qa as qa$1,ka as ka$1,za as za$1,i,Ga as Ga$1,Ea as Ea$1,f as f$1,Ma as Ma$1,Qa as Qa$1,Ra,Sa as Sa$1,Oa as Oa$1,Ta as Ta$1,Ua as Ua$1,b as b$1,ya as ya$1,la as la$1,Pa as Pa$1,sa as sa$1,va as va$1,La as La$1,ma as ma$1,Fa as Fa$1,k,Ja as Ja$1,Ia as Ia$1,ha as ha$1,t,s,u,r,Ca as Ca$1,ja as ja$1,d as d$1,j,Ha as Ha$1,Ka as Ka$1,Ba as Ba$1,h,w,pa as pa$1,ga as ga$1,Va as Va$1,oa as oa$1,na as na$1,xa as xa$1,ta as ta$1,m,I,G as G$1,L,D,v,O,Y,C as C$1,x,R,P,fa as fa$1,X,ea as ea$1,c as c$1,Z,K,y as y$1,_,E,H as H$1,W,ba as ba$1,Q as Q$1,U,T,e,N as N$1,S,ia as ia$1,g as g$1,V,M as M$1,$,B,aa as aa$1,da as da$1,A,z as z$1,J,F as F$1,n,q,Wa as Wa$1,o,l,p,ca as ca$1,Xa as Xa$1,Ya as Ya$1,$a as $a$1,ib}from'./chunk-
|
|
1
|
+
import {a as a$3}from'./chunk-LWM4WABU.js';import {a as a$2}from'./chunk-D6SDGHY6.js';import {a as a$5,i as i$1}from'./chunk-4ZWLNGLS.js';import {r as r$1,p as p$1,n as n$1,c as c$2,q as q$1,o as o$1,J as J$1,b as b$4,a as a$6,F as F$2,D as D$1,C as C$2,e as e$3,H as H$2,x as x$1,d as d$4,y as y$2,k as k$1,f as f$3,A as A$1,j as j$1,z as z$2,u as u$1,v as v$1,w as w$1,g as g$3,E as E$1,B as B$1,t as t$1,s as s$1,m as m$1,i as i$2,l as l$1,h as h$1}from'./chunk-X473JI7Z.js';import {wa as wa$1,a as a$1,ua as ua$1,Aa as Aa$1,ra as ra$1,Da as Da$1,Na as Na$1,qa as qa$1,ka as ka$1,za as za$1,i,Ga as Ga$1,Ea as Ea$1,f as f$1,Ma as Ma$1,Qa as Qa$1,Ra,Sa as Sa$1,Oa as Oa$1,Ta as Ta$1,Ua as Ua$1,b as b$1,ya as ya$1,la as la$1,Pa as Pa$1,sa as sa$1,va as va$1,La as La$1,ma as ma$1,Fa as Fa$1,k,Ja as Ja$1,Ia as Ia$1,ha as ha$1,t,s,u,r,Ca as Ca$1,ja as ja$1,d as d$1,j,Ha as Ha$1,Ka as Ka$1,Ba as Ba$1,h,w,pa as pa$1,ga as ga$1,Va as Va$1,oa as oa$1,na as na$1,xa as xa$1,ta as ta$1,m,I,G as G$1,L,D,v,O,Y,C as C$1,x,R,P,fa as fa$1,X,ea as ea$1,c as c$1,Z,K,y as y$1,_,E,H as H$1,W,ba as ba$1,Q as Q$1,U,T,e,N as N$1,S,ia as ia$1,g as g$1,V,M as M$1,$,B,aa as aa$1,da as da$1,A,z as z$1,J,F as F$1,n,q,Wa as Wa$1,o,l,p,ca as ca$1,Xa as Xa$1,Ya as Ya$1,$a as $a$1,ib}from'./chunk-RVWHGHST.js';import {n as n$2,e as e$2,f as f$2}from'./chunk-AWQGDMOE.js';import {a as a$4,b as b$3,c as c$4,d as d$3}from'./chunk-GQGFNTDZ.js';import {b as b$2,d as d$2}from'./chunk-5M3FKE2V.js';import {c as c$3}from'./chunk-AXT3QPVM.js';import {g as g$2}from'./chunk-47CXBWMA.js';import {c,g,b,d,a,f,e as e$1}from'./chunk-Y2YAKDEQ.js';if (typeof window === "undefined") { const { createRequire } = await import(/* @vite-ignore */ 'module'); createRequire(import.meta.url); }
|
|
2
2
|
var ms=c((hw,Ra)=>{g();function Rp(){return Object.keys(globalThis).some(t=>t.startsWith("__NEXT"))}Ra.exports=function(){return !!(globalThis.Deno||globalThis.Bun||Rp())};});function Aa(t,e){return (e?/^[\x00-\xFF]*$/:/^[\x00-\x7F]*$/).test(t)}function _s(t,e=false){let r=[],n=0;for(;n<t.length;){let s=t[n],i=F(function(o){if(!e)throw new TypeError(o);r.push({type:"INVALID_CHAR",index:n,value:t[n++]});},"ErrorOrInvalid");if(s==="*"){r.push({type:"ASTERISK",index:n,value:t[n++]});continue}if(s==="+"||s==="?"){r.push({type:"OTHER_MODIFIER",index:n,value:t[n++]});continue}if(s==="\\"){r.push({type:"ESCAPED_CHAR",index:n++,value:t[n++]});continue}if(s==="{"){r.push({type:"OPEN",index:n,value:t[n++]});continue}if(s==="}"){r.push({type:"CLOSE",index:n,value:t[n++]});continue}if(s===":"){let o="",a=n+1;for(;a<t.length;){let c=t.substr(a,1);if(a===n+1&&Lp.test(c)||a!==n+1&&Op.test(c)){o+=t[a++];continue}break}if(!o){i(`Missing parameter name at ${n}`);continue}r.push({type:"NAME",index:n,value:o}),n=a;continue}if(s==="("){let o=1,a="",c=n+1,l=false;if(t[c]==="?"){i(`Pattern cannot start with "?" at ${c}`);continue}for(;c<t.length;){if(!Aa(t[c],false)){i(`Invalid character '${t[c]}' at ${c}.`),l=true;break}if(t[c]==="\\"){a+=t[c++]+t[c++];continue}if(t[c]===")"){if(o--,o===0){c++;break}}else if(t[c]==="("&&(o++,t[c+1]!=="?")){i(`Capturing groups are not allowed at ${c}`),l=true;break}a+=t[c++];}if(l)continue;if(o){i(`Unbalanced pattern at ${n}`);continue}if(!a){i(`Missing pattern at ${n}`);continue}r.push({type:"REGEX",index:n,value:a}),n=c;continue}r.push({type:"CHAR",index:n,value:t[n++]});}return r.push({type:"END",index:n,value:""}),r}function ws(t,e={}){let r=_s(t);e.delimiter??="/#?",e.prefixes??="./";let n=`[^${me(e.delimiter)}]+?`,s=[],i=0,o=0,c=new Set,l=F(P=>{if(o<r.length&&r[o].type===P)return r[o++].value},"tryConsume"),u=F(()=>l("OTHER_MODIFIER")??l("ASTERISK"),"tryConsumeModifier"),h=F(P=>{let k=l(P);if(k!==void 0)return k;let{type:S,index:v}=r[o];throw new TypeError(`Unexpected ${S} at ${v}, expected ${P}`)},"mustConsume"),d=F(()=>{let P="",k;for(;k=l("CHAR")??l("ESCAPED_CHAR");)P+=k;return P},"consumeText"),p=F(P=>P,"DefaultEncodePart"),_=e.encodePart||p,E="",A=F(P=>{E+=P;},"appendToPendingFixedValue"),R=F(()=>{E.length&&(s.push(new wt(3,"","",_(E),"",3)),E="");},"maybeAddPartFromPendingFixedValue"),j=F((P,k,S,v,O)=>{let g=3;switch(O){case "?":g=1;break;case "*":g=0;break;case "+":g=2;break}if(!k&&!S&&g===3){A(P);return}if(R(),!k&&!S){if(!P)return;s.push(new wt(3,"","",_(P),"",g));return}let x;S?S==="*"?x=ys:x=S:x=n;let w=2;x===n?(w=1,x=""):x===ys&&(w=0,x="");let T;if(k?T=k:S&&(T=i++),c.has(T))throw new TypeError(`Duplicate name '${T}'.`);c.add(T),s.push(new wt(w,T,_(P),x,_(v),g));},"addPart");for(;o<r.length;){let P=l("CHAR"),k=l("NAME"),S=l("REGEX");if(!k&&!S&&(S=l("ASTERISK")),k||S){let O=P??"";e.prefixes.indexOf(O)===-1&&(A(O),O=""),R();let g=u();j(O,k,S,"",g);continue}let v=P??l("ESCAPED_CHAR");if(v){A(v);continue}if(l("OPEN")){let O=d(),g=l("NAME"),x=l("REGEX");!g&&!x&&(x=l("ASTERISK"));let w=d();h("CLOSE");let T=u();j(O,g,x,w,T);continue}R(),h("END");}return s}function me(t){return t.replace(/([.+*?^${}()[\]|/\\])/g,"\\$1")}function gs(t){return t&&t.ignoreCase?"ui":"u"}function La(t,e,r){return Ss(ws(t,r),e,r)}function tt(t){switch(t){case 0:return "*";case 1:return "?";case 2:return "+";case 3:return ""}}function Ss(t,e,r={}){r.delimiter??="/#?",r.prefixes??="./",r.sensitive??=false,r.strict??=false,r.end??=true,r.start??=true,r.endsWith="";let n=r.start?"^":"";for(let a of t){if(a.type===3){a.modifier===3?n+=me(a.value):n+=`(?:${me(a.value)})${tt(a.modifier)}`;continue}e&&e.push(a.name);let c=`[^${me(r.delimiter)}]+?`,l=a.value;if(a.type===1?l=c:a.type===0&&(l=ys),!a.prefix.length&&!a.suffix.length){a.modifier===3||a.modifier===1?n+=`(${l})${tt(a.modifier)}`:n+=`((?:${l})${tt(a.modifier)})`;continue}if(a.modifier===3||a.modifier===1){n+=`(?:${me(a.prefix)}(${l})${me(a.suffix)})`,n+=tt(a.modifier);continue}n+=`(?:${me(a.prefix)}`,n+=`((?:${l})(?:`,n+=me(a.suffix),n+=me(a.prefix),n+=`(?:${l}))*)${me(a.suffix)})`,a.modifier===0&&(n+="?");}let s=`[${me(r.endsWith)}]|$`,i=`[${me(r.delimiter)}]`;if(r.end)return r.strict||(n+=`${i}?`),r.endsWith.length?n+=`(?=${s})`:n+="$",new RegExp(n,gs(r));r.strict||(n+=`(?:${i}(?=${s}))?`);let o=false;if(t.length){let a=t[t.length-1];a.type===3&&a.modifier===3&&(o=r.delimiter.indexOf(a)>-1);}return o||(n+=`(?=${i}|${s})`),new RegExp(n,gs(r))}function Oa(t,e){return t.length?t[0]==="/"?true:!e||t.length<2?false:(t[0]=="\\"||t[0]=="{")&&t[1]=="/":false}function Es(t,e){return t.startsWith(e)?t.substring(e.length,t.length):t}function Fa(t,e){return t.endsWith(e)?t.substr(0,t.length-e.length):t}function Ps(t){return !t||t.length<2?false:t[0]==="["||(t[0]==="\\"||t[0]==="{")&&t[1]==="["}function vs(t){if(!t)return true;for(let e of Ia)if(t.test(e))return true;return false}function Da(t,e){if(t=Es(t,"#"),e||t==="")return t;let r=new URL("https://example.com");return r.hash=t,r.hash?r.hash.substring(1,r.hash.length):""}function ja(t,e){if(t=Es(t,"?"),e||t==="")return t;let r=new URL("https://example.com");return r.search=t,r.search?r.search.substring(1,r.search.length):""}function qa(t,e){return e||t===""?t:Ps(t)?Cs(t):ks(t)}function Ua(t,e){if(e||t==="")return t;let r=new URL("https://example.com");return r.password=t,r.password}function Ma(t,e){if(e||t==="")return t;let r=new URL("https://example.com");return r.username=t,r.username}function Ba(t,e,r){if(r||t==="")return t;if(e&&!Ia.includes(e))return new URL(`${e}:${t}`).pathname;let n=t[0]=="/";return t=new URL(n?t:"/-"+t,"https://example.com").pathname,n||(t=t.substring(2,t.length)),t}function $a(t,e,r){return Ts(e)===t&&(t=""),r||t===""?t:Rs(t)}function Na(t,e){return t=Fa(t,":"),e||t===""?t:Ar(t)}function Ts(t){switch(t){case "ws":case "http":return "80";case "wws":case "https":return "443";case "ftp":return "21";default:return ""}}function Ar(t){if(t==="")return t;if(/^[-+.A-Za-z0-9]*$/.test(t))return t.toLowerCase();throw new TypeError(`Invalid protocol '${t}'.`)}function Ga(t){if(t==="")return t;let e=new URL("https://example.com");return e.username=t,e.username}function za(t){if(t==="")return t;let e=new URL("https://example.com");return e.password=t,e.password}function ks(t){if(t==="")return t;if(/[\t\n\r #%/:<>?@[\]^\\|]/g.test(t))throw new TypeError(`Invalid hostname '${t}'`);let e=new URL("https://example.com");return e.hostname=t,e.hostname}function Cs(t){if(t==="")return t;if(/[^0-9a-fA-F[\]:]/g.test(t))throw new TypeError(`Invalid IPv6 hostname '${t}'`);return t.toLowerCase()}function Rs(t){if(t===""||/^[0-9]*$/.test(t)&&parseInt(t)<=65535)return t;throw new TypeError(`Invalid port '${t}'.`)}function Ha(t){if(t==="")return t;let e=new URL("https://example.com");return e.pathname=t[0]!=="/"?"/-"+t:t,t[0]!=="/"?e.pathname.substring(2,e.pathname.length):e.pathname}function Va(t){return t===""?t:new URL(`data:${t}`).pathname}function Wa(t){if(t==="")return t;let e=new URL("https://example.com");return e.search=t,e.search.substring(1,e.search.length)}function Ka(t){if(t==="")return t;let e=new URL("https://example.com");return e.hash=t,e.hash.substring(1,e.hash.length)}function xs(t,e){if(typeof t!="string")throw new TypeError("parameter 1 is not of type 'string'.");let r=new URL(t,e);return {protocol:r.protocol.substring(0,r.protocol.length-1),username:r.username,password:r.password,hostname:r.hostname,port:r.port,pathname:r.pathname,search:r.search!==""?r.search.substring(1,r.search.length):void 0,hash:r.hash!==""?r.hash.substring(1,r.hash.length):void 0}}function Te(t,e){return e?_t(t):t}function xt(t,e,r){let n;if(typeof e.baseURL=="string")try{n=new URL(e.baseURL),e.protocol===void 0&&(t.protocol=Te(n.protocol.substring(0,n.protocol.length-1),r)),!r&&e.protocol===void 0&&e.hostname===void 0&&e.port===void 0&&e.username===void 0&&(t.username=Te(n.username,r)),!r&&e.protocol===void 0&&e.hostname===void 0&&e.port===void 0&&e.username===void 0&&e.password===void 0&&(t.password=Te(n.password,r)),e.protocol===void 0&&e.hostname===void 0&&(t.hostname=Te(n.hostname,r)),e.protocol===void 0&&e.hostname===void 0&&e.port===void 0&&(t.port=Te(n.port,r)),e.protocol===void 0&&e.hostname===void 0&&e.port===void 0&&e.pathname===void 0&&(t.pathname=Te(n.pathname,r)),e.protocol===void 0&&e.hostname===void 0&&e.port===void 0&&e.pathname===void 0&&e.search===void 0&&(t.search=Te(n.search.substring(1,n.search.length),r)),e.protocol===void 0&&e.hostname===void 0&&e.port===void 0&&e.pathname===void 0&&e.search===void 0&&e.hash===void 0&&(t.hash=Te(n.hash.substring(1,n.hash.length),r));}catch{throw new TypeError(`invalid baseURL '${e.baseURL}'.`)}if(typeof e.protocol=="string"&&(t.protocol=Na(e.protocol,r)),typeof e.username=="string"&&(t.username=Ma(e.username,r)),typeof e.password=="string"&&(t.password=Ua(e.password,r)),typeof e.hostname=="string"&&(t.hostname=qa(e.hostname,r)),typeof e.port=="string"&&(t.port=$a(e.port,t.protocol,r)),typeof e.pathname=="string"){if(t.pathname=e.pathname,n&&!Oa(t.pathname,r)){let s=n.pathname.lastIndexOf("/");s>=0&&(t.pathname=Te(n.pathname.substring(0,s+1),r)+t.pathname);}t.pathname=Ba(t.pathname,t.protocol,r);}return typeof e.search=="string"&&(t.search=ja(e.search,r)),typeof e.hash=="string"&&(t.hash=Da(e.hash,r)),t}function _t(t){return t.replace(/([+*?:{}()\\])/g,"\\$1")}function Za(t){return t.replace(/([.+*?^${}()[\]|/\\])/g,"\\$1")}function Ja(t,e){e.delimiter??="/#?",e.prefixes??="./",e.sensitive??=false,e.strict??=false,e.end??=true,e.start??=true,e.endsWith="";let r=".*",n=`[^${Za(e.delimiter)}]+?`,s=/[$_\u200C\u200D\p{ID_Continue}]/u,i="";for(let o=0;o<t.length;++o){let a=t[o];if(a.type===3){if(a.modifier===3){i+=_t(a.value);continue}i+=`{${_t(a.value)}}${tt(a.modifier)}`;continue}let c=a.hasCustomName(),l=!!a.suffix.length||!!a.prefix.length&&(a.prefix.length!==1||!e.prefixes.includes(a.prefix)),u=o>0?t[o-1]:null,h=o<t.length-1?t[o+1]:null;if(!l&&c&&a.type===1&&a.modifier===3&&h&&!h.prefix.length&&!h.suffix.length)if(h.type===3){let d=h.value.length>0?h.value[0]:"";l=s.test(d);}else l=!h.hasCustomName();if(!l&&!a.prefix.length&&u&&u.type===3){let d=u.value[u.value.length-1];l=e.prefixes.includes(d);}l&&(i+="{"),i+=_t(a.prefix),c&&(i+=`:${a.name}`),a.type===2?i+=`(${a.value})`:a.type===1?c||(i+=`(${n})`):a.type===0&&(!c&&(!u||u.type===3||u.modifier!==3||l||a.prefix!=="")?i+="*":i+=`(${r})`),a.type===1&&c&&a.suffix.length&&s.test(a.suffix[0])&&(i+="\\"),i+=_t(a.suffix),l&&(i+="}"),a.modifier!==3&&(i+=tt(a.modifier));}return i}var Ap,F,wt,Lp,Op,ys,ze,Fp,Ip,Ia,Qa,bs,Ge,Lr,Ya=b(()=>{g();Ap=Object.defineProperty,F=(t,e)=>Ap(t,"name",{value:e,configurable:true}),wt=class{type=3;name="";prefix="";value="";suffix="";modifier=3;constructor(t,e,r,n,s,i){this.type=t,this.name=e,this.prefix=r,this.value=n,this.suffix=s,this.modifier=i;}hasCustomName(){return this.name!==""&&typeof this.name!="number"}};F(wt,"Part");Lp=/[$_\p{ID_Start}]/u,Op=/[$_\u200C\u200D\p{ID_Continue}]/u,ys=".*";F(Aa,"isASCII");F(_s,"lexer");F(ws,"parse");F(me,"escapeString");F(gs,"flags");F(La,"stringToRegexp");F(tt,"modifierToString");F(Ss,"partsToRegexp");ze={delimiter:"",prefixes:"",sensitive:true,strict:true},Fp={delimiter:".",prefixes:"",sensitive:true,strict:true},Ip={delimiter:"/",prefixes:"/",sensitive:true,strict:true};F(Oa,"isAbsolutePathname");F(Es,"maybeStripPrefix");F(Fa,"maybeStripSuffix");F(Ps,"treatAsIPv6Hostname");Ia=["ftp","file","http","https","ws","wss"];F(vs,"isSpecialScheme");F(Da,"canonicalizeHash");F(ja,"canonicalizeSearch");F(qa,"canonicalizeHostname");F(Ua,"canonicalizePassword");F(Ma,"canonicalizeUsername");F(Ba,"canonicalizePathname");F($a,"canonicalizePort");F(Na,"canonicalizeProtocol");F(Ts,"defaultPortForProtocol");F(Ar,"protocolEncodeCallback");F(Ga,"usernameEncodeCallback");F(za,"passwordEncodeCallback");F(ks,"hostnameEncodeCallback");F(Cs,"ipv6HostnameEncodeCallback");F(Rs,"portEncodeCallback");F(Ha,"standardURLPathnameEncodeCallback");F(Va,"pathURLPathnameEncodeCallback");F(Wa,"searchEncodeCallback");F(Ka,"hashEncodeCallback");Qa=class{#o;#r=[];#n={};#t=0;#p=1;#w=0;#s=0;#y=0;#l=0;#i=false;constructor(t){this.#o=t;}get result(){return this.#n}parse(){for(this.#r=_s(this.#o,true);this.#t<this.#r.length;this.#t+=this.#p){if(this.#p=1,this.#r[this.#t].type==="END"){if(this.#s===0){this.#b(),this.#T()?this.#e(9,1):this.#d()?this.#e(8,1):this.#e(7,0);continue}else if(this.#s===2){this.#f(5);continue}this.#e(10,0);break}if(this.#y>0)if(this.#k())this.#y-=1;else continue;if(this.#L()){this.#y+=1;continue}switch(this.#s){case 0:this.#h()&&this.#f(1);break;case 1:if(this.#h()){this.#O();let t=7,e=1;this.#E()?(t=2,e=3):this.#i&&(t=2),this.#e(t,e);}break;case 2:this.#g()?this.#f(3):(this.#v()||this.#d()||this.#T())&&this.#f(5);break;case 3:this.#x()?this.#e(4,1):this.#g()&&this.#e(5,1);break;case 4:this.#g()&&this.#e(5,1);break;case 5:this.#F()?this.#l+=1:this.#_()&&(this.#l-=1),this.#P()&&!this.#l?this.#e(6,1):this.#v()?this.#e(7,0):this.#d()?this.#e(8,1):this.#T()&&this.#e(9,1);break;case 6:this.#v()?this.#e(7,0):this.#d()?this.#e(8,1):this.#T()&&this.#e(9,1);break;case 7:this.#d()?this.#e(8,1):this.#T()&&this.#e(9,1);break;case 8:this.#T()&&this.#e(9,1);break;}}this.#n.hostname!==void 0&&this.#n.port===void 0&&(this.#n.port="");}#e(t,e){switch(this.#s){case 0:break;case 1:this.#n.protocol=this.#S();break;case 2:break;case 3:this.#n.username=this.#S();break;case 4:this.#n.password=this.#S();break;case 5:this.#n.hostname=this.#S();break;case 6:this.#n.port=this.#S();break;case 7:this.#n.pathname=this.#S();break;case 8:this.#n.search=this.#S();break;case 9:this.#n.hash=this.#S();break;}this.#s!==0&&t!==10&&([1,2,3,4].includes(this.#s)&&[6,7,8,9].includes(t)&&(this.#n.hostname??=""),[1,2,3,4,5,6].includes(this.#s)&&[8,9].includes(t)&&(this.#n.pathname??=this.#i?"/":""),[1,2,3,4,5,6,7].includes(this.#s)&&t===9&&(this.#n.search??="")),this.#m(t,e);}#m(t,e){this.#s=t,this.#w=this.#t+e,this.#t+=e,this.#p=0;}#b(){this.#t=this.#w,this.#p=0;}#f(t){this.#b(),this.#s=t;}#u(t){return t<0&&(t=this.#r.length-t),t<this.#r.length?this.#r[t]:this.#r[this.#r.length-1]}#c(t,e){let r=this.#u(t);return r.value===e&&(r.type==="CHAR"||r.type==="ESCAPED_CHAR"||r.type==="INVALID_CHAR")}#h(){return this.#c(this.#t,":")}#E(){return this.#c(this.#t+1,"/")&&this.#c(this.#t+2,"/")}#g(){return this.#c(this.#t,"@")}#x(){return this.#c(this.#t,":")}#P(){return this.#c(this.#t,":")}#v(){return this.#c(this.#t,"/")}#d(){if(this.#c(this.#t,"?"))return true;if(this.#r[this.#t].value!=="?")return false;let t=this.#u(this.#t-1);return t.type!=="NAME"&&t.type!=="REGEX"&&t.type!=="CLOSE"&&t.type!=="ASTERISK"}#T(){return this.#c(this.#t,"#")}#L(){return this.#r[this.#t].type=="OPEN"}#k(){return this.#r[this.#t].type=="CLOSE"}#F(){return this.#c(this.#t,"[")}#_(){return this.#c(this.#t,"]")}#S(){let t=this.#r[this.#t],e=this.#u(this.#w).index;return this.#o.substring(e,t.index)}#O(){let t={};Object.assign(t,ze),t.encodePart=Ar;let e=La(this.#S(),void 0,t);this.#i=vs(e);}};F(Qa,"Parser");bs=["protocol","username","password","hostname","port","pathname","search","hash"],Ge="*";F(xs,"extractValues");F(Te,"processBaseURLString");F(xt,"applyInit");F(_t,"escapePatternString");F(Za,"escapeRegexpString");F(Ja,"partsToPattern");Lr=class{#o;#r={};#n={};#t={};#p={};#w=false;constructor(t={},e,r){try{let n;if(typeof e=="string"?n=e:r=e,typeof t=="string"){let a=new Qa(t);if(a.parse(),t=a.result,n===void 0&&typeof t.protocol!="string")throw new TypeError("A base URL must be provided for a relative constructor string.");t.baseURL=n;}else {if(!t||typeof t!="object")throw new TypeError("parameter 1 is not of type 'string' and cannot convert to dictionary.");if(n)throw new TypeError("parameter 1 is not of type 'string'.")}typeof r>"u"&&(r={ignoreCase:!1});let s={ignoreCase:r.ignoreCase===!0},i={pathname:Ge,protocol:Ge,username:Ge,password:Ge,hostname:Ge,port:Ge,search:Ge,hash:Ge};this.#o=xt(i,t,!0),Ts(this.#o.protocol)===this.#o.port&&(this.#o.port="");let o;for(o of bs){if(!(o in this.#o))continue;let a={},c=this.#o[o];switch(this.#n[o]=[],o){case "protocol":Object.assign(a,ze),a.encodePart=Ar;break;case "username":Object.assign(a,ze),a.encodePart=Ga;break;case "password":Object.assign(a,ze),a.encodePart=za;break;case "hostname":Object.assign(a,Fp),Ps(c)?a.encodePart=Cs:a.encodePart=ks;break;case "port":Object.assign(a,ze),a.encodePart=Rs;break;case "pathname":vs(this.#r.protocol)?(Object.assign(a,Ip,s),a.encodePart=Ha):(Object.assign(a,ze,s),a.encodePart=Va);break;case "search":Object.assign(a,ze,s),a.encodePart=Wa;break;case "hash":Object.assign(a,ze,s),a.encodePart=Ka;break}try{this.#p[o]=ws(c,a),this.#r[o]=Ss(this.#p[o],this.#n[o],a),this.#t[o]=Ja(this.#p[o],a),this.#w=this.#w||this.#p[o].some(l=>l.type===2);}catch{throw new TypeError(`invalid ${o} pattern '${this.#o[o]}'.`)}}}catch(n){throw new TypeError(`Failed to construct 'URLPattern': ${n.message}`)}}get[Symbol.toStringTag](){return "URLPattern"}test(t={},e){let r={pathname:"",protocol:"",username:"",password:"",hostname:"",port:"",search:"",hash:""};if(typeof t!="string"&&e)throw new TypeError("parameter 1 is not of type 'string'.");if(typeof t>"u")return false;try{typeof t=="object"?r=xt(r,t,!1):r=xt(r,xs(t,e),!1);}catch{return false}let n;for(n of bs)if(!this.#r[n].exec(r[n]))return false;return true}exec(t={},e){let r={pathname:"",protocol:"",username:"",password:"",hostname:"",port:"",search:"",hash:""};if(typeof t!="string"&&e)throw new TypeError("parameter 1 is not of type 'string'.");if(typeof t>"u")return;try{typeof t=="object"?r=xt(r,t,!1):r=xt(r,xs(t,e),!1);}catch{return null}let n={};e?n.inputs=[t,e]:n.inputs=[t];let s;for(s of bs){let i=this.#r[s].exec(r[s]);if(!i)return null;let o={};for(let[a,c]of this.#n[s].entries())if(typeof c=="string"||typeof c=="number"){let l=i[a+1];o[c]=l;}n[s]={input:r[s]??"",groups:o};}return n}static compareComponent(t,e,r){let n=F((a,c)=>{for(let l of ["type","modifier","prefix","value","suffix"]){if(a[l]<c[l])return -1;if(a[l]!==c[l])return 1}return 0},"comparePart"),s=new wt(3,"","","","",3),i=new wt(0,"","","","",3),o=F((a,c)=>{let l=0;for(;l<Math.min(a.length,c.length);++l){let u=n(a[l],c[l]);if(u)return u}return a.length===c.length?0:n(a[l]??s,c[l]??s)},"comparePartList");return !e.#t[t]&&!r.#t[t]?0:e.#t[t]&&!r.#t[t]?o(e.#p[t],[i]):!e.#t[t]&&r.#t[t]?o([i],r.#p[t]):o(e.#p[t],r.#p[t])}get protocol(){return this.#t.protocol}get username(){return this.#t.username}get password(){return this.#t.password}get hostname(){return this.#t.hostname}get port(){return this.#t.port}get pathname(){return this.#t.pathname}get search(){return this.#t.search}get hash(){return this.#t.hash}get hasRegExpGroups(){return this.#w}};F(Lr,"URLPattern");});var Xa={};d(Xa,{URLPattern:()=>Lr});var el=b(()=>{g();Ya();globalThis.URLPattern||(globalThis.URLPattern=Lr);});var Ve=c(de=>{g();Object.defineProperty(de,"__esModule",{value:true});de.isPromise=Or;de.isActualPromise=rl;de.handleMaybePromise=He;de.fakePromise=ke;de.createDeferredPromise=Dp;de.iterateAsync=nl;de.iterateAsyncVoid=nl;de.fakeRejectPromise=rt;de.mapMaybePromise=jp;de.mapAsyncIterator=qp;de.promiseLikeFinally=sl;de.unfakePromise=il;var Fr=Symbol.for("@whatwg-node/promise-helpers/FakePromise");function Or(t){return t?.then!=null}function rl(t){let e=t;return e&&e.then&&e.catch&&e.finally}function He(t,e,r,n){let s=ke().then(t).then(e,r);return n&&(s=s.finally(n)),il(s)}function ke(t){return t&&rl(t)?t:Or(t)?{then:(e,r)=>ke(t.then(e,r)),catch:e=>ke(t.then(r=>r,e)),finally:e=>ke(e?sl(t,e):t),[Symbol.toStringTag]:"Promise"}:{then(e){if(e)try{return ke(e(t))}catch(r){return rt(r)}return this},catch(){return this},finally(e){if(e)try{return ke(e()).then(()=>t,()=>t)}catch(r){return rt(r)}return this},[Symbol.toStringTag]:"Promise",__fakePromiseValue:t,[Fr]:"resolved"}}function Dp(){if(Promise.withResolvers)return Promise.withResolvers();let t,e;return {promise:new Promise(function(s,i){t=s,e=i;}),get resolve(){return t},get reject(){return e}}}function nl(t,e,r){if(t?.length===0)return;let n=t[Symbol.iterator](),s=0;function i(){let{done:o,value:a}=n.next();if(o)return;let c=false;function l(){c=true;}return He(function(){return e(a,l,s++)},function(h){if(h&&r?.push(h),!c)return i()})}return i()}function rt(t){return {then(e,r){if(r)try{return ke(r(t))}catch(n){return rt(n)}return this},catch(e){if(e)try{return ke(e(t))}catch(r){return rt(r)}return this},finally(e){if(e)try{e();}catch(r){return rt(r)}return this},__fakeRejectError:t,[Symbol.toStringTag]:"Promise",[Fr]:"rejected"}}function jp(t,e,r){return He(()=>t,e,r)}function qp(t,e,r,n){Symbol.asyncIterator in t&&(t=t[Symbol.asyncIterator]());let s,i,o;if(n){let l;o=u=>(l||=He(n,()=>u,()=>u),l);}typeof t.return=="function"&&(s=t.return,i=l=>{let u=()=>{throw l};return s.call(t).then(u,u)});function a(l){return l.done?o?o(l):l:He(()=>l.value,u=>He(()=>e(u),tl,i))}let c;if(r){let l,u=r;c=h=>(l||=He(()=>h,d=>He(()=>u(d),tl,i)),l);}return {next(){return t.next().then(a,c)},return(){let l=s?s.call(t).then(a,c):ke({value:void 0,done:true});return o?l.then(o):l},throw(l){return typeof t.throw=="function"?t.throw(l).then(a,c):i?i(l):rt(l)},[Symbol.asyncIterator](){return this}}}function tl(t){return {value:t,done:false}}function Up(t){return t?.[Fr]==="resolved"}function Mp(t){return t?.[Fr]==="rejected"}function sl(t,e){return "finally"in t?t.finally(e):t.then(r=>{let n=e();return Or(n)?n.then(()=>r):r},r=>{let n=e();if(Or(n))return n.then(()=>{throw r});throw r})}function il(t){if(Up(t))return t.__fakePromiseValue;if(Mp(t))throw t.__fakeRejectError;return t}});var As=c((Ew,ol)=>{g();var{EventEmitter:Bp}=a("events"),{inherits:$p}=a("util");function nt(t){if(typeof t=="string"&&(t=Buffer.from(t)),!Buffer.isBuffer(t))throw new TypeError("The needle has to be a String or a Buffer.");let e=t.length,r=e-1;if(e===0)throw new Error("The needle cannot be an empty String/Buffer.");if(e>256)throw new Error("The needle cannot have a length bigger than 256.");this.maxMatches=1/0,this.matches=0,this._occ=new Uint8Array(256).fill(e),this._lookbehind_size=0,this._needle=t,this._bufpos=0,this._lookbehind=Buffer.alloc(r);for(var n=0;n<r;++n)this._occ[t[n]]=r-n;}$p(nt,Bp);nt.prototype.reset=function(){this._lookbehind_size=0,this.matches=0,this._bufpos=0;};nt.prototype.push=function(t,e){Buffer.isBuffer(t)||(t=Buffer.from(t,"binary"));let r=t.length;this._bufpos=e||0;let n;for(;n!==r&&this.matches<this.maxMatches;)n=this._sbmh_feed(t);return n};nt.prototype._sbmh_feed=function(t){let e=t.length,r=this._needle,n=r.length,s=n-1,i=r[s],o=-this._lookbehind_size,a;if(o<0){for(;o<0&&o<=e-n;){if(a=t[o+s],a===i&&this._sbmh_memcmp(t,o,s))return this._lookbehind_size=0,++this.matches,this.emit("info",true),this._bufpos=o+n;o+=this._occ[a];}for(;o<0&&!this._sbmh_memcmp(t,o,e-o);)++o;if(o>=0)this.emit("info",false,this._lookbehind,0,this._lookbehind_size),this._lookbehind_size=0;else {let c=this._lookbehind_size+o;return c>0&&this.emit("info",false,this._lookbehind,0,c),this._lookbehind_size-=c,this._lookbehind.copy(this._lookbehind,0,c,this._lookbehind_size),t.copy(this._lookbehind,this._lookbehind_size),this._lookbehind_size+=e,this._bufpos=e,e}}if(o=t.indexOf(r,o+this._bufpos),o!==-1)return ++this.matches,o===0?this.emit("info",true):this.emit("info",true,t,this._bufpos,o),this._bufpos=o+n;for(o=e-s,o<0&&(o=0);o!==e&&(t[o]!==r[0]||Buffer.compare(t.subarray(o+1,e),r.subarray(1,e-o))!==0);)++o;return o!==e&&(t.copy(this._lookbehind,0,o,e),this._lookbehind_size=e-o),o!==0&&this.emit("info",false,t,this._bufpos,o),this._bufpos=e,e};nt.prototype._sbmh_lookup_char=function(t,e){return e<0?this._lookbehind[this._lookbehind_size+e]:t[e]};nt.prototype._sbmh_memcmp=function(t,e,r){for(var n=0;n<r;++n)if(this._sbmh_lookup_char(t,e+n)!==this._needle[n])return false;return true};ol.exports=nt;});var cl=c((vw,ll)=>{g();var Np=a("util").inherits,al=a("stream").Readable;function Ls(t){al.call(this,t);}Np(Ls,al);Ls.prototype._read=function(t){};ll.exports=Ls;});var Ir=c((kw,ul)=>{g();ul.exports=function(e,r,n){if(!e||e[r]===void 0||e[r]===null)return n;if(typeof e[r]!="number"||isNaN(e[r]))throw new TypeError("Limit "+r+" is not a valid number");return e[r]};});var pl=c((Rw,dl)=>{g();var hl=a("events").EventEmitter,Gp=a("util").inherits,fl=Ir(),zp=As(),Hp=Buffer.from(`\r
|
|
3
3
|
\r
|
|
4
4
|
`),Vp=/\r\n/g,Wp=/^([^:]+):[ \t]?([\x00-\xFF]+)?$/;function St(t){hl.call(this),t=t||{};let e=this;this.nread=0,this.maxed=false,this.npairs=0,this.maxHeaderPairs=fl(t,"maxHeaderPairs",2e3),this.maxHeaderSize=fl(t,"maxHeaderSize",80*1024),this.buffer="",this.header={},this.finished=false,this.ss=new zp(Hp),this.ss.on("info",function(r,n,s,i){n&&!e.maxed&&(e.nread+i-s>=e.maxHeaderSize?(i=e.maxHeaderSize-e.nread+s,e.nread=e.maxHeaderSize,e.maxed=true):e.nread+=i-s,e.buffer+=n.toString("binary",s,i)),r&&e._finish();});}Gp(St,hl);St.prototype.push=function(t){let e=this.ss.push(t);if(this.finished)return e};St.prototype.reset=function(){this.finished=false,this.buffer="",this.header={},this.ss.reset();};St.prototype._finish=function(){this.buffer&&this._parseHeader(),this.ss.matches=this.ss.maxMatches;let t=this.header;this.header={},this.buffer="",this.finished=true,this.nread=this.npairs=0,this.maxed=false,this.emit("header",t);};St.prototype._parseHeader=function(){if(this.npairs===this.maxHeaderPairs)return;let t=this.buffer.split(Vp),e=t.length,r,n;for(var s=0;s<e;++s){if(t[s].length===0)continue;if((t[s][0]===" "||t[s][0]===" ")&&n){this.header[n][this.header[n].length-1]+=t[s];continue}let i=t[s].indexOf(":");if(i===-1||i===0)return;if(r=Wp.exec(t[s]),n=r[1].toLowerCase(),this.header[n]=this.header[n]||[],this.header[n].push(r[2]||""),++this.npairs===this.maxHeaderPairs)break}};dl.exports=St;});var Fs=c((Lw,bl)=>{g();var Os=a("stream").Writable,Kp=a("util").inherits,Qp=As(),ml=cl(),Zp=pl(),Jp=45,Yp=Buffer.from("-"),Xp=Buffer.from(`\r
|