All notable changes to this project are documented here.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
The NeoReports.Abstractions contract follows SemVer strictly.
1.1.0 - 2026-07-01
The dynamic (config-driven) path: define and run reports from JSON with no compile-time POCO, reusing the exact v1 pipeline. Additive and SemVer-minor — v1 code is unchanged.
NeoReports.Abstractions— positionalReportRecord(object?[]+ReportSchema) as the dynamic row type (not a dictionary); serializer-agnostic config model (ReportConfig,SourceConfig,ColumnConfig,OutputConfig,DestinationConfig);IReportConfigParserandIConfigSourceProvidercontracts.NeoReports.Core—JsonReportConfigParser(System.Text.Json) andReportConfigCompilerthat compile a config into the same runnable report the fluent builder produces (source, format and destination resolved from DI by stable id);ReportColumns.Positional(...)for dynamic columns;JsonLogicFilter(a lean JsonLogic evaluator:var,==/===/!=/!==,>/>=/</<=,and/or/!/!!,in); DI helpersAddReportFromConfig,AddReportFromConfigFileandAddReportsFromConfigDirectory(config reports compile lazily and run by name through the standard runner and endpoints).NeoReports.Sources.Sql—SqlConfigSourceProvider(type: "sql") andAddSqlConfigSource(): config-driven SQL Server source materializingReportRecords by schema-column name, reusing the v1 keyset engine.- Samples
04-dynamic-config-csv(in-memory) and05-dynamic-config-sql(SQL Server).
1.0.0 - 2026-06-30
First public release.
NeoReports.Abstractions— frozen, typed-only public contract (schema, data, sources, formats, destinations, resilience, jobs, extensibility, exceptions).NeoReports.Core— fluentReportBuilder<TRow>, report registry and DI (AddReport<TRow>), batch pipeline with compiledT → object?[]projection at the writer edge, Polly v8 resilience, andIFailureStrategy(abort / skip-and-log) with escalation thresholds.NeoReports.Sources.Sql— SQL Server source with keyset pagination (Source.Sql(...).Keyset(...)), opaque string cursor, per-page connections.NeoReports.Formats.Csv— streaming CSV writer (RFC 4180, culture/format, configurable delimiter/encoding/header).NeoReports.Formats.Xlsx— XLSX writer (ClosedXML) with native types, named sheet, and auto-filter.NeoReports.Destinations.Local— local filesystem destination with path templating and atomic publish.NeoReports.Destinations.S3— Amazon S3 destination with all-or-nothing upload.NeoReports.Jobs— single-worker job execution: sharedReportJobWorker, in-memory store and scheduler, no-op checkpoint store; cooperative cancellation and idempotent restart.NeoReports.Jobs.Hangfire— Hangfire single-server job backend.NeoReports.AspNetCore— Minimal API endpoints to trigger (async/sync), list, query, cancel and download reports/jobs; artifact store for download/sync.- Multi-output in a single source pass (e.g. CSV + XLSX read once); same-extension outputs are disambiguated and can be downloaded together as a zip.
- Constant-memory validation via
NeoReports.Benchmarks(MemoryDiagnoser). - Samples
01-sql-to-csv-local,02-sql-to-xlsx-s3, and03-async-job-hangfire.
- All library projects ship as NuGet packages with symbols (
snupkg), source-link, and a per-package README. Tests, samples and benchmarks are not packable.