create-fullstack-scaffold 0.4.3 → 0.4.4
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/cli/index.js +513 -122
- package/dist/cli/index.js.map +1 -1
- package/package.json +1 -1
- package/template/dist/cli/index.js +237 -94
- package/template/dist/cli/index.js.map +1 -1
- package/template/dist/client/admin.html +15 -10
- package/template/dist/client/assets/App-BpFUIC-5.js +114 -0
- package/template/dist/client/assets/{CartPage-DESSHkaG.js → CartPage-DgDZP-R5.js} +2 -2
- package/template/dist/client/assets/{CategoriesPage-DqLZ_Mom.js → CategoriesPage-fuYNiSmE.js} +2 -2
- package/template/dist/client/assets/ContentDetailPage-BvvFU1Mr.js +1 -0
- package/template/dist/client/assets/ContentListPage-ShPxo6WG.js +1 -0
- package/template/dist/client/assets/DashboardPage-C1rZzZo4.js +11 -0
- package/template/dist/client/assets/{DeveloperDashboardPage-Cum7zFwO.js → DeveloperDashboardPage-_WtmbVoA.js} +2 -2
- package/template/dist/client/assets/{EmptyState-BK7ttK8D.js → EmptyState-DEyOQjbY.js} +1 -1
- package/template/dist/client/assets/LoadingSpinner-BcHjaM1m.js +6 -0
- package/template/dist/client/assets/LoginPage-CjeQqDdO.js +1 -0
- package/template/dist/client/assets/LogoutOutlined-ColFAHdd.js +1 -0
- package/template/dist/client/assets/NotificationPage-DRkEv02s.js +1 -0
- package/template/dist/client/assets/OrdersPage-7I3vPWLP.js +11 -0
- package/template/dist/client/assets/{PluginDetailPage-Br24YS4P.js → PluginDetailPage-CWyxdVCg.js} +3 -13
- package/template/dist/client/assets/PluginsPage-DRgWLeJT.js +6 -0
- package/template/dist/client/assets/ProfilePage-2FFkaii8.js +16 -0
- package/template/dist/client/assets/PublishPage-DW7yvROx.js +1 -0
- package/template/dist/client/assets/{RegisterPage-rPFG4Sry.js → RegisterPage-Dvaf9b0e.js} +2 -2
- package/template/dist/client/assets/SaveOutlined-CLQ2tsSY.js +2 -0
- package/template/dist/client/assets/{SearchPage-DQl1U5Uy.js → SearchPage-DvnEyswS.js} +2 -2
- package/template/dist/client/assets/{SettingsPage-DaYE80wj.js → SettingsPage-IrU-L9Zr.js} +2 -2
- package/template/dist/client/assets/{StatusBadge-BJ3W2Zc7.js → StatusBadge-CG7wVqpu.js} +1 -1
- package/template/dist/client/assets/{TodoPage-zC5wWNBa.js → TodoPage-B7D-bl65.js} +3 -3
- package/template/dist/client/assets/TopicsPage-CYCNr-mn.js +6 -0
- package/template/dist/client/assets/{WebSocketPage-B4NLdz1w.js → WebSocketPage-CGEg6QJE.js} +2 -2
- package/template/dist/client/assets/{activity-B94BUAsD.js → activity-CgTz9Mrd.js} +1 -1
- package/template/dist/client/assets/admin-D2iHWNOg.js +1 -0
- package/template/dist/client/assets/api-request-DIJocPxr.js +356 -0
- package/template/dist/client/assets/{arrow-left-H5JH0iU1.js → arrow-left-DtLQ3tTk.js} +1 -1
- package/template/dist/client/assets/{chevron-down-DwRh_wjD.js → chevron-down-CpIAV_yr.js} +1 -1
- package/template/dist/client/assets/{chevron-right-CpIWaqAL.js → chevron-right-CnU7oPQs.js} +1 -1
- package/template/dist/client/assets/{circle-check-big-CSElLscG.js → circle-check-big-CrZdwS75.js} +1 -1
- package/template/dist/client/assets/{circle-x-CYxr4RAw.js → circle-x-CvN9r3fW.js} +1 -1
- package/template/dist/client/assets/{clock-BseUJ7ex.js → clock-CTeSZBiH.js} +1 -1
- package/template/dist/client/assets/{download-BsGC_Xhq.js → download-OSVfVuNV.js} +1 -1
- package/template/dist/client/assets/{external-link-UTDzdjq8.js → external-link-fBsuHMby.js} +1 -1
- package/template/dist/client/assets/{eye-nR10ui7i.js → eye-CwlZZEsj.js} +1 -1
- package/template/dist/client/assets/index-09IqiOaE.css +1 -0
- package/template/dist/client/assets/index-B3CRby6r.js +51 -0
- package/template/dist/client/assets/index-CC_zy73y.js +17 -0
- package/template/dist/client/assets/main-Cn4IDo2I.js +92 -0
- package/template/dist/client/assets/merchant-DDDN9bMu.js +40 -0
- package/template/dist/client/assets/{message-square-CwWGL-Bh.js → message-square-BRaZfgbJ.js} +1 -1
- package/template/dist/client/assets/pluginStore-DDsWJPe6.js +1 -0
- package/template/dist/client/assets/{plus-pZld_nUL.js → plus-DDZfPiDJ.js} +1 -1
- package/template/dist/client/assets/sse-client-DGQ072hl.js +64 -0
- package/template/dist/client/assets/star-C7tO6w4H.js +11 -0
- package/template/dist/client/assets/{tag-DsiUPF90.js → tag-DBfpQDuJ.js} +1 -1
- package/template/dist/client/assets/tenant-CizbLaLJ.js +1 -0
- package/template/dist/client/assets/{trash-2-DRblNbnA.js → trash-2-BP7fkd5b.js} +1 -1
- package/template/dist/client/assets/{triangle-alert-D1CLh-Vd.js → triangle-alert-CrOQEdJ2.js} +1 -1
- package/template/dist/client/assets/{wifi-BwXjnCqI.js → wifi-CwYSE0J4.js} +1 -1
- package/template/dist/client/assets/{x-BH2rJdFq.js → x-t615pnNR.js} +1 -1
- package/template/dist/client/content/index.html +5 -4
- package/template/dist/client/index.html +4 -3
- package/template/dist/client/merchant.html +18 -0
- package/template/dist/client/notifications/index.html +6 -5
- package/template/dist/client/tenant.html +18 -0
- package/template/dist/client/todos/index.html +6 -5
- package/template/dist/client/websocket/index.html +6 -5
- package/template/dist/cloudflare/chunk-HX7DVRDX.js +1 -0
- package/template/dist/cloudflare/{chunk-QBHAPWIA.js → chunk-IXJL2LE4.js} +1 -1
- package/template/dist/cloudflare/chunk-Q34AN3RF.js +14 -0
- package/template/dist/cloudflare/{chunk-BHPTQ4K2.js → chunk-ZAMVL4EG.js} +2 -2
- package/template/dist/cloudflare/cloudflare.js +35 -29
- package/template/dist/cloudflare/db-4AQOSFAX.js +1 -0
- package/template/dist/cloudflare/{migrator-2ZYYKNI5.js → migrator-TEPBVUFO.js} +1 -1
- package/template/dist/cloudflare/permission-service-impl-RE7NPW3Q.js +1 -0
- package/template/dist/cloudflare/schema-DVEMT3X2.js +1 -0
- package/template/dist/cloudflare/test-setup-Z2RYE5B4.js +265 -0
- package/template/dist/server/chunk-27SIJSPF.js +1 -0
- package/template/dist/server/chunk-37QNGBQU.js +1 -0
- package/template/dist/server/chunk-FIY4CGJJ.js +1 -0
- package/template/dist/server/chunk-HZUDBIT4.js +1 -0
- package/template/dist/server/chunk-I6OBDFDU.js +1 -0
- package/template/dist/server/chunk-JHNYLNG7.js +1 -0
- package/template/dist/server/chunk-MDOVVKKD.js +1 -0
- package/template/dist/server/chunk-NSOCT7E5.js +1 -0
- package/template/dist/server/chunk-OU5IGVVO.js +1 -0
- package/template/dist/server/chunk-OYCBNRMK.js +1 -0
- package/template/dist/server/chunk-P2RJNNGD.js +1 -0
- package/template/dist/server/chunk-UMAQLNPE.js +1 -0
- package/template/dist/server/chunk-XZZTSRSN.js +1 -0
- package/template/dist/server/content-service-5QVHDR5X.js +1 -0
- package/template/dist/server/db-FLI5L5DD.js +1 -0
- package/template/dist/server/dispute-service-E2FCYUEM.js +1 -0
- package/template/dist/server/init-72JXJV3I.js +46 -0
- package/template/dist/server/init-FWYXSKPX.js +46 -0
- package/template/dist/server/node.js +34 -28
- package/template/dist/server/order-service-TKGG5S5K.js +1 -0
- package/template/dist/server/permission-service-impl-M3AKEYNY.js +1 -0
- package/template/dist/server/schema-V4UG7HMU.js +1 -0
- package/template/dist/server/tenant-service-JG6UUWXQ.js +1 -0
- package/template/dist/server/tenant-service-XJWZSEDX.js +1 -0
- package/template/dist/{cloudflare/test-setup-NMZJZLRV.js → server/test-setup-VFOPBGYM.js} +83 -2
- package/template/dist/server/ticket-service-3RSW7V2Z.js +1 -0
- package/template/dist/server/todo-service-S6BGIO7D.js +1 -0
- package/template/src/merchant/pages/DisputesPage.tsx +11 -11
- package/template/src/merchant/pages/OrdersPage.tsx +4 -3
- package/template/src/merchant/pages/ProductsPage.tsx +2 -2
- package/template/src/merchant/stores/merchantStore.ts +11 -6
- package/template/src/server/db/init.ts +5 -642
- package/template/src/server/module-plugin/services/plugin-seed-service.ts +623 -0
- package/template/src/server/module-tenant/routes/tenant-routes.ts +2 -2
- package/template/src/server/module-tenant/services/tenant-service.ts +63 -17
- package/template/src/shared/modules/merchant/index.ts +9 -0
- package/template/src/shared/modules/merchant/schemas.ts +37 -0
- package/template/src/shared/modules/tenant/index.ts +2 -0
- package/template/src/shared/schemas/index.ts +27 -0
- package/template/src/tenant/layouts/Header.tsx +1 -1
- package/template/src/tenant/layouts/Sidebar.tsx +1 -1
- package/template/src/tenant/pages/SettingsPage.tsx +4 -8
- package/template/src/tenant/stores/tenantStore.ts +41 -302
- package/template/tsconfig.json +1 -0
- package/template/tsup.config.ts +11 -3
- package/template/dist/client/assets/ContentDetailPage-DdltMANL.js +0 -1
- package/template/dist/client/assets/ContentListPage-B63sUB6N.js +0 -1
- package/template/dist/client/assets/DashboardPage-tUMilc7Z.js +0 -11
- package/template/dist/client/assets/LoadingSpinner-DVYOLSRM.js +0 -6
- package/template/dist/client/assets/LoginPage-g9mSLIMC.js +0 -6
- package/template/dist/client/assets/NotificationPage-COTzp-HD.js +0 -1
- package/template/dist/client/assets/OrdersPage-BsPh4oEI.js +0 -11
- package/template/dist/client/assets/PluginsPage-BNtAe_yo.js +0 -6
- package/template/dist/client/assets/ProfilePage-dL_iSuZN.js +0 -16
- package/template/dist/client/assets/PublishPage-D96FnbLA.js +0 -1
- package/template/dist/client/assets/TopicsPage-DyLjZa4D.js +0 -6
- package/template/dist/client/assets/admin-Bh1vfz_L.js +0 -486
- package/template/dist/client/assets/index-1bA-ixFv.js +0 -114
- package/template/dist/client/assets/index-CWh3vXC_.css +0 -1
- package/template/dist/client/assets/main-DHnArIp_.js +0 -82
- package/template/dist/client/assets/pluginStore-XQfsm3iR.js +0 -1
- package/template/dist/client/content/content-1/index.html +0 -18
- package/template/dist/client/content/content-13/index.html +0 -18
- package/template/dist/client/content/content-14/index.html +0 -18
- package/template/dist/client/content/content-15/index.html +0 -18
- package/template/dist/client/content/content-19/index.html +0 -18
- package/template/dist/client/content/content-2/index.html +0 -18
- package/template/dist/client/content/content-20/index.html +0 -18
- package/template/dist/cloudflare/chunk-YY6FRMAQ.js +0 -14
- package/template/dist/cloudflare/db-7J42RQ3T.js +0 -1
- package/template/dist/cloudflare/permission-service-impl-TGXVSSSA.js +0 -1
|
@@ -1,59 +1,65 @@
|
|
|
1
|
-
import {b as b$2,a as a$2,c as c$2}from'./chunk-FMFYN7XK.js';import {v,e as e$1,g as g$1,f as f$1,k as k$1,l as l$2,D,x as x$1,y,z,A,B,w as w$1,i as i$1,j as j$1,a as a$1,t,m as m$1,n as n$1,o,p as p$2,q as q$1,r,s,u,h as h$2,c as c$1,d as d$1,b as b$3}from'./chunk-BHPTQ4K2.js';import {R,M as M$1,g,i,l as l$1,h as h$1,m,n,V,O,f,e,b as b$1,Q,d,p as p$1,q,y as y$1,j as j$2,k as k$2,S,A as A$1,F as F$1,G as G$1,J,a as a$3,P,N as N$1}from'./chunk-YY6FRMAQ.js';import'./chunk-QBHAPWIA.js';import {a,b,c as c$3}from'./chunk-5J6HXUF6.js';import Kn from'jsonwebtoken';import {timingSafeEqual,randomUUID,createHmac}from'crypto';import {stat,readFile,writeFile,unlink,mkdir}from'fs/promises';import {extname,join}from'path';import {existsSync}from'fs';import la from'bcryptjs';function ks(){let e=Date.now().toString(36).toUpperCase(),t=Math.random().toString(36).substring(2,6).toUpperCase();return `ORD${e}${t}`}function qs(){let e=Date.now().toString(36).toUpperCase(),t=Math.random().toString(36).substring(2,6).toUpperCase();return `TKT${e}${t}`}function js(){let e=Date.now().toString(36).toUpperCase(),t=Math.random().toString(36).substring(2,6).toUpperCase();return `DSP${e}${t}`}function he(e,t){return new Date(e.getTime()+Math.random()*(t.getTime()-e.getTime())).toISOString()}function ge(e){return e[Math.floor(Math.random()*e.length)]}var Ve=a(()=>{});function x(e,t){let r=parseInt(t.replace(`${e}-`,""),10);return isNaN(r)?-1:r}var Ge=a(()=>{});function An(e){Wt=e;}async function Ye(){Wt&&(await Wt.purge("/content"),await Wt.purgePattern("isr:/content/*"));}var Wt,Lr=a(()=>{Wt=null;});var Ht={};b(Ht,{archiveContent:()=>Wr,createContent:()=>Fr,deleteContent:()=>Br,getContentById:()=>Ze,getContents:()=>Je,publishContent:()=>$r,seedContentsIfEmpty:()=>bc,updateContent:()=>zr});async function bc(){let e=await R();if((await e.select().from(M$1).all()).length===0){let r=["article","announcement","tutorial","news","policy"],s=["draft","published","archived"],n=["\u7CFB\u7EDF\u5347\u7EA7\u516C\u544A","\u65B0\u529F\u80FD\u53D1\u5E03\u8BF4\u660E","\u7528\u6237\u4F7F\u7528\u6307\u5357","\u5E38\u89C1\u95EE\u9898\u89E3\u7B54","\u9690\u79C1\u653F\u7B56\u66F4\u65B0","\u670D\u52A1\u6761\u6B3E\u53D8\u66F4","\u5E73\u53F0\u64CD\u4F5C\u6559\u7A0B","\u6700\u4F73\u5B9E\u8DF5\u5206\u4EAB"],i=["\u7BA1\u7406\u5458","\u8FD0\u8425\u56E2\u961F","\u6280\u672F\u56E2\u961F","\u5BA2\u670D\u56E2\u961F"],a=[JSON.stringify(["\u7CFB\u7EDF","\u5347\u7EA7"]),JSON.stringify(["\u529F\u80FD","\u65B0\u7279\u6027"]),JSON.stringify(["\u6559\u7A0B","\u5E2E\u52A9"]),JSON.stringify(["FAQ","\u5E38\u89C1\u95EE\u9898"]),JSON.stringify(["\u653F\u7B56","\u9690\u79C1"]),JSON.stringify(["\u6761\u6B3E","\u670D\u52A1"]),JSON.stringify(["\u6559\u7A0B","\u64CD\u4F5C"]),JSON.stringify(["\u6700\u4F73\u5B9E\u8DF5","\u7ECF\u9A8C"])];for(let u=0;u<20;u++){let m=ge(r),f=ge(s),T=new Date(he(new Date("2024-01-01"),new Date)),v=f==="published";await e.insert(M$1).values({title:n[u%n.length],body:`\u8FD9\u662F${n[u%n.length]}\u7684\u8BE6\u7EC6\u5185\u5BB9\u3002\u8FD9\u91CC\u5305\u542B\u4E86\u5B8C\u6574\u7684\u6587\u7AE0\u5185\u5BB9\uFF0C\u7528\u6237\u53EF\u4EE5\u9605\u8BFB\u548C\u5B66\u4E60\u76F8\u5173\u77E5\u8BC6\u3002`,category:m,status:f,author:ge(i),tags:a[u%a.length],viewCount:Math.floor(Math.random()*1e3),likeCount:Math.floor(Math.random()*100),createdAt:T,updatedAt:new Date(he(T,new Date)),publishedAt:v?new Date(he(T,new Date)):null});}}}function Ce(e){return {id:`content-${e.id}`,title:e.title,content:e.body,category:e.category,status:e.status,author:e.author,tags:e.tags?JSON.parse(e.tags):[],viewCount:e.viewCount,likeCount:e.likeCount,createdAt:t(e.createdAt),updatedAt:t(e.updatedAt),publishedAt:e.publishedAt?t(e.publishedAt):void 0}}async function Je(e){let t=await R(),r=[];if(e?.category&&r.push(g(M$1.category,e.category)),e?.status&&r.push(g(M$1.status,e.status)),e?.search){let n=`%${e.search}%`;r.push(i(l$1(M$1.title,n),l$1(M$1.body,n),l$1(M$1.tags,n)));}return (r.length>0?await t.select().from(M$1).where(h$1(...r)).orderBy(m(M$1.createdAt)):await t.select().from(M$1).orderBy(m(M$1.createdAt))).map(Ce)}async function Ze(e){let t=await R(),r=x("content",e);if(r===-1)return null;let n=(await t.select().from(M$1).where(g(M$1.id,r)))[0];return n?Ce(n):null}async function Fr(e){let t=await R(),r=new Date,s=await t.insert(M$1).values({title:e.title,body:e.content,category:e.category,status:"draft",author:"\u7BA1\u7406\u5458",tags:e.tags?JSON.stringify(e.tags):null,viewCount:0,likeCount:0,createdAt:r,updatedAt:r}).returning();return Ce(s[0])}async function zr(e,t){let r=await R(),s=x("content",e);if(s===-1)return null;let n={updatedAt:new Date};t.title!==void 0&&t.title!==null&&(n.title=t.title),t.content!==void 0&&t.content!==null&&(n.body=t.content),t.category!==void 0&&t.category!==null&&(n.category=t.category),t.tags!==void 0&&t.tags!==null&&(n.tags=JSON.stringify(t.tags)),t.status!==void 0&&t.status!==null&&(n.status=t.status);let i=await r.update(M$1).set(n).where(g(M$1.id,s)).returning();return i.length===0?null:(Ye().catch(()=>{}),Ce(i[0]))}async function Br(e){let t=await R(),r=x("content",e);return r===-1?{success:false,message:"\u5185\u5BB9\u4E0D\u5B58\u5728"}:(await t.delete(M$1).where(g(M$1.id,r)).returning()).length===0?{success:false,message:"\u5185\u5BB9\u4E0D\u5B58\u5728"}:(Ye().catch(()=>{}),{success:true,message:"\u5185\u5BB9\u5DF2\u5220\u9664"})}async function $r(e){let t=await R(),r=x("content",e);if(r===-1)return null;let n=(await t.select().from(M$1).where(g(M$1.id,r)))[0];if(!n||n.status!=="draft")return null;let i=new Date,a=await t.update(M$1).set({status:"published",publishedAt:i,updatedAt:i}).where(g(M$1.id,r)).returning();return Ye().catch(()=>{}),Ce(a[0])}async function Wr(e){let t=await R(),r=x("content",e);if(r===-1)return null;let n=(await t.select().from(M$1).where(g(M$1.id,r)))[0];if(!n||n.status!=="published")return null;let i=await t.update(M$1).set({status:"archived",updatedAt:new Date}).where(g(M$1.id,r)).returning();return Ye().catch(()=>{}),Ce(i[0])}var Vt=a(()=>{n();V();O();v();Ve();Ge();Lr();});var W=class e extends Error{code;statusCode;details;cause;logLevel;timestamp;constructor(t){super(t.message),this.name="AppError",this.code=t.code,this.statusCode=t.statusCode,this.details=t.details,this.cause=t.cause,this.logLevel=t.logLevel??"warn",this.timestamp=new Date().toISOString(),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor);}toJSON(){return {success:false,error:this.message,code:this.code,status:this.statusCode,details:this.details,timestamp:this.timestamp}}static isAppError(t){return t instanceof e}},Oe=class extends W{constructor(t,r){super({code:"VALIDATION_ERROR",message:t,statusCode:400,details:r,logLevel:"info"}),this.name="ValidationError";}},Ne=class e extends W{constructor(t="Unauthorized",r="UNAUTHORIZED"){super({code:r,message:t,statusCode:401,logLevel:"warn"}),this.name="AuthenticationError";}static tokenExpired(){return new e("Token has expired","TOKEN_EXPIRED")}static tokenInvalid(){return new e("Invalid token","TOKEN_INVALID")}static tokenMissing(){return new e("Authentication token is required","TOKEN_MISSING")}},te=class e extends W{constructor(t="Forbidden",r){super({code:"FORBIDDEN",message:t,statusCode:403,details:r,logLevel:"warn"}),this.name="AuthorizationError";}static permissionDenied(t){return new e(t?`Permission denied: ${t}`:"Permission denied",t?[{message:`Missing required permission: ${t}`}]:void 0)}static insufficientRole(t,r){return new e("Insufficient role privileges",t&&r?[{message:`Role '${t}' does not meet required role '${r}'`}]:void 0)}},w=class e extends W{constructor(t,r){super({code:"NOT_FOUND",message:r?`${t} not found: ${r}`:`${t} not found`,statusCode:404,logLevel:"info"}),this.name="NotFoundError";}static user(t){return new e("User",t)}static order(t){return new e("Order",t)}static dispute(t){return new e("Dispute",t)}static ticket(t){return new e("Ticket",t)}};var ue=class e extends W{constructor(t,r="BUSINESS_ERROR",s){super({code:r,message:t,statusCode:422,details:s,logLevel:"info"}),this.name="BusinessError";}static invalidState(t,r){return new e("Invalid state transition","INVALID_STATE",[{message:`Current state '${t}' is not valid. Expected one of: ${r.join(", ")}`}])}static operationNotAllowed(t){return new e(`Operation not allowed: ${t}`,"OPERATION_NOT_ALLOWED")}};function go(e){let t;try{t=b$2();}catch{return}let r;try{r=e.getOpenAPIDocument({openapi:"3.0.0",info:{title:"API",version:"1.0.0"}});}catch{return}let s=r.paths;if(!s)return;let n=new Set;for(let[i,a]of Object.entries(s)){if(!a)continue;let u=a.get;if(!u?.responses)continue;let f=u.responses[200]?.content;if(!f)continue;let T="websocket"in f,v="text/event-stream"in f;if(T){let P=i.startsWith("/")?i:`/${i}`;n.has(P)||(t.handleWS(P),n.add(P));}if(v){let P=i.startsWith("/")?i:`/${i}`;n.has(P)||(t.handleSSE(P),n.add(P));}}}var yo=e=>{let r={...{origin:"*",allowMethods:["GET","HEAD","PUT","POST","DELETE","PATCH"],allowHeaders:[],exposeHeaders:[]},...e},s=(i=>typeof i=="string"?i==="*"?r.credentials?a=>a||null:()=>i:a=>i===a?a:null:typeof i=="function"?i:a=>i.includes(a)?a:null)(r.origin),n=(i=>typeof i=="function"?i:Array.isArray(i)?()=>i:()=>[])(r.allowMethods);return async function(a,u){function m(T,v){a.res.headers.set(T,v);}let f=await s(a.req.header("origin")||"",a);if(f&&m("Access-Control-Allow-Origin",f),r.credentials&&m("Access-Control-Allow-Credentials","true"),r.exposeHeaders?.length&&m("Access-Control-Expose-Headers",r.exposeHeaders.join(",")),a.req.method==="OPTIONS"){(r.origin!=="*"||r.credentials)&&m("Vary","Origin"),r.maxAge!=null&&m("Access-Control-Max-Age",r.maxAge.toString());let T=await n(a.req.header("origin")||"",a);T.length&&m("Access-Control-Allow-Methods",T.join(","));let v=r.allowHeaders;if(!v?.length){let P=a.req.header("Access-Control-Request-Headers");P&&(v=P.split(/\s*,\s*/));}return v?.length&&(m("Access-Control-Allow-Headers",v.join(",")),a.res.headers.append("Vary","Access-Control-Request-Headers")),a.res.headers.delete("Content-Length"),a.res.headers.delete("Content-Type"),new Response(null,{headers:a.res.headers,status:204,statusText:"No Content"})}await u(),(r.origin!=="*"||r.credentials)&&a.header("Vary","Origin",{append:true});}};var Wn={origin:process.env.CORS_ORIGIN?.split(",")||[],credentials:true,allowMethods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]};function er(e={}){let t={...Wn,...e};return yo(t)}f();var Hn={logRequests:true,logResponses:true,logErrors:true,excludePaths:["/health"]};function tr(e={}){let t={...Hn,...e},r=d("api");return async(s,n)=>{let{req:i}=s,a=new URL(i.url).pathname;if(t.excludePaths?.some(m=>a.startsWith(m)))return n();let u=Date.now();if(t.logRequests){let m={method:i.method,path:a,userAgent:i.header("user-agent")};r.info(m,"Request started");}try{if(await n(),t.logResponses){let m=Date.now()-u,f={method:i.method,path:a,status:s.res?.status,duration:`${m}ms`};r.info(f,"Request completed");}}catch(m){if(t.logErrors){let f=Date.now()-u,T={method:i.method,path:a,error:m instanceof Error?m.message:"Unknown error",duration:`${f}ms`};r.error(T,"Request failed");}throw m}}}f();var Vn={includeStackTrace:false,logErrors:true};function Gn(e){return e.issues.map(t=>({field:t.path.join("."),message:t.message,code:t.code}))}function rr(e,t,r){let s={success:false,error:t,status:e};return r&&(s.details=r),s}function or(e={}){let t={...Vn,...e},r=d("api");return async(s,n)=>{try{await n();}catch(i){if(s.res.headers.set("Content-Type","application/json"),W.isAppError(i)){if(t.logErrors){let m={errorType:i.name,code:i.code,message:i.message,status:i.statusCode,path:s.req.path,method:s.req.method};r.warn(m,i.message);}return s.json(rr(i.statusCode,i.message,i.details),i.statusCode)}if(i instanceof d$1){let m=Gn(i);if(t.logErrors){let f={errorType:"ZodError",errors:m,path:s.req.path,method:s.req.method};r.warn(f,"Validation error");}return s.json(rr(400,"Validation failed",m),400)}if(i instanceof c$1){if(t.logErrors){let T={errorType:"HTTPException",error:i.message,status:i.status,path:s.req.path,method:s.req.method,cause:i.cause};r.warn(T,"HTTP exception");}let m=i.status||500,f=i.message||"Internal server error";return s.json(rr(m,f),m)}if(t.logErrors){let m={errorType:"UnknownError",error:i instanceof Error?i.message:"Unknown error",stack:i instanceof Error?i.stack:void 0,path:s.req.path,method:s.req.method};r.error(m,"Unhandled error");}let u={success:false,error:i instanceof Error?i.message:"Internal server error",status:500};return t.includeStackTrace&&i instanceof Error&&i.stack&&(u.stack=i.stack),s.json(u,500)}}}f();var ot="dev-secret-key-change-in-production",So=process.env.AUTH_SECRET_KEY||ot;So===ot&&console.error(`\u26A0\uFE0F SECURITY WARNING: AUTH_SECRET_KEY is using the default value in production!
|
|
1
|
+
import {b as b$2,a as a$2,c as c$2}from'./chunk-FMFYN7XK.js';import {v,e as e$1,g as g$1,f as f$1,k,l as l$2,D,x,y,z as z$1,A,B,w as w$1,i as i$2,j,a as a$1,t,m as m$1,n as n$1,o,p as p$1,q,r as r$1,s,u,h as h$2,c as c$1,d as d$1,b as b$3}from'./chunk-ZAMVL4EG.js';import {i,m,f,e,b as b$1,h as h$1,d,j as j$2,a as a$3,g as g$2}from'./chunk-HX7DVRDX.js';import {$ as $$1,g,i as i$1,l as l$1,h,n,r,ja as ja$1,E as E$1,F,N,j as j$1,k as k$1,P,U as U$1,V,Y,aa as aa$1,ca as ca$1,m as m$2,fa as fa$1,ga as ga$1,da as da$1,ea as ea$1,ia as ia$1}from'./chunk-Q34AN3RF.js';import {y as y$1}from'./chunk-IXJL2LE4.js';import {a,b,c as c$3}from'./chunk-5J6HXUF6.js';import Pc from'jsonwebtoken';import {timingSafeEqual,randomUUID,createHmac}from'crypto';import {stat,readFile,writeFile,unlink,mkdir}from'fs/promises';import {extname,join}from'path';import {existsSync}from'fs';import uo,{hashSync,compareSync}from'bcryptjs';function is(){let e=Date.now().toString(36).toUpperCase(),t=Math.random().toString(36).substring(2,6).toUpperCase();return `ORD${e}${t}`}function as(){let e=Date.now().toString(36).toUpperCase(),t=Math.random().toString(36).substring(2,6).toUpperCase();return `TKT${e}${t}`}function cs(){let e=Date.now().toString(36).toUpperCase(),t=Math.random().toString(36).substring(2,6).toUpperCase();return `DSP${e}${t}`}function be(e,t){return new Date(e.getTime()+Math.random()*(t.getTime()-e.getTime())).toISOString()}function ve(e){return e[Math.floor(Math.random()*e.length)]}var $e=a(()=>{});function I(e,t){let n=parseInt(t.replace(`${e}-`,""),10);return isNaN(n)?-1:n}var Tt=a(()=>{});function Sa(e){Gr=e;}async function At(){Gr&&(await Gr.purge("/content"),await Gr.purgePattern("isr:/content/*"));}var Gr,go=a(()=>{Gr=null;});var Kr={};b(Kr,{archiveContent:()=>wo,createContent:()=>ho,deleteContent:()=>yo,getContentById:()=>Pt,getContents:()=>Et,publishContent:()=>So,seedContentsIfEmpty:()=>ad,updateContent:()=>fo});async function ad(){let e=await i();if((await e.select().from($$1)).length===0){let n=["article","announcement","tutorial","news","policy"],o=["draft","published","archived"],s=["\u7CFB\u7EDF\u5347\u7EA7\u516C\u544A","\u65B0\u529F\u80FD\u53D1\u5E03\u8BF4\u660E","\u7528\u6237\u4F7F\u7528\u6307\u5357","\u5E38\u89C1\u95EE\u9898\u89E3\u7B54","\u9690\u79C1\u653F\u7B56\u66F4\u65B0","\u670D\u52A1\u6761\u6B3E\u53D8\u66F4","\u5E73\u53F0\u64CD\u4F5C\u6559\u7A0B","\u6700\u4F73\u5B9E\u8DF5\u5206\u4EAB"],i=["\u7BA1\u7406\u5458","\u8FD0\u8425\u56E2\u961F","\u6280\u672F\u56E2\u961F","\u5BA2\u670D\u56E2\u961F"],a=[JSON.stringify(["\u7CFB\u7EDF","\u5347\u7EA7"]),JSON.stringify(["\u529F\u80FD","\u65B0\u7279\u6027"]),JSON.stringify(["\u6559\u7A0B","\u5E2E\u52A9"]),JSON.stringify(["FAQ","\u5E38\u89C1\u95EE\u9898"]),JSON.stringify(["\u653F\u7B56","\u9690\u79C1"]),JSON.stringify(["\u6761\u6B3E","\u670D\u52A1"]),JSON.stringify(["\u6559\u7A0B","\u64CD\u4F5C"]),JSON.stringify(["\u6700\u4F73\u5B9E\u8DF5","\u7ECF\u9A8C"])];for(let d=0;d<25;d++){let m=ve(n),h=ve(o),b=new Date(be(new Date("2024-01-01"),new Date)),v=h==="published";await e.insert($$1).values({title:s[d%s.length],body:`\u8FD9\u662F${s[d%s.length]}\u7684\u8BE6\u7EC6\u5185\u5BB9\u3002\u8FD9\u91CC\u5305\u542B\u4E86\u5B8C\u6574\u7684\u6587\u7AE0\u5185\u5BB9\uFF0C\u7528\u6237\u53EF\u4EE5\u9605\u8BFB\u548C\u5B66\u4E60\u76F8\u5173\u77E5\u8BC6\u3002`,category:m,status:h,author:ve(i),tags:a[d%a.length],viewCount:Math.floor(Math.random()*1e3),likeCount:Math.floor(Math.random()*100),createdAt:b,updatedAt:new Date(be(b,new Date)),publishedAt:v?new Date(be(b,new Date)):null});}}}function Ke(e){return {id:`content-${e.id}`,title:e.title,content:e.body,category:e.category,status:e.status,author:e.author,tags:e.tags?JSON.parse(e.tags):[],viewCount:e.viewCount,likeCount:e.likeCount,createdAt:t(e.createdAt),updatedAt:t(e.updatedAt),publishedAt:e.publishedAt?t(e.publishedAt):void 0}}async function Et(e){let t=await i(),n$1=[];if(e?.category&&n$1.push(g($$1.category,e.category)),e?.status&&n$1.push(g($$1.status,e.status)),e?.search){let s=`%${e.search}%`;n$1.push(i$1(l$1($$1.title,s),l$1($$1.body,s),l$1($$1.tags,s)));}return (n$1.length>0?await t.select().from($$1).where(h(...n$1)).orderBy(n($$1.createdAt)):await t.select().from($$1).orderBy(n($$1.createdAt))).map(Ke)}async function Pt(e){let t=await i(),n=I("content",e);if(n===-1)return null;let s=(await t.select().from($$1).where(g($$1.id,n)))[0];return s?Ke(s):null}async function ho(e){let t=await i(),n=new Date,o=await t.insert($$1).values({title:e.title,body:e.content,category:e.category,status:"draft",author:"\u7BA1\u7406\u5458",tags:e.tags?JSON.stringify(e.tags):null,viewCount:0,likeCount:0,createdAt:n,updatedAt:n}).returning();return Ke(o[0])}async function fo(e,t){let n=await i(),o=I("content",e);if(o===-1)return null;let s={updatedAt:new Date};t.title!==void 0&&t.title!==null&&(s.title=t.title),t.content!==void 0&&t.content!==null&&(s.body=t.content),t.category!==void 0&&t.category!==null&&(s.category=t.category),t.tags!==void 0&&t.tags!==null&&(s.tags=JSON.stringify(t.tags)),t.status!==void 0&&t.status!==null&&(s.status=t.status);let i$1=await n.update($$1).set(s).where(g($$1.id,o)).returning();return i$1.length===0?null:(At().catch(a=>{console.warn("ISR content pages purge failed after update:",a);}),Ke(i$1[0]))}async function yo(e){let t=await i(),n=I("content",e);return n===-1?{success:false,message:"\u5185\u5BB9\u4E0D\u5B58\u5728"}:(await t.delete($$1).where(g($$1.id,n)).returning()).length===0?{success:false,message:"\u5185\u5BB9\u4E0D\u5B58\u5728"}:(At().catch(s=>{console.warn("ISR content pages purge failed after delete:",s);}),{success:true,message:"\u5185\u5BB9\u5DF2\u5220\u9664"})}async function So(e){let t=await i(),n=I("content",e);if(n===-1)return null;let s=(await t.select().from($$1).where(g($$1.id,n)))[0];if(!s||s.status!=="draft")return null;let i$1=new Date,a=await t.update($$1).set({status:"published",publishedAt:i$1,updatedAt:i$1}).where(g($$1.id,n)).returning();return At().catch(d=>{console.warn("ISR content pages purge failed after publish:",d);}),Ke(a[0])}async function wo(e){let t=await i(),n=I("content",e);if(n===-1)return null;let s=(await t.select().from($$1).where(g($$1.id,n)))[0];if(!s||s.status!=="published")return null;let i$1=await t.update($$1).set({status:"archived",updatedAt:new Date}).where(g($$1.id,n)).returning();return At().catch(a=>{console.warn("ISR content pages purge failed after archive:",a);}),Ke(i$1[0])}var Qr=a(()=>{r();m();ja$1();v();$e();Tt();go();});var X=class e extends Error{code;statusCode;details;cause;logLevel;timestamp;constructor(t){super(t.message),this.name="AppError",this.code=t.code,this.statusCode=t.statusCode,this.details=t.details,this.cause=t.cause,this.logLevel=t.logLevel??"warn",this.timestamp=new Date().toISOString(),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor);}toJSON(){return {success:false,error:this.message,code:this.code,status:this.statusCode,details:this.details,timestamp:this.timestamp}}static isAppError(t){return t instanceof e}},Ee=class extends X{constructor(t,n){super({code:"VALIDATION_ERROR",message:t,statusCode:400,details:n,logLevel:"info"}),this.name="ValidationError";}},fe=class e extends X{constructor(t="Unauthorized",n="UNAUTHORIZED"){super({code:n,message:t,statusCode:401,logLevel:"warn"}),this.name="AuthenticationError";}static tokenExpired(){return new e("Token has expired","TOKEN_EXPIRED")}static tokenInvalid(){return new e("Invalid token","TOKEN_INVALID")}static tokenMissing(){return new e("Authentication token is required","TOKEN_MISSING")}},G=class e extends X{constructor(t="Forbidden",n){super({code:"FORBIDDEN",message:t,statusCode:403,details:n,logLevel:"warn"}),this.name="AuthorizationError";}static permissionDenied(t){return new e(t?`Permission denied: ${t}`:"Permission denied",t?[{message:`Missing required permission: ${t}`}]:void 0)}static insufficientRole(t,n){return new e("Insufficient role privileges",t&&n?[{message:`Role '${t}' does not meet required role '${n}'`}]:void 0)}},w=class e extends X{constructor(t,n){super({code:"NOT_FOUND",message:n?`${t} not found: ${n}`:`${t} not found`,statusCode:404,logLevel:"info"}),this.name="NotFoundError";}static user(t){return new e("User",t)}static order(t){return new e("Order",t)}static dispute(t){return new e("Dispute",t)}static ticket(t){return new e("Ticket",t)}static tenant(t){return new e("Tenant",t)}},ce=class e extends X{constructor(t,n){super({code:"CONFLICT",message:t,statusCode:409,details:n,logLevel:"info"}),this.name="ConflictError";}static duplicateEntry(t,n){return new e(`Duplicate entry for ${t}`,[{field:t,message:`Value '${n}' already exists`}])}},Pe=class e extends X{constructor(t,n="BUSINESS_ERROR",o){super({code:n,message:t,statusCode:422,details:o,logLevel:"info"}),this.name="BusinessError";}static invalidState(t,n){return new e("Invalid state transition","INVALID_STATE",[{message:`Current state '${t}' is not valid. Expected one of: ${n.join(", ")}`}])}static operationNotAllowed(t){return new e(`Operation not allowed: ${t}`,"OPERATION_NOT_ALLOWED")}};function Vo(e){let t;try{t=b$2();}catch{return}let n;try{n=e.getOpenAPIDocument({openapi:"3.0.0",info:{title:"API",version:"1.0.0"}});}catch{return}let o=n.paths;if(!o)return;let s=new Set;for(let[i,a]of Object.entries(o)){if(!a)continue;let d=a.get;if(!d?.responses)continue;let h=d.responses[200]?.content;if(!h)continue;let b="websocket"in h,v="text/event-stream"in h;if(b){let T=i.startsWith("/")?i:`/${i}`;s.has(T)||(t.handleWS(T),s.add(T));}if(v){let T=i.startsWith("/")?i:`/${i}`;s.has(T)||(t.handleSSE(T),s.add(T));}}}var Go=e=>{let n={...{origin:"*",allowMethods:["GET","HEAD","PUT","POST","DELETE","PATCH"],allowHeaders:[],exposeHeaders:[]},...e},o=(i=>typeof i=="string"?i==="*"?n.credentials?a=>a||null:()=>i:a=>i===a?a:null:typeof i=="function"?i:a=>i.includes(a)?a:null)(n.origin),s=(i=>typeof i=="function"?i:Array.isArray(i)?()=>i:()=>[])(n.allowMethods);return async function(a,d){function m(b,v){a.res.headers.set(b,v);}let h=await o(a.req.header("origin")||"",a);if(h&&m("Access-Control-Allow-Origin",h),n.credentials&&m("Access-Control-Allow-Credentials","true"),n.exposeHeaders?.length&&m("Access-Control-Expose-Headers",n.exposeHeaders.join(",")),a.req.method==="OPTIONS"){(n.origin!=="*"||n.credentials)&&m("Vary","Origin"),n.maxAge!=null&&m("Access-Control-Max-Age",n.maxAge.toString());let b=await s(a.req.header("origin")||"",a);b.length&&m("Access-Control-Allow-Methods",b.join(","));let v=n.allowHeaders;if(!v?.length){let T=a.req.header("Access-Control-Request-Headers");T&&(v=T.split(/\s*,\s*/));}return v?.length&&(m("Access-Control-Allow-Headers",v.join(",")),a.res.headers.append("Vary","Access-Control-Request-Headers")),a.res.headers.delete("Content-Length"),a.res.headers.delete("Content-Type"),new Response(null,{headers:a.res.headers,status:204,statusText:"No Content"})}await d(),(n.origin!=="*"||n.credentials)&&a.header("Vary","Origin",{append:true});}};var Tc={origin:process.env.CORS_ORIGIN?.split(",")||[],credentials:true,allowMethods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]};function nn(e={}){let t={...Tc,...e};return Go(t)}f();var Cc={logRequests:true,logResponses:true,logErrors:true,excludePaths:["/health"]};function on(e={}){let t={...Cc,...e},n=d("api");return async(o,s)=>{let{req:i}=o,a=new URL(i.url).pathname;if(t.excludePaths?.some(m=>a.startsWith(m)))return s();let d=Date.now();if(t.logRequests){let m={method:i.method,path:a,userAgent:i.header("user-agent")};n.info(m,"Request started");}try{if(await s(),t.logResponses){let m=Date.now()-d,h={method:i.method,path:a,status:o.res?.status,duration:`${m}ms`};n.info(h,"Request completed");}}catch(m){if(t.logErrors){let h=Date.now()-d,b={method:i.method,path:a,error:m instanceof Error?m.message:"Unknown error",duration:`${h}ms`};n.error(b,"Request failed");}throw m}}}f();var Ac={includeStackTrace:false,logErrors:true};function Ec(e){return e.issues.map(t=>({field:t.path.join("."),message:t.message,code:t.code}))}function sn(e,t,n){let o={success:false,error:t,status:e};return n&&(o.details=n),o}function an(e={}){let t={...Ac,...e},n=d("api");return async(o,s)=>{try{await s();}catch(i){if(o.res.headers.set("Content-Type","application/json"),X.isAppError(i)){if(t.logErrors){let m={errorType:i.name,code:i.code,message:i.message,status:i.statusCode,path:o.req.path,method:o.req.method};n.warn(m,i.message);}return o.json(sn(i.statusCode,i.message,i.details),i.statusCode)}if(i instanceof d$1){let m=Ec(i);if(t.logErrors){let h={errorType:"ZodError",errors:m,path:o.req.path,method:o.req.method};n.warn(h,"Validation error");}return o.json(sn(400,"Validation failed",m),400)}if(i instanceof c$1){if(t.logErrors){let b={errorType:"HTTPException",error:i.message,status:i.status,path:o.req.path,method:o.req.method,cause:i.cause};n.warn(b,"HTTP exception");}let m=i.status||500,h=i.message||"Internal server error";return o.json(sn(m,h),m)}if(t.logErrors){let m={errorType:"UnknownError",error:i instanceof Error?i.message:"Unknown error",stack:i instanceof Error?i.stack:void 0,path:o.req.path,method:o.req.method};n.error(m,"Unhandled error");}let d={success:false,error:i instanceof Error?i.message:"Internal server error",status:500};return t.includeStackTrace&&i instanceof Error&&i.stack&&(d.stack=i.stack),o.json(d,500)}}}f();var qt="dev-secret-key-change-in-production",Ko=process.env.AUTH_SECRET_KEY||qt;Ko===qt&&console.error(`\u26A0\uFE0F SECURITY WARNING: AUTH_SECRET_KEY is using the default value in production!
|
|
2
2
|
Please set a strong AUTH_SECRET_KEY environment variable.
|
|
3
|
-
Dev tokens should NEVER be used in production.`);var
|
|
3
|
+
Dev tokens should NEVER be used in production.`);var Qo=()=>process.env.ENABLE_DEV_TOKENS==="true"?true:(process.env.ENABLE_DEV_TOKENS==="false",false);Qo()&&console.warn("\u26A0\uFE0F WARNING: Dev tokens are ENABLED. Do not use in production!");function Ic(e){return !e||!e.startsWith("Bearer ")?null:e.slice(7)}function Dc(e){return e==="admin-token"||e==="super-admin-token"?{id:"super-admin-1",username:"superadmin",email:"superadmin@example.com",role:"super_admin",permissions:h$2("super_admin")}:e==="customer-service-token"?{id:"customer-service-1",username:"customerservice",email:"cs@example.com",role:"customer_service",permissions:h$2("customer_service")}:e==="user-token"?{id:"user-1",username:"user",email:"user@example.com",role:"user",permissions:h$2("user")}:e.startsWith("test-super-admin-")?{id:e,username:`superadmin-${e}`,email:`superadmin-${e}@example.com`,role:"super_admin",permissions:h$2("super_admin")}:e.startsWith("test-customer-service-")?{id:e,username:`cs-${e}`,email:`cs-${e}@example.com`,role:"customer_service",permissions:h$2("customer_service")}:e.startsWith("test-user-")?{id:e,username:`user-${e}`,email:`user-${e}@example.com`,role:"user",permissions:h$2("user")}:null}function kc(e,t){if(t===qt&&Qo()){let n=Dc(e);if(n)return d("auth").warn({userId:n.id,role:n.role},"DEV TOKEN USED - This should not appear in production!"),n}if(t!==qt)try{let n=Pc.verify(e,t);return {id:n.userId,username:n.username,email:n.email,role:n.role,permissions:h$2(n.role)}}catch{return null}return null}function S(e={}){let t=e.secretKey??Ko,n=d("auth");return async(o,s)=>{let i=o.req.header("Authorization"),a=Ic(i);if(!a)throw n.warn({path:o.req.path,method:o.req.method},"Missing auth token"),fe.tokenMissing();let d=kc(a,t);if(!d)throw n.warn({path:o.req.path,method:o.req.method},"Invalid auth token"),fe.tokenInvalid();if(n.info({userId:d.id,role:d.role,path:o.req.path},"User authenticated"),e.requiredRole){let m={super_admin:3,customer_service:2,user:1},h=m[d.role],b=m[e.requiredRole];if(h<b)throw n.warn({path:o.req.path,method:o.req.method,userRole:d.role,requiredRole:e.requiredRole},"Insufficient role"),G.insufficientRole(d.role,e.requiredRole)}if(e.requiredPermissions&&e.requiredPermissions.length>0){let{permissionService:m}=await import('./permission-service-impl-RE7NPW3Q.js');for(let h of e.requiredPermissions)if(!await m.hasPermission(d.id,h,d.role))throw n.warn({path:o.req.path,method:o.req.method,userId:d.id,requiredPermission:h},"Insufficient permission"),G.permissionDenied(h)}o.set("authUser",d),await s();}}var Jo=1e3,Oc=300*1e3,ue=new Map;function Nc(){let e=Date.now();for(let[t,n]of ue)e-n.createdAt>Oc&&ue.delete(t);if(ue.size>Jo){let n=[...ue.entries()].sort((o,s)=>o[1].createdAt-s[1].createdAt).slice(0,ue.size-Jo);for(let[o]of n)ue.delete(o);}}function cn(e={}){let{skipPaths:t=["/api/captcha","/api/verify-captcha","/api/admin/login","/api/admin/register"],maxRequests:n=10,windowMs:o=6e4,forceEnabled:s=false}=e;return async(i,a)=>{Nc();let m=i.req.path;if(t.some(T=>m.startsWith(T)))return a();let h=a$1(i,"session_id")||jc();a$1(i,"session_id")||b$3(i,"session_id",h,{httpOnly:true,secure:true,sameSite:"Strict",maxAge:86400});let b=Date.now(),v=ue.get(h)||{verified:false,requestCount:0,windowStart:b,createdAt:b};return b-v.windowStart>o&&(v.requestCount=0,v.windowStart=b),v.requestCount++,ue.set(h,v),v.verified&&v.verifiedAt&&b-v.verifiedAt<3e5?a():v.requestCount>n?i.json({success:false,error:"\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u5B8C\u6210\u9A8C\u8BC1\u7801\u9A8C\u8BC1",needCaptcha:true},429):qc(i,s)?i.json({success:false,error:"\u68C0\u6D4B\u5230\u53EF\u7591\u884C\u4E3A\uFF0C\u8BF7\u5B8C\u6210\u9A8C\u8BC1\u7801\u9A8C\u8BC1",needCaptcha:true},403):a()}}function jc(){return randomUUID()}function qc(e,t=false){let n=e.req.header("User-Agent")||"";return !!(!n||n.length<10||n.toLowerCase().includes("bot")||n.toLowerCase().includes("crawler"))}function un(e){let t=ue.get(e);t&&(t.verified=true,t.verifiedAt=Date.now(),t.requestCount=0,t.windowStart=Date.now(),ue.set(e,t));}var Mc=[{id:"1",username:"superadmin",email:"superadmin@example.com",role:"super_admin",status:"active",avatar:"https://api.dicebear.com/7.x/avataaars/svg?seed=superadmin",createdAt:"2024-01-01T00:00:00Z",updatedAt:"2024-01-01T00:00:00Z"},{id:"2",username:"customerservice",email:"customerservice@example.com",role:"customer_service",status:"active",avatar:"https://api.dicebear.com/7.x/avataaars/svg?seed=customerservice",createdAt:"2024-01-02T00:00:00Z",updatedAt:"2024-01-02T00:00:00Z"},{id:"3",username:"user1",email:"user1@example.com",role:"user",status:"active",avatar:"https://api.dicebear.com/7.x/avataaars/svg?seed=user1",createdAt:"2024-01-03T00:00:00Z",updatedAt:"2024-01-03T00:00:00Z"}],Lc=new Map([["super-admin-token","1"],["customer-service-token","2"],["user-token","3"]]),_c=new Map;function U(e){return e.get("authUser")}function Re(){return Mc}function Yo(){return Lc}function pn(){return _c}f();e.api();var Mt=new Map,Zo=Date.now();function zc(){let e=Date.now();if(!(e-Zo<6e4)){Zo=e;for(let[t,n]of Mt)n.resetAt<=e&&Mt.delete(t);}}function Le(e={}){let t=e.windowMs??6e4,n=e.max??100,o=e.message??"Too many requests";return async(s,i)=>{zc();let a=s.req.header("x-forwarded-for")?.split(",")[0]?.trim()||s.req.header("x-real-ip")||"unknown",d=Date.now(),m=Mt.get(a);if(m&&m.resetAt>d&&m.count>=n)return s.header("Retry-After",String(Math.ceil((m.resetAt-d)/1e3))),s.json({success:false,error:o},429);!m||m.resetAt<=d?Mt.set(a,{count:1,resetAt:d+t}):m.count++,await i();}}var _e=Le({windowMs:15*6e4,max:5,message:"Too many attempts, please try again later"}),Xo=Le({windowMs:6e4,max:20,message:"Too many upload requests, please slow down"});Le({windowMs:6e4,max:100});b$1();function ze(){let e=new Map,t=new Map,n=new Map,o=new Map,s=(m,h=[],b="notification")=>{let v=JSON.stringify(m),T=`event: ${b}
|
|
4
4
|
data: ${v}
|
|
5
5
|
|
|
6
|
-
`;for(let[
|
|
6
|
+
`;for(let[j,ne]of e)if(!h.includes(j))try{ne.send({type:b,payload:m});}catch{e.delete(j);}for(let[j,ne]of t)if(!h.includes(j))try{ne.send(T);}catch{t.delete(j);}};return {wsClients:e,sseClients:t,broadcast:s,handleWSMessage:(m,h)=>{let b=e.get(m);if(b){if(typeof h=="object"&&h!==null&&"method"in h&&"id"in h){let v=h,T=n.get(v.method);if(T)try{let j=T(v.params,m);b.send({id:v.id,result:j});}catch(j){b.send({id:v.id,error:j instanceof Error?j.message:"Unknown error"});}else b.send({id:v.id,error:`Unknown method: ${v.method}`});return}if(typeof h=="object"&&h!==null&&"type"in h){let v=h,T=o.get(v.type);T&&T(v.payload,m,s);}}},registerRPCHandler:(m,h)=>{n.set(m,h);},registerEventHandler:(m,h)=>{o.set(m,h);}}}var Lt=class{core;constructor(t){this.core=ze();}async fetch(t){let n=new URL(t.url);return t.headers.get("Upgrade")==="websocket"?this.handleWebSocketRequest(t):t.headers.get("Accept")?.includes("text/event-stream")?this.handleSSERequest():n.pathname==="/broadcast"&&t.method==="POST"?this.handleBroadcast(t):n.pathname==="/send"&&t.method==="POST"?this.handleSend(t):n.pathname==="/size"?Response.json({wsClients:this.core.wsClients.size,sseClients:this.core.sseClients.size}):new Response("Not Found",{status:404})}async handleWebSocketRequest(t){let n=new WebSocketPair,[o,s]=Object.values(n);s.accept();let i=crypto.randomUUID();return this.core.wsClients.set(i,{id:i,send:a=>{try{s.send(JSON.stringify(a));}catch{this.core.wsClients.delete(i);}},close:()=>{s.close(),this.core.wsClients.delete(i);}}),s.addEventListener("message",a=>{try{let d=JSON.parse(a.data);this.core.handleWSMessage(i,d);}catch{}}),s.addEventListener("close",()=>{this.core.wsClients.delete(i);}),this.core.wsClients.get(i)?.send({type:"connected",payload:{timestamp:Date.now()}}),new Response(null,{status:101,webSocket:o})}async handleSSERequest(){let t=crypto.randomUUID(),n=null,o=true;console.warn(`[SSE-DO] New connection, clientId: ${t}, current sseClients: ${this.core.sseClients.size}`);let s=a=>{o&&(n=setTimeout(()=>{if(o)try{a.enqueue(new TextEncoder().encode(`:ping
|
|
7
7
|
|
|
8
|
-
`)),
|
|
8
|
+
`)),s(a);}catch{o=false,this.core.sseClients.delete(t);}},3e4));},i=new ReadableStream({start:a=>{this.core.sseClients.set(t,{id:t,send:m=>{try{a.enqueue(new TextEncoder().encode(m));}catch{this.core.sseClients.delete(t);}}}),console.warn(`[SSE-DO] Client added, total sseClients: ${this.core.sseClients.size}`);let d=`event: connected
|
|
9
9
|
data: ${JSON.stringify({timestamp:Date.now()})}
|
|
10
10
|
|
|
11
|
-
`;a.enqueue(new TextEncoder().encode(
|
|
11
|
+
`;a.enqueue(new TextEncoder().encode(d)),s(a);},cancel:()=>{console.warn(`[SSE-DO] Connection cancelled, clientId: ${t}`),o=false,n&&(clearTimeout(n),n=null),this.core.sseClients.delete(t);}});return new Response(i,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no"}})}async handleBroadcast(t){console.warn("[RealtimeDO] handleBroadcast called");let n=await t.clone().json();return n.event?(console.warn(`[RealtimeDO] broadcasting event: ${n.event}, data: ${JSON.stringify(n.data)}, sseClients: ${this.core.sseClients.size}`),this.core.broadcast(n.data,n.exclude||[],n.event),Response.json({success:true,wsRecipients:this.core.wsClients.size,sseRecipients:this.core.sseClients.size})):Response.json({success:false,error:"event is required"},{status:400})}async handleSend(t){let n=await t.clone().json(),o=this.core.wsClients.get(n.clientId)||this.core.sseClients.get(n.clientId);if(o)try{return o.send(n.data),Response.json({success:!0})}catch{return Response.json({success:false,error:"Failed to send"})}return Response.json({success:false,error:"Client not found"})}};function dn(e){return {path:e,get adapter(){return c$2.adapter},registerRPC(t,n){let o=(s,i)=>n(s,i);c$2.registerRPC(t,o);},registerEvent(t,n){let o=(s,i)=>{n(s,i);};c$2.registerEvent(t,o);},broadcast(t,n,o){c$2.broadcast(t,n,o);}}}function ee(){return typeof globalThis<"u"&&globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():randomUUID()}var mn=class{id;ws;constructor(t){this.id=crypto.randomUUID(),this.ws=t;}send(t){this.ws.send(JSON.stringify(t));}close(){this.ws.close();}},_t=class{platform={name:"cloudflare",isCloudflare:true,isNode:false};core;wsPaths=new Set;ssePaths=new Set;constructor(){this.core=ze();}handleWS(t){this.wsPaths.add(t);}handleSSE(t){this.ssePaths.add(t);}getWSConnections(){return this.core.wsClients}getSSEConnections(){return this.core.sseClients}broadcast(t,n,o=[]){console.warn(`[Broadcast] event: ${t}, data: ${JSON.stringify(n)}, exclude: ${o}, sseClients: ${this.core.sseClients.size}`),this.core.broadcast(n,o,t);}registerRPC(t,n){this.core.registerRPCHandler(t,n);}registerEvent(t,n){this.core.registerEventHandler(t,(o,s,i)=>{n(o,s);});}hasWSPath(t){return this.wsPaths.has(t)}hasSSEPath(t){return this.ssePaths.has(t)}async handleWebSocketRequest(t){let n=new WebSocketPair,[o,s]=Object.values(n);s.accept();let i=new mn(s);return this.core.wsClients.set(i.id,i),s.addEventListener("message",a=>{try{let d=JSON.parse(a.data);this.core.handleWSMessage(i.id,d);}catch{}}),s.addEventListener("close",()=>{this.core.wsClients.delete(i.id);}),i.send({type:"connected",payload:{timestamp:Date.now()}}),new Response(null,{status:101,webSocket:o})}async handleSSERequest(){let t=crypto.randomUUID(),n=null,o=true;console.warn(`[SSE] New connection, clientId: ${t}, current sseClients: ${this.core.sseClients.size}`);let s=a=>{o&&(n=setTimeout(()=>{if(o)try{a.enqueue(new TextEncoder().encode(`:ping
|
|
12
12
|
|
|
13
|
-
`)),
|
|
13
|
+
`)),s(a);}catch{o=false,this.core.sseClients.delete(t);}},3e4));},i=new ReadableStream({start:a=>{this.core.sseClients.set(t,{id:t,send:m=>{try{a.enqueue(new TextEncoder().encode(m));}catch{this.core.sseClients.delete(t);}}}),console.warn(`[SSE] Client added, total sseClients: ${this.core.sseClients.size}`);let d=`event: connected
|
|
14
14
|
data: ${JSON.stringify({timestamp:Date.now()})}
|
|
15
15
|
|
|
16
|
-
`;a.enqueue(new TextEncoder().encode(u)),n(a);},cancel:()=>{console.warn(`[SSE] Connection cancelled, clientId: ${t}`),s=false,r&&(clearTimeout(r),r=null),this.core.sseClients.delete(t);}});return new Response(i,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no"}})}async handleBroadcastRequest(t){let r=await t.json(),s=r.event||"notification";return this.core.broadcast(r.data,r.exclude||[],s),Response.json({success:true,wsRecipients:this.core.wsClients.size,sseRecipients:this.core.sseClients.size})}},cr=null;function ur(){return cr||(cr=new it),cr}var at=null,ct=null;function bo(e){at=e,ct=null;}function ii(){return a$3&&at?.REALTIME_DO?{async broadcast(e,t){let r=at.REALTIME_DO.idFromName("global");await at.REALTIME_DO.get(r).fetch(new Request("https://internal/broadcast",{method:"POST",body:JSON.stringify({event:e,data:t})}));}}:{async broadcast(e,t){let{getRuntimeAdapter:r}=await import('./runtime-HBG2YPJ4.js');r().broadcast(e,t);}}}function ai(){return ct||(ct=ii()),ct}var qe=new Proxy({},{get(e,t){let r=ai();return Reflect.get(r,t,r)}});function Eo(){return async(e,t)=>{let r=e.env;r&&bo(r),await t();}}V();O();n();v();var pr=class{async create(t){let s=await(await R()).insert(y$1).values({...t,createdAt:new Date}).returning();return u(s[0])}async getAll(t=50,r=0){return (await(await R()).select().from(y$1).orderBy(m(y$1.createdAt)).limit(t).offset(r)).map(u)}async getByUserId(t,r=50){return (await(await R()).select().from(y$1).where(g(y$1.userId,t)).orderBy(m(y$1.createdAt)).limit(r)).map(u)}async getByResource(t,r){let s=await R(),n=[g(y$1.resourceType,t)];return r&&n.push(g(y$1.resourceId,r)),(await s.select().from(y$1).where(h$1(...n)).orderBy(m(y$1.createdAt))).map(u)}async search(t){let r=await R(),s=[];return t.userId&&s.push(g(y$1.userId,t.userId)),t.action&&s.push(g(y$1.action,t.action)),t.resourceType&&s.push(g(y$1.resourceType,t.resourceType)),t.startDate&&s.push(j$2(y$1.createdAt,t.startDate)),t.endDate&&s.push(k$2(y$1.createdAt,t.endDate)),(await r.select().from(y$1).where(s.length>0?h$1(...s):void 0).orderBy(m(y$1.createdAt))).map(u)}async deleteOlderThan(t){let r=await R(),s=new Date;return s.setDate(s.getDate()-t),(await r.delete(y$1).where(k$2(y$1.createdAt,s)).returning()).length}},be=new pr;f();var E={USER:"user",ROLE:"role",PERMISSION:"permission",CONTENT:"content",ROUTE:"route",ORDER:"order",TICKET:"ticket",DISPUTE:"dispute",FILE:"file",CHAT:"chat",NOTIFICATION:"notification",CAPTCHA:"captcha"},Ao={users:E.USER,roles:E.ROLE,permissions:E.PERMISSION,contents:E.CONTENT,routes:E.ROUTE,orders:E.ORDER,tickets:E.TICKET,disputes:E.DISPUTE,files:E.FILE,chats:E.CHAT,notifications:E.NOTIFICATION,captchas:E.CAPTCHA},N={CREATE:"create",UPDATE:"update",DELETE:"delete",ASSIGN:"assign",REVOKE:"revoke"};var pe=e.api();function xo(){return async(e,t)=>{let r=Date.now(),s=e.req.path,n=e.req.method;await t();let i=Date.now()-r,a=e.res.status;if(pe.info({path:s,method:n,status:a,duration:i},"Audit log middleware checking"),!s.startsWith("/api/")||s.startsWith("/api/permissions/")){pe.info({path:s},"Skipping: not API or public API");return}if(!["POST","PUT","DELETE","PATCH"].includes(n)){pe.info({method:n},"Skipping: not write operation");return}if(a<200||a>=300){pe.info({status:a},"Skipping: not successful operation");return}let u=j(e);if(!u){pe.info({path:s},"Skipping: no user");return}let m=N.CREATE;n==="POST"?m=N.CREATE:n==="PUT"||n==="PATCH"?m=N.UPDATE:n==="DELETE"&&(m=N.DELETE);let f=s.split("/").filter(Boolean),T="user";if(f.length>=2){let v=f[1];T=Ao[v]||"unknown";}try{await be.create({id:`audit_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,userId:u.id,action:m,resourceType:T,resourceId:f.length>=3?f[2]:null,oldValue:null,newValue:null,ipAddress:e.req.header("x-forwarded-for")||e.req.header("x-real-ip")||null,userAgent:e.req.header("user-agent")||null}),pe.info({userId:u.id,action:m,resourceType:T,path:s,method:n,status:a,duration:i},"Audit log created");}catch(v){pe.error({error:v,path:s,method:n},"Failed to create audit log");}}}f();n();V();O();v();b$1();var gi=["image/jpeg","image/png","image/gif","image/webp","application/pdf","text/plain","text/csv","application/json","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],yi=[".jpg",".jpeg",".png",".gif",".webp",".pdf",".txt",".csv",".json",".xlsx",".docx"],dt=null;function pt(){if(dt)return dt;let e=process.env.FILE_STORAGE_PATH||join(process.cwd(),"uploads"),t=process.env.FILE_TEMP_PATH||join(e,"temp"),r=parseInt(process.env.FILE_TEMP_TTL||"3600000",10),s=parseInt(process.env.FILE_PRIVATE_URL_EXPIRY||"3600",10),n=process.env.FILE_SECRET_KEY||void 0;if(!n)throw new Error("FILE_SECRET_KEY environment variable is required in production");return dt={baseDir:e,tempDir:t,tempFileTTL:r,privateUrlExpiry:s,secretKey:n},dt}function mr(e,t){let r=pt();return {uploadDir:join(r.baseDir,e),maxFileSize:10*1024*1024,allowedMimeTypes:gi,allowedExtensions:yi}}async function Si(e){existsSync(e)||await mkdir(e,{recursive:true});}function fr(e,t){if(e.size>t.maxFileSize)return {valid:false,error:`File size exceeds maximum allowed size of ${t.maxFileSize} bytes`};if(!t.allowedMimeTypes.includes(e.type))return {valid:false,error:`File type "${e.type}" is not allowed`};let r=extname(e.name).toLowerCase();return t.allowedExtensions.includes(r)?{valid:true}:{valid:false,error:`File extension "${r}" is not allowed`}}async function lt(e,t,r){if(a$3)throw new Error("Local file storage is not supported in Cloudflare environment. Use R2 or other cloud storage.");let s=mr(e),n=fr(t,s);if(!n.valid)throw new Error(n.error);await Si(s.uploadDir);let i=extname(t.name).toLowerCase(),a=`${randomUUID()}${i}`,u=join(s.uploadDir,a);return await writeFile(u,Buffer.from(t.data)),{filename:a,originalName:t.name,mimeType:t.type,size:t.size,path:u,extension:i}}async function hr(e){if(a$3)throw new Error("Local file storage is not supported in Cloudflare environment.");if(!existsSync(e))throw new Error("File not found");return readFile(e)}async function gr(e){if(a$3)throw new Error("Local file storage is not supported in Cloudflare environment.");try{return existsSync(e)&&await unlink(e),!0}catch{return false}}function mt(e,t){let r=pt();return join(r.baseDir,e,t)}function yr(e,t,r){return r?`${r}/files/public/${e}/${t}`:`/files/public/${e}/${t}`}function Co(e,t,r){let s=pt(),n=`${e}:${t}:${r}`;return createHmac("sha256",s.secretKey).update(n).digest("hex")}function Sr(e,t,r,s){let n=Co(e,t,r);try{let i=Buffer.from(s,"hex"),a=Buffer.from(n,"hex");return i.length===a.length&&timingSafeEqual(i,a)}catch{return false}}function Io(e,t,r,s){let n=pt(),i=Math.floor(Date.now()/1e3)+(r||n.privateUrlExpiry),a=Co(e,t,i);return {url:s?`${s}/files/private/${e}/${t}?expiry=${i}&signature=${a}`:`/files/private/${e}/${t}?expiry=${i}&signature=${a}`,expiry:i}}async function Ee(e,t){let r=mt(e,t);if(!existsSync(r))return null;try{let s=await stat(r),n=extname(t).toLowerCase(),i={".jpg":"image/jpeg",".jpeg":"image/jpeg",".png":"image/png",".gif":"image/gif",".webp":"image/webp",".pdf":"application/pdf",".txt":"text/plain",".csv":"text/csv",".json":"application/json",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document"};return {size:s.size,mimeType:i[n]||"application/octet-stream",lastModified:s.mtime}}catch{return null}}function K(e){return `"${e.replace(/^[+\-=@\t\r]/,"'$&").replace(/"/g,'""')}"`}var Po="todos";async function Do(){return (await(await R()).select().from(p$1).orderBy(m(p$1.createdAt))).map(r=>({id:r.id,title:r.title,description:r.description??void 0,status:r.status,createdAt:t(r.createdAt),updatedAt:t(r.updatedAt)}))}async function Me(e){let s=(await(await R()).select().from(p$1).where(g(p$1.id,e)))[0];return s?{id:s.id,title:s.title,description:s.description??void 0,status:s.status,createdAt:t(s.createdAt),updatedAt:t(s.updatedAt)}:null}async function Uo(e){let t$1=await R(),r=new Date,n=(await t$1.insert(p$1).values({title:e.title,description:e.description??null,status:"pending",createdAt:r,updatedAt:r}).returning())[0];return {id:n.id,title:n.title,description:n.description??void 0,status:n.status,createdAt:t(n.createdAt),updatedAt:t(n.updatedAt)}}async function Oo(e,t$1){let r=await R(),n={updatedAt:new Date};t$1.title!==void 0&&t$1.title!==null&&(n.title=t$1.title),t$1.description!==void 0&&t$1.description!==null&&(n.description=t$1.description),t$1.status!==void 0&&t$1.status!==null&&(n.status=t$1.status);let i=await r.update(p$1).set(n).where(g(p$1.id,e)).returning();if(i.length===0)return null;let a=i[0];return {id:a.id,title:a.title,description:a.description??void 0,status:a.status,createdAt:t(a.createdAt),updatedAt:t(a.updatedAt)}}async function No(e){let t=await R(),r=await t.select().from(q).where(g(q.todoId,e));for(let n of r)await gr(n.path);return (await t.delete(p$1).where(g(p$1.id,e)).returning()).length>0}async function ko(e,t$1,r){let s=await R(),n=mr(Po),i=fr(t$1,n);if(!i.valid)throw new Error(i.error);let a=await lt(Po,t$1),u=new Date,f=(await s.insert(q).values({todoId:e,fileName:a.filename,originalName:a.originalName,mimeType:a.mimeType,size:a.size,path:a.path,uploadedBy:r??null,createdAt:u}).returning())[0];return {id:f.id,todoId:f.todoId,fileName:f.fileName,originalName:f.originalName,mimeType:f.mimeType,size:f.size,path:f.path,uploadedBy:f.uploadedBy??void 0,createdAt:t(f.createdAt)}}async function wr(e){return (await(await R()).select().from(q).where(g(q.todoId,e)).orderBy(m(q.createdAt))).map(s=>({id:s.id,todoId:s.todoId,fileName:s.fileName,originalName:s.originalName,mimeType:s.mimeType,size:s.size,path:s.path,uploadedBy:s.uploadedBy??void 0,createdAt:t(s.createdAt)}))}async function qo(e){let t=await Me(e);if(!t)return null;let r=await wr(e);return {...t,attachments:r}}async function jo(e){let t=await R(),r=await t.select().from(q).where(g(q.id,e));if(r.length===0)return false;let s=r[0];return await gr(s.path),await t.delete(q).where(g(q.id,e)),true}var ft=e=>e$1.object({success:e$1.literal(true),data:e,timestamp:e$1.string()}),Ri=e$1.object({field:e$1.string().optional(),message:e$1.string(),code:e$1.string().optional()}),ht=e$1.object({success:e$1.literal(false),error:e$1.string(),code:e$1.string().optional(),status:e$1.number().optional(),details:e$1.array(Ri).optional(),timestamp:e$1.string().optional()});var Tr=e$1.object({rpc:e$1.object({echo:e$1.object({in:e$1.object({message:e$1.string()}),out:e$1.object({message:e$1.string(),timestamp:e$1.number()})}),ping:e$1.object({in:e$1.object({}),out:e$1.object({pong:e$1.boolean(),timestamp:e$1.number()})})}),events:e$1.object({notification:e$1.object({title:e$1.string(),body:e$1.string(),timestamp:e$1.number()}),broadcast:e$1.object({message:e$1.string(),timestamp:e$1.number()}),connected:e$1.object({timestamp:e$1.number()}),disconnected:e$1.object({timestamp:e$1.number()})})}),vr=e$1.object({connectedClients:e$1.number()});var le=e$1.object({namespace:e$1.string(),filename:e$1.string()}),_e=e$1.object({expiry:e$1.string().transform(Number),signature:e$1.string()}),br=e$1.object({url:e$1.string()}),Er=e$1.object({url:e$1.string(),expiry:e$1.number()}),gt=e$1.object({namespace:e$1.string(),filename:e$1.string(),isPrivate:e$1.boolean().nullish().default(false),expirySeconds:e$1.number().nullish()}),yt=e$1.union([br,Er]);e$1.object({});var St=e$1.object({filename:e$1.string(),originalName:e$1.string(),mimeType:e$1.string(),size:e$1.number(),url:e$1.string()}),wt=e$1.object({file:e$1.instanceof(File),namespace:e$1.string().nullish().default("uploads")});var Rt=e$1.enum(["pending","in_progress","completed"]),oe=e$1.object({id:e$1.number().int().positive(),title:e$1.string().min(1,"Title is required").max(200,"Title too long"),description:e$1.string().max(1e3,"Description too long").nullish(),status:Rt,createdAt:e$1.string().datetime(),updatedAt:e$1.string().datetime()}),Tt=e$1.object({title:e$1.string().min(1,"Title is required").max(200,"Title too long"),description:e$1.string().max(1e3,"Description too long").nullish()}),vt=e$1.object({title:e$1.string().min(1,"Title is required").max(200,"Title too long").nullish(),description:e$1.string().max(1e3,"Description too long").nullish(),status:Rt.nullish()});e$1.object({id:e$1.coerce.number().int().positive()});var bt=e$1.object({id:e$1.number()}),Le=e$1.object({id:e$1.number().int().positive(),todoId:e$1.number().int().positive(),fileName:e$1.string(),originalName:e$1.string(),mimeType:e$1.string(),size:e$1.number().int().positive(),path:e$1.string(),uploadedBy:e$1.string().nullish(),createdAt:e$1.string().datetime()}),Fe=e$1.array(Le),Et=oe.extend({attachments:Fe}),At=e$1.object({file:e$1.file().openapi({type:"string",format:"binary"})}),xt=e$1.object({id:e$1.number()});var ze=e$1.enum(["info","warning","success","error"]),_=e$1.object({id:e$1.string().uuid(),type:ze,title:e$1.string().min(1).max(200),message:e$1.string().max(2e3),read:e$1.boolean().default(false),createdAt:e$1.string().datetime()}),Ct=e$1.object({type:ze,title:e$1.string().min(1,"Title is required").max(200,"Title too long"),message:e$1.string().min(1,"Message is required").max(2e3,"Message too long")});e$1.object({unreadOnly:e$1.coerce.boolean().nullish().default(false),limit:e$1.coerce.number().int().min(1).max(100).nullish().default(20),cursor:e$1.string().nullish()});e$1.object({event:e$1.enum(["notification","ping","connected"]),data:e$1.union([_,e$1.object({timestamp:e$1.number()})])});var Ar=e$1.object({count:e$1.number()}),Ae=e$1.object({events:e$1.object({notification:_,"unread-count":Ar,ping:e$1.object({timestamp:e$1.number()}),connected:e$1.object({timestamp:e$1.number()})})}),me=e$1.object({count:e$1.number()}),It=e$1.object({id:e$1.string()}),xr=e$1.array(_),Cr=e$1.object({count:e$1.number()}),Ir=e$1.object({type:ze.nullish().default("info")});function l(e){return {success:true,data:e,timestamp:new Date().toISOString()}}function M(e){return {success:true,data:e,timestamp:new Date().toISOString()}}function p(e,t){return {content:{"application/json":{schema:ft(e)}},description:t}}function c(e){return {content:{"application/json":{schema:ht}},description:e}}function zo(e,t){return p(e$1.object({items:e$1.array(e),nextCursor:e$1.string().optional()}),t)}var Ei=e$1.object({id:e$1.string()}),Bo={params:Ei};function Pt(e){return {body:{content:{"application/json":{schema:e}}}}}var Ai=e$1.array(oe),xi=g$1({method:"get",path:"/todos",tags:["todos"],responses:{200:p(Ai,"List all todos"),500:c("Internal server error")}}),Ci=g$1({method:"get",path:"/todos/{id}",tags:["todos"],request:{params:e$1.object({id:e$1.coerce.number().int().positive()})},responses:{200:p(oe,"Get a todo by ID"),404:c("Todo not found")}}),Ii=g$1({method:"post",path:"/todos",tags:["todos"],security:[{Bearer:[]}],middleware:[h()],request:{body:{content:{"application/json":{schema:Tt}}}},responses:{201:p(oe,"Create a new todo"),400:c("Invalid input")}}),Pi=g$1({method:"put",path:"/todos/{id}",tags:["todos"],security:[{Bearer:[]}],middleware:[h()],request:{params:e$1.object({id:e$1.coerce.number().int().positive()}),body:{content:{"application/json":{schema:vt}}}},responses:{200:p(oe,"Update a todo"),404:c("Todo not found")}}),Di=g$1({method:"delete",path:"/todos/{id}",tags:["todos"],security:[{Bearer:[]}],middleware:[h()],request:{params:e$1.object({id:e$1.coerce.number().int().positive()})},responses:{200:p(bt,"Delete a todo"),404:c("Todo not found")}}),Ui=g$1({method:"post",path:"/todos/{id}/attachments",tags:["todos"],security:[{Bearer:[]}],middleware:[h()],request:{params:e$1.object({id:e$1.coerce.number().int().positive()}),body:{required:true,content:{"multipart/form-data":{schema:At}}}},responses:{201:p(Le,"File uploaded successfully"),404:c("Todo not found"),400:c("Invalid file or file too large")}}),Oi=g$1({method:"get",path:"/todos/{id}/attachments",tags:["todos"],security:[{Bearer:[]}],middleware:[h()],request:{params:e$1.object({id:e$1.coerce.number().int().positive()})},responses:{200:p(Fe,"List attachments"),404:c("Todo not found")}}),Ni=g$1({method:"get",path:"/todos/{id}/with-attachments",tags:["todos"],security:[{Bearer:[]}],middleware:[h()],request:{params:e$1.object({id:e$1.coerce.number().int().positive()})},responses:{200:p(Et,"Get todo with attachments"),404:c("Todo not found")}}),ki=g$1({method:"delete",path:"/todos/{todoId}/attachments/{attachmentId}",tags:["todos"],security:[{Bearer:[]}],middleware:[h()],request:{params:e$1.object({todoId:e$1.coerce.number().int().positive(),attachmentId:e$1.coerce.number().int().positive()})},responses:{200:p(xt,"Attachment deleted"),404:c("Attachment not found")}}),$o=new f$1().openapi(xi,async e=>{let t=await Do();return e.json(l(t),200)}).openapi(Ci,async e=>{let{id:t}=e.req.valid("param"),r=await Me(t);if(!r)throw new w("Todo",String(t));return e.json(l(r),200)}).openapi(Ii,async e=>{let t=e.req.valid("json"),r=await Uo(t);return e.json(M(r),201)}).openapi(Pi,async e=>{let{id:t}=e.req.valid("param"),r=e.req.valid("json"),s=await Oo(t,r);if(!s)throw new w("Todo",String(t));return e.json(l(s),200)}).openapi(Di,async e=>{let{id:t}=e.req.valid("param");if(!await No(t))throw new w("Todo",String(t));return e.json(l({id:t}),200)}).openapi(Ui,async e=>{let{id:t}=e.req.valid("param");if(!await Me(t))throw new w("Todo",String(t));let n=e.req.valid("form").file;if(!n||!(n instanceof File))throw new Oe("No file uploaded");let i=j(e),a=await n.arrayBuffer();try{let u=await ko(t,{name:n.name,type:n.type,size:n.size,data:a},i?.id);return e.json(M(u),201)}catch(u){throw new Oe(u.message)}}).openapi(Oi,async e=>{let{id:t}=e.req.valid("param");if(!await Me(t))throw new w("Todo",String(t));let s=await wr(t);return e.json(l(s),200)}).openapi(Ni,async e=>{let{id:t}=e.req.valid("param"),r=await qo(t);if(!r)throw new w("Todo",String(t));return e.json(l(r),200)}).openapi(ki,async e=>{let{attachmentId:t}=e.req.valid("param");if(!await jo(t))throw new w("Attachment",String(t));return e.json(l({id:t}),200)}).doc("/docs",{openapi:"3.0.0",info:{version:"1.0.0",title:"Todo API"}});var qi=g$1({method:"get",path:"/permissions/roles",tags:["permissions"],responses:{200:p(k$1.array(),"Get all roles")}}),ji=g$1({method:"get",path:"/permissions",tags:["permissions"],responses:{200:p(l$2.array(),"Get all permissions")}}),Mi=g$1({method:"get",path:"/permissions/me",tags:["permissions"],security:[{Bearer:[]}],middleware:[h()],responses:{200:p(m$1,"Get current user permissions"),401:c("Unauthorized")}}),_i=g$1({method:"get",path:"/permissions/menu-config",tags:["permissions"],responses:{200:p(n$1,"Get menu configuration")}}),Li=g$1({method:"get",path:"/permissions/page-permissions",tags:["permissions"],responses:{200:p(o,"Get page permissions configuration")}}),Fi=g$1({method:"get",path:"/permissions/categories",tags:["permissions"],responses:{200:p(p$2,"Get permission categories")}}),zi=g$1({method:"get",path:"/permissions/role-labels",tags:["permissions"],responses:{200:p(q$1,"Get role labels")}}),Bi=g$1({method:"get",path:"/permissions/permission-labels",tags:["permissions"],responses:{200:p(r,"Get permission labels")}}),$i=g$1({method:"get",path:"/permissions/my-menu",tags:["permissions"],security:[{Bearer:[]}],middleware:[h()],responses:{200:p(n$1,"Get user menu configuration"),401:c("Unauthorized")}}),Wi=g$1({method:"get",path:"/permissions/init",tags:["permissions"],security:[{Bearer:[]}],middleware:[h()],responses:{200:p(s,"Get permission initialization data"),401:c("Unauthorized")}}),Wo=new f$1().openapi(qi,async e=>{let t=await D.getAllRoles();return e.json(l(t),200)}).openapi(ji,async e=>{let t=await D.getAllPermissions();return e.json(l(t),200)}).openapi(Mi,async e=>{let t=j(e),s=(await D.getUserPermissions(t.id,t.role)).map(n=>n.code);return e.json(l({userId:t.id,role:t.role,permissions:s}),200)}).openapi(_i,async e=>{let t=x$1();return e.json(l(t),200)}).openapi(Li,async e=>{let t=y();return e.json(l(t),200)}).openapi(Fi,async e=>{let t=z();return e.json(l(t),200)}).openapi(zi,async e=>{let t=A();return e.json(l(t),200)}).openapi(Bi,async e=>{let t=B();return e.json(l(t),200)}).openapi($i,async e=>{let t=j(e),r=await D.getUserMenuConfig(t.id,t.role);return e.json(l(r),200)}).openapi(Wi,async e=>{let t=j(e),[r,s,n]=await Promise.all([D.getUserPermissions(t.id,t.role),D.getUserMenuConfig(t.id,t.role),D.getUserPagePermissions(t.id,t.role)]),i=r.map(a=>a.code);return e.json(l({permissions:i,menuConfig:s,pagePermissions:n,role:t.role}),200)});var Ho=e$1.union([e$1.string(),e$1.date(),e$1.null()]).transform(e=>e instanceof Date?e.toISOString():e===null?new Date().toISOString():e),Be=e$1.object({id:e$1.string(),code:e$1.string(),name:e$1.string(),label:e$1.string(),description:e$1.string().optional().nullable(),isSystem:e$1.boolean().nullable(),isActive:e$1.boolean().nullable(),sortOrder:e$1.number().nullable(),createdAt:Ho,updatedAt:Ho}),Vo=e$1.object({code:e$1.string().min(1),name:e$1.string().min(1),label:e$1.string().min(1),description:e$1.string().nullish(),sortOrder:e$1.number().nullish()}),Go=e$1.object({name:e$1.string().nullish(),label:e$1.string().nullish(),description:e$1.string().nullish(),sortOrder:e$1.number().nullish(),isActive:e$1.boolean().nullish()}),Ko=e$1.object({permissionIds:e$1.array(e$1.string())}),Pr=e$1.object({});var Hi={"user:create":["user:view"],"user:edit":["user:view"],"user:delete":["user:view"],"content:create":["content:view"],"content:edit":["content:view"],"content:delete":["content:view"],"order:process":["order:view"],"order:cancel":["order:view"],"order:complete":["order:view"],"ticket:reply":["ticket:view"],"ticket:close":["ticket:view"],"data:export":["user:view"],"system:settings":["system:logs"]};function Yo(e){let t=[];for(let r of e){let s=Hi[r];if(s){let n=s.filter(i=>!e.includes(i));n.length>0&&t.push(`\u6743\u9650 "${r}" \u9700\u8981\u4EE5\u4E0B\u6743\u9650: ${n.join(", ")}`);}}return {valid:t.length===0,errors:t}}var Vi=Be.extend({permissions:e$1.array(e$1.string())}),Gi=g$1({method:"get",path:"/roles",tags:["roles"],security:[{Bearer:[]}],middleware:[h({requiredRole:"super_admin"})],responses:{200:p(Be.array(),"Get all roles"),401:c("Unauthorized"),403:c("Forbidden")}}),Ki=g$1({method:"get",path:"/roles/:id",tags:["roles"],security:[{Bearer:[]}],middleware:[h({requiredRole:"super_admin"})],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(Vi,"Get role by ID"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Role not found")}}),Yi=g$1({method:"post",path:"/roles",tags:["roles"],security:[{Bearer:[]}],middleware:[h({requiredRole:"super_admin"})],request:{body:{content:{"application/json":{schema:Vo}}}},responses:{200:p(Be,"Role created"),401:c("Unauthorized"),403:c("Forbidden"),400:c("Invalid request")}}),Ji=g$1({method:"put",path:"/roles/:id",tags:["roles"],security:[{Bearer:[]}],middleware:[h({requiredRole:"super_admin"})],request:{params:e$1.object({id:e$1.string()}),body:{content:{"application/json":{schema:Go}}}},responses:{200:p(Be,"Role updated"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Role not found")}}),Zi=g$1({method:"delete",path:"/roles/:id",tags:["roles"],security:[{Bearer:[]}],middleware:[h({requiredRole:"super_admin"})],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(Pr,"Role deleted"),401:c("Unauthorized"),403:c("Forbidden"),400:c("Cannot delete system role")}}),Xi=g$1({method:"put",path:"/roles/:id/permissions",tags:["roles"],security:[{Bearer:[]}],middleware:[h({requiredRole:"super_admin"})],request:{params:e$1.object({id:e$1.string()}),body:{content:{"application/json":{schema:Ko}}}},responses:{200:p(Pr,"Role permissions updated"),400:c("Permission dependency validation failed"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Role not found")}}),Jo=new f$1().openapi(Gi,async e=>{let t=await w$1.getAll();return e.json(l(t),200)}).openapi(Ki,async e=>{let{id:t}=e.req.valid("param"),r=await w$1.getById(t);if(!r)return e.json({success:false,error:"Role not found"},404);let s=await D.getRolePermissions(t);return e.json(l({...r,permissions:s.map(n=>n.code)}),200)}).openapi(Yi,async e=>{let t=e.req.valid("json"),r=await w$1.create({id:`role_${Date.now()}`,...t,sortOrder:t.sortOrder??0});return e.json(l(r),200)}).openapi(Ji,async e=>{let{id:t}=e.req.valid("param"),r=e.req.valid("json"),s=Object.fromEntries(Object.entries(r).filter(([i,a])=>a!=null)),n=await w$1.update(t,s);return n?e.json(l(n),200):e.json({success:false,error:"Role not found"},404)}).openapi(Zi,async e=>{let{id:t}=e.req.valid("param");return await w$1.delete(t)?e.json(l({}),200):e.json({success:false,error:"Cannot delete system role or role not found"},400)}).openapi(Xi,async e=>{let{id:t}=e.req.valid("param"),{permissionIds:r}=e.req.valid("json"),s=await w$1.getById(t);if(!s)return e.json({success:false,error:"Role not found"},404);if(s.code==="super_admin")return e.json({success:false,error:"Cannot modify super admin permissions"},403);let n=Yo(r);if(!n.valid)return e.json({success:false,error:"\u6743\u9650\u4F9D\u8D56\u6821\u9A8C\u5931\u8D25",details:n.errors.map(f=>({message:f}))},400);let a=(await Promise.all(r.map(f=>D.getByCode(f)))).filter(f=>f!==void 0).map(f=>f.id),m=(await D.getRolePermissions(t)).map(f=>f.id);for(let f of m)a.includes(f)||await D.revokePermissionFromRole(t,f);for(let f of a)m.includes(f)||await D.assignPermissionToRole(t,f);return e.json(l({}),200)});var Dr=e$1.enum(Object.values(E)),Ur=e$1.enum(Object.values(N)),Or=e$1.object({id:e$1.string(),userId:e$1.string(),action:Ur,resourceType:Dr,resourceId:e$1.string().nullable(),oldValue:e$1.string().nullable(),newValue:e$1.string().nullable(),ipAddress:e$1.string().nullable(),userAgent:e$1.string().nullable(),createdAt:e$1.union([e$1.string(),e$1.date()]).transform(e=>e instanceof Date?e.toISOString():e)});var Qi=g$1({method:"get",path:"/audit-logs",tags:["audit-logs"],security:[{Bearer:[]}],middleware:[h()],request:{query:e$1.object({limit:e$1.string().optional(),offset:e$1.string().optional(),userId:e$1.string().optional(),action:Ur.optional(),resourceType:Dr.optional()})},responses:{200:p(Or.array(),"Get audit logs"),401:c("Unauthorized")}}),ea=g$1({method:"get",path:"/audit-logs/:id",tags:["audit-logs"],security:[{Bearer:[]}],middleware:[h()],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(Or,"Get audit log by ID"),404:c("Audit log not found"),401:c("Unauthorized")}}),Zo=new f$1().openapi(Qi,async e=>{let t=e.req.valid("query"),r=t.limit?parseInt(t.limit):50,s=t.offset?parseInt(t.offset):0;if(t.userId||t.action||t.resourceType){let i=await be.search({userId:t.userId,action:t.action,resourceType:t.resourceType});return e.json(l(i.slice(s,s+r)),200)}let n=await be.getAll(r,s);return e.json(l(n),200)}).openapi(ea,async e=>{let{id:t}=e.req.valid("param"),s=(await be.getAll(1e3,0)).find(n=>n.id===t);return s?e.json(l(s),200):e.json({success:false,error:"Audit log not found"},404)});f();var se=[];function Dt(e){let t=[...se];e.unreadOnly&&(t=t.filter(a=>!a.read)),t.sort((a,u)=>new Date(u.createdAt).getTime()-new Date(a.createdAt).getTime());let r=e.limit??20,s=0;if(e.cursor){let a=t.findIndex(u=>u.id===e.cursor);a!==-1&&(s=a+1);}let n=t.slice(s,s+r),i=n.length===r?n[n.length-1]?.id:void 0;return {data:n,nextCursor:i}}function Xo(e){return se.find(t=>t.id===e)}function ta(e){let t={id:ar(),type:e.type,title:e.title,message:e.message,read:false,createdAt:new Date().toISOString()};return se.unshift(t),t}async function Ut(e$1){let t=ta(e$1);try{await qe.broadcast("notification",t);}catch(r){e.module("notification").debug({error:String(r)},"Broadcast failed");}return t}function Ot(e){let t=se.find(r=>r.id===e);return t&&(t.read=true),t}function Nt(){let e=0;return se.forEach(t=>{t.read||(t.read=true,e++);}),e}function Qo(e){let t=se.findIndex(r=>r.id===e);return t!==-1?(se.splice(t,1),true):false}function $e(){return se.filter(e=>!e.read).length}var ra=g$1({method:"get",path:"/notifications/stream",tags:["notifications"],responses:{200:{content:{"text/event-stream":{schema:Ae}},description:"SSE stream for notifications"},500:c("Internal server error")}}),oa=g$1({method:"get",path:"/notifications",tags:["notifications"],request:{query:e$1.object({unreadOnly:e$1.string().optional(),limit:e$1.string().optional(),cursor:e$1.string().optional()})},responses:{200:zo(_,"List notifications"),500:c("Internal server error")}}),sa=g$1({method:"get",path:"/notifications/unread-count",tags:["notifications"],responses:{200:p(me,"Get unread count"),500:c("Internal server error")}}),na=g$1({method:"get",path:"/notifications/{id}",tags:["notifications"],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(_,"Get notification by ID"),404:c("Notification not found")}}),ia=g$1({method:"post",path:"/notifications",tags:["notifications"],request:{body:{content:{"application/json":{schema:Ct}}}},responses:{201:p(_,"Create notification"),400:c("Invalid input")}}),aa=g$1({method:"patch",path:"/notifications/read-all",tags:["notifications"],responses:{200:p(me,"Mark all as read"),500:c("Internal server error")}}),ca=g$1({method:"patch",path:"/notifications/{id}/read",tags:["notifications"],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(_,"Mark as read"),404:c("Notification not found")}}),da=g$1({method:"delete",path:"/notifications/{id}",tags:["notifications"],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(It,"Delete notification"),404:c("Notification not found")}}),ts=new f$1().openapi(ra,async e=>{let t=e.env;if(t?.REALTIME_DO){let s=t.REALTIME_DO.idFromName("global"),n=t.REALTIME_DO.get(s),i=new Request(e.req.url,{method:e.req.method,headers:e.req.raw.headers});return n.fetch(i)}let r=b$2();return r.handleSSERequest?await r.handleSSERequest():e.json({success:false,error:"SSE not supported"},500)}).openapi(oa,async e=>{let t=e.req.valid("query"),r=Dt({unreadOnly:t.unreadOnly==="true",limit:t.limit?parseInt(t.limit):20,cursor:t.cursor});return e.json(l({items:r.data,nextCursor:r.nextCursor}),200)}).openapi(sa,async e=>{let t=$e();return e.json(l({count:t}),200)}).openapi(na,async e=>{let{id:t}=e.req.valid("param"),r=Xo(t);if(!r)throw new w("Notification",t);return e.json(l(r),200)}).openapi(ia,async e=>{let t=e.req.valid("json"),r=await Ut(t);return e.json(M(r),201)}).openapi(aa,async e=>{let t=Nt();return e.json(l({count:t}),200)}).openapi(ca,async e=>{let{id:t}=e.req.valid("param"),r=Ot(t);if(!r)throw new w("Notification",t);return e.json(l(r),200)}).openapi(da,async e=>{let{id:t}=e.req.valid("param");if(!Qo(t))throw new w("Notification",t);return e.json(l({id:t}),200)});var kt=ir("/chat/ws");kt.registerRPC("echo",e=>({message:e.message,timestamp:Date.now()}));kt.registerRPC("ping",()=>({pong:true,timestamp:Date.now()}));kt.registerEvent("broadcast",(e,t)=>{kt.broadcast("broadcast",e,[t]);});var ua=g$1({method:"get",path:"/chat/ws/status",tags:["chat"],responses:{200:p(vr,"Get WebSocket status")}}),pa=g$1({method:"get",path:"/chat/ws",tags:["chat"],responses:{200:{content:{websocket:{schema:Tr}},description:"WebSocket endpoint for chat"}}}),rs=new f$1().openapi(ua,async e=>e.json(l({connectedClients:0}))).openapi(pa,async e=>{let t=b$2();return t.handleWebSocketRequest?t.handleWebSocketRequest(e.req.raw):new Response("WebSocket not supported",{status:500})});V();O();n();v();async function os(){let e=await S();if(e&&"execute"in e){let s=await e.execute("SELECT COUNT(*) as count FROM todos"),n=await e.execute("SELECT COUNT(*) as count FROM todos WHERE status = 'pending'"),i=await e.execute("SELECT COUNT(*) as count FROM todos WHERE status = 'completed'"),a=u=>{let m=u[0];return typeof m?.count=="number"?m.count:0};return {totalTodos:a(s.rows),pendingTodos:a(n.rows),completedTodos:a(i.rows),lastUpdated:new Date().toISOString()}}let r=await(await R()).select().from(p$1);return {totalTodos:r.length,pendingTodos:r.filter(s=>s.status==="pending").length,completedTodos:r.filter(s=>s.status==="completed").length,lastUpdated:new Date().toISOString()}}async function ss(){try{return await(await R()).select().from(p$1).limit(1),{database:"connected",timestamp:new Date().toISOString()}}catch{return {database:"disconnected",timestamp:new Date().toISOString()}}}async function ns(){return {deletedCount:(await(await R()).delete(p$1).returning()).length}}async function is(e=10){return (await(await R()).select().from(p$1).orderBy(m(p$1.updatedAt)).limit(e)).map(s=>({id:s.id,title:s.title,status:s.status,updatedAt:t(s.updatedAt)}))}var ma="$2b$10$9iWkIfjDcJ7Kv4wHSb8ONONnrlfGb6rcfiJlZuuY4G2xQMG78DBbm";async function qt(e){let r=re().find(n=>n.username===e.username);if(!r||!await la.compare(e.password,ma))throw new Error("Invalid credentials");let s;return r.role==="super_admin"?s=`test-super-admin-${r.id}`:r.role==="customer_service"?s=`test-customer-service-${r.id}`:s=`test-user-${r.id}`,{user:{id:r.id,username:r.username,email:r.email,role:r.role,avatar:r.avatar,permissions:h$2(r.role)},token:s}}async function jt(e){let t=re();if(t.find(n=>n.username===e.username||n.email===e.email))throw new Error("User already exists");let s={id:String(t.length+1),username:e.username,email:e.email,role:"user",status:"active",avatar:`https://api.dicebear.com/7.x/avataaars/svg?seed=${e.username}`,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return t.push(s),s}async function as(){return re()}async function cs(e){return re().find(r=>r.id===e)||null}async function ds(e,t){let r=re(),s=r.findIndex(a=>a.id===e);if(s===-1)throw new Error("User not found");let n=Object.fromEntries(Object.entries(t).filter(([a,u])=>u!=null)),i={...r[s],...n,updatedAt:new Date().toISOString()};return r[s]=i,i}async function us(e){let t=re(),r=t.findIndex(s=>s.id===e);if(r===-1)throw new Error("User not found");t.splice(r,1);}async function ps(e){let t=re();if(t.find(n=>n.username===e.username||n.email===e.email))throw new Error("User with this username or email already exists");let s={id:`user-${Date.now()}`,username:e.username,email:e.email,role:e.role,status:e.status||"active",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return t.push(s),s}async function Mt(){return (await(await R()).select().from(p$1).orderBy(m(p$1.createdAt))).map(r=>({id:r.id,title:r.title,completed:r.status==="completed",createdAt:t(r.createdAt)}))}var Nr=new Map,kr=new Map;async function ls(e){if(Nr.has(e))return Nr.get(e);let t=await fetch(`https://api.dicebear.com/7.x/avataaars/png?seed=${e}`);if(!t.ok)return null;let s={data:await t.blob(),contentType:"image/png"};return Nr.set(e,s),s}async function ms(e){if(kr.has(e))return kr.get(e);let r={home:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-6 6 6 6-6 9 9 6-6-9-9z"></path><path d="M9 21l6-6 6 6-6 9 9 6-6 9-9z"></path></svg>',settings:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 3 3 3 3 3 0 0 6.3 6.3A1.65 1.65 0 0 3 3 3 3 3 0 0 6.3 6.3a1.65 1.65 0 0 3 3 3 3 3 0 0 6.3 6.3z"></path></svg>',user:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 21v-2a4 4 0 0 0 1-3 1H4a4 4 0 0 0 1 3v2"></path><circle cx="12" cy="7" r="4"></circle><path d="M16 11.37A4 4 0 1 1.8 2.44L8 2.44A4 4 0 1 1.8 2z"></path></svg>',bell:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 8A6 6 0 0 0 6 6c0 1.1.9 2.1 2.1-2 2.1-.9.9-.9 2.1-2 2.1A6 6 0 0 0 6-6 7-9l1-1.1c.7-.7 1.9-2 2.1-.9-.9-.9-2.1-2-2.1A6 6 0 0 0-6 6-7 9l-1 1.1c-.7.7-1.9 2-2.1.9.9.9 2.1 2 2.1z"></path><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2z"></path><line x1="15" y1="12"></line><line x1="15" y1="9"></line></svg>'}[e];return r?(kr.set(e,r),r):null}var fs=e$1.object({totalTodos:e$1.number(),pendingTodos:e$1.number(),completedTodos:e$1.number(),lastUpdated:e$1.string()}),hs=e$1.object({database:e$1.enum(["connected","disconnected"]),timestamp:e$1.string()}),fa=e$1.object({id:e$1.number(),title:e$1.string(),status:e$1.string(),updatedAt:e$1.string()}),gs=e$1.array(fa),We=e$1.object({id:e$1.string(),username:e$1.string(),email:e$1.string(),role:i$1,avatar:e$1.string().nullish(),permissions:e$1.array(j$1)}),_t=e$1.object({username:e$1.string().min(1),password:e$1.string().min(6)}),Lt=e$1.object({user:We,token:e$1.string()}),Ft=e$1.object({username:e$1.string().min(1),email:e$1.string().email(),password:e$1.string().min(6)}),X=e$1.object({id:e$1.string(),username:e$1.string(),email:e$1.string(),role:i$1,status:e$1.enum(["active","inactive","locked"]),avatar:e$1.string().nullish(),createdAt:e$1.string(),updatedAt:e$1.string()}),ys=e$1.array(X),Ss=e$1.object({username:e$1.string().nullish(),email:e$1.string().email().nullish(),role:i$1.nullish(),status:e$1.enum(["active","inactive","locked"]).nullish()}),ws=e$1.object({username:e$1.string().min(1),email:e$1.string().email(),password:e$1.string().min(6),role:i$1,status:e$1.enum(["active","inactive","locked"]).nullish().default("active")}),Rs=e$1.object({deletedCount:e$1.number()}),zt=e$1.object({}),Ts=e$1.object({token:e$1.string(),downloadUrl:e$1.string(),expiresIn:e$1.number()});var ha=g$1({method:"get",path:"/admin/me",tags:["admin"],security:[{Bearer:[]}],middleware:[h()],responses:{200:p(We,"Get current authenticated user"),401:c("Unauthorized")}}),ga=g$1({method:"post",path:"/admin/login",tags:["admin"],middleware:[Te],request:{body:{content:{"application/json":{schema:_t}}}},responses:{200:p(Lt,"Login successful"),401:c("Invalid credentials")}}),ya=g$1({method:"post",path:"/admin/register",tags:["admin"],middleware:[Te],request:{body:{content:{"application/json":{schema:Ft}}}},responses:{201:p(X,"User registered"),400:c("User already exists")}}),vs=new f$1().openapi(ha,async e=>{let t=j(e);return e.json(l(t),200)}).openapi(ga,async e=>{try{let t=e.req.valid("json"),r=await qt(t);return e.json(l(r),200)}catch{return e.json({success:false,error:"Invalid credentials"},401)}}).openapi(ya,async e=>{let t=e.req.valid("json"),r=await jt(t);return e.json(l(r),201)});var Sa=g$1({method:"get",path:"/admin/users",tags:["admin"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["user:view"]})],responses:{200:p(ys,"Get user list"),401:c("Unauthorized"),403:c("Forbidden")}}),wa=g$1({method:"get",path:"/admin/users/:id",tags:["admin"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["user:view"]})],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(X,"Get user"),401:c("Unauthorized"),403:c("Forbidden"),404:c("User not found")}}),Ra=g$1({method:"put",path:"/admin/users/:id",tags:["admin"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["user:edit"]})],request:{params:e$1.object({id:e$1.string()}),body:{content:{"application/json":{schema:Ss}}}},responses:{200:p(X,"User updated"),401:c("Unauthorized"),403:c("Forbidden"),404:c("User not found")}}),Ta=g$1({method:"delete",path:"/admin/users/:id",tags:["admin"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["user:delete"]})],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(zt,"User deleted"),401:c("Unauthorized"),403:c("Forbidden"),404:c("User not found")}}),va=g$1({method:"post",path:"/admin/users",tags:["admin"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["user:create"]})],request:{body:{content:{"application/json":{schema:ws}}}},responses:{200:p(X,"User created"),401:c("Unauthorized"),403:c("Forbidden"),400:c("Invalid request")}}),bs=new f$1().openapi(Sa,async e=>{let t=await as();return e.json(l(t),200)}).openapi(wa,async e=>{let{id:t}=e.req.valid("param"),r=await cs(t);return r?e.json(l(r),200):e.json({success:false,error:"User not found"},404)}).openapi(Ra,async e=>{let{id:t}=e.req.valid("param"),r=e.req.valid("json"),s=await ds(t,r);return e.json(l(s),200)}).openapi(Ta,async e=>{let{id:t}=e.req.valid("param");return await us(t),e.json(l({}),200)}).openapi(va,async e=>{let t=e.req.valid("json"),r=await ps(t);return e.json(l(r),200)});f();var ba=g$1({method:"get",path:"/admin/notifications",tags:["notifications"],security:[{Bearer:[]}],middleware:[h()],request:{query:e$1.object({unreadOnly:e$1.string().optional(),limit:e$1.string().optional()})},responses:{200:p(xr,"Get notifications"),401:c("Unauthorized")}}),Ea=g$1({method:"get",path:"/admin/notifications/unread-count",tags:["notifications"],security:[{Bearer:[]}],middleware:[h()],responses:{200:p(me,"Get unread count"),401:c("Unauthorized")}}),Aa=g$1({method:"put",path:"/admin/notifications/:id/read",tags:["notifications"],security:[{Bearer:[]}],middleware:[h()],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(zt,"Notification marked as read"),401:c("Unauthorized"),404:c("Notification not found")}}),xa=g$1({method:"put",path:"/admin/notifications/read-all",tags:["notifications"],security:[{Bearer:[]}],middleware:[h()],responses:{200:p(Cr,"All notifications marked as read"),401:c("Unauthorized")}}),Ca=g$1({method:"post",path:"/admin/notifications/test",tags:["notifications"],security:[{Bearer:[]}],middleware:[h({requiredRole:"super_admin"})],request:{body:{content:{"application/json":{schema:Ir}}}},responses:{200:p(_,"Test notification sent"),401:c("Unauthorized"),403:c("Forbidden")}}),Ia=g$1({method:"get",path:"/admin/notifications/stream",tags:["notifications"],security:[{Bearer:[]}],middleware:[h()],responses:{200:{content:{"text/event-stream":{schema:Ae}},description:"SSE stream for admin notifications"},401:c("Unauthorized")}}),Es=new f$1().openapi(ba,async e=>{let{unreadOnly:t,limit:r}=e.req.valid("query"),s=Dt({unreadOnly:t==="true",limit:r?parseInt(r,10):20});return e.json(l(s.data),200)}).openapi(Ea,async e=>{let t=$e();return e.json(l({count:t}),200)}).openapi(Aa,async e$1=>{let{id:t}=e$1.req.valid("param");if(!Ot(t))throw new w("Notification",t);try{let s=$e();await qe.broadcast("unread-count",{count:s});}catch(s){e.module("notification").debug({error:String(s)},"Broadcast failed");}return e$1.json(l({}),200)}).openapi(xa,async e$1=>{let t=Nt();try{await qe.broadcast("unread-count",{count:0});}catch(r){e.module("notification").debug({error:String(r)},"Broadcast failed");}return e$1.json(l({count:t}),200)}).openapi(Ca,async e=>{let{type:t}=e.req.valid("json"),r=await Ut({type:t??"info",title:t==="warning"?"\u8B66\u544A\u901A\u77E5":t==="error"?"\u9519\u8BEF\u901A\u77E5":t==="success"?"\u6210\u529F\u901A\u77E5":"\u7CFB\u7EDF\u901A\u77E5",message:t==="warning"?"\u8FD9\u662F\u4E00\u6761\u8B66\u544A\u901A\u77E5\uFF0C\u8BF7\u6CE8\u610F\uFF01":t==="error"?"\u8FD9\u662F\u4E00\u6761\u9519\u8BEF\u901A\u77E5\uFF0C\u8BF7\u7ACB\u5373\u5904\u7406\uFF01":t==="success"?"\u64CD\u4F5C\u6210\u529F\u5B8C\u6210\uFF01":"\u8FD9\u662F\u4E00\u6761\u666E\u901A\u4FE1\u606F\u901A\u77E5"});return e.json(l(r),200)}).openapi(Ia,async e=>{let t=e.env;if(t?.REALTIME_DO){let n=t.REALTIME_DO.idFromName("global"),i=t.REALTIME_DO.get(n),a=new Request(e.req.url,{method:e.req.method,headers:e.req.raw.headers});return i.fetch(a)}let{getRuntimeAdapter:r}=await import('./runtime-HBG2YPJ4.js'),s=r();return s.handleSSERequest?await s.handleSSERequest():e.json({success:false,error:"SSE not supported"},500)});var Pa=g$1({method:"get",path:"/admin/avatar/:id",tags:["media"],security:[{Bearer:[]}],middleware:[h()],request:{params:e$1.object({id:e$1.string()})},responses:{200:{content:{"image/png":{schema:e$1.any().openapi({type:"string",format:"binary"})},"image/jpeg":{schema:e$1.any().openapi({type:"string",format:"binary"})}},description:"User avatar image"},401:c("Unauthorized"),404:c("Avatar not found")}}),Da=g$1({method:"get",path:"/admin/icon/:name",tags:["media"],security:[{Bearer:[]}],middleware:[h()],request:{params:e$1.object({name:e$1.string()})},responses:{200:{content:{"image/svg+xml":{schema:e$1.string()}},description:"SVG icon"},401:c("Unauthorized"),404:c("Icon not found")}}),As=new f$1().openapi(Pa,async e=>{let{id:t}=e.req.valid("param"),r=await ls(t);return r?new Response(r.data,{headers:{"Content-Type":r.contentType}}):e.json({success:false,error:"Avatar not found"},404)}).openapi(Da,async e=>{let{name:t}=e.req.valid("param"),r=await ms(t);return r?new Response(r,{headers:{"Content-Type":"image/svg+xml"}}):e.json({success:false,error:"Icon not found"},404)});var He=new Map,Ua=()=>{let e=Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15);return He.set(e,{createdAt:Date.now(),expiresIn:6e4}),setTimeout(()=>He.delete(e),6e4),e},Oa=e=>{let t=He.get(e);return t?Date.now()-t.createdAt>t.expiresIn?(He.delete(e),false):true:false},Na=e=>{let t=Oa(e);return t&&He.delete(e),t},ka=g$1({method:"get",path:"/admin/todos/export",tags:["export"],security:[{Bearer:[]}],middleware:[h()],responses:{200:{content:{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{schema:e$1.any().openapi({type:"string",format:"binary"})},"text/csv":{schema:e$1.string()}},description:"Export todos as Excel or CSV"},401:c("Unauthorized")}}),qa=g$1({method:"post",path:"/admin/todos/export/token",tags:["export"],security:[{Bearer:[]}],middleware:[h()],responses:{200:p(Ts,"Generate a temporary download token"),401:c("Unauthorized")}}),ja=g$1({method:"get",path:"/admin/todos/export/download/:token",tags:["export"],request:{params:e$1.object({token:e$1.string()})},responses:{200:{content:{"text/csv":{schema:e$1.string()}},description:"Download CSV with temporary token"},403:c("Invalid or expired token")}}),Ma=g$1({method:"get",path:"/admin/todos/export/stream",tags:["export"],security:[{Bearer:[]}],middleware:[h()],responses:{200:{content:{"text/csv":{schema:e$1.string()}},description:"Stream export todos as CSV (for large datasets)"},401:c("Unauthorized")}}),xs=new f$1().openapi(ka,async e=>{let t=await Mt(),r=new TextEncoder,s=new ReadableStream({async start(n){n.enqueue(r.encode(`id,title,completed,created_at
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
`));for(let a of r){let u=`${K(String(a.id))},${K(a.title)},${a.completed},${K(a.createdAt)}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
`;a.enqueue(new TextEncoder().encode(d)),s(a);},cancel:()=>{console.warn(`[SSE] Connection cancelled, clientId: ${t}`),o=false,n&&(clearTimeout(n),n=null),this.core.sseClients.delete(t);}});return new Response(i,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no"}})}async handleBroadcastRequest(t){let n=await t.json(),o=n.event||"notification";return this.core.broadcast(n.data,n.exclude||[],o),Response.json({success:true,wsRecipients:this.core.wsClients.size,sseRecipients:this.core.sseClients.size})}},ln=null;function gn(){return ln||(ln=new _t),ln}var zt=null,Bt=null;function es(e){zt=e,Bt=null;}function Fc(){return a$3&&zt?.REALTIME_DO?{async broadcast(e,t){let n=zt.REALTIME_DO.idFromName("global");await zt.REALTIME_DO.get(n).fetch(new Request("https://internal/broadcast",{method:"POST",body:JSON.stringify({event:e,data:t})}));}}:{async broadcast(e,t){let{getRuntimeAdapter:n}=await import('./runtime-HBG2YPJ4.js');n().broadcast(e,t);}}}function $c(){return Bt||(Bt=Fc()),Bt}var rt=new Proxy({},{get(e,t){let n=$c();return Reflect.get(n,t,n)}});function ts(){return async(e,t)=>{let n=e.env;n&&es(n),await t();}}m();ja$1();r();v();var hn=class{async create(t){let o=await(await i()).insert(N).values({...t,createdAt:new Date}).returning();return u(o[0])}async getAll(t=50,n$1=0){return (await(await i()).select().from(N).orderBy(n(N.createdAt)).limit(t).offset(n$1)).map(u)}async getByUserId(t,n$1=50){return (await(await i()).select().from(N).where(g(N.userId,t)).orderBy(n(N.createdAt)).limit(n$1)).map(u)}async getByResource(t,n$1){let o=await i(),s=[g(N.resourceType,t)];return n$1&&s.push(g(N.resourceId,n$1)),(await o.select().from(N).where(h(...s)).orderBy(n(N.createdAt))).map(u)}async search(t){let n$1=await i(),o=[];return t.userId&&o.push(g(N.userId,t.userId)),t.action&&o.push(g(N.action,t.action)),t.resourceType&&o.push(g(N.resourceType,t.resourceType)),t.startDate&&o.push(j$1(N.createdAt,t.startDate)),t.endDate&&o.push(k$1(N.createdAt,t.endDate)),(await n$1.select().from(N).where(o.length>0?h(...o):void 0).orderBy(n(N.createdAt))).map(u)}async deleteOlderThan(t){let n=await i(),o=new Date;return o.setDate(o.getDate()-t),(await n.delete(N).where(k$1(N.createdAt,o)).returning()).length}},Be=new hn;f();var E={USER:"user",ROLE:"role",PERMISSION:"permission",CONTENT:"content",ROUTE:"route",ORDER:"order",TICKET:"ticket",DISPUTE:"dispute",FILE:"file",CHAT:"chat",NOTIFICATION:"notification",CAPTCHA:"captcha"},rs={users:E.USER,roles:E.ROLE,permissions:E.PERMISSION,contents:E.CONTENT,routes:E.ROUTE,orders:E.ORDER,tickets:E.TICKET,disputes:E.DISPUTE,files:E.FILE,chats:E.CHAT,notifications:E.NOTIFICATION,captchas:E.CAPTCHA},L={CREATE:"create",UPDATE:"update",DELETE:"delete",ASSIGN:"assign",REVOKE:"revoke"};var Ie=e.api();function ns(){return async(e,t)=>{let n=Date.now(),o=e.req.path,s=e.req.method;await t();let i=Date.now()-n,a=e.res.status;if(Ie.info({path:o,method:s,status:a,duration:i},"Audit log middleware checking"),!o.startsWith("/api/")||o.startsWith("/api/permissions/")){Ie.info({path:o},"Skipping: not API or public API");return}if(!["POST","PUT","DELETE","PATCH"].includes(s)){Ie.info({method:s},"Skipping: not write operation");return}if(a<200||a>=300){Ie.info({status:a},"Skipping: not successful operation");return}let d=U(e);if(!d){Ie.info({path:o},"Skipping: no user");return}let m=L.CREATE;s==="POST"?m=L.CREATE:s==="PUT"||s==="PATCH"?m=L.UPDATE:s==="DELETE"&&(m=L.DELETE);let h=o.split("/").filter(Boolean),b="user";if(h.length>=2){let v=h[1];b=rs[v]||"unknown";}try{await Be.create({id:`audit_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,userId:d.id,action:m,resourceType:b,resourceId:h.length>=3?h[2]:null,oldValue:null,newValue:null,ipAddress:e.req.header("x-forwarded-for")||e.req.header("x-real-ip")||null,userAgent:e.req.header("user-agent")||null}),Ie.info({userId:d.id,action:m,resourceType:b,path:o,method:s,status:a,duration:i},"Audit log created");}catch(v){Ie.error({error:v,path:o,method:s},"Failed to create audit log");}}}f();r();m();ja$1();v();b$1();var Zc=["image/jpeg","image/png","image/gif","image/webp","application/pdf","text/plain","text/csv","application/json","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],Xc=[".jpg",".jpeg",".png",".gif",".webp",".pdf",".txt",".csv",".json",".xlsx",".docx"],Ft=null;function Ht(){if(Ft)return Ft;let e=process.env.FILE_STORAGE_PATH||join(process.cwd(),"uploads"),t=process.env.FILE_TEMP_PATH||join(e,"temp"),n=parseInt(process.env.FILE_TEMP_TTL||"3600000",10),o=parseInt(process.env.FILE_PRIVATE_URL_EXPIRY||"3600",10),s=process.env.FILE_SECRET_KEY||void 0;if(!s)throw new Error("FILE_SECRET_KEY environment variable is required in production");return Ft={baseDir:e,tempDir:t,tempFileTTL:n,privateUrlExpiry:o,secretKey:s},Ft}function yn(e,t){let n=Ht();return {uploadDir:join(n.baseDir,e),maxFileSize:10*1024*1024,allowedMimeTypes:Zc,allowedExtensions:Xc}}async function eu(e){existsSync(e)||await mkdir(e,{recursive:true});}function Sn(e,t){if(e.size>t.maxFileSize)return {valid:false,error:`File size exceeds maximum allowed size of ${t.maxFileSize} bytes`};if(!t.allowedMimeTypes.includes(e.type))return {valid:false,error:`File type "${e.type}" is not allowed`};let n=extname(e.name).toLowerCase();return t.allowedExtensions.includes(n)?{valid:true}:{valid:false,error:`File extension "${n}" is not allowed`}}async function Wt(e,t,n){if(a$3)throw new Error("Local file storage is not supported in Cloudflare environment. Use R2 or other cloud storage.");let o=yn(e),s=Sn(t,o);if(!s.valid)throw new Error(s.error);await eu(o.uploadDir);let i=extname(t.name).toLowerCase(),a=`${randomUUID()}${i}`,d=join(o.uploadDir,a);return await writeFile(d,Buffer.from(t.data)),{filename:a,originalName:t.name,mimeType:t.type,size:t.size,path:d,extension:i}}async function wn(e){if(a$3)throw new Error("Local file storage is not supported in Cloudflare environment.");if(!existsSync(e))throw new Error("File not found");return readFile(e)}async function Rn(e){if(a$3)throw new Error("Local file storage is not supported in Cloudflare environment.");try{return existsSync(e)&&await unlink(e),!0}catch{return false}}function Vt(e,t){let n=Ht();return join(n.baseDir,e,t)}function bn(e,t,n){return n?`${n}/files/public/${e}/${t}`:`/files/public/${e}/${t}`}function os(e,t,n){let o=Ht(),s=`${e}:${t}:${n}`;return createHmac("sha256",o.secretKey).update(s).digest("hex")}function vn(e,t,n,o){let s=os(e,t,n);try{let i=Buffer.from(o,"hex"),a=Buffer.from(s,"hex");return i.length===a.length&&timingSafeEqual(i,a)}catch{return false}}function ss(e,t,n,o){let s=Ht(),i=Math.floor(Date.now()/1e3)+(n||s.privateUrlExpiry),a=os(e,t,i);return {url:o?`${o}/files/private/${e}/${t}?expiry=${i}&signature=${a}`:`/files/private/${e}/${t}?expiry=${i}&signature=${a}`,expiry:i}}async function Fe(e,t){let n=Vt(e,t);if(!existsSync(n))return null;try{let o=await stat(n),s=extname(t).toLowerCase(),i={".jpg":"image/jpeg",".jpeg":"image/jpeg",".png":"image/png",".gif":"image/gif",".webp":"image/webp",".pdf":"application/pdf",".txt":"text/plain",".csv":"text/csv",".json":"application/json",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document"};return {size:o.size,mimeType:i[s]||"application/octet-stream",lastModified:o.mtime}}catch{return null}}function pe(e){return `"${e.replace(/^[+\-=@\t\r]/,"'$&").replace(/"/g,'""')}"`}$e();var us="todos";async function ps(){return (await(await i()).select().from(E$1).orderBy(n(E$1.createdAt))).map(n=>({id:n.id,title:n.title,description:n.description??void 0,status:n.status,createdAt:t(n.createdAt),updatedAt:t(n.updatedAt)}))}async function ot(e){let o=(await(await i()).select().from(E$1).where(g(E$1.id,e)))[0];return o?{id:o.id,title:o.title,description:o.description??void 0,status:o.status,createdAt:t(o.createdAt),updatedAt:t(o.updatedAt)}:null}async function ds(e){let t$1=await i(),n=new Date,s=(await t$1.insert(E$1).values({title:e.title,description:e.description??null,status:"pending",createdAt:n,updatedAt:n}).returning())[0];return {id:s.id,title:s.title,description:s.description??void 0,status:s.status,createdAt:t(s.createdAt),updatedAt:t(s.updatedAt)}}async function ls(e,t$1){let n=await i(),s={updatedAt:new Date};t$1.title!==void 0&&t$1.title!==null&&(s.title=t$1.title),t$1.description!==void 0&&t$1.description!==null&&(s.description=t$1.description),t$1.status!==void 0&&t$1.status!==null&&(s.status=t$1.status);let i$1=await n.update(E$1).set(s).where(g(E$1.id,e)).returning();if(i$1.length===0)return null;let a=i$1[0];return {id:a.id,title:a.title,description:a.description??void 0,status:a.status,createdAt:t(a.createdAt),updatedAt:t(a.updatedAt)}}async function ms(e){let t=await i(),n=await t.select().from(F).where(g(F.todoId,e));for(let s of n)await Rn(s.path);return (await t.delete(E$1).where(g(E$1.id,e)).returning()).length>0}async function gs(e,t$1,n){let o=await i(),s=yn(us),i$1=Sn(t$1,s);if(!i$1.valid)throw new Error(i$1.error);let a=await Wt(us,t$1),d=new Date,h=(await o.insert(F).values({todoId:e,fileName:a.filename,originalName:a.originalName,mimeType:a.mimeType,size:a.size,path:a.path,uploadedBy:n??null,createdAt:d}).returning())[0];return {id:h.id,todoId:h.todoId,fileName:h.fileName,originalName:h.originalName,mimeType:h.mimeType,size:h.size,path:h.path,uploadedBy:h.uploadedBy??void 0,createdAt:t(h.createdAt)}}async function xn(e){return (await(await i()).select().from(F).where(g(F.todoId,e)).orderBy(n(F.createdAt))).map(o=>({id:o.id,todoId:o.todoId,fileName:o.fileName,originalName:o.originalName,mimeType:o.mimeType,size:o.size,path:o.path,uploadedBy:o.uploadedBy??void 0,createdAt:t(o.createdAt)}))}async function hs(e){let t=await ot(e);if(!t)return null;let n=await xn(e);return {...t,attachments:n}}async function fs(e){let t=await i(),n=await t.select().from(F).where(g(F.id,e));if(n.length===0)return false;let o=n[0];return await Rn(o.path),await t.delete(F).where(g(F.id,e)),true}var Gt=e=>e$1.object({success:e$1.literal(true),data:e,timestamp:e$1.string()}),ru=e$1.object({field:e$1.string().optional(),message:e$1.string(),code:e$1.string().optional()}),Kt=e$1.object({success:e$1.literal(false),error:e$1.string(),code:e$1.string().optional(),status:e$1.number().optional(),details:e$1.array(ru).optional(),timestamp:e$1.string().optional()});var Cn=e$1.object({rpc:e$1.object({echo:e$1.object({in:e$1.object({message:e$1.string()}),out:e$1.object({message:e$1.string(),timestamp:e$1.number()})}),ping:e$1.object({in:e$1.object({}),out:e$1.object({pong:e$1.boolean(),timestamp:e$1.number()})})}),events:e$1.object({notification:e$1.object({title:e$1.string(),body:e$1.string(),timestamp:e$1.number()}),broadcast:e$1.object({message:e$1.string(),timestamp:e$1.number()}),connected:e$1.object({timestamp:e$1.number()}),disconnected:e$1.object({timestamp:e$1.number()})})}),An=e$1.object({connectedClients:e$1.number()});var De=e$1.object({namespace:e$1.string(),filename:e$1.string()}),st=e$1.object({expiry:e$1.string().transform(Number),signature:e$1.string()}),En=e$1.object({url:e$1.string()}),Pn=e$1.object({url:e$1.string(),expiry:e$1.number()}),Qt=e$1.object({namespace:e$1.string(),filename:e$1.string(),isPrivate:e$1.boolean().nullish().default(false),expirySeconds:e$1.number().nullish()}),Jt=e$1.union([En,Pn]);e$1.object({});var Yt=e$1.object({filename:e$1.string(),originalName:e$1.string(),mimeType:e$1.string(),size:e$1.number(),url:e$1.string()}),Zt=e$1.object({file:e$1.instanceof(File),namespace:e$1.string().nullish().default("uploads")});var Xt=e$1.enum(["pending","in_progress","completed"]),xe=e$1.object({id:e$1.number().int().positive(),title:e$1.string().min(1,"Title is required").max(200,"Title too long"),description:e$1.string().max(1e3,"Description too long").nullish(),status:Xt,createdAt:e$1.string().datetime(),updatedAt:e$1.string().datetime()}),er=e$1.object({title:e$1.string().min(1,"Title is required").max(200,"Title too long"),description:e$1.string().max(1e3,"Description too long").nullish()}),tr=e$1.object({title:e$1.string().min(1,"Title is required").max(200,"Title too long").nullish(),description:e$1.string().max(1e3,"Description too long").nullish(),status:Xt.nullish()});e$1.object({id:e$1.coerce.number().int().positive()});var rr=e$1.object({id:e$1.number()}),it=e$1.object({id:e$1.number().int().positive(),todoId:e$1.number().int().positive(),fileName:e$1.string(),originalName:e$1.string(),mimeType:e$1.string(),size:e$1.number().int().positive(),path:e$1.string(),uploadedBy:e$1.string().nullish(),createdAt:e$1.string().datetime()}),at=e$1.array(it),nr=xe.extend({attachments:at}),or=e$1.object({file:e$1.file().openapi({type:"string",format:"binary"})}),sr=e$1.object({id:e$1.number()});var ct=e$1.enum(["info","warning","success","error"]),te=e$1.object({id:e$1.string().uuid(),type:ct,title:e$1.string().min(1).max(200),message:e$1.string().max(2e3),read:e$1.boolean().default(false),createdAt:e$1.string().datetime()}),ir=e$1.object({type:ct,title:e$1.string().min(1,"Title is required").max(200,"Title too long"),message:e$1.string().min(1,"Message is required").max(2e3,"Message too long")});e$1.object({unreadOnly:e$1.coerce.boolean().nullish().default(false),limit:e$1.coerce.number().int().min(1).max(100).nullish().default(20),cursor:e$1.string().nullish()});e$1.object({event:e$1.enum(["notification","ping","connected"]),data:e$1.union([te,e$1.object({timestamp:e$1.number()})])});var In=e$1.object({count:e$1.number()}),He=e$1.object({events:e$1.object({notification:te,"unread-count":In,ping:e$1.object({timestamp:e$1.number()}),connected:e$1.object({timestamp:e$1.number()})})}),ke=e$1.object({count:e$1.number()}),ar=e$1.object({id:e$1.string()}),Dn=e$1.array(te),kn=e$1.object({count:e$1.number()}),Un=e$1.object({type:ct.nullish().default("info")});var ut=e$1.object({id:e$1.string(),username:e$1.string(),email:e$1.string().email(),role:e$1.string(),createdAt:e$1.string().datetime()}),cr=e$1.object({account:e$1.string().nullish(),email:e$1.string().email().nullish(),password:e$1.string().min(6)}).refine(e=>e.account||e.email,{message:"Either account or email is required",path:["account"]}),ur=e$1.object({username:e$1.string().min(3).max(50),email:e$1.string().email(),password:e$1.string().min(6).max(100)}),pt=e$1.object({token:e$1.string(),profile:ut});e$1.object({id:e$1.string(),username:e$1.string(),email:e$1.string().email(),bio:e$1.string().optional().nullable(),joinDate:e$1.string(),stats:e$1.object({posts:e$1.number(),followers:e$1.number(),following:e$1.number()})});var dt=e$1.enum(["pending","approved","rejected"]),W=e$1.object({id:e$1.string(),name:e$1.string().min(1).max(200),slug:e$1.string().min(1).max(200),description:e$1.string().max(2e3),readme:e$1.string().nullish(),authorId:e$1.string(),authorName:e$1.string(),repositoryUrl:e$1.string().url().nullish(),homepageUrl:e$1.string().url().nullish(),npmPackage:e$1.string().nullish(),license:e$1.string().nullish(),version:e$1.string(),status:dt,downloadCount:e$1.number().int().nonnegative().default(0),viewCount:e$1.number().int().nonnegative().default(0),featured:e$1.boolean().default(false),screenshotUrl:e$1.string().nullish(),siteUrls:e$1.array(e$1.string().url()).nullish(),tags:e$1.array(e$1.string()).nullish(),commands:e$1.array(e$1.object({name:e$1.string(),description:e$1.string().nullish()})).nullish(),rejectReason:e$1.string().nullish(),createdAt:e$1.number(),updatedAt:e$1.number()}),lt=e$1.object({name:e$1.string().min(1).max(200),slug:e$1.string().min(1).max(200).regex(/^[a-z0-9-]+$/),description:e$1.string().min(1).max(2e3),repositoryUrl:e$1.string().url().nullish(),homepageUrl:e$1.string().url().nullish(),npmPackage:e$1.string().nullish(),license:e$1.string().nullish(),tags:e$1.array(e$1.string()).nullish(),siteUrls:e$1.array(e$1.string().url()).nullish(),commands:e$1.array(e$1.object({name:e$1.string(),description:e$1.string().nullish()})).nullish()}),pr=lt.partial(),On=e$1.enum(["pending","approved","rejected"]),dr=e$1.object({id:e$1.string(),pluginId:e$1.string(),version:e$1.string(),changelog:e$1.string().nullish(),packageUrl:e$1.string().nullish(),fileSize:e$1.number().nullish(),checksum:e$1.string().nullish(),status:On,publishedAt:e$1.number()}),Te=e$1.object({id:e$1.string(),name:e$1.string(),slug:e$1.string(),description:e$1.string().nullish(),icon:e$1.string().nullish(),sortOrder:e$1.number().int().default(0)}),mt=e$1.object({id:e$1.string(),pluginId:e$1.string(),userId:e$1.string(),userName:e$1.string(),rating:e$1.number().int().min(1).max(5),title:e$1.string().nullish(),content:e$1.string().nullish(),createdAt:e$1.number()}),lr=e$1.object({rating:e$1.number().int().min(1).max(5),title:e$1.string().max(200).nullish(),content:e$1.string().max(2e3).nullish()}),mr=e$1.object({totalPlugins:e$1.number(),totalDownloads:e$1.number(),totalDevelopers:e$1.number(),totalCategories:e$1.number()}),We=e$1.object({plugins:e$1.array(W),total:e$1.number(),page:e$1.number(),limit:e$1.number()}),Nn=W.extend({avgRating:e$1.number().nullish(),reviewCount:e$1.number().nullish()}),gr=e$1.object({totalPlugins:e$1.number(),pendingPlugins:e$1.number(),totalDownloads:e$1.number(),totalDevelopers:e$1.number(),totalCategories:e$1.number(),recentSubmissions:e$1.array(Nn).nullish()}),hr=e$1.object({page:e$1.coerce.number().int().positive().default(1),limit:e$1.coerce.number().int().positive().max(100).default(20),search:e$1.string().nullish(),status:dt.nullish(),category:e$1.string().nullish(),sort:e$1.enum(["newest","popular","downloads","name"]).default("newest"),featured:e$1.coerce.boolean().nullish()}),$=e$1.object({slug:e$1.string().min(1)}),fr=e$1.object({q:e$1.string().min(1),page:e$1.coerce.number().int().positive().default(1),limit:e$1.coerce.number().int().positive().max(100).default(20),category:e$1.string().nullish()}),Ue=e$1.object({slug:e$1.string()}),yr=e$1.object({slug:e$1.string(),reviewId:e$1.string()}),Sr=e$1.object({id:e$1.string()}),wr=e$1.object({slug:e$1.string()}),Rr=e$1.object({page:e$1.coerce.number().int().positive().default(1),limit:e$1.coerce.number().int().positive().max(100).default(20)}),gt=e$1.object({plugins:e$1.array(W),total:e$1.number(),page:e$1.number(),limit:e$1.number()}),br=e$1.object({page:e$1.coerce.number().int().positive().default(1),limit:e$1.coerce.number().int().positive().max(100).default(20)}),vr=e$1.object({page:e$1.coerce.number().int().positive().default(1),limit:e$1.coerce.number().int().positive().max(100).default(20),status:dt.nullish()}),xr=e$1.object({reason:e$1.string().min(1)}),Tr=e$1.object({slugs:e$1.array(e$1.string()).min(1)}),Cr=e$1.object({slugs:e$1.array(e$1.string()).min(1),reason:e$1.string().min(1)}),ht=e$1.object({count:e$1.number()}),Ar=e$1.object({name:e$1.string().min(1),slug:e$1.string().min(1),description:e$1.string().nullish(),icon:e$1.string().nullish()}),Er=e$1.object({name:e$1.string().nullish(),slug:e$1.string().nullish(),description:e$1.string().nullish(),icon:e$1.string().nullish(),sortOrder:e$1.number().int().nullish()}),ft=e$1.object({id:e$1.string()}),Pr=e$1.object({id:e$1.string()});var vs=e$1.object({label:e$1.string(),value:e$1.string(),trend:e$1.number()}),jn=e$1.object({month:e$1.string(),value:e$1.number()}),xs=e$1.enum(["Active","Pending","Inactive"]),Ts=e$1.object({id:e$1.number(),user:e$1.string(),action:e$1.string(),date:e$1.string(),status:xs}),qn=e$1.object({stats:e$1.array(vs),revenue:e$1.array(jn),userGrowth:e$1.array(jn),activity:e$1.array(Ts)});var Ir=e$1.object({id:e$1.number(),name:e$1.string(),variant:e$1.string(),price:e$1.number(),quantity:e$1.number(),color:e$1.string()}),Cs=e$1.object({subtotal:e$1.number(),shipping:e$1.number(),tax:e$1.number(),total:e$1.number(),totalItems:e$1.number()}),Mn=e$1.object({items:e$1.array(Ir),summary:Cs}),Ln=e$1.object({id:e$1.number(),name:e$1.string(),variant:e$1.string(),price:e$1.number(),quantity:e$1.number().min(1).default(1),color:e$1.string()});e$1.object({id:e$1.string()});var Dr=e$1.enum(["pending","processing","completed","cancelled","disputed"]),K=e$1.object({id:e$1.string(),orderNo:e$1.string(),customerName:e$1.string(),customerEmail:e$1.string(),productName:e$1.string(),amount:e$1.number(),status:Dr,createdAt:e$1.string(),updatedAt:e$1.string()}),_n=e$1.object({customerName:e$1.string(),customerEmail:e$1.string().email(),productName:e$1.string(),amount:e$1.number().positive()}),zn=e$1.object({status:Dr.nullish()}),Bn=e$1.array(K),Fn=e$1.object({status:Dr.nullish(),customerName:e$1.string().nullish(),limit:e$1.coerce.number().int().positive().max(100).default(20),offset:e$1.coerce.number().int().min(0).default(0)}),$n=e$1.object({message:e$1.string()});e$1.object({orderId:e$1.string()});e$1.object({orderId:e$1.string(),reason:e$1.string().nullish()});var Hn=e$1.object({removedId:e$1.string()}),As=e$1.object({name:e$1.string(),color:e$1.string()}),Es=e$1.enum(["processing","shipped","delivered","cancelled"]),Ps=e$1.object({id:e$1.string(),date:e$1.string(),status:Es,products:e$1.array(As),total:e$1.number()}),Wn=e$1.array(Ps);var Is=e$1.enum(["hot","unanswered","solved"]),Ds=e$1.object({label:e$1.string(),color:e$1.string()}),ks=e$1.object({name:e$1.string(),initials:e$1.string()}),Us=e$1.object({id:e$1.string(),title:e$1.string(),excerpt:e$1.string(),votes:e$1.number(),replyCount:e$1.number(),viewCount:e$1.number(),status:Is,tags:e$1.array(Ds),author:ks,createdAt:e$1.string()}),kr=e$1.array(Us),Os=e$1.object({topics:e$1.number(),replies:e$1.number(),likes:e$1.number()}),Ns=e$1.enum(["topic","reply","like"]),js=e$1.object({id:e$1.string(),type:Ns,text:e$1.string(),target:e$1.string(),time:e$1.string()}),Vn=e$1.object({stats:Os,activity:e$1.array(js)});var yt=e$1.enum(["active","suspended","trial"]),Ve=e$1.enum(["free","starter","pro","enterprise"]),St=e$1.record(e$1.string(),e$1.unknown()).nullable(),Gn=e$1.object({id:e$1.number().int().positive(),name:e$1.string().min(1).max(200),slug:e$1.string().min(1).max(100).regex(/^[a-z0-9-]+$/),status:yt,plan:Ve,maxUsers:e$1.number().int().min(1).max(1e3),settings:St,createdAt:e$1.string().datetime(),updatedAt:e$1.string().datetime()});e$1.object({name:e$1.string().min(1).max(200),slug:e$1.string().min(1).max(100).regex(/^[a-z0-9-]+$/),plan:Ve.default("free"),maxUsers:e$1.number().int().min(1).max(1e3).default(5),settings:St});e$1.object({name:e$1.string().min(1).max(200).nullish(),status:yt.nullish(),plan:Ve.nullish(),maxUsers:e$1.number().int().min(1).max(1e3).nullish(),settings:St.nullish()});e$1.object({id:e$1.coerce.number().int().positive()});e$1.object({slug:e$1.string()});e$1.object({items:e$1.array(Gn),total:e$1.number(),page:e$1.number(),pageSize:e$1.number()});e$1.object({id:e$1.number()});e$1.object({status:yt.nullish(),plan:Ve.nullish(),page:e$1.coerce.number().int().positive().default(1),pageSize:e$1.coerce.number().int().positive().max(100).default(20)});var Kn=e$1.enum(["refund","product_quality","service_quality","delivery","other"]),Qn=e$1.enum(["pending","investigating","resolved","rejected"]),de=e$1.object({id:e$1.string(),disputeNo:e$1.string(),orderId:e$1.string(),orderNo:e$1.string(),customerName:e$1.string(),customerEmail:e$1.string(),type:Kn,status:Qn,description:e$1.string(),resolution:e$1.string().nullish(),amount:e$1.number(),createdAt:e$1.string(),updatedAt:e$1.string(),resolvedAt:e$1.string().nullish(),resolvedBy:e$1.string().nullish()}),Jn=e$1.object({orderId:e$1.string(),orderNo:e$1.string(),customerName:e$1.string(),customerEmail:e$1.string().email(),type:Kn,description:e$1.string(),amount:e$1.number().positive()}),Yn=e$1.object({status:Qn.nullish(),resolution:e$1.string().nullish()}),Zn=e$1.object({resolution:e$1.string(),resolvedBy:e$1.string()}),Xn=e$1.array(de),$s=e$1.object({message:e$1.string()});var eo=e$1.object({id:e$1.string(),name:e$1.string().min(1).max(200),description:e$1.string().max(1e3),price:e$1.number().positive(),status:e$1.enum(["active","inactive","out_of_stock"]),stock:e$1.number().int().min(0),imageUrl:e$1.string().url().nullable(),createdAt:e$1.string().datetime(),updatedAt:e$1.string().datetime()});e$1.object({name:e$1.string().min(1).max(200),description:e$1.string().max(1e3),price:e$1.number().positive(),status:e$1.enum(["active","inactive","out_of_stock"]).default("active"),stock:e$1.number().int().min(0).default(0),imageUrl:e$1.string().url().nullable()});e$1.object({name:e$1.string().min(1).max(200).optional(),description:e$1.string().max(1e3).optional(),price:e$1.number().positive().optional(),status:e$1.enum(["active","inactive","out_of_stock"]).optional(),stock:e$1.number().int().min(0).optional(),imageUrl:e$1.string().url().nullable().optional()});e$1.array(eo);function l(e){return {success:true,data:e,timestamp:new Date().toISOString()}}function O(e){return {success:true,data:e,timestamp:new Date().toISOString()}}function p(e,t){return {content:{"application/json":{schema:Gt(e)}},description:t}}function c(e){return {content:{"application/json":{schema:Kt}},description:e}}function Gs(e,t){return p(e$1.object({items:e$1.array(e),nextCursor:e$1.string().optional()}),t)}var uu=e$1.object({id:e$1.string()}),Ks={params:uu};function Ur(e){return {body:{content:{"application/json":{schema:e}}}}}var pu=e$1.array(xe),du=g$1({method:"get",path:"/todos",tags:["todos"],responses:{200:p(pu,"List all todos"),500:c("Internal server error")}}),lu=g$1({method:"get",path:"/todos/{id}",tags:["todos"],request:{params:e$1.object({id:e$1.coerce.number().int().positive()})},responses:{200:p(xe,"Get a todo by ID"),404:c("Todo not found")}}),mu=g$1({method:"post",path:"/todos",tags:["todos"],security:[{Bearer:[]}],middleware:[S()],request:{body:{content:{"application/json":{schema:er}}}},responses:{201:p(xe,"Create a new todo"),400:c("Invalid input")}}),gu=g$1({method:"put",path:"/todos/{id}",tags:["todos"],security:[{Bearer:[]}],middleware:[S()],request:{params:e$1.object({id:e$1.coerce.number().int().positive()}),body:{content:{"application/json":{schema:tr}}}},responses:{200:p(xe,"Update a todo"),404:c("Todo not found")}}),hu=g$1({method:"delete",path:"/todos/{id}",tags:["todos"],security:[{Bearer:[]}],middleware:[S()],request:{params:e$1.object({id:e$1.coerce.number().int().positive()})},responses:{200:p(rr,"Delete a todo"),404:c("Todo not found")}}),fu=g$1({method:"post",path:"/todos/{id}/attachments",tags:["todos"],security:[{Bearer:[]}],middleware:[S()],request:{params:e$1.object({id:e$1.coerce.number().int().positive()}),body:{required:true,content:{"multipart/form-data":{schema:or}}}},responses:{201:p(it,"File uploaded successfully"),404:c("Todo not found"),400:c("Invalid file or file too large")}}),yu=g$1({method:"get",path:"/todos/{id}/attachments",tags:["todos"],security:[{Bearer:[]}],middleware:[S()],request:{params:e$1.object({id:e$1.coerce.number().int().positive()})},responses:{200:p(at,"List attachments"),404:c("Todo not found")}}),Su=g$1({method:"get",path:"/todos/{id}/with-attachments",tags:["todos"],security:[{Bearer:[]}],middleware:[S()],request:{params:e$1.object({id:e$1.coerce.number().int().positive()})},responses:{200:p(nr,"Get todo with attachments"),404:c("Todo not found")}}),wu=g$1({method:"delete",path:"/todos/{todoId}/attachments/{attachmentId}",tags:["todos"],security:[{Bearer:[]}],middleware:[S()],request:{params:e$1.object({todoId:e$1.coerce.number().int().positive(),attachmentId:e$1.coerce.number().int().positive()})},responses:{200:p(sr,"Attachment deleted"),404:c("Attachment not found")}}),Qs=new f$1().openapi(du,async e=>{let t=await ps();return e.json(l(t),200)}).openapi(lu,async e=>{let{id:t}=e.req.valid("param"),n=await ot(t);if(!n)throw new w("Todo",String(t));return e.json(l(n),200)}).openapi(mu,async e=>{let t=e.req.valid("json"),n=await ds(t);return e.json(O(n),201)}).openapi(gu,async e=>{let{id:t}=e.req.valid("param"),n=e.req.valid("json"),o=await ls(t,n);if(!o)throw new w("Todo",String(t));return e.json(l(o),200)}).openapi(hu,async e=>{let{id:t}=e.req.valid("param");if(!await ms(t))throw new w("Todo",String(t));return e.json(l({id:t}),200)}).openapi(fu,async e=>{let{id:t}=e.req.valid("param");if(!await ot(t))throw new w("Todo",String(t));let s=e.req.valid("form").file;if(!s||!(s instanceof File))throw new Ee("No file uploaded");let i=U(e),a=await s.arrayBuffer();try{let d=await gs(t,{name:s.name,type:s.type,size:s.size,data:a},i?.id);return e.json(O(d),201)}catch(d){throw new Ee(d.message)}}).openapi(yu,async e=>{let{id:t}=e.req.valid("param");if(!await ot(t))throw new w("Todo",String(t));let o=await xn(t);return e.json(l(o),200)}).openapi(Su,async e=>{let{id:t}=e.req.valid("param"),n=await hs(t);if(!n)throw new w("Todo",String(t));return e.json(l(n),200)}).openapi(wu,async e=>{let{attachmentId:t}=e.req.valid("param");if(!await fs(t))throw new w("Attachment",String(t));return e.json(l({id:t}),200)}).doc("/docs",{openapi:"3.0.0",info:{version:"1.0.0",title:"Todo API"}});var Ru=g$1({method:"get",path:"/permissions/roles",tags:["permissions"],responses:{200:p(k.array(),"Get all roles")}}),bu=g$1({method:"get",path:"/permissions",tags:["permissions"],responses:{200:p(l$2.array(),"Get all permissions")}}),vu=g$1({method:"get",path:"/permissions/me",tags:["permissions"],security:[{Bearer:[]}],middleware:[S()],responses:{200:p(m$1,"Get current user permissions"),401:c("Unauthorized")}}),xu=g$1({method:"get",path:"/permissions/menu-config",tags:["permissions"],responses:{200:p(n$1,"Get menu configuration")}}),Tu=g$1({method:"get",path:"/permissions/page-permissions",tags:["permissions"],responses:{200:p(o,"Get page permissions configuration")}}),Cu=g$1({method:"get",path:"/permissions/categories",tags:["permissions"],responses:{200:p(p$1,"Get permission categories")}}),Au=g$1({method:"get",path:"/permissions/role-labels",tags:["permissions"],responses:{200:p(q,"Get role labels")}}),Eu=g$1({method:"get",path:"/permissions/permission-labels",tags:["permissions"],responses:{200:p(r$1,"Get permission labels")}}),Pu=g$1({method:"get",path:"/permissions/my-menu",tags:["permissions"],security:[{Bearer:[]}],middleware:[S()],responses:{200:p(n$1,"Get user menu configuration"),401:c("Unauthorized")}}),Iu=g$1({method:"get",path:"/permissions/init",tags:["permissions"],security:[{Bearer:[]}],middleware:[S()],responses:{200:p(s,"Get permission initialization data"),401:c("Unauthorized")}}),Js=new f$1().openapi(Ru,async e=>{let t=await D.getAllRoles();return e.json(l(t),200)}).openapi(bu,async e=>{let t=await D.getAllPermissions();return e.json(l(t),200)}).openapi(vu,async e=>{let t=U(e),o=(await D.getUserPermissions(t.id,t.role)).map(s=>s.code);return e.json(l({userId:t.id,role:t.role,permissions:o}),200)}).openapi(xu,async e=>{let t=x();return e.json(l(t),200)}).openapi(Tu,async e=>{let t=y();return e.json(l(t),200)}).openapi(Cu,async e=>{let t=z$1();return e.json(l(t),200)}).openapi(Au,async e=>{let t=A();return e.json(l(t),200)}).openapi(Eu,async e=>{let t=B();return e.json(l(t),200)}).openapi(Pu,async e=>{let t=U(e),n=await D.getUserMenuConfig(t.id,t.role);return e.json(l(n),200)}).openapi(Iu,async e=>{let t=U(e),[n,o,s]=await Promise.all([D.getUserPermissions(t.id,t.role),D.getUserMenuConfig(t.id,t.role),D.getUserPagePermissions(t.id,t.role)]),i=n.map(a=>a.code);return e.json(l({permissions:i,menuConfig:o,pagePermissions:s,role:t.role}),200)});var Ys=e$1.union([e$1.string(),e$1.date(),e$1.null()]).transform(e=>e instanceof Date?e.toISOString():e===null?new Date().toISOString():e),wt=e$1.object({id:e$1.string(),code:e$1.string(),name:e$1.string(),label:e$1.string(),description:e$1.string().optional().nullable(),isSystem:e$1.boolean().nullable(),isActive:e$1.boolean().nullable(),sortOrder:e$1.number().nullable(),createdAt:Ys,updatedAt:Ys}),Zs=e$1.object({code:e$1.string().min(1),name:e$1.string().min(1),label:e$1.string().min(1),description:e$1.string().nullish(),sortOrder:e$1.number().nullish()}),Xs=e$1.object({name:e$1.string().nullish(),label:e$1.string().nullish(),description:e$1.string().nullish(),sortOrder:e$1.number().nullish(),isActive:e$1.boolean().nullish()}),ei=e$1.object({permissionIds:e$1.array(e$1.string())}),to=e$1.object({});var Du={"user:create":["user:view"],"user:edit":["user:view"],"user:delete":["user:view"],"content:create":["content:view"],"content:edit":["content:view"],"content:delete":["content:view"],"order:process":["order:view"],"order:cancel":["order:view"],"order:complete":["order:view"],"ticket:reply":["ticket:view"],"ticket:close":["ticket:view"],"data:export":["user:view"],"system:settings":["system:logs"]};function ti(e){let t=[];for(let n of e){let o=Du[n];if(o){let s=o.filter(i=>!e.includes(i));s.length>0&&t.push(`\u6743\u9650 "${n}" \u9700\u8981\u4EE5\u4E0B\u6743\u9650: ${s.join(", ")}`);}}return {valid:t.length===0,errors:t}}var ku=wt.extend({permissions:e$1.array(e$1.string())}),Uu=g$1({method:"get",path:"/roles",tags:["roles"],security:[{Bearer:[]}],middleware:[S({requiredRole:"super_admin"})],responses:{200:p(wt.array(),"Get all roles"),401:c("Unauthorized"),403:c("Forbidden")}}),Ou=g$1({method:"get",path:"/roles/:id",tags:["roles"],security:[{Bearer:[]}],middleware:[S({requiredRole:"super_admin"})],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(ku,"Get role by ID"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Role not found")}}),Nu=g$1({method:"post",path:"/roles",tags:["roles"],security:[{Bearer:[]}],middleware:[S({requiredRole:"super_admin"})],request:{body:{content:{"application/json":{schema:Zs}}}},responses:{200:p(wt,"Role created"),401:c("Unauthorized"),403:c("Forbidden"),400:c("Invalid request")}}),ju=g$1({method:"put",path:"/roles/:id",tags:["roles"],security:[{Bearer:[]}],middleware:[S({requiredRole:"super_admin"})],request:{params:e$1.object({id:e$1.string()}),body:{content:{"application/json":{schema:Xs}}}},responses:{200:p(wt,"Role updated"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Role not found")}}),qu=g$1({method:"delete",path:"/roles/:id",tags:["roles"],security:[{Bearer:[]}],middleware:[S({requiredRole:"super_admin"})],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(to,"Role deleted"),401:c("Unauthorized"),403:c("Forbidden"),400:c("Cannot delete system role")}}),Mu=g$1({method:"put",path:"/roles/:id/permissions",tags:["roles"],security:[{Bearer:[]}],middleware:[S({requiredRole:"super_admin"})],request:{params:e$1.object({id:e$1.string()}),body:{content:{"application/json":{schema:ei}}}},responses:{200:p(to,"Role permissions updated"),400:c("Permission dependency validation failed"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Role not found")}}),ri=new f$1().openapi(Uu,async e=>{let t=await w$1.getAll();return e.json(l(t),200)}).openapi(Ou,async e=>{let{id:t}=e.req.valid("param"),n=await w$1.getById(t);if(!n)return e.json({success:false,error:"Role not found"},404);let o=await D.getRolePermissions(t);return e.json(l({...n,permissions:o.map(s=>s.code)}),200)}).openapi(Nu,async e=>{let t=e.req.valid("json"),n=await w$1.create({id:`role_${Date.now()}`,...t,sortOrder:t.sortOrder??0});return e.json(l(n),200)}).openapi(ju,async e=>{let{id:t}=e.req.valid("param"),n=e.req.valid("json"),o=Object.fromEntries(Object.entries(n).filter(([i,a])=>a!=null)),s=await w$1.update(t,o);return s?e.json(l(s),200):e.json({success:false,error:"Role not found"},404)}).openapi(qu,async e=>{let{id:t}=e.req.valid("param");return await w$1.delete(t)?e.json(l({}),200):e.json({success:false,error:"Cannot delete system role or role not found"},400)}).openapi(Mu,async e=>{let{id:t}=e.req.valid("param"),{permissionIds:n}=e.req.valid("json"),o=await w$1.getById(t);if(!o)return e.json({success:false,error:"Role not found"},404);if(o.code==="super_admin")return e.json({success:false,error:"Cannot modify super admin permissions"},403);let s=ti(n);if(!s.valid)return e.json({success:false,error:"\u6743\u9650\u4F9D\u8D56\u6821\u9A8C\u5931\u8D25",details:s.errors.map(h=>({message:h}))},400);let a=(await Promise.all(n.map(h=>D.getByCode(h)))).filter(h=>h!==void 0).map(h=>h.id),m=(await D.getRolePermissions(t)).map(h=>h.id);for(let h of m)a.includes(h)||await D.revokePermissionFromRole(t,h);for(let h of a)m.includes(h)||await D.assignPermissionToRole(t,h);return e.json(l({}),200)});var ro=e$1.enum(Object.values(E)),no=e$1.enum(Object.values(L)),oo=e$1.object({id:e$1.string(),userId:e$1.string(),action:no,resourceType:ro,resourceId:e$1.string().nullable(),oldValue:e$1.string().nullable(),newValue:e$1.string().nullable(),ipAddress:e$1.string().nullable(),userAgent:e$1.string().nullable(),createdAt:e$1.union([e$1.string(),e$1.date()]).transform(e=>e instanceof Date?e.toISOString():e)});var Lu=g$1({method:"get",path:"/audit-logs",tags:["audit-logs"],security:[{Bearer:[]}],middleware:[S()],request:{query:e$1.object({limit:e$1.string().optional(),offset:e$1.string().optional(),userId:e$1.string().optional(),action:no.optional(),resourceType:ro.optional()})},responses:{200:p(oo.array(),"Get audit logs"),401:c("Unauthorized")}}),_u=g$1({method:"get",path:"/audit-logs/:id",tags:["audit-logs"],security:[{Bearer:[]}],middleware:[S()],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(oo,"Get audit log by ID"),404:c("Audit log not found"),401:c("Unauthorized")}}),ni=new f$1().openapi(Lu,async e=>{let t=e.req.valid("query"),n=t.limit?parseInt(t.limit):50,o=t.offset?parseInt(t.offset):0;if(t.userId||t.action||t.resourceType){let i=await Be.search({userId:t.userId,action:t.action,resourceType:t.resourceType});return e.json(l(i.slice(o,o+n)),200)}let s=await Be.getAll(n,o);return e.json(l(s),200)}).openapi(_u,async e=>{let{id:t}=e.req.valid("param"),o=(await Be.getAll(1e3,0)).find(s=>s.id===t);return o?e.json(l(o),200):e.json({success:false,error:"Audit log not found"},404)});f();var Ce=[];function Or(e){let t=[...Ce];e.unreadOnly&&(t=t.filter(a=>!a.read)),t.sort((a,d)=>new Date(d.createdAt).getTime()-new Date(a.createdAt).getTime());let n=e.limit??20,o=0;if(e.cursor){let a=t.findIndex(d=>d.id===e.cursor);a!==-1&&(o=a+1);}let s=t.slice(o,o+n),i=s.length===n?s[s.length-1]?.id:void 0;return {data:s,nextCursor:i}}function oi(e){return Ce.find(t=>t.id===e)}function zu(e){let t={id:ee(),type:e.type,title:e.title,message:e.message,read:false,createdAt:new Date().toISOString()};return Ce.unshift(t),t}async function Nr(e$1){let t=zu(e$1);try{await rt.broadcast("notification",t);}catch(n){e.module("notification").debug({error:String(n)},"Broadcast failed");}return t}function jr(e){let t=Ce.find(n=>n.id===e);return t&&(t.read=true),t}function qr(){let e=0;return Ce.forEach(t=>{t.read||(t.read=true,e++);}),e}function si(e){let t=Ce.findIndex(n=>n.id===e);return t!==-1?(Ce.splice(t,1),true):false}function Rt(){return Ce.filter(e=>!e.read).length}function ai(){let e=new ReadableStream({start(t){let n=new TextEncoder,o=()=>{t.enqueue(n.encode(`event: ping
|
|
17
|
+
data: {"timestamp":${Date.now()}}
|
|
18
|
+
|
|
19
|
+
`));};o();let s=setInterval(o,3e4);setTimeout(()=>{clearInterval(s),t.close();},3e5);}});return new Response(e,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}var Bu=g$1({method:"get",path:"/notifications/stream",tags:["notifications"],responses:{200:{content:{"text/event-stream":{schema:He}},description:"SSE stream for notifications"},500:c("Internal server error")}}),Fu=g$1({method:"get",path:"/notifications",tags:["notifications"],request:{query:e$1.object({unreadOnly:e$1.string().optional(),limit:e$1.string().optional(),cursor:e$1.string().optional()})},responses:{200:Gs(te,"List notifications"),500:c("Internal server error")}}),$u=g$1({method:"get",path:"/notifications/unread-count",tags:["notifications"],responses:{200:p(ke,"Get unread count"),500:c("Internal server error")}}),Hu=g$1({method:"get",path:"/notifications/{id}",tags:["notifications"],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(te,"Get notification by ID"),404:c("Notification not found")}}),Wu=g$1({method:"post",path:"/notifications",tags:["notifications"],request:{body:{content:{"application/json":{schema:ir}}}},responses:{201:p(te,"Create notification"),400:c("Invalid input")}}),Vu=g$1({method:"patch",path:"/notifications/read-all",tags:["notifications"],responses:{200:p(ke,"Mark all as read"),500:c("Internal server error")}}),Gu=g$1({method:"patch",path:"/notifications/{id}/read",tags:["notifications"],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(te,"Mark as read"),404:c("Notification not found")}}),Ku=g$1({method:"delete",path:"/notifications/{id}",tags:["notifications"],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(ar,"Delete notification"),404:c("Notification not found")}}),ci=new f$1().openapi(Bu,async e=>{let t=e.env;if(t?.REALTIME_DO){let n=t.REALTIME_DO.idFromName("global"),o=t.REALTIME_DO.get(n),s=new Request(e.req.url,{method:e.req.method,headers:e.req.raw.headers});return o.fetch(s)}try{let n=b$2();if(n.handleSSERequest)return await n.handleSSERequest()}catch{return ai()}return ai()}).openapi(Fu,async e=>{let t=e.req.valid("query"),n=Or({unreadOnly:t.unreadOnly==="true",limit:t.limit?parseInt(t.limit):20,cursor:t.cursor});return e.json(l({items:n.data,nextCursor:n.nextCursor}),200)}).openapi($u,async e=>{let t=Rt();return e.json(l({count:t}),200)}).openapi(Hu,async e=>{let{id:t}=e.req.valid("param"),n=oi(t);if(!n)throw new w("Notification",t);return e.json(l(n),200)}).openapi(Wu,async e=>{let t=e.req.valid("json"),n=await Nr(t);return e.json(O(n),201)}).openapi(Vu,async e=>{let t=qr();return e.json(l({count:t}),200)}).openapi(Gu,async e=>{let{id:t}=e.req.valid("param"),n=jr(t);if(!n)throw new w("Notification",t);return e.json(l(n),200)}).openapi(Ku,async e=>{let{id:t}=e.req.valid("param");if(!si(t))throw new w("Notification",t);return e.json(l({id:t}),200)});var Mr=dn("/chat/ws");Mr.registerRPC("echo",e=>({message:e.message,timestamp:Date.now()}));Mr.registerRPC("ping",()=>({pong:true,timestamp:Date.now()}));Mr.registerEvent("broadcast",(e,t)=>{Mr.broadcast("broadcast",e,[t]);});var Qu=g$1({method:"get",path:"/chat/ws/status",tags:["chat"],responses:{200:p(An,"Get WebSocket status")}}),Ju=g$1({method:"get",path:"/chat/ws",tags:["chat"],responses:{200:{content:{websocket:{schema:Cn}},description:"WebSocket endpoint for chat"}}}),ui=new f$1().openapi(Qu,async e=>e.json(l({connectedClients:0}))).openapi(Ju,async e=>{let t=b$2();return t.handleWebSocketRequest?t.handleWebSocketRequest(e.req.raw):new Response("WebSocket not supported",{status:500})});m();r();v();var so=null,io=false;async function bt(){if(io)return so;try{return so=(await import('./schema-DVEMT3X2.js')).todos??null,io=!0,so}catch{return io=true,null}}async function pi(){let e=await j$2();if(e&&"execute"in e){let s=await e.execute("SELECT COUNT(*) as count FROM todos"),i=await e.execute("SELECT COUNT(*) as count FROM todos WHERE status = 'pending'"),a=await e.execute("SELECT COUNT(*) as count FROM todos WHERE status = 'completed'"),d=m=>{let h=m[0];return typeof h?.count=="number"?h.count:0};return {totalTodos:d(s.rows),pendingTodos:d(i.rows),completedTodos:d(a.rows),lastUpdated:new Date().toISOString()}}let t=await bt();if(!t)return {totalTodos:0,pendingTodos:0,completedTodos:0,lastUpdated:new Date().toISOString()};let o=await(await i()).select().from(t);return {totalTodos:o.length,pendingTodos:o.filter(s=>s.status==="pending").length,completedTodos:o.filter(s=>s.status==="completed").length,lastUpdated:new Date().toISOString()}}async function di(){try{let e=await bt();return e?(await(await i()).select().from(e).limit(1),{database:"connected",timestamp:new Date().toISOString()}):{database:"disconnected",timestamp:new Date().toISOString()}}catch{return {database:"disconnected",timestamp:new Date().toISOString()}}}async function li(){let e=await bt();return e?{deletedCount:(await(await i()).delete(e).returning()).length}:{deletedCount:0}}async function mi(e=10){let t$1=await bt();return t$1?(await(await i()).select().from(t$1).orderBy(n(t$1.updatedAt)).limit(e)).map(s=>({id:s.id,title:s.title,status:s.status,updatedAt:t(s.updatedAt)})):[]}var Yu="$2b$10$9iWkIfjDcJ7Kv4wHSb8ONONnrlfGb6rcfiJlZuuY4G2xQMG78DBbm";async function Lr(e){let n=Re().find(m=>m.username===e.username);if(!n)throw new Error("Invalid credentials");let s=pn().get(n.id);if(!(s?await uo.compare(e.password,s):await uo.compare(e.password,Yu)))throw new Error("Invalid credentials");let a=Yo(),d;for(let[m,h]of a)if(h===n.id){d=m;break}return d||(d=`test-token-${n.id}-${Date.now()}`,a.set(d,n.id)),{user:{id:n.id,username:n.username,email:n.email,role:n.role,avatar:n.avatar,permissions:h$2(n.role)},token:d}}async function _r(e){let t=Re();if(t.find(i=>i.username===e.username||i.email===e.email))throw new Error("User already exists");let o=await uo.hash(e.password,10),s={id:String(t.length+1),username:e.username,email:e.email,role:"user",status:"active",avatar:`https://api.dicebear.com/7.x/avataaars/svg?seed=${e.username}`,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return t.push(s),pn().set(s.id,o),s}async function gi(){return Re()}async function hi(e){return Re().find(n=>n.id===e)||null}async function fi(e,t){let n=Re(),o=n.findIndex(a=>a.id===e);if(o===-1)throw new Error("User not found");let s=Object.fromEntries(Object.entries(t).filter(([a,d])=>d!=null)),i={...n[o],...s,updatedAt:new Date().toISOString()};return n[o]=i,i}async function yi(e){let t=Re(),n=t.findIndex(o=>o.id===e);if(n===-1)throw new Error("User not found");t.splice(n,1);}async function Si(e){let t=Re();if(t.find(s=>s.username===e.username||s.email===e.email))throw new Error("User with this username or email already exists");let o={id:`user-${Date.now()}`,username:e.username,email:e.email,role:e.role,status:e.status||"active",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return t.push(o),o}async function zr(){let e=await bt();return e?(await(await i()).select().from(e).orderBy(n(e.createdAt))).map(o=>({id:o.id,title:o.title,completed:o.status==="completed",createdAt:t(o.createdAt)})):[]}var ao=new Map,co=new Map;async function wi(e){if(ao.has(e))return ao.get(e);let t=await fetch(`https://api.dicebear.com/7.x/avataaars/png?seed=${e}`);if(!t.ok)return null;let o={data:await t.blob(),contentType:"image/png"};return ao.set(e,o),o}async function Ri(e){if(co.has(e))return co.get(e);let n={home:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-6 6 6 6-6 9 9 6-6-9-9z"></path><path d="M9 21l6-6 6 6-6 9 9 6-6 9-9z"></path></svg>',settings:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 3 3 3 3 3 0 0 6.3 6.3A1.65 1.65 0 0 3 3 3 3 3 0 0 6.3 6.3a1.65 1.65 0 0 3 3 3 3 3 0 0 6.3 6.3z"></path></svg>',user:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 21v-2a4 4 0 0 0 1-3 1H4a4 4 0 0 0 1 3v2"></path><circle cx="12" cy="7" r="4"></circle><path d="M16 11.37A4 4 0 1 1.8 2.44L8 2.44A4 4 0 1 1.8 2z"></path></svg>',bell:'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 8A6 6 0 0 0 6 6c0 1.1.9 2.1 2.1-2 2.1-.9.9-.9 2.1-2 2.1A6 6 0 0 0 6-6 7-9l1-1.1c.7-.7 1.9-2 2.1-.9-.9-.9-2.1-2-2.1A6 6 0 0 0-6 6-7 9l-1 1.1c-.7.7-1.9 2-2.1.9.9.9 2.1 2 2.1z"></path><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2z"></path><line x1="15" y1="12"></line><line x1="15" y1="9"></line></svg>'}[e];return n?(co.set(e,n),n):null}var bi=e$1.object({totalTodos:e$1.number(),pendingTodos:e$1.number(),completedTodos:e$1.number(),lastUpdated:e$1.string()}),vi=e$1.object({database:e$1.enum(["connected","disconnected"]),timestamp:e$1.string()}),Zu=e$1.object({id:e$1.number(),title:e$1.string(),status:e$1.string(),updatedAt:e$1.string()}),xi=e$1.array(Zu),vt=e$1.object({id:e$1.string(),username:e$1.string(),email:e$1.string(),role:i$2,avatar:e$1.string().nullish(),permissions:e$1.array(j)}),Br=e$1.object({username:e$1.string().min(1),password:e$1.string().min(6)}),Fr=e$1.object({user:vt,token:e$1.string()}),$r=e$1.object({username:e$1.string().min(1),email:e$1.string().email(),password:e$1.string().min(6)}),ye=e$1.object({id:e$1.string(),username:e$1.string(),email:e$1.string(),role:i$2,status:e$1.enum(["active","inactive","locked"]),avatar:e$1.string().nullish(),createdAt:e$1.string(),updatedAt:e$1.string()}),Ti=e$1.array(ye),Ci=e$1.object({username:e$1.string().nullish(),email:e$1.string().email().nullish(),role:i$2.nullish(),status:e$1.enum(["active","inactive","locked"]).nullish()}),Ai=e$1.object({username:e$1.string().min(1),email:e$1.string().email(),password:e$1.string().min(6),role:i$2,status:e$1.enum(["active","inactive","locked"]).nullish().default("active")}),Ei=e$1.object({deletedCount:e$1.number()}),Hr=e$1.object({}),Pi=e$1.object({token:e$1.string(),downloadUrl:e$1.string(),expiresIn:e$1.number()});var Xu=g$1({method:"get",path:"/admin/me",tags:["admin"],security:[{Bearer:[]}],middleware:[S()],responses:{200:p(vt,"Get current authenticated user"),401:c("Unauthorized")}}),ep=g$1({method:"post",path:"/admin/login",tags:["admin"],middleware:[_e],request:{body:{content:{"application/json":{schema:Br}}}},responses:{200:p(Fr,"Login successful"),401:c("Invalid credentials")}}),tp=g$1({method:"post",path:"/admin/register",tags:["admin"],middleware:[_e],request:{body:{content:{"application/json":{schema:$r}}}},responses:{201:p(ye,"User registered"),400:c("User already exists")}}),Ii=new f$1().openapi(Xu,async e=>{let t=U(e);return e.json(l(t),200)}).openapi(ep,async e=>{try{let t=e.req.valid("json"),n=await Lr(t);return e.json(l(n),200)}catch{return e.json({success:false,error:"Invalid credentials"},401)}}).openapi(tp,async e=>{let t=e.req.valid("json"),n=await _r(t);return e.json(l(n),201)});var rp=g$1({method:"get",path:"/admin/users",tags:["admin"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["user:view"]})],responses:{200:p(Ti,"Get user list"),401:c("Unauthorized"),403:c("Forbidden")}}),np=g$1({method:"get",path:"/admin/users/:id",tags:["admin"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["user:view"]})],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(ye,"Get user"),401:c("Unauthorized"),403:c("Forbidden"),404:c("User not found")}}),op=g$1({method:"put",path:"/admin/users/:id",tags:["admin"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["user:edit"]})],request:{params:e$1.object({id:e$1.string()}),body:{content:{"application/json":{schema:Ci}}}},responses:{200:p(ye,"User updated"),401:c("Unauthorized"),403:c("Forbidden"),404:c("User not found")}}),sp=g$1({method:"delete",path:"/admin/users/:id",tags:["admin"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["user:delete"]})],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(Hr,"User deleted"),401:c("Unauthorized"),403:c("Forbidden"),404:c("User not found")}}),ip=g$1({method:"post",path:"/admin/users",tags:["admin"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["user:create"]})],request:{body:{content:{"application/json":{schema:Ai}}}},responses:{200:p(ye,"User created"),401:c("Unauthorized"),403:c("Forbidden"),400:c("Invalid request")}}),Di=new f$1().openapi(rp,async e=>{let t=await gi();return e.json(l(t),200)}).openapi(np,async e=>{let{id:t}=e.req.valid("param"),n=await hi(t);return n?e.json(l(n),200):e.json({success:false,error:"User not found"},404)}).openapi(op,async e=>{let{id:t}=e.req.valid("param"),n=e.req.valid("json"),o=await fi(t,n);return e.json(l(o),200)}).openapi(sp,async e=>{let{id:t}=e.req.valid("param");return await yi(t),e.json(l({}),200)}).openapi(ip,async e=>{let t=e.req.valid("json"),n=await Si(t);return e.json(l(n),200)});f();function ki(){let e=new ReadableStream({start(t){let n=new TextEncoder,o=()=>{t.enqueue(n.encode(`event: ping
|
|
20
|
+
data: {"timestamp":${Date.now()}}
|
|
21
|
+
|
|
22
|
+
`));};o();let s=setInterval(o,3e4);setTimeout(()=>{clearInterval(s),t.close();},3e5);}});return new Response(e,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}var ap=g$1({method:"get",path:"/admin/notifications",tags:["notifications"],security:[{Bearer:[]}],middleware:[S()],request:{query:e$1.object({unreadOnly:e$1.string().optional(),limit:e$1.string().optional()})},responses:{200:p(Dn,"Get notifications"),401:c("Unauthorized")}}),cp=g$1({method:"get",path:"/admin/notifications/unread-count",tags:["notifications"],security:[{Bearer:[]}],middleware:[S()],responses:{200:p(ke,"Get unread count"),401:c("Unauthorized")}}),up=g$1({method:"put",path:"/admin/notifications/:id/read",tags:["notifications"],security:[{Bearer:[]}],middleware:[S()],request:{params:e$1.object({id:e$1.string()})},responses:{200:p(Hr,"Notification marked as read"),401:c("Unauthorized"),404:c("Notification not found")}}),pp=g$1({method:"put",path:"/admin/notifications/read-all",tags:["notifications"],security:[{Bearer:[]}],middleware:[S()],responses:{200:p(kn,"All notifications marked as read"),401:c("Unauthorized")}}),dp=g$1({method:"post",path:"/admin/notifications/test",tags:["notifications"],security:[{Bearer:[]}],middleware:[S({requiredRole:"super_admin"})],request:{body:{content:{"application/json":{schema:Un}}}},responses:{200:p(te,"Test notification sent"),401:c("Unauthorized"),403:c("Forbidden")}}),lp=g$1({method:"get",path:"/admin/notifications/stream",tags:["notifications"],security:[{Bearer:[]}],middleware:[S()],responses:{200:{content:{"text/event-stream":{schema:He}},description:"SSE stream for admin notifications"},401:c("Unauthorized")}}),Ui=new f$1().openapi(ap,async e=>{let{unreadOnly:t,limit:n}=e.req.valid("query"),o=Or({unreadOnly:t==="true",limit:n?parseInt(n,10):20});return e.json(l(o.data),200)}).openapi(cp,async e=>{let t=Rt();return e.json(l({count:t}),200)}).openapi(up,async e$1=>{let{id:t}=e$1.req.valid("param");if(!jr(t))throw new w("Notification",t);try{let o=Rt();await rt.broadcast("unread-count",{count:o});}catch(o){e.module("notification").debug({error:String(o)},"Broadcast failed");}return e$1.json(l({}),200)}).openapi(pp,async e$1=>{let t=qr();try{await rt.broadcast("unread-count",{count:0});}catch(n){e.module("notification").debug({error:String(n)},"Broadcast failed");}return e$1.json(l({count:t}),200)}).openapi(dp,async e=>{let{type:t}=e.req.valid("json"),n=await Nr({type:t??"info",title:t==="warning"?"\u8B66\u544A\u901A\u77E5":t==="error"?"\u9519\u8BEF\u901A\u77E5":t==="success"?"\u6210\u529F\u901A\u77E5":"\u7CFB\u7EDF\u901A\u77E5",message:t==="warning"?"\u8FD9\u662F\u4E00\u6761\u8B66\u544A\u901A\u77E5\uFF0C\u8BF7\u6CE8\u610F\uFF01":t==="error"?"\u8FD9\u662F\u4E00\u6761\u9519\u8BEF\u901A\u77E5\uFF0C\u8BF7\u7ACB\u5373\u5904\u7406\uFF01":t==="success"?"\u64CD\u4F5C\u6210\u529F\u5B8C\u6210\uFF01":"\u8FD9\u662F\u4E00\u6761\u666E\u901A\u4FE1\u606F\u901A\u77E5"});return e.json(l(n),200)}).openapi(lp,async e=>{let t=e.env;if(t?.REALTIME_DO){let n=t.REALTIME_DO.idFromName("global"),o=t.REALTIME_DO.get(n),s=new Request(e.req.url,{method:e.req.method,headers:e.req.raw.headers});return o.fetch(s)}try{let{getRuntimeAdapter:n}=await import('./runtime-HBG2YPJ4.js'),o=n();if(o.handleSSERequest)return await o.handleSSERequest()}catch{return ki()}return ki()});var mp=g$1({method:"get",path:"/admin/avatar/:id",tags:["media"],security:[{Bearer:[]}],middleware:[S()],request:{params:e$1.object({id:e$1.string()})},responses:{200:{content:{"image/png":{schema:e$1.any().openapi({type:"string",format:"binary"})},"image/jpeg":{schema:e$1.any().openapi({type:"string",format:"binary"})}},description:"User avatar image"},401:c("Unauthorized"),404:c("Avatar not found")}}),gp=g$1({method:"get",path:"/admin/icon/:name",tags:["media"],security:[{Bearer:[]}],middleware:[S()],request:{params:e$1.object({name:e$1.string()})},responses:{200:{content:{"image/svg+xml":{schema:e$1.string()}},description:"SVG icon"},401:c("Unauthorized"),404:c("Icon not found")}}),Oi=new f$1().openapi(mp,async e=>{let{id:t}=e.req.valid("param"),n=await wi(t);return n?new Response(n.data,{headers:{"Content-Type":n.contentType}}):e.json({success:false,error:"Avatar not found"},404)}).openapi(gp,async e=>{let{name:t}=e.req.valid("param"),n=await Ri(t);return n?new Response(n,{headers:{"Content-Type":"image/svg+xml"}}):e.json({success:false,error:"Icon not found"},404)});var xt=new Map,hp=()=>{let e=Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15);return xt.set(e,{createdAt:Date.now(),expiresIn:6e4}),setTimeout(()=>xt.delete(e),6e4),e},fp=e=>{let t=xt.get(e);return t?Date.now()-t.createdAt>t.expiresIn?(xt.delete(e),false):true:false},yp=e=>{let t=fp(e);return t&&xt.delete(e),t},Sp=g$1({method:"get",path:"/admin/todos/export",tags:["export"],security:[{Bearer:[]}],middleware:[S()],responses:{200:{content:{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{schema:e$1.any().openapi({type:"string",format:"binary"})},"text/csv":{schema:e$1.string()}},description:"Export todos as Excel or CSV"},401:c("Unauthorized")}}),wp=g$1({method:"post",path:"/admin/todos/export/token",tags:["export"],security:[{Bearer:[]}],middleware:[S()],responses:{200:p(Pi,"Generate a temporary download token"),401:c("Unauthorized")}}),Rp=g$1({method:"get",path:"/admin/todos/export/download/:token",tags:["export"],request:{params:e$1.object({token:e$1.string()})},responses:{200:{content:{"text/csv":{schema:e$1.string()}},description:"Download CSV with temporary token"},403:c("Invalid or expired token")}}),bp=g$1({method:"get",path:"/admin/todos/export/stream",tags:["export"],security:[{Bearer:[]}],middleware:[S()],responses:{200:{content:{"text/csv":{schema:e$1.string()}},description:"Stream export todos as CSV (for large datasets)"},401:c("Unauthorized")}}),Ni=new f$1().openapi(Sp,async e=>{let t=await zr(),n=new TextEncoder,o=new ReadableStream({async start(s){s.enqueue(n.encode(`id,title,completed,created_at
|
|
23
|
+
`));for(let i of t){let a=`${pe(String(i.id))},${pe(i.title)},${i.completed},${pe(i.createdAt)}
|
|
24
|
+
`;s.enqueue(n.encode(a)),await new Promise(d=>setTimeout(d,100));}s.close();}});return new Response(o,{headers:{"Content-Type":"text/csv","Content-Disposition":'attachment; filename="todos.csv"',"Cache-Control":"no-cache","X-Accel-Buffering":"no"}})}).openapi(wp,async e=>{let t=hp(),n=`/api/admin/todos/export/download/${t}`;return e.json(l({token:t,downloadUrl:n,expiresIn:6e4}),200)}).openapi(Rp,async e=>{let{token:t}=e.req.valid("param");if(!yp(t))return e.json({success:false,error:"Invalid or expired token"},403);let n=await zr(),o=new TextEncoder,s=new ReadableStream({async start(i){i.enqueue(o.encode(`id,title,completed,created_at
|
|
25
|
+
`));for(let a of n){let d=`${pe(String(a.id))},${pe(a.title)},${a.completed},${pe(a.createdAt)}
|
|
26
|
+
`;i.enqueue(o.encode(d)),await new Promise(m=>setTimeout(m,100));}i.close();}});return new Response(s,{headers:{"Content-Type":"text/csv","Content-Disposition":'attachment; filename="todos.csv"',"Cache-Control":"no-cache","X-Accel-Buffering":"no"}})}).openapi(bp,async e=>{let t=await zr(),n=new TextEncoder,o=new ReadableStream({async start(s){s.enqueue(n.encode(`id,title,completed,created_at
|
|
27
|
+
`));for(let i=0;i<t.length;i++){let a=t[i],d=`${pe(String(a.id))},${pe(a.title)},${a.completed},${pe(a.createdAt)}
|
|
28
|
+
`;s.enqueue(n.encode(d)),await new Promise(m=>setTimeout(m,300));}s.close();}});return new Response(o,{headers:{"Content-Type":"text/csv","Content-Disposition":'attachment; filename="todos-stream.csv"',"Cache-Control":"no-cache","X-Accel-Buffering":"no"}})});var vp=g$1({method:"get",path:"/admin/stats",tags:["admin"],security:[{Bearer:[]}],middleware:[S({requiredRole:"super_admin"})],responses:{200:p(bi,"Get system statistics"),401:c("Unauthorized"),403:c("Forbidden")}}),xp=g$1({method:"get",path:"/admin/health",tags:["admin"],security:[{Bearer:[]}],middleware:[S({requiredRole:"super_admin"})],responses:{200:p(vi,"Get system health"),401:c("Unauthorized"),403:c("Forbidden")}}),Tp=g$1({method:"get",path:"/admin/activity",tags:["admin"],security:[{Bearer:[]}],middleware:[S({requiredRole:"super_admin"})],request:{query:e$1.object({limit:e$1.string().optional()})},responses:{200:p(xi,"Get recent activity"),401:c("Unauthorized"),403:c("Forbidden")}}),Cp=g$1({method:"delete",path:"/admin/todos/all",tags:["admin"],security:[{Bearer:[]}],middleware:[S({requiredRole:"super_admin"})],responses:{200:p(Ei,"All todos cleared"),401:c("Unauthorized"),403:c("Forbidden")}}),ji=new f$1().openapi(vp,async e=>{let t=await pi();return e.json(l(t),200)}).openapi(xp,async e=>{let t=await di();return e.json(l(t),200)}).openapi(Tp,async e=>{let{limit:t}=e.req.valid("query"),n=t?parseInt(t,10):10,o=await mi(n);return e.json(l(o),200)}).openapi(Cp,async e=>{let t=await li();return e.json(l(t),200)});var Ap=new f$1().route("/",Ii).route("/",Di),Ep=Ap.route("/",Ui).route("/",Oi),Pp=Ep.route("/",Ni).route("/",ji),qi=Pp;var Ip=g$1({method:"post",path:"/auth/login",tags:["auth"],middleware:[_e],request:{body:{content:{"application/json":{schema:Br}}}},responses:{200:p(Fr,"Login successful"),401:c("Invalid credentials")}}),Dp=g$1({method:"post",path:"/auth/register",tags:["auth"],middleware:[_e],request:{body:{content:{"application/json":{schema:$r}}}},responses:{201:p(ye,"User registered"),400:c("User already exists")}}),kp=g$1({method:"get",path:"/auth/me",tags:["auth"],security:[{Bearer:[]}],middleware:[S()],responses:{200:p(vt,"Get current authenticated user"),401:c("Unauthorized")}}),Mi=new f$1().openapi(Ip,async e=>{try{let t=e.req.valid("json"),n=await Lr(t);return e.json(l(n),200)}catch{return e.json({success:false,error:"Invalid credentials"},401)}}).openapi(Dp,async e=>{try{let t=e.req.valid("json"),n=await _r(t);return e.json(l(n),201)}catch{return e.json({success:false,error:"User already exists"},400)}}).openapi(kp,async e=>{let t=U(e);return e.json(l(t),200)});var Oe=new Map;function po(){Op();let e=Math.random().toString(36).substring(2)+Date.now().toString(36),t=Math.random().toString(36).substring(2,7).toUpperCase();Oe.set(e,{code:t,createdAt:Date.now(),attempts:0});let n=Up(t);return {id:e,image:n}}function lo(e,t){let n=Oe.get(e);if(!n)return false;if(Date.now()-n.createdAt>3e5||n.attempts>=3)return Oe.delete(e),false;n.attempts++;let o=n.code.toUpperCase()===t.toUpperCase();return o&&Oe.delete(e),o}function Up(e){let s=e.split("").map((d,m)=>{let h=30+m*30,b=35+Math.random()*10-5,v=(Math.random()-.5)*40,T=Math.random()*360;return `<text
|
|
29
|
+
x="${h}"
|
|
30
|
+
y="${b}"
|
|
25
31
|
font-family="Arial, sans-serif"
|
|
26
32
|
font-size="40"
|
|
27
33
|
font-weight="bold"
|
|
28
|
-
fill="hsl(${
|
|
29
|
-
transform="rotate(${v} ${
|
|
30
|
-
>${
|
|
34
|
+
fill="hsl(${T}, 70%, 30%)"
|
|
35
|
+
transform="rotate(${v} ${h} ${b})"
|
|
36
|
+
>${d}</text>`}).join(""),i=Array.from({length:50},()=>{let d=Math.random()*200,m=Math.random()*60,h=Math.random()*2;return `<circle cx="${d}" cy="${m}" r="${h}" fill="rgba(${Math.random()*255}, ${Math.random()*255}, ${Math.random()*255}, 0.5)" />`}).join(""),a=Array.from({length:5},()=>{let d=Math.random()*200,m=Math.random()*60,h=Math.random()*200,b=Math.random()*60;return `<line x1="${d}" y1="${m}" x2="${h}" y2="${b}" stroke="rgba(${Math.random()*255}, ${Math.random()*255}, ${Math.random()*255}, 0.3)" stroke-width="1" />`}).join("");return `data:image/svg+xml;base64,${Buffer.from(`
|
|
31
37
|
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="60">
|
|
32
38
|
<rect width="100%" height="100%" fill="#f0f0f0" />
|
|
33
39
|
${i}
|
|
34
40
|
${a}
|
|
35
|
-
${
|
|
41
|
+
${s}
|
|
36
42
|
</svg>
|
|
37
|
-
`).toString("base64")}`}function Ya(){let e=Date.now();for(let[t,r]of fe.entries())e-r.createdAt>3e5&&fe.delete(t);}var Ds=e$1.object({id:e$1.string(),image:e$1.string()}),Us=e$1.object({id:e$1.string(),code:e$1.string()}),Os=e$1.object({message:e$1.string()});var Ja=g$1({method:"get",path:"/captcha",tags:["captcha"],responses:{200:p(Ds,"Get captcha")}}),Za=g$1({method:"post",path:"/verify-captcha",tags:["captcha"],request:{body:{content:{"application/json":{schema:Us}}}},responses:{200:p(Os,"Captcha verified"),400:c("Invalid captcha")}}),Ns=new f$1().openapi(Ja,e=>{let{id:t,image:r}=qr();return e.json(l({id:t,image:r}),200)}).openapi(Za,async e=>{let{id:t,code:r}=e.req.valid("json");if(jr(t,r)){let n=a$1(e,"session_id");return n&&nr(n),e.json(l({message:"\u9A8C\u8BC1\u6210\u529F"}),200)}else return e.json({success:false,error:"\u9A8C\u8BC1\u7801\u9519\u8BEF\u6216\u5DF2\u8FC7\u671F"},400)});n();V();O();v();Ve();Ge();async function Ms(e){let t$1=await R(),r=[];return e?.status&&r.push(g(A$1.status,e.status)),e?.customerName&&r.push(i(l$1(A$1.customerName,`%${e.customerName}%`),l$1(A$1.customerEmail,`%${e.customerName}%`))),(r.length>0?await t$1.select().from(A$1).where(h$1(...r)).orderBy(m(A$1.createdAt)):await t$1.select().from(A$1).orderBy(m(A$1.createdAt))).map(n=>({id:`order-${n.id}`,orderNo:n.orderNo,customerName:n.customerName,customerEmail:n.customerEmail,productName:n.productName,amount:n.amount,status:n.status,createdAt:t(n.createdAt),updatedAt:t(n.updatedAt)}))}async function _s(e){let t$1=await R(),r=x("order",e);if(r===-1)return null;let n=(await t$1.select().from(A$1).where(g(A$1.id,r)))[0];return n?{id:`order-${n.id}`,orderNo:n.orderNo,customerName:n.customerName,customerEmail:n.customerEmail,productName:n.productName,amount:n.amount,status:n.status,createdAt:t(n.createdAt),updatedAt:t(n.updatedAt)}:null}async function Ls(e){let t$1=await R(),r=new Date,n=(await t$1.insert(A$1).values({orderNo:ks(),customerName:e.customerName,customerEmail:e.customerEmail,productName:e.productName,amount:e.amount,status:"pending",createdAt:r,updatedAt:r}).returning())[0];return {id:`order-${n.id}`,orderNo:n.orderNo,customerName:n.customerName,customerEmail:n.customerEmail,productName:n.productName,amount:n.amount,status:n.status,createdAt:t(n.createdAt),updatedAt:t(n.updatedAt)}}async function Fs(e,t$1){let r=await R(),s=x("order",e);if(s===-1)return null;let n={updatedAt:new Date};t$1.status!==void 0&&t$1.status!==null&&(n.status=t$1.status);let i=await r.update(A$1).set(n).where(g(A$1.id,s)).returning();if(i.length===0)return null;let a=i[0];return {id:`order-${a.id}`,orderNo:a.orderNo,customerName:a.customerName,customerEmail:a.customerEmail,productName:a.productName,amount:a.amount,status:a.status,createdAt:t(a.createdAt),updatedAt:t(a.updatedAt)}}async function zs(e){let t=await R(),r=x("order",e);return r===-1?{message:"\u8BA2\u5355\u4E0D\u5B58\u5728"}:(await t.delete(A$1).where(g(A$1.id,r)).returning()).length===0?{message:"\u8BA2\u5355\u4E0D\u5B58\u5728"}:{message:"\u8BA2\u5355\u5DF2\u5220\u9664"}}async function Bs(e){let t$1=await R(),r=x("order",e);if(r===-1)return null;let n=(await t$1.select().from(A$1).where(g(A$1.id,r)))[0];if(!n||n.status!=="pending")return null;let a=(await t$1.update(A$1).set({status:"processing",updatedAt:new Date}).where(g(A$1.id,r)).returning())[0];return {id:`order-${a.id}`,orderNo:a.orderNo,customerName:a.customerName,customerEmail:a.customerEmail,productName:a.productName,amount:a.amount,status:a.status,createdAt:t(a.createdAt),updatedAt:t(a.updatedAt)}}async function $s(e){let t$1=await R(),r=x("order",e);if(r===-1)return null;let n=(await t$1.select().from(A$1).where(g(A$1.id,r)))[0];if(!n||n.status!=="pending"&&n.status!=="processing")return null;let a=(await t$1.update(A$1).set({status:"cancelled",updatedAt:new Date}).where(g(A$1.id,r)).returning())[0];return {id:`order-${a.id}`,orderNo:a.orderNo,customerName:a.customerName,customerEmail:a.customerEmail,productName:a.productName,amount:a.amount,status:a.status,createdAt:t(a.createdAt),updatedAt:t(a.updatedAt)}}var Mr=e$1.enum(["pending","processing","completed","cancelled","disputed"]),L=e$1.object({id:e$1.string(),orderNo:e$1.string(),customerName:e$1.string(),customerEmail:e$1.string(),productName:e$1.string(),amount:e$1.number(),status:Mr,createdAt:e$1.string(),updatedAt:e$1.string()}),Ws=e$1.object({customerName:e$1.string(),customerEmail:e$1.string().email(),productName:e$1.string(),amount:e$1.number().positive()}),Hs=e$1.object({status:Mr.nullish()}),Vs=e$1.array(L),Gs=e$1.object({status:Mr.nullish(),customerName:e$1.string().nullish(),limit:e$1.coerce.number().int().positive().max(100).default(20),offset:e$1.coerce.number().int().min(0).default(0)}),Ks=e$1.object({message:e$1.string()});e$1.object({orderId:e$1.string()});e$1.object({orderId:e$1.string(),reason:e$1.string().nullish()});var Qa=g$1({method:"get",path:"/orders",tags:["orders"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["order:view"]})],request:{query:Gs},responses:{200:p(Vs,"List all orders"),401:c("Unauthorized"),403:c("Forbidden"),500:c("Internal server error")}}),ec=g$1({method:"get",path:"/orders/{id}",tags:["orders"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["order:view"]})],request:{params:L.pick({id:true})},responses:{200:p(L,"Get order by id"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Order not found"),500:c("Internal server error")}}),tc=g$1({method:"post",path:"/orders",tags:["orders"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["order:create"]})],request:{body:{content:{"application/json":{schema:Ws}}}},responses:{201:p(L,"Create order"),401:c("Unauthorized"),403:c("Forbidden"),400:c("Invalid input"),500:c("Internal server error")}}),rc=g$1({method:"put",path:"/orders/{id}",tags:["orders"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["order:edit"]})],request:{params:L.pick({id:true}),body:{content:{"application/json":{schema:Hs}}}},responses:{200:p(L,"Update order"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Order not found"),400:c("Invalid input"),500:c("Internal server error")}}),oc=g$1({method:"delete",path:"/orders/{id}",tags:["orders"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["order:delete"]})],request:{params:L.pick({id:true})},responses:{200:p(Ks,"Order deleted"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Order not found"),500:c("Internal server error")}}),sc=g$1({method:"put",path:"/orders/{id}/process",tags:["orders"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["order:process"]})],request:{params:L.pick({id:true})},responses:{200:p(L,"Order processed"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Order not found"),400:c("Cannot process order"),500:c("Internal server error")}}),nc=g$1({method:"put",path:"/orders/{id}/cancel",tags:["orders"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["order:process"]})],request:{params:L.pick({id:true})},responses:{200:p(L,"Order cancelled"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Order not found"),400:c("Cannot cancel order"),500:c("Internal server error")}}),Ys=new f$1().openapi(Qa,async e=>{let{status:t,customerName:r,limit:s,offset:n}=e.req.valid("query"),i=await Ms({status:t??void 0,customerName:r??void 0});return e.json(l(i.slice(n,n+s)),200)}).openapi(ec,async e=>{let{id:t}=e.req.valid("param"),r=await _s(t);if(!r)throw new w("Order",t);return e.json(l(r),200)}).openapi(tc,async e=>{let t=e.req.valid("json"),r=await Ls(t);return e.json(M(r),201)}).openapi(rc,async e=>{let{id:t}=e.req.valid("param"),r=e.req.valid("json"),s=await Fs(t,r);if(!s)throw new w("Order",t);return e.json(l(s),200)}).openapi(oc,async e=>{let{id:t}=e.req.valid("param");if((await zs(t)).message==="\u8BA2\u5355\u4E0D\u5B58\u5728")throw new w("Order",t);return e.json(l({message:"Deleted successfully"}),200)}).openapi(sc,async e=>{let{id:t}=e.req.valid("param"),r=await Bs(t);if(!r)throw new w("Order",t);return e.json(l(r),200)}).openapi(nc,async e=>{let{id:t}=e.req.valid("param"),r=await $s(t);if(!r)throw new w("Order",t);return e.json(l(r),200)});n();V();O();v();Ve();Ge();async function $t(e){let r=await(await R()).select().from(G$1).where(g(G$1.ticketId,e.id)).orderBy(m(G$1.createdAt));return {id:`ticket-${e.id}`,ticketNo:e.ticketNo,customerName:e.customerName,customerEmail:e.customerEmail,subject:e.subject,description:e.description,status:e.status,priority:e.priority,category:e.category,assignedTo:e.assignedTo??void 0,createdAt:t(e.createdAt),updatedAt:t(e.updatedAt),replies:r.map(s=>({id:`reply-${s.id}`,ticketId:`ticket-${s.ticketId}`,content:s.content,author:s.author,isCustomer:s.isCustomer,createdAt:t(s.createdAt)}))}}function ic(e){return {id:`ticket-${e.id}`,ticketNo:e.ticketNo,customerName:e.customerName,customerEmail:e.customerEmail,subject:e.subject,description:e.description,status:e.status,priority:e.priority,category:e.category,assignedTo:e.assignedTo??void 0,createdAt:t(e.createdAt),updatedAt:t(e.updatedAt),replies:[]}}async function Js(e){let t=await R(),r=[];let s={urgent:0,high:1,medium:2,low:3},i=(r.length>0?await t.select().from(F$1).where(h$1(...r)):await t.select().from(F$1)).sort((u,m)=>s[u.priority]-s[m.priority]),a=[];for(let u of i)a.push(await $t(u));return a}async function _r(e){let t=await R(),r=x("ticket",e);if(r===-1)return null;let n=(await t.select().from(F$1).where(g(F$1.id,r)))[0];return n?$t(n):null}async function Zs(e){let t=await R(),r=new Date,s=await t.insert(F$1).values({ticketNo:qs(),customerName:e.customerName,customerEmail:e.customerEmail,subject:e.subject,description:e.description,status:"open",priority:e.priority,category:e.category,createdAt:r,updatedAt:r}).returning();return ic(s[0])}async function Xs(e,t){let r=await R(),s=x("ticket",e);if(s===-1)return null;let n={updatedAt:new Date};t.status!==void 0&&t.status!==null&&(n.status=t.status),t.assignedTo!==void 0&&t.assignedTo!==null&&(n.assignedTo=t.assignedTo);let i=await r.update(F$1).set(n).where(g(F$1.id,s)).returning();return i.length===0?null:$t(i[0])}async function Qs(e){let t=await R(),r=x("ticket",e);return r===-1?{message:"\u5DE5\u5355\u4E0D\u5B58\u5728"}:(await t.delete(F$1).where(g(F$1.id,r)).returning()).length===0?{message:"\u5DE5\u5355\u4E0D\u5B58\u5728"}:{message:"\u5DE5\u5355\u5DF2\u5220\u9664"}}async function en(e,t){let r=await R(),s=x("ticket",e);if(s===-1)return null;let i=(await r.select().from(F$1).where(g(F$1.id,s)))[0];if(!i)return null;let a=new Date;await r.insert(G$1).values({ticketId:s,content:t.content,author:t.author,isCustomer:false,createdAt:a});let u=i.status==="open"?"in_progress":i.status;return await r.update(F$1).set({status:u,updatedAt:a}).where(g(F$1.id,s)),_r(e)}async function tn(e){let t=await R(),r=x("ticket",e);if(r===-1||(await t.select().from(F$1).where(g(F$1.id,r))).length===0)return null;let n=await t.update(F$1).set({status:"closed",updatedAt:new Date}).where(g(F$1.id,r)).returning();return n.length===0?null:$t(n[0])}var rn=e$1.enum(["open","in_progress","waiting_customer","resolved","closed"]),on=e$1.enum(["low","medium","high","urgent"]),sn=e$1.enum(["technical","billing","feature_request","bug_report","general"]),cc=e$1.object({id:e$1.string(),ticketId:e$1.string(),content:e$1.string(),author:e$1.string(),isCustomer:e$1.boolean(),createdAt:e$1.string()}),F=e$1.object({id:e$1.string(),ticketNo:e$1.string(),customerName:e$1.string(),customerEmail:e$1.string(),subject:e$1.string(),description:e$1.string(),status:rn,priority:on,category:sn,assignedTo:e$1.string().nullish(),createdAt:e$1.string(),updatedAt:e$1.string(),replies:e$1.array(cc)}),nn=e$1.object({customerName:e$1.string(),customerEmail:e$1.string().email(),subject:e$1.string(),description:e$1.string(),category:sn,priority:on}),an=e$1.object({status:rn.nullish(),assignedTo:e$1.string().nullish()}),cn=e$1.object({content:e$1.string(),author:e$1.string()}),dn=e$1.array(F),un=e$1.object({message:e$1.string()});var dc=g$1({method:"get",path:"/tickets",tags:["tickets"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["ticket:view"]})],request:{query:e$1.object({limit:e$1.coerce.number().int().positive().max(100).default(20),offset:e$1.coerce.number().int().min(0).default(0)})},responses:{200:p(dn,"List all tickets"),401:c("Unauthorized"),403:c("Forbidden"),500:c("Internal server error")}}),uc=g$1({method:"get",path:"/tickets/{id}",tags:["tickets"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["ticket:view"]})],request:{params:F.pick({id:true})},responses:{200:p(F,"Get ticket by id"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Ticket not found"),500:c("Internal server error")}}),pc=g$1({method:"post",path:"/tickets",tags:["tickets"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["ticket:create"]})],request:{body:{content:{"application/json":{schema:nn}}}},responses:{201:p(F,"Create ticket"),401:c("Unauthorized"),403:c("Forbidden"),400:c("Invalid input"),500:c("Internal server error")}}),lc=g$1({method:"put",path:"/tickets/{id}",tags:["tickets"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["ticket:edit"]})],request:{params:F.pick({id:true}),body:{content:{"application/json":{schema:an}}}},responses:{200:p(F,"Update ticket"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Ticket not found"),400:c("Invalid input"),500:c("Internal server error")}}),mc=g$1({method:"delete",path:"/tickets/{id}",tags:["tickets"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["ticket:delete"]})],request:{params:F.pick({id:true})},responses:{200:p(un,"Ticket deleted"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Ticket not found"),500:c("Internal server error")}}),fc=g$1({method:"post",path:"/tickets/{id}/reply",tags:["tickets"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["ticket:reply"]})],request:{params:F.pick({id:true}),body:{content:{"application/json":{schema:cn}}}},responses:{200:p(F,"Ticket replied"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Ticket not found"),400:c("Cannot reply ticket"),500:c("Internal server error")}}),hc=g$1({method:"put",path:"/tickets/{id}/close",tags:["tickets"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["ticket:close"]})],request:{params:F.pick({id:true})},responses:{200:p(F,"Ticket closed"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Ticket not found"),400:c("Cannot close ticket"),500:c("Internal server error")}}),pn=new f$1().openapi(dc,async e=>{let{limit:t,offset:r}=e.req.valid("query"),s=await Js();return e.json(l(s.slice(r,r+t)),200)}).openapi(uc,async e=>{let{id:t}=e.req.valid("param"),r=await _r(t);if(!r)throw new w("Ticket",t);return e.json(l(r),200)}).openapi(pc,async e=>{let t=e.req.valid("json"),r=await Zs(t);return e.json(M(r),201)}).openapi(lc,async e=>{let{id:t}=e.req.valid("param"),r=e.req.valid("json"),s=await Xs(t,r);if(!s)throw new w("Ticket",t);return e.json(l(s),200)}).openapi(mc,async e=>{let{id:t}=e.req.valid("param");if((await Qs(t)).message==="\u5DE5\u5355\u4E0D\u5B58\u5728")throw new w("Ticket",t);return e.json(l({message:"Deleted successfully"}),200)}).openapi(fc,async e=>{let{id:t}=e.req.valid("param"),r=e.req.valid("json"),s=await en(t,r);if(!s)throw new w("Ticket",t);return e.json(l(s),200)}).openapi(hc,async e=>{let{id:t}=e.req.valid("param"),r=await tn(t);if(!r)throw new w("Ticket",t);return e.json(l(r),200)});n();V();O();v();Ve();Ge();function Ke(e){return {id:`dispute-${e.id}`,disputeNo:e.disputeNo,orderId:e.orderId,orderNo:e.orderNo,customerName:e.customerName,customerEmail:e.customerEmail,type:e.type,status:e.status,description:e.description,resolution:e.resolution??void 0,amount:e.amount,createdAt:t(e.createdAt),updatedAt:t(e.updatedAt),resolvedAt:e.resolvedAt?t(e.resolvedAt):void 0,resolvedBy:e.resolvedBy??void 0}}async function ln(e){let t=await R(),r=[];return (r.length>0?await t.select().from(J).where(h$1(...r)).orderBy(m(J.createdAt)):await t.select().from(J).orderBy(m(J.createdAt))).map(Ke)}async function mn(e){let t=await R(),r=x("dispute",e);if(r===-1)return null;let n=(await t.select().from(J).where(g(J.id,r)))[0];return n?Ke(n):null}async function fn(e){let t=await R(),r=new Date,s=await t.insert(J).values({disputeNo:js(),orderId:e.orderId,orderNo:e.orderNo,customerName:e.customerName,customerEmail:e.customerEmail,type:e.type,status:"pending",description:e.description,amount:e.amount,createdAt:r,updatedAt:r}).returning();return Ke(s[0])}async function hn(e,t){let r=await R(),s=x("dispute",e);if(s===-1)return null;let n={updatedAt:new Date};t.status!==void 0&&t.status!==null&&(n.status=t.status),t.resolution!==void 0&&t.resolution!==null&&(n.resolution=t.resolution);let i=await r.update(J).set(n).where(g(J.id,s)).returning();return i.length===0?null:Ke(i[0])}async function gn(e){let t=await R(),r=x("dispute",e);return r===-1?{success:false,message:"\u4E89\u8BAE\u4E0D\u5B58\u5728"}:(await t.delete(J).where(g(J.id,r)).returning()).length===0?{success:false,message:"\u4E89\u8BAE\u4E0D\u5B58\u5728"}:{success:true,message:"\u4E89\u8BAE\u5DF2\u5220\u9664"}}async function yn(e,t){let r=await R(),s=x("dispute",e);if(s===-1)return null;let i=(await r.select().from(J).where(g(J.id,s)))[0];if(!i||i.status!=="pending"&&i.status!=="investigating")return null;let a=new Date,u=await r.update(J).set({status:"resolved",resolution:t.resolution,resolvedAt:a,resolvedBy:t.resolvedBy,updatedAt:a}).where(g(J.id,s)).returning();return Ke(u[0])}var Sn=e$1.enum(["refund","product_quality","service_quality","delivery","other"]),wn=e$1.enum(["pending","investigating","resolved","rejected"]),Y=e$1.object({id:e$1.string(),disputeNo:e$1.string(),orderId:e$1.string(),orderNo:e$1.string(),customerName:e$1.string(),customerEmail:e$1.string(),type:Sn,status:wn,description:e$1.string(),resolution:e$1.string().nullish(),amount:e$1.number(),createdAt:e$1.string(),updatedAt:e$1.string(),resolvedAt:e$1.string().nullish(),resolvedBy:e$1.string().nullish()}),Rn=e$1.object({orderId:e$1.string(),orderNo:e$1.string(),customerName:e$1.string(),customerEmail:e$1.string().email(),type:Sn,description:e$1.string(),amount:e$1.number().positive()}),Tn=e$1.object({status:wn.nullish(),resolution:e$1.string().nullish()}),vn=e$1.object({resolution:e$1.string(),resolvedBy:e$1.string()}),bn=e$1.array(Y);e$1.object({message:e$1.string()});var yc=g$1({method:"get",path:"/disputes",tags:["disputes"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["dispute:view"]})],request:{query:e$1.object({limit:e$1.coerce.number().int().positive().max(100).default(20),offset:e$1.coerce.number().int().min(0).default(0)})},responses:{200:p(bn,"List all disputes"),401:c("Unauthorized"),403:c("Forbidden")}}),Sc=g$1({method:"get",path:"/disputes/{id}",tags:["disputes"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["dispute:view"]})],request:{params:Y.pick({id:true})},responses:{200:p(Y,"Get dispute by id"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Dispute not found")}}),wc=g$1({method:"post",path:"/disputes",tags:["disputes"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["dispute:create"]})],request:Pt(Rn),responses:{201:p(Y,"Create dispute"),401:c("Unauthorized"),403:c("Forbidden")}}),Rc=g$1({method:"put",path:"/disputes/{id}",tags:["disputes"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["dispute:edit"]})],request:{params:Y.pick({id:true}),...Pt(Tn)},responses:{200:p(Y,"Update dispute"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Dispute not found")}}),Tc=g$1({method:"delete",path:"/disputes/{id}",tags:["disputes"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["dispute:delete"]})],request:Bo,responses:{200:p(Y,"Delete dispute"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Dispute not found")}}),vc=g$1({method:"put",path:"/disputes/{id}/resolve",tags:["disputes"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["dispute:resolve"]})],request:{params:Y.pick({id:true}),...Pt(vn)},responses:{200:p(Y,"Dispute resolved"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Dispute not found"),422:c("Cannot resolve dispute in current state")}}),En=new f$1().openapi(yc,async e=>{let{limit:t,offset:r}=e.req.valid("query"),s=await ln();return e.json(l(s.slice(r,r+t)),200)}).openapi(Sc,async e=>{let{id:t}=e.req.valid("param"),r=await mn(t);if(!r)throw w.dispute(t);return e.json(l(r),200)}).openapi(wc,async e=>{let t=e.req.valid("json"),r=await fn(t);return e.json(M(r),201)}).openapi(Rc,async e=>{let{id:t}=e.req.valid("param"),r=e.req.valid("json"),s=await hn(t,r);if(!s)throw w.dispute(t);return e.json(l(s),200)}).openapi(Tc,async e=>{let{id:t}=e.req.valid("param");if(!(await gn(t)).success)throw w.dispute(t);return e.json(l({message:"Deleted successfully"}),200)}).openapi(vc,async e=>{let{id:t}=e.req.valid("param"),r=e.req.valid("json"),s=await yn(t,r);if(!s)throw new ue("Cannot resolve dispute in current state");return e.json(l(s),200)});Vt();var Xe=e$1.enum(["article","announcement","tutorial","news","policy"]),xn=e$1.enum(["draft","published","archived"]),k=e$1.object({id:e$1.string(),title:e$1.string(),content:e$1.string(),category:Xe,status:xn,author:e$1.string(),tags:e$1.array(e$1.string()),viewCount:e$1.number(),likeCount:e$1.number(),createdAt:e$1.string(),updatedAt:e$1.string(),publishedAt:e$1.string().nullish()}),Cn=e$1.object({title:e$1.string(),content:e$1.string(),category:Xe,tags:e$1.array(e$1.string()).nullish()}),In=e$1.object({title:e$1.string().nullish(),content:e$1.string().nullish(),category:Xe.nullish(),tags:e$1.array(e$1.string()).nullish(),status:xn.nullish()}),Pn=e$1.array(k),Dn=e$1.object({message:e$1.string()});var Ec=g$1({method:"get",path:"/contents",tags:["contents"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["content:view"]})],request:{query:e$1.object({limit:e$1.coerce.number().int().positive().max(100).default(20),offset:e$1.coerce.number().int().min(0).default(0)})},responses:{200:p(Pn,"List all contents")}}),Ac=g$1({method:"get",path:"/contents/{id}",tags:["contents"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["content:view"]})],request:{params:k.pick({id:true})},responses:{200:p(k,"Get content by id"),404:c("Content not found")}}),xc=g$1({method:"post",path:"/contents",tags:["contents"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["content:create"]})],request:{body:{content:{"application/json":{schema:Cn}}}},responses:{201:p(k,"Create content"),400:c("Invalid input")}}),Cc=g$1({method:"put",path:"/contents/{id}",tags:["contents"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["content:edit"]})],request:{params:k.pick({id:true}),body:{content:{"application/json":{schema:In}}}},responses:{200:p(k,"Update content"),404:c("Content not found"),400:c("Invalid input")}}),Ic=g$1({method:"delete",path:"/contents/{id}",tags:["contents"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["content:delete"]})],request:{params:k.pick({id:true})},responses:{200:p(Dn,"Content deleted"),404:c("Content not found")}}),Pc=g$1({method:"put",path:"/contents/{id}/publish",tags:["contents"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["content:edit"]})],request:{params:k.pick({id:true})},responses:{200:p(k,"Content published"),404:c("Content not found"),422:c("Content cannot be published")}}),Dc=g$1({method:"put",path:"/contents/{id}/archive",tags:["contents"],security:[{Bearer:[]}],middleware:[h({requiredPermissions:["content:edit"]})],request:{params:k.pick({id:true})},responses:{200:p(k,"Content archived"),404:c("Content not found"),422:c("Content cannot be archived")}}),Un=new f$1().openapi(Ec,async e=>{let{limit:t,offset:r}=e.req.valid("query"),s=await Je();return e.json(l(s.slice(r,r+t)),200)}).openapi(Ac,async e=>{let{id:t}=e.req.valid("param"),r=await Ze(t);if(!r)throw new w("Content",t);return e.json(l(r),200)}).openapi(xc,async e=>{let t=e.req.valid("json"),r=await Fr(t);return e.json(M(r),201)}).openapi(Cc,async e=>{let{id:t}=e.req.valid("param"),r=e.req.valid("json"),s=await zr(t,r);if(!s)throw new w("Content",t);return e.json(l(s),200)}).openapi(Ic,async e=>{let{id:t}=e.req.valid("param");if(!(await Br(t)).success)throw new w("Content",t);return e.json(l({message:"Deleted successfully"}),200)}).openapi(Pc,async e=>{let{id:t}=e.req.valid("param"),r=await $r(t);if(!r)throw new ue("Content cannot be published (must be in draft state)");return e.json(l(r),200)}).openapi(Dc,async e=>{let{id:t}=e.req.valid("param"),r=await Wr(t);if(!r)throw new ue("Content cannot be archived (must be in published state)");return e.json(l(r),200)});Vt();var Uc=g$1({method:"get",path:"/public/contents",tags:["public-contents"],request:{query:e$1.object({category:Xe.optional(),search:e$1.string().optional(),limit:e$1.coerce.number().int().positive().max(50).default(20),offset:e$1.coerce.number().int().min(0).default(0)})},responses:{200:p(e$1.array(k),"List published contents")}}),Oc=g$1({method:"get",path:"/public/contents/{id}",tags:["public-contents"],request:{params:k.pick({id:true})},responses:{200:p(k,"Get published content"),404:c("Content not found")}}),On=new f$1().openapi(Uc,async e=>{let{category:t,search:r,limit:s,offset:n}=e.req.valid("query"),a=(await Je({status:"published",category:t,search:r})).slice(n,n+s);return e.json(l(a),200)}).openapi(Oc,async e=>{let{id:t}=e.req.valid("param"),r=await Ze(t);if(!r||r.status!=="published")throw new w("Content",t);return e.json(l(r),200)});var Nn=e$1.any(),Nc=g$1({method:"get",path:"/public/{namespace}/{filename}",tags:["files"],request:{params:le},responses:{200:{description:"File content",content:{"application/octet-stream":{schema:Nn}}},404:c("File not found")}}),kc=g$1({method:"get",path:"/private/{namespace}/{filename}",tags:["files"],request:{params:le,query:_e},responses:{200:{description:"File content",content:{"application/octet-stream":{schema:Nn}}},403:c("Invalid or expired signature"),404:c("File not found")}}),qc=g$1({method:"post",path:"/generate-url",tags:["files"],request:{body:{content:{"application/json":{schema:gt}}}},responses:{200:p(yt,"URL generated successfully"),400:c("Invalid request"),404:c("File not found")}}),jc=g$1({method:"head",path:"/public/{namespace}/{filename}",tags:["files"],request:{params:le},responses:{200:{description:"File exists",content:{"application/octet-stream":{schema:e$1.null()}}},404:c("File not found")}}),Mc=g$1({method:"head",path:"/private/{namespace}/{filename}",tags:["files"],request:{params:le,query:_e},responses:{200:{description:"File exists",content:{"application/octet-stream":{schema:e$1.null()}}},403:c("Invalid or expired signature"),404:c("File not found")}}),_c=g$1({method:"post",path:"/upload",tags:["files"],middleware:[vo],request:{body:{content:{"multipart/form-data":{schema:wt}}}},responses:{200:p(St,"File uploaded successfully"),400:c("Invalid file or upload failed")}}),Gt=new f$1().openapi(Nc,async e=>{let{namespace:t,filename:r}=e.req.valid("param"),s=await Ee(t,r);if(!s)throw new w("File",`${t}/${r}`);let n=mt(t,r),i=await hr(n);return e.header("Content-Type",s.mimeType),e.header("Content-Length",s.size.toString()),e.header("Content-Disposition",`inline; filename="${r}"`),e.header("Cache-Control","public, max-age=31536000"),e.header("Last-Modified",s.lastModified.toUTCString()),e.body(i)}).openapi(kc,async e=>{let{namespace:t,filename:r}=e.req.valid("param"),{expiry:s,signature:n}=e.req.valid("query");if(Math.floor(Date.now()/1e3)>s)throw new te("URL has expired");if(!Sr(t,r,s,n))throw new te("Invalid signature");let a=await Ee(t,r);if(!a)throw new w("File",`${t}/${r}`);let u=mt(t,r),m=await hr(u);return e.header("Content-Type",a.mimeType),e.header("Content-Length",a.size.toString()),e.header("Content-Disposition",`inline; filename="${r}"`),e.header("Cache-Control","private, no-store"),e.body(m)}).openapi(qc,async e=>{let{namespace:t,filename:r,isPrivate:s,expirySeconds:n}=e.req.valid("json");if(!await Ee(t,r))throw new w("File",`${t}/${r}`);let a=process.env.PUBLIC_URL||"";if(s){let{url:m,expiry:f}=Io(t,r,n??void 0,a);return e.json(l({url:m,expiry:f}),200)}let u=yr(t,r,a);return e.json(l({url:u}),200)}).openapi(jc,async e=>{let{namespace:t,filename:r}=e.req.valid("param"),s=await Ee(t,r);if(!s)throw new w("File",`${t}/${r}`);return e.header("Content-Type",s.mimeType),e.header("Content-Length",s.size.toString()),e.header("Last-Modified",s.lastModified.toUTCString()),e.body(null,200)}).openapi(Mc,async e=>{let{namespace:t,filename:r}=e.req.valid("param"),{expiry:s,signature:n}=e.req.valid("query");if(Math.floor(Date.now()/1e3)>s)return e.json({success:false,error:"URL has expired"},403);if(!Sr(t,r,s,n))return e.json({success:false,error:"Invalid signature"},403);let a=await Ee(t,r);if(!a)throw new w("File",`${t}/${r}`);return e.header("Content-Type",a.mimeType),e.header("Content-Length",a.size.toString()),e.body(null,200)}).openapi(_c,async e=>{let t=await e.req.parseBody(),r=t.file;if(!r||!(r instanceof File))return e.json({success:false,error:"No file provided"},400);let s=typeof t.namespace=="string"?t.namespace:"uploads",n=await r.arrayBuffer(),i=await lt(s,{name:r.name,type:r.type,size:r.size,data:n}),a=yr(s,i.filename);return e.json(l({filename:i.filename,originalName:i.originalName,mimeType:i.mimeType,size:i.size,url:a}),200)});var Lc=Re({windowMs:6e4,max:100,message:"Too many requests"}),kn=new f$1().use("*",Lc).route("/api",Ps).route("/api",rs).route("/api",ts).route("/api",$o).route("/api",On),qn=new f$1().route("/api",Ys).route("/api",pn).route("/api",En).route("/api",Un).route("/api",Gt).route("/api",Ns).route("/api",Wo).route("/api",Jo).route("/api",Zo).route("/api",Is);function jn(e={}){let t=new f$1().use("*",or()).use("*",tr()).use("*",er()).use("*",Eo()).use("/api/*",xo()).use("/api/admin/*",sr({maxRequests:20,windowMs:6e4})).route("/",kn).route("/",qn).route("/files",Gt).get("/health",async r=>{try{let{getDb:s}=await import('./db-7J42RQ3T.js');return await s(),r.json({status:"ok",timestamp:new Date().toISOString(),db:"connected"})}catch{return r.json({status:"ok",timestamp:new Date().toISOString(),db:"not configured"})}}).post("/api/__test__/cleanup",async r=>{try{let{cleanupTestDatabase:s}=await import('./test-setup-NMZJZLRV.js');return await s(),r.json({success:!0,message:"Database cleaned up"})}catch(s){return console.error("Error during database cleanup:",s),r.json({success:false,message:"Failed to cleanup database"},500)}});return go(t),t.onError((r,s)=>{let n=d("api");if(s.res.headers.set("Content-Type","application/json"),W.isAppError(r))return s.json({success:false,error:r.message,status:r.statusCode,details:r.details},r.statusCode);if(r instanceof c$1)return s.json({success:false,error:r.message,status:r.status},r.status);if(r instanceof d$1){let i=r.issues.map(a=>({field:a.path.join("."),message:a.message}));return s.json({success:false,error:"Validation failed",status:400,details:i},400)}return n.error({err:r,path:s.req.path},"Unhandled error"),s.json({success:false,error:r.message||"Internal server error",status:500},500)}),t}O();Q();f();var Mn=e.db();async function Fc(){let e=zc();if(Mn.debug({driver:"d1"},"Creating database connection"),!e.d1Database)throw new Error("D1 database binding not found. Make sure D1 is configured in wrangler.toml");let t=P(e.d1Database,{schema:N$1});return Mn.info({driver:"d1"},"Database connected"),t}function zc(){return {driver:"d1",d1Database:globalThis.DB}}var Bc=["/","/todos","/content","/notifications","/websocket"],$c=["/content/"];function _n(e){if(Bc.includes(e))return true;for(let t of $c)if(e.startsWith(t))return true;return false}function Hr(e){return `isr:${e==="/"?"/index":e.replace(/\/$/,"")}`}var Vr=class{cache=new Map;timer=null;constructor(){this.timer=setInterval(()=>this.cleanup(),6e4),this.timer&&typeof this.timer=="object"&&"unref"in this.timer&&this.timer.unref();}cleanup(){let t=Date.now();for(let[r,s]of this.cache)t>s.revalidateAt+6e4&&this.cache.delete(r);}async get(t){return this.cache.get(t)??null}async set(t,r,s){let n=Date.now();this.cache.set(t,{html:r,createdAt:n,revalidateAt:n+s.maxAge*1e3});}async purge(t){this.cache.delete(t);}async purgePattern(t){let r=new RegExp("^"+t.replace(/\*/g,".*")+"$");for(let s of this.cache.keys())r.test(s)&&this.cache.delete(s);}destroy(){this.timer&&(clearInterval(this.timer),this.timer=null),this.cache.clear();}},Gr=class{cache=null;origin="https://isr.local";async getCache(){return this.cache||(this.cache=await caches.open("isr-pages")),this.cache}toUrl(t){return `${this.origin}${t.replace(/^isr:/,"")}`}async get(t){let r=await this.getCache(),s=this.toUrl(t),n=await r.match(s);if(!n)return null;let i=await n.text(),a=Number(n.headers.get("x-isr-created-at")||"0"),u=Number(n.headers.get("x-isr-revalidate-at")||"0");return {html:i,createdAt:a,revalidateAt:u}}async set(t,r,s){let n=await this.getCache(),i=this.toUrl(t),a=Date.now(),u=new Response(r,{headers:{"Content-Type":"text/html;charset=UTF-8","x-isr-created-at":String(a),"x-isr-revalidate-at":String(a+s.maxAge*1e3),"x-isr-max-age":String(s.maxAge),"x-isr-stale-while-revalidate":String(s.staleWhileRevalidate),"Cache-Control":`public, max-age=${s.maxAge}, s-maxage=${s.maxAge}, stale-while-revalidate=${s.staleWhileRevalidate}`}});await n.put(i,u);}async purge(t){let r=await this.getCache(),s=this.toUrl(t);await r.delete(s);}async purgePattern(t){let r=await this.getCache(),s=new RegExp("^"+t.replace(/\*/g,".*")+"$"),n=[];for(let i of n){let u=`isr:${new URL(i.url).pathname}`;s.test(u)&&await r.delete(i);}}};function Ln(e){let t=60,r=300,n=typeof caches<"u"&&typeof caches.open=="function"?new Gr:new Vr;return {async lookup(i){let a=Hr(i),u=await n.get(a);if(!u)return {status:"miss",html:null};let m=Date.now(),f=u.revalidateAt+r*1e3;return m<=u.revalidateAt?{status:"fresh",html:u.html,entry:u}:m<=f?{status:"stale",html:u.html,entry:u}:{status:"miss",html:null}},async store(i,a,u){let m=Hr(i),f={maxAge:u?.maxAge??t,staleWhileRevalidate:u?.staleWhileRevalidate??r};await n.set(m,a,f);},async purge(i){let a=Hr(i);await n.purge(a);},async purgePattern(i){await n.purgePattern(i);},getStore(){return n}}}var Wc=[{path:"/",pattern:/^\/$/,meta:{title:"Todo List - Biomimic App",description:"A full-stack application template with React and Hono"}},{path:"/todos",pattern:/^\/todos$/,meta:{title:"Todo List - Biomimic App",description:"Manage your todos with real-time updates"}},{path:"/notifications",pattern:/^\/notifications$/,meta:{title:"Notifications - Biomimic App",description:"Real-time notifications via Server-Sent Events"}},{path:"/websocket",pattern:/^\/websocket$/,meta:{title:"WebSocket Demo - Biomimic App",description:"Type-safe WebSocket communication demo"}},{path:"/content",pattern:/^\/content$/,meta:{title:"\u5185\u5BB9\u4E2D\u5FC3 - Biomimic App",description:"Content management with categories and search"}},{path:"/content/:id",pattern:/^\/content\/([^/]+)$/,meta:{title:"\u5185\u5BB9\u8BE6\u60C5 - Biomimic App",description:"View content details"},loader:async e=>{try{let r=await(Vt(),c$3(Ht)).getContentById(e.id);if(r)return {__meta:{title:`${r.title} - Biomimic App`,description:r.content?.substring(0,160)||"View content details"},content:r}}catch{}return {}}}];function Hc(e){for(let t of Wc){let r=e.match(t.pattern);if(r){let s={};return t.path==="/content/:id"&&r[1]&&(s.id=r[1]),{route:t,params:s}}}return null}async function Kr(e,t){let r=Hc(e);if(!r)return Gc();let{route:s,params:n}=r,i={...s.meta},a={};if(s.loader)try{let m=await s.loader(n);m.__meta&&(i={...i,...m.__meta},delete m.__meta),a=m;}catch{}return {html:Vc({title:i.title,description:i.description,ogType:i.ogType||"website",data:a,pathname:e}),status:200,headers:{"Content-Type":"text/html;charset=UTF-8","X-ISR-Rendered":"true"}}}function Vc(e){let r=JSON.stringify(e.data).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">");return `<!DOCTYPE html>
|
|
43
|
+
`).toString("base64")}`}function Op(){let e=Date.now();for(let[t,n]of Oe.entries())e-n.createdAt>3e5&&Oe.delete(t);}var Li=e$1.object({id:e$1.string(),image:e$1.string()}),_i=e$1.object({id:e$1.string(),code:e$1.string()}),zi=e$1.object({message:e$1.string()});var Np=g$1({method:"get",path:"/captcha",tags:["captcha"],responses:{200:p(Li,"Get captcha")}}),jp=g$1({method:"post",path:"/verify-captcha",tags:["captcha"],request:{body:{content:{"application/json":{schema:_i}}}},responses:{200:p(zi,"Captcha verified"),400:c("Invalid captcha")}}),Bi=new f$1().openapi(Np,e=>{let{id:t,image:n}=po();return e.json(l({id:t,image:n}),200)}).openapi(jp,async e=>{let{id:t,code:n}=e.req.valid("json");if(lo(t,n)){let s=a$1(e,"session_id");return s&&un(s),e.json(l({message:"\u9A8C\u8BC1\u6210\u529F"}),200)}else return e.json({success:false,error:"\u9A8C\u8BC1\u7801\u9519\u8BEF\u6216\u5DF2\u8FC7\u671F"},400)});r();m();ja$1();v();$e();Tt();async function Fi(e){let t$1=await i(),n$1=[];return e?.status&&n$1.push(g(P.status,e.status)),e?.customerName&&n$1.push(i$1(l$1(P.customerName,`%${e.customerName}%`),l$1(P.customerEmail,`%${e.customerName}%`))),(n$1.length>0?await t$1.select().from(P).where(h(...n$1)).orderBy(n(P.createdAt)):await t$1.select().from(P).orderBy(n(P.createdAt))).map(s=>({id:`order-${s.id}`,orderNo:s.orderNo,customerName:s.customerName,customerEmail:s.customerEmail,productName:s.productName,amount:s.amount,status:s.status,createdAt:t(s.createdAt),updatedAt:t(s.updatedAt)}))}async function $i(e){let t$1=await i(),n=I("order",e);if(n===-1)return null;let s=(await t$1.select().from(P).where(g(P.id,n)))[0];return s?{id:`order-${s.id}`,orderNo:s.orderNo,customerName:s.customerName,customerEmail:s.customerEmail,productName:s.productName,amount:s.amount,status:s.status,createdAt:t(s.createdAt),updatedAt:t(s.updatedAt)}:null}async function Hi(e){let t$1=await i(),n=new Date,s=(await t$1.insert(P).values({orderNo:is(),customerName:e.customerName,customerEmail:e.customerEmail,productName:e.productName,amount:e.amount,status:"pending",createdAt:n,updatedAt:n}).returning())[0];return {id:`order-${s.id}`,orderNo:s.orderNo,customerName:s.customerName,customerEmail:s.customerEmail,productName:s.productName,amount:s.amount,status:s.status,createdAt:t(s.createdAt),updatedAt:t(s.updatedAt)}}async function Wi(e,t$1){let n=await i(),o=I("order",e);if(o===-1)return null;let s={updatedAt:new Date};t$1.status!==void 0&&t$1.status!==null&&(s.status=t$1.status);let i$1=await n.update(P).set(s).where(g(P.id,o)).returning();if(i$1.length===0)return null;let a=i$1[0];return {id:`order-${a.id}`,orderNo:a.orderNo,customerName:a.customerName,customerEmail:a.customerEmail,productName:a.productName,amount:a.amount,status:a.status,createdAt:t(a.createdAt),updatedAt:t(a.updatedAt)}}async function Vi(e){let t=await i(),n=I("order",e);return n===-1?{message:"\u8BA2\u5355\u4E0D\u5B58\u5728"}:(await t.delete(P).where(g(P.id,n)).returning()).length===0?{message:"\u8BA2\u5355\u4E0D\u5B58\u5728"}:{message:"\u8BA2\u5355\u5DF2\u5220\u9664"}}async function Gi(e){let t$1=await i(),n=I("order",e);if(n===-1)return null;let s=(await t$1.select().from(P).where(g(P.id,n)))[0];if(!s||s.status!=="pending")return null;let a=(await t$1.update(P).set({status:"processing",updatedAt:new Date}).where(g(P.id,n)).returning())[0];return {id:`order-${a.id}`,orderNo:a.orderNo,customerName:a.customerName,customerEmail:a.customerEmail,productName:a.productName,amount:a.amount,status:a.status,createdAt:t(a.createdAt),updatedAt:t(a.updatedAt)}}async function Ki(e){let t$1=await i(),n=I("order",e);if(n===-1)return null;let s=(await t$1.select().from(P).where(g(P.id,n)))[0];if(!s||s.status!=="pending"&&s.status!=="processing")return null;let a=(await t$1.update(P).set({status:"cancelled",updatedAt:new Date}).where(g(P.id,n)).returning())[0];return {id:`order-${a.id}`,orderNo:a.orderNo,customerName:a.customerName,customerEmail:a.customerEmail,productName:a.productName,amount:a.amount,status:a.status,createdAt:t(a.createdAt),updatedAt:t(a.updatedAt)}}var Mp=g$1({method:"get",path:"/orders",tags:["orders"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["order:view"]})],request:{query:Fn},responses:{200:p(Bn,"List all orders"),401:c("Unauthorized"),403:c("Forbidden"),500:c("Internal server error")}}),Lp=g$1({method:"get",path:"/orders/{id}",tags:["orders"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["order:view"]})],request:{params:K.pick({id:true})},responses:{200:p(K,"Get order by id"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Order not found"),500:c("Internal server error")}}),_p=g$1({method:"post",path:"/orders",tags:["orders"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["order:create"]})],request:{body:{content:{"application/json":{schema:_n}}}},responses:{201:p(K,"Create order"),401:c("Unauthorized"),403:c("Forbidden"),400:c("Invalid input"),500:c("Internal server error")}}),zp=g$1({method:"put",path:"/orders/{id}",tags:["orders"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["order:edit"]})],request:{params:K.pick({id:true}),body:{content:{"application/json":{schema:zn}}}},responses:{200:p(K,"Update order"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Order not found"),400:c("Invalid input"),500:c("Internal server error")}}),Bp=g$1({method:"delete",path:"/orders/{id}",tags:["orders"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["order:delete"]})],request:{params:K.pick({id:true})},responses:{200:p($n,"Order deleted"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Order not found"),500:c("Internal server error")}}),Fp=g$1({method:"put",path:"/orders/{id}/process",tags:["orders"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["order:process"]})],request:{params:K.pick({id:true})},responses:{200:p(K,"Order processed"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Order not found"),400:c("Cannot process order"),500:c("Internal server error")}}),$p=g$1({method:"put",path:"/orders/{id}/cancel",tags:["orders"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["order:process"]})],request:{params:K.pick({id:true})},responses:{200:p(K,"Order cancelled"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Order not found"),400:c("Cannot cancel order"),500:c("Internal server error")}}),Qi=new f$1().openapi(Mp,async e=>{let{status:t,customerName:n,limit:o,offset:s}=e.req.valid("query"),i=await Fi({status:t??void 0,customerName:n??void 0});return e.json(l(i.slice(s,s+o)),200)}).openapi(Lp,async e=>{let{id:t}=e.req.valid("param"),n=await $i(t);if(!n)throw new w("Order",t);return e.json(l(n),200)}).openapi(_p,async e=>{let t=e.req.valid("json"),n=await Hi(t);return e.json(O(n),201)}).openapi(zp,async e=>{let{id:t}=e.req.valid("param"),n=e.req.valid("json"),o=await Wi(t,n);if(!o)throw new w("Order",t);return e.json(l(o),200)}).openapi(Bp,async e=>{let{id:t}=e.req.valid("param");if((await Vi(t)).message==="\u8BA2\u5355\u4E0D\u5B58\u5728")throw new w("Order",t);return e.json(l({message:"Deleted successfully"}),200)}).openapi(Fp,async e=>{let{id:t}=e.req.valid("param"),n=await Gi(t);if(!n)throw new w("Order",t);return e.json(l(n),200)}).openapi($p,async e=>{let{id:t}=e.req.valid("param"),n=await Ki(t);if(!n)throw new w("Order",t);return e.json(l(n),200)});r();m();ja$1();v();$e();Tt();async function Vr(e){let n$1=await(await i()).select().from(V).where(g(V.ticketId,e.id)).orderBy(n(V.createdAt));return {id:`ticket-${e.id}`,ticketNo:e.ticketNo,customerName:e.customerName,customerEmail:e.customerEmail,subject:e.subject,description:e.description,status:e.status,priority:e.priority,category:e.category,assignedTo:e.assignedTo??void 0,createdAt:t(e.createdAt),updatedAt:t(e.updatedAt),replies:n$1.map(o=>({id:`reply-${o.id}`,ticketId:`ticket-${o.ticketId}`,content:o.content,author:o.author,isCustomer:o.isCustomer,createdAt:t(o.createdAt)}))}}function Hp(e){return {id:`ticket-${e.id}`,ticketNo:e.ticketNo,customerName:e.customerName,customerEmail:e.customerEmail,subject:e.subject,description:e.description,status:e.status,priority:e.priority,category:e.category,assignedTo:e.assignedTo??void 0,createdAt:t(e.createdAt),updatedAt:t(e.updatedAt),replies:[]}}async function Ji(e){let t=await i(),n=[];let o={urgent:0,high:1,medium:2,low:3},i$1=(n.length>0?await t.select().from(U$1).where(h(...n)):await t.select().from(U$1)).sort((d,m)=>o[d.priority]-o[m.priority]),a=[];for(let d of i$1)a.push(await Vr(d));return a}async function mo(e){let t=await i(),n=I("ticket",e);if(n===-1)return null;let s=(await t.select().from(U$1).where(g(U$1.id,n)))[0];return s?Vr(s):null}async function Yi(e){let t=await i(),n=new Date,o=await t.insert(U$1).values({ticketNo:as(),customerName:e.customerName,customerEmail:e.customerEmail,subject:e.subject,description:e.description,status:"open",priority:e.priority,category:e.category,createdAt:n,updatedAt:n}).returning();return Hp(o[0])}async function Zi(e,t){let n=await i(),o=I("ticket",e);if(o===-1)return null;let s={updatedAt:new Date};t.status!==void 0&&t.status!==null&&(s.status=t.status),t.assignedTo!==void 0&&t.assignedTo!==null&&(s.assignedTo=t.assignedTo);let i$1=await n.update(U$1).set(s).where(g(U$1.id,o)).returning();return i$1.length===0?null:Vr(i$1[0])}async function Xi(e){let t=await i(),n=I("ticket",e);return n===-1?{message:"\u5DE5\u5355\u4E0D\u5B58\u5728"}:(await t.delete(U$1).where(g(U$1.id,n)).returning()).length===0?{message:"\u5DE5\u5355\u4E0D\u5B58\u5728"}:{message:"\u5DE5\u5355\u5DF2\u5220\u9664"}}async function ea(e,t){let n=await i(),o=I("ticket",e);if(o===-1)return null;let i$1=(await n.select().from(U$1).where(g(U$1.id,o)))[0];if(!i$1)return null;let a=new Date;await n.insert(V).values({ticketId:o,content:t.content,author:t.author,isCustomer:false,createdAt:a});let d=i$1.status==="open"?"in_progress":i$1.status;return await n.update(U$1).set({status:d,updatedAt:a}).where(g(U$1.id,o)),mo(e)}async function ta(e){let t=await i(),n=I("ticket",e);if(n===-1||(await t.select().from(U$1).where(g(U$1.id,n))).length===0)return null;let s=await t.update(U$1).set({status:"closed",updatedAt:new Date}).where(g(U$1.id,n)).returning();return s.length===0?null:Vr(s[0])}var ra=e$1.enum(["open","in_progress","waiting_customer","resolved","closed"]),na=e$1.enum(["low","medium","high","urgent"]),oa=e$1.enum(["technical","billing","feature_request","bug_report","general"]),Vp=e$1.object({id:e$1.string(),ticketId:e$1.string(),content:e$1.string(),author:e$1.string(),isCustomer:e$1.boolean(),createdAt:e$1.string()}),re=e$1.object({id:e$1.string(),ticketNo:e$1.string(),customerName:e$1.string(),customerEmail:e$1.string(),subject:e$1.string(),description:e$1.string(),status:ra,priority:na,category:oa,assignedTo:e$1.string().nullish(),createdAt:e$1.string(),updatedAt:e$1.string(),replies:e$1.array(Vp)}),sa=e$1.object({customerName:e$1.string(),customerEmail:e$1.string().email(),subject:e$1.string(),description:e$1.string(),category:oa,priority:na}),ia=e$1.object({status:ra.nullish(),assignedTo:e$1.string().nullish()}),aa=e$1.object({content:e$1.string(),author:e$1.string()}),ca=e$1.array(re),ua=e$1.object({message:e$1.string()});var Gp=g$1({method:"get",path:"/tickets",tags:["tickets"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["ticket:view"]})],request:{query:e$1.object({limit:e$1.coerce.number().int().positive().max(100).default(20),offset:e$1.coerce.number().int().min(0).default(0)})},responses:{200:p(ca,"List all tickets"),401:c("Unauthorized"),403:c("Forbidden"),500:c("Internal server error")}}),Kp=g$1({method:"get",path:"/tickets/{id}",tags:["tickets"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["ticket:view"]})],request:{params:re.pick({id:true})},responses:{200:p(re,"Get ticket by id"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Ticket not found"),500:c("Internal server error")}}),Qp=g$1({method:"post",path:"/tickets",tags:["tickets"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["ticket:create"]})],request:{body:{content:{"application/json":{schema:sa}}}},responses:{201:p(re,"Create ticket"),401:c("Unauthorized"),403:c("Forbidden"),400:c("Invalid input"),500:c("Internal server error")}}),Jp=g$1({method:"put",path:"/tickets/{id}",tags:["tickets"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["ticket:edit"]})],request:{params:re.pick({id:true}),body:{content:{"application/json":{schema:ia}}}},responses:{200:p(re,"Update ticket"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Ticket not found"),400:c("Invalid input"),500:c("Internal server error")}}),Yp=g$1({method:"delete",path:"/tickets/{id}",tags:["tickets"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["ticket:delete"]})],request:{params:re.pick({id:true})},responses:{200:p(ua,"Ticket deleted"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Ticket not found"),500:c("Internal server error")}}),Zp=g$1({method:"post",path:"/tickets/{id}/reply",tags:["tickets"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["ticket:reply"]})],request:{params:re.pick({id:true}),body:{content:{"application/json":{schema:aa}}}},responses:{200:p(re,"Ticket replied"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Ticket not found"),400:c("Cannot reply ticket"),500:c("Internal server error")}}),Xp=g$1({method:"put",path:"/tickets/{id}/close",tags:["tickets"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["ticket:close"]})],request:{params:re.pick({id:true})},responses:{200:p(re,"Ticket closed"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Ticket not found"),400:c("Cannot close ticket"),500:c("Internal server error")}}),pa=new f$1().openapi(Gp,async e=>{let{limit:t,offset:n}=e.req.valid("query"),o=await Ji();return e.json(l(o.slice(n,n+t)),200)}).openapi(Kp,async e=>{let{id:t}=e.req.valid("param"),n=await mo(t);if(!n)throw new w("Ticket",t);return e.json(l(n),200)}).openapi(Qp,async e=>{let t=e.req.valid("json"),n=await Yi(t);return e.json(O(n),201)}).openapi(Jp,async e=>{let{id:t}=e.req.valid("param"),n=e.req.valid("json"),o=await Zi(t,n);if(!o)throw new w("Ticket",t);return e.json(l(o),200)}).openapi(Yp,async e=>{let{id:t}=e.req.valid("param");if((await Xi(t)).message==="\u5DE5\u5355\u4E0D\u5B58\u5728")throw new w("Ticket",t);return e.json(l({message:"Deleted successfully"}),200)}).openapi(Zp,async e=>{let{id:t}=e.req.valid("param"),n=e.req.valid("json"),o=await ea(t,n);if(!o)throw new w("Ticket",t);return e.json(l(o),200)}).openapi(Xp,async e=>{let{id:t}=e.req.valid("param"),n=await ta(t);if(!n)throw new w("Ticket",t);return e.json(l(n),200)});r();m();ja$1();v();$e();Tt();function Ct(e){return {id:`dispute-${e.id}`,disputeNo:e.disputeNo,orderId:e.orderId,orderNo:e.orderNo,customerName:e.customerName,customerEmail:e.customerEmail,type:e.type,status:e.status,description:e.description,resolution:e.resolution??void 0,amount:e.amount,createdAt:t(e.createdAt),updatedAt:t(e.updatedAt),resolvedAt:e.resolvedAt?t(e.resolvedAt):void 0,resolvedBy:e.resolvedBy??void 0}}async function da(e){let t=await i(),n$1=[];return (n$1.length>0?await t.select().from(Y).where(h(...n$1)).orderBy(n(Y.createdAt)):await t.select().from(Y).orderBy(n(Y.createdAt))).map(Ct)}async function la(e){let t=await i(),n=I("dispute",e);if(n===-1)return null;let s=(await t.select().from(Y).where(g(Y.id,n)))[0];return s?Ct(s):null}async function ma(e){let t=await i(),n=new Date,o=await t.insert(Y).values({disputeNo:cs(),orderId:e.orderId,orderNo:e.orderNo,customerName:e.customerName,customerEmail:e.customerEmail,type:e.type,status:"pending",description:e.description,amount:e.amount,createdAt:n,updatedAt:n}).returning();return Ct(o[0])}async function ga(e,t){let n=await i(),o=I("dispute",e);if(o===-1)return null;let s={updatedAt:new Date};t.status!==void 0&&t.status!==null&&(s.status=t.status),t.resolution!==void 0&&t.resolution!==null&&(s.resolution=t.resolution);let i$1=await n.update(Y).set(s).where(g(Y.id,o)).returning();return i$1.length===0?null:Ct(i$1[0])}async function ha(e){let t=await i(),n=I("dispute",e);return n===-1?{success:false,message:"\u4E89\u8BAE\u4E0D\u5B58\u5728"}:(await t.delete(Y).where(g(Y.id,n)).returning()).length===0?{success:false,message:"\u4E89\u8BAE\u4E0D\u5B58\u5728"}:{success:true,message:"\u4E89\u8BAE\u5DF2\u5220\u9664"}}async function fa(e,t){let n=await i(),o=I("dispute",e);if(o===-1)return null;let i$1=(await n.select().from(Y).where(g(Y.id,o)))[0];if(!i$1||i$1.status!=="pending"&&i$1.status!=="investigating")return null;let a=new Date,d=await n.update(Y).set({status:"resolved",resolution:t.resolution,resolvedAt:a,resolvedBy:t.resolvedBy,updatedAt:a}).where(g(Y.id,o)).returning();return Ct(d[0])}var td=g$1({method:"get",path:"/disputes",tags:["disputes"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["dispute:view"]})],request:{query:e$1.object({limit:e$1.coerce.number().int().positive().max(100).default(20),offset:e$1.coerce.number().int().min(0).default(0)})},responses:{200:p(Xn,"List all disputes"),401:c("Unauthorized"),403:c("Forbidden")}}),rd=g$1({method:"get",path:"/disputes/{id}",tags:["disputes"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["dispute:view"]})],request:{params:de.pick({id:true})},responses:{200:p(de,"Get dispute by id"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Dispute not found")}}),nd=g$1({method:"post",path:"/disputes",tags:["disputes"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["dispute:create"]})],request:Ur(Jn),responses:{201:p(de,"Create dispute"),401:c("Unauthorized"),403:c("Forbidden")}}),od=g$1({method:"put",path:"/disputes/{id}",tags:["disputes"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["dispute:edit"]})],request:{params:de.pick({id:true}),...Ur(Yn)},responses:{200:p(de,"Update dispute"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Dispute not found")}}),sd=g$1({method:"delete",path:"/disputes/{id}",tags:["disputes"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["dispute:delete"]})],request:Ks,responses:{200:p($s,"Delete dispute"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Dispute not found")}}),id=g$1({method:"put",path:"/disputes/{id}/resolve",tags:["disputes"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["dispute:resolve"]})],request:{params:de.pick({id:true}),...Ur(Zn)},responses:{200:p(de,"Dispute resolved"),401:c("Unauthorized"),403:c("Forbidden"),404:c("Dispute not found"),422:c("Cannot resolve dispute in current state")}}),ya=new f$1().openapi(td,async e=>{let{limit:t,offset:n}=e.req.valid("query"),o=await da();return e.json(l(o.slice(n,n+t)),200)}).openapi(rd,async e=>{let{id:t}=e.req.valid("param"),n=await la(t);if(!n)throw w.dispute(t);return e.json(l(n),200)}).openapi(nd,async e=>{let t=e.req.valid("json"),n=await ma(t);return e.json(O(n),201)}).openapi(od,async e=>{let{id:t}=e.req.valid("param"),n=e.req.valid("json"),o=await ga(t,n);if(!o)throw w.dispute(t);return e.json(l(o),200)}).openapi(sd,async e=>{let{id:t}=e.req.valid("param");if(!(await ha(t)).success)throw w.dispute(t);return e.json(l({message:"Deleted successfully"}),200)}).openapi(id,async e=>{let{id:t}=e.req.valid("param"),n=e.req.valid("json"),o=await fa(t,n);if(!o)throw new Pe("Cannot resolve dispute in current state");return e.json(l(o),200)});Qr();var It=e$1.enum(["article","announcement","tutorial","news","policy"]),wa=e$1.enum(["draft","published","archived"]),_=e$1.object({id:e$1.string(),title:e$1.string(),content:e$1.string(),category:It,status:wa,author:e$1.string(),tags:e$1.array(e$1.string()),viewCount:e$1.number(),likeCount:e$1.number(),createdAt:e$1.string(),updatedAt:e$1.string(),publishedAt:e$1.string().nullish()}),Ra=e$1.object({title:e$1.string(),content:e$1.string(),category:It,tags:e$1.array(e$1.string()).nullish()}),ba=e$1.object({title:e$1.string().nullish(),content:e$1.string().nullish(),category:It.nullish(),tags:e$1.array(e$1.string()).nullish(),status:wa.nullish()}),va=e$1.array(_),xa=e$1.object({message:e$1.string()});var cd=g$1({method:"get",path:"/contents",tags:["contents"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["content:view"]})],request:{query:e$1.object({limit:e$1.coerce.number().int().positive().max(100).default(20),offset:e$1.coerce.number().int().min(0).default(0)})},responses:{200:p(va,"List all contents")}}),ud=g$1({method:"get",path:"/contents/{id}",tags:["contents"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["content:view"]})],request:{params:_.pick({id:true})},responses:{200:p(_,"Get content by id"),404:c("Content not found")}}),pd=g$1({method:"post",path:"/contents",tags:["contents"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["content:create"]})],request:{body:{content:{"application/json":{schema:Ra}}}},responses:{201:p(_,"Create content"),400:c("Invalid input")}}),dd=g$1({method:"put",path:"/contents/{id}",tags:["contents"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["content:edit"]})],request:{params:_.pick({id:true}),body:{content:{"application/json":{schema:ba}}}},responses:{200:p(_,"Update content"),404:c("Content not found"),400:c("Invalid input")}}),ld=g$1({method:"delete",path:"/contents/{id}",tags:["contents"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["content:delete"]})],request:{params:_.pick({id:true})},responses:{200:p(xa,"Content deleted"),404:c("Content not found")}}),md=g$1({method:"put",path:"/contents/{id}/publish",tags:["contents"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["content:edit"]})],request:{params:_.pick({id:true})},responses:{200:p(_,"Content published"),404:c("Content not found"),422:c("Content cannot be published")}}),gd=g$1({method:"put",path:"/contents/{id}/archive",tags:["contents"],security:[{Bearer:[]}],middleware:[S({requiredPermissions:["content:edit"]})],request:{params:_.pick({id:true})},responses:{200:p(_,"Content archived"),404:c("Content not found"),422:c("Content cannot be archived")}}),Ta=new f$1().openapi(cd,async e=>{let{limit:t,offset:n}=e.req.valid("query"),o=await Et();return e.json(l(o.slice(n,n+t)),200)}).openapi(ud,async e=>{let{id:t}=e.req.valid("param"),n=await Pt(t);if(!n)throw new w("Content",t);return e.json(l(n),200)}).openapi(pd,async e=>{let t=e.req.valid("json"),n=await ho(t);return e.json(O(n),201)}).openapi(dd,async e=>{let{id:t}=e.req.valid("param"),n=e.req.valid("json"),o=await fo(t,n);if(!o)throw new w("Content",t);return e.json(l(o),200)}).openapi(ld,async e=>{let{id:t}=e.req.valid("param");if(!(await yo(t)).success)throw new w("Content",t);return e.json(l({message:"Deleted successfully"}),200)}).openapi(md,async e=>{let{id:t}=e.req.valid("param"),n=await So(t);if(!n)throw new Pe("Content cannot be published (must be in draft state)");return e.json(l(n),200)}).openapi(gd,async e=>{let{id:t}=e.req.valid("param"),n=await wo(t);if(!n)throw new Pe("Content cannot be archived (must be in published state)");return e.json(l(n),200)});Qr();var hd=g$1({method:"get",path:"/public/contents",tags:["public-contents"],request:{query:e$1.object({category:It.optional(),search:e$1.string().optional(),limit:e$1.coerce.number().int().positive().max(50).default(20),offset:e$1.coerce.number().int().min(0).default(0)})},responses:{200:p(e$1.array(_),"List published contents")}}),fd=g$1({method:"get",path:"/public/contents/{id}",tags:["public-contents"],request:{params:_.pick({id:true})},responses:{200:p(_,"Get published content"),404:c("Content not found")}}),Ca=new f$1().openapi(hd,async e=>{let{category:t,search:n,limit:o,offset:s}=e.req.valid("query"),a=(await Et({status:"published",category:t,search:n})).slice(s,s+o);return e.json(l(a),200)}).openapi(fd,async e=>{let{id:t}=e.req.valid("param"),n=await Pt(t);if(!n||n.status!=="published")throw new w("Content",t);return e.json(l(n),200)});var Aa=e$1.any(),yd=g$1({method:"get",path:"/public/{namespace}/{filename}",tags:["files"],request:{params:De},responses:{200:{description:"File content",content:{"application/octet-stream":{schema:Aa}}},404:c("File not found")}}),Sd=g$1({method:"get",path:"/private/{namespace}/{filename}",tags:["files"],request:{params:De,query:st},responses:{200:{description:"File content",content:{"application/octet-stream":{schema:Aa}}},403:c("Invalid or expired signature"),404:c("File not found")}}),wd=g$1({method:"post",path:"/generate-url",tags:["files"],request:{body:{content:{"application/json":{schema:Qt}}}},responses:{200:p(Jt,"URL generated successfully"),400:c("Invalid request"),404:c("File not found")}}),Rd=g$1({method:"head",path:"/public/{namespace}/{filename}",tags:["files"],request:{params:De},responses:{200:{description:"File exists",content:{"application/octet-stream":{schema:e$1.null()}}},404:c("File not found")}}),bd=g$1({method:"head",path:"/private/{namespace}/{filename}",tags:["files"],request:{params:De,query:st},responses:{200:{description:"File exists",content:{"application/octet-stream":{schema:e$1.null()}}},403:c("Invalid or expired signature"),404:c("File not found")}}),vd=g$1({method:"post",path:"/upload",tags:["files"],middleware:[Xo],request:{body:{content:{"multipart/form-data":{schema:Zt}}}},responses:{200:p(Yt,"File uploaded successfully"),400:c("Invalid file or upload failed")}}),Jr=new f$1().openapi(yd,async e=>{let{namespace:t,filename:n}=e.req.valid("param"),o=await Fe(t,n);if(!o)throw new w("File",`${t}/${n}`);let s=Vt(t,n),i=await wn(s);return e.header("Content-Type",o.mimeType),e.header("Content-Length",o.size.toString()),e.header("Content-Disposition",`inline; filename="${n}"`),e.header("Cache-Control","public, max-age=31536000"),e.header("Last-Modified",o.lastModified.toUTCString()),e.body(i)}).openapi(Sd,async e=>{let{namespace:t,filename:n}=e.req.valid("param"),{expiry:o,signature:s}=e.req.valid("query");if(Math.floor(Date.now()/1e3)>o)throw new G("URL has expired");if(!vn(t,n,o,s))throw new G("Invalid signature");let a=await Fe(t,n);if(!a)throw new w("File",`${t}/${n}`);let d=Vt(t,n),m=await wn(d);return e.header("Content-Type",a.mimeType),e.header("Content-Length",a.size.toString()),e.header("Content-Disposition",`inline; filename="${n}"`),e.header("Cache-Control","private, no-store"),e.body(m)}).openapi(wd,async e=>{let{namespace:t,filename:n,isPrivate:o,expirySeconds:s}=e.req.valid("json");if(!await Fe(t,n))throw new w("File",`${t}/${n}`);let a=process.env.PUBLIC_URL||"";if(o){let{url:m,expiry:h}=ss(t,n,s??void 0,a);return e.json(l({url:m,expiry:h}),200)}let d=bn(t,n,a);return e.json(l({url:d}),200)}).openapi(Rd,async e=>{let{namespace:t,filename:n}=e.req.valid("param"),o=await Fe(t,n);if(!o)throw new w("File",`${t}/${n}`);return e.header("Content-Type",o.mimeType),e.header("Content-Length",o.size.toString()),e.header("Last-Modified",o.lastModified.toUTCString()),e.body(null,200)}).openapi(bd,async e=>{let{namespace:t,filename:n}=e.req.valid("param"),{expiry:o,signature:s}=e.req.valid("query");if(Math.floor(Date.now()/1e3)>o)return e.json({success:false,error:"URL has expired"},403);if(!vn(t,n,o,s))return e.json({success:false,error:"Invalid signature"},403);let a=await Fe(t,n);if(!a)throw new w("File",`${t}/${n}`);return e.header("Content-Type",a.mimeType),e.header("Content-Length",a.size.toString()),e.body(null,200)}).openapi(vd,async e=>{let t=await e.req.parseBody(),n=t.file;if(!n||!(n instanceof File))return e.json({success:false,error:"No file provided"},400);let o=typeof t.namespace=="string"?t.namespace:"uploads",s=await n.arrayBuffer(),i=await Wt(o,{name:n.name,type:n.type,size:n.size,data:s}),a=bn(o,i.filename);return e.json(l({filename:i.filename,originalName:i.originalName,mimeType:i.mimeType,size:i.size,url:a}),200)});r();m();ja$1();v();function Ro(e){return {id:e.id,username:e.username,email:e.email,role:e.role,createdAt:t(e.createdAt)}}async function Ea(e){let t=await i(),n=await t.select().from(aa$1).where(i$1(g(aa$1.email,e.email),g(aa$1.username,e.username)));if(n.length>0){let m=n[0].email===e.email?"email":"username";throw ce.duplicateEntry(m,e[m]??"")}let o=ee(),s=`ak_${ee()}`,i$2=hashSync(e.password,10),a=new Date;await t.insert(aa$1).values({id:o,username:e.username,email:e.email,passwordHash:i$2,apiKey:s,createdAt:a,updatedAt:a});let d=await t.select().from(aa$1).where(g(aa$1.id,o));return {profile:Ro(d[0])}}async function Pa(e){let t=await i(),n=e.account||e.email;if(!n)throw new fe("Account or email is required");let o=await t.select().from(aa$1).where(i$1(g(aa$1.email,n),g(aa$1.username,n)));if(o.length===0)throw new fe("Invalid credentials");let s=o[0];if(!compareSync(e.password,s.passwordHash))throw new fe("Invalid credentials");return {profile:Ro(s)}}async function Ia(e){let n=await(await i()).select().from(aa$1).where(g(aa$1.id,e));return n.length===0?null:Ro(n[0])}var Ed=process.env.AUTH_SECRET_KEY||"dev-secret-key-change-in-production";function Da(e){return Pc.sign({userId:e.id,username:e.username,email:e.email,role:e.role},Ed,{expiresIn:"7d"})}var Pd=g$1({method:"post",path:"/auth/register",tags:["auth"],request:{body:{content:{"application/json":{schema:ur}}}},responses:{201:p(pt,"Register a new developer"),409:c("Email or username already exists"),400:c("Invalid input")}}),Id=g$1({method:"post",path:"/auth/login",tags:["auth"],request:{body:{content:{"application/json":{schema:cr}}}},responses:{200:p(pt,"Login and get token"),401:c("Invalid credentials"),400:c("Invalid input")}}),Dd=g$1({method:"get",path:"/auth/verify",tags:["auth"],responses:{200:p(ut,"Verify token and get profile"),401:c("Unauthorized")}}),ka=new f$1().openapi(Pd,async e=>{let t=e.req.valid("json"),{profile:n}=await Ea(t),o=Da(n);return e.json(O({token:o,profile:n}),201)}).openapi(Id,async e=>{let t=e.req.valid("json"),{profile:n}=await Pa(t),o=Da(n);return e.json(l({token:o,profile:n}),200)}).openapi(Dd,async e=>{let t=e.get("authUser"),n=await Ia(t.id);if(!n)throw new Ee("Developer profile not found");return e.json(l(n),200)});r();m();ja$1();function Yr(e){if(e)try{return JSON.parse(e)}catch{return}}function Ne(e){return e==null?null:JSON.stringify(e)}function z(e){return {id:e.id,name:e.name,slug:e.slug,description:e.description??"",readme:e.readme??void 0,authorId:e.authorId,authorName:e.authorName,repositoryUrl:e.repositoryUrl??void 0,homepageUrl:e.homepageUrl??void 0,npmPackage:e.npmPackage??void 0,license:e.license??void 0,version:e.version,status:e.status,downloadCount:e.downloadCount,viewCount:e.viewCount,featured:e.featured,screenshotUrl:e.screenshotUrl??void 0,siteUrls:Yr(e.siteUrls),tags:Yr(e.tags),commands:Yr(e.commands),rejectReason:e.rejectReason??void 0,createdAt:e.createdAt.getTime(),updatedAt:e.updatedAt.getTime()}}async function Ua(e){let t=await i();if((await t.select().from(ca$1).where(g(ca$1.slug,e.slug))).length>0)throw new ce(`Plugin with slug '${e.slug}' already exists`);let o=ee(),s=new Date,i$1=await t.insert(ca$1).values({id:o,name:e.name,slug:e.slug,description:e.description,readme:e.readme??null,authorId:e.authorId,authorName:e.authorName,repositoryUrl:e.repositoryUrl??null,homepageUrl:e.homepageUrl??null,npmPackage:e.npmPackage??null,license:e.license??null,version:"0.0.1",status:"pending",screenshotUrl:e.screenshotUrl??null,siteUrls:Ne(e.siteUrls),tags:Ne(e.tags),commands:Ne(e.commands),createdAt:s,updatedAt:s}).returning();return z(i$1[0])}async function Oa(e,t,n){let o=await i(),s=await o.select().from(ca$1).where(g(ca$1.slug,e));if(s.length===0)throw new w("Plugin",e);if(s[0].authorId!==n)throw new G("Only the plugin author can update this plugin");let a={updatedAt:new Date};t.name!==void 0&&(a.name=t.name),t.description!==void 0&&(a.description=t.description),t.readme!==void 0&&(a.readme=t.readme),t.repositoryUrl!==void 0&&(a.repositoryUrl=t.repositoryUrl),t.homepageUrl!==void 0&&(a.homepageUrl=t.homepageUrl),t.npmPackage!==void 0&&(a.npmPackage=t.npmPackage),t.license!==void 0&&(a.license=t.license),t.screenshotUrl!==void 0&&(a.screenshotUrl=t.screenshotUrl),t.siteUrls!==void 0&&(a.siteUrls=Ne(t.siteUrls)),t.tags!==void 0&&(a.tags=Ne(t.tags)),t.commands!==void 0&&(a.commands=Ne(t.commands));let d=await o.update(ca$1).set(a).where(g(ca$1.slug,e)).returning();return z(d[0])}async function Na(e,t){let n=await i(),o=await n.select().from(ca$1).where(g(ca$1.slug,e));if(o.length===0)throw new w("Plugin",e);if(o[0].authorId!==t)throw new G("Only the plugin author can delete this plugin");await n.delete(ca$1).where(g(ca$1.slug,e));}async function ja(e){let t=await i(),n=await t.select().from(ca$1).where(g(ca$1.slug,e));if(n.length===0)throw new w("Plugin",e);await t.update(ca$1).set({downloadCount:n[0].downloadCount+1,updatedAt:new Date}).where(g(ca$1.slug,e));}r();m();ja$1();function Ud(e){return {id:e.id,pluginId:e.pluginId,version:e.version,changelog:e.changelog??void 0,packageUrl:e.packageUrl??void 0,fileSize:e.fileSize??void 0,checksum:e.checksum??void 0,status:e.status,publishedAt:e.publishedAt.getTime()}}function Od(e){return {id:e.id,name:e.name,slug:e.slug,description:e.description??void 0,icon:e.icon??void 0,sortOrder:e.sortOrder}}async function Nd(e,t=""){try{let n=await j$2();if(!n||!("execute"in n))return 0;let o=t?`SELECT COUNT(*) as count FROM ${e} WHERE ${t}`:`SELECT COUNT(*) as count FROM ${e}`;return (await n.execute(o)).rows[0]?.count??0}catch{return 0}}async function qa(e={}){try{let t=await i(),n$1=e.page??1,o=e.limit??20,s=(n$1-1)*o,i$1=[];e.status?i$1.push(g(ca$1.status,e.status)):i$1.push(g(ca$1.status,"approved")),e.featured!==void 0&&e.featured!==null&&i$1.push(g(ca$1.featured,e.featured));let a=i$1.length>1?h(...i$1):i$1[0],d;switch(e.sort){case "popular":d=n(ca$1.viewCount);break;case "downloads":d=n(ca$1.downloadCount);break;case "name":d=m$2(ca$1.name);break;default:d=n(ca$1.createdAt);}let m=await t.select().from(ca$1).where(a).orderBy(d).limit(o).offset(s),h$1=await Nd("plugins",e.status?`status = '${e.status}'`:"status = 'approved'");return {plugins:m.map(z),total:h$1,page:n$1,limit:o}}catch{return {plugins:[],total:0,page:e.page??1,limit:e.limit??20}}}async function Ma(e,t={}){try{let n$1=await i(),o=t.page??1,s=t.limit??20,i$2=(o-1)*s,a=`%${e}%`,d=[g(ca$1.status,"approved"),i$1(l$1(ca$1.name,a),l$1(ca$1.description,a),l$1(ca$1.tags,a),l$1(ca$1.authorName,a))];if(t.category){let T=await n$1.select().from(fa$1).where(g(fa$1.slug,t.category));if(T.length>0){let j=await n$1.select().from(ga$1).where(g(ga$1.categoryId,T[0].id));if(j.length>0){let ne=j.map(kt=>kt.pluginId);d.push(y$1`${ca$1.id} IN (${y$1.join(ne.map(kt=>y$1`${kt}`),y$1`, `)})`);}}}let m=h(...d),h$1=await n$1.select().from(ca$1).where(m).orderBy(n(ca$1.downloadCount)).limit(s).offset(i$2),b=await j$2(),v=0;if(b&&"execute"in b)try{let T=e.replace(/'/g,"''");v=(await b.execute(`SELECT COUNT(*) as count FROM plugins WHERE status = 'approved' AND (name LIKE '%${T}%' OR description LIKE '%${T}%' OR tags LIKE '%${T}%' OR author_name LIKE '%${T}%')`)).rows[0]?.count??0;}catch{v=0;}return {plugins:h$1.map(z),total:v,page:o,limit:s}}catch{return {plugins:[],total:0,page:t.page??1,limit:t.limit??20}}}async function Dt(e){try{let t=await i(),n=await t.select().from(ca$1).where(g(ca$1.slug,e));if(n.length===0)throw new w("Plugin",e);try{await t.update(ca$1).set({viewCount:n[0].viewCount+1}).where(g(ca$1.slug,e));}catch{}return z(n[0])}catch(t){throw w&&t instanceof w?t:new w("Plugin",e)}}async function La(e){try{return (await(await i()).select().from(da$1).where(g(da$1.pluginId,e)).orderBy(n(da$1.publishedAt))).map(Ud)}catch{return []}}async function _a(){try{return (await(await i()).select().from(fa$1).orderBy(m$2(fa$1.sortOrder))).map(Od)}catch{return []}}async function za(e,t={}){try{let n$1=await i(),o=t.page??1,s=t.limit??20,i$1=(o-1)*s,a=await n$1.select().from(fa$1).where(g(fa$1.slug,e));if(a.length===0)throw new w("Category",e);let d=a[0].id,h$1=(await n$1.select().from(ga$1).where(g(ga$1.categoryId,d))).map(ne=>ne.pluginId);if(h$1.length===0)return {plugins:[],total:0,page:o,limit:s};let b=h(g(ca$1.status,"approved"),y$1`${ca$1.id} IN (${y$1.join(h$1.map(ne=>y$1`${ne}`),y$1`, `)})`),v=await n$1.select().from(ca$1).where(b).orderBy(n(ca$1.downloadCount)).limit(s).offset(i$1),T=await j$2(),j=0;if(T&&"execute"in T)try{let ne=h$1.map(Rc=>`'${Rc}'`).join(",");j=(await T.execute(`SELECT COUNT(*) as count FROM plugins WHERE status = 'approved' AND id IN (${ne})`)).rows[0]?.count??0;}catch{j=0;}return {plugins:v.map(z),total:j,page:o,limit:s}}catch(n){if(w&&n instanceof w)throw n;return {plugins:[],total:0,page:t.page??1,limit:t.limit??20}}}async function Ba(e){try{return (await(await i()).select().from(ca$1).where(g(ca$1.authorId,e)).orderBy(n(ca$1.createdAt))).map(z)}catch{return []}}async function Fa(){try{let e=await j$2();if(!e||!("execute"in e))return {totalPlugins:0,totalDownloads:0,totalDevelopers:0,totalCategories:0};let[t,n,o,s]=await Promise.all([e.execute("SELECT COUNT(*) as count FROM plugins WHERE status = 'approved'"),e.execute("SELECT COALESCE(SUM(download_count), 0) as total FROM plugins"),e.execute("SELECT COUNT(DISTINCT author_id) as count FROM plugins"),e.execute("SELECT COUNT(*) as count FROM plugin_categories")]);return {totalPlugins:t.rows[0]?.count??0,totalDownloads:n.rows[0]?.total??0,totalDevelopers:o.rows[0]?.count??0,totalCategories:s.rows[0]?.count??0}}catch{return {totalPlugins:0,totalDownloads:0,totalDevelopers:0,totalCategories:0}}}r();m();ja$1();function $a(e){return {id:e.id,pluginId:e.pluginId,userId:e.userId,userName:e.userName,rating:e.rating,title:e.title??void 0,content:e.content??void 0,createdAt:e.createdAt.getTime()}}async function Ha(e){let t=await i();if((await t.select().from(ca$1).where(g(ca$1.id,e.pluginId))).length===0)throw new w("Plugin",e.pluginId);if((await t.select().from(ea$1).where(h(g(ea$1.pluginId,e.pluginId),g(ea$1.userId,e.userId)))).length>0)throw new ce("You have already reviewed this plugin");let s=ee(),i$1=new Date,a=await t.insert(ea$1).values({id:s,pluginId:e.pluginId,userId:e.userId,userName:e.userName,rating:e.rating,title:e.title??null,content:e.content??null,createdAt:i$1}).returning();return $a(a[0])}async function Wa(e){return (await(await i()).select().from(ea$1).where(g(ea$1.pluginId,e)).orderBy(ea$1.createdAt)).map($a)}async function Va(e,t){let n=await i(),o=await n.select().from(ea$1).where(g(ea$1.id,e));if(o.length===0)throw new w("Review",e);if(o[0].userId!==t)throw new G("Only the review author can delete this review");await n.delete(ea$1).where(g(ea$1.id,e));}var Md=g$1({method:"get",path:"/plugins",tags:["plugins"],request:{query:hr},responses:{200:p(We,"List plugins")}}),Ld=g$1({method:"get",path:"/plugins/search",tags:["plugins"],request:{query:fr},responses:{200:p(We,"Search plugins")}}),_d=g$1({method:"get",path:"/plugins/{slug}",tags:["plugins"],request:{params:$},responses:{200:p(W,"Get plugin by slug"),404:c("Plugin not found")}}),zd=g$1({method:"get",path:"/plugins/{slug}/versions",tags:["plugins"],request:{params:$},responses:{200:p(e$1.array(dr),"List plugin versions"),404:c("Plugin not found")}}),Bd=g$1({method:"post",path:"/plugins",tags:["plugins"],security:[{Bearer:[]}],request:{body:{content:{"application/json":{schema:lt}}}},responses:{201:p(W,"Create plugin"),400:c("Invalid input"),409:c("Plugin slug already exists")}}),Fd=g$1({method:"put",path:"/plugins/{slug}",tags:["plugins"],security:[{Bearer:[]}],request:{params:$,body:{content:{"application/json":{schema:pr}}}},responses:{200:p(W,"Update plugin"),404:c("Plugin not found"),403:c("Forbidden")}}),$d=g$1({method:"delete",path:"/plugins/{slug}",tags:["plugins"],security:[{Bearer:[]}],request:{params:$},responses:{200:p(Ue,"Delete plugin"),404:c("Plugin not found"),403:c("Forbidden")}}),Hd=g$1({method:"post",path:"/plugins/{slug}/reviews",tags:["plugins"],security:[{Bearer:[]}],request:{params:$,body:{content:{"application/json":{schema:lr}}}},responses:{201:p(mt,"Submit review"),404:c("Plugin not found"),409:c("Already reviewed")}}),Wd=g$1({method:"get",path:"/plugins/{slug}/reviews",tags:["plugins"],request:{params:$},responses:{200:p(e$1.array(mt),"List reviews")}}),Vd=g$1({method:"delete",path:"/plugins/{slug}/reviews/{reviewId}",tags:["plugins"],security:[{Bearer:[]}],request:{params:yr},responses:{200:p(Sr,"Review deleted"),404:c("Review not found"),403:c("Forbidden")}}),Gd=g$1({method:"post",path:"/plugins/{slug}/install",tags:["plugins"],request:{params:$},responses:{200:p(Ue,"Install tracked"),404:c("Plugin not found")}}),Kd=g$1({method:"get",path:"/categories",tags:["plugins"],responses:{200:p(e$1.array(Te),"List categories")}}),Qd=g$1({method:"get",path:"/categories/{slug}/plugins",tags:["plugins"],request:{params:wr,query:Rr},responses:{200:p(We,"Plugins by category"),404:c("Category not found")}}),Jd=g$1({method:"get",path:"/stats",tags:["plugins"],responses:{200:p(mr,"Marketplace stats")}}),Yd=g$1({method:"get",path:"/plugins/mine",tags:["plugins"],security:[{Bearer:[]}],responses:{200:p(e$1.array(W),"My plugins")}}),Ga=new f$1().openapi(Yd,async e=>{let t=U(e);if(!t)return e.json({success:false,error:"Unauthorized"},401);try{let n=await Ba(t.id);return e.json(l(n),200)}catch{return e.json(l([]),200)}}).openapi(Md,async e=>{let t=e.req.valid("query");try{let n=await qa({page:t.page,limit:t.limit,status:t.status,sort:t.sort,featured:t.featured});return e.json(l(n),200)}catch{return e.json(l({plugins:[],total:0,page:1,limit:20}),200)}}).openapi(Ld,async e=>{let{q:t,page:n,limit:o,category:s}=e.req.valid("query");try{let i=await Ma(t,{page:n,limit:o,category:s});return e.json(l(i),200)}catch{return e.json(l({plugins:[],total:0,page:1,limit:20}),200)}}).openapi(_d,async e=>{let{slug:t}=e.req.valid("param");try{let n=await Dt(t);return e.json(l(n),200)}catch{return e.json({success:false,error:"Plugin not found"},404)}}).openapi(zd,async e=>{let{slug:t}=e.req.valid("param");try{let n=await Dt(t),o=await La(n.id);return e.json(l(o),200)}catch{return e.json(l([]),200)}}).openapi(Bd,async e=>{let t=e.req.valid("json"),n=U(e),o=await Ua({...t,authorId:n.id,authorName:n.username});return e.json(O(o),201)}).openapi(Fd,async e=>{let{slug:t}=e.req.valid("param"),n=e.req.valid("json"),o=U(e),s=await Oa(t,n,o.id);return e.json(l(s),200)}).openapi($d,async e=>{let{slug:t}=e.req.valid("param"),n=U(e);return await Na(t,n.id),e.json(l({slug:t}),200)}).openapi(Hd,async e=>{let{slug:t}=e.req.valid("param"),n=e.req.valid("json"),o=U(e);try{let s=await Dt(t),i=await Ha({pluginId:s.id,userId:o.id,userName:o.username,rating:n.rating,title:n.title,content:n.content});return e.json(O(i),201)}catch{return e.json({success:false,error:"Plugin not found"},404)}}).openapi(Wd,async e=>{let{slug:t}=e.req.valid("param");try{let n=await Dt(t),o=await Wa(n.id);return e.json(l(o),200)}catch{return e.json(l([]),200)}}).openapi(Vd,async e=>{let{reviewId:t}=e.req.valid("param"),n=U(e);return await Va(t,n.id),e.json(l({id:t}),200)}).openapi(Gd,async e=>{let{slug:t}=e.req.valid("param");try{return await ja(t),e.json(l({slug:t}),200)}catch{return e.json(l({slug:t}),200)}}).openapi(Kd,async e=>{try{let t=await _a();return e.json(l(t),200)}catch{return e.json(l([]),200)}}).openapi(Qd,async e=>{let{slug:t}=e.req.valid("param"),{page:n,limit:o}=e.req.valid("query");try{let s=await za(t,{page:n,limit:o});return e.json(l(s),200)}catch{return e.json(l({plugins:[],total:0,page:1,limit:20}),200)}}).openapi(Jd,async e=>{let t=await Fa();return e.json(l(t),200)});r();m();ja$1();async function Ka(e={}){let t=await i(),n$1=e.page??1,o=e.limit??20,s=(n$1-1)*o,i$1=await t.select().from(ca$1).where(g(ca$1.status,"pending")).orderBy(n(ca$1.createdAt)).limit(o).offset(s),a=await j$2(),d=0;return a&&"execute"in a&&(d=(await a.execute("SELECT COUNT(*) as count FROM plugins WHERE status = 'pending'")).rows[0]?.count??0),{plugins:i$1.map(z),total:d,page:n$1,limit:o}}async function Qa(e){let t=await i();if((await t.select().from(ca$1).where(g(ca$1.slug,e))).length===0)throw new w("Plugin",e);let o=await t.update(ca$1).set({status:"approved",rejectReason:null,updatedAt:new Date}).where(g(ca$1.slug,e)).returning();return z(o[0])}async function Ja(e,t){let n=await i();if((await n.select().from(ca$1).where(g(ca$1.slug,e))).length===0)throw new w("Plugin",e);let s=await n.update(ca$1).set({status:"rejected",rejectReason:t,updatedAt:new Date}).where(g(ca$1.slug,e)).returning();return z(s[0])}async function Ya(e){let t=await i(),n=await t.select().from(ca$1).where(g(ca$1.slug,e));if(n.length===0)throw new w("Plugin",e);let o=await t.update(ca$1).set({featured:!n[0].featured,updatedAt:new Date}).where(g(ca$1.slug,e)).returning();return z(o[0])}async function Za(e){let t=await i();if((await t.select().from(ca$1).where(g(ca$1.slug,e))).length===0)throw new w("Plugin",e);await t.delete(ca$1).where(g(ca$1.slug,e));}async function Xa(e={}){let t=await i(),n$1=e.page??1,o=e.limit??20,s=(n$1-1)*o,i$1=e.status?g(ca$1.status,e.status):void 0,a=e.status?await t.select().from(ca$1).where(i$1).orderBy(n(ca$1.createdAt)).limit(o).offset(s):await t.select().from(ca$1).orderBy(n(ca$1.createdAt)).limit(o).offset(s),d=await j$2(),m=0;if(d&&"execute"in d){let h=e.status?`SELECT COUNT(*) as count FROM plugins WHERE status = '${e.status}'`:"SELECT COUNT(*) as count FROM plugins";m=(await d.execute(h)).rows[0]?.count??0;}return {plugins:a.map(z),total:m,page:n$1,limit:o}}async function ec(e){let t=await i(),n=0;for(let o of e)(await t.select().from(ca$1).where(g(ca$1.slug,o))).length>0&&(await t.update(ca$1).set({status:"approved",rejectReason:null,updatedAt:new Date}).where(g(ca$1.slug,o)),n++);return n}async function tc(e,t){let n=await i(),o=0;for(let s of e)(await n.select().from(ca$1).where(g(ca$1.slug,s))).length>0&&(await n.update(ca$1).set({status:"rejected",rejectReason:t,updatedAt:new Date}).where(g(ca$1.slug,s)),o++);return o}r();m();ja$1();function bo(e){return {id:e.id,name:e.name,slug:e.slug,description:e.description??void 0,icon:e.icon??void 0,sortOrder:e.sortOrder}}async function rc(e){let t=await i();if((await t.select().from(fa$1).where(g(fa$1.slug,e.slug))).length>0)throw new ce(`Category with slug '${e.slug}' already exists`);let o=ee(),s=await t.insert(fa$1).values({id:o,name:e.name,slug:e.slug,description:e.description??null,icon:e.icon??null,sortOrder:0}).returning();return bo(s[0])}async function nc(e,t){let n=await i();if((await n.select().from(fa$1).where(g(fa$1.id,e))).length===0)throw new w("Category",e);let s={};t.name!==void 0&&t.name!==null&&(s.name=t.name),t.slug!==void 0&&t.slug!==null&&(s.slug=t.slug),t.description!==void 0&&(s.description=t.description),t.icon!==void 0&&(s.icon=t.icon),t.sortOrder!==void 0&&t.sortOrder!==null&&(s.sortOrder=t.sortOrder);let i$1=await n.update(fa$1).set(s).where(g(fa$1.id,e)).returning();return bo(i$1[0])}async function oc(e){let t=await i();if((await t.select().from(fa$1).where(g(fa$1.id,e))).length===0)throw new w("Category",e);await t.delete(fa$1).where(g(fa$1.id,e));}async function sc(){return (await(await i()).select().from(fa$1).orderBy(m$2(fa$1.sortOrder))).map(bo)}m();m();ja$1();async function ic(){let e=await j$2();if(!e||!("execute"in e))return {totalPlugins:0,pendingPlugins:0,totalDownloads:0,totalDevelopers:0,totalCategories:0};let[t,n,o,s,i$1]=await Promise.all([e.execute("SELECT COUNT(*) as count FROM plugins"),e.execute("SELECT COUNT(*) as count FROM plugins WHERE status = 'pending'"),e.execute("SELECT COALESCE(SUM(download_count), 0) as total FROM plugins"),e.execute("SELECT COUNT(DISTINCT author_id) as count FROM plugins"),e.execute("SELECT COUNT(*) as count FROM plugin_categories")]),m=(await(await i()).select().from(ca$1).orderBy(ca$1.createdAt).limit(5)).map(z);return {totalPlugins:t.rows[0]?.count??0,pendingPlugins:n.rows[0]?.count??0,totalDownloads:o.rows[0]?.total??0,totalDevelopers:s.rows[0]?.count??0,totalCategories:i$1.rows[0]?.count??0,recentSubmissions:m}}var tl=g$1({method:"get",path:"/stats/dashboard",tags:["admin-plugins"],responses:{200:p(gr,"Dashboard stats")}}),rl=g$1({method:"get",path:"/plugins/pending",tags:["admin-plugins"],request:{query:br},responses:{200:p(gt,"Pending plugins")}}),nl=g$1({method:"get",path:"/plugins",tags:["admin-plugins"],request:{query:vr},responses:{200:p(gt,"All plugins")}}),ol=g$1({method:"put",path:"/plugins/{slug}/approve",tags:["admin-plugins"],request:{params:$},responses:{200:p(W,"Plugin approved"),404:c("Plugin not found")}}),sl=g$1({method:"put",path:"/plugins/{slug}/reject",tags:["admin-plugins"],request:{params:$,body:{content:{"application/json":{schema:xr}}}},responses:{200:p(W,"Plugin rejected"),404:c("Plugin not found")}}),il=g$1({method:"put",path:"/plugins/{slug}/feature",tags:["admin-plugins"],request:{params:$},responses:{200:p(W,"Featured toggled"),404:c("Plugin not found")}}),al=g$1({method:"delete",path:"/plugins/{slug}",tags:["admin-plugins"],request:{params:$},responses:{200:p(Ue,"Plugin removed"),404:c("Plugin not found")}}),cl=g$1({method:"post",path:"/plugins/bulk-approve",tags:["admin-plugins"],request:{body:{content:{"application/json":{schema:Tr}}}},responses:{200:p(ht,"Bulk approved")}}),ul=g$1({method:"post",path:"/plugins/bulk-reject",tags:["admin-plugins"],request:{body:{content:{"application/json":{schema:Cr}}}},responses:{200:p(ht,"Bulk rejected")}}),pl=g$1({method:"get",path:"/categories",tags:["admin-plugins"],responses:{200:p(e$1.array(Te),"List categories")}}),dl=g$1({method:"post",path:"/categories",tags:["admin-plugins"],request:{body:{content:{"application/json":{schema:Ar}}}},responses:{201:p(Te,"Category created"),409:c("Category slug already exists")}}),ll=g$1({method:"put",path:"/categories/{id}",tags:["admin-plugins"],request:{params:ft,body:{content:{"application/json":{schema:Er}}}},responses:{200:p(Te,"Category updated"),404:c("Category not found")}}),ml=g$1({method:"delete",path:"/categories/{id}",tags:["admin-plugins"],request:{params:ft},responses:{200:p(Pr,"Category deleted"),404:c("Category not found")}}),ac=new f$1().openapi(tl,async e=>{let t=await ic();return e.json(l(t),200)}).openapi(rl,async e=>{let{page:t,limit:n}=e.req.valid("query"),o=await Ka({page:t,limit:n});return e.json(l(o),200)}).openapi(nl,async e=>{let{page:t,limit:n,status:o}=e.req.valid("query"),s=await Xa({page:t,limit:n,status:o});return e.json(l(s),200)}).openapi(ol,async e=>{let{slug:t}=e.req.valid("param"),n=await Qa(t);return e.json(l(n),200)}).openapi(sl,async e=>{let{slug:t}=e.req.valid("param"),{reason:n}=e.req.valid("json"),o=await Ja(t,n);return e.json(l(o),200)}).openapi(il,async e=>{let{slug:t}=e.req.valid("param"),n=await Ya(t);return e.json(l(n),200)}).openapi(al,async e=>{let{slug:t}=e.req.valid("param");return await Za(t),e.json(l({slug:t}),200)}).openapi(cl,async e=>{let{slugs:t}=e.req.valid("json"),n=await ec(t);return e.json(l({count:n}),200)}).openapi(ul,async e=>{let{slugs:t,reason:n}=e.req.valid("json"),o=await tc(t,n);return e.json(l({count:o}),200)}).openapi(pl,async e=>{let t=await sc();return e.json(l(t),200)}).openapi(dl,async e=>{let t=e.req.valid("json"),n=await rc(t);return e.json(O(n),201)}).openapi(ll,async e=>{let{id:t}=e.req.valid("param"),n=e.req.valid("json"),o=await nc(t,n);return e.json(l(o),200)}).openapi(ml,async e=>{let{id:t}=e.req.valid("param");return await oc(t),e.json(l({id:t}),200)});var gl=g$1({method:"get",path:"/admin/dashboard/stats",responses:{200:p(qn,"Dashboard stats")}}),cc=new f$1().openapi(gl,async e=>e.json({success:true,data:{stats:[{label:"Total Users",value:"12,847",trend:12.5},{label:"Active Users",value:"8,234",trend:8.2},{label:"Revenue",value:"$48,293",trend:-2.4},{label:"Conversion",value:"3.2%",trend:4.1}],revenue:[{month:"Jan",value:65},{month:"Feb",value:45},{month:"Mar",value:78},{month:"Apr",value:52},{month:"May",value:90},{month:"Jun",value:70}],userGrowth:[{month:"Jan",value:30},{month:"Feb",value:45},{month:"Mar",value:55},{month:"Apr",value:60},{month:"May",value:72},{month:"Jun",value:85}],activity:[{id:1,user:"Sarah Chen",action:"Upgraded to Pro plan",date:"2024-01-15",status:"Active"},{id:2,user:"Mike Johnson",action:"Submitted support ticket",date:"2024-01-14",status:"Pending"},{id:3,user:"Emily Davis",action:"Cancelled subscription",date:"2024-01-13",status:"Inactive"},{id:4,user:"Alex Turner",action:"Registered new account",date:"2024-01-12",status:"Active"},{id:5,user:"Lisa Park",action:"Updated billing info",date:"2024-01-11",status:"Active"}]}}));var hl=50,fl=.08,vo=[{id:1,name:"Wireless Headphones",variant:"Black",price:79.99,quantity:1,color:"#374151"},{id:2,name:"Organic Cotton T-Shirt",variant:"Medium / Sage",price:34.99,quantity:2,color:"#6ee7b7"},{id:3,name:"Ceramic Travel Mug",variant:"Amber / 350ml",price:24.99,quantity:1,color:"#f59e0b"}];function yl(e){let t=e.reduce((a,d)=>a+d.price*d.quantity,0),n=t>=hl?0:5.99,o=t*fl,s=t+n+o,i=e.reduce((a,d)=>a+d.quantity,0);return {subtotal:t,shipping:n,tax:o,total:s,totalItems:i}}var Sl=g$1({method:"get",path:"/cart",responses:{200:p(Mn,"Get cart")}}),wl=g$1({method:"post",path:"/cart/items",request:{body:{content:{"application/json":{schema:Ln}}}},responses:{201:p(Ir,"Item added to cart"),400:c("Invalid input")}}),Rl=g$1({method:"delete",path:"/cart/items/{id}",request:{params:e$1.object({id:e$1.string()})},responses:{200:p(Hn,"Item removed"),404:c("Item not found")}}),uc=new f$1().openapi(Sl,async e=>{let t=yl(vo);return e.json({success:true,data:{items:vo,summary:t}})}).openapi(wl,async e=>{let t=e.req.valid("json");return e.json({success:true,data:t},201)}).openapi(Rl,async e=>{let{id:t}=e.req.valid("param");return vo.some(o=>String(o.id)===t)?e.json({success:true,data:{removedId:t}}):e.json({success:false,error:"Item not found"},404)});var bl=[{id:"ORD-2024-001",date:"2024-12-10",status:"processing",products:[{name:"Wireless Headphones",color:"#374151"},{name:"USB-C Cable",color:"#6366f1"}],total:94.98},{id:"ORD-2024-002",date:"2024-12-08",status:"shipped",products:[{name:"Organic Cotton T-Shirt",color:"#6ee7b7"},{name:"Ceramic Travel Mug",color:"#f59e0b"},{name:"Linen Tote Bag",color:"#d4a574"}],total:79.97},{id:"ORD-2024-003",date:"2024-12-01",status:"delivered",products:[{name:"Bamboo Desk Organizer",color:"#a3e635"},{name:"Recycled Notebook",color:"#f472b6"}],total:45.98},{id:"ORD-2024-004",date:"2024-11-25",status:"delivered",products:[{name:"Beeswax Candle Set",color:"#fbbf24"}],total:29.99},{id:"ORD-2024-005",date:"2024-11-20",status:"cancelled",products:[{name:"Wooden Phone Stand",color:"#92400e"},{name:"Plant-Based Soap",color:"#86efac"}],total:39.98}],vl=g$1({method:"get",path:"/orders-mock",responses:{200:p(Wn,"List e-commerce orders")}}),pc=new f$1().openapi(vl,async e=>e.json({success:true,data:bl}));var dc=[{id:"1",title:"How to implement real-time notifications with SSE?",excerpt:"I am trying to set up server-sent events for my community app. The connection keeps dropping after a few minutes. Has anyone dealt with this issue before?",votes:24,replyCount:8,viewCount:342,status:"solved",tags:[{label:"SSE",color:"bg-emerald-100 text-emerald-700"},{label:"Real-time",color:"bg-blue-100 text-blue-700"}],author:{name:"Sarah Chen",initials:"SC"},createdAt:"1h ago"},{id:"2",title:"Best practices for WebSocket reconnection logic",excerpt:"My WebSocket client disconnects when the user switches tabs. What reconnection strategies do you recommend for a production environment?",votes:18,replyCount:0,viewCount:156,status:"unanswered",tags:[{label:"WebSocket",color:"bg-purple-100 text-purple-700"},{label:"Architecture",color:"bg-orange-100 text-orange-700"}],author:{name:"Alex Rivera",initials:"AR"},createdAt:"2h ago"},{id:"3",title:"Type-safe API routes with Hono RPC \u2014 a complete guide",excerpt:"After months of using Hono RPC in production, here is my comprehensive guide to achieving full end-to-end type safety across your stack.",votes:56,replyCount:12,viewCount:891,status:"hot",tags:[{label:"Hono",color:"bg-sky-100 text-sky-700"},{label:"TypeScript",color:"bg-blue-100 text-blue-700"},{label:"Guide",color:"bg-emerald-100 text-emerald-700"}],author:{name:"Jordan Park",initials:"JP"},createdAt:"3h ago"},{id:"4",title:"Deploying Hono apps to Cloudflare Workers with D1",excerpt:"Step-by-step walkthrough of deploying a full-stack Hono application to Cloudflare Workers, including database setup with D1 and R2 storage.",votes:31,replyCount:5,viewCount:478,status:"solved",tags:[{label:"Cloudflare",color:"bg-amber-100 text-amber-700"},{label:"Deployment",color:"bg-rose-100 text-rose-700"}],author:{name:"Mika Tanaka",initials:"MT"},createdAt:"5h ago"},{id:"5",title:"Zustand vs Jotai \u2014 which state manager for community apps?",excerpt:"Comparing Zustand and Jotai for a medium-complexity community application. Performance benchmarks and developer experience included.",votes:42,replyCount:0,viewCount:267,status:"unanswered",tags:[{label:"React",color:"bg-cyan-100 text-cyan-700"},{label:"State Management",color:"bg-violet-100 text-violet-700"}],author:{name:"Liam Nguyen",initials:"LN"},createdAt:"8h ago"},{id:"6",title:"Building a plugin system with module manifests",excerpt:"How we designed a declarative module manifest system that lets users scaffold apps with only the features they need. Patterns and lessons learned.",votes:67,replyCount:19,viewCount:1204,status:"hot",tags:[{label:"Architecture",color:"bg-orange-100 text-orange-700"},{label:"Plugins",color:"bg-pink-100 text-pink-700"}],author:{name:"Emma Wilson",initials:"EW"},createdAt:"12h ago"},{id:"7",title:"Optimizing React components with useMemo and useCallback",excerpt:"Understanding when and how to use React hooks for performance optimization. Real-world examples and benchmarks showing measurable improvements.",votes:45,replyCount:15,viewCount:678,status:"discussion",tags:[{label:"React",color:"bg-cyan-100 text-cyan-700"},{label:"Performance",color:"bg-amber-100 text-amber-700"}],author:{name:"\u5F20\u4F1F",initials:"ZW"},createdAt:"1d ago"},{id:"8",title:"PostgreSQL query optimization for large datasets",excerpt:"Strategies for handling millions of rows with efficient indexing, query planning, and materialized views. Includes EXPLAIN ANALYZE walkthrough.",votes:89,replyCount:23,viewCount:1567,status:"hot",tags:[{label:"PostgreSQL",color:"bg-blue-100 text-blue-700"},{label:"Database",color:"bg-indigo-100 text-indigo-700"},{label:"Performance",color:"bg-amber-100 text-amber-700"}],author:{name:"Raj Sharma",initials:"RS"},createdAt:"1d ago"},{id:"9",title:"Implementing JWT authentication with refresh tokens",excerpt:"Secure authentication flow with JWT access tokens and refresh tokens. Best practices for token storage, rotation, and revocation.",votes:72,replyCount:18,viewCount:1245,status:"solved",tags:[{label:"Auth",color:"bg-rose-100 text-rose-700"},{label:"Security",color:"bg-red-100 text-red-700"},{label:"JWT",color:"bg-pink-100 text-pink-700"}],author:{name:"\u7530\u4E2D\u592A\u90CE",initials:"TT"},createdAt:"2d ago"},{id:"10",title:"Building microservices with Docker and Kubernetes",excerpt:"Complete guide to containerizing Node.js applications and orchestrating them with Kubernetes. Includes service discovery, load balancing, and autoscaling.",votes:103,replyCount:31,viewCount:1890,status:"hot",tags:[{label:"Docker",color:"bg-sky-100 text-sky-700"},{label:"Kubernetes",color:"bg-blue-100 text-blue-700"},{label:"Microservices",color:"bg-violet-100 text-violet-700"}],author:{name:"Marie Dubois",initials:"MD"},createdAt:"2d ago"},{id:"11",title:"Writing accessible React applications",excerpt:"Essential ARIA patterns and semantic HTML for building inclusive web apps. Screen reader testing checklist and common accessibility pitfalls.",votes:58,replyCount:14,viewCount:923,status:"open",tags:[{label:"Accessibility",color:"bg-emerald-100 text-emerald-700"},{label:"React",color:"bg-cyan-100 text-cyan-700"},{label:"A11y",color:"bg-lime-100 text-lime-700"}],author:{name:"\uAE40\uBBFC\uC218",initials:"KM"},createdAt:"3d ago"},{id:"12",title:"TypeScript utility types explained with examples",excerpt:"Deep dive into TypeScript utility types like Pick, Omit, Partial, Record, and more. Practical examples for everyday use.",votes:81,replyCount:22,viewCount:1456,status:"hot",tags:[{label:"TypeScript",color:"bg-blue-100 text-blue-700"},{label:"Guide",color:"bg-emerald-100 text-emerald-700"}],author:{name:"Anna M\xFCller",initials:"AM"},createdAt:"3d ago"},{id:"13",title:"Redis caching strategies for high-traffic APIs",excerpt:"Implementing Redis caching layers for REST APIs. Cache invalidation strategies, TTL policies, and handling cache stampedes.",votes:64,replyCount:9,viewCount:1012,status:"solved",tags:[{label:"Redis",color:"bg-red-100 text-red-700"},{label:"Caching",color:"bg-orange-100 text-orange-700"},{label:"API",color:"bg-sky-100 text-sky-700"}],author:{name:"Carlos Silva",initials:"CS"},createdAt:"3d ago"},{id:"14",title:"GraphQL Federation for microservices architecture",excerpt:"Combining multiple GraphQL services into a unified API with Apollo Federation. Schema stitching, type composition, and distributed tracing.",votes:47,replyCount:0,viewCount:623,status:"unanswered",tags:[{label:"GraphQL",color:"bg-pink-100 text-pink-700"},{label:"Microservices",color:"bg-violet-100 text-violet-700"}],author:{name:"\u674E\u660E",initials:"LM"},createdAt:"4h ago"},{id:"15",title:"Testing React components with Vitest and Testing Library",excerpt:"Modern testing setup with Vitest and React Testing Library. Writing maintainable tests, mocking external dependencies, and snapshot testing.",votes:76,replyCount:17,viewCount:1234,status:"discussion",tags:[{label:"Testing",color:"bg-amber-100 text-amber-700"},{label:"React",color:"bg-cyan-100 text-cyan-700"},{label:"Vitest",color:"bg-purple-100 text-purple-700"}],author:{name:"Elena Popova",initials:"EP"},createdAt:"5h ago"},{id:"16",title:"RESTful API design best practices",excerpt:"Comprehensive guide to designing REST APIs. Resource naming, HTTP methods, status codes, pagination, filtering, and versioning strategies.",votes:92,replyCount:28,viewCount:1678,status:"hot",tags:[{label:"API Design",color:"bg-sky-100 text-sky-700"},{label:"REST",color:"bg-emerald-100 text-emerald-700"},{label:"Architecture",color:"bg-orange-100 text-orange-700"}],author:{name:"\u4F50\u85E4\u5065",initials:"SK"},createdAt:"6h ago"},{id:"17",title:"CSS Grid vs Flexbox \u2014 when to use which?",excerpt:"Practical comparison of CSS Grid and Flexbox layouts. Use cases, browser support, and examples of combining both for complex layouts.",votes:39,replyCount:8,viewCount:567,status:"open",tags:[{label:"CSS",color:"bg-indigo-100 text-indigo-700"},{label:"Layout",color:"bg-purple-100 text-purple-700"}],author:{name:"Olga Ivanova",initials:"OI"},createdAt:"8h ago"},{id:"18",title:"Setting up CI/CD pipeline with GitHub Actions",excerpt:"Automating testing, building, and deployment with GitHub Actions. Multi-environment configs, secrets management, and deployment strategies.",votes:68,replyCount:13,viewCount:1102,status:"solved",tags:[{label:"CI/CD",color:"bg-rose-100 text-rose-700"},{label:"GitHub",color:"bg-slate-100 text-slate-700"},{label:"DevOps",color:"bg-blue-100 text-blue-700"}],author:{name:"\u9EC4\u5FD7\u5F3A",initials:"HZ"},createdAt:"30m ago"},{id:"19",title:"Node.js event loop explained in depth",excerpt:"Understanding the Node.js event loop, call stack, and asynchronous operations. Performance implications and best practices for event-driven apps.",votes:55,replyCount:11,viewCount:845,status:"discussion",tags:[{label:"Node.js",color:"bg-green-100 text-green-700"},{label:"Performance",color:"bg-amber-100 text-amber-700"}],author:{name:"Giovanni Rossi",initials:"GR"},createdAt:"45m ago"},{id:"20",title:"Handling file uploads in multipart/form-data with Hono",excerpt:"Implementing secure file upload endpoints in Hono. Validation, storage with R2, handling large files, and progress tracking.",votes:71,replyCount:16,viewCount:1323,status:"solved",tags:[{label:"Hono",color:"bg-sky-100 text-sky-700"},{label:"File Upload",color:"bg-indigo-100 text-indigo-700"},{label:"R2",color:"bg-amber-100 text-amber-700"}],author:{name:"Priya Patel",initials:"PP"},createdAt:"2h ago"},{id:"21",title:"Debouncing and throttling in React applications",excerpt:"Implementing debouncing and throttling for search inputs, scroll events, and API calls. Custom hooks and performance considerations.",votes:33,replyCount:5,viewCount:445,status:"open",tags:[{label:"React",color:"bg-cyan-100 text-cyan-700"},{label:"Performance",color:"bg-amber-100 text-amber-700"},{label:"Hooks",color:"bg-pink-100 text-pink-700"}],author:{name:"\u5C71\u672C\u82B1\u5B50",initials:"YH"},createdAt:"1w ago"}],xl=[{id:"1",type:"reply",text:"Replied to",target:"How to implement real-time notifications with SSE?",time:"2h ago"},{id:"2",type:"topic",text:"Created topic",target:"Best practices for WebSocket reconnection logic",time:"5h ago"},{id:"3",type:"like",text:"Liked",target:"Type-safe API routes with Hono RPC \u2014 a complete guide",time:"8h ago"},{id:"4",type:"reply",text:"Replied to",target:"Deploying Hono apps to Cloudflare Workers with D1",time:"1d ago"},{id:"5",type:"topic",text:"Created topic",target:"Zustand vs Jotai \u2014 which state manager for community apps?",time:"2d ago"},{id:"6",type:"like",text:"Liked",target:"Building a plugin system with module manifests",time:"3d ago"},{id:"7",type:"reply",text:"Replied to",target:"How to set up CI/CD for monorepo projects",time:"4d ago"},{id:"8",type:"topic",text:"Created topic",target:"Tailwind CSS v4 migration guide and tips",time:"5d ago"}],Tl=g$1({method:"get",path:"/topics",responses:{200:p(kr,"List community topics")}}),Cl=g$1({method:"get",path:"/topics/popular",responses:{200:p(kr,"Popular topics")}}),Al=g$1({method:"get",path:"/profile",responses:{200:p(Vn,"User profile")}}),lc=new f$1().openapi(Tl,async e=>e.json({success:true,data:dc})).openapi(Cl,async e=>{let t=[...dc].sort((n,o)=>o.votes-n.votes);return e.json({success:true,data:t})}).openapi(Al,async e=>e.json({success:true,data:{stats:{topics:12,replies:48,likes:156},activity:xl}}));var El=Le({windowMs:6e4,max:100,message:"Too many requests"}),mc=new f$1().use("*",El).route("/api",Mi).route("/api",ka).route("/api",ui).route("/api",ci).route("/api",Qs).route("/api",Ga).route("/api",Ca).route("/api",uc).route("/api",pc).route("/api",lc),gc=new f$1().route("/api",Qi).route("/api",pa).route("/api",ya).route("/api",Ta).route("/api",Jr).route("/api",Bi).route("/api",Js).route("/api",ri).route("/api",ni).route("/api",qi).route("/api",ac).route("/api",cc);function hc(e={}){let t=new f$1().use("*",an()).use("*",on()).use("*",nn()).use("*",ts()).use("/api/*",ns()).use("/api/admin/*",cn({maxRequests:20,windowMs:6e4})).route("/",mc).route("/",gc).route("/files",Jr).get("/health",async n=>{try{let{getDb:o}=await import('./db-4AQOSFAX.js');return await o(),n.json({status:"ok",timestamp:new Date().toISOString(),db:"connected"})}catch{return n.json({status:"ok",timestamp:new Date().toISOString(),db:"not configured"})}}).post("/api/__test__/cleanup",async n=>{try{let{cleanupTestDatabase:o}=await import('./test-setup-Z2RYE5B4.js');return await o(),n.json({success:!0,message:"Database cleaned up"})}catch(o){return console.error("Error during database cleanup:",o),n.json({success:false,message:"Failed to cleanup database"},500)}});return Vo(t),t.onError((n,o)=>{let s=d("api");if(o.res.headers.set("Content-Type","application/json"),X.isAppError(n))return o.json({success:false,error:n.message,status:n.statusCode,details:n.details},n.statusCode);if(n instanceof c$1)return o.json({success:false,error:n.message,status:n.status},n.status);if(n instanceof d$1){let i=n.issues.map(a=>({field:a.path.join("."),message:a.message}));return o.json({success:false,error:"Validation failed",status:400,details:i},400)}return s.error({err:n,path:o.req.path},"Unhandled error"),o.json({success:false,error:n.message||"Internal server error",status:500},500)}),t}ja$1();h$1();f();var fc=e.db();async function Pl(){let e=Il();if(fc.debug({driver:"d1"},"Creating database connection"),!e.d1Database)throw new Error("D1 database binding not found. Make sure D1 is configured in wrangler.toml");let t=g$2(e.d1Database,{schema:ia$1});return fc.info({driver:"d1"},"Database connected"),t}function Il(){return {driver:"d1",d1Database:globalThis.DB}}var Dl=["/","/todos","/content","/notifications","/websocket"],kl=["/content/"];function yc(e){if(Dl.includes(e))return true;for(let t of kl)if(e.startsWith(t))return true;return false}function xo(e){return `isr:${e==="/"?"/index":e.replace(/\/$/,"")}`}var To=class{cache=new Map;timer=null;constructor(){this.timer=setInterval(()=>this.cleanup(),6e4),this.timer&&typeof this.timer=="object"&&"unref"in this.timer&&this.timer.unref();}cleanup(){let t=Date.now();for(let[n,o]of this.cache)t>o.revalidateAt+6e4&&this.cache.delete(n);}async get(t){return this.cache.get(t)??null}async set(t,n,o){let s=Date.now();this.cache.set(t,{html:n,createdAt:s,revalidateAt:s+o.maxAge*1e3});}async purge(t){this.cache.delete(t);}async purgePattern(t){let n=new RegExp("^"+t.replace(/\*/g,".*")+"$");for(let o of this.cache.keys())n.test(o)&&this.cache.delete(o);}destroy(){this.timer&&(clearInterval(this.timer),this.timer=null),this.cache.clear();}},Co=class{cache=null;origin="https://isr.local";async getCache(){return this.cache||(this.cache=await caches.open("isr-pages")),this.cache}toUrl(t){return `${this.origin}${t.replace(/^isr:/,"")}`}async get(t){let n=await this.getCache(),o=this.toUrl(t),s=await n.match(o);if(!s)return null;let i=await s.text(),a=Number(s.headers.get("x-isr-created-at")||"0"),d=Number(s.headers.get("x-isr-revalidate-at")||"0");return {html:i,createdAt:a,revalidateAt:d}}async set(t,n,o){let s=await this.getCache(),i=this.toUrl(t),a=Date.now(),d=new Response(n,{headers:{"Content-Type":"text/html;charset=UTF-8","x-isr-created-at":String(a),"x-isr-revalidate-at":String(a+o.maxAge*1e3),"x-isr-max-age":String(o.maxAge),"x-isr-stale-while-revalidate":String(o.staleWhileRevalidate),"Cache-Control":`public, max-age=${o.maxAge}, s-maxage=${o.maxAge}, stale-while-revalidate=${o.staleWhileRevalidate}`}});await s.put(i,d);}async purge(t){let n=await this.getCache(),o=this.toUrl(t);await n.delete(o);}async purgePattern(t){let n=await this.getCache(),o=new RegExp("^"+t.replace(/\*/g,".*")+"$"),s=[];for(let i of s){let d=`isr:${new URL(i.url).pathname}`;o.test(d)&&await n.delete(i);}}};function Sc(e){let t=60,n=300,s=typeof caches<"u"&&typeof caches.open=="function"?new Co:new To;return {async lookup(i){let a=xo(i),d=await s.get(a);if(!d)return {status:"miss",html:null};let m=Date.now(),h=d.revalidateAt+n*1e3;return m<=d.revalidateAt?{status:"fresh",html:d.html,entry:d}:m<=h?{status:"stale",html:d.html,entry:d}:{status:"miss",html:null}},async store(i,a,d){let m=xo(i),h={maxAge:d?.maxAge??t,staleWhileRevalidate:d?.staleWhileRevalidate??n};await s.set(m,a,h);},async purge(i){let a=xo(i);await s.purge(a);},async purgePattern(i){await s.purgePattern(i);},getStore(){return s}}}var Ul=[{path:"/",pattern:/^\/$/,meta:{title:"Todo List - Biomimic App",description:"A full-stack application template with React and Hono"}},{path:"/todos",pattern:/^\/todos$/,meta:{title:"Todo List - Biomimic App",description:"Manage your todos with real-time updates"}},{path:"/notifications",pattern:/^\/notifications$/,meta:{title:"Notifications - Biomimic App",description:"Real-time notifications via Server-Sent Events"}},{path:"/websocket",pattern:/^\/websocket$/,meta:{title:"WebSocket Demo - Biomimic App",description:"Type-safe WebSocket communication demo"}},{path:"/content",pattern:/^\/content$/,meta:{title:"\u5185\u5BB9\u4E2D\u5FC3 - Biomimic App",description:"Content management with categories and search"}},{path:"/content/:id",pattern:/^\/content\/([^/]+)$/,meta:{title:"\u5185\u5BB9\u8BE6\u60C5 - Biomimic App",description:"View content details"},loader:async e=>{try{let n=await(Qr(),c$3(Kr)).getContentById(e.id);if(n)return {__meta:{title:`${n.title} - Biomimic App`,description:n.content?.substring(0,160)||"View content details"},content:n}}catch{}return {}}}];function Ol(e){for(let t of Ul){let n=e.match(t.pattern);if(n){let o={};return t.path==="/content/:id"&&n[1]&&(o.id=n[1]),{route:t,params:o}}}return null}async function Ao(e,t){let n=Ol(e);if(!n)return jl();let{route:o,params:s}=n,i={...o.meta},a={};if(o.loader)try{let m=await o.loader(s);m.__meta&&(i={...i,...m.__meta},delete m.__meta),a=m;}catch{}return {html:Nl({title:i.title,description:i.description,ogType:i.ogType||"website",data:a,pathname:e}),status:200,headers:{"Content-Type":"text/html;charset=UTF-8","X-ISR-Rendered":"true"}}}function Nl(e){let n=JSON.stringify(e.data).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">");return `<!DOCTYPE html>
|
|
38
44
|
<html lang="en">
|
|
39
45
|
<head>
|
|
40
46
|
<meta charset="UTF-8" />
|
|
41
47
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
|
42
48
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
43
|
-
<title>${
|
|
44
|
-
<meta name="description" content="${
|
|
45
|
-
<meta property="og:title" content="${
|
|
46
|
-
<meta property="og:description" content="${
|
|
47
|
-
<meta property="og:type" content="${
|
|
48
|
-
<meta property="og:url" content="${
|
|
49
|
+
<title>${Qe(e.title)}</title>
|
|
50
|
+
<meta name="description" content="${Qe(e.description)}" />
|
|
51
|
+
<meta property="og:title" content="${Qe(e.title)}" />
|
|
52
|
+
<meta property="og:description" content="${Qe(e.description)}" />
|
|
53
|
+
<meta property="og:type" content="${Qe(e.ogType)}" />
|
|
54
|
+
<meta property="og:url" content="${Qe(e.pathname)}" />
|
|
49
55
|
<meta name="generator" content="ISR" />
|
|
50
56
|
</head>
|
|
51
57
|
<body>
|
|
52
58
|
<div id="root"></div>
|
|
53
|
-
<script>window.__SSR_DATA__ = ${
|
|
59
|
+
<script>window.__SSR_DATA__ = ${n};window.__SSR_PATH__ = ${JSON.stringify(e.pathname)};</script>
|
|
54
60
|
<script type="module" src="/src/client/main.tsx"></script>
|
|
55
61
|
</body>
|
|
56
|
-
</html>`}function
|
|
62
|
+
</html>`}function jl(){return {html:`<!DOCTYPE html>
|
|
57
63
|
<html lang="en">
|
|
58
64
|
<head>
|
|
59
65
|
<meta charset="UTF-8" />
|
|
@@ -66,4 +72,4 @@ data: ${JSON.stringify({timestamp:Date.now()})}
|
|
|
66
72
|
<div id="root"></div>
|
|
67
73
|
<script type="module" src="/src/client/main.tsx"></script>
|
|
68
74
|
</body>
|
|
69
|
-
</html>`,status:200,headers:{"Content-Type":"text/html;charset=UTF-8"}}}function
|
|
75
|
+
</html>`,status:200,headers:{"Content-Type":"text/html;charset=UTF-8"}}}function Qe(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}go();var Xr=gn();a$2(Xr);Xr.handleWS("/api/chat/ws");Xr.handleSSE("/api/notifications/stream");Xr.handleSSE("/api/admin/notifications/stream");var ql=hc(),Zr=Sc();Sa(Zr);var wc=ql.use("*",async(e,t)=>{globalThis.DB=e.env.DB,await t();}).get("/",e=>e.json({name:"Biomimic Todo App",version:"0.1.0",environment:"cloudflare-workers"})).onError((e,t)=>{console.error("Server error:",e),t.res.headers.set("Content-Type","application/json");let n=500;"statusCode"in e&&typeof e.statusCode=="number"?n=e.statusCode:"status"in e&&typeof e.status=="number"&&(n=e.status);let o=e.message||"Internal server error";return t.json({success:false,error:o,status:n},n)}),ov={fetch:async(e,t,n)=>{globalThis.DB=t.DB;let s=new URL(e.url).pathname;if(s.startsWith("/api/")||s==="/health")return wc.fetch(e,t,n);if(t.ASSETS&&(s.startsWith("/assets/")||s.endsWith(".js")||s.endsWith(".css")||s.endsWith(".svg")||s.endsWith(".png")||s.endsWith(".ico")||s==="/vite.svg")){let i=await t.ASSETS.fetch(e);if(i.status!==404)return i}if(yc(s)){let i=await Zr.lookup(s);if(i.status==="fresh"&&i.html)return new Response(i.html,{headers:{"Content-Type":"text/html;charset=UTF-8","X-ISR-Status":"fresh"}});if(i.status==="stale"&&i.html)return n.waitUntil(Ml(s)),new Response(i.html,{headers:{"Content-Type":"text/html;charset=UTF-8","X-ISR-Status":"stale"}});let a=await Ao(s);return n.waitUntil(Zr.store(s,a.html)),new Response(a.html,{status:a.status,headers:{...a.headers,"X-ISR-Status":"miss"}})}if(t.ASSETS){let i=await t.ASSETS.fetch(e);if(i.status!==404)return i}return wc.fetch(e,t,n)}};async function Ml(e,t){try{let n=await Ao(e);await Zr.store(e,n.html);}catch(n){console.error("ISR regeneration failed:",n);}}export{Lt as RealtimeDurableObject,ov as default,Pl as getDb,Zr as isrCache};
|