- [#196](https://github.com/planttheidea/moize/issues/196) - Fix `mjs` typing not flowing through due to deep-linking ignoring `index.d.ts`
## 6.1.5
- [#186](https://github.com/planttheidea/moize/issues/186) - Avoid type issues when using in project where React is unused
## 6.1.4
- [#184](https://github.com/planttheidea/moize/issues/184) - Fix pass-through typing for `micro-memoize` dependency
## 6.1.3
- [#179](https://github.com/planttheidea/moize/issues/179) - Invalid types for namespace methods which give the impression that chaining of those methods is possible
## 6.1.2
- [#176](https://github.com/planttheidea/moize/issues/176) - Remove use of `new Error().stack` in derivation of fallback `profileName`, due to potential for OOM crashes in specific scenarios
## 6.1.1
- Update `fast-equals` to latest major version
## 6.1.0
- [#161](https://github.com/planttheidea/moize/issues/161) - Provide custom function name when supported
## 6.0.3
- [#153](https://github.com/planttheidea/moize/issues/153) - Fix ESM/CommonJS cross-compatibility issues in NextJS
## 6.0.2
- Update dependencies to latest (`fast-equals` in particular to prevent surfacing of [an issue it faced](https://github.com/planttheidea/fast-equals/pull/41))
## 6.0.1
- [#146](https://github.com/planttheidea/moize/issues/146) - Fix reading deprecated properties on function object
## 6.0.0
**BREAKING CHANGES**
-`moize` v5 and below had a default cache size of `Infinity`, however starting with v6 the default cache size will be `1`. If you want to maintain a cache history of multiple entries, it is recommended to use `moize.maxSize` to set the size of history desired. To replicate usage from v5 and below, use `moize.infinite`.
-`isReact` option and `moize.react` shorthand method now memoizes on a per-instance basis (previously shared cache across all instances).
-`moize.simple` and `moize.reactSimple` have been removed due to default cache size being 1.
-`isSerialized` option and `moize.serialize` shorthand method will now serialize functions by default.
-`shouldSerializeFunctions` option has been removed, as serializing functions is now the default.
-`equals` option has been renamed to `matchesArg` for alignment with `matchesKey`.
**ENHANCEMENTS**
- New options:
-`isShallowEqual` (compares each arg in the `key` based on shallow equality)
-`updateCacheForKey` (if truthy value returned, will update the cached value for the given `key`)
- New shorthand methods:
-`moize.infinite` (shorthand for `maxSize` option set to `Infinity`)
-`moize.matchesArg` (shorthand for `matchesArg` option)
-`moize.matchesKey` (shorthand for `matchesKey` option)
-`moize.serializeWith` (shorthand for `isSerialized` and `serializer` option)
-`moize.shallow` (shorthand for `isShallowEqual` option)
-`moize.transformArgs` (shorthand for `transformArgs` option)
-`moize.updateCacheForKey` (shorthand for `updateCacheForKey` option)
**INTERNALS**
- Rewritten in TypeScript, with much better type declarations.
- Changed unit test framework to `jest`
- Used latest external dependencies for better ESM support in Node 14
## 5.4.7
- Fix ESM usage in NodeJS 14 [#128](https://github.com/planttheidea/moize/issues/128) (thanks [@tozz](https://github.com/tozz))
## 5.4.6
- Fix issue where `setTimeout` causes processes to hang in NodeJS [#122](https://github.com/planttheidea/moize/issues/122)
## 5.4.5
- Improve TypeScript typings
## 5.4.4
- Fix export in TypeScript declarations([#105](https://github.com/planttheidea/moize/pull/105))
## 5.4.3
- Improve typings for TypeScript ([#103](https://github.com/planttheidea/moize/pull/103))
## 5.4.2
- Ignore when `maxArgs` or `maxSize` arguments are negative
## 5.4.1
- Upgrade to `babel@7`
- Add `"sideEffects": false` to `package.json` for better tree-shaking in `webpack`
## 5.4.0
- Add ESM support for NodeJS with separate [`.mjs` extension](https://nodejs.org/api/esm.html) exports
## 5.3.2
**BUGFIXES**
- Bump `micro-memoize` dependency to fix recursive race condition issue
## 5.3.1
**BUGFIXES**
- Clean up logic surrounding `update` function to not unnecessarily assign the value twice
## 5.3.0
**NEW FEATURES**
- Add the [`moized.update`](README.md#updatekey-value) method for direct cache manipulation
## 5.2.3
**BUGFIXES**
- Actually fix the issue that `5.2.2` was supposed to fix (appreciate the persistence [@vlad-zhukov](https://github.com/vlad-zhukov))
## 5.2.2
**BUGFIXES**
- Fix issue where manually removing a key from `cache` would not clear / remove the expiration timeout
## 5.2.1
**BUGFIXES**
- Fix `Object.assign` usage on functions (derp)
## 5.2.0
**NEW FEATURES**
- Add `collectStats` as a convenience method on the main `moize` object
**BUGFIXES**
- Fix naming convention for determining if statistics are being collected on the `moize`d function (`isCollectingStats` now, was mistakenly `collectStats` before)
## 5.1.2
**BUGFIXES**
- Reference the correct option name for `micro-memoize` (isMatchingKey) instead of `moize` (matchesKey) for instance methods (oops)
## 5.1.1
**BUGFIXES**
- Ensure instance methods that update the cache work correctly with new `matchesKey` option
## 5.1.0
**NEW FEATURES**
- Add [`matchesKey`](#matcheskey) option
- Change `isSerialized` to use `matchesKey` with custom `isMatchingKey` instead of standard `isEqual`
**BUGFIXES**
- Prevent `isDeepEqual` from being passed to the `micro-memoize` options
## 5.0.1
- Include `fast-equals` as an explicit dependency
## 5.0.0
- Complete refactor to leverage [`micro-memoize`](https://github.com/planttheidea/micro-memoize) under the hood (doubles the speed, and allows for more functionality)
**BREAKING CHANGES**
- The default `equals` option now uses [SameValueZero](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) equality instead of strict equality
-`equals` option is now performed iteratively on each argument in the key, rather on the key as a whole
-`matchesKey` option now performs the full-key comparison that `equals` did in v4
-`serialize` option has been changed to `isSerialized`
-`serializeFunctions` option has been changed to `shouldSerializeFunctions`
- CommonJS consumers must now use `require('moize').default`
- The shape of the `cache` object has changed
- If you were modifying it directly instead of using the [convenience methods](#direct-cache-manipulation), you may experience breakages
-`moize.promise` now sets both `isPromise` and `updateExpire` options (v4 and below only set `isPromise`)
- When `isPromise` is `true` and a `maxAge` is applied, the `maxAge` now begins when the function is created rather than the resolution of the promise
- If you want the `maxAge` to apply upon resolution, then either set the `updateExpire` option or use the `moize.promise` convenience method
**NEW FEATURES**
- Deep equality now available without custom `equals` function (either [`isDeepEqual`](README.md#isdeepequal) option, or [`moize.deep`](README.md#moizedeep) convenience method)
- Statistics can now be collected for both global and method-specific contexts (see [Collecting statistics](#collecting-statistics) and [`profileName`](README.md#profilename))
- Statistics-based introspection methods exist to support reading stats
- [`getStats`](README.md#getstats) will get the stats for the `profileName` passed, or if none is passed then gets the global stats
- [`isCollectingStats`](README.md#iscollectingstats) returns whether stats are being collected
- Cache change listeners are now available to listen for changes
- [`onCacheAdd`](README.md#oncacheadd) will fire when a new entry is added to the cache
- [`onCacheChange`](README.md#oncachechange) will fire when the cache is added to or the LRU order has changed
- [`onCacheHit`](README.md#oncachehit) will fire when an existing entry in cache is used
**BUGFIXES**
-`isPromise` methods that resolved had the values re-wrapped in a new promise, which obfuscated chaining on the method (now the original promise is maintained)
- Internal de-circularizer for serialized methods was flaky in deeply-nested scenarios (now uses [`json-stringify-safe`](https://github.com/moll/json-stringify-safe))
**DEPRECATIONS**
-`promiseLibrary` is no longer a supported option (it is no longer needed, as the original promise is now maintained)
## 4.0.4
- Add `default` property to `moize` which points to itself, allowing TypeScript to import correctly as an ES module
## 4.0.3
- Fix issue where items manually added to cache did not have the same options (`maxAge`, `maxSize`, etc.) applied to them as those added to cache through function call
## 4.0.2
- Remove duplicate internal method
## 4.0.1
- Update issue where `onExpire` was firing prior to removal of the key from cache
## 4.0.0
- Add programmatic update of expiration based on return from `onExpire`
**BREAKING CHANGES**
-`onExpire` will update the expiration if `false` is returned
- In prior versions, the return of `onExpire` was ignored entirely
## 3.5.0
- Add `updateExpire` option, which if true will reset the expiration countdown based on `maxAge` when a cached value for that key has been hit
- Update TypeScript typings (thanks @Joshuaweiss)
## 3.4.2
- Remove unneeded constants declarations for smaller footprint
## 3.4.1
- Remove code duplication and unnecessary cache key segregation (reduced library size by ~10.6%)
- Improve Flow typings (no longer driven off of TypeScript typings)
## 3.4.0
- Add `onExpire` callback that fires when a cache item expires
## 3.3.1
- Fix TypeScript definitions with correct declarations (thanks @iHaiduk)
## 3.3.0
- Add `es` transpilation in addition to standard `lib`, preserving ES2015 modules for [`pkg.module`](https://github.com/rollup/rollup/wiki/pkg.module)
## 3.2.2
- Refactor `ReactCacheKey` to double the speed (yes, double)
## 3.2.1
- Fix issue where `MultipleParameterCacheKey` and `ReactCacheKey` were not applying `equals` correctly
## 3.2.0
- Add `transformArgs` option, which allows trasformation of the arguments prior to being used as a key
## 3.1.2
- Fix `clear` referencing incorrect object
- Fix `equals` not using `matchesCustom` when used in conjunction with `serialize`
## 3.1.1
- BAD PUBLISH - do not use!
## 3.1.0
- New: add `isMoized` introspection method
- New; add FlowType declarations based on TypeScript typings
- New: add `prettier` to project, with pre-commit hooks to format the code
- Fix: only serialize key once when attempting to match in cache (was serializing on every iteration)
## 3.0.2
- Improve performance of `take` by making it a higher-order function
## 3.0.1
- Update TypeScript typings to include new `equals` option
## 3.0.0
- Improve performance of multiple parameter cache matching (~3x faster)
- Improve performance of serialized parameter cache matching (~1.5x faster)
- Improve performance of use with `maxArgs`
- Add `equals` option for ability to provide custom equality comparison method
- Add `moize.reactSimple` shortcut method to limit `react` cache size to `1` (mimics the `PureComponent` optimization)
- Add `isReact` option for simpler `react` configuration via `options`
- Fix issue where `moize` was only able to curry `options` once
- Fix issue with `react` cache where different functions with identical names / body contents were seen as equal
- Fix issue where `maxArgs` was not always respected for `serialize` caches
**BREAKING CHANGES**
- Custom `cache` is no longer available in `options`
-`moize.react` now performs a shallow equal comparison of `props` and `context` instead of deep value comparison
- If you want to perform a deep value equality comparison (if you are mutation props, for example), pass a deep equality comparison method via the `equals` option such as `lodash`'s `isEqual`
- If you want to continue using the v2 version of `moize.react`, you can manually apply the options: `moize.serialize(fn, {maxArgs: 2, serializeFunctions: true})`
- The direct cache manipulation `delete` method has been renamed to `remove`
- The direct cache manipulation `hasCacheFor` method has been renamed to `has`
- The `key` passed to direct cache manipulation methods (`add`, `has`, `remove`) must now be an array
- The array reflects the arguments passed to the method (`moized.hasCacheFor('foo', 'bar')` => `moized.has(['foo', 'bar'])`)
-`moize` functions are now composable (example usage: `moize.compose(moize.react, moize.simple)`)
## 2.2.3
- Simplify internal vs custom cache recognition
- Typing and documentation cleanup
## 2.2.2
- Abstract out `promiseResolver` and `promiseRejecter` into separate testable functions
- Various code cleanups and typing enhancements
## 2.2.1
- Fix issue with `delete` checking `size` of the `Cache` before it had actually updated
## 2.2.0
- Added `promiseLibrary` option to allow use of custom promise implementation
- Bolster `isPromise` logic, auto-removing from cache when the promise is rejected
- Update README for more detailed information on both `isPromise` and `promiseLibrary` options
- Convert `Cache` key iteration to use custom iterator instead of standard loop for more stable iteration
## 2.1.6
- Code cleanup
## 2.1.5
- Fix issue where `delete` would always set the `lastItem` to `undefined` even when items still remained in cache
## 2.1.4
- Move multiple-parameter key matching to cache (allows for custom `cache` to have its own implementation)
- Update documentation for the custom `cache` implementation, as it requires `getMultiParamKey` now, plus give a better example of an alternative `cache`
- Make `keys()` and `values()` methods no-ops when cache implementation is custom
- Make `deleteItemFromCache` method safe with custom `cache` implementations
## 2.1.3
- Enhance `Cache` more for multiple-parameter functions (now benchmarks faster in all categories)
## 2.1.2
- Have `areArraysShallowEqual` use `isEqual` instead of strict equality to allow for `NaN` as key
## 2.1.1
- Optimize cache class to be more efficient in both `has` and `get` operations
- Fix issue with `delete` that was preventing delete of falsy keys
## 2.1.0
- Add `add` method on cache to allow for manual cache insertion
## 2.0.3
- Ensure `maxArgs` is respected for unserialized functions
- Change the arguments length check from `=== 1` to `>` so that zero arguments (`undefined` key) pulls from cache directly instead of tries to go through key matching for multiparam
## 2.0.2
- Prevent memoization on `moize.react` based on third parameter to functional components (object of all internal react functions)
## 2.0.1
- Fix static types applied to functional components not being applied to memoized component
## 2.0.0
- Refactor to use object equality instead of serialization (vast speed improvements over 1.x.x with multiple parameters)
**BREAKING CHANGES**
- If you were relying on the serialization (using value equality instead of object equality), it will no longer memoize (you can set `serialize: true` if you want to continue using that option)
- If you were using `moize` to memoize React components, you should change your invocations from `moize` to `moize.react` ([see README](README.md#usage-with-functional-react-components))
## 1.5.0
- Add `values` method on memoized function (gets list of computed values stored in cache)
- Fix issue with `clear` method not being present on `Cache`
## 1.4.5
- Switch to using Cache for caching instead of native Map (was previously only used for polyfilling, but is twice as fast ... I feel silly for not testing its performance prior)
- Simplify and optimize Cache to crank out as much speed as possible
## 1.4.4
- Add `displayName` property to memoized function for better display of memoized `react` components in DevTools
- Throw a `TypeError` when the parameter passed to moize is not a function
## 1.4.3
- Move internal serializer generation to utils, for further partial application leveraging
## 1.4.2
- Leverage partial functions in a number of places (less arguments passed around, improves performance by ~6%)