@vitnode/core 1.2.0-canary.31 → 1.2.0-canary.33

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.
Files changed (91) hide show
  1. package/LICENSE.md +1 -1
  2. package/dist/scripts/get-config.d.ts +6 -2
  3. package/dist/scripts/get-config.d.ts.map +1 -1
  4. package/dist/scripts/prepare-database.d.ts.map +1 -1
  5. package/dist/scripts/run-interactive-shell-command.d.ts.map +1 -1
  6. package/dist/scripts/scripts.js +4 -2
  7. package/dist/scripts/shared/file-utils.d.ts.map +1 -1
  8. package/dist/src/api/config.js +3 -3
  9. package/dist/src/api/lib/logger-middleware.d.ts +3 -3
  10. package/dist/src/api/lib/logger-middleware.d.ts.map +1 -1
  11. package/dist/src/api/lib/logger-middleware.js +6 -6
  12. package/dist/src/api/middlewares/global.middleware.d.ts +15 -5
  13. package/dist/src/api/middlewares/global.middleware.d.ts.map +1 -1
  14. package/dist/src/api/middlewares/global.middleware.js +4 -2
  15. package/dist/src/api/middlewares/rate-limiter.middleware.d.ts +1 -1
  16. package/dist/src/api/middlewares/rate-limiter.middleware.d.ts.map +1 -1
  17. package/dist/src/api/middlewares/rate-limiter.middleware.js +8 -2
  18. package/dist/src/api/models/device.js +1 -1
  19. package/dist/src/api/models/email.d.ts +10 -6
  20. package/dist/src/api/models/email.d.ts.map +1 -1
  21. package/dist/src/api/models/email.js +27 -8
  22. package/dist/src/api/models/session-admin.js +3 -3
  23. package/dist/src/api/models/session.js +1 -1
  24. package/dist/src/api/models/sso.d.ts.map +1 -1
  25. package/dist/src/api/models/sso.js +2 -2
  26. package/dist/src/api/models/user/sign-up.d.ts +1 -1
  27. package/dist/src/api/models/user/sign-up.js +1 -1
  28. package/dist/src/api/models/user.d.ts +1 -1
  29. package/dist/src/api/models/user.d.ts.map +1 -1
  30. package/dist/src/api/modules/admin/admin.module.d.ts +32 -32
  31. package/dist/src/api/modules/admin/debug/debug.admin.module.d.ts +16 -16
  32. package/dist/src/api/modules/admin/debug/routes/logs.route.d.ts +16 -16
  33. package/dist/src/api/modules/admin/routes/session.route.d.ts +4 -4
  34. package/dist/src/api/modules/admin/users/routes/list.route.d.ts +12 -12
  35. package/dist/src/api/modules/admin/users/routes/users.route.d.ts +12 -12
  36. package/dist/src/api/modules/admin/users/users.admin.module.d.ts +12 -12
  37. package/dist/src/api/modules/middleware/route.js +1 -1
  38. package/dist/src/api/modules/users/routes/session.route.d.ts +4 -4
  39. package/dist/src/api/modules/users/routes/sign-up.route.d.ts +8 -8
  40. package/dist/src/api/modules/users/routes/test.route.d.ts +1 -1
  41. package/dist/src/api/modules/users/routes/test.route.d.ts.map +1 -1
  42. package/dist/src/api/modules/users/routes/test.route.js +7 -8
  43. package/dist/src/api/modules/users/users.module.d.ts +11 -11
  44. package/dist/src/app_admin/core/debug/page.d.ts +2 -2
  45. package/dist/src/app_admin/core/debug/page.d.ts.map +1 -1
  46. package/dist/src/app_admin/core/debug/page.js +2 -1
  47. package/dist/src/app_admin/core/users/page.d.ts +2 -2
  48. package/dist/src/app_admin/core/users/page.d.ts.map +1 -1
  49. package/dist/src/app_admin/core/users/page.js +2 -1
  50. package/dist/src/components/confirm-action/confirm-action-alert-dialog.d.ts +2 -2
  51. package/dist/src/components/confirm-action/confirm-action-alert-dialog.d.ts.map +1 -1
  52. package/dist/src/components/confirm-action/confirm-action-alert-dialog.js +2 -1
  53. package/dist/src/components/form/fields/combobox-async.js +1 -1
  54. package/dist/src/components/form/fields/combobox.js +1 -1
  55. package/dist/src/components/table/content.d.ts.map +1 -1
  56. package/dist/src/components/table/content.js +57 -60
  57. package/dist/src/components/table/data-table.d.ts.map +1 -1
  58. package/dist/src/components/table/data-table.js +26 -29
  59. package/dist/src/components/ui/button.d.ts +1 -1
  60. package/dist/src/components/ui/menubar.js +1 -1
  61. package/dist/src/components/ui/sidebar.d.ts +1 -1
  62. package/dist/src/components/ui/sidebar.d.ts.map +1 -1
  63. package/dist/src/components/ui/sidebar.js +1 -1
  64. package/dist/src/emails/default-template.d.ts +30 -0
  65. package/dist/src/emails/default-template.d.ts.map +1 -0
  66. package/dist/src/emails/default-template.js +106 -0
  67. package/dist/src/lib/api/get-session-admin-api.d.ts +1 -1
  68. package/dist/src/lib/api/get-session-api.d.ts +1 -1
  69. package/dist/src/lib/config.d.ts +2 -2
  70. package/dist/src/lib/config.d.ts.map +1 -1
  71. package/dist/src/lib/config.js +5 -8
  72. package/dist/src/lib/fetcher/core.d.ts.map +1 -1
  73. package/dist/src/lib/fetcher/core.js +5 -1
  74. package/dist/src/views/admin/layouts/admin-layout.d.ts.map +1 -1
  75. package/dist/src/views/admin/layouts/admin-layout.js +2 -2
  76. package/dist/src/views/admin/views/core/debug/system-logs/actions/more/more.d.ts +17 -1
  77. package/dist/src/views/admin/views/core/debug/system-logs/actions/more/more.d.ts.map +1 -1
  78. package/dist/src/views/admin/views/core/debug/system-logs/actions/more/more.js +2 -1
  79. package/dist/src/views/admin/views/core/debug/system-logs/system-logs-view.d.ts +2 -2
  80. package/dist/src/views/auth/sign-up/form/mutation-api.d.ts +1 -1
  81. package/dist/src/views/auth/sign-up/form/use-form.d.ts +4 -4
  82. package/dist/src/views/layouts/theme/header/header.d.ts.map +1 -1
  83. package/dist/src/views/layouts/theme/header/header.js +3 -3
  84. package/dist/src/vitnode.config.d.ts +3 -4
  85. package/dist/src/vitnode.config.d.ts.map +1 -1
  86. package/dist/tsconfig.tsbuildinfo +1 -1
  87. package/package.json +24 -24
  88. package/src/app_admin/core/debug/page.tsx +2 -1
  89. package/src/app_admin/core/users/page.tsx +2 -1
  90. package/dist/emails/my-email.d.ts +0 -2
  91. package/dist/emails/my-email.d.ts.map +0 -1
package/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 Maciej Piotr Balcerzak
3
+ Copyright (c) 2025 aXenDev Maciej Balcerzak
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,3 +1,7 @@
1
- import type { VitNodeConfig } from '../src/vitnode.config';
2
- export declare const getConfig: () => Promise<VitNodeConfig>;
1
+ import type { VitNodeApiConfig, VitNodeConfig } from '../src/vitnode.config';
2
+ type ConfigType<T extends 'api.config' | 'config'> = T extends 'config' ? VitNodeConfig : VitNodeApiConfig;
3
+ export declare const getConfig: <T extends "api.config" | "config">({ type, }: {
4
+ type?: T;
5
+ }) => Promise<ConfigType<T>>;
6
+ export {};
3
7
  //# sourceMappingURL=get-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-config.d.ts","sourceRoot":"","sources":["../../scripts/get-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,eAAO,MAAM,SAAS,QAAa,OAAO,CAAC,aAAa,CAYvD,CAAC"}
1
+ {"version":3,"file":"get-config.d.ts","sourceRoot":"","sources":["../../scripts/get-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE7E,KAAK,UAAU,CAAC,CAAC,SAAS,YAAY,GAAG,QAAQ,IAAI,CAAC,SAAS,QAAQ,GACnE,aAAa,GACb,gBAAgB,CAAC;AAErB,eAAO,MAAM,SAAS,GAAU,CAAC,SAAS,YAAY,GAAG,QAAQ,EAAE,WAEhE;IACD,IAAI,CAAC,EAAE,CAAC,CAAC;CACV,KAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAaxB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"prepare-database.d.ts","sourceRoot":"","sources":["../../scripts/prepare-database.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,0BAA0B,qBAQtC,CAAC;AAEF,eAAO,MAAM,aAAa,qBAOzB,CAAC;AAEF,eAAO,MAAM,OAAO,qBAOnB,CAAC;AAEF,eAAO,MAAM,sBAAsB,qBAyGlC,CAAC;AAEF,eAAO,MAAM,eAAe,GAAU,kBAEnC;IACD,WAAW,EAAE,MAAM,CAAC;CACrB,mBAWA,CAAC"}
1
+ {"version":3,"file":"prepare-database.d.ts","sourceRoot":"","sources":["../../scripts/prepare-database.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,0BAA0B,qBAQtC,CAAC;AAEF,eAAO,MAAM,aAAa,qBAOzB,CAAC;AAEF,eAAO,MAAM,OAAO,qBAOnB,CAAC;AAEF,eAAO,MAAM,sBAAsB,qBA2GlC,CAAC;AAEF,eAAO,MAAM,eAAe,GAAU,kBAEnC;IACD,WAAW,EAAE,MAAM,CAAC;CACrB,mBAWA,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"run-interactive-shell-command.d.ts","sourceRoot":"","sources":["../../scripts/run-interactive-shell-command.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,0BAA0B,GACrC,KAAK,MAAM,EACX,OAAM,MAAM,EAAO,qBAiBpB,CAAC"}
1
+ {"version":3,"file":"run-interactive-shell-command.d.ts","sourceRoot":"","sources":["../../scripts/run-interactive-shell-command.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,0BAA0B,GACrC,KAAK,MAAM,EACX,OAAM,MAAM,EAAO,qBAqBpB,CAAC"}
@@ -3,8 +3,10 @@ import 'tsx/esm';
3
3
  import { createRequire } from 'module';
4
4
  const require = createRequire(import.meta.url);
5
5
 
6
- import{stat as ts}from"fs";import{stat as ss,readdir as rs}from"fs/promises";import{EventEmitter as is}from"events";import*as m from"path";import{stat as Nt,lstat as Me,readdir as It,realpath as Rt}from"fs/promises";import{Readable as St}from"stream";import{resolve as Oe,relative as At,join as Ft,sep as Tt}from"path";var E={FILE_TYPE:"files",DIR_TYPE:"directories",FILE_DIR_TYPE:"files_directories",EVERYTHING_TYPE:"all"},ge={root:".",fileFilter:t=>!0,directoryFilter:t=>!0,type:E.FILE_TYPE,lstat:!1,depth:2147483648,alwaysStat:!1,highWaterMark:4096};Object.freeze(ge);var Ue="READDIRP_RECURSIVE_ERROR",kt=new Set(["ENOENT","EPERM","EACCES","ELOOP",Ue]),$e=[E.DIR_TYPE,E.EVERYTHING_TYPE,E.FILE_DIR_TYPE,E.FILE_TYPE],Ct=new Set([E.DIR_TYPE,E.EVERYTHING_TYPE,E.FILE_DIR_TYPE]),Lt=new Set([E.EVERYTHING_TYPE,E.FILE_DIR_TYPE,E.FILE_TYPE]),Wt=t=>kt.has(t.code),jt=process.platform==="win32",He=t=>!0,Ye=t=>{if(t===void 0)return He;if(typeof t=="function")return t;if(typeof t=="string"){let e=t.trim();return s=>s.basename===e}if(Array.isArray(t)){let e=t.map(s=>s.trim());return s=>e.some(i=>s.basename===i)}return He},we=class extends St{constructor(e={}){super({objectMode:!0,autoDestroy:!0,highWaterMark:e.highWaterMark});let s={...ge,...e},{root:i,type:r}=s;this._fileFilter=Ye(s.fileFilter),this._directoryFilter=Ye(s.directoryFilter);let o=s.lstat?Me:Nt;jt?this._stat=a=>o(a,{bigint:!0}):this._stat=o,this._maxDepth=s.depth??ge.depth,this._wantsDir=r?Ct.has(r):!1,this._wantsFile=r?Lt.has(r):!1,this._wantsEverything=r===E.EVERYTHING_TYPE,this._root=Oe(i),this._isDirent=!s.alwaysStat,this._statsProp=this._isDirent?"dirent":"stats",this._rdOptions={encoding:"utf8",withFileTypes:this._isDirent},this.parents=[this._exploreDir(i,1)],this.reading=!1,this.parent=void 0}async _read(e){if(!this.reading){this.reading=!0;try{for(;!this.destroyed&&e>0;){let s=this.parent,i=s&&s.files;if(i&&i.length>0){let{path:r,depth:o}=s,a=i.splice(0,e).map(c=>this._formatEntry(c,r)),n=await Promise.all(a);for(let c of n){if(!c)continue;if(this.destroyed)return;let d=await this._getEntryType(c);d==="directory"&&this._directoryFilter(c)?(o<=this._maxDepth&&this.parents.push(this._exploreDir(c.fullPath,o+1)),this._wantsDir&&(this.push(c),e--)):(d==="file"||this._includeAsFile(c))&&this._fileFilter(c)&&this._wantsFile&&(this.push(c),e--)}}else{let r=this.parents.pop();if(!r){this.push(null);break}if(this.parent=await r,this.destroyed)return}}}catch(s){this.destroy(s)}finally{this.reading=!1}}}async _exploreDir(e,s){let i;try{i=await It(e,this._rdOptions)}catch(r){this._onError(r)}return{files:i,depth:s,path:e}}async _formatEntry(e,s){let i,r=this._isDirent?e.name:e;try{let o=Oe(Ft(s,r));i={path:At(this._root,o),fullPath:o,basename:r},i[this._statsProp]=this._isDirent?e:await this._stat(o)}catch(o){this._onError(o);return}return i}_onError(e){Wt(e)&&!this.destroyed?this.emit("warn",e):this.destroy(e)}async _getEntryType(e){if(!e&&this._statsProp in e)return"";let s=e[this._statsProp];if(s.isFile())return"file";if(s.isDirectory())return"directory";if(s&&s.isSymbolicLink()){let i=e.fullPath;try{let r=await Rt(i),o=await Me(r);if(o.isFile())return"file";if(o.isDirectory()){let a=r.length;if(i.startsWith(r)&&i.substr(a,1)===Tt){let n=new Error(`Circular symlink detected: "${i}" points to "${r}"`);return n.code=Ue,this._onError(n)}return"directory"}}catch(r){return this._onError(r),""}}}_includeAsFile(e){let s=e&&e[this._statsProp];return s&&this._wantsEverything&&!s.isDirectory()}};function Ke(t,e={}){let s=e.entryType||e.type;if(s==="both"&&(s=E.FILE_DIR_TYPE),s&&(e.type=s),t){if(typeof t!="string")throw new TypeError("readdirp: root argument must be a string. Usage: readdirp(root, options)");if(s&&!$e.includes(s))throw new Error(`readdirp: Invalid type passed. Use one of ${$e.join(", ")}`)}else throw new Error("readdirp: root argument is required. Usage: readdirp(root, options)");return e.root=t,new we(e)}import{watchFile as zt,unwatchFile as Ge,watch as Mt}from"fs";import{open as Ot,stat as qe,lstat as $t,realpath as ye}from"fs/promises";import*as y from"path";import{type as Ht}from"os";var Yt="data",Ee="end",Be="close",ee=()=>{};var te=process.platform,Pe=te==="win32",Ut=te==="darwin",Kt=te==="linux",Gt=te==="freebsd",Je=Ht()==="OS400",x={ALL:"all",READY:"ready",ADD:"add",CHANGE:"change",ADD_DIR:"addDir",UNLINK:"unlink",UNLINK_DIR:"unlinkDir",RAW:"raw",ERROR:"error"},v=x,Vt="watch",qt={lstat:$t,stat:qe},T="listeners",J="errHandlers",W="rawEmitters",Bt=[T,J,W],Jt=new Set(["3dm","3ds","3g2","3gp","7z","a","aac","adp","afdesign","afphoto","afpub","ai","aif","aiff","alz","ape","apk","appimage","ar","arj","asf","au","avi","bak","baml","bh","bin","bk","bmp","btif","bz2","bzip2","cab","caf","cgm","class","cmx","cpio","cr2","cur","dat","dcm","deb","dex","djvu","dll","dmg","dng","doc","docm","docx","dot","dotm","dra","DS_Store","dsk","dts","dtshd","dvb","dwg","dxf","ecelp4800","ecelp7470","ecelp9600","egg","eol","eot","epub","exe","f4v","fbs","fh","fla","flac","flatpak","fli","flv","fpx","fst","fvt","g3","gh","gif","graffle","gz","gzip","h261","h263","h264","icns","ico","ief","img","ipa","iso","jar","jpeg","jpg","jpgv","jpm","jxr","key","ktx","lha","lib","lvp","lz","lzh","lzma","lzo","m3u","m4a","m4v","mar","mdi","mht","mid","midi","mj2","mka","mkv","mmr","mng","mobi","mov","movie","mp3","mp4","mp4a","mpeg","mpg","mpga","mxu","nef","npx","numbers","nupkg","o","odp","ods","odt","oga","ogg","ogv","otf","ott","pages","pbm","pcx","pdb","pdf","pea","pgm","pic","png","pnm","pot","potm","potx","ppa","ppam","ppm","pps","ppsm","ppsx","ppt","pptm","pptx","psd","pya","pyc","pyo","pyv","qt","rar","ras","raw","resources","rgb","rip","rlc","rmf","rmvb","rpm","rtf","rz","s3m","s7z","scpt","sgi","shar","snap","sil","sketch","slk","smv","snk","so","stl","suo","sub","swf","tar","tbz","tbz2","tga","tgz","thmx","tif","tiff","tlz","ttc","ttf","txz","udf","uvh","uvi","uvm","uvp","uvs","uvu","viv","vob","war","wav","wax","wbmp","wdp","weba","webm","webp","whl","wim","wm","wma","wmv","wmx","woff","woff2","wrm","wvx","xbm","xif","xla","xlam","xls","xlsb","xlsm","xlsx","xlt","xltm","xltx","xm","xmind","xpi","xpm","xwd","xz","z","zip","zipx"]),Qt=t=>Jt.has(y.extname(t).slice(1).toLowerCase()),be=(t,e)=>{t instanceof Set?t.forEach(e):e(t)},M=(t,e,s)=>{let i=t[e];i instanceof Set||(t[e]=i=new Set([i])),i.add(s)},Xt=t=>e=>{let s=t[e];s instanceof Set?s.clear():delete t[e]},O=(t,e,s)=>{let i=t[e];i instanceof Set?i.delete(s):i===s&&delete t[e]},Qe=t=>t instanceof Set?t.size===0:!t,Q=new Map;function Ve(t,e,s,i,r){let o=(a,n)=>{s(t),r(a,n,{watchedPath:t}),n&&t!==n&&X(y.resolve(t,n),T,y.join(t,n))};try{return Mt(t,{persistent:e.persistent},o)}catch(a){i(a);return}}var X=(t,e,s,i,r)=>{let o=Q.get(t);o&&be(o[e],a=>{a(s,i,r)})},Zt=(t,e,s,i)=>{let{listener:r,errHandler:o,rawEmitter:a}=i,n=Q.get(e),c;if(!s.persistent)return c=Ve(t,s,r,o,a),c?c.close.bind(c):void 0;if(n)M(n,T,r),M(n,J,o),M(n,W,a);else{if(c=Ve(t,s,X.bind(null,e,T),o,X.bind(null,e,W)),!c)return;c.on(v.ERROR,async d=>{let l=X.bind(null,e,J);if(n&&(n.watcherUnusable=!0),Pe&&d.code==="EPERM")try{await(await Ot(t,"r")).close(),l(d)}catch{}else l(d)}),n={listeners:r,errHandlers:o,rawEmitters:a,watcher:c},Q.set(e,n)}return()=>{O(n,T,r),O(n,J,o),O(n,W,a),Qe(n.listeners)&&(n.watcher.close(),Q.delete(e),Bt.forEach(Xt(n)),n.watcher=void 0,Object.freeze(n))}},xe=new Map,es=(t,e,s,i)=>{let{listener:r,rawEmitter:o}=i,a=xe.get(e),n=a&&a.options;return n&&(n.persistent<s.persistent||n.interval>s.interval)&&(Ge(e),a=void 0),a?(M(a,T,r),M(a,W,o)):(a={listeners:r,rawEmitters:o,options:s,watcher:zt(e,s,(c,d)=>{be(a.rawEmitters,f=>{f(v.CHANGE,e,{curr:c,prev:d})});let l=c.mtimeMs;(c.size!==d.size||l>d.mtimeMs||l===0)&&be(a.listeners,f=>f(t,c))})},xe.set(e,a)),()=>{O(a,T,r),O(a,W,o),Qe(a.listeners)&&(xe.delete(e),Ge(e),a.options=a.watcher=void 0,Object.freeze(a))}},Z=class{constructor(e){this.fsw=e,this._boundHandleError=s=>e._handleError(s)}_watchWithNodeFs(e,s){let i=this.fsw.options,r=y.dirname(e),o=y.basename(e);this.fsw._getWatchedDir(r).add(o);let n=y.resolve(e),c={persistent:i.persistent};s||(s=ee);let d;if(i.usePolling){let l=i.interval!==i.binaryInterval;c.interval=l&&Qt(o)?i.binaryInterval:i.interval,d=es(e,n,c,{listener:s,rawEmitter:this.fsw._emitRaw})}else d=Zt(e,n,c,{listener:s,errHandler:this._boundHandleError,rawEmitter:this.fsw._emitRaw});return d}_handleFile(e,s,i){if(this.fsw.closed)return;let r=y.dirname(e),o=y.basename(e),a=this.fsw._getWatchedDir(r),n=s;if(a.has(o))return;let c=async(l,f)=>{if(this.fsw._throttle(Vt,e,5)){if(!f||f.mtimeMs===0)try{let u=await qe(e);if(this.fsw.closed)return;let w=u.atimeMs,_=u.mtimeMs;if((!w||w<=_||_!==n.mtimeMs)&&this.fsw._emit(v.CHANGE,e,u),(Ut||Kt||Gt)&&n.ino!==u.ino){this.fsw._closeFile(l),n=u;let D=this._watchWithNodeFs(e,c);D&&this.fsw._addPathCloser(l,D)}else n=u}catch{this.fsw._remove(r,o)}else if(a.has(o)){let u=f.atimeMs,w=f.mtimeMs;(!u||u<=w||w!==n.mtimeMs)&&this.fsw._emit(v.CHANGE,e,f),n=f}}},d=this._watchWithNodeFs(e,c);if(!(i&&this.fsw.options.ignoreInitial)&&this.fsw._isntIgnored(e)){if(!this.fsw._throttle(v.ADD,e,0))return;this.fsw._emit(v.ADD,e,s)}return d}async _handleSymlink(e,s,i,r){if(this.fsw.closed)return;let o=e.fullPath,a=this.fsw._getWatchedDir(s);if(!this.fsw.options.followSymlinks){this.fsw._incrReadyCount();let n;try{n=await ye(i)}catch{return this.fsw._emitReady(),!0}return this.fsw.closed?void 0:(a.has(r)?this.fsw._symlinkPaths.get(o)!==n&&(this.fsw._symlinkPaths.set(o,n),this.fsw._emit(v.CHANGE,i,e.stats)):(a.add(r),this.fsw._symlinkPaths.set(o,n),this.fsw._emit(v.ADD,i,e.stats)),this.fsw._emitReady(),!0)}if(this.fsw._symlinkPaths.has(o))return!0;this.fsw._symlinkPaths.set(o,!0)}_handleRead(e,s,i,r,o,a,n){if(e=y.join(e,""),n=this.fsw._throttle("readdir",e,1e3),!n)return;let c=this.fsw._getWatchedDir(i.path),d=new Set,l=this.fsw._readdirp(e,{fileFilter:f=>i.filterPath(f),directoryFilter:f=>i.filterDir(f)});if(l)return l.on(Yt,async f=>{if(this.fsw.closed){l=void 0;return}let u=f.path,w=y.join(e,u);if(d.add(u),!(f.stats.isSymbolicLink()&&await this._handleSymlink(f,e,w,u))){if(this.fsw.closed){l=void 0;return}(u===r||!r&&!c.has(u))&&(this.fsw._incrReadyCount(),w=y.join(o,y.relative(o,w)),this._addToNodeFs(w,s,i,a+1))}}).on(v.ERROR,this._boundHandleError),new Promise((f,u)=>{if(!l)return u();l.once(Ee,()=>{if(this.fsw.closed){l=void 0;return}let w=n?n.clear():!1;f(void 0),c.getChildren().filter(_=>_!==e&&!d.has(_)).forEach(_=>{this.fsw._remove(e,_)}),l=void 0,w&&this._handleRead(e,!1,i,r,o,a,n)})})}async _handleDir(e,s,i,r,o,a,n){let c=this.fsw._getWatchedDir(y.dirname(e)),d=c.has(y.basename(e));!(i&&this.fsw.options.ignoreInitial)&&!o&&!d&&this.fsw._emit(v.ADD_DIR,e,s),c.add(y.basename(e)),this.fsw._getWatchedDir(e);let l,f,u=this.fsw.options.depth;if((u==null||r<=u)&&!this.fsw._symlinkPaths.has(n)){if(!o&&(await this._handleRead(e,i,a,o,e,r,l),this.fsw.closed))return;f=this._watchWithNodeFs(e,(w,_)=>{_&&_.mtimeMs===0||this._handleRead(w,!1,a,o,e,r,l)})}return f}async _addToNodeFs(e,s,i,r,o){let a=this.fsw._emitReady;if(this.fsw._isIgnored(e)||this.fsw.closed)return a(),!1;let n=this.fsw._getWatchHelpers(e);i&&(n.filterPath=c=>i.filterPath(c),n.filterDir=c=>i.filterDir(c));try{let c=await qt[n.statMethod](n.watchPath);if(this.fsw.closed)return;if(this.fsw._isIgnored(n.watchPath,c))return a(),!1;let d=this.fsw.options.followSymlinks,l;if(c.isDirectory()){let f=y.resolve(e),u=d?await ye(e):e;if(this.fsw.closed||(l=await this._handleDir(n.watchPath,c,s,r,o,n,u),this.fsw.closed))return;f!==u&&u!==void 0&&this.fsw._symlinkPaths.set(f,u)}else if(c.isSymbolicLink()){let f=d?await ye(e):e;if(this.fsw.closed)return;let u=y.dirname(n.watchPath);if(this.fsw._getWatchedDir(u).add(n.watchPath),this.fsw._emit(v.ADD,n.watchPath,c),l=await this._handleDir(u,c,s,r,e,n,f),this.fsw.closed)return;f!==void 0&&this.fsw._symlinkPaths.set(y.resolve(e),f)}else l=this._handleFile(n.watchPath,c,s);return a(),l&&this.fsw._addPathCloser(e,l),!1}catch(c){if(this.fsw._handleError(c))return a(),e}}};var De="/",os="//",rt=".",ns="..",as="string",cs=/\\/g,Xe=/\/\//,ls=/\..*\.(sw[px])$|~$|\.subl.*\.tmp/,ds=/^\.[/\\]/;function se(t){return Array.isArray(t)?t:[t]}var ve=t=>typeof t=="object"&&t!==null&&!(t instanceof RegExp);function fs(t){return typeof t=="function"?t:typeof t=="string"?e=>t===e:t instanceof RegExp?e=>t.test(e):typeof t=="object"&&t!==null?e=>{if(t.path===e)return!0;if(t.recursive){let s=m.relative(t.path,e);return s?!s.startsWith("..")&&!m.isAbsolute(s):!1}return!1}:()=>!1}function us(t){if(typeof t!="string")throw new Error("string expected");t=m.normalize(t),t=t.replace(/\\/g,"/");let e=!1;t.startsWith("//")&&(e=!0);let s=/\/\//;for(;t.match(s);)t=t.replace(s,"/");return e&&(t="/"+t),t}function Ze(t,e,s){let i=us(e);for(let r=0;r<t.length;r++){let o=t[r];if(o(i,s))return!0}return!1}function hs(t,e){if(t==null)throw new TypeError("anymatch: specify first argument");let i=se(t).map(r=>fs(r));return e==null?(r,o)=>Ze(i,r,o):Ze(i,e)}var et=t=>{let e=se(t).flat();if(!e.every(s=>typeof s===as))throw new TypeError(`Non-string provided as watch path: ${e}`);return e.map(it)},tt=t=>{let e=t.replace(cs,De),s=!1;for(e.startsWith(os)&&(s=!0);e.match(Xe);)e=e.replace(Xe,De);return s&&(e=De+e),e},it=t=>tt(m.normalize(tt(t))),st=(t="")=>e=>typeof e=="string"?it(m.isAbsolute(e)?e:m.join(t,e)):e,ms=(t,e)=>m.isAbsolute(t)?t:m.join(e,t),ps=Object.freeze(new Set),Ne=class{constructor(e,s){this.path=e,this._removeWatcher=s,this.items=new Set}add(e){let{items:s}=this;s&&e!==rt&&e!==ns&&s.add(e)}async remove(e){let{items:s}=this;if(!s||(s.delete(e),s.size>0))return;let i=this.path;try{await rs(i)}catch{this._removeWatcher&&this._removeWatcher(m.dirname(i),m.basename(i))}}has(e){let{items:s}=this;if(s)return s.has(e)}getChildren(){let{items:e}=this;return e?[...e.values()]:[]}dispose(){this.items.clear(),this.path="",this._removeWatcher=ee,this.items=ps,Object.freeze(this)}},_s="stat",gs="lstat",Ie=class{constructor(e,s,i){this.fsw=i;let r=e;this.path=e=e.replace(ds,""),this.watchPath=r,this.fullWatchPath=m.resolve(r),this.dirParts=[],this.dirParts.forEach(o=>{o.length>1&&o.pop()}),this.followSymlinks=s,this.statMethod=s?_s:gs}entryPath(e){return m.join(this.watchPath,m.relative(this.watchPath,e.fullPath))}filterPath(e){let{stats:s}=e;if(s&&s.isSymbolicLink())return this.filterDir(e);let i=this.entryPath(e);return this.fsw._isntIgnored(i,s)&&this.fsw._hasReadPermissions(s)}filterDir(e){return this.fsw._isntIgnored(this.entryPath(e),e.stats)}},re=class extends is{constructor(e={}){super(),this.closed=!1,this._closers=new Map,this._ignoredPaths=new Set,this._throttled=new Map,this._streams=new Set,this._symlinkPaths=new Map,this._watched=new Map,this._pendingWrites=new Map,this._pendingUnlinks=new Map,this._readyCount=0,this._readyEmitted=!1;let s=e.awaitWriteFinish,i={stabilityThreshold:2e3,pollInterval:100},r={persistent:!0,ignoreInitial:!1,ignorePermissionErrors:!1,interval:100,binaryInterval:300,followSymlinks:!0,usePolling:!1,atomic:!0,...e,ignored:e.ignored?se(e.ignored):se([]),awaitWriteFinish:s===!0?i:typeof s=="object"?{...i,...s}:!1};Je&&(r.usePolling=!0),r.atomic===void 0&&(r.atomic=!r.usePolling);let o=process.env.CHOKIDAR_USEPOLLING;if(o!==void 0){let c=o.toLowerCase();c==="false"||c==="0"?r.usePolling=!1:c==="true"||c==="1"?r.usePolling=!0:r.usePolling=!!c}let a=process.env.CHOKIDAR_INTERVAL;a&&(r.interval=Number.parseInt(a,10));let n=0;this._emitReady=()=>{n++,n>=this._readyCount&&(this._emitReady=ee,this._readyEmitted=!0,process.nextTick(()=>this.emit(x.READY)))},this._emitRaw=(...c)=>this.emit(x.RAW,...c),this._boundRemove=this._remove.bind(this),this.options=r,this._nodeFsHandler=new Z(this),Object.freeze(r)}_addIgnoredPath(e){if(ve(e)){for(let s of this._ignoredPaths)if(ve(s)&&s.path===e.path&&s.recursive===e.recursive)return}this._ignoredPaths.add(e)}_removeIgnoredPath(e){if(this._ignoredPaths.delete(e),typeof e=="string")for(let s of this._ignoredPaths)ve(s)&&s.path===e&&this._ignoredPaths.delete(s)}add(e,s,i){let{cwd:r}=this.options;this.closed=!1,this._closePromise=void 0;let o=et(e);return r&&(o=o.map(a=>ms(a,r))),o.forEach(a=>{this._removeIgnoredPath(a)}),this._userIgnored=void 0,this._readyCount||(this._readyCount=0),this._readyCount+=o.length,Promise.all(o.map(async a=>{let n=await this._nodeFsHandler._addToNodeFs(a,!i,void 0,0,s);return n&&this._emitReady(),n})).then(a=>{this.closed||a.forEach(n=>{n&&this.add(m.dirname(n),m.basename(s||n))})}),this}unwatch(e){if(this.closed)return this;let s=et(e),{cwd:i}=this.options;return s.forEach(r=>{!m.isAbsolute(r)&&!this._closers.has(r)&&(i&&(r=m.join(i,r)),r=m.resolve(r)),this._closePath(r),this._addIgnoredPath(r),this._watched.has(r)&&this._addIgnoredPath({path:r,recursive:!0}),this._userIgnored=void 0}),this}close(){if(this._closePromise)return this._closePromise;this.closed=!0,this.removeAllListeners();let e=[];return this._closers.forEach(s=>s.forEach(i=>{let r=i();r instanceof Promise&&e.push(r)})),this._streams.forEach(s=>s.destroy()),this._userIgnored=void 0,this._readyCount=0,this._readyEmitted=!1,this._watched.forEach(s=>s.dispose()),this._closers.clear(),this._watched.clear(),this._streams.clear(),this._symlinkPaths.clear(),this._throttled.clear(),this._closePromise=e.length?Promise.all(e).then(()=>{}):Promise.resolve(),this._closePromise}getWatched(){let e={};return this._watched.forEach((s,i)=>{let o=(this.options.cwd?m.relative(this.options.cwd,i):i)||rt;e[o]=s.getChildren().sort()}),e}emitWithAll(e,s){this.emit(e,...s),e!==x.ERROR&&this.emit(x.ALL,e,...s)}async _emit(e,s,i){if(this.closed)return;let r=this.options;Pe&&(s=m.normalize(s)),r.cwd&&(s=m.relative(r.cwd,s));let o=[s];i!=null&&o.push(i);let a=r.awaitWriteFinish,n;if(a&&(n=this._pendingWrites.get(s)))return n.lastChange=new Date,this;if(r.atomic){if(e===x.UNLINK)return this._pendingUnlinks.set(s,[e,...o]),setTimeout(()=>{this._pendingUnlinks.forEach((c,d)=>{this.emit(...c),this.emit(x.ALL,...c),this._pendingUnlinks.delete(d)})},typeof r.atomic=="number"?r.atomic:100),this;e===x.ADD&&this._pendingUnlinks.has(s)&&(e=x.CHANGE,this._pendingUnlinks.delete(s))}if(a&&(e===x.ADD||e===x.CHANGE)&&this._readyEmitted){let c=(d,l)=>{d?(e=x.ERROR,o[0]=d,this.emitWithAll(e,o)):l&&(o.length>1?o[1]=l:o.push(l),this.emitWithAll(e,o))};return this._awaitWriteFinish(s,a.stabilityThreshold,e,c),this}if(e===x.CHANGE&&!this._throttle(x.CHANGE,s,50))return this;if(r.alwaysStat&&i===void 0&&(e===x.ADD||e===x.ADD_DIR||e===x.CHANGE)){let c=r.cwd?m.join(r.cwd,s):s,d;try{d=await ss(c)}catch{}if(!d||this.closed)return;o.push(d)}return this.emitWithAll(e,o),this}_handleError(e){let s=e&&e.code;return e&&s!=="ENOENT"&&s!=="ENOTDIR"&&(!this.options.ignorePermissionErrors||s!=="EPERM"&&s!=="EACCES")&&this.emit(x.ERROR,e),e||this.closed}_throttle(e,s,i){this._throttled.has(e)||this._throttled.set(e,new Map);let r=this._throttled.get(e);if(!r)throw new Error("invalid throttle");let o=r.get(s);if(o)return o.count++,!1;let a,n=()=>{let d=r.get(s),l=d?d.count:0;return r.delete(s),clearTimeout(a),d&&clearTimeout(d.timeoutObject),l};a=setTimeout(n,i);let c={timeoutObject:a,clear:n,count:0};return r.set(s,c),c}_incrReadyCount(){return this._readyCount++}_awaitWriteFinish(e,s,i,r){let o=this.options.awaitWriteFinish;if(typeof o!="object")return;let a=o.pollInterval,n,c=e;this.options.cwd&&!m.isAbsolute(e)&&(c=m.join(this.options.cwd,e));let d=new Date,l=this._pendingWrites;function f(u){ts(c,(w,_)=>{if(w||!l.has(e)){w&&w.code!=="ENOENT"&&r(w);return}let D=Number(new Date);u&&_.size!==u.size&&(l.get(e).lastChange=D);let z=l.get(e);D-z.lastChange>=s?(l.delete(e),r(void 0,_)):n=setTimeout(f,a,_)})}l.has(e)||(l.set(e,{lastChange:d,cancelWait:()=>(l.delete(e),clearTimeout(n),i)}),n=setTimeout(f,a))}_isIgnored(e,s){if(this.options.atomic&&ls.test(e))return!0;if(!this._userIgnored){let{cwd:i}=this.options,o=(this.options.ignored||[]).map(st(i)),n=[...[...this._ignoredPaths].map(st(i)),...o];this._userIgnored=hs(n,void 0)}return this._userIgnored(e,s)}_isntIgnored(e,s){return!this._isIgnored(e,s)}_getWatchHelpers(e){return new Ie(e,this.options.followSymlinks,this)}_getWatchedDir(e){let s=m.resolve(e);return this._watched.has(s)||this._watched.set(s,new Ne(s,this._boundRemove)),this._watched.get(s)}_hasReadPermissions(e){return this.options.ignorePermissionErrors?!0:!!(Number(e.mode)&256)}_remove(e,s,i){let r=m.join(e,s),o=m.resolve(r);if(i=i??(this._watched.has(r)||this._watched.has(o)),!this._throttle("remove",r,100))return;!i&&this._watched.size===1&&this.add(e,s,!0),this._getWatchedDir(r).getChildren().forEach(u=>this._remove(r,u));let c=this._getWatchedDir(e),d=c.has(s);c.remove(s),this._symlinkPaths.has(o)&&this._symlinkPaths.delete(o);let l=r;if(this.options.cwd&&(l=m.relative(this.options.cwd,r)),this.options.awaitWriteFinish&&this._pendingWrites.has(l)&&this._pendingWrites.get(l).cancelWait()===x.ADD)return;this._watched.delete(r),this._watched.delete(o);let f=i?x.UNLINK_DIR:x.UNLINK;d&&!this._isIgnored(r)&&this._emit(f,r),this._closePath(r)}_closePath(e){this._closeFile(e);let s=m.dirname(e);this._getWatchedDir(s).remove(m.basename(e))}_closeFile(e){let s=this._closers.get(e);s&&(s.forEach(i=>i()),this._closers.delete(e))}_addPathCloser(e,s){if(!s)return;let i=this._closers.get(e);i||(i=[],this._closers.set(e,i)),i.push(s)}_readdirp(e,s){if(this.closed)return;let i={type:x.ALL,alwaysStat:!0,lstat:!0,...s,depth:0},r=Ke(e,i);return this._streams.add(r),r.once(Be,()=>{r=void 0}),r.once(Ee,()=>{r&&(this._streams.delete(r),r=void 0)}),r}};function ws(t,e={}){let s=new re(e);return s.add(t),s}var ot={watch:ws,FSWatcher:re};import{existsSync as k,mkdirSync as As,readFileSync as Fs,unlinkSync as Ts}from"fs";import{basename as ct,join as P,relative as lt}from"path";import{copyFileSync as ys,existsSync as I,mkdirSync as xs,readdirSync as Ae,readFileSync as bs,writeFileSync as Es}from"fs";import{basename as nt,dirname as $,extname as Ps,join as N,normalize as Ds,relative as j,sep as vs}from"path";var Ns=/import\s+(?:(?:{[^}]*})|(?:[^{}\s,]*))?\s*(?:,\s*(?:{[^}]*}))?\s*from\s+['"]([./]+[^'"]*)['"]/g,Is=/import\s+(?:(?:{[^}]*})|(?:[^{}\s,]*))?\s*(?:,\s*(?:{[^}]*}))?\s*from\s+['"](@\/[^'"]*)['"]/g,Rs=/import\s*\(\s*['"](@\/[^'"]*)['"]\s*\)/g,Re=/\.(js|jsx|ts|tsx)$/,Se=/^page\.(tsx|ts|jsx|js)$/i,H=(t,e)=>{let i=j(e,t).split(vs);i.pop();let r=i.filter(o=>!o.startsWith("("));return Ds(r.join("/"))},ie=t=>{let e=new Map,s=i=>{if(I(i))for(let r of Ae(i,{withFileTypes:!0})){let o=N(i,r.name);if(r.isDirectory()){s(o);continue}if(Se.test(r.name)){let a=H(o,t);e.set(a,o)}}};return s(t),e},Ss=(t,e)=>{let s=t.replace(Ns,(i,r)=>{if(r.startsWith(".")){let a=r.replace(Re,"").replace(/^(?:\.\.\/)+/,"");return i.replace(r,`${e}/${a}`)}return i});return s=s.replace(Is,(i,r)=>{let o=r.replace(/^@\//,"").replace(Re,"");return i.replace(r,`${e}/${o}`)}),s=s.replace(Rs,(i,r)=>{let o=r.replace(/^@\//,"").replace(Re,"");return i.replace(r,`${e}/${o}`)}),s};function oe(t){let e=t;for(;e!==$(e);){if(I(N(e,"turbo.json"))||I(N(e,".git")))return e;e=$(e)}let s=N(t,"package.json");if(I(s))return $(s);throw new Error("\u274C Could not locate project root")}function ne(t){let e=N(t,"src","app","[locale]");if(I(e))return e;let i=(o=>{let a=[];if(!I(o))return a;let n=(c,d=0)=>{if(!(d>4))try{let l=Ae(c,{withFileTypes:!0});for(let f of l){if(!f.isDirectory())continue;let u=N(c,f.name);if(f.name==="[locale]"&&$(u).endsWith(N("src","app"))){a.push(u);continue}n(u,d+1)}}catch{}};return n(o),a})(t);return i.length>0?i[0]:N(t,"apps","docs","src","app","[locale]")}var Y=t=>{let e=[];if(!I(t))return e;let s=Ae(t,{withFileTypes:!0});for(let i of s){let r=N(t,i.name);i.isDirectory()?e.push(...Y(r)):e.push(r)}return e},U=t=>I(t)?Y(t).length===0:!0,Fe=(t,e,s,i,r,o,a=!0)=>{let n=nt(t);if(Se.test(n)){let c=H(e,r),d=i.get(c);if(d&&d!==e){a&&console.log(`\x1B[31mSkipped duplicate page:\x1B[0m ${j(o,e)} (collides with ${j(o,d)})`);return}}try{let c=$(e);I(c)||xs(c,{recursive:!0});let d=Ps(t);if(s&&[".js",".jsx",".ts",".tsx"].includes(d)){let l=bs(t,"utf-8"),f=Ss(l,s);Es(e,f)}else ys(t,e);if(a){let l=t.indexOf(N("src","app")),f=l!==-1?t.substring(l):t.startsWith(o)?j(o,t):t,u=e.startsWith(o)?j(o,e):e;console.log(`\x1B[32mCopied:\x1B[0m ${f} \u2192 ${u}`)}if(Se.test(nt(e))){let l=H(e,r);i.set(l,e)}}catch(c){console.error(`\x1B[31mError copying file:\x1B[0m ${t}`,c)}},at=(t,e,s,i,r,o,a=!0)=>{if(!I(t)||U(t))return;let n=Y(t);for(let c of n){let d=j(t,c),l=N(e,d);Fe(c,l,s,i,r,o,a)}};var dt=({initMessage:t})=>{let e=process.cwd(),s=oe(e),i=ne(s),r=ie(i),o=ct(e);try{let h=P(e,"package.json");k(h)&&(o=JSON.parse(Fs(h,"utf-8")).name??"")}catch(h){console.error("\x1B[31mError reading package.json:\x1B[0m",h);return}let a=o.replace(/\//g,"-").replace(/@/g,""),n=P(s,"apps","docs","src","app","[locale]","(main)",P("(plugins)",`(${a})`)),c=P(s,"apps","docs","src","app","[locale]","admin","(auth)",P("(plugins)",`(${a})`)),d=P(s,"apps","docs","src","locales",o),l=[{sourceDir:P(e,"src","app_admin"),destinationDir:c},{sourceDir:P(e,"src","app"),destinationDir:n},{sourceDir:P(e,"src","locales"),destinationDir:d}];for(let{sourceDir:h,destinationDir:g}of l)k(h)&&!U(h)&&!k(g)&&As(g,{recursive:!0});let f=(h,g)=>{Fe(h,g,o,r,i,s)},u=h=>{try{if(k(h)&&(Ts(h),console.log(`\x1B[33mRemoved:\x1B[0m ${h}`),/^page\.(tsx|ts|jsx|js)$/i.test(ct(h)))){let g=H(h,i);r.get(g)===h&&r.delete(g)}}catch(g){console.error(`\x1B[31mError removing file:\x1B[0m ${h}`,g)}},w=(h,g)=>{if(!k(g)||g.includes(P("src","locales")))return;let _e=Y(g);for(let F of _e){let B=lt(g,F),vt=P(h,B);k(vt)||u(F)}};for(let{sourceDir:h,destinationDir:g}of l)w(h,g);console.log(`${t} \x1B[34mWatching for changes in plugins...\x1B[0m`);let _=l.map(h=>h.sourceDir).filter(h=>k(h)),D=ot.watch(_,{ignoreInitial:!1,persistent:!0}),z=h=>{let g=l.filter(({sourceDir:F})=>h.startsWith(F));if(g.length===0)throw new Error(`No matching source directory for: ${h}`);let pe=g.reduce((F,B)=>B.sourceDir.length>F.sourceDir.length?B:F),_e=lt(pe.sourceDir,h);return P(pe.destinationDir,_e)};D.on("add",h=>{let g=z(h);f(h,g)}).on("change",h=>{let g=z(h);f(h,g)}).on("unlink",h=>{let g=z(h);u(g)}).on("error",h=>{console.error("\x1B[31mWatcher error:\x1B[0m",h)})};import*as Et from"dotenv";import{count as bt}from"drizzle-orm";import{drizzle as $s}from"drizzle-orm/postgres-js";import{join as Hs}from"path";import{relations as pt}from"drizzle-orm";import{index as he,pgTable as _t}from"drizzle-orm/pg-core";import{pgTable as ks}from"drizzle-orm/pg-core";var b=ks("core_roles",t=>({id:t.serial().primaryKey(),createdAt:t.timestamp().notNull().defaultNow(),updatedAt:t.timestamp().notNull().$onUpdate(()=>new Date),protected:t.boolean().notNull().default(!1),default:t.boolean().notNull().default(!1),root:t.boolean().notNull().default(!1),guest:t.boolean().notNull().default(!1),color:t.varchar({length:19})})).enableRLS();import{relations as ut}from"drizzle-orm";import{index as ht,pgTable as mt}from"drizzle-orm/pg-core";import{relations as fe}from"drizzle-orm";import{index as ce,pgTable as ue}from"drizzle-orm/pg-core";import{relations as Cs}from"drizzle-orm";import{index as Te,pgTable as ft}from"drizzle-orm/pg-core";var R=ft("core_languages",t=>({id:t.serial().primaryKey(),code:t.varchar({length:32}).notNull().unique(),name:t.varchar({length:255}).notNull(),timezone:t.varchar({length:255}).notNull().default("UTC"),protected:t.boolean().notNull().default(!1),default:t.boolean().notNull().default(!1),enabled:t.boolean().notNull().default(!0),createdAt:t.timestamp().notNull().defaultNow(),updatedAt:t.timestamp().notNull().$onUpdate(()=>new Date),time24:t.boolean().notNull().default(!1)}),t=>[Te("core_languages_code_idx").on(t.code),Te("core_languages_name_idx").on(t.name)]).enableRLS(),ae=ft("core_languages_words",t=>({id:t.serial().primaryKey(),languageCode:t.varchar().notNull().references(()=>R.code,{onDelete:"cascade"}),pluginCode:t.varchar({length:50}).notNull(),itemId:t.integer().notNull(),value:t.text().notNull(),tableName:t.varchar({length:255}).notNull(),variable:t.varchar({length:255}).notNull()}),t=>[Te("core_languages_words_lang_code_idx").on(t.languageCode)]).enableRLS(),_r=Cs(ae,({one:t})=>({language:t(R,{fields:[ae.languageCode],references:[R.code]})}));var p=ue("core_users",t=>({id:t.serial().primaryKey(),nameCode:t.varchar({length:255}).notNull().unique(),name:t.varchar({length:255}).notNull().unique(),email:t.varchar({length:255}).notNull().unique(),password:t.varchar(),createdAt:t.timestamp().notNull().defaultNow(),newsletter:t.boolean().notNull().default(!1),avatarColor:t.varchar({length:6}).notNull(),emailVerified:t.boolean().notNull().default(!1),roleId:t.integer().references(()=>b.id).notNull(),birthday:t.timestamp(),ipAddress:t.varchar({length:40}).notNull(),language:t.varchar({length:32}).notNull().default("en").references(()=>R.code,{onDelete:"set default"})}),t=>[ce("core_users_name_code_idx").on(t.nameCode),ce("core_users_name_idx").on(t.name),ce("core_users_email_idx").on(t.email)]).enableRLS(),Er=fe(p,({one:t,many:e})=>({group:t(b,{fields:[p.roleId],references:[b.id]}),language:t(R,{fields:[p.language],references:[R.code]}),confirm_email:t(le,{fields:[p.id],references:[le.userId]}),sso:e(ke),forgot_password:t(de,{fields:[p.id],references:[de.userId]})})),ke=ue("core_users_sso",t=>({userId:t.integer().references(()=>p.id,{onDelete:"cascade"}).notNull(),providerId:t.varchar({length:255}).notNull(),providerAccountId:t.varchar({length:255}).notNull(),createdAt:t.timestamp().notNull().defaultNow(),updatedAt:t.timestamp().notNull().$onUpdate(()=>new Date)}),t=>[ce("core_users_sso_user_id_idx").on(t.userId)]).enableRLS(),Pr=fe(ke,({one:t})=>({user:t(p,{fields:[ke.userId],references:[p.id]})})),le=ue("core_users_confirm_emails",t=>({id:t.serial().primaryKey(),userId:t.integer().references(()=>p.id,{onDelete:"cascade"}).notNull(),token:t.varchar({length:100}).notNull().unique(),createdAt:t.timestamp().notNull().defaultNow(),expires:t.timestamp().notNull()})).enableRLS(),Dr=fe(le,({one:t})=>({user:t(p,{fields:[le.userId],references:[p.id]})})),de=ue("core_users_forgot_password",t=>({id:t.serial().primaryKey(),userId:t.integer().references(()=>p.id,{onDelete:"cascade"}).notNull().unique(),token:t.varchar({length:100}).notNull().unique(),ip_address:t.varchar({length:40}).notNull(),createdAt:t.timestamp().notNull().defaultNow(),expiresAt:t.timestamp().notNull()})).enableRLS(),vr=fe(de,({one:t})=>({user:t(p,{fields:[de.userId],references:[p.id]})}));var K=mt("core_sessions",t=>({id:t.serial().primaryKey(),token:t.varchar({length:255}).notNull().unique(),userId:t.integer().notNull().references(()=>p.id,{onDelete:"cascade"}),createdAt:t.timestamp().notNull().defaultNow(),expiresAt:t.timestamp().notNull(),deviceId:t.integer().references(()=>A.id,{onDelete:"cascade"}).notNull()}),t=>[ht("core_sessions_user_id_idx").on(t.userId)]).enableRLS(),Ar=ut(K,({one:t})=>({user:t(p,{fields:[K.userId],references:[p.id]}),device:t(A,{fields:[K.deviceId],references:[A.id]})})),A=mt("core_sessions_known_devices",t=>({id:t.serial().primaryKey(),publicId:t.varchar({length:32}).notNull().unique(),ipAddress:t.varchar({length:40}).notNull(),userAgent:t.text().notNull(),lastSeen:t.timestamp().notNull().defaultNow()}),t=>[ht("core_sessions_known_devices_ip_address_idx").on(t.ipAddress)]).enableRLS(),Fr=ut(A,({one:t})=>({session:t(K,{fields:[A.id],references:[K.deviceId]})}));var G=_t("core_admin_permissions",t=>({id:t.serial().primaryKey(),roleId:t.integer().references(()=>b.id,{onDelete:"cascade"}),userId:t.integer().references(()=>p.id,{onDelete:"cascade"}),createdAt:t.timestamp().notNull().defaultNow(),updatedAt:t.timestamp().notNull().$onUpdate(()=>new Date),protected:t.boolean().notNull().default(!1)}),t=>[he("core_admin_permissions_role_id_idx").on(t.roleId),he("core_admin_permissions_user_id_idx").on(t.userId)]).enableRLS(),zr=pt(G,({one:t})=>({group:t(b,{fields:[G.roleId],references:[b.id]}),user:t(p,{fields:[G.userId],references:[p.id]})})),Ce=_t("core_admin_sessions",t=>({id:t.serial().primaryKey(),token:t.varchar({length:255}).notNull().unique(),userId:t.integer().notNull().references(()=>p.id,{onDelete:"cascade"}),createdAt:t.timestamp().notNull().defaultNow(),lastSeen:t.timestamp().notNull().defaultNow(),expiresAt:t.timestamp().notNull(),deviceId:t.integer().references(()=>A.id,{onDelete:"cascade"}).notNull()}),t=>[he("core_admin_sessions_token_idx").on(t.token),he("core_admin_sessions_user_id_idx").on(t.userId)]).enableRLS(),Mr=pt(Ce,({one:t})=>({user:t(p,{fields:[Ce.userId],references:[p.id]}),device:t(A,{fields:[Ce.deviceId],references:[A.id]})}));import{relations as Ls}from"drizzle-orm";import{index as gt,pgTable as Ws}from"drizzle-orm/pg-core";var V=Ws("core_moderators_permissions",t=>({id:t.serial().primaryKey(),roleId:t.integer().references(()=>b.id,{onDelete:"cascade"}),userId:t.integer().references(()=>p.id,{onDelete:"cascade"}),createdAt:t.timestamp().notNull().defaultNow(),updatedAt:t.timestamp().notNull().$onUpdate(()=>new Date),protected:t.boolean().notNull().default(!1)}),t=>[gt("core_moderators_permissions_role_id_idx").on(t.roleId),gt("core_moderators_permissions_user_id_idx").on(t.userId)]).enableRLS(),Kr=Ls(V,({one:t})=>({group:t(b,{fields:[V.roleId],references:[b.id]}),user:t(p,{fields:[V.userId],references:[p.id]})}));import{existsSync as yt}from"fs";import{readFile as Ms}from"fs/promises";import{join as S,relative as xt}from"path";import{join as js}from"path";import{pathToFileURL as zs}from"url";var wt=async()=>{let t=js(process.cwd(),"src","vitnode.config.ts");try{return(await import(zs(t).href)).vitNodeConfig}catch(e){console.error("Failed to load config:",e),process.exit(1)}};var me=async()=>{let e=[...(await wt()).plugins.map(a=>a.pluginId),"@vitnode/core"],s=oe(process.cwd()),i=ne(s),r=ie(i),o=process.cwd();await Promise.all(e.map(async a=>{let n=S(process.cwd(),"node_modules",a),c="";try{let _=S(n,"package.json");yt(_)&&(c=JSON.parse(await Ms(_,"utf-8")).name??"")}catch(_){console.error(`\x1B[31mError reading package.json for ${a}:\x1B[0m`,_);return}let d=a.replace(/\//g,"-").replace(/@/g,""),l=S(o,"src","app","[locale]","(main)",S("(plugins)",`(${d})`)),f=S(o,"src","app","[locale]","admin","(auth)",S("(plugins)",`(${d})`)),u=S(o,"src","locales",a),w=[{sourceDir:S(n,"src","app_admin"),destinationDir:f},{sourceDir:S(n,"src","app"),destinationDir:l},{sourceDir:S(n,"src","locales"),destinationDir:u}];for(let{sourceDir:_,destinationDir:D}of w)yt(_)&&!U(_)&&(console.log(`\x1B[36mCopying ${a}:\x1B[0m ${xt(s,_)} \u2192 ${xt(s,D)}`),at(_,D,c,r,i,s,!1))}))};import{spawn as Os}from"child_process";var q=async(t,e=[])=>new Promise((s,i)=>{let r=Os(t,e,{stdio:"inherit",shell:!0});r.on("error",o=>{i(o)}),r.on("close",o=>{o!==0?i(new Error(`Command failed with exit code ${o}`)):s(!0)})});Et.config({path:Hs(process.cwd(),"..","..",".env")});var C=$s({connection:process.env.POSTGRES_URL??"postgresql://root:root@localhost:5432/vitnode",casing:"camelCase"}),Le=async()=>{try{await q("npm",["run","drizzle-kit","up"]),await q("npm",["run","drizzle-kit","generate"])}catch(t){console.error("\x1B[31m%s\x1B[0m",t),process.exit(1)}},We=async()=>{try{await q("npm",["run","drizzle-kit","migrate"])}catch(t){console.error("\x1B[31m%s\x1B[0m",t),process.exit(1)}},Ys=async()=>{try{await q("npm",["run","drizzle-kit","push"])}catch(t){console.error("\x1B[31m%s\x1B[0m",t),process.exit(1)}},je=async()=>{await Ys();let[t]=await C.select({count:bt()}).from(b).limit(1),[e]=await C.select({count:bt()}).from(R);if(e.count===0&&await C.insert(R).values([{code:"en",name:"English (USA)",default:!0,protected:!0,timezone:"America/New_York"}]),t.count===0){let s=await C.insert(b).values([{protected:!0,guest:!0},{protected:!0,default:!0},{protected:!0,color:"hsl(122, 80%, 45%)"},{protected:!0,root:!0,color:"hsl(0, 100%, 50%)"}]).returning({id:b.id});await C.insert(ae).values([{languageCode:"en",pluginCode:"core",itemId:s[0].id,value:"Guest",tableName:"core_roles",variable:"name"},{languageCode:"en",pluginCode:"core",itemId:s[1].id,value:"Member",tableName:"core_roles",variable:"name"},{languageCode:"en",pluginCode:"core",itemId:s[2].id,value:"Moderator",tableName:"core_roles",variable:"name"},{languageCode:"en",pluginCode:"core",itemId:s[3].id,value:"Administrator",tableName:"core_roles",variable:"name"}]),await Promise.all([await C.insert(V).values({roleId:s[2].id,protected:!0}),await C.insert(G).values({roleId:s[3].id,protected:!0})])}},Pt=async({initMessage:t})=>{console.log(`${t} [1/4] Prepare plugins files...`),await me(),console.log(`${t} [2/4] Generate migrations...`),await Le(),console.log(`${t} [3/4] Run migrations...`),await We(),console.log(`
7
- ${t} [4/4] Insert initial data...`),await je(),console.log(`${t} \x1B[32mDatabase prepared successfully.\x1B[0m`),process.exit(0)};var L="\x1B[34m[VitNode]\x1B[0m",Dt=process.argv[2],ze=process.argv[3];switch(Dt){case"init":Pt({initMessage:L});break;case"migrate":await Le(),ze==="--generate"&&(console.log(`${L} \x1B[32mDatabase migrations generated successfully.\x1B[0m`),process.exit(0)),await We(),console.log(`${L} \x1B[32mDatabase migrated successfully.\x1B[0m`),process.exit(0);break;case"plugin":(ze==="--w"||ze==="--watch")&&dt({initMessage:L});break;case"prepare-plugins":await me(),console.log(`${L} \x1B[32mPlugins prepared successfully.\x1B[0m`),process.exit(0);break;case"push":je(),console.log(`${L} \x1B[32mDatabase pushed successfully.\x1B[0m`),process.exit(0);break;default:console.log(`${L} \x1B[31mCommand not found: "${Dt??""}"\x1B[0m`),process.exit(1)}
6
+ var Yt=Object.create;var Ke=Object.defineProperty;var zt=Object.getOwnPropertyDescriptor;var Kt=Object.getOwnPropertyNames;var Ut=Object.getPrototypeOf,Ht=Object.prototype.hasOwnProperty;var X=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,s)=>(typeof require<"u"?require:t)[s]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var Ue=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var qt=(e,t,s,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Kt(t))!Ht.call(e,r)&&r!==s&&Ke(e,r,{get:()=>t[r],enumerable:!(i=zt(t,r))||i.enumerable});return e};var Bt=(e,t,s)=>(s=e!=null?Yt(Ut(e)):{},qt(t||!e||!e.__esModule?Ke(s,"default",{value:e,enumerable:!0}):s,e));var He=Ue((Rr,Gt)=>{Gt.exports={name:"dotenv",version:"17.1.0",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard",pretest:"npm run lint && npm run dts-check",test:"tap run --allow-empty-coverage --disable-coverage --timeout=60000","test:coverage":"tap run --show-full-coverage --timeout=60000 --coverage-report=text --coverage-report=lcov",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},homepage:"https://github.com/motdotla/dotenv#readme",funding:"https://dotenvx.com",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@types/node":"^18.11.3",decache:"^4.6.2",sinon:"^14.0.1",standard:"^17.0.0","standard-version":"^9.5.0",tap:"^19.2.0",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}}});var Xe=Ue((Tr,k)=>{"use strict";var De=X("fs"),Z=X("path"),Jt=X("os"),Qt=X("crypto"),Xt=He(),Ne=Xt.version,qe=["\u{1F510} encrypt with dotenvx: https://dotenvx.com","\u{1F510} prevent committing .env to code: https://dotenvx.com/precommit","\u{1F510} prevent building .env in docker: https://dotenvx.com/prebuild","\u{1F6E0}\uFE0F run anywhere with `dotenvx run -- yourcommand`","\u2699\uFE0F specify custom .env file path with { path: '/custom/path/.env' }","\u2699\uFE0F enable debug logging with { debug: true }","\u2699\uFE0F override existing env vars with { override: true }","\u2699\uFE0F suppress all logs with { quiet: true }","\u2699\uFE0F write to custom object with { processEnv: myObject }","\u2699\uFE0F load multiple .env files with { path: ['.env.local', '.env'] }"];function Zt(){return qe[Math.floor(Math.random()*qe.length)]}function es(){return process.stdout.isTTY}function ts(e){return es()?`\x1B[2m${e}\x1B[0m`:e}var ss=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function rs(e){let t={},s=e.toString();s=s.replace(/\r\n?/mg,`
7
+ `);let i;for(;(i=ss.exec(s))!=null;){let r=i[1],n=i[2]||"";n=n.trim();let o=n[0];n=n.replace(/^(['"`])([\s\S]*)\1$/mg,"$2"),o==='"'&&(n=n.replace(/\\n/g,`
8
+ `),n=n.replace(/\\r/g,"\r")),t[r]=n}return t}function is(e){e=e||{};let t=Qe(e);e.path=t;let s=E.configDotenv(e);if(!s.parsed){let o=new Error(`MISSING_DATA: Cannot parse ${t} for an unknown reason`);throw o.code="MISSING_DATA",o}let i=Je(e).split(","),r=i.length,n;for(let o=0;o<r;o++)try{let a=i[o].trim(),c=os(s,a);n=E.decrypt(c.ciphertext,c.key);break}catch(a){if(o+1>=r)throw a}return E.parse(n)}function ns(e){console.error(`[dotenv@${Ne}][WARN] ${e}`)}function M(e){console.log(`[dotenv@${Ne}][DEBUG] ${e}`)}function Ge(e){console.log(`[dotenv@${Ne}] ${e}`)}function Je(e){return e&&e.DOTENV_KEY&&e.DOTENV_KEY.length>0?e.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function os(e,t){let s;try{s=new URL(t)}catch(a){if(a.code==="ERR_INVALID_URL"){let c=new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development");throw c.code="INVALID_DOTENV_KEY",c}throw a}let i=s.password;if(!i){let a=new Error("INVALID_DOTENV_KEY: Missing key part");throw a.code="INVALID_DOTENV_KEY",a}let r=s.searchParams.get("environment");if(!r){let a=new Error("INVALID_DOTENV_KEY: Missing environment part");throw a.code="INVALID_DOTENV_KEY",a}let n=`DOTENV_VAULT_${r.toUpperCase()}`,o=e.parsed[n];if(!o){let a=new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${n} in your .env.vault file.`);throw a.code="NOT_FOUND_DOTENV_ENVIRONMENT",a}return{ciphertext:o,key:i}}function Qe(e){let t=null;if(e&&e.path&&e.path.length>0)if(Array.isArray(e.path))for(let s of e.path)De.existsSync(s)&&(t=s.endsWith(".vault")?s:`${s}.vault`);else t=e.path.endsWith(".vault")?e.path:`${e.path}.vault`;else t=Z.resolve(process.cwd(),".env.vault");return De.existsSync(t)?t:null}function Be(e){return e[0]==="~"?Z.join(Jt.homedir(),e.slice(1)):e}function as(e){let t=!!(e&&e.debug),s=!!(e&&e.quiet);(t||!s)&&Ge("Loading env from encrypted .env.vault");let i=E._parseVault(e),r=process.env;return e&&e.processEnv!=null&&(r=e.processEnv),E.populate(r,i,e),{parsed:i}}function cs(e){let t=Z.resolve(process.cwd(),".env"),s="utf8",i=!!(e&&e.debug),r=!!(e&&e.quiet);e&&e.encoding?s=e.encoding:i&&M("No encoding is specified. UTF-8 is used by default");let n=[t];if(e&&e.path)if(!Array.isArray(e.path))n=[Be(e.path)];else{n=[];for(let l of e.path)n.push(Be(l))}let o,a={};for(let l of n)try{let u=E.parse(De.readFileSync(l,{encoding:s}));E.populate(a,u,e)}catch(u){i&&M(`Failed to load ${l} ${u.message}`),o=u}let c=process.env;e&&e.processEnv!=null&&(c=e.processEnv);let d=E.populate(c,a,e);if(i||!r){let l=Object.keys(d).length,u=[];for(let f of n)try{let m=Z.relative(process.cwd(),f);u.push(m)}catch(m){i&&M(`Failed to load ${f} ${m.message}`),o=m}Ge(`injecting env (${l}) from ${u.join(",")} ${ts(`(tip: ${Zt()})`)}`)}return o?{parsed:a,error:o}:{parsed:a}}function ls(e){if(Je(e).length===0)return E.configDotenv(e);let t=Qe(e);return t?E._configVault(e):(ns(`You set DOTENV_KEY but you are missing a .env.vault file at ${t}. Did you forget to build it?`),E.configDotenv(e))}function ds(e,t){let s=Buffer.from(t.slice(-64),"hex"),i=Buffer.from(e,"base64"),r=i.subarray(0,12),n=i.subarray(-16);i=i.subarray(12,-16);try{let o=Qt.createDecipheriv("aes-256-gcm",s,r);return o.setAuthTag(n),`${o.update(i)}${o.final()}`}catch(o){let a=o instanceof RangeError,c=o.message==="Invalid key length",d=o.message==="Unsupported state or unable to authenticate data";if(a||c){let l=new Error("INVALID_DOTENV_KEY: It must be 64 characters long (or more)");throw l.code="INVALID_DOTENV_KEY",l}else if(d){let l=new Error("DECRYPTION_FAILED: Please check your DOTENV_KEY");throw l.code="DECRYPTION_FAILED",l}else throw o}}function us(e,t,s={}){let i=!!(s&&s.debug),r=!!(s&&s.override),n={};if(typeof t!="object"){let o=new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");throw o.code="OBJECT_REQUIRED",o}for(let o of Object.keys(t))Object.prototype.hasOwnProperty.call(e,o)?(r===!0&&(e[o]=t[o],n[o]=t[o]),i&&M(r===!0?`"${o}" is already defined and WAS overwritten`:`"${o}" is already defined and was NOT overwritten`)):(e[o]=t[o],n[o]=t[o]);return n}var E={configDotenv:cs,_configVault:as,_parseVault:is,config:ls,decrypt:ds,parse:rs,populate:us};k.exports.configDotenv=E.configDotenv;k.exports._configVault=E._configVault;k.exports._parseVault=E._parseVault;k.exports.config=E.config;k.exports.decrypt=E.decrypt;k.exports.parse=E.parse;k.exports.populate=E.populate;k.exports=E});var Mt=Bt(Xe(),1);import{stat as Vs}from"fs";import{stat as Ys,readdir as zs}from"fs/promises";import{EventEmitter as Ks}from"events";import*as p from"path";import{stat as fs,lstat as Ze,readdir as hs,realpath as ps}from"fs/promises";import{Readable as ms}from"stream";import{resolve as et,relative as gs,join as _s,sep as ws}from"path";var x={FILE_TYPE:"files",DIR_TYPE:"directories",FILE_DIR_TYPE:"files_directories",EVERYTHING_TYPE:"all"},Pe={root:".",fileFilter:e=>!0,directoryFilter:e=>!0,type:x.FILE_TYPE,lstat:!1,depth:2147483648,alwaysStat:!1,highWaterMark:4096};Object.freeze(Pe);var it="READDIRP_RECURSIVE_ERROR",ys=new Set(["ENOENT","EPERM","EACCES","ELOOP",it]),tt=[x.DIR_TYPE,x.EVERYTHING_TYPE,x.FILE_DIR_TYPE,x.FILE_TYPE],vs=new Set([x.DIR_TYPE,x.EVERYTHING_TYPE,x.FILE_DIR_TYPE]),Es=new Set([x.EVERYTHING_TYPE,x.FILE_DIR_TYPE,x.FILE_TYPE]),bs=e=>ys.has(e.code),xs=process.platform==="win32",st=e=>!0,rt=e=>{if(e===void 0)return st;if(typeof e=="function")return e;if(typeof e=="string"){let t=e.trim();return s=>s.basename===t}if(Array.isArray(e)){let t=e.map(s=>s.trim());return s=>t.some(i=>s.basename===i)}return st},Ie=class extends ms{constructor(t={}){super({objectMode:!0,autoDestroy:!0,highWaterMark:t.highWaterMark});let s={...Pe,...t},{root:i,type:r}=s;this._fileFilter=rt(s.fileFilter),this._directoryFilter=rt(s.directoryFilter);let n=s.lstat?Ze:fs;xs?this._stat=o=>n(o,{bigint:!0}):this._stat=n,this._maxDepth=s.depth??Pe.depth,this._wantsDir=r?vs.has(r):!1,this._wantsFile=r?Es.has(r):!1,this._wantsEverything=r===x.EVERYTHING_TYPE,this._root=et(i),this._isDirent=!s.alwaysStat,this._statsProp=this._isDirent?"dirent":"stats",this._rdOptions={encoding:"utf8",withFileTypes:this._isDirent},this.parents=[this._exploreDir(i,1)],this.reading=!1,this.parent=void 0}async _read(t){if(!this.reading){this.reading=!0;try{for(;!this.destroyed&&t>0;){let s=this.parent,i=s&&s.files;if(i&&i.length>0){let{path:r,depth:n}=s,o=i.splice(0,t).map(c=>this._formatEntry(c,r)),a=await Promise.all(o);for(let c of a){if(!c)continue;if(this.destroyed)return;let d=await this._getEntryType(c);d==="directory"&&this._directoryFilter(c)?(n<=this._maxDepth&&this.parents.push(this._exploreDir(c.fullPath,n+1)),this._wantsDir&&(this.push(c),t--)):(d==="file"||this._includeAsFile(c))&&this._fileFilter(c)&&this._wantsFile&&(this.push(c),t--)}}else{let r=this.parents.pop();if(!r){this.push(null);break}if(this.parent=await r,this.destroyed)return}}}catch(s){this.destroy(s)}finally{this.reading=!1}}}async _exploreDir(t,s){let i;try{i=await hs(t,this._rdOptions)}catch(r){this._onError(r)}return{files:i,depth:s,path:t}}async _formatEntry(t,s){let i,r=this._isDirent?t.name:t;try{let n=et(_s(s,r));i={path:gs(this._root,n),fullPath:n,basename:r},i[this._statsProp]=this._isDirent?t:await this._stat(n)}catch(n){this._onError(n);return}return i}_onError(t){bs(t)&&!this.destroyed?this.emit("warn",t):this.destroy(t)}async _getEntryType(t){if(!t&&this._statsProp in t)return"";let s=t[this._statsProp];if(s.isFile())return"file";if(s.isDirectory())return"directory";if(s&&s.isSymbolicLink()){let i=t.fullPath;try{let r=await ps(i),n=await Ze(r);if(n.isFile())return"file";if(n.isDirectory()){let o=r.length;if(i.startsWith(r)&&i.substr(o,1)===ws){let a=new Error(`Circular symlink detected: "${i}" points to "${r}"`);return a.code=it,this._onError(a)}return"directory"}}catch(r){return this._onError(r),""}}}_includeAsFile(t){let s=t&&t[this._statsProp];return s&&this._wantsEverything&&!s.isDirectory()}};function nt(e,t={}){let s=t.entryType||t.type;if(s==="both"&&(s=x.FILE_DIR_TYPE),s&&(t.type=s),e){if(typeof e!="string")throw new TypeError("readdirp: root argument must be a string. Usage: readdirp(root, options)");if(s&&!tt.includes(s))throw new Error(`readdirp: Invalid type passed. Use one of ${tt.join(", ")}`)}else throw new Error("readdirp: root argument is required. Usage: readdirp(root, options)");return t.root=e,new Ie(t)}import{watchFile as Ds,unwatchFile as ot,watch as Ns}from"fs";import{open as Ps,stat as ct,lstat as Is,realpath as Re}from"fs/promises";import*as y from"path";import{type as Rs}from"os";var Ts="data",ke="end",lt="close",ie=()=>{};var ne=process.platform,Se=ne==="win32",As=ne==="darwin",ks=ne==="linux",Ss=ne==="freebsd",dt=Rs()==="OS400",v={ALL:"all",READY:"ready",ADD:"add",CHANGE:"change",ADD_DIR:"addDir",UNLINK:"unlink",UNLINK_DIR:"unlinkDir",RAW:"raw",ERROR:"error"},P=v,Fs="watch",Cs={lstat:Is,stat:ct},C="listeners",ee="errHandlers",j="rawEmitters",Ls=[C,ee,j],Os=new Set(["3dm","3ds","3g2","3gp","7z","a","aac","adp","afdesign","afphoto","afpub","ai","aif","aiff","alz","ape","apk","appimage","ar","arj","asf","au","avi","bak","baml","bh","bin","bk","bmp","btif","bz2","bzip2","cab","caf","cgm","class","cmx","cpio","cr2","cur","dat","dcm","deb","dex","djvu","dll","dmg","dng","doc","docm","docx","dot","dotm","dra","DS_Store","dsk","dts","dtshd","dvb","dwg","dxf","ecelp4800","ecelp7470","ecelp9600","egg","eol","eot","epub","exe","f4v","fbs","fh","fla","flac","flatpak","fli","flv","fpx","fst","fvt","g3","gh","gif","graffle","gz","gzip","h261","h263","h264","icns","ico","ief","img","ipa","iso","jar","jpeg","jpg","jpgv","jpm","jxr","key","ktx","lha","lib","lvp","lz","lzh","lzma","lzo","m3u","m4a","m4v","mar","mdi","mht","mid","midi","mj2","mka","mkv","mmr","mng","mobi","mov","movie","mp3","mp4","mp4a","mpeg","mpg","mpga","mxu","nef","npx","numbers","nupkg","o","odp","ods","odt","oga","ogg","ogv","otf","ott","pages","pbm","pcx","pdb","pdf","pea","pgm","pic","png","pnm","pot","potm","potx","ppa","ppam","ppm","pps","ppsm","ppsx","ppt","pptm","pptx","psd","pya","pyc","pyo","pyv","qt","rar","ras","raw","resources","rgb","rip","rlc","rmf","rmvb","rpm","rtf","rz","s3m","s7z","scpt","sgi","shar","snap","sil","sketch","slk","smv","snk","so","stl","suo","sub","swf","tar","tbz","tbz2","tga","tgz","thmx","tif","tiff","tlz","ttc","ttf","txz","udf","uvh","uvi","uvm","uvp","uvs","uvu","viv","vob","war","wav","wax","wbmp","wdp","weba","webm","webp","whl","wim","wm","wma","wmv","wmx","woff","woff2","wrm","wvx","xbm","xif","xla","xlam","xls","xlsb","xlsm","xlsx","xlt","xltm","xltx","xm","xmind","xpi","xpm","xwd","xz","z","zip","zipx"]),js=e=>Os.has(y.extname(e).slice(1).toLowerCase()),Ae=(e,t)=>{e instanceof Set?e.forEach(t):t(e)},V=(e,t,s)=>{let i=e[t];i instanceof Set||(e[t]=i=new Set([i])),i.add(s)},$s=e=>t=>{let s=e[t];s instanceof Set?s.clear():delete e[t]},Y=(e,t,s)=>{let i=e[t];i instanceof Set?i.delete(s):i===s&&delete e[t]},ut=e=>e instanceof Set?e.size===0:!e,te=new Map;function at(e,t,s,i,r){let n=(o,a)=>{s(e),r(o,a,{watchedPath:e}),a&&e!==a&&se(y.resolve(e,a),C,y.join(e,a))};try{return Ns(e,{persistent:t.persistent},n)}catch(o){i(o);return}}var se=(e,t,s,i,r)=>{let n=te.get(e);n&&Ae(n[t],o=>{o(s,i,r)})},Ws=(e,t,s,i)=>{let{listener:r,errHandler:n,rawEmitter:o}=i,a=te.get(t),c;if(!s.persistent)return c=at(e,s,r,n,o),c?c.close.bind(c):void 0;if(a)V(a,C,r),V(a,ee,n),V(a,j,o);else{if(c=at(e,s,se.bind(null,t,C),n,se.bind(null,t,j)),!c)return;c.on(P.ERROR,async d=>{let l=se.bind(null,t,ee);if(a&&(a.watcherUnusable=!0),Se&&d.code==="EPERM")try{await(await Ps(e,"r")).close(),l(d)}catch{}else l(d)}),a={listeners:r,errHandlers:n,rawEmitters:o,watcher:c},te.set(t,a)}return()=>{Y(a,C,r),Y(a,ee,n),Y(a,j,o),ut(a.listeners)&&(a.watcher.close(),te.delete(t),Ls.forEach($s(a)),a.watcher=void 0,Object.freeze(a))}},Te=new Map,Ms=(e,t,s,i)=>{let{listener:r,rawEmitter:n}=i,o=Te.get(t),a=o&&o.options;return a&&(a.persistent<s.persistent||a.interval>s.interval)&&(ot(t),o=void 0),o?(V(o,C,r),V(o,j,n)):(o={listeners:r,rawEmitters:n,options:s,watcher:Ds(t,s,(c,d)=>{Ae(o.rawEmitters,u=>{u(P.CHANGE,t,{curr:c,prev:d})});let l=c.mtimeMs;(c.size!==d.size||l>d.mtimeMs||l===0)&&Ae(o.listeners,u=>u(e,c))})},Te.set(t,o)),()=>{Y(o,C,r),Y(o,j,n),ut(o.listeners)&&(Te.delete(t),ot(t),o.options=o.watcher=void 0,Object.freeze(o))}},re=class{constructor(t){this.fsw=t,this._boundHandleError=s=>t._handleError(s)}_watchWithNodeFs(t,s){let i=this.fsw.options,r=y.dirname(t),n=y.basename(t);this.fsw._getWatchedDir(r).add(n);let a=y.resolve(t),c={persistent:i.persistent};s||(s=ie);let d;if(i.usePolling){let l=i.interval!==i.binaryInterval;c.interval=l&&js(n)?i.binaryInterval:i.interval,d=Ms(t,a,c,{listener:s,rawEmitter:this.fsw._emitRaw})}else d=Ws(t,a,c,{listener:s,errHandler:this._boundHandleError,rawEmitter:this.fsw._emitRaw});return d}_handleFile(t,s,i){if(this.fsw.closed)return;let r=y.dirname(t),n=y.basename(t),o=this.fsw._getWatchedDir(r),a=s;if(o.has(n))return;let c=async(l,u)=>{if(this.fsw._throttle(Fs,t,5)){if(!u||u.mtimeMs===0)try{let f=await ct(t);if(this.fsw.closed)return;let m=f.atimeMs,_=f.mtimeMs;if((!m||m<=_||_!==a.mtimeMs)&&this.fsw._emit(P.CHANGE,t,f),(As||ks||Ss)&&a.ino!==f.ino){this.fsw._closeFile(l),a=f;let N=this._watchWithNodeFs(t,c);N&&this.fsw._addPathCloser(l,N)}else a=f}catch{this.fsw._remove(r,n)}else if(o.has(n)){let f=u.atimeMs,m=u.mtimeMs;(!f||f<=m||m!==a.mtimeMs)&&this.fsw._emit(P.CHANGE,t,u),a=u}}},d=this._watchWithNodeFs(t,c);if(!(i&&this.fsw.options.ignoreInitial)&&this.fsw._isntIgnored(t)){if(!this.fsw._throttle(P.ADD,t,0))return;this.fsw._emit(P.ADD,t,s)}return d}async _handleSymlink(t,s,i,r){if(this.fsw.closed)return;let n=t.fullPath,o=this.fsw._getWatchedDir(s);if(!this.fsw.options.followSymlinks){this.fsw._incrReadyCount();let a;try{a=await Re(i)}catch{return this.fsw._emitReady(),!0}return this.fsw.closed?void 0:(o.has(r)?this.fsw._symlinkPaths.get(n)!==a&&(this.fsw._symlinkPaths.set(n,a),this.fsw._emit(P.CHANGE,i,t.stats)):(o.add(r),this.fsw._symlinkPaths.set(n,a),this.fsw._emit(P.ADD,i,t.stats)),this.fsw._emitReady(),!0)}if(this.fsw._symlinkPaths.has(n))return!0;this.fsw._symlinkPaths.set(n,!0)}_handleRead(t,s,i,r,n,o,a){if(t=y.join(t,""),a=this.fsw._throttle("readdir",t,1e3),!a)return;let c=this.fsw._getWatchedDir(i.path),d=new Set,l=this.fsw._readdirp(t,{fileFilter:u=>i.filterPath(u),directoryFilter:u=>i.filterDir(u)});if(l)return l.on(Ts,async u=>{if(this.fsw.closed){l=void 0;return}let f=u.path,m=y.join(t,f);if(d.add(f),!(u.stats.isSymbolicLink()&&await this._handleSymlink(u,t,m,f))){if(this.fsw.closed){l=void 0;return}(f===r||!r&&!c.has(f))&&(this.fsw._incrReadyCount(),m=y.join(n,y.relative(n,m)),this._addToNodeFs(m,s,i,o+1))}}).on(P.ERROR,this._boundHandleError),new Promise((u,f)=>{if(!l)return f();l.once(ke,()=>{if(this.fsw.closed){l=void 0;return}let m=a?a.clear():!1;u(void 0),c.getChildren().filter(_=>_!==t&&!d.has(_)).forEach(_=>{this.fsw._remove(t,_)}),l=void 0,m&&this._handleRead(t,!1,i,r,n,o,a)})})}async _handleDir(t,s,i,r,n,o,a){let c=this.fsw._getWatchedDir(y.dirname(t)),d=c.has(y.basename(t));!(i&&this.fsw.options.ignoreInitial)&&!n&&!d&&this.fsw._emit(P.ADD_DIR,t,s),c.add(y.basename(t)),this.fsw._getWatchedDir(t);let l,u,f=this.fsw.options.depth;if((f==null||r<=f)&&!this.fsw._symlinkPaths.has(a)){if(!n&&(await this._handleRead(t,i,o,n,t,r,l),this.fsw.closed))return;u=this._watchWithNodeFs(t,(m,_)=>{_&&_.mtimeMs===0||this._handleRead(m,!1,o,n,t,r,l)})}return u}async _addToNodeFs(t,s,i,r,n){let o=this.fsw._emitReady;if(this.fsw._isIgnored(t)||this.fsw.closed)return o(),!1;let a=this.fsw._getWatchHelpers(t);i&&(a.filterPath=c=>i.filterPath(c),a.filterDir=c=>i.filterDir(c));try{let c=await Cs[a.statMethod](a.watchPath);if(this.fsw.closed)return;if(this.fsw._isIgnored(a.watchPath,c))return o(),!1;let d=this.fsw.options.followSymlinks,l;if(c.isDirectory()){let u=y.resolve(t),f=d?await Re(t):t;if(this.fsw.closed||(l=await this._handleDir(a.watchPath,c,s,r,n,a,f),this.fsw.closed))return;u!==f&&f!==void 0&&this.fsw._symlinkPaths.set(u,f)}else if(c.isSymbolicLink()){let u=d?await Re(t):t;if(this.fsw.closed)return;let f=y.dirname(a.watchPath);if(this.fsw._getWatchedDir(f).add(a.watchPath),this.fsw._emit(P.ADD,a.watchPath,c),l=await this._handleDir(f,c,s,r,t,a,u),this.fsw.closed)return;u!==void 0&&this.fsw._symlinkPaths.set(y.resolve(t),u)}else l=this._handleFile(a.watchPath,c,s);return o(),l&&this.fsw._addPathCloser(t,l),!1}catch(c){if(this.fsw._handleError(c))return o(),t}}};var Fe="/",Us="//",_t=".",Hs="..",qs="string",Bs=/\\/g,ft=/\/\//,Gs=/\..*\.(sw[px])$|~$|\.subl.*\.tmp/,Js=/^\.[/\\]/;function oe(e){return Array.isArray(e)?e:[e]}var Ce=e=>typeof e=="object"&&e!==null&&!(e instanceof RegExp);function Qs(e){return typeof e=="function"?e:typeof e=="string"?t=>e===t:e instanceof RegExp?t=>e.test(t):typeof e=="object"&&e!==null?t=>{if(e.path===t)return!0;if(e.recursive){let s=p.relative(e.path,t);return s?!s.startsWith("..")&&!p.isAbsolute(s):!1}return!1}:()=>!1}function Xs(e){if(typeof e!="string")throw new Error("string expected");e=p.normalize(e),e=e.replace(/\\/g,"/");let t=!1;e.startsWith("//")&&(t=!0);let s=/\/\//;for(;e.match(s);)e=e.replace(s,"/");return t&&(e="/"+e),e}function ht(e,t,s){let i=Xs(t);for(let r=0;r<e.length;r++){let n=e[r];if(n(i,s))return!0}return!1}function Zs(e,t){if(e==null)throw new TypeError("anymatch: specify first argument");let i=oe(e).map(r=>Qs(r));return t==null?(r,n)=>ht(i,r,n):ht(i,t)}var pt=e=>{let t=oe(e).flat();if(!t.every(s=>typeof s===qs))throw new TypeError(`Non-string provided as watch path: ${t}`);return t.map(wt)},mt=e=>{let t=e.replace(Bs,Fe),s=!1;for(t.startsWith(Us)&&(s=!0);t.match(ft);)t=t.replace(ft,Fe);return s&&(t=Fe+t),t},wt=e=>mt(p.normalize(mt(e))),gt=(e="")=>t=>typeof t=="string"?wt(p.isAbsolute(t)?t:p.join(e,t)):t,er=(e,t)=>p.isAbsolute(e)?e:p.join(t,e),tr=Object.freeze(new Set),Le=class{constructor(t,s){this.path=t,this._removeWatcher=s,this.items=new Set}add(t){let{items:s}=this;s&&t!==_t&&t!==Hs&&s.add(t)}async remove(t){let{items:s}=this;if(!s||(s.delete(t),s.size>0))return;let i=this.path;try{await zs(i)}catch{this._removeWatcher&&this._removeWatcher(p.dirname(i),p.basename(i))}}has(t){let{items:s}=this;if(s)return s.has(t)}getChildren(){let{items:t}=this;return t?[...t.values()]:[]}dispose(){this.items.clear(),this.path="",this._removeWatcher=ie,this.items=tr,Object.freeze(this)}},sr="stat",rr="lstat",Oe=class{constructor(t,s,i){this.fsw=i;let r=t;this.path=t=t.replace(Js,""),this.watchPath=r,this.fullWatchPath=p.resolve(r),this.dirParts=[],this.dirParts.forEach(n=>{n.length>1&&n.pop()}),this.followSymlinks=s,this.statMethod=s?sr:rr}entryPath(t){return p.join(this.watchPath,p.relative(this.watchPath,t.fullPath))}filterPath(t){let{stats:s}=t;if(s&&s.isSymbolicLink())return this.filterDir(t);let i=this.entryPath(t);return this.fsw._isntIgnored(i,s)&&this.fsw._hasReadPermissions(s)}filterDir(t){return this.fsw._isntIgnored(this.entryPath(t),t.stats)}},ae=class extends Ks{constructor(t={}){super(),this.closed=!1,this._closers=new Map,this._ignoredPaths=new Set,this._throttled=new Map,this._streams=new Set,this._symlinkPaths=new Map,this._watched=new Map,this._pendingWrites=new Map,this._pendingUnlinks=new Map,this._readyCount=0,this._readyEmitted=!1;let s=t.awaitWriteFinish,i={stabilityThreshold:2e3,pollInterval:100},r={persistent:!0,ignoreInitial:!1,ignorePermissionErrors:!1,interval:100,binaryInterval:300,followSymlinks:!0,usePolling:!1,atomic:!0,...t,ignored:t.ignored?oe(t.ignored):oe([]),awaitWriteFinish:s===!0?i:typeof s=="object"?{...i,...s}:!1};dt&&(r.usePolling=!0),r.atomic===void 0&&(r.atomic=!r.usePolling);let n=process.env.CHOKIDAR_USEPOLLING;if(n!==void 0){let c=n.toLowerCase();c==="false"||c==="0"?r.usePolling=!1:c==="true"||c==="1"?r.usePolling=!0:r.usePolling=!!c}let o=process.env.CHOKIDAR_INTERVAL;o&&(r.interval=Number.parseInt(o,10));let a=0;this._emitReady=()=>{a++,a>=this._readyCount&&(this._emitReady=ie,this._readyEmitted=!0,process.nextTick(()=>this.emit(v.READY)))},this._emitRaw=(...c)=>this.emit(v.RAW,...c),this._boundRemove=this._remove.bind(this),this.options=r,this._nodeFsHandler=new re(this),Object.freeze(r)}_addIgnoredPath(t){if(Ce(t)){for(let s of this._ignoredPaths)if(Ce(s)&&s.path===t.path&&s.recursive===t.recursive)return}this._ignoredPaths.add(t)}_removeIgnoredPath(t){if(this._ignoredPaths.delete(t),typeof t=="string")for(let s of this._ignoredPaths)Ce(s)&&s.path===t&&this._ignoredPaths.delete(s)}add(t,s,i){let{cwd:r}=this.options;this.closed=!1,this._closePromise=void 0;let n=pt(t);return r&&(n=n.map(o=>er(o,r))),n.forEach(o=>{this._removeIgnoredPath(o)}),this._userIgnored=void 0,this._readyCount||(this._readyCount=0),this._readyCount+=n.length,Promise.all(n.map(async o=>{let a=await this._nodeFsHandler._addToNodeFs(o,!i,void 0,0,s);return a&&this._emitReady(),a})).then(o=>{this.closed||o.forEach(a=>{a&&this.add(p.dirname(a),p.basename(s||a))})}),this}unwatch(t){if(this.closed)return this;let s=pt(t),{cwd:i}=this.options;return s.forEach(r=>{!p.isAbsolute(r)&&!this._closers.has(r)&&(i&&(r=p.join(i,r)),r=p.resolve(r)),this._closePath(r),this._addIgnoredPath(r),this._watched.has(r)&&this._addIgnoredPath({path:r,recursive:!0}),this._userIgnored=void 0}),this}close(){if(this._closePromise)return this._closePromise;this.closed=!0,this.removeAllListeners();let t=[];return this._closers.forEach(s=>s.forEach(i=>{let r=i();r instanceof Promise&&t.push(r)})),this._streams.forEach(s=>s.destroy()),this._userIgnored=void 0,this._readyCount=0,this._readyEmitted=!1,this._watched.forEach(s=>s.dispose()),this._closers.clear(),this._watched.clear(),this._streams.clear(),this._symlinkPaths.clear(),this._throttled.clear(),this._closePromise=t.length?Promise.all(t).then(()=>{}):Promise.resolve(),this._closePromise}getWatched(){let t={};return this._watched.forEach((s,i)=>{let n=(this.options.cwd?p.relative(this.options.cwd,i):i)||_t;t[n]=s.getChildren().sort()}),t}emitWithAll(t,s){this.emit(t,...s),t!==v.ERROR&&this.emit(v.ALL,t,...s)}async _emit(t,s,i){if(this.closed)return;let r=this.options;Se&&(s=p.normalize(s)),r.cwd&&(s=p.relative(r.cwd,s));let n=[s];i!=null&&n.push(i);let o=r.awaitWriteFinish,a;if(o&&(a=this._pendingWrites.get(s)))return a.lastChange=new Date,this;if(r.atomic){if(t===v.UNLINK)return this._pendingUnlinks.set(s,[t,...n]),setTimeout(()=>{this._pendingUnlinks.forEach((c,d)=>{this.emit(...c),this.emit(v.ALL,...c),this._pendingUnlinks.delete(d)})},typeof r.atomic=="number"?r.atomic:100),this;t===v.ADD&&this._pendingUnlinks.has(s)&&(t=v.CHANGE,this._pendingUnlinks.delete(s))}if(o&&(t===v.ADD||t===v.CHANGE)&&this._readyEmitted){let c=(d,l)=>{d?(t=v.ERROR,n[0]=d,this.emitWithAll(t,n)):l&&(n.length>1?n[1]=l:n.push(l),this.emitWithAll(t,n))};return this._awaitWriteFinish(s,o.stabilityThreshold,t,c),this}if(t===v.CHANGE&&!this._throttle(v.CHANGE,s,50))return this;if(r.alwaysStat&&i===void 0&&(t===v.ADD||t===v.ADD_DIR||t===v.CHANGE)){let c=r.cwd?p.join(r.cwd,s):s,d;try{d=await Ys(c)}catch{}if(!d||this.closed)return;n.push(d)}return this.emitWithAll(t,n),this}_handleError(t){let s=t&&t.code;return t&&s!=="ENOENT"&&s!=="ENOTDIR"&&(!this.options.ignorePermissionErrors||s!=="EPERM"&&s!=="EACCES")&&this.emit(v.ERROR,t),t||this.closed}_throttle(t,s,i){this._throttled.has(t)||this._throttled.set(t,new Map);let r=this._throttled.get(t);if(!r)throw new Error("invalid throttle");let n=r.get(s);if(n)return n.count++,!1;let o,a=()=>{let d=r.get(s),l=d?d.count:0;return r.delete(s),clearTimeout(o),d&&clearTimeout(d.timeoutObject),l};o=setTimeout(a,i);let c={timeoutObject:o,clear:a,count:0};return r.set(s,c),c}_incrReadyCount(){return this._readyCount++}_awaitWriteFinish(t,s,i,r){let n=this.options.awaitWriteFinish;if(typeof n!="object")return;let o=n.pollInterval,a,c=t;this.options.cwd&&!p.isAbsolute(t)&&(c=p.join(this.options.cwd,t));let d=new Date,l=this._pendingWrites;function u(f){Vs(c,(m,_)=>{if(m||!l.has(t)){m&&m.code!=="ENOENT"&&r(m);return}let N=Number(new Date);f&&_.size!==f.size&&(l.get(t).lastChange=N);let W=l.get(t);N-W.lastChange>=s?(l.delete(t),r(void 0,_)):a=setTimeout(u,o,_)})}l.has(t)||(l.set(t,{lastChange:d,cancelWait:()=>(l.delete(t),clearTimeout(a),i)}),a=setTimeout(u,o))}_isIgnored(t,s){if(this.options.atomic&&Gs.test(t))return!0;if(!this._userIgnored){let{cwd:i}=this.options,n=(this.options.ignored||[]).map(gt(i)),a=[...[...this._ignoredPaths].map(gt(i)),...n];this._userIgnored=Zs(a,void 0)}return this._userIgnored(t,s)}_isntIgnored(t,s){return!this._isIgnored(t,s)}_getWatchHelpers(t){return new Oe(t,this.options.followSymlinks,this)}_getWatchedDir(t){let s=p.resolve(t);return this._watched.has(s)||this._watched.set(s,new Le(s,this._boundRemove)),this._watched.get(s)}_hasReadPermissions(t){return this.options.ignorePermissionErrors?!0:!!(Number(t.mode)&256)}_remove(t,s,i){let r=p.join(t,s),n=p.resolve(r);if(i=i??(this._watched.has(r)||this._watched.has(n)),!this._throttle("remove",r,100))return;!i&&this._watched.size===1&&this.add(t,s,!0),this._getWatchedDir(r).getChildren().forEach(f=>this._remove(r,f));let c=this._getWatchedDir(t),d=c.has(s);c.remove(s),this._symlinkPaths.has(n)&&this._symlinkPaths.delete(n);let l=r;if(this.options.cwd&&(l=p.relative(this.options.cwd,r)),this.options.awaitWriteFinish&&this._pendingWrites.has(l)&&this._pendingWrites.get(l).cancelWait()===v.ADD)return;this._watched.delete(r),this._watched.delete(n);let u=i?v.UNLINK_DIR:v.UNLINK;d&&!this._isIgnored(r)&&this._emit(u,r),this._closePath(r)}_closePath(t){this._closeFile(t);let s=p.dirname(t);this._getWatchedDir(s).remove(p.basename(t))}_closeFile(t){let s=this._closers.get(t);s&&(s.forEach(i=>i()),this._closers.delete(t))}_addPathCloser(t,s){if(!s)return;let i=this._closers.get(t);i||(i=[],this._closers.set(t,i)),i.push(s)}_readdirp(t,s){if(this.closed)return;let i={type:v.ALL,alwaysStat:!0,lstat:!0,...s,depth:0},r=nt(t,i);return this._streams.add(r),r.once(lt,()=>{r=void 0}),r.once(ke,()=>{r&&(this._streams.delete(r),r=void 0)}),r}};function ir(e,t={}){let s=new ae(t);return s.add(e),s}var yt={watch:ir,FSWatcher:ae};import{existsSync as L,mkdirSync as gr,readFileSync as _r,unlinkSync as wr}from"fs";import{basename as bt,join as D,relative as xt}from"path";import{copyFileSync as nr,existsSync as R,mkdirSync as or,readdirSync as $e,readFileSync as ar,writeFileSync as cr}from"fs";import{basename as vt,dirname as z,extname as lr,join as I,normalize as dr,relative as $,sep as ur}from"path";var fr=/import\s+(?:(?:{[^}]*})|(?:[^{}\s,]*))?\s*(?:,\s*(?:{[^}]*}))?\s*from\s+['"]([./]+[^'"]*)['"]/g,hr=/import\s+(?:(?:{[^}]*})|(?:[^{}\s,]*))?\s*(?:,\s*(?:{[^}]*}))?\s*from\s+['"](@\/[^'"]*)['"]/g,pr=/import\s*\(\s*['"](@\/[^'"]*)['"]\s*\)/g,ce=/\.(js|jsx|ts|tsx)$/,je=/^page\.(tsx|ts|jsx|js)$/i,K=(e,t)=>{let i=$(t,e).split(ur);i.pop();let r=i.filter(n=>!n.startsWith("("));return dr(r.join("/"))},le=e=>{let t=new Map,s=i=>{if(R(i))for(let r of $e(i,{withFileTypes:!0})){let n=I(i,r.name);if(r.isDirectory()){s(n);continue}if(je.test(r.name)){let o=K(n,e);t.set(o,n)}}};return s(e),t},mr=(e,t)=>{let s=e.replace(fr,(i,r)=>{if(r.startsWith(".")){let o=r.replace(ce,"").replace(/^(?:\.\.\/)+/,"");return i.replace(r,`${t}/${o}`)}return i});return s=s.replace(hr,(i,r)=>{let n=r.replace(/^@\//,"").replace(ce,"");return i.replace(r,`${t}/${n}`)}),s=s.replace(pr,(i,r)=>{let n=r.replace(/^@\//,"").replace(ce,"");return i.replace(r,`${t}/${n}`)}),s=s.replace(/dynamic\s*\(\s*\(\s*=>\s*import\s*\(\s*['"](@\/[^'"]*)['"]\s*\)\s*\)\s*\)/g,(i,r)=>{let n=r.replace(/^@\//,"").replace(ce,"");return i.replace(r,`${t}/${n}`)}),s};function de(e){let t=e;for(;t!==z(t);){if(R(I(t,"turbo.json"))||R(I(t,".git")))return t;t=z(t)}let s=I(e,"package.json");if(R(s))return z(s);throw new Error("\u274C Could not locate project root")}function ue(e){let t=I(e,"src","app","[locale]");if(R(t))return t;let i=(n=>{let o=[];if(!R(n))return o;let a=(c,d=0)=>{if(!(d>4))try{let l=$e(c,{withFileTypes:!0});for(let u of l){if(!u.isDirectory())continue;let f=I(c,u.name);if(u.name==="[locale]"&&z(f).endsWith(I("src","app"))){o.push(f);continue}a(f,d+1)}}catch{}};return a(n),o})(e);return i.length>0?i[0]:I(e,"apps","docs","src","app","[locale]")}var U=e=>{let t=[];if(!R(e))return t;let s=$e(e,{withFileTypes:!0});for(let i of s){let r=I(e,i.name);i.isDirectory()?t.push(...U(r)):t.push(r)}return t},H=e=>R(e)?U(e).length===0:!0,We=(e,t,s,i,r,n,o=!0)=>{let a=vt(e);if(je.test(a)){let c=K(t,r),d=i.get(c);if(d&&d!==t){o&&console.log(`\x1B[31mSkipped duplicate page:\x1B[0m ${$(n,t)} (collides with ${$(n,d)})`);return}}try{let c=z(t);R(c)||or(c,{recursive:!0});let d=lr(e);if(s&&[".js",".jsx",".ts",".tsx"].includes(d)){let l=ar(e,"utf-8"),u=mr(l,s);cr(t,u)}else nr(e,t);if(o){let l=e.indexOf(I("src","app")),u=l!==-1?e.substring(l):e.startsWith(n)?$(n,e):e,f=t.startsWith(n)?$(n,t):t;console.log(`\x1B[32mCopied:\x1B[0m ${u} \u2192 ${f}`)}if(je.test(vt(t))){let l=K(t,r);i.set(l,t)}}catch(c){console.error(`\x1B[31mError copying file:\x1B[0m ${e}`,c)}},Et=(e,t,s,i,r,n,o=!0)=>{if(!R(e)||H(e))return;let a=U(e);for(let c of a){let d=$(e,c),l=I(t,d);We(c,l,s,i,r,n,o)}};var Dt=({initMessage:e})=>{let t=process.cwd(),s=de(t),i=ue(s),r=le(i),n=bt(t);try{let h=D(t,"package.json");L(h)&&(n=JSON.parse(_r(h,"utf-8")).name??"")}catch(h){console.error("\x1B[31mError reading package.json:\x1B[0m",h);return}let o=n.replace(/\//g,"-").replace(/@/g,""),a=D(s,"apps","docs","src","app","[locale]","(main)",D("(plugins)",`(${o})`)),c=D(s,"apps","docs","src","app","[locale]","admin","(auth)",D("(plugins)",`(${o})`)),d=D(s,"apps","docs","src","locales",n),l=[{sourceDir:D(t,"src","app_admin"),destinationDir:c},{sourceDir:D(t,"src","app"),destinationDir:a},{sourceDir:D(t,"src","locales"),destinationDir:d}];for(let{sourceDir:h,destinationDir:w}of l)L(h)&&!H(h)&&!L(w)&&gr(w,{recursive:!0});let u=(h,w)=>{We(h,w,n,r,i,s)},f=h=>{try{if(L(h)&&(wr(h),console.log(`\x1B[33mRemoved:\x1B[0m ${h}`),/^page\.(tsx|ts|jsx|js)$/i.test(bt(h)))){let w=K(h,i);r.get(w)===h&&r.delete(w)}}catch(w){console.error(`\x1B[31mError removing file:\x1B[0m ${h}`,w)}},m=(h,w)=>{if(!L(w)||w.includes(D("src","locales")))return;let xe=U(w);for(let F of xe){let Q=xt(w,F),Vt=D(h,Q);L(Vt)||f(F)}};for(let{sourceDir:h,destinationDir:w}of l)m(h,w);console.log(`${e} \x1B[34mWatching for changes in plugins...\x1B[0m`);let _=l.map(h=>h.sourceDir).filter(h=>L(h)),N=yt.watch(_,{ignoreInitial:!1,persistent:!0}),W=h=>{let w=l.filter(({sourceDir:F})=>h.startsWith(F));if(w.length===0)throw new Error(`No matching source directory for: ${h}`);let be=w.reduce((F,Q)=>Q.sourceDir.length>F.sourceDir.length?Q:F),xe=xt(be.sourceDir,h);return D(be.destinationDir,xe)};N.on("add",h=>{let w=W(h);u(h,w)}).on("change",h=>{let w=W(h);u(h,w)}).on("unlink",h=>{let w=W(h);f(w)}).on("error",h=>{console.error("\x1B[31mWatcher error:\x1B[0m",h)})};import{count as Ct}from"drizzle-orm";import{relations as Tt}from"drizzle-orm";import{index as we,pgTable as At}from"drizzle-orm/pg-core";import{pgTable as yr}from"drizzle-orm/pg-core";var b=yr("core_roles",e=>({id:e.serial().primaryKey(),createdAt:e.timestamp().notNull().defaultNow(),updatedAt:e.timestamp().notNull().$onUpdate(()=>new Date),protected:e.boolean().notNull().default(!1),default:e.boolean().notNull().default(!1),root:e.boolean().notNull().default(!1),guest:e.boolean().notNull().default(!1),color:e.varchar({length:19})})).enableRLS();import{relations as Pt}from"drizzle-orm";import{index as It,pgTable as Rt}from"drizzle-orm/pg-core";import{relations as ge}from"drizzle-orm";import{index as he,pgTable as _e}from"drizzle-orm/pg-core";import{relations as vr}from"drizzle-orm";import{index as Me,pgTable as Nt}from"drizzle-orm/pg-core";var T=Nt("core_languages",e=>({id:e.serial().primaryKey(),code:e.varchar({length:32}).notNull().unique(),name:e.varchar({length:255}).notNull(),timezone:e.varchar({length:255}).notNull().default("UTC"),protected:e.boolean().notNull().default(!1),default:e.boolean().notNull().default(!1),enabled:e.boolean().notNull().default(!0),createdAt:e.timestamp().notNull().defaultNow(),updatedAt:e.timestamp().notNull().$onUpdate(()=>new Date),time24:e.boolean().notNull().default(!1)}),e=>[Me("core_languages_code_idx").on(e.code),Me("core_languages_name_idx").on(e.name)]).enableRLS(),fe=Nt("core_languages_words",e=>({id:e.serial().primaryKey(),languageCode:e.varchar().notNull().references(()=>T.code,{onDelete:"cascade"}),pluginCode:e.varchar({length:50}).notNull(),itemId:e.integer().notNull(),value:e.text().notNull(),tableName:e.varchar({length:255}).notNull(),variable:e.varchar({length:255}).notNull()}),e=>[Me("core_languages_words_lang_code_idx").on(e.languageCode)]).enableRLS(),si=vr(fe,({one:e})=>({language:e(T,{fields:[fe.languageCode],references:[T.code]})}));var g=_e("core_users",e=>({id:e.serial().primaryKey(),nameCode:e.varchar({length:255}).notNull().unique(),name:e.varchar({length:255}).notNull().unique(),email:e.varchar({length:255}).notNull().unique(),password:e.varchar(),createdAt:e.timestamp().notNull().defaultNow(),newsletter:e.boolean().notNull().default(!1),avatarColor:e.varchar({length:6}).notNull(),emailVerified:e.boolean().notNull().default(!1),roleId:e.integer().references(()=>b.id).notNull(),birthday:e.timestamp(),ipAddress:e.varchar({length:40}).notNull(),language:e.varchar({length:32}).notNull().default("en").references(()=>T.code,{onDelete:"set default"})}),e=>[he("core_users_name_code_idx").on(e.nameCode),he("core_users_name_idx").on(e.name),he("core_users_email_idx").on(e.email)]).enableRLS(),ci=ge(g,({one:e,many:t})=>({group:e(b,{fields:[g.roleId],references:[b.id]}),language:e(T,{fields:[g.language],references:[T.code]}),confirm_email:e(pe,{fields:[g.id],references:[pe.userId]}),sso:t(Ve),forgot_password:e(me,{fields:[g.id],references:[me.userId]})})),Ve=_e("core_users_sso",e=>({userId:e.integer().references(()=>g.id,{onDelete:"cascade"}).notNull(),providerId:e.varchar({length:255}).notNull(),providerAccountId:e.varchar({length:255}).notNull(),createdAt:e.timestamp().notNull().defaultNow(),updatedAt:e.timestamp().notNull().$onUpdate(()=>new Date)}),e=>[he("core_users_sso_user_id_idx").on(e.userId)]).enableRLS(),li=ge(Ve,({one:e})=>({user:e(g,{fields:[Ve.userId],references:[g.id]})})),pe=_e("core_users_confirm_emails",e=>({id:e.serial().primaryKey(),userId:e.integer().references(()=>g.id,{onDelete:"cascade"}).notNull(),token:e.varchar({length:100}).notNull().unique(),createdAt:e.timestamp().notNull().defaultNow(),expires:e.timestamp().notNull()})).enableRLS(),di=ge(pe,({one:e})=>({user:e(g,{fields:[pe.userId],references:[g.id]})})),me=_e("core_users_forgot_password",e=>({id:e.serial().primaryKey(),userId:e.integer().references(()=>g.id,{onDelete:"cascade"}).notNull().unique(),token:e.varchar({length:100}).notNull().unique(),ip_address:e.varchar({length:40}).notNull(),createdAt:e.timestamp().notNull().defaultNow(),expiresAt:e.timestamp().notNull()})).enableRLS(),ui=ge(me,({one:e})=>({user:e(g,{fields:[me.userId],references:[g.id]})}));var q=Rt("core_sessions",e=>({id:e.serial().primaryKey(),token:e.varchar({length:255}).notNull().unique(),userId:e.integer().notNull().references(()=>g.id,{onDelete:"cascade"}),createdAt:e.timestamp().notNull().defaultNow(),expiresAt:e.timestamp().notNull(),deviceId:e.integer().references(()=>S.id,{onDelete:"cascade"}).notNull()}),e=>[It("core_sessions_user_id_idx").on(e.userId)]).enableRLS(),gi=Pt(q,({one:e})=>({user:e(g,{fields:[q.userId],references:[g.id]}),device:e(S,{fields:[q.deviceId],references:[S.id]})})),S=Rt("core_sessions_known_devices",e=>({id:e.serial().primaryKey(),publicId:e.varchar({length:32}).notNull().unique(),ipAddress:e.varchar({length:40}).notNull(),userAgent:e.text().notNull(),lastSeen:e.timestamp().notNull().defaultNow()}),e=>[It("core_sessions_known_devices_ip_address_idx").on(e.ipAddress)]).enableRLS(),_i=Pt(S,({one:e})=>({session:e(q,{fields:[S.id],references:[q.deviceId]})}));var B=At("core_admin_permissions",e=>({id:e.serial().primaryKey(),roleId:e.integer().references(()=>b.id,{onDelete:"cascade"}),userId:e.integer().references(()=>g.id,{onDelete:"cascade"}),createdAt:e.timestamp().notNull().defaultNow(),updatedAt:e.timestamp().notNull().$onUpdate(()=>new Date),protected:e.boolean().notNull().default(!1)}),e=>[we("core_admin_permissions_role_id_idx").on(e.roleId),we("core_admin_permissions_user_id_idx").on(e.userId)]).enableRLS(),Di=Tt(B,({one:e})=>({group:e(b,{fields:[B.roleId],references:[b.id]}),user:e(g,{fields:[B.userId],references:[g.id]})})),Ye=At("core_admin_sessions",e=>({id:e.serial().primaryKey(),token:e.varchar({length:255}).notNull().unique(),userId:e.integer().notNull().references(()=>g.id,{onDelete:"cascade"}),createdAt:e.timestamp().notNull().defaultNow(),lastSeen:e.timestamp().notNull().defaultNow(),expiresAt:e.timestamp().notNull(),deviceId:e.integer().references(()=>S.id,{onDelete:"cascade"}).notNull()}),e=>[we("core_admin_sessions_token_idx").on(e.token),we("core_admin_sessions_user_id_idx").on(e.userId)]).enableRLS(),Ni=Tt(Ye,({one:e})=>({user:e(g,{fields:[Ye.userId],references:[g.id]}),device:e(S,{fields:[Ye.deviceId],references:[S.id]})}));import{relations as Er}from"drizzle-orm";import{index as kt,pgTable as br}from"drizzle-orm/pg-core";var G=br("core_moderators_permissions",e=>({id:e.serial().primaryKey(),roleId:e.integer().references(()=>b.id,{onDelete:"cascade"}),userId:e.integer().references(()=>g.id,{onDelete:"cascade"}),createdAt:e.timestamp().notNull().defaultNow(),updatedAt:e.timestamp().notNull().$onUpdate(()=>new Date),protected:e.boolean().notNull().default(!1)}),e=>[kt("core_moderators_permissions_role_id_idx").on(e.roleId),kt("core_moderators_permissions_user_id_idx").on(e.userId)]).enableRLS(),ki=Er(G,({one:e})=>({group:e(b,{fields:[G.roleId],references:[b.id]}),user:e(g,{fields:[G.userId],references:[g.id]})}));import{join as xr}from"path";import{pathToFileURL as Dr}from"url";var ye=async({type:e="config"})=>{let t=xr(process.cwd(),"src",`vitnode.${e}.ts`);try{let i=await import(Dr(t).href);return e==="config"?i.vitNodeConfig:i.vitNodeApiConfig}catch(s){console.error("Failed to load config:",s),process.exit(1)}};import{existsSync as St}from"fs";import{readFile as Nr}from"fs/promises";import{join as A,relative as Ft}from"path";var ve=async()=>{let t=[...(await ye({})).plugins.map(o=>o.pluginId),"@vitnode/core"],s=de(process.cwd()),i=ue(s),r=le(i),n=process.cwd();await Promise.all(t.map(async o=>{let a=A(process.cwd(),"node_modules",o),c="";try{let _=A(a,"package.json");St(_)&&(c=JSON.parse(await Nr(_,"utf-8")).name??"")}catch(_){console.error(`\x1B[31mError reading package.json for ${o}:\x1B[0m`,_);return}let d=o.replace(/\//g,"-").replace(/@/g,""),l=A(n,"src","app","[locale]","(main)",A("(plugins)",`(${d})`)),u=A(n,"src","app","[locale]","admin","(auth)",A("(plugins)",`(${d})`)),f=A(n,"src","locales",o),m=[{sourceDir:A(a,"src","app_admin"),destinationDir:u},{sourceDir:A(a,"src","app"),destinationDir:l},{sourceDir:A(a,"src","locales"),destinationDir:f}];for(let{sourceDir:_,destinationDir:N}of m)St(_)&&!H(_)&&(console.log(`\x1B[36mCopying ${o}:\x1B[0m ${Ft(s,_)} \u2192 ${Ft(s,N)}`),Et(_,N,c,r,i,s,!1))}))};import{spawn as Pr}from"child_process";var J=async(e,t=[])=>new Promise((s,i)=>{let r=Pr(e,t,{stdio:"inherit",shell:!0,env:process.env});r.on("error",n=>{i(n)}),r.on("close",n=>{n!==0?i(new Error(`Command failed with exit code ${n}`)):s(!0)})});var Lt=async()=>{try{await J("npm",["run","drizzle-kit","up"]),await J("npm",["run","drizzle-kit","generate"])}catch(e){console.error("\x1B[31m%s\x1B[0m",e),process.exit(1)}},Ot=async()=>{try{await J("npm",["run","drizzle-kit","migrate"])}catch(e){console.error("\x1B[31m%s\x1B[0m",e),process.exit(1)}},jt=async()=>{try{await J("npm",["run","drizzle-kit","push"])}catch(e){console.error("\x1B[31m%s\x1B[0m",e),process.exit(1)}},Ee=async()=>{let t=(await ye({type:"api.config"})).dbProvider,[s]=await t.select({count:Ct()}).from(b).limit(1),[i]=await t.select({count:Ct()}).from(T);if(i.count===0&&await t.insert(T).values([{code:"en",name:"English (USA)",default:!0,protected:!0,timezone:"America/New_York"}]),s.count===0){let r=await t.insert(b).values([{protected:!0,guest:!0},{protected:!0,default:!0},{protected:!0,color:"hsl(122, 80%, 45%)"},{protected:!0,root:!0,color:"hsl(0, 100%, 50%)"}]).returning({id:b.id});await t.insert(fe).values([{languageCode:"en",pluginCode:"core",itemId:r[0].id,value:"Guest",tableName:"core_roles",variable:"name"},{languageCode:"en",pluginCode:"core",itemId:r[1].id,value:"Member",tableName:"core_roles",variable:"name"},{languageCode:"en",pluginCode:"core",itemId:r[2].id,value:"Moderator",tableName:"core_roles",variable:"name"},{languageCode:"en",pluginCode:"core",itemId:r[3].id,value:"Administrator",tableName:"core_roles",variable:"name"}]),await Promise.all([await t.insert(G).values({roleId:r[2].id,protected:!0}),await t.insert(B).values({roleId:r[3].id,protected:!0})])}},$t=async({initMessage:e})=>{console.log(`${e} [1/4] Prepare plugins files...`),await ve(),console.log(`
9
+ ${e} [4/4] Insert initial data...`),await Ee(),console.log(`${e} \x1B[32mDatabase prepared successfully.\x1B[0m`),process.exit(0)};Mt.config();var O="\x1B[34m[VitNode]\x1B[0m",Wt=process.argv[2],ze=process.argv[3];switch(Wt){case"init":$t({initMessage:O});break;case"migrate":await Lt(),ze==="--generate"&&(console.log(`${O} \x1B[32mDatabase migrations generated successfully.\x1B[0m`),process.exit(0)),await Ot(),await Ee(),console.log(`${O} \x1B[32mDatabase migrated successfully.\x1B[0m`),process.exit(0);break;case"plugin":(ze==="--w"||ze==="--watch")&&Dt({initMessage:O});break;case"prepare-plugins":await ve(),console.log(`${O} \x1B[32mPlugins prepared successfully.\x1B[0m`),process.exit(0);break;case"push":await jt(),await Ee(),console.log(`${O} \x1B[32mDatabase pushed successfully.\x1B[0m`),process.exit(0);break;default:console.log(`${O} \x1B[31mCommand not found: "${Wt??""}"\x1B[0m`),process.exit(1)}
8
10
  /*! Bundled license information:
9
11
 
10
12
  chokidar/esm/index.js:
@@ -1 +1 @@
1
- {"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../../scripts/shared/file-utils.ts"],"names":[],"mappings":"AA4BA,eAAO,MAAM,QAAQ,GAAI,UAAU,MAAM,EAAE,YAAY,MAAM,KAAG,MAY/D,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,YAAY,MAAM,KACjB,GAAG,CAAC,MAAM,EAAE,MAAM,CAwBpB,CAAC;AAGF,eAAO,MAAM,oBAAoB,GAC/B,SAAS,MAAM,EACf,YAAY,MAAM,KACjB,MAiDF,CAAC;AAEF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAmBlD;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkEvD;AAED,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,KAAG,MAAM,EAgB/C,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,KAAG,OAM9C,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,QAAQ,GACnB,SAAS,MAAM,EACf,UAAU,MAAM,EAChB,YAAY,MAAM,EAClB,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,YAAY,MAAM,EAClB,UAAU,MAAM,EAChB,iBAAc,SAkEf,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,WAAW,MAAM,EACjB,gBAAgB,MAAM,EACtB,YAAY,MAAM,EAClB,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,YAAY,MAAM,EAClB,UAAU,MAAM,EAChB,iBAAc,SAoBf,CAAC"}
1
+ {"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../../scripts/shared/file-utils.ts"],"names":[],"mappings":"AA4BA,eAAO,MAAM,QAAQ,GAAI,UAAU,MAAM,EAAE,YAAY,MAAM,KAAG,MAY/D,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,YAAY,MAAM,KACjB,GAAG,CAAC,MAAM,EAAE,MAAM,CAwBpB,CAAC;AAGF,eAAO,MAAM,oBAAoB,GAC/B,SAAS,MAAM,EACf,YAAY,MAAM,KACjB,MA8DF,CAAC;AAEF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAmBlD;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkEvD;AAED,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,KAAG,MAAM,EAgB/C,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,KAAG,OAM9C,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,QAAQ,GACnB,SAAS,MAAM,EACf,UAAU,MAAM,EAChB,YAAY,MAAM,EAClB,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,YAAY,MAAM,EAClB,UAAU,MAAM,EAChB,iBAAc,SAkEf,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,WAAW,MAAM,EACjB,gBAAgB,MAAM,EACtB,YAAY,MAAM,EAClB,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,YAAY,MAAM,EAClB,UAAU,MAAM,EAChB,iBAAc,SAoBf,CAAC"}
@@ -21,7 +21,7 @@ export function VitNodeAPI({ app, cors: corsOptions, csrf: csrfOptions, vitNodeA
21
21
  url: `/api/swagger/doc`
22
22
  }));
23
23
  app.use('*', globalMiddleware({
24
- emailAdapter: vitNodeApiConfig.emailAdapter,
24
+ email: vitNodeApiConfig.email,
25
25
  metadata: vitNodeConfig.metadata,
26
26
  authorization: vitNodeApiConfig.authorization,
27
27
  dbProvider: vitNodeApiConfig.dbProvider,
@@ -33,11 +33,11 @@ export function VitNodeAPI({ app, cors: corsOptions, csrf: csrfOptions, vitNodeA
33
33
  }
34
34
  return next();
35
35
  });
36
- app.onError((error, c)=>{
36
+ app.onError(async (error, c)=>{
37
37
  if (error instanceof HTTPException) {
38
38
  return error.getResponse();
39
39
  }
40
- c.get('log').error(`Unhandled error: ${error.message}`);
40
+ await c.get('log').error(`Unhandled error: ${error.message}`);
41
41
  return new Response(process.env.NODE_ENV === 'development' ? error.message : 'Internal Server Error', {
42
42
  status: 500
43
43
  });
@@ -1,8 +1,8 @@
1
1
  import type { Context } from 'hono';
2
2
  export interface LoggerMiddlewareType {
3
- debug: (content: string) => void;
4
- error: (content: string) => void;
5
- warn: (content: string) => void;
3
+ debug: (content: string) => Promise<void>;
4
+ error: (content: string) => Promise<void>;
5
+ warn: (content: string) => Promise<void>;
6
6
  }
7
7
  export declare const loggerMiddleware: (c: Context) => LoggerMiddlewareType;
8
8
  //# sourceMappingURL=logger-middleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger-middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/lib/logger-middleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAMpC,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,eAAO,MAAM,gBAAgB,GAAI,GAAG,OAAO,KAAG,oBAgD7C,CAAC"}
1
+ {"version":3,"file":"logger-middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/lib/logger-middleware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAMpC,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED,eAAO,MAAM,gBAAgB,GAAI,GAAG,OAAO,KAAG,oBAgD7C,CAAC"}
@@ -22,14 +22,14 @@ export const loggerMiddleware = (c)=>{
22
22
  (loggers[type] ?? loggers.debug)(content);
23
23
  };
24
24
  return {
25
- debug: (content)=>{
26
- void logToDbAndConsole(content, 'debug');
25
+ debug: async (content)=>{
26
+ await logToDbAndConsole(content, 'debug');
27
27
  },
28
- error: (content)=>{
29
- void logToDbAndConsole(content, 'error');
28
+ error: async (content)=>{
29
+ await logToDbAndConsole(content, 'error');
30
30
  },
31
- warn: (content)=>{
32
- void logToDbAndConsole(content, 'warn');
31
+ warn: async (content)=>{
32
+ await logToDbAndConsole(content, 'warn');
33
33
  }
34
34
  };
35
35
  };
@@ -1,12 +1,12 @@
1
1
  import type { Context, Env, Next } from 'hono';
2
- import type { EmailApiPlugin } from '../../api/models/email';
3
2
  import type { VitNodeApiConfig, VitNodeConfig } from '../../vitnode.config';
3
+ import { type EmailApiPlugin, type EmailModelSendArgs } from '../../api/models/email';
4
4
  import type { SSOApiPlugin } from '../models/sso';
5
5
  import { type LoggerMiddlewareType } from '../lib/logger-middleware';
6
6
  export interface EnvVitNode extends Env {
7
7
  Variables: EnvVariablesVitNode;
8
8
  }
9
- interface EnvVariablesVitNode {
9
+ export interface EnvVariablesVitNode {
10
10
  admin: null | {
11
11
  user: {
12
12
  avatarColor: string;
@@ -33,13 +33,24 @@ interface EnvVariablesVitNode {
33
33
  ssoAdapters: SSOApiPlugin[];
34
34
  };
35
35
  captcha?: Pick<VitNodeApiConfig, 'captcha'>['captcha'];
36
- emailAdapter?: EmailApiPlugin;
36
+ email?: {
37
+ adapter?: EmailApiPlugin;
38
+ options?: {
39
+ logo?: {
40
+ className?: string;
41
+ src: Blob | string;
42
+ };
43
+ };
44
+ };
37
45
  metadata: {
38
46
  shortTitle?: string;
39
47
  title: string;
40
48
  };
41
49
  };
42
50
  db: Pick<VitNodeApiConfig, 'dbProvider'>['dbProvider'];
51
+ email: {
52
+ send: (args: EmailModelSendArgs) => Promise<void>;
53
+ };
43
54
  ipAddress: string;
44
55
  log: LoggerMiddlewareType;
45
56
  plugin: {
@@ -62,8 +73,7 @@ declare module 'hono' {
62
73
  interface ContextVariableMap extends EnvVariablesVitNode {
63
74
  }
64
75
  }
65
- export declare const globalMiddleware: ({ authorization, metadata, emailAdapter, dbProvider, captcha, }: Pick<VitNodeApiConfig, "authorization" | "captcha" | "dbProvider" | "emailAdapter"> & Pick<VitNodeConfig, "metadata">) => (c: Context, next: Next) => Promise<void>;
76
+ export declare const globalMiddleware: ({ authorization, metadata, email, dbProvider, captcha, }: Pick<VitNodeApiConfig, "authorization" | "captcha" | "dbProvider" | "email"> & Pick<VitNodeConfig, "metadata">) => (c: Context, next: Next) => Promise<void>;
66
77
  export declare const pluginMiddleware: (pluginId: string) => (c: Context, next: Next) => Promise<void>;
67
78
  export declare const globalAdminMiddleware: () => (c: Context, next: Next) => Promise<void>;
68
- export {};
69
79
  //# sourceMappingURL=global.middleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"global.middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/middlewares/global.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,UAAW,SAAQ,GAAG;IACrC,SAAS,EAAE,mBAAmB,CAAC;CAChC;AAED,UAAU,mBAAmB;IAC3B,KAAK,EAAE,IAAI,GAAG;QACZ,IAAI,EAAE;YACJ,WAAW,EAAE,MAAM,CAAC;YACpB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;YACtB,SAAS,EAAE,IAAI,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC;YACd,aAAa,EAAE,OAAO,CAAC;YACvB,EAAE,EAAE,MAAM,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC;YACjB,UAAU,EAAE,OAAO,CAAC;YACpB,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,CAAC;IACF,IAAI,EAAE;QACJ,aAAa,EAAE;YACb,kBAAkB,EAAE,MAAM,CAAC;YAC3B,eAAe,EAAE,MAAM,CAAC;YACxB,cAAc,EAAE,MAAM,CAAC;YACvB,UAAU,EAAE,MAAM,CAAC;YACnB,YAAY,EAAE,OAAO,CAAC;YACtB,mBAAmB,EAAE,MAAM,CAAC;YAC5B,gBAAgB,EAAE,MAAM,CAAC;YACzB,WAAW,EAAE,YAAY,EAAE,CAAC;SAC7B,CAAC;QACF,OAAO,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC;QACvD,YAAY,CAAC,EAAE,cAAc,CAAC;QAC9B,QAAQ,EAAE;YACR,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,KAAK,EAAE,MAAM,CAAC;SACf,CAAC;KACH,CAAC;IACF,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,oBAAoB,CAAC;IAC1B,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,IAAI,EAAE,IAAI,GAAG;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;QACtB,SAAS,EAAE,IAAI,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,OAAO,CAAC;QACvB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,OAAO,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,OAAO,QAAQ,MAAM,CAAC;IAEpB,UAAU,kBAAmB,SAAQ,mBAAmB;KAAG;CAC5D;AAED,eAAO,MAAM,gBAAgB,GAAI,iEAM9B,IAAI,CACL,gBAAgB,EAChB,eAAe,GAAG,SAAS,GAAG,YAAY,GAAG,cAAc,CAC5D,GACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,MACjB,GAAG,OAAO,EAAE,MAAM,IAAI,kBAyErC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,MACjC,GAAG,OAAO,EAAE,MAAM,IAAI,kBAMrC,CAAC;AAEF,eAAO,MAAM,qBAAqB,SAClB,GAAG,OAAO,EAAE,MAAM,IAAI,kBASrC,CAAC"}
1
+ {"version":3,"file":"global.middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/middlewares/global.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAExE,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,UAAW,SAAQ,GAAG;IACrC,SAAS,EAAE,mBAAmB,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,IAAI,GAAG;QACZ,IAAI,EAAE;YACJ,WAAW,EAAE,MAAM,CAAC;YACpB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;YACtB,SAAS,EAAE,IAAI,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC;YACd,aAAa,EAAE,OAAO,CAAC;YACvB,EAAE,EAAE,MAAM,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC;YACjB,UAAU,EAAE,OAAO,CAAC;YACpB,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,CAAC;IACF,IAAI,EAAE;QACJ,aAAa,EAAE;YACb,kBAAkB,EAAE,MAAM,CAAC;YAC3B,eAAe,EAAE,MAAM,CAAC;YACxB,cAAc,EAAE,MAAM,CAAC;YACvB,UAAU,EAAE,MAAM,CAAC;YACnB,YAAY,EAAE,OAAO,CAAC;YACtB,mBAAmB,EAAE,MAAM,CAAC;YAC5B,gBAAgB,EAAE,MAAM,CAAC;YACzB,WAAW,EAAE,YAAY,EAAE,CAAC;SAC7B,CAAC;QACF,OAAO,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC;QACvD,KAAK,CAAC,EAAE;YACN,OAAO,CAAC,EAAE,cAAc,CAAC;YACzB,OAAO,CAAC,EAAE;gBACR,IAAI,CAAC,EAAE;oBACL,SAAS,CAAC,EAAE,MAAM,CAAC;oBACnB,GAAG,EAAE,IAAI,GAAG,MAAM,CAAC;iBACpB,CAAC;aACH,CAAC;SACH,CAAC;QACF,QAAQ,EAAE;YACR,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,KAAK,EAAE,MAAM,CAAC;SACf,CAAC;KACH,CAAC;IACF,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC;IACvD,KAAK,EAAE;QACL,IAAI,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACnD,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,oBAAoB,CAAC;IAC1B,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,IAAI,EAAE,IAAI,GAAG;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;QACtB,SAAS,EAAE,IAAI,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,OAAO,CAAC;QACvB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,OAAO,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,OAAO,QAAQ,MAAM,CAAC;IAEpB,UAAU,kBAAmB,SAAQ,mBAAmB;KAAG;CAC5D;AAED,eAAO,MAAM,gBAAgB,GAAI,0DAM9B,IAAI,CACL,gBAAgB,EAChB,eAAe,GAAG,SAAS,GAAG,YAAY,GAAG,OAAO,CACrD,GACC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,MACjB,GAAG,OAAO,EAAE,MAAM,IAAI,kBA0ErC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,MACjC,GAAG,OAAO,EAAE,MAAM,IAAI,kBAMrC,CAAC;AAEF,eAAO,MAAM,qBAAqB,SAClB,GAAG,OAAO,EAAE,MAAM,IAAI,kBASrC,CAAC"}
@@ -1,8 +1,9 @@
1
1
  import { HTTPException } from "hono/http-exception";
2
+ import { EmailModel } from "../models/email.js";
2
3
  import { SessionModel } from "../models/session.js";
3
4
  import { SessionAdminModel } from "../models/session-admin.js";
4
5
  import { loggerMiddleware } from "../lib/logger-middleware.js";
5
- export const globalMiddleware = ({ authorization, metadata, emailAdapter, dbProvider, captcha })=>{
6
+ export const globalMiddleware = ({ authorization, metadata, email, dbProvider, captcha })=>{
6
7
  return async (c, next)=>{
7
8
  // Collect possible IP header keys in order of trust/preference
8
9
  const ipHeaderKeys = [
@@ -45,9 +46,10 @@ export const globalMiddleware = ({ authorization, metadata, emailAdapter, dbProv
45
46
  // Fallback to localhost if nothing found
46
47
  c.set('ipAddress', ipAddress ?? '127.0.0.1');
47
48
  c.set('db', dbProvider);
49
+ c.set('email', new EmailModel(c));
48
50
  c.set('core', {
49
51
  metadata,
50
- emailAdapter,
52
+ email,
51
53
  authorization: {
52
54
  cookieName: authorization?.cookieName ?? 'vitnode_auth',
53
55
  cookie_expires: authorization?.cookieExpires ?? 1000 * 60 * 60 * 24 * 90,
@@ -1,4 +1,4 @@
1
1
  import type { Context, Next } from 'hono';
2
2
  import { type IRateLimiterOptions } from 'rate-limiter-flexible';
3
- export declare const rateLimiterMiddleware: (options?: Omit<IRateLimiterOptions, "keyPrefix">) => (c: Context, next: Next) => Promise<(Response & import("hono").TypedResponse<"Too Many Requests", 429, "text">) | undefined>;
3
+ export declare const rateLimiterMiddleware: (options?: Omit<IRateLimiterOptions, "keyPrefix">) => ((c: Context, next: Next) => Promise<void>) | ((c: Context, next: Next) => Promise<(Response & import("hono").TypedResponse<"Too Many Requests", 429, "text">) | undefined>);
4
4
  //# sourceMappingURL=rate-limiter.middleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter.middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/middlewares/rate-limiter.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,EACL,KAAK,mBAAmB,EAGzB,MAAM,uBAAuB,CAAC;AAoB/B,eAAO,MAAM,qBAAqB,GAChC,UAAU,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAC,MAOlC,GAAG,OAAO,EAAE,MAAM,IAAI,qGAWrC,CAAC"}
1
+ {"version":3,"file":"rate-limiter.middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/middlewares/rate-limiter.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,EACL,KAAK,mBAAmB,EAGzB,MAAM,uBAAuB,CAAC;AAoB/B,eAAO,MAAM,qBAAqB,GAChC,UAAU,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAC,UAI7B,OAAO,QAAQ,IAAI,2BAUrB,OAAO,QAAQ,IAAI,sGAWrC,CAAC"}
@@ -4,12 +4,18 @@ const createRateLimiter = ({ keyPrefix, ...options })=>{
4
4
  // TODO: Add support for Redis or other storage options
5
5
  return new RateLimiterMemory({
6
6
  keyPrefix,
7
- points: CONFIG.node_development ? 120 : options?.points ?? 80,
7
+ points: options?.points ?? 80,
8
8
  duration: options?.duration ?? 60,
9
9
  ...options
10
10
  });
11
11
  };
12
12
  export const rateLimiterMiddleware = (options)=>{
13
+ if (CONFIG.node_development) {
14
+ // In development, we disable the rate limiter for easier testing
15
+ return async (c, next)=>{
16
+ await next();
17
+ };
18
+ }
13
19
  const rateLimiter = createRateLimiter({
14
20
  ...options,
15
21
  keyPrefix: 'vitnode-api-rate-limiter'
@@ -18,9 +24,9 @@ export const rateLimiterMiddleware = (options)=>{
18
24
  const key = c.get('ipAddress');
19
25
  try {
20
26
  await rateLimiter.consume(key);
21
- await next();
22
27
  } catch {
23
28
  return c.text('Too Many Requests', 429);
24
29
  }
30
+ await next();
25
31
  };
26
32
  };
@@ -31,7 +31,7 @@ export class DeviceModel {
31
31
  httpOnly: true,
32
32
  secure: this.c.get('core').authorization.cookieSecure,
33
33
  path: '/',
34
- domain: CONFIG.frontend.hostname,
34
+ domain: CONFIG.web.hostname,
35
35
  expires: new Date(Date.now() + this.c.get('core').authorization.deviceCookieExpires)
36
36
  });
37
37
  }
@@ -1,21 +1,25 @@
1
1
  import type { Context, ContextVariableMap } from 'hono';
2
+ import type React from 'react';
2
3
  export interface EmailApiPlugin {
3
4
  sendEmail: (args: {
4
5
  html: string;
5
6
  metadata: ContextVariableMap['core']['metadata'];
6
7
  replyTo?: string;
7
8
  subject: string;
9
+ text: string;
8
10
  to: string;
9
11
  }) => Promise<void>;
10
12
  }
13
+ export interface EmailModelSendArgs {
14
+ content: React.ReactNode;
15
+ html?: string;
16
+ replyTo?: string;
17
+ subject: string;
18
+ to: string;
19
+ }
11
20
  export declare class EmailModel {
12
21
  constructor(c: Context);
13
22
  protected readonly c: Context;
14
- send(args: {
15
- html: string;
16
- replyTo?: string;
17
- subject: string;
18
- to: string;
19
- }): void;
23
+ send({ html, replyTo, subject, to, content }: EmailModelSendArgs): Promise<void>;
20
24
  }
21
25
  //# sourceMappingURL=email.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../../../src/api/models/email.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAIxD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,CAAC,IAAI,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QACjD,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,EAAE,EAAE,MAAM,CAAC;KACZ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AAED,qBAAa,UAAU;gBACT,CAAC,EAAE,OAAO;IAItB,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;IAE9B,IAAI,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE;CAuB3E"}
1
+ {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../../../src/api/models/email.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AACxD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,CAAC,IAAI,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QACjD,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;KACZ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,qBAAa,UAAU;gBACT,CAAC,EAAE,OAAO;IAItB,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;IAExB,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,kBAAkB;CAwCvE"}
@@ -1,23 +1,42 @@
1
+ import { render } from "@react-email/components";
1
2
  import { HTTPException } from "hono/http-exception";
3
+ import DefaultTemplateEmail from "../../emails/default-template.js";
4
+ import { CONFIG } from "../../lib/config.js";
2
5
  export class EmailModel {
3
6
  constructor(c){
4
7
  this.c = c;
5
8
  }
6
9
  c;
7
- send(args) {
10
+ async send({ html, replyTo, subject, to, content }) {
8
11
  const core = this.c.get('core');
9
- const provider = core.emailAdapter;
12
+ const provider = core.email?.adapter;
10
13
  if (!provider) {
11
14
  throw new HTTPException(500, {
12
15
  message: 'Email provider not found'
13
16
  });
14
17
  }
15
- void provider.sendEmail({
16
- ...args,
17
- metadata: core.metadata
18
- }).catch((err)=>{
19
- const error = err instanceof Error ? err : new Error('Unknown error from email provider');
20
- this.c.get('log').error(`Failed to send email: ${error.message}`);
18
+ const htmlContent = html ?? DefaultTemplateEmail({
19
+ children: content,
20
+ metadata: {
21
+ ...core.metadata,
22
+ url: CONFIG.web.href
23
+ },
24
+ logo: core.email?.options?.logo
21
25
  });
26
+ try {
27
+ await provider.sendEmail({
28
+ html: await render(htmlContent),
29
+ to,
30
+ subject,
31
+ replyTo,
32
+ metadata: core.metadata,
33
+ text: await render(htmlContent, {
34
+ plainText: true
35
+ })
36
+ });
37
+ } catch (err) {
38
+ const error = err instanceof Error ? err : new Error('Unknown error from email provider');
39
+ await this.c.get('log').error(`Failed to send email: ${error.message}`);
40
+ }
22
41
  }
23
42
  }