- Purpose-built specialized data structures (Immutable.js, Mori)
- Libraries that use freezing in some way
- Utilities that abstract over immutably updating plain JS objects and arrays.
seamless-immutable falls into the second category. Looks like it also adds some extra methods to objects it wraps/returns, and overwrites mutating methods to throw errors to help you avoid them.
My Redux addons catalog has a large page listing all of the libs I've seen that fall into these categories [0]. If you don't want to use one of the specialized data structure libs or libs that do freezing, there's at least a couple dozen immutable update utility libs out there, with a variety of APIs to choose from.
My list also has a section of Redux middlewares that will help debug accidental mutations in development, either via freezing or other comparisons [1].
[0] https://github.com/markerikson/redux-ecosystem-links/blob/ma...
[1] https://github.com/markerikson/redux-ecosystem-links/blob/ma...