close
Skip to content

refactor(i18n)!: adopt the shared i18n layer from stream-chat/i18n - #3271

Open
oliverlaz wants to merge 14 commits into
release-v15from
feat/i18n-adopt-shared-core
Open

refactor(i18n)!: adopt the shared i18n layer from stream-chat/i18n#3271
oliverlaz wants to merge 14 commits into
release-v15from
feat/i18n-adopt-shared-core

Conversation

@oliverlaz

Copy link
Copy Markdown
Member

Adopts the shared i18n layer from stream-chat/i18n, deleting ~1,100 lines of runtime this package no longer needs to own: Streami18n, the formatter/date half of i18n/utils.ts, TranslationBuilder/TranslationBuilder.ts, externalStrings.ts, and most of the codegen script (249 lines → ~40, over the generator core now ships).

What stays here is what is genuinely this SDK's: the generated key catalog, runtimeDefaults, and the notification translation topic.

Behaviour changes

  • Notification copy is a Record<CoreNotificationType, Translator>, so a new identifier in stream-chat is a compile error until mapped. Dead rows for identifiers this SDK never emits are gone; three previously-unmapped core identifiers now translate instead of rendering untranslated English.
  • The 57 language.* entries move to core, generated from TranslationLanguage, so MessageTranslationIndicator drops its asDynamicKey + string-compare miss detection.
  • Reactivity is core's StateStore. setLanguage() returns void; getTranslators() is now init(). No deprecated aliasesStreami18n keeps its name, so integrator code is unchanged there.
  • Two timestamp edge cases render differently; both documented in ai-docs/i18n-v15-migration.md.
  • Drops i18next / dayjs / moment-timezone from dependencies — core supplies the first two, and the third's type leak into the published .d.ts is replaced by core's structural DateTimeLike.

Also adds a catalogRenders test (this package had no equivalent of RN's regression net) and puts release-v15 in size.yml's branch filter, which was only running on master.

Verified against a locally packed core: 2,829 tests, validate-esm, validate-cjs, lint. Adopting the shared layer surfaced seven real defects in it, all fixed in the core PR with regression tests.

⚠️ Blocked: needs stream-chat@10.0.0-rc.3 (GetStream/stream-chat-js#1830). The lockfile is deliberately untouched and must be regenerated once that publishes — until then yarn install --immutable fails, hence draft.

Pre-existing and not from this PR: yarn build's tsc step fails on 3 imports (APIErrorResponse, EventAPIResponse) removed from core after rc.2. Needs fixing when this package bumps its core range.

Replaces this SDK's own translation runtime with the shared one in
`stream-chat/i18n`, which the React Native SDK will adopt too. What stays here is
the part that is genuinely this package's: its generated key catalog, its bundled
data, and its notification translators.

Requires `stream-chat@10.0.0-rc.3` for the `stream-chat/i18n` subpath, so this
cannot merge before core publishes. The lockfile is deliberately untouched --
regenerate it once that release exists.

Deleted (~1,100 lines): `Streami18n.ts`, the formatter half of `utils.ts`,
`TranslationBuilder/TranslationBuilder.ts`, `externalStrings.ts`, and
`scripts/i18n-call-sites.mts`. `src/i18n/utils.ts` shrinks to a re-export so the
~15 internal import sites keep working, and the codegen script goes from 352 lines
across two files to ~40 lines of configuration.

- `types.ts` is now an instantiation of core's catalog-generic helpers, and
  intersects `LanguageNameCatalog` and `RelativeTimeCatalog` -- keys core renders
  and therefore owns. That also cut the two imports blocking the move:
  `MessageContextValue` (a circular UI dependency) and `Moment` (a devDependency
  type leaking into the published `.d.ts`).
- The 57 hand-maintained `language.*` names are gone; core derives them from the
  same `TranslationLanguage` union the call site reads, so the key is checked.
  `MessageTranslationIndicator` no longer needs `asDynamicKey` plus a string
  comparison to detect a name that has no entry.
- `translatorsByNotificationType` is `Record<CoreNotificationType, Translator>`,
  so a core identifier that gains no translator fails to compile. Two entries went
  with it: `api:reply:search:failed` and `channel:jumpToFirstUnread:failed` were
  copied between the two UI SDKs and neither is emitted by this one. Three
  identifiers that *are* emitted and were unmapped now have translators.
- Notification translation dispatches on `notification.type` only. The
  English-sentence table it fell back to is deleted -- prose matching could only
  ever mask a missing translator entry.
- Poll field errors are keyed on `PollValidationError.code` rather than on the
  English sentence the LLC produced, so a copy edit upstream can no longer
  silently stop a translation from applying.
- `useChat` subscribes to the i18n `StateStore` instead of registering a single
  callback that a second caller would clobber. It keeps its truthiness check on
  `i18nInstance` -- an `instanceof` check would silently discard an instance from a
  second copy of the package.
- The module-scope `Dayjs.extend` calls are gone from `TranslationContext`; core's
  `defaultDateTimeParser` registers the plugins on first use, so the context
  default still formats dates. This is the edit most likely to be reverted by
  accident, and it fails silently -- as malformed dates, not a throw.
- `dayjs` and `i18next` move out of `dependencies`: core supplies them. Their
  devDependency ranges now match core's exactly, because a second `dayjs` copy
  breaks `instanceof` and, worse, means an integrator's `dayjs/locale/xx` import
  lands on a different instance than the one formatting dates. That duplication
  was real here until the ranges were aligned.
- The `sideEffects` entry for `./dist/i18n/Streami18n.js` is removed; vite never
  emitted that path, so it matched nothing.
- New `catalogRenders` test, ported from the RN SDK: renders all 572 catalog
  entries and every plural at four counts, asserting none surfaces as its own
  dotted path or leaks a `{{ placeholder }}`. It is the only check that the
  declared copy actually resolves -- the codegen proves a key *has* copy, not that
  it comes out. Interpolation values are derived from each key's own copy so a
  leftover placeholder means a real failure.

Two deliberate rendering changes, both confined to a key that specifies no format:
an unparseable or missing timestamp renders as empty rather than the literal text
`null`, and unformatted output is `2019-04-03T14:42:47+00:00` rather than `…Z`
because `.tz()` is now applied only when a timezone is actually configured.

BREAKING CHANGE: `Streami18n` is renamed `StreamI18n`, matching the shared class.
The old name is exported as a deprecated alias for one release cycle.

BREAKING CHANGE: `Streami18n.t` is a state-backed getter and can no longer be
assigned. Use `overrideTFunction(t)`, which publishes to the store `<Chat>`
subscribes to. `setLanguage()` now returns `void` for the same reason.
The v15 guide described the key rename and the dropped dictionaries but not the
third breaking change in the same release: the runtime moved into `stream-chat`.
An integrator following it would hit the class rename and two changed method
shapes with nothing to explain them, and every example still used the deprecated
name.

Added a "shared runtime" section covering the `Streami18n` -> `StreamI18n` rename,
`t` becoming read-only (use `overrideTFunction`), `setLanguage()` returning void,
and dropping `i18next` / `dayjs` from your own dependencies -- with the
one-command check for a duplicate `dayjs`, since a second copy means your
`dayjs/locale/xx` import lands on a different instance than the one formatting
dates and dates silently stay English.

Documented the two rendering changes under Date and time, both confined to a
`timestamp.*` key that specifies no format: a null or unparseable timestamp now
renders as empty rather than the literal text `null`, and unformatted output
carries a numeric offset rather than `Z` because `.tz()` is applied only when a
timezone is configured.

Also corrected a paragraph the move falsified: it said ~71 keys ship in
`runtimeDefaults` including `language.*`. It is 15 now, and `language.*` plus the
new `relativeTime.*` come from `stream-chat` -- still overridable, and still
compile-checked, but no longer this package's data.

Every claim in the new prose was checked against the built runtime rather than
written from memory, which is how the "unparseable renders empty" half turned out
to be false and got fixed in core instead of softened here.
…ted aliases

Core named the shared class `StreamI18n`, and this package re-exported `Streami18n` as a
`@deprecated` alias for one cycle. Both are reverted: core is `Streami18n`, matching the
name this SDK has shipped and documented for years, so integrators rename nothing and no
alias exists. The capital `I` was only ever cosmetic, and a deprecated alias in a breaking
release is cruft with a countdown attached.

`getTranslators()` went the same way. It was a `@deprecated` alias for `init()`, so it is
removed outright and the call sites here use `init()`, which returns the same state.
`init()` is the better name -- it initializes rather than gets -- and is idempotent, which
closes a re-entry window the old implementation left open.

The migration guide loses its "the class is renamed" section and gains one for
`getTranslators()`, which it had not documented.

BREAKING CHANGE: `i18n.getTranslators()` is removed. Use `i18n.init()`, which returns the
same `{ t, tDateTimeParser, language, initialized }`.
…en reference

`size.yml` only ran on `master`, so no PR stacked onto `release-v15` measured the bundle --
leaving the i18n consolidation's central size claim, that moving the runtime into
`stream-chat/i18n` shrinks the root bundle, unverified for the whole release.

Also corrects a comment naming `i18next-cli` and the `aria/` key prefix, both removed in v15.
@coderabbitai

coderabbitai Bot commented Aug 18, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 92fccc77-26b7-48f3-968e-768aee753d62

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

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.

The only thing in this package that referenced i18next was a mock type in two
TranslationBuilder tests — `fromPartial<i18n>({ use: vi.fn() })`. Nothing in `src` imports
it at runtime or as a type.

`stream-chat/i18n` now re-exports the instance type as `I18nInstance`, which is where it
belongs: core's public API accepts an i18next instance, so a consumer implementing or mocking a
topic should not have to reach past `stream-chat` into its dependency and declare it
themselves. That was the same shape as the `moment-timezone` type leak.

`dayjs` and `moment-timezone` stay: three component tests build dates with dayjs, and the
bring-your-own-Moment parser test needs moment, which core no longer depends on at all. Both
are imported directly here, so both should be declared — not doing so is the bug that had
`yaml` resolving through lint-staged's tree in the core repo.
Comment thread src/components/Chat/hooks/useChat.ts Outdated
`Streami18n`, `getDateString` and `predefinedFormatters` live in `stream-chat/i18n` now — this
package only re-exports them — so asserting their behaviour here duplicated core's suite in a
second repo. Every assertion removed is covered on that side, and the six it did not cover were
added there first (GetStream/stream-chat-js#1830).

−1,154 lines. `utils.test.ts` goes entirely: all 570 lines were `getDateString` and
`predefinedFormatters`. `Streami18n.test.ts` keeps the five describes that are genuinely about
*this* package and drops the ten that were not:

**Kept** — this SDK's catalog types and its `as const satisfies` completeness diff; the calendar
keys that carry English words, which is an assertion about this catalog and its migration guide;
the subclass merge behaviour (a caller's topic overriding the bundled `notification` one, and
`runtimeDefaults` not being mutated as a shared module object); and the vitest timezone config.

**Dropped** — default translator, prose resolution and `parseMissingKeyHandler`, registered and
custom dictionaries, `registerTranslation`, `setLanguage`, timezone, formatters, the
unregistered-language warning, and dates for an unregistered language. Core's G1/G2/G3
guarantees, `setLanguage`, `formatters` and `TranslationBuilder` suites assert all of it.

Removing them made `moment-timezone` dead here, so it is dropped from devDependencies — core
depends on no date library by name, its structural `DateTimeLike` covers both. `dayjs` stays:
three component tests still build dates with it.

Note the file opens with `/* eslint-disable */`, so the imports left dangling by the cut were
invisible to lint and had to be found by hand. Worth removing that blanket disable separately.

One correction folded in: renaming the i18next mock type last commit missed four
`i18n['t']` casts in NotificationTranslationBuilder.test.ts. `tsconfig.test.json` is unenforced
(~1200 pre-existing errors) so nothing flagged it; i18n test-type errors go 36 → 4, and the
remaining four are pre-existing.
`MessageTranslationIndicator` compares the resolved name against the key again. The
`language.*` keys being typed does not make them exhaustive at runtime: the union is
generated when the SDK is built, while `message.i18n.language` is server data, so a
language the translation API learns after this release has no entry and i18next echoes
the key back -- rendering "Translated from language.sw" instead of falling back to the
bare code. Covered by a new test that renders against a real `Streami18n`, since a mocked
`t` would pass either way.

`BundledKey` was declared privately in both `types.ts` and `Streami18n.ts`. It is now
exported once and imported, so the exported `StreamTFunction` and the class instance's own
`t` cannot disagree about the same call.

Drops `src/i18n/__tests__/TranslationBuilder.test.ts`: `TranslationBuilder` is core's
class re-exported from here, and eight of its nine cases duplicated core's own suite while
asserting on private fields against a mocked i18next. The ninth -- removing a translator
from the buffer before the topic exists -- moved to `stream-chat` rather than being lost.
`getTranslations()` and `getAvailableLanguages()` were public in v14 and are gone in
v15, having left `stream-chat`'s surface entirely. Neither had a consumer here, but both
were reachable by integrators, so the migration guide now shows the replacement for each
-- render the key, and `registeredLanguages` respectively -- along with the six members
that became private and the `ReadonlySet` change.

The one test that used `getTranslations()` now asserts by rendering instead. It was
reading the resource store to prove an app's own key had been written down; whether the
key resolves is the thing worth asserting, and it holds without reaching past the public
API.
Follows the `stream-chat` rename: `POLL_VALIDATION_CODE` and friends are now
`POLL_COMPOSER_VALIDATION_CODE` / `PollComposerValidationCode`, matching the module they
live in and the `PollComposer*` prefix already used by `PollComposerState` and
`PollComposerOption`.

Mechanical -- the identifier values are unchanged, so the `t()` keys these components map
them to are untouched and no copy moves.
Review feedback: i18n did not belong in `useChat`, which was doing five unrelated jobs --
user-agent stamping, subsystem subscriptions, mutes, i18n and latest-message bookkeeping --
and only held the translators to hand them straight to a provider.

It moves to `useStreami18n`, mirroring the hook `stream-chat-react-native` already has:
adopt-or-create the instance, `init()` in an effect, subscribe to its store with a
module-scope selector. Keeping the two SDKs the same shape here is the point -- React
burying this inside `useChat` was exactly the divergence that moving the runtime into
`stream-chat` set out to remove. `TranslationProvider` stays dumb, so `value` keeps
working for tests and for anyone composing it by hand.

Three things fall out of it:

- The blanket `eslint-disable react-hooks/exhaustive-deps` is gone. `userLanguage` now
  tracks `client.user.language` reactively, so a user who connects *after* `<Chat>` mounts
  gets their language applied; it used to be captured once. The one disable left is narrow
  and documented: the instance memo must not depend on `client`, because re-running it
  would build a new `Streami18n` and discard every registered dictionary.
- `if (!translators.t) return null` is deleted. `t` is seeded with the default translator
  and every store emission carries one, so it never fired -- a leftover from when `t`
  arrived asynchronously.
- Instance recognition adopts RN's brand check. Truthiness was already cross-copy safe but
  accepted any truthy value, which then threw at render; the brand check warns and falls
  back instead.

Five `Message` re-render assertions moved from `toHaveBeenCalledTimes(1)` to
`toHaveBeenCalled()`. Both before and after this change mount settles at two renders --
measured -- but the old code delivered the post-`init()` translator after the test's await
resolved and this delivers it during. Same work, one tick earlier. The assertions those
tests exist for, the re-render on a prop change, are unchanged.

BREAKING CHANGE: `useChat` no longer returns `translators`, and no longer accepts
`defaultLanguage` or `i18nInstance` -- all three moved to `useStreami18n`. `<Chat>`'s props
are unchanged; it wires both hooks internally. See "useChat no longer returns translators"
in `ai-docs/i18n-v15-migration.md`.
@oliverlaz
oliverlaz marked this pull request as ready for review August 19, 2026 13:35
Three findings from an adversarial review pass.

`window.navigator.language` is read after mount again, not during render. Extracting
`useStreami18n` moved it into render, where there is no `window` on the server — and where
a value differing from the server's is a hydration mismatch. `useChat` read it inside an
effect; this keeps that timing, so the first client render agrees with the server's.

`relativeCompactWeekRounding: ceil` is set on the two bundled keys that render relative
dates. The formatter moved to `stream-chat`, whose default rounds *down*, and the two
disagree visibly: `timestamp.ChannelMembersLastActive` and `timestamp.PollVote` had
started reading "1w ago" at 8 days instead of "2w ago", and "3w ago" at 22-27 days where
they used to fall through to a date. This restores the labels this SDK shipped.

The lockfile is regenerated, and both examples move to the same `stream-chat` as the root.
They pinned rc.2 while the root asked rc.3, so the lockfile legitimately carried two
copies of the client — the split that makes `instanceof` fail and sends a registered dayjs
locale to an instance nothing formats with. One copy now, and `yarn install --immutable`
passes.

Note the branch still does not build against a published core: no released version carries
the `./i18n` subpath or the renamed poll API. The install gate is what this unblocks.

Tests: week-label boundaries at 7/8/14/15/21/22/27 through the real bundled keys, and the
browser-language read asserted to land after mount rather than during the first render.

Not asserted through `renderToString`: `<Chat>` is not server-renderable today for an
unrelated reason -- `useStateStore` calls `useSyncExternalStore` with no
`getServerSnapshot`, so anything reading a `StateStore` throws on the server. A
server-render test here would fail on that rather than on this hook. Recorded in both the
hook and the test file so whoever fixes that knows to add one.
…State

`DayjsLocaleConfig` was public on `release-v15` via `export * from './Streami18n'` and was dropped
when the class became a subclass of core's: core exports it from `stream-chat/i18n`, but this
package's re-export list omitted it. The localization guide instructs importing it from here to
type `dayjsLocaleConfigForLanguage` and `registerTranslation`'s third argument, so an integrator
following the guide got TS2305.

`Streami18nState` is new, and it exists because `state` is public now. Subscribing to it wants a
module-scope selector -- `useStateStore` takes the selector as a dependency of both its
`useCallback` and its `useMemo`, so an inline one resubscribes on every render -- and that needs a
nameable type. Core's default-parameterized `Streami18nState` will not do: it defaults the catalog
to `AnyTranslationCatalog`, and `t` is contravariant in its options, so the concrete store is not
assignable to it. `useStreami18n` had already declared exactly this alias privately; it now imports
the exported one instead of keeping a second copy.
oliverlaz added a commit to GetStream/stream-chat-js that referenced this pull request Aug 20, 2026
Moves the translation runtime shared by `stream-chat-react` and
`stream-chat-react-native` into this package as a new
**`stream-chat/i18n`** subpath, plus **`stream-chat/i18n/codegen`** for
the catalog generator. Both UI SDKs carried ~1,300 lines of
near-duplicate runtime that had drifted apart, each reverse-mapping this
package's English notification prose against its own hand-maintained
table of sentences.

**Breaking, and shipped together deliberately** — the first commit is
independently revertable if you'd rather split it:

- Notifications are keyed on `CORE_NOTIFICATION_TYPE` /
`CoreNotificationType`. `Notification.message` is now documented as a
developer-facing fallback whose wording is not contractual. Two
identifiers renamed (`api:message{s}:query:failed` → `messageJumpFailed`
/ `messageJumpToLatestFailed`).
- Poll-composer field errors become `{ code, message, metadata? }` keyed
on `POLL_VALIDATION_CODE`, instead of plain English strings.
- `engines.node` → `>=22.18.0` (the release that unflagged type
stripping, which the `.mts` build scripts need). Node 18/20 are no
longer tested — see the guide for what that means if you deploy the WS
client there.
- `i18next` and `dayjs` become direct dependencies. They stay out of the
root bundle; the subpath is what isolates them, and
`assertBundleBoundaries` fails the build if that ever regresses.

Also here: the generator moves out of `src/` to `codegen/i18n/` (it
reads the filesystem — not library source), ships ESM-only, and
`scripts/bundle.mjs` becomes `.mts` with a real typecheck gate.

**Docs:** `v9-to-v10-migration-guide-i18n.md` (new), plus a Node-floor
section in `-other.md`. Initiative record in `specs/i18n-to-core/`.

**Verified:** lint, all three `tsc` projects, 2,804 tests, and a
clean-install check of the packed tarball across all four export
conditions. The root bundle reaches neither `src/i18n/`, `i18next` nor
`dayjs` — machine-checked, not reviewed.

Consumer PRs, both blocked on this publishing as `10.0.0-rc.3`:
GetStream/stream-chat-react#3271 ·
GetStream/stream-chat-react-native#3777
oliverlaz added a commit to GetStream/stream-chat-js that referenced this pull request Aug 20, 2026
## Why

[Run
32373483292](https://github.com/GetStream/stream-chat-js/actions/runs/32373483292)
succeeded and released nothing:

```
ℹ  Found git tag v10.0.0-rc.4 associated with version 10.0.0-rc.4 on branch release-v10
ℹ  Found 1 commits since last release
ℹ  Analyzing commit: feat(i18n)!: share the translation runtime as stream-chat/i18n (#1830)
ℹ  Analysis of 1 commits complete: no release
ℹ  There are no relevant changes, so no new version is released.
```

`@semantic-release/commit-analyzer` was configured with the **angular**
preset, whose header pattern is:

```js
/^(\w*)(?:\((.*)\))?: (.*)$/
```

There is no slot for `!` between the scope and the colon, so a
`feat(i18n)!:` header fails to match **entirely** — not just in its
breaking marker. Parsing 40cf062 with each preset:

| preset | `type` | `scope` | BREAKING notes |
| --- | --- | --- | --- |
| `angular` | `undefined` | `undefined` | 0 |
| `conventionalcommits` | `feat` | `i18n` | 1 |

With `type` and `notes` both empty nothing can match — not the custom
`releaseRules`, and not the built-in defaults (`{breaking: true →
major}`, `{type: 'feat' → minor}`). Those defaults were reachable:
custom rules are tried first and the built-ins are the fallback. There
is no `BREAKING CHANGE:` footer in the body either, which is the only
other thing angular's parser reads.

## Three things this reconciles

- `release-notes-generator` in this same config **already** uses
`conventionalcommits`, so the two plugins disagreed. The notes would
have rendered a breaking feature the analyzer never saw.
- commitlint accepts the `!` form — the "Validate PR Title" check passed
on that exact title — so we lint for a convention the release pipeline
cannot act on.
- The analyzer now understands both `!` and a `BREAKING CHANGE:` footer,
rather than only the footer.

## Verification

Replayed both presets through the real `analyzeCommits` over the last
400 commits on `master` and `release-v10`:

```
analyzed 400 commits
verdict changes: 1
  40cf062 none -> major          feat(i18n)!: share the translation runtime as stream-chat/i18n (#1830)
angular  tally: {"none":165,"minor":103,"patch":127,"major":5}
convcomm tally: {"none":164,"minor":103,"patch":127,"major":6}
```

Exactly one verdict changes; the other 399 are identical. Also confirmed
the analyzer returns `major` when driven from `.releaserc.json` as
written, so the preset resolves —
`conventional-changelog-conventionalcommits` is already a devDependency.

## After this merges

Re-running Release from `release-v10` still finds only 40cf062 since
`v10.0.0-rc.4`, and will now cut **`10.0.0-rc.5`**. That is what
unblocks
[stream-chat-react#3271](GetStream/stream-chat-react#3271)
and
[stream-chat-react-native#3777](GetStream/stream-chat-react-native#3777),
whose CI currently compiles against published rc.3 and so cannot see the
`./i18n` subpath.

`master` carries the identical angular config and the same latent bug,
but no `!` commit has hit it yet. Worth the same one-line change there
before one does.
github-actions Bot pushed a commit to GetStream/stream-chat-js that referenced this pull request Aug 20, 2026
## [10.0.0-rc.5](v10.0.0-rc.4...v10.0.0-rc.5) (2026-08-20)

### ⚠ BREAKING CHANGES

* **i18n:** share the translation runtime as stream-chat/i18n (#1830)

### Features

* **i18n:** share the translation runtime as stream-chat/i18n ([#1830](#1830)) ([40cf062](40cf062)), closes [GetStream/stream-chat-react#3271](GetStream/stream-chat-react#3271) [GetStream/stream-chat-react-native#3777](GetStream/stream-chat-react-native#3777)
rc.5 is the first published core carrying the `stream-chat/i18n` subpath, so this is what makes the
branch installable and buildable against a real registry version rather than a locally packed
tarball. Bumped in the peer range, the dev dependency, and both example apps.

`i18next` now arrives transitively from core, as intended -- this package declares neither it nor
`dayjs` any more. `dayjs` is deduped so the vite example's `^1.11.20` and core's `^1.11.13` resolve
to one 1.11.23, rather than two copies where a `dayjs/locale/de` side-effect import could land on
the instance core is not using.

Four type errors remain, all inherited from `release-v15` rather than introduced here --
`APIErrorResponse`, `EventAPIResponse` (x2) and `channel.sendImage`, none of which core v10 exports
any more. Measured against `release-v15` with rc.5 installed: it has 8 errors and 45 failing tests,
this branch has 4 and 43. The difference is the poll-composer validation errors, which this branch
already adapted to `{ code, message }`.
Brings in the new upload API (#3272), the web counterpart of the React Native SDK's #3778. That
clears the last four type errors on this branch, all of which it had inherited rather than caused:
core v10 no longer exports `APIErrorResponse` or `EventAPIResponse`, and `channel.sendImage` is
gone.

Conflict resolution: four `stream-chat` version strings, `release-v15` at `10.0.0-rc.4` against
this branch's `10.0.0-rc.5`. Kept rc.5 -- it is the first published core carrying the
`stream-chat/i18n` subpath, so rc.4 would not resolve the subpath this branch imports. `yarn.lock`
regenerated rather than hand-merged; `moment` and `moment-timezone` leave the tree with the bump,
and `dayjs` is deduped to a single 1.11.23.

Gates now clean for the first time on this branch: `tsc -p tsconfig.lib.json` 0 errors (was 4),
233 suites / 2729 tests passing (was 43 failing), lint 0, build 0.
@oliverlaz
oliverlaz had a problem deploying to Vite Example Public (Preview) August 20, 2026 14:54 — with Image GitHub Actions Failure
@oliverlaz
oliverlaz had a problem deploying to Vite Example Development (Preview) August 20, 2026 14:54 — with Image GitHub Actions Error
@github-actions

Copy link
Copy Markdown

Size Change: -13.7 kB (-1.63%)

Total Size: 825 kB

📦 View Changed
Filename Size Change
dist/cjs/channel-detail.js 24.3 kB +27 B (+0.11%)
dist/cjs/index.js 6.08 kB +137 B (+2.31%)
dist/cjs/slot-layout.js 517 B -2 B (-0.39%)
dist/cjs/SlotLayout.js 13.1 kB -2 B (-0.02%)
dist/cjs/src.js 225 kB -4.03 kB (-1.76%)
dist/cjs/useChannel.js 24.2 kB -2.23 kB (-8.47%)
dist/es/components/ChannelListItem/ChannelListItemActionButtons.mjs 1.07 kB -1.53 kB (-58.71%) 🏆
dist/es/components/ChannelListItem/utils.mjs 2.76 kB +18 B (+0.66%)
dist/es/components/Chat/Chat.mjs 1.24 kB +16 B (+1.3%)
dist/es/components/Chat/hooks/useChat.mjs 609 B -316 B (-34.16%) 🎉
dist/es/components/Message/MessageTranslationIndicator.mjs 886 B -34 B (-3.7%)
dist/es/components/Poll/PollCreationDialog/MultipleAnswersField.mjs 1.43 kB +82 B (+6.07%) 🔍
dist/es/components/Poll/PollCreationDialog/NameField.mjs 760 B +43 B (+6%) 🔍
dist/es/components/Poll/PollCreationDialog/OptionFieldSet.mjs 2.35 kB +42 B (+1.82%)
dist/es/context/TranslationContext.mjs 441 B -62 B (-12.33%) 👏
dist/es/i18n/externalStrings.mjs 0 B -1.14 kB (removed) 🏆
dist/es/i18n/runtimeDefaults.mjs 1.1 kB -472 B (-30.1%) 🎉
dist/es/i18n/Streami18n.mjs 1 kB -4.07 kB (-80.22%) 🏆
dist/es/i18n/TranslationBuilder/index.mjs 123 B +123 B (new file) 🆕
dist/es/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.mjs 563 B -40 B (-6.63%)
dist/es/i18n/TranslationBuilder/notifications/translators.mjs 669 B -51 B (-7.08%)
dist/es/i18n/TranslationBuilder/notifications/translatorsByNotificationType.mjs 1.19 kB +525 B (+78.83%) 🆘
dist/es/i18n/TranslationBuilder/TranslationBuilder.mjs 0 B -755 B (removed) 🏆
dist/es/i18n/useStreami18n.mjs 2.1 kB +2.1 kB (new file) 🆕
dist/es/i18n/utils.mjs 466 B -2.12 kB (-81.96%) 🏆
dist/es/index.mjs 8.29 kB +19 B (+0.23%)
ℹ️ View Unchanged
Filename Size
dist/cjs/audioProcessing.js 1.74 kB
dist/cjs/emojis.js 2.54 kB
dist/cjs/mp3-encoder.js 814 B
dist/cjs/ReactPlayerWrapper.js 540 B
dist/cjs/slot-js 2.32 kB
dist/css/channel-detail.css 2.84 kB
dist/css/emoji-picker.css 178 B
dist/css/emoji-replacement.css 456 B
dist/css/index.css 41.7 kB
dist/es/a11y/a11yUtils.mjs 630 B
dist/es/a11y/accessibleLabel.mjs 764 B
dist/es/a11y/hooks/useAriaIdentifiers.mjs 540 B
dist/es/a11y/hooks/useListboxKeyboardNavigation.mjs 1.52 kB
dist/es/a11y/hooks/useResolvedModalAriaProps.mjs 497 B
dist/es/a11y/hooks/useVirtualizedListboxKeyboardNavigation.mjs 1.39 kB
dist/es/channel-detail.mjs 802 B
dist/es/components/Accessibility/AriaLiveAnnouncerProvider.mjs 1.65 kB
dist/es/components/Accessibility/AriaLiveOutlet.mjs 964 B
dist/es/components/Accessibility/AriaLiveOutletContext.mjs 194 B
dist/es/components/Accessibility/hooks/useAudioPlaybackChangeAnnouncements.mjs 425 B
dist/es/components/Accessibility/hooks/useFocusReturn.mjs 916 B
dist/es/components/Accessibility/hooks/useIncomingMessageAnnouncements.mjs 1.26 kB
dist/es/components/Accessibility/hooks/useInertWhenHidden.mjs 1.62 kB
dist/es/components/Accessibility/hooks/useInteractionAnnouncements.mjs 3.31 kB
dist/es/components/Accessibility/NotificationAnnouncer.mjs 1.36 kB
dist/es/components/Accessibility/scheduling/useAnnouncementQueue.mjs 793 B
dist/es/components/Accessibility/scheduling/useDebouncedAnnounce.mjs 1.68 kB
dist/es/components/Accessibility/scheduling/useSettledAnnouncement.mjs 1.84 kB
dist/es/components/Accessibility/useAriaLiveAnnouncer.mjs 293 B
dist/es/components/AIStateIndicator/AIStateIndicator.mjs 471 B
dist/es/components/AIStateIndicator/hooks/useAIState.mjs 616 B
dist/es/components/Attachment/attachment-sizing.mjs 1.05 kB
dist/es/components/Attachment/Attachment.mjs 1.15 kB
dist/es/components/Attachment/AttachmentActions.mjs 1.65 kB
dist/es/components/Attachment/AttachmentContainer.mjs 1.98 kB
dist/es/components/Attachment/Audio.mjs 1.43 kB
dist/es/components/Attachment/audioSampling.mjs 1.29 kB
dist/es/components/Attachment/components/DownloadButton.mjs 676 B
dist/es/components/Attachment/components/FileSizeIndicator.mjs 436 B
dist/es/components/Attachment/FileAttachment.mjs 569 B
dist/es/components/Attachment/Geolocation.mjs 1.14 kB
dist/es/components/Attachment/Giphy.mjs 1.04 kB
dist/es/components/Attachment/giphyAccessibility.mjs 481 B
dist/es/components/Attachment/icons.mjs 411 B
dist/es/components/Attachment/Image.mjs 346 B
dist/es/components/Attachment/LinkPreview/Card.mjs 1.01 kB
dist/es/components/Attachment/LinkPreview/UnableToRenderCard.mjs 411 B
dist/es/components/Attachment/ModalGallery.mjs 2.05 kB
dist/es/components/Attachment/UnsupportedAttachment.mjs 403 B
dist/es/components/Attachment/utils.mjs 740 B
dist/es/components/Attachment/VideoAttachment.mjs 702 B
dist/es/components/Attachment/VisibilityDisclaimer.mjs 362 B
dist/es/components/Attachment/VoiceRecording.mjs 1.7 kB
dist/es/components/AudioPlayback/AudioPlayer.mjs 3.85 kB
dist/es/components/AudioPlayback/AudioPlayerPool.mjs 1.31 kB
dist/es/components/AudioPlayback/components/DurationDisplay.mjs 596 B
dist/es/components/AudioPlayback/components/formatTime.mjs 339 B
dist/es/components/AudioPlayback/components/keyboardSeek.mjs 524 B
dist/es/components/AudioPlayback/components/PlaybackRateButton.mjs 300 B
dist/es/components/AudioPlayback/components/ProgressBar.mjs 833 B
dist/es/components/AudioPlayback/components/progressBarA11y.mjs 484 B
dist/es/components/AudioPlayback/components/useInteractiveProgressBar.mjs 1.07 kB
dist/es/components/AudioPlayback/components/WaveProgressBar.mjs 1.74 kB
dist/es/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.mjs 659 B
dist/es/components/AudioPlayback/WithAudioPlayback.mjs 1 kB
dist/es/components/Avatar/Avatar.mjs 980 B
dist/es/components/Avatar/AvatarStack.mjs 665 B
dist/es/components/Avatar/ChannelAvatar.mjs 344 B
dist/es/components/Avatar/GroupAvatar.mjs 868 B
dist/es/components/Avatar/utils.mjs 183 B
dist/es/components/Badge/Badge.mjs 470 B
dist/es/components/Badge/MediaBadge.mjs 430 B
dist/es/components/BaseImage/BaseImage.mjs 682 B
dist/es/components/BaseImage/ImagePlaceholder.mjs 404 B
dist/es/components/BaseImage/toBaseImageDescriptors.mjs 547 B
dist/es/components/Button/Button.mjs 529 B
dist/es/components/Button/PlayButton.mjs 480 B
dist/es/components/Channel/Channel.mjs 2.61 kB
dist/es/components/Channel/constants.mjs 156 B
dist/es/components/Channel/hooks/useChannelCapabilities.mjs 355 B
dist/es/components/Channel/hooks/useChannelConfig.mjs 301 B
dist/es/components/Channel/hooks/useChannelContainerClasses.mjs 388 B
dist/es/components/Channel/hooks/useChannelRequestHandlers.mjs 615 B
dist/es/components/Channel/hooks/useEditMessageHandler.mjs 359 B
dist/es/components/ChannelHeader/ChannelHeader.mjs 1.01 kB
dist/es/components/ChannelHeader/hooks/useChannelHasMembersOnline.mjs 630 B
dist/es/components/ChannelHeader/hooks/useChannelHeaderOnlineStatus.mjs 690 B
dist/es/components/ChannelList/ChannelList.mjs 1.19 kB
dist/es/components/ChannelList/ChannelListHeader.mjs 430 B
dist/es/components/ChannelList/ChannelLists.mjs 693 B
dist/es/components/ChannelList/ChannelNavigation.mjs 684 B
dist/es/components/ChannelList/hooks/useChannelListKeyboardNavigation.mjs 1.25 kB
dist/es/components/ChannelList/hooks/useChannelMembershipState.mjs 262 B
dist/es/components/ChannelList/hooks/useChannelMembersState.mjs 300 B
dist/es/components/ChannelList/hooks/useChannelPaginatorState.mjs 540 B
dist/es/components/ChannelList/hooks/useSelectedChannelState.mjs 403 B
dist/es/components/ChannelListItem/ChannelListItem.mjs 1.23 kB
dist/es/components/ChannelListItem/ChannelListItemTimestamp.mjs 503 B
dist/es/components/ChannelListItem/ChannelListItemUI.mjs 1.52 kB
dist/es/components/ChannelListItem/hooks/useChannelDisplayName.mjs 831 B
dist/es/components/ChannelListItem/hooks/useChannelPreviewInfo.mjs 624 B
dist/es/components/ChannelListItem/hooks/useIsChannelMuted.mjs 668 B
dist/es/components/ChannelListItem/hooks/useIsUserMuted.mjs 271 B
dist/es/components/ChannelListItem/hooks/useMessageDeliveryStatus.mjs 655 B
dist/es/components/ChannelListItem/utils.a11y.mjs 2.62 kB
dist/es/components/Chat/hooks/useCreateChatClient.mjs 526 B
dist/es/components/Chat/hooks/useCreateChatContext.mjs 462 B
dist/es/components/Chat/hooks/useReportLostConnectionSystemNotification.mjs 709 B
dist/es/components/Chat/hooks/useSplitActionSet.mjs 317 B
dist/es/components/DateSeparator/DateSeparator.mjs 572 B
dist/es/components/Dialog/components/Alert.mjs 647 B
dist/es/components/Dialog/components/Callout.mjs 825 B
dist/es/components/Dialog/components/ContextMenu.mjs 5.53 kB
dist/es/components/Dialog/components/Prompt.mjs 1.08 kB
dist/es/components/Dialog/components/Viewer.mjs 980 B
dist/es/components/Dialog/hooks/useDialog.mjs 688 B
dist/es/components/Dialog/hooks/usePopoverPosition.mjs 925 B
dist/es/components/Dialog/service/DialogAnchor.mjs 2.06 kB
dist/es/components/Dialog/service/DialogManager.mjs 1.34 kB
dist/es/components/Dialog/service/DialogPortal.mjs 1.02 kB
dist/es/components/DragAndDrop/DragAndDropContainer.mjs 1.16 kB
dist/es/components/EmptyStateIndicator/EmptyStateIndicator.mjs 603 B
dist/es/components/EventComponent/EventComponent.mjs 462 B
dist/es/components/FileIcon/FileIconSet.mjs 6.71 kB
dist/es/components/FileIcon/iconMap.mjs 512 B
dist/es/components/FileIcon/mimeTypes.mjs 1.73 kB
dist/es/components/FileIcon/mjs 599 B
dist/es/components/Form/FieldError.mjs 261 B
dist/es/components/Form/hooks/useFormState.mjs 550 B
dist/es/components/Form/mjs 1.58 kB
dist/es/components/Form/NumericInput.mjs 1.34 kB
dist/es/components/Form/SwitchField.mjs 1.54 kB
dist/es/components/Form/TextInput.mjs 1.27 kB
dist/es/components/Form/TextInputFieldSet.mjs 376 B
dist/es/components/Gallery/Gallery.mjs 654 B
dist/es/components/Gallery/GalleryContext.mjs 335 B
dist/es/components/Gallery/GalleryHeader.mjs 1.21 kB
dist/es/components/Gallery/GalleryUI.mjs 2.02 kB
dist/es/components/Icons/createIcon.mjs 429 B
dist/es/components/Icons/icons.mjs 18.5 kB
dist/es/components/Icons/mjs 378 B
dist/es/components/InfiniteScrollPaginator/hooks/useCursorPaginator.mjs 591 B
dist/es/components/InfiniteScrollPaginator/InfiniteScroll.mjs 1.34 kB
dist/es/components/InfiniteScrollPaginator/InfiniteScrollPaginator.mjs 1.14 kB
dist/es/components/InfiniteScrollPaginator/InfiniteScrollWithComponents.mjs 826 B
dist/es/components/ListItemLayout/ListItemLayout.mjs 707 B
dist/es/components/Loading/LoadingChannel.mjs 639 B
dist/es/components/Loading/LoadingChannels.mjs 377 B
dist/es/components/Loading/LoadingErrorIndicator.mjs 405 B
dist/es/components/Loading/LoadingIndicator.mjs 247 B
dist/es/components/Loading/progress-indicators.mjs 734 B
dist/es/components/Loading/UploadedSizeIndicator.mjs 413 B
dist/es/components/Loading/UploadProgressIndicator.mjs 344 B
dist/es/components/LoadMore/LoadMoreButton.mjs 503 B
dist/es/components/LoadMore/LoadMorePaginator.mjs 378 B
dist/es/components/Location/hooks/useLiveLocationSharingManager.mjs 631 B
dist/es/components/Location/ShareLocationDialog.mjs 2.26 kB
dist/es/components/MediaRecorder/AudioRecorder/AudioRecorder.mjs 628 B
dist/es/components/MediaRecorder/AudioRecorder/AudioRecorderRecordingControls.mjs 1.03 kB
dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingButtonWithNotification.mjs 1.05 kB
dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingPlayback.mjs 996 B
dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.mjs 900 B
dist/es/components/MediaRecorder/AudioRecorder/hooks/useTimeElapsed.mjs 434 B
dist/es/components/MediaRecorder/AudioRecorder/recordingStateIdentity.mjs 227 B
dist/es/components/MediaRecorder/AudioRecorder/RecordingTimer.mjs 322 B
dist/es/components/MediaRecorder/classes/AmplitudeRecorder.mjs 1.07 kB
dist/es/components/MediaRecorder/classes/BrowserPermission.mjs 758 B
dist/es/components/MediaRecorder/classes/MediaRecorderController.mjs 2.58 kB
dist/es/components/MediaRecorder/hooks/useMediaRecorder.mjs 917 B
dist/es/components/MediaRecorder/observable/BehaviorSubject.mjs 353 B
dist/es/components/MediaRecorder/observable/mjs 186 B
dist/es/components/MediaRecorder/observable/Observable.mjs 315 B
dist/es/components/MediaRecorder/observable/Subject.mjs 550 B
dist/es/components/MediaRecorder/observable/Subscription.mjs 211 B
dist/es/components/MediaRecorder/RecordingPermissionDeniedNotification.mjs 503 B
dist/es/components/MediaRecorder/transcode/audioProcessing.mjs 758 B
dist/es/components/MediaRecorder/transcode/index.mjs 351 B
dist/es/components/MediaRecorder/transcode/wav.mjs 1.33 kB
dist/es/components/Message/emojiRegex.mjs 450 B
dist/es/components/Message/hooks/useActionHandler.mjs 604 B
dist/es/components/Message/hooks/useDeleteHandler.mjs 617 B
dist/es/components/Message/hooks/useFlagHandler.mjs 373 B
dist/es/components/Message/hooks/useMarkUnreadHandler.mjs 414 B
dist/es/components/Message/hooks/useMentionsHandler.mjs 377 B
dist/es/components/Message/hooks/useMessageAlsoSentInChannelNavigation.mjs 1.01 kB
dist/es/components/Message/hooks/useMessageReminder.mjs 300 B
dist/es/components/Message/hooks/useMessageTextStreaming.mjs 783 B
dist/es/components/Message/hooks/useMuteHandler.mjs 688 B
dist/es/components/Message/hooks/useOpenThreadHandler.mjs 352 B
dist/es/components/Message/hooks/usePinHandler.mjs 610 B
dist/es/components/Message/hooks/useReactionHandler.mjs 1.34 kB
dist/es/components/Message/hooks/useReactionsFetcher.mjs 498 B
dist/es/components/Message/hooks/useRetryHandler.mjs 301 B
dist/es/components/Message/hooks/useUserHandler.mjs 255 B
dist/es/components/Message/hooks/useUserRole.mjs 746 B
dist/es/components/Message/Message.mjs 1.66 kB
dist/es/components/Message/MessageAlsoSentInChannelIndicator.mjs 655 B
dist/es/components/Message/MessageBlocked.mjs 451 B
dist/es/components/Message/MessageBubble.mjs 246 B
dist/es/components/Message/MessageDeletedBubble.mjs 398 B
dist/es/components/Message/MessageEditedIndicator.mjs 700 B
dist/es/components/Message/MessageRepliesCountButton.mjs 1.08 kB
dist/es/components/Message/MessageStatus.mjs 1.26 kB
dist/es/components/Message/MessageText.mjs 1.63 kB
dist/es/components/Message/MessageTimestamp.mjs 356 B
dist/es/components/Message/MessageUI.mjs 2.78 kB
dist/es/components/Message/PinIndicator.mjs 627 B
dist/es/components/Message/QuotedMessage.mjs 427 B
dist/es/components/Message/ReminderNotification.mjs 976 B
dist/es/components/Message/renderText/componentRenderers/Anchor.mjs 406 B
dist/es/components/Message/renderText/componentRenderers/Emoji.mjs 246 B
dist/es/components/Message/renderText/componentRenderers/Mention.mjs 307 B
dist/es/components/Message/renderText/regex.mjs 440 B
dist/es/components/Message/renderText/rehypePlugins/emojiMarkdownPlugin.mjs 338 B
dist/es/components/Message/renderText/rehypePlugins/mentionsMarkdownPlugin.mjs 1.47 kB
dist/es/components/Message/renderText/remarkPlugins/htmlToTextPlugin.mjs 243 B
dist/es/components/Message/renderText/remarkPlugins/imageToLink.mjs 591 B
dist/es/components/Message/renderText/remarkPlugins/keepLineBreaksPlugin.mjs 824 B
dist/es/components/Message/renderText/remarkPlugins/plusPlusToEmphasis.mjs 962 B
dist/es/components/Message/renderText/remarkPlugins/remarkIgnoreMarkdown.mjs 337 B
dist/es/components/Message/renderText/renderText.mjs 1.58 kB
dist/es/components/Message/StreamedMessageText.mjs 474 B
dist/es/components/Message/Timestamp.mjs 525 B
dist/es/components/Message/utils.mjs 2.59 kB
dist/es/components/MessageActions/DeleteMessageAlert.mjs 616 B
dist/es/components/MessageActions/DownloadSubmenu.mjs 843 B
dist/es/components/MessageActions/downloadUtils.mjs 980 B
dist/es/components/MessageActions/hooks/useBaseMessageActionSetFilter.mjs 1.26 kB
dist/es/components/MessageActions/MessageActions.mjs 4.22 kB
dist/es/components/MessageActions/QuickMessageActionButton.mjs 359 B
dist/es/components/MessageActions/RemindMeSubmenu.mjs 1 kB
dist/es/components/MessageBounce/MessageBounceModal.mjs 347 B
dist/es/components/MessageBounce/MessageBouncePrompt.mjs 805 B
dist/es/components/MessageComposer/AttachmentPreviewList/AttachmentPreviewList.mjs 1.19 kB
dist/es/components/MessageComposer/AttachmentPreviewList/AttachmentUploadedSizeIndicator.mjs 655 B
dist/es/components/MessageComposer/AttachmentPreviewList/AudioAttachmentPreview.mjs 1.81 kB
dist/es/components/MessageComposer/AttachmentPreviewList/FileAttachmentPreview.mjs 1.06 kB
dist/es/components/MessageComposer/AttachmentPreviewList/GeolocationPreview.mjs 758 B
dist/es/components/MessageComposer/AttachmentPreviewList/MediaAttachmentPreview.mjs 1.3 kB
dist/es/components/MessageComposer/AttachmentPreviewList/UnsupportedAttachmentPreview.mjs 534 B
dist/es/components/MessageComposer/AttachmentPreviewList/utils/AttachmentPreviewRoot.mjs 918 B
dist/es/components/MessageComposer/AttachmentPreviewList/VoiceRecordingPreviewSlot.mjs 546 B
dist/es/components/MessageComposer/AttachmentSelector/AttachmentSelector.mjs 3.29 kB
dist/es/components/MessageComposer/AttachmentSelector/CommandsMenu.mjs 1.39 kB
dist/es/components/MessageComposer/CommandChip.mjs 563 B
dist/es/components/MessageComposer/CooldownTimer.mjs 294 B
dist/es/components/MessageComposer/EditedMessagePreview.mjs 334 B
dist/es/components/MessageComposer/hooks/useAttachmentManagerState.mjs 405 B
dist/es/components/MessageComposer/hooks/useAttachmentsForPreview.mjs 362 B
dist/es/components/MessageComposer/hooks/useCanCreatePoll.mjs 285 B
dist/es/components/MessageComposer/hooks/useCooldownRemaining.mjs 429 B
dist/es/components/MessageComposer/hooks/useCreateMessageComposerContext.mjs 419 B
dist/es/components/MessageComposer/hooks/useIsCooldownActive.mjs 274 B
dist/es/components/MessageComposer/hooks/useMessageComposerBindings.mjs 348 B
dist/es/components/MessageComposer/hooks/useMessageComposerCommands.mjs 400 B
dist/es/components/MessageComposer/hooks/useMessageComposerController.mjs 643 B
dist/es/components/MessageComposer/hooks/useMessageComposerHasSendableData.mjs 274 B
dist/es/components/MessageComposer/hooks/useMessageContentIsEmpty.mjs 274 B
dist/es/components/MessageComposer/hooks/usePasteHandler.mjs 579 B
dist/es/components/MessageComposer/hooks/useSendMessageFn.mjs 1.15 kB
dist/es/components/MessageComposer/hooks/useTextareaRef.mjs 252 B
dist/es/components/MessageComposer/hooks/useUpdateMessageFn.mjs 620 B
dist/es/components/MessageComposer/hooks/utils.mjs 324 B
dist/es/components/MessageComposer/icons.mjs 1.28 kB
dist/es/components/MessageComposer/LinkPreviewList.mjs 1.06 kB
dist/es/components/MessageComposer/MessageComposer.mjs 854 B
dist/es/components/MessageComposer/MessageComposerActions.mjs 1.38 kB
dist/es/components/MessageComposer/MessageComposerUI.mjs 1.43 kB
dist/es/components/MessageComposer/preEditSnapshot.mjs 575 B
dist/es/components/MessageComposer/QuotedMessageIndicator.mjs 263 B
dist/es/components/MessageComposer/QuotedMessagePreview.mjs 3.06 kB
dist/es/components/MessageComposer/RemoveAttachmentPreviewButton.mjs 474 B
dist/es/components/MessageComposer/SendButton.mjs 488 B
dist/es/components/MessageComposer/SendToChannelCheckbox.mjs 764 B
dist/es/components/MessageComposer/StopAIGenerationButton.mjs 373 B
dist/es/components/MessageComposer/WithDragAndDropUpload.mjs 1.57 kB
dist/es/components/MessageList/FloatingDateSeparator.mjs 682 B
dist/es/components/MessageList/GiphyPreviewMessage.mjs 278 B
dist/es/components/MessageList/hooks/MessageList/useEnrichedMessages.mjs 643 B
dist/es/components/MessageList/hooks/MessageList/useFloatingDateSeparatorMessageList.mjs 937 B
dist/es/components/MessageList/hooks/MessageList/useMessageListElements.mjs 624 B
dist/es/components/MessageList/hooks/MessageList/useMessageListScrollManager.mjs 1.72 kB
dist/es/components/MessageList/hooks/MessageList/useScrollLocationLogic.mjs 980 B
dist/es/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.mjs 1.21 kB
dist/es/components/MessageList/hooks/useLastDeliveredData.mjs 418 B
dist/es/components/MessageList/hooks/useLastOwnMessage.mjs 249 B
dist/es/components/MessageList/hooks/useLastReadData.mjs 411 B
dist/es/components/MessageList/hooks/useMarkRead.mjs 1.21 kB
dist/es/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.mjs 955 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.mjs 434 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.mjs 396 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.mjs 636 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.mjs 647 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.mjs 499 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.mjs 422 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.mjs 827 B
dist/es/components/MessageList/MessageList.mjs 3.34 kB
dist/es/components/MessageList/MessageListMainPanel.mjs 284 B
dist/es/components/MessageList/NewMessageNotification.mjs 561 B
dist/es/components/MessageList/renderMessages.mjs 1.1 kB
dist/es/components/MessageList/ScrollToLatestMessageButton.mjs 1.17 kB
dist/es/components/MessageList/UnreadMessagesNotification.mjs 852 B
dist/es/components/MessageList/UnreadMessagesSeparator.mjs 744 B
dist/es/components/MessageList/utils.mjs 2.22 kB
dist/es/components/MessageList/VirtualizedMessageList.mjs 4.28 kB
dist/es/components/MessageList/VirtualizedMessageListComponents.mjs 1.65 kB
dist/es/components/Modal/GlobalModal.mjs 1.81 kB
dist/es/components/Notifications/hooks/useNotificationApi.mjs 1.27 kB
dist/es/components/Notifications/hooks/useNotifications.mjs 569 B
dist/es/components/Notifications/hooks/useNotificationTarget.mjs 410 B
dist/es/components/Notifications/hooks/useSystemNotifications.mjs 458 B
dist/es/components/Notifications/Notification.mjs 1.22 kB
dist/es/components/Notifications/NotificationConfigurationContext.mjs 386 B
dist/es/components/Notifications/NotificationList.mjs 3.18 kB
dist/es/components/Notifications/notificationTarget.mjs 636 B
dist/es/components/Poll/hooks/useManagePollVotesRealtime.mjs 686 B
dist/es/components/Poll/hooks/usePollAnswerPagination.mjs 586 B
dist/es/components/Poll/hooks/usePollOptionVotesPagination.mjs 601 B
dist/es/components/Poll/mjs 890 B
dist/es/components/Poll/Poll.mjs 302 B
dist/es/components/Poll/PollActions/AddCommentPrompt.mjs 1.32 kB
dist/es/components/Poll/PollActions/EndPollAlert.mjs 823 B
dist/es/components/Poll/PollActions/PollAction.mjs 492 B
dist/es/components/Poll/PollActions/PollActions.mjs 1.37 kB
dist/es/components/Poll/PollActions/PollAnswerList.mjs 1.05 kB
dist/es/components/Poll/PollActions/PollOptionsFullList.mjs 583 B
dist/es/components/Poll/PollActions/PollQuestion.mjs 346 B
dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotes.mjs 852 B
dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.mjs 709 B
dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotesList.mjs 614 B
dist/es/components/Poll/PollActions/PollResults/PollResults.mjs 1.11 kB
dist/es/components/Poll/PollActions/SuggestPollOptionPrompt.mjs 1.32 kB
dist/es/components/Poll/PollContent.mjs 489 B
dist/es/components/Poll/PollCreationDialog/PollCreationDialog.mjs 1.12 kB
dist/es/components/Poll/PollCreationDialog/PollCreationDialogControls.mjs 815 B
dist/es/components/Poll/PollCreationDialog/PollOptionReorderHandle.mjs 1.01 kB
dist/es/components/Poll/PollHeader.mjs 683 B
dist/es/components/Poll/PollOptionList.mjs 846 B
dist/es/components/Poll/PollOptionSelector.mjs 1.52 kB
dist/es/components/Portal/Portal.mjs 300 B
dist/es/components/ReactFileUtilities/UploadButton.mjs 813 B
dist/es/components/ReactFileUtilities/utils.mjs 1.06 kB
dist/es/components/Reactions/hooks/useFetchReactions.mjs 714 B
dist/es/components/Reactions/hooks/useProcessReactions.mjs 1.23 kB
dist/es/components/Reactions/MessageReactions.mjs 2.08 kB
dist/es/components/Reactions/MessageReactionsDetail.mjs 1.98 kB
dist/es/components/Reactions/reactionOptions.mjs 1.11 kB
dist/es/components/Reactions/ReactionSelector.mjs 1.56 kB
dist/es/components/Reactions/ReactionSelectorWithButton.mjs 873 B
dist/es/components/Reactions/SpriteImage.mjs 727 B
dist/es/components/Reactions/utils/utils.mjs 284 B
dist/es/components/SafeAnchor/SafeAnchor.mjs 336 B
dist/es/components/Search/hooks/useAnnounceSearchResultCount.mjs 1.31 kB
dist/es/components/Search/hooks/useSearchFocusedMessage.mjs 291 B
dist/es/components/Search/hooks/useSearchQueriesInProgress.mjs 450 B
dist/es/components/Search/hooks/useSearchResultsKeyboardNavigation.mjs 721 B
dist/es/components/Search/Search.mjs 643 B
dist/es/components/Search/SearchBar/SearchBar.mjs 1.34 kB
dist/es/components/Search/SearchContext.mjs 331 B
dist/es/components/Search/SearchResults/SearchResultItem.mjs 1.32 kB
dist/es/components/Search/SearchResults/SearchResults.mjs 716 B
dist/es/components/Search/SearchResults/SearchResultsHeader.mjs 910 B
dist/es/components/Search/SearchResults/SearchResultsPresearch.mjs 322 B
dist/es/components/Search/SearchResults/SearchSourceResultList.mjs 649 B
dist/es/components/Search/SearchResults/SearchSourceResultListFooter.mjs 562 B
dist/es/components/Search/SearchResults/SearchSourceResults.mjs 562 B
dist/es/components/Search/SearchResults/SearchSourceResultsEmpty.mjs 326 B
dist/es/components/Search/SearchResults/SearchSourceResultsHeader.mjs 148 B
dist/es/components/Search/SearchResults/SearchSourceResultsLoadingIndicator.mjs 390 B
dist/es/components/Search/SearchSourceResultsContext.mjs 344 B
dist/es/components/SkipNavigation/SkipNavigation.mjs 1.01 kB
dist/es/components/SummarizedMessagePreview/hooks/useLatestMessagePreview.mjs 1.52 kB
dist/es/components/SummarizedMessagePreview/SummarizedMessagePreview.mjs 799 B
dist/es/components/TextareaComposer/hooks/useTextareaPlaceholder.mjs 685 B
dist/es/components/TextareaComposer/SuggestionList/CommandItem.mjs 480 B
dist/es/components/TextareaComposer/SuggestionList/EmoticonItem.mjs 508 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/BroadcastMentionItem.mjs 632 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/MentionItem.mjs 439 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/MentionSuggestionTitle.mjs 236 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/mjs 775 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/SpecialMentionItem.mjs 161 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/UserGroupItem.mjs 566 B
dist/es/components/TextareaComposer/SuggestionList/SuggestionList.mjs 2.42 kB
dist/es/components/TextareaComposer/SuggestionList/SuggestionListItem.mjs 649 B
dist/es/components/TextareaComposer/SuggestionList/TokenizedSuggestionParts.mjs 608 B
dist/es/components/TextareaComposer/TextareaComposer.mjs 3.78 kB
dist/es/components/Thread/hooks/useThreadRequestHandlers.mjs 949 B
dist/es/components/Thread/LegacyThreadContext.mjs 198 B
dist/es/components/Thread/Thread.mjs 1.58 kB
dist/es/components/Thread/ThreadHead.mjs 404 B
dist/es/components/Thread/ThreadHeader.mjs 1.48 kB
dist/es/components/Thread/ThreadStart.mjs 458 B
dist/es/components/Threads/ThreadContext.mjs 265 B
dist/es/components/Threads/ThreadList/ThreadList.mjs 1.63 kB
dist/es/components/Threads/ThreadList/ThreadListEmptyPlaceholder.mjs 385 B
dist/es/components/Threads/ThreadList/ThreadListHeader.mjs 428 B
dist/es/components/Threads/ThreadList/ThreadListItem.mjs 351 B
dist/es/components/Threads/ThreadList/ThreadListItemUI.mjs 1.84 kB
dist/es/components/Threads/ThreadList/ThreadListLoadingIndicator.mjs 441 B
dist/es/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.mjs 663 B
dist/es/components/Threads/ThreadList/utils.a11y.mjs 1.81 kB
dist/es/components/Threads/UnreadCountBadge.mjs 332 B
dist/es/components/Tooltip/hooks/useEnterLeaveHandlers.mjs 296 B
dist/es/components/Tooltip/Tooltip.mjs 556 B
dist/es/components/TypingIndicator/hooks/useDebouncedTypingActive.mjs 974 B
dist/es/components/TypingIndicator/TypingIndicator.mjs 1.36 kB
dist/es/components/TypingIndicator/TypingIndicatorDots.mjs 411 B
dist/es/components/TypingIndicator/TypingIndicatorHeader.mjs 934 B
dist/es/components/TypingIndicator/utils/getTypingStatusMessage.mjs 442 B
dist/es/components/UtilityComponents/ErrorBoundary.mjs 313 B
dist/es/components/UtilityComponents/hooks/useMutationObserver.mjs 798 B
dist/es/components/UtilityComponents/useStableId.mjs 455 B
dist/es/components/VideoPlayer/ReactPlayerWrapper.mjs 475 B
dist/es/components/VideoPlayer/VideoPlayer.mjs 445 B
dist/es/components/VideoPlayer/VideoThumbnail.mjs 556 B
dist/es/components/VisuallyHidden/VisuallyHidden.mjs 397 B
dist/es/constants/messageTypes.mjs 173 B
dist/es/context/AttachmentContext.mjs 344 B
dist/es/context/AttachmentSelectorContext.mjs 272 B
dist/es/context/ChannelInstanceContext.mjs 385 B
dist/es/context/ChannelListContext.mjs 369 B
dist/es/context/ChatContext.mjs 282 B
dist/es/context/ComponentContext.mjs 257 B
dist/es/context/DialogManagerContext.mjs 1.41 kB
dist/es/context/MessageBounceContext.mjs 712 B
dist/es/context/MessageComposerContext.mjs 408 B
dist/es/context/MessageContext.mjs 285 B
dist/es/context/MessageListContext.mjs 325 B
dist/es/context/MessageTranslationViewContext.mjs 1.53 kB
dist/es/context/ModalContext.mjs 403 B
dist/es/context/PollContext.mjs 300 B
dist/es/context/requireContext.mjs 440 B
dist/es/context/useChannel.mjs 333 B
dist/es/context/VirtualizedMessageListContext.mjs 338 B
dist/es/context/WithComponents.mjs 311 B
dist/es/context/WorkspaceNavigationContext.mjs 492 B
dist/es/emojis.mjs 126 B
dist/es/hooks/useIsDmChannel.mjs 510 B
dist/es/hooks/useMessagePaginator.mjs 275 B
dist/es/mp3-encoder.mjs 778 B
dist/es/plugins/ChannelDetail/AvatarWithChannelDetail.mjs 726 B
dist/es/plugins/ChannelDetail/ChannelDetail.mjs 920 B
dist/es/plugins/ChannelDetail/ChannelDetailContext.mjs 373 B
dist/es/plugins/ChannelDetail/ChannelDetailEmptyList.mjs 307 B
dist/es/plugins/ChannelDetail/ChannelDetailListLoadingIndicator.mjs 419 B
dist/es/plugins/ChannelDetail/ChannelDetailNavButton.mjs 505 B
dist/es/plugins/ChannelDetail/ChannelDetailSearchInput.mjs 574 B
dist/es/plugins/ChannelDetail/SectionNavigator/SectionNavigator.mjs 1.79 kB
dist/es/plugins/ChannelDetail/SectionNavigator/SectionNavigatorHeader.mjs 831 B
dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesEmptyList.mjs 455 B
dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.mjs 1.5 kB
dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.utils.mjs 1.1 kB
dist/es/plugins/ChannelDetail/Views/ChannelFilesView/useChannelFilesSearch.mjs 726 B
dist/es/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementActions.mjs 3.89 kB
dist/es/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementView.mjs 3.67 kB
dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaEmptyList.mjs 471 B
dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.mjs 2.33 kB
dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.utils.mjs 705 B
dist/es/plugins/ChannelDetail/Views/ChannelMediaView/useChannelMediaSearch.mjs 723 B
dist/es/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberActions.mjs 3.45 kB
dist/es/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberDetail.mjs 1.05 kB
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersAddView.mjs 2.3 kB
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersBrowseView.mjs 1.62 kB
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersHeaderActions.mjs 1.65 kB
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.mjs 1.31 kB
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.utils.mjs 369 B
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/useChannelMemberCount.mjs 408 B
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/useChannelMemberIds.mjs 430 B
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/useChannelMembersSearch.mjs 744 B
dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesEmptyList.mjs 466 B
dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesView.mjs 1.73 kB
dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesCount.mjs 404 B
dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesSearch.mjs 881 B
dist/es/plugins/ChannelDetail/VirtualizedList/VirtualizedList.mjs 670 B
dist/es/plugins/Emojis/EmojiPicker.mjs 1.3 kB
dist/es/plugins/Emojis/middleware/textComposerEmojiMiddleware.mjs 1.38 kB
dist/es/plugins/SlotGeometry/SlotGeometry.mjs 2.26 kB
dist/es/plugins/SlotLayout/a11y.utility.mjs 295 B
dist/es/plugins/SlotLayout/ChannelSlot.mjs 569 B
dist/es/plugins/SlotLayout/ChatViewNavigationContext.mjs 2.4 kB
dist/es/plugins/SlotLayout/hooks/useLayoutViewState.mjs 470 B
dist/es/plugins/SlotLayout/hooks/useSlotEntity.mjs 1.84 kB
dist/es/plugins/SlotLayout/layout/Slot.mjs 725 B
dist/es/plugins/SlotLayout/layout/WorkspaceLayout.mjs 394 B
dist/es/plugins/SlotLayout/layoutController/LayoutController.mjs 2.95 kB
dist/es/plugins/SlotLayout/layoutController/serialization.mjs 805 B
dist/es/plugins/SlotLayout/mjs 3.65 kB
dist/es/plugins/SlotLayout/slotBinding.mjs 331 B
dist/es/plugins/SlotLayout/slotRegistry.mjs 1.09 kB
dist/es/plugins/SlotLayout/ThreadListSlot.mjs 680 B
dist/es/plugins/SlotLayout/ThreadSlot.mjs 506 B
dist/es/plugins/SlotLayout/ThreadSlotContext.mjs 190 B
dist/es/plugins/SlotLayout/workspaceNavigationAdapter.mjs 1.28 kB
dist/es/slot-layout.mjs 499 B
dist/es/slot-mjs 125 B
dist/es/store/hooks/useStateStore.mjs 484 B
dist/es/utils/findReverse.mjs 188 B
dist/es/utils/getChannel.mjs 720 B
dist/es/utils/getTextareaCaretRect.mjs 856 B
dist/es/utils/getWholeChar.mjs 368 B
dist/es/utils/isDmChannel.mjs 247 B
dist/es/utils/mergeDeep.mjs 197 B
dist/es/utils/useStableCallback.mjs 831 B

compressed-size-action

@codecov

codecov Bot commented Aug 20, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 87.50000% with 7 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (release-v15@04a31b1). Learn more about missing BASE report.

Files with missing lines Patch % Lines
...der/notifications/translatorsByNotificationType.ts 72.72% 3 Missing ⚠️
...8n/TranslationBuilder/notifications/translators.ts 0.00% 2 Missing ⚠️
src/i18n/useStreami18n.ts 92.85% 2 Missing ⚠️
Additional details and impacted files
@@              Coverage Diff               @@
##             release-v15    #3271   +/-   ##
==============================================
  Coverage               ?   84.13%           
==============================================
  Files                  ?      525           
  Lines                  ?    15640           
  Branches               ?     5011           
==============================================
  Hits                   ?    13159           
  Misses                 ?     2481           
  Partials               ?        0           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

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.

2 participants