@vitnode/core 1.2.0-canary.26 → 1.2.0-canary.27

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 (72) hide show
  1. package/dist/scripts/scripts.js +2 -2
  2. package/dist/scripts/shared/file-utils.d.ts.map +1 -1
  3. package/dist/src/api/config.d.ts.map +1 -1
  4. package/dist/src/api/config.js +2 -1
  5. package/dist/src/api/lib/route.d.ts +1 -0
  6. package/dist/src/api/lib/route.d.ts.map +1 -1
  7. package/dist/src/api/lib/route.js +4 -0
  8. package/dist/src/api/middlewares/captcha.middleware.d.ts +3 -0
  9. package/dist/src/api/middlewares/captcha.middleware.d.ts.map +1 -0
  10. package/dist/src/api/middlewares/captcha.middleware.js +58 -0
  11. package/dist/src/api/middlewares/global.middleware.d.ts +3 -2
  12. package/dist/src/api/middlewares/global.middleware.d.ts.map +1 -1
  13. package/dist/src/api/middlewares/global.middleware.js +4 -3
  14. package/dist/src/api/models/sso.js +1 -1
  15. package/dist/src/api/modules/admin/admin.module.d.ts +4 -4
  16. package/dist/src/api/modules/admin/debug/debug.admin.module.d.ts +4 -4
  17. package/dist/src/api/modules/admin/debug/routes/logs.route.d.ts +4 -4
  18. package/dist/src/api/modules/middleware/middleware.module.d.ts +22 -0
  19. package/dist/src/api/modules/middleware/middleware.module.d.ts.map +1 -1
  20. package/dist/src/api/modules/middleware/route.d.ts +65 -0
  21. package/dist/src/api/modules/middleware/route.d.ts.map +1 -1
  22. package/dist/src/api/modules/middleware/route.js +22 -10
  23. package/dist/src/api/modules/users/routes/sign-in.route.d.ts +2 -2
  24. package/dist/src/api/modules/users/routes/sign-up.route.d.ts +1 -0
  25. package/dist/src/api/modules/users/routes/sign-up.route.d.ts.map +1 -1
  26. package/dist/src/api/modules/users/routes/sign-up.route.js +1 -0
  27. package/dist/src/api/modules/users/sso/routes/callback.route.d.ts +2 -2
  28. package/dist/src/api/modules/users/sso/sso.module.d.ts +2 -2
  29. package/dist/src/api/modules/users/users.module.d.ts +5 -4
  30. package/dist/src/api/modules/users/users.module.d.ts.map +1 -1
  31. package/dist/src/components/form/auto-form.d.ts +7 -2
  32. package/dist/src/components/form/auto-form.d.ts.map +1 -1
  33. package/dist/src/components/form/auto-form.js +13 -3
  34. package/dist/src/hooks/use-captcha.d.ts +8 -0
  35. package/dist/src/hooks/use-captcha.d.ts.map +1 -0
  36. package/dist/src/hooks/use-captcha.js +94 -0
  37. package/dist/src/lib/api/get-middleware-api.d.ts +4 -0
  38. package/dist/src/lib/api/get-middleware-api.d.ts.map +1 -1
  39. package/dist/src/lib/fetcher-client.d.ts +2 -1
  40. package/dist/src/lib/fetcher-client.d.ts.map +1 -1
  41. package/dist/src/lib/fetcher-client.js +7 -2
  42. package/dist/src/lib/fetcher.d.ts +2 -1
  43. package/dist/src/lib/fetcher.d.ts.map +1 -1
  44. package/dist/src/lib/fetcher.js +10 -6
  45. package/dist/src/views/admin/layouts/sidebar/nav/item.d.ts.map +1 -1
  46. package/dist/src/views/admin/layouts/sidebar/nav/item.js +0 -2
  47. package/dist/src/views/admin/layouts/sidebar/sidebar.js +0 -1
  48. package/dist/src/views/admin/views/core/debug/system-logs/system-logs-view.d.ts +1 -1
  49. package/dist/src/views/auth/sign-in/form/use-form.d.ts +3 -2
  50. package/dist/src/views/auth/sign-in/form/use-form.d.ts.map +1 -1
  51. package/dist/src/views/auth/sign-up/form/form.d.ts +4 -1
  52. package/dist/src/views/auth/sign-up/form/form.d.ts.map +1 -1
  53. package/dist/src/views/auth/sign-up/form/form.js +2 -1
  54. package/dist/src/views/auth/sign-up/form/mutation-api.d.ts +3 -1
  55. package/dist/src/views/auth/sign-up/form/mutation-api.d.ts.map +1 -1
  56. package/dist/src/views/auth/sign-up/form/mutation-api.js +2 -1
  57. package/dist/src/views/auth/sign-up/form/use-form.d.ts +3 -21
  58. package/dist/src/views/auth/sign-up/form/use-form.d.ts.map +1 -1
  59. package/dist/src/views/auth/sign-up/form/use-form.js +5 -2
  60. package/dist/src/views/auth/sign-up/sign-up-view.js +2 -1
  61. package/dist/src/views/layouts/root-layout.d.ts +1 -3
  62. package/dist/src/views/layouts/root-layout.d.ts.map +1 -1
  63. package/dist/src/views/layouts/root-layout.js +9 -21
  64. package/dist/src/views/layouts/theme/header/header.d.ts.map +1 -1
  65. package/dist/src/views/layouts/theme/header/header.js +0 -1
  66. package/dist/src/views/layouts/theme/header/user/user.d.ts.map +1 -1
  67. package/dist/src/views/layouts/theme/header/user/user.js +0 -2
  68. package/dist/src/vitnode.config.d.ts +6 -1
  69. package/dist/src/vitnode.config.d.ts.map +1 -1
  70. package/dist/tsconfig.tsbuildinfo +1 -1
  71. package/package.json +2 -2
  72. package/src/locales/en.json +1 -0
@@ -3,8 +3,8 @@ import 'tsx/esm';
3
3
  import { createRequire } from 'module';
4
4
  const require = createRequire(import.meta.url);
5
5
 
6
- import{stat as Xt}from"fs";import{stat as Zt,readdir as es}from"fs/promises";import{EventEmitter as ts}from"events";import*as m from"path";import{stat as Pt,lstat as ke,readdir as Dt,realpath as vt}from"fs/promises";import{Readable as Nt}from"stream";import{resolve as Ce,relative as It,join as Rt,sep as St}from"path";var b={FILE_TYPE:"files",DIR_TYPE:"directories",FILE_DIR_TYPE:"files_directories",EVERYTHING_TYPE:"all"},pe={root:".",fileFilter:t=>!0,directoryFilter:t=>!0,type:b.FILE_TYPE,lstat:!1,depth:2147483648,alwaysStat:!1,highWaterMark:4096};Object.freeze(pe);var ze="READDIRP_RECURSIVE_ERROR",At=new Set(["ENOENT","EPERM","EACCES","ELOOP",ze]),Le=[b.DIR_TYPE,b.EVERYTHING_TYPE,b.FILE_DIR_TYPE,b.FILE_TYPE],Tt=new Set([b.DIR_TYPE,b.EVERYTHING_TYPE,b.FILE_DIR_TYPE]),Ft=new Set([b.EVERYTHING_TYPE,b.FILE_DIR_TYPE,b.FILE_TYPE]),kt=t=>At.has(t.code),Ct=process.platform==="win32",We=t=>!0,je=t=>{if(t===void 0)return We;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 We},_e=class extends Nt{constructor(e={}){super({objectMode:!0,autoDestroy:!0,highWaterMark:e.highWaterMark});let s={...pe,...e},{root:i,type:r}=s;this._fileFilter=je(s.fileFilter),this._directoryFilter=je(s.directoryFilter);let o=s.lstat?ke:Pt;Ct?this._stat=a=>o(a,{bigint:!0}):this._stat=o,this._maxDepth=s.depth??pe.depth,this._wantsDir=r?Tt.has(r):!1,this._wantsFile=r?Ft.has(r):!1,this._wantsEverything=r===b.EVERYTHING_TYPE,this._root=Ce(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(l=>this._formatEntry(l,r)),n=await Promise.all(a);for(let l of n){if(!l)continue;if(this.destroyed)return;let d=await this._getEntryType(l);d==="directory"&&this._directoryFilter(l)?(o<=this._maxDepth&&this.parents.push(this._exploreDir(l.fullPath,o+1)),this._wantsDir&&(this.push(l),e--)):(d==="file"||this._includeAsFile(l))&&this._fileFilter(l)&&this._wantsFile&&(this.push(l),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 Dt(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=Ce(Rt(s,r));i={path:It(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){kt(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 vt(i),o=await ke(r);if(o.isFile())return"file";if(o.isDirectory()){let a=r.length;if(i.startsWith(r)&&i.substr(a,1)===St){let n=new Error(`Circular symlink detected: "${i}" points to "${r}"`);return n.code=ze,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 Me(t,e={}){let s=e.entryType||e.type;if(s==="both"&&(s=b.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&&!Le.includes(s))throw new Error(`readdirp: Invalid type passed. Use one of ${Le.join(", ")}`)}else throw new Error("readdirp: root argument is required. Usage: readdirp(root, options)");return e.root=t,new _e(e)}import{watchFile as Lt,unwatchFile as Oe,watch as Wt}from"fs";import{open as jt,stat as He,lstat as zt,realpath as ge}from"fs/promises";import*as w from"path";import{type as Mt}from"os";var Ot="data",xe="end",Ye="close",Q=()=>{};var X=process.platform,Ee=X==="win32",$t=X==="darwin",Ht=X==="linux",Yt=X==="freebsd",Ue=Mt()==="OS400",x={ALL:"all",READY:"ready",ADD:"add",CHANGE:"change",ADD_DIR:"addDir",UNLINK:"unlink",UNLINK_DIR:"unlinkDir",RAW:"raw",ERROR:"error"},v=x,Ut="watch",Kt={lstat:zt,stat:He},F="listeners",V="errHandlers",L="rawEmitters",Gt=[F,V,L],Vt=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=>Vt.has(w.extname(t).slice(1).toLowerCase()),ye=(t,e)=>{t instanceof Set?t.forEach(e):e(t)},z=(t,e,s)=>{let i=t[e];i instanceof Set||(t[e]=i=new Set([i])),i.add(s)},Bt=t=>e=>{let s=t[e];s instanceof Set?s.clear():delete t[e]},M=(t,e,s)=>{let i=t[e];i instanceof Set?i.delete(s):i===s&&delete t[e]},Ke=t=>t instanceof Set?t.size===0:!t,q=new Map;function $e(t,e,s,i,r){let o=(a,n)=>{s(t),r(a,n,{watchedPath:t}),n&&t!==n&&B(w.resolve(t,n),F,w.join(t,n))};try{return Wt(t,{persistent:e.persistent},o)}catch(a){i(a);return}}var B=(t,e,s,i,r)=>{let o=q.get(t);o&&ye(o[e],a=>{a(s,i,r)})},Jt=(t,e,s,i)=>{let{listener:r,errHandler:o,rawEmitter:a}=i,n=q.get(e),l;if(!s.persistent)return l=$e(t,s,r,o,a),l?l.close.bind(l):void 0;if(n)z(n,F,r),z(n,V,o),z(n,L,a);else{if(l=$e(t,s,B.bind(null,e,F),o,B.bind(null,e,L)),!l)return;l.on(v.ERROR,async d=>{let c=B.bind(null,e,V);if(n&&(n.watcherUnusable=!0),Ee&&d.code==="EPERM")try{await(await jt(t,"r")).close(),c(d)}catch{}else c(d)}),n={listeners:r,errHandlers:o,rawEmitters:a,watcher:l},q.set(e,n)}return()=>{M(n,F,r),M(n,V,o),M(n,L,a),Ke(n.listeners)&&(n.watcher.close(),q.delete(e),Gt.forEach(Bt(n)),n.watcher=void 0,Object.freeze(n))}},we=new Map,Qt=(t,e,s,i)=>{let{listener:r,rawEmitter:o}=i,a=we.get(e),n=a&&a.options;return n&&(n.persistent<s.persistent||n.interval>s.interval)&&(Oe(e),a=void 0),a?(z(a,F,r),z(a,L,o)):(a={listeners:r,rawEmitters:o,options:s,watcher:Lt(e,s,(l,d)=>{ye(a.rawEmitters,f=>{f(v.CHANGE,e,{curr:l,prev:d})});let c=l.mtimeMs;(l.size!==d.size||c>d.mtimeMs||c===0)&&ye(a.listeners,f=>f(t,l))})},we.set(e,a)),()=>{M(a,F,r),M(a,L,o),Ke(a.listeners)&&(we.delete(e),Oe(e),a.options=a.watcher=void 0,Object.freeze(a))}},J=class{constructor(e){this.fsw=e,this._boundHandleError=s=>e._handleError(s)}_watchWithNodeFs(e,s){let i=this.fsw.options,r=w.dirname(e),o=w.basename(e);this.fsw._getWatchedDir(r).add(o);let n=w.resolve(e),l={persistent:i.persistent};s||(s=Q);let d;if(i.usePolling){let c=i.interval!==i.binaryInterval;l.interval=c&&qt(o)?i.binaryInterval:i.interval,d=Qt(e,n,l,{listener:s,rawEmitter:this.fsw._emitRaw})}else d=Jt(e,n,l,{listener:s,errHandler:this._boundHandleError,rawEmitter:this.fsw._emitRaw});return d}_handleFile(e,s,i){if(this.fsw.closed)return;let r=w.dirname(e),o=w.basename(e),a=this.fsw._getWatchedDir(r),n=s;if(a.has(o))return;let l=async(c,f)=>{if(this.fsw._throttle(Ut,e,5)){if(!f||f.mtimeMs===0)try{let u=await He(e);if(this.fsw.closed)return;let y=u.atimeMs,_=u.mtimeMs;if((!y||y<=_||_!==n.mtimeMs)&&this.fsw._emit(v.CHANGE,e,u),($t||Ht||Yt)&&n.ino!==u.ino){this.fsw._closeFile(c),n=u;let D=this._watchWithNodeFs(e,l);D&&this.fsw._addPathCloser(c,D)}else n=u}catch{this.fsw._remove(r,o)}else if(a.has(o)){let u=f.atimeMs,y=f.mtimeMs;(!u||u<=y||y!==n.mtimeMs)&&this.fsw._emit(v.CHANGE,e,f),n=f}}},d=this._watchWithNodeFs(e,l);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 ge(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=w.join(e,""),n=this.fsw._throttle("readdir",e,1e3),!n)return;let l=this.fsw._getWatchedDir(i.path),d=new Set,c=this.fsw._readdirp(e,{fileFilter:f=>i.filterPath(f),directoryFilter:f=>i.filterDir(f)});if(c)return c.on(Ot,async f=>{if(this.fsw.closed){c=void 0;return}let u=f.path,y=w.join(e,u);if(d.add(u),!(f.stats.isSymbolicLink()&&await this._handleSymlink(f,e,y,u))){if(this.fsw.closed){c=void 0;return}(u===r||!r&&!l.has(u))&&(this.fsw._incrReadyCount(),y=w.join(o,w.relative(o,y)),this._addToNodeFs(y,s,i,a+1))}}).on(v.ERROR,this._boundHandleError),new Promise((f,u)=>{if(!c)return u();c.once(xe,()=>{if(this.fsw.closed){c=void 0;return}let y=n?n.clear():!1;f(void 0),l.getChildren().filter(_=>_!==e&&!d.has(_)).forEach(_=>{this.fsw._remove(e,_)}),c=void 0,y&&this._handleRead(e,!1,i,r,o,a,n)})})}async _handleDir(e,s,i,r,o,a,n){let l=this.fsw._getWatchedDir(w.dirname(e)),d=l.has(w.basename(e));!(i&&this.fsw.options.ignoreInitial)&&!o&&!d&&this.fsw._emit(v.ADD_DIR,e,s),l.add(w.basename(e)),this.fsw._getWatchedDir(e);let c,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,c),this.fsw.closed))return;f=this._watchWithNodeFs(e,(y,_)=>{_&&_.mtimeMs===0||this._handleRead(y,!1,a,o,e,r,c)})}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=l=>i.filterPath(l),n.filterDir=l=>i.filterDir(l));try{let l=await Kt[n.statMethod](n.watchPath);if(this.fsw.closed)return;if(this.fsw._isIgnored(n.watchPath,l))return a(),!1;let d=this.fsw.options.followSymlinks,c;if(l.isDirectory()){let f=w.resolve(e),u=d?await ge(e):e;if(this.fsw.closed||(c=await this._handleDir(n.watchPath,l,s,r,o,n,u),this.fsw.closed))return;f!==u&&u!==void 0&&this.fsw._symlinkPaths.set(f,u)}else if(l.isSymbolicLink()){let f=d?await ge(e):e;if(this.fsw.closed)return;let u=w.dirname(n.watchPath);if(this.fsw._getWatchedDir(u).add(n.watchPath),this.fsw._emit(v.ADD,n.watchPath,l),c=await this._handleDir(u,l,s,r,e,n,f),this.fsw.closed)return;f!==void 0&&this.fsw._symlinkPaths.set(w.resolve(e),f)}else c=this._handleFile(n.watchPath,l,s);return a(),c&&this.fsw._addPathCloser(e,c),!1}catch(l){if(this.fsw._handleError(l))return a(),e}}};var be="/",ss="//",Qe=".",rs="..",is="string",os=/\\/g,Ge=/\/\//,ns=/\..*\.(sw[px])$|~$|\.subl.*\.tmp/,as=/^\.[/\\]/;function Z(t){return Array.isArray(t)?t:[t]}var Pe=t=>typeof t=="object"&&t!==null&&!(t instanceof RegExp);function ls(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 cs(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 Ve(t,e,s){let i=cs(e);for(let r=0;r<t.length;r++){let o=t[r];if(o(i,s))return!0}return!1}function ds(t,e){if(t==null)throw new TypeError("anymatch: specify first argument");let i=Z(t).map(r=>ls(r));return e==null?(r,o)=>Ve(i,r,o):Ve(i,e)}var qe=t=>{let e=Z(t).flat();if(!e.every(s=>typeof s===is))throw new TypeError(`Non-string provided as watch path: ${e}`);return e.map(Xe)},Be=t=>{let e=t.replace(os,be),s=!1;for(e.startsWith(ss)&&(s=!0);e.match(Ge);)e=e.replace(Ge,be);return s&&(e=be+e),e},Xe=t=>Be(m.normalize(Be(t))),Je=(t="")=>e=>typeof e=="string"?Xe(m.isAbsolute(e)?e:m.join(t,e)):e,fs=(t,e)=>m.isAbsolute(t)?t:m.join(e,t),us=Object.freeze(new Set),De=class{constructor(e,s){this.path=e,this._removeWatcher=s,this.items=new Set}add(e){let{items:s}=this;s&&e!==Qe&&e!==rs&&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 es(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=Q,this.items=us,Object.freeze(this)}},hs="stat",ms="lstat",ve=class{constructor(e,s,i){this.fsw=i;let r=e;this.path=e=e.replace(as,""),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?hs:ms}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)}},ee=class extends ts{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?Z(e.ignored):Z([]),awaitWriteFinish:s===!0?i:typeof s=="object"?{...i,...s}:!1};Ue&&(r.usePolling=!0),r.atomic===void 0&&(r.atomic=!r.usePolling);let o=process.env.CHOKIDAR_USEPOLLING;if(o!==void 0){let l=o.toLowerCase();l==="false"||l==="0"?r.usePolling=!1:l==="true"||l==="1"?r.usePolling=!0:r.usePolling=!!l}let a=process.env.CHOKIDAR_INTERVAL;a&&(r.interval=Number.parseInt(a,10));let n=0;this._emitReady=()=>{n++,n>=this._readyCount&&(this._emitReady=Q,this._readyEmitted=!0,process.nextTick(()=>this.emit(x.READY)))},this._emitRaw=(...l)=>this.emit(x.RAW,...l),this._boundRemove=this._remove.bind(this),this.options=r,this._nodeFsHandler=new J(this),Object.freeze(r)}_addIgnoredPath(e){if(Pe(e)){for(let s of this._ignoredPaths)if(Pe(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)Pe(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=qe(e);return r&&(o=o.map(a=>fs(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=qe(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)||Qe;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;Ee&&(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((l,d)=>{this.emit(...l),this.emit(x.ALL,...l),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 l=(d,c)=>{d?(e=x.ERROR,o[0]=d,this.emitWithAll(e,o)):c&&(o.length>1?o[1]=c:o.push(c),this.emitWithAll(e,o))};return this._awaitWriteFinish(s,a.stabilityThreshold,e,l),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 l=r.cwd?m.join(r.cwd,s):s,d;try{d=await Zt(l)}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),c=d?d.count:0;return r.delete(s),clearTimeout(a),d&&clearTimeout(d.timeoutObject),c};a=setTimeout(n,i);let l={timeoutObject:a,clear:n,count:0};return r.set(s,l),l}_incrReadyCount(){return this._readyCount++}_awaitWriteFinish(e,s,i,r){let o=this.options.awaitWriteFinish;if(typeof o!="object")return;let a=o.pollInterval,n,l=e;this.options.cwd&&!m.isAbsolute(e)&&(l=m.join(this.options.cwd,e));let d=new Date,c=this._pendingWrites;function f(u){Xt(l,(y,_)=>{if(y||!c.has(e)){y&&y.code!=="ENOENT"&&r(y);return}let D=Number(new Date);u&&_.size!==u.size&&(c.get(e).lastChange=D);let j=c.get(e);D-j.lastChange>=s?(c.delete(e),r(void 0,_)):n=setTimeout(f,a,_)})}c.has(e)||(c.set(e,{lastChange:d,cancelWait:()=>(c.delete(e),clearTimeout(n),i)}),n=setTimeout(f,a))}_isIgnored(e,s){if(this.options.atomic&&ns.test(e))return!0;if(!this._userIgnored){let{cwd:i}=this.options,o=(this.options.ignored||[]).map(Je(i)),n=[...[...this._ignoredPaths].map(Je(i)),...o];this._userIgnored=ds(n,void 0)}return this._userIgnored(e,s)}_isntIgnored(e,s){return!this._isIgnored(e,s)}_getWatchHelpers(e){return new ve(e,this.options.followSymlinks,this)}_getWatchedDir(e){let s=m.resolve(e);return this._watched.has(s)||this._watched.set(s,new De(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 l=this._getWatchedDir(e),d=l.has(s);l.remove(s),this._symlinkPaths.has(o)&&this._symlinkPaths.delete(o);let c=r;if(this.options.cwd&&(c=m.relative(this.options.cwd,r)),this.options.awaitWriteFinish&&this._pendingWrites.has(c)&&this._pendingWrites.get(c).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=Me(e,i);return this._streams.add(r),r.once(Ye,()=>{r=void 0}),r.once(xe,()=>{r&&(this._streams.delete(r),r=void 0)}),r}};function ps(t,e={}){let s=new ee(e);return s.add(t),s}var Ze={watch:ps,FSWatcher:ee};import{existsSync as k,mkdirSync as Is,readFileSync as Rs,unlinkSync as Ss}from"fs";import{basename as rt,join as P,relative as it}from"path";import{copyFileSync as _s,existsSync as N,mkdirSync as gs,readdirSync as tt,readFileSync as ws,writeFileSync as ys}from"fs";import{basename as et,dirname as te,extname as xs,join as S,normalize as Es,relative as W,sep as bs}from"path";var Ps=/import\s+(?:(?:{[^}]*})|(?:[^{}\s,]*))?\s*(?:,\s*(?:{[^}]*}))?\s*from\s+['"]([./]+[^'"]*)['"]/g,Ds=/import\s+(?:(?:{[^}]*})|(?:[^{}\s,]*))?\s*(?:,\s*(?:{[^}]*}))?\s*from\s+['"](@\/[^'"]*)['"]/g,vs=/import\s*\(\s*['"](@\/[^'"]*)['"]\s*\)/g,Ne=/\.(js|jsx|ts|tsx)$/,Ie=/^page\.(tsx|ts|jsx|js)$/i,O=(t,e)=>{let i=W(e,t).split(bs);i.pop();let r=i.filter(o=>!o.startsWith("("));return Es(r.join("/"))},se=t=>{let e=new Map,s=i=>{if(N(i))for(let r of tt(i,{withFileTypes:!0})){let o=S(i,r.name);if(r.isDirectory()){s(o);continue}if(Ie.test(r.name)){let a=O(o,t);e.set(a,o)}}};return s(t),e},Ns=(t,e)=>{let s=t.replace(Ps,(i,r)=>{if(r.startsWith(".")){let a=r.replace(Ne,"").replace(/^(?:\.\.\/)+/,"");return i.replace(r,`${e}/${a}`)}return i});return s=s.replace(Ds,(i,r)=>{let o=r.replace(/^@\//,"").replace(Ne,"");return i.replace(r,`${e}/${o}`)}),s=s.replace(vs,(i,r)=>{let o=r.replace(/^@\//,"").replace(Ne,"");return i.replace(r,`${e}/${o}`)}),s};function re(t){let e=t;for(;e!==te(e);){if(N(S(e,"turbo.json"))||N(S(e,".git")))return e;e=te(e)}let s=S(t,"package.json");if(N(s))return te(s);throw new Error("\u274C Could not locate project root")}function ie(t){let e=S(t,"src","app","[locale]");if(N(e))return e;let s=S(t,"apps","web","src","app","[locale]");return N(s),s}var $=t=>{let e=[];if(!N(t))return e;let s=tt(t,{withFileTypes:!0});for(let i of s){let r=S(t,i.name);i.isDirectory()?e.push(...$(r)):e.push(r)}return e},H=t=>N(t)?$(t).length===0:!0,Re=(t,e,s,i,r,o,a=!0)=>{let n=et(t);if(Ie.test(n)){let l=O(e,r),d=i.get(l);if(d&&d!==e){a&&console.log(`\x1B[31mSkipped duplicate page:\x1B[0m ${W(o,e)} (collides with ${W(o,d)})`);return}}try{let l=te(e);N(l)||gs(l,{recursive:!0});let d=xs(t);if(s&&[".js",".jsx",".ts",".tsx"].includes(d)){let c=ws(t,"utf-8"),f=Ns(c,s);ys(e,f)}else _s(t,e);if(a){let c=t.indexOf(S("src","app")),f=c!==-1?t.substring(c):t.startsWith(o)?W(o,t):t,u=e.startsWith(o)?W(o,e):e;console.log(`\x1B[32mCopied:\x1B[0m ${f} \u2192 ${u}`)}if(Ie.test(et(e))){let c=O(e,r);i.set(c,e)}}catch(l){console.error(`\x1B[31mError copying file:\x1B[0m ${t}`,l)}},st=(t,e,s,i,r,o,a=!0)=>{if(!N(t)||H(t))return;let n=$(t);for(let l of n){let d=W(t,l),c=S(e,d);Re(l,c,s,i,r,o,a)}};var ot=({initMessage:t})=>{let e=process.cwd(),s=re(e),i=ie(s),r=se(i),o=rt(e);try{let h=P(e,"package.json");k(h)&&(o=JSON.parse(Rs(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","web","src","app","[locale]","(main)",P("(plugins)",`(${a})`)),l=P(s,"apps","web","src","app","[locale]","admin","(auth)",P("(plugins)",`(${a})`)),d=P(s,"apps","web","src","locales",o),c=[{sourceDir:P(e,"src","app_admin"),destinationDir:l},{sourceDir:P(e,"src","app"),destinationDir:n},{sourceDir:P(e,"src","locales"),destinationDir:d}];for(let{sourceDir:h,destinationDir:g}of c)k(h)&&!H(h)&&!k(g)&&Is(g,{recursive:!0});let f=(h,g)=>{Re(h,g,o,r,i,s)},u=h=>{try{if(k(h)&&(Ss(h),console.log(`\x1B[33mRemoved:\x1B[0m ${h}`),/^page\.(tsx|ts|jsx|js)$/i.test(rt(h)))){let g=O(h,i);r.get(g)===h&&r.delete(g)}}catch(g){console.error(`\x1B[31mError removing file:\x1B[0m ${h}`,g)}},y=(h,g)=>{if(!k(g)||g.includes(P("src","locales")))return;let me=$(g);for(let T of me){let G=it(g,T),bt=P(h,G);k(bt)||u(T)}};for(let{sourceDir:h,destinationDir:g}of c)y(h,g);console.log(`${t} \x1B[34mWatching for changes in plugins...\x1B[0m`);let _=c.map(h=>h.sourceDir).filter(h=>k(h)),D=Ze.watch(_,{ignoreInitial:!1,persistent:!0}),j=h=>{let g=c.filter(({sourceDir:T})=>h.startsWith(T));if(g.length===0)throw new Error(`No matching source directory for: ${h}`);let he=g.reduce((T,G)=>G.sourceDir.length>T.sourceDir.length?G:T),me=it(he.sourceDir,h);return P(he.destinationDir,me)};D.on("add",h=>{let g=j(h);f(h,g)}).on("change",h=>{let g=j(h);f(h,g)}).on("unlink",h=>{let g=j(h);u(g)}).on("error",h=>{console.error("\x1B[31mWatcher error:\x1B[0m",h)})};import*as wt from"dotenv";import{count as gt}from"drizzle-orm";import{drizzle as zs}from"drizzle-orm/postgres-js";import{join as Ms}from"path";import{relations as dt}from"drizzle-orm";import{index as fe,pgTable as ft}from"drizzle-orm/pg-core";import{pgTable as As}from"drizzle-orm/pg-core";var E=As("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 at}from"drizzle-orm";import{index as lt,pgTable as ct}from"drizzle-orm/pg-core";import{relations as ce}from"drizzle-orm";import{index as ne,pgTable as de}from"drizzle-orm/pg-core";import{relations as Ts}from"drizzle-orm";import{index as Se,pgTable as nt}from"drizzle-orm/pg-core";var I=nt("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=>[Se("core_languages_code_idx").on(t.code),Se("core_languages_name_idx").on(t.name)]).enableRLS(),oe=nt("core_languages_words",t=>({id:t.serial().primaryKey(),languageCode:t.varchar().notNull().references(()=>I.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=>[Se("core_languages_words_lang_code_idx").on(t.languageCode)]).enableRLS(),pr=Ts(oe,({one:t})=>({language:t(I,{fields:[oe.languageCode],references:[I.code]})}));var p=de("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(()=>E.id).notNull(),birthday:t.timestamp(),ipAddress:t.varchar({length:40}).notNull(),language:t.varchar({length:32}).notNull().default("en").references(()=>I.code,{onDelete:"set default"})}),t=>[ne("core_users_name_code_idx").on(t.nameCode),ne("core_users_name_idx").on(t.name),ne("core_users_email_idx").on(t.email)]).enableRLS(),Er=ce(p,({one:t,many:e})=>({group:t(E,{fields:[p.roleId],references:[E.id]}),language:t(I,{fields:[p.language],references:[I.code]}),confirm_email:t(ae,{fields:[p.id],references:[ae.userId]}),sso:e(Ae),forgot_password:t(le,{fields:[p.id],references:[le.userId]})})),Ae=de("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=>[ne("core_users_sso_user_id_idx").on(t.userId)]).enableRLS(),br=ce(Ae,({one:t})=>({user:t(p,{fields:[Ae.userId],references:[p.id]})})),ae=de("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(),Pr=ce(ae,({one:t})=>({user:t(p,{fields:[ae.userId],references:[p.id]})})),le=de("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(),Dr=ce(le,({one:t})=>({user:t(p,{fields:[le.userId],references:[p.id]})}));var Y=ct("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=>[lt("core_sessions_user_id_idx").on(t.userId)]).enableRLS(),Sr=at(Y,({one:t})=>({user:t(p,{fields:[Y.userId],references:[p.id]}),device:t(A,{fields:[Y.deviceId],references:[A.id]})})),A=ct("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=>[lt("core_sessions_known_devices_ip_address_idx").on(t.ipAddress)]).enableRLS(),Ar=at(A,({one:t})=>({session:t(Y,{fields:[A.id],references:[Y.deviceId]})}));var U=ft("core_admin_permissions",t=>({id:t.serial().primaryKey(),roleId:t.integer().references(()=>E.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=>[fe("core_admin_permissions_role_id_idx").on(t.roleId),fe("core_admin_permissions_user_id_idx").on(t.userId)]).enableRLS(),jr=dt(U,({one:t})=>({group:t(E,{fields:[U.roleId],references:[E.id]}),user:t(p,{fields:[U.userId],references:[p.id]})})),Te=ft("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=>[fe("core_admin_sessions_token_idx").on(t.token),fe("core_admin_sessions_user_id_idx").on(t.userId)]).enableRLS(),zr=dt(Te,({one:t})=>({user:t(p,{fields:[Te.userId],references:[p.id]}),device:t(A,{fields:[Te.deviceId],references:[A.id]})}));import{relations as Fs}from"drizzle-orm";import{index as ut,pgTable as ks}from"drizzle-orm/pg-core";var K=ks("core_moderators_permissions",t=>({id:t.serial().primaryKey(),roleId:t.integer().references(()=>E.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=>[ut("core_moderators_permissions_role_id_idx").on(t.roleId),ut("core_moderators_permissions_user_id_idx").on(t.userId)]).enableRLS(),Ur=Fs(K,({one:t})=>({group:t(E,{fields:[K.roleId],references:[E.id]}),user:t(p,{fields:[K.userId],references:[p.id]})}));import{existsSync as mt}from"fs";import{readFile as Ws}from"fs/promises";import{join as R,relative as pt}from"path";import{join as Cs}from"path";import{pathToFileURL as Ls}from"url";var ht=async()=>{let t=Cs(process.cwd(),"src","vitnode.config.ts");try{return(await import(Ls(t).href)).vitNodeConfig}catch(e){console.error("Failed to load config:",e),process.exit(1)}};var _t=async()=>{let e=[...(await ht()).plugins.map(a=>a.pluginId),"@vitnode/core"],s=re(process.cwd()),i=ie(s),r=se(i),o=process.cwd();await Promise.all(e.map(async a=>{let n=R(process.cwd(),"node_modules",a),l="";try{let _=R(n,"package.json");mt(_)&&(l=JSON.parse(await Ws(_,"utf-8")).name??"")}catch(_){console.error(`\x1B[31mError reading package.json for ${a}:\x1B[0m`,_);return}let d=a.replace(/\//g,"-").replace(/@/g,""),c=R(o,"src","app","[locale]","(main)",R("(plugins)",`(${d})`)),f=R(o,"src","app","[locale]","admin","(auth)",R("(plugins)",`(${d})`)),u=R(o,"src","locales",a),y=[{sourceDir:R(n,"src","app_admin"),destinationDir:f},{sourceDir:R(n,"src","app"),destinationDir:c},{sourceDir:R(n,"src","locales"),destinationDir:u}];for(let{sourceDir:_,destinationDir:D}of y)mt(_)&&!H(_)&&(console.log(`\x1B[36mCopying ${a}:\x1B[0m ${pt(s,_)} \u2192 ${pt(s,D)}`),st(_,D,l,r,i,s,!1))}))};import{spawn as js}from"child_process";var ue=async(t,e=[])=>new Promise((s,i)=>{let r=js(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)})});wt.config({path:Ms(process.cwd(),"..","..",".env")});var C=zs({connection:process.env.POSTGRES_URL??"postgresql://root:root@localhost:5432/vitnode",casing:"camelCase"}),Os=async()=>{try{await ue("npm",["run","drizzle-kit","up"]),await ue("npm",["run","drizzle-kit","generate"])}catch(t){console.error("\x1B[31m%s\x1B[0m",t),process.exit(1)}},$s=async()=>{try{await ue("npm",["run","drizzle-kit","migrate"])}catch(t){console.error("\x1B[31m%s\x1B[0m",t),process.exit(1)}},Hs=async()=>{let[t]=await C.select({count:gt()}).from(E).limit(1),[e]=await C.select({count:gt()}).from(I);if(e.count===0&&await C.insert(I).values([{code:"en",name:"English (USA)",default:!0,protected:!0,timezone:"America/New_York"}]),t.count===0){let s=await C.insert(E).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:E.id});await C.insert(oe).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(K).values({roleId:s[2].id,protected:!0}),await C.insert(U).values({roleId:s[3].id,protected:!0})])}},yt=async({initMessage:t})=>{console.log(`${t} [1/4] Prepare plugins files...`),await _t(),console.log(`${t} [2/4] Generate migrations...`),await Os(),console.log(`${t} [3/4] Run migrations...`),await $s(),console.log(`
7
- ${t} [4/4] Insert initial data...`),await Hs(),console.log(`${t} \x1B[32mDatabase prepared successfully.\x1B[0m`),process.exit(0)};var Fe="\x1B[34m[VitNode]\x1B[0m",xt=process.argv[2],Et=process.argv[3];switch(xt){case"init":yt({initMessage:Fe});break;case"plugin":(Et==="--w"||Et==="--watch")&&ot({initMessage:Fe});break;default:console.log(`${Fe} \x1B[31mCommand not found: "${xt??""}"\x1B[0m`),process.exit(1)}
6
+ import{stat as Xt}from"fs";import{stat as Zt,readdir as es}from"fs/promises";import{EventEmitter as ts}from"events";import*as m from"path";import{stat as Pt,lstat as Ce,readdir as Dt,realpath as vt}from"fs/promises";import{Readable as Nt}from"stream";import{resolve as Le,relative as It,join as Rt,sep as St}from"path";var b={FILE_TYPE:"files",DIR_TYPE:"directories",FILE_DIR_TYPE:"files_directories",EVERYTHING_TYPE:"all"},pe={root:".",fileFilter:t=>!0,directoryFilter:t=>!0,type:b.FILE_TYPE,lstat:!1,depth:2147483648,alwaysStat:!1,highWaterMark:4096};Object.freeze(pe);var Me="READDIRP_RECURSIVE_ERROR",At=new Set(["ENOENT","EPERM","EACCES","ELOOP",Me]),We=[b.DIR_TYPE,b.EVERYTHING_TYPE,b.FILE_DIR_TYPE,b.FILE_TYPE],Tt=new Set([b.DIR_TYPE,b.EVERYTHING_TYPE,b.FILE_DIR_TYPE]),Ft=new Set([b.EVERYTHING_TYPE,b.FILE_DIR_TYPE,b.FILE_TYPE]),kt=t=>At.has(t.code),Ct=process.platform==="win32",je=t=>!0,ze=t=>{if(t===void 0)return je;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 je},_e=class extends Nt{constructor(e={}){super({objectMode:!0,autoDestroy:!0,highWaterMark:e.highWaterMark});let s={...pe,...e},{root:i,type:r}=s;this._fileFilter=ze(s.fileFilter),this._directoryFilter=ze(s.directoryFilter);let o=s.lstat?Ce:Pt;Ct?this._stat=a=>o(a,{bigint:!0}):this._stat=o,this._maxDepth=s.depth??pe.depth,this._wantsDir=r?Tt.has(r):!1,this._wantsFile=r?Ft.has(r):!1,this._wantsEverything=r===b.EVERYTHING_TYPE,this._root=Le(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 Dt(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=Le(Rt(s,r));i={path:It(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){kt(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 vt(i),o=await Ce(r);if(o.isFile())return"file";if(o.isDirectory()){let a=r.length;if(i.startsWith(r)&&i.substr(a,1)===St){let n=new Error(`Circular symlink detected: "${i}" points to "${r}"`);return n.code=Me,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 Oe(t,e={}){let s=e.entryType||e.type;if(s==="both"&&(s=b.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&&!We.includes(s))throw new Error(`readdirp: Invalid type passed. Use one of ${We.join(", ")}`)}else throw new Error("readdirp: root argument is required. Usage: readdirp(root, options)");return e.root=t,new _e(e)}import{watchFile as Lt,unwatchFile as $e,watch as Wt}from"fs";import{open as jt,stat as Ye,lstat as zt,realpath as ge}from"fs/promises";import*as y from"path";import{type as Mt}from"os";var Ot="data",xe="end",Ue="close",X=()=>{};var Z=process.platform,Ee=Z==="win32",$t=Z==="darwin",Ht=Z==="linux",Yt=Z==="freebsd",Ke=Mt()==="OS400",x={ALL:"all",READY:"ready",ADD:"add",CHANGE:"change",ADD_DIR:"addDir",UNLINK:"unlink",UNLINK_DIR:"unlinkDir",RAW:"raw",ERROR:"error"},v=x,Ut="watch",Kt={lstat:zt,stat:Ye},F="listeners",q="errHandlers",L="rawEmitters",Gt=[F,q,L],Vt=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=>Vt.has(y.extname(t).slice(1).toLowerCase()),ye=(t,e)=>{t instanceof Set?t.forEach(e):e(t)},z=(t,e,s)=>{let i=t[e];i instanceof Set||(t[e]=i=new Set([i])),i.add(s)},Bt=t=>e=>{let s=t[e];s instanceof Set?s.clear():delete t[e]},M=(t,e,s)=>{let i=t[e];i instanceof Set?i.delete(s):i===s&&delete t[e]},Ge=t=>t instanceof Set?t.size===0:!t,B=new Map;function He(t,e,s,i,r){let o=(a,n)=>{s(t),r(a,n,{watchedPath:t}),n&&t!==n&&J(y.resolve(t,n),F,y.join(t,n))};try{return Wt(t,{persistent:e.persistent},o)}catch(a){i(a);return}}var J=(t,e,s,i,r)=>{let o=B.get(t);o&&ye(o[e],a=>{a(s,i,r)})},Jt=(t,e,s,i)=>{let{listener:r,errHandler:o,rawEmitter:a}=i,n=B.get(e),c;if(!s.persistent)return c=He(t,s,r,o,a),c?c.close.bind(c):void 0;if(n)z(n,F,r),z(n,q,o),z(n,L,a);else{if(c=He(t,s,J.bind(null,e,F),o,J.bind(null,e,L)),!c)return;c.on(v.ERROR,async d=>{let l=J.bind(null,e,q);if(n&&(n.watcherUnusable=!0),Ee&&d.code==="EPERM")try{await(await jt(t,"r")).close(),l(d)}catch{}else l(d)}),n={listeners:r,errHandlers:o,rawEmitters:a,watcher:c},B.set(e,n)}return()=>{M(n,F,r),M(n,q,o),M(n,L,a),Ge(n.listeners)&&(n.watcher.close(),B.delete(e),Gt.forEach(Bt(n)),n.watcher=void 0,Object.freeze(n))}},we=new Map,Qt=(t,e,s,i)=>{let{listener:r,rawEmitter:o}=i,a=we.get(e),n=a&&a.options;return n&&(n.persistent<s.persistent||n.interval>s.interval)&&($e(e),a=void 0),a?(z(a,F,r),z(a,L,o)):(a={listeners:r,rawEmitters:o,options:s,watcher:Lt(e,s,(c,d)=>{ye(a.rawEmitters,f=>{f(v.CHANGE,e,{curr:c,prev:d})});let l=c.mtimeMs;(c.size!==d.size||l>d.mtimeMs||l===0)&&ye(a.listeners,f=>f(t,c))})},we.set(e,a)),()=>{M(a,F,r),M(a,L,o),Ge(a.listeners)&&(we.delete(e),$e(e),a.options=a.watcher=void 0,Object.freeze(a))}},Q=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=X);let d;if(i.usePolling){let l=i.interval!==i.binaryInterval;c.interval=l&&qt(o)?i.binaryInterval:i.interval,d=Qt(e,n,c,{listener:s,rawEmitter:this.fsw._emitRaw})}else d=Jt(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(Ut,e,5)){if(!f||f.mtimeMs===0)try{let u=await Ye(e);if(this.fsw.closed)return;let w=u.atimeMs,_=u.mtimeMs;if((!w||w<=_||_!==n.mtimeMs)&&this.fsw._emit(v.CHANGE,e,u),($t||Ht||Yt)&&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 ge(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(Ot,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(xe,()=>{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 Kt[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 ge(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 ge(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 be="/",ss="//",Xe=".",rs="..",is="string",os=/\\/g,Ve=/\/\//,ns=/\..*\.(sw[px])$|~$|\.subl.*\.tmp/,as=/^\.[/\\]/;function ee(t){return Array.isArray(t)?t:[t]}var Pe=t=>typeof t=="object"&&t!==null&&!(t instanceof RegExp);function cs(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 ls(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 qe(t,e,s){let i=ls(e);for(let r=0;r<t.length;r++){let o=t[r];if(o(i,s))return!0}return!1}function ds(t,e){if(t==null)throw new TypeError("anymatch: specify first argument");let i=ee(t).map(r=>cs(r));return e==null?(r,o)=>qe(i,r,o):qe(i,e)}var Be=t=>{let e=ee(t).flat();if(!e.every(s=>typeof s===is))throw new TypeError(`Non-string provided as watch path: ${e}`);return e.map(Ze)},Je=t=>{let e=t.replace(os,be),s=!1;for(e.startsWith(ss)&&(s=!0);e.match(Ve);)e=e.replace(Ve,be);return s&&(e=be+e),e},Ze=t=>Je(m.normalize(Je(t))),Qe=(t="")=>e=>typeof e=="string"?Ze(m.isAbsolute(e)?e:m.join(t,e)):e,fs=(t,e)=>m.isAbsolute(t)?t:m.join(e,t),us=Object.freeze(new Set),De=class{constructor(e,s){this.path=e,this._removeWatcher=s,this.items=new Set}add(e){let{items:s}=this;s&&e!==Xe&&e!==rs&&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 es(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=X,this.items=us,Object.freeze(this)}},hs="stat",ms="lstat",ve=class{constructor(e,s,i){this.fsw=i;let r=e;this.path=e=e.replace(as,""),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?hs:ms}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)}},te=class extends ts{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?ee(e.ignored):ee([]),awaitWriteFinish:s===!0?i:typeof s=="object"?{...i,...s}:!1};Ke&&(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=X,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 Q(this),Object.freeze(r)}_addIgnoredPath(e){if(Pe(e)){for(let s of this._ignoredPaths)if(Pe(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)Pe(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=Be(e);return r&&(o=o.map(a=>fs(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=Be(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)||Xe;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;Ee&&(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 Zt(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){Xt(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 j=l.get(e);D-j.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&&ns.test(e))return!0;if(!this._userIgnored){let{cwd:i}=this.options,o=(this.options.ignored||[]).map(Qe(i)),n=[...[...this._ignoredPaths].map(Qe(i)),...o];this._userIgnored=ds(n,void 0)}return this._userIgnored(e,s)}_isntIgnored(e,s){return!this._isIgnored(e,s)}_getWatchHelpers(e){return new ve(e,this.options.followSymlinks,this)}_getWatchedDir(e){let s=m.resolve(e);return this._watched.has(s)||this._watched.set(s,new De(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=Oe(e,i);return this._streams.add(r),r.once(Ue,()=>{r=void 0}),r.once(xe,()=>{r&&(this._streams.delete(r),r=void 0)}),r}};function ps(t,e={}){let s=new te(e);return s.add(t),s}var et={watch:ps,FSWatcher:te};import{existsSync as k,mkdirSync as Is,readFileSync as Rs,unlinkSync as Ss}from"fs";import{basename as rt,join as P,relative as it}from"path";import{copyFileSync as _s,existsSync as I,mkdirSync as gs,readdirSync as Re,readFileSync as ws,writeFileSync as ys}from"fs";import{basename as tt,dirname as O,extname as xs,join as N,normalize as Es,relative as W,sep as bs}from"path";var Ps=/import\s+(?:(?:{[^}]*})|(?:[^{}\s,]*))?\s*(?:,\s*(?:{[^}]*}))?\s*from\s+['"]([./]+[^'"]*)['"]/g,Ds=/import\s+(?:(?:{[^}]*})|(?:[^{}\s,]*))?\s*(?:,\s*(?:{[^}]*}))?\s*from\s+['"](@\/[^'"]*)['"]/g,vs=/import\s*\(\s*['"](@\/[^'"]*)['"]\s*\)/g,Ne=/\.(js|jsx|ts|tsx)$/,Ie=/^page\.(tsx|ts|jsx|js)$/i,$=(t,e)=>{let i=W(e,t).split(bs);i.pop();let r=i.filter(o=>!o.startsWith("("));return Es(r.join("/"))},se=t=>{let e=new Map,s=i=>{if(I(i))for(let r of Re(i,{withFileTypes:!0})){let o=N(i,r.name);if(r.isDirectory()){s(o);continue}if(Ie.test(r.name)){let a=$(o,t);e.set(a,o)}}};return s(t),e},Ns=(t,e)=>{let s=t.replace(Ps,(i,r)=>{if(r.startsWith(".")){let a=r.replace(Ne,"").replace(/^(?:\.\.\/)+/,"");return i.replace(r,`${e}/${a}`)}return i});return s=s.replace(Ds,(i,r)=>{let o=r.replace(/^@\//,"").replace(Ne,"");return i.replace(r,`${e}/${o}`)}),s=s.replace(vs,(i,r)=>{let o=r.replace(/^@\//,"").replace(Ne,"");return i.replace(r,`${e}/${o}`)}),s};function re(t){let e=t;for(;e!==O(e);){if(I(N(e,"turbo.json"))||I(N(e,".git")))return e;e=O(e)}let s=N(t,"package.json");if(I(s))return O(s);throw new Error("\u274C Could not locate project root")}function ie(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=Re(c,{withFileTypes:!0});for(let f of l){if(!f.isDirectory())continue;let u=N(c,f.name);if(f.name==="[locale]"&&O(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 H=t=>{let e=[];if(!I(t))return e;let s=Re(t,{withFileTypes:!0});for(let i of s){let r=N(t,i.name);i.isDirectory()?e.push(...H(r)):e.push(r)}return e},Y=t=>I(t)?H(t).length===0:!0,Se=(t,e,s,i,r,o,a=!0)=>{let n=tt(t);if(Ie.test(n)){let c=$(e,r),d=i.get(c);if(d&&d!==e){a&&console.log(`\x1B[31mSkipped duplicate page:\x1B[0m ${W(o,e)} (collides with ${W(o,d)})`);return}}try{let c=O(e);I(c)||gs(c,{recursive:!0});let d=xs(t);if(s&&[".js",".jsx",".ts",".tsx"].includes(d)){let l=ws(t,"utf-8"),f=Ns(l,s);ys(e,f)}else _s(t,e);if(a){let l=t.indexOf(N("src","app")),f=l!==-1?t.substring(l):t.startsWith(o)?W(o,t):t,u=e.startsWith(o)?W(o,e):e;console.log(`\x1B[32mCopied:\x1B[0m ${f} \u2192 ${u}`)}if(Ie.test(tt(e))){let l=$(e,r);i.set(l,e)}}catch(c){console.error(`\x1B[31mError copying file:\x1B[0m ${t}`,c)}},st=(t,e,s,i,r,o,a=!0)=>{if(!I(t)||Y(t))return;let n=H(t);for(let c of n){let d=W(t,c),l=N(e,d);Se(c,l,s,i,r,o,a)}};var ot=({initMessage:t})=>{let e=process.cwd(),s=re(e),i=ie(s),r=se(i),o=rt(e);try{let h=P(e,"package.json");k(h)&&(o=JSON.parse(Rs(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)&&!Y(h)&&!k(g)&&Is(g,{recursive:!0});let f=(h,g)=>{Se(h,g,o,r,i,s)},u=h=>{try{if(k(h)&&(Ss(h),console.log(`\x1B[33mRemoved:\x1B[0m ${h}`),/^page\.(tsx|ts|jsx|js)$/i.test(rt(h)))){let g=$(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 me=H(g);for(let T of me){let V=it(g,T),bt=P(h,V);k(bt)||u(T)}};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=et.watch(_,{ignoreInitial:!1,persistent:!0}),j=h=>{let g=l.filter(({sourceDir:T})=>h.startsWith(T));if(g.length===0)throw new Error(`No matching source directory for: ${h}`);let he=g.reduce((T,V)=>V.sourceDir.length>T.sourceDir.length?V:T),me=it(he.sourceDir,h);return P(he.destinationDir,me)};D.on("add",h=>{let g=j(h);f(h,g)}).on("change",h=>{let g=j(h);f(h,g)}).on("unlink",h=>{let g=j(h);u(g)}).on("error",h=>{console.error("\x1B[31mWatcher error:\x1B[0m",h)})};import*as wt from"dotenv";import{count as gt}from"drizzle-orm";import{drizzle as zs}from"drizzle-orm/postgres-js";import{join as Ms}from"path";import{relations as dt}from"drizzle-orm";import{index as fe,pgTable as ft}from"drizzle-orm/pg-core";import{pgTable as As}from"drizzle-orm/pg-core";var E=As("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 at}from"drizzle-orm";import{index as ct,pgTable as lt}from"drizzle-orm/pg-core";import{relations as le}from"drizzle-orm";import{index as ne,pgTable as de}from"drizzle-orm/pg-core";import{relations as Ts}from"drizzle-orm";import{index as Ae,pgTable as nt}from"drizzle-orm/pg-core";var R=nt("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=>[Ae("core_languages_code_idx").on(t.code),Ae("core_languages_name_idx").on(t.name)]).enableRLS(),oe=nt("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=>[Ae("core_languages_words_lang_code_idx").on(t.languageCode)]).enableRLS(),pr=Ts(oe,({one:t})=>({language:t(R,{fields:[oe.languageCode],references:[R.code]})}));var p=de("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(()=>E.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=>[ne("core_users_name_code_idx").on(t.nameCode),ne("core_users_name_idx").on(t.name),ne("core_users_email_idx").on(t.email)]).enableRLS(),Er=le(p,({one:t,many:e})=>({group:t(E,{fields:[p.roleId],references:[E.id]}),language:t(R,{fields:[p.language],references:[R.code]}),confirm_email:t(ae,{fields:[p.id],references:[ae.userId]}),sso:e(Te),forgot_password:t(ce,{fields:[p.id],references:[ce.userId]})})),Te=de("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=>[ne("core_users_sso_user_id_idx").on(t.userId)]).enableRLS(),br=le(Te,({one:t})=>({user:t(p,{fields:[Te.userId],references:[p.id]})})),ae=de("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(),Pr=le(ae,({one:t})=>({user:t(p,{fields:[ae.userId],references:[p.id]})})),ce=de("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(),Dr=le(ce,({one:t})=>({user:t(p,{fields:[ce.userId],references:[p.id]})}));var U=lt("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=>[ct("core_sessions_user_id_idx").on(t.userId)]).enableRLS(),Sr=at(U,({one:t})=>({user:t(p,{fields:[U.userId],references:[p.id]}),device:t(A,{fields:[U.deviceId],references:[A.id]})})),A=lt("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=>[ct("core_sessions_known_devices_ip_address_idx").on(t.ipAddress)]).enableRLS(),Ar=at(A,({one:t})=>({session:t(U,{fields:[A.id],references:[U.deviceId]})}));var K=ft("core_admin_permissions",t=>({id:t.serial().primaryKey(),roleId:t.integer().references(()=>E.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=>[fe("core_admin_permissions_role_id_idx").on(t.roleId),fe("core_admin_permissions_user_id_idx").on(t.userId)]).enableRLS(),jr=dt(K,({one:t})=>({group:t(E,{fields:[K.roleId],references:[E.id]}),user:t(p,{fields:[K.userId],references:[p.id]})})),Fe=ft("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=>[fe("core_admin_sessions_token_idx").on(t.token),fe("core_admin_sessions_user_id_idx").on(t.userId)]).enableRLS(),zr=dt(Fe,({one:t})=>({user:t(p,{fields:[Fe.userId],references:[p.id]}),device:t(A,{fields:[Fe.deviceId],references:[A.id]})}));import{relations as Fs}from"drizzle-orm";import{index as ut,pgTable as ks}from"drizzle-orm/pg-core";var G=ks("core_moderators_permissions",t=>({id:t.serial().primaryKey(),roleId:t.integer().references(()=>E.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=>[ut("core_moderators_permissions_role_id_idx").on(t.roleId),ut("core_moderators_permissions_user_id_idx").on(t.userId)]).enableRLS(),Ur=Fs(G,({one:t})=>({group:t(E,{fields:[G.roleId],references:[E.id]}),user:t(p,{fields:[G.userId],references:[p.id]})}));import{existsSync as mt}from"fs";import{readFile as Ws}from"fs/promises";import{join as S,relative as pt}from"path";import{join as Cs}from"path";import{pathToFileURL as Ls}from"url";var ht=async()=>{let t=Cs(process.cwd(),"src","vitnode.config.ts");try{return(await import(Ls(t).href)).vitNodeConfig}catch(e){console.error("Failed to load config:",e),process.exit(1)}};var _t=async()=>{let e=[...(await ht()).plugins.map(a=>a.pluginId),"@vitnode/core"],s=re(process.cwd()),i=ie(s),r=se(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");mt(_)&&(c=JSON.parse(await Ws(_,"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)mt(_)&&!Y(_)&&(console.log(`\x1B[36mCopying ${a}:\x1B[0m ${pt(s,_)} \u2192 ${pt(s,D)}`),st(_,D,c,r,i,s,!1))}))};import{spawn as js}from"child_process";var ue=async(t,e=[])=>new Promise((s,i)=>{let r=js(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)})});wt.config({path:Ms(process.cwd(),"..","..",".env")});var C=zs({connection:process.env.POSTGRES_URL??"postgresql://root:root@localhost:5432/vitnode",casing:"camelCase"}),Os=async()=>{try{await ue("npm",["run","drizzle-kit","up"]),await ue("npm",["run","drizzle-kit","generate"])}catch(t){console.error("\x1B[31m%s\x1B[0m",t),process.exit(1)}},$s=async()=>{try{await ue("npm",["run","drizzle-kit","migrate"])}catch(t){console.error("\x1B[31m%s\x1B[0m",t),process.exit(1)}},Hs=async()=>{let[t]=await C.select({count:gt()}).from(E).limit(1),[e]=await C.select({count:gt()}).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(E).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:E.id});await C.insert(oe).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(G).values({roleId:s[2].id,protected:!0}),await C.insert(K).values({roleId:s[3].id,protected:!0})])}},yt=async({initMessage:t})=>{console.log(`${t} [1/4] Prepare plugins files...`),await _t(),console.log(`${t} [2/4] Generate migrations...`),await Os(),console.log(`${t} [3/4] Run migrations...`),await $s(),console.log(`
7
+ ${t} [4/4] Insert initial data...`),await Hs(),console.log(`${t} \x1B[32mDatabase prepared successfully.\x1B[0m`),process.exit(0)};var ke="\x1B[34m[VitNode]\x1B[0m",xt=process.argv[2],Et=process.argv[3];switch(xt){case"init":yt({initMessage:ke});break;case"plugin":(Et==="--w"||Et==="--watch")&&ot({initMessage:ke});break;default:console.log(`${ke} \x1B[31mCommand not found: "${xt??""}"\x1B[0m`),process.exit(1)}
8
8
  /*! Bundled license information:
9
9
 
10
10
  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,CAevD;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,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 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/api/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAOjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAWxE,UAAU,WAAW;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EACF,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC,GAC3D,MAAM,GACN,MAAM,EAAE,CAAC;CACd;AAED,KAAK,sBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;AAC5E,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,sBAAsB,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;CACrD;AAED,wBAAgB,UAAU,CAAC,EACzB,GAAG,EACH,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,WAAW,EACjB,gBAAgB,EAChB,aAAa,GACd,EAAE;IACD,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,aAAa,EAAE,aAAa,CAAC;CAC9B,oCAmDA"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/api/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAOjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAWxE,UAAU,WAAW;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EACF,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC,GAC3D,MAAM,GACN,MAAM,EAAE,CAAC;CACd;AAED,KAAK,sBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;AAC5E,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,sBAAsB,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;CACrD;AAED,wBAAgB,UAAU,CAAC,EACzB,GAAG,EACH,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,WAAW,EACjB,gBAAgB,EAChB,aAAa,GACd,EAAE;IACD,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,aAAa,EAAE,aAAa,CAAC;CAC9B,oCAoDA"}
@@ -24,7 +24,8 @@ export function VitNodeAPI({ app, cors: corsOptions, csrf: csrfOptions, vitNodeA
24
24
  emailAdapter: vitNodeApiConfig.emailAdapter,
25
25
  metadata: vitNodeConfig.metadata,
26
26
  authorization: vitNodeApiConfig.authorization,
27
- dbProvider: vitNodeApiConfig.dbProvider
27
+ dbProvider: vitNodeApiConfig.dbProvider,
28
+ captcha: vitNodeApiConfig.captcha
28
29
  }));
29
30
  app.use(async (c, next)=>{
30
31
  if (c.req.path.includes('/admin/')) {
@@ -4,6 +4,7 @@ type RoutingPath<P extends string> = P extends `${infer Head}/{${infer Param}}${
4
4
  type ValidHandler<R extends RouteConfig> = (c: Parameters<RouteHandler<R, EnvVitNode>>[0]) => ReturnType<RouteHandler<R>>;
5
5
  export declare const buildRoute: <Plugin extends string, P extends string, R extends Omit<RouteConfig, "path"> & {
6
6
  path: P;
7
+ withCaptcha?: boolean;
7
8
  }, H extends ValidHandler<R & {
8
9
  path: P;
9
10
  }>>({ route, handler, pluginId, }: {
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/api/lib/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAInE,OAAO,EACL,KAAK,UAAU,EAEhB,MAAM,kCAAkC,CAAC;AAE1C,KAAK,WAAW,CAAC,CAAC,SAAS,MAAM,IAC/B,CAAC,SAAS,GAAG,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE,GACnD,GAAG,IAAI,KAAK,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,GACvC,CAAC,CAAC;AAER,KAAK,YAAY,CAAC,CAAC,SAAS,WAAW,IAAI,CACzC,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,KAC1C,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjC,eAAO,MAAM,UAAU,GACrB,MAAM,SAAS,MAAM,EACrB,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG;IACpC,IAAI,EAAE,CAAC,CAAC;CACT,EACD,CAAC,SAAS,YAAY,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,EACvC,+BAIC;IACD,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,CAAC,CAAC;CACV,KAAG;IACF,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,CAAC,GAAG;QACT,cAAc,EAAE,MAAM,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;KAC9C,CAAC;CA2BH,CAAC;AAEF,MAAM,WAAW,KAAK,CACpB,MAAM,SAAS,MAAM,GAAG,MAAM,EAC9B,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IAE3C,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,CAAC,CAAC;CACV"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/api/lib/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKnE,OAAO,EACL,KAAK,UAAU,EAEhB,MAAM,kCAAkC,CAAC;AAE1C,KAAK,WAAW,CAAC,CAAC,SAAS,MAAM,IAC/B,CAAC,SAAS,GAAG,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE,GACnD,GAAG,IAAI,KAAK,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,GACvC,CAAC,CAAC;AAER,KAAK,YAAY,CAAC,CAAC,SAAS,WAAW,IAAI,CACzC,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,KAC1C,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjC,eAAO,MAAM,UAAU,GACrB,MAAM,SAAS,MAAM,EACrB,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG;IACpC,IAAI,EAAE,CAAC,CAAC;IACR,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,EACD,CAAC,SAAS,YAAY,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,EACvC,+BAIC;IACD,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,CAAC,CAAC;CACV,KAAG;IACF,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,CAAC,GAAG;QACT,cAAc,EAAE,MAAM,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;KAC9C,CAAC;CA4BH,CAAC;AAEF,MAAM,WAAW,KAAK,CACpB,MAAM,SAAS,MAAM,GAAG,MAAM,EAC9B,CAAC,SAAS,WAAW,GAAG,WAAW,EACnC,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IAE3C,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,CAAC,CAAC;CACV"}
@@ -1,4 +1,5 @@
1
1
  import { createRoute as createRouteHono } from "@hono/zod-openapi";
2
+ import { captchaMiddleware } from "../middlewares/captcha.middleware.js";
2
3
  import { pluginMiddleware } from "../middlewares/global.middleware.js";
3
4
  export const buildRoute = ({ route, handler, pluginId })=>{
4
5
  const pluginTag = pluginId.split(/[-_]/).map((word)=>word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
@@ -11,6 +12,9 @@ export const buildRoute = ({ route, handler, pluginId })=>{
11
12
  tags,
12
13
  middleware: [
13
14
  pluginMiddleware(pluginId),
15
+ ...route.withCaptcha ? [
16
+ captchaMiddleware()
17
+ ] : [],
14
18
  ...Array.isArray(route.middleware) ? route.middleware : route.middleware ? [
15
19
  route.middleware
16
20
  ] : []
@@ -0,0 +1,3 @@
1
+ import type { Context, Next } from 'hono';
2
+ export declare const captchaMiddleware: () => (c: Context, next: Next) => Promise<void>;
3
+ //# sourceMappingURL=captcha.middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captcha.middleware.d.ts","sourceRoot":"","sources":["../../../../src/api/middlewares/captcha.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAoE1C,eAAO,MAAM,iBAAiB,SACd,GAAG,OAAO,EAAE,MAAM,IAAI,kBAuBrC,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { HTTPException } from "hono/http-exception";
2
+ const getResFromReCaptcha = async ({ token, userIp, captchaConfig })=>{
3
+ if (captchaConfig.type === 'cloudflare_turnstile') {
4
+ const res = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', {
5
+ method: 'POST',
6
+ body: JSON.stringify({
7
+ secret: captchaConfig.secretKey,
8
+ response: token,
9
+ remoteip: userIp
10
+ }),
11
+ headers: {
12
+ 'Content-Type': 'application/json'
13
+ }
14
+ });
15
+ const data = await res.json();
16
+ return {
17
+ success: data.success,
18
+ score: data.success ? 1 : 0,
19
+ 'error-codes': data['error-codes']
20
+ };
21
+ } else if (captchaConfig.type === 'recaptcha_v3') {
22
+ const res = await fetch(`https://www.google.com/recaptcha/api/siteverify?secret=${captchaConfig.secretKey}&response=${token}&remoteip=${userIp}`, {
23
+ method: 'POST'
24
+ });
25
+ const data = await res.json();
26
+ return {
27
+ success: data.success,
28
+ score: data.score ?? 0,
29
+ 'error-codes': data['error-codes']
30
+ };
31
+ }
32
+ return {
33
+ success: false,
34
+ score: 0
35
+ };
36
+ };
37
+ export const captchaMiddleware = ()=>{
38
+ return async (c, next)=>{
39
+ const token = c.req.header('x-vitnode-captcha-token');
40
+ const captchaConfig = c.get('core').captcha;
41
+ if (!token || !captchaConfig) {
42
+ throw new HTTPException(400, {
43
+ message: 'Captcha token is required'
44
+ });
45
+ }
46
+ const res = await getResFromReCaptcha({
47
+ token,
48
+ userIp: c.get('ipAddress'),
49
+ captchaConfig
50
+ });
51
+ if (!res.success || res.score < 0.5) {
52
+ throw new HTTPException(400, {
53
+ message: 'Captcha validation failed'
54
+ });
55
+ }
56
+ await next();
57
+ };
58
+ };
@@ -30,8 +30,9 @@ interface EnvVariablesVitNode {
30
30
  cookieSecure: boolean;
31
31
  deviceCookieExpires: number;
32
32
  deviceCookieName: string;
33
- ssoProviders: SSOApiPlugin[];
33
+ ssoAdapters: SSOApiPlugin[];
34
34
  };
35
+ captcha?: Pick<VitNodeApiConfig, 'captcha'>['captcha'];
35
36
  emailAdapter?: EmailApiPlugin;
36
37
  metadata: {
37
38
  shortTitle?: string;
@@ -61,7 +62,7 @@ declare module 'hono' {
61
62
  interface ContextVariableMap extends EnvVariablesVitNode {
62
63
  }
63
64
  }
64
- export declare const globalMiddleware: ({ authorization, metadata, emailAdapter, dbProvider, }: Pick<VitNodeApiConfig, "authorization" | "dbProvider" | "emailAdapter"> & Pick<VitNodeConfig, "metadata">) => (c: Context, next: Next) => Promise<void>;
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>;
65
66
  export declare const pluginMiddleware: (pluginId: string) => (c: Context, next: Next) => Promise<void>;
66
67
  export declare const globalAdminMiddleware: () => (c: Context, next: Next) => Promise<void>;
67
68
  export {};
@@ -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,YAAY,EAAE,YAAY,EAAE,CAAC;SAC9B,CAAC;QACF,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,wDAK9B,IAAI,CAAC,gBAAgB,EAAE,eAAe,GAAG,YAAY,GAAG,cAAc,CAAC,GACxE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,MACjB,GAAG,OAAO,EAAE,MAAM,IAAI,kBAwErC,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,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"}
@@ -2,7 +2,7 @@ import { HTTPException } from "hono/http-exception";
2
2
  import { SessionModel } from "../models/session.js";
3
3
  import { SessionAdminModel } from "../models/session-admin.js";
4
4
  import { loggerMiddleware } from "../lib/logger-middleware.js";
5
- export const globalMiddleware = ({ authorization, metadata, emailAdapter, dbProvider })=>{
5
+ export const globalMiddleware = ({ authorization, metadata, emailAdapter, dbProvider, captcha })=>{
6
6
  return async (c, next)=>{
7
7
  // Collect possible IP header keys in order of trust/preference
8
8
  const ipHeaderKeys = [
@@ -51,13 +51,14 @@ export const globalMiddleware = ({ authorization, metadata, emailAdapter, dbProv
51
51
  authorization: {
52
52
  cookieName: authorization?.cookieName ?? 'vitnode_auth',
53
53
  cookie_expires: authorization?.cookieExpires ?? 1000 * 60 * 60 * 24 * 90,
54
- ssoProviders: authorization?.ssoProviders ?? [],
54
+ ssoAdapters: authorization?.ssoAdapters ?? [],
55
55
  deviceCookieName: authorization?.deviceCookieName ?? 'vitnode_device',
56
56
  deviceCookieExpires: authorization?.deviceCookieExpires ?? 1000 * 60 * 60 * 24 * 365,
57
57
  adminCookieName: authorization?.adminCookieName ?? 'vitnode_auth_admin',
58
58
  adminCookieExpires: authorization?.adminCookieExpires ?? 1000 * 60 * 60 * 24 * 1,
59
59
  cookieSecure: authorization?.cookieSecure ?? true
60
- }
60
+ },
61
+ captcha
61
62
  });
62
63
  const user = await new SessionModel(c).getUser();
63
64
  c.set('user', user);
@@ -10,7 +10,7 @@ export const getRedirectUri = (code)=>new URL(`${CONFIG.frontend.href}login/sso/
10
10
  export class SSOModel {
11
11
  constructor(c){
12
12
  this.c = c;
13
- this.plugins = c.get('core').authorization.ssoProviders;
13
+ this.plugins = c.get('core').authorization.ssoAdapters;
14
14
  }
15
15
  c;
16
16
  plugins;
@@ -203,6 +203,7 @@ export declare const adminModule: import("../../../api/lib/module").BuildModuleR
203
203
  nameCode: string;
204
204
  }>>;
205
205
  }, "strip", import("zod").ZodTypeAny, {
206
+ method: string;
206
207
  ipAddress: string;
207
208
  user: {
208
209
  id: number;
@@ -216,9 +217,9 @@ export declare const adminModule: import("../../../api/lib/module").BuildModuleR
216
217
  path: string;
217
218
  pluginId: string;
218
219
  content: string;
219
- method: string;
220
220
  statusCode: number;
221
221
  }, {
222
+ method: string;
222
223
  ipAddress: string;
223
224
  user: {
224
225
  id: number;
@@ -232,7 +233,6 @@ export declare const adminModule: import("../../../api/lib/module").BuildModuleR
232
233
  path: string;
233
234
  pluginId: string;
234
235
  content: string;
235
- method: string;
236
236
  statusCode: number;
237
237
  }>, "many">;
238
238
  pageInfo: import("zod").ZodObject<{
@@ -259,6 +259,7 @@ export declare const adminModule: import("../../../api/lib/module").BuildModuleR
259
259
  }>;
260
260
  }, "strip", import("zod").ZodTypeAny, {
261
261
  edges: {
262
+ method: string;
262
263
  ipAddress: string;
263
264
  user: {
264
265
  id: number;
@@ -272,7 +273,6 @@ export declare const adminModule: import("../../../api/lib/module").BuildModuleR
272
273
  path: string;
273
274
  pluginId: string;
274
275
  content: string;
275
- method: string;
276
276
  statusCode: number;
277
277
  }[];
278
278
  pageInfo: {
@@ -285,6 +285,7 @@ export declare const adminModule: import("../../../api/lib/module").BuildModuleR
285
285
  };
286
286
  }, {
287
287
  edges: {
288
+ method: string;
288
289
  ipAddress: string;
289
290
  user: {
290
291
  id: number;
@@ -298,7 +299,6 @@ export declare const adminModule: import("../../../api/lib/module").BuildModuleR
298
299
  path: string;
299
300
  pluginId: string;
300
301
  content: string;
301
- method: string;
302
302
  statusCode: number;
303
303
  }[];
304
304
  pageInfo: {
@@ -102,6 +102,7 @@ export declare const debugAdminModule: import("../../../lib/module").BuildModule
102
102
  nameCode: string;
103
103
  }>>;
104
104
  }, "strip", import("zod").ZodTypeAny, {
105
+ method: string;
105
106
  ipAddress: string;
106
107
  user: {
107
108
  id: number;
@@ -115,9 +116,9 @@ export declare const debugAdminModule: import("../../../lib/module").BuildModule
115
116
  path: string;
116
117
  pluginId: string;
117
118
  content: string;
118
- method: string;
119
119
  statusCode: number;
120
120
  }, {
121
+ method: string;
121
122
  ipAddress: string;
122
123
  user: {
123
124
  id: number;
@@ -131,7 +132,6 @@ export declare const debugAdminModule: import("../../../lib/module").BuildModule
131
132
  path: string;
132
133
  pluginId: string;
133
134
  content: string;
134
- method: string;
135
135
  statusCode: number;
136
136
  }>, "many">;
137
137
  pageInfo: import("zod").ZodObject<{
@@ -158,6 +158,7 @@ export declare const debugAdminModule: import("../../../lib/module").BuildModule
158
158
  }>;
159
159
  }, "strip", import("zod").ZodTypeAny, {
160
160
  edges: {
161
+ method: string;
161
162
  ipAddress: string;
162
163
  user: {
163
164
  id: number;
@@ -171,7 +172,6 @@ export declare const debugAdminModule: import("../../../lib/module").BuildModule
171
172
  path: string;
172
173
  pluginId: string;
173
174
  content: string;
174
- method: string;
175
175
  statusCode: number;
176
176
  }[];
177
177
  pageInfo: {
@@ -184,6 +184,7 @@ export declare const debugAdminModule: import("../../../lib/module").BuildModule
184
184
  };
185
185
  }, {
186
186
  edges: {
187
+ method: string;
187
188
  ipAddress: string;
188
189
  user: {
189
190
  id: number;
@@ -197,7 +198,6 @@ export declare const debugAdminModule: import("../../../lib/module").BuildModule
197
198
  path: string;
198
199
  pluginId: string;
199
200
  content: string;
200
- method: string;
201
201
  statusCode: number;
202
202
  }[];
203
203
  pageInfo: {
@@ -103,6 +103,7 @@ export declare const logsDebugAdminRoute: {
103
103
  nameCode: string;
104
104
  }>>;
105
105
  }, "strip", z.ZodTypeAny, {
106
+ method: string;
106
107
  ipAddress: string;
107
108
  user: {
108
109
  id: number;
@@ -116,9 +117,9 @@ export declare const logsDebugAdminRoute: {
116
117
  path: string;
117
118
  pluginId: string;
118
119
  content: string;
119
- method: string;
120
120
  statusCode: number;
121
121
  }, {
122
+ method: string;
122
123
  ipAddress: string;
123
124
  user: {
124
125
  id: number;
@@ -132,7 +133,6 @@ export declare const logsDebugAdminRoute: {
132
133
  path: string;
133
134
  pluginId: string;
134
135
  content: string;
135
- method: string;
136
136
  statusCode: number;
137
137
  }>, "many">;
138
138
  pageInfo: z.ZodObject<{
@@ -159,6 +159,7 @@ export declare const logsDebugAdminRoute: {
159
159
  }>;
160
160
  }, "strip", z.ZodTypeAny, {
161
161
  edges: {
162
+ method: string;
162
163
  ipAddress: string;
163
164
  user: {
164
165
  id: number;
@@ -172,7 +173,6 @@ export declare const logsDebugAdminRoute: {
172
173
  path: string;
173
174
  pluginId: string;
174
175
  content: string;
175
- method: string;
176
176
  statusCode: number;
177
177
  }[];
178
178
  pageInfo: {
@@ -185,6 +185,7 @@ export declare const logsDebugAdminRoute: {
185
185
  };
186
186
  }, {
187
187
  edges: {
188
+ method: string;
188
189
  ipAddress: string;
189
190
  user: {
190
191
  id: number;
@@ -198,7 +199,6 @@ export declare const logsDebugAdminRoute: {
198
199
  path: string;
199
200
  pluginId: string;
200
201
  content: string;
201
- method: string;
202
202
  statusCode: number;
203
203
  }[];
204
204
  pageInfo: {