Skip to content
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

fix: missing stack starting from node 21+ #398

Merged
merged 1 commit into from
Oct 24, 2024
Merged

Conversation

Marsup
Copy link
Contributor

@Marsup Marsup commented Oct 24, 2024

Backporting #390 to speed up that fix. I just did feature detection based on structuredClone's presence.

@Marsup Marsup added this to the 11.0.5 milestone Oct 24, 2024
@Marsup Marsup requested a review from kanongil October 24, 2024 09:37
@Marsup Marsup added the bug Bug or defect label Oct 24, 2024
@Marsup Marsup merged commit 8a4266e into master Oct 24, 2024
10 checks passed
@Marsup Marsup deleted the fix/missing-stack branch October 24, 2024 09:54
@@ -86,6 +87,16 @@ module.exports = internals.clone = function (obj, options = {}, _seen = null) {
continue;
}

// Can only be covered in node 21+
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

structuredClone is available from v18.x. v21 is the one that breaks the stack property copying old behaviour.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does it matter if we use structuredClone early though? I guess it can't hurt, right?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Functionally I would not expect it to, though it might change the performance characteristics. It could be significantly slower (eg. from changing the prototype). Hopefully something like hapijs/boom#304 will be part of the new releases to avoid the copying altogether.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This appears to break boom when using jest, because for jest structuredClone(new Error('test')) instanceof Error is false 🤦🏻‍♂️ Not a problem for everyone, but I expect some bug reports...

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This appears to break boom when using jest, because for jest structuredClone(new Error('test')) instanceof Error is false 🤦🏻‍♂️ Not a problem for everyone, but I expect some bug reports...

That does not seem true in general. Especially because we override the prototype if it doesn't match the input. How are you using it?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, nvm. The issue is that the VM environment that it runs can cause instanceof Error to just fail.

The primary workaround seems to be not using the VM through jest-light-runner, or alternatively this might work.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, I had to switch to the latter on my project, it's not difficult but not something I expected to do either. Anyway, I think we can expect some complaints.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI, this solution should still work within the VM, as we fix the prototype (I verified that it works under jest), so I'm still not certain why you observe a problem.

Copy link
Contributor Author

@Marsup Marsup Oct 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know if it's specific to my computer, but creating an entirely new project with only jest and boom with a super simple test already fails, yet I can't reproduce that in stackblitz for example 🤷🏻‍♂️
image

EDIT: erratum, it obviously happened in our CI as well, so it's not just me. Maybe linux-specific?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I figured it out! We assume that the cloned class is the same as the original class, which for plain Errors under this kind of VM is not true. I have made a fix for master in #399.

lib/clone.js Show resolved Hide resolved
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Bug or defect
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants