elysia 0.5.15 → 0.5.17

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.
@@ -103,13 +103,29 @@ const findElysiaMeta = (type, schema, found = [], parent = '') => {
103
103
  return null;
104
104
  };
105
105
  exports.findElysiaMeta = findElysiaMeta;
106
+ const getUnionedType = (validator) => {
107
+ if (!validator)
108
+ return;
109
+ const schema = validator?.schema;
110
+ if (schema && 'anyOf' in schema) {
111
+ let foundDifference = false;
112
+ const type = schema.anyOf[0].type;
113
+ for (const validator of schema.anyOf) {
114
+ if (validator.type !== type) {
115
+ foundDifference = true;
116
+ break;
117
+ }
118
+ }
119
+ if (!foundDifference)
120
+ return type;
121
+ }
122
+ };
106
123
  const composeHandler = ({ method, hooks, validator, handler, handleError, meta, onRequest, config }) => {
107
124
  const hasErrorHandler = config.forceErrorEncapsulation ||
108
125
  hooks.error.length > 0 ||
109
126
  typeof Bun === 'undefined';
110
127
  const { composeValidation, composeResponseValidation } = composeValidationFactory(hasErrorHandler);
111
128
  let fnLiteral = hasErrorHandler ? 'try {\n' : '';
112
- const hasStrictContentType = typeof hooks.type === 'string';
113
129
  const lifeCycleLiteral = validator || method !== 'GET'
114
130
  ? [
115
131
  handler,
@@ -121,7 +137,7 @@ const composeHandler = ({ method, hooks, validator, handler, handleError, meta,
121
137
  const hasBody = method !== 'GET' &&
122
138
  hooks.type !== 'none' &&
123
139
  (validator.body ||
124
- hasStrictContentType ||
140
+ hooks.type ||
125
141
  lifeCycleLiteral.some((fn) => (0, exports.isFnUse)('body', fn)));
126
142
  const hasHeaders = validator.headers ||
127
143
  lifeCycleLiteral.some((fn) => (0, exports.isFnUse)('headers', fn));
@@ -153,73 +169,9 @@ const composeHandler = ({ method, hooks, validator, handler, handleError, meta,
153
169
  hooks.beforeHandle.find(isAsync) ||
154
170
  hooks.transform.find(isAsync);
155
171
  if (hasBody) {
156
- let schema = validator?.body?.schema;
157
- if (schema && 'anyOf' in schema) {
158
- let foundDifference = false;
159
- const model = schema.anyOf[0].type;
160
- for (const validator of schema.anyOf) {
161
- if (validator.type !== model) {
162
- foundDifference = true;
163
- break;
164
- }
165
- }
166
- if (foundDifference) {
167
- schema = undefined;
168
- }
169
- }
170
- if (hasStrictContentType || schema) {
171
- if (hooks.parse.length) {
172
- fnLiteral += hasHeaders
173
- ? `let contentType = c.headers['content-type']`
174
- : `let contentType = c.request.headers.get('content-type')`;
175
- fnLiteral += `
176
- if (contentType) {
177
- const index = contentType.indexOf(';')
178
- if (index !== -1) contentType = contentType.substring(0, index)\n`;
179
- fnLiteral += `let used = false\n`;
180
- for (let i = 0; i < hooks.parse.length; i++) {
181
- const name = `bo${i}`;
182
- if (i !== 0)
183
- fnLiteral += `if(!used) {\n`;
184
- fnLiteral += `let ${name} = parse[${i}](c, contentType);`;
185
- fnLiteral += `if(${name} instanceof Promise) ${name} = await ${name};`;
186
- fnLiteral += `
187
- if(${name} !== undefined) { c.body = ${name}; used = true }\n`;
188
- if (i !== 0)
189
- fnLiteral += `}`;
190
- }
191
- fnLiteral += `if (!used) {`;
192
- }
193
- if (schema) {
194
- switch (schema.type) {
195
- case 'object':
196
- if (schema.elysiaMeta === 'URLEncoded') {
197
- fnLiteral += `c.body = parseQuery(await c.request.text())`;
198
- }
199
- else if (validator.body.Code().includes("custom('File"))
200
- fnLiteral += `c.body = {}
201
-
202
- await c.request.formData().then((form) => {
203
- for (const key of form.keys()) {
204
- if (c.body[key])
205
- continue
206
-
207
- const value = form.getAll(key)
208
- if (value.length === 1)
209
- c.body[key] = value[0]
210
- else c.body[key] = value
211
- }
212
- })`;
213
- else {
214
- fnLiteral += `c.body = JSON.parse(await c.request.text())`;
215
- }
216
- break;
217
- default:
218
- fnLiteral += 'c.body = await c.request.text()';
219
- break;
220
- }
221
- }
222
- else {
172
+ const type = getUnionedType(validator?.body);
173
+ if (hooks.type || type) {
174
+ if (hooks.type) {
223
175
  switch (hooks.type) {
224
176
  case 'application/json':
225
177
  fnLiteral += `c.body = JSON.parse(await c.request.text());`;
@@ -236,7 +188,8 @@ const composeHandler = ({ method, hooks, validator, handler, handleError, meta,
236
188
  case 'multipart/form-data':
237
189
  fnLiteral += `c.body = {}
238
190
 
239
- for (const key of (await c.request.formData()).keys()) {
191
+ const form = await c.request.formData()
192
+ for (const key of form.keys()) {
240
193
  if (c.body[key])
241
194
  continue
242
195
 
@@ -248,6 +201,35 @@ const composeHandler = ({ method, hooks, validator, handler, handleError, meta,
248
201
  break;
249
202
  }
250
203
  }
204
+ else if (type) {
205
+ const schema = validator?.body?.schema;
206
+ switch (type) {
207
+ case 'object':
208
+ if (schema.elysiaMeta === 'URLEncoded') {
209
+ fnLiteral += `c.body = parseQuery(await c.request.text())`;
210
+ }
211
+ else if (validator.body.Code().includes("custom('File"))
212
+ fnLiteral += `c.body = {}
213
+
214
+ const form = await c.request.formData()
215
+ for (const key of form.keys()) {
216
+ if (c.body[key])
217
+ continue
218
+
219
+ const value = form.getAll(key)
220
+ if (value.length === 1)
221
+ c.body[key] = value[0]
222
+ else c.body[key] = value
223
+ }`;
224
+ else {
225
+ fnLiteral += `c.body = JSON.parse(await c.request.text())`;
226
+ }
227
+ break;
228
+ default:
229
+ fnLiteral += 'c.body = await c.request.text()';
230
+ break;
231
+ }
232
+ }
251
233
  if (hooks.parse.length)
252
234
  fnLiteral += '}}';
253
235
  }
@@ -295,7 +277,8 @@ const composeHandler = ({ method, hooks, validator, handler, handleError, meta,
295
277
  case 'multipart/form-data':
296
278
  c.body = {}
297
279
 
298
- for (const key of (await c.request.formData()).keys()) {
280
+ const form = await c.request.formData()
281
+ for (const key of form.keys()) {
299
282
  if (c.body[key])
300
283
  continue
301
284
 
@@ -456,12 +439,13 @@ const composeHandler = ({ method, hooks, validator, handler, handleError, meta,
456
439
  ? `let ${name} = await afterHandle[${i}](c, r)\n`
457
440
  : `let ${name} = afterHandle[${i}](c, r)\n`;
458
441
  if (validator.response) {
442
+ fnLiteral += `if(${name} !== undefined) {`;
459
443
  fnLiteral += `if(response[c.set.status]?.Check(${name}) === false) {
460
444
  if(!(response instanceof Error))
461
445
  ${composeResponseValidation(name)}
462
446
  }\n`;
463
447
  fnLiteral += `${name} = mapEarlyResponse(${name}, c.set)\n`;
464
- fnLiteral += `if(${name}) return ${name};\n`;
448
+ fnLiteral += `if(${name}) return ${name};\n}`;
465
449
  }
466
450
  else
467
451
  fnLiteral += `if(${name}) return ${name};\n`;
@@ -555,7 +539,6 @@ const composeHandler = ({ method, hooks, validator, handler, handleError, meta,
555
539
  parseQuery
556
540
  },
557
541
  error: {
558
- ParseError,
559
542
  NotFoundError,
560
543
  ValidationError,
561
544
  InternalServerError
@@ -568,8 +551,6 @@ const composeHandler = ({ method, hooks, validator, handler, handleError, meta,
568
551
  : ''}
569
552
  } = hooks
570
553
 
571
- const parseError = new ParseError()
572
-
573
554
  return ${maybeAsync ? 'async' : ''} function(c) {
574
555
  ${meta ? 'c[SCHEMA] = meta[SCHEMA]; c[DEFS] = meta[DEFS];' : ''}
575
556
  ${fnLiteral}
@@ -587,7 +568,6 @@ const composeHandler = ({ method, hooks, validator, handler, handleError, meta,
587
568
  parseQuery: fast_querystring_1.parse
588
569
  },
589
570
  error: {
590
- ParseError: error_1.ParseError,
591
571
  NotFoundError: error_1.NotFoundError,
592
572
  ValidationError: error_1.ValidationError,
593
573
  InternalServerError: error_1.InternalServerError
@@ -214,7 +214,7 @@ const mapResponse = (response, set) => {
214
214
  };
215
215
  exports.mapResponse = mapResponse;
216
216
  const mapCompactResponse = (response) => {
217
- switch (response.constructor?.name) {
217
+ switch (response?.constructor?.name) {
218
218
  case 'String':
219
219
  case 'Blob':
220
220
  return new Response(response);
@@ -50,8 +50,8 @@ export interface LifeCycle<Instance extends ElysiaInstance = ElysiaInstance> {
50
50
  error: ErrorHandler;
51
51
  stop: VoidLifeCycle<Instance>;
52
52
  }
53
- 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;
54
- export interface LifeCycleStore<Instance extends ElysiaInstance = ElysiaInstance> {
53
+ export type AfterRequestHandler<Route extends TypedRoute, Instance extends ElysiaInstance> = (context: Context<Route, Instance['store']> & Instance['request'], response: Route['response']) => void | MaybePromise<Route['response']> | Response;
54
+ export interface LifeCycleStore<Instance extends ElysiaInstance> {
55
55
  type?: ContentType;
56
56
  start: VoidLifeCycle<Instance>[];
57
57
  request: BeforeRequestHandler<any, Instance>[];
@@ -128,15 +128,15 @@ export type MergeSchema<A extends TypedSchema, B extends TypedSchema> = {
128
128
  };
129
129
  type MaybeArray<T> = T | T[];
130
130
  type ContentType = MaybeArray<(string & {}) | 'none' | 'text' | 'json' | 'formdata' | 'urlencoded' | 'arrayBuffer' | 'text/plain' | 'application/json' | 'multipart/form-data' | 'application/x-www-form-urlencoded'>;
131
- export type LocalHook<Schema extends TypedSchema, Instance extends ElysiaInstance<any>, Path extends string = string> = Partial<Schema> & {
131
+ export type LocalHook<Schema extends TypedSchema, Instance extends ElysiaInstance<any>, Path extends string = string> = Partial<Schema> & (MergeSchema<Schema, Instance['schema']> extends infer Route extends TypedSchema ? {
132
132
  type?: ContentType;
133
133
  detail?: Partial<OpenAPIV3.OperationObject>;
134
- transform?: WithArray<HookHandler<MergeSchema<Schema, Instance['schema']>, Instance, Path>>;
135
- beforeHandle?: WithArray<HookHandler<MergeSchema<Schema, Instance['schema']>, Instance, Path>>;
136
- afterHandle?: WithArray<AfterRequestHandler<any, Instance>>;
134
+ transform?: WithArray<HookHandler<Route, Instance, Path>>;
135
+ beforeHandle?: WithArray<HookHandler<Route, Instance, Path>>;
136
+ afterHandle?: WithArray<AfterRequestHandler<TypedSchemaToRoute<Route, Instance['meta'][typeof SCHEMA]>, Instance>>;
137
137
  error?: WithArray<ErrorHandler>;
138
138
  parse?: WithArray<BodyParser>;
139
- };
139
+ } : never);
140
140
  export type TypedWSRouteToEden<Schema extends TypedSchema = TypedSchema, Definitions extends TypedSchema<string> = ElysiaInstance['meta'][typeof DEFS], Path extends string = string, Catch = unknown> = TypedSchemaToEden<Schema, Definitions> extends infer Typed extends AnyTypedSchema ? {
141
141
  body: Typed['body'];
142
142
  headers: Typed['headers'];
@@ -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' | (string & {});
206
+ code: 'UNKNOWN';
207
207
  error: Readonly<Error>;
208
208
  set: Context['set'];
209
209
  } | {
package/dist/compose.js CHANGED
@@ -1,4 +1,4 @@
1
- import{parse as e}from"fast-querystring";import{mapEarlyResponse as r,mapResponse as t,mapCompactResponse as s}from"./handler";import{SCHEMA as n,DEFS as o}from"./utils";import{ParseError as a,NotFoundError as c,ValidationError as i,InternalServerError as l}from"./error";let u="AsyncFunction",f=e=>e.constructor.name===u,d=new Headers,p=RegExp(" (\\w+) = context","g");export const hasReturn=e=>{let r=e.indexOf(")");return 61===e.charCodeAt(r+2)&&123!==e.charCodeAt(r+5)||e.includes("return")};let y=e=>({composeValidation:(r,t=`c.${r}`)=>e?`throw new ValidationError(
1
+ import{parse as e}from"fast-querystring";import{mapEarlyResponse as r,mapResponse as t,mapCompactResponse as s}from"./handler";import{SCHEMA as n,DEFS as o}from"./utils";import{NotFoundError as a,ValidationError as c,InternalServerError as l}from"./error";let i="AsyncFunction",u=e=>e.constructor.name===i,f=new Headers,d=RegExp(" (\\w+) = context","g");export const hasReturn=e=>{let r=e.indexOf(")");return 61===e.charCodeAt(r+2)&&123!==e.charCodeAt(r+5)||e.includes("return")};let p=e=>({composeValidation:(r,t=`c.${r}`)=>e?`throw new ValidationError(
2
2
  '${r}',
3
3
  ${r},
4
4
  ${t}
@@ -14,28 +14,20 @@ ${r}
14
14
  'response',
15
15
  response[c.set.status],
16
16
  ${r}
17
- ).toResponse(c.set.headers)`});export const isFnUse=(e,r)=>{r=r.trimStart();let t=40===r.charCodeAt(0)||r.startsWith("function")?r.slice(r.indexOf("(")+1,r.indexOf(")")):r.slice(0,r.indexOf("=")-1);if(""===t)return!1;if(123===t.charCodeAt(0))return!!(t.includes(`{ ${e}`)||t.includes(`, ${e}`)||t.includes(`,${e}`));if(r.match(RegExp(`${t}(.${e}|\\["${e}"\\])`)))return!0;let s=[t];for(let e of r.matchAll(p))s.push(e[1]);let n=RegExp(`{.*?} = (${s.join("|")})`,"g");for(let[t]of r.matchAll(n))if(t.includes(`{ ${e}`)||t.includes(`, ${e}`))return!0;return!1};export const findElysiaMeta=(e,r,t=[],s="")=>{if("object"===r.type){let n=r.properties;for(let r in n){let o=n[r],a=s?s+"."+r:r;if("object"===o.type){findElysiaMeta(e,o,t,a);continue}if(o.anyOf){for(let r of o.anyOf)findElysiaMeta(e,r,t,a);continue}o.elysiaMeta===e&&t.push(a)}return 0===t.length?null:t}return r?.elysiaMeta===e?(s&&t.push(s),"root"):null};export const composeHandler=({method:p,hooks:$,validator:h,handler:m,handleError:b,meta:q,onRequest:E,config:g})=>{let w=g.forceErrorEncapsulation||$.error.length>0||"undefined"==typeof Bun,{composeValidation:x,composeResponseValidation:k}=y(w),H=w?"try {\n":"",R="string"==typeof $.type,v=h||"GET"!==p?[m,...$.transform,...$.beforeHandle,...$.afterHandle].map(e=>e.toString()):[],O="GET"!==p&&"none"!==$.type&&(h.body||R||v.some(e=>isFnUse("body",e))),S=h.headers||v.some(e=>isFnUse("headers",e));S&&(H+=d.toJSON?`c.headers = c.request.headers.toJSON()
17
+ ).toResponse(c.set.headers)`});export const isFnUse=(e,r)=>{r=r.trimStart();let t=40===r.charCodeAt(0)||r.startsWith("function")?r.slice(r.indexOf("(")+1,r.indexOf(")")):r.slice(0,r.indexOf("=")-1);if(""===t)return!1;if(123===t.charCodeAt(0))return!!(t.includes(`{ ${e}`)||t.includes(`, ${e}`)||t.includes(`,${e}`));if(r.match(RegExp(`${t}(.${e}|\\["${e}"\\])`)))return!0;let s=[t];for(let e of r.matchAll(d))s.push(e[1]);let n=RegExp(`{.*?} = (${s.join("|")})`,"g");for(let[t]of r.matchAll(n))if(t.includes(`{ ${e}`)||t.includes(`, ${e}`))return!0;return!1};export const findElysiaMeta=(e,r,t=[],s="")=>{if("object"===r.type){let n=r.properties;for(let r in n){let o=n[r],a=s?s+"."+r:r;if("object"===o.type){findElysiaMeta(e,o,t,a);continue}if(o.anyOf){for(let r of o.anyOf)findElysiaMeta(e,r,t,a);continue}o.elysiaMeta===e&&t.push(a)}return 0===t.length?null:t}return r?.elysiaMeta===e?(s&&t.push(s),"root"):null};let y=e=>{if(!e)return;let r=e?.schema;if(r&&"anyOf"in r){let e=!1,t=r.anyOf[0].type;for(let s of r.anyOf)if(s.type!==t){e=!0;break}if(!e)return t}};export const composeHandler=({method:d,hooks:m,validator:h,handler:$,handleError:b,meta:q,onRequest:E,config:g})=>{let w=g.forceErrorEncapsulation||m.error.length>0||"undefined"==typeof Bun,{composeValidation:x,composeResponseValidation:k}=p(w),H=w?"try {\n":"",R=h||"GET"!==d?[$,...m.transform,...m.beforeHandle,...m.afterHandle].map(e=>e.toString()):[],v="GET"!==d&&"none"!==m.type&&(h.body||m.type||R.some(e=>isFnUse("body",e))),O=h.headers||R.some(e=>isFnUse("headers",e));O&&(H+=f.toJSON?`c.headers = c.request.headers.toJSON()
18
18
  `:`c.headers = {}
19
19
  for (const [key, value] of c.request.headers.entries())
20
20
  c.headers[key] = value
21
- `);let C=h.query||v.some(e=>isFnUse("query",e));C&&(H+=`const url = c.request.url
21
+ `);let S=h.query||R.some(e=>isFnUse("query",e));S&&(H+=`const url = c.request.url
22
22
 
23
23
  if(c.query !== -1) {
24
24
  c.query = parseQuery(url.substring(c.query + 1))
25
25
  } else {
26
26
  c.query = {}
27
27
  }
28
- `);let F=v.some(e=>isFnUse("set",e))||E.some(e=>isFnUse("set",e.toString())),N=O||m.constructor.name===u||$.parse.length||$.afterHandle.find(f)||$.beforeHandle.find(f)||$.transform.find(f);if(O){let e=h?.body?.schema;if(e&&"anyOf"in e){let r=!1,t=e.anyOf[0].type;for(let s of e.anyOf)if(s.type!==t){r=!0;break}r&&(e=void 0)}if(R||e){if($.parse.length){H+=(S?"let contentType = c.headers['content-type']":"let contentType = c.request.headers.get('content-type')")+`
29
- if (contentType) {
30
- const index = contentType.indexOf(';')
31
- if (index !== -1) contentType = contentType.substring(0, index)
32
- `+`let used = false
33
- `;for(let e=0;e<$.parse.length;e++){let r=`bo${e}`;0!==e&&(H+=`if(!used) {
34
- `),H+=`let ${r} = parse[${e}](c, contentType);if(${r} instanceof Promise) ${r} = await ${r};
35
- if(${r} !== undefined) { c.body = ${r}; used = true }
36
- `,0!==e&&(H+="}")}H+="if (!used) {"}if(e)"object"===e.type?"URLEncoded"===e.elysiaMeta?H+="c.body = parseQuery(await c.request.text())":h.body.Code().includes("custom('File")?H+=`c.body = {}
28
+ `);let C=R.some(e=>isFnUse("set",e))||E.some(e=>isFnUse("set",e.toString())),F=v||$.constructor.name===i||m.parse.length||m.afterHandle.find(u)||m.beforeHandle.find(u)||m.transform.find(u);if(v){let e=y(h?.body);if(m.type||e){if(m.type)switch(m.type){case"application/json":H+="c.body = JSON.parse(await c.request.text());";break;case"text/plain":H+="c.body = await c.request.text();";break;case"application/x-www-form-urlencoded":H+="c.body = parseQuery(await c.request.text());";break;case"application/octet-stream":H+="c.body = await c.request.arrayBuffer();";break;case"multipart/form-data":H+=`c.body = {}
37
29
 
38
- await c.request.formData().then((form) => {
30
+ const form = await c.request.formData()
39
31
  for (const key of form.keys()) {
40
32
  if (c.body[key])
41
33
  continue
@@ -44,23 +36,23 @@ ${r}
44
36
  if (value.length === 1)
45
37
  c.body[key] = value[0]
46
38
  else c.body[key] = value
47
- }
48
- })`:H+="c.body = JSON.parse(await c.request.text())":H+="c.body = await c.request.text()";else switch($.type){case"application/json":H+="c.body = JSON.parse(await c.request.text());";break;case"text/plain":H+="c.body = await c.request.text();";break;case"application/x-www-form-urlencoded":H+="c.body = parseQuery(await c.request.text());";break;case"application/octet-stream":H+="c.body = await c.request.arrayBuffer();";break;case"multipart/form-data":H+=`c.body = {}
39
+ }`}else if(e){let r=h?.body?.schema;"object"===e?"URLEncoded"===r.elysiaMeta?H+="c.body = parseQuery(await c.request.text())":h.body.Code().includes("custom('File")?H+=`c.body = {}
49
40
 
50
- for (const key of (await c.request.formData()).keys()) {
51
- if (c.body[key])
52
- continue
53
-
54
- const value = form.getAll(key)
55
- if (value.length === 1)
56
- c.body[key] = value[0]
57
- else c.body[key] = value
58
- }`}$.parse.length&&(H+="}}")}else{if(H+="\n"+(S?"let contentType = c.headers['content-type']":"let contentType = c.request.headers.get('content-type')")+`
41
+ const form = await c.request.formData()
42
+ for (const key of form.keys()) {
43
+ if (c.body[key])
44
+ continue
45
+
46
+ const value = form.getAll(key)
47
+ if (value.length === 1)
48
+ c.body[key] = value[0]
49
+ else c.body[key] = value
50
+ }`:H+="c.body = JSON.parse(await c.request.text())":H+="c.body = await c.request.text()"}m.parse.length&&(H+="}}")}else{if(H+="\n"+(O?"let contentType = c.headers['content-type']":"let contentType = c.request.headers.get('content-type')")+`
59
51
  if (contentType) {
60
52
  const index = contentType.indexOf(';')
61
53
  if (index !== -1) contentType = contentType.substring(0, index)
62
- `,$.parse.length){H+=`let used = false
63
- `;for(let e=0;e<$.parse.length;e++){let r=`bo${e}`;0!==e&&(H+=`if(!used) {
54
+ `,m.parse.length){H+=`let used = false
55
+ `;for(let e=0;e<m.parse.length;e++){let r=`bo${e}`;0!==e&&(H+=`if(!used) {
64
56
  `),H+=`let ${r} = parse[${e}](c, contentType);if(${r} instanceof Promise) ${r} = await ${r};
65
57
  if(${r} !== undefined) { c.body = ${r}; used = true }
66
58
  `,0!==e&&(H+="}")}H+="if (!used)"}H+=`switch (contentType) {
@@ -83,7 +75,8 @@ ${r}
83
75
  case 'multipart/form-data':
84
76
  c.body = {}
85
77
 
86
- for (const key of (await c.request.formData()).keys()) {
78
+ const form = await c.request.formData()
79
+ for (const key of form.keys()) {
87
80
  if (c.body[key])
88
81
  continue
89
82
 
@@ -96,64 +89,64 @@ ${r}
96
89
  break
97
90
  }
98
91
  }
99
- `}H+="\n"}if(h.params){let e=findElysiaMeta("Numeric",h.params.schema);if(e){if("object"==typeof e)for(let r of e)H+=`c.params.${r} = +c.params.${r};`;H+="\n"}}if(h.query){let e=findElysiaMeta("Numeric",h.query.schema);if(e){if("object"==typeof e)for(let r of e)H+=`c.query.${r} = +c.query.${r};`;H+="\n"}}if(h.headers){let e=findElysiaMeta("Numeric",h.headers.schema);if(e){if("object"==typeof e)for(let r of e)H+=`c.headers.${r} = +c.headers.${r};`;H+="\n"}}if(h.body){let e=findElysiaMeta("Numeric",h.body.schema);if(e){switch(typeof e){case"string":H+="c.body = +c.body;";break;case"object":for(let r of e)H+=`c.body.${r} = +c.body.${r};`}H+="\n"}}if($?.transform)for(let e=0;e<$.transform.length;e++){let r=$.transform[e];"derive"===r.$elysia?H+=$.transform[e].constructor.name===u?`Object.assign(c, await transform[${e}](c));`:`Object.assign(c, transform[${e}](c));`:H+=$.transform[e].constructor.name===u?`await transform[${e}](c);`:`transform[${e}](c);`}if(h&&(h.headers&&(H+=`
92
+ `}H+="\n"}if(h.params){let e=findElysiaMeta("Numeric",h.params.schema);if(e){if("object"==typeof e)for(let r of e)H+=`c.params.${r} = +c.params.${r};`;H+="\n"}}if(h.query){let e=findElysiaMeta("Numeric",h.query.schema);if(e){if("object"==typeof e)for(let r of e)H+=`c.query.${r} = +c.query.${r};`;H+="\n"}}if(h.headers){let e=findElysiaMeta("Numeric",h.headers.schema);if(e){if("object"==typeof e)for(let r of e)H+=`c.headers.${r} = +c.headers.${r};`;H+="\n"}}if(h.body){let e=findElysiaMeta("Numeric",h.body.schema);if(e){switch(typeof e){case"string":H+="c.body = +c.body;";break;case"object":for(let r of e)H+=`c.body.${r} = +c.body.${r};`}H+="\n"}}if(m?.transform)for(let e=0;e<m.transform.length;e++){let r=m.transform[e];"derive"===r.$elysia?H+=m.transform[e].constructor.name===i?`Object.assign(c, await transform[${e}](c));`:`Object.assign(c, transform[${e}](c));`:H+=m.transform[e].constructor.name===i?`await transform[${e}](c);`:`transform[${e}](c);`}if(h&&(h.headers&&(H+=`
100
93
  if (headers.Check(c.headers) === false) {
101
94
  ${x("headers")}
102
95
  }
103
- `),h.params&&(H+=`if(params.Check(c.params) === false) { ${x("params")} }`),h.query&&(H+=`if(query.Check(c.query) === false) { ${x("query")} }`),h.body&&(H+=`if(body.Check(c.body) === false) { ${x("body")} }`)),$?.beforeHandle)for(let e=0;e<$.beforeHandle.length;e++){let r=`be${e}`,t=hasReturn($.beforeHandle[e].toString());if(t){if(H+=($.beforeHandle[e].constructor.name===u?`let ${r} = await beforeHandle[${e}](c);
96
+ `),h.params&&(H+=`if(params.Check(c.params) === false) { ${x("params")} }`),h.query&&(H+=`if(query.Check(c.query) === false) { ${x("query")} }`),h.body&&(H+=`if(body.Check(c.body) === false) { ${x("body")} }`)),m?.beforeHandle)for(let e=0;e<m.beforeHandle.length;e++){let r=`be${e}`,t=hasReturn(m.beforeHandle[e].toString());if(t){if(H+=(m.beforeHandle[e].constructor.name===i?`let ${r} = await beforeHandle[${e}](c);
104
97
  `:`let ${r} = beforeHandle[${e}](c);
105
98
  `)+`if(${r} !== undefined) {
106
- `,$?.afterHandle)for(let e=0;e<$.afterHandle.length;e++){let t=hasReturn($.afterHandle[e].toString());if(t){let t=`af${e}`;H+=($.afterHandle[e].constructor.name===u?`const ${t} = await afterHandle[${e}](c, ${r});
99
+ `,m?.afterHandle)for(let e=0;e<m.afterHandle.length;e++){let t=hasReturn(m.afterHandle[e].toString());if(t){let t=`af${e}`;H+=(m.afterHandle[e].constructor.name===i?`const ${t} = await afterHandle[${e}](c, ${r});
107
100
  `:`const ${t} = afterHandle[${e}](c, ${r});
108
101
  `)+`if(${t} !== undefined) { ${r} = ${t} }
109
- `}else H+=$.afterHandle[e].constructor.name===u?`await afterHandle[${e}](c, ${r});
102
+ `}else H+=m.afterHandle[e].constructor.name===i?`await afterHandle[${e}](c, ${r});
110
103
  `:`afterHandle[${e}](c, ${r});
111
104
  `}h.response&&(H+=`if(response[c.set.status]?.Check(${r}) === false) {
112
105
  if(!(response instanceof Error))
113
106
  ${k(r)}
114
107
  }
115
108
  `),H+=`return mapEarlyResponse(${r}, c.set)}
116
- `}else H+=$.beforeHandle[e].constructor.name===u?`await beforeHandle[${e}](c);
109
+ `}else H+=m.beforeHandle[e].constructor.name===i?`await beforeHandle[${e}](c);
117
110
  `:`beforeHandle[${e}](c);
118
- `}if($?.afterHandle.length){H+=m.constructor.name===u?`let r = await handler(c);
111
+ `}if(m?.afterHandle.length){H+=$.constructor.name===i?`let r = await handler(c);
119
112
  `:`let r = handler(c);
120
- `;for(let e=0;e<$.afterHandle.length;e++){let r=`af${e}`,t=hasReturn($.afterHandle[e].toString());t?(H+=$.afterHandle[e].constructor.name===u?`let ${r} = await afterHandle[${e}](c, r)
113
+ `;for(let e=0;e<m.afterHandle.length;e++){let r=`af${e}`,t=hasReturn(m.afterHandle[e].toString());t?(H+=m.afterHandle[e].constructor.name===i?`let ${r} = await afterHandle[${e}](c, r)
121
114
  `:`let ${r} = afterHandle[${e}](c, r)
122
- `,h.response?H+=`if(response[c.set.status]?.Check(${r}) === false) {
115
+ `,h.response?H+=`if(${r} !== undefined) {if(response[c.set.status]?.Check(${r}) === false) {
123
116
  if(!(response instanceof Error))
124
117
  ${k(r)}
125
118
  }
126
119
  ${r} = mapEarlyResponse(${r}, c.set)
127
120
  if(${r}) return ${r};
128
- `:H+=`if(${r}) return ${r};
129
- `):H+=$.afterHandle[e].constructor.name===u?`await afterHandle[${e}](c, r)
121
+ }`:H+=`if(${r}) return ${r};
122
+ `):H+=m.afterHandle[e].constructor.name===i?`await afterHandle[${e}](c, r)
130
123
  `:`afterHandle[${e}](c, r)
131
124
  `}h.response&&(H+=`if(response[c.set.status]?.Check(r) === false) {
132
125
  if(!(response instanceof Error))
133
126
  ${k()}
134
127
  }
135
- `),F?H+=`return mapResponse(r, c.set)
128
+ `),C?H+=`return mapResponse(r, c.set)
136
129
  `:H+=`return mapCompactResponse(r)
137
- `}else if(h.response)H+=(m.constructor.name===u?`const r = await handler(c);
130
+ `}else if(h.response)H+=($.constructor.name===i?`const r = await handler(c);
138
131
  `:`const r = handler(c);
139
132
  `)+`if(response[c.set.status]?.Check(r) === false) {
140
133
  if(!(response instanceof Error))
141
134
  ${k()}
142
135
  }
143
- `,F?H+=`return mapResponse(r, c.set)
136
+ `,C?H+=`return mapResponse(r, c.set)
144
137
  `:H+=`return mapCompactResponse(r)
145
- `;else{let e=m.constructor.name===u?"await handler(c) ":"handler(c)";F?H+=`return mapResponse(${e}, c.set)
138
+ `;else{let e=$.constructor.name===i?"await handler(c) ":"handler(c)";C?H+=`return mapResponse(${e}, c.set)
146
139
  `:H+=`return mapCompactResponse(${e})
147
140
  `}w&&(H+=`
148
141
  } catch(error) {
149
142
 
150
143
 
151
- ${N?"":"return (async () => {"}
144
+ ${F?"":"return (async () => {"}
152
145
  const set = c.set
153
146
 
154
147
  if (!set.status || set.status < 300) set.status = 500
155
148
 
156
- ${$.error.length?`for (let i = 0; i < handleErrors.length; i++) {
149
+ ${m.error.length?`for (let i = 0; i < handleErrors.length; i++) {
157
150
  let handled = handleErrors[i]({
158
151
  request: c.request,
159
152
  error: error,
@@ -167,7 +160,7 @@ if(${r}) return ${r};
167
160
  }`:""}
168
161
 
169
162
  return handleError(c.request, error, set)
170
- ${N?"":"})()"}
163
+ ${F?"":"})()"}
171
164
  }`),H=`const {
172
165
  handler,
173
166
  handleError,
@@ -192,7 +185,6 @@ if(${r}) return ${r};
192
185
  parseQuery
193
186
  },
194
187
  error: {
195
- ParseError,
196
188
  NotFoundError,
197
189
  ValidationError,
198
190
  InternalServerError
@@ -203,12 +195,10 @@ if(${r}) return ${r};
203
195
  DEFS,`:""}
204
196
  } = hooks
205
197
 
206
- const parseError = new ParseError()
207
-
208
- return ${N?"async":""} function(c) {
198
+ return ${F?"async":""} function(c) {
209
199
  ${q?"c[SCHEMA] = meta[SCHEMA]; c[DEFS] = meta[DEFS];":""}
210
200
  ${H}
211
- }`;let T=Function("hooks",H);return T({handler:m,hooks:$,validator:h,handleError:b,utils:{mapResponse:t,mapCompactResponse:s,mapEarlyResponse:r,parseQuery:e},error:{ParseError:a,NotFoundError:c,ValidationError:i,InternalServerError:l},meta:q,SCHEMA:q?n:void 0,DEFS:q?o:void 0})};export const composeGeneralHandler=e=>{let t="";for(let r of Object.keys(e.decorators))t+=`,${r}: app.decorators.${r}`;let{router:s,staticRouter:n}=e,o=`
201
+ }`;let N=Function("hooks",H);return N({handler:$,hooks:m,validator:h,handleError:b,utils:{mapResponse:t,mapCompactResponse:s,mapEarlyResponse:r,parseQuery:e},error:{NotFoundError:a,ValidationError:c,InternalServerError:l},meta:q,SCHEMA:q?n:void 0,DEFS:q?o:void 0})};export const composeGeneralHandler=e=>{let t="";for(let r of Object.keys(e.decorators))t+=`,${r}: app.decorators.${r}`;let{router:s,staticRouter:n}=e,o=`
212
202
  const route = find(request.method, path) ${s.root.ALL?'?? find("ALL", path)':""}
213
203
  if (route === null)
214
204
  return ${e.event.error.length?`handleError(
@@ -221,12 +211,12 @@ if(${r}) return ${r};
221
211
 
222
212
  ctx.params = route.params
223
213
 
224
- return route.store(ctx)`,a="";for(let[e,{code:r,all:t}]of Object.entries(n.map))a+=`case '${e}':
214
+ return route.store(ctx)`,c="";for(let[e,{code:r,all:t}]of Object.entries(n.map))c+=`case '${e}':
225
215
  switch(request.method) {
226
216
  ${r}
227
217
  ${t??`default: ${o}`}}
228
218
 
229
- `;let i=`const {
219
+ `;let l=`const {
230
220
  app,
231
221
  app: { store, router, staticRouter },
232
222
  ${e.event.request.length?"mapEarlyResponse,":""}
@@ -245,7 +235,7 @@ ${t??`default: ${o}`}}
245
235
  ${e.event.error.length?"":"const error404 = notFound.message.toString()"}
246
236
 
247
237
  return function(request) {
248
- `;if(e.event.request.length){i+=`
238
+ `;if(e.event.request.length){l+=`
249
239
  const ctx = {
250
240
  request,
251
241
  store,
@@ -257,19 +247,19 @@ ${t??`default: ${o}`}}
257
247
  }
258
248
 
259
249
  try {
260
- `;for(let r=0;r<e.event.request.length;r++){let t=hasReturn(e.event.request[r].toString());i+=t?`const response = mapEarlyResponse(
250
+ `;for(let r=0;r<e.event.request.length;r++){let t=hasReturn(e.event.request[r].toString());l+=t?`const response = mapEarlyResponse(
261
251
  onRequest[${r}](ctx),
262
252
  ctx.set
263
253
  )
264
254
  if (response) return response
265
- `:`mapEarlyResponse(onRequest[${r}](ctx), ctx.set);`}i+=`} catch (error) {
255
+ `:`mapEarlyResponse(onRequest[${r}](ctx), ctx.set);`}l+=`} catch (error) {
266
256
  return handleError(request, error, ctx.set)
267
257
  }
268
258
 
269
259
  const url = request.url,
270
260
  s = url.indexOf('/', 12),
271
261
  i = ctx.query = url.indexOf('?', s + 1),
272
- path = i === -1 ? url.substring(s) : url.substring(s, i);`}else i+=`
262
+ path = i === -1 ? url.substring(s) : url.substring(s, i);`}else l+=`
273
263
  const url = request.url,
274
264
  s = url.indexOf('/', 12)
275
265
 
@@ -287,19 +277,19 @@ ${t??`default: ${o}`}}
287
277
  const path =
288
278
  ctx.query === -1
289
279
  ? url.substring(s)
290
- : url.substring(s, ctx.query);`;return i+=`
280
+ : url.substring(s, ctx.query);`;return l+=`
291
281
  switch(path) {
292
- ${a}
282
+ ${c}
293
283
 
294
284
  default:
295
285
  ${o}
296
286
  }
297
- }`,e.handleError=composeErrorHandler(e),Function("data",i)({app:e,mapEarlyResponse:r,NotFoundError:c})};export const composeErrorHandler=e=>{let r=`const {
287
+ }`,e.handleError=composeErrorHandler(e),Function("data",l)({app:e,mapEarlyResponse:r,NotFoundError:a})};export const composeErrorHandler=e=>{let r=`const {
298
288
  app: { event: { error: onError } },
299
289
  mapResponse
300
290
  } = inject
301
291
 
302
- return ${e.event.error.find(e=>e.constructor.name===u)?"async":""} function(request, error, set) {`;for(let t=0;t<e.event.error.length;t++){let s=e.event.error[t],n=`${s.constructor.name===u?"await ":""}onError[${t}]({
292
+ return ${e.event.error.find(e=>e.constructor.name===i)?"async":""} function(request, error, set) {`;for(let t=0;t<e.event.error.length;t++){let s=e.event.error[t],n=`${s.constructor.name===i?"await ":""}onError[${t}]({
303
293
  request,
304
294
  code: error.code ?? 'UNKNOWN',
305
295
  error,
package/dist/handler.js CHANGED
@@ -1 +1 @@
1
- export const isNotEmpty=e=>{for(let s in e)return!0;return!1};let e=(e,s)=>{e.delete("Set-Cookie");for(let r=0;r<s.length;r++){let n=s[r].indexOf("=");e.append("Set-Cookie",`${s[r].slice(0,n)}=${s[r].slice(n+1)}`)}return e};export const mapEarlyResponse=(s,r)=>{if(isNotEmpty(r.headers)||200!==r.status||r.redirect)switch(r.redirect&&(r.headers.Location=r.redirect,r.status=302),r.headers["Set-Cookie"]&&Array.isArray(r.headers["Set-Cookie"])&&(r.headers=e(new Headers(r.headers),r.headers["Set-Cookie"])),s?.constructor?.name){case"String":case"Blob":return new Response(s,r);case"Object":case"Array":return Response.json(s,r);case void 0:if(!s)return;return Response.json(s,r);case"Response":for(let e in r.headers)s.headers.append(e,r.headers[e]);return s;case"Promise":return s.then(e=>{let s=mapEarlyResponse(e,r);if(void 0!==s)return s});case"Error":return errorToResponse(s,r.headers);case"Function":return s();case"Number":case"Boolean":return new Response(s.toString(),r);default:if(s instanceof Response)return s;let n=JSON.stringify(s);if(123===n.charCodeAt(0))return r.headers["Content-Type"]||(r.headers["Content-Type"]="application/json"),new Response(JSON.stringify(s),r);return new Response(n,r)}else switch(s?.constructor?.name){case"String":case"Blob":return new Response(s);case"Object":case"Array":return new Response(JSON.stringify(s),{headers:{"content-type":"application/json"}});case void 0:if(!s)return new Response("");return new Response(JSON.stringify(s),{headers:{"content-type":"application/json"}});case"Response":return s;case"Promise":return s.then(e=>{let s=mapEarlyResponse(e,r);if(void 0!==s)return s});case"Error":return errorToResponse(s,r.headers);case"Function":return s();case"Number":case"Boolean":return new Response(s.toString());default:if(s instanceof Response)return s;let t=JSON.stringify(s);if(123===t.charCodeAt(0))return new Response(JSON.stringify(s),{headers:{"Content-Type":"application/json"}});return new Response(t)}};export const mapResponse=(s,r)=>{if(isNotEmpty(r.headers)||200!==r.status||r.redirect)switch(r.redirect&&(r.headers.Location=r.redirect,r.status=302),r.headers["Set-Cookie"]&&Array.isArray(r.headers["Set-Cookie"])&&(r.headers=e(new Headers(r.headers),r.headers["Set-Cookie"])),s?.constructor?.name){case"String":case"Blob":return new Response(s,{status:r.status,headers:r.headers});case"Object":case"Array":return Response.json(s,r);case void 0:if(!s)return new Response("",r);return Response.json(s,r);case"Response":for(let e in r.headers)s.headers.append(e,r.headers[e]);return s;case"Error":return errorToResponse(s,r.headers);case"Promise":return s.then(e=>mapResponse(e,r));case"Function":return s();case"Number":case"Boolean":return new Response(s.toString(),r);default:if(s instanceof Response)return s;let n=JSON.stringify(s);if(123===n.charCodeAt(0))return r.headers["Content-Type"]||(r.headers["Content-Type"]="application/json"),new Response(JSON.stringify(s),r);return new Response(n,r)}else switch(s?.constructor?.name){case"String":case"Blob":return new Response(s);case"Object":case"Array":return new Response(JSON.stringify(s),{headers:{"content-type":"application/json"}});case void 0:if(!s)return new Response("");return new Response(JSON.stringify(s),{headers:{"content-type":"application/json"}});case"Response":return s;case"Error":return errorToResponse(s);case"Promise":return s.then(e=>{let s=mapResponse(e,r);return void 0!==s?s:new Response("")});case"Function":return s();case"Number":case"Boolean":return new Response(s.toString());default:if(s instanceof Response)return s;let t=JSON.stringify(s);if(123===t.charCodeAt(0))return new Response(JSON.stringify(s),{headers:{"Content-Type":"application/json"}});return new Response(t)}};export const mapCompactResponse=e=>{switch(e.constructor?.name){case"String":case"Blob":return new Response(e);case"Object":case"Array":return new Response(JSON.stringify(e),{headers:{"content-type":"application/json"}});case void 0:if(!e)return new Response("");return new Response(JSON.stringify(e),{headers:{"content-type":"application/json"}});case"Response":return e;case"Error":return errorToResponse(e);case"Promise":return e.then(e=>{let s=mapCompactResponse(e);return void 0!==s?s:new Response("")});case"Function":return e();case"Number":case"Boolean":return new Response(e.toString());default:if(e instanceof Response)return e;let s=JSON.stringify(e);if(123===s.charCodeAt(0))return new Response(JSON.stringify(e),{headers:{"Content-Type":"application/json"}});return new Response(s)}};export const errorToResponse=(e,s)=>new Response(JSON.stringify({name:e?.name,message:e?.message,cause:e?.cause}),{status:500,headers:s});
1
+ export const isNotEmpty=e=>{for(let s in e)return!0;return!1};let e=(e,s)=>{e.delete("Set-Cookie");for(let r=0;r<s.length;r++){let n=s[r].indexOf("=");e.append("Set-Cookie",`${s[r].slice(0,n)}=${s[r].slice(n+1)}`)}return e};export const mapEarlyResponse=(s,r)=>{if(isNotEmpty(r.headers)||200!==r.status||r.redirect)switch(r.redirect&&(r.headers.Location=r.redirect,r.status=302),r.headers["Set-Cookie"]&&Array.isArray(r.headers["Set-Cookie"])&&(r.headers=e(new Headers(r.headers),r.headers["Set-Cookie"])),s?.constructor?.name){case"String":case"Blob":return new Response(s,r);case"Object":case"Array":return Response.json(s,r);case void 0:if(!s)return;return Response.json(s,r);case"Response":for(let e in r.headers)s.headers.append(e,r.headers[e]);return s;case"Promise":return s.then(e=>{let s=mapEarlyResponse(e,r);if(void 0!==s)return s});case"Error":return errorToResponse(s,r.headers);case"Function":return s();case"Number":case"Boolean":return new Response(s.toString(),r);default:if(s instanceof Response)return s;let n=JSON.stringify(s);if(123===n.charCodeAt(0))return r.headers["Content-Type"]||(r.headers["Content-Type"]="application/json"),new Response(JSON.stringify(s),r);return new Response(n,r)}else switch(s?.constructor?.name){case"String":case"Blob":return new Response(s);case"Object":case"Array":return new Response(JSON.stringify(s),{headers:{"content-type":"application/json"}});case void 0:if(!s)return new Response("");return new Response(JSON.stringify(s),{headers:{"content-type":"application/json"}});case"Response":return s;case"Promise":return s.then(e=>{let s=mapEarlyResponse(e,r);if(void 0!==s)return s});case"Error":return errorToResponse(s,r.headers);case"Function":return s();case"Number":case"Boolean":return new Response(s.toString());default:if(s instanceof Response)return s;let t=JSON.stringify(s);if(123===t.charCodeAt(0))return new Response(JSON.stringify(s),{headers:{"Content-Type":"application/json"}});return new Response(t)}};export const mapResponse=(s,r)=>{if(isNotEmpty(r.headers)||200!==r.status||r.redirect)switch(r.redirect&&(r.headers.Location=r.redirect,r.status=302),r.headers["Set-Cookie"]&&Array.isArray(r.headers["Set-Cookie"])&&(r.headers=e(new Headers(r.headers),r.headers["Set-Cookie"])),s?.constructor?.name){case"String":case"Blob":return new Response(s,{status:r.status,headers:r.headers});case"Object":case"Array":return Response.json(s,r);case void 0:if(!s)return new Response("",r);return Response.json(s,r);case"Response":for(let e in r.headers)s.headers.append(e,r.headers[e]);return s;case"Error":return errorToResponse(s,r.headers);case"Promise":return s.then(e=>mapResponse(e,r));case"Function":return s();case"Number":case"Boolean":return new Response(s.toString(),r);default:if(s instanceof Response)return s;let n=JSON.stringify(s);if(123===n.charCodeAt(0))return r.headers["Content-Type"]||(r.headers["Content-Type"]="application/json"),new Response(JSON.stringify(s),r);return new Response(n,r)}else switch(s?.constructor?.name){case"String":case"Blob":return new Response(s);case"Object":case"Array":return new Response(JSON.stringify(s),{headers:{"content-type":"application/json"}});case void 0:if(!s)return new Response("");return new Response(JSON.stringify(s),{headers:{"content-type":"application/json"}});case"Response":return s;case"Error":return errorToResponse(s);case"Promise":return s.then(e=>{let s=mapResponse(e,r);return void 0!==s?s:new Response("")});case"Function":return s();case"Number":case"Boolean":return new Response(s.toString());default:if(s instanceof Response)return s;let t=JSON.stringify(s);if(123===t.charCodeAt(0))return new Response(JSON.stringify(s),{headers:{"Content-Type":"application/json"}});return new Response(t)}};export const mapCompactResponse=e=>{switch(e?.constructor?.name){case"String":case"Blob":return new Response(e);case"Object":case"Array":return new Response(JSON.stringify(e),{headers:{"content-type":"application/json"}});case void 0:if(!e)return new Response("");return new Response(JSON.stringify(e),{headers:{"content-type":"application/json"}});case"Response":return e;case"Error":return errorToResponse(e);case"Promise":return e.then(e=>{let s=mapCompactResponse(e);return void 0!==s?s:new Response("")});case"Function":return e();case"Number":case"Boolean":return new Response(e.toString());default:if(e instanceof Response)return e;let s=JSON.stringify(e);if(123===s.charCodeAt(0))return new Response(JSON.stringify(e),{headers:{"Content-Type":"application/json"}});return new Response(s)}};export const errorToResponse=(e,s)=>new Response(JSON.stringify({name:e?.name,message:e?.message,cause:e?.cause}),{status:500,headers:s});
package/dist/types.d.ts CHANGED
@@ -50,8 +50,8 @@ export interface LifeCycle<Instance extends ElysiaInstance = ElysiaInstance> {
50
50
  error: ErrorHandler;
51
51
  stop: VoidLifeCycle<Instance>;
52
52
  }
53
- 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;
54
- export interface LifeCycleStore<Instance extends ElysiaInstance = ElysiaInstance> {
53
+ export type AfterRequestHandler<Route extends TypedRoute, Instance extends ElysiaInstance> = (context: Context<Route, Instance['store']> & Instance['request'], response: Route['response']) => void | MaybePromise<Route['response']> | Response;
54
+ export interface LifeCycleStore<Instance extends ElysiaInstance> {
55
55
  type?: ContentType;
56
56
  start: VoidLifeCycle<Instance>[];
57
57
  request: BeforeRequestHandler<any, Instance>[];
@@ -128,15 +128,15 @@ export type MergeSchema<A extends TypedSchema, B extends TypedSchema> = {
128
128
  };
129
129
  type MaybeArray<T> = T | T[];
130
130
  type ContentType = MaybeArray<(string & {}) | 'none' | 'text' | 'json' | 'formdata' | 'urlencoded' | 'arrayBuffer' | 'text/plain' | 'application/json' | 'multipart/form-data' | 'application/x-www-form-urlencoded'>;
131
- export type LocalHook<Schema extends TypedSchema, Instance extends ElysiaInstance<any>, Path extends string = string> = Partial<Schema> & {
131
+ export type LocalHook<Schema extends TypedSchema, Instance extends ElysiaInstance<any>, Path extends string = string> = Partial<Schema> & (MergeSchema<Schema, Instance['schema']> extends infer Route extends TypedSchema ? {
132
132
  type?: ContentType;
133
133
  detail?: Partial<OpenAPIV3.OperationObject>;
134
- transform?: WithArray<HookHandler<MergeSchema<Schema, Instance['schema']>, Instance, Path>>;
135
- beforeHandle?: WithArray<HookHandler<MergeSchema<Schema, Instance['schema']>, Instance, Path>>;
136
- afterHandle?: WithArray<AfterRequestHandler<any, Instance>>;
134
+ transform?: WithArray<HookHandler<Route, Instance, Path>>;
135
+ beforeHandle?: WithArray<HookHandler<Route, Instance, Path>>;
136
+ afterHandle?: WithArray<AfterRequestHandler<TypedSchemaToRoute<Route, Instance['meta'][typeof SCHEMA]>, Instance>>;
137
137
  error?: WithArray<ErrorHandler>;
138
138
  parse?: WithArray<BodyParser>;
139
- };
139
+ } : never);
140
140
  export type TypedWSRouteToEden<Schema extends TypedSchema = TypedSchema, Definitions extends TypedSchema<string> = ElysiaInstance['meta'][typeof DEFS], Path extends string = string, Catch = unknown> = TypedSchemaToEden<Schema, Definitions> extends infer Typed extends AnyTypedSchema ? {
141
141
  body: Typed['body'];
142
142
  headers: Typed['headers'];
@@ -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' | (string & {});
206
+ code: 'UNKNOWN';
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.15",
4
+ "version": "0.5.17",
5
5
  "author": {
6
6
  "name": "saltyAom",
7
7
  "url": "https://github.com/SaltyAom",
@@ -118,6 +118,7 @@
118
118
  },
119
119
  "devDependencies": {
120
120
  "@elysiajs/cors": "^0.5.0",
121
+ "@elysiajs/html": "^0.5.2",
121
122
  "@swc/cli": "^0.1.62",
122
123
  "@swc/core": "^1.3.41",
123
124
  "@types/node": "^18.15.5",