EastFive.Core
1.0.0-preview-0035
dotnet add package EastFive.Core --version 1.0.0-preview-0035
NuGet\Install-Package EastFive.Core -Version 1.0.0-preview-0035
<PackageReference Include="EastFive.Core" Version="1.0.0-preview-0035" />
<PackageVersion Include="EastFive.Core" Version="1.0.0-preview-0035" />
<PackageReference Include="EastFive.Core" />
paket add EastFive.Core --version 1.0.0-preview-0035
#r "nuget: EastFive.Core, 1.0.0-preview-0035"
#:package EastFive.Core@1.0.0-preview-0035
#addin nuget:?package=EastFive.Core&version=1.0.0-preview-0035&prerelease
#tool nuget:?package=EastFive.Core&version=1.0.0-preview-0035&prerelease
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
- Local override:
Secrets:{generated-name}in the values store — written only inappsettings.local*.jsonor the environment (Secrets__AzureStorage-dev-ConnectionString). - The environment's vaults, in order: one
SecretClientper 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 | Versions 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. |
-
net10.0
- Microsoft.Extensions.Configuration.Abstractions (>= 9.0.1)
- Microsoft.Extensions.Configuration.Binder (>= 9.0.1)
- Microsoft.IdentityModel.Tokens (>= 6.36.0)
- Newtonsoft.Json (>= 13.0.3)
- SixLabors.ImageSharp (>= 3.1.11)
- System.Configuration.ConfigurationManager (>= 9.0.1)
- System.Drawing.Common (>= 9.0.1)
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 |