vector-framework 0.9.7 → 0.9.9
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/README.md +516 -346
- package/dist/cli/index.js +63 -64
- package/dist/cli/index.js.map +1 -1
- package/dist/cli.js +480 -424
- package/dist/core/router.d.ts +1 -0
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/router.js +73 -25
- package/dist/core/router.js.map +1 -1
- package/dist/core/vector.d.ts.map +1 -1
- package/dist/core/vector.js +8 -4
- package/dist/core/vector.js.map +1 -1
- package/dist/dev/route-scanner.d.ts +5 -2
- package/dist/dev/route-scanner.d.ts.map +1 -1
- package/dist/dev/route-scanner.js +63 -16
- package/dist/dev/route-scanner.js.map +1 -1
- package/dist/http.d.ts +2 -2
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +3 -4
- package/dist/http.js.map +1 -1
- package/dist/index.js +7 -7
- package/dist/index.mjs +7 -7
- package/dist/middleware/manager.d.ts.map +1 -1
- package/dist/middleware/manager.js +8 -1
- package/dist/middleware/manager.js.map +1 -1
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -2
- package/src/cli/index.ts +78 -78
- package/src/core/router.ts +85 -27
- package/src/core/vector.ts +9 -4
- package/src/dev/route-scanner.ts +76 -18
- package/src/http.ts +8 -13
- package/src/middleware/manager.ts +7 -1
- package/src/types/index.ts +5 -0
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
var{defineProperty:Q,getOwnPropertyNames:_i,getOwnPropertyDescriptor:di}=Object,Oi=Object.prototype.hasOwnProperty;var n=new WeakMap,Ni=(i)=>{var l=n.get(i),f;if(l)return l;if(l=Q({},"__esModule",{value:!0}),i&&typeof i==="object"||typeof i==="function")_i(i).map((a)=>!Oi.call(l,a)&&Q(l,a,{get:()=>i[a],enumerable:!(f=di(i,a))||f.enumerable}));return n.set(i,l),l};var s=(i,l)=>{for(var f in l)Q(i,f,{get:l[f],enumerable:!0,configurable:!0,set:(a)=>l[f]=()=>a})};var U=(i,l)=>()=>(i&&(l=i(i=0)),l);var h=(i="text/plain; charset=utf-8",l)=>(f,a={})=>{if(f===void 0||f instanceof Response)return f;let E=new Response(l?.(f)??f,a.url?void 0:a);return E.headers.set("content-type",i),E},Fi,ji,Mi,Ti,Bi,Yi,r=async(i)=>{i.content=i.body?await i.clone().json().catch(()=>i.clone().formData()).catch(()=>i.text()):void 0},y=(i)=>{i.cookies=(i.headers.get("Cookie")||"").split(/;\s*/).map((l)=>l.split(/=(.+)/)).reduce((l,[f,a])=>a?(l[f]=a,l):l,{})},j=(i={})=>{let{origin:l="*",credentials:f=!1,allowMethods:a="*",allowHeaders:E,exposeHeaders:A,maxAge:d}=i,_=(I)=>{let O=I?.headers.get("origin");return l===!0?O:l instanceof RegExp?l.test(O)?O:void 0:Array.isArray(l)?l.includes(O)?O:void 0:l instanceof Function?l(O):l=="*"&&f?O:l},N=(I,O)=>{for(let[w,L]of Object.entries(O))L&&I.headers.append(w,L);return I};return{corsify:(I,O)=>I?.headers?.get("access-control-allow-origin")||I.status==101?I:N(I.clone(),{"access-control-allow-origin":_(O),"access-control-allow-credentials":f}),preflight:(I)=>{if(I.method=="OPTIONS"){let O=new Response(null,{status:204});return N(O,{"access-control-allow-origin":_(I),"access-control-allow-methods":a?.join?.(",")??a,"access-control-expose-headers":A?.join?.(",")??A,"access-control-allow-headers":E?.join?.(",")??E??I.headers.get("access-control-request-headers"),"access-control-max-age":d,"access-control-allow-credentials":f})}}}};var V=U(()=>{Fi=h("application/json; charset=utf-8",JSON.stringify),ji=h("text/plain; charset=utf-8",String),Mi=h("text/html"),Ti=h("image/jpeg"),Bi=h("image/png"),Yi=h("image/webp")});var C,X,M;var J=U(()=>{C={OK:200,CREATED:201,ACCEPTED:202,NON_AUTHORITATIVE_INFORMATION:203,NO_CONTENT:204,RESET_CONTENT:205,PARTIAL_CONTENT:206,MULTI_STATUS:207,ALREADY_REPORTED:208,IM_USED:226,MULTIPLE_CHOICES:300,MOVED_PERMANENTLY:301,FOUND:302,SEE_OTHER:303,NOT_MODIFIED:304,USE_PROXY:305,TEMPORARY_REDIRECT:307,PERMANENT_REDIRECT:308,BAD_REQUEST:400,UNAUTHORIZED:401,PAYMENT_REQUIRED:402,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_ALLOWED:405,NOT_ACCEPTABLE:406,PROXY_AUTHENTICATION_REQUIRED:407,REQUEST_TIMEOUT:408,CONFLICT:409,GONE:410,LENGTH_REQUIRED:411,PRECONDITION_FAILED:412,PAYLOAD_TOO_LARGE:413,URI_TOO_LONG:414,UNSUPPORTED_MEDIA_TYPE:415,RANGE_NOT_SATISFIABLE:416,EXPECTATION_FAILED:417,IM_A_TEAPOT:418,MISDIRECTED_REQUEST:421,UNPROCESSABLE_ENTITY:422,LOCKED:423,FAILED_DEPENDENCY:424,TOO_EARLY:425,UPGRADE_REQUIRED:426,PRECONDITION_REQUIRED:428,TOO_MANY_REQUESTS:429,REQUEST_HEADER_FIELDS_TOO_LARGE:431,UNAVAILABLE_FOR_LEGAL_REASONS:451,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504,HTTP_VERSION_NOT_SUPPORTED:505,VARIANT_ALSO_NEGOTIATES:506,INSUFFICIENT_STORAGE:507,LOOP_DETECTED:508,NOT_EXTENDED:510,NETWORK_AUTHENTICATION_REQUIRED:511},X={PORT:3000,HOSTNAME:"localhost",ROUTES_DIR:"./routes",CACHE_TTL:0,CORS_MAX_AGE:86400},M={JSON:"application/json",TEXT:"text/plain",HTML:"text/html",FORM_URLENCODED:"application/x-www-form-urlencoded",MULTIPART:"multipart/form-data"}});class W{protectedHandler=null;setProtectedHandler(i){this.protectedHandler=i}async authenticate(i){if(!this.protectedHandler)throw new Error("Protected handler not configured. Use vector.protected() to set authentication handler.");try{let l=await this.protectedHandler(i);return i.authUser=l,l}catch(l){throw new Error(`Authentication failed: ${l instanceof Error?l.message:String(l)}`)}}isAuthenticated(i){return!!i.authUser}getUser(i){return i.authUser||null}}class z{cacheHandler=null;memoryCache=new Map;cleanupInterval=null;setCacheHandler(i){this.cacheHandler=i}async get(i,l,f=X.CACHE_TTL){if(f<=0)return l();if(this.cacheHandler)return this.cacheHandler(i,l,f);return this.getFromMemoryCache(i,l,f)}async getFromMemoryCache(i,l,f){let a=Date.now(),E=this.memoryCache.get(i);if(this.isCacheValid(E,a))return E.value;let A=await l();return this.setInMemoryCache(i,A,f),A}isCacheValid(i,l){return i!==void 0&&i.expires>l}setInMemoryCache(i,l,f){let a=Date.now()+f*1000;this.memoryCache.set(i,{value:l,expires:a}),this.scheduleCleanup()}scheduleCleanup(){if(this.cleanupInterval)return;this.cleanupInterval=setInterval(()=>{this.cleanupExpired()},60000)}cleanupExpired(){let i=Date.now();for(let[l,f]of this.memoryCache.entries())if(f.expires<=i)this.memoryCache.delete(l);if(this.memoryCache.size===0&&this.cleanupInterval)clearInterval(this.cleanupInterval),this.cleanupInterval=null}clear(){if(this.memoryCache.clear(),this.cleanupInterval)clearInterval(this.cleanupInterval),this.cleanupInterval=null}async set(i,l,f=X.CACHE_TTL){if(f<=0)return;if(this.cacheHandler){await this.cacheHandler(i,async()=>l,f);return}this.setInMemoryCache(i,l,f)}delete(i){return this.memoryCache.delete(i)}has(i){let l=this.memoryCache.get(i);if(!l)return!1;if(l.expires<=Date.now())return this.memoryCache.delete(i),!1;return!0}generateKey(i,l){let f=new URL(i.url);return[i.method,f.pathname,f.search,l?.authUser?.id||"anonymous"].join(":")}}var q=U(()=>{J()});function $(i){if(typeof i!=="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(i))}function t(i,l){var f="",a=0,E=-1,A=0,d;for(var _=0;_<=i.length;++_){if(_<i.length)d=i.charCodeAt(_);else if(d===47)break;else d=47;if(d===47){if(E===_-1||A===1);else if(E!==_-1&&A===2){if(f.length<2||a!==2||f.charCodeAt(f.length-1)!==46||f.charCodeAt(f.length-2)!==46){if(f.length>2){var N=f.lastIndexOf("/");if(N!==f.length-1){if(N===-1)f="",a=0;else f=f.slice(0,N),a=f.length-1-f.lastIndexOf("/");E=_,A=0;continue}}else if(f.length===2||f.length===1){f="",a=0,E=_,A=0;continue}}if(l){if(f.length>0)f+="/..";else f="..";a=2}}else{if(f.length>0)f+="/"+i.slice(E+1,_);else f=i.slice(E+1,_);a=_-E-1}E=_,A=0}else if(d===46&&A!==-1)++A;else A=-1}return f}function Di(i,l){var f=l.dir||l.root,a=l.base||(l.name||"")+(l.ext||"");if(!f)return a;if(f===l.root)return f+a;return f+i+a}function x(){var i="",l=!1,f;for(var a=arguments.length-1;a>=-1&&!l;a--){var E;if(a>=0)E=arguments[a];else{if(f===void 0)f=process.cwd();E=f}if($(E),E.length===0)continue;i=E+"/"+i,l=E.charCodeAt(0)===47}if(i=t(i,!l),l)if(i.length>0)return"/"+i;else return"/";else if(i.length>0)return i;else return"."}function o(i){if($(i),i.length===0)return".";var l=i.charCodeAt(0)===47,f=i.charCodeAt(i.length-1)===47;if(i=t(i,!l),i.length===0&&!l)i=".";if(i.length>0&&f)i+="/";if(l)return"/"+i;return i}function Ii(i){return $(i),i.length>0&&i.charCodeAt(0)===47}function K(){if(arguments.length===0)return".";var i;for(var l=0;l<arguments.length;++l){var f=arguments[l];if($(f),f.length>0)if(i===void 0)i=f;else i+="/"+f}if(i===void 0)return".";return o(i)}function G(i,l){if($(i),$(l),i===l)return"";if(i=x(i),l=x(l),i===l)return"";var f=1;for(;f<i.length;++f)if(i.charCodeAt(f)!==47)break;var a=i.length,E=a-f,A=1;for(;A<l.length;++A)if(l.charCodeAt(A)!==47)break;var d=l.length,_=d-A,N=E<_?E:_,I=-1,O=0;for(;O<=N;++O){if(O===N){if(_>N){if(l.charCodeAt(A+O)===47)return l.slice(A+O+1);else if(O===0)return l.slice(A+O)}else if(E>N){if(i.charCodeAt(f+O)===47)I=O;else if(O===0)I=0}break}var w=i.charCodeAt(f+O),L=l.charCodeAt(A+O);if(w!==L)break;else if(w===47)I=O}var P="";for(O=f+I+1;O<=a;++O)if(O===a||i.charCodeAt(O)===47)if(P.length===0)P+="..";else P+="/..";if(P.length>0)return P+l.slice(A+I);else{if(A+=I,l.charCodeAt(A)===47)++A;return l.slice(A)}}function wi(i){return i}function T(i){if($(i),i.length===0)return".";var l=i.charCodeAt(0),f=l===47,a=-1,E=!0;for(var A=i.length-1;A>=1;--A)if(l=i.charCodeAt(A),l===47){if(!E){a=A;break}}else E=!1;if(a===-1)return f?"/":".";if(f&&a===1)return"//";return i.slice(0,a)}function Li(i,l){if(l!==void 0&&typeof l!=="string")throw new TypeError('"ext" argument must be a string');$(i);var f=0,a=-1,E=!0,A;if(l!==void 0&&l.length>0&&l.length<=i.length){if(l.length===i.length&&l===i)return"";var d=l.length-1,_=-1;for(A=i.length-1;A>=0;--A){var N=i.charCodeAt(A);if(N===47){if(!E){f=A+1;break}}else{if(_===-1)E=!1,_=A+1;if(d>=0)if(N===l.charCodeAt(d)){if(--d===-1)a=A}else d=-1,a=_}}if(f===a)a=_;else if(a===-1)a=i.length;return i.slice(f,a)}else{for(A=i.length-1;A>=0;--A)if(i.charCodeAt(A)===47){if(!E){f=A+1;break}}else if(a===-1)E=!1,a=A+1;if(a===-1)return"";return i.slice(f,a)}}function Ci(i){$(i);var l=-1,f=0,a=-1,E=!0,A=0;for(var d=i.length-1;d>=0;--d){var _=i.charCodeAt(d);if(_===47){if(!E){f=d+1;break}continue}if(a===-1)E=!1,a=d+1;if(_===46){if(l===-1)l=d;else if(A!==1)A=1}else if(l!==-1)A=-1}if(l===-1||a===-1||A===0||A===1&&l===a-1&&l===f+1)return"";return i.slice(l,a)}function Ri(i){if(i===null||typeof i!=="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof i);return Di("/",i)}function Ui(i){$(i);var l={root:"",dir:"",base:"",ext:"",name:""};if(i.length===0)return l;var f=i.charCodeAt(0),a=f===47,E;if(a)l.root="/",E=1;else E=0;var A=-1,d=0,_=-1,N=!0,I=i.length-1,O=0;for(;I>=E;--I){if(f=i.charCodeAt(I),f===47){if(!N){d=I+1;break}continue}if(_===-1)N=!1,_=I+1;if(f===46){if(A===-1)A=I;else if(O!==1)O=1}else if(A!==-1)O=-1}if(A===-1||_===-1||O===0||O===1&&A===_-1&&A===d+1){if(_!==-1)if(d===0&&a)l.base=l.name=i.slice(1,_);else l.base=l.name=i.slice(d,_)}else{if(d===0&&a)l.name=i.slice(1,A),l.base=i.slice(1,_);else l.name=i.slice(d,A),l.base=i.slice(d,_);l.ext=i.slice(A,_)}if(d>0)l.dir=i.slice(0,d-1);else if(a)l.dir="/";return l}var Z="/",$i=":",zi;var c=U(()=>{zi=((i)=>(i.posix=i,i))({resolve:x,normalize:o,isAbsolute:Ii,join:K,relative:G,_makeLong:wi,dirname:T,basename:Li,extname:Ci,format:Ri,parse:Ui,sep:Z,delimiter:$i,win32:null,posix:null})});class g{outputPath;constructor(i="./.vector/routes.generated.ts"){this.outputPath=i}async generate(i){let l=T(this.outputPath);await v.promises.mkdir(l,{recursive:!0});let f=[],a=new Map;for(let _ of i){if(!a.has(_.path))a.set(_.path,[]);a.get(_.path).push(_)}let E=0,A=[];for(let[_,N]of a){let I=G(T(this.outputPath),_).replace(/\\/g,"/").replace(/\.(ts|js)$/,""),O=`route_${E++}`,w=N.filter((L)=>L.name!=="default").map((L)=>L.name);if(N.some((L)=>L.name==="default"))if(w.length>0)f.push(`import ${O}, { ${w.join(", ")} } from '${I}';`);else f.push(`import ${O} from '${I}';`);else if(w.length>0)f.push(`import { ${w.join(", ")} } from '${I}';`);for(let L of N){let P=L.name==="default"?O:L.name;A.push(` ${P},`)}}let d=`// This file is auto-generated. Do not edit manually.
|
|
1
|
+
var{defineProperty:z,getOwnPropertyNames:n,getOwnPropertyDescriptor:s}=Object,p=Object.prototype.hasOwnProperty;var T=new WeakMap,r=(i)=>{var f=T.get(i),l;if(f)return f;if(f=z({},"__esModule",{value:!0}),i&&typeof i==="object"||typeof i==="function")n(i).map((E)=>!p.call(f,E)&&z(f,E,{get:()=>i[E],enumerable:!(l=s(i,E))||l.enumerable}));return T.set(i,f),f};var o=(i,f)=>{for(var l in f)z(i,l,{get:f[l],enumerable:!0,configurable:!0,set:(E)=>f[l]=()=>E})};var Li={};o(Li,{route:()=>y,createResponse:()=>P,APIError:()=>S});module.exports=r(Li);var G=(i="text/plain; charset=utf-8",f)=>(l,E={})=>{if(l===void 0||l instanceof Response)return l;let _=new Response(f?.(l)??l,E.url?void 0:E);return _.headers.set("content-type",i),_},$i=G("application/json; charset=utf-8",JSON.stringify);var wi=G("text/plain; charset=utf-8",String),Ci=G("text/html"),Si=G("image/jpeg"),bi=G("image/png"),Ri=G("image/webp"),k=async(i)=>{i.content=i.body?await i.clone().json().catch(()=>i.clone().formData()).catch(()=>i.text()):void 0},g=(i)=>{i.cookies=(i.headers.get("Cookie")||"").split(/;\s*/).map((f)=>f.split(/=(.+)/)).reduce((f,[l,E])=>E?(f[l]=E,f):f,{})},H=(i={})=>{let{origin:f="*",credentials:l=!1,allowMethods:E="*",allowHeaders:_,exposeHeaders:A,maxAge:N}=i,O=(D)=>{let I=D?.headers.get("origin");return f===!0?I:f instanceof RegExp?f.test(I)?I:void 0:Array.isArray(f)?f.includes(I)?I:void 0:f instanceof Function?f(I):f=="*"&&l?I:f},U=(D,I)=>{for(let[$,w]of Object.entries(I))w&&D.headers.append($,w);return D};return{corsify:(D,I)=>D?.headers?.get("access-control-allow-origin")||D.status==101?D:U(D.clone(),{"access-control-allow-origin":O(I),"access-control-allow-credentials":l}),preflight:(D)=>{if(D.method=="OPTIONS"){let I=new Response(null,{status:204});return U(I,{"access-control-allow-origin":O(D),"access-control-allow-methods":E?.join?.(",")??E,"access-control-expose-headers":A?.join?.(",")??A,"access-control-allow-headers":_?.join?.(",")??_??D.headers.get("access-control-request-headers"),"access-control-max-age":N,"access-control-allow-credentials":l})}}}};var C={OK:200,CREATED:201,ACCEPTED:202,NON_AUTHORITATIVE_INFORMATION:203,NO_CONTENT:204,RESET_CONTENT:205,PARTIAL_CONTENT:206,MULTI_STATUS:207,ALREADY_REPORTED:208,IM_USED:226,MULTIPLE_CHOICES:300,MOVED_PERMANENTLY:301,FOUND:302,SEE_OTHER:303,NOT_MODIFIED:304,USE_PROXY:305,TEMPORARY_REDIRECT:307,PERMANENT_REDIRECT:308,BAD_REQUEST:400,UNAUTHORIZED:401,PAYMENT_REQUIRED:402,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_ALLOWED:405,NOT_ACCEPTABLE:406,PROXY_AUTHENTICATION_REQUIRED:407,REQUEST_TIMEOUT:408,CONFLICT:409,GONE:410,LENGTH_REQUIRED:411,PRECONDITION_FAILED:412,PAYLOAD_TOO_LARGE:413,URI_TOO_LONG:414,UNSUPPORTED_MEDIA_TYPE:415,RANGE_NOT_SATISFIABLE:416,EXPECTATION_FAILED:417,IM_A_TEAPOT:418,MISDIRECTED_REQUEST:421,UNPROCESSABLE_ENTITY:422,LOCKED:423,FAILED_DEPENDENCY:424,TOO_EARLY:425,UPGRADE_REQUIRED:426,PRECONDITION_REQUIRED:428,TOO_MANY_REQUESTS:429,REQUEST_HEADER_FIELDS_TOO_LARGE:431,UNAVAILABLE_FOR_LEGAL_REASONS:451,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504,HTTP_VERSION_NOT_SUPPORTED:505,VARIANT_ALSO_NEGOTIATES:506,INSUFFICIENT_STORAGE:507,LOOP_DETECTED:508,NOT_EXTENDED:510,NETWORK_AUTHENTICATION_REQUIRED:511},J={PORT:3000,HOSTNAME:"localhost",ROUTES_DIR:"./routes",CACHE_TTL:0,CORS_MAX_AGE:86400},F={JSON:"application/json",TEXT:"text/plain",HTML:"text/html",FORM_URLENCODED:"application/x-www-form-urlencoded",MULTIPART:"multipart/form-data"};class W{protectedHandler=null;setProtectedHandler(i){this.protectedHandler=i}async authenticate(i){if(!this.protectedHandler)throw new Error("Protected handler not configured. Use vector.protected() to set authentication handler.");try{let f=await this.protectedHandler(i);return i.authUser=f,f}catch(f){throw new Error(`Authentication failed: ${f instanceof Error?f.message:String(f)}`)}}isAuthenticated(i){return!!i.authUser}getUser(i){return i.authUser||null}}class h{cacheHandler=null;memoryCache=new Map;cleanupInterval=null;setCacheHandler(i){this.cacheHandler=i}async get(i,f,l=J.CACHE_TTL){if(l<=0)return f();if(this.cacheHandler)return this.cacheHandler(i,f,l);return this.getFromMemoryCache(i,f,l)}async getFromMemoryCache(i,f,l){let E=Date.now(),_=this.memoryCache.get(i);if(this.isCacheValid(_,E))return _.value;let A=await f();return this.setInMemoryCache(i,A,l),A}isCacheValid(i,f){return i!==void 0&&i.expires>f}setInMemoryCache(i,f,l){let E=Date.now()+l*1000;this.memoryCache.set(i,{value:f,expires:E}),this.scheduleCleanup()}scheduleCleanup(){if(this.cleanupInterval)return;this.cleanupInterval=setInterval(()=>{this.cleanupExpired()},60000)}cleanupExpired(){let i=Date.now();for(let[f,l]of this.memoryCache.entries())if(l.expires<=i)this.memoryCache.delete(f);if(this.memoryCache.size===0&&this.cleanupInterval)clearInterval(this.cleanupInterval),this.cleanupInterval=null}clear(){if(this.memoryCache.clear(),this.cleanupInterval)clearInterval(this.cleanupInterval),this.cleanupInterval=null}async set(i,f,l=J.CACHE_TTL){if(l<=0)return;if(this.cacheHandler){await this.cacheHandler(i,async()=>f,l);return}this.setInMemoryCache(i,f,l)}delete(i){return this.memoryCache.delete(i)}has(i){let f=this.memoryCache.get(i);if(!f)return!1;if(f.expires<=Date.now())return this.memoryCache.delete(i),!1;return!0}generateKey(i,f){let l=new URL(i.url);return[i.method,l.pathname,l.search,f?.authUser?.id||"anonymous"].join(":")}}var V=(()=>({}));function b(i){if(typeof i!=="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(i))}function c(i,f){var l="",E=0,_=-1,A=0,N;for(var O=0;O<=i.length;++O){if(O<i.length)N=i.charCodeAt(O);else if(N===47)break;else N=47;if(N===47){if(_===O-1||A===1);else if(_!==O-1&&A===2){if(l.length<2||E!==2||l.charCodeAt(l.length-1)!==46||l.charCodeAt(l.length-2)!==46){if(l.length>2){var U=l.lastIndexOf("/");if(U!==l.length-1){if(U===-1)l="",E=0;else l=l.slice(0,U),E=l.length-1-l.lastIndexOf("/");_=O,A=0;continue}}else if(l.length===2||l.length===1){l="",E=0,_=O,A=0;continue}}if(f){if(l.length>0)l+="/..";else l="..";E=2}}else{if(l.length>0)l+="/"+i.slice(_+1,O);else l=i.slice(_+1,O);E=O-_-1}_=O,A=0}else if(N===46&&A!==-1)++A;else A=-1}return l}function t(i,f){var l=f.dir||f.root,E=f.base||(f.name||"")+(f.ext||"");if(!l)return E;if(l===f.root)return l+E;return l+i+E}function j(){var i="",f=!1,l;for(var E=arguments.length-1;E>=-1&&!f;E--){var _;if(E>=0)_=arguments[E];else{if(l===void 0)l=process.cwd();_=l}if(b(_),_.length===0)continue;i=_+"/"+i,f=_.charCodeAt(0)===47}if(i=c(i,!f),f)if(i.length>0)return"/"+i;else return"/";else if(i.length>0)return i;else return"."}function m(i){if(b(i),i.length===0)return".";var f=i.charCodeAt(0)===47,l=i.charCodeAt(i.length-1)===47;if(i=c(i,!f),i.length===0&&!f)i=".";if(i.length>0&&l)i+="/";if(f)return"/"+i;return i}function e(i){return b(i),i.length>0&&i.charCodeAt(0)===47}function M(){if(arguments.length===0)return".";var i;for(var f=0;f<arguments.length;++f){var l=arguments[f];if(b(l),l.length>0)if(i===void 0)i=l;else i+="/"+l}if(i===void 0)return".";return m(i)}function a(i,f){if(b(i),b(f),i===f)return"";if(i=j(i),f=j(f),i===f)return"";var l=1;for(;l<i.length;++l)if(i.charCodeAt(l)!==47)break;var E=i.length,_=E-l,A=1;for(;A<f.length;++A)if(f.charCodeAt(A)!==47)break;var N=f.length,O=N-A,U=_<O?_:O,D=-1,I=0;for(;I<=U;++I){if(I===U){if(O>U){if(f.charCodeAt(A+I)===47)return f.slice(A+I+1);else if(I===0)return f.slice(A+I)}else if(_>U){if(i.charCodeAt(l+I)===47)D=I;else if(I===0)D=0}break}var $=i.charCodeAt(l+I),w=f.charCodeAt(A+I);if($!==w)break;else if($===47)D=I}var R="";for(I=l+D+1;I<=E;++I)if(I===E||i.charCodeAt(I)===47)if(R.length===0)R+="..";else R+="/..";if(R.length>0)return R+f.slice(A+D);else{if(A+=D,f.charCodeAt(A)===47)++A;return f.slice(A)}}function ii(i){return i}function Y(i){if(b(i),i.length===0)return".";var f=i.charCodeAt(0),l=f===47,E=-1,_=!0;for(var A=i.length-1;A>=1;--A)if(f=i.charCodeAt(A),f===47){if(!_){E=A;break}}else _=!1;if(E===-1)return l?"/":".";if(l&&E===1)return"//";return i.slice(0,E)}function fi(i,f){if(f!==void 0&&typeof f!=="string")throw new TypeError('"ext" argument must be a string');b(i);var l=0,E=-1,_=!0,A;if(f!==void 0&&f.length>0&&f.length<=i.length){if(f.length===i.length&&f===i)return"";var N=f.length-1,O=-1;for(A=i.length-1;A>=0;--A){var U=i.charCodeAt(A);if(U===47){if(!_){l=A+1;break}}else{if(O===-1)_=!1,O=A+1;if(N>=0)if(U===f.charCodeAt(N)){if(--N===-1)E=A}else N=-1,E=O}}if(l===E)E=O;else if(E===-1)E=i.length;return i.slice(l,E)}else{for(A=i.length-1;A>=0;--A)if(i.charCodeAt(A)===47){if(!_){l=A+1;break}}else if(E===-1)_=!1,E=A+1;if(E===-1)return"";return i.slice(l,E)}}function li(i){b(i);var f=-1,l=0,E=-1,_=!0,A=0;for(var N=i.length-1;N>=0;--N){var O=i.charCodeAt(N);if(O===47){if(!_){l=N+1;break}continue}if(E===-1)_=!1,E=N+1;if(O===46){if(f===-1)f=N;else if(A!==1)A=1}else if(f!==-1)A=-1}if(f===-1||E===-1||A===0||A===1&&f===E-1&&f===l+1)return"";return i.slice(f,E)}function Ei(i){if(i===null||typeof i!=="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof i);return t("/",i)}function Ai(i){b(i);var f={root:"",dir:"",base:"",ext:"",name:""};if(i.length===0)return f;var l=i.charCodeAt(0),E=l===47,_;if(E)f.root="/",_=1;else _=0;var A=-1,N=0,O=-1,U=!0,D=i.length-1,I=0;for(;D>=_;--D){if(l=i.charCodeAt(D),l===47){if(!U){N=D+1;break}continue}if(O===-1)U=!1,O=D+1;if(l===46){if(A===-1)A=D;else if(I!==1)I=1}else if(A!==-1)I=-1}if(A===-1||O===-1||I===0||I===1&&A===O-1&&A===N+1){if(O!==-1)if(N===0&&E)f.base=f.name=i.slice(1,O);else f.base=f.name=i.slice(N,O)}else{if(N===0&&E)f.name=i.slice(1,A),f.base=i.slice(1,O);else f.name=i.slice(N,A),f.base=i.slice(N,O);f.ext=i.slice(A,O)}if(N>0)f.dir=i.slice(0,N-1);else if(E)f.dir="/";return f}var Q="/",_i=":",xi=((i)=>(i.posix=i,i))({resolve:j,normalize:m,isAbsolute:e,join:M,relative:a,_makeLong:ii,dirname:Y,basename:fi,extname:li,format:Ei,parse:Ai,sep:Q,delimiter:_i,win32:null,posix:null});class K{outputPath;constructor(i="./.vector/routes.generated.ts"){this.outputPath=i}async generate(i){let f=Y(this.outputPath);await V.promises.mkdir(f,{recursive:!0});let l=[],E=new Map;for(let O of i){if(!E.has(O.path))E.set(O.path,[]);E.get(O.path).push(O)}let _=0,A=[];for(let[O,U]of E){let D=a(Y(this.outputPath),O).replace(/\\/g,"/").replace(/\.(ts|js)$/,""),I=`route_${_++}`,$=U.filter((w)=>w.name!=="default").map((w)=>w.name);if(U.some((w)=>w.name==="default"))if($.length>0)l.push(`import ${I}, { ${$.join(", ")} } from '${D}';`);else l.push(`import ${I} from '${D}';`);else if($.length>0)l.push(`import { ${$.join(", ")} } from '${D}';`);for(let w of U){let R=w.name==="default"?I:w.name;A.push(` ${R},`)}}let N=`// This file is auto-generated. Do not edit manually.
|
|
2
2
|
// Generated at: ${new Date().toISOString()}
|
|
3
3
|
|
|
4
|
-
${
|
|
4
|
+
${l.join(`
|
|
5
5
|
`)}
|
|
6
6
|
|
|
7
7
|
export const routes = [
|
|
@@ -10,12 +10,12 @@ ${A.join(`
|
|
|
10
10
|
];
|
|
11
11
|
|
|
12
12
|
export default routes;
|
|
13
|
-
`;await
|
|
14
|
-
...${
|
|
15
|
-
handler: m.${
|
|
13
|
+
`;await V.promises.writeFile(this.outputPath,N,"utf-8")}async generateDynamic(i){let f=[];for(let l of i){let E=JSON.stringify({method:l.method,path:l.options.path,options:l.options});f.push(` await import('${l.path}').then(m => ({
|
|
14
|
+
...${E},
|
|
15
|
+
handler: m.${l.name==="default"?"default":l.name}
|
|
16
16
|
}))`)}return`export const loadRoutes = async () => {
|
|
17
17
|
return Promise.all([
|
|
18
|
-
${
|
|
18
|
+
${f.join(`,
|
|
19
19
|
`)}
|
|
20
20
|
]);
|
|
21
|
-
};`}}var v;var p=U(()=>{v=(()=>({}));c()});class k{routesDir;constructor(i="./routes"){this.routesDir=x(process.cwd(),i)}async scan(){let i=[];if(!F.existsSync(this.routesDir))return[];try{await this.scanDirectory(this.routesDir,i)}catch(l){if(l.code==="ENOENT")return console.warn(` ✗ Routes directory not accessible: ${this.routesDir}`),[];throw l}return i}async scanDirectory(i,l,f=""){let a=await F.promises.readdir(i);for(let E of a){let A=K(i,E);if((await F.promises.stat(A)).isDirectory()){let _=f?`${f}/${E}`:E;await this.scanDirectory(A,l,_)}else if(E.endsWith(".ts")||E.endsWith(".js")){let _=G(this.routesDir,A).replace(/\.(ts|js)$/,"").split(Z).join("/");try{let I=await import(process.platform==="win32"?`file:///${A.replace(/\\/g,"/")}`:A);if(I.default&&typeof I.default==="function")l.push({name:"default",path:A,method:"GET",options:{method:"GET",path:`/${_}`,expose:!0}});for(let[O,w]of Object.entries(I)){if(O==="default")continue;if(w&&typeof w==="object"&&"entry"in w&&"options"in w&&"handler"in w){let L=w;l.push({name:O,path:A,method:L.options.method,options:L.options})}else if(Array.isArray(w)&&w.length>=4){let[L,,,P]=w;l.push({name:O,path:A,method:L,options:{method:L,path:P,expose:!0}})}}}catch(N){console.error(`Failed to load route from ${A}:`,N)}}}}enableWatch(i){if(typeof Bun!=="undefined"&&Bun.env.NODE_ENV==="development")console.log(`Watching for route changes in ${this.routesDir}`),setInterval(async()=>{await i()},1000)}}var F;var e=U(()=>{F=(()=>({}));c()});class B{beforeHandlers=[];finallyHandlers=[];addBefore(...i){this.beforeHandlers.push(...i)}addFinally(...i){this.finallyHandlers.push(...i)}async executeBefore(i){let l=i;for(let f of this.beforeHandlers){let a=await f(l);if(a instanceof Response)return a;l=a}return l}async executeFinally(i,l){let f=i;for(let a of this.finallyHandlers)f=await a(f,l);return f}clone(){let i=new B;return i.beforeHandlers=[...this.beforeHandlers],i.finallyHandlers=[...this.finallyHandlers],i}clear(){this.beforeHandlers=[],this.finallyHandlers=[]}}function ii(i){return process.platform==="win32"?`file:///${i.replace(/\\/g,"/")}`:i}class u{middlewareManager;authManager;cacheManager;routes=[];constructor(i,l,f){this.middlewareManager=i,this.authManager=l,this.cacheManager=f}getRouteSpecificity(i){let A=0,d=i.split("/").filter(Boolean);for(let _ of d)if(this.isStaticSegment(_))A+=1000;else if(this.isParamSegment(_))A+=10;else if(this.isWildcardSegment(_))A+=1;if(A+=i.length,this.isExactPath(i))A+=1e4;return A}isStaticSegment(i){return!i.startsWith(":")&&!i.includes("*")}isParamSegment(i){return i.startsWith(":")}isWildcardSegment(i){return i.includes("*")}isExactPath(i){return!i.includes(":")&&!i.includes("*")}sortRoutes(){this.routes.sort((i,l)=>{let f=this.extractPath(i),a=this.extractPath(l),E=this.getRouteSpecificity(f);return this.getRouteSpecificity(a)-E})}extractPath(i){return i[3]||""}route(i,l){let f=this.wrapHandler(i,l),a=[i.method.toUpperCase(),this.createRouteRegex(i.path),[f],i.path];return this.routes.push(a),this.sortRoutes(),a}createRouteRegex(i){return RegExp(`^${i.replace(/\/+(\/|$)/g,"$1").replace(/(\/?\.?):(\w+)\+/g,"($1(?<$2>*))").replace(/(\/?\.?):(\w+)/g,"($1(?<$2>[^$1/]+?))").replace(/\./g,"\\.").replace(/(\/?)\*/g,"($1.*)?")}/*$`)}wrapHandler(i,l){return async(f)=>{let a=f;if(!a.context)a.context={};if(!a.query&&a.url){let E=new URL(a.url),A={};for(let[d,_]of E.searchParams)A[d]=A[d]?[].concat(A[d],_):_;a.query=A}if(i.metadata)a.metadata=i.metadata;f=a;try{if(i.expose===!1)return R.forbidden("Forbidden");let E=await this.middlewareManager.executeBefore(f);if(E instanceof Response)return E;if(f=E,i.auth)try{await this.authManager.authenticate(f)}catch(N){return R.unauthorized(N instanceof Error?N.message:"Authentication failed",i.responseContentType)}if(!i.rawRequest&&f.method!=="GET"&&f.method!=="HEAD")try{let N=f.headers.get("content-type");if(N?.includes("application/json"))f.content=await f.json();else if(N?.includes("application/x-www-form-urlencoded"))f.content=Object.fromEntries(await f.formData());else if(N?.includes("multipart/form-data"))f.content=await f.formData();else f.content=await f.text()}catch{f.content=null}let A,d=i.cache;if(d&&typeof d==="number"&&d>0){let N=this.cacheManager.generateKey(f,{authUser:f.authUser});A=await this.cacheManager.get(N,()=>l(f),d)}else if(d&&typeof d==="object"&&d.ttl){let N=d.key||this.cacheManager.generateKey(f,{authUser:f.authUser});A=await this.cacheManager.get(N,()=>l(f),d.ttl)}else A=await l(f);let _;if(i.rawResponse||A instanceof Response)_=A instanceof Response?A:new Response(A);else _=b(200,A,i.responseContentType);return _=await this.middlewareManager.executeFinally(_,f),_}catch(E){if(E instanceof Response)return E;return console.error("Route handler error:",E),R.internalServerError(E instanceof Error?E.message:String(E),i.responseContentType)}}}addRoute(i){this.routes.push(i),this.sortRoutes()}getRoutes(){return this.routes}async handle(i){let f=new URL(i.url).pathname;for(let[a,E,A]of this.routes)if(i.method==="OPTIONS"||i.method===a){let d=f.match(E);if(d){let _=i;if(!_.context)_.context={};_.params=d.groups||{};for(let N of A){let I=await N(_);if(I)return I}}}return R.notFound("Route not found")}clearRoutes(){this.routes=[]}}var li=U(()=>{Y()});class m{server=null;router;config;corsHandler;constructor(i,l){if(this.router=i,this.config=l,l.cors){let{preflight:f,corsify:a}=j(this.normalizeCorsOptions(l.cors));this.corsHandler={preflight:f,corsify:a}}}normalizeCorsOptions(i){return{origin:i.origin||"*",credentials:i.credentials!==!1,allowHeaders:Array.isArray(i.allowHeaders)?i.allowHeaders.join(", "):i.allowHeaders||"Content-Type, Authorization",allowMethods:Array.isArray(i.allowMethods)?i.allowMethods.join(", "):i.allowMethods||"GET, POST, PUT, PATCH, DELETE, OPTIONS",exposeHeaders:Array.isArray(i.exposeHeaders)?i.exposeHeaders.join(", "):i.exposeHeaders||"Authorization",maxAge:i.maxAge||86400}}async start(){let i=this.config.port||3000,l=this.config.hostname||"localhost",f=async(a)=>{try{if(this.corsHandler&&a.method==="OPTIONS")return this.corsHandler.preflight(a);let E=await this.router.handle(a);if(this.corsHandler)E=this.corsHandler.corsify(E,a);return E}catch(E){return console.error("Server error:",E),new Response("Internal Server Error",{status:500})}};try{if(this.server=Bun.serve({port:i,hostname:l,reusePort:this.config.reusePort!==!1,fetch:f,idleTimeout:this.config.idleTimeout||60,error:(a)=>{return console.error("[ERROR] Server error:",a),new Response("Internal Server Error",{status:500})}}),!this.server||!this.server.port)throw new Error(`Failed to start server on ${l}:${i} - server object is invalid`);return console.log(`→ Vector server running at http://${l}:${i}`),this.server}catch(a){if(a.code==="EADDRINUSE"||a.message?.includes("address already in use"))a.message=`Port ${i} is already in use`,a.port=i;else if(a.code==="EACCES"||a.message?.includes("permission denied"))a.message=`Permission denied to bind to port ${i}`,a.port=i;else if(a.message?.includes("EADDRNOTAVAIL"))a.message=`Cannot bind to hostname ${l}`,a.hostname=l;throw a}}stop(){if(this.server)this.server.stop(),this.server=null,console.log("Server stopped")}getServer(){return this.server}getPort(){return this.server?.port||this.config.port||3000}getHostname(){return this.server?.hostname||this.config.hostname||"localhost"}getUrl(){let i=this.getPort();return`http://${this.getHostname()}:${i}`}}var fi=U(()=>{V()});var ai={};s(ai,{getVectorInstance:()=>Pi,Vector:()=>H});class H{static instance;router;server=null;middlewareManager;authManager;cacheManager;config={};routeScanner=null;routeGenerator=null;_protectedHandler=null;_cacheHandler=null;constructor(){this.middlewareManager=new B,this.authManager=new W,this.cacheManager=new z,this.router=new u(this.middlewareManager,this.authManager,this.cacheManager)}static getInstance(){if(!H.instance)H.instance=new H;return H.instance}setProtectedHandler(i){this._protectedHandler=i,this.authManager.setProtectedHandler(i)}getProtectedHandler(){return this._protectedHandler}setCacheHandler(i){this._cacheHandler=i,this.cacheManager.setCacheHandler(i)}getCacheHandler(){return this._cacheHandler}addRoute(i,l){return this.router.route(i,l)}async startServer(i){if(this.config={...this.config,...i},this.middlewareManager.clear(),i?.before)this.middlewareManager.addBefore(...i.before);if(i?.finally)this.middlewareManager.addFinally(...i.finally);if(this.config.autoDiscover!==!1)await this.discoverRoutes();return this.server=new m(this.router,this.config),await this.server.start()}async discoverRoutes(){let i=this.config.routesDir||"./routes";if(this.routeScanner=new k(i),!this.routeGenerator)this.routeGenerator=new g;try{let l=await this.routeScanner.scan();if(l.length>0){if(this.config.development)await this.routeGenerator.generate(l);for(let f of l)try{let E=await import(ii(f.path)),A=f.name==="default"?E.default:E[f.name];if(A){if(this.isRouteDefinition(A)){let d=A;this.router.route(d.options,d.handler),this.logRouteLoaded(d.options)}else if(this.isRouteEntry(A))this.router.addRoute(A),this.logRouteLoaded(A);else if(typeof A==="function")this.router.route(f.options,A),this.logRouteLoaded(f.options)}}catch(a){console.error(`Failed to load route ${f.name} from ${f.path}:`,a)}this.router.sortRoutes()}}catch(l){if(l.code!=="ENOENT"&&l.code!=="ENOTDIR")console.error("Failed to discover routes:",l)}}async loadRoute(i){if(typeof i==="function"){let l=i();if(Array.isArray(l))this.router.addRoute(l)}else if(i&&typeof i==="object"){for(let[,l]of Object.entries(i))if(typeof l==="function"){let f=l();if(Array.isArray(f))this.router.addRoute(f)}}}isRouteEntry(i){return Array.isArray(i)&&i.length>=3}isRouteDefinition(i){return i&&typeof i==="object"&&"entry"in i&&"options"in i&&"handler"in i}logRouteLoaded(i){}stop(){if(this.server)this.server.stop(),this.server=null;this.router.clearRoutes()}getServer(){return this.server}getRouter(){return this.router}getCacheManager(){return this.cacheManager}getAuthManager(){return this.authManager}static resetInstance(){H.instance=null}}var Pi;var Ai=U(()=>{q();p();e();li();fi();Pi=H.getInstance});function Ei(i,l){let f=Si(i,l);return{entry:[i.method.toUpperCase(),RegExp(`^${i.path.replace(/\/+(\/|$)/g,"$1").replace(/(\/?\.?):(\w+)\+/g,"($1(?<$2>*))").replace(/(\/?\.?):(\w+)/g,"($1(?<$2>[^$1/]+?))").replace(/\./g,"\\.").replace(/(\/?)\*/g,"($1.*)?")}/*$`),[f],i.path],options:i,handler:l}}function Hi(i){return JSON.stringify(i??null,(l,f)=>typeof f==="bigint"?f.toString():f)}function D(i,l,f){let a={error:!0,message:l,statusCode:i,timestamp:new Date().toISOString()};return b(i,a,f)}function b(i,l,f=M.JSON){let a=f===M.JSON?Hi(l):l;return new Response(a,{status:i,headers:{"content-type":f}})}function Si(i,l){let{auth:f=!1,expose:a=!1,rawRequest:E=!1,rawResponse:A=!1,responseContentType:d=M.JSON}=i;return async(_)=>{if(!a)return R.forbidden("Forbidden");try{if(f)await hi(_,d);if(!E)await r(_);y(_);let N=await l(_);return A?N:bi.success(N,d)}catch(N){if(N instanceof Response)return N;return R.internalServerError(String(N),d)}}}var Al,El,bi,R,hi=async(i,l)=>{let{getVectorInstance:f}=await Promise.resolve().then(() => (Ai(),ai)),E=f().getProtectedHandler();if(!E)throw R.unauthorized("Authentication not configured",l);try{let A=await E(i);i.authUser=A}catch(A){throw R.unauthorized(A instanceof Error?A.message:"Authentication failed",l)}};var Y=U(()=>{V();J();({preflight:Al,corsify:El}=j({origin:"*",credentials:!0,allowHeaders:"Content-Type, Authorization",allowMethods:"GET, POST, PUT, PATCH, DELETE, OPTIONS",exposeHeaders:"Authorization",maxAge:86400}));bi={success:(i,l)=>b(C.OK,i,l),created:(i,l)=>b(C.CREATED,i,l)};R={badRequest:(i="Bad Request",l)=>D(C.BAD_REQUEST,i,l),unauthorized:(i="Unauthorized",l)=>D(C.UNAUTHORIZED,i,l),paymentRequired:(i="Payment Required",l)=>D(402,i,l),forbidden:(i="Forbidden",l)=>D(C.FORBIDDEN,i,l),notFound:(i="Not Found",l)=>D(C.NOT_FOUND,i,l),methodNotAllowed:(i="Method Not Allowed",l)=>D(405,i,l),notAcceptable:(i="Not Acceptable",l)=>D(406,i,l),requestTimeout:(i="Request Timeout",l)=>D(408,i,l),conflict:(i="Conflict",l)=>D(C.CONFLICT,i,l),gone:(i="Gone",l)=>D(410,i,l),lengthRequired:(i="Length Required",l)=>D(411,i,l),preconditionFailed:(i="Precondition Failed",l)=>D(412,i,l),payloadTooLarge:(i="Payload Too Large",l)=>D(413,i,l),uriTooLong:(i="URI Too Long",l)=>D(414,i,l),unsupportedMediaType:(i="Unsupported Media Type",l)=>D(415,i,l),rangeNotSatisfiable:(i="Range Not Satisfiable",l)=>D(416,i,l),expectationFailed:(i="Expectation Failed",l)=>D(417,i,l),imATeapot:(i="I'm a teapot",l)=>D(418,i,l),misdirectedRequest:(i="Misdirected Request",l)=>D(421,i,l),unprocessableEntity:(i="Unprocessable Entity",l)=>D(C.UNPROCESSABLE_ENTITY,i,l),locked:(i="Locked",l)=>D(423,i,l),failedDependency:(i="Failed Dependency",l)=>D(424,i,l),tooEarly:(i="Too Early",l)=>D(425,i,l),upgradeRequired:(i="Upgrade Required",l)=>D(426,i,l),preconditionRequired:(i="Precondition Required",l)=>D(428,i,l),tooManyRequests:(i="Too Many Requests",l)=>D(429,i,l),requestHeaderFieldsTooLarge:(i="Request Header Fields Too Large",l)=>D(431,i,l),unavailableForLegalReasons:(i="Unavailable For Legal Reasons",l)=>D(451,i,l),internalServerError:(i="Internal Server Error",l)=>D(C.INTERNAL_SERVER_ERROR,i,l),notImplemented:(i="Not Implemented",l)=>D(501,i,l),badGateway:(i="Bad Gateway",l)=>D(502,i,l),serviceUnavailable:(i="Service Unavailable",l)=>D(503,i,l),gatewayTimeout:(i="Gateway Timeout",l)=>D(504,i,l),httpVersionNotSupported:(i="HTTP Version Not Supported",l)=>D(505,i,l),variantAlsoNegotiates:(i="Variant Also Negotiates",l)=>D(506,i,l),insufficientStorage:(i="Insufficient Storage",l)=>D(507,i,l),loopDetected:(i="Loop Detected",l)=>D(508,i,l),notExtended:(i="Not Extended",l)=>D(510,i,l),networkAuthenticationRequired:(i="Network Authentication Required",l)=>D(511,i,l),invalidArgument:(i="Invalid Argument",l)=>D(C.UNPROCESSABLE_ENTITY,i,l),rateLimitExceeded:(i="Rate Limit Exceeded",l)=>D(429,i,l),maintenance:(i="Service Under Maintenance",l)=>D(503,i,l),custom:(i,l,f)=>D(i,l,f)}});var xi={};s(xi,{route:()=>Ei,createResponse:()=>b,APIError:()=>R});module.exports=Ni(xi);Y();Y();
|
|
21
|
+
};`}}var x=(()=>({}));class B{routesDir;excludePatterns;static DEFAULT_EXCLUDE_PATTERNS=["*.test.ts","*.test.js","*.test.tsx","*.test.jsx","*.spec.ts","*.spec.js","*.spec.tsx","*.spec.jsx","*.tests.ts","*.tests.js","**/__tests__/**","*.interface.ts","*.type.ts","*.d.ts"];constructor(i="./routes",f){this.routesDir=j(process.cwd(),i),this.excludePatterns=f||B.DEFAULT_EXCLUDE_PATTERNS}async scan(){let i=[];if(!x.existsSync(this.routesDir))return[];try{await this.scanDirectory(this.routesDir,i)}catch(f){if(f.code==="ENOENT")return console.warn(` ✗ Routes directory not accessible: ${this.routesDir}`),[];throw f}return i}isExcluded(i){let f=a(this.routesDir,i);for(let l of this.excludePatterns){let E=l.replace(/\./g,"\\.").replace(/\*/g,"[^/]*").replace(/\*\*/g,".*").replace(/\?/g,"."),_=new RegExp(`^${E}$`),A=f.split(Q).pop()||"";if(_.test(f)||_.test(A))return!0}return!1}async scanDirectory(i,f,l=""){let E=await x.promises.readdir(i);for(let _ of E){let A=M(i,_);if((await x.promises.stat(A)).isDirectory()){let O=l?`${l}/${_}`:_;await this.scanDirectory(A,f,O)}else if(_.endsWith(".ts")||_.endsWith(".js")){if(this.isExcluded(A))continue;let O=a(this.routesDir,A).replace(/\.(ts|js)$/,"").split(Q).join("/");try{let D=await import(process.platform==="win32"?`file:///${A.replace(/\\/g,"/")}`:A);if(D.default&&typeof D.default==="function")f.push({name:"default",path:A,method:"GET",options:{method:"GET",path:`/${O}`,expose:!0}});for(let[I,$]of Object.entries(D)){if(I==="default")continue;if($&&typeof $==="object"&&"entry"in $&&"options"in $&&"handler"in $){let w=$;f.push({name:I,path:A,method:w.options.method,options:w.options})}else if(Array.isArray($)&&$.length>=4){let[w,,,R]=$;f.push({name:I,path:A,method:w,options:{method:w,path:R,expose:!0}})}}}catch(U){console.error(`Failed to load route from ${A}:`,U)}}}}enableWatch(i){if(typeof Bun!=="undefined"&&Bun.env.NODE_ENV==="development")console.log(`Watching for route changes in ${this.routesDir}`),setInterval(async()=>{await i()},1000)}}class X{beforeHandlers=[];finallyHandlers=[];addBefore(...i){this.beforeHandlers.push(...i)}addFinally(...i){this.finallyHandlers.push(...i)}async executeBefore(i){let f=i;for(let l of this.beforeHandlers){let E=await l(f);if(E instanceof Response)return E;f=E}return f}async executeFinally(i,f){let l=i;for(let E of this.finallyHandlers)try{l=await E(l,f)}catch(_){console.error("After middleware error:",_)}return l}clone(){let i=new X;return i.beforeHandlers=[...this.beforeHandlers],i.finallyHandlers=[...this.finallyHandlers],i}clear(){this.beforeHandlers=[],this.finallyHandlers=[]}}function u(i){return process.platform==="win32"?`file:///${i.replace(/\\/g,"/")}`:i}class Z{middlewareManager;authManager;cacheManager;routes=[];constructor(i,f,l){this.middlewareManager=i,this.authManager=f,this.cacheManager=l}getRouteSpecificity(i){let A=0,N=i.split("/").filter(Boolean);for(let O of N)if(this.isStaticSegment(O))A+=1000;else if(this.isParamSegment(O))A+=10;else if(this.isWildcardSegment(O))A+=1;if(A+=i.length,this.isExactPath(i))A+=1e4;return A}isStaticSegment(i){return!i.startsWith(":")&&!i.includes("*")}isParamSegment(i){return i.startsWith(":")}isWildcardSegment(i){return i.includes("*")}isExactPath(i){return!i.includes(":")&&!i.includes("*")}sortRoutes(){this.routes.sort((i,f)=>{let l=this.extractPath(i),E=this.extractPath(f),_=this.getRouteSpecificity(l);return this.getRouteSpecificity(E)-_})}extractPath(i){return i[3]||""}route(i,f){let l=this.wrapHandler(i,f),E=[i.method.toUpperCase(),this.createRouteRegex(i.path),[l],i.path];return this.routes.push(E),this.sortRoutes(),E}createRouteRegex(i){return RegExp(`^${i.replace(/\/+(\/|$)/g,"$1").replace(/(\/?\.?):(\w+)\+/g,"($1(?<$2>*))").replace(/(\/?\.?):(\w+)/g,"($1(?<$2>[^$1/]+?))").replace(/\./g,"\\.").replace(/(\/?)\*/g,"($1.*)?")}/*$`)}prepareRequest(i,f){if(!i.context)i.context={};if(f?.params!==void 0)i.params=f.params;if(f?.route!==void 0)i.route=f.route;if(f?.metadata!==void 0)i.metadata=f.metadata;if(!i.query&&i.url){let l=new URL(i.url),E={};for(let[_,A]of l.searchParams)if(_ in E)if(Array.isArray(E[_]))E[_].push(A);else E[_]=[E[_],A];else E[_]=A;i.query=E}if(!i.cookies)g(i)}wrapHandler(i,f){return async(l)=>{let E=l;this.prepareRequest(E,{metadata:i.metadata}),l=E;try{if(i.expose===!1)return S.forbidden("Forbidden");let _=await this.middlewareManager.executeBefore(l);if(_ instanceof Response)return _;if(l=_,i.auth)try{await this.authManager.authenticate(l)}catch(D){return S.unauthorized(D instanceof Error?D.message:"Authentication failed",i.responseContentType)}if(!i.rawRequest&&l.method!=="GET"&&l.method!=="HEAD")try{let D=l.headers.get("content-type");if(D?.includes("application/json"))l.content=await l.json();else if(D?.includes("application/x-www-form-urlencoded"))l.content=Object.fromEntries(await l.formData());else if(D?.includes("multipart/form-data"))l.content=await l.formData();else l.content=await l.text()}catch{l.content=null}let A,N=i.cache,O=async()=>{let D=await f(l);if(D instanceof Response)return{_isResponse:!0,body:await D.text(),status:D.status,headers:Object.fromEntries(D.headers.entries())};return D};if(N&&typeof N==="number"&&N>0){let D=this.cacheManager.generateKey(l,{authUser:l.authUser});A=await this.cacheManager.get(D,O,N)}else if(N&&typeof N==="object"&&N.ttl){let D=N.key||this.cacheManager.generateKey(l,{authUser:l.authUser});A=await this.cacheManager.get(D,O,N.ttl)}else A=await f(l);if(A&&typeof A==="object"&&A._isResponse===!0)A=new Response(A.body,{status:A.status,headers:A.headers});let U;if(i.rawResponse||A instanceof Response)U=A instanceof Response?A:new Response(A);else U=P(200,A,i.responseContentType);return U=await this.middlewareManager.executeFinally(U,l),U}catch(_){if(_ instanceof Response)return _;return console.error("Route handler error:",_),S.internalServerError(_ instanceof Error?_.message:String(_),i.responseContentType)}}}addRoute(i){this.routes.push(i),this.sortRoutes()}getRoutes(){return this.routes}async handle(i){let l=new URL(i.url).pathname;for(let[E,_,A,N]of this.routes)if(i.method==="OPTIONS"||i.method===E){let O=l.match(_);if(O){let U=i;this.prepareRequest(U,{params:O.groups||{},route:N||l});for(let D of A){let I=await D(U);if(I)return I}}}return S.notFound("Route not found")}clearRoutes(){this.routes=[]}}class v{server=null;router;config;corsHandler;constructor(i,f){if(this.router=i,this.config=f,f.cors){let{preflight:l,corsify:E}=H(this.normalizeCorsOptions(f.cors));this.corsHandler={preflight:l,corsify:E}}}normalizeCorsOptions(i){return{origin:i.origin||"*",credentials:i.credentials!==!1,allowHeaders:Array.isArray(i.allowHeaders)?i.allowHeaders.join(", "):i.allowHeaders||"Content-Type, Authorization",allowMethods:Array.isArray(i.allowMethods)?i.allowMethods.join(", "):i.allowMethods||"GET, POST, PUT, PATCH, DELETE, OPTIONS",exposeHeaders:Array.isArray(i.exposeHeaders)?i.exposeHeaders.join(", "):i.exposeHeaders||"Authorization",maxAge:i.maxAge||86400}}async start(){let i=this.config.port||3000,f=this.config.hostname||"localhost",l=async(E)=>{try{if(this.corsHandler&&E.method==="OPTIONS")return this.corsHandler.preflight(E);let _=await this.router.handle(E);if(this.corsHandler)_=this.corsHandler.corsify(_,E);return _}catch(_){return console.error("Server error:",_),new Response("Internal Server Error",{status:500})}};try{if(this.server=Bun.serve({port:i,hostname:f,reusePort:this.config.reusePort!==!1,fetch:l,idleTimeout:this.config.idleTimeout||60,error:(E)=>{return console.error("[ERROR] Server error:",E),new Response("Internal Server Error",{status:500})}}),!this.server||!this.server.port)throw new Error(`Failed to start server on ${f}:${i} - server object is invalid`);return console.log(`→ Vector server running at http://${f}:${i}`),this.server}catch(E){if(E.code==="EADDRINUSE"||E.message?.includes("address already in use"))E.message=`Port ${i} is already in use`,E.port=i;else if(E.code==="EACCES"||E.message?.includes("permission denied"))E.message=`Permission denied to bind to port ${i}`,E.port=i;else if(E.message?.includes("EADDRNOTAVAIL"))E.message=`Cannot bind to hostname ${f}`,E.hostname=f;throw E}}stop(){if(this.server)this.server.stop(),this.server=null,console.log("Server stopped")}getServer(){return this.server}getPort(){return this.server?.port||this.config.port||3000}getHostname(){return this.server?.hostname||this.config.hostname||"localhost"}getUrl(){let i=this.getPort();return`http://${this.getHostname()}:${i}`}}class d{static instance;router;server=null;middlewareManager;authManager;cacheManager;config={};routeScanner=null;routeGenerator=null;_protectedHandler=null;_cacheHandler=null;constructor(){this.middlewareManager=new X,this.authManager=new W,this.cacheManager=new h,this.router=new Z(this.middlewareManager,this.authManager,this.cacheManager)}static getInstance(){if(!d.instance)d.instance=new d;return d.instance}setProtectedHandler(i){this._protectedHandler=i,this.authManager.setProtectedHandler(i)}getProtectedHandler(){return this._protectedHandler}setCacheHandler(i){this._cacheHandler=i,this.cacheManager.setCacheHandler(i)}getCacheHandler(){return this._cacheHandler}addRoute(i,f){return this.router.route(i,f)}async startServer(i){if(this.config={...this.config,...i},this.middlewareManager.clear(),this.config.autoDiscover!==!1)this.router.clearRoutes();if(i?.before)this.middlewareManager.addBefore(...i.before);if(i?.finally)this.middlewareManager.addFinally(...i.finally);if(this.config.autoDiscover!==!1)await this.discoverRoutes();return this.server=new v(this.router,this.config),await this.server.start()}async discoverRoutes(){let i=this.config.routesDir||"./routes",f=this.config.routeExcludePatterns;if(this.routeScanner=new B(i,f),!this.routeGenerator)this.routeGenerator=new K;try{let l=await this.routeScanner.scan();if(l.length>0){if(this.config.development)await this.routeGenerator.generate(l);for(let E of l)try{let A=await import(u(E.path)),N=E.name==="default"?A.default:A[E.name];if(N){if(this.isRouteDefinition(N)){let O=N;this.router.route(O.options,O.handler),this.logRouteLoaded(O.options)}else if(this.isRouteEntry(N))this.router.addRoute(N),this.logRouteLoaded(N);else if(typeof N==="function")this.router.route(E.options,N),this.logRouteLoaded(E.options)}}catch(_){console.error(`Failed to load route ${E.name} from ${E.path}:`,_)}this.router.sortRoutes()}}catch(l){if(l.code!=="ENOENT"&&l.code!=="ENOTDIR")console.error("Failed to discover routes:",l)}}async loadRoute(i){if(typeof i==="function"){let f=i();if(Array.isArray(f))this.router.addRoute(f)}else if(i&&typeof i==="object"){for(let[,f]of Object.entries(i))if(typeof f==="function"){let l=f();if(Array.isArray(l))this.router.addRoute(l)}}}isRouteEntry(i){return Array.isArray(i)&&i.length>=3}isRouteDefinition(i){return i&&typeof i==="object"&&"entry"in i&&"options"in i&&"handler"in i}logRouteLoaded(i){}stop(){if(this.server)this.server.stop(),this.server=null}getServer(){return this.server}getRouter(){return this.router}getCacheManager(){return this.cacheManager}getAuthManager(){return this.authManager}static resetInstance(){d.instance=null}}var q=d.getInstance;var{preflight:si,corsify:pi}=H({origin:"*",credentials:!0,allowHeaders:"Content-Type, Authorization",allowMethods:"GET, POST, PUT, PATCH, DELETE, OPTIONS",exposeHeaders:"Authorization",maxAge:86400});function y(i,f){let l=Ii(i,f);return{entry:[i.method.toUpperCase(),RegExp(`^${i.path.replace(/\/+(\/|$)/g,"$1").replace(/(\/?\.?):(\w+)\+/g,"($1(?<$2>*))").replace(/(\/?\.?):(\w+)/g,"($1(?<$2>[^$1/]+?))").replace(/\./g,"\\.").replace(/(\/?)\*/g,"($1.*)?")}/*$`),[l],i.path],options:i,handler:f}}function Oi(i){return JSON.stringify(i??null,(f,l)=>typeof l==="bigint"?l.toString():l)}var Ni={success:(i,f)=>P(C.OK,i,f),created:(i,f)=>P(C.CREATED,i,f)};function L(i,f,l){let E={error:!0,message:f,statusCode:i,timestamp:new Date().toISOString()};return P(i,E,l)}var S={badRequest:(i="Bad Request",f)=>L(C.BAD_REQUEST,i,f),unauthorized:(i="Unauthorized",f)=>L(C.UNAUTHORIZED,i,f),paymentRequired:(i="Payment Required",f)=>L(402,i,f),forbidden:(i="Forbidden",f)=>L(C.FORBIDDEN,i,f),notFound:(i="Not Found",f)=>L(C.NOT_FOUND,i,f),methodNotAllowed:(i="Method Not Allowed",f)=>L(405,i,f),notAcceptable:(i="Not Acceptable",f)=>L(406,i,f),requestTimeout:(i="Request Timeout",f)=>L(408,i,f),conflict:(i="Conflict",f)=>L(C.CONFLICT,i,f),gone:(i="Gone",f)=>L(410,i,f),lengthRequired:(i="Length Required",f)=>L(411,i,f),preconditionFailed:(i="Precondition Failed",f)=>L(412,i,f),payloadTooLarge:(i="Payload Too Large",f)=>L(413,i,f),uriTooLong:(i="URI Too Long",f)=>L(414,i,f),unsupportedMediaType:(i="Unsupported Media Type",f)=>L(415,i,f),rangeNotSatisfiable:(i="Range Not Satisfiable",f)=>L(416,i,f),expectationFailed:(i="Expectation Failed",f)=>L(417,i,f),imATeapot:(i="I'm a teapot",f)=>L(418,i,f),misdirectedRequest:(i="Misdirected Request",f)=>L(421,i,f),unprocessableEntity:(i="Unprocessable Entity",f)=>L(C.UNPROCESSABLE_ENTITY,i,f),locked:(i="Locked",f)=>L(423,i,f),failedDependency:(i="Failed Dependency",f)=>L(424,i,f),tooEarly:(i="Too Early",f)=>L(425,i,f),upgradeRequired:(i="Upgrade Required",f)=>L(426,i,f),preconditionRequired:(i="Precondition Required",f)=>L(428,i,f),tooManyRequests:(i="Too Many Requests",f)=>L(429,i,f),requestHeaderFieldsTooLarge:(i="Request Header Fields Too Large",f)=>L(431,i,f),unavailableForLegalReasons:(i="Unavailable For Legal Reasons",f)=>L(451,i,f),internalServerError:(i="Internal Server Error",f)=>L(C.INTERNAL_SERVER_ERROR,i,f),notImplemented:(i="Not Implemented",f)=>L(501,i,f),badGateway:(i="Bad Gateway",f)=>L(502,i,f),serviceUnavailable:(i="Service Unavailable",f)=>L(503,i,f),gatewayTimeout:(i="Gateway Timeout",f)=>L(504,i,f),httpVersionNotSupported:(i="HTTP Version Not Supported",f)=>L(505,i,f),variantAlsoNegotiates:(i="Variant Also Negotiates",f)=>L(506,i,f),insufficientStorage:(i="Insufficient Storage",f)=>L(507,i,f),loopDetected:(i="Loop Detected",f)=>L(508,i,f),notExtended:(i="Not Extended",f)=>L(510,i,f),networkAuthenticationRequired:(i="Network Authentication Required",f)=>L(511,i,f),invalidArgument:(i="Invalid Argument",f)=>L(C.UNPROCESSABLE_ENTITY,i,f),rateLimitExceeded:(i="Rate Limit Exceeded",f)=>L(429,i,f),maintenance:(i="Service Under Maintenance",f)=>L(503,i,f),custom:(i,f,l)=>L(i,f,l)};function P(i,f,l=F.JSON){let E=l===F.JSON?Oi(f):f;return new Response(E,{status:i,headers:{"content-type":l}})}var Di=async(i,f)=>{let E=q().getProtectedHandler();if(!E)throw S.unauthorized("Authentication not configured",f);try{let _=await E(i);i.authUser=_}catch(_){throw S.unauthorized(_ instanceof Error?_.message:"Authentication failed",f)}};function Ii(i,f){let{auth:l=!1,expose:E=!1,rawRequest:_=!1,rawResponse:A=!1,responseContentType:N=F.JSON}=i;return async(O)=>{if(!E)return S.forbidden("Forbidden");try{if(l)await Di(O,N);if(!_)await k(O);let U=await f(O);return A?U:Ni.success(U,N)}catch(U){if(U instanceof Response)return U;return S.internalServerError(String(U),N)}}}
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
var fi=Object.defineProperty;var ai=(i,l)=>{for(var f in l)fi(i,f,{get:l[f],enumerable:!0,configurable:!0,set:(a)=>l[f]=()=>a})};var R=(i,l)=>()=>(i&&(l=i(i=0)),l);var b=(i="text/plain; charset=utf-8",l)=>(f,a={})=>{if(f===void 0||f instanceof Response)return f;let E=new Response(l?.(f)??f,a.url?void 0:a);return E.headers.set("content-type",i),E},bi,hi,Si,xi,Gi,Fi,k=async(i)=>{i.content=i.body?await i.clone().json().catch(()=>i.clone().formData()).catch(()=>i.text()):void 0},u=(i)=>{i.cookies=(i.headers.get("Cookie")||"").split(/;\s*/).map((l)=>l.split(/=(.+)/)).reduce((l,[f,a])=>a?(l[f]=a,l):l,{})},F=(i={})=>{let{origin:l="*",credentials:f=!1,allowMethods:a="*",allowHeaders:E,exposeHeaders:A,maxAge:d}=i,_=(I)=>{let O=I?.headers.get("origin");return l===!0?O:l instanceof RegExp?l.test(O)?O:void 0:Array.isArray(l)?l.includes(O)?O:void 0:l instanceof Function?l(O):l=="*"&&f?O:l},N=(I,O)=>{for(let[w,L]of Object.entries(O))L&&I.headers.append(w,L);return I};return{corsify:(I,O)=>I?.headers?.get("access-control-allow-origin")||I.status==101?I:N(I.clone(),{"access-control-allow-origin":_(O),"access-control-allow-credentials":f}),preflight:(I)=>{if(I.method=="OPTIONS"){let O=new Response(null,{status:204});return N(O,{"access-control-allow-origin":_(I),"access-control-allow-methods":a?.join?.(",")??a,"access-control-expose-headers":A?.join?.(",")??A,"access-control-allow-headers":E?.join?.(",")??E??I.headers.get("access-control-request-headers"),"access-control-max-age":d,"access-control-allow-credentials":f})}}}};var Y=R(()=>{bi=b("application/json; charset=utf-8",JSON.stringify),hi=b("text/plain; charset=utf-8",String),Si=b("text/html"),xi=b("image/jpeg"),Gi=b("image/png"),Fi=b("image/webp")});var C,Q,j;var V=R(()=>{C={OK:200,CREATED:201,ACCEPTED:202,NON_AUTHORITATIVE_INFORMATION:203,NO_CONTENT:204,RESET_CONTENT:205,PARTIAL_CONTENT:206,MULTI_STATUS:207,ALREADY_REPORTED:208,IM_USED:226,MULTIPLE_CHOICES:300,MOVED_PERMANENTLY:301,FOUND:302,SEE_OTHER:303,NOT_MODIFIED:304,USE_PROXY:305,TEMPORARY_REDIRECT:307,PERMANENT_REDIRECT:308,BAD_REQUEST:400,UNAUTHORIZED:401,PAYMENT_REQUIRED:402,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_ALLOWED:405,NOT_ACCEPTABLE:406,PROXY_AUTHENTICATION_REQUIRED:407,REQUEST_TIMEOUT:408,CONFLICT:409,GONE:410,LENGTH_REQUIRED:411,PRECONDITION_FAILED:412,PAYLOAD_TOO_LARGE:413,URI_TOO_LONG:414,UNSUPPORTED_MEDIA_TYPE:415,RANGE_NOT_SATISFIABLE:416,EXPECTATION_FAILED:417,IM_A_TEAPOT:418,MISDIRECTED_REQUEST:421,UNPROCESSABLE_ENTITY:422,LOCKED:423,FAILED_DEPENDENCY:424,TOO_EARLY:425,UPGRADE_REQUIRED:426,PRECONDITION_REQUIRED:428,TOO_MANY_REQUESTS:429,REQUEST_HEADER_FIELDS_TOO_LARGE:431,UNAVAILABLE_FOR_LEGAL_REASONS:451,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504,HTTP_VERSION_NOT_SUPPORTED:505,VARIANT_ALSO_NEGOTIATES:506,INSUFFICIENT_STORAGE:507,LOOP_DETECTED:508,NOT_EXTENDED:510,NETWORK_AUTHENTICATION_REQUIRED:511},Q={PORT:3000,HOSTNAME:"localhost",ROUTES_DIR:"./routes",CACHE_TTL:0,CORS_MAX_AGE:86400},j={JSON:"application/json",TEXT:"text/plain",HTML:"text/html",FORM_URLENCODED:"application/x-www-form-urlencoded",MULTIPART:"multipart/form-data"}});class X{protectedHandler=null;setProtectedHandler(i){this.protectedHandler=i}async authenticate(i){if(!this.protectedHandler)throw new Error("Protected handler not configured. Use vector.protected() to set authentication handler.");try{let l=await this.protectedHandler(i);return i.authUser=l,l}catch(l){throw new Error(`Authentication failed: ${l instanceof Error?l.message:String(l)}`)}}isAuthenticated(i){return!!i.authUser}getUser(i){return i.authUser||null}}class J{cacheHandler=null;memoryCache=new Map;cleanupInterval=null;setCacheHandler(i){this.cacheHandler=i}async get(i,l,f=Q.CACHE_TTL){if(f<=0)return l();if(this.cacheHandler)return this.cacheHandler(i,l,f);return this.getFromMemoryCache(i,l,f)}async getFromMemoryCache(i,l,f){let a=Date.now(),E=this.memoryCache.get(i);if(this.isCacheValid(E,a))return E.value;let A=await l();return this.setInMemoryCache(i,A,f),A}isCacheValid(i,l){return i!==void 0&&i.expires>l}setInMemoryCache(i,l,f){let a=Date.now()+f*1000;this.memoryCache.set(i,{value:l,expires:a}),this.scheduleCleanup()}scheduleCleanup(){if(this.cleanupInterval)return;this.cleanupInterval=setInterval(()=>{this.cleanupExpired()},60000)}cleanupExpired(){let i=Date.now();for(let[l,f]of this.memoryCache.entries())if(f.expires<=i)this.memoryCache.delete(l);if(this.memoryCache.size===0&&this.cleanupInterval)clearInterval(this.cleanupInterval),this.cleanupInterval=null}clear(){if(this.memoryCache.clear(),this.cleanupInterval)clearInterval(this.cleanupInterval),this.cleanupInterval=null}async set(i,l,f=Q.CACHE_TTL){if(f<=0)return;if(this.cacheHandler){await this.cacheHandler(i,async()=>l,f);return}this.setInMemoryCache(i,l,f)}delete(i){return this.memoryCache.delete(i)}has(i){let l=this.memoryCache.get(i);if(!l)return!1;if(l.expires<=Date.now())return this.memoryCache.delete(i),!1;return!0}generateKey(i,l){let f=new URL(i.url);return[i.method,f.pathname,f.search,l?.authUser?.id||"anonymous"].join(":")}}var m=R(()=>{V()});function U(i){if(typeof i!=="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(i))}function n(i,l){var f="",a=0,E=-1,A=0,d;for(var _=0;_<=i.length;++_){if(_<i.length)d=i.charCodeAt(_);else if(d===47)break;else d=47;if(d===47){if(E===_-1||A===1);else if(E!==_-1&&A===2){if(f.length<2||a!==2||f.charCodeAt(f.length-1)!==46||f.charCodeAt(f.length-2)!==46){if(f.length>2){var N=f.lastIndexOf("/");if(N!==f.length-1){if(N===-1)f="",a=0;else f=f.slice(0,N),a=f.length-1-f.lastIndexOf("/");E=_,A=0;continue}}else if(f.length===2||f.length===1){f="",a=0,E=_,A=0;continue}}if(l){if(f.length>0)f+="/..";else f="..";a=2}}else{if(f.length>0)f+="/"+i.slice(E+1,_);else f=i.slice(E+1,_);a=_-E-1}E=_,A=0}else if(d===46&&A!==-1)++A;else A=-1}return f}function Ai(i,l){var f=l.dir||l.root,a=l.base||(l.name||"")+(l.ext||"");if(!f)return a;if(f===l.root)return f+a;return f+i+a}function x(){var i="",l=!1,f;for(var a=arguments.length-1;a>=-1&&!l;a--){var E;if(a>=0)E=arguments[a];else{if(f===void 0)f=process.cwd();E=f}if(U(E),E.length===0)continue;i=E+"/"+i,l=E.charCodeAt(0)===47}if(i=n(i,!l),l)if(i.length>0)return"/"+i;else return"/";else if(i.length>0)return i;else return"."}function s(i){if(U(i),i.length===0)return".";var l=i.charCodeAt(0)===47,f=i.charCodeAt(i.length-1)===47;if(i=n(i,!l),i.length===0&&!l)i=".";if(i.length>0&&f)i+="/";if(l)return"/"+i;return i}function Ei(i){return U(i),i.length>0&&i.charCodeAt(0)===47}function W(){if(arguments.length===0)return".";var i;for(var l=0;l<arguments.length;++l){var f=arguments[l];if(U(f),f.length>0)if(i===void 0)i=f;else i+="/"+f}if(i===void 0)return".";return s(i)}function G(i,l){if(U(i),U(l),i===l)return"";if(i=x(i),l=x(l),i===l)return"";var f=1;for(;f<i.length;++f)if(i.charCodeAt(f)!==47)break;var a=i.length,E=a-f,A=1;for(;A<l.length;++A)if(l.charCodeAt(A)!==47)break;var d=l.length,_=d-A,N=E<_?E:_,I=-1,O=0;for(;O<=N;++O){if(O===N){if(_>N){if(l.charCodeAt(A+O)===47)return l.slice(A+O+1);else if(O===0)return l.slice(A+O)}else if(E>N){if(i.charCodeAt(f+O)===47)I=O;else if(O===0)I=0}break}var w=i.charCodeAt(f+O),L=l.charCodeAt(A+O);if(w!==L)break;else if(w===47)I=O}var P="";for(O=f+I+1;O<=a;++O)if(O===a||i.charCodeAt(O)===47)if(P.length===0)P+="..";else P+="/..";if(P.length>0)return P+l.slice(A+I);else{if(A+=I,l.charCodeAt(A)===47)++A;return l.slice(A)}}function _i(i){return i}function M(i){if(U(i),i.length===0)return".";var l=i.charCodeAt(0),f=l===47,a=-1,E=!0;for(var A=i.length-1;A>=1;--A)if(l=i.charCodeAt(A),l===47){if(!E){a=A;break}}else E=!1;if(a===-1)return f?"/":".";if(f&&a===1)return"//";return i.slice(0,a)}function di(i,l){if(l!==void 0&&typeof l!=="string")throw new TypeError('"ext" argument must be a string');U(i);var f=0,a=-1,E=!0,A;if(l!==void 0&&l.length>0&&l.length<=i.length){if(l.length===i.length&&l===i)return"";var d=l.length-1,_=-1;for(A=i.length-1;A>=0;--A){var N=i.charCodeAt(A);if(N===47){if(!E){f=A+1;break}}else{if(_===-1)E=!1,_=A+1;if(d>=0)if(N===l.charCodeAt(d)){if(--d===-1)a=A}else d=-1,a=_}}if(f===a)a=_;else if(a===-1)a=i.length;return i.slice(f,a)}else{for(A=i.length-1;A>=0;--A)if(i.charCodeAt(A)===47){if(!E){f=A+1;break}}else if(a===-1)E=!1,a=A+1;if(a===-1)return"";return i.slice(f,a)}}function Oi(i){U(i);var l=-1,f=0,a=-1,E=!0,A=0;for(var d=i.length-1;d>=0;--d){var _=i.charCodeAt(d);if(_===47){if(!E){f=d+1;break}continue}if(a===-1)E=!1,a=d+1;if(_===46){if(l===-1)l=d;else if(A!==1)A=1}else if(l!==-1)A=-1}if(l===-1||a===-1||A===0||A===1&&l===a-1&&l===f+1)return"";return i.slice(l,a)}function Ni(i){if(i===null||typeof i!=="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof i);return Ai("/",i)}function Di(i){U(i);var l={root:"",dir:"",base:"",ext:"",name:""};if(i.length===0)return l;var f=i.charCodeAt(0),a=f===47,E;if(a)l.root="/",E=1;else E=0;var A=-1,d=0,_=-1,N=!0,I=i.length-1,O=0;for(;I>=E;--I){if(f=i.charCodeAt(I),f===47){if(!N){d=I+1;break}continue}if(_===-1)N=!1,_=I+1;if(f===46){if(A===-1)A=I;else if(O!==1)O=1}else if(A!==-1)O=-1}if(A===-1||_===-1||O===0||O===1&&A===_-1&&A===d+1){if(_!==-1)if(d===0&&a)l.base=l.name=i.slice(1,_);else l.base=l.name=i.slice(d,_)}else{if(d===0&&a)l.name=i.slice(1,A),l.base=i.slice(1,_);else l.name=i.slice(d,A),l.base=i.slice(d,_);l.ext=i.slice(A,_)}if(d>0)l.dir=i.slice(0,d-1);else if(a)l.dir="/";return l}var z="/",Ii=":",Qi;var K=R(()=>{Qi=((i)=>(i.posix=i,i))({resolve:x,normalize:s,isAbsolute:Ei,join:W,relative:G,_makeLong:_i,dirname:M,basename:di,extname:Oi,format:Ni,parse:Di,sep:z,delimiter:Ii,win32:null,posix:null})});var{promises:r}=(()=>({}));class Z{outputPath;constructor(i="./.vector/routes.generated.ts"){this.outputPath=i}async generate(i){let l=M(this.outputPath);await r.mkdir(l,{recursive:!0});let f=[],a=new Map;for(let _ of i){if(!a.has(_.path))a.set(_.path,[]);a.get(_.path).push(_)}let E=0,A=[];for(let[_,N]of a){let I=G(M(this.outputPath),_).replace(/\\/g,"/").replace(/\.(ts|js)$/,""),O=`route_${E++}`,w=N.filter((L)=>L.name!=="default").map((L)=>L.name);if(N.some((L)=>L.name==="default"))if(w.length>0)f.push(`import ${O}, { ${w.join(", ")} } from '${I}';`);else f.push(`import ${O} from '${I}';`);else if(w.length>0)f.push(`import { ${w.join(", ")} } from '${I}';`);for(let L of N){let P=L.name==="default"?O:L.name;A.push(` ${P},`)}}let d=`// This file is auto-generated. Do not edit manually.
|
|
1
|
+
var d=(i="text/plain; charset=utf-8",f)=>(l,E={})=>{if(l===void 0||l instanceof Response)return l;let _=new Response(f?.(l)??l,E.url?void 0:E);return _.headers.set("content-type",i),_},Ai=d("application/json; charset=utf-8",JSON.stringify);var _i=d("text/plain; charset=utf-8",String),Oi=d("text/html"),Ni=d("image/jpeg"),Di=d("image/png"),Ii=d("image/webp"),K=async(i)=>{i.content=i.body?await i.clone().json().catch(()=>i.clone().formData()).catch(()=>i.text()):void 0},Z=(i)=>{i.cookies=(i.headers.get("Cookie")||"").split(/;\s*/).map((f)=>f.split(/=(.+)/)).reduce((f,[l,E])=>E?(f[l]=E,f):f,{})},x=(i={})=>{let{origin:f="*",credentials:l=!1,allowMethods:E="*",allowHeaders:_,exposeHeaders:A,maxAge:N}=i,O=(D)=>{let I=D?.headers.get("origin");return f===!0?I:f instanceof RegExp?f.test(I)?I:void 0:Array.isArray(f)?f.includes(I)?I:void 0:f instanceof Function?f(I):f=="*"&&l?I:f},U=(D,I)=>{for(let[$,w]of Object.entries(I))w&&D.headers.append($,w);return D};return{corsify:(D,I)=>D?.headers?.get("access-control-allow-origin")||D.status==101?D:U(D.clone(),{"access-control-allow-origin":O(I),"access-control-allow-credentials":l}),preflight:(D)=>{if(D.method=="OPTIONS"){let I=new Response(null,{status:204});return U(I,{"access-control-allow-origin":O(D),"access-control-allow-methods":E?.join?.(",")??E,"access-control-expose-headers":A?.join?.(",")??A,"access-control-allow-headers":_?.join?.(",")??_??D.headers.get("access-control-request-headers"),"access-control-max-age":N,"access-control-allow-credentials":l})}}}};var C={OK:200,CREATED:201,ACCEPTED:202,NON_AUTHORITATIVE_INFORMATION:203,NO_CONTENT:204,RESET_CONTENT:205,PARTIAL_CONTENT:206,MULTI_STATUS:207,ALREADY_REPORTED:208,IM_USED:226,MULTIPLE_CHOICES:300,MOVED_PERMANENTLY:301,FOUND:302,SEE_OTHER:303,NOT_MODIFIED:304,USE_PROXY:305,TEMPORARY_REDIRECT:307,PERMANENT_REDIRECT:308,BAD_REQUEST:400,UNAUTHORIZED:401,PAYMENT_REQUIRED:402,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_ALLOWED:405,NOT_ACCEPTABLE:406,PROXY_AUTHENTICATION_REQUIRED:407,REQUEST_TIMEOUT:408,CONFLICT:409,GONE:410,LENGTH_REQUIRED:411,PRECONDITION_FAILED:412,PAYLOAD_TOO_LARGE:413,URI_TOO_LONG:414,UNSUPPORTED_MEDIA_TYPE:415,RANGE_NOT_SATISFIABLE:416,EXPECTATION_FAILED:417,IM_A_TEAPOT:418,MISDIRECTED_REQUEST:421,UNPROCESSABLE_ENTITY:422,LOCKED:423,FAILED_DEPENDENCY:424,TOO_EARLY:425,UPGRADE_REQUIRED:426,PRECONDITION_REQUIRED:428,TOO_MANY_REQUESTS:429,REQUEST_HEADER_FIELDS_TOO_LARGE:431,UNAVAILABLE_FOR_LEGAL_REASONS:451,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504,HTTP_VERSION_NOT_SUPPORTED:505,VARIANT_ALSO_NEGOTIATES:506,INSUFFICIENT_STORAGE:507,LOOP_DETECTED:508,NOT_EXTENDED:510,NETWORK_AUTHENTICATION_REQUIRED:511},X={PORT:3000,HOSTNAME:"localhost",ROUTES_DIR:"./routes",CACHE_TTL:0,CORS_MAX_AGE:86400},H={JSON:"application/json",TEXT:"text/plain",HTML:"text/html",FORM_URLENCODED:"application/x-www-form-urlencoded",MULTIPART:"multipart/form-data"};class z{protectedHandler=null;setProtectedHandler(i){this.protectedHandler=i}async authenticate(i){if(!this.protectedHandler)throw new Error("Protected handler not configured. Use vector.protected() to set authentication handler.");try{let f=await this.protectedHandler(i);return i.authUser=f,f}catch(f){throw new Error(`Authentication failed: ${f instanceof Error?f.message:String(f)}`)}}isAuthenticated(i){return!!i.authUser}getUser(i){return i.authUser||null}}class J{cacheHandler=null;memoryCache=new Map;cleanupInterval=null;setCacheHandler(i){this.cacheHandler=i}async get(i,f,l=X.CACHE_TTL){if(l<=0)return f();if(this.cacheHandler)return this.cacheHandler(i,f,l);return this.getFromMemoryCache(i,f,l)}async getFromMemoryCache(i,f,l){let E=Date.now(),_=this.memoryCache.get(i);if(this.isCacheValid(_,E))return _.value;let A=await f();return this.setInMemoryCache(i,A,l),A}isCacheValid(i,f){return i!==void 0&&i.expires>f}setInMemoryCache(i,f,l){let E=Date.now()+l*1000;this.memoryCache.set(i,{value:f,expires:E}),this.scheduleCleanup()}scheduleCleanup(){if(this.cleanupInterval)return;this.cleanupInterval=setInterval(()=>{this.cleanupExpired()},60000)}cleanupExpired(){let i=Date.now();for(let[f,l]of this.memoryCache.entries())if(l.expires<=i)this.memoryCache.delete(f);if(this.memoryCache.size===0&&this.cleanupInterval)clearInterval(this.cleanupInterval),this.cleanupInterval=null}clear(){if(this.memoryCache.clear(),this.cleanupInterval)clearInterval(this.cleanupInterval),this.cleanupInterval=null}async set(i,f,l=X.CACHE_TTL){if(l<=0)return;if(this.cacheHandler){await this.cacheHandler(i,async()=>f,l);return}this.setInMemoryCache(i,f,l)}delete(i){return this.memoryCache.delete(i)}has(i){let f=this.memoryCache.get(i);if(!f)return!1;if(f.expires<=Date.now())return this.memoryCache.delete(i),!1;return!0}generateKey(i,f){let l=new URL(i.url);return[i.method,l.pathname,l.search,f?.authUser?.id||"anonymous"].join(":")}}var{promises:k}=(()=>({}));function S(i){if(typeof i!=="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(i))}function v(i,f){var l="",E=0,_=-1,A=0,N;for(var O=0;O<=i.length;++O){if(O<i.length)N=i.charCodeAt(O);else if(N===47)break;else N=47;if(N===47){if(_===O-1||A===1);else if(_!==O-1&&A===2){if(l.length<2||E!==2||l.charCodeAt(l.length-1)!==46||l.charCodeAt(l.length-2)!==46){if(l.length>2){var U=l.lastIndexOf("/");if(U!==l.length-1){if(U===-1)l="",E=0;else l=l.slice(0,U),E=l.length-1-l.lastIndexOf("/");_=O,A=0;continue}}else if(l.length===2||l.length===1){l="",E=0,_=O,A=0;continue}}if(f){if(l.length>0)l+="/..";else l="..";E=2}}else{if(l.length>0)l+="/"+i.slice(_+1,O);else l=i.slice(_+1,O);E=O-_-1}_=O,A=0}else if(N===46&&A!==-1)++A;else A=-1}return l}function u(i,f){var l=f.dir||f.root,E=f.base||(f.name||"")+(f.ext||"");if(!l)return E;if(l===f.root)return l+E;return l+i+E}function j(){var i="",f=!1,l;for(var E=arguments.length-1;E>=-1&&!f;E--){var _;if(E>=0)_=arguments[E];else{if(l===void 0)l=process.cwd();_=l}if(S(_),_.length===0)continue;i=_+"/"+i,f=_.charCodeAt(0)===47}if(i=v(i,!f),f)if(i.length>0)return"/"+i;else return"/";else if(i.length>0)return i;else return"."}function T(i){if(S(i),i.length===0)return".";var f=i.charCodeAt(0)===47,l=i.charCodeAt(i.length-1)===47;if(i=v(i,!f),i.length===0&&!f)i=".";if(i.length>0&&l)i+="/";if(f)return"/"+i;return i}function q(i){return S(i),i.length>0&&i.charCodeAt(0)===47}function W(){if(arguments.length===0)return".";var i;for(var f=0;f<arguments.length;++f){var l=arguments[f];if(S(l),l.length>0)if(i===void 0)i=l;else i+="/"+l}if(i===void 0)return".";return T(i)}function G(i,f){if(S(i),S(f),i===f)return"";if(i=j(i),f=j(f),i===f)return"";var l=1;for(;l<i.length;++l)if(i.charCodeAt(l)!==47)break;var E=i.length,_=E-l,A=1;for(;A<f.length;++A)if(f.charCodeAt(A)!==47)break;var N=f.length,O=N-A,U=_<O?_:O,D=-1,I=0;for(;I<=U;++I){if(I===U){if(O>U){if(f.charCodeAt(A+I)===47)return f.slice(A+I+1);else if(I===0)return f.slice(A+I)}else if(_>U){if(i.charCodeAt(l+I)===47)D=I;else if(I===0)D=0}break}var $=i.charCodeAt(l+I),w=f.charCodeAt(A+I);if($!==w)break;else if($===47)D=I}var R="";for(I=l+D+1;I<=E;++I)if(I===E||i.charCodeAt(I)===47)if(R.length===0)R+="..";else R+="/..";if(R.length>0)return R+f.slice(A+D);else{if(A+=D,f.charCodeAt(A)===47)++A;return f.slice(A)}}function y(i){return i}function F(i){if(S(i),i.length===0)return".";var f=i.charCodeAt(0),l=f===47,E=-1,_=!0;for(var A=i.length-1;A>=1;--A)if(f=i.charCodeAt(A),f===47){if(!_){E=A;break}}else _=!1;if(E===-1)return l?"/":".";if(l&&E===1)return"//";return i.slice(0,E)}function n(i,f){if(f!==void 0&&typeof f!=="string")throw new TypeError('"ext" argument must be a string');S(i);var l=0,E=-1,_=!0,A;if(f!==void 0&&f.length>0&&f.length<=i.length){if(f.length===i.length&&f===i)return"";var N=f.length-1,O=-1;for(A=i.length-1;A>=0;--A){var U=i.charCodeAt(A);if(U===47){if(!_){l=A+1;break}}else{if(O===-1)_=!1,O=A+1;if(N>=0)if(U===f.charCodeAt(N)){if(--N===-1)E=A}else N=-1,E=O}}if(l===E)E=O;else if(E===-1)E=i.length;return i.slice(l,E)}else{for(A=i.length-1;A>=0;--A)if(i.charCodeAt(A)===47){if(!_){l=A+1;break}}else if(E===-1)_=!1,E=A+1;if(E===-1)return"";return i.slice(l,E)}}function s(i){S(i);var f=-1,l=0,E=-1,_=!0,A=0;for(var N=i.length-1;N>=0;--N){var O=i.charCodeAt(N);if(O===47){if(!_){l=N+1;break}continue}if(E===-1)_=!1,E=N+1;if(O===46){if(f===-1)f=N;else if(A!==1)A=1}else if(f!==-1)A=-1}if(f===-1||E===-1||A===0||A===1&&f===E-1&&f===l+1)return"";return i.slice(f,E)}function p(i){if(i===null||typeof i!=="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof i);return u("/",i)}function r(i){S(i);var f={root:"",dir:"",base:"",ext:"",name:""};if(i.length===0)return f;var l=i.charCodeAt(0),E=l===47,_;if(E)f.root="/",_=1;else _=0;var A=-1,N=0,O=-1,U=!0,D=i.length-1,I=0;for(;D>=_;--D){if(l=i.charCodeAt(D),l===47){if(!U){N=D+1;break}continue}if(O===-1)U=!1,O=D+1;if(l===46){if(A===-1)A=D;else if(I!==1)I=1}else if(A!==-1)I=-1}if(A===-1||O===-1||I===0||I===1&&A===O-1&&A===N+1){if(O!==-1)if(N===0&&E)f.base=f.name=i.slice(1,O);else f.base=f.name=i.slice(N,O)}else{if(N===0&&E)f.name=i.slice(1,A),f.base=i.slice(1,O);else f.name=i.slice(N,A),f.base=i.slice(N,O);f.ext=i.slice(A,O)}if(N>0)f.dir=i.slice(0,N-1);else if(E)f.dir="/";return f}var Y="/",o=":",Si=((i)=>(i.posix=i,i))({resolve:j,normalize:T,isAbsolute:q,join:W,relative:G,_makeLong:y,dirname:F,basename:n,extname:s,format:p,parse:r,sep:Y,delimiter:o,win32:null,posix:null});class h{outputPath;constructor(i="./.vector/routes.generated.ts"){this.outputPath=i}async generate(i){let f=F(this.outputPath);await k.mkdir(f,{recursive:!0});let l=[],E=new Map;for(let O of i){if(!E.has(O.path))E.set(O.path,[]);E.get(O.path).push(O)}let _=0,A=[];for(let[O,U]of E){let D=G(F(this.outputPath),O).replace(/\\/g,"/").replace(/\.(ts|js)$/,""),I=`route_${_++}`,$=U.filter((w)=>w.name!=="default").map((w)=>w.name);if(U.some((w)=>w.name==="default"))if($.length>0)l.push(`import ${I}, { ${$.join(", ")} } from '${D}';`);else l.push(`import ${I} from '${D}';`);else if($.length>0)l.push(`import { ${$.join(", ")} } from '${D}';`);for(let w of U){let R=w.name==="default"?I:w.name;A.push(` ${R},`)}}let N=`// This file is auto-generated. Do not edit manually.
|
|
2
2
|
// Generated at: ${new Date().toISOString()}
|
|
3
3
|
|
|
4
|
-
${
|
|
4
|
+
${l.join(`
|
|
5
5
|
`)}
|
|
6
6
|
|
|
7
7
|
export const routes = [
|
|
@@ -10,12 +10,12 @@ ${A.join(`
|
|
|
10
10
|
];
|
|
11
11
|
|
|
12
12
|
export default routes;
|
|
13
|
-
`;await
|
|
14
|
-
...${
|
|
15
|
-
handler: m.${
|
|
13
|
+
`;await k.writeFile(this.outputPath,N,"utf-8")}async generateDynamic(i){let f=[];for(let l of i){let E=JSON.stringify({method:l.method,path:l.options.path,options:l.options});f.push(` await import('${l.path}').then(m => ({
|
|
14
|
+
...${E},
|
|
15
|
+
handler: m.${l.name==="default"?"default":l.name}
|
|
16
16
|
}))`)}return`export const loadRoutes = async () => {
|
|
17
17
|
return Promise.all([
|
|
18
|
-
${
|
|
18
|
+
${f.join(`,
|
|
19
19
|
`)}
|
|
20
20
|
]);
|
|
21
|
-
};`}}var y=R(()=>{K()});var{existsSync:wi,promises:q}=(()=>({}));class c{routesDir;constructor(i="./routes"){this.routesDir=x(process.cwd(),i)}async scan(){let i=[];if(!wi(this.routesDir))return[];try{await this.scanDirectory(this.routesDir,i)}catch(l){if(l.code==="ENOENT")return console.warn(` ✗ Routes directory not accessible: ${this.routesDir}`),[];throw l}return i}async scanDirectory(i,l,f=""){let a=await q.readdir(i);for(let E of a){let A=W(i,E);if((await q.stat(A)).isDirectory()){let _=f?`${f}/${E}`:E;await this.scanDirectory(A,l,_)}else if(E.endsWith(".ts")||E.endsWith(".js")){let _=G(this.routesDir,A).replace(/\.(ts|js)$/,"").split(z).join("/");try{let I=await import(process.platform==="win32"?`file:///${A.replace(/\\/g,"/")}`:A);if(I.default&&typeof I.default==="function")l.push({name:"default",path:A,method:"GET",options:{method:"GET",path:`/${_}`,expose:!0}});for(let[O,w]of Object.entries(I)){if(O==="default")continue;if(w&&typeof w==="object"&&"entry"in w&&"options"in w&&"handler"in w){let L=w;l.push({name:O,path:A,method:L.options.method,options:L.options})}else if(Array.isArray(w)&&w.length>=4){let[L,,,P]=w;l.push({name:O,path:A,method:L,options:{method:L,path:P,expose:!0}})}}}catch(N){console.error(`Failed to load route from ${A}:`,N)}}}}enableWatch(i){if(typeof Bun!=="undefined"&&Bun.env.NODE_ENV==="development")console.log(`Watching for route changes in ${this.routesDir}`),setInterval(async()=>{await i()},1000)}}var t=R(()=>{K()});class T{beforeHandlers=[];finallyHandlers=[];addBefore(...i){this.beforeHandlers.push(...i)}addFinally(...i){this.finallyHandlers.push(...i)}async executeBefore(i){let l=i;for(let f of this.beforeHandlers){let a=await f(l);if(a instanceof Response)return a;l=a}return l}async executeFinally(i,l){let f=i;for(let a of this.finallyHandlers)f=await a(f,l);return f}clone(){let i=new T;return i.beforeHandlers=[...this.beforeHandlers],i.finallyHandlers=[...this.finallyHandlers],i}clear(){this.beforeHandlers=[],this.finallyHandlers=[]}}function o(i){return process.platform==="win32"?`file:///${i.replace(/\\/g,"/")}`:i}class v{middlewareManager;authManager;cacheManager;routes=[];constructor(i,l,f){this.middlewareManager=i,this.authManager=l,this.cacheManager=f}getRouteSpecificity(i){let A=0,d=i.split("/").filter(Boolean);for(let _ of d)if(this.isStaticSegment(_))A+=1000;else if(this.isParamSegment(_))A+=10;else if(this.isWildcardSegment(_))A+=1;if(A+=i.length,this.isExactPath(i))A+=1e4;return A}isStaticSegment(i){return!i.startsWith(":")&&!i.includes("*")}isParamSegment(i){return i.startsWith(":")}isWildcardSegment(i){return i.includes("*")}isExactPath(i){return!i.includes(":")&&!i.includes("*")}sortRoutes(){this.routes.sort((i,l)=>{let f=this.extractPath(i),a=this.extractPath(l),E=this.getRouteSpecificity(f);return this.getRouteSpecificity(a)-E})}extractPath(i){return i[3]||""}route(i,l){let f=this.wrapHandler(i,l),a=[i.method.toUpperCase(),this.createRouteRegex(i.path),[f],i.path];return this.routes.push(a),this.sortRoutes(),a}createRouteRegex(i){return RegExp(`^${i.replace(/\/+(\/|$)/g,"$1").replace(/(\/?\.?):(\w+)\+/g,"($1(?<$2>*))").replace(/(\/?\.?):(\w+)/g,"($1(?<$2>[^$1/]+?))").replace(/\./g,"\\.").replace(/(\/?)\*/g,"($1.*)?")}/*$`)}wrapHandler(i,l){return async(f)=>{let a=f;if(!a.context)a.context={};if(!a.query&&a.url){let E=new URL(a.url),A={};for(let[d,_]of E.searchParams)A[d]=A[d]?[].concat(A[d],_):_;a.query=A}if(i.metadata)a.metadata=i.metadata;f=a;try{if(i.expose===!1)return $.forbidden("Forbidden");let E=await this.middlewareManager.executeBefore(f);if(E instanceof Response)return E;if(f=E,i.auth)try{await this.authManager.authenticate(f)}catch(N){return $.unauthorized(N instanceof Error?N.message:"Authentication failed",i.responseContentType)}if(!i.rawRequest&&f.method!=="GET"&&f.method!=="HEAD")try{let N=f.headers.get("content-type");if(N?.includes("application/json"))f.content=await f.json();else if(N?.includes("application/x-www-form-urlencoded"))f.content=Object.fromEntries(await f.formData());else if(N?.includes("multipart/form-data"))f.content=await f.formData();else f.content=await f.text()}catch{f.content=null}let A,d=i.cache;if(d&&typeof d==="number"&&d>0){let N=this.cacheManager.generateKey(f,{authUser:f.authUser});A=await this.cacheManager.get(N,()=>l(f),d)}else if(d&&typeof d==="object"&&d.ttl){let N=d.key||this.cacheManager.generateKey(f,{authUser:f.authUser});A=await this.cacheManager.get(N,()=>l(f),d.ttl)}else A=await l(f);let _;if(i.rawResponse||A instanceof Response)_=A instanceof Response?A:new Response(A);else _=h(200,A,i.responseContentType);return _=await this.middlewareManager.executeFinally(_,f),_}catch(E){if(E instanceof Response)return E;return console.error("Route handler error:",E),$.internalServerError(E instanceof Error?E.message:String(E),i.responseContentType)}}}addRoute(i){this.routes.push(i),this.sortRoutes()}getRoutes(){return this.routes}async handle(i){let f=new URL(i.url).pathname;for(let[a,E,A]of this.routes)if(i.method==="OPTIONS"||i.method===a){let d=f.match(E);if(d){let _=i;if(!_.context)_.context={};_.params=d.groups||{};for(let N of A){let I=await N(_);if(I)return I}}}return $.notFound("Route not found")}clearRoutes(){this.routes=[]}}var p=R(()=>{B()});class g{server=null;router;config;corsHandler;constructor(i,l){if(this.router=i,this.config=l,l.cors){let{preflight:f,corsify:a}=F(this.normalizeCorsOptions(l.cors));this.corsHandler={preflight:f,corsify:a}}}normalizeCorsOptions(i){return{origin:i.origin||"*",credentials:i.credentials!==!1,allowHeaders:Array.isArray(i.allowHeaders)?i.allowHeaders.join(", "):i.allowHeaders||"Content-Type, Authorization",allowMethods:Array.isArray(i.allowMethods)?i.allowMethods.join(", "):i.allowMethods||"GET, POST, PUT, PATCH, DELETE, OPTIONS",exposeHeaders:Array.isArray(i.exposeHeaders)?i.exposeHeaders.join(", "):i.exposeHeaders||"Authorization",maxAge:i.maxAge||86400}}async start(){let i=this.config.port||3000,l=this.config.hostname||"localhost",f=async(a)=>{try{if(this.corsHandler&&a.method==="OPTIONS")return this.corsHandler.preflight(a);let E=await this.router.handle(a);if(this.corsHandler)E=this.corsHandler.corsify(E,a);return E}catch(E){return console.error("Server error:",E),new Response("Internal Server Error",{status:500})}};try{if(this.server=Bun.serve({port:i,hostname:l,reusePort:this.config.reusePort!==!1,fetch:f,idleTimeout:this.config.idleTimeout||60,error:(a)=>{return console.error("[ERROR] Server error:",a),new Response("Internal Server Error",{status:500})}}),!this.server||!this.server.port)throw new Error(`Failed to start server on ${l}:${i} - server object is invalid`);return console.log(`→ Vector server running at http://${l}:${i}`),this.server}catch(a){if(a.code==="EADDRINUSE"||a.message?.includes("address already in use"))a.message=`Port ${i} is already in use`,a.port=i;else if(a.code==="EACCES"||a.message?.includes("permission denied"))a.message=`Permission denied to bind to port ${i}`,a.port=i;else if(a.message?.includes("EADDRNOTAVAIL"))a.message=`Cannot bind to hostname ${l}`,a.hostname=l;throw a}}stop(){if(this.server)this.server.stop(),this.server=null,console.log("Server stopped")}getServer(){return this.server}getPort(){return this.server?.port||this.config.port||3000}getHostname(){return this.server?.hostname||this.config.hostname||"localhost"}getUrl(){let i=this.getPort();return`http://${this.getHostname()}:${i}`}}var e=R(()=>{Y()});var ii={};ai(ii,{getVectorInstance:()=>Li,Vector:()=>H});class H{static instance;router;server=null;middlewareManager;authManager;cacheManager;config={};routeScanner=null;routeGenerator=null;_protectedHandler=null;_cacheHandler=null;constructor(){this.middlewareManager=new T,this.authManager=new X,this.cacheManager=new J,this.router=new v(this.middlewareManager,this.authManager,this.cacheManager)}static getInstance(){if(!H.instance)H.instance=new H;return H.instance}setProtectedHandler(i){this._protectedHandler=i,this.authManager.setProtectedHandler(i)}getProtectedHandler(){return this._protectedHandler}setCacheHandler(i){this._cacheHandler=i,this.cacheManager.setCacheHandler(i)}getCacheHandler(){return this._cacheHandler}addRoute(i,l){return this.router.route(i,l)}async startServer(i){if(this.config={...this.config,...i},this.middlewareManager.clear(),i?.before)this.middlewareManager.addBefore(...i.before);if(i?.finally)this.middlewareManager.addFinally(...i.finally);if(this.config.autoDiscover!==!1)await this.discoverRoutes();return this.server=new g(this.router,this.config),await this.server.start()}async discoverRoutes(){let i=this.config.routesDir||"./routes";if(this.routeScanner=new c(i),!this.routeGenerator)this.routeGenerator=new Z;try{let l=await this.routeScanner.scan();if(l.length>0){if(this.config.development)await this.routeGenerator.generate(l);for(let f of l)try{let E=await import(o(f.path)),A=f.name==="default"?E.default:E[f.name];if(A){if(this.isRouteDefinition(A)){let d=A;this.router.route(d.options,d.handler),this.logRouteLoaded(d.options)}else if(this.isRouteEntry(A))this.router.addRoute(A),this.logRouteLoaded(A);else if(typeof A==="function")this.router.route(f.options,A),this.logRouteLoaded(f.options)}}catch(a){console.error(`Failed to load route ${f.name} from ${f.path}:`,a)}this.router.sortRoutes()}}catch(l){if(l.code!=="ENOENT"&&l.code!=="ENOTDIR")console.error("Failed to discover routes:",l)}}async loadRoute(i){if(typeof i==="function"){let l=i();if(Array.isArray(l))this.router.addRoute(l)}else if(i&&typeof i==="object"){for(let[,l]of Object.entries(i))if(typeof l==="function"){let f=l();if(Array.isArray(f))this.router.addRoute(f)}}}isRouteEntry(i){return Array.isArray(i)&&i.length>=3}isRouteDefinition(i){return i&&typeof i==="object"&&"entry"in i&&"options"in i&&"handler"in i}logRouteLoaded(i){}stop(){if(this.server)this.server.stop(),this.server=null;this.router.clearRoutes()}getServer(){return this.server}getRouter(){return this.router}getCacheManager(){return this.cacheManager}getAuthManager(){return this.authManager}static resetInstance(){H.instance=null}}var Li;var li=R(()=>{m();y();t();p();e();Li=H.getInstance});function Ci(i,l){let f=Pi(i,l);return{entry:[i.method.toUpperCase(),RegExp(`^${i.path.replace(/\/+(\/|$)/g,"$1").replace(/(\/?\.?):(\w+)\+/g,"($1(?<$2>*))").replace(/(\/?\.?):(\w+)/g,"($1(?<$2>[^$1/]+?))").replace(/\./g,"\\.").replace(/(\/?)\*/g,"($1.*)?")}/*$`),[f],i.path],options:i,handler:l}}function Ri(i){return JSON.stringify(i??null,(l,f)=>typeof f==="bigint"?f.toString():f)}function D(i,l,f){let a={error:!0,message:l,statusCode:i,timestamp:new Date().toISOString()};return h(i,a,f)}function h(i,l,f=j.JSON){let a=f===j.JSON?Ri(l):l;return new Response(a,{status:i,headers:{"content-type":f}})}function Pi(i,l){let{auth:f=!1,expose:a=!1,rawRequest:E=!1,rawResponse:A=!1,responseContentType:d=j.JSON}=i;return async(_)=>{if(!a)return $.forbidden("Forbidden");try{if(f)await $i(_,d);if(!E)await k(_);u(_);let N=await l(_);return A?N:Ui.success(N,d)}catch(N){if(N instanceof Response)return N;return $.internalServerError(String(N),d)}}}var ll,fl,Ui,$,$i=async(i,l)=>{let{getVectorInstance:f}=await Promise.resolve().then(() => (li(),ii)),E=f().getProtectedHandler();if(!E)throw $.unauthorized("Authentication not configured",l);try{let A=await E(i);i.authUser=A}catch(A){throw $.unauthorized(A instanceof Error?A.message:"Authentication failed",l)}};var B=R(()=>{Y();V();({preflight:ll,corsify:fl}=F({origin:"*",credentials:!0,allowHeaders:"Content-Type, Authorization",allowMethods:"GET, POST, PUT, PATCH, DELETE, OPTIONS",exposeHeaders:"Authorization",maxAge:86400}));Ui={success:(i,l)=>h(C.OK,i,l),created:(i,l)=>h(C.CREATED,i,l)};$={badRequest:(i="Bad Request",l)=>D(C.BAD_REQUEST,i,l),unauthorized:(i="Unauthorized",l)=>D(C.UNAUTHORIZED,i,l),paymentRequired:(i="Payment Required",l)=>D(402,i,l),forbidden:(i="Forbidden",l)=>D(C.FORBIDDEN,i,l),notFound:(i="Not Found",l)=>D(C.NOT_FOUND,i,l),methodNotAllowed:(i="Method Not Allowed",l)=>D(405,i,l),notAcceptable:(i="Not Acceptable",l)=>D(406,i,l),requestTimeout:(i="Request Timeout",l)=>D(408,i,l),conflict:(i="Conflict",l)=>D(C.CONFLICT,i,l),gone:(i="Gone",l)=>D(410,i,l),lengthRequired:(i="Length Required",l)=>D(411,i,l),preconditionFailed:(i="Precondition Failed",l)=>D(412,i,l),payloadTooLarge:(i="Payload Too Large",l)=>D(413,i,l),uriTooLong:(i="URI Too Long",l)=>D(414,i,l),unsupportedMediaType:(i="Unsupported Media Type",l)=>D(415,i,l),rangeNotSatisfiable:(i="Range Not Satisfiable",l)=>D(416,i,l),expectationFailed:(i="Expectation Failed",l)=>D(417,i,l),imATeapot:(i="I'm a teapot",l)=>D(418,i,l),misdirectedRequest:(i="Misdirected Request",l)=>D(421,i,l),unprocessableEntity:(i="Unprocessable Entity",l)=>D(C.UNPROCESSABLE_ENTITY,i,l),locked:(i="Locked",l)=>D(423,i,l),failedDependency:(i="Failed Dependency",l)=>D(424,i,l),tooEarly:(i="Too Early",l)=>D(425,i,l),upgradeRequired:(i="Upgrade Required",l)=>D(426,i,l),preconditionRequired:(i="Precondition Required",l)=>D(428,i,l),tooManyRequests:(i="Too Many Requests",l)=>D(429,i,l),requestHeaderFieldsTooLarge:(i="Request Header Fields Too Large",l)=>D(431,i,l),unavailableForLegalReasons:(i="Unavailable For Legal Reasons",l)=>D(451,i,l),internalServerError:(i="Internal Server Error",l)=>D(C.INTERNAL_SERVER_ERROR,i,l),notImplemented:(i="Not Implemented",l)=>D(501,i,l),badGateway:(i="Bad Gateway",l)=>D(502,i,l),serviceUnavailable:(i="Service Unavailable",l)=>D(503,i,l),gatewayTimeout:(i="Gateway Timeout",l)=>D(504,i,l),httpVersionNotSupported:(i="HTTP Version Not Supported",l)=>D(505,i,l),variantAlsoNegotiates:(i="Variant Also Negotiates",l)=>D(506,i,l),insufficientStorage:(i="Insufficient Storage",l)=>D(507,i,l),loopDetected:(i="Loop Detected",l)=>D(508,i,l),notExtended:(i="Not Extended",l)=>D(510,i,l),networkAuthenticationRequired:(i="Network Authentication Required",l)=>D(511,i,l),invalidArgument:(i="Invalid Argument",l)=>D(C.UNPROCESSABLE_ENTITY,i,l),rateLimitExceeded:(i="Rate Limit Exceeded",l)=>D(429,i,l),maintenance:(i="Service Under Maintenance",l)=>D(503,i,l),custom:(i,l,f)=>D(i,l,f)}});B();B();export{Ci as route,h as createResponse,$ as APIError};
|
|
21
|
+
};`}}var{existsSync:t,promises:g}=(()=>({}));class Q{routesDir;excludePatterns;static DEFAULT_EXCLUDE_PATTERNS=["*.test.ts","*.test.js","*.test.tsx","*.test.jsx","*.spec.ts","*.spec.js","*.spec.tsx","*.spec.jsx","*.tests.ts","*.tests.js","**/__tests__/**","*.interface.ts","*.type.ts","*.d.ts"];constructor(i="./routes",f){this.routesDir=j(process.cwd(),i),this.excludePatterns=f||Q.DEFAULT_EXCLUDE_PATTERNS}async scan(){let i=[];if(!t(this.routesDir))return[];try{await this.scanDirectory(this.routesDir,i)}catch(f){if(f.code==="ENOENT")return console.warn(` ✗ Routes directory not accessible: ${this.routesDir}`),[];throw f}return i}isExcluded(i){let f=G(this.routesDir,i);for(let l of this.excludePatterns){let E=l.replace(/\./g,"\\.").replace(/\*/g,"[^/]*").replace(/\*\*/g,".*").replace(/\?/g,"."),_=new RegExp(`^${E}$`),A=f.split(Y).pop()||"";if(_.test(f)||_.test(A))return!0}return!1}async scanDirectory(i,f,l=""){let E=await g.readdir(i);for(let _ of E){let A=W(i,_);if((await g.stat(A)).isDirectory()){let O=l?`${l}/${_}`:_;await this.scanDirectory(A,f,O)}else if(_.endsWith(".ts")||_.endsWith(".js")){if(this.isExcluded(A))continue;let O=G(this.routesDir,A).replace(/\.(ts|js)$/,"").split(Y).join("/");try{let D=await import(process.platform==="win32"?`file:///${A.replace(/\\/g,"/")}`:A);if(D.default&&typeof D.default==="function")f.push({name:"default",path:A,method:"GET",options:{method:"GET",path:`/${O}`,expose:!0}});for(let[I,$]of Object.entries(D)){if(I==="default")continue;if($&&typeof $==="object"&&"entry"in $&&"options"in $&&"handler"in $){let w=$;f.push({name:I,path:A,method:w.options.method,options:w.options})}else if(Array.isArray($)&&$.length>=4){let[w,,,R]=$;f.push({name:I,path:A,method:w,options:{method:w,path:R,expose:!0}})}}}catch(U){console.error(`Failed to load route from ${A}:`,U)}}}}enableWatch(i){if(typeof Bun!=="undefined"&&Bun.env.NODE_ENV==="development")console.log(`Watching for route changes in ${this.routesDir}`),setInterval(async()=>{await i()},1000)}}class B{beforeHandlers=[];finallyHandlers=[];addBefore(...i){this.beforeHandlers.push(...i)}addFinally(...i){this.finallyHandlers.push(...i)}async executeBefore(i){let f=i;for(let l of this.beforeHandlers){let E=await l(f);if(E instanceof Response)return E;f=E}return f}async executeFinally(i,f){let l=i;for(let E of this.finallyHandlers)try{l=await E(l,f)}catch(_){console.error("After middleware error:",_)}return l}clone(){let i=new B;return i.beforeHandlers=[...this.beforeHandlers],i.finallyHandlers=[...this.finallyHandlers],i}clear(){this.beforeHandlers=[],this.finallyHandlers=[]}}function c(i){return process.platform==="win32"?`file:///${i.replace(/\\/g,"/")}`:i}class M{middlewareManager;authManager;cacheManager;routes=[];constructor(i,f,l){this.middlewareManager=i,this.authManager=f,this.cacheManager=l}getRouteSpecificity(i){let A=0,N=i.split("/").filter(Boolean);for(let O of N)if(this.isStaticSegment(O))A+=1000;else if(this.isParamSegment(O))A+=10;else if(this.isWildcardSegment(O))A+=1;if(A+=i.length,this.isExactPath(i))A+=1e4;return A}isStaticSegment(i){return!i.startsWith(":")&&!i.includes("*")}isParamSegment(i){return i.startsWith(":")}isWildcardSegment(i){return i.includes("*")}isExactPath(i){return!i.includes(":")&&!i.includes("*")}sortRoutes(){this.routes.sort((i,f)=>{let l=this.extractPath(i),E=this.extractPath(f),_=this.getRouteSpecificity(l);return this.getRouteSpecificity(E)-_})}extractPath(i){return i[3]||""}route(i,f){let l=this.wrapHandler(i,f),E=[i.method.toUpperCase(),this.createRouteRegex(i.path),[l],i.path];return this.routes.push(E),this.sortRoutes(),E}createRouteRegex(i){return RegExp(`^${i.replace(/\/+(\/|$)/g,"$1").replace(/(\/?\.?):(\w+)\+/g,"($1(?<$2>*))").replace(/(\/?\.?):(\w+)/g,"($1(?<$2>[^$1/]+?))").replace(/\./g,"\\.").replace(/(\/?)\*/g,"($1.*)?")}/*$`)}prepareRequest(i,f){if(!i.context)i.context={};if(f?.params!==void 0)i.params=f.params;if(f?.route!==void 0)i.route=f.route;if(f?.metadata!==void 0)i.metadata=f.metadata;if(!i.query&&i.url){let l=new URL(i.url),E={};for(let[_,A]of l.searchParams)if(_ in E)if(Array.isArray(E[_]))E[_].push(A);else E[_]=[E[_],A];else E[_]=A;i.query=E}if(!i.cookies)Z(i)}wrapHandler(i,f){return async(l)=>{let E=l;this.prepareRequest(E,{metadata:i.metadata}),l=E;try{if(i.expose===!1)return b.forbidden("Forbidden");let _=await this.middlewareManager.executeBefore(l);if(_ instanceof Response)return _;if(l=_,i.auth)try{await this.authManager.authenticate(l)}catch(D){return b.unauthorized(D instanceof Error?D.message:"Authentication failed",i.responseContentType)}if(!i.rawRequest&&l.method!=="GET"&&l.method!=="HEAD")try{let D=l.headers.get("content-type");if(D?.includes("application/json"))l.content=await l.json();else if(D?.includes("application/x-www-form-urlencoded"))l.content=Object.fromEntries(await l.formData());else if(D?.includes("multipart/form-data"))l.content=await l.formData();else l.content=await l.text()}catch{l.content=null}let A,N=i.cache,O=async()=>{let D=await f(l);if(D instanceof Response)return{_isResponse:!0,body:await D.text(),status:D.status,headers:Object.fromEntries(D.headers.entries())};return D};if(N&&typeof N==="number"&&N>0){let D=this.cacheManager.generateKey(l,{authUser:l.authUser});A=await this.cacheManager.get(D,O,N)}else if(N&&typeof N==="object"&&N.ttl){let D=N.key||this.cacheManager.generateKey(l,{authUser:l.authUser});A=await this.cacheManager.get(D,O,N.ttl)}else A=await f(l);if(A&&typeof A==="object"&&A._isResponse===!0)A=new Response(A.body,{status:A.status,headers:A.headers});let U;if(i.rawResponse||A instanceof Response)U=A instanceof Response?A:new Response(A);else U=a(200,A,i.responseContentType);return U=await this.middlewareManager.executeFinally(U,l),U}catch(_){if(_ instanceof Response)return _;return console.error("Route handler error:",_),b.internalServerError(_ instanceof Error?_.message:String(_),i.responseContentType)}}}addRoute(i){this.routes.push(i),this.sortRoutes()}getRoutes(){return this.routes}async handle(i){let l=new URL(i.url).pathname;for(let[E,_,A,N]of this.routes)if(i.method==="OPTIONS"||i.method===E){let O=l.match(_);if(O){let U=i;this.prepareRequest(U,{params:O.groups||{},route:N||l});for(let D of A){let I=await D(U);if(I)return I}}}return b.notFound("Route not found")}clearRoutes(){this.routes=[]}}class V{server=null;router;config;corsHandler;constructor(i,f){if(this.router=i,this.config=f,f.cors){let{preflight:l,corsify:E}=x(this.normalizeCorsOptions(f.cors));this.corsHandler={preflight:l,corsify:E}}}normalizeCorsOptions(i){return{origin:i.origin||"*",credentials:i.credentials!==!1,allowHeaders:Array.isArray(i.allowHeaders)?i.allowHeaders.join(", "):i.allowHeaders||"Content-Type, Authorization",allowMethods:Array.isArray(i.allowMethods)?i.allowMethods.join(", "):i.allowMethods||"GET, POST, PUT, PATCH, DELETE, OPTIONS",exposeHeaders:Array.isArray(i.exposeHeaders)?i.exposeHeaders.join(", "):i.exposeHeaders||"Authorization",maxAge:i.maxAge||86400}}async start(){let i=this.config.port||3000,f=this.config.hostname||"localhost",l=async(E)=>{try{if(this.corsHandler&&E.method==="OPTIONS")return this.corsHandler.preflight(E);let _=await this.router.handle(E);if(this.corsHandler)_=this.corsHandler.corsify(_,E);return _}catch(_){return console.error("Server error:",_),new Response("Internal Server Error",{status:500})}};try{if(this.server=Bun.serve({port:i,hostname:f,reusePort:this.config.reusePort!==!1,fetch:l,idleTimeout:this.config.idleTimeout||60,error:(E)=>{return console.error("[ERROR] Server error:",E),new Response("Internal Server Error",{status:500})}}),!this.server||!this.server.port)throw new Error(`Failed to start server on ${f}:${i} - server object is invalid`);return console.log(`→ Vector server running at http://${f}:${i}`),this.server}catch(E){if(E.code==="EADDRINUSE"||E.message?.includes("address already in use"))E.message=`Port ${i} is already in use`,E.port=i;else if(E.code==="EACCES"||E.message?.includes("permission denied"))E.message=`Permission denied to bind to port ${i}`,E.port=i;else if(E.message?.includes("EADDRNOTAVAIL"))E.message=`Cannot bind to hostname ${f}`,E.hostname=f;throw E}}stop(){if(this.server)this.server.stop(),this.server=null,console.log("Server stopped")}getServer(){return this.server}getPort(){return this.server?.port||this.config.port||3000}getHostname(){return this.server?.hostname||this.config.hostname||"localhost"}getUrl(){let i=this.getPort();return`http://${this.getHostname()}:${i}`}}class P{static instance;router;server=null;middlewareManager;authManager;cacheManager;config={};routeScanner=null;routeGenerator=null;_protectedHandler=null;_cacheHandler=null;constructor(){this.middlewareManager=new B,this.authManager=new z,this.cacheManager=new J,this.router=new M(this.middlewareManager,this.authManager,this.cacheManager)}static getInstance(){if(!P.instance)P.instance=new P;return P.instance}setProtectedHandler(i){this._protectedHandler=i,this.authManager.setProtectedHandler(i)}getProtectedHandler(){return this._protectedHandler}setCacheHandler(i){this._cacheHandler=i,this.cacheManager.setCacheHandler(i)}getCacheHandler(){return this._cacheHandler}addRoute(i,f){return this.router.route(i,f)}async startServer(i){if(this.config={...this.config,...i},this.middlewareManager.clear(),this.config.autoDiscover!==!1)this.router.clearRoutes();if(i?.before)this.middlewareManager.addBefore(...i.before);if(i?.finally)this.middlewareManager.addFinally(...i.finally);if(this.config.autoDiscover!==!1)await this.discoverRoutes();return this.server=new V(this.router,this.config),await this.server.start()}async discoverRoutes(){let i=this.config.routesDir||"./routes",f=this.config.routeExcludePatterns;if(this.routeScanner=new Q(i,f),!this.routeGenerator)this.routeGenerator=new h;try{let l=await this.routeScanner.scan();if(l.length>0){if(this.config.development)await this.routeGenerator.generate(l);for(let E of l)try{let A=await import(c(E.path)),N=E.name==="default"?A.default:A[E.name];if(N){if(this.isRouteDefinition(N)){let O=N;this.router.route(O.options,O.handler),this.logRouteLoaded(O.options)}else if(this.isRouteEntry(N))this.router.addRoute(N),this.logRouteLoaded(N);else if(typeof N==="function")this.router.route(E.options,N),this.logRouteLoaded(E.options)}}catch(_){console.error(`Failed to load route ${E.name} from ${E.path}:`,_)}this.router.sortRoutes()}}catch(l){if(l.code!=="ENOENT"&&l.code!=="ENOTDIR")console.error("Failed to discover routes:",l)}}async loadRoute(i){if(typeof i==="function"){let f=i();if(Array.isArray(f))this.router.addRoute(f)}else if(i&&typeof i==="object"){for(let[,f]of Object.entries(i))if(typeof f==="function"){let l=f();if(Array.isArray(l))this.router.addRoute(l)}}}isRouteEntry(i){return Array.isArray(i)&&i.length>=3}isRouteDefinition(i){return i&&typeof i==="object"&&"entry"in i&&"options"in i&&"handler"in i}logRouteLoaded(i){}stop(){if(this.server)this.server.stop(),this.server=null}getServer(){return this.server}getRouter(){return this.router}getCacheManager(){return this.cacheManager}getAuthManager(){return this.authManager}static resetInstance(){P.instance=null}}var m=P.getInstance;var{preflight:ci,corsify:mi}=x({origin:"*",credentials:!0,allowHeaders:"Content-Type, Authorization",allowMethods:"GET, POST, PUT, PATCH, DELETE, OPTIONS",exposeHeaders:"Authorization",maxAge:86400});function e(i,f){let l=Ei(i,f);return{entry:[i.method.toUpperCase(),RegExp(`^${i.path.replace(/\/+(\/|$)/g,"$1").replace(/(\/?\.?):(\w+)\+/g,"($1(?<$2>*))").replace(/(\/?\.?):(\w+)/g,"($1(?<$2>[^$1/]+?))").replace(/\./g,"\\.").replace(/(\/?)\*/g,"($1.*)?")}/*$`),[l],i.path],options:i,handler:f}}function ii(i){return JSON.stringify(i??null,(f,l)=>typeof l==="bigint"?l.toString():l)}var fi={success:(i,f)=>a(C.OK,i,f),created:(i,f)=>a(C.CREATED,i,f)};function L(i,f,l){let E={error:!0,message:f,statusCode:i,timestamp:new Date().toISOString()};return a(i,E,l)}var b={badRequest:(i="Bad Request",f)=>L(C.BAD_REQUEST,i,f),unauthorized:(i="Unauthorized",f)=>L(C.UNAUTHORIZED,i,f),paymentRequired:(i="Payment Required",f)=>L(402,i,f),forbidden:(i="Forbidden",f)=>L(C.FORBIDDEN,i,f),notFound:(i="Not Found",f)=>L(C.NOT_FOUND,i,f),methodNotAllowed:(i="Method Not Allowed",f)=>L(405,i,f),notAcceptable:(i="Not Acceptable",f)=>L(406,i,f),requestTimeout:(i="Request Timeout",f)=>L(408,i,f),conflict:(i="Conflict",f)=>L(C.CONFLICT,i,f),gone:(i="Gone",f)=>L(410,i,f),lengthRequired:(i="Length Required",f)=>L(411,i,f),preconditionFailed:(i="Precondition Failed",f)=>L(412,i,f),payloadTooLarge:(i="Payload Too Large",f)=>L(413,i,f),uriTooLong:(i="URI Too Long",f)=>L(414,i,f),unsupportedMediaType:(i="Unsupported Media Type",f)=>L(415,i,f),rangeNotSatisfiable:(i="Range Not Satisfiable",f)=>L(416,i,f),expectationFailed:(i="Expectation Failed",f)=>L(417,i,f),imATeapot:(i="I'm a teapot",f)=>L(418,i,f),misdirectedRequest:(i="Misdirected Request",f)=>L(421,i,f),unprocessableEntity:(i="Unprocessable Entity",f)=>L(C.UNPROCESSABLE_ENTITY,i,f),locked:(i="Locked",f)=>L(423,i,f),failedDependency:(i="Failed Dependency",f)=>L(424,i,f),tooEarly:(i="Too Early",f)=>L(425,i,f),upgradeRequired:(i="Upgrade Required",f)=>L(426,i,f),preconditionRequired:(i="Precondition Required",f)=>L(428,i,f),tooManyRequests:(i="Too Many Requests",f)=>L(429,i,f),requestHeaderFieldsTooLarge:(i="Request Header Fields Too Large",f)=>L(431,i,f),unavailableForLegalReasons:(i="Unavailable For Legal Reasons",f)=>L(451,i,f),internalServerError:(i="Internal Server Error",f)=>L(C.INTERNAL_SERVER_ERROR,i,f),notImplemented:(i="Not Implemented",f)=>L(501,i,f),badGateway:(i="Bad Gateway",f)=>L(502,i,f),serviceUnavailable:(i="Service Unavailable",f)=>L(503,i,f),gatewayTimeout:(i="Gateway Timeout",f)=>L(504,i,f),httpVersionNotSupported:(i="HTTP Version Not Supported",f)=>L(505,i,f),variantAlsoNegotiates:(i="Variant Also Negotiates",f)=>L(506,i,f),insufficientStorage:(i="Insufficient Storage",f)=>L(507,i,f),loopDetected:(i="Loop Detected",f)=>L(508,i,f),notExtended:(i="Not Extended",f)=>L(510,i,f),networkAuthenticationRequired:(i="Network Authentication Required",f)=>L(511,i,f),invalidArgument:(i="Invalid Argument",f)=>L(C.UNPROCESSABLE_ENTITY,i,f),rateLimitExceeded:(i="Rate Limit Exceeded",f)=>L(429,i,f),maintenance:(i="Service Under Maintenance",f)=>L(503,i,f),custom:(i,f,l)=>L(i,f,l)};function a(i,f,l=H.JSON){let E=l===H.JSON?ii(f):f;return new Response(E,{status:i,headers:{"content-type":l}})}var li=async(i,f)=>{let E=m().getProtectedHandler();if(!E)throw b.unauthorized("Authentication not configured",f);try{let _=await E(i);i.authUser=_}catch(_){throw b.unauthorized(_ instanceof Error?_.message:"Authentication failed",f)}};function Ei(i,f){let{auth:l=!1,expose:E=!1,rawRequest:_=!1,rawResponse:A=!1,responseContentType:N=H.JSON}=i;return async(O)=>{if(!E)return b.forbidden("Forbidden");try{if(l)await li(O,N);if(!_)await K(O);let U=await f(O);return A?U:fi.success(U,N)}catch(U){if(U instanceof Response)return U;return b.internalServerError(String(U),N)}}}export{e as route,a as createResponse,b as APIError};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/middleware/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,aAAa,EACb,WAAW,EACZ,MAAM,UAAU,CAAC;AAElB,qBAAa,iBAAiB,CAC5B,MAAM,SAAS,WAAW,GAAG,kBAAkB;IAE/C,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,eAAe,CAAwC;IAE/D,SAAS,CAAC,GAAG,QAAQ,EAAE,uBAAuB,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI;IAI/D,UAAU,CAAC,GAAG,QAAQ,EAAE,sBAAsB,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI;IAIzD,aAAa,CACjB,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAC7B,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC;IAgBtC,cAAc,CAClB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAC7B,OAAO,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/middleware/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,aAAa,EACb,WAAW,EACZ,MAAM,UAAU,CAAC;AAElB,qBAAa,iBAAiB,CAC5B,MAAM,SAAS,WAAW,GAAG,kBAAkB;IAE/C,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,eAAe,CAAwC;IAE/D,SAAS,CAAC,GAAG,QAAQ,EAAE,uBAAuB,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI;IAI/D,UAAU,CAAC,GAAG,QAAQ,EAAE,sBAAsB,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI;IAIzD,aAAa,CACjB,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAC7B,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC;IAgBtC,cAAc,CAClB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAC7B,OAAO,CAAC,QAAQ,CAAC;IAgBpB,KAAK,IAAI,iBAAiB,CAAC,MAAM,CAAC;IAOlC,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -21,7 +21,14 @@ export class MiddlewareManager {
|
|
|
21
21
|
async executeFinally(response, request) {
|
|
22
22
|
let currentResponse = response;
|
|
23
23
|
for (const handler of this.finallyHandlers) {
|
|
24
|
-
|
|
24
|
+
try {
|
|
25
|
+
currentResponse = await handler(currentResponse, request);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
// Log but don't throw - we don't want to break the response chain
|
|
29
|
+
console.error('After middleware error:', error);
|
|
30
|
+
// Continue with the current response
|
|
31
|
+
}
|
|
25
32
|
}
|
|
26
33
|
return currentResponse;
|
|
27
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/middleware/manager.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,iBAAiB;IAGpB,cAAc,GAAsC,EAAE,CAAC;IACvD,eAAe,GAAqC,EAAE,CAAC;IAE/D,SAAS,CAAC,GAAG,QAA2C;QACtD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,UAAU,CAAC,GAAG,QAA0C;QACtD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,OAA8B;QAE9B,IAAI,cAAc,GAAG,OAAO,CAAC;QAE7B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;YAE7C,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,cAAc,GAAG,MAAM,CAAC;QAC1B,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,QAAkB,EAClB,OAA8B;QAE9B,IAAI,eAAe,GAAG,QAAQ,CAAC;QAE/B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3C,eAAe,GAAG,MAAM,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/middleware/manager.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,iBAAiB;IAGpB,cAAc,GAAsC,EAAE,CAAC;IACvD,eAAe,GAAqC,EAAE,CAAC;IAE/D,SAAS,CAAC,GAAG,QAA2C;QACtD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,UAAU,CAAC,GAAG,QAA0C;QACtD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,OAA8B;QAE9B,IAAI,cAAc,GAAG,OAAO,CAAC;QAE7B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;YAE7C,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;gBAC/B,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,cAAc,GAAG,MAAM,CAAC;QAC1B,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,QAAkB,EAClB,OAA8B;QAE9B,IAAI,eAAe,GAAG,QAAQ,CAAC;QAE/B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,eAAe,GAAG,MAAM,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAC5D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,kEAAkE;gBAClE,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;gBAChD,qCAAqC;YACvC,CAAC;QACH,CAAC;QAED,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,KAAK;QACH,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAU,CAAC;QAChD,OAAO,CAAC,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;QAClD,OAAO,CAAC,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;QACpD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC5B,CAAC;CACF"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -29,6 +29,11 @@ export interface VectorRequest<TTypes extends VectorTypes = DefaultVectorTypes>
|
|
|
29
29
|
metadata?: GetMetadataType<TTypes>;
|
|
30
30
|
content?: any;
|
|
31
31
|
params?: Record<string, string>;
|
|
32
|
+
query: {
|
|
33
|
+
[key: string]: string | string[] | undefined;
|
|
34
|
+
};
|
|
35
|
+
headers: Headers;
|
|
36
|
+
cookies?: Record<string, string>;
|
|
32
37
|
startTime?: number;
|
|
33
38
|
[key: string]: any;
|
|
34
39
|
}
|
|
@@ -56,6 +61,7 @@ export interface VectorConfig<TTypes extends VectorTypes = DefaultVectorTypes> {
|
|
|
56
61
|
before?: BeforeMiddlewareHandler<TTypes>[];
|
|
57
62
|
finally?: AfterMiddlewareHandler<TTypes>[];
|
|
58
63
|
routesDir?: string;
|
|
64
|
+
routeExcludePatterns?: string[];
|
|
59
65
|
autoDiscover?: boolean;
|
|
60
66
|
idleTimeout?: number;
|
|
61
67
|
}
|
|
@@ -65,6 +71,7 @@ export interface VectorConfigSchema<TTypes extends VectorTypes = DefaultVectorTy
|
|
|
65
71
|
reusePort?: boolean;
|
|
66
72
|
development?: boolean;
|
|
67
73
|
routesDir?: string;
|
|
74
|
+
routeExcludePatterns?: string[];
|
|
68
75
|
idleTimeout?: number;
|
|
69
76
|
before?: BeforeMiddlewareHandler<TTypes>[];
|
|
70
77
|
after?: AfterMiddlewareHandler<TTypes>[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vector-framework",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.9",
|
|
4
4
|
"author": "",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -76,7 +76,6 @@
|
|
|
76
76
|
"dev": "bun run src/cli/index.ts dev",
|
|
77
77
|
"start": "bun run src/cli/index.ts start",
|
|
78
78
|
"build": "bun run src/cli/index.ts build",
|
|
79
|
-
"example": "bun run examples/server.ts",
|
|
80
79
|
"build:lib": "bun run build:clean && bun run build:ts && bun run build:bundle && bun run build:cli",
|
|
81
80
|
"build:clean": "rm -rf dist",
|
|
82
81
|
"build:ts": "tsc",
|
package/src/cli/index.ts
CHANGED
|
@@ -66,83 +66,80 @@ async function runDev() {
|
|
|
66
66
|
|
|
67
67
|
// Create the actual server start promise
|
|
68
68
|
const serverStartPromise = (async (): Promise<{ server: any; vector: any; config: any }> => {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
69
|
+
// Load configuration using ConfigLoader
|
|
70
|
+
const configLoader = new ConfigLoader(values.config as string | undefined);
|
|
71
|
+
const config = await configLoader.load();
|
|
72
|
+
const configSource = configLoader.getConfigSource();
|
|
73
|
+
|
|
74
|
+
// Merge CLI options with loaded config
|
|
75
|
+
// Only use CLI values if config doesn't have them
|
|
76
|
+
config.port = config.port ?? Number.parseInt(values.port as string);
|
|
77
|
+
config.hostname = config.hostname ?? (values.host as string);
|
|
78
|
+
config.routesDir = config.routesDir ?? (values.routes as string);
|
|
79
|
+
config.development = config.development ?? isDev;
|
|
80
|
+
config.autoDiscover = true; // Always auto-discover routes
|
|
81
|
+
|
|
82
|
+
// Apply CLI CORS option if not explicitly set in config
|
|
83
|
+
// Only apply default CORS if config.cors is undefined (not set)
|
|
84
|
+
if (config.cors === undefined && values.cors) {
|
|
85
|
+
config.cors = {
|
|
86
|
+
origin: "*",
|
|
87
|
+
credentials: true,
|
|
88
|
+
allowHeaders: "Content-Type, Authorization",
|
|
89
|
+
allowMethods: "GET, POST, PUT, PATCH, DELETE, OPTIONS",
|
|
90
|
+
exposeHeaders: "Authorization",
|
|
91
|
+
maxAge: 86400,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
// Get Vector instance and configure handlers
|
|
96
|
+
vector = getVectorInstance();
|
|
97
97
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
98
|
+
// Load and set auth handler if configured
|
|
99
|
+
const authHandler = await configLoader.loadAuthHandler();
|
|
100
|
+
if (authHandler) {
|
|
101
|
+
vector.setProtectedHandler(authHandler);
|
|
102
|
+
}
|
|
103
103
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
104
|
+
// Load and set cache handler if configured
|
|
105
|
+
const cacheHandler = await configLoader.loadCacheHandler();
|
|
106
|
+
if (cacheHandler) {
|
|
107
|
+
vector.setCacheHandler(cacheHandler);
|
|
108
|
+
}
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
// Start the server
|
|
111
|
+
server = await vector.startServer(config);
|
|
112
112
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
113
|
+
// Verify the server is actually running
|
|
114
|
+
if (!server || !server.port) {
|
|
115
|
+
throw new Error("Server started but is not responding correctly");
|
|
116
|
+
}
|
|
117
117
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
console.log(
|
|
133
|
-
` ${gray}CORS${reset} ${config.cors ? "Enabled" : "Disabled"}`
|
|
134
|
-
);
|
|
135
|
-
console.log(
|
|
136
|
-
` ${gray}Mode${reset} ${config.development ? "Development" : "Production"}\n`
|
|
137
|
-
);
|
|
138
|
-
console.log(
|
|
139
|
-
` ${green}Ready${reset} → ${cyan}http://${config.hostname}:${config.port}${reset}\n`
|
|
140
|
-
);
|
|
141
|
-
|
|
142
|
-
return { server, vector, config };
|
|
143
|
-
} catch (error) {
|
|
144
|
-
throw error;
|
|
118
|
+
const gray = "\x1b[90m";
|
|
119
|
+
const reset = "\x1b[0m";
|
|
120
|
+
const cyan = "\x1b[36m";
|
|
121
|
+
const green = "\x1b[32m";
|
|
122
|
+
|
|
123
|
+
console.log(
|
|
124
|
+
` ${gray}Config${reset} ${
|
|
125
|
+
configSource === "user" ? "User config loaded" : "Using defaults"
|
|
126
|
+
}`
|
|
127
|
+
);
|
|
128
|
+
console.log(` ${gray}Routes${reset} ${config.routesDir}`);
|
|
129
|
+
if (isDev && values.watch) {
|
|
130
|
+
console.log(` ${gray}Watching${reset} All project files`);
|
|
145
131
|
}
|
|
132
|
+
console.log(
|
|
133
|
+
` ${gray}CORS${reset} ${config.cors ? "Enabled" : "Disabled"}`
|
|
134
|
+
);
|
|
135
|
+
console.log(
|
|
136
|
+
` ${gray}Mode${reset} ${config.development ? "Development" : "Production"}\n`
|
|
137
|
+
);
|
|
138
|
+
console.log(
|
|
139
|
+
` ${green}Ready${reset} → ${cyan}http://${config.hostname}:${config.port}${reset}\n`
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
return { server, vector, config };
|
|
146
143
|
})();
|
|
147
144
|
|
|
148
145
|
// Race between server startup and timeout
|
|
@@ -206,9 +203,13 @@ async function runDev() {
|
|
|
206
203
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
207
204
|
|
|
208
205
|
// Clear module cache to ensure fresh imports
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
206
|
+
// Note: Bun uses ESM and doesn't have require.cache
|
|
207
|
+
// The Loader API will handle module reloading automatically
|
|
208
|
+
if (typeof require !== 'undefined' && require.cache) {
|
|
209
|
+
for (const key in require.cache) {
|
|
210
|
+
if (!key.includes("node_modules")) {
|
|
211
|
+
delete require.cache[key];
|
|
212
|
+
}
|
|
212
213
|
}
|
|
213
214
|
}
|
|
214
215
|
|
|
@@ -221,15 +222,14 @@ async function runDev() {
|
|
|
221
222
|
console.error("\n[Reload Error]", error.message || error);
|
|
222
223
|
// Don't exit the process on reload failures, just continue watching
|
|
223
224
|
} finally {
|
|
224
|
-
// Reset flag after
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
}, 2000); // 2 second cooldown
|
|
225
|
+
// Reset flag immediately after reload completes
|
|
226
|
+
// The lastReloadTime check provides additional protection
|
|
227
|
+
isReloading = false;
|
|
228
228
|
}
|
|
229
229
|
}, 500); // Increased debounce to 500ms
|
|
230
230
|
}
|
|
231
231
|
});
|
|
232
|
-
} catch
|
|
232
|
+
} catch {
|
|
233
233
|
console.warn(" ⚠️ File watching not available");
|
|
234
234
|
}
|
|
235
235
|
}
|