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

Error with react native #161

Closed
shtanton opened this issue Mar 20, 2018 · 3 comments
Closed

Error with react native #161

shtanton opened this issue Mar 20, 2018 · 3 comments
Labels
bug in third party Bug is not in Partial Lenses, but might be worth a workaround in Partial Lenses.

Comments

@shtanton
Copy link
Contributor

shtanton commented Mar 20, 2018

I tried to use this package on a react native package but got this error:
In this environment the sources for assign MUST be an object. This error is a performance optimization and not spec compliant
I did some digging and found what it is complaining about:
src/ext/infestines.js:12
export const protoless0 = I.freeze(protoless(0))
This calls the protoless function which assigns the value 0 to an empty object, which is what throws the error.
I am wondering why as I couldn't find any changes to the object after the 0 is assigned and if I replace protoless(0) with create(null) and run the tests, everything seemed to work.

Maybe there is a reason for this that I am missing? Thanks in advance for any help

@polytypic
Copy link
Member

Hmm... I believe Stefan Rimaila (@stuf) ran into this same issue some time ago.

Would you like to make a quick PR with the following diff

-export const protoless0 = I.freeze(protoless(0))
+export const protoless0 = I.freeze(protoless(I.object0))

which should also work around the issue with RN? I'm hesitant to make more significant workarounds for RN, but if the immediate crash is due to just that one line, then why not just change it.

The root problem is that, for some reason, React Native implements a polyfill (or a replacement?) for the standard Object.assign function that is not spec compliant. In other words, it doesn't work like the JavaScript standard specifies it should work.

Partial Lenses basically uses Object.assign internally in some object manipulating optics to convert objects with non-trivial prototypes to plain objects that can be iterated over safely using for (const k in o). It is also possible that Partial Lenses calls Object.assign with arguments that are not objects, which is something that Object.assign should also handle (according to spec it converts null and undefined to (effectively) empty objects and calls ToObject on other inputs).

I mention the above because, even though the change to protoless0 might make Partial Lenses to not immediately crash on React Native, it is still the case that some operations with Partial Lenses might crash on React Native due to the non-spec compliant Object.assign implementation on that particular platform. This might happen, for example, when you try to access some value x that is not an object with an object manipulating optic. Normally such an operation would treat the value x in the same way as if it was undefined, but with RN the operation would instead throw an error due to the non-spec compliant Object.assign.

@polytypic polytypic added the bug in third party Bug is not in Partial Lenses, but might be worth a workaround in Partial Lenses. label Mar 21, 2018
@shtanton
Copy link
Contributor Author

Done
Pull Request

@polytypic
Copy link
Member

Thanks for reporting this and the PR! I've now released v13.7.4 that contains the workaround.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug in third party Bug is not in Partial Lenses, but might be worth a workaround in Partial Lenses.
Projects
None yet
Development

No branches or pull requests

2 participants