W)return te.slice(0,-1)+"…";return O}function P(){w&&w.dispose(),w=md.init(document.querySelector(".sender-pie"));let O={tooltip:{trigger:"item",formatter:W=>`${W.marker} ${W.name}: ${W.value} (${W.percent}%)`},legend:{type:"scroll",orient:"vertical",left:"10",top:"20",formatter:function(W){return U(W)}},series:[{data:p.value,name:"",type:"pie",radius:["40%","65%"],center:[E,"45%"],avoidLabelOverlap:!1,itemStyle:{borderRadius:4,borderColor:"#fff",borderWidth:2},label:{show:!1,position:"outside",formatter:"{d}%",color:"#333",fontSize:14},emphasis:{label:{show:!1,fontSize:40,fontWeight:"bold"}},labelLine:{show:!0},color:["#3CB2FF","#13DEB9","#FBBF24","#FF7F50","#BAE6FD","#C084FC"]}]};w.setOption(O)}function N(){_&&_.dispose(),_=md.init(document.querySelector(".increase-line"));let O={tooltip:{trigger:"axis",axisPointer:{type:"cross",crossStyle:{color:"#999"},axis:"x"},formatter:function(W){let ee="";return W.forEach(te=>{ee=`${te.marker} 用户数: ${te.value}`}),ee},backgroundColor:"#fff",borderColor:"#ccc",borderWidth:1,padding:10,textStyle:{color:"#333"}},grid:{top:"8%",right:"20",left:"35",bottom:"35"},xAxis:{type:"category",data:v.xdata,axisTick:{show:!1,alignWithLabel:!1,lineStyle:{color:"red"}},axisPointer:{label:{show:!1}},axisLine:{lineStyle:{color:"#909399",width:1,type:"solid"}},axisLabel:{formatter:function(W,ee){return ee===0?" "+W:ee===v.xdata.length-1?W+" ":W}},boundaryGap:!1},yAxis:{type:"value",axisLabel:{margin:5},boundaryGap:[0,.1],max:W=>{if(W.max<8)return 10},axisLine:{show:!0,lineStyle:{color:"#909399",width:1}},axisPointer:{label:{show:!0,formatter:W=>Math.round(W.value)}},splitLine:{show:!0,lineStyle:{type:"dashed",color:"#ccc"}}},series:[{data:v.sdata,type:"line",smooth:.1,symbol:"none",lineStyle:{color:"#1D84FF",width:2.5},areaStyle:{color:new md.graphic.LinearGradient(0,0,0,1,[{offset:0,color:"rgba(29, 132, 255, 0.3)"},{offset:1,color:"rgba(29, 132, 255, 0.03)"}])},color:["#1D84FF"]}]};_.setOption(O)}function z(){C&&C.dispose(),C=md.init(document.querySelector(".email-column"));const O={tooltip:{formatter:function(W){return W.marker,`${W.marker} ${W.seriesName}: ${W.value}`}},legend:{data:["接收","发送"],top:"0"},grid:{left:"18",right:"18",bottom:"15",top:"50",containLabel:!0},xAxis:{type:"category",data:g.daysData,axisTick:{show:!1},axisLine:{show:!0,lineStyle:{color:"#909399",width:1}}},yAxis:{max:W=>{if(W.max<8)return 10},type:"value",boundaryGap:[0,.1]},series:[{name:"接收",type:"bar",stack:"total",barWidth:"60%",barMaxWidth:30,emphasis:{itemStyle:{shadowBlur:10,shadowColor:"rgba(0,0,0,0.3)"}},data:g.receiveData,itemStyle:{color:"#3CB2FF"}},{name:"发送",type:"bar",stack:"total",emphasis:{itemStyle:{shadowBlur:10,shadowColor:"rgba(0,0,0,0.3)"}},data:g.sendData,itemStyle:{color:"#13deb9"}}]};C.setOption(O)}function $(){x&&x.dispose(),x=md.init(document.querySelector(".send-count"));let O={tooltip:{},series:[{name:"今日发件",type:"gauge",max:100,progress:{show:!0,roundCap:!0,itemStyle:{color:"#3CB2FF"}},pointer:{itemStyle:{color:"#3CB2FF"}},axisLine:{roundCap:!0,lineStyle:{color:[[1,"#E6EBF8"]]}},axisTick:{lineStyle:{color:"#999"}},detail:{valueAnimation:!0,formatter:"{value}",color:"#333"},data:[{value:m,name:"次数",title:{color:"#333"}}]}],color:["#3CB2FF"]};x.setOption(O)}return(O,W)=>{const ee=wQ,te=XR,re=zy,ce=ya;return l.value?(R(),Q("div",FSe,[V(us)])):(R(),le(ce,{key:1,style:{height:"100%"}},{default:X(()=>[(R(),Q("div",{class:"analysis",key:y(M)},[I("div",VSe,[I("div",zSe,[I("div",HSe,[I("div",WSe,[W[1]||(W[1]=I("div",null,"收件数量",-1)),I("div",null,[V(ee,{formatter:ie=>Math.round(ie),value:y(c)},null,8,["formatter","value"])])]),I("div",USe,[I("div",KSe,[V(y(nt),{icon:"hugeicons:mailbox-01",width:"25",height:"25"})])])]),I("div",jSe,[I("div",null,[W[2]||(W[2]=Xe("正常 ")),I("span",YSe,Ae(u.normalReceiveTotal),1)]),I("div",null,[W[3]||(W[3]=Xe("删除 ")),I("span",GSe,Ae(u.delReceiveTotal),1)])])]),I("div",qSe,[I("div",XSe,[I("div",ZSe,[W[4]||(W[4]=I("div",null,"发件数量",-1)),I("div",null,[V(ee,{formatter:ie=>Math.round(ie),value:y(f)},null,8,["formatter","value"])])]),I("div",JSe,[I("div",QSe,[V(y(nt),{icon:"cil:send",width:"25",height:"25"})])])]),I("div",eCe,[I("div",null,[W[5]||(W[5]=Xe("正常 ")),I("span",tCe,Ae(u.normalSendTotal),1)]),I("div",null,[W[6]||(W[6]=Xe("删除 ")),I("span",nCe,Ae(u.delSendTotal),1)])])]),I("div",rCe,[I("div",aCe,[I("div",iCe,[W[7]||(W[7]=I("div",null,"邮箱数量",-1)),I("div",null,[V(ee,{formatter:ie=>Math.round(ie),value:y(d)},null,8,["formatter","value"])])]),I("div",oCe,[I("div",sCe,[V(y(nt),{icon:"lets-icons:e-mail",width:"23",height:"23"})])])]),I("div",lCe,[I("div",null,[W[8]||(W[8]=Xe("正常 ")),I("span",uCe,Ae(u.normalAccountTotal),1)]),I("div",null,[W[9]||(W[9]=Xe("删除 ")),I("span",cCe,Ae(u.delAccountTotal),1)])])]),I("div",fCe,[I("div",dCe,[I("div",hCe,[W[10]||(W[10]=I("div",null,"用户数量",-1)),I("div",null,[V(ee,{formatter:ie=>Math.round(ie),value:y(h)},null,8,["formatter","value"])])]),I("div",pCe,[I("div",vCe,[V(y(nt),{icon:"iconoir:user",width:"25",height:"25"})])])]),I("div",gCe,[I("div",null,[W[11]||(W[11]=Xe("正常 ")),I("span",mCe,Ae(u.normalUserTotal),1)]),I("div",null,[W[12]||(W[12]=Xe("删除 ")),I("span",yCe,Ae(u.delUserTotal),1)])])])]),I("div",bCe,[I("div",_Ce,[I("div",wCe,[W[13]||(W[13]=I("span",null,"邮件来源",-1)),ye("",!0)]),W[14]||(W[14]=I("div",{class:"sender-pie"},null,-1))]),W[15]||(W[15]=I("div",{class:"picture-item"},[I("div",{class:"title"},"用户增长"),I("div",{class:"increase-line"})],-1))]),W[16]||(W[16]=I("div",{class:"picture-cs"},[I("div",{class:"picture-cs-item"},[I("div",{class:"title"},"邮件增长"),I("div",{class:"email-column"})]),I("div",{class:"picture-cs-item"},[I("div",{class:"title"},"今日发件"),I("div",{class:"send-count"})])],-1))]))]),_:1}))}}}),CCe=Jn(SCe,[["__scopeId","data-v-396b22d0"]]),xCe=Object.freeze(Object.defineProperty({__proto__:null,default:CCe},Symbol.toStringTag,{value:"Module"}));
diff --git a/mail-worker/dist/index.html b/mail-worker/dist/index.html
index 3bd8dda..942b9e5 100644
--- a/mail-worker/dist/index.html
+++ b/mail-worker/dist/index.html
@@ -6,8 +6,8 @@
-
-
+
+
diff --git a/mail-worker/package-lock.json b/mail-worker/package-lock.json
index e6e8966..9ea1061 100644
--- a/mail-worker/package-lock.json
+++ b/mail-worker/package-lock.json
@@ -8,10 +8,11 @@
"name": "mail-worker",
"version": "0.0.0",
"dependencies": {
- "@cloudflare/vite-plugin": "^1.0.5",
+ "@cloudflare/vite-plugin": "1.6.0",
"dayjs": "^1.11.13",
"drizzle-orm": "^0.42.0",
"hono": "^4.7.5",
+ "i18next": "^25.3.2",
"linkedom": "^0.18.10",
"postal-mime": "^2.4.3",
"resend": "^4.5.1",
@@ -24,6 +25,15 @@
"wrangler": "^4.7.0"
}
},
+ "node_modules/@babel/runtime": {
+ "version": "7.27.6",
+ "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.27.6.tgz",
+ "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@cloudflare/kv-asset-handler": {
"version": "0.3.4",
"resolved": "https://registry.npmmirror.com/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.4.tgz",
@@ -54,20 +64,20 @@
}
},
"node_modules/@cloudflare/vite-plugin": {
- "version": "1.0.5",
- "resolved": "https://registry.npmmirror.com/@cloudflare/vite-plugin/-/vite-plugin-1.0.5.tgz",
- "integrity": "sha512-IkXIIl92AEvlNpC2Or8DZBALAeLgbBrEZutGDWFi/bp6AyHeqPbYb4G8Bm1XaVGKtDw/k8CCX9gpGhxkyOr6RQ==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/vite-plugin/-/vite-plugin-1.6.0.tgz",
+ "integrity": "sha512-pK5uqCXzXePnpUY4tDIFE1TJNMnybdInN28QU+il1ElbJUuVCM/9YnzJIvYzSrDbXzVUSAIZDleqf5kAOjQALg==",
"license": "MIT",
"dependencies": {
- "@cloudflare/unenv-preset": "2.3.1",
- "@hattip/adapter-node": "^0.0.49",
+ "@cloudflare/unenv-preset": "2.3.2",
+ "@mjackson/node-fetch-server": "^0.6.1",
"@rollup/plugin-replace": "^6.0.1",
"get-port": "^7.1.0",
- "miniflare": "4.20250409.0",
+ "miniflare": "4.20250604.1",
"picocolors": "^1.1.1",
"tinyglobby": "^0.2.12",
- "unenv": "2.0.0-rc.15",
- "wrangler": "4.10.0",
+ "unenv": "2.0.0-rc.17",
+ "wrangler": "4.20.0",
"ws": "8.18.0"
},
"peerDependencies": {
@@ -76,13 +86,13 @@
}
},
"node_modules/@cloudflare/vite-plugin/node_modules/@cloudflare/unenv-preset": {
- "version": "2.3.1",
- "resolved": "https://registry.npmmirror.com/@cloudflare/unenv-preset/-/unenv-preset-2.3.1.tgz",
- "integrity": "sha512-Xq57Qd+ADpt6hibcVBO0uLG9zzRgyRhfCUgBT9s+g3+3Ivg5zDyVgLFy40ES1VdNcu8rPNSivm9A+kGP5IVaPg==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/unenv-preset/-/unenv-preset-2.3.2.tgz",
+ "integrity": "sha512-MtUgNl+QkQyhQvv5bbWP+BpBC1N0me4CHHuP2H4ktmOMKdB/6kkz/lo+zqiA4mEazb4y+1cwyNjVrQ2DWeE4mg==",
"license": "MIT OR Apache-2.0",
"peerDependencies": {
- "unenv": "2.0.0-rc.15",
- "workerd": "^1.20250320.0"
+ "unenv": "2.0.0-rc.17",
+ "workerd": "^1.20250508.0"
},
"peerDependenciesMeta": {
"workerd": {
@@ -91,9 +101,9 @@
}
},
"node_modules/@cloudflare/vite-plugin/node_modules/@cloudflare/workerd-darwin-64": {
- "version": "1.20250413.0",
- "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250413.0.tgz",
- "integrity": "sha512-ZCVOinRi8cIprpF7kMyl6beNt42lPD2E14Yp3QblxoY+4c8bIX3wkrxwubz7o6AYR/wUjVnkh6lhJsb12MbnzQ==",
+ "version": "1.20250722.0",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250722.0.tgz",
+ "integrity": "sha512-FRCR39OBEXoNAExk0PjrNpnPXROzttVqDJhIt2OSkbMCDaLV9dKTKTse64600l6a6IoSISwUpZrQx8ANNr2ojA==",
"cpu": [
"x64"
],
@@ -108,9 +118,9 @@
}
},
"node_modules/@cloudflare/vite-plugin/node_modules/@cloudflare/workerd-darwin-arm64": {
- "version": "1.20250413.0",
- "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250413.0.tgz",
- "integrity": "sha512-3xnBhLoB4JE9W8gn9Qgg2p7aRyY9TJNqRDDmcGfLLtjrjLZGa14hkaqpvgJsIXE3+7xmkQM7j/WnMeTercF8oQ==",
+ "version": "1.20250722.0",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250722.0.tgz",
+ "integrity": "sha512-ejUEIYTIDsbXPUS+hwh5W/HAJZZZyfvDG8d/IHEtMr0/u80+77QlcdnZcpGGuw9g8O8BiFb2+hBYIYcPSDqxhw==",
"cpu": [
"arm64"
],
@@ -125,9 +135,9 @@
}
},
"node_modules/@cloudflare/vite-plugin/node_modules/@cloudflare/workerd-linux-64": {
- "version": "1.20250413.0",
- "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250413.0.tgz",
- "integrity": "sha512-HHhJoiQjpSc3lOnwlA9V4zSIjZa9G3hUjR/ScrHfV1L7JXnffDzne3Knotk7jIf9MPHw4TUUmIYxdpRongqfMg==",
+ "version": "1.20250722.0",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250722.0.tgz",
+ "integrity": "sha512-K+pPolaQGero4SpXq24HB5N+cC5/pVW1KlIVuNgl4Y3Yk7DRrSdGGrcPmrSbGecCD8atVPDfZZSrkg8J9+qJhQ==",
"cpu": [
"x64"
],
@@ -142,9 +152,9 @@
}
},
"node_modules/@cloudflare/vite-plugin/node_modules/@cloudflare/workerd-linux-arm64": {
- "version": "1.20250413.0",
- "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250413.0.tgz",
- "integrity": "sha512-CaJf9k7CdG8+EVOpKtk1l4+q3v2DyGyOgP3EfMVWsjfcmAgZci+fzJon8gqLZlYY7bfRiU6utQcqKwksM0hQtA==",
+ "version": "1.20250722.0",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250722.0.tgz",
+ "integrity": "sha512-3IT39Xp3SJVuZgMZx2A9fmlCWJt5dNqkYmvOCrTVgADPBhUlqQF9Xil4jnC2eCmxlTvjFaul4AWe9FFwWMuHEg==",
"cpu": [
"arm64"
],
@@ -159,9 +169,9 @@
}
},
"node_modules/@cloudflare/vite-plugin/node_modules/@cloudflare/workerd-windows-64": {
- "version": "1.20250413.0",
- "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250413.0.tgz",
- "integrity": "sha512-34ryrDYCnHGTodixDBBq3gLkAdfzciyJ6G5OBZd8wqB1gYpsUNIYbCUvMuKcrzpVghiHNOiaXA5KL9fuVV/I9w==",
+ "version": "1.20250722.0",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250722.0.tgz",
+ "integrity": "sha512-uLHafix+pRwfRkn2bznuSB8LrFZS5XAmyAazsr9sftji8kxJegAhdmeT8CvR/TZICh8xCYpyUea86n5ZWaN+7A==",
"cpu": [
"x64"
],
@@ -185,9 +195,9 @@
}
},
"node_modules/@cloudflare/vite-plugin/node_modules/miniflare": {
- "version": "4.20250409.0",
- "resolved": "https://registry.npmmirror.com/miniflare/-/miniflare-4.20250409.0.tgz",
- "integrity": "sha512-Hu02dYZvFR+MyrI57O6rSrOUTofcO9EIvcodgq2SAHzAeWSJw2E0oq9lylOrcckFwPMcwxUAb/cQN1LIoCyySw==",
+ "version": "4.20250604.1",
+ "resolved": "https://registry.npmmirror.com/miniflare/-/miniflare-4.20250604.1.tgz",
+ "integrity": "sha512-HJQ9YhH0F0fI73Vsdy3PNVau+PfHZYK7trI5WJEcbfl5HzqhMU0DRNtA/G5EXQgiumkjrmbW4Zh1DVTtsqICPg==",
"license": "MIT",
"dependencies": {
"@cspotcode/source-map-support": "0.8.1",
@@ -195,9 +205,10 @@
"acorn-walk": "8.3.2",
"exit-hook": "2.2.1",
"glob-to-regexp": "0.4.1",
+ "sharp": "^0.33.5",
"stoppable": "1.1.0",
"undici": "^5.28.5",
- "workerd": "1.20250409.0",
+ "workerd": "1.20250604.0",
"ws": "8.18.0",
"youch": "3.3.4",
"zod": "3.22.3"
@@ -210,9 +221,9 @@
}
},
"node_modules/@cloudflare/vite-plugin/node_modules/miniflare/node_modules/@cloudflare/workerd-darwin-64": {
- "version": "1.20250409.0",
- "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250409.0.tgz",
- "integrity": "sha512-smA9yq77xsdQ1NMLhFz3JZxMHGd01lg0bE+X3dTFmIUs+hHskJ+HJ/IkMFInkCCeEFlUkoL4yO7ilaU/fin/xA==",
+ "version": "1.20250604.0",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250604.0.tgz",
+ "integrity": "sha512-PI6AWAzhHg75KVhYkSWFBf3HKCHstpaKg4nrx6LYZaEvz0TaTz+JQpYU2fNAgGFmVsK5xEzwFTGh3DAVAKONPw==",
"cpu": [
"x64"
],
@@ -226,9 +237,9 @@
}
},
"node_modules/@cloudflare/vite-plugin/node_modules/miniflare/node_modules/@cloudflare/workerd-darwin-arm64": {
- "version": "1.20250409.0",
- "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250409.0.tgz",
- "integrity": "sha512-oLVcf+Y5Qun8JHcy1VcR/YnbA5U2ne0czh3XNhDqdHZFK8+vKeC7MnVPX+kEqQA3+uLcMM1/FsIDU1U4Na0h1g==",
+ "version": "1.20250604.0",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250604.0.tgz",
+ "integrity": "sha512-hOiZZSop7QRQgGERtTIy9eU5GvPpIsgE2/BDsUdHMl7OBZ7QLniqvgDzLNDzj0aTkCldm9Yl/Z+C7aUgRdOccw==",
"cpu": [
"arm64"
],
@@ -242,9 +253,9 @@
}
},
"node_modules/@cloudflare/vite-plugin/node_modules/miniflare/node_modules/@cloudflare/workerd-linux-64": {
- "version": "1.20250409.0",
- "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250409.0.tgz",
- "integrity": "sha512-D31B4kdC3a0RD5yfpdIa89//kGHbYsYihZmejm1k4S4NHOho3MUDHAEh4aHtafQNXbZdydGHlSyiVYjTdQ9ILQ==",
+ "version": "1.20250604.0",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250604.0.tgz",
+ "integrity": "sha512-S0R9r7U4nv9qejYygQj01hArC4KUbQQ4u29rvegR0MGoXZY8AHIEuJxon0kE7r7aWFJxvl4W3tOH+5hwW51LYw==",
"cpu": [
"x64"
],
@@ -258,9 +269,9 @@
}
},
"node_modules/@cloudflare/vite-plugin/node_modules/miniflare/node_modules/@cloudflare/workerd-linux-arm64": {
- "version": "1.20250409.0",
- "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250409.0.tgz",
- "integrity": "sha512-Sr59P0TREayil5OQ7kcbjuIn6L6OTSRLI91LKu0D8vi1hss2q9FUwBcwxg0+Yd/x+ty/x7IISiAK5QBkAMeITQ==",
+ "version": "1.20250604.0",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250604.0.tgz",
+ "integrity": "sha512-BTFU/rXpNy03wpeueI2P7q1vVjbg2V6mCyyFGqDqMn2gSVYXH1G0zFNolV13PQXa0HgaqM6oYnqtAxluqbA+kQ==",
"cpu": [
"arm64"
],
@@ -274,9 +285,9 @@
}
},
"node_modules/@cloudflare/vite-plugin/node_modules/miniflare/node_modules/@cloudflare/workerd-windows-64": {
- "version": "1.20250409.0",
- "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250409.0.tgz",
- "integrity": "sha512-dK9I8zBX5rR7MtaaP2AhICQTEw3PVzHcsltN8o46w7JsbYlMvFOj27FfYH5dhs3IahgmIfw2e572QXW2o/dbpg==",
+ "version": "1.20250604.0",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250604.0.tgz",
+ "integrity": "sha512-tW/U9/qDmDZBeoEVcK5skb2uouVAMXMzt7o/uGvaIFLeZsQkOp4NBmvoQQd+nbOc7nVCJIwFoSMokd89AhzCkA==",
"cpu": [
"x64"
],
@@ -290,9 +301,9 @@
}
},
"node_modules/@cloudflare/vite-plugin/node_modules/miniflare/node_modules/workerd": {
- "version": "1.20250409.0",
- "resolved": "https://registry.npmmirror.com/workerd/-/workerd-1.20250409.0.tgz",
- "integrity": "sha512-hqjX9swiHvrkOI3jlH9lrZsZRRv9lddUwcMe8Ua76jnyQz+brybWznNjHu8U5oswwcrFwvky1A4CcLjcLY31gQ==",
+ "version": "1.20250604.0",
+ "resolved": "https://registry.npmmirror.com/workerd/-/workerd-1.20250604.0.tgz",
+ "integrity": "sha512-sHz9R1sxPpnyq3ptrI/5I96sYTMA2+Ljm75oJDbmEcZQwNyezpu9Emerzt3kzzjCJQqtdscGOidWv4RKGZXzAA==",
"hasInstallScript": true,
"license": "Apache-2.0",
"bin": {
@@ -302,30 +313,30 @@
"node": ">=16"
},
"optionalDependencies": {
- "@cloudflare/workerd-darwin-64": "1.20250409.0",
- "@cloudflare/workerd-darwin-arm64": "1.20250409.0",
- "@cloudflare/workerd-linux-64": "1.20250409.0",
- "@cloudflare/workerd-linux-arm64": "1.20250409.0",
- "@cloudflare/workerd-windows-64": "1.20250409.0"
+ "@cloudflare/workerd-darwin-64": "1.20250604.0",
+ "@cloudflare/workerd-darwin-arm64": "1.20250604.0",
+ "@cloudflare/workerd-linux-64": "1.20250604.0",
+ "@cloudflare/workerd-linux-arm64": "1.20250604.0",
+ "@cloudflare/workerd-windows-64": "1.20250604.0"
}
},
"node_modules/@cloudflare/vite-plugin/node_modules/unenv": {
- "version": "2.0.0-rc.15",
- "resolved": "https://registry.npmmirror.com/unenv/-/unenv-2.0.0-rc.15.tgz",
- "integrity": "sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==",
+ "version": "2.0.0-rc.17",
+ "resolved": "https://registry.npmmirror.com/unenv/-/unenv-2.0.0-rc.17.tgz",
+ "integrity": "sha512-B06u0wXkEd+o5gOCMl/ZHl5cfpYbDZKAT+HWTL+Hws6jWu7dCiqBBXXXzMFcFVJb8D4ytAnYmxJA83uwOQRSsg==",
"license": "MIT",
"dependencies": {
"defu": "^6.1.4",
"exsolve": "^1.0.4",
"ohash": "^2.0.11",
"pathe": "^2.0.3",
- "ufo": "^1.5.4"
+ "ufo": "^1.6.1"
}
},
"node_modules/@cloudflare/vite-plugin/node_modules/workerd": {
- "version": "1.20250413.0",
- "resolved": "https://registry.npmmirror.com/workerd/-/workerd-1.20250413.0.tgz",
- "integrity": "sha512-HZ594+Y9BfTz1i2BngnrJ4VNOKh2vOyEEBwhxEfgsCJq5OnmRttpze2JV6+tCs/kcx8VszqCB5lBU7o2KF9bKw==",
+ "version": "1.20250722.0",
+ "resolved": "https://registry.npmmirror.com/workerd/-/workerd-1.20250722.0.tgz",
+ "integrity": "sha512-qw5mh14GhmLqQ5mIJBwfv2ZI3TLXNTxfw3Mr0Q6z5KcopOLMiq9IijS/NPwTjl0RaRBMPoEAtRvlLsg3RyUgqQ==",
"hasInstallScript": true,
"license": "Apache-2.0",
"optional": true,
@@ -337,11 +348,11 @@
"node": ">=16"
},
"optionalDependencies": {
- "@cloudflare/workerd-darwin-64": "1.20250413.0",
- "@cloudflare/workerd-darwin-arm64": "1.20250413.0",
- "@cloudflare/workerd-linux-64": "1.20250413.0",
- "@cloudflare/workerd-linux-arm64": "1.20250413.0",
- "@cloudflare/workerd-windows-64": "1.20250413.0"
+ "@cloudflare/workerd-darwin-64": "1.20250722.0",
+ "@cloudflare/workerd-darwin-arm64": "1.20250722.0",
+ "@cloudflare/workerd-linux-64": "1.20250722.0",
+ "@cloudflare/workerd-linux-arm64": "1.20250722.0",
+ "@cloudflare/workerd-windows-64": "1.20250722.0"
}
},
"node_modules/@cloudflare/vite-plugin/node_modules/youch": {
@@ -986,56 +997,6 @@
"node": ">=14"
}
},
- "node_modules/@hattip/adapter-node": {
- "version": "0.0.49",
- "resolved": "https://registry.npmmirror.com/@hattip/adapter-node/-/adapter-node-0.0.49.tgz",
- "integrity": "sha512-BE+Y8Q4U0YcH34FZUYU4DssGKOaZLbNL0zK57Z41UZp0m9kS79ZIolBmjjpPhTVpIlRY3Rs+uhXbVXKk7mUcJA==",
- "license": "MIT",
- "dependencies": {
- "@hattip/core": "0.0.49",
- "@hattip/polyfills": "0.0.49",
- "@hattip/walk": "0.0.49"
- }
- },
- "node_modules/@hattip/core": {
- "version": "0.0.49",
- "resolved": "https://registry.npmmirror.com/@hattip/core/-/core-0.0.49.tgz",
- "integrity": "sha512-3/ZJtC17cv8m6Sph8+nw4exUp9yhEf2Shi7HK6AHSUSBtaaQXZ9rJBVxTfZj3PGNOR/P49UBXOym/52WYKFTJQ=="
- },
- "node_modules/@hattip/headers": {
- "version": "0.0.49",
- "resolved": "https://registry.npmmirror.com/@hattip/headers/-/headers-0.0.49.tgz",
- "integrity": "sha512-rrB2lEhTf0+MNVt5WdW184Ky706F1Ze9Aazn/R8c+/FMUYF9yjem2CgXp49csPt3dALsecrnAUOHFiV0LrrHXA==",
- "license": "MIT",
- "dependencies": {
- "@hattip/core": "0.0.49"
- }
- },
- "node_modules/@hattip/polyfills": {
- "version": "0.0.49",
- "resolved": "https://registry.npmmirror.com/@hattip/polyfills/-/polyfills-0.0.49.tgz",
- "integrity": "sha512-5g7W5s6Gq+HDxwULGFQ861yAnEx3yd9V8GDwS96HBZ1nM1u93vN+KTuwXvNsV7Z3FJmCrD/pgU8WakvchclYuA==",
- "license": "MIT",
- "dependencies": {
- "@hattip/core": "0.0.49",
- "@whatwg-node/fetch": "^0.9.22",
- "node-fetch-native": "^1.6.4"
- }
- },
- "node_modules/@hattip/walk": {
- "version": "0.0.49",
- "resolved": "https://registry.npmmirror.com/@hattip/walk/-/walk-0.0.49.tgz",
- "integrity": "sha512-AgJgKLooZyQnzMfoFg5Mo/aHM+HGBC9ExpXIjNqGimYTRgNbL/K7X5EM1kR2JY90BNKk9lo6Usq1T/nWFdT7TQ==",
- "license": "MIT",
- "dependencies": {
- "@hattip/headers": "0.0.49",
- "cac": "^6.7.14",
- "mime-types": "^2.1.35"
- },
- "bin": {
- "hattip-walk": "cli.js"
- }
- },
"node_modules/@img/sharp-darwin-arm64": {
"version": "0.33.5",
"resolved": "https://registry.npmmirror.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz",
@@ -1422,10 +1383,10 @@
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
- "node_modules/@kamilkisiela/fast-url-parser": {
- "version": "1.1.4",
- "resolved": "https://registry.npmmirror.com/@kamilkisiela/fast-url-parser/-/fast-url-parser-1.1.4.tgz",
- "integrity": "sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==",
+ "node_modules/@mjackson/node-fetch-server": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/@mjackson/node-fetch-server/-/node-fetch-server-0.6.1.tgz",
+ "integrity": "sha512-9ZJnk/DJjt805uv5PPv11haJIW+HHf3YEEyVXv+8iLQxLD/iXA68FH220XoiTPBC4gCg5q+IMadDw8qPqlA5wg==",
"license": "MIT"
},
"node_modules/@react-email/render": {
@@ -1932,34 +1893,6 @@
"url": "https://opencollective.com/vitest"
}
},
- "node_modules/@whatwg-node/fetch": {
- "version": "0.9.23",
- "resolved": "https://registry.npmmirror.com/@whatwg-node/fetch/-/fetch-0.9.23.tgz",
- "integrity": "sha512-7xlqWel9JsmxahJnYVUj/LLxWcnA93DR4c9xlw3U814jWTiYalryiH1qToik1hOxweKKRLi4haXHM5ycRksPBA==",
- "license": "MIT",
- "dependencies": {
- "@whatwg-node/node-fetch": "^0.6.0",
- "urlpattern-polyfill": "^10.0.0"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "node_modules/@whatwg-node/node-fetch": {
- "version": "0.6.0",
- "resolved": "https://registry.npmmirror.com/@whatwg-node/node-fetch/-/node-fetch-0.6.0.tgz",
- "integrity": "sha512-tcZAhrpx6oVlkEsRngeTEEE7I5/QdLjeEz4IlekabGaESP7+Dkm/6a9KcF1KdCBB7mO9PXtBkwCuTCt8+UPg8Q==",
- "license": "MIT",
- "dependencies": {
- "@kamilkisiela/fast-url-parser": "^1.1.4",
- "busboy": "^1.6.0",
- "fast-querystring": "^1.1.1",
- "tslib": "^2.6.3"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
"node_modules/acorn": {
"version": "8.14.0",
"resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.0.tgz",
@@ -2028,21 +1961,11 @@
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
"license": "ISC"
},
- "node_modules/busboy": {
- "version": "1.6.0",
- "resolved": "https://registry.npmmirror.com/busboy/-/busboy-1.6.0.tgz",
- "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
- "dependencies": {
- "streamsearch": "^1.1.0"
- },
- "engines": {
- "node": ">=10.16.0"
- }
- },
"node_modules/cac": {
"version": "6.7.14",
"resolved": "https://registry.npmmirror.com/cac/-/cac-6.7.14.tgz",
"integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -2100,7 +2023,6 @@
"resolved": "https://registry.npmmirror.com/color/-/color-4.2.3.tgz",
"integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
"license": "MIT",
- "optional": true,
"dependencies": {
"color-convert": "^2.0.1",
"color-string": "^1.9.0"
@@ -2114,7 +2036,6 @@
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"license": "MIT",
- "optional": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -2126,15 +2047,13 @@
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "license": "MIT",
- "optional": true
+ "license": "MIT"
},
"node_modules/color-string": {
"version": "1.9.1",
"resolved": "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz",
"integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
"license": "MIT",
- "optional": true,
"dependencies": {
"color-name": "^1.0.0",
"simple-swizzle": "^0.2.2"
@@ -2285,7 +2204,6 @@
"resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.3.tgz",
"integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
"license": "Apache-2.0",
- "optional": true,
"engines": {
"node": ">=8"
}
@@ -2640,27 +2558,12 @@
"integrity": "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==",
"license": "MIT"
},
- "node_modules/fast-decode-uri-component": {
- "version": "1.0.1",
- "resolved": "https://registry.npmmirror.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz",
- "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==",
- "license": "MIT"
- },
"node_modules/fast-deep-equal": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
"integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==",
"license": "MIT"
},
- "node_modules/fast-querystring": {
- "version": "1.1.2",
- "resolved": "https://registry.npmmirror.com/fast-querystring/-/fast-querystring-1.1.2.tgz",
- "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==",
- "license": "MIT",
- "dependencies": {
- "fast-decode-uri-component": "^1.0.1"
- }
- },
"node_modules/fdir": {
"version": "6.4.3",
"resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.3.tgz",
@@ -2879,12 +2782,42 @@
"entities": "^4.4.0"
}
},
+ "node_modules/i18next": {
+ "version": "25.3.2",
+ "resolved": "https://registry.npmmirror.com/i18next/-/i18next-25.3.2.tgz",
+ "integrity": "sha512-JSnbZDxRVbphc5jiptxr3o2zocy5dEqpVm9qCGdJwRNO+9saUJS0/u4LnM/13C23fUEWxAylPqKU/NpMV/IjqA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://locize.com"
+ },
+ {
+ "type": "individual",
+ "url": "https://locize.com/i18next.html"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.27.6"
+ },
+ "peerDependencies": {
+ "typescript": "^5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
"node_modules/is-arrayish": {
"version": "0.3.2",
"resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz",
"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
- "license": "MIT",
- "optional": true
+ "license": "MIT"
},
"node_modules/is-standalone-pwa": {
"version": "0.1.1",
@@ -3107,12 +3040,6 @@
}
}
},
- "node_modules/node-fetch-native": {
- "version": "1.6.6",
- "resolved": "https://registry.npmmirror.com/node-fetch-native/-/node-fetch-native-1.6.6.tgz",
- "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==",
- "license": "MIT"
- },
"node_modules/nth-check": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz",
@@ -3411,7 +3338,6 @@
"version": "7.7.1",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.1.tgz",
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
- "devOptional": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -3426,7 +3352,6 @@
"integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==",
"hasInstallScript": true,
"license": "Apache-2.0",
- "optional": true,
"dependencies": {
"color": "^4.2.3",
"detect-libc": "^2.0.3",
@@ -3472,7 +3397,6 @@
"resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
"integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
"license": "MIT",
- "optional": true,
"dependencies": {
"is-arrayish": "^0.3.1"
}
@@ -3537,14 +3461,6 @@
"npm": ">=6"
}
},
- "node_modules/streamsearch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmmirror.com/streamsearch/-/streamsearch-1.1.0.tgz",
- "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
- "engines": {
- "node": ">=10.0.0"
- }
- },
"node_modules/tinybench": {
"version": "2.9.0",
"resolved": "https://registry.npmmirror.com/tinybench/-/tinybench-2.9.0.tgz",
@@ -3615,7 +3531,8 @@
"version": "2.8.1",
"resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "license": "0BSD"
+ "license": "0BSD",
+ "optional": true
},
"node_modules/ua-is-frozen": {
"version": "0.1.2",
@@ -3671,9 +3588,9 @@
}
},
"node_modules/ufo": {
- "version": "1.5.4",
- "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.5.4.tgz",
- "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==",
+ "version": "1.6.1",
+ "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.1.tgz",
+ "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==",
"license": "MIT"
},
"node_modules/uhyphen": {
@@ -3714,12 +3631,6 @@
"ufo": "^1.5.4"
}
},
- "node_modules/urlpattern-polyfill": {
- "version": "10.0.0",
- "resolved": "https://registry.npmmirror.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz",
- "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==",
- "license": "MIT"
- },
"node_modules/uuid": {
"version": "11.1.0",
"resolved": "https://registry.npmmirror.com/uuid/-/uuid-11.1.0.tgz",
@@ -4344,19 +4255,19 @@
}
},
"node_modules/wrangler": {
- "version": "4.10.0",
- "resolved": "https://registry.npmmirror.com/wrangler/-/wrangler-4.10.0.tgz",
- "integrity": "sha512-fTE4hZ79msEUt8+HEjl/8Q72haCyzPLu4PgrU3L81ysmjrMEdiYfUPqnvCkBUVtJvrDNdctTEimkufT1Y0ipNg==",
+ "version": "4.20.0",
+ "resolved": "https://registry.npmmirror.com/wrangler/-/wrangler-4.20.0.tgz",
+ "integrity": "sha512-gxMLaSnYp3VLdGPZu4fc/9UlB7PnSVwni25v32NM9szG2yTt+gx5RunWzmoLplplIfEMkBuV3wA47vccNu7zcA==",
"license": "MIT OR Apache-2.0",
"dependencies": {
"@cloudflare/kv-asset-handler": "0.4.0",
- "@cloudflare/unenv-preset": "2.3.1",
+ "@cloudflare/unenv-preset": "2.3.2",
"blake3-wasm": "2.1.5",
- "esbuild": "0.24.2",
- "miniflare": "4.20250409.0",
+ "esbuild": "0.25.4",
+ "miniflare": "4.20250604.1",
"path-to-regexp": "6.3.0",
- "unenv": "2.0.0-rc.15",
- "workerd": "1.20250409.0"
+ "unenv": "2.0.0-rc.17",
+ "workerd": "1.20250604.0"
},
"bin": {
"wrangler": "bin/wrangler.js",
@@ -4366,11 +4277,10 @@
"node": ">=18.0.0"
},
"optionalDependencies": {
- "fsevents": "~2.3.2",
- "sharp": "^0.33.5"
+ "fsevents": "~2.3.2"
},
"peerDependencies": {
- "@cloudflare/workers-types": "^4.20250409.0"
+ "@cloudflare/workers-types": "^4.20250604.0"
},
"peerDependenciesMeta": {
"@cloudflare/workers-types": {
@@ -4391,13 +4301,13 @@
}
},
"node_modules/wrangler/node_modules/@cloudflare/unenv-preset": {
- "version": "2.3.1",
- "resolved": "https://registry.npmmirror.com/@cloudflare/unenv-preset/-/unenv-preset-2.3.1.tgz",
- "integrity": "sha512-Xq57Qd+ADpt6hibcVBO0uLG9zzRgyRhfCUgBT9s+g3+3Ivg5zDyVgLFy40ES1VdNcu8rPNSivm9A+kGP5IVaPg==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/unenv-preset/-/unenv-preset-2.3.2.tgz",
+ "integrity": "sha512-MtUgNl+QkQyhQvv5bbWP+BpBC1N0me4CHHuP2H4ktmOMKdB/6kkz/lo+zqiA4mEazb4y+1cwyNjVrQ2DWeE4mg==",
"license": "MIT OR Apache-2.0",
"peerDependencies": {
- "unenv": "2.0.0-rc.15",
- "workerd": "^1.20250320.0"
+ "unenv": "2.0.0-rc.17",
+ "workerd": "^1.20250508.0"
},
"peerDependenciesMeta": {
"workerd": {
@@ -4406,9 +4316,9 @@
}
},
"node_modules/wrangler/node_modules/@cloudflare/workerd-darwin-64": {
- "version": "1.20250409.0",
- "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250409.0.tgz",
- "integrity": "sha512-smA9yq77xsdQ1NMLhFz3JZxMHGd01lg0bE+X3dTFmIUs+hHskJ+HJ/IkMFInkCCeEFlUkoL4yO7ilaU/fin/xA==",
+ "version": "1.20250604.0",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250604.0.tgz",
+ "integrity": "sha512-PI6AWAzhHg75KVhYkSWFBf3HKCHstpaKg4nrx6LYZaEvz0TaTz+JQpYU2fNAgGFmVsK5xEzwFTGh3DAVAKONPw==",
"cpu": [
"x64"
],
@@ -4422,9 +4332,9 @@
}
},
"node_modules/wrangler/node_modules/@cloudflare/workerd-darwin-arm64": {
- "version": "1.20250409.0",
- "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250409.0.tgz",
- "integrity": "sha512-oLVcf+Y5Qun8JHcy1VcR/YnbA5U2ne0czh3XNhDqdHZFK8+vKeC7MnVPX+kEqQA3+uLcMM1/FsIDU1U4Na0h1g==",
+ "version": "1.20250604.0",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250604.0.tgz",
+ "integrity": "sha512-hOiZZSop7QRQgGERtTIy9eU5GvPpIsgE2/BDsUdHMl7OBZ7QLniqvgDzLNDzj0aTkCldm9Yl/Z+C7aUgRdOccw==",
"cpu": [
"arm64"
],
@@ -4438,9 +4348,9 @@
}
},
"node_modules/wrangler/node_modules/@cloudflare/workerd-linux-64": {
- "version": "1.20250409.0",
- "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250409.0.tgz",
- "integrity": "sha512-D31B4kdC3a0RD5yfpdIa89//kGHbYsYihZmejm1k4S4NHOho3MUDHAEh4aHtafQNXbZdydGHlSyiVYjTdQ9ILQ==",
+ "version": "1.20250604.0",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250604.0.tgz",
+ "integrity": "sha512-S0R9r7U4nv9qejYygQj01hArC4KUbQQ4u29rvegR0MGoXZY8AHIEuJxon0kE7r7aWFJxvl4W3tOH+5hwW51LYw==",
"cpu": [
"x64"
],
@@ -4454,9 +4364,9 @@
}
},
"node_modules/wrangler/node_modules/@cloudflare/workerd-linux-arm64": {
- "version": "1.20250409.0",
- "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250409.0.tgz",
- "integrity": "sha512-Sr59P0TREayil5OQ7kcbjuIn6L6OTSRLI91LKu0D8vi1hss2q9FUwBcwxg0+Yd/x+ty/x7IISiAK5QBkAMeITQ==",
+ "version": "1.20250604.0",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250604.0.tgz",
+ "integrity": "sha512-BTFU/rXpNy03wpeueI2P7q1vVjbg2V6mCyyFGqDqMn2gSVYXH1G0zFNolV13PQXa0HgaqM6oYnqtAxluqbA+kQ==",
"cpu": [
"arm64"
],
@@ -4470,9 +4380,9 @@
}
},
"node_modules/wrangler/node_modules/@cloudflare/workerd-windows-64": {
- "version": "1.20250409.0",
- "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250409.0.tgz",
- "integrity": "sha512-dK9I8zBX5rR7MtaaP2AhICQTEw3PVzHcsltN8o46w7JsbYlMvFOj27FfYH5dhs3IahgmIfw2e572QXW2o/dbpg==",
+ "version": "1.20250604.0",
+ "resolved": "https://registry.npmmirror.com/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250604.0.tgz",
+ "integrity": "sha512-tW/U9/qDmDZBeoEVcK5skb2uouVAMXMzt7o/uGvaIFLeZsQkOp4NBmvoQQd+nbOc7nVCJIwFoSMokd89AhzCkA==",
"cpu": [
"x64"
],
@@ -4486,9 +4396,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/aix-ppc64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz",
- "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz",
+ "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==",
"cpu": [
"ppc64"
],
@@ -4502,9 +4412,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/android-arm": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.24.2.tgz",
- "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.4.tgz",
+ "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==",
"cpu": [
"arm"
],
@@ -4518,9 +4428,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/android-arm64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz",
- "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz",
+ "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==",
"cpu": [
"arm64"
],
@@ -4534,9 +4444,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/android-x64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.24.2.tgz",
- "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.4.tgz",
+ "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==",
"cpu": [
"x64"
],
@@ -4550,9 +4460,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/darwin-arm64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz",
- "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz",
+ "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==",
"cpu": [
"arm64"
],
@@ -4566,9 +4476,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/darwin-x64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz",
- "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz",
+ "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==",
"cpu": [
"x64"
],
@@ -4582,9 +4492,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/freebsd-arm64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz",
- "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz",
+ "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==",
"cpu": [
"arm64"
],
@@ -4598,9 +4508,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/freebsd-x64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz",
- "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz",
+ "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==",
"cpu": [
"x64"
],
@@ -4614,9 +4524,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/linux-arm": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz",
- "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz",
+ "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==",
"cpu": [
"arm"
],
@@ -4630,9 +4540,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/linux-arm64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz",
- "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz",
+ "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==",
"cpu": [
"arm64"
],
@@ -4646,9 +4556,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/linux-ia32": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz",
- "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz",
+ "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==",
"cpu": [
"ia32"
],
@@ -4662,9 +4572,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/linux-loong64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz",
- "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz",
+ "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==",
"cpu": [
"loong64"
],
@@ -4678,9 +4588,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/linux-mips64el": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz",
- "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz",
+ "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==",
"cpu": [
"mips64el"
],
@@ -4694,9 +4604,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/linux-ppc64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz",
- "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz",
+ "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==",
"cpu": [
"ppc64"
],
@@ -4710,9 +4620,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/linux-riscv64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz",
- "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz",
+ "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==",
"cpu": [
"riscv64"
],
@@ -4726,9 +4636,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/linux-s390x": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz",
- "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz",
+ "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==",
"cpu": [
"s390x"
],
@@ -4742,9 +4652,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/linux-x64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz",
- "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz",
+ "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==",
"cpu": [
"x64"
],
@@ -4758,9 +4668,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/netbsd-arm64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz",
- "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz",
+ "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==",
"cpu": [
"arm64"
],
@@ -4774,9 +4684,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/netbsd-x64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz",
- "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz",
+ "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==",
"cpu": [
"x64"
],
@@ -4790,9 +4700,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/openbsd-arm64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz",
- "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz",
+ "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==",
"cpu": [
"arm64"
],
@@ -4806,9 +4716,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/openbsd-x64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz",
- "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz",
+ "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==",
"cpu": [
"x64"
],
@@ -4822,9 +4732,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/sunos-x64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz",
- "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz",
+ "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==",
"cpu": [
"x64"
],
@@ -4838,9 +4748,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/win32-arm64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz",
- "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz",
+ "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==",
"cpu": [
"arm64"
],
@@ -4854,9 +4764,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/win32-ia32": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz",
- "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz",
+ "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==",
"cpu": [
"ia32"
],
@@ -4870,9 +4780,9 @@
}
},
"node_modules/wrangler/node_modules/@esbuild/win32-x64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz",
- "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz",
+ "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==",
"cpu": [
"x64"
],
@@ -4895,9 +4805,9 @@
}
},
"node_modules/wrangler/node_modules/esbuild": {
- "version": "0.24.2",
- "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.24.2.tgz",
- "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==",
+ "version": "0.25.4",
+ "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.4.tgz",
+ "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==",
"hasInstallScript": true,
"license": "MIT",
"bin": {
@@ -4907,37 +4817,37 @@
"node": ">=18"
},
"optionalDependencies": {
- "@esbuild/aix-ppc64": "0.24.2",
- "@esbuild/android-arm": "0.24.2",
- "@esbuild/android-arm64": "0.24.2",
- "@esbuild/android-x64": "0.24.2",
- "@esbuild/darwin-arm64": "0.24.2",
- "@esbuild/darwin-x64": "0.24.2",
- "@esbuild/freebsd-arm64": "0.24.2",
- "@esbuild/freebsd-x64": "0.24.2",
- "@esbuild/linux-arm": "0.24.2",
- "@esbuild/linux-arm64": "0.24.2",
- "@esbuild/linux-ia32": "0.24.2",
- "@esbuild/linux-loong64": "0.24.2",
- "@esbuild/linux-mips64el": "0.24.2",
- "@esbuild/linux-ppc64": "0.24.2",
- "@esbuild/linux-riscv64": "0.24.2",
- "@esbuild/linux-s390x": "0.24.2",
- "@esbuild/linux-x64": "0.24.2",
- "@esbuild/netbsd-arm64": "0.24.2",
- "@esbuild/netbsd-x64": "0.24.2",
- "@esbuild/openbsd-arm64": "0.24.2",
- "@esbuild/openbsd-x64": "0.24.2",
- "@esbuild/sunos-x64": "0.24.2",
- "@esbuild/win32-arm64": "0.24.2",
- "@esbuild/win32-ia32": "0.24.2",
- "@esbuild/win32-x64": "0.24.2"
+ "@esbuild/aix-ppc64": "0.25.4",
+ "@esbuild/android-arm": "0.25.4",
+ "@esbuild/android-arm64": "0.25.4",
+ "@esbuild/android-x64": "0.25.4",
+ "@esbuild/darwin-arm64": "0.25.4",
+ "@esbuild/darwin-x64": "0.25.4",
+ "@esbuild/freebsd-arm64": "0.25.4",
+ "@esbuild/freebsd-x64": "0.25.4",
+ "@esbuild/linux-arm": "0.25.4",
+ "@esbuild/linux-arm64": "0.25.4",
+ "@esbuild/linux-ia32": "0.25.4",
+ "@esbuild/linux-loong64": "0.25.4",
+ "@esbuild/linux-mips64el": "0.25.4",
+ "@esbuild/linux-ppc64": "0.25.4",
+ "@esbuild/linux-riscv64": "0.25.4",
+ "@esbuild/linux-s390x": "0.25.4",
+ "@esbuild/linux-x64": "0.25.4",
+ "@esbuild/netbsd-arm64": "0.25.4",
+ "@esbuild/netbsd-x64": "0.25.4",
+ "@esbuild/openbsd-arm64": "0.25.4",
+ "@esbuild/openbsd-x64": "0.25.4",
+ "@esbuild/sunos-x64": "0.25.4",
+ "@esbuild/win32-arm64": "0.25.4",
+ "@esbuild/win32-ia32": "0.25.4",
+ "@esbuild/win32-x64": "0.25.4"
}
},
"node_modules/wrangler/node_modules/miniflare": {
- "version": "4.20250409.0",
- "resolved": "https://registry.npmmirror.com/miniflare/-/miniflare-4.20250409.0.tgz",
- "integrity": "sha512-Hu02dYZvFR+MyrI57O6rSrOUTofcO9EIvcodgq2SAHzAeWSJw2E0oq9lylOrcckFwPMcwxUAb/cQN1LIoCyySw==",
+ "version": "4.20250604.1",
+ "resolved": "https://registry.npmmirror.com/miniflare/-/miniflare-4.20250604.1.tgz",
+ "integrity": "sha512-HJQ9YhH0F0fI73Vsdy3PNVau+PfHZYK7trI5WJEcbfl5HzqhMU0DRNtA/G5EXQgiumkjrmbW4Zh1DVTtsqICPg==",
"license": "MIT",
"dependencies": {
"@cspotcode/source-map-support": "0.8.1",
@@ -4945,9 +4855,10 @@
"acorn-walk": "8.3.2",
"exit-hook": "2.2.1",
"glob-to-regexp": "0.4.1",
+ "sharp": "^0.33.5",
"stoppable": "1.1.0",
"undici": "^5.28.5",
- "workerd": "1.20250409.0",
+ "workerd": "1.20250604.0",
"ws": "8.18.0",
"youch": "3.3.4",
"zod": "3.22.3"
@@ -4960,22 +4871,22 @@
}
},
"node_modules/wrangler/node_modules/unenv": {
- "version": "2.0.0-rc.15",
- "resolved": "https://registry.npmmirror.com/unenv/-/unenv-2.0.0-rc.15.tgz",
- "integrity": "sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==",
+ "version": "2.0.0-rc.17",
+ "resolved": "https://registry.npmmirror.com/unenv/-/unenv-2.0.0-rc.17.tgz",
+ "integrity": "sha512-B06u0wXkEd+o5gOCMl/ZHl5cfpYbDZKAT+HWTL+Hws6jWu7dCiqBBXXXzMFcFVJb8D4ytAnYmxJA83uwOQRSsg==",
"license": "MIT",
"dependencies": {
"defu": "^6.1.4",
"exsolve": "^1.0.4",
"ohash": "^2.0.11",
"pathe": "^2.0.3",
- "ufo": "^1.5.4"
+ "ufo": "^1.6.1"
}
},
"node_modules/wrangler/node_modules/workerd": {
- "version": "1.20250409.0",
- "resolved": "https://registry.npmmirror.com/workerd/-/workerd-1.20250409.0.tgz",
- "integrity": "sha512-hqjX9swiHvrkOI3jlH9lrZsZRRv9lddUwcMe8Ua76jnyQz+brybWznNjHu8U5oswwcrFwvky1A4CcLjcLY31gQ==",
+ "version": "1.20250604.0",
+ "resolved": "https://registry.npmmirror.com/workerd/-/workerd-1.20250604.0.tgz",
+ "integrity": "sha512-sHz9R1sxPpnyq3ptrI/5I96sYTMA2+Ljm75oJDbmEcZQwNyezpu9Emerzt3kzzjCJQqtdscGOidWv4RKGZXzAA==",
"hasInstallScript": true,
"license": "Apache-2.0",
"bin": {
@@ -4985,11 +4896,11 @@
"node": ">=16"
},
"optionalDependencies": {
- "@cloudflare/workerd-darwin-64": "1.20250409.0",
- "@cloudflare/workerd-darwin-arm64": "1.20250409.0",
- "@cloudflare/workerd-linux-64": "1.20250409.0",
- "@cloudflare/workerd-linux-arm64": "1.20250409.0",
- "@cloudflare/workerd-windows-64": "1.20250409.0"
+ "@cloudflare/workerd-darwin-64": "1.20250604.0",
+ "@cloudflare/workerd-darwin-arm64": "1.20250604.0",
+ "@cloudflare/workerd-linux-64": "1.20250604.0",
+ "@cloudflare/workerd-linux-arm64": "1.20250604.0",
+ "@cloudflare/workerd-windows-64": "1.20250604.0"
}
},
"node_modules/wrangler/node_modules/youch": {
diff --git a/mail-worker/package.json b/mail-worker/package.json
index d39b39b..cc09f8b 100644
--- a/mail-worker/package.json
+++ b/mail-worker/package.json
@@ -14,10 +14,11 @@
"wrangler": "^4.7.0"
},
"dependencies": {
- "@cloudflare/vite-plugin": "^1.0.5",
+ "@cloudflare/vite-plugin": "1.6.0",
"dayjs": "^1.11.13",
"drizzle-orm": "^0.42.0",
"hono": "^4.7.5",
+ "i18next": "^25.3.2",
"linkedom": "^0.18.10",
"postal-mime": "^2.4.3",
"resend": "^4.5.1",
diff --git a/mail-worker/src/api/sys-email-api.js b/mail-worker/src/api/all-email-api.js
similarity index 79%
rename from mail-worker/src/api/sys-email-api.js
rename to mail-worker/src/api/all-email-api.js
index 8e91705..16862cb 100644
--- a/mail-worker/src/api/sys-email-api.js
+++ b/mail-worker/src/api/all-email-api.js
@@ -2,12 +2,12 @@ import app from '../hono/hono';
import emailService from '../service/email-service';
import result from '../model/result';
-app.get('/sysEmail/list',async (c) => {
+app.get('/allEmail/list',async (c) => {
const data = await emailService.allList(c, c.req.query());
return c.json(result.ok(data));
})
-app.delete('/sysEmail/delete',async (c) => {
+app.delete('/allEmail/delete',async (c) => {
const list = await emailService.physicsDelete(c, c.req.query());
return c.json(result.ok(list));
})
diff --git a/mail-worker/src/api/analysis-api.js b/mail-worker/src/api/analysis-api.js
index c8abc7a..5dd734b 100644
--- a/mail-worker/src/api/analysis-api.js
+++ b/mail-worker/src/api/analysis-api.js
@@ -3,6 +3,6 @@ import analysisService from '../service/analysis-service';
import result from '../model/result';
app.get('/analysis/echarts', async (c) => {
- const data = await analysisService.echarts(c);
+ const data = await analysisService.echarts(c, c.req.query());
return c.json(result.ok(data));
})
diff --git a/mail-worker/src/const/constant.js b/mail-worker/src/const/constant.js
index eb97932..2e3f37b 100644
--- a/mail-worker/src/const/constant.js
+++ b/mail-worker/src/const/constant.js
@@ -6,7 +6,7 @@ const constant = {
ATTACHMENT_PREFIX: 'attachments/',
BACKGROUND_PREFIX: 'static/background/',
ADMIN_ROLE: {
- name: '超级管理员',
+ name: 'admin',
sendCount: 0,
sendType: 'count',
accountCount: 0
diff --git a/mail-worker/src/dao/analysis-dao.js b/mail-worker/src/dao/analysis-dao.js
index b46f9d1..6f7f100 100644
--- a/mail-worker/src/dao/analysis-dao.js
+++ b/mail-worker/src/dao/analysis-dao.js
@@ -46,53 +46,53 @@ const analysisDao = {
return results[0];
},
- async userDayCount(c) {
+ async userDayCount(c, diffHours) {
const { results } = await c.env.db.prepare(`
SELECT
- DATE(create_time,'+8 hours') AS date,
+ DATE(create_time,'+${diffHours} hours') AS date,
COUNT(*) AS total
FROM
user
WHERE
- DATE(create_time,'+8 hours') BETWEEN DATE('now', '-15 days', '+8 hours') AND DATE('now','-1 day','+8 hours')
+ DATE(create_time,'+${diffHours} hours') BETWEEN DATE('now', '-15 days', '+${diffHours} hours') AND DATE('now','-1 day','+${diffHours} hours')
GROUP BY
- DATE(create_time,'+8 hours')
+ DATE(create_time,'+${diffHours} hours')
ORDER BY
date ASC
`).all();
return results;
},
- async receiveDayCount(c) {
+ async receiveDayCount(c, diffHours) {
const { results } = await c.env.db.prepare(`
SELECT
- DATE(create_time,'+8 hours') AS date,
+ DATE(create_time,'+${diffHours} hours') AS date,
COUNT(*) AS total
FROM
email
WHERE
- DATE(create_time,'+8 hours') BETWEEN DATE('now', '-15 days', '+8 hours') AND DATE('now','-1 day','+8 hours')
+ DATE(create_time,'+${diffHours} hours') BETWEEN DATE('now', '-15 days', '+${diffHours} hours') AND DATE('now','-1 day','+${diffHours} hours')
AND type = 0
GROUP BY
- DATE(create_time,'+8 hours')
+ DATE(create_time,'+${diffHours} hours')
ORDER BY
date ASC
`).all();
return results;
},
- async sendDayCount(c) {
+ async sendDayCount(c, diffHours) {
const { results } = await c.env.db.prepare(`
SELECT
- DATE(create_time,'+8 hours') AS date,
+ DATE(create_time,'+${diffHours} hours') AS date,
COUNT(*) AS total
FROM
email
WHERE
- DATE(create_time,'+8 hours') BETWEEN DATE('now', '-15 days', '+8 hours') AND DATE('now','-1 day','+8 hours')
+ DATE(create_time,'+${diffHours} hours') BETWEEN DATE('now', '-15 days', '+${diffHours} hours') AND DATE('now','-1 day','+${diffHours} hours')
AND type = 1
GROUP BY
- DATE(create_time,'+8 hours')
+ DATE(create_time,'+${diffHours} hours')
ORDER BY
date ASC
`).all();
diff --git a/mail-worker/src/email/email.js b/mail-worker/src/email/email.js
index ec878a7..8d8c49b 100644
--- a/mail-worker/src/email/email.js
+++ b/mail-worker/src/email/email.js
@@ -66,8 +66,8 @@ export async function email(message, env, ctx) {
if (banEmailType === roleConst.banEmailType.ALL) return
if (banEmailType === roleConst.banEmailType.CONTENT) {
- email.html = '邮件内容已被移除'
- email.text = '邮件内容已被移除'
+ email.html = 'removed'
+ email.text = 'removed'
email.attachments = []
}
@@ -80,8 +80,8 @@ export async function email(message, env, ctx) {
if (banEmailType === roleConst.banEmailType.ALL) return
if (banEmailType === roleConst.banEmailType.CONTENT) {
- email.html = '邮件内容已被移除'
- email.text = '邮件内容已被移除'
+ email.html = 'removed'
+ email.text = 'removed'
email.attachments = []
}
@@ -115,11 +115,6 @@ export async function email(message, env, ctx) {
status: emailConst.status.SAVING
};
- let headers = message.headers
-
- console.log(headers.get('X-Cf-Spamh-Score'))
- console.log(email)
-
const attachments = [];
const cidAttachments = [];
diff --git a/mail-worker/src/hono/webs.js b/mail-worker/src/hono/webs.js
index 1eae786..f0f8dba 100644
--- a/mail-worker/src/hono/webs.js
+++ b/mail-worker/src/hono/webs.js
@@ -13,7 +13,7 @@ import '../api/resend-api';
import '../api/user-api';
import '../api/my-api';
import '../api/role-api'
-import '../api/sys-email-api'
+import '../api/all-email-api'
import '../api/init-api'
import '../api/analysis-api'
import '../api/reg-key-api'
diff --git a/mail-worker/src/i18n/en.js b/mail-worker/src/i18n/en.js
new file mode 100644
index 0000000..f6536f8
--- /dev/null
+++ b/mail-worker/src/i18n/en.js
@@ -0,0 +1,93 @@
+const en = {
+ IncorrectPwd: 'Incorrect password',
+ addAccountDisabled: 'Add email account function is disabled',
+ regDisabled: 'Sign up is disabled',
+ emptyEmail: 'Email cannot be empty',
+ notEmail: 'Invalid email',
+ notExistDomain: 'Email domain does not exist',
+ isDelAccount: 'This Email has been deleted',
+ isRegAccount: 'This Email is already signed up',
+ accountLimit: 'Email account limit reached',
+ delMyAccount: 'Cannot delete your own email account',
+ noUserAccount: 'This email does not belong to the current user',
+ usernameLengthLimit: 'Username length exceeds the limit',
+ noOsDomainSendPic: 'Cannot send body images: R2 domain not configured',
+ noOsSendPic: 'Cannot send body images: R2 object storage not configured',
+ noOsDomainSendAtt: 'Cannot send attachments: R2 domain not configured',
+ noOsSendAtt: 'Cannot send attachments: R2 object storage not configured',
+ disabledSend: 'Email sending is disabled',
+ noSeparateSend: 'Attachments are not supported in separate sending',
+ userNoSendTotal: 'User has no remaining sends',
+ daySendLimit: 'Daily send limit reached',
+ totalSendLimit: 'Total send limit reached',
+ daySendLack: 'Not enough remaining sends today',
+ totalSendLack: 'Not enough total remaining sends',
+ senderAccountNotExist: 'Sender email does not exist',
+ noResendToken: 'Resend API token not configured',
+ sendEmailNotCurUser: 'Sender email does not belong to current user',
+ notExistEmailReply: 'Mail does not exist and cannot be replied to',
+ pwdLengthLimit: 'Password length exceeds the limit',
+ emailLengthLimit: 'Email length exceeds the limit',
+ pwdMinLengthLimit: 'Password must be at least 6 characters',
+ notEmailDomain: 'Invalid email domain',
+ emptyRegKey: 'Invite code cannot be empty',
+ notExistRegKey: 'Invite code does not exist',
+ noRegKeyTotal: 'Invite code usage limit reached',
+ regKeyExpire: 'Invite code has expired',
+ emailAndPwdEmpty: 'Email and password cannot be empty',
+ notExistUser: 'Email does not exist',
+ isDelUser: 'This email has been deleted',
+ isBanUser: 'This email has been banned',
+ regKeyUseCount: 'Usage count cannot be empty',
+ emptyRegKeyExpire: 'Valid until time cannot be empty',
+ isExistRegKye: 'Invite code already exists',
+ roleNotExist: 'Role does not exist',
+ emptyRoleName: 'Role name cannot be empty',
+ roleNameExist: 'Role name already exists',
+ delDefRole: 'Default role cannot be deleted',
+ notJsonDomain: 'Environment variable "domain" must be in JSON format',
+ noOsUpBack: 'Cannot upload background: R2 object storage not configured',
+ noOsDomainUpBack: 'Cannot upload background: R2 domain not configured',
+ starNotExistEmail: 'Starred email does not exist',
+ emptyBotToken: 'Verification token cannot be empty',
+ botVerifyFail: 'Bot verification failed, please try again',
+ authExpired: 'Authentication expired, please log in again',
+ unauthorized: 'Unauthorized',
+ perms: {
+ "邮件": "Email",
+ "邮件发送": "Send email",
+ "邮件删除": "Delete email",
+ "邮箱侧栏": "Account",
+ "邮箱查看": "View account",
+ "邮箱添加": "Add account",
+ "邮箱删除": "Delete account",
+ "个人设置": "Settings",
+ "用户注销": "Delete user",
+ "分析页": "Analytics",
+ "数据查看": "View data",
+ "用户信息": "All users",
+ "用户查看": "View user",
+ "用户添加": "Add user",
+ "密码修改": "Change password",
+ "状态修改": "Change status",
+ "权限修改": "Change role",
+ "用户删除": "Delete user",
+ "邮件列表": "All mail",
+ "邮件查看": "View email",
+ "权限控制": "Role",
+ "身份查看": "View role",
+ "身份修改": "Change role",
+ "身份删除": "Delete role",
+ "注册密钥": "Invite code",
+ "密钥查看": "View code",
+ "密钥添加": "Add code",
+ "密钥删除": "Delete code",
+ "系统设置": "System settings",
+ "设置查看": "View settings",
+ "设置修改": "Change settings",
+ "物理清空": "Physical purge",
+ "发件重置": "Reset send count"
+ }
+};
+
+export default en;
diff --git a/mail-worker/src/i18n/i18n.js b/mail-worker/src/i18n/i18n.js
new file mode 100644
index 0000000..7d66262
--- /dev/null
+++ b/mail-worker/src/i18n/i18n.js
@@ -0,0 +1,30 @@
+import i18next from 'i18next';
+import zh from './zh.js'
+import en from './en.js'
+import app from '../hono/hono';
+
+app.use('*', async (c, next) => {
+ const lang = c.req.header('accept-language').split('-')[0]
+ i18next.init({
+ lng: lang,
+ });
+ return await next()
+})
+
+const resources = {
+ en: {
+ translation: en
+ },
+ zh: {
+ translation: zh,
+ },
+};
+
+i18next.init({
+ fallbackLng: 'en',
+ resources,
+});
+
+export const t = (key) => i18next.t(key)
+
+export default i18next;
diff --git a/mail-worker/src/i18n/zh.js b/mail-worker/src/i18n/zh.js
new file mode 100644
index 0000000..378c053
--- /dev/null
+++ b/mail-worker/src/i18n/zh.js
@@ -0,0 +1,93 @@
+const zh = {
+ IncorrectPwd: '密码输入错误',
+ addAccountDisabled: '添加邮箱功能已关闭',
+ regDisabled: '注册功能已关闭',
+ emptyEmail: '邮箱不能为空',
+ notEmail: '非法邮箱',
+ notExistDomain: '不存在的邮箱域名',
+ isDelAccount: '该邮箱已被注销',
+ isRegAccount: '该邮箱已被注册',
+ accountLimit: '添加邮箱数量到达限制',
+ delMyAccount: '不可以删除自己的邮箱',
+ noUserAccount: '该邮箱不属于当前用户',
+ usernameLengthLimit: '用户名长度超出限制',
+ noOsDomainSendPic: 'r2域名未配置不能发送正文图片',
+ noOsSendPic: 'r2对象存储未配置不能发送正文图片',
+ noOsDomainSendAtt: 'r2域名未配置不能发送附件',
+ noOsSendAtt: 'r2对象存储未配置不能发送附件',
+ disabledSend: '邮件发送功能已停用',
+ noSeparateSend: '分别发送暂时不支持附件',
+ userNoSendTotal: '用户无发送次数',
+ daySendLimit: '发送次数已到达每日限制',
+ totalSendLimit: '发送次数已到达限制',
+ daySendLack: '当日剩余发送次数不足',
+ totalSendLack: '剩余发送次数不足',
+ senderAccountNotExist: '发件人邮箱不存在',
+ noResendToken: 'resend密钥未配置',
+ sendEmailNotCurUser: '发件人邮箱非当前用户所有',
+ notExistEmailReply: '邮件不存在无法回复',
+ pwdLengthLimit: '密码长度超出限制',
+ emailLengthLimit: '邮箱长度超出限制',
+ pwdMinLengthLimit: '密码不能小于6位',
+ notEmailDomain: '非法邮箱域名',
+ emptyRegKey: '注册码不能为空',
+ notExistRegKey: '注册码不存在',
+ noRegKeyTotal: '注册码使用次数已耗尽',
+ regKeyExpire: '注册码已过期',
+ emailAndPwdEmpty: '邮箱和密码不能为空',
+ notExistUser: '该邮箱不存在',
+ isDelUser: '该邮箱已被注销',
+ isBanUser: '该邮箱已被禁用',
+ regKeyUseCount: '使用次数不能为空',
+ emptyRegKeyExpire: '有效时间不能为空',
+ isExistRegKye: '注册码已存在',
+ roleNotExist: '权限身份不存在',
+ emptyRoleName: '身份名不能为空',
+ roleNameExist: '身份名已存在',
+ delDefRole: '默认身份不能删除',
+ notJsonDomain: '环境变量domain必须是JSON类型',
+ noOsUpBack: 'r2对象存储未配置不能上传背景',
+ noOsDomainUpBack: 'r2域名未配置不上传背景',
+ starNotExistEmail: '星标的邮件不存在',
+ emptyBotToken: '验证token不能为空',
+ botVerifyFail: '人机验证失败,请重试',
+ authExpired: '身份认证失效,请重新登录',
+ unauthorized: '权限不足',
+ perms: {
+ "邮件": "邮件",
+ "邮件发送": "邮件发送",
+ "邮件删除": "邮件删除",
+ "邮箱侧栏": "邮箱侧栏",
+ "邮箱查看": "邮箱查看",
+ "邮箱添加": "邮箱添加",
+ "邮箱删除": "邮箱删除",
+ "个人设置": "个人设置",
+ "用户注销": "用户注销",
+ "分析页": "分析页",
+ "数据查看": "数据查看",
+ "用户信息": "用户信息",
+ "用户查看": "用户查看",
+ "用户添加": "用户添加",
+ "密码修改": "密码修改",
+ "状态修改": "状态修改",
+ "权限修改": "权限修改",
+ "用户删除": "用户删除",
+ "邮件列表": "全部邮件",
+ "邮件查看": "邮件查看",
+ "权限控制": "权限控制",
+ "身份查看": "身份查看",
+ "身份修改": "身份修改",
+ "身份删除": "身份删除",
+ "注册密钥": "注册密钥",
+ "密钥查看": "密钥查看",
+ "密钥添加": "密钥添加",
+ "密钥删除": "密钥删除",
+ "系统设置": "系统设置",
+ "设置查看": "设置查看",
+ "设置修改": "设置修改",
+ "物理清空": "物理清空",
+ '发件重置': '发件重置'
+ }
+}
+
+export default zh
diff --git a/mail-worker/src/init/init.js b/mail-worker/src/init/init.js
index 0daaf1b..43872c5 100644
--- a/mail-worker/src/init/init.js
+++ b/mail-worker/src/init/init.js
@@ -16,10 +16,16 @@ const init = {
await this.v1_3DB(c);
await this.v1_3_1DB(c);
await this.v1_4DB(c);
+ await this.v1_5DB(c);
await settingService.refresh(c);
return c.text('初始化成功');
},
+ async v1_5DB(c) {
+ await c.env.db.prepare(`UPDATE perm SET perm_key = 'sys-email:list' WHERE perm_key = 'all-email:list'`).run();
+ await c.env.db.prepare(`UPDATE perm SET perm_key = 'sys-email:delete' WHERE perm_key = 'all-email:delete'`).run();
+ },
+
async v1_4DB(c) {
await c.env.db.prepare(`
CREATE TABLE IF NOT EXISTS reg_key (
diff --git a/mail-worker/src/security/security.js b/mail-worker/src/security/security.js
index c5ee74b..b0ec986 100644
--- a/mail-worker/src/security/security.js
+++ b/mail-worker/src/security/security.js
@@ -5,6 +5,7 @@ import KvConst from '../const/kv-const';
import dayjs from 'dayjs';
import userService from '../service/user-service';
import permService from '../service/perm-service';
+import { t } from '../i18n/i18n'
import app from '../hono/hono';
const exclude = [
@@ -29,8 +30,8 @@ const requirePerms = [
'/role/tree',
'/role/set',
'/role/setDefault',
- '/sysEmail/list',
- '/sysEmail/delete',
+ '/allEmail/list',
+ '/allEmail/delete',
'/setting/physicsDeleteAll',
'/setting/setBackground',
'/setting/set',
@@ -67,8 +68,8 @@ const premKey = {
'user:set-status': ['/user/setStatus'],
'user:set-type': ['/user/setType'],
'user:delete': ['/user/delete'],
- 'sys-email:query': ['/sysEmail/list'],
- 'sys-email:delete': ['/sysEmail/delete'],
+ 'all-email:query': ['/allEmail/list'],
+ 'all-email:delete': ['/allEmail/delete'],
'setting:query': ['/setting/query'],
'setting:set': ['/setting/set', '/setting/setBackground'],
'setting:clean': ['/setting/physicsDeleteAll'],
@@ -100,18 +101,18 @@ app.use('*', async (c, next) => {
const result = await jwtUtils.verifyToken(c, jwt);
if (!result) {
- throw new BizError('身份认证失效,请重新登录', 401);
+ throw new BizError(t('authExpired'), 401);
}
const { userId, token } = result;
const authInfo = await c.env.kv.get(KvConst.AUTH_INFO + userId, { type: 'json' });
if (!authInfo) {
- throw new BizError('身份认证失效,请重新登录', 401);
+ throw new BizError(t('authExpired'), 401);
}
if (!authInfo.tokens.includes(token)) {
- throw new BizError('身份认证失效,请重新登录', 401);
+ throw new BizError(t('authExpired'), 401);
}
const permIndex = requirePerms.findIndex(item => {
@@ -129,7 +130,7 @@ app.use('*', async (c, next) => {
});
if (userPermIndex === -1 && authInfo.user.email !== c.env.admin) {
- throw new BizError('权限不足', 403);
+ throw new BizError(t('unauthorized'), 403);
}
}
diff --git a/mail-worker/src/service/account-service.js b/mail-worker/src/service/account-service.js
index ac63a92..580637e 100644
--- a/mail-worker/src/service/account-service.js
+++ b/mail-worker/src/service/account-service.js
@@ -10,37 +10,39 @@ import { isDel } from '../const/entity-const';
import settingService from './setting-service';
import turnstileService from './turnstile-service';
import roleService from './role-service';
+import { t } from '../i18n/i18n';
const accountService = {
async add(c, params, userId) {
if (!await settingService.isAddEmail(c)) {
- throw new BizError('添加邮箱功能已关闭');
+ throw new BizError(t('addAccountDisabled'));
}
let { email, token } = params;
if (!email) {
- throw new BizError('邮箱不能为空');
+ throw new BizError(t('emptyEmail'));
}
if (!verifyUtils.isEmail(email)) {
- throw new BizError('非法邮箱');
+ throw new BizError(t('notEmail'));
}
if (!c.env.domain.includes(emailUtils.getDomain(email))) {
- throw new BizError('不存在的邮箱域名');
+ throw new BizError(t('notExistDomain'));
}
+
const accountRow = await this.selectByEmailIncludeDelNoCase(c, email);
if (accountRow && accountRow.isDel === isDel.DELETE) {
- throw new BizError('该邮箱已被注销');
+ throw new BizError(t('isDelAccount'));
}
if (accountRow) {
- throw new BizError('该邮箱已被注册');
+ throw new BizError(t('isRegAccount'));
}
const userRow = await userService.selectById(c, userId);
@@ -48,7 +50,7 @@ const accountService = {
if (roleRow.accountCount && userRow.email !== c.env.admin) {
const userAccountCount = await accountService.countUserAccount(c, userId)
- if(userAccountCount >= roleRow.accountCount) throw new BizError(`添加邮箱数量到达限制`, 403);
+ if(userAccountCount >= roleRow.accountCount) throw new BizError(t('accountLimit'), 403);
}
if (await settingService.isAddEmailVerify(c)) {
@@ -109,11 +111,11 @@ const accountService = {
const accountRow = await this.selectById(c, accountId);
if (accountRow.email === user.email) {
- throw new BizError('不可以删除自己的邮箱');
+ throw new BizError(t('delMyAccount'));
}
if (accountRow.userId !== user.userId) {
- throw new BizError('该邮箱不属于当前用户');
+ throw new BizError(t('noUserAccount'));
}
await orm(c).update(account).set({ isDel: isDel.DELETE }).where(
@@ -182,7 +184,7 @@ const accountService = {
async setName(c, params, userId) {
const { name, accountId } = params
if (name.length > 30) {
- throw new BizError('用户名长度超出限制');
+ throw new BizError(t('usernameLengthLimit'));
}
await orm(c).update(account).set({name}).where(and(eq(account.userId, userId),eq(account.accountId, accountId))).run();
}
diff --git a/mail-worker/src/service/analysis-service.js b/mail-worker/src/service/analysis-service.js
index 66b0a7f..0a49c68 100644
--- a/mail-worker/src/service/analysis-service.js
+++ b/mail-worker/src/service/analysis-service.js
@@ -8,7 +8,21 @@ import dayjs from 'dayjs';
import { toUtc } from '../utils/date-uitil';
const analysisService = {
- async echarts(c) {
+ async echarts(c, params) {
+
+
+ const { timeZone } = params;
+
+ let utcDate = toUtc().startOf('day');
+
+ let localDate = utcDate.tz(timeZone);
+
+ utcDate = dayjs(utcDate.format('YYYY-MM-DD HH:mm:ss'))
+
+ localDate = dayjs(localDate.format('YYYY-MM-DD HH:mm:ss'))
+
+ //获取时差
+ const diffHours = localDate.diff(utcDate, 'hour',true);
const [
@@ -30,17 +44,17 @@ const analysisService = {
.limit(6),
- analysisDao.userDayCount(c),
- analysisDao.receiveDayCount(c),
- analysisDao.sendDayCount(c),
+ analysisDao.userDayCount(c, diffHours),
+ analysisDao.receiveDayCount(c, diffHours),
+ analysisDao.sendDayCount(c, diffHours),
c.env.kv.get(kvConst.SEND_DAY_COUNT + dayjs().format('YYYY-MM-DD')),
]);
- const userDayCount = this.filterEmptyDay(userDayCountRaw);
- const receiveDayCount = this.filterEmptyDay(receiveDayCountRaw);
- const sendDayCount = this.filterEmptyDay(sendDayCountRaw);
+ const userDayCount = this.filterEmptyDay(userDayCountRaw, timeZone);
+ const receiveDayCount = this.filterEmptyDay(receiveDayCountRaw, timeZone);
+ const sendDayCount = this.filterEmptyDay(sendDayCountRaw, timeZone);
const daySendTotal = daySendTotalRaw || 0;
@@ -58,8 +72,8 @@ const analysisService = {
};
},
- filterEmptyDay(data) {
- const today = toUtc().tz('Asia/Shanghai').subtract(1, 'day');
+ filterEmptyDay(data, timeZone) {
+ const today = toUtc().tz(timeZone).subtract(1, 'day');
const previousDays = Array.from({ length: 15 }, (_, i) => {
return today.subtract(i, 'day').format('YYYY-MM-DD');
}).reverse();
diff --git a/mail-worker/src/service/email-service.js b/mail-worker/src/service/email-service.js
index 1bb8f3c..a0caf43 100644
--- a/mail-worker/src/service/email-service.js
+++ b/mail-worker/src/service/email-service.js
@@ -16,6 +16,7 @@ import user from '../entity/user';
import starService from './star-service';
import dayjs from 'dayjs';
import kvConst from '../const/kv-const';
+import { t } from '../i18n/i18n'
const emailService = {
@@ -134,27 +135,27 @@ const emailService = {
let { attDataList, html } = await attService.toImageUrlHtml(c, content, r2Domain);
if (attDataList.length > 0 && !r2Domain) {
- throw new BizError('r2域名未配置不能发送正文图片');
+ throw new BizError(t('noOsDomainSendPic'));
}
if (attDataList.length > 0 && !c.env.r2) {
- throw new BizError('r2对象存储未配置不能发送正文图片');
+ throw new BizError(t('noOsSendPic'));
}
if (attachments.length > 0 && !r2Domain) {
- throw new BizError('r2域名未配置不能发送附件');
+ throw new BizError(t('noOsDomainSendAtt'));
}
if (attachments.length > 0 && !c.env.r2) {
- throw new BizError('r2对象存储未配置不能发送附件');
+ throw new BizError(t('noOsSendAtt'));
}
if (send === settingConst.send.CLOSE) {
- throw new BizError('邮件发送功能已停用', 403);
+ throw new BizError(t('disabledSend'), 403);
}
if (attachments.length > 0 && manyType === 'divide') {
- throw new BizError('分别发送暂时不支持附件');
+ throw new BizError(t('noSeparateSend'));
}
@@ -164,17 +165,17 @@ const emailService = {
if (c.env.admin !== userRow.email && roleRow.sendCount) {
if (roleRow.sendCount < 0) {
- throw new BizError('用户无发送次数', 403);
+ throw new BizError(t('userNoSendTotal'), 403);
}
if (userRow.sendCount >= roleRow.sendCount) {
- if (roleRow.sendType === 'day') throw new BizError('发送次数已到达每日限制', 403);
- if (roleRow.sendType === 'count') throw new BizError('发送次数已到达限制', 403);
+ if (roleRow.sendType === 'day') throw new BizError(t('daySendLimit'), 403);
+ if (roleRow.sendType === 'count') throw new BizError(t('totalSendLimit'), 403);
}
if (userRow.sendCount + receiveEmail.length > roleRow.sendCount) {
- if (roleRow.sendType === 'day') throw new BizError('当日剩余发送次数不足', 403);
- if (roleRow.sendType === 'count') throw new BizError('剩余发送次数不足', 403);
+ if (roleRow.sendType === 'day') throw new BizError(t('daySendLack'), 403);
+ if (roleRow.sendType === 'count') throw new BizError(t('totalSendLack'), 403);
}
}
@@ -183,19 +184,19 @@ const emailService = {
const accountRow = await accountService.selectById(c, accountId);
if (!accountRow) {
- throw new BizError('发件人邮箱不存在');
+ throw new BizError(t('senderAccountNotExist'));
}
const domain = emailUtils.getDomain(accountRow.email);
const resendToken = resendTokens[domain];
if (!resendToken) {
- throw new BizError('resend密钥未配置');
+ throw new BizError(t('noResendToken'));
}
if (accountRow.userId !== userId) {
- throw new BizError('发件人邮箱非当前用户所有');
+ throw new BizError(t('sendEmailNotCurUser'));
}
if (!name) {
@@ -211,7 +212,7 @@ const emailService = {
emailRow = await this.selectById(c, emailId);
if (!emailRow) {
- throw new BizError('邮件不存在无法回复');
+ throw new BizError(t('notExistEmailReply'));
}
}
diff --git a/mail-worker/src/service/login-service.js b/mail-worker/src/service/login-service.js
index 3644deb..5a07f05 100644
--- a/mail-worker/src/service/login-service.js
+++ b/mail-worker/src/service/login-service.js
@@ -16,7 +16,8 @@ import turnstileService from './turnstile-service';
import roleService from './role-service';
import regKeyService from './reg-key-service';
import dayjs from 'dayjs';
-import { formatDetailDate, toUtc } from '../utils/date-uitil';
+import { toUtc } from '../utils/date-uitil';
+import { t } from '../i18n/i18n.js';
const loginService = {
@@ -27,27 +28,27 @@ const loginService = {
const {regKey, register} = await settingService.query(c)
if (register === settingConst.register.CLOSE) {
- throw new BizError('注册功能已关闭');
+ throw new BizError(t('regDisabled'));
}
if (!verifyUtils.isEmail(email)) {
- throw new BizError('非法邮箱');
+ throw new BizError(t('notEmail'));
}
if (password.length > 30) {
- throw new BizError('密码长度超出限制');
+ throw new BizError(t('pwdLengthLimit'));
}
if (emailUtils.getName(email).length > 30) {
- throw new BizError('邮箱长度超出限制');
+ throw new BizError(t('emailLengthLimit'));
}
if (password.length < 6) {
- throw new BizError('密码至少6位');
+ throw new BizError(t('pwdMinLengthLimit'));
}
if (!c.env.domain.includes(emailUtils.getDomain(email))) {
- throw new BizError('非法邮箱域名');
+ throw new BizError(t('notEmailDomain'));
}
let type = null;
@@ -68,11 +69,11 @@ const loginService = {
const accountRow = await accountService.selectByEmailIncludeDelNoCase(c, email);
if (accountRow && accountRow.isDel === isDel.DELETE) {
- throw new BizError('该邮箱已被注销');
+ throw new BizError(t('isDelUser'));
}
if (accountRow) {
- throw new BizError('该邮箱已被注册');
+ throw new BizError(t('isRegAccount'));
}
if (await settingService.isRegisterVerify(c)) {
@@ -103,24 +104,24 @@ const loginService = {
async handleOpenRegKey(c, regKey, code) {
if (!code) {
- throw new BizError('注册码不能为空');
+ throw new BizError(t('emptyRegKey'));
}
const regKeyRow = await regKeyService.selectByCode(c, code);
if (!regKeyRow) {
- throw new BizError('注册码不存在');
+ throw new BizError(t('notExistRegKey'));
}
if (regKeyRow.count <= 0) {
- throw new BizError('注册码使用次数已耗尽');
+ throw new BizError(t('noRegKeyCount'));
}
const today = toUtc().tz('Asia/Shanghai').startOf('day')
const expireTime = toUtc(regKeyRow.expireTime).tz('Asia/Shanghai').startOf('day');
if (expireTime.isBefore(today)) {
- throw new BizError('注册码已过期');
+ throw new BizError(t('regKeyExpire'));
}
return { type: regKeyRow.roleId, regKeyId: regKeyRow.regKeyId };
@@ -153,25 +154,25 @@ const loginService = {
const { email, password } = params;
if (!email || !password) {
- throw new BizError('邮箱和密码不能为空');
+ throw new BizError(t('emailAndPwdEmpty'));
}
const userRow = await userService.selectByEmailIncludeDel(c, email);
if (!userRow) {
- throw new BizError('该用户不存在');
+ throw new BizError(t('notExistUser'));
}
if(userRow.isDel === isDel.DELETE) {
- throw new BizError('该用户已被注销');
+ throw new BizError(t('isDelUser'));
}
if(userRow.status === userConst.status.BAN) {
- throw new BizError('该用户已被禁用');
+ throw new BizError(t('isBanUser'));
}
if (!await cryptoUtils.verifyPassword(password, userRow.salt, userRow.password)) {
- throw new BizError('密码输入错误');
+ throw new BizError(t('IncorrectPwd'));
}
const uuid = uuidv4();
diff --git a/mail-worker/src/service/perm-service.js b/mail-worker/src/service/perm-service.js
index 53894fa..3f71fe8 100644
--- a/mail-worker/src/service/perm-service.js
+++ b/mail-worker/src/service/perm-service.js
@@ -5,13 +5,19 @@ import rolePerm from '../entity/role-perm';
import user from '../entity/user';
import role from '../entity/role';
import { permConst } from '../const/entity-const';
+import { t } from '../i18n/i18n'
const permService = {
async tree(c) {
const pList = await orm(c).select().from(perm).where(eq(perm.pid, 0)).orderBy(asc(perm.sort)).all();
const cList = await orm(c).select().from(perm).where(ne(perm.pid, 0)).orderBy(asc(perm.sort)).all();
+ cList.forEach(cItem => {
+ cItem.name = t('perms.' + cItem.name)
+ })
+
pList.forEach(pItem => {
+ pItem.name = t('perms.' + pItem.name)
pItem.children = cList.filter(cItem => cItem.pid === pItem.permId)
})
return pList;
diff --git a/mail-worker/src/service/reg-key-service.js b/mail-worker/src/service/reg-key-service.js
index 84a1443..8e2878a 100644
--- a/mail-worker/src/service/reg-key-service.js
+++ b/mail-worker/src/service/reg-key-service.js
@@ -5,6 +5,8 @@ import roleService from './role-service';
import BizError from '../error/biz-error';
import { formatDetailDate, toUtc } from '../utils/date-uitil';
import userService from './user-service';
+import { t } from '../i18n/i18n.js';
+
const regKeyService = {
async add(c, params, userId) {
@@ -12,26 +14,26 @@ const regKeyService = {
let {code,roleId,count,expireTime} = params;
if (!code) {
- throw new BizError('注册码不能为空');
+ throw new BizError(t('emptyRegKey'));
}
if (!count) {
- throw new BizError('使用次数不能为空');
+ throw new BizError(t('emptyRegKey'));
}
if (!expireTime) {
- throw new BizError('有效时间不能为空');
+ throw new BizError(t('emptyRegKeyExpire'));
}
const regKeyRow = await orm(c).select().from(regKey).where(eq(regKey.code, code)).get();
if (regKeyRow) {
- throw new BizError('注册码已存在');
+ throw new BizError(t('isExistRegKye'));
}
const roleRow = roleService.selectById(c, roleId);
if (!roleRow) {
- throw new BizError('权限身份不存在');
+ throw new BizError(t('roleNotExist'));
}
expireTime = formatDetailDate(expireTime)
diff --git a/mail-worker/src/service/role-service.js b/mail-worker/src/service/role-service.js
index ba7bb6f..465021c 100644
--- a/mail-worker/src/service/role-service.js
+++ b/mail-worker/src/service/role-service.js
@@ -7,8 +7,8 @@ import perm from '../entity/perm';
import { permConst, roleConst } from '../const/entity-const';
import userService from './user-service';
import user from '../entity/user';
-import emailUtils from '../utils/email-utils';
import verifyUtils from '../utils/verify-utils';
+import { t } from '../i18n/i18n.js';
const roleService = {
@@ -17,19 +17,19 @@ const roleService = {
let { name, permIds, banEmail } = params;
if (!name) {
- throw new BizError('身份名不能为空');
+ throw new BizError(t('emptyRoleName'));
}
let roleRow = await orm(c).select().from(role).where(eq(role.name, name)).get();
if (roleRow) {
- throw new BizError('身份名已存在');
+ throw new BizError(t('roleNameExist'));
}
const notEmailIndex = banEmail.findIndex(item => !verifyUtils.isEmail(item))
if (notEmailIndex > -1) {
- throw new BizError('非法邮箱');
+ throw new BizError(t('notEmail'));
}
banEmail = banEmail.join(',')
@@ -67,7 +67,7 @@ const roleService = {
let { name, permIds, roleId, banEmail } = params;
if (!name) {
- throw new BizError('名字不能为空');
+ throw new BizError(t('emptyRoleName'));
}
delete params.isDefault
@@ -75,7 +75,7 @@ const roleService = {
const notEmailIndex = banEmail.findIndex(item => !verifyUtils.isEmail(item))
if (notEmailIndex > -1) {
- throw new BizError('非法邮箱');
+ throw new BizError(t('notEmail'));
}
banEmail = banEmail.join(',')
@@ -97,11 +97,11 @@ const roleService = {
const roleRow = await orm(c).select().from(role).where(eq(role.roleId, roleId)).get();
if (!roleRow) {
- throw new BizError('身份不存在');
+ throw new BizError(t('notExist'));
}
if (roleRow.isDefault) {
- throw new BizError('默认身份不能删除');
+ throw new BizError(t('delDefRole'));
}
const defRoleRow = await orm(c).select().from(role).where(eq(role.isDefault, roleConst.isDefault.OPEN)).get();
@@ -124,7 +124,7 @@ const roleService = {
async setDefault(c, params) {
const roleRow = await orm(c).select().from(role).where(eq(role.roleId, params.roleId)).get();
if (!roleRow) {
- throw new BizError('身份不存在');
+ throw new BizError(t('roleNotExist'));
}
await orm(c).update(role).set({ isDefault: 0 }).run();
await orm(c).update(role).set({ isDefault: 1 }).where(eq(role.roleId, params.roleId)).run();
diff --git a/mail-worker/src/service/setting-service.js b/mail-worker/src/service/setting-service.js
index 1f128f7..79bb253 100644
--- a/mail-worker/src/service/setting-service.js
+++ b/mail-worker/src/service/setting-service.js
@@ -9,6 +9,7 @@ import accountService from './account-service';
import userService from './user-service';
import constant from '../const/constant';
import BizError from '../error/biz-error';
+import { t } from '../i18n/i18n'
const settingService = {
@@ -22,7 +23,7 @@ const settingService = {
const setting = await c.env.kv.get(KvConst.SETTING, { type: 'json' });
let domainList = c.env.domain;
if (typeof domainList === 'string') {
- throw new BizError('环境变量domain必须是JSON类型');
+ throw new BizError(t('notJsonDomain'));
}
domainList = domainList.map(item => '@' + item);
setting.domainList = domainList;
@@ -70,11 +71,11 @@ const settingService = {
if (!c.env.r2) {
- throw new BizError('r2对象存储未配置不能上传背景');
+ throw new BizError(t('noOsUpBack'));
}
if (!settingRow.r2Domain) {
- throw new BizError('r2域名未配置不上传背景');
+ throw new BizError(t('noOsDomainUpBack'));
}
const { background } = params;
diff --git a/mail-worker/src/service/star-service.js b/mail-worker/src/service/star-service.js
index 4208c15..748de49 100644
--- a/mail-worker/src/service/star-service.js
+++ b/mail-worker/src/service/star-service.js
@@ -6,17 +6,17 @@ import { and, desc, eq, lt, sql, inArray } from 'drizzle-orm';
import email from '../entity/email';
import { isDel } from '../const/entity-const';
import attService from "./att-service";
-
+import { t } from '../i18n/i18n'
const starService = {
async add(c, params, userId) {
const { emailId } = params;
const email = await emailService.selectById(c, emailId);
if (!email) {
- throw new BizError('星标的邮件不存在');
+ throw new BizError(t('starNotExistEmail'));
}
if (!email.userId === userId) {
- throw new BizError('星标的邮件非当前用户所有');
+ throw new BizError(t('starNotExistEmail'));
}
const exist = await orm(c).select().from(star).where(
and(
diff --git a/mail-worker/src/service/turnstile-service.js b/mail-worker/src/service/turnstile-service.js
index ffbd208..3e59e6d 100644
--- a/mail-worker/src/service/turnstile-service.js
+++ b/mail-worker/src/service/turnstile-service.js
@@ -1,12 +1,13 @@
import BizError from '../error/biz-error';
import settingService from './setting-service';
+import { t } from '../i18n/i18n'
const turnstileService = {
async verify(c, token) {
if (!token) {
- throw new BizError('验证token不能为空');
+ throw new BizError(t('emptyBotToken'));
}
const settingRow = await settingService.query(c)
@@ -26,7 +27,7 @@ const turnstileService = {
const result = await res.json();
if (!result.success) {
- throw new BizError('人机验证失败,请重试',400)
+ throw new BizError(t('botVerifyFail'),400)
}
}
};
diff --git a/mail-worker/src/service/user-service.js b/mail-worker/src/service/user-service.js
index 293c135..72108d9 100644
--- a/mail-worker/src/service/user-service.js
+++ b/mail-worker/src/service/user-service.js
@@ -2,7 +2,7 @@ import BizError from '../error/biz-error';
import accountService from './account-service';
import orm from '../entity/orm';
import user from '../entity/user';
-import { and, asc, count, desc, eq, inArray, like, sql } from 'drizzle-orm';
+import { and, asc, count, desc, eq, inArray, sql } from 'drizzle-orm';
import { emailConst, isDel, roleConst, userConst } from '../const/entity-const';
import kvConst from '../const/kv-const';
import KvConst from '../const/kv-const';
@@ -15,6 +15,7 @@ import roleService from './role-service';
import emailUtils from '../utils/email-utils';
import saltHashUtils from '../utils/crypto-utils';
import constant from '../const/constant';
+import { t } from '../i18n/i18n'
const userService = {
@@ -50,7 +51,7 @@ const userService = {
const { password } = params;
if (password < 6) {
- throw new BizError('密码不能小于6位');
+ throw new BizError(t('pwdMinLengthLimit'));
}
const { salt, hash } = await cryptoUtils.hashPassword(password);
await orm(c).update(user).set({ password: hash, salt: salt }).where(eq(user.userId, userId)).run();
@@ -295,7 +296,7 @@ const userService = {
const roleRow = await roleService.selectById(c, type);
if (!roleRow) {
- throw new BizError('身份不存在');
+ throw new BizError(t('roleNotExist'));
}
await orm(c)
@@ -327,27 +328,27 @@ const userService = {
const { email, type, password } = params;
if (!c.env.domain.includes(emailUtils.getDomain(email))) {
- throw new BizError('非法邮箱域名');
+ throw new BizError(t('notEmailDomain'));
}
if (password.length < 6) {
- throw new BizError('密码必须大于6位');
+ throw new BizError(t('pwdMinLengthLimit'));
}
const accountRow = await accountService.selectByEmailIncludeDel(c, email);
if (accountRow && accountRow.isDel === isDel.DELETE) {
- throw new BizError('该邮箱已被注销');
+ throw new BizError(t('isDelUser'));
}
if (accountRow) {
- throw new BizError('该邮箱已被注册');
+ throw new BizError(t('isRegAccount'));
}
const role = roleService.selectById(c, type);
if (!role) {
- throw new BizError('权限身份不存在');
+ throw new BizError(t('roleNotExist'));
}
const { salt, hash } = await saltHashUtils.hashPassword(password);