@danielgl/steampunk 0.0.3 → 0.0.4
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/dist/main.cjs +1 -1
- package/dist/main.d.cts +8 -1
- package/dist/main.d.ts +8 -1
- package/dist/main.js +1 -1
- package/package.json +1 -1
package/dist/main.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var D=Object.defineProperty;var he=Object.getOwnPropertyDescriptor;var me=Object.getOwnPropertyNames;var ye=Object.prototype.hasOwnProperty;var a=(t,e)=>D(t,"name",{value:e,configurable:!0});var R=(t,e)=>()=>(t&&(e=t(t=0)),e);var J=(t,e)=>{for(var n in e)D(t,n,{get:e[n],enumerable:!0})},ge=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of me(e))!ye.call(t,s)&&s!==n&&D(t,s,{get:()=>e[s],enumerable:!(r=he(e,s))||r.enumerable});return t};var k=t=>ge(D({},"__esModule",{value:!0}),t);function T(){return t=>{Reflect.defineMetadata(we,!0,t)}}function G(t){return(e,n,r)=>{let s=Reflect.getMetadata(H,e)||[];s.push({index:r,token:t}),Reflect.defineMetadata(H,s,e)}}var Ee,we,H,b=R(()=>{"use strict";Ee=require("reflect-metadata"),we=Symbol("INJECTABLE_WATERMARK"),H=Symbol("INJECT_METADATA");a(T,"Injectable");a(G,"Inject")});function X(t){return(e,n)=>{let r={required:!0,roles:t};n!==void 0?Reflect.defineMetadata(O,r,e.constructor,n):Reflect.defineMetadata(O,r,e)}}var $e,O,L=R(()=>{"use strict";$e=require("reflect-metadata"),O=Symbol("AUTHORIZE_METADATA");a(X,"Authorize")});var g,q=R(()=>{"use strict";g=class t{static{a(this,"HttpResult")}status;body;headers;constructor(e,n,r={}){this.status=e,this.body=n!==void 0&&typeof n!="string"?JSON.stringify(n):n,this.headers=r}static ok(e){return new t(200,e)}static created(e,n){let r={};return n&&(r.Location=n),new t(201,e,r)}static noContent(){return new t(204)}static badRequest(e="Bad Request",n){let r=typeof e=="string"?{message:e,errors:n}:e;return new t(400,r)}static unauthorized(e="Unauthorized"){let n=typeof e=="string"?{message:e}:e;return new t(401,n)}static forbidden(e="Forbidden"){let n=typeof e=="string"?{message:e}:e;return new t(403,n)}static notFound(e="Not Found"){let n=typeof e=="string"?{message:e}:e;return new t(404,n)}static conflict(e="Conflict"){let n=typeof e=="string"?{message:e}:e;return new t(409,n)}static unprocessableEntity(e="Unprocessable Entity",n){let r=typeof e=="string"?{message:e,errors:n}:e;return new t(422,r)}static internalServerError(e="Internal Server Error"){let n=typeof e=="string"?{message:e}:e;return new t(500,n)}toResponse(){if(this.status===204||this.body===void 0)return new Response(null,{status:this.status,headers:this.headers});let e={"Content-Type":"application/json",...this.headers};return new Response(this.body,{status:this.status,headers:e})}}});function Q(t=""){return e=>{Reflect.defineMetadata(U,t,e),T()(e)}}function ne(t,e){return(n,r,s)=>{$(n,r,{type:0,index:s,name:t,schema:e})}}function re(t,e){return(n,r,s)=>{$(n,r,{type:1,index:s,name:t,schema:e})}}function se(t){return(e,n,r)=>{$(e,n,{type:2,index:r,schema:t})}}function $(t,e,n){let r=`${B.toString()}_${e.toString()}`;Reflect.hasMetadata(r,t.constructor)||Reflect.defineMetadata(r,[],t.constructor);let s=Reflect.getMetadata(r,t.constructor);s.push(n),Reflect.defineMetadata(r,s,t.constructor)}var ze,U,C,B,j,Z,V,Y,ee,te,w,F=R(()=>{"use strict";ze=require("reflect-metadata");b();U=Symbol("CONTROLLER_WATERMARK"),C=Symbol("ROUTE_METADATA"),B=Symbol("PARAM_METADATA");a(Q,"Controller");j=a(t=>(e="")=>(n,r)=>{Reflect.hasMetadata(C,n.constructor)||Reflect.defineMetadata(C,[],n.constructor);let s=Reflect.getMetadata(C,n.constructor);s.push({method:t,path:e,methodName:r.toString()}),Reflect.defineMetadata(C,s,n.constructor)},"createRouteDecorator"),Z=j("GET"),V=j("POST"),Y=j("PUT"),ee=j("DELETE"),te=j("PATCH"),w=(function(t){return t[t.Route=0]="Route",t[t.Query=1]="Query",t[t.Body=2]="Body",t[t.Context=3]="Context",t})({});a(ne,"FromRoute");a(re,"FromQuery");a(se,"FromBody");a($,"addParamMetadata")});var ae={};J(ae,{JwtAuthService:()=>A});function Ae(t,e,n,r){var s=arguments.length,o=s<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,n):r,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(t,e,n,r);else for(var c=t.length-1;c>=0;c--)(i=t[c])&&(o=(s<3?i(o):s>3?i(e,n,o):i(e,n))||o);return s>3&&o&&Object.defineProperty(e,n,o),o}function oe(t,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(t,e)}function W(t){return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function ie(t){let e=t+"==".slice(2-t.length*3&3);return atob(e.replace(/-/g,"+").replace(/_/g,"/"))}var A,_=R(()=>{"use strict";b();a(Ae,"_ts_decorate");a(oe,"_ts_metadata");a(W,"base64UrlEncode");a(ie,"base64UrlDecode");A=class{static{a(this,"JwtAuthService")}secret;expiresIn;constructor(e){this.secret=e.secret,this.expiresIn=e.expiresIn??3600}async getKey(){let e=new TextEncoder;return crypto.subtle.importKey("raw",e.encode(this.secret),{name:"HMAC",hash:"SHA-256"},!1,["sign","verify"])}async sign(e){let n={alg:"HS256",typ:"JWT"},r=Math.floor(Date.now()/1e3),s={...e,iat:r,exp:r+this.expiresIn},o=W(JSON.stringify(n)),i=W(JSON.stringify(s)),c=`${o}.${i}`,l=await this.getKey(),u=new TextEncoder,h=await crypto.subtle.sign("HMAC",l,u.encode(c)),f=W(String.fromCharCode(...new Uint8Array(h)));return`${c}.${f}`}async verify(e){let n=e.split(".");if(n.length!==3)throw new Error("Invalid JWT format");let r=n[0],s=n[1],o=n[2],i=`${r}.${s}`,c=await this.getKey(),l=new TextEncoder,u=Uint8Array.from(ie(o),N=>N.charCodeAt(0));if(!await crypto.subtle.verify("HMAC",c,u,l.encode(i)))throw new Error("Invalid JWT signature");let f=JSON.parse(ie(s)),I=Math.floor(Date.now()/1e3);if(f.exp!==void 0&&f.exp<I)throw new Error("JWT expired");return f}};A=Ae([T(),oe("design:type",Function),oe("design:paramtypes",[typeof JwtOptions>"u"?Object:JwtOptions])],A)});var ce={};J(ce,{Router:()=>K});async function Re(t,e,n){if(!n.required)return null;let r=t.request.headers.get("authorization");if(!r||!r.startsWith("Bearer "))return new Response(JSON.stringify({message:"Unauthorized"}),{status:401,headers:{"Content-Type":"application/json"}});let s=r.slice(7),o;try{let{JwtAuthService:c}=(_(),k(ae));o=await e.resolve(c)}catch{return new Response(JSON.stringify({message:"JWT service not configured"}),{status:500,headers:{"Content-Type":"application/json"}})}let i;try{i=await o.verify(s)}catch{return new Response(JSON.stringify({message:"Unauthorized: invalid or expired token"}),{status:401,headers:{"Content-Type":"application/json"}})}if(n.roles&&n.roles.length>0){let c=i.roles??[];if(!n.roles.some(u=>c.includes(u)))return new Response(JSON.stringify({message:"Forbidden: insufficient permissions"}),{status:403,headers:{"Content-Type":"application/json"}})}return t.items.set("user",i),null}var K,le=R(()=>{"use strict";L();q();F();a(Re,"checkAuth");K=class{static{a(this,"Router")}routes=[];registerControllers(e){for(let n of e){let r=Reflect.getMetadata(U,n);if(r===void 0)continue;let s=Reflect.getMetadata(C,n)||[];for(let o of s){let i=`/${r}/${o.path}`.replace(/\/+/g,"/");i!=="/"&&i.endsWith("/")&&(i=i.slice(0,-1));let c=new URLPattern({pathname:i});this.routes.push({method:o.method,pattern:c,controller:n,methodName:o.methodName})}}}middleware(){return async(e,n)=>{for(let r of this.routes){if(r.method!==e.method)continue;let s=r.pattern.exec({pathname:e.path});if(s){let o=e.items.get("scope");if(!o)throw new Error("DI Scope not found in HttpContext");let i=Reflect.getMetadata(O,r.controller,r.methodName),c=Reflect.getMetadata(O,r.controller),l=i??c;if(l){let d=await Re(e,o,l);if(d)return d}let u=await o.resolve(r.controller),h=`${B.toString()}_${r.methodName}`,f=Reflect.getMetadata(h,r.controller)||[],I=u[r.methodName].length,N=new Array(I).fill(void 0),fe=f.some(d=>d.type===w.Body),z;fe&&(z=await e.request.json().catch(()=>({})));let pe=new URL(e.request.url);for(let d of f){let y;if(d.type===w.Route&&d.name?y=s.pathname.groups[d.name]:d.type===w.Query&&d.name?y=pe.searchParams.get(d.name):d.type===w.Body?y=z:d.type===w.Context&&(y=e),d.schema){let P=d.schema.safeParse(y);if(!P.success)return g.unprocessableEntity("Validation failed",{errors:P.error.errors,target:w[d.type].toLowerCase(),name:d.name}).toResponse();y=P.data}N[d.index]=y}let m=await u[r.methodName](...N);return m instanceof Response?m:m instanceof g?m.toResponse():typeof m=="object"?Response.json(m):new Response(String(m))}}return n()}}}});var Te={};J(Te,{Authorize:()=>X,Controller:()=>Q,Delete:()=>ee,FromBody:()=>se,FromQuery:()=>re,FromRoute:()=>ne,Get:()=>Z,HttpContext:()=>M,HttpResult:()=>g,Inject:()=>G,Injectable:()=>T,JwtAuthService:()=>A,Patch:()=>te,Post:()=>V,Put:()=>Y,ServiceCollection:()=>E,ServiceProvider:()=>x,WebApplication:()=>v,WebApplicationBuilder:()=>S,cors:()=>de,throttle:()=>ue});module.exports=k(Te);var Ce=require("reflect-metadata");b();var p=(function(t){return t[t.Singleton=0]="Singleton",t[t.Transient=1]="Transient",t[t.Scoped=2]="Scoped",t})({});var x=class t{static{a(this,"ServiceProvider")}descriptors;parent;singletonInstances=new Map;scopedInstances=new Map;trackedInstances=new Set;constructor(e,n){this.descriptors=e,this.parent=n}createScope(){return new t(this.descriptors,this.parent||this)}async dispose(){for(let e of this.trackedInstances)typeof e.onDestroy=="function"&&await e.onDestroy();this.trackedInstances.clear(),this.scopedInstances.clear(),this.singletonInstances.clear()}async resolve(e){let n=this.descriptors.find(r=>r.token===e);if(!n){if(this.parent)return this.parent.resolve(e);throw new Error(`Service not registered for token: ${e.toString()}`)}switch(n.lifetime){case p.Singleton:return this.resolveSingleton(n);case p.Scoped:return this.resolveScoped(n);case p.Transient:return this.resolveTransient(n)}}async resolveSingleton(e){let n=this.parent||this;if(n.singletonInstances.has(e.token))return n.singletonInstances.get(e.token);let r=await this.createInstance(n,e);return n.singletonInstances.set(e.token,r),r}async resolveScoped(e){if(this.scopedInstances.has(e.token))return this.scopedInstances.get(e.token);let n=await this.createInstance(this,e);return this.scopedInstances.set(e.token,n),n}async resolveTransient(e){return this.createInstance(this,e)}async createInstance(e,n){if(n.implementationInstance!==void 0)return n.implementationInstance;let r;if(n.implementationFactory)r=await n.implementationFactory(this);else if(n.implementationType)r=await this.instantiateClass(n.implementationType);else throw new Error(`Invalid service descriptor for token: ${n.token.toString()}`);return typeof r.onInit=="function"&&await r.onInit(),typeof r.onDestroy=="function"&&n.lifetime!==p.Transient&&e.trackedInstances.add(r),r}async instantiateClass(e){let n=Reflect.getMetadata("design:paramtypes",e)||[],r=Reflect.getMetadata(H,e)||[],s=await Promise.all(n.map(async(o,i)=>{let c=r.find(u=>u.index===i),l=c?c.token:o;if(!l||l===Object||l===String||l===Number||l===Boolean)throw new Error(`Cannot resolve parameter at index ${i} for ${e.name}. Token could not be determined or is primitive. Cannot inject primitive types directly without @Inject().`);return this.resolve(l)}));return new e(...s)}};var E=class{static{a(this,"ServiceCollection")}descriptors=[];add(e){return this.descriptors.push(e),this}addSingleton(e,n){return this.add({token:e,implementationType:n||e,lifetime:p.Singleton})}addSingletonInstance(e,n){return this.add({token:e,implementationInstance:n,lifetime:p.Singleton})}addTransient(e,n){return this.add({token:e,implementationType:n||e,lifetime:p.Transient})}addScoped(e,n){return this.add({token:e,implementationType:n||e,lifetime:p.Scoped})}buildServiceProvider(){return new x(this.descriptors)}addControllers(e){return e.forEach(n=>this.addTransient(n)),this}};var M=class{static{a(this,"HttpContext")}request;items=new Map;constructor(e){this.request=e}get method(){return this.request.method}get url(){return this.request.url}get path(){return new URL(this.request.url).pathname}};var S=class{static{a(this,"WebApplicationBuilder")}services;constructor(){this.services=new E}build(){let e=this.services.buildServiceProvider();return new v(e)}};var v=class{static{a(this,"WebApplication")}services;middlewares=[];controllersToMap=[];constructor(e){this.services=e}static createBuilder(){return new S}use(e){return this.middlewares.push(e),this}mapControllers(e){return this.controllersToMap.push(...e),this}async executePipeline(e){let n=-1,r=a(async o=>{if(o<=n)throw new Error("next() called multiple times");n=o;let i=this.middlewares[o];if(o===this.middlewares.length)return new Response(JSON.stringify({message:"Not found"}),{status:404});if(i)return i(e,r.bind(null,o+1))},"dispatch");return await r(0)||new Response(JSON.stringify({message:"Internal Server Error"}),{status:500})}run(e=3e3){let n=this;if(this.controllersToMap.length>0){let{Router:r}=(le(),k(ce)),s=new r;s.registerControllers(this.controllersToMap),this.use(s.middleware())}Bun.serve({port:e,async fetch(r){let s=n.services.createScope();try{let o=new M(r);return o.items.set("scope",s),await n.executePipeline(o)}finally{await s.dispose()}}}),console.log(`\u{1F680} Steampunk application is running on http://localhost:${e}`)}};q();b();F();L();_();function de(t={}){return async(e,n)=>{let{request:r}=e,s=r.headers.get("origin"),o=await n();o||(o=new Response);let i=new Response(o.body,o);if(t.origin?typeof t.origin=="string"?i.headers.set("Access-Control-Allow-Origin",t.origin):Array.isArray(t.origin)&&s?t.origin.includes(s)&&i.headers.set("Access-Control-Allow-Origin",s):typeof t.origin=="function"&&s&&t.origin(s)&&i.headers.set("Access-Control-Allow-Origin",s):i.headers.set("Access-Control-Allow-Origin","*"),t.methods){let c=Array.isArray(t.methods)?t.methods.join(", "):t.methods;i.headers.set("Access-Control-Allow-Methods",c)}else i.headers.set("Access-Control-Allow-Methods","GET,HEAD,PUT,PATCH,POST,DELETE");if(t.allowedHeaders){let c=Array.isArray(t.allowedHeaders)?t.allowedHeaders.join(", "):t.allowedHeaders;i.headers.set("Access-Control-Allow-Headers",c)}else{let c=r.headers.get("access-control-request-headers");c&&i.headers.set("Access-Control-Allow-Headers",c)}if(t.exposedHeaders){let c=Array.isArray(t.exposedHeaders)?t.exposedHeaders.join(", "):t.exposedHeaders;i.headers.set("Access-Control-Expose-Headers",c)}return t.credentials&&i.headers.set("Access-Control-Allow-Credentials","true"),t.maxAge!==void 0&&i.headers.set("Access-Control-Max-Age",t.maxAge.toString()),r.method==="OPTIONS"?new Response(null,{headers:i.headers,status:204}):i}}a(de,"cors");function ue(t){let e=a(s=>{let o=s.request?.headers?.get("x-forwarded-for");return o?o.split(",")[0].trim():"global"},"defaultKeyGenerator"),n=t.keyGenerator||e,r=new Map;return async(s,o)=>{let i=n(s),c=Date.now(),l=r.get(i);if(l?c>l.resetTime?(l.count=1,l.resetTime=c+t.windowMs):l.count++:(l={count:1,resetTime:c+t.windowMs},r.set(i,l)),Math.random()<.05)for(let[f,I]of r.entries())Date.now()>I.resetTime&&r.delete(f);if(l.count>t.limit){let f=Math.ceil((l.resetTime-c)/1e3);return new Response("Too Many Requests",{status:429,headers:{"Retry-After":f.toString(),"X-RateLimit-Limit":t.limit.toString(),"X-RateLimit-Remaining":"0","X-RateLimit-Reset":Math.ceil(l.resetTime/1e3).toString()}})}let u=await o();u||(u=new Response);let h=new Response(u.body,u);return h.headers.set("X-RateLimit-Limit",t.limit.toString()),h.headers.set("X-RateLimit-Remaining",Math.max(0,t.limit-l.count).toString()),h.headers.set("X-RateLimit-Reset",Math.ceil(l.resetTime/1e3).toString()),h}}a(ue,"throttle");0&&(module.exports={Authorize,Controller,Delete,FromBody,FromQuery,FromRoute,Get,HttpContext,HttpResult,Inject,Injectable,JwtAuthService,Patch,Post,Put,ServiceCollection,ServiceProvider,WebApplication,WebApplicationBuilder,cors,throttle});
|
|
1
|
+
"use strict";var D=Object.defineProperty;var he=Object.getOwnPropertyDescriptor;var me=Object.getOwnPropertyNames;var ye=Object.prototype.hasOwnProperty;var a=(t,e)=>D(t,"name",{value:e,configurable:!0});var R=(t,e)=>()=>(t&&(e=t(t=0)),e);var k=(t,e)=>{for(var n in e)D(t,n,{get:e[n],enumerable:!0})},ge=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of me(e))!ye.call(t,s)&&s!==n&&D(t,s,{get:()=>e[s],enumerable:!(r=he(e,s))||r.enumerable});return t};var J=t=>ge(D({},"__esModule",{value:!0}),t);function T(){return t=>{Reflect.defineMetadata(we,!0,t)}}function G(t){return(e,n,r)=>{let s=Reflect.getMetadata(H,e)||[];s.push({index:r,token:t}),Reflect.defineMetadata(H,s,e)}}var Ee,we,H,I=R(()=>{"use strict";Ee=require("reflect-metadata"),we=Symbol("INJECTABLE_WATERMARK"),H=Symbol("INJECT_METADATA");a(T,"Injectable");a(G,"Inject")});function X(t){return(e,n)=>{let r={required:!0,roles:t};n!==void 0?Reflect.defineMetadata(O,r,e.constructor,n):Reflect.defineMetadata(O,r,e)}}var $e,O,L=R(()=>{"use strict";$e=require("reflect-metadata"),O=Symbol("AUTHORIZE_METADATA");a(X,"Authorize")});var g,q=R(()=>{"use strict";g=class t{static{a(this,"HttpResult")}status;body;headers;constructor(e,n,r={}){this.status=e,this.body=n!==void 0&&typeof n!="string"?JSON.stringify(n):n,this.headers=r}static ok(e){return new t(200,e)}static created(e,n){let r={};return n&&(r.Location=n),new t(201,e,r)}static noContent(){return new t(204)}static badRequest(e="Bad Request",n){let r=typeof e=="string"?{message:e,errors:n}:e;return new t(400,r)}static unauthorized(e="Unauthorized"){let n=typeof e=="string"?{message:e}:e;return new t(401,n)}static forbidden(e="Forbidden"){let n=typeof e=="string"?{message:e}:e;return new t(403,n)}static notFound(e="Not Found"){let n=typeof e=="string"?{message:e}:e;return new t(404,n)}static conflict(e="Conflict"){let n=typeof e=="string"?{message:e}:e;return new t(409,n)}static unprocessableEntity(e="Unprocessable Entity",n){let r=typeof e=="string"?{message:e,errors:n}:e;return new t(422,r)}static internalServerError(e="Internal Server Error"){let n=typeof e=="string"?{message:e}:e;return new t(500,n)}toResponse(){if(this.status===204||this.body===void 0)return new Response(null,{status:this.status,headers:this.headers});let e={"Content-Type":"application/json",...this.headers};return new Response(this.body,{status:this.status,headers:e})}}});function Q(t=""){return e=>{Reflect.defineMetadata(U,t,e),T()(e)}}function ne(t,e){return(n,r,s)=>{$(n,r,{type:0,index:s,name:t,schema:e})}}function re(t,e){return(n,r,s)=>{$(n,r,{type:1,index:s,name:t,schema:e})}}function se(t){return(e,n,r)=>{$(e,n,{type:2,index:r,schema:t})}}function $(t,e,n){let r=`${B.toString()}_${e.toString()}`;Reflect.hasMetadata(r,t.constructor)||Reflect.defineMetadata(r,[],t.constructor);let s=Reflect.getMetadata(r,t.constructor);s.push(n),Reflect.defineMetadata(r,s,t.constructor)}var ze,U,b,B,j,Z,V,Y,ee,te,w,W=R(()=>{"use strict";ze=require("reflect-metadata");I();U=Symbol("CONTROLLER_WATERMARK"),b=Symbol("ROUTE_METADATA"),B=Symbol("PARAM_METADATA");a(Q,"Controller");j=a(t=>(e="")=>(n,r)=>{Reflect.hasMetadata(b,n.constructor)||Reflect.defineMetadata(b,[],n.constructor);let s=Reflect.getMetadata(b,n.constructor);s.push({method:t,path:e,methodName:r.toString()}),Reflect.defineMetadata(b,s,n.constructor)},"createRouteDecorator"),Z=j("GET"),V=j("POST"),Y=j("PUT"),ee=j("DELETE"),te=j("PATCH"),w=(function(t){return t[t.Route=0]="Route",t[t.Query=1]="Query",t[t.Body=2]="Body",t[t.Context=3]="Context",t})({});a(ne,"FromRoute");a(re,"FromQuery");a(se,"FromBody");a($,"addParamMetadata")});var ae={};k(ae,{JwtAuthService:()=>A});function Ae(t,e,n,r){var s=arguments.length,o=s<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,n):r,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(t,e,n,r);else for(var c=t.length-1;c>=0;c--)(i=t[c])&&(o=(s<3?i(o):s>3?i(e,n,o):i(e,n))||o);return s>3&&o&&Object.defineProperty(e,n,o),o}function oe(t,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(t,e)}function F(t){return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function ie(t){let e=t+"==".slice(2-t.length*3&3);return atob(e.replace(/-/g,"+").replace(/_/g,"/"))}var A,_=R(()=>{"use strict";I();a(Ae,"_ts_decorate");a(oe,"_ts_metadata");a(F,"base64UrlEncode");a(ie,"base64UrlDecode");A=class{static{a(this,"JwtAuthService")}secret;expiresIn;constructor(e){this.secret=e.secret,this.expiresIn=e.expiresIn??3600}async getKey(){let e=new TextEncoder;return crypto.subtle.importKey("raw",e.encode(this.secret),{name:"HMAC",hash:"SHA-256"},!1,["sign","verify"])}async sign(e){let n={alg:"HS256",typ:"JWT"},r=Math.floor(Date.now()/1e3),s={...e,iat:r,exp:r+this.expiresIn},o=F(JSON.stringify(n)),i=F(JSON.stringify(s)),c=`${o}.${i}`,l=await this.getKey(),u=new TextEncoder,h=await crypto.subtle.sign("HMAC",l,u.encode(c)),f=F(String.fromCharCode(...new Uint8Array(h)));return`${c}.${f}`}async verify(e){let n=e.split(".");if(n.length!==3)throw new Error("Invalid JWT format");let r=n[0],s=n[1],o=n[2],i=`${r}.${s}`,c=await this.getKey(),l=new TextEncoder,u=Uint8Array.from(ie(o),N=>N.charCodeAt(0));if(!await crypto.subtle.verify("HMAC",c,u,l.encode(i)))throw new Error("Invalid JWT signature");let f=JSON.parse(ie(s)),C=Math.floor(Date.now()/1e3);if(f.exp!==void 0&&f.exp<C)throw new Error("JWT expired");return f}};A=Ae([T(),oe("design:type",Function),oe("design:paramtypes",[typeof JwtOptions>"u"?Object:JwtOptions])],A)});var ce={};k(ce,{Router:()=>K});async function Re(t,e,n){if(!n.required)return null;let r=t.request.headers.get("authorization");if(!r||!r.startsWith("Bearer "))return new Response(JSON.stringify({message:"Unauthorized"}),{status:401,headers:{"Content-Type":"application/json"}});let s=r.slice(7),o;try{let{JwtAuthService:c}=(_(),J(ae));o=await e.resolve(c)}catch{return new Response(JSON.stringify({message:"JWT service not configured"}),{status:500,headers:{"Content-Type":"application/json"}})}let i;try{i=await o.verify(s)}catch{return new Response(JSON.stringify({message:"Unauthorized: invalid or expired token"}),{status:401,headers:{"Content-Type":"application/json"}})}if(n.roles&&n.roles.length>0){let c=i.roles??[];if(!n.roles.some(u=>c.includes(u)))return new Response(JSON.stringify({message:"Forbidden: insufficient permissions"}),{status:403,headers:{"Content-Type":"application/json"}})}return t.items.set("user",i),null}var K,le=R(()=>{"use strict";L();q();W();a(Re,"checkAuth");K=class{static{a(this,"Router")}routes=[];registerControllers(e){for(let n of e){let r=Reflect.getMetadata(U,n);if(r===void 0)continue;let s=Reflect.getMetadata(b,n)||[];for(let o of s){let i=`/${r}/${o.path}`.replace(/\/+/g,"/");i!=="/"&&i.endsWith("/")&&(i=i.slice(0,-1));let c=new URLPattern({pathname:i});this.routes.push({method:o.method,pattern:c,controller:n,methodName:o.methodName})}}}middleware(){return async(e,n)=>{for(let r of this.routes){if(r.method!==e.method)continue;let s=r.pattern.exec({pathname:e.path});if(s){let o=e.items.get("scope");if(!o)throw new Error("DI Scope not found in HttpContext");let i=Reflect.getMetadata(O,r.controller,r.methodName),c=Reflect.getMetadata(O,r.controller),l=i??c;if(l){let d=await Re(e,o,l);if(d)return d}let u=await o.resolve(r.controller),h=`${B.toString()}_${r.methodName}`,f=Reflect.getMetadata(h,r.controller)||[],C=u[r.methodName].length,N=new Array(C).fill(void 0),fe=f.some(d=>d.type===w.Body),z;fe&&(z=await e.request.json().catch(()=>({})));let pe=new URL(e.request.url);for(let d of f){let y;if(d.type===w.Route&&d.name?y=s.pathname.groups[d.name]:d.type===w.Query&&d.name?y=pe.searchParams.get(d.name):d.type===w.Body?y=z:d.type===w.Context&&(y=e),d.schema){let P=d.schema.safeParse(y);if(!P.success)return g.unprocessableEntity("Validation failed",{errors:P.error.errors,target:w[d.type].toLowerCase(),name:d.name}).toResponse();y=P.data}N[d.index]=y}let m=await u[r.methodName](...N);return m instanceof Response?m:m instanceof g?m.toResponse():typeof m=="object"?Response.json(m):new Response(String(m))}}return n()}}}});var Te={};k(Te,{Authorize:()=>X,Controller:()=>Q,Delete:()=>ee,FromBody:()=>se,FromQuery:()=>re,FromRoute:()=>ne,Get:()=>Z,HttpContext:()=>M,HttpResult:()=>g,Inject:()=>G,Injectable:()=>T,JwtAuthService:()=>A,Patch:()=>te,Post:()=>V,Put:()=>Y,ServiceCollection:()=>E,ServiceProvider:()=>x,WebApplication:()=>v,WebApplicationBuilder:()=>S,cors:()=>de,throttle:()=>ue});module.exports=J(Te);var be=require("reflect-metadata");I();var p=(function(t){return t[t.Singleton=0]="Singleton",t[t.Transient=1]="Transient",t[t.Scoped=2]="Scoped",t})({});var x=class t{static{a(this,"ServiceProvider")}descriptors;parent;singletonInstances=new Map;scopedInstances=new Map;trackedInstances=new Set;constructor(e,n){this.descriptors=e,this.parent=n}createScope(){return new t(this.descriptors,this.parent||this)}async dispose(){for(let e of this.trackedInstances)typeof e.onDestroy=="function"&&await e.onDestroy();this.trackedInstances.clear(),this.scopedInstances.clear(),this.singletonInstances.clear()}async resolve(e){let n=this.descriptors.find(r=>r.token===e);if(!n){if(this.parent)return this.parent.resolve(e);throw new Error(`Service not registered for token: ${e.toString()}`)}switch(n.lifetime){case p.Singleton:return this.resolveSingleton(n);case p.Scoped:return this.resolveScoped(n);case p.Transient:return this.resolveTransient(n)}}async resolveSingleton(e){let n=this.getRoot();if(n.singletonInstances.has(e.token))return n.singletonInstances.get(e.token);let r=await this.createInstance(n,e);return n.singletonInstances.set(e.token,r),r}async resolveScoped(e){if(this.scopedInstances.has(e.token))return this.scopedInstances.get(e.token);let n=await this.createInstance(this,e);return this.scopedInstances.set(e.token,n),n}async resolveTransient(e){return this.createInstance(this,e)}async createInstance(e,n){let r;if(n.implementationInstance!==void 0)r=n.implementationInstance;else if(n.implementationFactory)r=await n.implementationFactory(this);else if(n.implementationType)r=await this.instantiateClass(n.implementationType);else throw new Error(`Invalid service descriptor for token: ${n.token.toString()}`);let s=Symbol.for("steampunk:initialized");return typeof r.onInit=="function"&&!r[s]&&(await r.onInit(),r[s]=!0),typeof r.onDestroy=="function"&&n.lifetime!==p.Transient&&e.trackedInstances.add(r),r}getRoot(){return this.parent?this.parent.getRoot():this}async instantiateClass(e){let n=Reflect.getMetadata("design:paramtypes",e)||[],r=Reflect.getMetadata(H,e)||[],s=await Promise.all(n.map(async(o,i)=>{let c=r.find(u=>u.index===i),l=c?c.token:o;if(!l||l===Object||l===String||l===Number||l===Boolean)throw new Error(`Cannot resolve parameter at index ${i} for ${e.name}. Token could not be determined or is primitive. Cannot inject primitive types directly without @Inject().`);return this.resolve(l)}));return new e(...s)}};var E=class{static{a(this,"ServiceCollection")}descriptors=[];add(e){return this.descriptors.push(e),this}addSingleton(e,n){return this.add({token:e,implementationType:n||e,lifetime:p.Singleton})}addSingletonInstance(e,n){return this.add({token:e,implementationInstance:n,lifetime:p.Singleton})}addTransient(e,n){return this.add({token:e,implementationType:n||e,lifetime:p.Transient})}addScoped(e,n){return this.add({token:e,implementationType:n||e,lifetime:p.Scoped})}buildServiceProvider(){return new x(this.descriptors)}addControllers(e){return e.forEach(n=>this.addTransient(n)),this}};var M=class{static{a(this,"HttpContext")}request;items=new Map;constructor(e){this.request=e}get method(){return this.request.method}get url(){return this.request.url}get path(){return new URL(this.request.url).pathname}};var S=class{static{a(this,"WebApplicationBuilder")}services;constructor(){this.services=new E}build(){let e=this.services.buildServiceProvider();return new v(e)}};var v=class{static{a(this,"WebApplication")}services;middlewares=[];controllersToMap=[];constructor(e){this.services=e}static createBuilder(){return new S}use(e){return this.middlewares.push(e),this}mapControllers(e){return this.controllersToMap.push(...e),this}async executePipeline(e){let n=-1,r=a(async o=>{if(o<=n)throw new Error("next() called multiple times");n=o;let i=this.middlewares[o];if(o===this.middlewares.length)return new Response(JSON.stringify({message:"Not found"}),{status:404});if(i)return i(e,r.bind(null,o+1))},"dispatch");return await r(0)||new Response(JSON.stringify({message:"Internal Server Error"}),{status:500})}run(e=3e3){let n=this;if(this.controllersToMap.length>0){let{Router:r}=(le(),J(ce)),s=new r;s.registerControllers(this.controllersToMap),this.use(s.middleware())}Bun.serve({port:e,async fetch(r){let s=n.services.createScope();try{let o=new M(r);return o.items.set("scope",s),await n.executePipeline(o)}finally{await s.dispose()}}}),console.log(`\u{1F680} Steampunk application is running on http://localhost:${e}`)}};q();I();W();L();_();function de(t={}){return async(e,n)=>{let{request:r}=e,s=r.headers.get("origin"),o=await n();o||(o=new Response);let i=new Response(o.body,o);if(t.origin?typeof t.origin=="string"?i.headers.set("Access-Control-Allow-Origin",t.origin):Array.isArray(t.origin)&&s?t.origin.includes(s)&&i.headers.set("Access-Control-Allow-Origin",s):typeof t.origin=="function"&&s&&t.origin(s)&&i.headers.set("Access-Control-Allow-Origin",s):i.headers.set("Access-Control-Allow-Origin","*"),t.methods){let c=Array.isArray(t.methods)?t.methods.join(", "):t.methods;i.headers.set("Access-Control-Allow-Methods",c)}else i.headers.set("Access-Control-Allow-Methods","GET,HEAD,PUT,PATCH,POST,DELETE");if(t.allowedHeaders){let c=Array.isArray(t.allowedHeaders)?t.allowedHeaders.join(", "):t.allowedHeaders;i.headers.set("Access-Control-Allow-Headers",c)}else{let c=r.headers.get("access-control-request-headers");c&&i.headers.set("Access-Control-Allow-Headers",c)}if(t.exposedHeaders){let c=Array.isArray(t.exposedHeaders)?t.exposedHeaders.join(", "):t.exposedHeaders;i.headers.set("Access-Control-Expose-Headers",c)}return t.credentials&&i.headers.set("Access-Control-Allow-Credentials","true"),t.maxAge!==void 0&&i.headers.set("Access-Control-Max-Age",t.maxAge.toString()),r.method==="OPTIONS"?new Response(null,{headers:i.headers,status:204}):i}}a(de,"cors");function ue(t){let e=a(s=>{let o=s.request?.headers?.get("x-forwarded-for");return o?o.split(",")[0].trim():"global"},"defaultKeyGenerator"),n=t.keyGenerator||e,r=new Map;return async(s,o)=>{let i=n(s),c=Date.now(),l=r.get(i);if(l?c>l.resetTime?(l.count=1,l.resetTime=c+t.windowMs):l.count++:(l={count:1,resetTime:c+t.windowMs},r.set(i,l)),Math.random()<.05)for(let[f,C]of r.entries())Date.now()>C.resetTime&&r.delete(f);if(l.count>t.limit){let f=Math.ceil((l.resetTime-c)/1e3);return new Response("Too Many Requests",{status:429,headers:{"Retry-After":f.toString(),"X-RateLimit-Limit":t.limit.toString(),"X-RateLimit-Remaining":"0","X-RateLimit-Reset":Math.ceil(l.resetTime/1e3).toString()}})}let u=await o();u||(u=new Response);let h=new Response(u.body,u);return h.headers.set("X-RateLimit-Limit",t.limit.toString()),h.headers.set("X-RateLimit-Remaining",Math.max(0,t.limit-l.count).toString()),h.headers.set("X-RateLimit-Reset",Math.ceil(l.resetTime/1e3).toString()),h}}a(ue,"throttle");0&&(module.exports={Authorize,Controller,Delete,FromBody,FromQuery,FromRoute,Get,HttpContext,HttpResult,Inject,Injectable,JwtAuthService,Patch,Post,Put,ServiceCollection,ServiceProvider,WebApplication,WebApplicationBuilder,cors,throttle});
|
package/dist/main.d.cts
CHANGED
|
@@ -12,6 +12,12 @@ interface ServiceDescriptor<T = any> {
|
|
|
12
12
|
implementationInstance?: T;
|
|
13
13
|
implementationFactory?: (provider: any) => T | Promise<T>;
|
|
14
14
|
}
|
|
15
|
+
interface OnInit {
|
|
16
|
+
onInit(): void | Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
interface OnDestroy {
|
|
19
|
+
onDestroy(): void | Promise<void>;
|
|
20
|
+
}
|
|
15
21
|
|
|
16
22
|
declare class ServiceProvider {
|
|
17
23
|
private descriptors;
|
|
@@ -27,6 +33,7 @@ declare class ServiceProvider {
|
|
|
27
33
|
private resolveScoped;
|
|
28
34
|
private resolveTransient;
|
|
29
35
|
private createInstance;
|
|
36
|
+
private getRoot;
|
|
30
37
|
private instantiateClass;
|
|
31
38
|
}
|
|
32
39
|
|
|
@@ -161,4 +168,4 @@ interface ThrottleOptions {
|
|
|
161
168
|
}
|
|
162
169
|
declare function throttle(options: ThrottleOptions): Middleware;
|
|
163
170
|
|
|
164
|
-
export { Authorize, type AuthorizeOptions, Controller, type CorsOptions, Delete, FromBody, FromQuery, FromRoute, Get, HttpContext, HttpResult, Inject, Injectable, JwtAuthService, type JwtOptions, type JwtPayload, Patch, Post, Put, ServiceCollection, ServiceProvider, type ThrottleOptions, WebApplication, WebApplicationBuilder, cors, throttle };
|
|
171
|
+
export { Authorize, type AuthorizeOptions, Controller, type CorsOptions, Delete, FromBody, FromQuery, FromRoute, Get, HttpContext, HttpResult, Inject, Injectable, JwtAuthService, type JwtOptions, type JwtPayload, type OnDestroy, type OnInit, Patch, Post, Put, ServiceCollection, ServiceProvider, type ThrottleOptions, WebApplication, WebApplicationBuilder, cors, throttle };
|
package/dist/main.d.ts
CHANGED
|
@@ -12,6 +12,12 @@ interface ServiceDescriptor<T = any> {
|
|
|
12
12
|
implementationInstance?: T;
|
|
13
13
|
implementationFactory?: (provider: any) => T | Promise<T>;
|
|
14
14
|
}
|
|
15
|
+
interface OnInit {
|
|
16
|
+
onInit(): void | Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
interface OnDestroy {
|
|
19
|
+
onDestroy(): void | Promise<void>;
|
|
20
|
+
}
|
|
15
21
|
|
|
16
22
|
declare class ServiceProvider {
|
|
17
23
|
private descriptors;
|
|
@@ -27,6 +33,7 @@ declare class ServiceProvider {
|
|
|
27
33
|
private resolveScoped;
|
|
28
34
|
private resolveTransient;
|
|
29
35
|
private createInstance;
|
|
36
|
+
private getRoot;
|
|
30
37
|
private instantiateClass;
|
|
31
38
|
}
|
|
32
39
|
|
|
@@ -161,4 +168,4 @@ interface ThrottleOptions {
|
|
|
161
168
|
}
|
|
162
169
|
declare function throttle(options: ThrottleOptions): Middleware;
|
|
163
170
|
|
|
164
|
-
export { Authorize, type AuthorizeOptions, Controller, type CorsOptions, Delete, FromBody, FromQuery, FromRoute, Get, HttpContext, HttpResult, Inject, Injectable, JwtAuthService, type JwtOptions, type JwtPayload, Patch, Post, Put, ServiceCollection, ServiceProvider, type ThrottleOptions, WebApplication, WebApplicationBuilder, cors, throttle };
|
|
171
|
+
export { Authorize, type AuthorizeOptions, Controller, type CorsOptions, Delete, FromBody, FromQuery, FromRoute, Get, HttpContext, HttpResult, Inject, Injectable, JwtAuthService, type JwtOptions, type JwtPayload, type OnDestroy, type OnInit, Patch, Post, Put, ServiceCollection, ServiceProvider, type ThrottleOptions, WebApplication, WebApplicationBuilder, cors, throttle };
|
package/dist/main.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var D=Object.defineProperty;var te=Object.getOwnPropertyDescriptor;var ne=Object.getOwnPropertyNames;var re=Object.prototype.hasOwnProperty;var a=(t,e)=>D(t,"name",{value:e,configurable:!0});var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var K=(t,e)=>{for(var n in e)D(t,n,{get:e[n],enumerable:!0})},se=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ne(e))!re.call(t,s)&&s!==n&&D(t,s,{get:()=>e[s],enumerable:!(r=te(e,s))||r.enumerable});return t};var z=t=>se(D({},"__esModule",{value:!0}),t);import"reflect-metadata";function E(){return t=>{Reflect.defineMetadata(oe,!0,t)}}function ie(t){return(e,n,r)=>{let s=Reflect.getMetadata(H,e)||[];s.push({index:r,token:t}),Reflect.defineMetadata(H,s,e)}}var oe,H,M=w(()=>{"use strict";oe=Symbol("INJECTABLE_WATERMARK"),H=Symbol("INJECT_METADATA");a(E,"Injectable");a(ie,"Inject")});import"reflect-metadata";function ae(t){return(e,n)=>{let r={required:!0,roles:t};n!==void 0?Reflect.defineMetadata(O,r,e.constructor,n):Reflect.defineMetadata(O,r,e)}}var O,J=w(()=>{"use strict";O=Symbol("AUTHORIZE_METADATA");a(ae,"Authorize")});var A,k=w(()=>{"use strict";A=class t{static{a(this,"HttpResult")}status;body;headers;constructor(e,n,r={}){this.status=e,this.body=n!==void 0&&typeof n!="string"?JSON.stringify(n):n,this.headers=r}static ok(e){return new t(200,e)}static created(e,n){let r={};return n&&(r.Location=n),new t(201,e,r)}static noContent(){return new t(204)}static badRequest(e="Bad Request",n){let r=typeof e=="string"?{message:e,errors:n}:e;return new t(400,r)}static unauthorized(e="Unauthorized"){let n=typeof e=="string"?{message:e}:e;return new t(401,n)}static forbidden(e="Forbidden"){let n=typeof e=="string"?{message:e}:e;return new t(403,n)}static notFound(e="Not Found"){let n=typeof e=="string"?{message:e}:e;return new t(404,n)}static conflict(e="Conflict"){let n=typeof e=="string"?{message:e}:e;return new t(409,n)}static unprocessableEntity(e="Unprocessable Entity",n){let r=typeof e=="string"?{message:e,errors:n}:e;return new t(422,r)}static internalServerError(e="Internal Server Error"){let n=typeof e=="string"?{message:e}:e;return new t(500,n)}toResponse(){if(this.status===204||this.body===void 0)return new Response(null,{status:this.status,headers:this.headers});let e={"Content-Type":"application/json",...this.headers};return new Response(this.body,{status:this.status,headers:e})}}});import"reflect-metadata";function ce(t=""){return e=>{Reflect.defineMetadata(L,t,e),E()(e)}}function he(t,e){return(n,r,s)=>{U(n,r,{type:0,index:s,name:t,schema:e})}}function me(t,e){return(n,r,s)=>{U(n,r,{type:1,index:s,name:t,schema:e})}}function ye(t){return(e,n,r)=>{U(e,n,{type:2,index:r,schema:t})}}function U(t,e,n){let r=`${q.toString()}_${e.toString()}`;Reflect.hasMetadata(r,t.constructor)||Reflect.defineMetadata(r,[],t.constructor);let s=Reflect.getMetadata(r,t.constructor);s.push(n),Reflect.defineMetadata(r,s,t.constructor)}var L,R,q,j,le,de,ue,fe,pe,g,B=w(()=>{"use strict";M();L=Symbol("CONTROLLER_WATERMARK"),R=Symbol("ROUTE_METADATA"),q=Symbol("PARAM_METADATA");a(ce,"Controller");j=a(t=>(e="")=>(n,r)=>{Reflect.hasMetadata(R,n.constructor)||Reflect.defineMetadata(R,[],n.constructor);let s=Reflect.getMetadata(R,n.constructor);s.push({method:t,path:e,methodName:r.toString()}),Reflect.defineMetadata(R,s,n.constructor)},"createRouteDecorator"),le=j("GET"),de=j("POST"),ue=j("PUT"),fe=j("DELETE"),pe=j("PATCH"),g=(function(t){return t[t.Route=0]="Route",t[t.Query=1]="Query",t[t.Body=2]="Body",t[t.Context=3]="Context",t})({});a(he,"FromRoute");a(me,"FromQuery");a(ye,"FromBody");a(U,"addParamMetadata")});var Q={};K(Q,{JwtAuthService:()=>T});function ge(t,e,n,r){var s=arguments.length,o=s<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,n):r,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(t,e,n,r);else for(var c=t.length-1;c>=0;c--)(i=t[c])&&(o=(s<3?i(o):s>3?i(e,n,o):i(e,n))||o);return s>3&&o&&Object.defineProperty(e,n,o),o}function G(t,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(t,e)}function $(t){return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function X(t){let e=t+"==".slice(2-t.length*3&3);return atob(e.replace(/-/g,"+").replace(/_/g,"/"))}var T,F=w(()=>{"use strict";M();a(ge,"_ts_decorate");a(G,"_ts_metadata");a($,"base64UrlEncode");a(X,"base64UrlDecode");T=class{static{a(this,"JwtAuthService")}secret;expiresIn;constructor(e){this.secret=e.secret,this.expiresIn=e.expiresIn??3600}async getKey(){let e=new TextEncoder;return crypto.subtle.importKey("raw",e.encode(this.secret),{name:"HMAC",hash:"SHA-256"},!1,["sign","verify"])}async sign(e){let n={alg:"HS256",typ:"JWT"},r=Math.floor(Date.now()/1e3),s={...e,iat:r,exp:r+this.expiresIn},o=$(JSON.stringify(n)),i=$(JSON.stringify(s)),c=`${o}.${i}`,l=await this.getKey(),u=new TextEncoder,h=await crypto.subtle.sign("HMAC",l,u.encode(c)),f=$(String.fromCharCode(...new Uint8Array(h)));return`${c}.${f}`}async verify(e){let n=e.split(".");if(n.length!==3)throw new Error("Invalid JWT format");let r=n[0],s=n[1],o=n[2],i=`${r}.${s}`,c=await this.getKey(),l=new TextEncoder,u=Uint8Array.from(X(o),N=>N.charCodeAt(0));if(!await crypto.subtle.verify("HMAC",c,u,l.encode(i)))throw new Error("Invalid JWT signature");let f=JSON.parse(X(s)),x=Math.floor(Date.now()/1e3);if(f.exp!==void 0&&f.exp<x)throw new Error("JWT expired");return f}};T=ge([E(),G("design:type",Function),G("design:paramtypes",[typeof JwtOptions>"u"?Object:JwtOptions])],T)});var Z={};K(Z,{Router:()=>W});async function we(t,e,n){if(!n.required)return null;let r=t.request.headers.get("authorization");if(!r||!r.startsWith("Bearer "))return new Response(JSON.stringify({message:"Unauthorized"}),{status:401,headers:{"Content-Type":"application/json"}});let s=r.slice(7),o;try{let{JwtAuthService:c}=(F(),z(Q));o=await e.resolve(c)}catch{return new Response(JSON.stringify({message:"JWT service not configured"}),{status:500,headers:{"Content-Type":"application/json"}})}let i;try{i=await o.verify(s)}catch{return new Response(JSON.stringify({message:"Unauthorized: invalid or expired token"}),{status:401,headers:{"Content-Type":"application/json"}})}if(n.roles&&n.roles.length>0){let c=i.roles??[];if(!n.roles.some(u=>c.includes(u)))return new Response(JSON.stringify({message:"Forbidden: insufficient permissions"}),{status:403,headers:{"Content-Type":"application/json"}})}return t.items.set("user",i),null}var W,V=w(()=>{"use strict";J();k();B();a(we,"checkAuth");W=class{static{a(this,"Router")}routes=[];registerControllers(e){for(let n of e){let r=Reflect.getMetadata(L,n);if(r===void 0)continue;let s=Reflect.getMetadata(R,n)||[];for(let o of s){let i=`/${r}/${o.path}`.replace(/\/+/g,"/");i!=="/"&&i.endsWith("/")&&(i=i.slice(0,-1));let c=new URLPattern({pathname:i});this.routes.push({method:o.method,pattern:c,controller:n,methodName:o.methodName})}}}middleware(){return async(e,n)=>{for(let r of this.routes){if(r.method!==e.method)continue;let s=r.pattern.exec({pathname:e.path});if(s){let o=e.items.get("scope");if(!o)throw new Error("DI Scope not found in HttpContext");let i=Reflect.getMetadata(O,r.controller,r.methodName),c=Reflect.getMetadata(O,r.controller),l=i??c;if(l){let d=await we(e,o,l);if(d)return d}let u=await o.resolve(r.controller),h=`${q.toString()}_${r.methodName}`,f=Reflect.getMetadata(h,r.controller)||[],x=u[r.methodName].length,N=new Array(x).fill(void 0),Y=f.some(d=>d.type===g.Body),_;Y&&(_=await e.request.json().catch(()=>({})));let ee=new URL(e.request.url);for(let d of f){let y;if(d.type===g.Route&&d.name?y=s.pathname.groups[d.name]:d.type===g.Query&&d.name?y=ee.searchParams.get(d.name):d.type===g.Body?y=_:d.type===g.Context&&(y=e),d.schema){let P=d.schema.safeParse(y);if(!P.success)return A.unprocessableEntity("Validation failed",{errors:P.error.errors,target:g[d.type].toLowerCase(),name:d.name}).toResponse();y=P.data}N[d.index]=y}let m=await u[r.methodName](...N);return m instanceof Response?m:m instanceof A?m.toResponse():typeof m=="object"?Response.json(m):new Response(String(m))}}return n()}}}});M();import"reflect-metadata";var p=(function(t){return t[t.Singleton=0]="Singleton",t[t.Transient=1]="Transient",t[t.Scoped=2]="Scoped",t})({});var S=class t{static{a(this,"ServiceProvider")}descriptors;parent;singletonInstances=new Map;scopedInstances=new Map;trackedInstances=new Set;constructor(e,n){this.descriptors=e,this.parent=n}createScope(){return new t(this.descriptors,this.parent||this)}async dispose(){for(let e of this.trackedInstances)typeof e.onDestroy=="function"&&await e.onDestroy();this.trackedInstances.clear(),this.scopedInstances.clear(),this.singletonInstances.clear()}async resolve(e){let n=this.descriptors.find(r=>r.token===e);if(!n){if(this.parent)return this.parent.resolve(e);throw new Error(`Service not registered for token: ${e.toString()}`)}switch(n.lifetime){case p.Singleton:return this.resolveSingleton(n);case p.Scoped:return this.resolveScoped(n);case p.Transient:return this.resolveTransient(n)}}async resolveSingleton(e){let n=this.parent||this;if(n.singletonInstances.has(e.token))return n.singletonInstances.get(e.token);let r=await this.createInstance(n,e);return n.singletonInstances.set(e.token,r),r}async resolveScoped(e){if(this.scopedInstances.has(e.token))return this.scopedInstances.get(e.token);let n=await this.createInstance(this,e);return this.scopedInstances.set(e.token,n),n}async resolveTransient(e){return this.createInstance(this,e)}async createInstance(e,n){if(n.implementationInstance!==void 0)return n.implementationInstance;let r;if(n.implementationFactory)r=await n.implementationFactory(this);else if(n.implementationType)r=await this.instantiateClass(n.implementationType);else throw new Error(`Invalid service descriptor for token: ${n.token.toString()}`);return typeof r.onInit=="function"&&await r.onInit(),typeof r.onDestroy=="function"&&n.lifetime!==p.Transient&&e.trackedInstances.add(r),r}async instantiateClass(e){let n=Reflect.getMetadata("design:paramtypes",e)||[],r=Reflect.getMetadata(H,e)||[],s=await Promise.all(n.map(async(o,i)=>{let c=r.find(u=>u.index===i),l=c?c.token:o;if(!l||l===Object||l===String||l===Number||l===Boolean)throw new Error(`Cannot resolve parameter at index ${i} for ${e.name}. Token could not be determined or is primitive. Cannot inject primitive types directly without @Inject().`);return this.resolve(l)}));return new e(...s)}};var v=class{static{a(this,"ServiceCollection")}descriptors=[];add(e){return this.descriptors.push(e),this}addSingleton(e,n){return this.add({token:e,implementationType:n||e,lifetime:p.Singleton})}addSingletonInstance(e,n){return this.add({token:e,implementationInstance:n,lifetime:p.Singleton})}addTransient(e,n){return this.add({token:e,implementationType:n||e,lifetime:p.Transient})}addScoped(e,n){return this.add({token:e,implementationType:n||e,lifetime:p.Scoped})}buildServiceProvider(){return new S(this.descriptors)}addControllers(e){return e.forEach(n=>this.addTransient(n)),this}};var C=class{static{a(this,"HttpContext")}request;items=new Map;constructor(e){this.request=e}get method(){return this.request.method}get url(){return this.request.url}get path(){return new URL(this.request.url).pathname}};var I=class{static{a(this,"WebApplicationBuilder")}services;constructor(){this.services=new v}build(){let e=this.services.buildServiceProvider();return new b(e)}};var b=class{static{a(this,"WebApplication")}services;middlewares=[];controllersToMap=[];constructor(e){this.services=e}static createBuilder(){return new I}use(e){return this.middlewares.push(e),this}mapControllers(e){return this.controllersToMap.push(...e),this}async executePipeline(e){let n=-1,r=a(async o=>{if(o<=n)throw new Error("next() called multiple times");n=o;let i=this.middlewares[o];if(o===this.middlewares.length)return new Response(JSON.stringify({message:"Not found"}),{status:404});if(i)return i(e,r.bind(null,o+1))},"dispatch");return await r(0)||new Response(JSON.stringify({message:"Internal Server Error"}),{status:500})}run(e=3e3){let n=this;if(this.controllersToMap.length>0){let{Router:r}=(V(),z(Z)),s=new r;s.registerControllers(this.controllersToMap),this.use(s.middleware())}Bun.serve({port:e,async fetch(r){let s=n.services.createScope();try{let o=new C(r);return o.items.set("scope",s),await n.executePipeline(o)}finally{await s.dispose()}}}),console.log(`\u{1F680} Steampunk application is running on http://localhost:${e}`)}};k();M();B();J();F();function Ae(t={}){return async(e,n)=>{let{request:r}=e,s=r.headers.get("origin"),o=await n();o||(o=new Response);let i=new Response(o.body,o);if(t.origin?typeof t.origin=="string"?i.headers.set("Access-Control-Allow-Origin",t.origin):Array.isArray(t.origin)&&s?t.origin.includes(s)&&i.headers.set("Access-Control-Allow-Origin",s):typeof t.origin=="function"&&s&&t.origin(s)&&i.headers.set("Access-Control-Allow-Origin",s):i.headers.set("Access-Control-Allow-Origin","*"),t.methods){let c=Array.isArray(t.methods)?t.methods.join(", "):t.methods;i.headers.set("Access-Control-Allow-Methods",c)}else i.headers.set("Access-Control-Allow-Methods","GET,HEAD,PUT,PATCH,POST,DELETE");if(t.allowedHeaders){let c=Array.isArray(t.allowedHeaders)?t.allowedHeaders.join(", "):t.allowedHeaders;i.headers.set("Access-Control-Allow-Headers",c)}else{let c=r.headers.get("access-control-request-headers");c&&i.headers.set("Access-Control-Allow-Headers",c)}if(t.exposedHeaders){let c=Array.isArray(t.exposedHeaders)?t.exposedHeaders.join(", "):t.exposedHeaders;i.headers.set("Access-Control-Expose-Headers",c)}return t.credentials&&i.headers.set("Access-Control-Allow-Credentials","true"),t.maxAge!==void 0&&i.headers.set("Access-Control-Max-Age",t.maxAge.toString()),r.method==="OPTIONS"?new Response(null,{headers:i.headers,status:204}):i}}a(Ae,"cors");function Re(t){let e=a(s=>{let o=s.request?.headers?.get("x-forwarded-for");return o?o.split(",")[0].trim():"global"},"defaultKeyGenerator"),n=t.keyGenerator||e,r=new Map;return async(s,o)=>{let i=n(s),c=Date.now(),l=r.get(i);if(l?c>l.resetTime?(l.count=1,l.resetTime=c+t.windowMs):l.count++:(l={count:1,resetTime:c+t.windowMs},r.set(i,l)),Math.random()<.05)for(let[f,x]of r.entries())Date.now()>x.resetTime&&r.delete(f);if(l.count>t.limit){let f=Math.ceil((l.resetTime-c)/1e3);return new Response("Too Many Requests",{status:429,headers:{"Retry-After":f.toString(),"X-RateLimit-Limit":t.limit.toString(),"X-RateLimit-Remaining":"0","X-RateLimit-Reset":Math.ceil(l.resetTime/1e3).toString()}})}let u=await o();u||(u=new Response);let h=new Response(u.body,u);return h.headers.set("X-RateLimit-Limit",t.limit.toString()),h.headers.set("X-RateLimit-Remaining",Math.max(0,t.limit-l.count).toString()),h.headers.set("X-RateLimit-Reset",Math.ceil(l.resetTime/1e3).toString()),h}}a(Re,"throttle");export{ae as Authorize,ce as Controller,fe as Delete,ye as FromBody,me as FromQuery,he as FromRoute,le as Get,C as HttpContext,A as HttpResult,ie as Inject,E as Injectable,T as JwtAuthService,pe as Patch,de as Post,ue as Put,v as ServiceCollection,S as ServiceProvider,b as WebApplication,I as WebApplicationBuilder,Ae as cors,Re as throttle};
|
|
1
|
+
var D=Object.defineProperty;var te=Object.getOwnPropertyDescriptor;var ne=Object.getOwnPropertyNames;var re=Object.prototype.hasOwnProperty;var a=(t,e)=>D(t,"name",{value:e,configurable:!0});var w=(t,e)=>()=>(t&&(e=t(t=0)),e);var K=(t,e)=>{for(var n in e)D(t,n,{get:e[n],enumerable:!0})},se=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ne(e))!re.call(t,s)&&s!==n&&D(t,s,{get:()=>e[s],enumerable:!(r=te(e,s))||r.enumerable});return t};var z=t=>se(D({},"__esModule",{value:!0}),t);import"reflect-metadata";function E(){return t=>{Reflect.defineMetadata(oe,!0,t)}}function ie(t){return(e,n,r)=>{let s=Reflect.getMetadata(H,e)||[];s.push({index:r,token:t}),Reflect.defineMetadata(H,s,e)}}var oe,H,M=w(()=>{"use strict";oe=Symbol("INJECTABLE_WATERMARK"),H=Symbol("INJECT_METADATA");a(E,"Injectable");a(ie,"Inject")});import"reflect-metadata";function ae(t){return(e,n)=>{let r={required:!0,roles:t};n!==void 0?Reflect.defineMetadata(O,r,e.constructor,n):Reflect.defineMetadata(O,r,e)}}var O,k=w(()=>{"use strict";O=Symbol("AUTHORIZE_METADATA");a(ae,"Authorize")});var A,J=w(()=>{"use strict";A=class t{static{a(this,"HttpResult")}status;body;headers;constructor(e,n,r={}){this.status=e,this.body=n!==void 0&&typeof n!="string"?JSON.stringify(n):n,this.headers=r}static ok(e){return new t(200,e)}static created(e,n){let r={};return n&&(r.Location=n),new t(201,e,r)}static noContent(){return new t(204)}static badRequest(e="Bad Request",n){let r=typeof e=="string"?{message:e,errors:n}:e;return new t(400,r)}static unauthorized(e="Unauthorized"){let n=typeof e=="string"?{message:e}:e;return new t(401,n)}static forbidden(e="Forbidden"){let n=typeof e=="string"?{message:e}:e;return new t(403,n)}static notFound(e="Not Found"){let n=typeof e=="string"?{message:e}:e;return new t(404,n)}static conflict(e="Conflict"){let n=typeof e=="string"?{message:e}:e;return new t(409,n)}static unprocessableEntity(e="Unprocessable Entity",n){let r=typeof e=="string"?{message:e,errors:n}:e;return new t(422,r)}static internalServerError(e="Internal Server Error"){let n=typeof e=="string"?{message:e}:e;return new t(500,n)}toResponse(){if(this.status===204||this.body===void 0)return new Response(null,{status:this.status,headers:this.headers});let e={"Content-Type":"application/json",...this.headers};return new Response(this.body,{status:this.status,headers:e})}}});import"reflect-metadata";function ce(t=""){return e=>{Reflect.defineMetadata(L,t,e),E()(e)}}function he(t,e){return(n,r,s)=>{U(n,r,{type:0,index:s,name:t,schema:e})}}function me(t,e){return(n,r,s)=>{U(n,r,{type:1,index:s,name:t,schema:e})}}function ye(t){return(e,n,r)=>{U(e,n,{type:2,index:r,schema:t})}}function U(t,e,n){let r=`${q.toString()}_${e.toString()}`;Reflect.hasMetadata(r,t.constructor)||Reflect.defineMetadata(r,[],t.constructor);let s=Reflect.getMetadata(r,t.constructor);s.push(n),Reflect.defineMetadata(r,s,t.constructor)}var L,R,q,j,le,de,ue,fe,pe,g,B=w(()=>{"use strict";M();L=Symbol("CONTROLLER_WATERMARK"),R=Symbol("ROUTE_METADATA"),q=Symbol("PARAM_METADATA");a(ce,"Controller");j=a(t=>(e="")=>(n,r)=>{Reflect.hasMetadata(R,n.constructor)||Reflect.defineMetadata(R,[],n.constructor);let s=Reflect.getMetadata(R,n.constructor);s.push({method:t,path:e,methodName:r.toString()}),Reflect.defineMetadata(R,s,n.constructor)},"createRouteDecorator"),le=j("GET"),de=j("POST"),ue=j("PUT"),fe=j("DELETE"),pe=j("PATCH"),g=(function(t){return t[t.Route=0]="Route",t[t.Query=1]="Query",t[t.Body=2]="Body",t[t.Context=3]="Context",t})({});a(he,"FromRoute");a(me,"FromQuery");a(ye,"FromBody");a(U,"addParamMetadata")});var Q={};K(Q,{JwtAuthService:()=>T});function ge(t,e,n,r){var s=arguments.length,o=s<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,n):r,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(t,e,n,r);else for(var c=t.length-1;c>=0;c--)(i=t[c])&&(o=(s<3?i(o):s>3?i(e,n,o):i(e,n))||o);return s>3&&o&&Object.defineProperty(e,n,o),o}function G(t,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(t,e)}function $(t){return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function X(t){let e=t+"==".slice(2-t.length*3&3);return atob(e.replace(/-/g,"+").replace(/_/g,"/"))}var T,W=w(()=>{"use strict";M();a(ge,"_ts_decorate");a(G,"_ts_metadata");a($,"base64UrlEncode");a(X,"base64UrlDecode");T=class{static{a(this,"JwtAuthService")}secret;expiresIn;constructor(e){this.secret=e.secret,this.expiresIn=e.expiresIn??3600}async getKey(){let e=new TextEncoder;return crypto.subtle.importKey("raw",e.encode(this.secret),{name:"HMAC",hash:"SHA-256"},!1,["sign","verify"])}async sign(e){let n={alg:"HS256",typ:"JWT"},r=Math.floor(Date.now()/1e3),s={...e,iat:r,exp:r+this.expiresIn},o=$(JSON.stringify(n)),i=$(JSON.stringify(s)),c=`${o}.${i}`,l=await this.getKey(),u=new TextEncoder,h=await crypto.subtle.sign("HMAC",l,u.encode(c)),f=$(String.fromCharCode(...new Uint8Array(h)));return`${c}.${f}`}async verify(e){let n=e.split(".");if(n.length!==3)throw new Error("Invalid JWT format");let r=n[0],s=n[1],o=n[2],i=`${r}.${s}`,c=await this.getKey(),l=new TextEncoder,u=Uint8Array.from(X(o),N=>N.charCodeAt(0));if(!await crypto.subtle.verify("HMAC",c,u,l.encode(i)))throw new Error("Invalid JWT signature");let f=JSON.parse(X(s)),x=Math.floor(Date.now()/1e3);if(f.exp!==void 0&&f.exp<x)throw new Error("JWT expired");return f}};T=ge([E(),G("design:type",Function),G("design:paramtypes",[typeof JwtOptions>"u"?Object:JwtOptions])],T)});var Z={};K(Z,{Router:()=>F});async function we(t,e,n){if(!n.required)return null;let r=t.request.headers.get("authorization");if(!r||!r.startsWith("Bearer "))return new Response(JSON.stringify({message:"Unauthorized"}),{status:401,headers:{"Content-Type":"application/json"}});let s=r.slice(7),o;try{let{JwtAuthService:c}=(W(),z(Q));o=await e.resolve(c)}catch{return new Response(JSON.stringify({message:"JWT service not configured"}),{status:500,headers:{"Content-Type":"application/json"}})}let i;try{i=await o.verify(s)}catch{return new Response(JSON.stringify({message:"Unauthorized: invalid or expired token"}),{status:401,headers:{"Content-Type":"application/json"}})}if(n.roles&&n.roles.length>0){let c=i.roles??[];if(!n.roles.some(u=>c.includes(u)))return new Response(JSON.stringify({message:"Forbidden: insufficient permissions"}),{status:403,headers:{"Content-Type":"application/json"}})}return t.items.set("user",i),null}var F,V=w(()=>{"use strict";k();J();B();a(we,"checkAuth");F=class{static{a(this,"Router")}routes=[];registerControllers(e){for(let n of e){let r=Reflect.getMetadata(L,n);if(r===void 0)continue;let s=Reflect.getMetadata(R,n)||[];for(let o of s){let i=`/${r}/${o.path}`.replace(/\/+/g,"/");i!=="/"&&i.endsWith("/")&&(i=i.slice(0,-1));let c=new URLPattern({pathname:i});this.routes.push({method:o.method,pattern:c,controller:n,methodName:o.methodName})}}}middleware(){return async(e,n)=>{for(let r of this.routes){if(r.method!==e.method)continue;let s=r.pattern.exec({pathname:e.path});if(s){let o=e.items.get("scope");if(!o)throw new Error("DI Scope not found in HttpContext");let i=Reflect.getMetadata(O,r.controller,r.methodName),c=Reflect.getMetadata(O,r.controller),l=i??c;if(l){let d=await we(e,o,l);if(d)return d}let u=await o.resolve(r.controller),h=`${q.toString()}_${r.methodName}`,f=Reflect.getMetadata(h,r.controller)||[],x=u[r.methodName].length,N=new Array(x).fill(void 0),Y=f.some(d=>d.type===g.Body),_;Y&&(_=await e.request.json().catch(()=>({})));let ee=new URL(e.request.url);for(let d of f){let y;if(d.type===g.Route&&d.name?y=s.pathname.groups[d.name]:d.type===g.Query&&d.name?y=ee.searchParams.get(d.name):d.type===g.Body?y=_:d.type===g.Context&&(y=e),d.schema){let P=d.schema.safeParse(y);if(!P.success)return A.unprocessableEntity("Validation failed",{errors:P.error.errors,target:g[d.type].toLowerCase(),name:d.name}).toResponse();y=P.data}N[d.index]=y}let m=await u[r.methodName](...N);return m instanceof Response?m:m instanceof A?m.toResponse():typeof m=="object"?Response.json(m):new Response(String(m))}}return n()}}}});M();import"reflect-metadata";var p=(function(t){return t[t.Singleton=0]="Singleton",t[t.Transient=1]="Transient",t[t.Scoped=2]="Scoped",t})({});var S=class t{static{a(this,"ServiceProvider")}descriptors;parent;singletonInstances=new Map;scopedInstances=new Map;trackedInstances=new Set;constructor(e,n){this.descriptors=e,this.parent=n}createScope(){return new t(this.descriptors,this.parent||this)}async dispose(){for(let e of this.trackedInstances)typeof e.onDestroy=="function"&&await e.onDestroy();this.trackedInstances.clear(),this.scopedInstances.clear(),this.singletonInstances.clear()}async resolve(e){let n=this.descriptors.find(r=>r.token===e);if(!n){if(this.parent)return this.parent.resolve(e);throw new Error(`Service not registered for token: ${e.toString()}`)}switch(n.lifetime){case p.Singleton:return this.resolveSingleton(n);case p.Scoped:return this.resolveScoped(n);case p.Transient:return this.resolveTransient(n)}}async resolveSingleton(e){let n=this.getRoot();if(n.singletonInstances.has(e.token))return n.singletonInstances.get(e.token);let r=await this.createInstance(n,e);return n.singletonInstances.set(e.token,r),r}async resolveScoped(e){if(this.scopedInstances.has(e.token))return this.scopedInstances.get(e.token);let n=await this.createInstance(this,e);return this.scopedInstances.set(e.token,n),n}async resolveTransient(e){return this.createInstance(this,e)}async createInstance(e,n){let r;if(n.implementationInstance!==void 0)r=n.implementationInstance;else if(n.implementationFactory)r=await n.implementationFactory(this);else if(n.implementationType)r=await this.instantiateClass(n.implementationType);else throw new Error(`Invalid service descriptor for token: ${n.token.toString()}`);let s=Symbol.for("steampunk:initialized");return typeof r.onInit=="function"&&!r[s]&&(await r.onInit(),r[s]=!0),typeof r.onDestroy=="function"&&n.lifetime!==p.Transient&&e.trackedInstances.add(r),r}getRoot(){return this.parent?this.parent.getRoot():this}async instantiateClass(e){let n=Reflect.getMetadata("design:paramtypes",e)||[],r=Reflect.getMetadata(H,e)||[],s=await Promise.all(n.map(async(o,i)=>{let c=r.find(u=>u.index===i),l=c?c.token:o;if(!l||l===Object||l===String||l===Number||l===Boolean)throw new Error(`Cannot resolve parameter at index ${i} for ${e.name}. Token could not be determined or is primitive. Cannot inject primitive types directly without @Inject().`);return this.resolve(l)}));return new e(...s)}};var v=class{static{a(this,"ServiceCollection")}descriptors=[];add(e){return this.descriptors.push(e),this}addSingleton(e,n){return this.add({token:e,implementationType:n||e,lifetime:p.Singleton})}addSingletonInstance(e,n){return this.add({token:e,implementationInstance:n,lifetime:p.Singleton})}addTransient(e,n){return this.add({token:e,implementationType:n||e,lifetime:p.Transient})}addScoped(e,n){return this.add({token:e,implementationType:n||e,lifetime:p.Scoped})}buildServiceProvider(){return new S(this.descriptors)}addControllers(e){return e.forEach(n=>this.addTransient(n)),this}};var b=class{static{a(this,"HttpContext")}request;items=new Map;constructor(e){this.request=e}get method(){return this.request.method}get url(){return this.request.url}get path(){return new URL(this.request.url).pathname}};var C=class{static{a(this,"WebApplicationBuilder")}services;constructor(){this.services=new v}build(){let e=this.services.buildServiceProvider();return new I(e)}};var I=class{static{a(this,"WebApplication")}services;middlewares=[];controllersToMap=[];constructor(e){this.services=e}static createBuilder(){return new C}use(e){return this.middlewares.push(e),this}mapControllers(e){return this.controllersToMap.push(...e),this}async executePipeline(e){let n=-1,r=a(async o=>{if(o<=n)throw new Error("next() called multiple times");n=o;let i=this.middlewares[o];if(o===this.middlewares.length)return new Response(JSON.stringify({message:"Not found"}),{status:404});if(i)return i(e,r.bind(null,o+1))},"dispatch");return await r(0)||new Response(JSON.stringify({message:"Internal Server Error"}),{status:500})}run(e=3e3){let n=this;if(this.controllersToMap.length>0){let{Router:r}=(V(),z(Z)),s=new r;s.registerControllers(this.controllersToMap),this.use(s.middleware())}Bun.serve({port:e,async fetch(r){let s=n.services.createScope();try{let o=new b(r);return o.items.set("scope",s),await n.executePipeline(o)}finally{await s.dispose()}}}),console.log(`\u{1F680} Steampunk application is running on http://localhost:${e}`)}};J();M();B();k();W();function Ae(t={}){return async(e,n)=>{let{request:r}=e,s=r.headers.get("origin"),o=await n();o||(o=new Response);let i=new Response(o.body,o);if(t.origin?typeof t.origin=="string"?i.headers.set("Access-Control-Allow-Origin",t.origin):Array.isArray(t.origin)&&s?t.origin.includes(s)&&i.headers.set("Access-Control-Allow-Origin",s):typeof t.origin=="function"&&s&&t.origin(s)&&i.headers.set("Access-Control-Allow-Origin",s):i.headers.set("Access-Control-Allow-Origin","*"),t.methods){let c=Array.isArray(t.methods)?t.methods.join(", "):t.methods;i.headers.set("Access-Control-Allow-Methods",c)}else i.headers.set("Access-Control-Allow-Methods","GET,HEAD,PUT,PATCH,POST,DELETE");if(t.allowedHeaders){let c=Array.isArray(t.allowedHeaders)?t.allowedHeaders.join(", "):t.allowedHeaders;i.headers.set("Access-Control-Allow-Headers",c)}else{let c=r.headers.get("access-control-request-headers");c&&i.headers.set("Access-Control-Allow-Headers",c)}if(t.exposedHeaders){let c=Array.isArray(t.exposedHeaders)?t.exposedHeaders.join(", "):t.exposedHeaders;i.headers.set("Access-Control-Expose-Headers",c)}return t.credentials&&i.headers.set("Access-Control-Allow-Credentials","true"),t.maxAge!==void 0&&i.headers.set("Access-Control-Max-Age",t.maxAge.toString()),r.method==="OPTIONS"?new Response(null,{headers:i.headers,status:204}):i}}a(Ae,"cors");function Re(t){let e=a(s=>{let o=s.request?.headers?.get("x-forwarded-for");return o?o.split(",")[0].trim():"global"},"defaultKeyGenerator"),n=t.keyGenerator||e,r=new Map;return async(s,o)=>{let i=n(s),c=Date.now(),l=r.get(i);if(l?c>l.resetTime?(l.count=1,l.resetTime=c+t.windowMs):l.count++:(l={count:1,resetTime:c+t.windowMs},r.set(i,l)),Math.random()<.05)for(let[f,x]of r.entries())Date.now()>x.resetTime&&r.delete(f);if(l.count>t.limit){let f=Math.ceil((l.resetTime-c)/1e3);return new Response("Too Many Requests",{status:429,headers:{"Retry-After":f.toString(),"X-RateLimit-Limit":t.limit.toString(),"X-RateLimit-Remaining":"0","X-RateLimit-Reset":Math.ceil(l.resetTime/1e3).toString()}})}let u=await o();u||(u=new Response);let h=new Response(u.body,u);return h.headers.set("X-RateLimit-Limit",t.limit.toString()),h.headers.set("X-RateLimit-Remaining",Math.max(0,t.limit-l.count).toString()),h.headers.set("X-RateLimit-Reset",Math.ceil(l.resetTime/1e3).toString()),h}}a(Re,"throttle");export{ae as Authorize,ce as Controller,fe as Delete,ye as FromBody,me as FromQuery,he as FromRoute,le as Get,b as HttpContext,A as HttpResult,ie as Inject,E as Injectable,T as JwtAuthService,pe as Patch,de as Post,ue as Put,v as ServiceCollection,S as ServiceProvider,I as WebApplication,C as WebApplicationBuilder,Ae as cors,Re as throttle};
|