Socket
Socket
Sign inDemoInstall

elysia

Package Overview
Dependencies
Maintainers
1
Versions
400
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

elysia - npm Package Compare versions

Comparing version 0.4.0-exp-230322.29 to 0.4.0-exp-230322.2051

66

dist/compose.js

@@ -1,2 +0,2 @@

import{parse as e}from"fast-querystring";import{deserialize as r}from"superjson";import{createValidationError as a}from"./utils";import{mapEarlyResponse as t,mapResponse as o}from"./handler";import{mapErrorCode as s}from"./error";let n="AsyncFunction",c=e=>e.constructor.name===n;export const composeHandler=({method:l,hooks:i,validator:f,handler:p,handleError:u})=>{let h="try {\n",y="GET"!==l||p.constructor.name===n||i.parse.length||i.afterHandle.find(c)||i.beforeHandle.find(c)||i.transform.find(c);if(y){if(h+=`
import{parse as e}from"fast-querystring";import{createValidationError as r}from"./utils";import{mapEarlyResponse as t,mapResponse as a}from"./handler";import{mapErrorCode as s}from"./error";let n="AsyncFunction",o=e=>e.constructor.name===n;export const composeHandler=({method:c,hooks:l,validator:d,handler:i,handleError:f})=>{let p="try {\n",u="GET"!==c||i.constructor.name===n||l.parse.length||l.afterHandle.find(o)||l.beforeHandle.find(o)||l.transform.find(o);if(u){if(p+=`
let contentType = c.request.headers.get('content-type');

@@ -7,8 +7,8 @@

if (index !== -1) contentType = contentType.slice(0, index);
`,i.parse.length){h+=`used = false
`;for(let e=0;e<i.parse.length;e++){let r=`bo${e}`;h+=`if(!c.request.bodyUsed) {
`,l.parse.length){p+=`used = false
`;for(let e=0;e<l.parse.length;e++){let r=`bo${e}`;p+=`if(!c.request.bodyUsed) {
let ${r} = parse[${e}](c, contentType);
if(${r} instanceof Promise) ${r} = await ${r}
if(${r} !== undefined) { c.body = ${r}; used = true }
}`}h+="if (!used)"}h+=`switch (contentType) {
}`}p+="if (!used)"}p+=`switch (contentType) {
case 'application/json':

@@ -23,3 +23,3 @@ c.body = await c.request.json()

case 'application/x-www-form-urlencoded':
c.body = parseQuery(await c.request.text())
c.body = await c.request.text().then(parseQuery)
break

@@ -43,10 +43,4 @@

break
case 'elysia/fn':
c.body = superjsonDeserialize(
await c.request.json()
)
break
`.replace(/\t/g,"")+`}}
`}if(i?.transform)for(let e=0;e<i.transform.length;e++)h+=i.transform[e].constructor.name===n?`await transform[${e}](c);`:`transform[${e}](c);`;if(f&&(f.headers&&(h+=`
`}if(l?.transform)for(let e=0;e<l.transform.length;e++)p+=l.transform[e].constructor.name===n?`await transform[${e}](c);`:`transform[${e}](c);`;if(d&&(d.headers&&(p+=`
const _header = {}

@@ -56,3 +50,3 @@ for (const key of c.request.headers.keys())

if (headersCheck(_header) === false) {
if (headers.Check(_header) === false) {
throw createValidationError(

@@ -64,18 +58,26 @@ 'header',

}
`.replace(/\t/g,"")),f.params&&(h+="if(paramsCheck(c.params) === false) { throw createValidationError('params', params, c.params) }"),f.query&&(h+="if(queryCheck(c.query) === false) { throw createValidationError('params', query, c.query) }"),f.body&&(h+="if(bodyCheck(c.body) === false) { throw createValidationError('body', body, c.body) }")),i?.beforeHandle)for(let e=0;e<i.beforeHandle.length;e++){let r=`be${e}`;if(h+=(i.beforeHandle[e].constructor.name===n?`let ${r} = await beforeHandle[${e}](c);
`.replace(/\t/g,"")),d.params&&(p+="if(params.Check(c.params) === false) { throw createValidationError('params', params, c.params) }"),d.query&&(p+="if(query.Check(c.query) === false) { throw createValidationError('params', query, c.query) }"),d.body&&(p+="if(body.Check(c.body) === false) { throw createValidationError('body', body, c.body) }")),l?.beforeHandle)for(let e=0;e<l.beforeHandle.length;e++){let r=`be${e}`;if(p+=(l.beforeHandle[e].constructor.name===n?`let ${r} = await beforeHandle[${e}](c);
`:`let ${r} = beforeHandle[${e}](c);
`)+`if(${r} !== undefined) {
`,i?.afterHandle)for(let e=0;e<i.afterHandle.length;e++){let a=`af${e}`;h+=(i.afterHandle[e].constructor.name===n?`const ${a} = await afterHandle[${e}](c, ${r});
`:`const ${a} = afterHandle[${e}](c, ${r});
`)+`if(${a} !== undefined) { ${r} = ${a} }
`}h+=`return mapEarlyResponse(${r}, c.set)}
`}if(i?.afterHandle.length){h+=p.constructor.name===n?`let r = await handler(c);
`,l?.afterHandle)for(let e=0;e<l.afterHandle.length;e++){let t=`af${e}`;p+=(l.afterHandle[e].constructor.name===n?`const ${t} = await afterHandle[${e}](c, ${r});
`:`const ${t} = afterHandle[${e}](c, ${r});
`)+`if(${t} !== undefined) { ${r} = ${t} }
`}d.response&&(p+=`if(response[c.set.status]?.Check(${r}) === false) { throw createValidationError('response', response[c.set.status], ${r}) }
`),p+=`return mapEarlyResponse(${r}, c.set)}
`}if(l?.afterHandle.length){p+=i.constructor.name===n?`let r = await handler(c);
`:`let r = handler(c);
`;for(let e=0;e<i.afterHandle.length;e++){let r=`af${e}`;h+=(i.afterHandle[e].constructor.name===n?`const ${r} = mapEarlyResponse(await afterHandle[${e}](c, r), c.set);
`:`const ${r} = mapEarlyResponse(afterHandle[${e}](c, r), c.set);
`)+`if(${r}) return ${r};
`}h+=`return mapResponse(r, c.set);
`}else h+=p.constructor.name===n?"return mapResponse(await handler(c), c.set);":"return mapResponse(handler(c), c.set);";h+=`
`;for(let e=0;e<l.afterHandle.length;e++){let r=`af${e}`;p+=l.afterHandle[e].constructor.name===n?`let ${r} = await afterHandle[${e}](c, r)
`:`let ${r} = afterHandle[${e}](c, r)
`,d.response?p+=`if(response[c.set.status]?.Check(${r}) === false) { throw createValidationError('response', response[c.set.status], ${r}) }
${r} = mapEarlyResponse(${r}, c.set)
if(${r}) return ${r};
`:p+=`if(${r}) return ${r};
`}d.response&&(p+=`if(response[c.set.status]?.Check(r) === false) { throw createValidationError('response', response[c.set.status], r) }
`),p+=`return mapResponse(r, c.set);
`}else d.response?p+=(i.constructor.name===n?`const r = await handler(c);
`:`const r = handler(c);
`)+`if(response[c.set.status]?.Check(r) === false) { throw createValidationError('response', response[c.set.status], r) }
`+"return mapResponse(r, c.set);":p+=i.constructor.name===n?"return mapResponse(await handler(c), c.set);":"return mapResponse(handler(c), c.set);";p+=`
} catch(error) {
${y?"":"return (async () => {"}
${u?"":"return (async () => {"}
const set = c.set

@@ -103,4 +105,4 @@

return handleError(c.request, error, set)
${y?"":"})()"}
}`,h=`const {
${u?"":"})()"}
}`,p=`const {
handler,

@@ -122,12 +124,4 @@ handleError,

},
validatorAot: {
bodyCheck,
headersCheck,
paramsCheck,
queryCheck,
responseCheck,
},
utils: {
createValidationError,
superjsonDeserialize,
mapResponse,

@@ -140,2 +134,2 @@ mapEarlyResponse,

return ${y?"async":""} function(c) {${h}}`.replace(/\t/g,"");let m=Function("hooks",h);return m({handler:p,hooks:i,validator:f,validatorAot:{bodyCheck:d(f.body),headersCheck:d(f.headers),paramsCheck:d(f.params),queryCheck:d(f.query),responseCheck:d(f.response)},handleError:u,utils:{createValidationError:a,superjsonDeserialize:r,mapResponse:o,mapEarlyResponse:t,mapErrorCode:s,parseQuery:e}})};let d=e=>{if(!e)return;let r=e.Code();return r.includes("custom(")?r=>e.Check(r):Function(e.Code())()};
return ${u?"async":""} function(c) {${p}}`.replace(/\t/g,"");let h=Function("hooks",p);return h({handler:i,hooks:l,validator:d,handleError:f,utils:{createValidationError:r,mapResponse:a,mapEarlyResponse:t,mapErrorCode:s,parseQuery:e}})};

@@ -1,1 +0,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};
import{Type as e}from"@sinclair/typebox";import{TypeSystem as t}from"@sinclair/typebox/system";try{t.Format("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.Format("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.Format("date",e=>!Number.isNaN(new Date(e).getTime())),t.Format("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};
/// <reference types="bun-types" />
import type { Serve, Server } from 'bun';
import { permission, type Permission } from './fn';
import { SCHEMA, EXPOSED, DEFS } from './utils';

@@ -9,2 +8,3 @@ import type { Context } from './context';

import { ElysiaWSOptions, WSTypedSchema } from './ws';
import type { Permission } from 'elysia/src/fn';
export default class Elysia<Instance extends ElysiaInstance = ElysiaInstance> {

@@ -197,9 +197,9 @@ config: ElysiaConfig;

}>;
fn<T extends Record<string, unknown> | ((app: Instance['request'] & {
fn<PluginInstalled extends boolean = IsAny<Permission> extends true ? false : true, T extends PluginInstalled extends true ? Record<string, unknown> | ((app: Instance['request'] & {
store: Instance['store'];
permission: Permission;
}) => Record<string, unknown>) = Record<string, unknown> | ((app: Instance['request'] & {
}) => Record<string, unknown>) : "Please install '@elysiajs/fn' before using Elysia Fn" = PluginInstalled extends true ? Record<string, unknown> | ((app: Instance['request'] & {
store: Instance['store'];
permission: Permission;
}) => Record<string, unknown>)>(value: T): Elysia<{
}) => Record<string, unknown>) : "Please install '@elysiajs/fn' before using Elysia Fn">(value: T): PluginInstalled extends true ? Elysia<{
store: Instance['store'];

@@ -209,3 +209,3 @@ request: Instance['request'];

meta: Record<typeof DEFS, Instance['meta'][typeof DEFS]> & Record<typeof EXPOSED, Instance['meta'][typeof EXPOSED] & (T extends (store: any) => infer Returned ? Returned : T)> & Record<typeof SCHEMA, Instance['meta'][typeof SCHEMA]>;
}>;
}> : this;
schema<Schema extends TypedSchema<Exclude<keyof Instance['meta'][typeof DEFS], number | symbol>> = TypedSchema<Exclude<keyof Instance['meta'][typeof DEFS], number | symbol>>, NewInstance = Elysia<{

@@ -230,3 +230,3 @@ request: Instance['request'];

}
export { Elysia, permission };
export { Elysia };
export { t } from './custom-types';

@@ -236,2 +236,2 @@ export { ws } from './ws';

export type { Context, PreContext } from './context';
export type { Handler, RegisteredHook, BeforeRequestHandler, TypedRoute, OverwritableTypeRoute, ElysiaInstance, ElysiaConfig, HTTPMethod, ComposedHandler, InternalRoute, BodyParser, ErrorHandler, ErrorCode, TypedSchema, LocalHook, LocalHandler, LifeCycle, LifeCycleEvent, AfterRequestHandler, HookHandler, TypedSchemaToRoute, UnwrapSchema, LifeCycleStore, VoidLifeCycle, SchemaValidator, ExtractPath, IsPathParameter, IsAny, IsNever, UnknownFallback, WithArray, ObjectValues, PickInOrder, MaybePromise, MergeIfNotNull, ElysiaDefaultMeta, TypedRouteToEden, AnyTypedSchema, RouteToSchema, DeepMergeTwoTypes, ConnectedKeysType } from './types';
export type { Handler, RegisteredHook, BeforeRequestHandler, TypedRoute, OverwritableTypeRoute, ElysiaInstance, ElysiaConfig, HTTPMethod, ComposedHandler, InternalRoute, BodyParser, ErrorHandler, ErrorCode, TypedSchema, LocalHook, LocalHandler, LifeCycle, LifeCycleEvent, AfterRequestHandler, HookHandler, TypedSchemaToRoute, UnwrapSchema, LifeCycleStore, VoidLifeCycle, SchemaValidator, ExtractPath, IsPathParameter, IsAny, IsNever, UnknownFallback, WithArray, ObjectValues, PickInOrder, MaybePromise, MergeIfNotNull, ElysiaDefaultMeta, TypedRouteToEden, AnyTypedSchema, RouteToSchema, DeepMergeTwoTypes } from './types';

@@ -1,1 +0,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 h,EXPOSED as i,DEFS as o,clone as u,mergeHook as d,mergeDeep as l,getSchemaValidator as m,getResponseSchemaValidator as c,mapPathnameAndQueryRegEx as p}from"./utils";import{registerSchemaPath as f}from"./schema";import{mapErrorCode as v,mapErrorStatus as g}from"./error";import{runFn as y}from"./fn";import{composeHandler as b}from"./compose";export default class H{config;store={};meta={[h]:Object.create(null),[o]:Object.create(null),[i]:Object.create(null)};decorators={[h]:this.meta[h],[o]:this.meta[o],store:this.store};event={start:[],request:[],parse:[],transform:[],beforeHandle:[],afterHandle:[],error:[],stop:[]};server=null;$schema=null;router=new t;routes=[];wsRouter;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:d(u(this.event),s)});let a=this.meta[o],n=m(s?.schema?.body??this.$schema?.body,a),i=m(s?.schema?.headers??this.$schema?.headers,a,!0),l=m(s?.schema?.params??this.$schema?.params,a),p=m(s?.schema?.query??this.$schema?.query,a),v=c(s?.schema?.response??this.$schema?.response,a);f({schema:this.meta[h],contentType:s?.schema?.contentType,hook:s,method:e,path:t,models:this.meta[o]});let g=d(u(this.event),s),y={handle:b({method:e,hooks:g,validator:{body:n,headers:i,params:l,query:p,response:v},handler:r,handleError:this.handleError}),onError:g.error};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[o]),Object.values(r.routes).forEach(({method:t,path:r,handler:a,hooks:n})=>{"/"===r?this._addHandler(t,e,a,d(n,{error:s.event.error})):this._addHandler(t,`${e}${r}`,a,d(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[o]),Object.values(r.routes).forEach(({method:t,path:r,handler:s,hooks:a})=>{this._addHandler(t,r,s,d(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[o]),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[i]).length&&this.post(this.config.fn??"/~fn",async e=>y(e,this.meta[i])),this.meta[i]=l(this.meta[i],"function"==typeof e?e({...this.decorators,store:this.store,permission:n}):e),this}schema(e){let t=this.meta[o];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=>this.innerHandle(e);innerHandle=e=>{let t=this.decorators;if(t.request=e,t.set={status:200,headers:{}},this.event.request.length)try{for(let e=0;e<this.event.request.length;e++){let r=a(this.event.request[e](t),t.set);if(void 0!==r)return r}}catch(r){return this.handleError(e,r,t.set)}let s=e.url.match(p),n=this.router.match(e.method,s[1])??this.router.match("ALL",s[1]);return n?(t.params=n.params,s[2]?t.query=r(s[2]):t.query={},n.store.handle(t)):this.handleError(e,Error("NOT_FOUND"),t.set)};handleError=async(e,t,r={headers:{}})=>{for(let a=0;a<this.event.error.length;a++){let n=this.event.error[a]({request:e,code:v(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:g(v(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.innerHandle,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[o]||(this.meta[o][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};
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{SCHEMA as n,EXPOSED as h,DEFS as i,clone as o,mergeHook as u,getSchemaValidator as d,getResponseSchemaValidator as l,mapPathnameAndQueryRegEx as m}from"./utils";import{registerSchemaPath as c}from"./schema";import{mapErrorCode as p,mapErrorStatus as f}from"./error";import{composeHandler as v}from"./compose";export default class g{config;store={};meta={[n]:Object.create(null),[i]:Object.create(null),[h]:Object.create(null)};decorators={[n]:this.meta[n],[i]:this.meta[i],store:this.store};event={start:[],request:[],parse:[],transform:[],beforeHandle:[],afterHandle:[],error:[],stop:[]};server=null;$schema=null;router=new t;routes=[];wsRouter;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(o(this.event),s)});let a=this.meta[i],h=d(s?.schema?.body??this.$schema?.body,a),m=d(s?.schema?.headers??this.$schema?.headers,a,!0),p=d(s?.schema?.params??this.$schema?.params,a),f=d(s?.schema?.query??this.$schema?.query,a),g=l(s?.schema?.response??this.$schema?.response,a);c({schema:this.meta[n],contentType:s?.schema?.contentType,hook:s,method:e,path:t,models:this.meta[i]});let y=u(o(this.event),s),b={handle:v({method:e,hooks:y,validator:{body:h,headers:m,params:p,query:f,response:g},handler:r,handleError:this.handleError}),onError:y.error};this.router.add(e,t,b)}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 g;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[i]),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 g;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[i]),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:d(r.schema?.body,this.meta[i]),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 this.use(async()=>{let{fn:t}=await import("@elysiajs/fn");return t({app:this,value:e,path:this.config.fn})})}schema(e){let t=this.meta[i];return this.$schema={body:d(e.body,t),headers:d(e?.headers,t,!0),params:d(e?.params,t),query:d(e?.query,t),response:d(e?.response,t)},this}handle=async e=>this.innerHandle(e);innerHandle=e=>{let t=this.decorators;if(t.request=e,t.set={status:200,headers:{}},this.event.request.length)try{for(let e=0;e<this.event.request.length;e++){let r=a(this.event.request[e](t),t.set);if(r)return r}}catch(r){return this.handleError(e,r,t.set)}let s=e.url.match(m),n=this.router.match(e.method,s[1])??this.router.match("ALL",s[1]);return n?(t.params=n.params,s[2]?t.query=r(s[2]):t.query={},n.store.handle(t)):this.handleError(e,Error("NOT_FOUND"),t.set)};handleError=async(e,t,r={headers:{}})=>{for(let a=0;a<this.event.error.length;a++){let n=this.event.error[a]({request:e,code:p(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:f(p(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.innerHandle,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[i]||(this.meta[i][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{g as Elysia};

@@ -97,3 +97,3 @@ /// <reference types="bun-types" />

params?: TypeCheck<any>;
response?: TypeCheck<any>;
response?: Record<number, TypeCheck<any>>;
};

@@ -235,9 +235,2 @@ export type HookHandler<Schema extends TypedSchema = TypedSchema, Instance extends ElysiaInstance = ElysiaInstance, Path extends string = string, Typed extends AnyTypedSchema = TypedSchemaToRoute<Schema, Instance['meta'][typeof DEFS]>> = Handler<Typed['params'] extends {} ? Omit<Typed, 'response'> & {

export type MaybePromise<T> = T | Promise<T>;
export type FunctionProperties<T> = {
[K in keyof T as T[K] extends Record<any, any> | ((...args: any[]) => any) ? IsAny<T[K]> extends true ? never : K : never]: T[K] extends (...args: any[]) => any ? T[K] : T[K] extends Record<string, any> ? FunctionProperties<T[K]> : never;
};
export type JoinKeys<T, Prefix extends string = ''> = {
[K in keyof T]-?: T[K] extends string | Function ? '' extends Prefix ? K : K extends string ? `${Prefix}.${K}` : never : K extends string ? JoinKeys<T[K], '' extends Prefix ? K : `${Prefix}.${K}`> : never;
}[keyof T];
export type ConnectedKeysType<T, K extends string> = K extends `${infer Key}.${infer Rest}` ? Key extends keyof T ? ConnectedKeysType<T[Key], Rest> : never : K extends keyof T ? T[K] extends (...args: infer A) => any ? A : never : never;
export type Prettify<T> = {

@@ -244,0 +237,0 @@ [K in keyof T]: T[K];

@@ -14,2 +14,2 @@ import { TSchema } from '@sinclair/typebox';

export declare const getSchemaValidator: (s: TSchema | string | undefined, models: Record<string, TSchema>, additionalProperties?: boolean) => TypeCheck<TSchema> | undefined;
export declare const getResponseSchemaValidator: (s: TypedSchema['response'] | undefined, models: Record<string, TSchema>, additionalProperties?: boolean) => TSchema | Record<string, string | TSchema> | TypeCheck<TSchema> | undefined;
export declare const getResponseSchemaValidator: (s: TypedSchema['response'] | undefined, models: Record<string, TSchema>, additionalProperties?: boolean) => Record<number, TypeCheck<any>> | undefined;

@@ -1,1 +0,1 @@

import{Kind as e,Type as r}from"@sinclair/typebox";import{TypeCompiler as t}from"@sinclair/typebox/compiler";export const SCHEMA=Symbol("schema");export const DEFS=Symbol("definitions");export const EXPOSED=Symbol("exposed");export const mergeObjectArray=(e,r)=>[...Array.isArray(e)?e:[e],...Array.isArray(r)?r:[r]];export const mergeHook=(e,r)=>{let t="schema"in e?e.schema:null,o=r&&"schema"in r?r.schema:null;return{schema:t||o?{body:o?.body??t?.body,header:o?.headers??t?.headers,params:o?.params??t?.params,query:o?.query??t?.query,response:o?.response??t?.response,detail:mergeDeep(o?.detail??{},t?.detail??{})}:void 0,transform:mergeObjectArray(e.transform??[],r?.transform??[]),beforeHandle:mergeObjectArray(e.beforeHandle??[],r?.beforeHandle??[]),parse:mergeObjectArray(e.parse??[],r?.parse??[]),afterHandle:mergeObjectArray(e.afterHandle??[],r?.afterHandle??[]),error:mergeObjectArray(e.error??[],r?.error??[])}};export const clone=e=>e;export const mapPathnameAndQueryRegEx=/:\/\/[^/]+([^#?]+)(?:\?([^#]+))?/;let o=e=>e&&"object"==typeof e&&!Array.isArray(e);export const mergeDeep=(e,r)=>{let t=Object.assign({},e);return o(e)&&o(r)&&Object.keys(r).forEach(a=>{o(r[a])&&a in e?t[a]=mergeDeep(e[a],r[a]):Object.assign(t,{[a]:r[a]})}),t};export const createValidationError=(e,r,t)=>{let o=r.Errors(t).First();return Error("VALIDATION",{cause:`Invalid ${e}: '${o?.path?.slice(1)||"root"}'. ${o?.message}`})};export const getSchemaValidator=(e,r,o=!1)=>{if(!e||"string"==typeof e&&!(e in r))return;let a="string"==typeof e?r[e]:e;return"object"===a.type&&"additionalProperties"in a==!1&&(a.additionalProperties=o),t.Compile(a)};export const getResponseSchemaValidator=(o,a,n=!1)=>{if(!o||"string"==typeof o&&!(o in a))return;let s="string"==typeof o?a[o]:o,i=e in s?s:r.Union(Object.keys(s).map(e=>{let r=s[e];if("string"==typeof r){if(r in a){let e=a[r];return e}return}return r}).filter(e=>e));"object"===i.type&&"additionalProperties"in i==!1&&(i.additionalProperties=n);try{return t.Compile(i)}catch(e){return s}};
import{Kind as e}from"@sinclair/typebox";import{TypeCompiler as r}from"@sinclair/typebox/compiler";export const SCHEMA=Symbol("schema");export const DEFS=Symbol("definitions");export const EXPOSED=Symbol("exposed");export const mergeObjectArray=(e,r)=>[...Array.isArray(e)?e:[e],...Array.isArray(r)?r:[r]];export const mergeHook=(e,r)=>{let t="schema"in e?e.schema:null,o=r&&"schema"in r?r.schema:null;return{schema:t||o?{body:o?.body??t?.body,header:o?.headers??t?.headers,params:o?.params??t?.params,query:o?.query??t?.query,response:o?.response??t?.response,detail:mergeDeep(o?.detail??{},t?.detail??{})}:void 0,transform:mergeObjectArray(e.transform??[],r?.transform??[]),beforeHandle:mergeObjectArray(e.beforeHandle??[],r?.beforeHandle??[]),parse:mergeObjectArray(e.parse??[],r?.parse??[]),afterHandle:mergeObjectArray(e.afterHandle??[],r?.afterHandle??[]),error:mergeObjectArray(e.error??[],r?.error??[])}};export const clone=e=>e;export const mapPathnameAndQueryRegEx=/:\/\/[^/]+([^#?]+)(?:\?([^#]+))?/;let t=e=>e&&"object"==typeof e&&!Array.isArray(e);export const mergeDeep=(e,r)=>{let o=Object.assign({},e);return t(e)&&t(r)&&Object.keys(r).forEach(a=>{t(r[a])&&a in e?o[a]=mergeDeep(e[a],r[a]):Object.assign(o,{[a]:r[a]})}),o};export const createValidationError=(e,r,t)=>{let o=r.Errors(t).First();return Error("VALIDATION",{cause:`Invalid ${e}: '${o?.path?.slice(1)||"root"}'. ${o?.message}`})};export const getSchemaValidator=(e,t,o=!1)=>{if(!e||"string"==typeof e&&!(e in t))return;let a="string"==typeof e?t[e]:e;return"object"===a.type&&"additionalProperties"in a==!1&&(a.additionalProperties=o),r.Compile(a)};export const getResponseSchemaValidator=(t,o,a=!1)=>{if(!t||"string"==typeof t&&!(t in o))return;let n="string"==typeof t?o[t]:t;if(e in n)return{200:r.Compile(n)};let s={};return Object.keys(n).forEach(t=>{let i=n[t];if("string"==typeof i){if(i in o){let a=o[i];a.type,s[+t]=e in a?r.Compile(a):a}return}"object"===i.type&&"additionalProperties"in i==!1&&(i.additionalProperties=a),s[+t]=e in i?r.Compile(i):i}),s};
{
"name": "elysia",
"description": "Fast, and friendly Bun web framework",
"version": "0.4.0-exp-230322.0029",
"version": "0.4.0-exp-230322.2051",
"author": {

@@ -98,4 +98,3 @@ "name": "saltyAom",

"openapi-types": "^12.1.0",
"raikiri": "0.1.0-beta.2",
"superjson": "^1.12.2"
"raikiri": "0.1.0-beta.2"
},

@@ -118,2 +117,5 @@ "devDependencies": {

"peerDependenciesMeta": {
"@elysiajs/fn": {
"optional": true
},
"@sinclair/typebox": {

@@ -126,2 +128,2 @@ "optional": true

}
}
}
import { parse as parseQuery } from 'fast-querystring'
import { deserialize as superjsonDeserialize } from 'superjson'

@@ -15,3 +14,2 @@ import { createValidationError } from './utils'

import { mapErrorCode } from './error'
import { TypeCheck } from '@sinclair/typebox/compiler'

@@ -79,3 +77,3 @@ const ASYNC_FN = 'AsyncFunction'

case 'application/x-www-form-urlencoded':
c.body = parseQuery(await c.request.text())
c.body = await c.request.text().then(parseQuery)
break

@@ -99,8 +97,2 @@

break
case 'elysia/fn':
c.body = superjsonDeserialize(
await c.request.json()
)
break
`.replace(/\t/g, '')

@@ -126,3 +118,3 @@

if (headersCheck(_header) === false) {
if (headers.Check(_header) === false) {
throw createValidationError(

@@ -137,9 +129,9 @@ 'header',

if (validator.params)
fnLiteral += `if(paramsCheck(c.params) === false) { throw createValidationError('params', params, c.params) }`
fnLiteral += `if(params.Check(c.params) === false) { throw createValidationError('params', params, c.params) }`
if (validator.query)
fnLiteral += `if(queryCheck(c.query) === false) { throw createValidationError('params', query, c.query) }`
fnLiteral += `if(query.Check(c.query) === false) { throw createValidationError('params', query, c.query) }`
if (validator.body)
fnLiteral += `if(bodyCheck(c.body) === false) { throw createValidationError('body', body, c.body) }`
fnLiteral += `if(body.Check(c.body) === false) { throw createValidationError('body', body, c.body) }`
}

@@ -171,2 +163,5 @@

if (validator.response)
fnLiteral += `if(response[c.set.status]?.Check(${name}) === false) { throw createValidationError('response', response[c.set.status], ${name}) }\n`
fnLiteral += `return mapEarlyResponse(${name}, c.set)}\n`

@@ -186,14 +181,32 @@ }

hooks.afterHandle[i].constructor.name === ASYNC_FN
? `const ${name} = mapEarlyResponse(await afterHandle[${i}](c, r), c.set);\n`
: `const ${name} = mapEarlyResponse(afterHandle[${i}](c, r), c.set);\n`
? `let ${name} = await afterHandle[${i}](c, r)\n`
: `let ${name} = afterHandle[${i}](c, r)\n`
fnLiteral += `if(${name}) return ${name};\n`
if (validator.response) {
fnLiteral += `if(response[c.set.status]?.Check(${name}) === false) { throw createValidationError('response', response[c.set.status], ${name}) }\n`
fnLiteral += `${name} = mapEarlyResponse(${name}, c.set)\n`
fnLiteral += `if(${name}) return ${name};\n`
} else fnLiteral += `if(${name}) return ${name};\n`
}
if (validator.response)
fnLiteral += `if(response[c.set.status]?.Check(r) === false) { throw createValidationError('response', response[c.set.status], r) }\n`
fnLiteral += `return mapResponse(r, c.set);\n`
} else {
fnLiteral +=
handler.constructor.name === ASYNC_FN
? `return mapResponse(await handler(c), c.set);`
: `return mapResponse(handler(c), c.set);`
if (validator.response) {
fnLiteral +=
handler.constructor.name === ASYNC_FN
? `const r = await handler(c);\n`
: `const r = handler(c);\n`
fnLiteral += `if(response[c.set.status]?.Check(r) === false) { throw createValidationError('response', response[c.set.status], r) }\n`
fnLiteral += `return mapResponse(r, c.set);`
} else
fnLiteral +=
handler.constructor.name === ASYNC_FN
? `return mapResponse(await handler(c), c.set);`
: `return mapResponse(handler(c), c.set);`
}

@@ -246,12 +259,4 @@

},
validatorAot: {
bodyCheck,
headersCheck,
paramsCheck,
queryCheck,
responseCheck,
},
utils: {
createValidationError,
superjsonDeserialize,
mapResponse,

@@ -269,2 +274,4 @@ mapEarlyResponse,

// console.log(fnLiteral)
const createHandler = Function('hooks', fnLiteral)

@@ -276,13 +283,5 @@

validator,
validatorAot: {
bodyCheck: createTypeboxAot(validator.body),
headersCheck: createTypeboxAot(validator.headers),
paramsCheck: createTypeboxAot(validator.params),
queryCheck: createTypeboxAot(validator.query),
responseCheck: createTypeboxAot(validator.response)
},
handleError,
utils: {
createValidationError,
superjsonDeserialize,
mapResponse,

@@ -296,9 +295,9 @@ mapEarlyResponse,

const createTypeboxAot = (a: TypeCheck<any> | undefined) => {
if (!a) return
// const createTypeboxAot = (a: TypeCheck<any> | undefined) => {
// if (!a) return
const fnLiteral = a.Code()
// const fnLiteral = a.Code()
if (fnLiteral.includes('custom(')) return (param: any) => a.Check(param)
return new Function(a.Code())()
}
// if (fnLiteral.includes('custom(')) return (param: any) => a.Check(param)
// return new Function(a.Code())()
// }

@@ -5,3 +5,3 @@ import { Type, type SchemaOptions } from '@sinclair/typebox'

try {
TypeSystem.CreateFormat('email', (value) =>
TypeSystem.Format('email', (value) =>
/^[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(

@@ -12,3 +12,3 @@ value

TypeSystem.CreateFormat('uuid', (value) =>
TypeSystem.Format('uuid', (value) =>
/^[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(

@@ -19,3 +19,3 @@ value

TypeSystem.CreateFormat(
TypeSystem.Format(
'date',

@@ -25,3 +25,3 @@ (value) => !Number.isNaN(new Date(value).getTime())

TypeSystem.CreateFormat(
TypeSystem.Format(
'date-time',

@@ -28,0 +28,0 @@ (value) => !Number.isNaN(new Date(value).getTime())

@@ -8,3 +8,2 @@ import type { Serve, Server } from 'bun'

import { mapResponse, mapEarlyResponse } from './handler'
import { permission, type Permission } from './fn'
import {

@@ -16,3 +15,2 @@ SCHEMA,

mergeHook,
mergeDeep,
getSchemaValidator,

@@ -26,4 +24,2 @@ getResponseSchemaValidator,

import { runFn } from './fn'
import type {

@@ -65,2 +61,5 @@ Handler,

// @ts-ignore
import type { Permission } from 'elysia/src/fn'
/**

@@ -1502,51 +1501,58 @@ * ### Elysia Server

fn<
T extends
| Record<string, unknown>
| ((
app: Instance['request'] & {
store: Instance['store']
permission: Permission
}
) => Record<string, unknown>) =
| Record<string, unknown>
| ((
app: Instance['request'] & {
store: Instance['store']
permission: Permission
}
) => Record<string, unknown>)
PluginInstalled extends boolean = IsAny<Permission> extends true
? false
: true,
T extends PluginInstalled extends true
?
| Record<string, unknown>
| ((
app: Instance['request'] & {
store: Instance['store']
permission: Permission
}
) => Record<string, unknown>)
: "Please install '@elysiajs/fn' before using Elysia Fn" = PluginInstalled extends true
?
| Record<string, unknown>
| ((
app: Instance['request'] & {
store: Instance['store']
permission: Permission
}
) => Record<string, unknown>)
: "Please install '@elysiajs/fn' before using Elysia Fn"
>(
value: T
): Elysia<{
store: Instance['store']
request: Instance['request']
schema: Instance['schema']
meta: Record<typeof DEFS, Instance['meta'][typeof DEFS]> &
Record<
typeof EXPOSED,
Instance['meta'][typeof EXPOSED] &
(T extends (store: any) => infer Returned ? Returned : T)
> &
Record<typeof SCHEMA, Instance['meta'][typeof SCHEMA]>
}> {
if (Object.keys(this.meta[EXPOSED]).length === 0) {
this.post(
this.config.fn ?? '/~fn',
// @ts-ignore
async (context) => runFn(context, this.meta[EXPOSED])
)
}
): PluginInstalled extends true
? Elysia<{
store: Instance['store']
request: Instance['request']
schema: Instance['schema']
meta: Record<typeof DEFS, Instance['meta'][typeof DEFS]> &
Record<
typeof EXPOSED,
Instance['meta'][typeof EXPOSED] &
(T extends (store: any) => infer Returned
? Returned
: T)
> &
Record<typeof SCHEMA, Instance['meta'][typeof SCHEMA]>
}>
: this {
return this.use(async () => {
// @ts-ignore
const { fn } = await import('@elysiajs/fn')
this.meta[EXPOSED] = mergeDeep(
this.meta[EXPOSED],
typeof value === 'function'
? value({
...this.decorators,
store: this.store,
permission
} as any)
: value
) as any
if (typeof fn === undefined)
throw new Error(
"Please install '@elysiajs/fn' before using Elysia Fn"
)
return this as any
// @ts-ignore
return fn({
app: this as any,
value: value as any,
path: this.config.fn
})
}) as any
}

@@ -1619,3 +1625,3 @@

)
if (response !== undefined) return response
if (response) return response
}

@@ -1789,3 +1795,3 @@ } catch (error) {

export { Elysia, permission }
export { Elysia }
export { t } from './custom-types'

@@ -1847,4 +1853,3 @@ export { ws } from './ws'

RouteToSchema,
DeepMergeTwoTypes,
ConnectedKeysType
DeepMergeTwoTypes
} from './types'

@@ -208,3 +208,3 @@ import type { Elysia } from '.'

params?: TypeCheck<any>
response?: TypeCheck<any>
response?: Record<number, TypeCheck<any>>
}

@@ -569,47 +569,2 @@

export type FunctionProperties<T> = {
[K in keyof T as T[K] extends Record<any, any> | ((...args: any[]) => any)
? IsAny<T[K]> extends true
? never
: K
: never]: T[K] extends (...args: any[]) => any
? T[K]
: T[K] extends Record<string, any>
? FunctionProperties<T[K]>
: never
}
export type JoinKeys<T, Prefix extends string = ''> = {
[K in keyof T]-?: T[K] extends string | Function
? '' extends Prefix
? K
: K extends string
? `${Prefix}.${K}`
: never
: K extends string
? JoinKeys<T[K], '' extends Prefix ? K : `${Prefix}.${K}`>
: never
}[keyof T]
// type ExcludeFunctionFromRoot<T extends Record<any, any>> = {
// [K in keyof T as T[K] extends (...args: any) => any ? never : K]: T[K]
// }
// type ExcludeRecordFromRoot<T extends Record<any, any>> = {
// [K in keyof T as T[K] extends Record<string, string> ? never : K]: T[K]
// }
export type ConnectedKeysType<
T,
K extends string
> = K extends `${infer Key}.${infer Rest}`
? Key extends keyof T
? ConnectedKeysType<T[Key], Rest>
: never
: K extends keyof T
? T[K] extends (...args: infer A) => any
? A
: never
: never
// https://twitter.com/mattpocockuk/status/1622730173446557697?s=20

@@ -616,0 +571,0 @@ export type Prettify<T> = {

@@ -135,3 +135,3 @@ import { Kind, TSchema, Type } from '@sinclair/typebox'

additionalProperties = false
) => {
): Record<number, TypeCheck<any>> | undefined => {
if (!s) return

@@ -142,35 +142,40 @@ if (typeof s === 'string' && !(s in models)) return

const schema: TSchema =
Kind in maybeSchemaOrRecord
? maybeSchemaOrRecord
: Type.Union(
Object.keys(maybeSchemaOrRecord)
.map((key): TSchema | undefined => {
const maybeNameOrSchema = maybeSchemaOrRecord[key]
if (Kind in maybeSchemaOrRecord)
return {
200: TypeCompiler.Compile(maybeSchemaOrRecord)
}
if (typeof maybeNameOrSchema === 'string') {
if (maybeNameOrSchema in models) {
const schema = models[maybeNameOrSchema]
const record: Record<number, TypeCheck<any>> = {}
return schema
}
Object.keys(maybeSchemaOrRecord).forEach((status): TSchema | undefined => {
const maybeNameOrSchema = maybeSchemaOrRecord[status]
return undefined
}
if (typeof maybeNameOrSchema === 'string') {
if (maybeNameOrSchema in models) {
const schema = models[maybeNameOrSchema]
schema.type === 'object' &&
'additionalProperties' in schema === false
return maybeNameOrSchema
})
.filter((a) => a) as TSchema[]
)
// Inherits model maybe already compiled
record[+status] =
Kind in schema ? TypeCompiler.Compile(schema) : schema
}
// @ts-ignore
if (schema.type === 'object' && 'additionalProperties' in schema === false)
schema.additionalProperties = additionalProperties
return undefined
}
try {
return TypeCompiler.Compile(schema)
} catch (error) {
// Likely is already compile
return maybeSchemaOrRecord
}
if (
maybeNameOrSchema.type === 'object' &&
'additionalProperties' in maybeNameOrSchema === false
)
maybeNameOrSchema.additionalProperties = additionalProperties
// Inherits model maybe already compiled
record[+status] =
Kind in maybeNameOrSchema
? TypeCompiler.Compile(maybeNameOrSchema)
: maybeNameOrSchema
})
return record
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc