All versions since [0.4.0]
[0.4.0]
Changed
- BREAKING: Pipeline builder uses config objects instead of tuples. (#83)
Aligned with
@centralping/ergo@0.4.0compose-with API change. Domain-producing middleware now uses{fn, setPath}config objects. Response-only middleware (rateLimit, precondition, securityHeaders, cacheControl, validate, jsonApiQuery) are plain functions.RouteConfig.useacceptsArray<function|{fn: function, setPath: string}>. Requires@centralping/ergo >= 0.4.0 < 0.5.0.
Fixed
- Transport
Referrer-Policydefault aligned with shared primitive. ChangedTRANSPORT_DEFAULTS.referrerPolicyfrom'strict-origin-when-cross-origin'to'no-referrer', matching@centralping/ergo’slib/security-headers.jsdefault, the pipeline middleware, and all website documentation. Added contract test forReferrer-Policyheader. (#80) - Generic propagation to route methods. Router route methods (
get,post,put,patch,delete) now propagate theRouteConfig<A>generic type parameter, allowing TypeScript consumers to pass typed route configs with fulldomainAccinference inexecutecallbacks. Previously, route methods accepted onlyRouteConfig(defaulting toRecord<string, unknown>), which caused type errors understrictFunctionTypeswhen passingRouteConfig<SpecificType>. The defaultA = Record<string, unknown>preserves backward compatibility. (#79)
[0.4.1]
Added
-
Accumulator type inference via
defineGet/definePost/defineRoutehelpers. (#91) New exported functions that infer the domain accumulator type from enabled middleware config keys, providing fully typedaccin execute callbacks without manual generic annotation.defineGetauto-includes{url: UrlResult}for GET/DELETE;definePostauto-includes{body: BodyResult}for POST/PUT/PATCH;defineRouteis method-agnostic. Keys set tofalsecorrectly suppress their accumulator type.paginatetransitively includes URL types.import {defineGet} from '@centralping/ergo-router';router.get('/users/:id', defineGet({authorization: true, url: true},(req, res, acc) => {acc.auth; // AuthorizationResultacc.url.query; // Record<string, string | string[]>acc.route.params; // Record<string, string>}));Known limitation: Middleware enabled via
createRouter({defaults: {...}})is not visible to type inference. Add the key explicitly to the route config for typed access. -
New type exports:
RouteConfigBase,InferAccumulator<C>,AutoGetAccumulator<C>,AutoPostAccumulator<C>— available for advanced use cases and custom inference helpers. -
timingoption oncreateRouter()forX-Response-Timeheader. (#93) Passtiming: truefor defaults ortiming: {header?, precision?}for custom configuration. Measures pipeline execution time via ares.writeHeadinterception using the sharedapplyResponseTimingprimitive from@centralping/ergo/lib/response-time. Zero overhead when disabled (default). Short-circuit responses (404, 405, 415, 429) are intentionally excluded — timing measures pipeline execution, not transport/routing overhead.
Changed
- Bumped
@centralping/ergopeer dependency floor to>=0.4.1 <0.5.0(was>=0.4.0 <0.5.0). Floor bumped to 0.4.1 forapplyResponseTimingimport fromlib/response-time. (#93)
[Unreleased] Latest
Documentation
- Route Config table now includes all valid config keys. Added
noSend,send, andcatchHandler(Route Option Keys) andidempotency(Pipeline Key) to the README Route Config table. Previously only Pipeline Keys and Annotation Keys were listed. (#98) router.use()documented in Route Methods section. Added signature, behavior description (prepended to every declarative/array pipeline), and the array-pipelines-only caveat. (#98)