chore(repo): version packages - #467
Merged
Merged
Conversation
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 1, 2026 11:27
83cc3fc to
4630bd4
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 1, 2026 14:44
4630bd4 to
875b0b3
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 1, 2026 15:04
875b0b3 to
1750ef8
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 1, 2026 15:15
1750ef8 to
66faaea
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 1, 2026 16:09
66faaea to
69167e7
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 1, 2026 16:13
69167e7 to
911045e
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 1, 2026 16:30
6b70d29 to
721a06b
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 1, 2026 16:32
721a06b to
5aac33d
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 1, 2026 16:59
5aac33d to
62f7eae
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 1, 2026 17:45
62f7eae to
2e1acdf
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 1, 2026 19:31
2e1acdf to
6da112a
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 1, 2026 19:33
6da112a to
fa642e2
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
evlog@2.23.0
Minor Changes
#473
f39ab30Thanks @HugoRCD! - refactor: build each adapter's HTTP request once instead of twice — every HTTP adapter (axiom,better-stack,datadog,otlp,sentry,posthogineventsmode) constructed its URL, headers and body in two places: theencode()passed todefineHttpDrain()and again inside its standalonesendBatchTo*helper. The two copies had already drifted, reporting the same failure under different names (axiom API errorfrom the drain,Axiom API errorfrom the helper), and Axiom's and Better Stack'sencode()ignored the deprecatedtoken/sourceTokenaliases the helper honoured. Both paths now share one encoder per adapter and report failures identically.defineHttpDrain()accepts an optionallabelfor the human-readable name used in error messages, andsendEncodedDrainRequest()is exported fromevlog/toolkitso custom adapters can reuse their own encoder the same way#481
d7f482aThanks @HugoRCD! - feat(clickhouse): add the ClickHouse drain adapter (evlog/clickhouse) —createClickHouseDrain()inserts wide events over ClickHouse's HTTP interface inJSONEachRowformat, working with a local instance, a self-managed cluster, and ClickHouse Cloud. The defaultevlog_eventsschema keeps typed columns for what you filter and aggregate on (timestamp,level,service,environment,request_id,trace_id,method,path,status, …) plus the complete event as JSON indata, so adding a field to your events never needs a migration; passtransformto target your own schema. Asynchronous inserts are enabled and not awaited by default (async_insert=1&wait_for_async_insert=0), so ClickHouse batches server-side instead of creating one MergeTree part per request and draining never blocks on disk writes. Credentials are sent asX-ClickHouse-User/X-ClickHouse-Keyheaders rather than query parameters, so they never reachsystem.query_log. Configured viaCLICKHOUSE_ENDPOINT/CLICKHOUSE_USER/CLICKHOUSE_PASSWORD/CLICKHOUSE_DATABASE/CLICKHOUSE_TABLEor overrides, withsendToClickHouse/sendBatchToClickHousefor direct use. The adapter docs carry the matchingCREATE TABLE.#465
12852d3Thanks @HugoRCD! - fix(datadog): liftevent.traceId/event.spanIdinto a rootddblock — Datadog's log-to-trace correlation only readsdd.trace_id/dd.span_idat the payload root, so the idscreateDefaultEnrichers()already sets arrived nested underevlogand never correlated. The nested copy stays, so@evlog.*facets keep working, andresolveDatadogTraceContextis exported for custom drains#468
ecc3ea6Thanks @HugoRCD! - fix(core): key request scope, logger config and error identity to a versionedglobalThisregistry — evlog declares 18 optional peers, and pnpm/bun (isolated linker) hash resolved peers into store paths, so two workspaces that resolveaiorzoddifferently end up with physically distinct copies of the same evlog version. Each copy used to carry its ownAsyncLocalStorage(souseLogger()threw inside another copy'swithEvlog()), its own logger configuration (so events emitted through the second copy were silently undrained and unredacted), and its ownEvlogErrorclass (soinstanceofdowngraded structured errors to bare 500s). All three are now shared per major version.createLoggerStorage()takes an optional storage id, andEvlogError.isEvlogError()replacesinstanceoffor cross-copy checks#471
4e12ebbThanks @HugoRCD! - refactor: routeevlog/nestjs,evlog/react-routerandevlog/sveltekitthroughdefineFrameworkIntegration()— the three integrations each rebuilt the same request extraction,crypto.randomUUID()fallback,attachForkToLogger()call andstorage.run()wrapper by hand instead of using the helper Hono, Express, Elysia, Fastify and oRPC already share. Behaviour is unchanged, but they now inherit anything the helper gains (includingwaitUntilextraction) for free. A newpickBaseEvlogOptions()toolkit export becomes the single place listing theBaseEvlogOptionsfields, replacing the copy intoMiddlewareOptions()and the hand-written field list inevlog/eve— which silently droppedwaitUntil, and would have dropped every option added later#476
35431c2Thanks @HugoRCD! - feat(hono): exportuseLogger()and enablelog.fork()— Hono was the only framework integration withoutuseLogger(), so reaching the request logger from a service or repository meant threading the HonoContextdown through every call.import { useLogger } from 'evlog/hono'now resolves the same loggerc.get('log')returns, andc.get('log')is unchanged — it stays the idiomatic accessor inside route handlers. Attaching AsyncLocalStorage also enableslog.fork()on Hono, for background work that emits its own wide event correlated by_parentRequestId.Cloudflare Workers:
useLogger()is backed byAsyncLocalStorage, soevlog/hononow importsnode:async_hooks. Workers deployments need thenodejs_compat(ornodejs_als) compatibility flag inwrangler.toml. If you cannot enable it, useevlog/workers, which stays free ofnode:async_hooksby design.#480
1b0edb8Thanks @HugoRCD! - feat(loki): add the Grafana Loki drain adapter (evlog/loki) —createLokiDrain()pushes wide events to Loki's push API, covering self-hosted single-tenant, multi-tenant (X-Scope-OrgID), and Grafana Cloud (instance ID + token as HTTP Basic). Each event is pushed as a JSON log line under a deliberately small label set —service,environment,levelby default — so Loki's index stays cheap while everything else (requestId,path, custom fields) remains queryable with| json. Promote extra fields withlabelFields, add deployment-wide labels withlabels. Events sharing a label set are grouped into one stream and sorted by timestamp, since Loki rejects out-of-order entries. Configured viaLOKI_ENDPOINT/LOKI_API_KEY/LOKI_USER/LOKI_TENANT_IDor overrides, withsendToLoki/sendBatchToLokifor direct use.#474
c5e85b0Thanks @HugoRCD! - refactor(next): runwithEvlog()through the shared middleware pipeline —evlog/nextreimplemented the whole request pipeline (route filtering, per-route service, tail sampling, emit, enrich, drain) instead of callingcreateMiddlewareLogger, so it silently drifted from every other integration. Two options declared onNextEvlogOptionsnever did anything:pluginswas never applied, because Next built no plugin runner at all, and globalsampling.keeptail conditions were never evaluated — Next only called the user'skeepcallback, and its tail context carried noduration, so duration-based keep rules could not match. Both now work.keepcallbacks also receivectx.duration, and error statuses are derived through the sharedextractErrorStatus. Next'safter()is wired as the pipeline'swaitUntil, so drain work still runs after the response is sent; enrich now runs before the response returns, matching the documentedwaitUntilcontract and every other integration — move latency-sensitive work intodrainif you relied on enrich being deferred#466
5d99391Thanks @HugoRCD! - Make emit-time redaction programmableRedactConfig.replacementnow accepts a function, so a replacement can be derived from the value it replaces instead of being a constant — a stable fingerprint keeps requests correlatable without exposing the credential:RedactConfig.transformcovers policies that cannot be expressed declaratively — conditional on a sibling field, tenant-scoped, or allowlist-shaped. It runs before the declarative stages, so it sees raw values andpaths/builtins/patternsstill apply to whatever it leaves behind.Both run where redaction already runs: after the event is built, before the console write and before any drain. Failures are caught and reported like drain failures — a
replacementfunction that throws or returns a non-string falls back to[REDACTED]rather than emitting the raw value, and a throwingtransformis skipped without stopping the event from being logged.Function-valued policy cannot survive the build-time config bridges, which serialize to JSON; the Nitro modules now warn instead of dropping it silently.
Closes #463
#470
374abfdThanks @HugoRCD! - fix(core): stop droppingwaitUntilwhen adefineEvlog()config is passed to middleware —toMiddlewareOptions()copied every otherBaseEvlogOptionsfield but silently omittedwaitUntil, sodefineEvlog({ waitUntil })lost the serverless drain hook on its way to the framework integration and drains were awaited inline instead of being registered with the platform.evlog/hononow also picks upc.executionCtx.waitUntilon its own, so drains on Cloudflare Workers and Vercel Edge complete after the response is returned with no manual wiring; adapters without anExecutionContext(Node, Bun, Deno) keep draining inline, and an explicitwaitUntiloption still wins#472
2540aa5Thanks @HugoRCD! - feat(workers): addwithEvlog()so Cloudflare Workers get the full middleware pipeline —evlog/workerswas the only integration that never rancreateMiddlewareLogger, soinclude/exclude, per-routeroutesoverrides,redact,enrich,keeptail sampling andpluginssimply had no effect there. Wrap your fetch handler withwithEvlog(handler, options)and the wide event is emitted for you when the handler returns, with the same option surface every other framework accepts;ctx.waitUntilis picked up from the third argument so drains outlive the response, streaming bodies defer the emit until they complete, andrequestIdnow honoursx-request-idbefore falling back tocf-ray.defineWorkerFetch()andcreateWorkersLogger()are unchanged and remain the manual-emit path. The entrypoint stays free ofnode:async_hooks, so it still runs withoutnodejs_compatPatch Changes
#457
899464aThanks @EmilGramDK! - fix(core): redact own enumerable fields only, so getter-only prototype accessors such asDOMException.codeare never assigned to. A field that still refuses the write now warns instead of throwing, and redaction keeps covering the own fields of class instances.#477
f5d7474Thanks @HugoRCD! - fix(core): serialize Error instances passed to the clientlog.error()—name,messageandstackare non-enumerable, so anErrorspread into a wide event contributed nothing and the call emitted an event with no error at all. The docs teachlog.error(new Error(...))for Next.js client components, and the type only accepted a tag pair or a plain object, so the pattern failed to type check as well. Errors now land undererrorwith the same shape the server logger stores, includingcode,status,causeand friends#478
f662848Thanks @HugoRCD! - fix(elysia): defer the wide event until a streaming body closes —evlog/elysiaemitted fromonAfterResponse, which fires as soon as the response is handed off. For an SSE or chunked body that is long before the stream finishes, so anything the handler set mid-stream (AI token counts, tool calls, final status) was dropped with a post-emit[evlog]warning. Streaming responses are now claimed inmapResponseand their body wrapped, so the emit waits for the stream to close — the same behaviour Hono, oRPC, SvelteKit, React Router and Next already had (#321). Non-streaming responses are unaffected and still emit immediately.#457
2c20be7Thanks @EmilGramDK! - fix(core): record the same error twice without crashing. A handler that logs the error it then throws hands the same instance tolog.error()and to the integration'sfinish({ error }); the second merge walked into the caller's own object and threw on any read-only field it carried.#484
9e3bd96Thanks @HugoRCD! - docs: move OTLP and HyperDX into the "Cloud or Self-Hosted" category — both self-host as readily as they run managed, so filing them undercloud/alongside Axiom and Datadog was misleading. They join Loki and ClickHouse underhybrid/, and each page now splits its setup into explicit self-hosted and managed sections rather than mixing the two. The old/integrate/adapters/cloud/otlpand/integrate/adapters/cloud/hyperdxURLs 301 to the new locations.@evlog/cli@0.3.1
Patch Changes
f39ab30,899464a,d7f482a,f5d7474,12852d3,ecc3ea6,f662848,4e12ebb,2c20be7,35431c2,9e3bd96,1b0edb8,c5e85b0,5d99391,374abfd,2540aa5]: