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 +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +31 -40
- package/dist/types.d.ts +6 -6
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +13 -10
- package/package.json +1 -1
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<
|
|
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
|
|
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
|
-
|
|
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](
|
|
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
|
-
|
|
319
|
-
|
|
320
|
-
|
|
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
|
-
|
|
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 = (
|
|
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<
|
|
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
|
-
|
|
41
|
+
if (queryIndex)
|
|
42
|
+
url = url.slice(queryIndex);
|
|
43
|
+
else
|
|
44
|
+
url = ';' + url;
|
|
42
45
|
while (true) {
|
|
43
|
-
const sep =
|
|
46
|
+
const sep = url.indexOf('&', 4);
|
|
44
47
|
if (sep === -1) {
|
|
45
|
-
const equal =
|
|
46
|
-
let value =
|
|
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.
|
|
50
|
-
if (value.
|
|
52
|
+
value = value.slice(0, hashIndex);
|
|
53
|
+
if (value.includes('%'))
|
|
51
54
|
value = decodeURI(value);
|
|
52
|
-
query[
|
|
55
|
+
query[url.slice(1, equal)] = value;
|
|
53
56
|
break;
|
|
54
57
|
}
|
|
55
|
-
const path =
|
|
58
|
+
const path = url.slice(0, sep);
|
|
56
59
|
const equal = path.indexOf('=');
|
|
57
60
|
let value = path.slice(equal + 1);
|
|
58
|
-
if (value.
|
|
61
|
+
if (value.includes('%'))
|
|
59
62
|
value = decodeURI(value);
|
|
60
63
|
query[path.slice(1, equal)] = value;
|
|
61
|
-
|
|
64
|
+
url = url.slice(sep);
|
|
62
65
|
}
|
|
63
66
|
return query;
|
|
64
67
|
};
|