elysia 0.5.11 → 0.5.13

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.
@@ -262,7 +262,7 @@ ${t??`default: ${a}`}}
262
262
  ctx.set
263
263
  )
264
264
  if (response) return response
265
- `:`mapEarlyResponse(onRequest[${r}](ctx), ctx.set)`}l+=`} catch (error) {
265
+ `:`mapEarlyResponse(onRequest[${r}](ctx), ctx.set);`}l+=`} catch (error) {
266
266
  return handleError(request, error, ctx.set)
267
267
  }
268
268
 
@@ -57,7 +57,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
57
57
  [key in keyof NewInstance['meta'][typeof SCHEMA] as key extends `${infer Rest}` ? `${Prefix}${Rest}` : key]: NewInstance['meta'][typeof SCHEMA][key];
58
58
  }>);
59
59
  }> : this;
60
- guard<Schema extends TypedSchema<Exclude<keyof Instance['meta'][typeof DEFS], number | symbol>> = {}, NewElysia extends Elysia<any> = Elysia<any>>(hook: LocalHook<Schema, Instance>, run: (group: Elysia<{
60
+ guard<Schema extends TypedSchema<Exclude<keyof Instance['meta'][typeof DEFS], number | symbol>>, NewElysia extends Elysia<any> = Elysia<any>>(hook: LocalHook<Schema, Instance>, run: (group: Elysia<{
61
61
  request: Instance['request'];
62
62
  store: Instance['store'];
63
63
  schema: Schema & Instance['schema'];
@@ -172,7 +172,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
172
172
  };
173
173
  } : {})>>;
174
174
  }>;
175
- patch<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>> = {}>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
175
+ patch<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>>>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
176
176
  request: Instance['request'];
177
177
  store: Instance['store'];
178
178
  schema: Instance['schema'];
@@ -194,7 +194,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
194
194
  };
195
195
  } : {})>>;
196
196
  }>;
197
- delete<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>> = {}>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
197
+ delete<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>>>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
198
198
  request: Instance['request'];
199
199
  store: Instance['store'];
200
200
  schema: Instance['schema'];
@@ -216,7 +216,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
216
216
  };
217
217
  } : {})>>;
218
218
  }>;
219
- options<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>> = {}>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
219
+ options<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>>>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
220
220
  request: Instance['request'];
221
221
  store: Instance['store'];
222
222
  schema: Instance['schema'];
@@ -238,7 +238,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
238
238
  };
239
239
  } : {})>>;
240
240
  }>;
241
- all<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>> = {}>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
241
+ all<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>>>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
242
242
  request: Instance['request'];
243
243
  store: Instance['store'];
244
244
  schema: Instance['schema'];
@@ -260,7 +260,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
260
260
  };
261
261
  } : {})>>;
262
262
  }>;
263
- head<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>> = {}>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
263
+ head<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>>>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
264
264
  request: Instance['request'];
265
265
  store: Instance['store'];
266
266
  schema: Instance['schema'];
@@ -282,7 +282,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
282
282
  };
283
283
  } : {})>>;
284
284
  }>;
285
- trace<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>> = {}>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
285
+ trace<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>>>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
286
286
  request: Instance['request'];
287
287
  store: Instance['store'];
288
288
  schema: Instance['schema'];
@@ -304,7 +304,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
304
304
  };
305
305
  } : {})>>;
306
306
  }>;
307
- connect<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>> = {}>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
307
+ connect<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>>>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
308
308
  request: Instance['request'];
309
309
  store: Instance['store'];
310
310
  schema: Instance['schema'];
@@ -326,7 +326,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
326
326
  };
327
327
  } : {})>>;
328
328
  }>;
329
- ws<Path extends string = '', Schema extends WSTypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>> = {}>(path: Path, options: Path extends '' ? never : this extends Elysia<infer Instance> ? ElysiaWSOptions<Path, Schema, Instance['meta'][typeof DEFS]> : never): Elysia<{
329
+ ws<Path extends string, Schema extends WSTypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>>>(path: Path, options: Path extends '' ? never : this extends Elysia<infer Instance> ? ElysiaWSOptions<Path, Schema, Instance['meta'][typeof DEFS]> : never): Elysia<{
330
330
  request: Instance['request'];
331
331
  store: Instance['store'];
332
332
  schema: Instance['schema'];
@@ -334,7 +334,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
334
334
  subscribe: TypedWSRouteToEden<Typed, Instance['meta'][typeof DEFS], Path>;
335
335
  } : {}>>;
336
336
  }>;
337
- route<Schema extends TypedSchema<Exclude<keyof Instance['meta'][typeof DEFS], number | symbol>> = {}, Method extends HTTPMethod = HTTPMethod, Path extends string = string, Handler extends LocalHandler<Schema, Instance, Path> = LocalHandler<Schema, Instance, Path>>(method: Method, path: Path, handler: Handler, { config, ...hook }?: LocalHook<Schema, Instance, Path> & {
337
+ route<Schema extends TypedSchema<Exclude<keyof Instance['meta'][typeof DEFS], number | symbol>>, Method extends HTTPMethod = HTTPMethod, Path extends string = string, Handler extends LocalHandler<Schema, Instance, Path> = LocalHandler<Schema, Instance, Path>>(method: Method, path: Path, handler: Handler, { config, ...hook }?: LocalHook<Schema, Instance, Path> & {
338
338
  config: {
339
339
  allowMeta?: boolean;
340
340
  };
package/dist/cjs/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  function e(t){if("function"!=typeof WeakMap)return null;var r=new WeakMap,s=new WeakMap;return(e=function(e){return e?s:r})(t)}"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),function(e,t){for(var r in t)Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}(exports,{default:function(){return h},Elysia:function(){return h},t:function(){return i.t},ws:function(){return a.ws},SCHEMA:function(){return r.SCHEMA},DEFS:function(){return r.DEFS},EXPOSED:function(){return r.EXPOSED},getSchemaValidator:function(){return r.getSchemaValidator},mergeDeep:function(){return r.mergeDeep},mergeHook:function(){return r.mergeHook},mergeObjectArray:function(){return r.mergeObjectArray},getResponseSchemaValidator:function(){return r.getResponseSchemaValidator},ParseError:function(){return n.ParseError},NotFoundError:function(){return n.NotFoundError},ValidationError:function(){return n.ValidationError},InternalServerError:function(){return n.InternalServerError}});const t=require("memoirist"),r=require("./utils"),s=require("./schema"),o=require("./compose"),a=require("./ws"),i=require("./custom-types"),n=require("./error");class h{config;store={};meta={[r.SCHEMA]:Object.create(null),[r.DEFS]:Object.create(null),[r.EXPOSED]:Object.create(null)};decorators={};event={start:[],request:[],parse:[],transform:[],beforeHandle:[],afterHandle:[],error:[],stop:[]};server=null;$schema=null;router=new t.Memoirist;routes=[];staticRouter={handlers:[],variables:"",map:{},all:""};wsRouter;lazyLoadModules=[];constructor(e){this.config={fn:"/~fn",forceErrorEncapsulation:!1,basePath:"",...e}}add(e,t,a,i,{allowMeta:n=!1}={allowMeta:!1}){t=""===t?t:47===t.charCodeAt(0)?t:`/${t}`,this.config.basePath&&this.config.basePath,this.routes.push({method:e,path:t,handler:a,hooks:(0,r.mergeHook)({...this.event},i)});let h=this.meta[r.DEFS];if(i?.type)switch(i.type){case"text":i.type="text/plain";break;case"json":i.type="application/json";break;case"formdata":i.type="multipart/form-data";break;case"urlencoded":i.type="application/x-www-form-urlencoded";break;case"arrayBuffer":i.type="application/octet-stream"}(0,s.registerSchemaPath)({schema:this.meta[r.SCHEMA],contentType:i?.type,hook:i,method:e,path:t,models:this.meta[r.DEFS]});let u={body:(0,r.getSchemaValidator)(i?.body??this.$schema?.body,h),headers:(0,r.getSchemaValidator)(i?.headers??this.$schema?.headers,h,!0),params:(0,r.getSchemaValidator)(i?.params??this.$schema?.params,h),query:(0,r.getSchemaValidator)(i?.query??this.$schema?.query,h),response:(0,r.getResponseSchemaValidator)(i?.response??this.$schema?.response,h)},c=(0,r.mergeHook)(this.event,i),l=(0,o.composeHandler)({path:t,method:e,hooks:c,validator:u,handler:a,handleError:this.handleError,meta:n?this.meta:void 0,onRequest:this.event.request,config:this.config});if(-1===t.indexOf(":")&&-1===t.indexOf("*")){let r=this.staticRouter.handlers.length;this.staticRouter.handlers.push(l),this.staticRouter.variables+=`const st${r} = staticRouter.handlers[${r}]
2
2
  `,this.staticRouter.map[t]||(this.staticRouter.map[t]={code:""}),"ALL"===e?this.staticRouter.map[t].all=`default: return st${r}(ctx)
3
3
  `:this.staticRouter.map[t].code+=`case '${e}': return st${r}(ctx)
4
- `}else this.router.add(e,t,l)}onStart(e){return this.event.start.push(e),this}onRequest(e){return this.event.request.push(e),this}onParse(e){return this.event.parse.splice(this.event.parse.length-1,0,e),this}onTransform(e){return this.event.transform.push(e),this}onBeforeHandle(e){return this.event.beforeHandle.push(e),this}onAfterHandle(e){return this.event.afterHandle.push(e),this}onError(e){return this.event.error.push(e),this}onStop(e){return this.event.stop.push(e),this}on(e,t){switch(e){case"start":this.event.start.push(t);break;case"request":this.event.request.push(t);break;case"parse":this.event.parse.push(t);break;case"transform":this.event.transform.push(t);break;case"beforeHandle":this.event.beforeHandle.push(t);break;case"afterHandle":this.event.afterHandle.push(t);break;case"error":this.event.error.push(t);break;case"stop":this.event.stop.push(t)}return this}group(e,t,s){let o=new h;o.store=this.store,this.wsRouter&&o.use((0,a.ws)());let i="object"==typeof t,n=(i?s:t)(o);return this.decorators=(0,r.mergeDeep)(this.decorators,o.decorators),n.event.request.length&&(this.event.request=[...this.event.request,...n.event.request]),this.model(n.meta[r.DEFS]),Object.values(o.routes).forEach(({method:s,path:a,handler:h,hooks:u})=>{if(i){let i=`${e}${a}`,c=o.wsRouter?.find("subscribe",i);if(c){let e=o.wsRouter.history.find(([e,t])=>i===t);if(!e)return;return this.ws(i,e[2])}this.add(s,i,h,(0,r.mergeHook)(t,{...u,error:u.error?Array.isArray(u.error)?[...u.error,...n.event.error]:[u.error,...n.event.error]:n.event.error}))}else{let t=`${e}${a}`,i=o.wsRouter?.find("subscribe",t);if(i){let e=o.wsRouter.history.find(([e,t])=>a===t);if(!e)return;return this.ws(t,e[2])}this.add(s,t,h,(0,r.mergeHook)(u,{error:n.event.error}))}}),o.wsRouter&&this.wsRouter&&o.wsRouter.history.forEach(([t,r,s])=>{"/"===r?this.wsRouter?.add(t,e,s):this.wsRouter?.add(t,`${e}${r}`,s)}),this}guard(e,t){let s=new h;s.store=this.store,this.wsRouter&&s.use((0,a.ws)());let o=t(s);return this.decorators=(0,r.mergeDeep)(this.decorators,s.decorators),o.event.request.length&&(this.event.request=[...this.event.request,...o.event.request]),this.model(o.meta[r.DEFS]),Object.values(s.routes).forEach(({method:t,path:a,handler:i,hooks:n})=>{let h=s.wsRouter?.find("subscribe",a);if(h){let e=s.wsRouter.history.find(([e,t])=>a===t);if(!e)return;return this.ws(a,e[2])}this.add(t,a,i,(0,r.mergeHook)(e,{...n,error:n.error?Array.isArray(n.error)?[...n.error,...o.event.error]:[n.error,...o.event.error]:o.event.error}))}),s.wsRouter&&this.wsRouter&&s.wsRouter.history.forEach(([e,t,r])=>{this.wsRouter?.add(e,t,r)}),this}use(e){if(e instanceof Promise)return this.lazyLoadModules.push(e.then(e=>"function"==typeof e?e(this):e.default(this)).then(e=>e.compile())),this;let t=e(this);return t instanceof Promise?(this.lazyLoadModules.push(t.then(e=>e.compile())),this):t}if(e,t){return e?this.use(t):this}get(e,t,r){return this.add("GET",e,t,r),this}post(e,t,r){return this.add("POST",e,t,r),this}put(e,t,r){return this.add("PUT",e,t,r),this}patch(e,t,r){return this.add("PATCH",e,t,r),this}delete(e,t,r){return this.add("DELETE",e,t,r),this}options(e,t,r){return this.add("OPTIONS",e,t,r),this}all(e,t,r){return this.add("ALL",e,t,r),this}head(e,t,r){return this.add("HEAD",e,t,r),this}trace(e,t,r){return this.add("TRACE",e,t,r),this}connect(e,t,r){return this.add("CONNECT",e,t,r),this}ws(e,t){if(!this.wsRouter)throw Error("Can't find WebSocket. Please register WebSocket plugin first by importing 'elysia/ws'");return this.wsRouter.add("subscribe",e,t),this.get(e,e=>{if(!this.server?.upgrade(e.request,{headers:"function"==typeof t.upgrade?t.upgrade(e):t.upgrade,data:{...e,id:Date.now(),headers:e.request.headers.toJSON(),message:(0,r.getSchemaValidator)(t?.body,this.meta[r.DEFS]),transformMessage:t.transform?Array.isArray(t.transformMessage)?t.transformMessage:[t.transformMessage]:[]}}))return e.set.status=400,"Expected a websocket connection"},{beforeHandle:t.beforeHandle,transform:t.transform,headers:t?.headers,params:t?.params,query:t?.query}),this}route(e,t,r,{config:s,...o}={config:{allowMeta:!1}}){return this.add(e,t,r,o,s),this}state(e,t){return"object"==typeof e?(this.store=(0,r.mergeDeep)(this.store,e),this):(e in this.store||(this.store[e]=t),this)}decorate(e,t){return"object"==typeof e?(this.decorators=(0,r.mergeDeep)(this.decorators,e),this):(e in this.decorators||(this.decorators[e]=t),this)}derive(e){return e.$elysia="derive",this.onTransform(e)}fn(t){return this.use(async r=>{let{fn:s}=await Promise.resolve().then(()=>(function(t,r){if(!r&&t&&t.__esModule)return t;if(null===t||"object"!=typeof t&&"function"!=typeof t)return{default:t};var s=e(r);if(s&&s.has(t))return s.get(t);var o={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in t)if("default"!==i&&Object.prototype.hasOwnProperty.call(t,i)){var n=a?Object.getOwnPropertyDescriptor(t,i):null;n&&(n.get||n.set)?Object.defineProperty(o,i,n):o[i]=t[i]}return o.default=t,s&&s.set(t,o),o})(require("@elysiajs/fn")));return s({app:r,value:t,path:r.config.fn})})}schema(e){let t=this.meta[r.DEFS];return this.$schema={body:(0,r.getSchemaValidator)(e.body,t),headers:(0,r.getSchemaValidator)(e?.headers,t,!0),params:(0,r.getSchemaValidator)(e?.params,t),query:(0,r.getSchemaValidator)(e?.query,t),response:(0,r.getSchemaValidator)(e?.response,t)},this}compile(){return this.fetch=(0,o.composeGeneralHandler)(this),this.server&&this.server.reload({...this.server,fetch:this.fetch}),this}handle=async e=>this.fetch(e);fetch=e=>(this.fetch=(0,o.composeGeneralHandler)(this))(e);handleError=async(e,t,r)=>(this.handleError=(0,o.composeErrorHandler)(this))(e,t,r);outerErrorHandler=e=>new Response(e.message,{status:e?.status??500});listen=(e,t)=>{if(!Bun)throw Error("Bun to run");if(this.compile(),"string"==typeof e&&Number.isNaN(e=+e))throw Error("Port must be a numeric value");let r=this.fetch,s=(process.env.ENV??process.env.NODE_ENV)!=="production",o="object"==typeof e?{...this.config.serve,...e,development:s,fetch:r,error:this.outerErrorHandler}:{...this.config.serve,port:e,fetch:r,error:this.outerErrorHandler};if("production"!==process.env.ENV){let e=`$$Elysia:${o.port}`;globalThis[e]?(this.server=globalThis[e],this.server.reload(o)):globalThis[e]=this.server=Bun.serve(o)}else this.server=Bun.serve(o);for(let e=0;e<this.event.start.length;e++)this.event.start[e](this);return t&&t(this.server),Promise.all(this.lazyLoadModules).then(()=>{Bun.gc(!0)}),this};stop=async()=>{if(!this.server)throw Error("Elysia isn't running. Call `app.listen` to start the server.");this.server.stop();for(let e=0;e<this.event.stop.length;e++)await this.event.stop[e](this)};get modules(){return Promise.all(this.lazyLoadModules)}model(e,t){return"object"==typeof e?Object.entries(e).forEach(([e,t])=>{e in this.meta[r.DEFS]||(this.meta[r.DEFS][e]=t)}):this.meta[r.DEFS][e]=t,this}}
4
+ `}else this.router.add(e,t,l)}onStart(e){return this.event.start.push(e),this}onRequest(e){return this.event.request.push(e),this}onParse(e){return this.event.parse.splice(this.event.parse.length-1,0,e),this}onTransform(e){return this.event.transform.push(e),this}onBeforeHandle(e){return this.event.beforeHandle.push(e),this}onAfterHandle(e){return this.event.afterHandle.push(e),this}onError(e){return this.event.error.push(e),this}onStop(e){return this.event.stop.push(e),this}on(e,t){switch(e){case"start":this.event.start.push(t);break;case"request":this.event.request.push(t);break;case"parse":this.event.parse.push(t);break;case"transform":this.event.transform.push(t);break;case"beforeHandle":this.event.beforeHandle.push(t);break;case"afterHandle":this.event.afterHandle.push(t);break;case"error":this.event.error.push(t);break;case"stop":this.event.stop.push(t)}return this}group(e,t,s){let o=new h;o.store=this.store,this.wsRouter&&o.use((0,a.ws)());let i="object"==typeof t,n=(i?s:t)(o);return this.decorators=(0,r.mergeDeep)(this.decorators,o.decorators),n.event.request.length&&(this.event.request=[...this.event.request,...n.event.request]),this.model(n.meta[r.DEFS]),Object.values(o.routes).forEach(({method:s,path:a,handler:h,hooks:u})=>{if(i){let i=`${e}${a}`,c=o.wsRouter?.find("subscribe",i);if(c){let e=o.wsRouter.history.find(([e,t])=>i===t);if(!e)return;return this.ws(i,e[2])}this.add(s,i,h,(0,r.mergeHook)(t,{...u,error:u.error?Array.isArray(u.error)?[...u.error,...n.event.error]:[u.error,...n.event.error]:n.event.error}))}else{let t=`${e}${a}`,i=o.wsRouter?.find("subscribe",t);if(i){let e=o.wsRouter.history.find(([e,t])=>a===t);if(!e)return;return this.ws(t,e[2])}this.add(s,t,h,(0,r.mergeHook)(u,{error:n.event.error}))}}),o.wsRouter&&this.wsRouter&&o.wsRouter.history.forEach(([t,r,s])=>{"/"===r?this.wsRouter?.add(t,e,s):this.wsRouter?.add(t,`${e}${r}`,s)}),this}guard(e,t){let s=new h;s.store=this.store,this.wsRouter&&s.use((0,a.ws)());let o=t(s);return this.decorators=(0,r.mergeDeep)(this.decorators,s.decorators),o.event.request.length&&(this.event.request=[...this.event.request,...o.event.request]),this.model(o.meta[r.DEFS]),Object.values(s.routes).forEach(({method:t,path:a,handler:i,hooks:n})=>{let h=s.wsRouter?.find("subscribe",a);if(h){let e=s.wsRouter.history.find(([e,t])=>a===t);if(!e)return;return this.ws(a,e[2])}this.add(t,a,i,(0,r.mergeHook)(e,{...n,error:n.error?Array.isArray(n.error)?[...n.error,...o.event.error]:[n.error,...o.event.error]:o.event.error}))}),s.wsRouter&&this.wsRouter&&s.wsRouter.history.forEach(([e,t,r])=>{this.wsRouter?.add(e,t,r)}),this}use(e){if(e instanceof Promise)return this.lazyLoadModules.push(e.then(e=>"function"==typeof e?e(this):e.default(this)).then(e=>e.compile())),this;let t=e(this);return t instanceof Promise?(this.lazyLoadModules.push(t.then(e=>e.compile())),this):t}if(e,t){return e?this.use(t):this}get(e,t,r){return this.add("GET",e,t,r),this}post(e,t,r){return this.add("POST",e,t,r),this}put(e,t,r){return this.add("PUT",e,t,r),this}patch(e,t,r){return this.add("PATCH",e,t,r),this}delete(e,t,r){return this.add("DELETE",e,t,r),this}options(e,t,r){return this.add("OPTIONS",e,t,r),this}all(e,t,r){return this.add("ALL",e,t,r),this}head(e,t,r){return this.add("HEAD",e,t,r),this}trace(e,t,r){return this.add("TRACE",e,t,r),this}connect(e,t,r){return this.add("CONNECT",e,t,r),this}ws(e,t){if(!this.wsRouter)throw Error("Can't find WebSocket. Please register WebSocket plugin first by importing 'elysia/ws'");return this.wsRouter.add("subscribe",e,t),this.get(e,e=>{if(!this.server?.upgrade(e.request,{headers:"function"==typeof t.upgrade?t.upgrade(e):t.upgrade,data:{...e,id:Date.now(),headers:e.request.headers.toJSON(),message:(0,r.getSchemaValidator)(t?.body,this.meta[r.DEFS]),transformMessage:t.transform?Array.isArray(t.transformMessage)?t.transformMessage:[t.transformMessage]:[]}}))return e.set.status=400,"Expected a websocket connection"},{beforeHandle:t.beforeHandle,transform:t.transform,headers:t?.headers,params:t?.params,query:t?.query}),this}route(e,t,r,{config:s,...o}={config:{allowMeta:!1}}){return this.add(e,t,r,o,s),this}state(e,t){return"object"==typeof e?(this.store=(0,r.mergeDeep)(this.store,e),this):(e in this.store||(this.store[e]=t),this)}decorate(e,t){return"object"==typeof e?(this.decorators=(0,r.mergeDeep)(this.decorators,e),this):(e in this.decorators||(this.decorators[e]=t),this)}derive(e){return e.$elysia="derive",this.onTransform(e)}fn(t){return this.use(async r=>{let{fn:s}=await Promise.resolve().then(()=>(function(t,r){if(!r&&t&&t.__esModule)return t;if(null===t||"object"!=typeof t&&"function"!=typeof t)return{default:t};var s=e(r);if(s&&s.has(t))return s.get(t);var o={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in t)if("default"!==i&&Object.prototype.hasOwnProperty.call(t,i)){var n=a?Object.getOwnPropertyDescriptor(t,i):null;n&&(n.get||n.set)?Object.defineProperty(o,i,n):o[i]=t[i]}return o.default=t,s&&s.set(t,o),o})(require("@elysiajs/fn")));return s({app:r,value:t,path:r.config.fn})})}schema(e){let t=this.meta[r.DEFS];return this.$schema={body:(0,r.getSchemaValidator)(e.body,t),headers:(0,r.getSchemaValidator)(e?.headers,t,!0),params:(0,r.getSchemaValidator)(e?.params,t),query:(0,r.getSchemaValidator)(e?.query,t),response:(0,r.getSchemaValidator)(e?.response,t)},this}compile(){return this.fetch=(0,o.composeGeneralHandler)(this),this.server&&this.server.reload({...this.server,fetch:this.fetch}),this}handle=async e=>this.fetch(e);fetch=e=>(this.fetch=(0,o.composeGeneralHandler)(this))(e);handleError=async(e,t,r)=>(this.handleError=(0,o.composeErrorHandler)(this))(e,t,r);outerErrorHandler=e=>new Response(e.message,{status:e?.status??500});listen=(e,t)=>{if(!Bun)throw Error("Bun to run");if(this.compile(),"string"==typeof e&&Number.isNaN(e=+e))throw Error("Port must be a numeric value");let r=this.fetch,s=(process.env.ENV??process.env.NODE_ENV)!=="production",o="object"==typeof e?{...this.config.serve,...e,development:s,fetch:r,error:this.outerErrorHandler}:{...this.config.serve,port:e,fetch:r,error:this.outerErrorHandler};if(s){let e=`$$Elysia:${o.port}`;globalThis[e]?(this.server=globalThis[e],this.server.reload(o)):globalThis[e]=this.server=Bun.serve(o)}else this.server=Bun.serve(o);for(let e=0;e<this.event.start.length;e++)this.event.start[e](this);return t&&t(this.server),Promise.all(this.lazyLoadModules).then(()=>{Bun.gc(!0)}),this};stop=async()=>{if(!this.server)throw Error("Elysia isn't running. Call `app.listen` to start the server.");this.server.stop();for(let e=0;e<this.event.stop.length;e++)await this.event.stop[e](this)};get modules(){return Promise.all(this.lazyLoadModules)}model(e,t){return"object"==typeof e?Object.entries(e).forEach(([e,t])=>{e in this.meta[r.DEFS]||(this.meta[r.DEFS][e]=t)}):this.meta[r.DEFS][e]=t,this}}
@@ -169,7 +169,7 @@ export type LocalHandler<Schema extends TypedSchema, Instance extends ElysiaInst
169
169
  query: Query;
170
170
  headers: Headers;
171
171
  response: Response;
172
- } : any : never, Instance>;
172
+ } : never : never, Instance>;
173
173
  export interface TypedRoute {
174
174
  body?: unknown;
175
175
  headers?: Record<string, unknown>;
@@ -203,7 +203,7 @@ export type HTTPMethod = 'ACL' | 'BIND' | 'CHECKOUT' | 'CONNECT' | 'COPY' | 'DEL
203
203
  export type ErrorCode = (string & {}) | 'NOT_FOUND' | 'INTERNAL_SERVER_ERROR' | 'VALIDATION' | 'PARSE' | 'UNKNOWN';
204
204
  export type ErrorHandler = (params: {
205
205
  request: Request;
206
- code: 'UNKNOWN';
206
+ code: 'UNKNOWN' | (string & {});
207
207
  error: Readonly<Error>;
208
208
  set: Context['set'];
209
209
  } | {
package/dist/compose.js CHANGED
@@ -262,7 +262,7 @@ ${t??`default: ${o}`}}
262
262
  ctx.set
263
263
  )
264
264
  if (response) return response
265
- `:`mapEarlyResponse(onRequest[${r}](ctx), ctx.set)`}i+=`} catch (error) {
265
+ `:`mapEarlyResponse(onRequest[${r}](ctx), ctx.set);`}i+=`} catch (error) {
266
266
  return handleError(request, error, ctx.set)
267
267
  }
268
268
 
package/dist/index.d.ts CHANGED
@@ -57,7 +57,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
57
57
  [key in keyof NewInstance['meta'][typeof SCHEMA] as key extends `${infer Rest}` ? `${Prefix}${Rest}` : key]: NewInstance['meta'][typeof SCHEMA][key];
58
58
  }>);
59
59
  }> : this;
60
- guard<Schema extends TypedSchema<Exclude<keyof Instance['meta'][typeof DEFS], number | symbol>> = {}, NewElysia extends Elysia<any> = Elysia<any>>(hook: LocalHook<Schema, Instance>, run: (group: Elysia<{
60
+ guard<Schema extends TypedSchema<Exclude<keyof Instance['meta'][typeof DEFS], number | symbol>>, NewElysia extends Elysia<any> = Elysia<any>>(hook: LocalHook<Schema, Instance>, run: (group: Elysia<{
61
61
  request: Instance['request'];
62
62
  store: Instance['store'];
63
63
  schema: Schema & Instance['schema'];
@@ -172,7 +172,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
172
172
  };
173
173
  } : {})>>;
174
174
  }>;
175
- patch<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>> = {}>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
175
+ patch<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>>>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
176
176
  request: Instance['request'];
177
177
  store: Instance['store'];
178
178
  schema: Instance['schema'];
@@ -194,7 +194,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
194
194
  };
195
195
  } : {})>>;
196
196
  }>;
197
- delete<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>> = {}>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
197
+ delete<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>>>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
198
198
  request: Instance['request'];
199
199
  store: Instance['store'];
200
200
  schema: Instance['schema'];
@@ -216,7 +216,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
216
216
  };
217
217
  } : {})>>;
218
218
  }>;
219
- options<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>> = {}>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
219
+ options<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>>>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
220
220
  request: Instance['request'];
221
221
  store: Instance['store'];
222
222
  schema: Instance['schema'];
@@ -238,7 +238,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
238
238
  };
239
239
  } : {})>>;
240
240
  }>;
241
- all<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>> = {}>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
241
+ all<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>>>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
242
242
  request: Instance['request'];
243
243
  store: Instance['store'];
244
244
  schema: Instance['schema'];
@@ -260,7 +260,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
260
260
  };
261
261
  } : {})>>;
262
262
  }>;
263
- head<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>> = {}>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
263
+ head<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>>>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
264
264
  request: Instance['request'];
265
265
  store: Instance['store'];
266
266
  schema: Instance['schema'];
@@ -282,7 +282,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
282
282
  };
283
283
  } : {})>>;
284
284
  }>;
285
- trace<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>> = {}>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
285
+ trace<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>>>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
286
286
  request: Instance['request'];
287
287
  store: Instance['store'];
288
288
  schema: Instance['schema'];
@@ -304,7 +304,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
304
304
  };
305
305
  } : {})>>;
306
306
  }>;
307
- connect<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>> = {}>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
307
+ connect<Path extends string, Handler extends LocalHandler<Schema, Instance, Path>, Schema extends TypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>>>(path: Path, handler: Handler, hook?: LocalHook<Schema, Instance, Path>): Elysia<{
308
308
  request: Instance['request'];
309
309
  store: Instance['store'];
310
310
  schema: Instance['schema'];
@@ -326,7 +326,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
326
326
  };
327
327
  } : {})>>;
328
328
  }>;
329
- ws<Path extends string = '', Schema extends WSTypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>> = {}>(path: Path, options: Path extends '' ? never : this extends Elysia<infer Instance> ? ElysiaWSOptions<Path, Schema, Instance['meta'][typeof DEFS]> : never): Elysia<{
329
+ ws<Path extends string, Schema extends WSTypedSchema<Extract<keyof Instance['meta'][typeof DEFS], string>>>(path: Path, options: Path extends '' ? never : this extends Elysia<infer Instance> ? ElysiaWSOptions<Path, Schema, Instance['meta'][typeof DEFS]> : never): Elysia<{
330
330
  request: Instance['request'];
331
331
  store: Instance['store'];
332
332
  schema: Instance['schema'];
@@ -334,7 +334,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
334
334
  subscribe: TypedWSRouteToEden<Typed, Instance['meta'][typeof DEFS], Path>;
335
335
  } : {}>>;
336
336
  }>;
337
- route<Schema extends TypedSchema<Exclude<keyof Instance['meta'][typeof DEFS], number | symbol>> = {}, Method extends HTTPMethod = HTTPMethod, Path extends string = string, Handler extends LocalHandler<Schema, Instance, Path> = LocalHandler<Schema, Instance, Path>>(method: Method, path: Path, handler: Handler, { config, ...hook }?: LocalHook<Schema, Instance, Path> & {
337
+ route<Schema extends TypedSchema<Exclude<keyof Instance['meta'][typeof DEFS], number | symbol>>, Method extends HTTPMethod = HTTPMethod, Path extends string = string, Handler extends LocalHandler<Schema, Instance, Path> = LocalHandler<Schema, Instance, Path>>(method: Method, path: Path, handler: Handler, { config, ...hook }?: LocalHook<Schema, Instance, Path> & {
338
338
  config: {
339
339
  allowMeta?: boolean;
340
340
  };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  import{Memoirist as e}from"memoirist";import{SCHEMA as t,EXPOSED as r,DEFS as s,mergeHook as o,getSchemaValidator as a,getResponseSchemaValidator as i,mergeDeep as h}from"./utils";import{registerSchemaPath as n}from"./schema";import{composeErrorHandler as u,composeGeneralHandler as d,composeHandler as l}from"./compose";import{ws as c}from"./ws";export default class p{config;store={};meta={[t]:Object.create(null),[s]:Object.create(null),[r]:Object.create(null)};decorators={};event={start:[],request:[],parse:[],transform:[],beforeHandle:[],afterHandle:[],error:[],stop:[]};server=null;$schema=null;router=new e;routes=[];staticRouter={handlers:[],variables:"",map:{},all:""};wsRouter;lazyLoadModules=[];constructor(e){this.config={fn:"/~fn",forceErrorEncapsulation:!1,basePath:"",...e}}add(e,r,h,u,{allowMeta:d=!1}={allowMeta:!1}){r=""===r?r:47===r.charCodeAt(0)?r:`/${r}`,this.config.basePath&&this.config.basePath,this.routes.push({method:e,path:r,handler:h,hooks:o({...this.event},u)});let c=this.meta[s];if(u?.type)switch(u.type){case"text":u.type="text/plain";break;case"json":u.type="application/json";break;case"formdata":u.type="multipart/form-data";break;case"urlencoded":u.type="application/x-www-form-urlencoded";break;case"arrayBuffer":u.type="application/octet-stream"}n({schema:this.meta[t],contentType:u?.type,hook:u,method:e,path:r,models:this.meta[s]});let p={body:a(u?.body??this.$schema?.body,c),headers:a(u?.headers??this.$schema?.headers,c,!0),params:a(u?.params??this.$schema?.params,c),query:a(u?.query??this.$schema?.query,c),response:i(u?.response??this.$schema?.response,c)},f=o(this.event,u),m=l({path:r,method:e,hooks:f,validator:p,handler:h,handleError:this.handleError,meta:d?this.meta:void 0,onRequest:this.event.request,config:this.config});if(-1===r.indexOf(":")&&-1===r.indexOf("*")){let t=this.staticRouter.handlers.length;this.staticRouter.handlers.push(m),this.staticRouter.variables+=`const st${t} = staticRouter.handlers[${t}]
2
2
  `,this.staticRouter.map[r]||(this.staticRouter.map[r]={code:""}),"ALL"===e?this.staticRouter.map[r].all=`default: return st${t}(ctx)
3
3
  `:this.staticRouter.map[r].code+=`case '${e}': return st${t}(ctx)
4
- `}else this.router.add(e,r,m)}onStart(e){return this.event.start.push(e),this}onRequest(e){return this.event.request.push(e),this}onParse(e){return this.event.parse.splice(this.event.parse.length-1,0,e),this}onTransform(e){return this.event.transform.push(e),this}onBeforeHandle(e){return this.event.beforeHandle.push(e),this}onAfterHandle(e){return this.event.afterHandle.push(e),this}onError(e){return this.event.error.push(e),this}onStop(e){return this.event.stop.push(e),this}on(e,t){switch(e){case"start":this.event.start.push(t);break;case"request":this.event.request.push(t);break;case"parse":this.event.parse.push(t);break;case"transform":this.event.transform.push(t);break;case"beforeHandle":this.event.beforeHandle.push(t);break;case"afterHandle":this.event.afterHandle.push(t);break;case"error":this.event.error.push(t);break;case"stop":this.event.stop.push(t)}return this}group(e,t,r){let a=new p;a.store=this.store,this.wsRouter&&a.use(c());let i="object"==typeof t,n=(i?r:t)(a);return this.decorators=h(this.decorators,a.decorators),n.event.request.length&&(this.event.request=[...this.event.request,...n.event.request]),this.model(n.meta[s]),Object.values(a.routes).forEach(({method:r,path:s,handler:h,hooks:u})=>{if(i){let i=`${e}${s}`,d=a.wsRouter?.find("subscribe",i);if(d){let e=a.wsRouter.history.find(([e,t])=>i===t);if(!e)return;return this.ws(i,e[2])}this.add(r,i,h,o(t,{...u,error:u.error?Array.isArray(u.error)?[...u.error,...n.event.error]:[u.error,...n.event.error]:n.event.error}))}else{let t=`${e}${s}`,i=a.wsRouter?.find("subscribe",t);if(i){let e=a.wsRouter.history.find(([e,t])=>s===t);if(!e)return;return this.ws(t,e[2])}this.add(r,t,h,o(u,{error:n.event.error}))}}),a.wsRouter&&this.wsRouter&&a.wsRouter.history.forEach(([t,r,s])=>{"/"===r?this.wsRouter?.add(t,e,s):this.wsRouter?.add(t,`${e}${r}`,s)}),this}guard(e,t){let r=new p;r.store=this.store,this.wsRouter&&r.use(c());let a=t(r);return this.decorators=h(this.decorators,r.decorators),a.event.request.length&&(this.event.request=[...this.event.request,...a.event.request]),this.model(a.meta[s]),Object.values(r.routes).forEach(({method:t,path:s,handler:i,hooks:h})=>{let n=r.wsRouter?.find("subscribe",s);if(n){let e=r.wsRouter.history.find(([e,t])=>s===t);if(!e)return;return this.ws(s,e[2])}this.add(t,s,i,o(e,{...h,error:h.error?Array.isArray(h.error)?[...h.error,...a.event.error]:[h.error,...a.event.error]:a.event.error}))}),r.wsRouter&&this.wsRouter&&r.wsRouter.history.forEach(([e,t,r])=>{this.wsRouter?.add(e,t,r)}),this}use(e){if(e instanceof Promise)return this.lazyLoadModules.push(e.then(e=>"function"==typeof e?e(this):e.default(this)).then(e=>e.compile())),this;let t=e(this);return t instanceof Promise?(this.lazyLoadModules.push(t.then(e=>e.compile())),this):t}if(e,t){return e?this.use(t):this}get(e,t,r){return this.add("GET",e,t,r),this}post(e,t,r){return this.add("POST",e,t,r),this}put(e,t,r){return this.add("PUT",e,t,r),this}patch(e,t,r){return this.add("PATCH",e,t,r),this}delete(e,t,r){return this.add("DELETE",e,t,r),this}options(e,t,r){return this.add("OPTIONS",e,t,r),this}all(e,t,r){return this.add("ALL",e,t,r),this}head(e,t,r){return this.add("HEAD",e,t,r),this}trace(e,t,r){return this.add("TRACE",e,t,r),this}connect(e,t,r){return this.add("CONNECT",e,t,r),this}ws(e,t){if(!this.wsRouter)throw Error("Can't find WebSocket. Please register WebSocket plugin first by importing 'elysia/ws'");return this.wsRouter.add("subscribe",e,t),this.get(e,e=>{if(!this.server?.upgrade(e.request,{headers:"function"==typeof t.upgrade?t.upgrade(e):t.upgrade,data:{...e,id:Date.now(),headers:e.request.headers.toJSON(),message:a(t?.body,this.meta[s]),transformMessage:t.transform?Array.isArray(t.transformMessage)?t.transformMessage:[t.transformMessage]:[]}}))return e.set.status=400,"Expected a websocket connection"},{beforeHandle:t.beforeHandle,transform:t.transform,headers:t?.headers,params:t?.params,query:t?.query}),this}route(e,t,r,{config:s,...o}={config:{allowMeta:!1}}){return this.add(e,t,r,o,s),this}state(e,t){return"object"==typeof e?(this.store=h(this.store,e),this):(e in this.store||(this.store[e]=t),this)}decorate(e,t){return"object"==typeof e?(this.decorators=h(this.decorators,e),this):(e in this.decorators||(this.decorators[e]=t),this)}derive(e){return e.$elysia="derive",this.onTransform(e)}fn(e){return this.use(async t=>{let{fn:r}=await import("@elysiajs/fn");return r({app:t,value:e,path:t.config.fn})})}schema(e){let t=this.meta[s];return this.$schema={body:a(e.body,t),headers:a(e?.headers,t,!0),params:a(e?.params,t),query:a(e?.query,t),response:a(e?.response,t)},this}compile(){return this.fetch=d(this),this.server&&this.server.reload({...this.server,fetch:this.fetch}),this}handle=async e=>this.fetch(e);fetch=e=>(this.fetch=d(this))(e);handleError=async(e,t,r)=>(this.handleError=u(this))(e,t,r);outerErrorHandler=e=>new Response(e.message,{status:e?.status??500});listen=(e,t)=>{if(!Bun)throw Error("Bun to run");if(this.compile(),"string"==typeof e&&Number.isNaN(e=+e))throw Error("Port must be a numeric value");let r=this.fetch,s=(process.env.ENV??process.env.NODE_ENV)!=="production",o="object"==typeof e?{...this.config.serve,...e,development:s,fetch:r,error:this.outerErrorHandler}:{...this.config.serve,port:e,fetch:r,error:this.outerErrorHandler};if("production"!==process.env.ENV){let e=`$$Elysia:${o.port}`;globalThis[e]?(this.server=globalThis[e],this.server.reload(o)):globalThis[e]=this.server=Bun.serve(o)}else this.server=Bun.serve(o);for(let e=0;e<this.event.start.length;e++)this.event.start[e](this);return t&&t(this.server),Promise.all(this.lazyLoadModules).then(()=>{Bun.gc(!0)}),this};stop=async()=>{if(!this.server)throw Error("Elysia isn't running. Call `app.listen` to start the server.");this.server.stop();for(let e=0;e<this.event.stop.length;e++)await this.event.stop[e](this)};get modules(){return Promise.all(this.lazyLoadModules)}model(e,t){return"object"==typeof e?Object.entries(e).forEach(([e,t])=>{e in this.meta[s]||(this.meta[s][e]=t)}):this.meta[s][e]=t,this}}export{t}from"./custom-types";export{ws}from"./ws";export{SCHEMA,DEFS,EXPOSED,getSchemaValidator,mergeDeep,mergeHook,mergeObjectArray,getResponseSchemaValidator}from"./utils";export{ParseError,NotFoundError,ValidationError,InternalServerError}from"./error";export{p as Elysia};
4
+ `}else this.router.add(e,r,m)}onStart(e){return this.event.start.push(e),this}onRequest(e){return this.event.request.push(e),this}onParse(e){return this.event.parse.splice(this.event.parse.length-1,0,e),this}onTransform(e){return this.event.transform.push(e),this}onBeforeHandle(e){return this.event.beforeHandle.push(e),this}onAfterHandle(e){return this.event.afterHandle.push(e),this}onError(e){return this.event.error.push(e),this}onStop(e){return this.event.stop.push(e),this}on(e,t){switch(e){case"start":this.event.start.push(t);break;case"request":this.event.request.push(t);break;case"parse":this.event.parse.push(t);break;case"transform":this.event.transform.push(t);break;case"beforeHandle":this.event.beforeHandle.push(t);break;case"afterHandle":this.event.afterHandle.push(t);break;case"error":this.event.error.push(t);break;case"stop":this.event.stop.push(t)}return this}group(e,t,r){let a=new p;a.store=this.store,this.wsRouter&&a.use(c());let i="object"==typeof t,n=(i?r:t)(a);return this.decorators=h(this.decorators,a.decorators),n.event.request.length&&(this.event.request=[...this.event.request,...n.event.request]),this.model(n.meta[s]),Object.values(a.routes).forEach(({method:r,path:s,handler:h,hooks:u})=>{if(i){let i=`${e}${s}`,d=a.wsRouter?.find("subscribe",i);if(d){let e=a.wsRouter.history.find(([e,t])=>i===t);if(!e)return;return this.ws(i,e[2])}this.add(r,i,h,o(t,{...u,error:u.error?Array.isArray(u.error)?[...u.error,...n.event.error]:[u.error,...n.event.error]:n.event.error}))}else{let t=`${e}${s}`,i=a.wsRouter?.find("subscribe",t);if(i){let e=a.wsRouter.history.find(([e,t])=>s===t);if(!e)return;return this.ws(t,e[2])}this.add(r,t,h,o(u,{error:n.event.error}))}}),a.wsRouter&&this.wsRouter&&a.wsRouter.history.forEach(([t,r,s])=>{"/"===r?this.wsRouter?.add(t,e,s):this.wsRouter?.add(t,`${e}${r}`,s)}),this}guard(e,t){let r=new p;r.store=this.store,this.wsRouter&&r.use(c());let a=t(r);return this.decorators=h(this.decorators,r.decorators),a.event.request.length&&(this.event.request=[...this.event.request,...a.event.request]),this.model(a.meta[s]),Object.values(r.routes).forEach(({method:t,path:s,handler:i,hooks:h})=>{let n=r.wsRouter?.find("subscribe",s);if(n){let e=r.wsRouter.history.find(([e,t])=>s===t);if(!e)return;return this.ws(s,e[2])}this.add(t,s,i,o(e,{...h,error:h.error?Array.isArray(h.error)?[...h.error,...a.event.error]:[h.error,...a.event.error]:a.event.error}))}),r.wsRouter&&this.wsRouter&&r.wsRouter.history.forEach(([e,t,r])=>{this.wsRouter?.add(e,t,r)}),this}use(e){if(e instanceof Promise)return this.lazyLoadModules.push(e.then(e=>"function"==typeof e?e(this):e.default(this)).then(e=>e.compile())),this;let t=e(this);return t instanceof Promise?(this.lazyLoadModules.push(t.then(e=>e.compile())),this):t}if(e,t){return e?this.use(t):this}get(e,t,r){return this.add("GET",e,t,r),this}post(e,t,r){return this.add("POST",e,t,r),this}put(e,t,r){return this.add("PUT",e,t,r),this}patch(e,t,r){return this.add("PATCH",e,t,r),this}delete(e,t,r){return this.add("DELETE",e,t,r),this}options(e,t,r){return this.add("OPTIONS",e,t,r),this}all(e,t,r){return this.add("ALL",e,t,r),this}head(e,t,r){return this.add("HEAD",e,t,r),this}trace(e,t,r){return this.add("TRACE",e,t,r),this}connect(e,t,r){return this.add("CONNECT",e,t,r),this}ws(e,t){if(!this.wsRouter)throw Error("Can't find WebSocket. Please register WebSocket plugin first by importing 'elysia/ws'");return this.wsRouter.add("subscribe",e,t),this.get(e,e=>{if(!this.server?.upgrade(e.request,{headers:"function"==typeof t.upgrade?t.upgrade(e):t.upgrade,data:{...e,id:Date.now(),headers:e.request.headers.toJSON(),message:a(t?.body,this.meta[s]),transformMessage:t.transform?Array.isArray(t.transformMessage)?t.transformMessage:[t.transformMessage]:[]}}))return e.set.status=400,"Expected a websocket connection"},{beforeHandle:t.beforeHandle,transform:t.transform,headers:t?.headers,params:t?.params,query:t?.query}),this}route(e,t,r,{config:s,...o}={config:{allowMeta:!1}}){return this.add(e,t,r,o,s),this}state(e,t){return"object"==typeof e?(this.store=h(this.store,e),this):(e in this.store||(this.store[e]=t),this)}decorate(e,t){return"object"==typeof e?(this.decorators=h(this.decorators,e),this):(e in this.decorators||(this.decorators[e]=t),this)}derive(e){return e.$elysia="derive",this.onTransform(e)}fn(e){return this.use(async t=>{let{fn:r}=await import("@elysiajs/fn");return r({app:t,value:e,path:t.config.fn})})}schema(e){let t=this.meta[s];return this.$schema={body:a(e.body,t),headers:a(e?.headers,t,!0),params:a(e?.params,t),query:a(e?.query,t),response:a(e?.response,t)},this}compile(){return this.fetch=d(this),this.server&&this.server.reload({...this.server,fetch:this.fetch}),this}handle=async e=>this.fetch(e);fetch=e=>(this.fetch=d(this))(e);handleError=async(e,t,r)=>(this.handleError=u(this))(e,t,r);outerErrorHandler=e=>new Response(e.message,{status:e?.status??500});listen=(e,t)=>{if(!Bun)throw Error("Bun to run");if(this.compile(),"string"==typeof e&&Number.isNaN(e=+e))throw Error("Port must be a numeric value");let r=this.fetch,s=(process.env.ENV??process.env.NODE_ENV)!=="production",o="object"==typeof e?{...this.config.serve,...e,development:s,fetch:r,error:this.outerErrorHandler}:{...this.config.serve,port:e,fetch:r,error:this.outerErrorHandler};if(s){let e=`$$Elysia:${o.port}`;globalThis[e]?(this.server=globalThis[e],this.server.reload(o)):globalThis[e]=this.server=Bun.serve(o)}else this.server=Bun.serve(o);for(let e=0;e<this.event.start.length;e++)this.event.start[e](this);return t&&t(this.server),Promise.all(this.lazyLoadModules).then(()=>{Bun.gc(!0)}),this};stop=async()=>{if(!this.server)throw Error("Elysia isn't running. Call `app.listen` to start the server.");this.server.stop();for(let e=0;e<this.event.stop.length;e++)await this.event.stop[e](this)};get modules(){return Promise.all(this.lazyLoadModules)}model(e,t){return"object"==typeof e?Object.entries(e).forEach(([e,t])=>{e in this.meta[s]||(this.meta[s][e]=t)}):this.meta[s][e]=t,this}}export{t}from"./custom-types";export{ws}from"./ws";export{SCHEMA,DEFS,EXPOSED,getSchemaValidator,mergeDeep,mergeHook,mergeObjectArray,getResponseSchemaValidator}from"./utils";export{ParseError,NotFoundError,ValidationError,InternalServerError}from"./error";export{p as Elysia};
package/dist/types.d.ts CHANGED
@@ -169,7 +169,7 @@ export type LocalHandler<Schema extends TypedSchema, Instance extends ElysiaInst
169
169
  query: Query;
170
170
  headers: Headers;
171
171
  response: Response;
172
- } : any : never, Instance>;
172
+ } : never : never, Instance>;
173
173
  export interface TypedRoute {
174
174
  body?: unknown;
175
175
  headers?: Record<string, unknown>;
@@ -203,7 +203,7 @@ export type HTTPMethod = 'ACL' | 'BIND' | 'CHECKOUT' | 'CONNECT' | 'COPY' | 'DEL
203
203
  export type ErrorCode = (string & {}) | 'NOT_FOUND' | 'INTERNAL_SERVER_ERROR' | 'VALIDATION' | 'PARSE' | 'UNKNOWN';
204
204
  export type ErrorHandler = (params: {
205
205
  request: Request;
206
- code: 'UNKNOWN';
206
+ code: 'UNKNOWN' | (string & {});
207
207
  error: Readonly<Error>;
208
208
  set: Context['set'];
209
209
  } | {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "elysia",
3
3
  "description": "Fast, and friendly Bun web framework",
4
- "version": "0.5.11",
4
+ "version": "0.5.13",
5
5
  "author": {
6
6
  "name": "saltyAom",
7
7
  "url": "https://github.com/SaltyAom",
@@ -116,6 +116,7 @@
116
116
  "openapi-types": "^12.1.0"
117
117
  },
118
118
  "devDependencies": {
119
+ "@elysiajs/cors": "^0.5.0",
119
120
  "@swc/cli": "^0.1.62",
120
121
  "@swc/core": "^1.3.41",
121
122
  "@types/node": "^18.15.5",