All versions since [0.3.0]
[0.3.0]
Added
http/paginate.jsdeclarative pagination middleware factory. Wrapslib/paginate.jsutilities into a pipeline-compatible middleware supporting offset and cursor strategies. Placed in Stage 1 (Negotiation) afterurl. Reads parsed query fromdomainAcc.url.queryand stores structured pagination parameters atacc.paginate. (#114)send()paginateoption. Whentrue, readsdomainAcc.paginateandresponseAcc.paginateto auto-generate RFC 8288 Link headers (first,prev,next,last) andX-Total-Countfor offset pagination responses. Supports both offset and cursor strategies. (#114)'paginate'added toSEND_RESERVEDto prevent pagination metadata from leaking as RFC 9457 extension members. (#114)errorFormatteroption forsend()andhandler(). Pluggable error body formatter forstatusCode >= 400responses. When provided, receives the RFC 9457 Problem Details object (plain object) and{requestId, statusCode, method}context. The return value becomes the response body, serialized asapplication/jsoninstead ofapplication/problem+json. Applies to both the main error path and 412 conditional responses (endWithProblem). Teams with existing error contracts can adopt ergo without changing their client-facing error format. (#110)redactErrorsoption forhandler(). Controls whether caught 5xx exception messages appear in the RFC 9457 responsedetailfield. Defaults totrue(secure — generic status text only). Set tofalseduring development to surfaceerr.messagein error responses without exposing stack traces. (#109)- Typed middleware options and results. All 21 middleware factory functions now have
hand-written
.d.tsoverrides intypes-override/http/with named options interfaces (AcceptsOptions,BodyOptions,CorsOptions,ValidateOptions, etc.) and precise return types. Consumers get autocomplete and type-checking for factory parameters and pipeline accumulator values withoutas anycasts. Import options/result types from@centralping/ergo/types. (#108) - New result type interfaces:
AuthorizationResult,TracingResult,IdempotencyResult. (#108) - New utility types:
AjvFormatName(26-member string literal union tracking ajv-formats 3.x),AuthorizationStrategy,ValidateSchemas,CookieJar(now includes jar methods). (#108) types-override/http/main.d.tsoverride provides typed re-exports for all middleware,httpErrors,fromConnect, andpaginatenamespace. (#108)
Changed
- Breaking:
paginateexport from@centralping/ergochanged fromlib/paginate.jsutility namespace ({parseOffsetParams, parseCursorParams, offsetResponse, cursorResponse}) tohttp/paginate.jsfactory function. Consumers usingpaginate.parseOffsetParams()must switch to deep import:import {parseOffsetParams} from '@centralping/ergo/lib/paginate'. (#114)
Fixed
envelopecallback type signature corrected. Changed from(body: unknown, statusCode: number) => unknownto(body: unknown, ctx: {requestId: string; statusCode: number; method: string}) => unknownto match the actual implementation which passes a context object, not a bare status code. AffectsSendOptionsandHandlerOptions. (#110)PreferResultnow matches runtime. Corrected from{[k: string]: {value?: string}}to{[k: string]: string | true}— the runtime returns flat preference values, not wrapped objects. (#108)CookieJarnow includes jar methods. Addedset(),get(),clear(),toHeader(),size, andisJarto match the actual cookie jar API. Previously typed as a bare index signature. (#108)LogEntrynow includes trace correlation fields. Added optionaltraceIdandspanIdproperties populated when the tracing middleware is active. (#108)
Removed
RateLimitResultremoved. The rate-limit middleware only returns{response: {headers}}— it never stores a domain accumulator value. The interface described a shape that did not exist at runtime. (#108)
[0.4.0]
Changed
- BREAKING: Middleware composition uses config objects instead of tuples. (#117)
Domain-producing middleware now uses
{fn, setPath}config objects instead of[fn, setPath]tuples. Response-only middleware (cors, securityHeaders, cacheControl, rateLimit, precondition, validate, jsonApiQuery) are plain functions — no wrapper needed.normalizeOp()now discriminates viatypeof op === 'function'(wasArray.isArray)MiddlewareTupletype renamed toMiddlewareOpwith{fn, setPath}shape- All 20 middleware inner functions are now named (
fn.nameprovides trace labels) - Migration:
[myFn(), 'key']→{fn: myFn(), setPath: 'key'}
Fixed
- handler.js JSDoc and
HandlerOptionstype now document thepaginateoption forwarded tosend(). (#118)
[0.4.1]
Added
- Factory-time option key validation with Levenshtein suggestions. (#126)
All 18 middleware factories now validate incoming option keys at factory invocation
time via a shared
lib/validate-options.jsutility. Unknown keys emit a deduplicatedprocess.emitWarningwith{type: 'ErgoWarning'}and a “did you mean?” suggestion when the Levenshtein edit distance is within threshold.handler()validates the union of its own keys andsend()keys;send()validates independently. timingoption onhandler()forX-Response-Timeheader. (#127) Passtiming: truefor defaults ortiming: {header?, precision?}for custom configuration. Measures the full request lifecycle (pipeline + error handling + send) via ares.writeHeadinterception. Zero overhead when disabled (default). Shared primitivelib/response-time.jsavailable for deep import by@centralping/ergo-router.
Changed
- README TypeScript Quick Start updated to reflect shipped type infrastructure. (#131)
Removed the forward-looking caveat about future type inference improvements — all
prerequisite features have shipped (compose overloads #87, typed middleware #108,
ergo-router accumulator inference ergo-router#91). Simplified the TS example by removing
the
AuthResultinterface and explicitIncomingMessage/ServerResponseimports. Replaced the caveat with a factual note explaining whenaccannotations are needed (standalonecompose()with interleaved bare functions) and directing users to@centralping/ergo-router’sdefineGet/definePosthelpers for annotation-free inference.