Changelog
July 1, 2026 · View on GitHub
1.2.0
Build & Tooling
- Upgraded Babel dev toolchain to 8.x (
@babel/core,@babel/cli,@babel/preset-env,@babel/register,@babel/plugin-transform-runtime,@babel/runtime) - Pinned
.babelrcto IE 11 target to preserve ES5 bundle output - Modernized webpack compression: replaced
brotli-webpack-pluginwith nativezlib.brotliCompressviacompression-webpack-plugin - Upgraded
webpack-clito^6,compression-webpack-pluginto^11,babel-loaderto^10 - Fixed
devscript:webpack -d --watch→webpack --mode development --watch - Fixed
cleanscript: removed no-opsedpipe, usefind dist -name '*.js*' -delete - Added
release:check(npm test && npm pack --dry-run --json;npm packruns thepreparebuild) and madereleasestop atnpm publish; branch/tag pushes are documented as explicit manual steps - Migrated CI from Travis to GitHub Actions: added
.github/workflows/ci.ymltest matrix (Node22.18/24.11/node× Ubuntu/Windows/macOS); removed.travis.yml - Added GitHub Actions CodeQL workflow
- Added Dependabot config for npm and github-actions ecosystems
Package Hygiene
- Added
filesallowlist to prevent test/config/.omx leakage in npm tarball - Included
docs/in the npm package allowlist so README links todocs/OVERVIEW.mdanddocs/API.mdresolve for package consumers - Cleaned
.gitignore: replaced contradictorydist/*.js*negation with cleandist/ - Corrected runtime
engines.nodeto>=8.3.0(separate from dev/build floor)
Bug Fixes
pattern.jsisNotNumber: added null/undefined guard beforeisNaNcheck; preventsTypeNumber.matches(null)throw and fixesTypeADT(null)resolving toTypeNullpattern.jsinCaseOfNumber: reject booleans and arrays as numbers (globalisNaNcoercedtrue→1,[1]→1); numeric strings still acceptedpattern.jsinCaseOfString: pass value unchanged instead of coercing with+v(was turning'abc'→NaN,'42'→number)pattern.jsinCaseOfRegex: save/restorelastIndexfor/g//yregexes to prevent repeated-match alternationmaybe.jsflatMap: short-circuit toNonewhenisNull()instead of callingfn(undefined)and leakingSome(NaN)maybe.jschainRec: short-circuit toNonewhen any recursive step returnsNoneinstead of throwing onnull.valuemaybe.jsequals: use SameValueZero semantics soMaybe.of(NaN).equals(Maybe.of(NaN))is truemaybe.jsFantasy Land aliases: fixedfantasy-land/reduce,fantasy-land/filter,fantasy-land/equalsonNoneto bypass broken aliasesfp.jsdifference: fixed duplicate-main offset bug (sliced by rawmain.lengthinstead of dedupednew Set(main).size)fp.jstake: fixed mutation bug (list.shift()mutated caller's array and threw on strings/arguments); now useslist[0]+slicefp.jsfill: fixed sparse-array bug on single numeric element (Array(...[5])→ sparse length-5); now usesArray.fromfp.jsintersection: removed incorrectif(list[x] == undefined)guard that indexed by value and dropped0_helpers/reusables.jsgetMainAndFollower: fixed single-element numeric arrays being treated as explicit index args; now requires both trailing values to betypeof === 'number'
Documentation
- Fixed all README import specifiers:
fpEs→fpes(package name is lowercase;fpEsfailed on case-sensitive filesystems) - Corrected README Node requirement:
>= 6.0→>= 8.3.0 - Pinned unpkg links to
@1.2.0 - Replaced dead Travis badge and unconfigured codecov badge with a GitHub Actions CI status badge
- Added browser-global vs npm-package naming note
- Added Development section with dev/build Node floor
- Added Release Checklist section
Tests
- Grew test suite from 264 to 491 passing tests
- Added regression tests for all bug fixes above
- Added fp public API regression and entry-point tests
- Added pattern string coercion and global regex
lastIndexregressions - Added Maybe
chainRecstep-None, NaN equality, and None Fantasy Land alias regressions - Added TypeNumber boolean/array coercion boundary tests
- Added
getMainAndFollowernumeric-array-index regression tests