elysia 0.2.0-beta.0 → 0.2.0-beta.1

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/context.d.ts CHANGED
@@ -13,4 +13,4 @@ export interface Context<Route extends TypedRoute = TypedRoute, Store extends El
13
13
  redirect?: string;
14
14
  };
15
15
  }
16
- export type PreContext<Store extends Elysia['store'] = Elysia['store']> = Omit<Context<{}, Store>, 'query' | 'params' | 'body'>;
16
+ export type PreContext<Route extends TypedRoute = TypedRoute, Store extends Elysia['store'] = Elysia['store']> = Omit<Context<Route, Store>, 'query' | 'params' | 'body'>;
package/dist/index.d.ts CHANGED
@@ -17,8 +17,8 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
17
17
  constructor(config?: Partial<ElysiaConfig>);
18
18
  private _addHandler;
19
19
  onStart(handler: VoidLifeCycle<Instance>): this;
20
- onRequest(handler: BeforeRequestHandler<Instance['store']>): this;
21
- onParse(parser: BodyParser): this;
20
+ onRequest<Route extends OverwritableTypeRoute = TypedRoute>(handler: BeforeRequestHandler<Route, Instance>): this;
21
+ onParse(parser: BodyParser<any, Instance>): this;
22
22
  onTransform<Route extends OverwritableTypeRoute = TypedRoute>(handler: NoReturnHandler<Route, Instance>): this;
23
23
  onBeforeHandle<Route extends OverwritableTypeRoute = TypedRoute>(handler: Handler<Route, Instance>): this;
24
24
  onAfterHandle<Route extends OverwritableTypeRoute = TypedRoute>(handler: AfterRequestHandler<Route, Instance>): this;
package/dist/index.js CHANGED
@@ -268,14 +268,24 @@ export default class Elysia {
268
268
  status: 200,
269
269
  headers: {}
270
270
  };
271
+ let context;
272
+ if (this.decorators) {
273
+ context = clone(this.decorators);
274
+ context.request = request;
275
+ context.set = set;
276
+ context.store = this.store;
277
+ }
278
+ else {
279
+ context = {
280
+ set,
281
+ store: this.store,
282
+ request
283
+ };
284
+ }
271
285
  try {
272
286
  for (let i = 0; i < this.event.request.length; i++) {
273
287
  const onRequest = this.event.request[i];
274
- let response = onRequest({
275
- request,
276
- store: this.store,
277
- set
278
- });
288
+ let response = onRequest(context);
279
289
  if (response instanceof Promise)
280
290
  response = await response;
281
291
  response = mapEarlyResponse(response, set);
@@ -291,12 +301,16 @@ export default class Elysia {
291
301
  this.fallbackRoute[request.method];
292
302
  if (!handler)
293
303
  throw new Error('NOT_FOUND');
304
+ const hooks = handler.hooks;
294
305
  let body;
295
306
  if (request.method !== 'GET') {
296
- const contentType = request.headers.get('content-type');
307
+ let contentType = request.headers.get('content-type');
297
308
  if (contentType) {
309
+ const index = contentType.indexOf(';');
310
+ if (index !== -1)
311
+ contentType = contentType.slice(0, index);
298
312
  for (let i = 0; i < this.event.parse.length; i++) {
299
- let temp = this.event.parse[i](request, contentType);
313
+ let temp = this.event.parse[i](context, contentType);
300
314
  if (temp instanceof Promise)
301
315
  temp = await temp;
302
316
  if (temp) {
@@ -304,7 +318,7 @@ export default class Elysia {
304
318
  break;
305
319
  }
306
320
  }
307
- if (body === undefined)
321
+ if (body === undefined) {
308
322
  switch (contentType) {
309
323
  case 'application/json':
310
324
  body = await request.json();
@@ -312,29 +326,16 @@ export default class Elysia {
312
326
  case 'text/plain':
313
327
  body = await request.text();
314
328
  break;
329
+ case 'application/x-www-form-urlencoded':
330
+ body = mapQuery(await request.text(), null);
331
+ break;
315
332
  }
333
+ }
316
334
  }
317
335
  }
318
- const hooks = handler.hooks;
319
- let context;
320
- if (this.decorators) {
321
- context = clone(this.decorators);
322
- context.request = request;
323
- context.body = body;
324
- context.set = set;
325
- context.store = this.store;
326
- context.params = route?.params || {};
327
- context.query = mapQuery(request.url, index);
328
- }
329
- else
330
- context = {
331
- request,
332
- body,
333
- set,
334
- store: this.store,
335
- params: route?.params || {},
336
- query: mapQuery(request.url, index)
337
- };
336
+ context.body = body;
337
+ context.params = route?.params || {};
338
+ context.query = mapQuery(request.url, index);
338
339
  for (let i = 0; i < hooks.transform.length; i++) {
339
340
  const operation = hooks.transform[i](context);
340
341
  if (operation instanceof Promise)
@@ -376,18 +377,8 @@ export default class Elysia {
376
377
  let response = handler.handle(context);
377
378
  if (response instanceof Promise)
378
379
  response = await response;
379
- if (handler.validator?.response)
380
- if (response instanceof Response) {
381
- let res;
382
- if (handler.validator.response.schema.type === 'object')
383
- res = await response.clone().json();
384
- else
385
- res = await response.clone().text();
386
- if (handler.validator.response.Check(res) === false)
387
- throw createValidationError('response', handler.validator.response, response);
388
- }
389
- else if (handler.validator.response.Check(response) === false)
390
- throw createValidationError('response', handler.validator.response, response);
380
+ if (handler.validator?.response?.Check(response) === false)
381
+ throw createValidationError('response', handler.validator.response, response);
391
382
  for (let i = 0; i < hooks.afterHandle.length; i++) {
392
383
  let newResponse = hooks.afterHandle[i](context, response);
393
384
  if (newResponse instanceof Promise)
package/dist/types.d.ts CHANGED
@@ -24,11 +24,11 @@ export type NoReturnHandler<Route extends TypedRoute = TypedRoute, Instance exte
24
24
  export type LifeCycleEvent = 'start' | 'request' | 'parse' | 'transform' | 'beforeHandle' | 'afterHandle' | 'error' | 'stop';
25
25
  export type ListenCallback = ((server: Server) => void) | ((server: Server) => Promise<void>);
26
26
  export type VoidLifeCycle<Instance extends ElysiaInstance = ElysiaInstance> = ((app: Elysia<Instance>) => void) | ((app: Elysia<Instance>) => Promise<void>);
27
- export type BodyParser = (request: Request, contentType: string) => any | Promise<any>;
27
+ export type BodyParser<Route extends TypedRoute = TypedRoute, Instance extends ElysiaInstance = ElysiaInstance> = (context: PreContext<Route, Instance['store']> & Instance['request'], contentType: string) => any | Promise<any>;
28
28
  export interface LifeCycle<Instance extends ElysiaInstance = ElysiaInstance> {
29
29
  start: VoidLifeCycle<Instance>;
30
- request: BeforeRequestHandler;
31
- parse: BodyParser;
30
+ request: BeforeRequestHandler<any, Instance>;
31
+ parse: BodyParser<any, Instance>;
32
32
  transform: NoReturnHandler<any, Instance>;
33
33
  beforeHandle: Handler<any, Instance>;
34
34
  afterHandle: AfterRequestHandler<any, Instance>;
@@ -38,15 +38,15 @@ export interface LifeCycle<Instance extends ElysiaInstance = ElysiaInstance> {
38
38
  export type AfterRequestHandler<Route extends TypedRoute = TypedRoute, Instance extends ElysiaInstance = ElysiaInstance> = (context: Context<Route, Instance['store']> & Instance['request'], response: Route['response']) => Route['response'] | Promise<Route['response']> | Response;
39
39
  export interface LifeCycleStore<Instance extends ElysiaInstance = ElysiaInstance> {
40
40
  start: VoidLifeCycle<Instance>[];
41
- request: BeforeRequestHandler[];
42
- parse: BodyParser[];
41
+ request: BeforeRequestHandler<any, Instance>[];
42
+ parse: BodyParser<any, Instance>[];
43
43
  transform: NoReturnHandler<any, Instance>[];
44
44
  beforeHandle: Handler<any, Instance>[];
45
45
  afterHandle: AfterRequestHandler<any, Instance>[];
46
46
  error: ErrorHandler[];
47
47
  stop: VoidLifeCycle<Instance>[];
48
48
  }
49
- export type BeforeRequestHandler<Store extends ElysiaInstance['store'] = ElysiaInstance['store']> = (context: PreContext<Store>) => any;
49
+ export type BeforeRequestHandler<Route extends TypedRoute = TypedRoute, Instance extends ElysiaInstance = ElysiaInstance> = (context: PreContext<Route, Instance['store']> & Instance['request']) => any;
50
50
  export interface RegisteredHook<Instance extends ElysiaInstance = ElysiaInstance> {
51
51
  schema?: TypedSchema;
52
52
  transform: NoReturnHandler<any, Instance>[];
package/dist/utils.d.ts CHANGED
@@ -6,7 +6,7 @@ export declare const mergeObjectArray: <T>(a: T | T[], b: T | T[]) => T[];
6
6
  export declare const mergeHook: (a: LocalHook<any> | LifeCycleStore<any>, b: LocalHook<any>) => RegisteredHook<any>;
7
7
  export declare const clone: <T extends Object | any[] = Object | any[]>(value: T) => T;
8
8
  export declare const getPath: (url: string, queryIndex?: number) => string;
9
- export declare const mapQuery: (url: string, queryIndex?: number) => Record<string, string>;
9
+ export declare const mapQuery: (url: string, queryIndex?: number | null) => Record<string, string>;
10
10
  export declare const mergeDeep: <A extends Object = Object, B extends Object = Object>(target: A, source: B) => DeepMergeTwoTypes<A, B>;
11
11
  export declare const createValidationError: (type: string, validator: TypeCheck<any>, value: any) => Error;
12
12
  export declare const getSchemaValidator: <Schema extends TSchema | undefined = undefined>(schema: Schema, additionalProperties?: boolean) => TypeCheck<NonNullable<Schema>> | undefined;
package/dist/utils.js CHANGED
@@ -38,27 +38,30 @@ export const mapQuery = (url, queryIndex = url.indexOf('?')) => {
38
38
  if (queryIndex === -1)
39
39
  return {};
40
40
  const query = {};
41
- let paths = url.slice(queryIndex);
41
+ if (queryIndex)
42
+ url = url.slice(queryIndex);
43
+ else
44
+ url = ';' + url;
42
45
  while (true) {
43
- const sep = paths.indexOf('&', 4);
46
+ const sep = url.indexOf('&', 4);
44
47
  if (sep === -1) {
45
- const equal = paths.indexOf('=');
46
- let value = paths.slice(equal + 1);
48
+ const equal = url.indexOf('=');
49
+ let value = url.slice(equal + 1);
47
50
  const hashIndex = value.indexOf('#');
48
51
  if (hashIndex !== -1)
49
- value = value.substring(0, hashIndex);
50
- if (value.indexOf('%') !== -1)
52
+ value = value.slice(0, hashIndex);
53
+ if (value.includes('%'))
51
54
  value = decodeURI(value);
52
- query[paths.slice(1, equal)] = decodeURI(value);
55
+ query[url.slice(1, equal)] = value;
53
56
  break;
54
57
  }
55
- const path = paths.slice(0, sep);
58
+ const path = url.slice(0, sep);
56
59
  const equal = path.indexOf('=');
57
60
  let value = path.slice(equal + 1);
58
- if (value.indexOf('%') !== -1)
61
+ if (value.includes('%'))
59
62
  value = decodeURI(value);
60
63
  query[path.slice(1, equal)] = value;
61
- paths = paths.slice(sep);
64
+ url = url.slice(sep);
62
65
  }
63
66
  return query;
64
67
  };
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.2.0-beta.0",
4
+ "version": "0.2.0-beta.1",
5
5
  "author": {
6
6
  "name": "saltyAom",
7
7
  "url": "https://github.com/SaltyAom",