-
Notifications
You must be signed in to change notification settings - Fork 34
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
95 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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`. | ||
|
||
|