EastFive.Core 1.0.0-preview-0035

This is a prerelease version of EastFive.Core.
dotnet add package EastFive.Core --version 1.0.0-preview-0035
                    
NuGet\Install-Package EastFive.Core -Version 1.0.0-preview-0035
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="EastFive.Core" Version="1.0.0-preview-0035" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="EastFive.Core" Version="1.0.0-preview-0035" />
                    
Directory.Packages.props
<PackageReference Include="EastFive.Core" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add EastFive.Core --version 1.0.0-preview-0035
                    
#r "nuget: EastFive.Core, 1.0.0-preview-0035"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package EastFive.Core@1.0.0-preview-0035
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=EastFive.Core&version=1.0.0-preview-0035&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=EastFive.Core&version=1.0.0-preview-0035&prerelease
                    
Install as a Cake Tool

EastFive

Functional-programming libraries for .NET: a composable core (TResult continuations, IEnumerableAsync, attribute-interface IoC), an attribute-routed REST API framework, Azure persistence/auth/integration bindings, spreadsheet tooling, and Roslyn source generators.

Package Description
EastFive.Core Functional primitives, LINQ extensions, async collections, configuration, reflection
EastFive.Api Attribute-routed HTTP API framework for ASP.NET Core
EastFive.Azure Azure Storage/Table persistence, auth (OAuth/SAML/Ping), integrations
EastFive.Sheets XLSX/CSV reading and writing
EastFive.Generators Roslyn source generators (flow extensions, storage query helpers, test harness)

All packages ship one shared version, MIT-licensed, with embedded PDBs and embedded source (step-into debugging works without symbol servers).

This mono-repo supersedes the former EastFive.Core, EastFive.Api, EastFive.Azure, EastFive.Sheets, and EastFive.Generators repositories; their histories are preserved under src/.

Build

dotnet build EastFive.sln
dotnet test EastFive.sln   # Azure tests require a running Azurite

Configuration and secrets

EastFive reads configuration from two stores and never mixes them.

Store What Where
Values Non-secret settings: endpoints, ids, account names, flags IConfiguration (appsettings files, environment), initialized with ConfigurationExtensions.Initialize
Secrets Keys, client secrets, connection strings ISecretStore, queried by name — never an IConfiguration provider

Typed configuration is the only way to read a secret

Every setting a feature needs is a property of an IProvideConfiguration type. Values are declared with their key; secrets are declared without one:

[ConfigurationType("Telnyx")]
public sealed class TelnyxConfiguration : IProvideConfiguration
{
    [ConfigurationMember("Telnyx.Account", Account = true, Label = "Account")]
    public string Account { get; set; }

    [ConfigurationMember(Kind = ConfigurationMemberKind.Secret, Label = "API key")]
    public Secret ApiKey { get; set; }
}

var outcome = await ConfigurationLoader.LoadAsync<TelnyxConfiguration, TResult>(
    onConfigured, onMissing, onInvalid, onSourceFailure);

ConfigurationString and friends are for values only; a guard test in each framework test project fails if one reads a secret. Secret has no public value: Reveal() it at the point of use, and never into a log, an exception or a response.

Generated secret names

Secret names are never hand-written. {Type}-{Account}-{Property} for a type with an account member, {Type}-{Property} otherwise: Type is the [ConfigurationType] name, Account the account member's value, Property the secret member's property name. Names are valid Azure Key Vault secret names ([A-Za-z0-9-]); an account id that would not be is refused, never mapped — unless the account member declares an exact, type-specific translation with an attribute implementing IProvideSecretAccountSegment (Google client ids drop their constant .apps.googleusercontent.com domain). The translated segment is still validated. Types that share a [ConfigurationType] and an account share one secret — every StorageAccountConfiguration on account prod reads AzureStorage-prod-ConnectionString.

ConfigurationCatalog.For(assemblies) lists every configuration type with its members, metadata (label, description, location, scope, field kind) and generated names; editors and doctors render from it. IProvideConfigurationLookup and ITestConfiguration are the attribute-interface hooks for choices and live checks of a ConfigurationDraft.

Where secrets come from

A host initializes SecretStore.Current next to ConfigurationExtensions.Initialize, typically:

SecretStore.Initialize(new CompositeSecretStore(
    new ConfigurationSecretOverrides(ConfigurationLoader.ReadAmbient),   // Secrets:{name}
    KeyVaultSecretStore.From(vaults)));                                 // the environment's vaults, in order
  1. Local override: Secrets:{generated-name} in the values store — written only in appsettings.local*.json or the environment (Secrets__AzureStorage-dev-ConnectionString).
  2. The environment's vaults, in order: one SecretClient per vault, managed identity when deployed, a service principal (KeyVaultAccess) locally. 404 falls through to the next vault; any other error is a failure, so an outage is never read as "unset". Found and missing answers are cached per name for 30 minutes.

Until a host initializes it, SecretStore.Current is the local overrides alone.

Synchronous readers: load at startup

Loading a type with secret members is asynchronous. Code that cannot await — attributes, the storage driver factory, token signing — reads a configuration the host loaded once at startup:

await StartupConfiguration.LoadAsync(new[] { typeof(EastFive.Azure.AppSettings).Assembly, /* … */ });
StartupConfiguration.Get<TokenSigningConfiguration, TResult>(onLoaded, onUnavailable);   // never loads, never blocks

A type the host did not load answers ConfigIssueCategory.NotLoaded. RefreshEveryAsync re-reads the loaded types on an interval to pick up rotated secrets.

Storage

A store is named by its StorageAccountConfiguration type (StorageAccount.Tables, StorageAccount.Of<T>()); its account comes from <Store>.Account and its credential from AzureStorage-{account}-ConnectionString. The emulator account devstoreaccount1 is fabricated from Azure.Storage.Emulator.Port and never read from the secret store.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (3)

Showing the top 3 NuGet packages that depend on EastFive.Core:

Package Downloads
EastFive.Api

Package Description

EastFive.Azure

Package Description

EastFive.Sheets

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.0-preview-0035 38 10/23/2026
1.0.0-preview-0033 51 10/23/2026
1.0.0-preview-0021 503 9/15/2026
1.0.0-preview-0019 93 9/15/2026
1.0.0-preview-0017 94 9/11/2026
1.0.0-preview-0016 106 9/5/2026
1.0.0-preview-0015 108 9/3/2026
1.0.0-preview-0014 161 9/2/2026
1.0.0-preview-0008 105 8/28/2026
1.0.0-preview-0007 112 8/25/2026