elysia 0.3.0-rc.7 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/custom-types.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/custom-types.ts +26 -0
- package/src/index.ts +1 -2
package/dist/custom-types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Type as e}from"@sinclair/typebox";import{TypeSystem as t}from"@sinclair/typebox/system";let i=e=>{if("string"==typeof e)switch(e.slice(-1)){case"k":return 1024*+e.slice(0,e.length-1);case"m":return 1048576*+e.slice(0,e.length-1);default:return+e}return e},r=(e,t)=>{if(!(t instanceof Blob)||e.minSize&&t.size<i(e.minSize)||e.maxSize&&t.size>i(e.maxSize))return!1;if(e.extension){if("string"==typeof e.extension){if(!t.type.startsWith(e.extension))return!1}else{for(let i=0;i<e.extension.length;i++)if(t.type.startsWith(e.extension[i]))return!0;return!1}}return!0};export const ElysiaType={File:t.CreateType("File",r),Files:t.CreateType("Files",(e,t)=>{if(!Array.isArray(t)||e.minItems&&t.length<e.minItems||e.maxItems&&t.length>e.maxItems)return!1;for(let i=0;i<t.length;i++)if(!r(e,t[i]))return!1;return!0})};e.File=e=>ElysiaType.File({default:"File",...e,extension:e?.type,type:"string",format:"binary"}),e.Files=e=>ElysiaType.Files({...e,default:"Files",extension:e?.type,type:"array",items:{...e,default:"Files",type:"string",format:"binary"}});export{e as t};
|
|
1
|
+
import{Type as e}from"@sinclair/typebox";import{TypeSystem as t}from"@sinclair/typebox/system";try{t.CreateFormat("email",e=>/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(e)),t.CreateFormat("uuid",e=>/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e)),t.CreateFormat("date",e=>!Number.isNaN(new Date(e).getTime())),t.CreateFormat("date-time",e=>!Number.isNaN(new Date(e).getTime()))}catch(e){}let i=e=>{if("string"==typeof e)switch(e.slice(-1)){case"k":return 1024*+e.slice(0,e.length-1);case"m":return 1048576*+e.slice(0,e.length-1);default:return+e}return e},r=(e,t)=>{if(!(t instanceof Blob)||e.minSize&&t.size<i(e.minSize)||e.maxSize&&t.size>i(e.maxSize))return!1;if(e.extension){if("string"==typeof e.extension){if(!t.type.startsWith(e.extension))return!1}else{for(let i=0;i<e.extension.length;i++)if(t.type.startsWith(e.extension[i]))return!0;return!1}}return!0};export const ElysiaType={File:t.CreateType("File",r),Files:t.CreateType("Files",(e,t)=>{if(!Array.isArray(t)||e.minItems&&t.length<e.minItems||e.maxItems&&t.length>e.maxItems)return!1;for(let i=0;i<t.length;i++)if(!r(e,t[i]))return!1;return!0})};e.File=e=>ElysiaType.File({default:"File",...e,extension:e?.type,type:"string",format:"binary"}),e.Files=e=>ElysiaType.Files({...e,default:"Files",extension:e?.type,type:"array",items:{...e,default:"Files",type:"string",format:"binary"}});export{e as t};
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{nanoid as e}from"nanoid";import{Raikiri as t}from"raikiri";import{parse as r}from"fast-querystring";import{mapResponse as s,mapEarlyResponse as a}from"./handler";import{permission as n}from"./fn";import{SCHEMA as i,EXPOSED as o,DEFS as h,clone as l,mergeHook as u,mergeDeep as d,createValidationError as f,getSchemaValidator as m,getResponseSchemaValidator as c,mapPathnameAndQueryRegEx as p}from"./utils";import{registerSchemaPath as v}from"./schema";import{mapErrorCode as g,mapErrorStatus as y}from"./error";import{runFn as b}from"./fn";import{deserialize as w}from"superjson";export default class H{store={};meta={[i]:Object.create(null),[h]:Object.create(null),[o]:Object.create(null)};decorators={[i]:this.meta[i],[h]:this.meta[h],store:this.store};event={start:[],request:[],parse:[],transform:[],beforeHandle:[],afterHandle:[],error:[],stop:[]};server=null;$schema=null;router=new t;routes=[];lazyLoadModules=[];constructor(e){this.config={fn:"/~fn",...e}}_addHandler(e,t,r,s){t=t.startsWith("/")?t:`/${t}`,this.routes.push({method:e,path:t,handler:r,hooks:u(l(this.event),s)});let a=this.meta[h],n=m(s?.schema?.body??this.$schema?.body,a),o=m(s?.schema?.headers??this.$schema?.headers,a,!0),d=m(s?.schema?.params??this.$schema?.params,a),f=m(s?.schema?.query??this.$schema?.query,a),p=c(s?.schema?.response??this.$schema?.response,a);v({schema:this.meta[i],contentType:s?.schema?.contentType,hook:s,method:e,path:t,models:this.meta[h]});let g=u(l(this.event),s);g.schema||g.transform.length||g.beforeHandle.length||g.error.length||g.afterHandle.length||(g=void 0);let y={handle:r,hooks:g,validator:n||o||d||f||p?{body:n,header:o,params:d,query:f,response:p}:void 0};this.router.add(e,t,y)}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){let r=new H;r.store=this.store;let s=t(r);return s.event.request.length&&(this.event.request=[...this.event.request,...s.event.request]),this.setModel(s.meta[h]),Object.values(r.routes).forEach(({method:t,path:r,handler:a,hooks:n})=>{"/"===r?this._addHandler(t,e,a,u(n,{error:s.event.error})):this._addHandler(t,`${e}${r}`,a,u(n,{error:s.event.error}))}),this}guard(e,t){let r=new H;r.store=this.store;let s=t(r);return s.event.request.length&&(this.event.request=[...this.event.request,...s.event.request]),this.setModel(s.meta[h]),Object.values(r.routes).forEach(({method:t,path:r,handler:s,hooks:a})=>{this._addHandler(t,r,s,u(e,a))}),this}use(e){if(e instanceof Promise)return this.lazyLoadModules.push(e.then(e=>"function"==typeof e?e(this):e.default(this))),this;let t=e(this);return t instanceof Promise?(this.lazyLoadModules.push(t),this):t}get(e,t,r){return this._addHandler("GET",e,t,r),this}post(e,t,r){return this._addHandler("POST",e,t,r),this}put(e,t,r){return this._addHandler("PUT",e,t,r),this}patch(e,t,r){return this._addHandler("PATCH",e,t,r),this}delete(e,t,r){return this._addHandler("DELETE",e,t,r),this}options(e,t,r){return this._addHandler("OPTIONS",e,t,r),this}all(e,t,r){return this._addHandler("ALL",e,t,r),this}head(e,t,r){return this._addHandler("HEAD",e,t,r),this}trace(e,t,r){return this._addHandler("TRACE",e,t,r),this}connect(e,t,r){return this._addHandler("CONNECT",e,t,r),this}ws(t,r){if(!this.wsRouter)throw Error("Can't find WebSocket. Please register WebSocket plugin first by importing 'elysia/ws'");return this.wsRouter.add("subscribe",t,r),this.get(t,t=>{if(!this.server.upgrade(t.request,{headers:"function"==typeof r.headers?r.headers(t):r.headers,data:{...t,id:e(),message:m(r.schema?.body,this.meta[h]),transformMessage:r.transform?Array.isArray(r.transformMessage)?r.transformMessage:[r.transformMessage]:[]}}))return t.set.status=400,"Expected a websocket connection"},{beforeHandle:r.beforeHandle,transform:r.transform,schema:{headers:r.schema?.headers,params:r.schema?.params,query:r.schema?.query}}),this}route(e,t,r,s){return this._addHandler(e,t,r,s),this}state(e,t){return e in this.store||(this.store[e]=t),this}decorate(e,t){return e in this.decorators||(this.decorators[e]=t),this}derive(e){return"AsyncFunction"===e.constructor.name?this.onTransform(async t=>{Object.assign(t,await e(t))}):this.onTransform(t=>{Object.assign(t,e(t))})}fn(e){return 0===Object.keys(this.meta[o]).length&&this.post(this.config.fn??"/~fn",async e=>b(e,this.meta[o])),this.meta[o]=d(this.meta[o],"function"==typeof e?e({...this.decorators,store:this.store,permission:n}):e),this}schema(e){let t=this.meta[h];return this.$schema={body:m(e.body,t),headers:m(e?.headers,t,!0),params:m(e?.params,t),query:m(e?.query,t),response:m(e?.response,t)},this}handle=async e=>{let t;let n=this.decorators;n.request=e,n.set={status:200,headers:{}};try{let i;for(let e=0;e<this.event.request.length;e++){let t=this.event.request[e](n);if(t instanceof Promise&&(t=await t),t=a(t,n.set))return t}let o=e.url.match(p);if(!o)throw Error("NOT_FOUND");let h=this.router.match(e.method,o[1])??this.router.match("ALL",o[1]);if(!h)throw Error("NOT_FOUND");let{hooks:l,validator:u}=h.store;if(l?.error&&(t=l?.error),"GET"!==e.method){let t=e.headers.get("content-type");if(t){let s=t.indexOf(";");-1!==s&&(t=t.slice(0,s));for(let e=0;e<this.event.parse.length;e++){let r=this.event.parse[e](n,t);if(r instanceof Promise&&(r=await r),void 0!==r){i=r;break}}if(void 0===i)switch(t){case"application/json":i=await e.json();break;case"text/plain":i=await e.text();break;case"application/x-www-form-urlencoded":i=r(await e.text());break;case"multipart/form-data":i={},await e.formData().then(e=>{for(let t of e.keys()){if(t in i)continue;let r=e.getAll(t);1===r.length?i[t]=r[0]:i[t]=r}});break;case"elysia/fn":i=w(await e.json())}}}if(n.body=i,n.params=h.params,o[2]?n.query=r(o[2]):n.query={},l)for(let e=0;e<l.transform.length;e++){let t=l.transform[e](n);t instanceof Promise&&await t}if(u){if(l?.error&&(t=l?.error),u.headers){let t={};for(let r in e.headers)t[r]=e.headers.get(r);if(!1===u.headers.Check(t))throw f("header",u.headers,t)}if(!1===u.params?.Check(n.params))throw f("params",u.params,n.params);if(!1===u.query?.Check(n.query))throw f("query",u.query,n.query);if(!1===u.body?.Check(i))throw f("body",u.body,i)}if(l)for(let e=0;e<l.beforeHandle.length;e++){let t=l.beforeHandle[e](n);if(t instanceof Promise&&(t=await t),null!=t){for(let e=0;e<l.afterHandle.length;e++){let r=l.afterHandle[e](n,t);r instanceof Promise&&(r=await r),r&&(t=r)}let e=a(t,n.set);if(e)return e}}let d=h.store.handle(n);if(d instanceof Promise&&(d=await d),!1===u?.response?.Check(d))throw l?.error&&(t=l.error),f("response",u.response,d);if(l)for(let e=0;e<l.afterHandle.length;e++){let t=l.afterHandle[e](n,d);t instanceof Promise&&(t=await t);let r=a(t,n.set);if(r)return r}return s(d,n.set)}catch(s){let r=n.set;if((!r.status||r.status<300)&&(r.status=500),t){let n=g(s.message);for(let i=0;i<t.length;i++){let o=t[i]({request:e,error:s,set:r,code:n});o instanceof Promise&&(o=await o);let h=a(o,r);if(h)return h}}return this.handleError(e,s,r)}};async handleError(e,t,r={headers:{}}){for(let a=0;a<this.event.error.length;a++){let n=this.event.error[a]({request:e,code:g(t.message),error:t,set:r});if(n instanceof Promise&&(n=await n),null!=n)return s(n,r)}return new Response("string"==typeof t.cause?t.cause:t.message,{headers:r.headers,status:y(g(t.message))})}listen=(e,t)=>{if(!Bun)throw Error("Bun to run");if("string"==typeof e&&Number.isNaN(e=+e))throw Error("Port must be a numeric value");let r=this.handle,s="object"==typeof e?{...this.config.serve,...e,fetch:r}:{...this.config.serve,port:e,fetch:r},a=`$$Elysia:${s.port}`;globalThis[a]?(this.server=globalThis[a],this.server.reload(s)):globalThis[a]=this.server=Bun.serve(s);for(let e=0;e<this.event.start.length;e++)this.event.start[e](this);return t&&t(this.server),Promise.all(this.lazyLoadModules).then(()=>{this.server.pendingRequests||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)}setModel(e){return Object.entries(e).forEach(([e,t])=>{e in this.meta[h]||(this.meta[h][e]=t)}),this}}export{t}from"./custom-types";export{ws}from"./ws";export{SCHEMA,DEFS,EXPOSED,createValidationError,getSchemaValidator,mergeDeep,mergeHook,mergeObjectArray,mapPathnameAndQueryRegEx}from"./utils";export{H as Elysia,n as permission};
|
|
1
|
+
import{nanoid as e}from"nanoid";import{Raikiri as t}from"raikiri";import{parse as r}from"fast-querystring";import{mapResponse as s,mapEarlyResponse as a}from"./handler";import{permission as n}from"./fn";import{SCHEMA as i,EXPOSED as o,DEFS as h,clone as l,mergeHook as u,mergeDeep as d,createValidationError as f,getSchemaValidator as m,getResponseSchemaValidator as c,mapPathnameAndQueryRegEx as p}from"./utils";import{registerSchemaPath as v}from"./schema";import{mapErrorCode as g,mapErrorStatus as y}from"./error";import{runFn as b}from"./fn";import{deserialize as w}from"superjson";export default class H{store={};meta={[i]:Object.create(null),[h]:Object.create(null),[o]:Object.create(null)};decorators={[i]:this.meta[i],[h]:this.meta[h],store:this.store};event={start:[],request:[],parse:[],transform:[],beforeHandle:[],afterHandle:[],error:[],stop:[]};server=null;$schema=null;router=new t;routes=[];lazyLoadModules=[];constructor(e){this.config={fn:"/~fn",...e}}_addHandler(e,t,r,s){t=t.startsWith("/")?t:`/${t}`,this.routes.push({method:e,path:t,handler:r,hooks:u(l(this.event),s)});let a=this.meta[h],n=m(s?.schema?.body??this.$schema?.body,a),o=m(s?.schema?.headers??this.$schema?.headers,a,!0),d=m(s?.schema?.params??this.$schema?.params,a),f=m(s?.schema?.query??this.$schema?.query,a),p=c(s?.schema?.response??this.$schema?.response,a);v({schema:this.meta[i],contentType:s?.schema?.contentType,hook:s,method:e,path:t,models:this.meta[h]});let g=u(l(this.event),s);g.schema||g.transform.length||g.beforeHandle.length||g.error.length||g.afterHandle.length||(g=void 0);let y={handle:r,hooks:g,validator:n||o||d||f||p?{body:n,header:o,params:d,query:f,response:p}:void 0};this.router.add(e,t,y)}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){let r=new H;r.store=this.store;let s=t(r);return s.event.request.length&&(this.event.request=[...this.event.request,...s.event.request]),this.setModel(s.meta[h]),Object.values(r.routes).forEach(({method:t,path:r,handler:a,hooks:n})=>{"/"===r?this._addHandler(t,e,a,u(n,{error:s.event.error})):this._addHandler(t,`${e}${r}`,a,u(n,{error:s.event.error}))}),this}guard(e,t){let r=new H;r.store=this.store;let s=t(r);return s.event.request.length&&(this.event.request=[...this.event.request,...s.event.request]),this.setModel(s.meta[h]),Object.values(r.routes).forEach(({method:t,path:r,handler:s,hooks:a})=>{this._addHandler(t,r,s,u(e,a))}),this}use(e){if(e instanceof Promise)return this.lazyLoadModules.push(e.then(e=>"function"==typeof e?e(this):e.default(this))),this;let t=e(this);return t instanceof Promise?(this.lazyLoadModules.push(t),this):t}get(e,t,r){return this._addHandler("GET",e,t,r),this}post(e,t,r){return this._addHandler("POST",e,t,r),this}put(e,t,r){return this._addHandler("PUT",e,t,r),this}patch(e,t,r){return this._addHandler("PATCH",e,t,r),this}delete(e,t,r){return this._addHandler("DELETE",e,t,r),this}options(e,t,r){return this._addHandler("OPTIONS",e,t,r),this}all(e,t,r){return this._addHandler("ALL",e,t,r),this}head(e,t,r){return this._addHandler("HEAD",e,t,r),this}trace(e,t,r){return this._addHandler("TRACE",e,t,r),this}connect(e,t,r){return this._addHandler("CONNECT",e,t,r),this}ws(t,r){if(!this.wsRouter)throw Error("Can't find WebSocket. Please register WebSocket plugin first by importing 'elysia/ws'");return this.wsRouter.add("subscribe",t,r),this.get(t,t=>{if(!this.server.upgrade(t.request,{headers:"function"==typeof r.headers?r.headers(t):r.headers,data:{...t,id:e(),message:m(r.schema?.body,this.meta[h]),transformMessage:r.transform?Array.isArray(r.transformMessage)?r.transformMessage:[r.transformMessage]:[]}}))return t.set.status=400,"Expected a websocket connection"},{beforeHandle:r.beforeHandle,transform:r.transform,schema:{headers:r.schema?.headers,params:r.schema?.params,query:r.schema?.query}}),this}route(e,t,r,s){return this._addHandler(e,t,r,s),this}state(e,t){return e in this.store||(this.store[e]=t),this}decorate(e,t){return e in this.decorators||(this.decorators[e]=t),this}derive(e){return"AsyncFunction"===e.constructor.name?this.onTransform(async t=>{Object.assign(t,await e(t))}):this.onTransform(t=>{Object.assign(t,e(t))})}fn(e){return 0===Object.keys(this.meta[o]).length&&this.post(this.config.fn??"/~fn",async e=>b(e,this.meta[o])),this.meta[o]=d(this.meta[o],"function"==typeof e?e({...this.decorators,store:this.store,permission:n}):e),this}schema(e){let t=this.meta[h];return this.$schema={body:m(e.body,t),headers:m(e?.headers,t,!0),params:m(e?.params,t),query:m(e?.query,t),response:m(e?.response,t)},this}handle=async e=>{let t;let n=this.decorators;n.request=e,n.set={status:200,headers:{}};try{let i;for(let e=0;e<this.event.request.length;e++){let t=this.event.request[e](n);if(t instanceof Promise&&(t=await t),t=a(t,n.set))return t}let o=e.url.match(p);if(!o)throw Error("NOT_FOUND");let h=this.router.match(e.method,o[1])??this.router.match("ALL",o[1]);if(!h?.store)throw Error("NOT_FOUND");let{hooks:l,validator:u}=h.store;if(l?.error&&(t=l?.error),"GET"!==e.method){let t=e.headers.get("content-type");if(t){let s=t.indexOf(";");-1!==s&&(t=t.slice(0,s));for(let e=0;e<this.event.parse.length;e++){let r=this.event.parse[e](n,t);if(r instanceof Promise&&(r=await r),void 0!==r){i=r;break}}if(void 0===i)switch(t){case"application/json":i=await e.json();break;case"text/plain":i=await e.text();break;case"application/x-www-form-urlencoded":i=r(await e.text());break;case"multipart/form-data":i={},await e.formData().then(e=>{for(let t of e.keys()){if(t in i)continue;let r=e.getAll(t);1===r.length?i[t]=r[0]:i[t]=r}});break;case"elysia/fn":i=w(await e.json())}}}if(n.body=i,n.params=h.params,o[2]?n.query=r(o[2]):n.query={},l)for(let e=0;e<l.transform.length;e++){let t=l.transform[e](n);t instanceof Promise&&await t}if(u){if(l?.error&&(t=l?.error),u.headers){let t={};for(let r in e.headers)t[r]=e.headers.get(r);if(!1===u.headers.Check(t))throw f("header",u.headers,t)}if(!1===u.params?.Check(n.params))throw f("params",u.params,n.params);if(!1===u.query?.Check(n.query))throw f("query",u.query,n.query);if(!1===u.body?.Check(i))throw f("body",u.body,i)}if(l)for(let e=0;e<l.beforeHandle.length;e++){let t=l.beforeHandle[e](n);if(t instanceof Promise&&(t=await t),null!=t){for(let e=0;e<l.afterHandle.length;e++){let r=l.afterHandle[e](n,t);r instanceof Promise&&(r=await r),r&&(t=r)}let e=a(t,n.set);if(e)return e}}let d=h.store.handle(n);if(d instanceof Promise&&(d=await d),!1===u?.response?.Check(d))throw l?.error&&(t=l.error),f("response",u.response,d);if(l)for(let e=0;e<l.afterHandle.length;e++){let t=l.afterHandle[e](n,d);t instanceof Promise&&(t=await t);let r=a(t,n.set);if(r)return r}return s(d,n.set)}catch(s){let r=n.set;if((!r.status||r.status<300)&&(r.status=500),t){let n=g(s.message);for(let i=0;i<t.length;i++){let o=t[i]({request:e,error:s,set:r,code:n});o instanceof Promise&&(o=await o);let h=a(o,r);if(h)return h}}return this.handleError(e,s,r)}};async handleError(e,t,r={headers:{}}){for(let a=0;a<this.event.error.length;a++){let n=this.event.error[a]({request:e,code:g(t.message),error:t,set:r});if(n instanceof Promise&&(n=await n),null!=n)return s(n,r)}return new Response("string"==typeof t.cause?t.cause:t.message,{headers:r.headers,status:y(g(t.message))})}listen=(e,t)=>{if(!Bun)throw Error("Bun to run");if("string"==typeof e&&Number.isNaN(e=+e))throw Error("Port must be a numeric value");let r=this.handle,s="object"==typeof e?{...this.config.serve,...e,fetch:r}:{...this.config.serve,port:e,fetch:r},a=`$$Elysia:${s.port}`;globalThis[a]?(this.server=globalThis[a],this.server.reload(s)):globalThis[a]=this.server=Bun.serve(s);for(let e=0;e<this.event.start.length;e++)this.event.start[e](this);return t&&t(this.server),Promise.all(this.lazyLoadModules).then(()=>{this.server.pendingRequests||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)}setModel(e){return Object.entries(e).forEach(([e,t])=>{e in this.meta[h]||(this.meta[h][e]=t)}),this}}export{t}from"./custom-types";export{ws}from"./ws";export{SCHEMA,DEFS,EXPOSED,createValidationError,getSchemaValidator,mergeDeep,mergeHook,mergeObjectArray,mapPathnameAndQueryRegEx}from"./utils";export{H as Elysia,n as permission};
|
package/package.json
CHANGED
package/src/custom-types.ts
CHANGED
|
@@ -1,6 +1,32 @@
|
|
|
1
1
|
import { Type, type SchemaOptions } from '@sinclair/typebox'
|
|
2
2
|
import { TypeSystem } from '@sinclair/typebox/system'
|
|
3
3
|
|
|
4
|
+
try {
|
|
5
|
+
TypeSystem.CreateFormat('email', (value) =>
|
|
6
|
+
/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(
|
|
7
|
+
value
|
|
8
|
+
)
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
TypeSystem.CreateFormat('uuid', (value) =>
|
|
12
|
+
/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(
|
|
13
|
+
value
|
|
14
|
+
)
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
TypeSystem.CreateFormat(
|
|
18
|
+
'date',
|
|
19
|
+
(value) => !Number.isNaN(new Date(value).getTime())
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
TypeSystem.CreateFormat(
|
|
23
|
+
'date-time',
|
|
24
|
+
(value) => !Number.isNaN(new Date(value).getTime())
|
|
25
|
+
)
|
|
26
|
+
} catch (error) {
|
|
27
|
+
// Not empty
|
|
28
|
+
}
|
|
29
|
+
|
|
4
30
|
type MaybeArray<T> = T | T[]
|
|
5
31
|
|
|
6
32
|
export namespace ElysiaTypeOptions {
|
package/src/index.ts
CHANGED
|
@@ -489,7 +489,6 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
|
|
|
489
489
|
}>
|
|
490
490
|
: this {
|
|
491
491
|
const instance = new Elysia<any>()
|
|
492
|
-
|
|
493
492
|
instance.store = this.store
|
|
494
493
|
|
|
495
494
|
const sandbox = run(instance)
|
|
@@ -1630,7 +1629,7 @@ export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {
|
|
|
1630
1629
|
this.router.match(request.method, fracture[1]) ??
|
|
1631
1630
|
this.router.match('ALL', fracture[1])
|
|
1632
1631
|
|
|
1633
|
-
if (!route) throw new Error('NOT_FOUND')
|
|
1632
|
+
if (!route?.store) throw new Error('NOT_FOUND')
|
|
1634
1633
|
const { hooks, validator } = route.store!
|
|
1635
1634
|
|
|
1636
1635
|
// const hooks = handler.hooks
|