NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #3958 most downloaded on npm
Functional programming in TypeScript
Last release 1 years ago
18 Aug 2025
Release timing varies
gaps range from 2 weeks to 9 months
Nearly every release is documented
notes for 59 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
10 years old
233 releases · first in 2017
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
One column per quarter.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Fix Option.getOrd definition, #1963
Bug Fix
Fix Option.getOrd definition, #1963
Add apFirstW and apSecondW to ReaderTask, #1958
Polish
Add apFirstW and apSecondW to ReaderTask, #1958
Support strictBuiltinIteratorReturn, #1949
Polish
Support strictBuiltinIteratorReturn, #1949
Remove useless pure comment, closes #1937
Polish
Remove useless pure comment, closes #1937
Polish Add tap for Identity #1943
Polish
Add tap for Identity #1943
Allow dependencies to be widen when using orLeft #1938
Polish
Allow dependencies to be widen when using orLeft #1938
Resolved a RangeError where the maximum call stack size was exceeded when invoking chainWithIndex, #1931
Polish
Resolved a RangeError where the maximum call stack size was exceeded when invoking chainWithIndex, #1931
Fix __PURE__ annotation placement, closes #1926
Polish
Fix __PURE__ annotation placement, closes #1926
Either.ts: toError: Don't fail when a value can't be converted to a primitive, #1924
Polish
Either.ts: toError: Don't fail when a value can't be converted to a primitive, #1924
Fix "__PURE__" annotation placement #1919, closes #1916
Polish
Fix "__PURE__" annotation placement #1919, closes #1916
fix type signature of ReaderTaskEither.tapReaderIO, #1895
Bug Fix
ReaderTaskEither.tapReaderIO, #1895tapEither (dual) (aka chainFirstEitherK / chainFirstEitherKW) https://github.com/gcanti/fp-ts/pull/1864
tapEither (dual) (aka chainFirstEitherK / chainFirstEitherKW) https://github.com/gcanti/fp-ts/pull/1864tapIO (dual) (aka chainFirstIOK) https://github.com/gcanti/fp-ts/pull/1865as / asUnit https://github.com/gcanti/fp-ts/pull/1867tapTask (dual) (aka chainFirstTaskK) https://github.com/gcanti/fp-ts/pull/1869mapError (dual) (aka mapLeft) https://github.com/gcanti/fp-ts/pull/1870mapBoth (dual) (aka bimap) https://github.com/gcanti/fp-ts/pull/1872tapReader (dual) (aka chainFirstReaderK / chainFirstIReaderKW) https://github.com/gcanti/fp-ts/pull/1871tapReaderEither (dual) (aka chainFirstReaderEitherK / chainFirstEitherKW) https://github.com/gcanti/fp-ts/pull/1873tapReaderIO (dual) (aka chainFirstReaderIOK) https://github.com/gcanti/fp-ts/pull/1873tapReaderTask (dual) (aka chainFirstReaderTaskK) https://github.com/gcanti/fp-ts/pull/1873tapTaskEither (dual) (aka chainFirstTaskEitherK / chainFirstTaskEitherKW) https://github.com/gcanti/fp-ts/pull/1873flatMapReaderTask (dual) (aka chainReaderTaskK / chainReaderTaskKW) https://github.com/gcanti/fp-ts/pull/1874flatMapTaskEither (dual) (aka chainTaskEitherK / chainTaskEitherKW) https://github.com/gcanti/fp-ts/pull/1874flatMapIO (dual) (aka chainIOK) https://github.com/gcanti/fp-ts/pull/1874Option.orElse (dual) (aka alt / altW) https://github.com/gcanti/fp-ts/pull/1868flatMapTask (dual) (aka chainTaskK) https://github.com/gcanti/fp-ts/pull/1876flatMapReader (dual) (aka chainReaderK / chainReaderKW) https://github.com/gcanti/fp-ts/pull/1876flatMapReaderIO (dual) (aka chainReaderIOK / chainReaderIOKW) https://github.com/gcanti/fp-ts/pull/1879flatMap* (aka chain*K / chain*KW) https://github.com/gcanti/fp-ts/pull/1880add tap (dual) (aka chainFirst / chainFirstW) to:
New Feature
function
LazyArgtap (dual) (aka chainFirst / chainFirstW) to:
EitherIOIOEitherIOOptionOptionReaderReaderEitherReaderIOReaderTaskReaderTaskEitherStateStateReaderTaskEitherTaskTaskEitherTaskOptiontapError (dual) (aka orElseFirst / orElseFirstW) to:
IOEitherReaderEitherReaderTaskEitherTaskEitherflatMapNullable (dual) to:
EitherIOEitherReaderEitherReaderTaskEitherStateReaderTaskEitherTaskEitherflatMapOption (dual) to:
EitherIOEitherReaderEitherReaderTaskEitherStateReaderTaskEitherTaskEitherliftNullable to:
EitherIOEitherReaderEitherReaderTaskEitherStateReaderTaskEitherTaskEitherliftOption to:
EitherIOEitherReaderEitherReaderTaskEitherStateReaderTaskEitherTaskEitherflatMapEither (dual) to:
IOEitherReaderEitherReaderTaskEitherTaskEitherArray
flatMapNonEmptyArray
flatMapReadonlyArray
flatMapReadonlyNonEmptyArray
flatMapyou can replace chain / chainW with flatMap
New Feature
flatMap to
EitherIOEitherReaderReaderEitherReaderIOReaderTaskReaderTaskEitherStateReaderTaskEitherTaskEitherNonEmptyArrayReadonlyNonEmptyArrayTreeArrayIdentityIOIOOptionOptionReadonlyArrayStateTaskTaskOptionthe gist is:
chain / chainW with flatMapflatMap in 2 ways: pipe(ma, flatMap(f)) (data-last, aka pipeable) or flatMap(ma, f) (data-first)add chainOptionKW, #1846 (@DenisFrezzato)
chainOptionKW, #1846 (@DenisFrezzato)deprecate uncurried flip function, #1748 (@thewilkybarkid)
ReaderIO, #1738 (@sukovanej)let helpers, #1725 (@Punie)Alternative
getAlternativeMonoid, #1717 (@willheslam)function
flip is now curried, #1748 (@thewilkybarkid)pipeable
altapbimapchaincomposecontramapextendfilterfilterMapfilterMapWithIndexfilterWithIndexfoldMapfoldMapWithIndexmapmapLeftmapWithIndexpartitionpartitionMappartitionMapWithIndexpartitionWithIndexpromapreducereduceRightreduceRightWithIndexreduceWithIndexReaderTask
ReaderIO constructors/combinators, #1773 (@thewilkybarkid)ReaderTaskEither
ReaderIO constructors/combinators, #1774 (@thewilkybarkid)TaskEither
chainTaskOptionKW, #1744 (@AmirabbasJ)FromIO
chainIOKFromTask
chainTaskKchainFirstTaskKWhiterable
FilterE1TheseT
bothEither
apFirstWapSecondWIOEither
apFirstWapSecondWReader
apFirstWapSecondWReaderEither
apFirstWapSecondWReaderTaskEither
apFirstWapSecondWStateReaderTaskEither
apFirstWapSecondWTaskEither
apFirstWapSecondWApply
ap overloadings, #1721 (@waynevanson)Either
exists (@gcanti)ReadonlyRecord
fromEntries return type, closes #1745 (@gcanti)TaskEither
fromPredicate signature (@gcanti)These
fromPredicate (@gcanti)exists (@gcanti)Traversable
Writer
getChain requires a Semigroup instead of a Monoid (@gcanti)function
flip function, #1748 (@thewilkybarkid)add exports field to package.json in order to support moduleResolution node12/nodenext, #1765 (@gcanti)
exports field to package.json in order to support moduleResolution node12/nodenext, #1765 (@gcanti)package.json exports field: move ./* to the end, closes #1786 (@gcanti)
How to install:
npm install fp-ts@rc
exports field: move ./* to the end, closes #1786 (@gcanti)Nothing published for this version
backport from v3 some handy defaults defined in natural transformations, kleisli arrows helpers, of functions (@gcanti)
How to install:
npm install fp-ts@rc
of functions (@gcanti)Either
exists (@gcanti)TaskEither
fromPredicate signature (@gcanti)These
fromPredicate (@gcanti)exists (@gcanti)add ReaderIO constructors/combinators, #1773 (@thewilkybarkid)
How to install:
npm install fp-ts@rc
ReaderTask
ReaderIO constructors/combinators, #1773 (@thewilkybarkid)ReaderTaskEither
ReaderIO constructors/combinators, #1774 (@thewilkybarkid)deprecate uncurried flip function, #1748 (@thewilkybarkid)
How to install:
npm install fp-ts@rc
exports field to package.json in order to support moduleResolution node12/nodenext, #1765 (@gcanti)ReaderIO, #1738 (@sukovanej)let helpers, #1725 (@Punie)Alternative
getAlternativeMonoid, #1717 (@willheslam)function
flip is now curried, #1748 (@thewilkybarkid)pipeable
altapbimapchaincomposecontramapextendfilterfilterMapfilterMapWithIndexfilterWithIndexfoldMapfoldMapWithIndexmapmapLeftmapWithIndexpartitionpartitionMappartitionMapWithIndexpartitionWithIndexpromapreducereduceRightreduceRightWithIndexreduceWithIndexbind and bindW pass the correct params through rather than get rewritten by the function passed in, #1584 (@feydan)Traversable
Writer
getChain requires a Semigroup instead of a Monoid (@gcanti)function
flip function, #1748 (@thewilkybarkid)Nothing published for this version
add ap overloadings, #1721 (@waynevanson)
Apply
ap overloadings, #1721 (@waynevanson)ReadonlyRecord
fromEntries return type, closes #1745 (@gcanti)TaskEither
chainTaskOptionKW, #1744 (@AmirabbasJ)FromIO
chainIOKFromTask
chainTaskKchainFirstTaskKWhiterable
FilterE1TheseT
bothEither
apFirstWapSecondWIOEither
apFirstWapSecondWReader
apFirstWapSecondWReaderEither
apFirstWapSecondWReaderTaskEither
apFirstWapSecondWStateReaderTaskEither
apFirstWapSecondWTaskEither
apFirstWapSecondWadd Applicative4 overloadings to traverse / traverseWithIndex, #1733 (@mlegenhausen)
ReadonlyRecord / Record
Applicative4 overloadings to traverse / traverseWithIndex, #1733 (@mlegenhausen)fix traverseWithIndex implementation, #1704 (@waynevanson)
ReadonlyRecord
traverseWithIndex implementation, #1704 (@waynevanson)add intercalate, #1678 (@thewilkybarkid)
IOOption module (@gcanti)Array
intercalate, #1678 (@thewilkybarkid)Bounded
clamp (@gcanti)reverse (@gcanti)Either
apFirstW, #1564 (@DenisFrezzato)apSecondW, #1564 (@DenisFrezzato)EitherT
chainNullableK, #1619 (@cwstra)fromNullable, #1619 (@cwstra)fromNullableK, #1619 (@cwstra)FromEither
chainFirstEitherK (@gcanti)IOEither
apFirstW, #1564 (@DenisFrezzato)apSecondW, #1564 (@DenisFrezzato)chainFirstEitherK (@gcanti)chainFirstEitherKW (@gcanti)orElseFirstIOK, #1655 (@thewilkybarkid)bracketW, #1627 (@thomasvargiu)NonEmptyArray
intercalate, #1678 (@thewilkybarkid)Option
chainFirstEitherK (@gcanti)Ordering
matchW, #1535 (@mlegenhausen)Reader
apFirstW, #1564 (@DenisFrezzato)apSecondW, #1564 (@DenisFrezzato)ReaderEither
apFirstW, #1564 (@DenisFrezzato)apSecondW, #1564 (@DenisFrezzato)chainFirstEitherK (@gcanti)chainFirstEitherKW (@gcanti)ReaderTaskEither
apFirstW, #1564 (@DenisFrezzato)apSecondW, #1564 (@DenisFrezzato)chainFirstEitherK, #1562 (@DenisFrezzato)chainFirstEitherKW, #1562 (@DenisFrezzato)bracketW, #1627 (@thomasvargiu)chainNullableK (@gcanti)fromNullable (@gcanti)fromNullableK (@gcanti)ReadonlyArray
intercalate, #1678 (@thewilkybarkid)ReadonlyNonEmptyArray
intercalate, #1678 (@thewilkybarkid)ReadonlyRecord
toEntries, #1552 (@bravely)fromEntries, #1552 (@bravely)Record
toEntries, #1552 (@bravely)fromEntries, #1552 (@bravely)StateReaderTaskEither
apFirstW, #1564 (@DenisFrezzato)apSecondW, #1564 (@DenisFrezzato)chainFirstEitherK (@gcanti)chainFirstEitherKW (@gcanti)TaskEither
apFirstW, #1564 (@DenisFrezzato)apSecondW, #1564 (@DenisFrezzato)chainFirstEitherK, #1659 (@vinassefranche)chainFirstEitherKW, #1659 (@vinassefranche)orElseFirstIOK, #1655 (@thewilkybarkid)orElseFirstTaskK, #1655 (@thewilkybarkid)bracketW, #1627 (@thomasvargiu)chainNullableK, #1619 (@cwstra)fromNullable, #1619 (@cwstra)fromNullableK, #1619 (@cwstra)TaskOption
fromEitherK (@gcanti)chainEitherK (@gcanti)chainFirstEitherK (@gcanti)now tryCatch / tryCatchK will catch synchronous errors too, #1676 (@thewilkybarkid)
TaskEither / TaskOption
tryCatch / tryCatchK will catch synchronous errors too, #1676 (@thewilkybarkid)add Refinement overload to 'every' functions, #1681 (@mlegenhausen)
Refinement overload to 'every' functions, #1681 (@mlegenhausen)Add missing pure annotations, #1658 (@OliverJAsh)
more Functor.map overloadings, closes #1623 (@gcanti)
Functor.map overloadings, closes #1623 (@gcanti)orElseFirstW: intersect dependencies like orElseW (@gcanti)
ReaderEither
orElseFirstW: intersect dependencies like orElseW (@gcanti)ReaderTaskEither
orElseFirstW: intersect dependencies like orElseW, #1635 (@OliverJAsh)more curried elem overloads, #1602 (@ammut)
elem overloads, #1602 (@ammut)fix chainNullableK signature, #1589 (@bwlt)
chainNullableK signature, #1589 (@bwlt)Task via microtasks suspension, #1591 (@mikearnaldi)Your coding agent can read these notes before it upgrades. Set up the MCP server →