Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v5.0.0 #131

Merged
merged 166 commits into from
Jan 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
166 commits
Select commit Hold shift + click to select a range
754709b
Merge pull request #99 from pimbrouwers/master
pimbrouwers Dec 27, 2022
9d5736c
Fix jsonOptionsHandler example in response docs
markashleybell Jun 4, 2023
58d983b
Merge pull request #111 from markashleybell/json_doc_tweak
pimbrouwers Jul 15, 2023
dcf0542
Merge branch 'develop' of https://github.com/pimbrouwers/Falco into d…
pimbrouwers Jul 15, 2023
c298cf6
Merge branch 'master' into develop
pimbrouwers Feb 2, 2024
85cbd73
builders removed
pimbrouwers Feb 2, 2024
1e4ec6e
builders tests removed
pimbrouwers Feb 2, 2024
589a998
unnecessary extensions removed
pimbrouwers Feb 2, 2024
c5b09ee
unused usings removed
pimbrouwers Feb 2, 2024
06f51c0
config builder sample removed
pimbrouwers Feb 7, 2024
5b92765
seq replacing list where possible
pimbrouwers Feb 7, 2024
b1834a7
Response.withContentLength removed
pimbrouwers Feb 7, 2024
7bf3e1b
Response module updates
pimbrouwers Feb 7, 2024
d688f20
webhost builder and config builder docs removed
pimbrouwers Feb 16, 2024
4cb2025
net6.0 support removed
pimbrouwers Feb 16, 2024
6a0ee7e
sample updates
pimbrouwers Feb 20, 2024
34fae65
string collection reader "get children reader" test enhancement
pimbrouwers Feb 21, 2024
4de8170
cancellation tokens
pimbrouwers Mar 11, 2024
f8fdefb
sample projects
pimbrouwers Mar 11, 2024
fffeb6c
getchildren removed from StringCollectionReader
pimbrouwers Mar 11, 2024
721deeb
form value initial work
pimbrouwers Mar 13, 2024
9cacf0d
Merge branch 'form-value' of https://github.com/pimbrouwers/Falco int…
pimbrouwers Mar 13, 2024
5831ad0
form value initial work
pimbrouwers Mar 13, 2024
ac9bc30
formvalue conversion extensions
pimbrouwers Mar 13, 2024
756f3e9
hosting
pimbrouwers Mar 13, 2024
a337b0c
Falco App fluent api
pimbrouwers Mar 13, 2024
13b429b
tutorial project updates
pimbrouwers Mar 13, 2024
23c76b0
app service impl function
pimbrouwers Mar 13, 2024
88a4a58
further refinements of webapp builder
pimbrouwers Mar 14, 2024
986c1ac
app builder
pimbrouwers Mar 15, 2024
d4ba19f
changelog
pimbrouwers Mar 15, 2024
9b742b5
hello world sample
pimbrouwers Mar 17, 2024
d078b17
static members for app builder
pimbrouwers Mar 17, 2024
83057ce
formvalue option conversions
pimbrouwers Mar 18, 2024
24adf47
middleware activation order
pimbrouwers Mar 18, 2024
6ab2915
middleware activation order
pimbrouwers Mar 18, 2024
0553b14
merge conflict resolved
pimbrouwers Mar 18, 2024
5515d9a
net6 support removed
pimbrouwers Mar 19, 2024
62c18a5
webapp builder refinements
pimbrouwers Mar 19, 2024
475e7d8
forms model
pimbrouwers Mar 19, 2024
4ecbc7c
changelog
pimbrouwers Mar 19, 2024
3b4be80
forms removed
pimbrouwers Mar 20, 2024
aa46054
formvalue moved top-level namespace
pimbrouwers Mar 20, 2024
fcef81d
falco.security removed
pimbrouwers Mar 22, 2024
b65c683
App.route fix
pimbrouwers Mar 22, 2024
d4e58b9
indexed formvalue support
pimbrouwers Mar 22, 2024
6f1972f
Falco.Security namespace
pimbrouwers Mar 22, 2024
6ad5a55
RequestValue & RequestData facade
pimbrouwers Mar 26, 2024
aec1b5f
auth refinements
pimbrouwers Mar 27, 2024
18ad1b8
documentation
pimbrouwers Mar 27, 2024
22f427a
samples
pimbrouwers Mar 27, 2024
1764bf5
changelog
pimbrouwers Mar 27, 2024
f6a5e01
auth module removed
pimbrouwers Mar 28, 2024
10102b2
documentation
pimbrouwers Mar 28, 2024
c82e095
app builder
pimbrouwers Mar 28, 2024
30929bb
eliminated app builder
pimbrouwers Mar 29, 2024
d8f1835
readme
pimbrouwers Mar 29, 2024
865d9d6
samples
pimbrouwers Mar 29, 2024
9679c17
unusued deps removed
pimbrouwers Mar 29, 2024
b92f0ee
documentation
pimbrouwers Mar 29, 2024
41eaf98
requestdata ability to configure default value during conversion
pimbrouwers Mar 30, 2024
42f08b4
documentation
pimbrouwers Mar 30, 2024
85058a4
samples renamed to examples
pimbrouwers Mar 30, 2024
1835653
examples gitignore
pimbrouwers Mar 30, 2024
50571cb
changelog
pimbrouwers Mar 30, 2024
fddb378
get-started
pimbrouwers Mar 30, 2024
005b93d
documentation
pimbrouwers Mar 30, 2024
2e1726b
falco extension comments
pimbrouwers Mar 30, 2024
ea57196
relayering of exception handler extensions to make more user friendly
pimbrouwers Mar 30, 2024
e99af8b
hello world mvc doc
pimbrouwers Mar 30, 2024
004bfca
basic rest api example
pimbrouwers Mar 30, 2024
368d003
Request.getJson with default options
pimbrouwers Mar 30, 2024
6e6dac4
hello world dependency injection example
pimbrouwers Mar 30, 2024
b9640ab
documentation
pimbrouwers Mar 30, 2024
3e66057
documentation
pimbrouwers Mar 30, 2024
3e5a956
dependency injection example renamed
pimbrouwers Mar 30, 2024
bbc593b
sqlite basic rest api
pimbrouwers Mar 31, 2024
39c35d9
dependency injection examle doc
pimbrouwers Mar 31, 2024
2481b4a
basicrestapi connection string fix
pimbrouwers Mar 31, 2024
1e361fb
example doc external view engine
pimbrouwers Mar 31, 2024
ccbfabf
external view engine doc
pimbrouwers Apr 1, 2024
b49a8cf
webapplicationbuilder extensions
pimbrouwers Apr 1, 2024
6e67daa
example basic rest api evolved
pimbrouwers Apr 2, 2024
bc6cb4a
falco verb handlers removed
pimbrouwers Jul 29, 2024
c417ecd
changelog
pimbrouwers Aug 31, 2024
872a920
sample references to verb handlers removed
pimbrouwers Aug 31, 2024
d303798
readme
pimbrouwers Aug 31, 2024
7e20d05
internal method comments removed
pimbrouwers Aug 31, 2024
7b413cb
routing doc removed verb handlers
pimbrouwers Aug 31, 2024
2a1e968
tutorial removed
pimbrouwers Aug 31, 2024
77b369e
sln file
pimbrouwers Aug 31, 2024
b3edc79
documentation updates removing verb handler references
pimbrouwers Aug 31, 2024
3cc93a9
routing doc
pimbrouwers Aug 31, 2024
6666200
migration doc
pimbrouwers Sep 20, 2024
3123fee
config builder migration example
pimbrouwers Sep 22, 2024
18b5da5
migration doc
pimbrouwers Sep 22, 2024
bb583ab
signin and signout shortcuts
pimbrouwers Sep 22, 2024
efcf7f2
migration v4 to v5 doc
pimbrouwers Sep 22, 2024
d574b65
migration doc
pimbrouwers Sep 22, 2024
ee17725
5.0.0-alpha1
pimbrouwers Sep 22, 2024
8565aae
migration doc
pimbrouwers Sep 22, 2024
ed33b8f
Response.debugRequest removed
pimbrouwers Sep 22, 2024
4656b94
Add http method metadata to endpoint
sheridanchris Sep 27, 2024
e58d1a8
Merge pull request #127 from sheridanchris/multi-verb-routing-fix
pimbrouwers Sep 27, 2024
e172a13
alpha
pimbrouwers Oct 11, 2024
39b9873
changelog
pimbrouwers Oct 14, 2024
825ade7
readme
pimbrouwers Oct 14, 2024
cf1ab34
further open api specs
pimbrouwers Oct 14, 2024
08317d6
body, route and query metadata
pimbrouwers Oct 14, 2024
d0c72d1
falco open api
pimbrouwers Oct 16, 2024
d834bf6
requestvalue route including query
pimbrouwers Oct 16, 2024
ba71f92
mapJson return Option
pimbrouwers Oct 16, 2024
41e3200
json option changelog
pimbrouwers Oct 16, 2024
6635ef7
revert endpoint displayname concat char to space
pimbrouwers Oct 16, 2024
381c1dc
open api alpha complete
pimbrouwers Oct 16, 2024
d503d75
mapJson tests fix to accomodate option return
pimbrouwers Oct 16, 2024
93f2b95
openapi test stub
pimbrouwers Oct 16, 2024
0b0b7b3
apidescriptionprovider refactor
pimbrouwers Oct 17, 2024
ad83b84
request json mapping
pimbrouwers Oct 17, 2024
3056cd4
example updates
pimbrouwers Oct 17, 2024
226a35a
openapi moved to /pimbrouwers/falco.openapi
pimbrouwers Oct 17, 2024
7dcdbcc
mapjson tests
pimbrouwers Oct 17, 2024
e314f42
readme
pimbrouwers Oct 17, 2024
bbe1dfc
unused opens removed
pimbrouwers Oct 18, 2024
355e9d0
5.0.0-alpha4
pimbrouwers Oct 18, 2024
2b1d7bd
default route order of 0
pimbrouwers Oct 21, 2024
4293e71
5.0.0-alpha5
pimbrouwers Oct 21, 2024
a19d342
docs site built with falco.markup
pimbrouwers Oct 28, 2024
ffd08a6
separate authentication and xsrf docs
pimbrouwers Oct 28, 2024
ce1396e
integration tests
pimbrouwers Nov 1, 2024
601948b
request doc
pimbrouwers Nov 1, 2024
012e8bd
integration tests for dependency injection
pimbrouwers Nov 1, 2024
d156712
json body integration tests
pimbrouwers Nov 1, 2024
e1fdc81
5.0.0-beta1
pimbrouwers Nov 1, 2024
6eee7f2
readme
pimbrouwers Nov 5, 2024
a8b3b18
readme test
pimbrouwers Nov 5, 2024
ee44163
readme
pimbrouwers Nov 5, 2024
a282162
net9.0 support
pimbrouwers Nov 18, 2024
56104da
#129
pimbrouwers Nov 24, 2024
bbf7298
5.0.0beta3
pimbrouwers Nov 24, 2024
2bc71a2
#129
pimbrouwers Nov 25, 2024
555a649
5.0.0-beta4
pimbrouwers Nov 25, 2024
4285544
UseRouting removed from UseFalco
pimbrouwers Dec 9, 2024
f9b5905
5.0.0-beta5
pimbrouwers Dec 9, 2024
ae19e78
beta5 doc updates
pimbrouwers Dec 13, 2024
c9fd077
documentation
pimbrouwers Dec 13, 2024
5dace4a
helloworldmvc tweaks
pimbrouwers Dec 13, 2024
c95a7d3
external view engine tweaks
pimbrouwers Dec 13, 2024
d75bb30
5.0.0-rc1
pimbrouwers Dec 17, 2024
0411673
hello world simplify
pimbrouwers Jan 24, 2025
f5fd645
webapplication.run extension
pimbrouwers Jan 24, 2025
b2b3589
implementing new run extension
pimbrouwers Jan 24, 2025
9741f15
changelog
pimbrouwers Jan 25, 2025
1f393d5
5.0.0-rc2
pimbrouwers Jan 25, 2025
19f3a54
readme
pimbrouwers Jan 25, 2025
d454b3a
5.0.0 site rebuild
pimbrouwers Jan 28, 2025
2c8740b
net9 build.yml
pimbrouwers Jan 28, 2025
e91e1b9
build.yml multiversion
pimbrouwers Jan 28, 2025
df9213f
request data primitive parsing, explicit date instead of now
pimbrouwers Jan 28, 2025
6d93e78
requestdata tests datetimeoffset parseexact
pimbrouwers Jan 28, 2025
9f3765b
stringparser using invariant culture for datetime, float and timespan
pimbrouwers Jan 28, 2025
d47b343
requestdatat tests invariant culture
pimbrouwers Jan 28, 2025
bae3808
requestdata tests datetime and datetimeoffset using round trip specifier
pimbrouwers Jan 29, 2025
53393ab
datetimestyles.roundtripkind
pimbrouwers Jan 29, 2025
b70a734
temporarily disabling datetimeoffset tests due to limitation on linux
pimbrouwers Jan 29, 2025
07a9a87
5.0.0
pimbrouwers Jan 29, 2025
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
18 changes: 10 additions & 8 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,15 @@ on:
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
dotnet-version: ['8.0.x']
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4

- name: Setup .NET Core SDK ${{ matrix.dotnet-version }}
uses: actions/setup-dotnet@v3
- name: Setup .NET Core SDK
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ matrix.dotnet-version }}
dotnet-version: |
8.0.x
9.0.x

- name: Install dependencies
run: dotnet restore src/Falco
Expand All @@ -26,4 +25,7 @@ jobs:
run: dotnet build src/Falco -c Release

- name: Test
run: dotnet test test/Falco.Tests -c Release
run: dotnet test test/Falco.Tests -c Release

- name: Integration Test
run: dotnet test test/Falco.IntegrationTests -c Release
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@
*.user
*.userosscache
*.sln.docstates
[Ss]amples/[Ss]andbox/
[Ee]xamples/[Ss]andbox/
[Ss]andbox/
*.sqlite
[Mm]emory

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
Expand Down Expand Up @@ -354,3 +356,5 @@ MigrationBackup/

# Rider (JetBrain's cross-platform .NET IDE) working folder
.idea/
.vscode/launch.json
.vscode/launch.json
34 changes: 20 additions & 14 deletions Build.ps1
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
[CmdletBinding()]
param (
[Parameter(HelpMessage="The action to execute.")]
[ValidateSet("Build", "Test", "Pack", "BuildSite", "DevelopSite")]
[ValidateSet("Build", "Test", "IntegrationTest", "Pack", "BuildSite", "DevelopSite")]
[string] $Action = "Build",

[Parameter(HelpMessage="The msbuild configuration to use.")]
[ValidateSet("Debug", "Release")]
[string] $Configuration = "Debug",

[switch] $SkipClean
[switch] $NoRestore,

[switch] $Clean
)

function RunCommand {
Expand All @@ -22,23 +24,27 @@ $srcDir = Join-Path -Path $rootDir -ChildPath 'src'
$testDir = Join-Path -Path $rootDir -ChildPath 'test'

switch ($Action) {
"Test" { $projectdir = Join-Path -Path $testDir -ChildPath 'Falco.Tests' }
"Pack" { $projectDir = Join-Path -Path $srcDir -ChildPath 'Falco' }
"BuildSite" { $projectDir = Join-Path -Path $rootDir -ChildPath 'site' }
"DevelopSite" { $projectDir = Join-Path -Path $rootDir -ChildPath 'site' }
Default { $projectDir = Join-Path -Path $srcDir -ChildPath 'Falco' }
"Test" { $projectdir = Join-Path -Path $testDir -ChildPath 'Falco.Tests' }
"IntegrationTest" { $projectdir = Join-Path -Path $testDir -ChildPath 'Falco.IntegrationTests' }
"Pack" { $projectDir = Join-Path -Path $srcDir -ChildPath 'Falco' }
"BuildSite" { $projectDir = Join-Path -Path $rootDir -ChildPath 'site' }
"DevelopSite" { $projectDir = Join-Path -Path $rootDir -ChildPath 'site' }
Default { $projectDir = Join-Path -Path $srcDir -ChildPath 'Falco' }
}

if (!$SkipClean.IsPresent)
{
if(!$NoRestore.IsPresent) {
RunCommand "dotnet restore $projectDir --force --force-evaluate --nologo --verbosity quiet"
}

if ($Clean) {
RunCommand "dotnet clean $projectDir -c $Configuration --nologo --verbosity quiet"
}

switch ($Action) {
"Test" { RunCommand "dotnet test `"$projectDir`"" }
"Pack" { RunCommand "dotnet pack `"$projectDir`" -c $Configuration --include-symbols --include-source" }
"BuildSite" { RunCommand "dotnet build `"$projectDir`" -t:Generate" }
"DevelopSite" { RunCommand "dotnet build `"$projectDir`" -t:Develop" }
Default { RunCommand "dotnet build `"$projectDir`" -c $Configuration" }
"Test" { RunCommand "dotnet test `"$projectDir`"" }
"IntegrationTest" { RunCommand "dotnet test `"$projectDir`"" }
"Pack" { RunCommand "dotnet pack `"$projectDir`" -c $Configuration --include-symbols --include-source" }
"BuildSite" { RunCommand "dotnet build `"$projectDir`" -t:Generate" }
"DevelopSite" { RunCommand "dotnet build `"$projectDir`" -t:Develop" }
Default { RunCommand "dotnet build `"$projectDir`" -c $Configuration" }
}
46 changes: 46 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,52 @@

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

## [5.0.0] - 2025-01-28

### Added

- Declarative OpenAPI support.
- `RequestData` (and `RequestValue`) to support complex form & query submissions,
- Provided by an HTTP key/value pair (i.e., `name=falco&classification=toolkit`) parser.
- A derivative `FormData` contains parsed `RequestValue` and access to `IFormFileCollection`.
- `HttpContext.Plug<T>` for generic injection support of dependencies within `HttpHandler`'s (service locator pattern).
- `Request.getJson<T>` for generic JSON request deserialization, using default settings (property name case-insensitive, trailing commas allowed).
- `Request.getCookies`, replacing `Request.getCookie`.
- `Response.signInOptions` to sign in claim principal for provided scheme and options then responds with a 301 redirect to provided URL.
- `Response.challengeAndRedirect`, replacing `Response.challengeWithRedirect`.
- `Routing.map[Get|Head|Post|Put|Patch|Delete|Options|Trace|Any]` which produces `HttpEndpoint` by associating a route pattern to an `HttpHandler` after mapping route.
- `Routing.setDisplayName` to set the display name of the endpoint.
- `Routing.setOrder` to set the order number of the endpoint.
- `WebApplication.run`, registers the provided `HttpHandler` as the terminal middleware and runs the application.

### Changed

- `Xss` module renamed to `Xsrf`. Functions: `Xsrf.antiforgeryInput`, `Xsrf.getToken` & `Xsrf.validateToken`.


### Fixed

- Missing cancellation token pass-through during form reading, `multipart/form-data` streaming and JSON serialization/deserialization.
- Empty request body support for JSON request methods.
- `WebApplication.UseFalcoNotFound` & `IApplicationBuilder.UseFalcoNotFound` to correctly terminate by returning `unit` akin to the native method.

### Removed

- `net6.0` support dropped (end of life 2024-11-12).
- `webHost [||] {}` builder removed.
- `config {}` builder removed.
- `HttpContext.GetLogger<T>()` extension removed.
- `IApplicationBuilder.IsDevelopment()`, `IApplicationBuilder.UseWhen()` extensions removed.
- `Services.inject<T>` (and overloads) removed.
- `Response.withContentLength` removed (unsupported).
- `StringCollectionReader` and derivatives removed (`FormCollectionReader`, `QueryCollectionReader`, `RouteCollectionReader`, `HeaderCollectionReader`, and `CookieCollectionReader`).
- All replaced by homogenous `RequestData` type.
- `Request.streamForm`, `Request.streamFormSecure`, `Request.mapFormStream` and `Request.mapFormStreamSecure` removed.
- `Falco.Security.Crypto` and `Falco.Security.Auth` modules removed.
- Removed `Request.getCookie`, renamed `Request.getCookies`.
- Removed `Response.challengeWithRedirect`, renamed `Response.challengeAndRedirect`.
- Removed `Response.debugRequest`.

## [4.0.6] - 2023-12-12

- `net7.0` and `net8.0` support added.
Expand Down
43 changes: 43 additions & 0 deletions Falco.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{0DDD542C-01AF-4E41-96C8-C8294378CB09}"
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Falco", "src\Falco\Falco.fsproj", "{5906904E-00A0-4ED3-8E7A-85B7A7A1A7C9}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{A56030AE-D35C-4EA6-A089-E7950A8DBDBF}"
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Falco.IntegrationTests", "test\Falco.IntegrationTests\Falco.IntegrationTests.fsproj", "{D9E5D9CF-D7A8-4DBF-87C0-49FDD3C62848}"
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Falco.IntegrationTests.App", "test\Falco.IntegrationTests.App\Falco.IntegrationTests.App.fsproj", "{6BB75729-1E0C-4936-A255-FA2B55CF22BD}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{5906904E-00A0-4ED3-8E7A-85B7A7A1A7C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5906904E-00A0-4ED3-8E7A-85B7A7A1A7C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5906904E-00A0-4ED3-8E7A-85B7A7A1A7C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5906904E-00A0-4ED3-8E7A-85B7A7A1A7C9}.Release|Any CPU.Build.0 = Release|Any CPU
{D9E5D9CF-D7A8-4DBF-87C0-49FDD3C62848}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D9E5D9CF-D7A8-4DBF-87C0-49FDD3C62848}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D9E5D9CF-D7A8-4DBF-87C0-49FDD3C62848}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D9E5D9CF-D7A8-4DBF-87C0-49FDD3C62848}.Release|Any CPU.Build.0 = Release|Any CPU
{6BB75729-1E0C-4936-A255-FA2B55CF22BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6BB75729-1E0C-4936-A255-FA2B55CF22BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6BB75729-1E0C-4936-A255-FA2B55CF22BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6BB75729-1E0C-4936-A255-FA2B55CF22BD}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{5906904E-00A0-4ED3-8E7A-85B7A7A1A7C9} = {0DDD542C-01AF-4E41-96C8-C8294378CB09}
{D9E5D9CF-D7A8-4DBF-87C0-49FDD3C62848} = {A56030AE-D35C-4EA6-A089-E7950A8DBDBF}
{6BB75729-1E0C-4936-A255-FA2B55CF22BD} = {A56030AE-D35C-4EA6-A089-E7950A8DBDBF}
EndGlobalSection
EndGlobal
61 changes: 27 additions & 34 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,55 +5,49 @@

```fsharp
open Falco
open Falco.Routing
open Falco.HostBuilder

webHost [||] {
endpoints [
get "/" (Response.ofPlainText "Hello World")
]
}
open Microsoft.AspNetCore.Builder

let wapp = WebApplication.Create()

wapp.Run(Response.ofPlainText "Hello world")
```

[Falco](https://github.com/pimbrouwers/Falco) is a toolkit for building fast and functional-first web applications using F#.
[Falco](https://github.com/pimbrouwers/Falco) is a toolkit for building fast and functional-first web applications using F#. You can think of it as [minimal API](https://learn.microsoft.com/en-us/aspnet/core/tutorials/min-web-api?view=aspnetcore-8.0&tabs=visual-studio) on *steroids*.

- Built upon the high-performance components of ASP.NET Core.
- Optimized for building HTTP applications quickly.
- Designed for building pure F# full-stack web applications.
- Built on the high-performance components of ASP.NET Core.
- Seamlessly integrates with existing .NET Core middleware and libraries.

## Key Features

- Asynchronous [request handling](https://github.com/pimbrouwers/Falco/tree/master/documentation/response.md).
- Simple and powerful [routing](https://github.com/pimbrouwers/Falco/tree/master/documentation/routing.md) API.
- Fast, secure and configurable [web server](https://github.com/pimbrouwers/Falco/tree/master/documentation/host.md).
- Native F# [view engine](https://github.com/pimbrouwers/Falco.Markup).
- Uniform API for [accessing request data](https://github.com/pimbrouwers/Falco/tree/master/documentation/request.md).
- [Authentication and security](https://github.com/pimbrouwers/Falco/tree/master/documentation/security.md) utilities.
- Built-in support for [large uploads](https://github.com/pimbrouwers/Falco/tree/master/documentation/request.md#multipartform-data-binding) and [binary responses](https://github.com/pimbrouwers/Falco/tree/master/documentation/response.md#content-disposition).
- Simple and powerful [routing](documentation/routing.md) API.
- Uniform API for [accessing _any_ request data](documentation/request.md).
- Native F# [view engine](documentation/markup.md).
- Asynchronous [request handling](documentation/response.md).
- [Authentication](documentation/authentication.md) and [security](documentation/cross-site-request-forgery.md) utilities.
- Built-in support for [large uploads](documentation/request.md#multipartform-data-binding) and [binary responses](documentation/response.md#content-disposition).


## Design Goals

- Provide a toolset to build a working full-stack web application.
- Provide a toolset to build full-stack web application in F#.
- Should be simple, extensible and integrate with existing .NET libraries.
- Can be easily learned.

## Learn

The best way to get started is by visiting the [documentation](https://falcoframework.com/docs). For questions and support please use [discussions](https://github.com/pimbrouwers/Falco/discussions). The issue list of this repo is **exclusively** for bug reports and feature requests. For chronological updates refer to the [changelog](CHANGELOG.md) is the best place to find chronological updates.

If you want to stay in touch, feel free to reach out on [Twitter](https://twitter.com/falco_framework).
## Learn

Have an article or video that you want to share? We'd love to hear from you! To add your content, visit this [discussion](https://github.com/pimbrouwers/Falco/discussions/82).
The best way to get started is by visiting the [documentation](https://falcoframework.com/docs). For questions and support please use [discussions](https://github.com/pimbrouwers/Falco/discussions). For chronological updates refer to the [changelog](CHANGELOG.md) is the best place to find chronological updates.

### Related Libraries

- [Falco.Markup](https://github.com/pimbrouwers/Falco.Markup) - an XML markup module primary used as the syntax for [authoring HTML with Falco](https://www.falcoframework.com/docs/markup.html).
- [Falco.Htmx](https://github.com/dpraimeyuu/Falco.Htmx) - a full featured integration with [htmx JS package](https://htmx.org/).
- [Falco.OpenApi](https://github.com/pimbrouwers/Falco.OpenApi) - a library for generating OpenAPI documentation from Falco applications.
- [Falco.Template](https://github.com/pimbrouwers/Falco.Template) - a .NET SDK [project template](https://learn.microsoft.com/en-us/dotnet/core/tools/custom-templates) to help get started with Falco quickly.
- [Falco.Htmx](https://github.com/dpraimeyuu/Falco.Htmx) - An experimental Falco integration with [htmx JS package](https://htmx.org/).

### Community Projects

- [FalcoJournal](https://github.com/pimbrouwers/FalcoJournal) - A bullet journal built with Falco, .NET 5.x and ASP.NET Core.
- [Falco GraphQL Sample](https://github.com/adelarsq/falco_graphql_sample) - A sample showing how to use GraphQL on Falco using .NET 6.
- [Falco API with Tests Sample](https://github.com/jasiozet/falco-api-with-tests-template) - A sample project using Falco and unit testing.
- [Falco + SQLite + Donald](https://github.com/galassie/FalcoSample) - A demo project using Falco, [Donald](https://github.com/pimbrouwers/Donald), and SQLite
Expand All @@ -67,29 +61,28 @@ Have an article or video that you want to share? We'd love to hear from you! To

- Ben Gobeil - [Why I'm Using Falco Instead Of Saturn | How To Switch Your Backend In SAFE Stack | StonkWatch Ep.13](https://youtu.be/DTy5gIUWvpo)

## Contribute

Thank you for considering contributing to Falco, and to those who have already contributed! We appreciate (and actively resolve) PRs of all shapes and sizes.
## Contribute

We kindly ask that before submitting a pull request, you first submit an [issue](https://github.com/pimbrouwers/Falco/issues) or open a [discussion](https://github.com/pimbrouwers/Falco/discussions).

If functionality is added to the API, or changed, please kindly update the relevant [document](docs). Unit tests must also be added and/or updated before a pull request can be successfully merged.

If functionality is added to the API, or changed, please kindly update the relevant [document](https://github.com/pimbrouwers/Falco/tree/master/docs). Unit tests must also be added and/or updated before a pull request can be successfully merged.

All pull requests should originate from the `develop` branch. A merge into this branch means that your changes are scheduled to go into production with the very next release, which could happen any time from the same day up to a couple weeks (depending on priorities and urgency).

Only pull requests which pass all build checks and comply with the general coding guidelines can be approved.
Only pull requests which pass all build checks and comply with the general coding standard can be approved.

If you have any further questions, submit an [issue](https://github.com/pimbrouwers/Falco/issues) or open a [discussion](https://github.com/pimbrouwers/Falco/discussions) or reach out on [Twitter](https://twitter.com/falco_framework).


## Why "Falco"?

[Kestrel](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel) has been a game changer for the .NET web stack. In the animal kingdom, "Kestrel" is a name given to several members of the falcon genus. Also known as "Falco".


## Find a bug?

There's an [issue](https://github.com/pimbrouwers/Falco/issues) for that.


## License

Built with ♥ by [Pim Brouwers](https://github.com/pimbrouwers) in Toronto, ON. Licensed under [Apache License 2.0](https://github.com/pimbrouwers/Falco/blob/master/LICENSE).
Licensed under [Apache License 2.0](https://github.com/pimbrouwers/Falco/blob/master/LICENSE).
Loading