elysia 0.7.2 → 0.7.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.
@@ -3,7 +3,7 @@ import type { Serve, Server } from 'bun';
3
3
  import type { Static, TSchema } from '@sinclair/typebox';
4
4
  import type { Context } from './context';
5
5
  import type { WS } from './ws/types';
6
- import type { ElysiaConfig, DecoratorBase, DefinitionBase, RouteBase, Handler, InputSchema, LocalHook, MergeSchema, RouteSchema, UnwrapRoute, InternalRoute, HTTPMethod, VoidHandler, PreHandler, BodyHandler, OptionalHandler, AfterHandler, ErrorHandler, LifeCycleStore, MaybePromise, Prettify, ListenCallback, AddPrefix, AddSuffix, AddPrefixCapitalize, AddSuffixCapitalize, TraceReporter, TraceHandler, MaybeArray } from './types';
6
+ import type { ElysiaConfig, DecoratorBase, DefinitionBase, RouteBase, Handler, InputSchema, LocalHook, MergeSchema, RouteSchema, UnwrapRoute, InternalRoute, HTTPMethod, VoidHandler, PreHandler, BodyHandler, OptionalHandler, AfterHandler, ErrorHandler, LifeCycleStore, MaybePromise, Prettify, ListenCallback, AddPrefix, AddSuffix, AddPrefixCapitalize, AddSuffixCapitalize, TraceReporter, TraceHandler, MaybeArray, GracefulHandler } from './types';
7
7
  /**
8
8
  * ### Elysia Server
9
9
  * Main instance to create web server using Elysia
@@ -57,7 +57,7 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
57
57
  * .listen(8080)
58
58
  * ```
59
59
  */
60
- onStart(handler: MaybeArray<PreHandler<ParentSchema, Decorators>>): this;
60
+ onStart(handler: MaybeArray<GracefulHandler<this, Decorators>>): this;
61
61
  /**
62
62
  * ### request | Life cycle event
63
63
  * Called on every new request is accepted
@@ -337,7 +337,7 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
337
337
  * })
338
338
  * ```
339
339
  */
340
- onStop(handler: VoidHandler<ParentSchema, Decorators>): this;
340
+ onStop(handler: MaybeArray<GracefulHandler<this, Decorators>>): this;
341
341
  /**
342
342
  * ### on
343
343
  * Syntax sugar for attaching life cycle event by name
@@ -424,7 +424,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
424
424
  headers: Route['headers'];
425
425
  response: unknown extends Route['response'] ? {
426
426
  200: ReturnType<Function>;
427
- } : Route['response'];
427
+ } : Route['response'] extends {
428
+ 200: any;
429
+ } ? Route['response'] : {
430
+ 200: Route['response'];
431
+ };
428
432
  };
429
433
  };
430
434
  }>, Scoped>;
@@ -455,7 +459,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
455
459
  headers: Route['headers'];
456
460
  response: unknown extends Route['response'] ? {
457
461
  200: ReturnType<Function>;
458
- } : Route['response'];
462
+ } : Route['response'] extends {
463
+ 200: any;
464
+ } ? Route['response'] : {
465
+ 200: Route['response'];
466
+ };
459
467
  };
460
468
  };
461
469
  }>, Scoped>;
@@ -486,7 +494,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
486
494
  headers: Route['headers'];
487
495
  response: unknown extends Route['response'] ? {
488
496
  200: ReturnType<Function>;
489
- } : Route['response'];
497
+ } : Route['response'] extends {
498
+ 200: any;
499
+ } ? Route['response'] : {
500
+ 200: Route['response'];
501
+ };
490
502
  };
491
503
  };
492
504
  }>, Scoped>;
@@ -517,7 +529,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
517
529
  headers: Route['headers'];
518
530
  response: unknown extends Route['response'] ? {
519
531
  200: ReturnType<Function>;
520
- } : Route['response'];
532
+ } : Route['response'] extends {
533
+ 200: any;
534
+ } ? Route['response'] : {
535
+ 200: Route['response'];
536
+ };
521
537
  };
522
538
  };
523
539
  }>, Scoped>;
@@ -548,7 +564,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
548
564
  headers: Route['headers'];
549
565
  response: unknown extends Route['response'] ? {
550
566
  200: ReturnType<Function>;
551
- } : Route['response'];
567
+ } : Route['response'] extends {
568
+ 200: any;
569
+ } ? Route['response'] : {
570
+ 200: Route['response'];
571
+ };
552
572
  };
553
573
  };
554
574
  }>, Scoped>;
@@ -579,7 +599,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
579
599
  headers: Route['headers'];
580
600
  response: unknown extends Route['response'] ? {
581
601
  200: ReturnType<Function>;
582
- } : Route['response'];
602
+ } : Route['response'] extends {
603
+ 200: any;
604
+ } ? Route['response'] : {
605
+ 200: Route['response'];
606
+ };
583
607
  };
584
608
  };
585
609
  }>, Scoped>;
@@ -605,7 +629,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
605
629
  headers: Route['headers'];
606
630
  response: unknown extends Route['response'] ? {
607
631
  200: ReturnType<Function>;
608
- } : Route['response'];
632
+ } : Route['response'] extends {
633
+ 200: any;
634
+ } ? Route['response'] : {
635
+ 200: Route['response'];
636
+ };
609
637
  };
610
638
  };
611
639
  }>, Scoped>;
@@ -636,7 +664,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
636
664
  headers: Route['headers'];
637
665
  response: unknown extends Route['response'] ? {
638
666
  200: ReturnType<Function>;
639
- } : Route['response'];
667
+ } : Route['response'] extends {
668
+ 200: any;
669
+ } ? Route['response'] : {
670
+ 200: Route['response'];
671
+ };
640
672
  };
641
673
  };
642
674
  }>, Scoped>;
@@ -667,7 +699,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
667
699
  headers: Route['headers'];
668
700
  response: unknown extends Route['response'] ? {
669
701
  200: ReturnType<Function>;
670
- } : Route['response'];
702
+ } : Route['response'] extends {
703
+ 200: any;
704
+ } ? Route['response'] : {
705
+ 200: Route['response'];
706
+ };
671
707
  };
672
708
  };
673
709
  }>, Scoped>;
@@ -736,7 +772,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
736
772
  headers: Headers;
737
773
  response: unknown extends Response ? {
738
774
  200: ReturnType<Function>;
739
- } : Response;
775
+ } : Route['response'] extends {
776
+ 200: any;
777
+ } ? Route['response'] : {
778
+ 200: Route['response'];
779
+ };
740
780
  } : never;
741
781
  };
742
782
  }>, Scoped>;
package/dist/cjs/index.js CHANGED
@@ -127,8 +127,14 @@ class Elysia {
127
127
  if (typeof Bun === 'undefined')
128
128
  throw new Error('.listen() is designed to run on Bun only. If you are running Elysia in other environment please use a dedicated plugin or export the handler via Elysia.fetch');
129
129
  this.server = Bun?.serve(serve);
130
- for (let i = 0; i < this.event.start.length; i++)
131
- this.event.start[i](this);
130
+ if (this.event.start.length) {
131
+ const context = Object.assign(this.decorators, {
132
+ store: this.store,
133
+ app: this
134
+ });
135
+ for (let i = 0; i < this.event.start.length; i++)
136
+ this.event.start[i](context);
137
+ }
132
138
  if (callback)
133
139
  callback(this.server);
134
140
  Promise.all(this.lazyLoadModules).then(() => {
@@ -155,8 +161,14 @@ class Elysia {
155
161
  if (!this.server)
156
162
  throw new Error("Elysia isn't running. Call `app.listen` to start the server.");
157
163
  this.server.stop();
158
- for (let i = 0; i < this.event.stop.length; i++)
159
- await this.event.stop[i](this);
164
+ if (this.event.stop.length) {
165
+ const context = Object.assign(this.decorators, {
166
+ store: this.store,
167
+ app: this
168
+ });
169
+ for (let i = 0; i < this.event.stop.length; i++)
170
+ await this.event.stop[i](context);
171
+ }
160
172
  };
161
173
  this.config = {
162
174
  forceErrorEncapsulation: false,
@@ -7,6 +7,7 @@ import type { EventEmitter } from 'eventemitter3';
7
7
  import type { CookieOptions } from './cookie';
8
8
  import type { Context, PreContext } from './context';
9
9
  import type { InternalServerError, InvalidCookieSignature, NotFoundError, ParseError, ValidationError } from './error';
10
+ import Elysia from '.';
10
11
  export type ElysiaConfig<T extends string = '', Scoped extends boolean = false> = {
11
12
  name?: string;
12
13
  seed?: unknown;
@@ -112,7 +113,7 @@ export type UnwrapGroupGuardRoute<Schema extends InputSchema<any>, Definitions e
112
113
  };
113
114
  export interface LifeCycleStore {
114
115
  type?: ContentType;
115
- start: PreHandler<any, any>[];
116
+ start: GracefulHandler<any, any>[];
116
117
  request: PreHandler<any, any>[];
117
118
  parse: BodyHandler<any, any>[];
118
119
  transform: VoidHandler<any, any>[];
@@ -121,7 +122,7 @@ export interface LifeCycleStore {
121
122
  onResponse: VoidHandler<any, any>[];
122
123
  trace: TraceHandler<any, any>[];
123
124
  error: ErrorHandler<any, any, any>[];
124
- stop: VoidHandler<any, any>[];
125
+ stop: GracefulHandler<any, any>[];
125
126
  }
126
127
  export type LifeCycleEvent = 'start' | 'request' | 'parse' | 'transform' | 'beforeHandle' | 'afterHandle' | 'response' | 'error' | 'stop';
127
128
  export type ContentType = MaybeArray<(string & {}) | 'none' | 'text' | 'json' | 'formdata' | 'urlencoded' | 'arrayBuffer' | 'text/plain' | 'application/json' | 'multipart/form-data' | 'application/x-www-form-urlencoded'>;
@@ -205,6 +206,14 @@ export type PreHandler<Route extends RouteSchema = {}, Decorators extends Decora
205
206
  request: {};
206
207
  store: {};
207
208
  }> = (context: Prettify<PreContext<Route, Decorators>>) => MaybePromise<Route['response'] | void>;
209
+ export type GracefulHandler<Instance extends Elysia<any, any, any, any, any, any>, Decorators extends DecoratorBase = {
210
+ request: {};
211
+ store: {};
212
+ }> = (data: {
213
+ app: Instance;
214
+ } & Prettify<Decorators['request'] & {
215
+ store: Decorators['store'];
216
+ }>) => any;
208
217
  export type ErrorHandler<T extends Record<string, Error> = {}, Route extends RouteSchema = {}, Decorators extends DecoratorBase = {
209
218
  request: {};
210
219
  store: {};
package/dist/cjs/utils.js CHANGED
@@ -4,10 +4,13 @@ exports.StatusMap = exports.filterGlobalHook = exports.asGlobal = exports.asGlob
4
4
  const typebox_1 = require("@sinclair/typebox");
5
5
  const value_1 = require("@sinclair/typebox/value");
6
6
  const compiler_1 = require("@sinclair/typebox/compiler");
7
+ const handler_1 = require("./handler");
7
8
  const isObject = (item) => item && typeof item === 'object' && !Array.isArray(item);
8
9
  const isClass = (v) => (typeof v === 'function' && /^\s*class\s+/.test(v.toString())) ||
9
10
  // Handle import * as Sentry from '@sentry/bun'
10
- v.toString() === '[object Module]';
11
+ v.toString() === '[object Module]' ||
12
+ // If object prototype is not pure, then probably a class-like object
13
+ (0, handler_1.isNotEmpty)(Object.getPrototypeOf(v));
11
14
  const mergeDeep = (target, source, { skipKeys } = {}) => {
12
15
  if (isObject(target) && isObject(source))
13
16
  for (const [key, value] of Object.entries(source)) {
@@ -25,7 +28,6 @@ const mergeDeep = (target, source, { skipKeys } = {}) => {
25
28
  target[key] = value;
26
29
  continue;
27
30
  }
28
- console.log("B");
29
31
  target[key] = (0, exports.mergeDeep)(target[key], value);
30
32
  }
31
33
  return target;
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ import type { Serve, Server } from 'bun';
3
3
  import type { Static, TSchema } from '@sinclair/typebox';
4
4
  import type { Context } from './context';
5
5
  import type { WS } from './ws/types';
6
- import type { ElysiaConfig, DecoratorBase, DefinitionBase, RouteBase, Handler, InputSchema, LocalHook, MergeSchema, RouteSchema, UnwrapRoute, InternalRoute, HTTPMethod, VoidHandler, PreHandler, BodyHandler, OptionalHandler, AfterHandler, ErrorHandler, LifeCycleStore, MaybePromise, Prettify, ListenCallback, AddPrefix, AddSuffix, AddPrefixCapitalize, AddSuffixCapitalize, TraceReporter, TraceHandler, MaybeArray } from './types';
6
+ import type { ElysiaConfig, DecoratorBase, DefinitionBase, RouteBase, Handler, InputSchema, LocalHook, MergeSchema, RouteSchema, UnwrapRoute, InternalRoute, HTTPMethod, VoidHandler, PreHandler, BodyHandler, OptionalHandler, AfterHandler, ErrorHandler, LifeCycleStore, MaybePromise, Prettify, ListenCallback, AddPrefix, AddSuffix, AddPrefixCapitalize, AddSuffixCapitalize, TraceReporter, TraceHandler, MaybeArray, GracefulHandler } from './types';
7
7
  /**
8
8
  * ### Elysia Server
9
9
  * Main instance to create web server using Elysia
@@ -57,7 +57,7 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
57
57
  * .listen(8080)
58
58
  * ```
59
59
  */
60
- onStart(handler: MaybeArray<PreHandler<ParentSchema, Decorators>>): this;
60
+ onStart(handler: MaybeArray<GracefulHandler<this, Decorators>>): this;
61
61
  /**
62
62
  * ### request | Life cycle event
63
63
  * Called on every new request is accepted
@@ -337,7 +337,7 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
337
337
  * })
338
338
  * ```
339
339
  */
340
- onStop(handler: VoidHandler<ParentSchema, Decorators>): this;
340
+ onStop(handler: MaybeArray<GracefulHandler<this, Decorators>>): this;
341
341
  /**
342
342
  * ### on
343
343
  * Syntax sugar for attaching life cycle event by name
@@ -424,7 +424,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
424
424
  headers: Route['headers'];
425
425
  response: unknown extends Route['response'] ? {
426
426
  200: ReturnType<Function>;
427
- } : Route['response'];
427
+ } : Route['response'] extends {
428
+ 200: any;
429
+ } ? Route['response'] : {
430
+ 200: Route['response'];
431
+ };
428
432
  };
429
433
  };
430
434
  }>, Scoped>;
@@ -455,7 +459,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
455
459
  headers: Route['headers'];
456
460
  response: unknown extends Route['response'] ? {
457
461
  200: ReturnType<Function>;
458
- } : Route['response'];
462
+ } : Route['response'] extends {
463
+ 200: any;
464
+ } ? Route['response'] : {
465
+ 200: Route['response'];
466
+ };
459
467
  };
460
468
  };
461
469
  }>, Scoped>;
@@ -486,7 +494,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
486
494
  headers: Route['headers'];
487
495
  response: unknown extends Route['response'] ? {
488
496
  200: ReturnType<Function>;
489
- } : Route['response'];
497
+ } : Route['response'] extends {
498
+ 200: any;
499
+ } ? Route['response'] : {
500
+ 200: Route['response'];
501
+ };
490
502
  };
491
503
  };
492
504
  }>, Scoped>;
@@ -517,7 +529,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
517
529
  headers: Route['headers'];
518
530
  response: unknown extends Route['response'] ? {
519
531
  200: ReturnType<Function>;
520
- } : Route['response'];
532
+ } : Route['response'] extends {
533
+ 200: any;
534
+ } ? Route['response'] : {
535
+ 200: Route['response'];
536
+ };
521
537
  };
522
538
  };
523
539
  }>, Scoped>;
@@ -548,7 +564,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
548
564
  headers: Route['headers'];
549
565
  response: unknown extends Route['response'] ? {
550
566
  200: ReturnType<Function>;
551
- } : Route['response'];
567
+ } : Route['response'] extends {
568
+ 200: any;
569
+ } ? Route['response'] : {
570
+ 200: Route['response'];
571
+ };
552
572
  };
553
573
  };
554
574
  }>, Scoped>;
@@ -579,7 +599,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
579
599
  headers: Route['headers'];
580
600
  response: unknown extends Route['response'] ? {
581
601
  200: ReturnType<Function>;
582
- } : Route['response'];
602
+ } : Route['response'] extends {
603
+ 200: any;
604
+ } ? Route['response'] : {
605
+ 200: Route['response'];
606
+ };
583
607
  };
584
608
  };
585
609
  }>, Scoped>;
@@ -605,7 +629,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
605
629
  headers: Route['headers'];
606
630
  response: unknown extends Route['response'] ? {
607
631
  200: ReturnType<Function>;
608
- } : Route['response'];
632
+ } : Route['response'] extends {
633
+ 200: any;
634
+ } ? Route['response'] : {
635
+ 200: Route['response'];
636
+ };
609
637
  };
610
638
  };
611
639
  }>, Scoped>;
@@ -636,7 +664,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
636
664
  headers: Route['headers'];
637
665
  response: unknown extends Route['response'] ? {
638
666
  200: ReturnType<Function>;
639
- } : Route['response'];
667
+ } : Route['response'] extends {
668
+ 200: any;
669
+ } ? Route['response'] : {
670
+ 200: Route['response'];
671
+ };
640
672
  };
641
673
  };
642
674
  }>, Scoped>;
@@ -667,7 +699,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
667
699
  headers: Route['headers'];
668
700
  response: unknown extends Route['response'] ? {
669
701
  200: ReturnType<Function>;
670
- } : Route['response'];
702
+ } : Route['response'] extends {
703
+ 200: any;
704
+ } ? Route['response'] : {
705
+ 200: Route['response'];
706
+ };
671
707
  };
672
708
  };
673
709
  }>, Scoped>;
@@ -736,7 +772,11 @@ export default class Elysia<BasePath extends string = '', Decorators extends Dec
736
772
  headers: Headers;
737
773
  response: unknown extends Response ? {
738
774
  200: ReturnType<Function>;
739
- } : Response;
775
+ } : Route['response'] extends {
776
+ 200: any;
777
+ } ? Route['response'] : {
778
+ 200: Route['response'];
779
+ };
740
780
  } : never;
741
781
  };
742
782
  }>, Scoped>;
package/dist/index.js CHANGED
@@ -472,7 +472,7 @@ e.$elysia="derive",this.onTransform(e))}affix(e,t,r){if(""===r)return this;let s
472
472
  * .get("/", () => 'hi')
473
473
  * .listen(8080)
474
474
  * ```
475
- */listen=(e,t)=>{if(!Bun)throw Error("Bun to run");if(this.compile(),"string"==typeof e&&Number.isNaN(e=+e.trim()))throw Error("Port must be a numeric value");let r=this.fetch,s="object"==typeof e?{development:!k,...this.config.serve,...e,websocket:{...this.config.websocket,...i},fetch:r,error:this.outerErrorHandler}:{development:!k,...this.config.serve,websocket:{...this.config.websocket,...i},port:e,fetch:r,error:this.outerErrorHandler};if("undefined"==typeof Bun)throw Error(".listen() is designed to run on Bun only. If you are running Elysia in other environment please use a dedicated plugin or export the handler via Elysia.fetch");this.server=Bun?.serve(s);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(!1)}),this};/**
475
+ */listen=(e,t)=>{if(!Bun)throw Error("Bun to run");if(this.compile(),"string"==typeof e&&Number.isNaN(e=+e.trim()))throw Error("Port must be a numeric value");let r=this.fetch,s="object"==typeof e?{development:!k,...this.config.serve,...e,websocket:{...this.config.websocket,...i},fetch:r,error:this.outerErrorHandler}:{development:!k,...this.config.serve,websocket:{...this.config.websocket,...i},port:e,fetch:r,error:this.outerErrorHandler};if("undefined"==typeof Bun)throw Error(".listen() is designed to run on Bun only. If you are running Elysia in other environment please use a dedicated plugin or export the handler via Elysia.fetch");if(this.server=Bun?.serve(s),this.event.start.length){let e=Object.assign(this.decorators,{store:this.store,app:this});for(let t=0;t<this.event.start.length;t++)this.event.start[t](e)}return t&&t(this.server),Promise.all(this.lazyLoadModules).then(()=>{Bun?.gc(!1)}),this};/**
476
476
  * ### stop
477
477
  * Stop server from serving
478
478
  *
@@ -486,6 +486,6 @@ e.$elysia="derive",this.onTransform(e))}affix(e,t,r){if(""===r)return this;let s
486
486
  * // Sometime later
487
487
  * app.stop()
488
488
  * ```
489
- */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)};/**
489
+ */stop=async()=>{if(!this.server)throw Error("Elysia isn't running. Call `app.listen` to start the server.");if(this.server.stop(),this.event.stop.length){let e=Object.assign(this.decorators,{store:this.store,app:this});for(let t=0;t<this.event.stop.length;t++)await this.event.stop[t](e)}};/**
490
490
  * Wait until all lazy loaded modules all load is fully
491
491
  */get modules(){return Promise.all(this.lazyLoadModules)}}export{mapResponse,mapCompactResponse,mapEarlyResponse}from"./handler";export{t}from"./custom-types";export{Cookie}from"./cookie";export{getSchemaValidator,mergeDeep,mergeHook,mergeObjectArray,getResponseSchemaValidator}from"./utils";export{ParseError,NotFoundError,ValidationError,InternalServerError,InvalidCookieSignature}from"./error";export{E as Elysia};
package/dist/types.d.ts CHANGED
@@ -7,6 +7,7 @@ import type { EventEmitter } from 'eventemitter3';
7
7
  import type { CookieOptions } from './cookie';
8
8
  import type { Context, PreContext } from './context';
9
9
  import type { InternalServerError, InvalidCookieSignature, NotFoundError, ParseError, ValidationError } from './error';
10
+ import Elysia from '.';
10
11
  export type ElysiaConfig<T extends string = '', Scoped extends boolean = false> = {
11
12
  name?: string;
12
13
  seed?: unknown;
@@ -112,7 +113,7 @@ export type UnwrapGroupGuardRoute<Schema extends InputSchema<any>, Definitions e
112
113
  };
113
114
  export interface LifeCycleStore {
114
115
  type?: ContentType;
115
- start: PreHandler<any, any>[];
116
+ start: GracefulHandler<any, any>[];
116
117
  request: PreHandler<any, any>[];
117
118
  parse: BodyHandler<any, any>[];
118
119
  transform: VoidHandler<any, any>[];
@@ -121,7 +122,7 @@ export interface LifeCycleStore {
121
122
  onResponse: VoidHandler<any, any>[];
122
123
  trace: TraceHandler<any, any>[];
123
124
  error: ErrorHandler<any, any, any>[];
124
- stop: VoidHandler<any, any>[];
125
+ stop: GracefulHandler<any, any>[];
125
126
  }
126
127
  export type LifeCycleEvent = 'start' | 'request' | 'parse' | 'transform' | 'beforeHandle' | 'afterHandle' | 'response' | 'error' | 'stop';
127
128
  export type ContentType = MaybeArray<(string & {}) | 'none' | 'text' | 'json' | 'formdata' | 'urlencoded' | 'arrayBuffer' | 'text/plain' | 'application/json' | 'multipart/form-data' | 'application/x-www-form-urlencoded'>;
@@ -205,6 +206,14 @@ export type PreHandler<Route extends RouteSchema = {}, Decorators extends Decora
205
206
  request: {};
206
207
  store: {};
207
208
  }> = (context: Prettify<PreContext<Route, Decorators>>) => MaybePromise<Route['response'] | void>;
209
+ export type GracefulHandler<Instance extends Elysia<any, any, any, any, any, any>, Decorators extends DecoratorBase = {
210
+ request: {};
211
+ store: {};
212
+ }> = (data: {
213
+ app: Instance;
214
+ } & Prettify<Decorators['request'] & {
215
+ store: Decorators['store'];
216
+ }>) => any;
208
217
  export type ErrorHandler<T extends Record<string, Error> = {}, Route extends RouteSchema = {}, Decorators extends DecoratorBase = {
209
218
  request: {};
210
219
  store: {};
package/dist/utils.js CHANGED
@@ -1,5 +1,6 @@
1
- import{Kind as e}from"@sinclair/typebox";import{Value as r}from"@sinclair/typebox/value";import{TypeCompiler as t}from"@sinclair/typebox/compiler";let o=e=>e&&"object"==typeof e&&!Array.isArray(e),a=e=>"function"==typeof e&&/^\s*class\s+/.test(e.toString())||// Handle import * as Sentry from '@sentry/bun'
2
- "[object Module]"===e.toString();export const mergeDeep=(e,r,{skipKeys:t}={})=>{if(o(e)&&o(r)){for(let[n,s]of Object.entries(r))if(!t?.includes(n)){if(!o(s)||!(n in e)||a(s)){e[n]=s;continue}console.log("B"),e[n]=mergeDeep(e[n],s)}}return e};export const mergeCookie=(e,r)=>mergeDeep(e,r,{skipKeys:["properties"]});export const mergeObjectArray=(e,r)=>{// ! Must copy to remove side-effect
1
+ import{Kind as e}from"@sinclair/typebox";import{Value as r}from"@sinclair/typebox/value";import{TypeCompiler as t}from"@sinclair/typebox/compiler";import{isNotEmpty as o}from"./handler";let a=e=>e&&"object"==typeof e&&!Array.isArray(e),n=e=>"function"==typeof e&&/^\s*class\s+/.test(e.toString())||// Handle import * as Sentry from '@sentry/bun'
2
+ "[object Module]"===e.toString()||// If object prototype is not pure, then probably a class-like object
3
+ o(Object.getPrototypeOf(e));export const mergeDeep=(e,r,{skipKeys:t}={})=>{if(a(e)&&a(r)){for(let[o,s]of Object.entries(r))if(!t?.includes(o)){if(!a(s)||!(o in e)||n(s)){e[o]=s;continue}e[o]=mergeDeep(e[o],s)}}return e};export const mergeCookie=(e,r)=>mergeDeep(e,r,{skipKeys:["properties"]});export const mergeObjectArray=(e,r)=>{// ! Must copy to remove side-effect
3
4
  let t=[...Array.isArray(e)?e:[e]],o=[];for(let e of t)// @ts-ignore
4
5
  e.$elysiaChecksum&&// @ts-ignore
5
6
  o.push(e.$elysiaChecksum);for(let e of Array.isArray(r)?r:[r])// @ts-ignore
@@ -18,5 +19,5 @@ export const checksum=e=>{let r=9;for(let t=0;t<e.length;)r=Math.imul(r^e.charCo
18
19
  (e.$elysiaChecksum=t),e);return{start:mergeObjectArray(e.start,("start"in r?r.start??[]:[]).map(o)),request:mergeObjectArray(e.request,("request"in r?r.request??[]:[]).map(o)),parse:mergeObjectArray(e.parse,"parse"in r?r?.parse??[]:(void 0)??[]).map(o),transform:mergeObjectArray(e.transform,(r?.transform??[]).map(o)),beforeHandle:mergeObjectArray(e.beforeHandle,(r?.beforeHandle??[]).map(o)),afterHandle:mergeObjectArray(e.afterHandle,(r?.afterHandle??[]).map(o)),onResponse:mergeObjectArray(e.onResponse,(r?.onResponse??[]).map(o)),trace:mergeObjectArray(e.trace,("trace"in r?r.trace??[]:[]).map(o)),error:mergeObjectArray(e.error,(r?.error??[]).map(o)),stop:mergeObjectArray(e.stop,("stop"in r?r.stop??[]:[]).map(o))}};export const asGlobalHook=(e,r=!0)=>({// rest is validator
19
20
  ...e,type:e?.type,detail:e?.detail,parse:asGlobal(e?.parse,r),transform:asGlobal(e?.transform,r),beforeHandle:asGlobal(e?.beforeHandle,r),afterHandle:asGlobal(e?.afterHandle,r),onResponse:asGlobal(e?.onResponse,r),error:asGlobal(e?.error,r)});export const asGlobal=(e,r=!0)=>e?"function"==typeof e?(r?// @ts-ignore
20
21
  e.$elysiaHookType="global":e.$elysiaHookType=void 0,e):e.map(e=>(r?// @ts-ignore
21
- e.$elysiaHookType="global":e.$elysiaHookType=void 0,e)):e;let n=e=>e?"function"==typeof e?"global"===e.$elysiaHookType?e:void 0:e.filter(e=>"global"===e.$elysiaHookType):e;export const filterGlobalHook=e=>({// rest is validator
22
- ...e,type:e?.type,detail:e?.detail,parse:n(e?.parse),transform:n(e?.transform),beforeHandle:n(e?.beforeHandle),afterHandle:n(e?.afterHandle),onResponse:n(e?.onResponse),error:n(e?.error)});export const StatusMap={Continue:100,"Switching Protocols":101,Processing:102,"Early Hints":103,OK:200,Created:201,Accepted:202,"Non-Authoritative Information":203,"No Content":204,"Reset Content":205,"Partial Content":206,"Multi-Status":207,"Already Reported":208,"Multiple Choices":300,"Moved Permanently":301,Found:302,"See Other":303,"Not Modified":304,"Temporary Redirect":307,"Permanent Redirect":308,"Bad Request":400,Unauthorized:401,"Payment Required":402,Forbidden:403,"Not Found":404,"Method Not Allowed":405,"Not Acceptable":406,"Proxy Authentication Required":407,"Request Timeout":408,Conflict:409,Gone:410,"Length Required":411,"Precondition Failed":412,"Payload Too Large":413,"URI Too Long":414,"Unsupported Media Type":415,"Range Not Satisfiable":416,"Expectation Failed":417,"I'm a teapot":418,"Misdirected Request":421,"Unprocessable Content":422,Locked:423,"Failed Dependency":424,"Too Early":425,"Upgrade Required":426,"Precondition Required":428,"Too Many Requests":429,"Request Header Fields Too Large":431,"Unavailable For Legal Reasons":451,"Internal Server Error":500,"Not Implemented":501,"Bad Gateway":502,"Service Unavailable":503,"Gateway Timeout":504,"HTTP Version Not Supported":505,"Variant Also Negotiates":506,"Insufficient Storage":507,"Loop Detected":508,"Not Extended":510,"Network Authentication Required":511};
22
+ e.$elysiaHookType="global":e.$elysiaHookType=void 0,e)):e;let s=e=>e?"function"==typeof e?"global"===e.$elysiaHookType?e:void 0:e.filter(e=>"global"===e.$elysiaHookType):e;export const filterGlobalHook=e=>({// rest is validator
23
+ ...e,type:e?.type,detail:e?.detail,parse:s(e?.parse),transform:s(e?.transform),beforeHandle:s(e?.beforeHandle),afterHandle:s(e?.afterHandle),onResponse:s(e?.onResponse),error:s(e?.error)});export const StatusMap={Continue:100,"Switching Protocols":101,Processing:102,"Early Hints":103,OK:200,Created:201,Accepted:202,"Non-Authoritative Information":203,"No Content":204,"Reset Content":205,"Partial Content":206,"Multi-Status":207,"Already Reported":208,"Multiple Choices":300,"Moved Permanently":301,Found:302,"See Other":303,"Not Modified":304,"Temporary Redirect":307,"Permanent Redirect":308,"Bad Request":400,Unauthorized:401,"Payment Required":402,Forbidden:403,"Not Found":404,"Method Not Allowed":405,"Not Acceptable":406,"Proxy Authentication Required":407,"Request Timeout":408,Conflict:409,Gone:410,"Length Required":411,"Precondition Failed":412,"Payload Too Large":413,"URI Too Long":414,"Unsupported Media Type":415,"Range Not Satisfiable":416,"Expectation Failed":417,"I'm a teapot":418,"Misdirected Request":421,"Unprocessable Content":422,Locked:423,"Failed Dependency":424,"Too Early":425,"Upgrade Required":426,"Precondition Required":428,"Too Many Requests":429,"Request Header Fields Too Large":431,"Unavailable For Legal Reasons":451,"Internal Server Error":500,"Not Implemented":501,"Bad Gateway":502,"Service Unavailable":503,"Gateway Timeout":504,"HTTP Version Not Supported":505,"Variant Also Negotiates":506,"Insufficient Storage":507,"Loop Detected":508,"Not Extended":510,"Network Authentication Required":511};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "elysia",
3
3
  "description": "Ergonomic Framework for Human",
4
- "version": "0.7.2",
4
+ "version": "0.7.4",
5
5
  "author": {
6
6
  "name": "saltyAom",
7
7
  "url": "https://github.com/SaltyAom",