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