diff --git a/CHANGELOG.md b/CHANGELOG.md index 4407afd3..e5f3eda0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,9 @@ -# 1.2.11 +# 1.2.12 - 4 Feb 2025 +Bug fix: +- warn when non-existing macro is used +- parser doesn't generate optimize instruction + +# 1.2.11 - 1 Feb 2025 Feature: - Reduce memory usage: - Compressed lifecycle event diff --git a/example/a.ts b/example/a.ts index 7b8038e2..a4baa941 100644 --- a/example/a.ts +++ b/example/a.ts @@ -1,12 +1,21 @@ import { Elysia } from '../src' -const app = new Elysia() - .ws('/ws/:id', { - message(ws, message) { - ws.send(message) - } +const app = new Elysia({ precompile: true }) + .post('/json', ({ body }) => body, { + parse: 'json' }) - // .get('/ws/:id', () => 'hi') .listen(3000) +console.log(app.routes[0].composed.toString()) + +const response = await app + .handle( + new Request('http://localhost:3000/json', { + method: 'POST', + body: JSON.stringify({ name: 'Aru' }) + }) + ) + .then((x) => x.json()) + + // console.log(app.fetch.toString()) diff --git a/package.json b/package.json index 0d46a6ca..e7bf16b8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "elysia", "description": "Ergonomic Framework for Human", - "version": "1.2.11", + "version": "1.2.12", "author": { "name": "saltyAom", "url": "https://github.com/SaltyAom", diff --git a/server b/server new file mode 100755 index 00000000..6e1559bb Binary files /dev/null and b/server differ diff --git a/src/compose.ts b/src/compose.ts index 34c487b8..7cefb969 100644 --- a/src/compose.ts +++ b/src/compose.ts @@ -931,7 +931,7 @@ export const composeHandler = ({ if (adapter.parser.declare) fnLiteral += adapter.parser.declare - fnLiteral += '\nisParsing=true' + fnLiteral += '\nisParsing=true\n' const parser = typeof hooks.parse === 'string' @@ -944,7 +944,7 @@ export const composeHandler = ({ : undefined : undefined - if (parser && parser in defaultParsers) { + if (parser && defaultParsers.includes(parser)) { const reporter = report('parse', { total: hooks.parse?.length }) diff --git a/src/index.ts b/src/index.ts index a7a2b515..aed67437 100644 --- a/src/index.ts +++ b/src/index.ts @@ -816,7 +816,7 @@ export default class Elysia< const handler = { handler: shouldPrecompile ? mainHandler : undefined, compile() { - return this.handler = compile!() + return (this.handler = compile!()) } } @@ -2782,6 +2782,7 @@ export default class Elysia< }, Definitions['error'], Metadata['macro'], + keyof Metadata['macro'], keyof Metadata['parser'] & string >, run: ( @@ -2929,7 +2930,10 @@ export default class Elysia< >, const Type extends LifeCycleType, const Macro extends Metadata['macro'], - const MacroContext extends MacroToContext + const MacroContext extends MacroToContext< + Metadata['macroFn'], + NoInfer + > >( hook: { as: Type } & LocalHook< LocalSchema, @@ -2940,6 +2944,7 @@ export default class Elysia< }, Definitions['error'], Macro, + keyof Metadata['macro'] | 'as', keyof Metadata['parser'] & string > ): Type extends 'global' @@ -3026,7 +3031,10 @@ export default class Elysia< Metadata['schema'] >, const Macro extends Metadata['macro'], - const MacroContext extends MacroToContext + const MacroContext extends MacroToContext< + Metadata['macroFn'], + NoInfer + > >( hook: LocalHook< LocalSchema, @@ -3039,6 +3047,7 @@ export default class Elysia< }, Definitions['error'], Macro, + keyof Metadata['macro'], keyof Metadata['parser'] & string > ): Elysia< @@ -3073,7 +3082,10 @@ export default class Elysia< Metadata['schema'] >, const Macro extends Metadata['macro'], - const MacroContext extends MacroToContext + const MacroContext extends MacroToContext< + Metadata['macroFn'], + NoInfer + > >( run: ( group: Elysia< @@ -3116,7 +3128,10 @@ export default class Elysia< Metadata['schema'] >, const Macro extends Metadata['macro'], - const MacroContext extends MacroToContext + const MacroContext extends MacroToContext< + Metadata['macroFn'], + NoInfer + > >( schema: LocalHook< LocalSchema, @@ -3127,6 +3142,7 @@ export default class Elysia< }, Definitions['error'], Macro, + keyof Metadata['macro'], keyof Metadata['parser'] & string >, run: ( @@ -3998,7 +4014,7 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, JoinPath > @@ -4012,10 +4028,11 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, Definitions['error'], Macro, + keyof Metadata['macro'], keyof Metadata['parser'] & string > ): Elysia< @@ -4085,7 +4102,7 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, JoinPath > @@ -4099,10 +4116,11 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, Definitions['error'], Macro, + keyof Metadata['macro'], keyof Metadata['parser'] & string > ): Elysia< @@ -4172,7 +4190,7 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, JoinPath > @@ -4186,10 +4204,11 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, Definitions['error'], Macro, + keyof Metadata['macro'], keyof Metadata['parser'] & string > ): Elysia< @@ -4259,7 +4278,7 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, JoinPath > @@ -4273,10 +4292,11 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, Definitions['error'], Macro, + keyof Metadata['macro'], keyof Metadata['parser'] & string > ): Elysia< @@ -4346,7 +4366,7 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, JoinPath > @@ -4360,10 +4380,11 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, Definitions['error'], Macro, + keyof Metadata['macro'], keyof Metadata['parser'] & string > ): Elysia< @@ -4433,7 +4454,7 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, JoinPath > @@ -4447,10 +4468,11 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, Definitions['error'], Macro, + keyof Metadata['macro'], keyof Metadata['parser'] & string > ): Elysia< @@ -4520,7 +4542,7 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, JoinPath > @@ -4534,10 +4556,11 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, Definitions['error'], Macro, + keyof Metadata['macro'], keyof Metadata['parser'] & string > ): Elysia< @@ -4607,7 +4630,7 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, JoinPath > @@ -4621,10 +4644,11 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, Definitions['error'], Macro, + keyof Metadata['macro'], keyof Metadata['parser'] & string > ): Elysia< @@ -4694,7 +4718,7 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, JoinPath > @@ -4708,10 +4732,11 @@ export default class Elysia< derive: Ephemeral['derive'] & Volatile['derive'] resolve: Ephemeral['resolve'] & Volatile['resolve'] & - MacroToContext + MacroToContext> }, Definitions['error'], Macro, + keyof Metadata['macro'], keyof Metadata['parser'] & string > ): Elysia< @@ -4776,7 +4801,10 @@ export default class Elysia< > >, const Macro extends Metadata['macro'], - const MacroContext extends MacroToContext, + const MacroContext extends MacroToContext< + Metadata['macroFn'], + NoInfer + >, const Handle extends InlineHandler< Schema, Singleton & { @@ -4802,6 +4830,7 @@ export default class Elysia< }, Definitions['error'], Macro, + keyof Metadata['macro'], keyof Metadata['parser'] & string > & { config: { @@ -4870,7 +4899,10 @@ export default class Elysia< > >, const Macro extends Metadata['macro'], - const MacroContext extends MacroToContext + const MacroContext extends MacroToContext< + Metadata['macroFn'], + NoInfer + > >( path: Path, options: WSLocalHook< @@ -4882,7 +4914,8 @@ export default class Elysia< Volatile['resolve'] & MacroContext }, - Macro + Macro, + keyof Macro > ): Elysia< BasePath, diff --git a/src/types.ts b/src/types.ts index b15f2b88..7a3d7bb8 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1137,7 +1137,19 @@ export type ResolveResolutionsArray< : ResolveResolutionsArray : Prettify -export type AnyLocalHook = LocalHook +export type AnyLocalHook = LocalHook + +type LocalHookKey = + | keyof InputSchema + | 'detail' + | 'parse' + | 'transform' + | 'beforeHandle' + | 'afterHandle' + | 'mapResponse' + | 'afterResponse' + | 'error' + | 'tags' export type LocalHook< LocalSchema extends InputSchema, @@ -1145,12 +1157,24 @@ export type LocalHook< Singleton extends SingletonBase, Errors extends Record, Macro extends BaseMacro, + MacroKey extends keyof any, Parser extends string = '' > = // Kind of an inference hack, I have no idea why it work either (LocalSchema extends {} ? LocalSchema : Isolate) & Macro & + NoInfer< + keyof Macro extends '' + ? {} + : { + [K in Exclude< + keyof Macro, + MacroKey | LocalHookKey + >]: never + } + > & NoInfer<{ + // a?(a: keyof Macro): void detail?: DocumentDecoration /** * Short for 'Content-Type' diff --git a/src/ws/types.ts b/src/ws/types.ts index 634b5d46..11b353a6 100644 --- a/src/ws/types.ts +++ b/src/ws/types.ts @@ -6,7 +6,6 @@ import { AfterHandler, AfterResponseHandler, BaseMacro, - ContentType, DocumentDecoration, ErrorHandler, InputSchema, @@ -16,8 +15,6 @@ import { MaybePromise, OptionalHandler, Prettify, - ResolveHandler, - ResolveResolutions, RouteSchema, SingletonBase, TransformHandler @@ -120,27 +117,33 @@ export type WSParseHandler = ( message: unknown ) => MaybePromise -export type AnyWSLocalHook = WSLocalHook +export type AnyWSLocalHook = WSLocalHook + +type WSLocalHookKey = + | keyof TypedWebSocketHandler + | 'detail' + | 'upgrade' + | 'parse' + | 'transform' + | 'beforeHandle' + | 'afterHandle' + | 'mapResponse' + | 'afterResponse' + | 'error' + | 'tags' + | keyof InputSchema export type WSLocalHook< LocalSchema extends InputSchema, Schema extends RouteSchema, Singleton extends SingletonBase, - Extension extends BaseMacro + Macro extends BaseMacro, + MacroKey extends keyof any > = (LocalSchema extends {} ? LocalSchema : Isolate) & - Extension & { - /** - * Short for 'Content-Type' - * - * Available: - * - 'none': do not parse body - * - 'text' / 'text/plain': parse body as string - * - 'json' / 'application/json': parse body as json - * - 'formdata' / 'multipart/form-data': parse body as form-data - * - 'urlencoded' / 'application/x-www-form-urlencoded: parse body as urlencoded - * - 'arraybuffer': parse body as readable stream - */ - type?: ContentType + Macro & + NoInfer<{ + [K in Exclude]: never + }> & { detail?: DocumentDecoration /** * Headers to register to websocket before `upgrade`