elysia 0.5.2 → 0.5.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.
@@ -1,11 +1,11 @@
1
1
  import type { Elysia } from '.';
2
2
  import { SCHEMA, DEFS } from './utils';
3
- import type { ComposedHandler, HTTPMethod, LocalHandler, RegisteredHook, SchemaValidator } from './types';
4
- import { TAnySchema } from '@sinclair/typebox';
3
+ import type { ElysiaConfig, BeforeRequestHandler, ComposedHandler, HTTPMethod, LocalHandler, RegisteredHook, SchemaValidator } from './types';
4
+ import type { TAnySchema } from '@sinclair/typebox';
5
5
  export declare const hasReturn: (fnLiteral: string) => boolean;
6
6
  export declare const isFnUse: (keyword: string, fnLiteral: string) => boolean;
7
7
  export declare const findElysiaMeta: (type: string, schema: TAnySchema, found?: string[], parent?: string) => string[] | "root" | null;
8
- export declare const composeHandler: ({ path, method, hooks, validator, handler, handleError, meta }: {
8
+ export declare const composeHandler: ({ method, hooks, validator, handler, handleError, meta, onRequest, config }: {
9
9
  path: string;
10
10
  method: HTTPMethod;
11
11
  hooks: RegisteredHook<any>;
@@ -13,6 +13,8 @@ export declare const composeHandler: ({ path, method, hooks, validator, handler,
13
13
  handler: LocalHandler<any, any>;
14
14
  handleError: Elysia['handleError'];
15
15
  meta?: (Record<typeof SCHEMA, {}> & Record<typeof DEFS, {}> & Record<typeof import("./utils").EXPOSED, {}>) | undefined;
16
+ onRequest: BeforeRequestHandler<any, any>[];
17
+ config: ElysiaConfig;
16
18
  }) => ComposedHandler;
17
19
  export declare const composeGeneralHandler: (app: Elysia<any>) => any;
18
20
  export declare const composeErrorHandler: (app: Elysia<any>) => any;
@@ -1,31 +1,42 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),function(e,r){for(var t in r)Object.defineProperty(e,t,{enumerable:!0,get:r[t]})}(exports,{hasReturn:function(){return i},isFnUse:function(){return l},findElysiaMeta:function(){return u},composeHandler:function(){return d},composeGeneralHandler:function(){return f},composeErrorHandler:function(){return p}});const e=require("fast-querystring"),r=require("./handler"),t=require("./utils"),n=require("./error"),o="AsyncFunction",s=e=>e.constructor.name===o,a=new Headers,c=RegExp(" (\\w+) = context","g"),i=e=>{let r=e.indexOf(")");return 61===e.charCodeAt(r+2)&&123!==e.charCodeAt(r+5)||e.includes("return")},l=(e,r)=>{let t=r.slice(r.indexOf("(")+1,r.indexOf(")"));if(""===t)return!1;if(123===t.charCodeAt(0))return!!(t.includes(`{ ${e}`)||t.includes(`, ${e}`));if(r.match(RegExp(`${t}(.${e}|\\["${e}"\\])`)))return!0;let n=[t];for(let e of r.matchAll(c))n.push(e[1]);let o=RegExp(`{.*?} = (${n.join("|")})`,"g");for(let[t]of r.matchAll(o))if(t.includes(`{ ${e}`)||t.includes(`, ${e}`))return!0;return!1},u=(e,r,t=[],n="")=>{if("object"===r.type){let o=r.properties;for(let r in o){let s=o[r],a=n?n+"."+r:r;if("object"===s.type){u(e,s,t,a);continue}if(s.anyOf){for(let r of s.anyOf)u(e,r,t,a);continue}s.elysiaMeta===e&&t.push(a)}return 0===t.length?null:t}return r?.elysiaMeta===e?(n&&t.push(n),"root"):null},d=({path:c,method:d,hooks:f,validator:p,handler:y,handleError:h,meta:m})=>{let $="try {\n",b="string"==typeof f.type,E=p||"GET"!==d?[y,...f.transform,...f.beforeHandle,...f.afterHandle].map(e=>e.toString()):[],w="GET"!==d&&(p.body||b||E.some(e=>l("body",e))),q=p.headers||E.some(e=>l("headers",e));q&&($+=a.toJSON?`c.headers = c.request.headers.toJSON()
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),function(e,r){for(var t in r)Object.defineProperty(e,t,{enumerable:!0,get:r[t]})}(exports,{hasReturn:function(){return l},isFnUse:function(){return u},findElysiaMeta:function(){return f},composeHandler:function(){return d},composeGeneralHandler:function(){return p},composeErrorHandler:function(){return y}});const e=require("fast-querystring"),r=require("./handler"),t=require("./utils"),n=require("./error"),s="AsyncFunction",o=e=>e.constructor.name===s,a=new Headers,c=RegExp(" (\\w+) = context","g"),l=e=>{let r=e.indexOf(")");return 61===e.charCodeAt(r+2)&&123!==e.charCodeAt(r+5)||e.includes("return")},i=e=>({composeValidation:(r,t=`c.${r}`)=>e?`throw new ValidationError(
2
+ '${r}',
3
+ ${r},
4
+ ${t}
5
+ )`:`return new ValidationError(
6
+ '${r}',
7
+ ${r},
8
+ ${t}
9
+ ).toResponse(c.set.headers)`,composeResponseValidation:(r="r")=>e?`throw new ValidationError(
10
+ 'response',
11
+ response[c.set.status],
12
+ ${r}
13
+ )`:`return new ValidationError(
14
+ 'response',
15
+ response[c.set.status],
16
+ ${r}
17
+ ).toResponse(c.set.headers)`}),u=(e,r)=>{let t=r.slice(r.indexOf("(")+1,r.indexOf(")"));if(""===t)return!1;if(123===t.charCodeAt(0))return!!(t.includes(`{ ${e}`)||t.includes(`, ${e}`));if(r.match(RegExp(`${t}(.${e}|\\["${e}"\\])`)))return!0;let n=[t];for(let e of r.matchAll(c))n.push(e[1]);let s=RegExp(`{.*?} = (${n.join("|")})`,"g");for(let[t]of r.matchAll(s))if(t.includes(`{ ${e}`)||t.includes(`, ${e}`))return!0;return!1},f=(e,r,t=[],n="")=>{if("object"===r.type){let s=r.properties;for(let r in s){let o=s[r],a=n?n+"."+r:r;if("object"===o.type){f(e,o,t,a);continue}if(o.anyOf){for(let r of o.anyOf)f(e,r,t,a);continue}o.elysiaMeta===e&&t.push(a)}return 0===t.length?null:t}return r?.elysiaMeta===e?(n&&t.push(n),"root"):null},d=({method:c,hooks:d,validator:p,handler:y,handleError:$,meta:h,onRequest:m,config:b})=>{let E=b.forceErrorEncapsulation||d.error.length>0||void 0===Bun,{composeValidation:q,composeResponseValidation:g}=i(E),w=E?"try {\n":"",x="string"==typeof d.type,k=p||"GET"!==c?[y,...d.transform,...d.beforeHandle,...d.afterHandle].map(e=>e.toString()):[],H="GET"!==c&&(p.body||x||k.some(e=>u("body",e))),R=p.headers||k.some(e=>u("headers",e));R&&(w+=a.toJSON?`c.headers = c.request.headers.toJSON()
2
18
  `:`c.headers = {}
3
19
  for (const key of c.request.headers.keys())
4
20
  h[key] = c.request.headers.get(key)
5
21
 
6
- if (headers.Check(h) === false) {
7
- throw throw new ValidationError(
8
- 'header',
9
- headers,
10
- h
11
- )
12
- }
13
- `);let g=p.query||E.some(e=>l("query",e));g&&($+=`const url = c.request.url
22
+ if (headers.Check(c.headers) === false)
23
+ ${q("headers")}
24
+ `);let v=p.query||k.some(e=>u("query",e));v&&(w+=`const url = c.request.url
14
25
 
15
26
  if(c.query !== -1) {
16
27
  c.query = parseQuery(url.substring(c.query + 1))
17
28
  } else {
18
29
  c.query = {}
19
30
  }
20
- `);let k=w||y.constructor.name===o||f.parse.length||f.afterHandle.find(s)||f.beforeHandle.find(s)||f.transform.find(s);if(w){let e=p?.body?.schema;if(e&&"anyOf"in e){let r=!1,t=e.anyOf[0].type;for(let n of e.anyOf)if(n.type!==t){r=!0;break}r&&(e=void 0)}if(b||e){if(f.parse.length){$+=(q?"let contentType = c.headers['content-type']":"let contentType = c.request.headers.get('content-type')")+`
31
+ `);let O=k.some(e=>u("set",e))||m.some(e=>u("set",e.toString())),S=H||y.constructor.name===s||d.parse.length||d.afterHandle.find(o)||d.beforeHandle.find(o)||d.transform.find(o);if(H){let e=p?.body?.schema;if(e&&"anyOf"in e){let r=!1,t=e.anyOf[0].type;for(let n of e.anyOf)if(n.type!==t){r=!0;break}r&&(e=void 0)}if(x||e){if(d.parse.length){w+=(R?"let contentType = c.headers['content-type']":"let contentType = c.request.headers.get('content-type')")+`
21
32
  if (contentType) {
22
33
  const index = contentType.indexOf(';')
23
34
  if (index !== -1) contentType = contentType.substring(0, index)
24
35
  `+`let used = false
25
- `;for(let e=0;e<f.parse.length;e++){let r=`bo${e}`;0!==e&&($+=`if(!used) {
26
- `),$+=`let ${r} = parse[${e}](c, contentType);if(${r} instanceof Promise) ${r} = await ${r};
36
+ `;for(let e=0;e<d.parse.length;e++){let r=`bo${e}`;0!==e&&(w+=`if(!used) {
37
+ `),w+=`let ${r} = parse[${e}](c, contentType);if(${r} instanceof Promise) ${r} = await ${r};
27
38
  if(${r} !== undefined) { c.body = ${r}; used = true }
28
- `,0!==e&&($+="}")}$+="if (!used) {"}if(e)"object"===e.type?"URLEncoded"===e.elysiaMeta?$+="c.body = parseQuery(await c.request.text())":p.body.Code().includes("custom('File")?$+=`c.body = {}
39
+ `,0!==e&&(w+="}")}w+="if (!used) {"}if(e)"object"===e.type?"URLEncoded"===e.elysiaMeta?w+="c.body = parseQuery(await c.request.text())":p.body.Code().includes("custom('File")?w+=`c.body = {}
29
40
 
30
41
  await c.request.formData().then((form) => {
31
42
  for (const key of form.keys()) {
@@ -37,7 +48,7 @@
37
48
  c.body[key] = value[0]
38
49
  else c.body[key] = value
39
50
  }
40
- })`:$+="c.body = JSON.parse(await c.request.text())":$+="c.body = await c.request.text()";else switch(f.type){case"application/json":$+="c.body = JSON.parse(await c.request.text());";break;case"text/plain":$+="c.body = await c.request.text();";break;case"application/x-www-form-urlencoded":$+="c.body = parseQuery(await c.request.text());";break;case"multipart/form-data":$+=`c.body = {}
51
+ })`:w+="c.body = JSON.parse(await c.request.text())":w+="c.body = await c.request.text()";else switch(d.type){case"application/json":w+="c.body = JSON.parse(await c.request.text());";break;case"text/plain":w+="c.body = await c.request.text();";break;case"application/x-www-form-urlencoded":w+="c.body = parseQuery(await c.request.text());";break;case"multipart/form-data":w+=`c.body = {}
41
52
 
42
53
  for (const key of (await c.request.formData()).keys()) {
43
54
  if (c.body[key])
@@ -47,15 +58,15 @@
47
58
  if (value.length === 1)
48
59
  c.body[key] = value[0]
49
60
  else c.body[key] = value
50
- }`}f.parse.length&&($+="}}")}else{if($+="\n"+(q?"let contentType = c.headers['content-type']":"let contentType = c.request.headers.get('content-type')")+`
61
+ }`}d.parse.length&&(w+="}}")}else{if(w+="\n"+(R?"let contentType = c.headers['content-type']":"let contentType = c.request.headers.get('content-type')")+`
51
62
  if (contentType) {
52
63
  const index = contentType.indexOf(';')
53
64
  if (index !== -1) contentType = contentType.substring(0, index)
54
- `,f.parse.length){$+=`let used = false
55
- `;for(let e=0;e<f.parse.length;e++){let r=`bo${e}`;0!==e&&($+=`if(!used) {
56
- `),$+=`let ${r} = parse[${e}](c, contentType);if(${r} instanceof Promise) ${r} = await ${r};
65
+ `,d.parse.length){w+=`let used = false
66
+ `;for(let e=0;e<d.parse.length;e++){let r=`bo${e}`;0!==e&&(w+=`if(!used) {
67
+ `),w+=`let ${r} = parse[${e}](c, contentType);if(${r} instanceof Promise) ${r} = await ${r};
57
68
  if(${r} !== undefined) { c.body = ${r}; used = true }
58
- `,0!==e&&($+="}")}$+="if (!used)"}$+=`switch (contentType) {
69
+ `,0!==e&&(w+="}")}w+="if (!used)"}w+=`switch (contentType) {
59
70
  case 'application/json':
60
71
  c.body = JSON.parse(await c.request.text())
61
72
  break
@@ -84,63 +95,64 @@
84
95
  break
85
96
  }
86
97
  }
87
- `}$+="\n"}if(p.params){let e=u("Numeric",p.params.schema);if(e){if("object"==typeof e)for(let r of e)$+=`c.params.${r} = +c.params.${r};`;$+="\n"}}if(p.query){let e=u("Numeric",p.query.schema);if(e){if("object"==typeof e)for(let r of e)$+=`c.query.${r} = +c.query.${r};`;$+="\n"}}if(p.headers){let e=u("Numeric",p.headers.schema);if(e){if("object"==typeof e)for(let r of e)$+=`c.headers.${r} = +c.headers.${r};`;$+="\n"}}if(p.body){let e=u("Numeric",p.body.schema);if(e){switch(typeof e){case"string":$+="c.body = +c.body;";break;case"object":for(let r of e)$+=`c.body.${r} = +c.body.${r};`}$+="\n"}}if(f?.transform)for(let e=0;e<f.transform.length;e++){let r=f.transform[e];"derive"===r.$elysia?$+=f.transform[e].constructor.name===o?`Object.assign(c, await transform[${e}](c));`:`Object.assign(c, transform[${e}](c));`:$+=f.transform[e].constructor.name===o?`await transform[${e}](c);`:`transform[${e}](c);`}if(p&&(p.headers&&($+=`
98
+ `}w+="\n"}if(p.params){let e=f("Numeric",p.params.schema);if(e){if("object"==typeof e)for(let r of e)w+=`c.params.${r} = +c.params.${r};`;w+="\n"}}if(p.query){let e=f("Numeric",p.query.schema);if(e){if("object"==typeof e)for(let r of e)w+=`c.query.${r} = +c.query.${r};`;w+="\n"}}if(p.headers){let e=f("Numeric",p.headers.schema);if(e){if("object"==typeof e)for(let r of e)w+=`c.headers.${r} = +c.headers.${r};`;w+="\n"}}if(p.body){let e=f("Numeric",p.body.schema);if(e){switch(typeof e){case"string":w+="c.body = +c.body;";break;case"object":for(let r of e)w+=`c.body.${r} = +c.body.${r};`}w+="\n"}}if(d?.transform)for(let e=0;e<d.transform.length;e++){let r=d.transform[e];"derive"===r.$elysia?w+=d.transform[e].constructor.name===s?`Object.assign(c, await transform[${e}](c));`:`Object.assign(c, transform[${e}](c));`:w+=d.transform[e].constructor.name===s?`await transform[${e}](c);`:`transform[${e}](c);`}if(p&&(p.headers&&(w+=`
88
99
  if (headers.Check(c.headers) === false) {
89
- throw new ValidationError(
90
- 'header',
91
- headers,
92
- c.headers
93
- )
100
+ ${q("headers")}
94
101
  }
95
- `),p.params&&($+="if(params.Check(c.params) === false) { throw new ValidationError('params', params, c.params) }"),p.query&&($+="if(query.Check(c.query) === false) { throw new ValidationError('query', query, c.query) }"),p.body&&($+="if(body.Check(c.body) === false) { throw new ValidationError('body', body, c.body) }")),f?.beforeHandle)for(let e=0;e<f.beforeHandle.length;e++){let r=`be${e}`,t=i(f.beforeHandle[e].toString());if(t){if($+=(f.beforeHandle[e].constructor.name===o?`let ${r} = await beforeHandle[${e}](c);
102
+ `),p.params&&(w+=`if(params.Check(c.params) === false) { ${q("params")} }`),p.query&&(w+=`if(query.Check(c.query) === false) { ${q("query")} }`),p.body&&(w+=`if(body.Check(c.body) === false) { ${q("body")} }`)),d?.beforeHandle)for(let e=0;e<d.beforeHandle.length;e++){let r=`be${e}`,t=l(d.beforeHandle[e].toString());if(t){if(w+=(d.beforeHandle[e].constructor.name===s?`let ${r} = await beforeHandle[${e}](c);
96
103
  `:`let ${r} = beforeHandle[${e}](c);
97
104
  `)+`if(${r} !== undefined) {
98
- `,f?.afterHandle)for(let e=0;e<f.afterHandle.length;e++){let t=i(f.afterHandle[e].toString());if(t){let t=`af${e}`;$+=(f.afterHandle[e].constructor.name===o?`const ${t} = await afterHandle[${e}](c, ${r});
105
+ `,d?.afterHandle)for(let e=0;e<d.afterHandle.length;e++){let t=l(d.afterHandle[e].toString());if(t){let t=`af${e}`;w+=(d.afterHandle[e].constructor.name===s?`const ${t} = await afterHandle[${e}](c, ${r});
99
106
  `:`const ${t} = afterHandle[${e}](c, ${r});
100
107
  `)+`if(${t} !== undefined) { ${r} = ${t} }
101
- `}else $+=f.afterHandle[e].constructor.name===o?`await afterHandle[${e}](c, ${r});
108
+ `}else w+=d.afterHandle[e].constructor.name===s?`await afterHandle[${e}](c, ${r});
102
109
  `:`afterHandle[${e}](c, ${r});
103
- `}p.response&&($+=`if(response[c.set.status]?.Check(${r}) === false) {
110
+ `}p.response&&(w+=`if(response[c.set.status]?.Check(${r}) === false) {
104
111
  if(!(response instanceof Error))
105
- throw new ValidationError('response', response[c.set.status], ${r})
112
+ ${g(r)}
106
113
  }
107
- `),$+=`return mapEarlyResponse(${r}, c.set)}
108
- `}else $+=f.beforeHandle[e].constructor.name===o?`await beforeHandle[${e}](c);
114
+ `),w+=`return mapEarlyResponse(${r}, c.set)}
115
+ `}else w+=d.beforeHandle[e].constructor.name===s?`await beforeHandle[${e}](c);
109
116
  `:`beforeHandle[${e}](c);
110
- `}if(f?.afterHandle.length){$+=y.constructor.name===o?`let r = await handler(c);
117
+ `}if(d?.afterHandle.length){w+=y.constructor.name===s?`let r = await handler(c);
111
118
  `:`let r = handler(c);
112
- `;for(let e=0;e<f.afterHandle.length;e++){let r=`af${e}`,t=i(f.afterHandle[e].toString());t?($+=f.afterHandle[e].constructor.name===o?`let ${r} = await afterHandle[${e}](c, r)
119
+ `;for(let e=0;e<d.afterHandle.length;e++){let r=`af${e}`,t=l(d.afterHandle[e].toString());t?(w+=d.afterHandle[e].constructor.name===s?`let ${r} = await afterHandle[${e}](c, r)
113
120
  `:`let ${r} = afterHandle[${e}](c, r)
114
- `,p.response?$+=`if(response[c.set.status]?.Check(${r}) === false) {
121
+ `,p.response?w+=`if(response[c.set.status]?.Check(${r}) === false) {
115
122
  if(!(response instanceof Error))
116
- throw new ValidationError('response', response[c.set.status], ${r})
123
+ ${g(r)}
117
124
  }
118
125
  ${r} = mapEarlyResponse(${r}, c.set)
119
126
  if(${r}) return ${r};
120
- `:$+=`if(${r}) return ${r};
121
- `):$+=f.afterHandle[e].constructor.name===o?`await afterHandle[${e}](c, r)
127
+ `:w+=`if(${r}) return ${r};
128
+ `):w+=d.afterHandle[e].constructor.name===s?`await afterHandle[${e}](c, r)
122
129
  `:`afterHandle[${e}](c, r)
123
- `}p.response&&($+=`if(response[c.set.status]?.Check(r) === false) {
130
+ `}p.response&&(w+=`if(response[c.set.status]?.Check(r) === false) {
124
131
  if(!(response instanceof Error))
125
- throw new ValidationError('response', response[c.set.status], r)
132
+ ${g()}
126
133
  }
127
- `),$+=`return mapResponse(r, c.set);
128
- `}else p.response?$+=(y.constructor.name===o?`const r = await handler(c);
134
+ `),O?w+=`return mapResponse(r, c.set)
135
+ `:w+=`return mapCompactResponse(r)
136
+ `}else if(p.response)w+=(y.constructor.name===s?`const r = await handler(c);
129
137
  `:`const r = handler(c);
130
138
  `)+`if(response[c.set.status]?.Check(r) === false) {
131
139
  if(!(response instanceof Error))
132
- throw new ValidationError('response', response[c.set.status], r)
140
+ ${g()}
133
141
  }
134
- `+"return mapResponse(r, c.set);":$+=y.constructor.name===o?"return mapResponse(await handler(c), c.set);":"return mapResponse(handler(c), c.set);";$+=`
142
+ `,O?w+=`return mapResponse(r, c.set)
143
+ `:w+=`return mapCompactResponse(r)
144
+ `;else{let e=y.constructor.name===s?"await handler(c) ":"handler(c)";O?w+=`return mapResponse(${e}, c.set)
145
+ `:w+=`return mapCompactResponse(${e})
146
+ `}E&&(w+=`
135
147
  } catch(error) {
136
148
 
137
149
 
138
- ${k?"":"return (async () => {"}
150
+ ${S?"":"return (async () => {"}
139
151
  const set = c.set
140
152
 
141
153
  if (!set.status || set.status < 300) set.status = 500
142
154
 
143
- ${f.error.length?`for (let i = 0; i < handleErrors.length; i++) {
155
+ ${d.error.length?`for (let i = 0; i < handleErrors.length; i++) {
144
156
  let handled = handleErrors[i]({
145
157
  request: c.request,
146
158
  error: error,
@@ -154,8 +166,8 @@ if(${r}) return ${r};
154
166
  }`:""}
155
167
 
156
168
  return handleError(c.request, error, set)
157
- ${k?"":"})()"}
158
- }`,$=`const {
169
+ ${S?"":"})()"}
170
+ }`),w=`const {
159
171
  handler,
160
172
  handleError,
161
173
  hooks: {
@@ -174,8 +186,8 @@ if(${r}) return ${r};
174
186
  },
175
187
  utils: {
176
188
  mapResponse,
189
+ mapCompactResponse,
177
190
  mapEarlyResponse,
178
- mapErrorCode,
179
191
  parseQuery
180
192
  },
181
193
  error: {
@@ -184,7 +196,7 @@ if(${r}) return ${r};
184
196
  ValidationError,
185
197
  InternalServerError
186
198
  },
187
- ${m?`
199
+ ${h?`
188
200
  meta,
189
201
  SCHEMA,
190
202
  DEFS,`:""}
@@ -192,15 +204,28 @@ if(${r}) return ${r};
192
204
 
193
205
  const parseError = new ParseError()
194
206
 
195
- return ${k?"async":""} function(c) {
196
- ${m?"c[SCHEMA] = meta[SCHEMA]; c[DEFS] = meta[DEFS];":""}
197
- ${$}
198
- }`;let x=Function("hooks",$);return x({handler:y,hooks:f,validator:p,handleError:h,utils:{mapResponse:r.mapResponse,mapEarlyResponse:r.mapEarlyResponse,parseQuery:e.parse},error:{ParseError:n.ParseError,NotFoundError:n.NotFoundError,ValidationError:n.ValidationError,InternalServerError:n.InternalServerError},meta:m,SCHEMA:m?t.SCHEMA:void 0,DEFS:m?t.DEFS:void 0})},f=e=>{let t="";for(let r of Object.keys(e.decorators))t+=`,${r}: app.decorators.${r}`;let o=e.staticRouter,s="";for(let[e,{code:r,all:t}]of Object.entries(o.map))s+=`case '${e}':
199
- switch(method) {
207
+ return ${S?"async":""} function(c) {
208
+ ${h?"c[SCHEMA] = meta[SCHEMA]; c[DEFS] = meta[DEFS];":""}
209
+ ${w}
210
+ }`;let C=Function("hooks",w);return C({handler:y,hooks:d,validator:p,handleError:$,utils:{mapResponse:r.mapResponse,mapCompactResponse:r.mapCompactResponse,mapEarlyResponse:r.mapEarlyResponse,parseQuery:e.parse},error:{ParseError:n.ParseError,NotFoundError:n.NotFoundError,ValidationError:n.ValidationError,InternalServerError:n.InternalServerError},meta:h,SCHEMA:h?t.SCHEMA:void 0,DEFS:h?t.DEFS:void 0})},p=e=>{let t="";for(let r of Object.keys(e.decorators))t+=`,${r}: app.decorators.${r}`;let{router:s,staticRouter:o}=e,a=`
211
+ const route = find(request.method, path) ${s.root.ALL?'?? find("ALL", path)':""}
212
+ if (route === null)
213
+ return ${e.event.error.length?`handleError(
214
+ request,
215
+ notFound,
216
+ ctx.set
217
+ )`:`new Response(error404, {
218
+ status: 404
219
+ })`}
220
+
221
+ ctx.params = route.params
222
+
223
+ return route.store(ctx)`,c="";for(let[e,{code:r,all:t}]of Object.entries(o.map))c+=`case '${e}':
224
+ switch(request.method) {
200
225
  ${r}
201
- ${t}}
226
+ ${t??`default: ${a}`}}
202
227
 
203
- `;let a=e.router,c=`const {
228
+ `;let i=`const {
204
229
  app,
205
230
  app: { store, router, staticRouter },
206
231
  ${e.event.request.length?"mapEarlyResponse,":""}
@@ -219,56 +244,65 @@ ${t}}
219
244
  ${e.event.error.length?"":"const error404 = notFound.message.toString()"}
220
245
 
221
246
  return function(request) {
222
- const ctx = {
223
- request,
224
- store,
225
- set: {
226
- headers: {},
227
- status: 200
247
+ `;if(e.event.request.length){i+=`
248
+ const ctx = {
249
+ request,
250
+ store,
251
+ set: {
252
+ headers: {},
253
+ status: 200
254
+ }
255
+ ${t}
228
256
  }
229
- ${t}
230
- }
231
- `;if(e.event.request.length){c+="try {";for(let r=0;r<e.event.request.length;r++){let t=i(e.event.request[r].toString());c+=t?`const response = mapEarlyResponse(
257
+
258
+ try {
259
+ `;for(let r=0;r<e.event.request.length;r++){let t=l(e.event.request[r].toString());i+=t?`const response = mapEarlyResponse(
232
260
  onRequest[${r}](ctx),
233
261
  ctx.set
234
262
  )
235
263
  if (response) return response
236
- `:`mapEarlyResponse(onRequest[${r}](ctx), ctx.set)`}c+=`} catch (error) {
264
+ `:`mapEarlyResponse(onRequest[${r}](ctx), ctx.set)`}i+=`} catch (error) {
237
265
  return handleError(request, error, ctx.set)
238
- }`}return c+=`
239
- const { url, method } = request,
266
+ }
267
+
268
+ const url = request.url,
269
+ s = url.indexOf('/', 12),
270
+ i = ctx.query = url.indexOf('?', s + 1),
271
+ path = i === -1 ? url.substring(s) : url.substring(s, i);`}else i+=`
272
+ const url = request.url,
240
273
  s = url.indexOf('/', 12)
241
- ctx.query = i = url.indexOf('?', s + 1),
242
- path = i === -1 ? url.substring(s) : url.substring(s, i)
243
274
 
244
- map: switch(path) {
245
- ${s}
246
- }
247
-
248
- const route = find(method, path) ${a.root.ALL?'?? find("ALL", path)':""}
249
- if (route === null) {
250
- return ${e.event.error.length?`handleError(
251
- request,
252
- notFound,
253
- ctx.set
254
- )`:`new Response(error404, {
255
- status: 404
256
- })`}
275
+ const ctx = {
276
+ request,
277
+ store,
278
+ query: url.indexOf('?', s + 1),
279
+ set: {
280
+ headers: {},
281
+ status: 200
282
+ }
283
+ ${t}
257
284
  }
258
285
 
259
- ctx.params = route.params
286
+ const path =
287
+ ctx.query === -1
288
+ ? url.substring(s)
289
+ : url.substring(s, ctx.query);`;return i+=`
290
+ switch(path) {
291
+ ${c}
260
292
 
261
- return route.store(ctx)
262
- }`,e.handleError=p(e),Function("data",c)({app:e,mapEarlyResponse:r.mapEarlyResponse,NotFoundError:n.NotFoundError})},p=e=>{let t=`const {
293
+ default:
294
+ ${a}
295
+ }
296
+ }`,e.handleError=y(e),Function("data",i)({app:e,mapEarlyResponse:r.mapEarlyResponse,NotFoundError:n.NotFoundError})},y=e=>{let t=`const {
263
297
  app: { event: { error: onError } },
264
298
  mapResponse
265
299
  } = inject
266
300
 
267
- return ${e.event.error.find(e=>e.constructor.name===o)?"async":""} function(request, error, set) {`;for(let r=0;r<e.event.error.length;r++){let n=e.event.error[r],s=`${n.constructor.name===o?"await ":""}onError[${r}]({
301
+ return ${e.event.error.find(e=>e.constructor.name===s)?"async":""} function(request, error, set) {`;for(let r=0;r<e.event.error.length;r++){let n=e.event.error[r],o=`${n.constructor.name===s?"await ":""}onError[${r}]({
268
302
  request,
269
303
  code: error.code ?? 'UNKNOWN',
270
304
  error,
271
305
  set
272
- })`;i(n.toString())?t+=`const r${r} = ${s}; if(r${r} !== null) return mapResponse(r${r}, set)
273
- `:t+=s+"\n"}return Function("inject",t+=`return new Response(error.message, { headers: set.headers, status: error.status ?? 500 })
306
+ })`;l(n.toString())?t+=`const r${r} = ${o}; if(r${r} !== null) return mapResponse(r${r}, set)
307
+ `:t+=o+"\n"}return Function("inject",t+=`return new Response(error.message, { headers: set.headers, status: error.status ?? 500 })
274
308
  }`)({app:e,mapResponse:r.mapResponse})};
@@ -1,3 +1,4 @@
1
+ /// <reference types="bun-types" />
1
2
  import type { TypeCheck } from '@sinclair/typebox/compiler';
2
3
  export declare class InternalServerError extends Error {
3
4
  code: string;
@@ -21,4 +22,5 @@ export declare class ValidationError extends Error {
21
22
  status: number;
22
23
  constructor(type: string, validator: TypeCheck<any>, value: unknown);
23
24
  get all(): import("@sinclair/typebox/compiler").ValueError[];
25
+ toResponse(headers?: Record<string, any>): Response;
24
26
  }
package/dist/cjs/error.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),function(r,t){for(var e in t)Object.defineProperty(r,e,{enumerable:!0,get:t[e]})}(exports,{InternalServerError:function(){return r},NotFoundError:function(){return t},ParseError:function(){return e},ValidationError:function(){return s}});class r extends Error{code="NOT_FOUND";status=500;constructor(){super("INTERNAL_SERVER_ERROR")}}class t extends Error{code="NOT_FOUND";status=404;constructor(){super("NOT_FOUND")}}class e extends Error{code="PARSE";status=400;constructor(){super("PARSE")}}class s extends Error{validator;value;code;status;constructor(r,t,e){let s=t.Errors(e).First();super(`Invalid ${r}: '${s?.path?.slice(1)||"root"}'. ${s?.message}`),this.validator=t,this.value=e,this.code="VALIDATION",this.status=400}get all(){return[...this.validator.Errors(this.value)]}}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),function(r,t){for(var e in t)Object.defineProperty(r,e,{enumerable:!0,get:t[e]})}(exports,{InternalServerError:function(){return r},NotFoundError:function(){return t},ParseError:function(){return e},ValidationError:function(){return s}});class r extends Error{code="NOT_FOUND";status=500;constructor(){super("INTERNAL_SERVER_ERROR")}}class t extends Error{code="NOT_FOUND";status=404;constructor(){super("NOT_FOUND")}}class e extends Error{code="PARSE";status=400;constructor(){super("PARSE")}}class s extends Error{validator;value;code;status;constructor(r,t,e){let s=t.Errors(e).First();super(`Invalid ${r}: '${s?.path?.slice(1)||"root"}'. ${s?.message}`),this.validator=t,this.value=e,this.code="VALIDATION",this.status=400}get all(){return[...this.validator.Errors(this.value)]}toResponse(r){return new Response(this.message,{status:400,headers:r})}}
@@ -3,4 +3,5 @@ import type { Context } from './context';
3
3
  export declare const isNotEmpty: (obj: Object) => boolean;
4
4
  export declare const mapEarlyResponse: (response: unknown, set: Context['set']) => Response | undefined;
5
5
  export declare const mapResponse: (response: unknown, set: Context['set']) => Response;
6
+ export declare const mapCompactResponse: (response: unknown) => Response;
6
7
  export declare const errorToResponse: (error: Error, headers?: HeadersInit) => Response;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),function(e,s){for(var r in s)Object.defineProperty(e,r,{enumerable:!0,get:s[r]})}(exports,{isNotEmpty:function(){return e},mapEarlyResponse:function(){return r},mapResponse:function(){return t},errorToResponse:function(){return n}});const e=e=>{for(let s in e)return!0;return!1},s=(e,s)=>{e.delete("Set-Cookie");for(let r=0;r<s.length;r++){let t=s[r].indexOf("=");e.append("Set-Cookie",`${s[r].slice(0,t)}=${s[r].slice(t+1)}`)}return e},r=(t,a)=>{if(e(a.headers)||200!==a.status||a.redirect)switch(a.redirect&&(a.headers.Location=a.redirect,a.status=302),a.headers["Set-Cookie"]&&Array.isArray(a.headers["Set-Cookie"])&&(a.headers=s(new Headers(a.headers),a.headers["Set-Cookie"])),typeof t){case"string":return new Response(t,{status:a.status,headers:a.headers});case"object":switch(t.constructor.name){case"Object":case"Array":case void 0:return Response.json(t,{status:a.status,headers:a.headers});case"Error":return n(t,a.headers);case"Response":for(let e in a.headers)t.headers.append(e,a.headers[e]);return t;case"Blob":default:return new Response(t,{status:a.status,headers:a.headers});case"Promise":return t.then(e=>{let s=r(e,a);if(void 0!==s)return s})}case"function":if(t instanceof Blob)return new Response(t,{status:a.status,headers:a.headers});for(let e in a.headers)t.headers.append(e,a.headers[e]);return t;case"number":case"boolean":return new Response(t.toString(),{status:a.status,headers:a.headers})}else switch(typeof t){case"string":return new Response(t);case"object":switch(t.constructor?.name){case"Object":case"Array":case void 0:return Response.json(t);case"Response":return t;case"Error":return n(t,a.headers);case"Blob":default:return new Response(t);case"Promise":return t.then(e=>{let s=r(e,a);if(void 0!==s)return s})}case"function":if(t instanceof Blob)return new Response(t);return t;case"number":case"boolean":return new Response(t.toString())}},t=(a,o)=>{if(e(o.headers)||200!==o.status||o.redirect)switch(o.redirect&&(o.headers.Location=o.redirect,o.status=302),o.headers["Set-Cookie"]&&Array.isArray(o.headers["Set-Cookie"])&&(o.headers=s(new Headers(o.headers),o.headers["Set-Cookie"])),typeof a){case"string":return new Response(a,{status:o.status,headers:o.headers});case"object":switch(a.constructor?.name){case"Object":case"Array":case void 0:return Response.json(a,{status:o.status,headers:o.headers});case"Error":return n(a,o.headers);case"Response":for(let e in o.headers)a.headers.append(e,o.headers[e]);return a;case"Blob":default:return new Response(a,{status:o.status,headers:o.headers});case"Promise":return a.then(e=>t(e,o))}case"function":if(a instanceof Blob)return new Response(a,{status:o.status,headers:o.headers});return a();case"number":case"boolean":return new Response(a.toString(),{status:o.status,headers:o.headers});case"undefined":return new Response("",{status:o.status,headers:o.headers});default:return new Response(a,{status:o.status,headers:o.headers})}else switch(typeof a){case"string":return new Response(a);case"object":switch(a.constructor?.name){case"Object":case"Array":case void 0:return Response.json(a);case"Response":return a;case"Error":return n(a,o.headers);case"Blob":default:return new Response(a);case"Promise":return a.then(e=>{let s=r(e,o);return void 0!==s?s:new Response("")})}case"function":if(a instanceof Blob)return new Response(a);return a();case"number":case"boolean":return new Response(a.toString());case"undefined":return new Response("");default:return new Response(a)}},n=(e,s)=>new Response(JSON.stringify({name:e?.name,message:e?.message,cause:e?.cause}),{status:500,headers:s});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),function(e,r){for(var s in r)Object.defineProperty(e,s,{enumerable:!0,get:r[s]})}(exports,{isNotEmpty:function(){return e},mapEarlyResponse:function(){return s},mapResponse:function(){return n},mapCompactResponse:function(){return t},errorToResponse:function(){return o}});const e=e=>{for(let r in e)return!0;return!1},r=(e,r)=>{e.delete("Set-Cookie");for(let s=0;s<r.length;s++){let n=r[s].indexOf("=");e.append("Set-Cookie",`${r[s].slice(0,n)}=${r[s].slice(n+1)}`)}return e},s=(n,t)=>{if(e(t.headers)||200!==t.status||t.redirect)switch(t.redirect&&(t.headers.Location=t.redirect,t.status=302),t.headers["Set-Cookie"]&&Array.isArray(t.headers["Set-Cookie"])&&(t.headers=r(new Headers(t.headers),t.headers["Set-Cookie"])),n?.constructor?.name){case"String":case"Blob":return new Response(n,t);case"Object":case"Array":return Response.json(n,t);case void 0:if(!n)return;return Response.json(n,t);case"Response":for(let e in t.headers)n.headers.append(e,t.headers[e]);return n;case"Promise":return n.then(e=>{let r=s(e,t);if(void 0!==r)return r});case"Error":return o(n,t.headers);case"Function":return n();case"Number":case"Boolean":return new Response(n.toString(),t);default:return}else switch(n?.constructor?.name){case"String":case"Blob":return new Response(n);case"Object":case"Array":return Response.json(n);case void 0:if(!n)return new Response("");return Response.json(n);case"Response":return n;case"Promise":return n.then(e=>{let r=s(e,t);if(void 0!==r)return r});case"Error":return o(n,t.headers);case"Function":return n();case"Number":case"Boolean":return new Response(n.toString());default:return}},n=(s,t)=>{if(e(t.headers)||200!==t.status||t.redirect)switch(t.redirect&&(t.headers.Location=t.redirect,t.status=302),t.headers["Set-Cookie"]&&Array.isArray(t.headers["Set-Cookie"])&&(t.headers=r(new Headers(t.headers),t.headers["Set-Cookie"])),s?.constructor?.name){case"String":case"Blob":return new Response(s,{status:t.status,headers:t.headers});case"Object":case"Array":return Response.json(s,t);case void 0:if(!s)return new Response("",t);return Response.json(s,t);case"Response":for(let e in t.headers)s.headers.append(e,t.headers[e]);return s;case"Error":return o(s,t.headers);case"Promise":return s.then(e=>n(e,t));case"Function":return s();case"Number":case"Boolean":return new Response(s.toString(),t);default:return new Response(s,t)}else switch(s?.constructor?.name){case"String":case"Blob":return new Response(s);case"Object":case"Array":return Response.json(s);case void 0:if(!s)return new Response("");return Response.json(s);case"Response":default:return s;case"Error":return o(s);case"Promise":return s.then(e=>{let r=n(e,t);return void 0!==r?r:new Response("")});case"Function":return s();case"Number":case"Boolean":return new Response(s.toString())}},t=e=>{switch(e.constructor?.name){case"String":case"Blob":return new Response(e);case"Object":case"Array":return Response.json(e);case void 0:if(!e)return new Response("");return Response.json(e);case"Response":default:return e;case"Error":return o(e);case"Promise":return e.then(e=>{let r=t(e);return void 0!==r?r:new Response("")});case"Function":return e();case"Number":case"Boolean":return new Response(e.toString())}},o=(e,r)=>new Response(JSON.stringify({name:e?.name,message:e?.message,cause:e?.cause}),{status:500,headers:r});
@@ -418,6 +418,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
418
418
  handle: (request: Request) => Promise<Response>;
419
419
  fetch: (request: Request) => MaybePromise<Response>;
420
420
  handleError: (request: Request, error: Error | ValidationError | ParseError | NotFoundError | InternalServerError, set: Context['set']) => Promise<any>;
421
+ private outerErrorHandler;
421
422
  listen: (options: string | number | Partial<Serve>, callback?: ListenCallback) => this;
422
423
  stop: () => Promise<void>;
423
424
  get modules(): Promise<Elysia<any>[]>;
package/dist/cjs/index.js CHANGED
@@ -1,4 +1,4 @@
1
- function e(t){if("function"!=typeof WeakMap)return null;var r=new WeakMap,s=new WeakMap;return(e=function(e){return e?s:r})(t)}"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),function(e,t){for(var r in t)Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}(exports,{default:function(){return h},Elysia:function(){return h},t:function(){return i.t},ws:function(){return a.ws},SCHEMA:function(){return r.SCHEMA},DEFS:function(){return r.DEFS},EXPOSED:function(){return r.EXPOSED},getSchemaValidator:function(){return r.getSchemaValidator},mergeDeep:function(){return r.mergeDeep},mergeHook:function(){return r.mergeHook},mergeObjectArray:function(){return r.mergeObjectArray},getResponseSchemaValidator:function(){return r.getResponseSchemaValidator},ParseError:function(){return n.ParseError},NotFoundError:function(){return n.NotFoundError},ValidationError:function(){return n.ValidationError},InternalServerError:function(){return n.InternalServerError}});const t=require("memoirist"),r=require("./utils"),s=require("./schema"),o=require("./compose"),a=require("./ws"),i=require("./custom-types"),n=require("./error");class h{config;store={};meta={[r.SCHEMA]:Object.create(null),[r.DEFS]:Object.create(null),[r.EXPOSED]:Object.create(null)};decorators={};event={start:[],request:[],parse:[],transform:[],beforeHandle:[],afterHandle:[],error:[],stop:[]};server=null;$schema=null;router=new t.Memoirist;routes=[];staticRouter={handlers:[],variables:"",map:{},all:""};wsRouter;lazyLoadModules=[];constructor(e){this.config={fn:"/~fn",...e}}add(e,t,a,i,{allowMeta:n=!1}={allowMeta:!1}){t=""===t?t:47===t.charCodeAt(0)?t:`/${t}`,this.routes.push({method:e,path:t,handler:a,hooks:(0,r.mergeHook)({...this.event},i)});let h=this.meta[r.DEFS];if(i?.type)switch(i.type){case"text":i.type="text/plain";break;case"json":i.type="application/json";break;case"formdata":i.type="multipart/form-data";break;case"urlencoded":i.type="application/x-www-form-urlencoded"}(0,s.registerSchemaPath)({schema:this.meta[r.SCHEMA],contentType:i?.type,hook:i,method:e,path:t,models:this.meta[r.DEFS]});let u={body:(0,r.getSchemaValidator)(i?.body??this.$schema?.body,h),headers:(0,r.getSchemaValidator)(i?.headers??this.$schema?.headers,h,!0),params:(0,r.getSchemaValidator)(i?.params??this.$schema?.params,h),query:(0,r.getSchemaValidator)(i?.query??this.$schema?.query,h),response:(0,r.getResponseSchemaValidator)(i?.response??this.$schema?.response,h)},c=(0,r.mergeHook)(this.event,i),l=(0,o.composeHandler)({path:t,method:e,hooks:c,validator:u,handler:a,handleError:this.handleError,meta:n?this.meta:void 0});if(-1===t.indexOf(":")&&-1===t.indexOf("*")){let r=this.staticRouter.handlers.length;this.staticRouter.handlers.push(l),this.staticRouter.variables+=`const st${r} = staticRouter.handlers[${r}]
2
- `,this.staticRouter.map[t]||(this.staticRouter.map[t]={code:"",all:"default: break map\n"}),"ALL"===e?this.staticRouter.map[t].all=`default: return st${r}(ctx)
1
+ function e(t){if("function"!=typeof WeakMap)return null;var r=new WeakMap,s=new WeakMap;return(e=function(e){return e?s:r})(t)}"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),function(e,t){for(var r in t)Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}(exports,{default:function(){return h},Elysia:function(){return h},t:function(){return i.t},ws:function(){return a.ws},SCHEMA:function(){return r.SCHEMA},DEFS:function(){return r.DEFS},EXPOSED:function(){return r.EXPOSED},getSchemaValidator:function(){return r.getSchemaValidator},mergeDeep:function(){return r.mergeDeep},mergeHook:function(){return r.mergeHook},mergeObjectArray:function(){return r.mergeObjectArray},getResponseSchemaValidator:function(){return r.getResponseSchemaValidator},ParseError:function(){return n.ParseError},NotFoundError:function(){return n.NotFoundError},ValidationError:function(){return n.ValidationError},InternalServerError:function(){return n.InternalServerError}});const t=require("memoirist"),r=require("./utils"),s=require("./schema"),o=require("./compose"),a=require("./ws"),i=require("./custom-types"),n=require("./error");class h{config;store={};meta={[r.SCHEMA]:Object.create(null),[r.DEFS]:Object.create(null),[r.EXPOSED]:Object.create(null)};decorators={};event={start:[],request:[],parse:[],transform:[],beforeHandle:[],afterHandle:[],error:[],stop:[]};server=null;$schema=null;router=new t.Memoirist;routes=[];staticRouter={handlers:[],variables:"",map:{},all:""};wsRouter;lazyLoadModules=[];constructor(e){this.config={fn:"/~fn",forceErrorEncapsulation:!1,...e}}add(e,t,a,i,{allowMeta:n=!1}={allowMeta:!1}){t=""===t?t:47===t.charCodeAt(0)?t:`/${t}`,this.routes.push({method:e,path:t,handler:a,hooks:(0,r.mergeHook)({...this.event},i)});let h=this.meta[r.DEFS];if(i?.type)switch(i.type){case"text":i.type="text/plain";break;case"json":i.type="application/json";break;case"formdata":i.type="multipart/form-data";break;case"urlencoded":i.type="application/x-www-form-urlencoded"}(0,s.registerSchemaPath)({schema:this.meta[r.SCHEMA],contentType:i?.type,hook:i,method:e,path:t,models:this.meta[r.DEFS]});let u={body:(0,r.getSchemaValidator)(i?.body??this.$schema?.body,h),headers:(0,r.getSchemaValidator)(i?.headers??this.$schema?.headers,h,!0),params:(0,r.getSchemaValidator)(i?.params??this.$schema?.params,h),query:(0,r.getSchemaValidator)(i?.query??this.$schema?.query,h),response:(0,r.getResponseSchemaValidator)(i?.response??this.$schema?.response,h)},c=(0,r.mergeHook)(this.event,i),d=(0,o.composeHandler)({path:t,method:e,hooks:c,validator:u,handler:a,handleError:this.handleError,meta:n?this.meta:void 0,onRequest:this.event.request,config:this.config});if(-1===t.indexOf(":")&&-1===t.indexOf("*")){let r=this.staticRouter.handlers.length;this.staticRouter.handlers.push(d),this.staticRouter.variables+=`const st${r} = staticRouter.handlers[${r}]
2
+ `,this.staticRouter.map[t]||(this.staticRouter.map[t]={code:""}),"ALL"===e?this.staticRouter.map[t].all=`default: return st${r}(ctx)
3
3
  `:this.staticRouter.map[t].code+=`case '${e}': return st${r}(ctx)
4
- `}else this.router.add(e,t,l)}onStart(e){return this.event.start.push(e),this}onRequest(e){return this.event.request.push(e),this}onParse(e){return this.event.parse.splice(this.event.parse.length-1,0,e),this}onTransform(e){return this.event.transform.push(e),this}onBeforeHandle(e){return this.event.beforeHandle.push(e),this}onAfterHandle(e){return this.event.afterHandle.push(e),this}onError(e){return this.event.error.push(e),this}onStop(e){return this.event.stop.push(e),this}on(e,t){switch(e){case"start":this.event.start.push(t);break;case"request":this.event.request.push(t);break;case"parse":this.event.parse.push(t);break;case"transform":this.event.transform.push(t);break;case"beforeHandle":this.event.beforeHandle.push(t);break;case"afterHandle":this.event.afterHandle.push(t);break;case"error":this.event.error.push(t);break;case"stop":this.event.stop.push(t)}return this}group(e,t,s){let o=new h;o.store=this.store,this.wsRouter&&o.use((0,a.ws)());let i="object"==typeof t,n=(i?s:t)(o);return this.decorators=(0,r.mergeDeep)(this.decorators,o.decorators),n.event.request.length&&(this.event.request=[...this.event.request,...n.event.request]),this.model(n.meta[r.DEFS]),Object.values(o.routes).forEach(({method:s,path:a,handler:h,hooks:u})=>{if(i){let i=`${e}${a}`,c=o.wsRouter?.find("subscribe",i);if(c){let e=o.wsRouter.history.find(([e,t])=>i===t);if(!e)return;return this.ws(i,e[2])}this.add(s,i,h,(0,r.mergeHook)(t,{...u,error:u.error?Array.isArray(u.error)?[...u.error,...n.event.error]:[u.error,...n.event.error]:n.event.error}))}else{let t=`${e}${a}`,i=o.wsRouter?.find("subscribe",t);if(i){let e=o.wsRouter.history.find(([e,t])=>a===t);if(!e)return;return this.ws(t,e[2])}this.add(s,t,h,(0,r.mergeHook)(u,{error:n.event.error}))}}),o.wsRouter&&this.wsRouter&&o.wsRouter.history.forEach(([t,r,s])=>{"/"===r?this.wsRouter?.add(t,e,s):this.wsRouter?.add(t,`${e}${r}`,s)}),this}guard(e,t){let s=new h;s.store=this.store,this.wsRouter&&s.use((0,a.ws)());let o=t(s);return this.decorators=(0,r.mergeDeep)(this.decorators,s.decorators),o.event.request.length&&(this.event.request=[...this.event.request,...o.event.request]),this.model(o.meta[r.DEFS]),Object.values(s.routes).forEach(({method:t,path:a,handler:i,hooks:n})=>{let h=s.wsRouter?.find("subscribe",a);if(h){let e=s.wsRouter.history.find(([e,t])=>a===t);if(!e)return;return this.ws(a,e[2])}this.add(t,a,i,(0,r.mergeHook)(e,{...n,error:n.error?Array.isArray(n.error)?[...n.error,...o.event.error]:[n.error,...o.event.error]:o.event.error}))}),s.wsRouter&&this.wsRouter&&s.wsRouter.history.forEach(([e,t,r])=>{this.wsRouter?.add(e,t,r)}),this}use(e){if(e instanceof Promise)return this.lazyLoadModules.push(e.then(e=>"function"==typeof e?e(this):e.default(this)).then(e=>e.compile())),this;let t=e(this);return t instanceof Promise?(this.lazyLoadModules.push(t.then(e=>e.compile())),this):t}if(e,t){return e?this.use(t):this}get(e,t,r){return this.add("GET",e,t,r),this}post(e,t,r){return this.add("POST",e,t,r),this}put(e,t,r){return this.add("PUT",e,t,r),this}patch(e,t,r){return this.add("PATCH",e,t,r),this}delete(e,t,r){return this.add("DELETE",e,t,r),this}options(e,t,r){return this.add("OPTIONS",e,t,r),this}all(e,t,r){return this.add("ALL",e,t,r),this}head(e,t,r){return this.add("HEAD",e,t,r),this}trace(e,t,r){return this.add("TRACE",e,t,r),this}connect(e,t,r){return this.add("CONNECT",e,t,r),this}ws(e,t){if(!this.wsRouter)throw Error("Can't find WebSocket. Please register WebSocket plugin first by importing 'elysia/ws'");return this.wsRouter.add("subscribe",e,t),this.get(e,e=>{if(!this.server?.upgrade(e.request,{headers:"function"==typeof t.upgrade?t.upgrade(e):t.upgrade,data:{...e,id:Date.now(),message:(0,r.getSchemaValidator)(t?.body,this.meta[r.DEFS]),transformMessage:t.transform?Array.isArray(t.transformMessage)?t.transformMessage:[t.transformMessage]:[]}}))return e.set.status=400,"Expected a websocket connection"},{beforeHandle:t.beforeHandle,transform:t.transform,headers:t?.headers,params:t?.params,query:t?.query}),this}route(e,t,r,{config:s,...o}={config:{allowMeta:!1}}){return this.add(e,t,r,o,s),this}state(e,t){return"object"==typeof e?(this.store=(0,r.mergeDeep)(this.store,e),this):(e in this.store||(this.store[e]=t),this)}decorate(e,t){return"object"==typeof e?(this.decorators=(0,r.mergeDeep)(this.decorators,e),this):(e in this.decorators||(this.decorators[e]=t),this)}derive(e){return e.$elysia="derive",this.onTransform(e)}fn(t){return this.use(async r=>{let{fn:s}=await Promise.resolve().then(()=>(function(t,r){if(!r&&t&&t.__esModule)return t;if(null===t||"object"!=typeof t&&"function"!=typeof t)return{default:t};var s=e(r);if(s&&s.has(t))return s.get(t);var o={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in t)if("default"!==i&&Object.prototype.hasOwnProperty.call(t,i)){var n=a?Object.getOwnPropertyDescriptor(t,i):null;n&&(n.get||n.set)?Object.defineProperty(o,i,n):o[i]=t[i]}return o.default=t,s&&s.set(t,o),o})(require("@elysiajs/fn")));return s({app:r,value:t,path:r.config.fn})})}schema(e){let t=this.meta[r.DEFS];return this.$schema={body:(0,r.getSchemaValidator)(e.body,t),headers:(0,r.getSchemaValidator)(e?.headers,t,!0),params:(0,r.getSchemaValidator)(e?.params,t),query:(0,r.getSchemaValidator)(e?.query,t),response:(0,r.getSchemaValidator)(e?.response,t)},this}compile(){return this.fetch=(0,o.composeGeneralHandler)(this),this.server&&this.server.reload({...this.server,fetch:this.fetch}),this}handle=async e=>this.fetch(e);fetch=e=>(this.fetch=(0,o.composeGeneralHandler)(this))(e);handleError=async(e,t,r)=>(this.handleError=(0,o.composeErrorHandler)(this))(e,t,r);listen=(e,t)=>{if(!Bun)throw Error("Bun to run");if(this.compile(),"string"==typeof e&&Number.isNaN(e=+e))throw Error("Port must be a numeric value");let r=this.fetch,s=(process.env.ENV??process.env.NODE_ENV)!=="production",o="object"==typeof e?{...this.config.serve,...e,development:s,fetch:r}:{...this.config.serve,port:e,fetch:r};if("production"!==process.env.ENV){let e=`$$Elysia:${o.port}`;globalThis[e]?(this.server=globalThis[e],this.server.reload(o)):globalThis[e]=this.server=Bun.serve(o)}else this.server=Bun.serve(o);for(let e=0;e<this.event.start.length;e++)this.event.start[e](this);return t&&t(this.server),Promise.all(this.lazyLoadModules).then(()=>{Bun.gc(!0)}),this};stop=async()=>{if(!this.server)throw Error("Elysia isn't running. Call `app.listen` to start the server.");this.server.stop();for(let e=0;e<this.event.stop.length;e++)await this.event.stop[e](this)};get modules(){return Promise.all(this.lazyLoadModules)}model(e,t){return"object"==typeof e?Object.entries(e).forEach(([e,t])=>{e in this.meta[r.DEFS]||(this.meta[r.DEFS][e]=t)}):this.meta[r.DEFS][e]=t,this}}
4
+ `}else this.router.add(e,t,d)}onStart(e){return this.event.start.push(e),this}onRequest(e){return this.event.request.push(e),this}onParse(e){return this.event.parse.splice(this.event.parse.length-1,0,e),this}onTransform(e){return this.event.transform.push(e),this}onBeforeHandle(e){return this.event.beforeHandle.push(e),this}onAfterHandle(e){return this.event.afterHandle.push(e),this}onError(e){return this.event.error.push(e),this}onStop(e){return this.event.stop.push(e),this}on(e,t){switch(e){case"start":this.event.start.push(t);break;case"request":this.event.request.push(t);break;case"parse":this.event.parse.push(t);break;case"transform":this.event.transform.push(t);break;case"beforeHandle":this.event.beforeHandle.push(t);break;case"afterHandle":this.event.afterHandle.push(t);break;case"error":this.event.error.push(t);break;case"stop":this.event.stop.push(t)}return this}group(e,t,s){let o=new h;o.store=this.store,this.wsRouter&&o.use((0,a.ws)());let i="object"==typeof t,n=(i?s:t)(o);return this.decorators=(0,r.mergeDeep)(this.decorators,o.decorators),n.event.request.length&&(this.event.request=[...this.event.request,...n.event.request]),this.model(n.meta[r.DEFS]),Object.values(o.routes).forEach(({method:s,path:a,handler:h,hooks:u})=>{if(i){let i=`${e}${a}`,c=o.wsRouter?.find("subscribe",i);if(c){let e=o.wsRouter.history.find(([e,t])=>i===t);if(!e)return;return this.ws(i,e[2])}this.add(s,i,h,(0,r.mergeHook)(t,{...u,error:u.error?Array.isArray(u.error)?[...u.error,...n.event.error]:[u.error,...n.event.error]:n.event.error}))}else{let t=`${e}${a}`,i=o.wsRouter?.find("subscribe",t);if(i){let e=o.wsRouter.history.find(([e,t])=>a===t);if(!e)return;return this.ws(t,e[2])}this.add(s,t,h,(0,r.mergeHook)(u,{error:n.event.error}))}}),o.wsRouter&&this.wsRouter&&o.wsRouter.history.forEach(([t,r,s])=>{"/"===r?this.wsRouter?.add(t,e,s):this.wsRouter?.add(t,`${e}${r}`,s)}),this}guard(e,t){let s=new h;s.store=this.store,this.wsRouter&&s.use((0,a.ws)());let o=t(s);return this.decorators=(0,r.mergeDeep)(this.decorators,s.decorators),o.event.request.length&&(this.event.request=[...this.event.request,...o.event.request]),this.model(o.meta[r.DEFS]),Object.values(s.routes).forEach(({method:t,path:a,handler:i,hooks:n})=>{let h=s.wsRouter?.find("subscribe",a);if(h){let e=s.wsRouter.history.find(([e,t])=>a===t);if(!e)return;return this.ws(a,e[2])}this.add(t,a,i,(0,r.mergeHook)(e,{...n,error:n.error?Array.isArray(n.error)?[...n.error,...o.event.error]:[n.error,...o.event.error]:o.event.error}))}),s.wsRouter&&this.wsRouter&&s.wsRouter.history.forEach(([e,t,r])=>{this.wsRouter?.add(e,t,r)}),this}use(e){if(e instanceof Promise)return this.lazyLoadModules.push(e.then(e=>"function"==typeof e?e(this):e.default(this)).then(e=>e.compile())),this;let t=e(this);return t instanceof Promise?(this.lazyLoadModules.push(t.then(e=>e.compile())),this):t}if(e,t){return e?this.use(t):this}get(e,t,r){return this.add("GET",e,t,r),this}post(e,t,r){return this.add("POST",e,t,r),this}put(e,t,r){return this.add("PUT",e,t,r),this}patch(e,t,r){return this.add("PATCH",e,t,r),this}delete(e,t,r){return this.add("DELETE",e,t,r),this}options(e,t,r){return this.add("OPTIONS",e,t,r),this}all(e,t,r){return this.add("ALL",e,t,r),this}head(e,t,r){return this.add("HEAD",e,t,r),this}trace(e,t,r){return this.add("TRACE",e,t,r),this}connect(e,t,r){return this.add("CONNECT",e,t,r),this}ws(e,t){if(!this.wsRouter)throw Error("Can't find WebSocket. Please register WebSocket plugin first by importing 'elysia/ws'");return this.wsRouter.add("subscribe",e,t),this.get(e,e=>{if(!this.server?.upgrade(e.request,{headers:"function"==typeof t.upgrade?t.upgrade(e):t.upgrade,data:{...e,id:Date.now(),headers:e.request.headers.toJSON(),message:(0,r.getSchemaValidator)(t?.body,this.meta[r.DEFS]),transformMessage:t.transform?Array.isArray(t.transformMessage)?t.transformMessage:[t.transformMessage]:[]}}))return e.set.status=400,"Expected a websocket connection"},{beforeHandle:t.beforeHandle,transform:t.transform,headers:t?.headers,params:t?.params,query:t?.query}),this}route(e,t,r,{config:s,...o}={config:{allowMeta:!1}}){return this.add(e,t,r,o,s),this}state(e,t){return"object"==typeof e?(this.store=(0,r.mergeDeep)(this.store,e),this):(e in this.store||(this.store[e]=t),this)}decorate(e,t){return"object"==typeof e?(this.decorators=(0,r.mergeDeep)(this.decorators,e),this):(e in this.decorators||(this.decorators[e]=t),this)}derive(e){return e.$elysia="derive",this.onTransform(e)}fn(t){return this.use(async r=>{let{fn:s}=await Promise.resolve().then(()=>(function(t,r){if(!r&&t&&t.__esModule)return t;if(null===t||"object"!=typeof t&&"function"!=typeof t)return{default:t};var s=e(r);if(s&&s.has(t))return s.get(t);var o={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in t)if("default"!==i&&Object.prototype.hasOwnProperty.call(t,i)){var n=a?Object.getOwnPropertyDescriptor(t,i):null;n&&(n.get||n.set)?Object.defineProperty(o,i,n):o[i]=t[i]}return o.default=t,s&&s.set(t,o),o})(require("@elysiajs/fn")));return s({app:r,value:t,path:r.config.fn})})}schema(e){let t=this.meta[r.DEFS];return this.$schema={body:(0,r.getSchemaValidator)(e.body,t),headers:(0,r.getSchemaValidator)(e?.headers,t,!0),params:(0,r.getSchemaValidator)(e?.params,t),query:(0,r.getSchemaValidator)(e?.query,t),response:(0,r.getSchemaValidator)(e?.response,t)},this}compile(){return this.fetch=(0,o.composeGeneralHandler)(this),this.server&&this.server.reload({...this.server,fetch:this.fetch}),this}handle=async e=>this.fetch(e);fetch=e=>(this.fetch=(0,o.composeGeneralHandler)(this))(e);handleError=async(e,t,r)=>(this.handleError=(0,o.composeErrorHandler)(this))(e,t,r);outerErrorHandler=e=>new Response(e.message,{status:e?.status??500});listen=(e,t)=>{if(!Bun)throw Error("Bun to run");if(this.compile(),"string"==typeof e&&Number.isNaN(e=+e))throw Error("Port must be a numeric value");let r=this.fetch,s=(process.env.ENV??process.env.NODE_ENV)!=="production",o="object"==typeof e?{...this.config.serve,...e,development:s,fetch:r,error:this.outerErrorHandler}:{...this.config.serve,port:e,fetch:r,error:this.outerErrorHandler};if("production"!==process.env.ENV){let e=`$$Elysia:${o.port}`;globalThis[e]?(this.server=globalThis[e],this.server.reload(o)):globalThis[e]=this.server=Bun.serve(o)}else this.server=Bun.serve(o);for(let e=0;e<this.event.start.length;e++)this.event.start[e](this);return t&&t(this.server),Promise.all(this.lazyLoadModules).then(()=>{Bun.gc(!0)}),this};stop=async()=>{if(!this.server)throw Error("Elysia isn't running. Call `app.listen` to start the server.");this.server.stop();for(let e=0;e<this.event.stop.length;e++)await this.event.stop[e](this)};get modules(){return Promise.all(this.lazyLoadModules)}model(e,t){return"object"==typeof e?Object.entries(e).forEach(([e,t])=>{e in this.meta[r.DEFS]||(this.meta[r.DEFS][e]=t)}):this.meta[r.DEFS][e]=t,this}}
@@ -188,6 +188,7 @@ export type ComposedHandler = (context: Context) => MaybePromise<Response>;
188
188
  export interface ElysiaConfig {
189
189
  fn?: string;
190
190
  serve?: Partial<Serve>;
191
+ forceErrorEncapsulation?: boolean;
191
192
  }
192
193
  export type IsPathParameter<Part> = Part extends `:${infer Parameter}` ? Parameter : never;
193
194
  export type ExtractPath<Path> = Path extends `${infer A}/${infer B}` ? IsPathParameter<A> | ExtractPath<B> : IsPathParameter<Path>;
@@ -20,7 +20,7 @@ export declare class ElysiaWS<WS extends ElysiaWSContext<any> = ElysiaWSContext,
20
20
  export declare const ws: (config?: Omit<WebSocketHandler, 'open' | 'message' | 'close' | 'drain'>) => (app: Elysia) => Elysia<{
21
21
  store: {};
22
22
  request: {
23
- publish: (topic: string, data: string | import("bun").ArrayBufferView | ArrayBuffer | SharedArrayBuffer, compress?: boolean | undefined) => number;
23
+ publish: (topic: string, data: string | ArrayBuffer | SharedArrayBuffer | import("bun").ArrayBufferView, compress?: boolean | undefined) => number;
24
24
  };
25
25
  schema: {};
26
26
  meta: Record<typeof import("..").SCHEMA, {}> & Record<typeof DEFS, {}> & Record<typeof import("..").EXPOSED, {}>;
package/dist/compose.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  import type { Elysia } from '.';
2
2
  import { SCHEMA, DEFS } from './utils';
3
- import type { ComposedHandler, HTTPMethod, LocalHandler, RegisteredHook, SchemaValidator } from './types';
4
- import { TAnySchema } from '@sinclair/typebox';
3
+ import type { ElysiaConfig, BeforeRequestHandler, ComposedHandler, HTTPMethod, LocalHandler, RegisteredHook, SchemaValidator } from './types';
4
+ import type { TAnySchema } from '@sinclair/typebox';
5
5
  export declare const hasReturn: (fnLiteral: string) => boolean;
6
6
  export declare const isFnUse: (keyword: string, fnLiteral: string) => boolean;
7
7
  export declare const findElysiaMeta: (type: string, schema: TAnySchema, found?: string[], parent?: string) => string[] | "root" | null;
8
- export declare const composeHandler: ({ path, method, hooks, validator, handler, handleError, meta }: {
8
+ export declare const composeHandler: ({ method, hooks, validator, handler, handleError, meta, onRequest, config }: {
9
9
  path: string;
10
10
  method: HTTPMethod;
11
11
  hooks: RegisteredHook<any>;
@@ -13,6 +13,8 @@ export declare const composeHandler: ({ path, method, hooks, validator, handler,
13
13
  handler: LocalHandler<any, any>;
14
14
  handleError: Elysia['handleError'];
15
15
  meta?: (Record<typeof SCHEMA, {}> & Record<typeof DEFS, {}> & Record<typeof import("./utils").EXPOSED, {}>) | undefined;
16
+ onRequest: BeforeRequestHandler<any, any>[];
17
+ config: ElysiaConfig;
16
18
  }) => ComposedHandler;
17
19
  export declare const composeGeneralHandler: (app: Elysia<any>) => any;
18
20
  export declare const composeErrorHandler: (app: Elysia<any>) => any;
package/dist/compose.js CHANGED
@@ -1,31 +1,42 @@
1
- import{parse as e}from"fast-querystring";import{mapEarlyResponse as r,mapResponse as t}from"./handler";import{SCHEMA as n,DEFS as s}from"./utils";import{ParseError as o,NotFoundError as a,ValidationError as c,InternalServerError as i}from"./error";let l="AsyncFunction",f=e=>e.constructor.name===l,d=new Headers,u=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")};export const isFnUse=(e,r)=>{let t=r.slice(r.indexOf("(")+1,r.indexOf(")"));if(""===t)return!1;if(123===t.charCodeAt(0))return!!(t.includes(`{ ${e}`)||t.includes(`, ${e}`));if(r.match(RegExp(`${t}(.${e}|\\["${e}"\\])`)))return!0;let n=[t];for(let e of r.matchAll(u))n.push(e[1]);let s=RegExp(`{.*?} = (${n.join("|")})`,"g");for(let[t]of r.matchAll(s))if(t.includes(`{ ${e}`)||t.includes(`, ${e}`))return!0;return!1};export const findElysiaMeta=(e,r,t=[],n="")=>{if("object"===r.type){let s=r.properties;for(let r in s){let o=s[r],a=n?n+"."+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?(n&&t.push(n),"root"):null};export const composeHandler=({path:u,method:p,hooks:y,validator:h,handler:m,handleError:$,meta:b})=>{let E="try {\n",w="string"==typeof y.type,q=h||"GET"!==p?[m,...y.transform,...y.beforeHandle,...y.afterHandle].map(e=>e.toString()):[],g="GET"!==p&&(h.body||w||q.some(e=>isFnUse("body",e))),x=h.headers||q.some(e=>isFnUse("headers",e));x&&(E+=d.toJSON?`c.headers = c.request.headers.toJSON()
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 l,InternalServerError as i}from"./error";let f="AsyncFunction",u=e=>e.constructor.name===f,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(
2
+ '${r}',
3
+ ${r},
4
+ ${t}
5
+ )`:`return new ValidationError(
6
+ '${r}',
7
+ ${r},
8
+ ${t}
9
+ ).toResponse(c.set.headers)`,composeResponseValidation:(r="r")=>e?`throw new ValidationError(
10
+ 'response',
11
+ response[c.set.status],
12
+ ${r}
13
+ )`:`return new ValidationError(
14
+ 'response',
15
+ response[c.set.status],
16
+ ${r}
17
+ ).toResponse(c.set.headers)`});export const isFnUse=(e,r)=>{let t=r.slice(r.indexOf("(")+1,r.indexOf(")"));if(""===t)return!1;if(123===t.charCodeAt(0))return!!(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:h,validator:$,handler:m,handleError:b,meta:q,onRequest:E,config:g})=>{let x=g.forceErrorEncapsulation||h.error.length>0||void 0===Bun,{composeValidation:w,composeResponseValidation:k}=y(x),H=x?"try {\n":"",R="string"==typeof h.type,v=$||"GET"!==p?[m,...h.transform,...h.beforeHandle,...h.afterHandle].map(e=>e.toString()):[],O="GET"!==p&&($.body||R||v.some(e=>isFnUse("body",e))),S=$.headers||v.some(e=>isFnUse("headers",e));S&&(H+=d.toJSON?`c.headers = c.request.headers.toJSON()
2
18
  `:`c.headers = {}
3
19
  for (const key of c.request.headers.keys())
4
20
  h[key] = c.request.headers.get(key)
5
21
 
6
- if (headers.Check(h) === false) {
7
- throw throw new ValidationError(
8
- 'header',
9
- headers,
10
- h
11
- )
12
- }
13
- `);let k=h.query||q.some(e=>isFnUse("query",e));k&&(E+=`const url = c.request.url
22
+ if (headers.Check(c.headers) === false)
23
+ ${w("headers")}
24
+ `);let C=$.query||v.some(e=>isFnUse("query",e));C&&(H+=`const url = c.request.url
14
25
 
15
26
  if(c.query !== -1) {
16
27
  c.query = parseQuery(url.substring(c.query + 1))
17
28
  } else {
18
29
  c.query = {}
19
30
  }
20
- `);let H=g||m.constructor.name===l||y.parse.length||y.afterHandle.find(f)||y.beforeHandle.find(f)||y.transform.find(f);if(g){let e=h?.body?.schema;if(e&&"anyOf"in e){let r=!1,t=e.anyOf[0].type;for(let n of e.anyOf)if(n.type!==t){r=!0;break}r&&(e=void 0)}if(w||e){if(y.parse.length){E+=(x?"let contentType = c.headers['content-type']":"let contentType = c.request.headers.get('content-type')")+`
31
+ `);let F=v.some(e=>isFnUse("set",e))||E.some(e=>isFnUse("set",e.toString())),N=O||m.constructor.name===f||h.parse.length||h.afterHandle.find(u)||h.beforeHandle.find(u)||h.transform.find(u);if(O){let e=$?.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(h.parse.length){H+=(S?"let contentType = c.headers['content-type']":"let contentType = c.request.headers.get('content-type')")+`
21
32
  if (contentType) {
22
33
  const index = contentType.indexOf(';')
23
34
  if (index !== -1) contentType = contentType.substring(0, index)
24
35
  `+`let used = false
25
- `;for(let e=0;e<y.parse.length;e++){let r=`bo${e}`;0!==e&&(E+=`if(!used) {
26
- `),E+=`let ${r} = parse[${e}](c, contentType);if(${r} instanceof Promise) ${r} = await ${r};
36
+ `;for(let e=0;e<h.parse.length;e++){let r=`bo${e}`;0!==e&&(H+=`if(!used) {
37
+ `),H+=`let ${r} = parse[${e}](c, contentType);if(${r} instanceof Promise) ${r} = await ${r};
27
38
  if(${r} !== undefined) { c.body = ${r}; used = true }
28
- `,0!==e&&(E+="}")}E+="if (!used) {"}if(e)"object"===e.type?"URLEncoded"===e.elysiaMeta?E+="c.body = parseQuery(await c.request.text())":h.body.Code().includes("custom('File")?E+=`c.body = {}
39
+ `,0!==e&&(H+="}")}H+="if (!used) {"}if(e)"object"===e.type?"URLEncoded"===e.elysiaMeta?H+="c.body = parseQuery(await c.request.text())":$.body.Code().includes("custom('File")?H+=`c.body = {}
29
40
 
30
41
  await c.request.formData().then((form) => {
31
42
  for (const key of form.keys()) {
@@ -37,7 +48,7 @@ import{parse as e}from"fast-querystring";import{mapEarlyResponse as r,mapRespons
37
48
  c.body[key] = value[0]
38
49
  else c.body[key] = value
39
50
  }
40
- })`:E+="c.body = JSON.parse(await c.request.text())":E+="c.body = await c.request.text()";else switch(y.type){case"application/json":E+="c.body = JSON.parse(await c.request.text());";break;case"text/plain":E+="c.body = await c.request.text();";break;case"application/x-www-form-urlencoded":E+="c.body = parseQuery(await c.request.text());";break;case"multipart/form-data":E+=`c.body = {}
51
+ })`:H+="c.body = JSON.parse(await c.request.text())":H+="c.body = await c.request.text()";else switch(h.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"multipart/form-data":H+=`c.body = {}
41
52
 
42
53
  for (const key of (await c.request.formData()).keys()) {
43
54
  if (c.body[key])
@@ -47,15 +58,15 @@ import{parse as e}from"fast-querystring";import{mapEarlyResponse as r,mapRespons
47
58
  if (value.length === 1)
48
59
  c.body[key] = value[0]
49
60
  else c.body[key] = value
50
- }`}y.parse.length&&(E+="}}")}else{if(E+="\n"+(x?"let contentType = c.headers['content-type']":"let contentType = c.request.headers.get('content-type')")+`
61
+ }`}h.parse.length&&(H+="}}")}else{if(H+="\n"+(S?"let contentType = c.headers['content-type']":"let contentType = c.request.headers.get('content-type')")+`
51
62
  if (contentType) {
52
63
  const index = contentType.indexOf(';')
53
64
  if (index !== -1) contentType = contentType.substring(0, index)
54
- `,y.parse.length){E+=`let used = false
55
- `;for(let e=0;e<y.parse.length;e++){let r=`bo${e}`;0!==e&&(E+=`if(!used) {
56
- `),E+=`let ${r} = parse[${e}](c, contentType);if(${r} instanceof Promise) ${r} = await ${r};
65
+ `,h.parse.length){H+=`let used = false
66
+ `;for(let e=0;e<h.parse.length;e++){let r=`bo${e}`;0!==e&&(H+=`if(!used) {
67
+ `),H+=`let ${r} = parse[${e}](c, contentType);if(${r} instanceof Promise) ${r} = await ${r};
57
68
  if(${r} !== undefined) { c.body = ${r}; used = true }
58
- `,0!==e&&(E+="}")}E+="if (!used)"}E+=`switch (contentType) {
69
+ `,0!==e&&(H+="}")}H+="if (!used)"}H+=`switch (contentType) {
59
70
  case 'application/json':
60
71
  c.body = JSON.parse(await c.request.text())
61
72
  break
@@ -84,63 +95,64 @@ import{parse as e}from"fast-querystring";import{mapEarlyResponse as r,mapRespons
84
95
  break
85
96
  }
86
97
  }
87
- `}E+="\n"}if(h.params){let e=findElysiaMeta("Numeric",h.params.schema);if(e){if("object"==typeof e)for(let r of e)E+=`c.params.${r} = +c.params.${r};`;E+="\n"}}if(h.query){let e=findElysiaMeta("Numeric",h.query.schema);if(e){if("object"==typeof e)for(let r of e)E+=`c.query.${r} = +c.query.${r};`;E+="\n"}}if(h.headers){let e=findElysiaMeta("Numeric",h.headers.schema);if(e){if("object"==typeof e)for(let r of e)E+=`c.headers.${r} = +c.headers.${r};`;E+="\n"}}if(h.body){let e=findElysiaMeta("Numeric",h.body.schema);if(e){switch(typeof e){case"string":E+="c.body = +c.body;";break;case"object":for(let r of e)E+=`c.body.${r} = +c.body.${r};`}E+="\n"}}if(y?.transform)for(let e=0;e<y.transform.length;e++){let r=y.transform[e];"derive"===r.$elysia?E+=y.transform[e].constructor.name===l?`Object.assign(c, await transform[${e}](c));`:`Object.assign(c, transform[${e}](c));`:E+=y.transform[e].constructor.name===l?`await transform[${e}](c);`:`transform[${e}](c);`}if(h&&(h.headers&&(E+=`
98
+ `}H+="\n"}if($.params){let e=findElysiaMeta("Numeric",$.params.schema);if(e){if("object"==typeof e)for(let r of e)H+=`c.params.${r} = +c.params.${r};`;H+="\n"}}if($.query){let e=findElysiaMeta("Numeric",$.query.schema);if(e){if("object"==typeof e)for(let r of e)H+=`c.query.${r} = +c.query.${r};`;H+="\n"}}if($.headers){let e=findElysiaMeta("Numeric",$.headers.schema);if(e){if("object"==typeof e)for(let r of e)H+=`c.headers.${r} = +c.headers.${r};`;H+="\n"}}if($.body){let e=findElysiaMeta("Numeric",$.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(h?.transform)for(let e=0;e<h.transform.length;e++){let r=h.transform[e];"derive"===r.$elysia?H+=h.transform[e].constructor.name===f?`Object.assign(c, await transform[${e}](c));`:`Object.assign(c, transform[${e}](c));`:H+=h.transform[e].constructor.name===f?`await transform[${e}](c);`:`transform[${e}](c);`}if($&&($.headers&&(H+=`
88
99
  if (headers.Check(c.headers) === false) {
89
- throw new ValidationError(
90
- 'header',
91
- headers,
92
- c.headers
93
- )
100
+ ${w("headers")}
94
101
  }
95
- `),h.params&&(E+="if(params.Check(c.params) === false) { throw new ValidationError('params', params, c.params) }"),h.query&&(E+="if(query.Check(c.query) === false) { throw new ValidationError('query', query, c.query) }"),h.body&&(E+="if(body.Check(c.body) === false) { throw new ValidationError('body', body, c.body) }")),y?.beforeHandle)for(let e=0;e<y.beforeHandle.length;e++){let r=`be${e}`,t=hasReturn(y.beforeHandle[e].toString());if(t){if(E+=(y.beforeHandle[e].constructor.name===l?`let ${r} = await beforeHandle[${e}](c);
102
+ `),$.params&&(H+=`if(params.Check(c.params) === false) { ${w("params")} }`),$.query&&(H+=`if(query.Check(c.query) === false) { ${w("query")} }`),$.body&&(H+=`if(body.Check(c.body) === false) { ${w("body")} }`)),h?.beforeHandle)for(let e=0;e<h.beforeHandle.length;e++){let r=`be${e}`,t=hasReturn(h.beforeHandle[e].toString());if(t){if(H+=(h.beforeHandle[e].constructor.name===f?`let ${r} = await beforeHandle[${e}](c);
96
103
  `:`let ${r} = beforeHandle[${e}](c);
97
104
  `)+`if(${r} !== undefined) {
98
- `,y?.afterHandle)for(let e=0;e<y.afterHandle.length;e++){let t=hasReturn(y.afterHandle[e].toString());if(t){let t=`af${e}`;E+=(y.afterHandle[e].constructor.name===l?`const ${t} = await afterHandle[${e}](c, ${r});
105
+ `,h?.afterHandle)for(let e=0;e<h.afterHandle.length;e++){let t=hasReturn(h.afterHandle[e].toString());if(t){let t=`af${e}`;H+=(h.afterHandle[e].constructor.name===f?`const ${t} = await afterHandle[${e}](c, ${r});
99
106
  `:`const ${t} = afterHandle[${e}](c, ${r});
100
107
  `)+`if(${t} !== undefined) { ${r} = ${t} }
101
- `}else E+=y.afterHandle[e].constructor.name===l?`await afterHandle[${e}](c, ${r});
108
+ `}else H+=h.afterHandle[e].constructor.name===f?`await afterHandle[${e}](c, ${r});
102
109
  `:`afterHandle[${e}](c, ${r});
103
- `}h.response&&(E+=`if(response[c.set.status]?.Check(${r}) === false) {
110
+ `}$.response&&(H+=`if(response[c.set.status]?.Check(${r}) === false) {
104
111
  if(!(response instanceof Error))
105
- throw new ValidationError('response', response[c.set.status], ${r})
112
+ ${k(r)}
106
113
  }
107
- `),E+=`return mapEarlyResponse(${r}, c.set)}
108
- `}else E+=y.beforeHandle[e].constructor.name===l?`await beforeHandle[${e}](c);
114
+ `),H+=`return mapEarlyResponse(${r}, c.set)}
115
+ `}else H+=h.beforeHandle[e].constructor.name===f?`await beforeHandle[${e}](c);
109
116
  `:`beforeHandle[${e}](c);
110
- `}if(y?.afterHandle.length){E+=m.constructor.name===l?`let r = await handler(c);
117
+ `}if(h?.afterHandle.length){H+=m.constructor.name===f?`let r = await handler(c);
111
118
  `:`let r = handler(c);
112
- `;for(let e=0;e<y.afterHandle.length;e++){let r=`af${e}`,t=hasReturn(y.afterHandle[e].toString());t?(E+=y.afterHandle[e].constructor.name===l?`let ${r} = await afterHandle[${e}](c, r)
119
+ `;for(let e=0;e<h.afterHandle.length;e++){let r=`af${e}`,t=hasReturn(h.afterHandle[e].toString());t?(H+=h.afterHandle[e].constructor.name===f?`let ${r} = await afterHandle[${e}](c, r)
113
120
  `:`let ${r} = afterHandle[${e}](c, r)
114
- `,h.response?E+=`if(response[c.set.status]?.Check(${r}) === false) {
121
+ `,$.response?H+=`if(response[c.set.status]?.Check(${r}) === false) {
115
122
  if(!(response instanceof Error))
116
- throw new ValidationError('response', response[c.set.status], ${r})
123
+ ${k(r)}
117
124
  }
118
125
  ${r} = mapEarlyResponse(${r}, c.set)
119
126
  if(${r}) return ${r};
120
- `:E+=`if(${r}) return ${r};
121
- `):E+=y.afterHandle[e].constructor.name===l?`await afterHandle[${e}](c, r)
127
+ `:H+=`if(${r}) return ${r};
128
+ `):H+=h.afterHandle[e].constructor.name===f?`await afterHandle[${e}](c, r)
122
129
  `:`afterHandle[${e}](c, r)
123
- `}h.response&&(E+=`if(response[c.set.status]?.Check(r) === false) {
130
+ `}$.response&&(H+=`if(response[c.set.status]?.Check(r) === false) {
124
131
  if(!(response instanceof Error))
125
- throw new ValidationError('response', response[c.set.status], r)
132
+ ${k()}
126
133
  }
127
- `),E+=`return mapResponse(r, c.set);
128
- `}else h.response?E+=(m.constructor.name===l?`const r = await handler(c);
134
+ `),F?H+=`return mapResponse(r, c.set)
135
+ `:H+=`return mapCompactResponse(r)
136
+ `}else if($.response)H+=(m.constructor.name===f?`const r = await handler(c);
129
137
  `:`const r = handler(c);
130
138
  `)+`if(response[c.set.status]?.Check(r) === false) {
131
139
  if(!(response instanceof Error))
132
- throw new ValidationError('response', response[c.set.status], r)
140
+ ${k()}
133
141
  }
134
- `+"return mapResponse(r, c.set);":E+=m.constructor.name===l?"return mapResponse(await handler(c), c.set);":"return mapResponse(handler(c), c.set);";E+=`
142
+ `,F?H+=`return mapResponse(r, c.set)
143
+ `:H+=`return mapCompactResponse(r)
144
+ `;else{let e=m.constructor.name===f?"await handler(c) ":"handler(c)";F?H+=`return mapResponse(${e}, c.set)
145
+ `:H+=`return mapCompactResponse(${e})
146
+ `}x&&(H+=`
135
147
  } catch(error) {
136
148
 
137
149
 
138
- ${H?"":"return (async () => {"}
150
+ ${N?"":"return (async () => {"}
139
151
  const set = c.set
140
152
 
141
153
  if (!set.status || set.status < 300) set.status = 500
142
154
 
143
- ${y.error.length?`for (let i = 0; i < handleErrors.length; i++) {
155
+ ${h.error.length?`for (let i = 0; i < handleErrors.length; i++) {
144
156
  let handled = handleErrors[i]({
145
157
  request: c.request,
146
158
  error: error,
@@ -154,8 +166,8 @@ if(${r}) return ${r};
154
166
  }`:""}
155
167
 
156
168
  return handleError(c.request, error, set)
157
- ${H?"":"})()"}
158
- }`,E=`const {
169
+ ${N?"":"})()"}
170
+ }`),H=`const {
159
171
  handler,
160
172
  handleError,
161
173
  hooks: {
@@ -174,8 +186,8 @@ if(${r}) return ${r};
174
186
  },
175
187
  utils: {
176
188
  mapResponse,
189
+ mapCompactResponse,
177
190
  mapEarlyResponse,
178
- mapErrorCode,
179
191
  parseQuery
180
192
  },
181
193
  error: {
@@ -184,7 +196,7 @@ if(${r}) return ${r};
184
196
  ValidationError,
185
197
  InternalServerError
186
198
  },
187
- ${b?`
199
+ ${q?`
188
200
  meta,
189
201
  SCHEMA,
190
202
  DEFS,`:""}
@@ -192,15 +204,28 @@ if(${r}) return ${r};
192
204
 
193
205
  const parseError = new ParseError()
194
206
 
195
- return ${H?"async":""} function(c) {
196
- ${b?"c[SCHEMA] = meta[SCHEMA]; c[DEFS] = meta[DEFS];":""}
197
- ${E}
198
- }`;let v=Function("hooks",E);return v({handler:m,hooks:y,validator:h,handleError:$,utils:{mapResponse:t,mapEarlyResponse:r,parseQuery:e},error:{ParseError:o,NotFoundError:a,ValidationError:c,InternalServerError:i},meta:b,SCHEMA:b?n:void 0,DEFS:b?s:void 0})};export const composeGeneralHandler=e=>{let t="";for(let r of Object.keys(e.decorators))t+=`,${r}: app.decorators.${r}`;let n=e.staticRouter,s="";for(let[e,{code:r,all:t}]of Object.entries(n.map))s+=`case '${e}':
199
- switch(method) {
207
+ return ${N?"async":""} function(c) {
208
+ ${q?"c[SCHEMA] = meta[SCHEMA]; c[DEFS] = meta[DEFS];":""}
209
+ ${H}
210
+ }`;let T=Function("hooks",H);return T({handler:m,hooks:h,validator:$,handleError:b,utils:{mapResponse:t,mapCompactResponse:s,mapEarlyResponse:r,parseQuery:e},error:{ParseError:a,NotFoundError:c,ValidationError:l,InternalServerError:i},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=`
211
+ const route = find(request.method, path) ${s.root.ALL?'?? find("ALL", path)':""}
212
+ if (route === null)
213
+ return ${e.event.error.length?`handleError(
214
+ request,
215
+ notFound,
216
+ ctx.set
217
+ )`:`new Response(error404, {
218
+ status: 404
219
+ })`}
220
+
221
+ ctx.params = route.params
222
+
223
+ return route.store(ctx)`,a="";for(let[e,{code:r,all:t}]of Object.entries(n.map))a+=`case '${e}':
224
+ switch(request.method) {
200
225
  ${r}
201
- ${t}}
226
+ ${t??`default: ${o}`}}
202
227
 
203
- `;let o=e.router,c=`const {
228
+ `;let l=`const {
204
229
  app,
205
230
  app: { store, router, staticRouter },
206
231
  ${e.event.request.length?"mapEarlyResponse,":""}
@@ -219,56 +244,65 @@ ${t}}
219
244
  ${e.event.error.length?"":"const error404 = notFound.message.toString()"}
220
245
 
221
246
  return function(request) {
222
- const ctx = {
223
- request,
224
- store,
225
- set: {
226
- headers: {},
227
- status: 200
247
+ `;if(e.event.request.length){l+=`
248
+ const ctx = {
249
+ request,
250
+ store,
251
+ set: {
252
+ headers: {},
253
+ status: 200
254
+ }
255
+ ${t}
228
256
  }
229
- ${t}
230
- }
231
- `;if(e.event.request.length){c+="try {";for(let r=0;r<e.event.request.length;r++){let t=hasReturn(e.event.request[r].toString());c+=t?`const response = mapEarlyResponse(
257
+
258
+ try {
259
+ `;for(let r=0;r<e.event.request.length;r++){let t=hasReturn(e.event.request[r].toString());l+=t?`const response = mapEarlyResponse(
232
260
  onRequest[${r}](ctx),
233
261
  ctx.set
234
262
  )
235
263
  if (response) return response
236
- `:`mapEarlyResponse(onRequest[${r}](ctx), ctx.set)`}c+=`} catch (error) {
264
+ `:`mapEarlyResponse(onRequest[${r}](ctx), ctx.set)`}l+=`} catch (error) {
237
265
  return handleError(request, error, ctx.set)
238
- }`}return c+=`
239
- const { url, method } = request,
266
+ }
267
+
268
+ const url = request.url,
269
+ s = url.indexOf('/', 12),
270
+ i = ctx.query = url.indexOf('?', s + 1),
271
+ path = i === -1 ? url.substring(s) : url.substring(s, i);`}else l+=`
272
+ const url = request.url,
240
273
  s = url.indexOf('/', 12)
241
- ctx.query = i = url.indexOf('?', s + 1),
242
- path = i === -1 ? url.substring(s) : url.substring(s, i)
243
274
 
244
- map: switch(path) {
245
- ${s}
246
- }
247
-
248
- const route = find(method, path) ${o.root.ALL?'?? find("ALL", path)':""}
249
- if (route === null) {
250
- return ${e.event.error.length?`handleError(
251
- request,
252
- notFound,
253
- ctx.set
254
- )`:`new Response(error404, {
255
- status: 404
256
- })`}
275
+ const ctx = {
276
+ request,
277
+ store,
278
+ query: url.indexOf('?', s + 1),
279
+ set: {
280
+ headers: {},
281
+ status: 200
282
+ }
283
+ ${t}
257
284
  }
258
285
 
259
- ctx.params = route.params
286
+ const path =
287
+ ctx.query === -1
288
+ ? url.substring(s)
289
+ : url.substring(s, ctx.query);`;return l+=`
290
+ switch(path) {
291
+ ${a}
260
292
 
261
- return route.store(ctx)
262
- }`,e.handleError=composeErrorHandler(e),Function("data",c)({app:e,mapEarlyResponse:r,NotFoundError:a})};export const composeErrorHandler=e=>{let r=`const {
293
+ default:
294
+ ${o}
295
+ }
296
+ }`,e.handleError=composeErrorHandler(e),Function("data",l)({app:e,mapEarlyResponse:r,NotFoundError:c})};export const composeErrorHandler=e=>{let r=`const {
263
297
  app: { event: { error: onError } },
264
298
  mapResponse
265
299
  } = inject
266
300
 
267
- return ${e.event.error.find(e=>e.constructor.name===l)?"async":""} function(request, error, set) {`;for(let t=0;t<e.event.error.length;t++){let n=e.event.error[t],s=`${n.constructor.name===l?"await ":""}onError[${t}]({
301
+ return ${e.event.error.find(e=>e.constructor.name===f)?"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===f?"await ":""}onError[${t}]({
268
302
  request,
269
303
  code: error.code ?? 'UNKNOWN',
270
304
  error,
271
305
  set
272
- })`;hasReturn(n.toString())?r+=`const r${t} = ${s}; if(r${t} !== null) return mapResponse(r${t}, set)
273
- `:r+=s+"\n"}return Function("inject",r+=`return new Response(error.message, { headers: set.headers, status: error.status ?? 500 })
306
+ })`;hasReturn(s.toString())?r+=`const r${t} = ${n}; if(r${t} !== null) return mapResponse(r${t}, set)
307
+ `:r+=n+"\n"}return Function("inject",r+=`return new Response(error.message, { headers: set.headers, status: error.status ?? 500 })
274
308
  }`)({app:e,mapResponse:t})};
package/dist/error.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /// <reference types="bun-types" />
1
2
  import type { TypeCheck } from '@sinclair/typebox/compiler';
2
3
  export declare class InternalServerError extends Error {
3
4
  code: string;
@@ -21,4 +22,5 @@ export declare class ValidationError extends Error {
21
22
  status: number;
22
23
  constructor(type: string, validator: TypeCheck<any>, value: unknown);
23
24
  get all(): import("@sinclair/typebox/compiler").ValueError[];
25
+ toResponse(headers?: Record<string, any>): Response;
24
26
  }
package/dist/error.js CHANGED
@@ -1 +1 @@
1
- export class InternalServerError extends Error{code="NOT_FOUND";status=500;constructor(){super("INTERNAL_SERVER_ERROR")}}export class NotFoundError extends Error{code="NOT_FOUND";status=404;constructor(){super("NOT_FOUND")}}export class ParseError extends Error{code="PARSE";status=400;constructor(){super("PARSE")}}export class ValidationError extends Error{validator;value;code;status;constructor(r,t,s){let o=t.Errors(s).First();super(`Invalid ${r}: '${o?.path?.slice(1)||"root"}'. ${o?.message}`),this.validator=t,this.value=s,this.code="VALIDATION",this.status=400}get all(){return[...this.validator.Errors(this.value)]}}
1
+ export class InternalServerError extends Error{code="NOT_FOUND";status=500;constructor(){super("INTERNAL_SERVER_ERROR")}}export class NotFoundError extends Error{code="NOT_FOUND";status=404;constructor(){super("NOT_FOUND")}}export class ParseError extends Error{code="PARSE";status=400;constructor(){super("PARSE")}}export class ValidationError extends Error{validator;value;code;status;constructor(r,s,t){let e=s.Errors(t).First();super(`Invalid ${r}: '${e?.path?.slice(1)||"root"}'. ${e?.message}`),this.validator=s,this.value=t,this.code="VALIDATION",this.status=400}get all(){return[...this.validator.Errors(this.value)]}toResponse(r){return new Response(this.message,{status:400,headers:r})}}
package/dist/handler.d.ts CHANGED
@@ -3,4 +3,5 @@ import type { Context } from './context';
3
3
  export declare const isNotEmpty: (obj: Object) => boolean;
4
4
  export declare const mapEarlyResponse: (response: unknown, set: Context['set']) => Response | undefined;
5
5
  export declare const mapResponse: (response: unknown, set: Context['set']) => Response;
6
+ export declare const mapCompactResponse: (response: unknown) => Response;
6
7
  export declare const errorToResponse: (error: Error, headers?: HeadersInit) => Response;
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 t=s[r].indexOf("=");e.append("Set-Cookie",`${s[r].slice(0,t)}=${s[r].slice(t+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"])),typeof s){case"string":return new Response(s,{status:r.status,headers:r.headers});case"object":switch(s.constructor.name){case"Object":case"Array":case void 0:return Response.json(s,{status:r.status,headers:r.headers});case"Error":return errorToResponse(s,r.headers);case"Response":for(let e in r.headers)s.headers.append(e,r.headers[e]);return s;case"Blob":default:return new Response(s,{status:r.status,headers:r.headers});case"Promise":return s.then(e=>{let s=mapEarlyResponse(e,r);if(void 0!==s)return s})}case"function":if(s instanceof Blob)return new Response(s,{status:r.status,headers:r.headers});for(let e in r.headers)s.headers.append(e,r.headers[e]);return s;case"number":case"boolean":return new Response(s.toString(),{status:r.status,headers:r.headers})}else switch(typeof s){case"string":return new Response(s);case"object":switch(s.constructor?.name){case"Object":case"Array":case void 0:return Response.json(s);case"Response":return s;case"Error":return errorToResponse(s,r.headers);case"Blob":default:return new Response(s);case"Promise":return s.then(e=>{let s=mapEarlyResponse(e,r);if(void 0!==s)return s})}case"function":if(s instanceof Blob)return new Response(s);return s;case"number":case"boolean":return new Response(s.toString())}};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"])),typeof s){case"string":return new Response(s,{status:r.status,headers:r.headers});case"object":switch(s.constructor?.name){case"Object":case"Array":case void 0:return Response.json(s,{status:r.status,headers:r.headers});case"Error":return errorToResponse(s,r.headers);case"Response":for(let e in r.headers)s.headers.append(e,r.headers[e]);return s;case"Blob":default:return new Response(s,{status:r.status,headers:r.headers});case"Promise":return s.then(e=>mapResponse(e,r))}case"function":if(s instanceof Blob)return new Response(s,{status:r.status,headers:r.headers});return s();case"number":case"boolean":return new Response(s.toString(),{status:r.status,headers:r.headers});case"undefined":return new Response("",{status:r.status,headers:r.headers});default:return new Response(s,{status:r.status,headers:r.headers})}else switch(typeof s){case"string":return new Response(s);case"object":switch(s.constructor?.name){case"Object":case"Array":case void 0:return Response.json(s);case"Response":return s;case"Error":return errorToResponse(s,r.headers);case"Blob":default:return new Response(s);case"Promise":return s.then(e=>{let s=mapEarlyResponse(e,r);return void 0!==s?s:new Response("")})}case"function":if(s instanceof Blob)return new Response(s);return s();case"number":case"boolean":return new Response(s.toString());case"undefined":return new Response("");default: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 r in e)return!0;return!1};let e=(e,r)=>{e.delete("Set-Cookie");for(let s=0;s<r.length;s++){let n=r[s].indexOf("=");e.append("Set-Cookie",`${r[s].slice(0,n)}=${r[s].slice(n+1)}`)}return e};export const mapEarlyResponse=(r,s)=>{if(isNotEmpty(s.headers)||200!==s.status||s.redirect)switch(s.redirect&&(s.headers.Location=s.redirect,s.status=302),s.headers["Set-Cookie"]&&Array.isArray(s.headers["Set-Cookie"])&&(s.headers=e(new Headers(s.headers),s.headers["Set-Cookie"])),r?.constructor?.name){case"String":case"Blob":return new Response(r,s);case"Object":case"Array":return Response.json(r,s);case void 0:if(!r)return;return Response.json(r,s);case"Response":for(let e in s.headers)r.headers.append(e,s.headers[e]);return r;case"Promise":return r.then(e=>{let r=mapEarlyResponse(e,s);if(void 0!==r)return r});case"Error":return errorToResponse(r,s.headers);case"Function":return r();case"Number":case"Boolean":return new Response(r.toString(),s);default:return}else switch(r?.constructor?.name){case"String":case"Blob":return new Response(r);case"Object":case"Array":return Response.json(r);case void 0:if(!r)return new Response("");return Response.json(r);case"Response":return r;case"Promise":return r.then(e=>{let r=mapEarlyResponse(e,s);if(void 0!==r)return r});case"Error":return errorToResponse(r,s.headers);case"Function":return r();case"Number":case"Boolean":return new Response(r.toString());default:return}};export const mapResponse=(r,s)=>{if(isNotEmpty(s.headers)||200!==s.status||s.redirect)switch(s.redirect&&(s.headers.Location=s.redirect,s.status=302),s.headers["Set-Cookie"]&&Array.isArray(s.headers["Set-Cookie"])&&(s.headers=e(new Headers(s.headers),s.headers["Set-Cookie"])),r?.constructor?.name){case"String":case"Blob":return new Response(r,{status:s.status,headers:s.headers});case"Object":case"Array":return Response.json(r,s);case void 0:if(!r)return new Response("",s);return Response.json(r,s);case"Response":for(let e in s.headers)r.headers.append(e,s.headers[e]);return r;case"Error":return errorToResponse(r,s.headers);case"Promise":return r.then(e=>mapResponse(e,s));case"Function":return r();case"Number":case"Boolean":return new Response(r.toString(),s);default:return new Response(r,s)}else switch(r?.constructor?.name){case"String":case"Blob":return new Response(r);case"Object":case"Array":return Response.json(r);case void 0:if(!r)return new Response("");return Response.json(r);case"Response":default:return r;case"Error":return errorToResponse(r);case"Promise":return r.then(e=>{let r=mapResponse(e,s);return void 0!==r?r:new Response("")});case"Function":return r();case"Number":case"Boolean":return new Response(r.toString())}};export const mapCompactResponse=e=>{switch(e.constructor?.name){case"String":case"Blob":return new Response(e);case"Object":case"Array":return Response.json(e);case void 0:if(!e)return new Response("");return Response.json(e);case"Response":default:return e;case"Error":return errorToResponse(e);case"Promise":return e.then(e=>{let r=mapCompactResponse(e);return void 0!==r?r:new Response("")});case"Function":return e();case"Number":case"Boolean":return new Response(e.toString())}};export const errorToResponse=(e,r)=>new Response(JSON.stringify({name:e?.name,message:e?.message,cause:e?.cause}),{status:500,headers:r});
package/dist/index.d.ts CHANGED
@@ -418,6 +418,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
418
418
  handle: (request: Request) => Promise<Response>;
419
419
  fetch: (request: Request) => MaybePromise<Response>;
420
420
  handleError: (request: Request, error: Error | ValidationError | ParseError | NotFoundError | InternalServerError, set: Context['set']) => Promise<any>;
421
+ private outerErrorHandler;
421
422
  listen: (options: string | number | Partial<Serve>, callback?: ListenCallback) => this;
422
423
  stop: () => Promise<void>;
423
424
  get modules(): Promise<Elysia<any>[]>;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{Memoirist as e}from"memoirist";import{SCHEMA as t,EXPOSED as r,DEFS as s,mergeHook as o,getSchemaValidator as i,getResponseSchemaValidator as a,mergeDeep as h}from"./utils";import{registerSchemaPath as n}from"./schema";import{composeErrorHandler as u,composeGeneralHandler as d,composeHandler as l}from"./compose";import{ws as c}from"./ws";export default class p{config;store={};meta={[t]:Object.create(null),[s]:Object.create(null),[r]:Object.create(null)};decorators={};event={start:[],request:[],parse:[],transform:[],beforeHandle:[],afterHandle:[],error:[],stop:[]};server=null;$schema=null;router=new e;routes=[];staticRouter={handlers:[],variables:"",map:{},all:""};wsRouter;lazyLoadModules=[];constructor(e){this.config={fn:"/~fn",...e}}add(e,r,h,u,{allowMeta:d=!1}={allowMeta:!1}){r=""===r?r:47===r.charCodeAt(0)?r:`/${r}`,this.routes.push({method:e,path:r,handler:h,hooks:o({...this.event},u)});let c=this.meta[s];if(u?.type)switch(u.type){case"text":u.type="text/plain";break;case"json":u.type="application/json";break;case"formdata":u.type="multipart/form-data";break;case"urlencoded":u.type="application/x-www-form-urlencoded"}n({schema:this.meta[t],contentType:u?.type,hook:u,method:e,path:r,models:this.meta[s]});let p={body:i(u?.body??this.$schema?.body,c),headers:i(u?.headers??this.$schema?.headers,c,!0),params:i(u?.params??this.$schema?.params,c),query:i(u?.query??this.$schema?.query,c),response:a(u?.response??this.$schema?.response,c)},f=o(this.event,u),m=l({path:r,method:e,hooks:f,validator:p,handler:h,handleError:this.handleError,meta:d?this.meta:void 0});if(-1===r.indexOf(":")&&-1===r.indexOf("*")){let t=this.staticRouter.handlers.length;this.staticRouter.handlers.push(m),this.staticRouter.variables+=`const st${t} = staticRouter.handlers[${t}]
2
- `,this.staticRouter.map[r]||(this.staticRouter.map[r]={code:"",all:"default: break map\n"}),"ALL"===e?this.staticRouter.map[r].all=`default: return st${t}(ctx)
1
+ import{Memoirist as e}from"memoirist";import{SCHEMA as t,EXPOSED as r,DEFS as s,mergeHook as o,getSchemaValidator as i,getResponseSchemaValidator as a,mergeDeep as h}from"./utils";import{registerSchemaPath as n}from"./schema";import{composeErrorHandler as u,composeGeneralHandler as d,composeHandler as l}from"./compose";import{ws as c}from"./ws";export default class p{config;store={};meta={[t]:Object.create(null),[s]:Object.create(null),[r]:Object.create(null)};decorators={};event={start:[],request:[],parse:[],transform:[],beforeHandle:[],afterHandle:[],error:[],stop:[]};server=null;$schema=null;router=new e;routes=[];staticRouter={handlers:[],variables:"",map:{},all:""};wsRouter;lazyLoadModules=[];constructor(e){this.config={fn:"/~fn",forceErrorEncapsulation:!1,...e}}add(e,r,h,u,{allowMeta:d=!1}={allowMeta:!1}){r=""===r?r:47===r.charCodeAt(0)?r:`/${r}`,this.routes.push({method:e,path:r,handler:h,hooks:o({...this.event},u)});let c=this.meta[s];if(u?.type)switch(u.type){case"text":u.type="text/plain";break;case"json":u.type="application/json";break;case"formdata":u.type="multipart/form-data";break;case"urlencoded":u.type="application/x-www-form-urlencoded"}n({schema:this.meta[t],contentType:u?.type,hook:u,method:e,path:r,models:this.meta[s]});let p={body:i(u?.body??this.$schema?.body,c),headers:i(u?.headers??this.$schema?.headers,c,!0),params:i(u?.params??this.$schema?.params,c),query:i(u?.query??this.$schema?.query,c),response:a(u?.response??this.$schema?.response,c)},f=o(this.event,u),m=l({path:r,method:e,hooks:f,validator:p,handler:h,handleError:this.handleError,meta:d?this.meta:void 0,onRequest:this.event.request,config:this.config});if(-1===r.indexOf(":")&&-1===r.indexOf("*")){let t=this.staticRouter.handlers.length;this.staticRouter.handlers.push(m),this.staticRouter.variables+=`const st${t} = staticRouter.handlers[${t}]
2
+ `,this.staticRouter.map[r]||(this.staticRouter.map[r]={code:""}),"ALL"===e?this.staticRouter.map[r].all=`default: return st${t}(ctx)
3
3
  `:this.staticRouter.map[r].code+=`case '${e}': return st${t}(ctx)
4
- `}else this.router.add(e,r,m)}onStart(e){return this.event.start.push(e),this}onRequest(e){return this.event.request.push(e),this}onParse(e){return this.event.parse.splice(this.event.parse.length-1,0,e),this}onTransform(e){return this.event.transform.push(e),this}onBeforeHandle(e){return this.event.beforeHandle.push(e),this}onAfterHandle(e){return this.event.afterHandle.push(e),this}onError(e){return this.event.error.push(e),this}onStop(e){return this.event.stop.push(e),this}on(e,t){switch(e){case"start":this.event.start.push(t);break;case"request":this.event.request.push(t);break;case"parse":this.event.parse.push(t);break;case"transform":this.event.transform.push(t);break;case"beforeHandle":this.event.beforeHandle.push(t);break;case"afterHandle":this.event.afterHandle.push(t);break;case"error":this.event.error.push(t);break;case"stop":this.event.stop.push(t)}return this}group(e,t,r){let i=new p;i.store=this.store,this.wsRouter&&i.use(c());let a="object"==typeof t,n=(a?r:t)(i);return this.decorators=h(this.decorators,i.decorators),n.event.request.length&&(this.event.request=[...this.event.request,...n.event.request]),this.model(n.meta[s]),Object.values(i.routes).forEach(({method:r,path:s,handler:h,hooks:u})=>{if(a){let a=`${e}${s}`,d=i.wsRouter?.find("subscribe",a);if(d){let e=i.wsRouter.history.find(([e,t])=>a===t);if(!e)return;return this.ws(a,e[2])}this.add(r,a,h,o(t,{...u,error:u.error?Array.isArray(u.error)?[...u.error,...n.event.error]:[u.error,...n.event.error]:n.event.error}))}else{let t=`${e}${s}`,a=i.wsRouter?.find("subscribe",t);if(a){let e=i.wsRouter.history.find(([e,t])=>s===t);if(!e)return;return this.ws(t,e[2])}this.add(r,t,h,o(u,{error:n.event.error}))}}),i.wsRouter&&this.wsRouter&&i.wsRouter.history.forEach(([t,r,s])=>{"/"===r?this.wsRouter?.add(t,e,s):this.wsRouter?.add(t,`${e}${r}`,s)}),this}guard(e,t){let r=new p;r.store=this.store,this.wsRouter&&r.use(c());let i=t(r);return this.decorators=h(this.decorators,r.decorators),i.event.request.length&&(this.event.request=[...this.event.request,...i.event.request]),this.model(i.meta[s]),Object.values(r.routes).forEach(({method:t,path:s,handler:a,hooks:h})=>{let n=r.wsRouter?.find("subscribe",s);if(n){let e=r.wsRouter.history.find(([e,t])=>s===t);if(!e)return;return this.ws(s,e[2])}this.add(t,s,a,o(e,{...h,error:h.error?Array.isArray(h.error)?[...h.error,...i.event.error]:[h.error,...i.event.error]:i.event.error}))}),r.wsRouter&&this.wsRouter&&r.wsRouter.history.forEach(([e,t,r])=>{this.wsRouter?.add(e,t,r)}),this}use(e){if(e instanceof Promise)return this.lazyLoadModules.push(e.then(e=>"function"==typeof e?e(this):e.default(this)).then(e=>e.compile())),this;let t=e(this);return t instanceof Promise?(this.lazyLoadModules.push(t.then(e=>e.compile())),this):t}if(e,t){return e?this.use(t):this}get(e,t,r){return this.add("GET",e,t,r),this}post(e,t,r){return this.add("POST",e,t,r),this}put(e,t,r){return this.add("PUT",e,t,r),this}patch(e,t,r){return this.add("PATCH",e,t,r),this}delete(e,t,r){return this.add("DELETE",e,t,r),this}options(e,t,r){return this.add("OPTIONS",e,t,r),this}all(e,t,r){return this.add("ALL",e,t,r),this}head(e,t,r){return this.add("HEAD",e,t,r),this}trace(e,t,r){return this.add("TRACE",e,t,r),this}connect(e,t,r){return this.add("CONNECT",e,t,r),this}ws(e,t){if(!this.wsRouter)throw Error("Can't find WebSocket. Please register WebSocket plugin first by importing 'elysia/ws'");return this.wsRouter.add("subscribe",e,t),this.get(e,e=>{if(!this.server?.upgrade(e.request,{headers:"function"==typeof t.upgrade?t.upgrade(e):t.upgrade,data:{...e,id:Date.now(),message:i(t?.body,this.meta[s]),transformMessage:t.transform?Array.isArray(t.transformMessage)?t.transformMessage:[t.transformMessage]:[]}}))return e.set.status=400,"Expected a websocket connection"},{beforeHandle:t.beforeHandle,transform:t.transform,headers:t?.headers,params:t?.params,query:t?.query}),this}route(e,t,r,{config:s,...o}={config:{allowMeta:!1}}){return this.add(e,t,r,o,s),this}state(e,t){return"object"==typeof e?(this.store=h(this.store,e),this):(e in this.store||(this.store[e]=t),this)}decorate(e,t){return"object"==typeof e?(this.decorators=h(this.decorators,e),this):(e in this.decorators||(this.decorators[e]=t),this)}derive(e){return e.$elysia="derive",this.onTransform(e)}fn(e){return this.use(async t=>{let{fn:r}=await import("@elysiajs/fn");return r({app:t,value:e,path:t.config.fn})})}schema(e){let t=this.meta[s];return this.$schema={body:i(e.body,t),headers:i(e?.headers,t,!0),params:i(e?.params,t),query:i(e?.query,t),response:i(e?.response,t)},this}compile(){return this.fetch=d(this),this.server&&this.server.reload({...this.server,fetch:this.fetch}),this}handle=async e=>this.fetch(e);fetch=e=>(this.fetch=d(this))(e);handleError=async(e,t,r)=>(this.handleError=u(this))(e,t,r);listen=(e,t)=>{if(!Bun)throw Error("Bun to run");if(this.compile(),"string"==typeof e&&Number.isNaN(e=+e))throw Error("Port must be a numeric value");let r=this.fetch,s=(process.env.ENV??process.env.NODE_ENV)!=="production",o="object"==typeof e?{...this.config.serve,...e,development:s,fetch:r}:{...this.config.serve,port:e,fetch:r};if("production"!==process.env.ENV){let e=`$$Elysia:${o.port}`;globalThis[e]?(this.server=globalThis[e],this.server.reload(o)):globalThis[e]=this.server=Bun.serve(o)}else this.server=Bun.serve(o);for(let e=0;e<this.event.start.length;e++)this.event.start[e](this);return t&&t(this.server),Promise.all(this.lazyLoadModules).then(()=>{Bun.gc(!0)}),this};stop=async()=>{if(!this.server)throw Error("Elysia isn't running. Call `app.listen` to start the server.");this.server.stop();for(let e=0;e<this.event.stop.length;e++)await this.event.stop[e](this)};get modules(){return Promise.all(this.lazyLoadModules)}model(e,t){return"object"==typeof e?Object.entries(e).forEach(([e,t])=>{e in this.meta[s]||(this.meta[s][e]=t)}):this.meta[s][e]=t,this}}export{t}from"./custom-types";export{ws}from"./ws";export{SCHEMA,DEFS,EXPOSED,getSchemaValidator,mergeDeep,mergeHook,mergeObjectArray,getResponseSchemaValidator}from"./utils";export{ParseError,NotFoundError,ValidationError,InternalServerError}from"./error";export{p as Elysia};
4
+ `}else this.router.add(e,r,m)}onStart(e){return this.event.start.push(e),this}onRequest(e){return this.event.request.push(e),this}onParse(e){return this.event.parse.splice(this.event.parse.length-1,0,e),this}onTransform(e){return this.event.transform.push(e),this}onBeforeHandle(e){return this.event.beforeHandle.push(e),this}onAfterHandle(e){return this.event.afterHandle.push(e),this}onError(e){return this.event.error.push(e),this}onStop(e){return this.event.stop.push(e),this}on(e,t){switch(e){case"start":this.event.start.push(t);break;case"request":this.event.request.push(t);break;case"parse":this.event.parse.push(t);break;case"transform":this.event.transform.push(t);break;case"beforeHandle":this.event.beforeHandle.push(t);break;case"afterHandle":this.event.afterHandle.push(t);break;case"error":this.event.error.push(t);break;case"stop":this.event.stop.push(t)}return this}group(e,t,r){let i=new p;i.store=this.store,this.wsRouter&&i.use(c());let a="object"==typeof t,n=(a?r:t)(i);return this.decorators=h(this.decorators,i.decorators),n.event.request.length&&(this.event.request=[...this.event.request,...n.event.request]),this.model(n.meta[s]),Object.values(i.routes).forEach(({method:r,path:s,handler:h,hooks:u})=>{if(a){let a=`${e}${s}`,d=i.wsRouter?.find("subscribe",a);if(d){let e=i.wsRouter.history.find(([e,t])=>a===t);if(!e)return;return this.ws(a,e[2])}this.add(r,a,h,o(t,{...u,error:u.error?Array.isArray(u.error)?[...u.error,...n.event.error]:[u.error,...n.event.error]:n.event.error}))}else{let t=`${e}${s}`,a=i.wsRouter?.find("subscribe",t);if(a){let e=i.wsRouter.history.find(([e,t])=>s===t);if(!e)return;return this.ws(t,e[2])}this.add(r,t,h,o(u,{error:n.event.error}))}}),i.wsRouter&&this.wsRouter&&i.wsRouter.history.forEach(([t,r,s])=>{"/"===r?this.wsRouter?.add(t,e,s):this.wsRouter?.add(t,`${e}${r}`,s)}),this}guard(e,t){let r=new p;r.store=this.store,this.wsRouter&&r.use(c());let i=t(r);return this.decorators=h(this.decorators,r.decorators),i.event.request.length&&(this.event.request=[...this.event.request,...i.event.request]),this.model(i.meta[s]),Object.values(r.routes).forEach(({method:t,path:s,handler:a,hooks:h})=>{let n=r.wsRouter?.find("subscribe",s);if(n){let e=r.wsRouter.history.find(([e,t])=>s===t);if(!e)return;return this.ws(s,e[2])}this.add(t,s,a,o(e,{...h,error:h.error?Array.isArray(h.error)?[...h.error,...i.event.error]:[h.error,...i.event.error]:i.event.error}))}),r.wsRouter&&this.wsRouter&&r.wsRouter.history.forEach(([e,t,r])=>{this.wsRouter?.add(e,t,r)}),this}use(e){if(e instanceof Promise)return this.lazyLoadModules.push(e.then(e=>"function"==typeof e?e(this):e.default(this)).then(e=>e.compile())),this;let t=e(this);return t instanceof Promise?(this.lazyLoadModules.push(t.then(e=>e.compile())),this):t}if(e,t){return e?this.use(t):this}get(e,t,r){return this.add("GET",e,t,r),this}post(e,t,r){return this.add("POST",e,t,r),this}put(e,t,r){return this.add("PUT",e,t,r),this}patch(e,t,r){return this.add("PATCH",e,t,r),this}delete(e,t,r){return this.add("DELETE",e,t,r),this}options(e,t,r){return this.add("OPTIONS",e,t,r),this}all(e,t,r){return this.add("ALL",e,t,r),this}head(e,t,r){return this.add("HEAD",e,t,r),this}trace(e,t,r){return this.add("TRACE",e,t,r),this}connect(e,t,r){return this.add("CONNECT",e,t,r),this}ws(e,t){if(!this.wsRouter)throw Error("Can't find WebSocket. Please register WebSocket plugin first by importing 'elysia/ws'");return this.wsRouter.add("subscribe",e,t),this.get(e,e=>{if(!this.server?.upgrade(e.request,{headers:"function"==typeof t.upgrade?t.upgrade(e):t.upgrade,data:{...e,id:Date.now(),headers:e.request.headers.toJSON(),message:i(t?.body,this.meta[s]),transformMessage:t.transform?Array.isArray(t.transformMessage)?t.transformMessage:[t.transformMessage]:[]}}))return e.set.status=400,"Expected a websocket connection"},{beforeHandle:t.beforeHandle,transform:t.transform,headers:t?.headers,params:t?.params,query:t?.query}),this}route(e,t,r,{config:s,...o}={config:{allowMeta:!1}}){return this.add(e,t,r,o,s),this}state(e,t){return"object"==typeof e?(this.store=h(this.store,e),this):(e in this.store||(this.store[e]=t),this)}decorate(e,t){return"object"==typeof e?(this.decorators=h(this.decorators,e),this):(e in this.decorators||(this.decorators[e]=t),this)}derive(e){return e.$elysia="derive",this.onTransform(e)}fn(e){return this.use(async t=>{let{fn:r}=await import("@elysiajs/fn");return r({app:t,value:e,path:t.config.fn})})}schema(e){let t=this.meta[s];return this.$schema={body:i(e.body,t),headers:i(e?.headers,t,!0),params:i(e?.params,t),query:i(e?.query,t),response:i(e?.response,t)},this}compile(){return this.fetch=d(this),this.server&&this.server.reload({...this.server,fetch:this.fetch}),this}handle=async e=>this.fetch(e);fetch=e=>(this.fetch=d(this))(e);handleError=async(e,t,r)=>(this.handleError=u(this))(e,t,r);outerErrorHandler=e=>new Response(e.message,{status:e?.status??500});listen=(e,t)=>{if(!Bun)throw Error("Bun to run");if(this.compile(),"string"==typeof e&&Number.isNaN(e=+e))throw Error("Port must be a numeric value");let r=this.fetch,s=(process.env.ENV??process.env.NODE_ENV)!=="production",o="object"==typeof e?{...this.config.serve,...e,development:s,fetch:r,error:this.outerErrorHandler}:{...this.config.serve,port:e,fetch:r,error:this.outerErrorHandler};if("production"!==process.env.ENV){let e=`$$Elysia:${o.port}`;globalThis[e]?(this.server=globalThis[e],this.server.reload(o)):globalThis[e]=this.server=Bun.serve(o)}else this.server=Bun.serve(o);for(let e=0;e<this.event.start.length;e++)this.event.start[e](this);return t&&t(this.server),Promise.all(this.lazyLoadModules).then(()=>{Bun.gc(!0)}),this};stop=async()=>{if(!this.server)throw Error("Elysia isn't running. Call `app.listen` to start the server.");this.server.stop();for(let e=0;e<this.event.stop.length;e++)await this.event.stop[e](this)};get modules(){return Promise.all(this.lazyLoadModules)}model(e,t){return"object"==typeof e?Object.entries(e).forEach(([e,t])=>{e in this.meta[s]||(this.meta[s][e]=t)}):this.meta[s][e]=t,this}}export{t}from"./custom-types";export{ws}from"./ws";export{SCHEMA,DEFS,EXPOSED,getSchemaValidator,mergeDeep,mergeHook,mergeObjectArray,getResponseSchemaValidator}from"./utils";export{ParseError,NotFoundError,ValidationError,InternalServerError}from"./error";export{p as Elysia};
package/dist/types.d.ts CHANGED
@@ -188,6 +188,7 @@ export type ComposedHandler = (context: Context) => MaybePromise<Response>;
188
188
  export interface ElysiaConfig {
189
189
  fn?: string;
190
190
  serve?: Partial<Serve>;
191
+ forceErrorEncapsulation?: boolean;
191
192
  }
192
193
  export type IsPathParameter<Part> = Part extends `:${infer Parameter}` ? Parameter : never;
193
194
  export type ExtractPath<Path> = Path extends `${infer A}/${infer B}` ? IsPathParameter<A> | ExtractPath<B> : IsPathParameter<Path>;
@@ -20,7 +20,7 @@ export declare class ElysiaWS<WS extends ElysiaWSContext<any> = ElysiaWSContext,
20
20
  export declare const ws: (config?: Omit<WebSocketHandler, 'open' | 'message' | 'close' | 'drain'>) => (app: Elysia) => Elysia<{
21
21
  store: {};
22
22
  request: {
23
- publish: (topic: string, data: string | import("bun").ArrayBufferView | ArrayBuffer | SharedArrayBuffer, compress?: boolean | undefined) => number;
23
+ publish: (topic: string, data: string | ArrayBuffer | SharedArrayBuffer | import("bun").ArrayBufferView, compress?: boolean | undefined) => number;
24
24
  };
25
25
  schema: {};
26
26
  meta: Record<typeof import("..").SCHEMA, {}> & Record<typeof DEFS, {}> & Record<typeof import("..").EXPOSED, {}>;
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.2",
4
+ "version": "0.5.4",
5
5
  "author": {
6
6
  "name": "saltyAom",
7
7
  "url": "https://github.com/SaltyAom",