Skip to content

chore(repo): version packages (beta) - #903

Open
github-actions[bot] wants to merge 1 commit into
v3from
changeset-release/v3
Open

github-actions[bot] wants to merge 1 commit into
v3from
changeset-release/v3

Conversation

@github-actions

@github-actions github-actions Bot commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

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 v3, this PR will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

v3 is currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, run changeset pre exit on v3.

⚠️⚠️⚠️⚠️⚠️⚠️

Releases

evlog@3.0.0-beta.1

Major Changes

  • #900 cd75745 Thanks @evlogai! - A logged EvlogError carries code, why, fix and link once, at the top of error. Its data is now the payload passed to createError({ data }) and nothing else, and it is left out when there is none. Before, the logged data repeated the guidance fields:

     "error": {
       "name": "EvlogError",
       "message": "Payment failed",
       "code": "PAYMENT_DECLINED",
       "status": 402,
       "why": "Card declined by issuer",
       "fix": "Try another card",
    -  "data": { "retryAfter": 30, "code": "PAYMENT_DECLINED", "why": "Card declined by issuer", "fix": "Try another card" }
    +  "data": { "retryAfter": 30 }
     }

    This holds when h3 wraps the error too. A drain or saved query that read error.data.why should read error.why. The HTTP response is unchanged: its data still carries the guidance fields, which parseError() reads on the client.

  • #936 bf38917 Thanks @HugoRCD! - evlog/nitro is the Nitro 3 module, and the nitropack (Nitro 2) module moves to evlog/nitro/v2. evlog/nitro/v3 is removed. Nitro 2 stays supported for all of evlog 3.

     // Nitro 3
    -import evlog from 'evlog/nitro/v3'
    -import { useLogger, createError, evlogErrorHandler } from 'evlog/nitro/v3'
    +import evlog from 'evlog/nitro'
    +import { useLogger, createError, evlogErrorHandler } from 'evlog/nitro'
    
     // nitropack (Nitro 2)
    -import evlog from 'evlog/nitro'
    -import { useLogger } from 'evlog/nitro'
    +import evlog from 'evlog/nitro/v2'
    +import { useLogger } from 'evlog/nitro/v2'

    Rewrite the nitropack imports first, then the Nitro 3 ones, so an import is not moved twice. The Nuxt module needs no change: evlog/nuxt still runs on Nuxt 4's nitropack.

  • #937 6387849 Thanks @HugoRCD! - The HTTP error body sent by the Nitro, Nuxt and SvelteKit error handlers carries the status in status and the text in message only. The statusCode, statusText and statusMessage fields are gone: they repeated status and message. url, error: true and data are unchanged, and why, fix and link stay under data.

     {
       "url": "/api/checkout",
       "status": 402,
    -  "statusCode": 402,
    -  "statusText": "Payment failed",
    -  "statusMessage": "Payment failed",
       "message": "Payment failed",
       "error": true,
       "data": { "why": "Card declined", "fix": "Use another card" }
     }

    parseError() already reads status and message, so client code that goes through it needs no change. A client that read statusCode or statusMessage from the JSON body should read status and message. The HTTP status line itself is unchanged.

  • #933 0e2d709 Thanks @HugoRCD! - OTLP records default to the compact shape with OpenTelemetry semantic convention attributes. This applies to every drain built on the OTLP encoder: evlog/otlp, PostHog (logs and events mode), HyperDX and Sazabi.

    • recordShape defaults to 'compact': the body is a one-line summary (POST /api/checkout (500)) and nested fields become dotted attributes (user.id). In PostHog events mode, nested properties are flattened the same way.
    • semanticConventions defaults to true: records also carry http.request.method, url.path, http.response.status_code, exception.* and gen_ai.*, and the resource carries deployment.environment.name. The evlog field names stay.

    For the same 100 events, the OTLP request shrinks from 151,235 to 140,250 bytes as JSON (2,804 to 2,198 gzipped) and from 76,839 to 63,925 bytes as protobuf.

    To keep the 2.x output:

    createOTLPDrain({ recordShape: "json", semanticConventions: false });
    createPostHogDrain({ recordShape: "json" });
  • #938 980c1d0 Thanks @HugoRCD! - Two optional peer ranges change:

    • eve goes from >=0.30.0 to >=0.72.0. evlog/eve no longer supports eve releases older than 0.72.
    • nitro goes from ^3.0.260311-beta to >=3.0.0-0 <4.0.0-0. The old range did not cover the later dated Nitro 3 betas such as 3.0.260903-beta, and the new one covers every Nitro 3 beta and release without letting in Nitro 4.

    The open-ended ranges stay open: @nestjs/common and @nestjs/core (>=11.2.7), react-router (>=7.18.4) and hono (>=4.13.12) accept new majors. evlog's own tests now run on NestJS 12, React Router 8, eve 0.83 and the latest Nitro 3 beta. nitropack ^2.13.4 and h3 ^1.15.11 are unchanged.

  • #929 2316600 Thanks @HugoRCD! - Remove the evlog/browser entry. It was deprecated in 2.x and re-exported evlog/http under other names. Import from evlog/http instead:

    - import { createBrowserDrain, createBrowserLogDrain } from 'evlog/browser'
    + import { createHttpDrain, createHttpLogDrain } from 'evlog/http'

    The types follow the same rename: BrowserDrainConfig is HttpDrainConfig, BrowserLogDrainOptions is HttpLogDrainOptions.

  • #930 96af994 Thanks @HugoRCD! - Remove the deprecated credential aliases. The Axiom and Better Stack drains, and the Nuxt module, read the API key from apiKey only.

    Removed Use
    Axiom token option apiKey
    AXIOM_TOKEN / NUXT_AXIOM_TOKEN AXIOM_API_KEY / NUXT_AXIOM_API_KEY
    Better Stack sourceToken option apiKey
    BETTER_STACK_SOURCE_TOKEN / NUXT_BETTER_STACK_SOURCE_TOKEN BETTER_STACK_API_KEY / NUXT_BETTER_STACK_API_KEY
    Nuxt evlog.axiom.token evlog.axiom.apiKey

    A project that still sets only the old name gets the drain's "Missing apiKey" error and sends nothing.

    applyDeprecatedAlias is no longer exported from evlog/toolkit.

  • #935 f8024f3 Thanks @HugoRCD! - EvlogError no longer has the statusCode, statusText and statusMessage getters, deprecated since 2.x. Read status for the HTTP status and message for the text:

     const error = createError({ message: 'Payment failed', status: 402 })
    -error.statusCode    // 402
    -error.statusMessage // 'Payment failed'
    +error.status        // 402
    +error.message       // 'Payment failed'

    Reading one of the removed fields now returns undefined, and TypeScript reports it. Errors thrown by h3 and Nuxt keep their own statusCode, and evlog still reads it from them.

  • #931 9c74c54 Thanks @HugoRCD! - Remove createPostHogEventsDrain() and the PostHogEventsConfig type from evlog/posthog. Both were deprecated in 2.x. Use the main drain in events mode, which takes the same options:

    - import { createPostHogEventsDrain } from 'evlog/posthog'
    - initLogger({ drain: createPostHogEventsDrain({ eventName: 'server_request' }) })
    + import { createPostHogDrain } from 'evlog/posthog'
    + initLogger({ drain: createPostHogDrain({ mode: 'events', eventName: 'server_request' }) })

    PostHogEventsConfig was an alias of PostHogConfig. sendToPostHogEvents() and sendBatchToPostHogEvents() are unchanged.

  • #900 cd75745 Thanks @evlogai! - status is optional on EvlogError, on createError() options, and on error catalog entries (defineErrorCatalog, defineError). Core no longer defaults it to 500. An error that never reaches an HTTP response (an agent turn, a job, a cron task, a CLI script) has no status, and toJSON() and the logged event leave the field out.

    Every HTTP boundary still answers 500 for an error without a status. This covers the Nuxt and Nitro error handlers, h3, Next, Hono, Express, Fastify, Elysia, NestJS, SvelteKit and parseError(). Code that read error.status directly and expected a number needs to handle undefined, or read the status the framework sends.

    A non-HTTP error, logged without a status:

    {
      "name": "EvlogError",
      "message": "Export job stalled",
      "data": { "why": "No progress for 5 minutes", "fix": "Retry the export" },
      "why": "No progress for 5 minutes",
      "fix": "Retry the export"
    }

    Before this change the same error also logged status: 500. No codemod is needed. Upgrade checklist: check code that reads error.status as a number, and any alert or sampling rule that matched on it.

  • #932 5459485 Thanks @HugoRCD! - createLoggerStorage is no longer exported from evlog/toolkit. Import it from evlog/toolkit/storage, which has exported it since 2.x. The main toolkit barrel no longer pulls in node:async_hooks, so framework integrations built on it stay edge-safe.

    - import { createLoggerStorage, defineFrameworkIntegration } from 'evlog/toolkit'
    + import { defineFrameworkIntegration } from 'evlog/toolkit'
    + import { createLoggerStorage } from 'evlog/toolkit/storage'

Minor Changes

Patch Changes

  • #910 5ab0a8d Thanks @HugoRCD! - The bearer redaction built-in now runs before every other built-in, so a Bearer token is masked whole. A token shaped like an IBAN or a card number was partly rewritten first and then no longer matched: Bearer FR76ABCD123456789012 was logged as Bearer FR76****012, and Bearer 4111111111111111 as Bearer ****1111. Both are now Bearer ***, and so is a JWT after Bearer, which was logged as Bearer eyJ***.***.

  • #905 94748e1 Thanks @HugoRCD! - log.set(), emit() and the redaction production turns on by default do less work per event. The error check that runs on every set() payload no longer allocates when the payload holds no error. Redaction copies a plain event once while it redacts, instead of a structuredClone followed by a walk per stage, and skips the built-in patterns on strings none of them can match. Events with a Date, a Map, a class instance or another value that is not plain JSON still go through the previous path. The event timestamp is now one flat string. The concatenated string it replaces made JSON.stringify of the event, in a drain or a console line, about three times slower on Node 26. Logged and drained events are unchanged.

  • #907 7fca2ba Thanks @HugoRCD! - The iban redaction built-in masks a spaced IBAN whole when creditCard is also on, as it is with the default redact: true. The card pattern ran first and matched the digits inside it, so FR76 3000 6000 0112 3456 7890 189 was logged as FR76 ****3456 7890 189. It is now FR76****189. A builtins list runs in a fixed order, whatever order it is written in.

  • #907 7fca2ba Thanks @HugoRCD! - A cycle in the context passed to createLogger() or createRequestLogger(), or in the fields passed to emit(), is logged as '[Circular]', as it already was for set(). It used to overflow the stack when redaction was on, which it is by default in production. An Error in that context or in emit() fields is now serialized with its name, message and stack instead of being logged as {}.

  • #907 7fca2ba Thanks @HugoRCD! - log.set() only merges plain objects. A class instance or a Date is now a value: the next set() on the same key replaces it. Before, merging into one wrote the new fields into the caller's own object, and a second Date on the same key was ignored. log.set({ account }) followed by log.set({ account: { plan: 'pro' } }) now logs { plan: 'pro' } and leaves account untouched.

  • #902 7f74e73 Thanks @HugoRCD! - Keep evlog 3's process-wide state apart from evlog 2. 3.0.0-beta.0 still stored its config under the 2.x registry key, so with both majors loaded in one process (for example a dependency still on evlog 2), each copy read and overwrote the other's config, drain and redaction, and the "Multiple major versions of evlog" warning never fired. 3.x now uses its own key and warns when a 2.x copy is also loaded.

@evlog/cli@1.0.0-beta.1

Minor Changes

  • #936 bf38917 Thanks @HugoRCD! - evlog init writes the Nitro import for the evlog major installed in the project. On evlog 3 it imports evlog/nitro for Nitro 3 and evlog/nitro/v2 for nitropack, and on evlog 2 it keeps evlog/nitro/v3 and evlog/nitro. The TanStack Start error middleware snippet follows the same rule. evlog config reads the module options from any of the three subpaths.

    When the project has no evlog yet, a prerelease of the CLI installs evlog@beta and a release installs evlog, so the import paths it writes match the evlog it installs.

  • #870 df39d50 Thanks @evlogai! - Add evlog upgrade, which migrates a project to evlog 3. It reads the evlog range in package.json and runs every migration above it.

    npx @evlog/cli@latest upgrade          # show each fix and what needs a person, change nothing
    npx @evlog/cli@latest upgrade --write  # apply the fixes and move evlog to ^3 in package.json

    This release rewrites two things:

    • The Nitro imports: evlog/nitro becomes evlog/nitro/v2 and evlog/nitro/v3 becomes evlog/nitro, including import(), require.resolve() and import.meta.resolve().
    • evlog/browser becomes evlog/http, with createBrowserDrain, createBrowserLogDrain, BrowserDrainConfig and BrowserLogDrainOptions renamed to their Http names wherever the file uses them.

    Code that cannot be rewritten safely is reported with its file, line and a link to the migration guide: a dynamic import of a module whose exports were renamed, an export * from it, or the module named in a plain string. The dry run exits 1 while anything is left, and --write exits 1 while reported findings remain. --write refuses to run on uncommitted git changes unless you pass --force. --json prints the report with a schemaVersion.

    Running it again after --write does nothing, because package.json already says evlog 3.

Patch Changes

  • #920 4324afd Thanks @evlogai! - @evlog/cli now installs next to evlog 2.31 and later as well as 3.0 betas. Before, npm i -D @evlog/cli@beta in a project still on evlog 2.x failed with ERESOLVE, because the peer range only allowed 3.0 betas. The minimum is 2.31.0, the first 2.x release the CLI has been built against.

@vercel

vercel Bot commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

5 Skipped Deployments
Project Deployment Actions Updated
evi Ignored Ignored Preview Oct 24, 2026 12:35pm UTC
evlog-docs Ignored Ignored Preview Oct 24, 2026 12:35pm UTC
evlog-render-lab Ignored Ignored Preview Oct 24, 2026 12:35pm UTC
evlog-telemetry Ignored Ignored Preview Oct 24, 2026 12:35pm UTC
just-use-evlog Ignored Ignored Preview Oct 24, 2026 12:35pm UTC

Request Review

@coderabbitai

coderabbitai Bot commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 133ed7c0-88d7-468e-b7fa-44910da0d430

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions
github-actions Bot force-pushed the changeset-release/v3 branch 24 times, most recently from 8406df0 to 8d54e34 Compare October 24, 2026 10:38
@github-actions
github-actions Bot force-pushed the changeset-release/v3 branch from 8d54e34 to 7f2b617 Compare October 24, 2026 12:35

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants