## Changes

### 3.0.25
- Changes to `promises` module:
  - Added `handleUnhandledRejection` & `handleUnhandledRejections` functions based on 
    `avoidUnhandledPromiseRejectionWarning` & `avoidUnhandledPromiseRejectionWarnings` functions
  - Changed `avoidUnhandledPromiseRejectionWarning/s` functions to be deprecated synonyms for 
    `handleUnhandledRejection/s` functions
  - Added `ignoreUnhandledRejection` & `ignoreUnhandledRejections` functions that suppress unhandled rejections without 
    logging 

### 3.0.24
- Changes to `promises` module:
  - Changed `wrap` & `wrapMethod` functions to handle successful callbacks with more than 2 arguments by resolving the 
    promise with an array containing all of the arguments other than the first. Note that successful callbacks with only 
    2 arguments will still return the 2nd argument as before (instead of an array containing only the 2nd argument).
  - Changed `wrap` & `wrapMethod` functions to timeout and reject their promises if they are still pending after a 
    configurable number of milliseconds - to avoid cases where the wrapped function does NOT call the callback.
    - Added new optional `opts` last argument to `wrap` & `wrapMethod` functions to enable configuration of the timeout 
      time in milliseconds
 
### 3.0.23
- Added `.npmignore`
- Renamed `release_notes.md` to `CHANGES.md`

### 3.0.22
- Replaced two `instanceof` usages in `arrays` module with calls to `isInstanceOf`

### 3.0.21
- Added `toType` function to `any` module
- Added `isInstanceOf` function to `objects` module
- Replaced all of the `instanceof` checks against custom classes with calls to `isInstanceOf`
- Added `MethodNotAllowed` class to `app-errors` module

### 3.0.20
- Updated usage notes and tested with Node version number in `README.md`

### 3.0.19
- Renamed dummy first exports (`exports._ = '_'; //IDE workaround`) of most modules to (`exports._$_ = '_$_';`) to avoid 
  potential future collisions with `lodash` & `underscore`

### 3.0.18
- Changes to `tries` module:
  - Changed `describeSuccessAndFailureCounts` function to suppress clauses with counts of zero

### 3.0.17
- Changes to `promises` module:
  - Changed the `avoidUnhandledPromiseRejectionWarning` function to log each error and its stack trace at WARN-level
  - Added a new, convenience `avoidUnhandledPromiseRejectionWarnings` function that applies the 
    `avoidUnhandledPromiseRejectionWarning` function to each of the promises it is given
  - Changes to the `every` function:
    - Added a new optional `logger` 3rd parameter to the `every` function to enable use of a custom logger instead of console 
    - Fixed the `every` function to call the new `avoidUnhandledPromiseRejectionWarnings` function on any unresolved 
      promises before throwing a `CancelledError`
  - Changes to the `flatten` function:
    - Completely refactored the logic of the `flatten` function to ALWAYS return a Promise
    - Changed `flatten` function to rely on the fixed `every` function to avoid UnhandledPromiseRejectionWarnings 
      instead of calling `avoidUnhandledPromiseRejectionWarning` itself
  - Added `defaultFlattenOpts` sample options to use with `flatten` function
- Changes to `tries` module:
  - Added `defaultFlattenOpts` sample options to use with `flatten` function
  - Refactored the logic of the `flatten` function to cache `Success` values & unpacked values instead of `Success` instances
- Changes to `copying` module:
  - Added `defaultCopyOpts` sample options to use with `copy` function
  - Added `defaultCopyNamedPropertiesOpts` sample options to use with `copyNamedProperties` function
- Changes to `merging` module:
  - Added `defaultMergeOpts` sample options to use with `merge` function
- Changes to `type-defs` module:
  - Added `FlattenOpts` & `TryFlattenOpts` type definitions 

### 3.0.16
- Changes to `errors` module:
  - Added new optional `cause` constructor parameters & properties to `FatalError`, `TransientError` & `TimeoutError` classes
- Changes to `promises` module:
  - Added new optional `logger` parameters to `flatten` & `avoidUnhandledPromiseRejectionWarning` functions to enable or
    disable TRACE-level logging of their attempts to avoid unhandled promise rejection warnings

### 3.0.15
- Replaced all logging of `error.stack` with logging of just the error

### 3.0.14
- Added dummy first exports (`exports._ = '_'; //IDE workaround`) to most modules as a temporary workaround for IDE issue 

### 3.0.13
- Changed almost all exports to modifications of the default `exports` object instead of replacing the default object

### 3.0.12
- Changed all exports to modifications of the default `module.exports` object instead of replacing the default object

### 3.0.11
- Changes to `strings` module:
  - Changed `stringify` to survive a getter that throws an error
- Changes to `objects` module:
  - Added new `hasOwnPropertyWithKeys` & `hasOwnPropertyWithCompoundName` functions
- Changes to `promises` module:
  - Changed `wrap` function to also support wrapping of Node-style methods
  - Deprecated now redundant `wrapMethod` & `wrapNamedMethod` functions

### 3.0.10
- Changes to `errors` module:
  - Removed `usePrefix` argument from `FatalError` constructor
  - Removed `blocking` property from `FatalError` prototype
  - Added new `TransientError` & `TimeoutError` Error subclasses
  - Added new `toJSON` function
  - Added new `toJSON` methods to all 3 Error subclasses that delegate to the new `toJSON` function
- Changes to `promises` module:
  - Added convenience `wrapNamedMethod` version of `wrapMethod` function

### 3.0.9
- Fixed `toJSON` method in `AppError` class to also include any enumerable own properties

### 3.0.8
- Added a new `errors` module with a new `FatalError` class
- Changed `AppError` & its subclasses in `app-errors` module to better conform to the `Error` class contract
  - Moved `name` property to the class's prototype
  - Changed all properties to be `enumerable` false & all, but `httpStatus`, to be mutable 
  - Added `toJSON` method to enable previous `JSON.stringify` behaviour

### 3.0.7
- Moved test devDependencies to package.json & removed test/package.json

### 3.0.6
- Changed `engines.node` to `>=6.10` in`test/package.json`

### 3.0.5
- Added new `any` module:
  - Added new `defined` & `notDefined` functions
  - Added `valueOf` function removed from `objects` module
- Changes to `objects`:
  - Moved `valueOf` function to `any` module
  - Deprecated exported `valueOf` function & delegated it to `valueOf` in `any` module
- Changes to `sorting`:
  - Removed `isUndefinedOrNull` function & replaced its usage with calls to `notDefined` function from `any` module
  - Deprecated exported `isUndefinedOrNull` function & delegated it to `notDefined` function from `any` module

### 3.0.4
- Changes to `promises` module:
  - Upgraded to Node 6.10.3
  - Added `avoidUnhandledPromiseRejectionWarning` function to avoid unneeded Node 6.10.3 warnings
  - Patched unit tests to pass under Node 6.10.3

### 3.0.3
- Minor changes & optimisations to `promises` module:
  - Changed `every` & `chain` functions to skip marking internal cancelled flags as true on cancellation if already completed
  - Changed `flatten` function to avoid the wasted effort of "flattening" non-Success values and/or arrays of non-Success values
- Changes to `arrays` module:  
  - Added a `flatten` function
- Changes to `tries` module:
  - Changed the default behaviour of the static `countSuccess` & `describeSuccessAndFailureCounts` methods to count any 
    non-Failure outcomes as successes (instead of ONLY counting Success outcomes as successes)
    - Added an optional `strict` argument to these static methods that can be set to true to restore the original 
      behaviour of ONLY strictly counting Success outcomes as successes 

### 3.0.2
- Changes to `promises` module:
  - Added `installCancel` utility function that installs a `cancel` method on a cancellable, which combines any existing
    `cancel` method behaviour with the given new cancel function logic
  - Changed `every` and `chain` functions to use new `installCancel` utility function, which enables them to "extend" 
    the behaviour of their cancellables' cancel methods instead of just overwriting them
  - Added `installCancelTimeout` utility function that installs a `cancelTimeout` method on a cancellable, which 
    combines any existing `cancelTimeout` method behaviour with the given new cancelTimeout function logic
  - Changed `delay` function to use new `installCancelTimeout` utility function, which enables it to "extend" the 
    behaviour of its cancellable's cancel method instead of just overwriting it
  - Changed `chain` function to also pass any and all previous outcomes as an optional 4th argument to the given input
    function `f`, which enables an input function to use and/or react to previous outcomes in the chain
  - Added new `DelayCancelledError` subclass of Error
  - Changed `delay` function to throw a new `DelayCancelledError` when timeout triggers and mustResolve is false. Note 
    that this change is not entirely backward compatible, since it fixes the prior behaviour that was incorrectly 
    throwing a boolean with the triggered value as the "error"
  - Added new `flatten` function to recursively reduce a given Promise or array of Promises (containing other promises 
    or arrays of promises) down to a single Promise (with any Success and/or Failure outcomes necessary)
- Changes to `numbers`, `objects` & `app-errors` modules:
  - Replaced all usages of `Number.parseInt(...)` with more reliable & consistent `Number(...)`
    e.g. parseInt('1e+22') returns 1, while Number('1e+22') returns 1e+22; 
    e.g. parseInt('12B3') returns 12, while Number('12B3') returns NaN
- Changes & fixes to `objects` module:
  - Moved the majority of the functionality of the `copy`, `copyNamedProperties` & `merge` functions to the new `copying` 
    & `merging` modules 
  - Changed `copy`, `copyNamedProperties` & `merge` functions to simply delegate to their counterparts in the new `copying` 
    & `merging` modules and marked the original functions as deprecated 
  - Added new `isTypedArray`, `getPropertyNames`, `getPropertySymbols`, `getPropertyKeys`, `getPropertyDescriptors`,
    `getPropertyValueByKeys`, `getPropertyDescriptorByKeys`, `getPropertyValueByCompoundName` & `getOwnPropertyNamesRecursively` 
    functions
- Added new `weak-map-copy` module to enable "copying" of `WeakMap` instances
- Added new `weak-set-copy` module to enable "copying" of `WeakSet` instances
- Added new `copying` module:
  - Added new versions of `copy` & `copyNamedProperties` functions copied from `objects` module
  - Major refactoring & revision of `copy` function to also support copying of property descriptors and copying of 
    Symbols, Dates, Buffers, ArrayBuffers, TypedArrays, DataViews, Errors, RegExps, Maps, Sets, WeakMaps & WeakSets
  - Added new `deepMapKeys`, `deepMapValues`, `deepSets`, `onlyEnumerable`, `onlyValues`, `omitAccessors`, `isCopyable`, 
    `createCustomObject` & `copyCustomContent` options to enable more extensive customisation of the `copy` function
  - Added new `configureCopyContext`, `isCopyableObject`, `copyObject`, `createObject`, `createTypedArray`, 
    `createDataView`, `copyContent`, `copyPropertyDescriptors`, `copyPropertyValues`, `copyPropertyDescriptor`, 
    `copyPropertyValue` & `copyDescriptor` supporting functions
- Added new `merging` module:
  - Added new version of `merge` function copied from `objects` module
  - Major refactoring & revision of `merge` function
  - Added new `isMergeable` and `onlyEnumerable` options to enable more extensive customisation of the `merge` function
  - Added new `configureMergeContext`, `isMergeableObject`, `mergeObject`, `resolveMergedObject`, `mergeContent`, 
    `areSimilarArrayLikes`, `mergePropertyDescriptors` & `mergePropertyValues` supporting functions
- Changes to `tries` module:
  - Added `simplify`, `count`, `countSuccess`, `countFailure`  & `describeSuccessAndFailureCounts` static methods 
  - Added `flatten` & `findFailure` static methods

### 3.0.1
- Changes to `promises` module:
  - Renamed `CancelledError` constructor `unresolvedPromises` parameter to more generic `unresolvedInputs`
  - Added `unresolvedInputs` property to `CancelledError` class and kept `unresolvedPromises` as an alias for it
  - Fixed bug in `completed` property of `CancelledError` class, which was incorrectly reporting completed as true when 
    no unresolved inputs or promises were provided
  - Added new `chain` function
- Changes to `strings` module:
  - Fixed potential shared global regular expression issues in `cleanInspectedPromise` function
- Changes to `type-defs` module:
  - Added `Outcome` & `Outcomes` type definitions
- Deleted arbitrary `copy.sh` script

### 3.0.0
- Non-backward compatible changes & fixes to `promises.js` module:
  - Removed all poly-filling & injection of `promises` module functions onto native `Promise` class
  - Changed behaviour of the `try` function to NOT use `Promise.all` when the given function returns an array of promises,
    so that it instead preserves ALL of the executed function's returned promises, "wrapped" in a `Promise.resolve`
  - Changed behaviour of the `allOrOne` and `every` functions to both accept any mixture of promise and/or non-promise 
    values, in order to bring their behaviour in line with that of the standard `Promise.all` method
  - Changed the `every` function to ONLY accept an array of `promises` (i.e. it no longer supports var args containing 
    promises) and added a new `cancellable` parameter to enable the wait for every promise to complete to be short-
    circuited at the earliest possible opportunity and the `every` function will then instead return a rejected 
    `CancelledError` from which the `resolvedOutcomes` and `unresolvedPromises` can be retrieved
  - Changed the `every` function's returned resolutions from literal objects containing `result` or `error` properties 
    to use the new `tries` modules's `Success`, `Failure` and `Try` classes instead (NB: Success has a `value` property, 
    and not a `result` property, so this change is not backward-compatible)
  - Fixed defect that was causing the `every` function to return an empty array when the first argument was not a promise
  - Renamed existing `isPromise` function to `isPromiseLike` & added new `isPromise` function that ONLY returns true for native promises
  - Removed the `isArrayOfPromises` function, which was no longer useful & would have had to change after `isPromise` changed
  - Added a new `one` function to convert a single promise into a native Promise that resolves to a `Success` or `Failure` outcome
  - Added a new `toPromise` function to attempt to convert a promise-like into a native promise
    - Used it in the new `one` function
    - Changed the `every` function to use it to ensure that the first promise in the chain becomes a native Promise
- Added new `tries.js` module:
  - Added `Try` superclass and `Success` and `Failure` subclasses modelled after their same-named Scala counterparts
- Added new `dates.js` module:
  - Added `simpleISODateTimeRegex` & `simpleISODateRegex` regular expressions
  - Added `extendedISODateTimeRegex` & `extendedISODateRegex` regular expressions
  - Added `isSimpleISODateTimeLike` & `isSimpleISODateLike` functions
  - Added `isSimpleISODateTime` & `isSimpleISODate` functions
  - Added `isExtendedISODateTimeLike` & `isExtendedISODateLike` functions
  - Added `isExtendedISODateTime` & `isExtendedISODate` functions
  - Added `toSimpleISODateTime` & `toSimpleISODate` functions
  - Added `toDateTime` & `toExtendedISODate` functions
  - Added `isValidDate` function
- Added new `sorting.js` module:
  - Added `SortType` "enum" object to defined the types of sorting supported
  - Added `compareNumbers`, `compareStrings`, `compareBooleans`, `compareDates`, `compareIntegerLikes` & 
    `compareUndefinedOrNull` compare functions to be used with Array `sort` method
  - Added `toSortable` function, which resolves the appropriate sort type and compare function to use for a given array 
    of values intended to be sorted and also maps the values into an array of consistent, sortable types of values
  - Added `sortSortable` function (primarily for testing), which simply sorts a "Sortable" object's `sortableValues` 
    using its `compare` function 
- Changes to `numbers.js` module:
  - Added `integerRegex`, `numberRegex`, `zeroRegex`, `leadingZeroesRegex` & `trailingZeroesRegex` regular expressions
  - Added `isInteger` & `isSafeInteger` functions
  - Added `isNumberLike`, `isIntegerLike` & `isZeroLike` functions
  - Added `toNumberLike`, `toDecimalLike`, `toDecimalLikeOrNaN`, `toIntegerLike`, `toIntegerLikeOrNaN` & 
    `toNumberOrIntegerLike` functions 
  - Added `removeLeadingZeroes`, `removeTrailingZeroes`, `zeroPadLeft` & `removeSignIfZero` functions
  - Added `nearlyEqual` function for testing numbers for approximate equality
- Changes to `strings.js` module:  
  - Added `stringifyKeyValuePairs` function
  - Added null-safe `toLowerCase` function
  - Changes to `stringify` function:
    - Added special cases to better support Dates, Promises, Maps & WeakMaps
    - Improved conversion of Errors - changed default behaviour to use a variation of Error toString() instead of always 
      treating Errors as Objects (the latter behaviour is now available by passing opts.avoidErrorToString as true)
    - Replaced `useToStringForErrors`, `avoidToJSONMethods` & `quoteStrings` parameters with a single, optional `opts` 
      parameter with optional `avoidErrorToString` (NB: renamed and changed default behaviour to use toString() for 
      Errors), `avoidToJSONMethods` and `quoteStrings` properties.
    - Added support for also handling any legacy arguments passed instead of a new `opts` object, which means this 
      API change is still backward-compatible
    - Added new `useJSONStringify`, `replacer` & `space` opts properties to enable `stringify`'s behaviour to be 
      switched to simply use `JSON.stringify` instead via its new `opts` argument
- Changes to `objects.js` module:
  - Added `toKeyValuePairs` function
  - Changes to `merge` function:
    - Replaced `replace` & `deep` parameters with a single, optional `opts` parameter with optional `replace` & `deep` 
      properties
    - Added support for also handling any legacy arguments passed instead of a new `opts` object, which means this 
      API change is still backward-compatible  
  - Changes to `copy` function:
    - Replaced `deep` parameter with a single, optional `opts` parameter with an optional `deep` property
    - Added support for also handling any legacy `deep` boolean argument passed instead of a new `opts` object, which 
      means this API change is still backward-compatible  
  - Changes to `copyNamedProperties` function:
    - Replaced `compact`, `deep` & `omitPropertyIfUndefined` parameters with a single, optional `opts` parameter with 
      optional `replace`, `deep` & `omitIfUndefined` properties
    - Added support for also handling any legacy arguments passed instead of a new `opts` object, which means this 
      API change is still backward-compatible
- Added new `type-defs` "module" to gather the various type definitions into one place
- Removed `test/testing.js`
  
### 2.0.14
- Added `copyNamedProperties` function to `objects.js` module

### 2.0.13
- Added `getPropertyValue` function to `objects.js` module

### 2.0.12
- Changed `app-errors.js` module to export `getHttpStatus` function

### 2.0.11
- Changed `app-errors.js` module's `AppError` constructor:
  - To preserve and use the more useful stack of its cause (if cause is an Error) instead of its own stack
- Changed `objects.js` module's `copy` and `merge` functions:
  - To support copying and merging of Arrays as well

### 2.0.10
- Changed `strings.js` module's `stringify` function:
  - To surround errors, which are converted to strings via their `toString` methods, with square brackets (to indicate
    that the property does not contain just a string error message)

### 2.0.9
- Patched and changed `strings.js` module's `stringify` function:
  - To use objects' `toJSON` methods (if any) by default (prior versions did NOT use them at all)
  - To add an optional `avoidToJSONMethods` argument to determine whether to avoid using objects' toJSON methods or not (default)
  - To double-quote any string elements within an array in order to synchronize with the behaviour of `JSON.stringify`
  - To re-sequence the order of errors' property names when they are stringified as normal objects - in order to have an 
    error's `name` as the first property, followed by its `message` as the second property, followed by the rest of its 
    enumerable properties (excluding its `stack` property) 
  - To differentiate simple references to identical objects within the object graph from true circular dependencies:
    - Simple references are now marked as `[Reference: {name}]`, whereas the prior version marked them incorrectly as `[Circular: {name}]`
    - True circular dependencies are still marked as `[Circular: {name}]`

### 2.0.8
- Changed `strings.js` module's `stringify` function:
  - To handle circular dependencies in objects and arrays
  - To recursively stringify objects & their properties itself, instead of relying on `JSON.stringify`
  - To add an optional `useToStringForErrors` argument to convert Errors using their `toString` methods (if true) or
    as objects (if false), but with their `message` and `name` (but not `stack`) properties visible in the result
  - To add an optional `quoteStrings` argument to return given string values surrounded with double-quotes (if true)

### 2.0.7
- Change to `objects.js`:
    - Removed console.log only added for debugging from `merge` function

### 2.0.6
- Change to `objects.js`:
    - Improved `merge` function to handle circular, non-Directed Acyclic Graphs of objects
    - Added a `copy` function also able to handle non-DAGs

### 2.0.5
- Change to `objects.js`:
    - Added a `merge` function

### 2.0.4
- Change to `strings.js`:
    - Added an `nthIndexOf` function that finds index of nth occurrence of a search value in a string

### 2.0.3
- Change to `promises.js`:
    - Added an `every` function that accepts multiple promises and returns a single promise that returns a list of either a result or an error for each and every one of the given promises

### 2.0.2
- Changes to `promises.js`:
    - Minor patch for `isPromise` to survive undefined and null
    - Added `isArrayOfPromises` function to check if a result is an array of promises
    - Added `allOrOne` function to transform a result into a single promise 
      using `Promise.all`, the promise-result or `Promise.resolve`
    - Changed implementation of `Promise.try` to use new `Promise.allOrOne`
    - Added unit tests for `allOrOne` & `isArrayOfPromises` and more tests for `try`

### 2.0.1
- Replaced all `x instanceof Array` checks with safer `Array.isArray(x)`
 
### 2.0.0
- Removed unnecessary functions.js module
- Patches to testing.js `checkMethodEqual` and `checkMethodOkNotOk` functions to show method prefixes properly

### 1.2.0
- strings: 
    - Improvements to `stringify` function to better handle functions and arrays
- promises: 
    - Added `isPromise` function 
    - Added optional `cancellable` argument to `delay` function to enable cancellation of delay's timeout
- Added new modules: 
    - app-errors 
    - arrays
    - objects
    - timers
- Added unit tests for existing and new functions and classes.

### 1.1.1
- Simple increment of version number to fix issue of 1.1.0 tag pointing to wrong version

### 1.1.0
- strings: Added `trimOrEmpty` function
- strings: Renamed `safeTrim` function to `trim` and changed `safeTrim` to an alias for `trim`