Skip to content

Commit

Permalink
WIP article release 0.23
Browse files Browse the repository at this point in the history
  • Loading branch information
Tarmil committed Nov 1, 2023
1 parent 85bf973 commit 68b2d57
Showing 1 changed file with 95 additions and 0 deletions.
95 changes: 95 additions & 0 deletions src/Website/articles/20231011-bolero-0-23-released.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
---
title: Bolero 0.23 released
subtitle: Router query parameters and .NET 8 compatibility
---

We are happy to announce the release of [Bolero](https://fsbolero.io) version 0.23.
Bolero is a library that enables writing full-stack applications in F#, whose client side runs in WebAssembly using Blazor.

The main highlights of this release are:
* Improvements to routing, including query parameters, not-found handling and hash scrolling.
* .NET 8 compatibility.
* Better C# compatibility for server-side.

Install the latest project template with:

```
dotnet new -i Bolero.Templates::0.23.TODO
```

## Routing improvements

### Query parameters ([#309](https://github.com/fsbolero/Bolero/issues/309))

Inferred routers can now handle query parameter parsing. It is done using the syntax `?paramName={fieldName}`.

```fsharp
type Page =
| [<EndPoint "/">] Home
| [<EndPoint "/articles?page={pageNum}&count={countPerPage}"] Articles of pageNum: int * countPerPage: int
```

Using the router above, `/articles?page=3&count=20` corresponds to the page value `Articles (3, 20)`.

Query parameters are optional if the corresponding field has type `option` or `voption`, and mandatory otherwise.

Additionally, the syntax `?{paramName}` is short for `?paramName={paramName}`.

```fsharp
type Page =
| [<EndPoint "/articles?{tag}&{page}&{count}"] Articles of tag: string option * page: int option * count: int
```

Using the router above, `/articles?tag=fsharp&count=20` corresponds to the page value `Articles (Some "fsharp", None, 20)`.

Of course, path parameters and query parameters can be mixed in the same endpoint.

```fsharp
type Page =
| [<EndPoint "/articles/{tag}?{page}"] Articles of tag: string * page: int option
```

Using the router above, `/articles/fsharp?page=20` corresponds to the page value `Articles ("fsharp", Some 20)`.

* [#308](https://github.com/fsbolero/Bolero/issues/308) Add router functions to decide what to do when the URL is invalid.

* `Router.withNotFound` takes an endpoint to redirect to, and applies to a `Router<_, _, _>` (ie. an inferred router).

* `Router.withNotFoundMsg` takes an Elmish message to send, and applies to any `IRouter<_, _>` (including manual routers).

These functions apply when the initial URL is invalid, or when the URL is programmatically changed to be invalid.
They do not apply when the user clicks a link to an invalid URL, in order to allow external links.

* [#309](https://github.com/fsbolero/Bolero/issues/309) Add support for query parameters in inferred routing with `EndPointAttribute`.

* `?paramName={fieldName}` adds query parameter `paramName` corresponding to the union field named `fieldName`. This parameter is mandatory if `fieldName` is a string, boolean or number, and optional if it is an option or voption of these types.

* `?{paramName}` is short for `?paramName={paramName}`.

* [#313](https://github.com/fsbolero/Bolero/issues/313) Improve C# compatibility of server-side APIs.
For the following extension methods:

* `IServiceCollection.AddBoleroHost`
* `IServiceCollection.AddBoleroRouting`
* `IEndpointRouteBuilder.MapFallbackToBolero`

The following changes are applied:

* Optional arguments are changed from F#-style to C#-style. This is a source breaking change for callers who use explicit syntax `?argument = optionValue`.
* Function arguments are changed from F#-style functions to C#-style `Func` or `Action`.

* [#315](https://github.com/fsbolero/Bolero/issues/315) Support adding hash component to routing URLs:

* Manually adding `+ "#foo"` to a routed URL will correctly scroll to the element named `foo` in the target page.

* Methods `IRouter.Link` and `IRouter.HRef` take a new optional argument `hash: string` to link to the corresponding `#hash` in the target page.

* [#316](https://github.com/fsbolero/Bolero/issues/316) Fix `on.stopPropagation` and `on.preventDefault` to take event names without the `on` prefix, for consistency with `on.event`.

* [#317](https://github.com/fsbolero/Bolero/issues/317) Fix .NET 8 compatibility of the MSBuild task for scoped CSS.

* [#317](https://github.com/fsbolero/Bolero/issues/317) Fix .NET 8 compatibility of the server-side rendering of nodes.

* [#323](https://github.com/fsbolero/Bolero/issues/323) Use `WheelEventArgs` for wheel events and `ErrorEventArgs` for `on.error`.


0 comments on commit 68b2d57

Please sign in to comment.