# moize CHANGELOG

## 6.1.7

- Update with deprecation warning in favor of `micro-memoize`

## 6.1.6

- [#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 `react` functional component cache matching (~9.5x 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'])`)

## 2.5.1

- Surface types for TypeScript correctly

## 2.5.0

- Add TypeScript definitions (thanks [vhfmag](https://github.com/vhfmag))
- Skip unneeded first entry iteration when getting the multi-parameter key or finding the index of a key

## 2.4.1

- Make positive integer checker use regex instead of bitwise operation

## 2.4.0

- Add `hasCacheFor` method to determine if the memoized function has cache for given arguments

## 2.3.3

- Remove unneeded iterator key generator method
- Various micro-optimizations

## 2.3.2

- Add `lodash-webpack-plugin` for smaller `dist` builds

## 2.3.1

- Streamline the creation of curriable shortcuts (`moize.maxAge`, `moize.maxSize`)
- Add curriable shortcut for `moize.maxArgs` (missed in initial release)

## 2.3.0

- More options have shortcut methods
    - `maxAge`
        - Curried method (example: `moize.maxAge(5000)(method)`)
    - `maxSize`
        - Curried method (example: `moize.maxSize(5)(method)`)
    - `promise` (shortcut for `isPromise: true`)
    - `serialize`
    - `simple` (shortcut for `maxSize: 1`)
- `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%)

## 1.4.1

- Correct README error explaining `serializeFunctions` option

## 1.4.0

- Add `serializeFunctions` option

## 1.3.3

- Ensure all numeric parameters (`maxAge`, `maxArgs`, `maxSize`) are a finite positive integer

## 1.3.2

- Replace array-based decycle with Map (performance on circular objects)

## 1.3.1

- Fix README errors

## 1.3.0

- Add keys method to memoized function, to know the size and also get keys for potential deletion
- Update decycle method with modern techniques and helper functions for better circular reference performance

## 1.2.0

- Add `maxArgs` configuration option to limit the number of arguments to use in the key creation for cache

## 1.1.2

- Remove external dependencies in favor of local `Cache` and `decycle` implementation (smaller bundle size)

## 1.1.1

- Make handling of circular handling automatic by stringifying in `try` / `catch`, and remove manual `isCircular` configuration option

## 1.1.0

- Add `cycle` dependency to handle circular objects
- Add `clear` and `delete` methods on the memoized function to allow for direct cache manipulation

## 1.0.3

- Remove warning related to `map-or-similar` dependency consumption

## 1.0.2

- Remove no-longer-needed dependencies

## 1.0.1

- Remove unneeded folders and files from npm package

## 1.0.0

- Initial release
