-
-
Notifications
You must be signed in to change notification settings - Fork 227
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Elysia 1.0 Breaking Changes / Migration #513
Comments
Hi! Is there any place I can contribute to updating the docs for v1? |
How is this supposed to work with Plugins? import { Elysia } from "elysia";
const myPlugin = () => (a: Elysia) =>
a.derive(() => ({ myPluginProp: 1 }));
const app = new Elysia()
.use(myPlugin())
.get("/my-plugin", ({ myPluginProp }) => {
// ^ Property 'myPluginProp' does not exist on type '{ body: unknown; ...
return myPluginProp
}); It seems the |
Returning an object in v1.0.3 is not converting to response to |
@dodas update to elysia 1.0.6 |
@kabir-asani A quick workaround I found is to spread the object into another object. e.g. |
@PureDizzi Thank you! We need a fix on this! |
For correct typing in the Eden client, |
I want to get this fix. |
import { Elysia } from "elysia";
class Data {
message: String;
constructor(message: String) {
this.message = message;
}
}
const app = new Elysia()
.get("/ping", ({ set }) => {
const data = new Data("pong");
set.status = 200;
return data;
})
.listen(3000); @SaltyAom NOTE: What I've noticed is that the issue arises only when I try to access the |
Hi, sorry for the slow response. Unfortunately, this is an expected behavior and the case without using set is a bug. Web Standard on different runtime has a slight implementation for mapping value to Some classes may expected to pass to In this case, if you are using a custom class, you may use class Data {
message: String
constructor(message: String) {
this.message = message
}
toString() {
return JSON.stringify(this)
}
} |
But is it really a fool-proof solution? |
I propose this:
|
@SaltyAom I understand that you don't want to introduce breaking changes after v1. Have you seen #99 (comment)? I am biased, but that seems like an easy thing to slip in with other breaking changes. |
@april83c, @kabir-asani, you can do something like this as a workaround: const Data = class Object {
message: String;
constructor(message: String) {
this.message = message;
}
};
return new Data("yay") // inside handler The problem is this switch on constructor name: Line 159 in da63011
|
or implement class Data {
message: String;
constructor(message: String) {
this.message = message;
}
toJSON() {
return structuredClone(this);
}
} That way you dont have to set new Elysia()
.get("/", () => {
return new Data("yay").toJSON();
})
.listen(8080); Its the same behaviour as |
I am really not a fan of the Also, I think mention the |
Since 1.1 you can use |
Elysia 1.0 introduces a breaking change for life cycle events. > Starting from Elysia 1.0 RC, all lifecycle events including derive, > and resolve will accept additional parameters > { as: 'global' | 'local' } to specify if hook should be local or > global which default to local elysiajs/elysia#513 elysia-htmx 1.0.9 does not specify such an option, and so any use of the plugin results in the `hx` property not being typed as available in the parent Elysia instance's handlers. This commit updates dependencies to Elysia 1.0.10 and adds the as: "global" option to allow the hx parameter to be available in parent Elysia instances. This mirrors how the official Bearer token plugin does it: https://github.com/elysiajs/elysia-bearer/blob/main/src/index.ts#L56 Signed-off-by: Snorre Magnus Davøen <[email protected]>
Elysia 1.0 introduces a breaking change for life cycle events. > Starting from Elysia 1.0 RC, all lifecycle events including derive, > and resolve will accept additional parameters > { as: 'global' | 'local' } to specify if hook should be local or > global which default to local elysiajs/elysia#513 elysia-htmx 1.0.9 does not specify such an option, and so any use of the plugin results in the `hx` property not being typed as available in the parent Elysia instance's handlers. This commit updates dependencies to Elysia 1.0.10 and adds the as: "global" option to allow the hx parameter to be available in parent Elysia instances. This mirrors how the official Bearer token plugin does it: https://github.com/elysiajs/elysia-bearer/blob/main/src/index.ts#L56 Signed-off-by: Snorre Magnus Davøen <[email protected]>
Breaking change
It's sad but the upcoming Elysia 1.0 RC will contain breaking changes for all users, especially library authors :aris_crying:
Lifecycle event register with "on" will now only apply to the current and descendant instances.
Migration
Migration should take no longer than 10-15 minutes.
But for production apps, it heavily depends on library authors.
Starting from Elysia 1.0 RC, all lifecycle events including
derive
, andresolve
will accept additional parameters{ as: 'global' | 'local' }
to specify if hook should be local or global which default tolocal
To migrate, add
{ as: 'global' }
to any even register using.on
to specify it as global.Behavior
If
{ as: 'global' }
is not added, a parent instance that uses the current instance will not inherits a hook as the following:If is a behavior change from 0.8.
As the plugin hook now only defaults to itself and its descendant, it will not be applied to the parent (main).
To make it apply to the parent, explicit annotation is needed.
This will mark a hook as global, which is a default behavior of 0.8.
API Affected
To help with this, you can usually find a global hook by using find all with
.on
.For
derive
,mapDerive
,resolve
,mapResolve
will show a type warning as missing if use outside of the scope.The following API or need to be migrate:
API that does NOT need to be migrated:
Why
We know we don't like migration as well, but we think this is an important breaking change that will happen sooner or later to fix current problems:
Once migrated, your API should have an easier mental model, be more predictable, and be easier to maintain.
For example, see the below picture which does the same thing.
For additional information, please see
https://x.com/saltyAom/status/1763554701130514944?s=20
The text was updated successfully, but these errors were encountered: