Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 20 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,16 @@ Looking to have a more enjoyable experience when consuming a popular .NET librar

<!-- The following table includes some entries that are duplicated in the list below. This is by design. -->
<!--lint disable double-link -->
.NET Library | F# Wrapper
-|-
[ASP.NET Core Blazor](https://github.com/dotnet/aspnetcore/tree/main/src/Components) | [Bolero](https://github.com/fsbolero/Bolero)
[ASP.NET Core](https://github.com/dotnet/aspnetcore) | [Giraffe](https://github.com/giraffe-fsharp/Giraffe) (+ optionally [Saturn](https://github.com/SaturnFramework/Saturn))<br/>[Oxpecker](https://github.com/Lanayx/Oxpecker)
[Avalonia](https://github.com/AvaloniaUI/Avalonia) | [Avalonia.FuncUI](https://github.com/fsprojects/Avalonia.FuncUI)
[MAUI](https://github.com/dotnet/maui)/[Xamarin.Forms](https://github.com/xamarin/Xamarin.Forms) | [Fabulous](https://github.com/fabulous-dev/Fabulous)
[MSTest](https://github.com/microsoft/testfx)/[NUnit](https://github.com/nunit/nunit)/[xUnit.net](https://github.com/xunit/xunit) | [FsUnit](https://github.com/fsprojects/FsUnit)
[System.Text.Json](https://github.com/dotnet/runtime/tree/main/src/libraries/System.Text.Json) | [FSharp.SystemTextJson](https://github.com/Tarmil/FSharp.SystemTextJson)
[WPF](https://github.com/dotnet/wpf) | [Elmish.WPF](https://github.com/elmish/Elmish.WPF)
|.NET Library |F# Wrapper |
|---------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|[SP.NTCore Blazor](https://github.com/dotnet/aspnetcore/tree/main/src/Components) |[Bolero](https://github.com/fsbolero/Bolero) |
|[ASP.NTCore](https://github.com/dotnet/aspnetcore) |[Giraffe](https://github.com/giraffe-fsharp/Giraffe) (+ optionally [Saturn](https://github.com/SaturnFramework/Saturn))<br/>[Oxpecker](https://github.com/Lanayx/Oxpecker)|
|[Avalonia](https://github.com/AvaloniaUI/Avalonia) |[Avalonia.FuncUI](https://github.com/fsprojects/Avalonia.FuncUI) |
|[MAUI](https://github.com/dotnet/maui)/[Xamarin.Forms](https://github.com/xamarin/Xamarin.Forms) |[Fabulous](https://github.com/fabulous-dev/Fabulous) |
|[MSTest](https://github.com/microsoft/testfx)/[NUnit](https://github.com/nunit/nunit)/[xUnit.net](https://github.com/xunit/xunit)|[FsUnit](https://github.com/fsprojects/FsUnit) |
|[System.TetJson](https://github.com/dotnet/runtime/tree/main/src/libraries/System.Text.Json) |[FSharp.SystemTextJson](https://github.com/Tarmil/FSharp.SystemTextJson) |
|[WPF](https://github.com/dotnet/wpf) |[Elmish.WPF](https://github.com/elmish/Elmish.WPF) |

<!--lint enable double-link -->

## Actor Frameworks
Expand All @@ -84,7 +85,7 @@ Looking to have a more enjoyable experience when consuming a popular .NET librar

## Cloud

- [Chia](https://github.com/DanpowerGruppe/Chia) - Chia is a F# library which contains HelperFunctions for reporting, logging and Azure cloud operations.
- [Chia](https://github.com/DanpowerGruppe/Chia) - An F# library which contains HelperFunctions for reporting, logging and Azure cloud operations.
- [Farmer](https://github.com/CompositionalIT/farmer) - Repeatable Azure deployments with ARM templates made easy.
- [FsFirestore](https://github.com/mrbandler/FsFirestore) - Functional F# library to access Firestore database hosted on Google Cloud Platform (GCP) or Firebase.
- [Pulumi.FSharp.Extensions](https://github.com/UnoSD/Pulumi.FSharp.Extensions) - F# computational expressions to reduce boilerplate in Pulumi code.
Expand All @@ -95,7 +96,7 @@ Looking to have a more enjoyable experience when consuming a popular .NET librar
## Code Generation

- [Hawaii](https://github.com/Zaid-Ajaj/Hawaii) - A dotnet CLI tool to generate type-safe F# clients from OpenAPI/Swagger services.
- [Myriad](https://github.com/MoiraeSoftware/myriad) - Myriad is a pre-compilation code generator.
- [Myriad](https://github.com/MoiraeSoftware/myriad) - A pre-compilation code generator.

## Compilers for Other Platforms

Expand Down Expand Up @@ -152,7 +153,7 @@ Looking to have a more enjoyable experience when consuming a popular .NET librar
- [Fantomas](https://github.com/fsprojects/fantomas) - F# code formatter.
- [Ionide](http://ionide.io/) - Atom Editor and Visual Studio Code package suite for cross platform F# development.
- [Vim F#](https://github.com/fsharp/vim-fsharp) - F# support for Vim.
- [VimSpeak](https://github.com/AshleyF/VimSpeak) - VimSpeak lets you control Vim with your voice using speech recognition.
- [VimSpeak](https://github.com/AshleyF/VimSpeak) - A tool to control Vim with your voice using speech recognition.
- [fsharp-notebook](https://github.com/pablofrommars/fsharp-notebook) - Data science notebook for F# Interactive.
- [neofsharp.vim](https://github.com/adelarsq/neofsharp.vim) - Basic F# support for (Neo)Vim.

Expand All @@ -171,16 +172,16 @@ Looking to have a more enjoyable experience when consuming a popular .NET librar
- [FSharp.HashCollections](https://github.com/mvkara/fsharp-hashcollections) - Fast hash-based immutable map and set.
- [FSharpLu](https://github.com/Microsoft/fsharplu) - Lightweight utilities for string manipulations, logging, collection data structures, file operations, text processing, security, async, parsing, diagnostics, configuration files and Json serialization.
- [FSharpPlus](https://github.com/gmpl/FSharpPlus) - Extensions for F#.
- [FSharpx.Extras](https://github.com/fsprojects/FSharpx.Extras) - FSharpx.Extras is a collection of libraries and tools for use with F#.
- [FSharpx.Extras](https://github.com/fsprojects/FSharpx.Extras) - A collection of libraries and tools for use with F#.
- [Fli](https://github.com/CaptnCodr/Fli) - Computational expression to run system processes and manage their output.
- [Fling](https://github.com/cmeeren/Fling) - Fling significantly reduces boilerplate needed to efficiently save/load complex domain entities to/from multiple tables.
- [Fling](https://github.com/cmeeren/Fling) - Significantly reduces boilerplate needed to efficiently save/load complex domain entities to/from multiple tables.
- [FsToolkit.ErrorHandling](https://github.com/demystifyfp/FsToolkit.ErrorHandling) - Clear, simple and powerful error handling with railway-oriented programming. Inspired by Chessie.
- [Fumble](https://github.com/tforkmann/Fumble) - Thin F# API for Sqlite for easy data access to sqlite database with functional seasoning on top.
- [Fumble](https://github.com/tforkmann/Fumble) - Thin F# API for SQLite for easy data access to SQLite database with functional seasoning on top.
- [LiteDB.FSharp](https://github.com/Zaid-Ajaj/LiteDB.FSharp) - F# Support for [LiteDB](https://github.com/mbdavid/LiteDB), an embedded single file database for .NET.
- [Npgsql.FSharp](https://github.com/Zaid-Ajaj/Npgsql.FSharp) - Thin F# wrapper around [Npgsql](https://github.com/npgsql/npgsql), the PostgreSQL database driver.
- [TypeShape](https://github.com/eiriktsarpalis/TypeShape) - Small, extensible F# library for practical generic programming.
- [Validus](https://github.com/pimbrouwers/Validus) - A composable validation library for F#, with built-in validators for most primitive types and easily extended through custom validators.
- [Vp.FSharp.Sql](https://github.com/veepee-oss/Vp.FSharp.Sql) - Generic F# ADO provider wrapper (SqlServer, PostgreSql, Sqlite).
- [Vp.FSharp.Sql](https://github.com/veepee-oss/Vp.FSharp.Sql) - Generic F# ADO provider wrapper (SqlServer, PostgreSQL, SQLite).

## Game Development

Expand Down Expand Up @@ -243,7 +244,7 @@ Looking to have a more enjoyable experience when consuming a popular .NET librar
- [Expecto](https://github.com/haf/expecto) - Smooth testing framework for F# with tests-as-values and parallelism by default.
- [Faqt](https://github.com/cmeeren/Faqt) - Fantastic fluent assertions for your F# tests and domain code.
- [FsCheck](https://github.com/fscheck/FsCheck) - Random testing for .NET.
- [FsUnit](https://github.com/fsprojects/FsUnit) - FsUnit makes unit-testing with F# more enjoyable. It adds a special syntax to your favorite .NET testing framework.
- [FsUnit](https://github.com/fsprojects/FsUnit) - Makes unit-testing with F# more enjoyable. It adds a special syntax to your favorite .NET testing framework.
- [NBomber](https://github.com/PragmaticFlow/NBomber) - Simple load testing framework for Pull and Push scenarios.
- [Persimmon](https://github.com/persimmon-projects/Persimmon) - Unit test framework for F# using computation expressions.
- [altcover](https://github.com/SteveGilham/altcover) - Cross-platform coverage gathering and processing tool set for .NET/.NET core and Mono.
Expand All @@ -268,7 +269,7 @@ Looking to have a more enjoyable experience when consuming a popular .NET librar
- [FSharp.Data](https://github.com/fsharp/FSharp.Data) - Data science library that contains type providers for CSV, HTML, JSON, XML, and WorldBank data.
- [FSharp.Management](https://github.com/fsprojects/FSharp.Management) - The project contains various type providers for the management of the machine. Handles file system, registry, Windows Management Instrumentation, PowerShell and SystemTimeZones.
- [FSharp.Text.RegexProvider](https://github.com/fsprojects/FSharp.Text.RegexProvider) - Type provider for regular expressions.
- [Facil](https://github.com/cmeeren/Facil) - Facil generates F# data access source code from SQL queries and stored procedures.
- [Facil](https://github.com/cmeeren/Facil) - Generates F# data access source code from SQL queries and stored procedures.
- [FsXaml](https://github.com/fsprojects/FsXaml) - F# Tools for working with XAML Projects.
- [FsYaml](https://github.com/bleis-tift/FsYaml) - Typed Yaml library for F#.
- [GraphProvider](https://github.com/fsprojects/GraphProvider) - `.dgml` state machine type provider.
Expand Down Expand Up @@ -301,7 +302,7 @@ Looking to have a more enjoyable experience when consuming a popular .NET librar
- [Giraffe](https://github.com/giraffe-fsharp/Giraffe) - Native functional ASP.NET Core web framework for F# developers.
- [Oxpecker](https://github.com/Lanayx/Oxpecker) - ASP.NET Core based F# framework + supporting tools (ViewEngine, Htmx, OpenApi).
- [Saturn](https://github.com/SaturnFramework/Saturn) - Opinionated, web development framework for F# which implements the server-side, functional MVC pattern.
- [Suave](https://github.com/SuaveIO/suave) - Suave is a simple web development F# library providing a lightweight web server and a set of combinators to manipulate route flow and task composition.
- [Suave](https://github.com/SuaveIO/suave) - A simple web development F# library providing a lightweight web server and a set of combinators to manipulate route flow and task composition.
- [WebSharper](https://github.com/intellifactory/websharper) - F#-based web programming platform including a compiler from F# code to JavaScript.
<!--lint enable double-link -->

Expand Down
19 changes: 13 additions & 6 deletions scripts/check-dead-links.fsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,15 @@ open Markdig.Syntax.Inlines
open Polly
open Polly.Retry

let exclusionCodes = Map.ofArray [|
"https://www.lkokemohr.de/fsharp_godot.html", HttpStatusCode.TooManyRequests // GitHub runner receives this often
"https://www.reddit.com/r/fsharp/", HttpStatusCode.Forbidden
|]

let ignoredLinks = Set.ofArray [|
"https://www.decompiler.com/"
|]

let rec visitRecursively (action: MarkdownObject -> unit) (node: MarkdownObject) =
match node with
| :? ContainerBlock as c ->
Expand All @@ -36,11 +45,6 @@ let collectLinks node =
node
urls

let exclusionCodes = Map.ofArray [|
"https://www.lkokemohr.de/fsharp_godot.html", HttpStatusCode.TooManyRequests // GitHub runner receives this often
"https://www.reddit.com/r/fsharp/", HttpStatusCode.Forbidden
|]

let printLock = Object()
let retryPipeline =
ResiliencePipelineBuilder()
Expand Down Expand Up @@ -90,7 +94,10 @@ let readmeFilePath = Path.Combine(__SOURCE_DIRECTORY__, "../README.md")

let markdown = File.ReadAllText(readmeFilePath)
let document = Markdown.Parse(markdown, trackTrivia = true)
let links = collectLinks document |> Seq.filter isNonLocalLink
let links =
collectLinks document
|> Seq.filter(fun x -> not(Set.contains x ignoredLinks))
|> Seq.filter isNonLocalLink

let results = Async.RunSynchronously(async {
use client = new HttpClient()
Expand Down