Changelog
Notable changes in each release.
All notable changes to ArturRios.Output are recorded in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
3.3.0 - 2026-10-13
Added
- Token pagination:
PaginateByTokenandPaginateByTokenAsyncpage anIQueryable<T>by signed continuation token instead of page number. Each page resumes after the previous one with a keyset filter (WHERE key > @lastKey), so deep pages stay fast, rows added or removed between requests are neither repeated nor skipped, and the count query is skipped unlessincludeTotalCountis set. Overloads take a tiebreaker for keys that repeat, and aSortDirection. - Tokens are HMAC-SHA256 signed, so a caller can only reach a page with the token issued by the page before it:
an edited or forged token is rejected.
PageTokenOptionscarries the signing key, an optionalLifetimeand an optionalScopethat binds tokens to one listing. A rejected token returns an empty output carrying one of thePageTokenErrors(Invalid,Expired,Mismatch) instead of throwing. PaginatedOutput<T>.NextPageToken,HasNextPageandWithNextPageToken.
Fixed
PaginateandPaginateAsyncreturn an empty page when(pageNumber - 1) * pageSizedoes not fit in anint. The offset used to overflow, usually to a negative number that LINQ and SQLite treat as no offset, so a request for a far-out page (for examplepageNumber = int.MaxValue) came back holding the first page’s items.
3.2.0 - 2026-08-24
Changed
PaginateAsyncstrips theConvert(..., Object)node from theorderByexpression before ordering, asPaginatealready did, so a relational provider can translate a value-type ordering key to SQL.PaginateandPaginateAsyncagree on a suppliedtotalCount: it is clamped to a minimum of0, reported verbatim asTotalItems, and never suppresses the page query. The empty-result short circuit applies only when the count was computed by the method itself.PaginateandPaginateAsyncthrowArgumentNullExceptionfor anullquery.AddErrors/AddMessages, and the fluentWithErrors/WithMessages, accept anullcollection and ignore it.Microsoft.EntityFrameworkCoreupdated from 10.0.10 to 10.0.11.
3.1.0 - 2026-07-23
Changed
Data,Messages,Errors,TimestampandPageSizehave public setters, and the[JsonInclude]attributes are gone, so the output types round-trip underNewtonsoft.Jsonas well asSystem.Text.Json, in both cross-serializer directions.Microsoft.EntityFrameworkCoreupdated from 10.0.1 to 10.0.10.
Fixed
MessagesandErrorsare nevernull: assigningnull— as a deserializer does for an explicit"errors": null— resets them to an empty list instead of makingSuccessthrow.
3.0.0 - 2026-07-23
Changed
- Breaking:
PaginatedOutput.WithPaginationtakes the page size as its second argument:WithPagination(pageNumber, pageSize, totalItems). - Breaking:
PaginatedOutput.PageSizeis the requested page size rather than the number of items in the current page, andTotalPagesis0when no page size has been set. Microsoft.EntityFrameworkCoreupdated from 9.0.10 to 10.0.1.
Fixed
ProcessOutputandDataOutputround-trip throughSystem.Text.Json; deserializing used to produce an empty envelope regardless of the JSON.TotalPageswas wrong on a partial last page and saturated toint.MaxValueon an empty page.
2.0.1 - 2025-12-04
Changed
- Package metadata and the README shipped in the package refreshed. No library code changes.
2.0.0 - 2025-11-25
Changed
- Package version moved to 2.0.0. No library code changes from 1.0.2.
1.0.2 - 2025-11-25
Changed
- Targets
net10.0instead ofnet8.0.
1.0.1 - 2025-11-12
Added
ProcessOutput,DataOutput<T>andPaginatedOutput<T>to return messages, errors and typed or paginated payloads, with fluent helpers.CustomException, a base exception carrying several messages.PaginateandPaginateAsyncextension methods to paginate anIQueryable<T>into aPaginatedOutput<T>.