# Changelog > **Tags:** > > - [New Feature] > - [Bug Fix] > - [Breaking Change] > - [Documentation] > - [Internal] > - [Polish] > - [Experimental] > - [Deprecation] **Note**: Gaps between patch versions are faulty/broken releases. **Note**: A feature tagged as Experimental is in a high state of flux, you're at risk of it changing without notice. # 2.2.20 - undeprecate `FunctionType`, `FunctionC`, `Function` - undeprecate `NeverType`, `NeverC`, `never` - undeprecate `AnyType`, `AnyC`, `any` - undeprecate `RefinementC`, `refinement`, `Integer` - add refinement overload to allow custom branding, closes #373 # 2.2.19 - **Bug Fix** - allow `Error` to be decoded with `UnknownRecord`, #664 (@mlegenhausen) # 2.2.18 - **Bug Fix** - fix `typescript@4.8` errors, closes #656, closes #647 (@gcanti) # 2.2.17 - **Bug Fix** - Don't throw a TypeError when trying to decode a sum value that contains a dangerous string, #650 (@thewilkybarkid) # 2.2.16 Experimental modules require `fp-ts@^2.5.0`. - **Experimental** - `Codec` - add `readonly` combinator (@gcanti) - `Encoder` - add `readonly` combinator (@gcanti) # 2.2.15 - **Experimental** - `Schemable` - (\*) add `readonly` combinator (@gcanti) - (\*) add `struct` combinator (@gcanti) - deprecate `type` in favour of `struct` (@gcanti) - deprecate `fromType` in favour of `fromStruct` (@gcanti) (\*) breaking change # 2.2.14 - **Experimental** - `Guard` - relax `UnknownRecord` check, closes #559 (@waynevanson) # 2.2.13 - **Bug Fix** - improve internal `mergeAll` function, closes #532 (@gcanti) # 2.2.12 - **Experimental** - (\*) make `sum` safer, closes #523 (@gcanti) (\*) breaking change In case of non-`string` tag values, the respective key must be enclosed in brackets ```ts export const MySum: D.Decoder< unknown, | { type: 1 // non-`string` tag value a: string } | { type: 2 // non-`string` tag value b: number } > = D.sum('type')({ [1]: D.type({ type: D.literal(1), a: D.string }), [2]: D.type({ type: D.literal(2), b: D.number }) }) ``` # 2.2.11 - **Experimental** - `Decoder` - make `toForest` stack-safe, #520 (@safareli) # 2.2.10 - **Polish** - expose modules without lib/es6 prefix, #507 (@osdiab) # 2.2.9 - **Polish** - remove `Object.freeze` calls, closes #497 (@gcanti) - **Experimental** - `DecodeError` - add `Wrap` member (@gcanti) - `Decoder` - add `withMessage` combinator (@gcanti) - `TaskDecoder` - add `withMessage` combinator (@gcanti) # 2.2.8 - **Experimental** - (\*) remove `KleisliDecoder` module (@gcanti) - (\*) remove `KleisliTaskDecoder` module (@gcanti) - (\*) remove `JsonCodec` module (@gcanti) - (\*) remove `JsonEncoder` module (@gcanti) - `Codec` - (\*) make `Codec` more general by adding a `I` type parameter (@gcanti) - add `fromType` function (@gcanti) - add `fromPartial` function (@gcanti) - add `fromArray` function (@gcanti) - add `fromRecord` function (@gcanti) - add `fromTuple` function (@gcanti) - add `fromSum` function (@gcanti) - add `compose` function (@gcanti) - `Decoder` - (\*) make `Decoder` more general by adding a `I` type parameter (@gcanti) - add `fromRefinement` function (@gcanti) - change `fromGuard` signature (@gcanti) - add `fromType` function (@gcanti) - add `fromPartial` function (@gcanti) - add `fromArray` function (@gcanti) - add `fromRecord` function (@gcanti) - add `fromTuple` function (@gcanti) - add `fromSum` function (@gcanti) - add `compose` function (@gcanti) - add `id` function (@gcanti) - (\*) rename `functorDecoder` instance to `Functor` (@gcanti) - (\*) rename `altDecoder` instance to `Alt` (@gcanti) - (\*) rename and split `schemableDecoder` (@gcanti) - add `Category` instance (@gcanti) - add `InputOf` type (@gcanti) - `TaskDecoder` - (\*) make `TaskDecoder` more general by adding a `I` type parameter (@gcanti) - add `fromRefinement` function (@gcanti) - change `fromDecoder` signature (@gcanti) - add `fromType` function (@gcanti) - add `fromPartial` function (@gcanti) - add `fromArray` function (@gcanti) - add `fromRecord` function (@gcanti) - add `fromTuple` function (@gcanti) - add `fromSum` function (@gcanti) - add `compose` function (@gcanti) - add `id` function (@gcanti) - (\*) rename `functorTaskDecoder` instance to `Functor` (@gcanti) - (\*) rename `altTaskDecoder` instance to `Alt` (@gcanti) - (\*) rename and split `schemableTaskDecoder` (@gcanti) - add `Category` instance (@gcanti) - add `InputOf` type (@gcanti) - `Guard` - (\*) make `Guard` more general by adding a `I` type parameter (@gcanti) - (\*) rename `schemableGuard` (@gcanti) - add `InputOf` type (@gcanti) - add `alt` function (@gcanti) - add `zero` function (@gcanti) - add `compose` function (@gcanti) - add `id` function (@gcanti) - `Codec` - (\*) rename `invariantCodec` to `Invariant` (@gcanti) - `Encoder` - (\*) rename `contravariantEncoder` to `Contravariant` (@gcanti) - (\*) rename `categoryEncoder` to `Category` (@gcanti) - `Eq` - (\*) rename and split `schemableEq` (@gcanti) - `Kleisli` - add `id` (@gcanti) - rename `type` to `fromType` (@gcanti) - rename `partial` to `fromPartial` (@gcanti) - rename `array` to `fromArray` (@gcanti) - rename `record` to `fromRecord` (@gcanti) - rename `tuple` to `fromTuple` (@gcanti) - rename `sum` to `fromSum` (@gcanti) - `Schemable` - add `Schemable2C`, `WithUnknownContainers2C`, `WithUnion2C`, `WithRefine2C` (@gcanti) - `Type` - (\*) rename and split `schemableType` (@gcanti) (\*) breaking change # 2.2.7 - **Experimental** - add `DecodeError` module (@gcanti) - add `FreeSemigroup` module (@gcanti) - add `TaskDecoder` module (@gcanti) - add `Kleisli` module (@gcanti) - add `KleisliDecoder` module (@gcanti) - add `KleisliTaskDecoder` module (@gcanti) - (\*) remove `NaN` from `number` instances (@gcanti) - (\*) remove `Tree` module (@gcanti) - (\*) make `Json` type immutable (@gcanti) - `Decoder` - (\*) remove `never` (@gcanti) - (\*) make `parse` pipeable and change its `parser` argument (@gcanti) - (\*) change `DecoderError` (@gcanti) - (\*) remove `withExpected` in favour of `mapLeftWithInput` (@gcanti) - `Guard` - (\*) remove `never` (@gcanti) - `Schemable` - (\*) better `literal` signature (@gcanti) - (\*) better `union` signature (@gcanti) - (\*) make intersections pipeables (@gcanti) - (\*) make refinements pipeables (@gcanti) (\*) breaking change # 2.2.6 - **Experimental** - `Decoder` - add support for non-`string` tag values to `sum`, closes #481 (@gcanti) - `intersection` should accumulate all errors (@gcanti) # 2.2.5 - **Experimental** - fix type information lost from nested decoder types, #479 (@gcanti) - `JsonEncoder` - change `id` signature (@gcanti) # 2.2.4 - **Polish** - remove the dependency on the `either` instance as a mean of improving tree shaking (@gcanti) # 2.2.3 - **Polish** - use the built-in `Readonly` type in `readonly` combinator, closes #472 (@gcanti) - **Experimental** - split instances (@gcanti) - add `Type` experimental module, #464 (@gcanti) - restore the `O` type parameter to `Encoder`, #469 (@gcanti) - add the `O` type parameter to `Codec` (@gcanti) - add `JsonCodec` experimental module (@gcanti) - add `JsonEncoder` experimental module (@gcanti) - `Schemable` - rename `Schemable` interface to `Schemable1` (@gcanti) - rename `WithUnion` interface to `WithUnion1` (@gcanti) - add `Schemable` interface (@gcanti) - add `WithUnion` interface (@gcanti) - add `WithRefinement` / `WithRefinement1` interfaces (@gcanti) - add `WithUnknownContainers` / `WithUnknownContainers1` interfaces (@gcanti) - move `UnknownArray` and `UnknownRecord` to `WithUnknownContainers` (@gcanti) - `Schema` - refactoring with the new `Schemable` interface (@gcanti) - add `interpreter` function (@gcanti) - **Internal** - upgrade to `typescript@3.9.3` (@gcanti) # 2.2.2 - **Experimental** - add `Eq` module (@gcanti) - `Codec` - add `TypeOf` operator (@gcanti) - `Decoder` - add `DecodeError` interface (@gcanti) - `Encoder` - add `TypeOf` operator (@gcanti) - `Guard` - add `TypeOf` operator (@gcanti) # 2.2.1 - **Experimental** - `Decoder` - collect all errors while decoding, closes #449 (@gcanti) # 2.2.0 - **Experimental** - add `Codec`, `Decoder`, `Encoder`, `Guard`, `Schema`, `Schemable`, `Tree` modules (@gcanti) # 2.1.3 - **Polish** - remove useless `hasOwnProperty` calls, closes #423 (@gcanti) # 2.1.1 - **Bug Fix** - fix `record` domain handling, closes #391 (@gcanti) # 2.1.0 - **New Feature** - add `bigint` codec (@mixedCase) # 2.0.6 - **Bug Fix** - whitelist `window` in `UnknownRecord`, fix #413 (@gcanti) # 2.0.5 - **Bug Fix** - `partial` shouldn't allow arrays, fix #407 (@gcanti) # 2.0.4 - **Bug Fix** - remove getters, fix #404 (@gcanti) # 2.0.3 - **Bug Fix** - rewrite es6 imports (@gcanti) # 2.0.2 - **Bug Fix** - fix #397 (@gcanti) # 2.0.1 - **Bug Fix** - fix `getTags` algorithm for mutually recursive codecs, closes #354 (@gcanti) # 2.0.0 - **Breaking Change** - upgrade to `fp-ts@2.x` (@gcanti) - move `fp-ts` to `peerDependencies` (@gcanti) # 1.10.4 - **Polish** - remove unneeded internal code (@gcanti) # 1.10.3 - **Bug Fix** - revert `1.10.0` compatibility, fix #344 (@gcanti) # 1.10.2 - **Bug Fix** - move `fp-ts` back to dependencies (@gcanti) # 1.10.1 - **Bug Fix** - handle `strict`, `exact` and `refinement` codecs when optimizing tagged unions, fix #339 (@gcanti) # 1.10.0 - **New Feature** - make `io-ts` compatible with both `fp-ts@1.x`, `fp-ts@2.x` (@gcanti) # 1.9.0 - **New Feature** - `union` is now able to detect and optimize tagged unions (@gcanti) - **Deprecation** - deprecate `taggedUnion` in favour of `union` (@gcanti) # 1.8.6 output ES modules to better support tree-shaking, closes #326 (@gcanti) # 1.8.5 - **Bug Fix** - change how types and output types are retrieved in `IntersectionC` and `TupleC`, fix #315 (@gcanti) # 1.8.4 - **Polish** - autobind `decode` method (@gcanti) # 1.8.3 - **Polish** - add `stripInternal` flag to `tsconfig.json` (@gcanti) - handle `NaN` in `PathReporter` (@gcanti) - throw if union encoding doesn't find a usable codec (@leemhenson) - **Deprecation** - deprecate `NeverType` (@gcanti) - deprecate `FunctionType` (@gcanti) # 1.8.2 - **Bug Fix** - align the runtime behavior of `Exact.is` with the type system, fix #288 (@gcanti) # 1.8.1 - **New Feature** - add `brand` combinator (@gcanti, @lostintime) - add `Int` codec (@gcanti) - `exact` strips additional properties while decoding / encoding (@gcanti) - un-deprecate `strict` combinator, is now an alias of `exact(type(...))` (@gcanti) - **Bug Fix** - fix wrong context keys for tagged unions (@gcanti) - **Deprecation** - deprecate `refinement` combinator in favour of `brand` (@gcanti) - deprecate `Integer` codec in favour of `Int` (@gcanti) - deprecate `StrictType` class (@gcanti) - deprecate `StrictC` interface (@gcanti) - **Polish** - modify the implementation of `intersection` in order to support combinators that strip additional properties (@gcanti) - do not validate the codomain of a key of a record if its domain in invalid (@gcanti) - normalize missing `message` field in `ValidationError` (@gcanti) - fix name of recursive codec definitions (@gcanti) - remove unexpected validation path from partial type, closes #195 (@gcanti) - do not leak taggedUnion implementation when tag validation fails (@gcanti) - add `actual` value to all context entries (@gcanti) - `exact` now bails out when the value is not an `UnknownRecord` (@gcanti) - `tuple` should not leak the implementation (`never` usage) (@gcanti) - `exact` should not leak the implementation (`never` usage) (@gcanti) - use `Number.isInteger` in `Integer` implementation (@gcanti) - use the Flow convention to name `exact` codecs (@gcanti) # 1.7.1 - **Deprecation** - deprecate `any` (@gcanti) - deprecate `object` (@gcanti) - deprecate `Dictionary` in favour of `UnknownRecord` (@gcanti) - deprecate `Array` in favour of `UnknownArray` (@gcanti) - deprecate `dictionary` in favour of `record` (@gcanti) # 1.7.0 - **New Feature** - better support for custom messages, closes #148 (@gcanti) - add optional message field to `ValidationError` - add `message` argument to `failure` - `PathReporter` should account for the new field - add `actual` optional field to `ContextEntry`, closes #194 (@gcanti) - **Deprecation** - deprecate `getValidationError` (@gcanti) - deprecate `getDefaultContext` (@gcanti) # 1.6.4 - **Bug Fix** - `getIndexRecord`: getIndexRecord: handle conflicting tags in different positions, ref #263 (@gcanti) - **Experimental** - added a warning to the console if a tagged union cannot be created (@gcanti) - revert `union` optimization, needs more work to make it happen (@gcanti) # 1.6.3 - **Bug Fix** - prevent maximum call stack size exceeded when indexing recursive codecs, closes #259 (@gcanti) # 1.6.2 - **Polish** - make `isIndexableCodec` more strict (@gcanti) # 1.6.1 - **Bug Fix** - `taggedUnion` should handle sub unions / tagged unions correctly, closes #257 (@gcanti) - **Experimental** - optimize `union` with the same algorithm used in `taggedUnion` (@gcanti) # 1.6.0 **Important**. This version requires `typescript@3.2.2+` - **New Feature** - leverage `typescript@3.2.2` (@gcanti) - `TypeC` - `PartialC` - `RecordC` - `UnionC` - `ReadonlyC` - `StrictC` - `TaggedUnionC` # 1.5.3 - **Bug Fix** - missing context info while decoding an intersection, fix #246 (@gcanti) - **Experimental** - add intermediary interfaces, closes #165 (@gcanti) - `NullC` - `UndefinedC` - `VoidC` - `AnyC` - `UnknownC` - `NeverC` - `StringC` - `NumberC` - `BooleanC` - `UnknownArrayC` - `UnknownRecordC` - `ObjectC` - `FunctionC` - `RefinementC` - `LiteralC` - `KeyofC` - `ArrayC` - `TypeC` - `PartialC` - `RecordC` - `UnionC` - `IntersectionC` - `TupleC` - `ReadonlyC` - `ReadonlyArrayC` - `StrictC` - `TaggedUnionC` - `ExactC` - **Polishs** - use rest elements in tuple types (`typescript@3.0.1` feature) (@gcanti) - `union` should handle zero types (@gcanti) - `intersection` should handle zero / one types (@gcanti) - **Deprecation** - deprecate `clean` (@gcanti) - deprecate `alias` (@gcanti) - deprecate `PropsOf` type (@gcanti) - deprecate `Exact` type (@gcanti) # 1.5.2 - **Deprecation** - deprecate `Compact` type (@gcanti) # 1.5.1 - **Polish** - remove useless module augmentation of `Array` (@gcanti) # 1.5.0 - **New Feature** - add `UnknownType`, closes #238 (@gcanti) - **Deprecation** - `ThrowReporter` is now deprecated (@gcanti) # 1.4.2 use `Compact` in `intersection` signatures as a workaround for #234 (@sledorze) # 1.4.1 - **Polish** - `Type.prototype.pipe` now allows more types as input, #231 #232 (@sledorze) # 1.4.0 - **New Feature** - use `unknown` as `mixed` (@gcanti) # 1.3.4 - **Bug Fix** - should emit expected keys while decoding, fix #214 (@gcanti) # 1.3.3 - **Bug Fix** - align `TaggedExact` definition with siblings, fix #223 (@gcanti) # 1.3.2 - **Bug Fix** - dictionary type should not allow arrays, fix #218 (@gcanti) # 1.3.1 - **Polish** - use interface instead of type alias (@gcanti) - `Context` - `Errors` - `Any` - `Mixed` # 1.3.0 - **New Feature** - add `TaggedUnionType` (@gcanti) # 1.2.1 - **Polish** - allow recursive types in tagged unions (@gcanti) # 1.2.0 - **New Feature** - add `void` runtime type (@gcanti) # 1.1.5 - **Bug Fix** - partial combinator should preserve additional properties while encoding, fixes #179 (@gcanti) - **Polish** - use `useIdentity` when possible (@gcanti) # 1.1.4 - **Internal** - fix broken build with `typescript@2.9.1`, closes #174 (@gcanti) # 1.1.3 - **Internal** - upgrade to `typings-checker@2.0.0` (@gcanti) # 1.1.2 - **Bug Fix** - fix `alias` implementation (@gcanti) - handle exact types in `isTagged` (@gcanti) # 1.1.1 - **Experimental** - add `clean` / `alias` functions, closes #149 (@gcanti) - add `exact` combinator (@gcanti) - the `strict` combinator is deprecated - remove `optional` combinator (@gcanti) - it doesn't play well with advanced combinators, see [here](https://github.com/gcanti/io-ts/issues/140) for a discussion # 1.0.6 - **Bug Fix** - `taggedUnion` fails to decode when tag values are not string literals, fix #161 (@gcanti) # 1.0.5 - **Bug Fix** - workaround for upstream TypeScript bug 14041 (wrong generated declarations) (@gcanti) - **Internal** - optimize InterfaceType.encode (@gcanti) - use definite assignment assertion for phantom fields (@gcanti) # 1.0.4 - **Bug Fix** - make `Context` readonly (@gcanti) - **Internal** - optimizations, #137 (@gcanti, @sledorze) # 1.0.3 - **Internal** - optimizations, #134 (@gcanti, @sledorze) # 1.0.2 - **Bug Fix** - fix `OutputOfPartialProps` name (@gcanti) # 1.0.1 - **Bug Fix** - fix `AnyType` by extending `Type` (@gcanti) # 1.0.0 - **Breaking Change** - upgrade to `fp-ts@1.0.0` - see https://github.com/gcanti/io-ts/pull/112 (@gcanti) # 0.9.8 - **New Feature** - add decode and deprecate top level validate (@gcanti) - **Internal** - when checking validations use methods instead of top level functions (@gcanti) # 0.9.7 - **New Feature** - add `taggedUnion` combinator (@gcanti, @sledorze) # 0.9.6 - **New Feature** - `recursive` combinator - add support for mutually recursive types, closes #114 (@gcanti) - make it safer: `RT` now must extend `Type` (@gcanti) # 0.9.5 - **New Feature** - add `mixed` type (@gcanti) - replace `any` with `mixed` in all input type parameters (@gcanti) ```diff -export class StringType extends Type { +export class StringType extends Type { } ``` # 0.9.4 - **Bug Fix** - strict: should succeed validating an undefined field, closes #106 (@gcanti) # 0.9.3 - **Bug Fix** - revert 37c74a5e2038de063a950f9ba8d18b1f132ef450, closes #8 (@gcanti) # 0.9.2 - **New Feature** - add `Decoder` / `Encoder` interfaces (@sledorze, @gcanti) - **Internal** - perf optimizations (@sledorze, @gcanti) # 0.9.1 - **Bug Fix** - make all classes "dumb", fix #95 (@gcanti) # 0.9.0 - **Breaking Change** - remove `t.map` and `t.mapWithName` (in general doesn't look serializable, needs more investigation) - remove `t.prism` (in general doesn't look serializable, needs more investigation) - change `Type` from interface to class and add `S` type parameter - remove `t._A` - add `Type#serialize` - add `Type#is` (in order to serialize unions and while we're at it, looks useful anyway) - remove `t.is` (now that there's `Type#is` is misleading) - **Experimental** - add Flowtype support (@gcanti) # 0.8.2 - **New Feature** - add `object` type, closes #86 (@gcanti) # 0.8.1 - **New Feature** - add `strict` combinator, closes #84 (@phiresky, @gcanti) # 0.8.0 - **Breaking Change** - upgrade `fp-ts` dependency (@gcanti) # 0.7.2 - **Bug Fix** - tag recursive types, fix #80 (@gcanti) # 0.7.1 - **Bug Fix** - incorrect compile time type for dictionary, fix #75 (@gcanti) # 0.7.0 - **Breaking Change** - upgrade to latest fp-ts (0.5.1) (@gcanti) # 0.6.2 - **New Feature** - add aliases for `null` and `interface`, closes #63 (@gcanti) # 0.6.1 - **Internal** - handle latest fp-ts (0.4.3) (@gcanti) # 0.6.0 - **Breaking Change** - upgrade to latest fp-ts (0.4.0) (@gcanti) - **Internal** - allow for infinite unions (@gcanti) # 0.5.1 - **Bug Fix** - export and rename `interfaceType` to `_interface`, fix #57 (@gcanti) # 0.5.0 - **Breaking Change** - `Type` is now an interface - types no more own a `is` method, use `t.is` instead - unions no more own a `fold` method - `Reporter`, `PathReporter`, `ThrowReporter` are now top level modules # 0.4.0 - **Breaking Change** - upgrade to latest `fp-ts` (`io-ts` APIs are not changed though) (@gcanti) - drop `lib-jsnext` folder # 0.3.2 - **Bug Fix** - remove excess overloadings, fix #43 (@gcanti) # 0.3.1 - **New Feature** - add mapWithName and Functor instance, fix #37 (@gcanti) - add prism combinator, fix #41 (@gcanti) # 0.3.0 This is a breaking change _only_ if you are using fp-ts APIs - **Breaking Change** - upgrade to latest fp-ts v0.2 (@gcanti) # 0.2.3 - **Internal** - upgrade to fp-ts v0.1 (@gcanti) # 0.2.2 - **New Feature** - add `partial` combinator (makes optional props possible) - add `readonly` combinator (values are not frozen in production) - add `readonlyArray` combinator (values are not frozen in production) - add `never` type - **Breaking Changes** - remove `maybe` combinator, can be defined in userland as ```ts export function maybe( type: RT, name?: string ): t.UnionType<[RT, typeof t.null], t.TypeOf | null> { return t.union([type, t.null], name) } ``` - **Polish** - export `pathReporterFailure` function from default reporters - **Bug Fix** - revert pruning excess properties (see https://github.com/gcanti/io-ts/pull/27 for context) - revert `intersection` combinator accepting only `InterfaceType`s - **Experimental** - Pattern matching / catamorphism for unions # 0.1.0 - **New Feature** - add support for jsnext - add `Integer` type - **Breaking Changes** - `t.Object` type. Renamed to `t.Dictionary`, now accepts arrays so is fully equivalent to `{ [key: string]: any }`. - `t.instanceOf` combinator. Removed. - `t.object` combinator. Renamed to `t.interface`. `ObjectType` to `InterfaceType`. Excess properties are now pruned. - `mapping` combinator. Renamed to `dictionary`. `MappingType` to `DictionaryType`. - `intersection` combinator. Due to the new excess property pruning in `t.interface` now only accept `InterfaceType`s. - API `isSuccess` removed, use `either.isRight` instead - API `isFailure` removed, use `either.isLeft` instead - API `fromValidation` removed # 0.0.2 - **Bug Fix** - reverse overloading definitions for unions, intersections and tuples, fix inference bug # 0.0.1 Initial release