Changelog

July 24, 2026 ยท View on GitHub

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

2.11.0 - 2026-07-24

๐Ÿž Bug Fixes

  • (all) Eliminate dead bindings left by CE/inline lowering (#4837) (9f694e97)
  • (beam) Make reflection metadata agree with record/union codegen (#4849) (ec6a3df0)
  • (js/ts) Resolve generic params when reflecting erased union fields (#4851) (619d7afd)
  • (js/ts,python) Inline Option/ValueOption combinators to avoid closures and allocations (#4836) (61cac646)

โšก Performance Improvements

  • (all) Lower constant ยฑ1 step ranges to counted for-loops (#4838) (ab28daec)

View changes on Github

2.10.0 - 2026-07-22

๐Ÿš€ Features

  • (beam) Render %A in F# syntax instead of dumping Erlang terms (#4814) (218e0c40)

๐Ÿž Bug Fixes

  • (beam) Correct char-to-string conversion and console Unicode encoding (#4812) (df8e01d6)
  • (beam) Isolate each top-level effect's variables in main/0 (#4815) (8d708633)
  • (beam) Decode UTF-8 codepoints in ToCharArray and related String functions (b2ce3067)

View changes on Github

2.9.0 - 2026-07-17

๐Ÿš€ Features

๐Ÿž Bug Fixes

  • (python) Make class declarations and references agree on type names (#4807) (ae4b910b)

View changes on Github

2.8.0 - 2026-07-16

๐Ÿš€ Features

  • (beam) Support Environment.CurrentDirectory and GetEnvironmentVariable (#4801) (55b9d560)

  • (beam) Support setting Environment.CurrentDirectory (#4783) (7b2a262f)

  • (rust) Various codegen and runtime improvements (#4781) (ae10cd2c)

    • Cast bool to integer types; support ** via .powf
    • Add Decimal.IsInteger/IsEvenInteger/IsOddInteger/IsCanonical
    • Fix two-switch decision trees dispatching to the wrong target
    • Fix reference-typed match bindings panicking via mem::zeroed
    • Fix string and non-ident option pattern matches emitting invalid Rust match arms
    • Fix Convert.ToXxx(bool)
    • Fix Char.ToUpper/ToLower truncating multi-char case mappings
    • Fix Random.nextDouble panic message
    • Fix Map.find/tryFind panicking on reference-typed values

๐Ÿž Bug Fixes

  • (all) Skip translating unreachable branch of constant-condition if/then/else (#4799) (53c06de1)

View changes on Github

2.7.0 - 2026-07-15

๐Ÿš€ Features

  • (js/ts) Add System.IO.Directory support (Exists, CreateDirectory) (#4798) (6568f35e)
  • (js/ts/python/beam) Preserve member calls and pattern matches in quotations (#4780) (55482e6b)

๐Ÿž Bug Fixes

  • (beam) Make Assert.AreEqual/NotEqual raise, and stop emitting reflection calls for erased types (#4775) (d9711d4c)

View changes on Github

2.6.2 - 2026-07-13

๐Ÿž Bug Fixes

  • (beam) Make F# reflection work on the Beam target (#4766) (b15b280d)
  • (beam) Give sized integers .NET fixed-width semantics (#4769) (2ed39630)
  • (beam) Qualify Erlang module names by their OTP app (#4770) (5516c8d8)
  • (beam) Entry point argv and exit code, bigint from float, option reflection (#4772) (ea915541)

View changes on Github

2.6.1 - 2026-07-11

๐Ÿž Bug Fixes

  • (beam) Order discriminated union comparison by declaration order (#4761) (3597a582)
  • (beam) Preserve function-value identity for PhysicalEquality (#4762) (727673f3)
  • (js/ts) Don't drop unsupported jsOptions statements when inlining as POJO (#4754) (4cbc44fc)
  • (python) Propagate [] return value as process exit code (#4763) (a8d9bf5f)

View changes on Github

2.6.0 - 2026-07-09

๐Ÿž Bug Fixes

  • (all) Include original exception message when loading a Fable plugin fails (#4739) (659e73a4)
  • (all) Add Seq.enumerateTryWith for try/with in seq, list, array comprehensions (#4750) (448c90d7)
  • (js/ts) Represent union cases with no fields as singletons (3f6e618e)
  • (python) Represent union cases with no fields as singletons (0211b4cc)
  • (python) Emit forward reference for self-referencing static union members (#4752) (452b85f2)
  • (python) Match .NET NaN and signed-zero semantics in comparison, min and max (383bb93c)
  • (python) LastIndexOf(value, startIndex) off-by-one on inclusive boundary (bad6bcac)

โšก Performance Improvements

  • (python) Use native operators for int64/uint64 arithmetic (#4727) (f062d668)
  • (python) Rewrite hot Seq combinators as native Python generators (#4728) (73e0eab9)
  • (python) Read union case fields directly instead of rebuilding Array (#4725) (e4eaa80b)

View changes on Github

2.5.0 - 2026-07-05

๐Ÿš€ Features

  • (all) Allow [<Emit>] on StringEnum cases (#4711) (0b1f61ee)
  • (js/ts) Optimize printfn with constant string to console.log (#4718) (2d6d083a)
  • (js/ts) Add Path.Combine support (b1b1e273)
  • (js/ts) Add System.IO.Path and System.IO.File API support (ec99fac5)
  • (js/ts/python) Warn on duplicate attached member names (#4715) (fd06aa64)
  • (js/ts/python) Add Environment and Console.Error support (6e082f95)
  • (py) Add Path.Combine support (4c901c65)
  • (python) Add Directory.Exists, Directory.CreateDirectory (f4b4eabc)
  • (ts) [] interfaces extend parent [] type (#4717) (4f4243cd)

๐Ÿž Bug Fixes

  • Generate an error on erased union case typed as obj (#4710) (bf2134d5)
  • (all) Include return type in overload suffix for op_Implicit/op_Explicit (#4712) (a6846010)
  • (js/ts) DateTime.ToString() and %A are now consistent across all DateTimeKind values (#4714) (de98b0e4)
  • (python) Accept allowAccessToPrivateRepresentation in FSharpType.IsUnion/IsRecord/GetUnionCases (#4722) (7f915f1d)
  • (ts) Strip byref annotation from compiler-generated copy-update locals (#4716) (1e072ed2)

โšก Performance Improvements

  • Split Fable.Transforms into per-target projects for faster incremental builds (#4720) (260c962f)

View changes on Github

2.4.0 - 2026-06-30

๐Ÿš€ Features

  • (all) Add Compiler.is* target detection flags for conditional branching (#4692) (621dea31)
  • (js/ts) Map task { } to Promise (97f54d36)

๐Ÿž Bug Fixes

  • (all) Pass raw value for optional arguments of native bindings (#4688) (a4c75483)
  • (all) Support .NET format specifiers and alignment in interpolated strings (#4695) (7c50a3af)
  • (all) Error on inline function referencing private value (#4701) (cea6806e)
  • (beam) Support module-level mutable variables via process dictionary (#4676) (535b9af0)
  • (beam) Namespace module-level mutable state keys by module (#4683) (1ec28ab1)
  • (js) Respect StringComparison in String.IndexOf/LastIndexOf (#4681) (7cb92d52)
  • (js/ts) Implicit DateTime to DateTimeOffset conversion (#4697) (fcbd9b91)
  • (js/ts) Hoist emitJsStatement imports with trailing comments (#4702) (e820eb72)
  • (js/ts) Uncurry mutable module value alias calls (#4703) (0de0d218)
  • (js/ts) Pass TypeInfo to getRecordFields to handle None fields in anonymous records (#4704) (c977d78b)
  • (js/ts/python) Drop allowAccessToPrivateRepresentation arg from reflection calls (#4689) (ec3cded7)
  • (ts) Use declared type-param names in object expression generic methods (#4685) (1c3e7d99)
  • (ts) Use signature type-param names when implementing generic interface methods (#4686) (03e5deee)
  • (ts) Bound enum-constrained type parameters with extends number (#4687) (15daf624)
  • (ts) Keep enclosing type parameters in scope for nested members (#4691) (f5723a2d)
  • (ts) Re-declare class type params on generic static attached members (#4696) (2da50780)
  • (ts) Filter class type params from attached let-binding methods (#4700) (d3a6a1dd)

View changes on Github

2.3.0 - 2026-06-24

๐Ÿš€ Features

  • (all) Support Exception.InnerException across all targets (#4677) (c9b3ee24)

๐Ÿž Bug Fixes

  • (beam) Make immutable class instances process-portable (#4670) (182eebef)

View changes on Github

2.2.0 - 2026-06-16

๐Ÿš€ Features

  • (beam) Add !^ erased-cast operator to BeamInterop (#4659) (206776b)

๐Ÿž Bug Fixes

  • Add type specifiers to interpolated strings (#4646) (512ae4d)
  • (all) Align invalidArg error message with .NET format (#4662) (e672eb7)
  • (beam) Preserve element type through Option.Value for interface dispatch (#4661) (e5521b6)
  • (python) Emit wildcard default for union or-patterns (#4649) (#4653) (c96f0ec)

View changes on Github

2.1.0 - 2026-06-10

๐Ÿš€ Features

  • (beam) Support Erlang/BEAM target in standalone compiler (#4644) (30310e4)

๐Ÿž Bug Fixes

  • (beam) Collapse array-literal process-dict ref round-trips in FFI/Emit calls (#4626) (234ee08)
  • (beam) Make Emit $N substitution a single left-to-right pass (#4631) (48af8db)
  • (js/ts) Throw an error when trying to set non-property memeber inside of jsOptions (#4624) (2d9673f)
  • (python) Avoid union case field name collision with Union.name (#4647) (ff5df24)
  • (python) Make [] union static members work (#4634) (#4636) (15eb83e)

View changes on Github

2.0.1 - 2026-05-28

๐Ÿž Bug Fixes

  • [JS/TS/Tests] Remove mocha to resolve package vulnerabilities (#4604) (092324b)
  • [Rust] Update hashing and datetime tests (#4613) (9d39037)
  • (all) Duplicate LetRec bindings during inline expansion (#4592) (62612a5)
  • (all) Fix super call in multi-level generic class hierarchy using wrong mangled name (#4414) (db1d4d2)
  • (js/ts) Fix JSX props with long string values causing compile error (fixes #3839) (#4545) (d828a46)
  • (js/ts) Add support for match clauses in JSX.create (#4620) (616edca)
  • (js/ts) Don't spread last arg in String.Concat call (#4621) (3de580e)
  • (js/ts) Inline AttachMembers members at call sites (#4622) (63bcd3d)
  • (python) Avoid duplicate captured argument in hoisted guards (#4610) (#4611) (90aec48)

View changes on Github

2.0.0 - 2025-04-21

  • Fable 5

2.0.0-rc.1 - 2025-02-26

  • Fable 5.0.0-rc.1

2.0.0-beta.1 - 2025-02-16

  • Fable 5.0.0-alpha.10
  • Replace FABLE_COMPILER_4 with FABLE_COMPILER_5 as the compiler directive

1.2.2 - 2024-05-24

Fixed

  • Fixed includes to come from this package internals (by @MangelMaxime)

1.2.1 - 2024-05-24

Fixed

  • Fixed includes to come from this package internals and to use fable-library-js instead of fable-library-ts (by @ncave)

1.2.0 - 2024-05-23

Changed

  • Use @fable-org/fable-metadata package instead of fable-metadata (by @MangelMaxime)
  • Use @fable-org/fable-standalone package instead of fable-standalone (by @MangelMaxime)
  • Make GetDirectoryName return "." instead of "" if the path doesn't contain any directory (by @MangelMaxime)

Fixed

  • Fix initialization of fable-standalone with the new package format (by @MangelMaxime)

1.1.0 - 2024-02-20

  • Add NPM_PACKAGE_FABLE_COMPILER_JAVASCRIPT compiler directive (by @MangelMaxime)

1.0.0 - 2024-02-12

  • Release stable version

1.0.0-beta-001 - 2024-02-12

Added

  • First release as part of @fable-org scope