Compare commits

..

84 Commits

Author SHA1 Message Date
Peng Xiao adaee0ef5f feat(component): sortable 2025-03-31 17:21:52 +08:00
EYHN baf1aad412 fix(core): fix flaky e2e test (#11308) 2025-03-31 09:10:54 +00:00
EYHN 231956fd39 feat(core): track for notifications (#11298) 2025-03-31 08:38:29 +00:00
EYHN 73c7815a6d feat(core): adjust notification style (#11296) 2025-03-31 08:38:28 +00:00
Fangdun Tsai 6850871bfb fix(editor): fix callout tests (#11301) 2025-03-31 08:37:20 +00:00
doouding 18cb4199fa fix: note should hide collapse button in presentation mode (#11292)
Fixes [BS-1003](https://linear.app/affine-design/issue/BS-1003/ppt-演示状态下-note-会显示折叠箭头)
2025-03-31 16:17:44 +08:00
EYHN 24c382d3aa feat(core): enable callout in canary (#11302) 2025-03-31 08:10:18 +00:00
pengx17 8bea31698e fix(electron): tray menu icon adapt to dark theme (#11288)
fix AF-2431
2025-03-31 07:23:01 +00:00
forehalo 94d5a42355 chore(core): allow quick export (#11295) 2025-03-31 06:58:17 +00:00
donteatfriedrice b2aa3084ec feat(editor): support to drag embed iframe from note to surface (#11267)
Close [BS-2807](https://linear.app/affine-design/issue/BS-2807/note-中与-surface-中-embed-iframe-block-互相拖动时的优化)
2025-03-31 06:23:11 +00:00
renovate 00c5f48a7d chore: bump up mime-types version to v3 (#11274)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [mime-types](https://redirect.github.com/jshttp/mime-types) | [`^2.1.35` -> `^3.0.0`](https://renovatebot.com/diffs/npm/mime-types/2.1.35/3.0.1) | [![age](https://developer.mend.io/api/mc/badges/age/npm/mime-types/3.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/mime-types/3.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/mime-types/2.1.35/3.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/mime-types/2.1.35/3.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) |

---

### Release Notes

<details>
<summary>jshttp/mime-types (mime-types)</summary>

### [`v3.0.1`](https://redirect.github.com/jshttp/mime-types/blob/HEAD/HISTORY.md#301--2025-03-26)

[Compare Source](https://redirect.github.com/jshttp/mime-types/compare/v3.0.0...v3.0.1)

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

-   deps: mime-db@1.54.0

### [`v3.0.0`](https://redirect.github.com/jshttp/mime-types/blob/HEAD/HISTORY.md#300--2024-08-31)

[Compare Source](https://redirect.github.com/jshttp/mime-types/compare/2.1.35...v3.0.0)

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

-   Drop support for node <18
-   deps: mime-db@1.53.0
-   resolve extension conflicts with mime-score ([#&#8203;119](https://redirect.github.com/jshttp/mime-types/issues/119))
    -   asc -> application/pgp-signature is now application/pgp-keys
    -   mpp -> application/vnd.ms-project is now application/dash-patch+xml
    -   ac -> application/vnd.nokia.n-gage.ac+xml is now application/pkix-attr-cert
    -   bdoc -> application/x-bdoc is now application/bdoc
    -   wmz -> application/x-msmetafile is now application/x-ms-wmz
    -   xsl -> application/xslt+xml is now application/xml
    -   wav -> audio/wave is now audio/wav
    -   rtf -> text/rtf is now application/rtf
    -   xml -> text/xml is now application/xml
    -   mp4 -> video/mp4 is now application/mp4
    -   mpg4 -> video/mp4 is now application/mp4

</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:eyJjcmVhdGVkSW5WZXIiOiIzOS4yMDcuMSIsInVwZGF0ZWRJblZlciI6IjM5LjIwNy4xIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->
2025-03-31 05:49:12 +00:00
pengx17 1306a9733b feat(core): some enhancements to recording (#11287)
- Added a check to verify if AI is enabled before attempting to transcribe meeting recordings
- Improved error handling for empty recordings
- Fixed the recording timeout logic to ensure it only stops the correct recording session
2025-03-31 05:37:17 +00:00
CatsJuice 7c41ddb789 chore(core): update right sidebar border color (#11222) 2025-03-31 05:11:03 +00:00
forehalo 57ec22ec2e fix(core): do not pass flavor in space id (#11285) 2025-03-31 04:47:00 +00:00
CatsJuice a91193c921 fix(core): hide readwise setting if not connected (#11107) 2025-03-31 04:08:02 +00:00
CatsJuice 7477ba6d37 feat(core): support sending success feedback via MessagePort for web clipper (#11256) 2025-03-31 03:54:44 +00:00
Mirone 9f939d823e fix(editor): slash menu e2e (#11289) 2025-03-31 11:13:34 +08:00
pengx17 61b3f82bfe fix(electron): should not record affine app itself (#11277)
fix AF-2428
2025-03-29 11:56:44 +00:00
pengx17 a94bef6738 fix(core): incorrect animated icon color & sizes (#11276) 2025-03-29 11:56:43 +00:00
doodlewind dffb89c388 feat(editor): add list block turbo renderer scaffold (#11266)
This PR allows placeholder in turbo renderer to cover list block as a basic scaffold.

![image.png](https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/lEGcysB4lFTEbCwZ8jMv/eda28656-e56e-4845-9fe6-885e70841697.png)
2025-03-29 04:49:25 +00:00
akumatus ac815142b3 refactor(core): add request time out error for ai (#11244)
### Why make this change?
Seperate front end timeout errors from server side errors.

### What changed?
- Add `RequestTimeoutError` which extends from `BaseAIError`.
- Track as `request timeout` instead of `server error`.
2025-03-29 04:27:40 +00:00
doouding ee66545ac9 fix: mind map created in page mode has incorrect style (#11265)
Fixes [BS-2878](https://linear.app/affine-design/issue/BS-2878/slashmenu插入mindmap,style没有应用上)
2025-03-29 04:13:29 +00:00
doouding fcc2ec9d66 feat: use block card to render edgeless dnd preview (#11261)
Related issue [BS-2610](https://linear.app/affine-design/issue/BS-2610/多选的拖拽:如果保护不支持预览的-block,则直接显示-icon-block-名称的方式做-fallback).

Use simpler way to render edgeless dnd preview.

![image.png](https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/57vl0IUaypligEBYUOO0/845d43ac-27e0-45fe-8289-2e6467c59108.png)
2025-03-29 04:13:28 +00:00
yoyoyohamapi 317d3e7ea6 test(core): split and enhance copilot e2e tests (#11007)
### TL;DR

Split and enhance copilot e2e tests.

### What Changed

#### Tests Structure

The e2e tests are organized into the following categories:

1. **Basic Tests (`/basic`)**: Tests for verifying core AI capabilities including feature onboarding, authorization workflows, and basic chat interactions.
2. **Chat Interaction Tests (`/chat-with`)**: Tests for verifying the AI's interaction with various ​object types, such as attachments, images, text content, Edgeless elements, etc.
3. **AI Action Tests (`/ai-action`)**: Tests for verifying the AI's actions, such as text translation, gramma correction, etc.
4. **Insertion Tests (`/insertion`)**: Tests for verifying answer insertion functionality.

#### Tests Writing

Writing a copilot test cases is easier and clear

e.g.
```ts
test('support chat with specified doc', async ({ page, utils }) => {
  // Initialize the doc
  await focusDocTitle(page);
  await page.keyboard.insertText('Test Doc');
  await page.keyboard.press('Enter');
  await page.keyboard.insertText('EEee is a cute cat');

  await utils.chatPanel.chatWithDoc(page, 'Test Doc');

  await utils.chatPanel.makeChat(page, 'What is EEee?');
  await utils.chatPanel.waitForHistory(page, [
    {
      role: 'user',
      content: 'What is EEee?',
    },
    {
      role: 'assistant',
      status: 'success',
    },
  ]);

  const { content } = await utils.chatPanel.getLatestAssistantMessage(page);
  expect(content).toMatch(/EEee/);
});
```

#### Summary

||Cases|
|------|----|
|Before|19||
|After|151||

> Close BS-2769
2025-03-29 03:41:09 +00:00
renovate a709ed2ef1 chore: bump up linter (major) (#11272)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [eslint-import-resolver-typescript](https://redirect.github.com/import-js/eslint-import-resolver-typescript) | [`^3.7.0` -> `^4.0.0`](https://renovatebot.com/diffs/npm/eslint-import-resolver-typescript/3.8.3/4.2.5) | [![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-import-resolver-typescript/4.2.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eslint-import-resolver-typescript/4.2.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eslint-import-resolver-typescript/3.8.3/4.2.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-import-resolver-typescript/3.8.3/4.2.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) |
| [eslint-plugin-unicorn](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn) | [`^57.0.0` -> `^58.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-unicorn/57.0.0/58.0.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-unicorn/58.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eslint-plugin-unicorn/58.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eslint-plugin-unicorn/57.0.0/58.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-unicorn/57.0.0/58.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) |

---

### Release Notes

<details>
<summary>import-js/eslint-import-resolver-typescript (eslint-import-resolver-typescript)</summary>

### [`v4.2.5`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/blob/HEAD/CHANGELOG.md#425)

[Compare Source](https://redirect.github.com/import-js/eslint-import-resolver-typescript/compare/v4.2.4...v4.2.5)

##### Patch Changes

-   [#&#8203;410](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/410) [`ec59d22`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/ec59d22fdd1ec8093dcb97da626c28ea346f41e3) Thanks [@&#8203;JounQin](https://redirect.github.com/JounQin)! - fix: absolute path aliasing should not be skipped

### [`v4.2.4`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/blob/HEAD/CHANGELOG.md#424)

[Compare Source](https://redirect.github.com/import-js/eslint-import-resolver-typescript/compare/v4.2.3...v4.2.4)

##### Patch Changes

-   [#&#8203;407](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/407) [`6b183ff`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/6b183fff1b42dfb1514545b91021dfa73ab4a1c5) Thanks [@&#8203;JounQin](https://redirect.github.com/JounQin)! - chore: migrate to rebranding `unrs-resolver` with new targets supported:

    -   `i686-pc-windows-msvc`
    -   `armv7-unknown-linux-musleabihf`
    -   `powerpc64le-unknown-linux-gnu`
    -   `s390x-unknown-linux-gnu`

### [`v4.2.3`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/blob/HEAD/CHANGELOG.md#423)

[Compare Source](https://redirect.github.com/import-js/eslint-import-resolver-typescript/compare/v4.2.2...v4.2.3)

##### Patch Changes

-   [#&#8203;402](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/402) [`f21bf15`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/f21bf152311cdaa85bdf390bba2824c56cb111da) Thanks [@&#8203;SunsetTechuila](https://redirect.github.com/SunsetTechuila)! - fix: don't resolve not implemented node modules in `bun`

    `is-bun-module` is marked as `dependency`, again, for correctness, see [`isBunImplementedNodeModule`](https://redirect.github.com/SunsetTechuila/is-bun-module#isbunimplementednodemodulemodulename-bunversion) for more details

    For `Bun` users: you don't need to install `is-bun-module` any more but `bun: true` option is still required if you're running without `bun --bun` nor [`run#bun`](https://bun.sh/docs/runtime/bunfig#run-bun-auto-alias-node-to-bun) enabled

### [`v4.2.2`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/blob/HEAD/CHANGELOG.md#422)

[Compare Source](https://redirect.github.com/import-js/eslint-import-resolver-typescript/compare/v4.2.1...v4.2.2)

##### Patch Changes

-   [#&#8203;397](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/397) [`14a7688`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/14a76885499cf99b0e5ea588aeb916a881c4efcb) Thanks [@&#8203;JounQin](https://redirect.github.com/JounQin)! - chore: bump `rspack-resolver` for better P'n'P support

    Now `rspack-resolver` resolves `pnpapi` natively.

### [`v4.2.1`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/blob/HEAD/CHANGELOG.md#421)

[Compare Source](https://redirect.github.com/import-js/eslint-import-resolver-typescript/compare/v4.2.0...v4.2.1)

##### Patch Changes

-   [#&#8203;394](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/394) [`9f11f6b`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/9f11f6bb94f1f9eae6794eea3e4624b80ceac305) Thanks [@&#8203;JounQin](https://redirect.github.com/JounQin)! - fix: don't set empty `configFile` when no `tsconfig` found

-   [#&#8203;394](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/394) [`9f11f6b`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/9f11f6bb94f1f9eae6794eea3e4624b80ceac305) Thanks [@&#8203;JounQin](https://redirect.github.com/JounQin)! - chore: bump `rspack-resolver` to v1.2.0

### [`v4.2.0`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/blob/HEAD/CHANGELOG.md#420)

[Compare Source](https://redirect.github.com/import-js/eslint-import-resolver-typescript/compare/v4.1.1...v4.2.0)

##### Minor Changes

-   [#&#8203;391](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/391) [`c8121e5`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/c8121e5eb4ce25a79396ae75df16d35fc67acbc6) Thanks [@&#8203;JounQin](https://redirect.github.com/JounQin)! - feat: make `is-bun-module` as optional peer dependency

    Technically this is a BREAKING CHANGE, but considering we just raise out v4 recently and this only affects `bun` users, `bun --bun eslint` even works without this dependency, so I'd consider this as a minor change.

    So for `bun` users, there are three options:

    1.  install `is-bun-module` dependency manually and use `bun: true` option
    2.  run `eslint` with `bun --bun eslint` w/o `bun: true` option
    3.  enable `run#bun` in [`bunfig.toml`](https://bun.sh/docs/runtime/bunfig#run-bun-auto-alias-node-to-bun) w/o `bun: true` option

### [`v4.1.1`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/blob/HEAD/CHANGELOG.md#411)

[Compare Source](https://redirect.github.com/import-js/eslint-import-resolver-typescript/compare/v4.1.0...v4.1.1)

##### Patch Changes

-   [#&#8203;389](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/389) [`1b97d8a`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/1b97d8a5913e15bdfcf5f64152e8a4173b18dab1) Thanks [@&#8203;JounQin](https://redirect.github.com/JounQin)! - fix: should prefer `module.isBuiltin` when `process.versions.bun` available

### [`v4.1.0`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/blob/HEAD/CHANGELOG.md#410)

[Compare Source](https://redirect.github.com/import-js/eslint-import-resolver-typescript/compare/v4.0.0...v4.1.0)

##### Minor Changes

-   [#&#8203;387](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/387) [`ef5cd10`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/ef5cd1083207d560b35694b99ccfefa4a1234acb) Thanks [@&#8203;JounQin](https://redirect.github.com/JounQin)! - feat: add a new `bun?: boolean` option for `bun` users - close [#&#8203;386](https://redirect.github.com/import-js/eslint-import-resolver-typescript/issues/386)

    `process.versions.bun` is unavailable even with `bun eslint` due to its own design,
    but checking `bun` modules for non-bun users is incorrect behavior and just wasting time,
    so a new option is added for such case, you can still run with `bun --bun eslint` without this option enabled

### [`v4.0.0`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/blob/HEAD/CHANGELOG.md#400)

[Compare Source](https://redirect.github.com/import-js/eslint-import-resolver-typescript/compare/v3.10.0...v4.0.0)

##### Major Changes

-   [#&#8203;368](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/368) [`2fd7c2e`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/2fd7c2ea63f30c9990e19a52dbd07fd8131558e9) Thanks [@&#8203;JounQin](https://redirect.github.com/JounQin)! - feat!: rewrite, speed up by using [`rspack-resolver`](https://redirect.github.com/unrs/rspack-resolver) which supports `references` natively under the hood

    BREAKING CHANGES:

    -   drop Node 14 support, Node `^16.17.0 || >=18.6` is now required
    -   `alwaysTryTypes` is enabled by default, you can set it as `false` to opt-out
    -   array type of `project` is discouraged but still supported, single `project` with `references` are encouraged for better performance, you can enable `noWarnOnMultipleProjects` option to supress the warning message
    -   root `tsconfig.json` or `jsconfig.json` will be used automatically if no `project` provided

### [`v3.10.0`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/releases/tag/v3.10.0)

[Compare Source](https://redirect.github.com/import-js/eslint-import-resolver-typescript/compare/v3.9.1...v3.10.0)

##### Minor Changes

-   [#&#8203;413](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/413) [`89c2795`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/89c2795cde0ddf0c38c941ee4cf5d4ce1f3ac842) Thanks [@&#8203;JounQin](https://redirect.github.com/JounQin)! - chore: housekeeping, bump all (dev) deps

    Migrate `rspack-resolver` to rebranding [`unrs-resolver`](https://redirect.github.com/unrs/unrs-resolver) for more targets support and other bug fixes

**Full Changelog**: https://github.com/import-js/eslint-import-resolver-typescript/compare/v3.9.1...v3.10.0

### [`v3.9.1`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/blob/HEAD/CHANGELOG.md#391)

[Compare Source](https://redirect.github.com/import-js/eslint-import-resolver-typescript/compare/v3.9.0...v3.9.1)

##### Patch Changes

-   [#&#8203;382](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/382) [`4a9176e`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/4a9176e6e2b6013dc24b5634aea42feebd324e41) Thanks [@&#8203;JounQin](https://redirect.github.com/JounQin)! - fix: use [`rspack-resolver`](https://redirect.github.com/unrs/rspack-resolver) fork for pnp support

### [`v3.9.0`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/blob/HEAD/CHANGELOG.md#390)

[Compare Source](https://redirect.github.com/import-js/eslint-import-resolver-typescript/compare/v3.8.7...v3.9.0)

##### Minor Changes

-   [#&#8203;379](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/379) [`6814443`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/681444336fc66104b9b490838a67ea7bf8ac8b61) Thanks [@&#8203;JounQin](https://redirect.github.com/JounQin)! - feat: migrate `enhanced-resolve` to `oxc-resolver`

### [`v3.8.7`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/blob/HEAD/CHANGELOG.md#387)

[Compare Source](https://redirect.github.com/import-js/eslint-import-resolver-typescript/compare/v3.8.6...v3.8.7)

##### Patch Changes

-   [#&#8203;377](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/377) [`a14fdd9`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/a14fdd95011c4c09b74f71854410f684c0f04bc5) Thanks [@&#8203;carlocorradini](https://redirect.github.com/carlocorradini)! - fix: include mapper with no files and force non-dynamic projects to use absolute paths

### [`v3.8.6`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/blob/HEAD/CHANGELOG.md#386)

[Compare Source](https://redirect.github.com/import-js/eslint-import-resolver-typescript/compare/v3.8.5...v3.8.6)

##### Patch Changes

-   [#&#8203;374](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/374) [`c9d5ab0`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/c9d5ab0fa963bd891b6f2ae312ae3ec10a397b7c) Thanks [@&#8203;JounQin](https://redirect.github.com/JounQin)! - fix: add support for importing with .js extension as tsx importee

### [`v3.8.5`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/blob/HEAD/CHANGELOG.md#385)

[Compare Source](https://redirect.github.com/import-js/eslint-import-resolver-typescript/compare/v3.8.4...v3.8.5)

##### Patch Changes

-   [#&#8203;372](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/372) [`366eeaf`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/366eeaf8ba87adf7c2e165b0a73406292c002ad9) Thanks [@&#8203;carlocorradini](https://redirect.github.com/carlocorradini)! - fix: if file has no corresponding mapper function, apply all of them, starting with the nearest one.

### [`v3.8.4`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/blob/HEAD/CHANGELOG.md#384)

[Compare Source](https://redirect.github.com/import-js/eslint-import-resolver-typescript/compare/v3.8.3...v3.8.4)

##### Patch Changes

-   [#&#8203;370](https://redirect.github.com/import-js/eslint-import-resolver-typescript/pull/370) [`c940785`](https://redirect.github.com/import-js/eslint-import-resolver-typescript/commit/c94078504cfb6fd17b775c53d268962a56a2d118) Thanks [@&#8203;JounQin](https://redirect.github.com/JounQin)! - fix: support multiple matching ts paths

</details>

<details>
<summary>sindresorhus/eslint-plugin-unicorn (eslint-plugin-unicorn)</summary>

### [`v58.0.0`](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v58.0.0)

[Compare Source](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/compare/v57.0.0...v58.0.0)

##### Potentially breaking

-   Update `engines.node` in package.json to match real compatibility ([#&#8203;2581](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/issues/2581))  [`e48a620`](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/commit/e48a620)

##### Improvements

-   `escape-case`: Add [case option](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/escape-case.md#options) ([#&#8203;2559](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/issues/2559))  [`0f6048c`](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/commit/0f6048c)
-   `number-literal-case`: Add [`hexadecimalValue` option](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/number-literal-case.md#hexadecimalvalue) ([#&#8203;2559](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/issues/2559))  [`0f6048c`](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/commit/0f6048c)
-   `prevent-abbreviations`: Preserve `iOS` ([#&#8203;2560](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/issues/2560))  [`e8798da`](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/commit/e8798da)

##### Fixes

-   `no-unnecessary-polyfills`: Fix browserslist field name ([#&#8203;2603](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/issues/2603))  [`1a4c76f`](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/commit/1a4c76f)
-   `no-unnecessary-polyfills`: Fix crash on checking `es6-error` module ([#&#8203;2582](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/issues/2582))  [`66de41a`](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/commit/66de41a)
-   `no-accessor-recursion`: Fix exception when used in CommonJS ([#&#8203;2574](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/issues/2574))  [`ca1e432`](https://redirect.github.com/sindresorhus/eslint-plugin-unicorn/commit/ca1e432)

***

</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:eyJjcmVhdGVkSW5WZXIiOiIzOS4yMDcuMSIsInVwZGF0ZWRJblZlciI6IjM5LjIwNy4xIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->
2025-03-28 14:50:49 +00:00
forehalo 1b93d3d8d2 chore(server): bump nestjs and express (#11259) 2025-03-28 14:00:19 +00:00
renovate efab5d4270 chore: bump up all non-major dependencies (#11215)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence | Type | Update |
|---|---|---|---|---|---|---|---|
| [@aws-sdk/client-s3](https://redirect.github.com/aws/aws-sdk-js-v3/tree/main/clients/client-s3) ([source](https://redirect.github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-s3)) | [`3.775.0` -> `3.777.0`](https://renovatebot.com/diffs/npm/@aws-sdk%2fclient-s3/3.775.0/3.777.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@aws-sdk%2fclient-s3/3.777.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@aws-sdk%2fclient-s3/3.777.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@aws-sdk%2fclient-s3/3.775.0/3.777.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@aws-sdk%2fclient-s3/3.775.0/3.777.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | minor |
| [@graphql-codegen/typescript](https://redirect.github.com/dotansimha/graphql-code-generator) ([source](https://redirect.github.com/dotansimha/graphql-code-generator/tree/HEAD/packages/plugins/typescript/typescript)) | [`4.1.5` -> `4.1.6`](https://renovatebot.com/diffs/npm/@graphql-codegen%2ftypescript/4.1.5/4.1.6) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@graphql-codegen%2ftypescript/4.1.6?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@graphql-codegen%2ftypescript/4.1.6?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@graphql-codegen%2ftypescript/4.1.5/4.1.6?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@graphql-codegen%2ftypescript/4.1.5/4.1.6?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch |
| [@graphql-codegen/typescript-operations](https://redirect.github.com/dotansimha/graphql-code-generator) ([source](https://redirect.github.com/dotansimha/graphql-code-generator/tree/HEAD/packages/plugins/typescript/operations)) | [`4.5.1` -> `4.6.0`](https://renovatebot.com/diffs/npm/@graphql-codegen%2ftypescript-operations/4.5.1/4.6.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@graphql-codegen%2ftypescript-operations/4.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@graphql-codegen%2ftypescript-operations/4.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@graphql-codegen%2ftypescript-operations/4.5.1/4.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@graphql-codegen%2ftypescript-operations/4.5.1/4.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | minor |
| [@sentry/esbuild-plugin](https://redirect.github.com/getsentry/sentry-javascript-bundler-plugins/tree/main/packages/esbuild-plugin) ([source](https://redirect.github.com/getsentry/sentry-javascript-bundler-plugins)) | [`3.2.2` -> `3.2.4`](https://renovatebot.com/diffs/npm/@sentry%2fesbuild-plugin/3.2.2/3.2.4) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@sentry%2fesbuild-plugin/3.2.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@sentry%2fesbuild-plugin/3.2.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@sentry%2fesbuild-plugin/3.2.2/3.2.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@sentry%2fesbuild-plugin/3.2.2/3.2.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch |
| [@sentry/react](https://redirect.github.com/getsentry/sentry-javascript/tree/master/packages/react) ([source](https://redirect.github.com/getsentry/sentry-javascript)) | [`9.9.0` -> `9.10.0`](https://renovatebot.com/diffs/npm/@sentry%2freact/9.9.0/9.10.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@sentry%2freact/9.10.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@sentry%2freact/9.10.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@sentry%2freact/9.9.0/9.10.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@sentry%2freact/9.9.0/9.10.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | minor |
| [@sentry/react](https://redirect.github.com/getsentry/sentry-javascript/tree/master/packages/react) ([source](https://redirect.github.com/getsentry/sentry-javascript)) | [`9.9.0` -> `9.10.0`](https://renovatebot.com/diffs/npm/@sentry%2freact/9.9.0/9.10.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@sentry%2freact/9.10.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@sentry%2freact/9.10.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@sentry%2freact/9.9.0/9.10.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@sentry%2freact/9.9.0/9.10.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | minor |
| [@sentry/webpack-plugin](https://redirect.github.com/getsentry/sentry-javascript-bundler-plugins/tree/main/packages/webpack-plugin) ([source](https://redirect.github.com/getsentry/sentry-javascript-bundler-plugins)) | [`3.2.2` -> `3.2.4`](https://renovatebot.com/diffs/npm/@sentry%2fwebpack-plugin/3.2.2/3.2.4) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@sentry%2fwebpack-plugin/3.2.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@sentry%2fwebpack-plugin/3.2.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@sentry%2fwebpack-plugin/3.2.2/3.2.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@sentry%2fwebpack-plugin/3.2.2/3.2.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | patch |
| [@slack/web-api](https://tools.slack.dev/node-slack-sdk/web-api) ([source](https://redirect.github.com/slackapi/node-slack-sdk)) | [`7.9.0` -> `7.9.1`](https://renovatebot.com/diffs/npm/@slack%2fweb-api/7.9.0/7.9.1) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@slack%2fweb-api/7.9.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@slack%2fweb-api/7.9.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@slack%2fweb-api/7.9.0/7.9.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@slack%2fweb-api/7.9.0/7.9.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | patch |
| [@storybook/addon-essentials](https://redirect.github.com/storybookjs/storybook/tree/next/code/addons/essentials) ([source](https://redirect.github.com/storybookjs/storybook/tree/HEAD/code/addons/essentials)) | [`8.6.9` -> `8.6.11`](https://renovatebot.com/diffs/npm/@storybook%2faddon-essentials/8.6.9/8.6.11) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@storybook%2faddon-essentials/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@storybook%2faddon-essentials/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@storybook%2faddon-essentials/8.6.9/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@storybook%2faddon-essentials/8.6.9/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch |
| [@storybook/addon-interactions](https://redirect.github.com/storybookjs/storybook/tree/next/code/addons/interactions) ([source](https://redirect.github.com/storybookjs/storybook/tree/HEAD/code/addons/interactions)) | [`8.6.9` -> `8.6.11`](https://renovatebot.com/diffs/npm/@storybook%2faddon-interactions/8.6.9/8.6.11) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@storybook%2faddon-interactions/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@storybook%2faddon-interactions/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@storybook%2faddon-interactions/8.6.9/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@storybook%2faddon-interactions/8.6.9/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch |
| [@storybook/addon-links](https://redirect.github.com/storybookjs/storybook/tree/next/code/addons/links) ([source](https://redirect.github.com/storybookjs/storybook/tree/HEAD/code/addons/links)) | [`8.6.9` -> `8.6.11`](https://renovatebot.com/diffs/npm/@storybook%2faddon-links/8.6.9/8.6.11) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@storybook%2faddon-links/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@storybook%2faddon-links/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@storybook%2faddon-links/8.6.9/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@storybook%2faddon-links/8.6.9/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch |
| [@storybook/addon-mdx-gfm](https://redirect.github.com/storybookjs/storybook/tree/next/code/addons/gfm) ([source](https://redirect.github.com/storybookjs/storybook/tree/HEAD/code/addons/gfm)) | [`8.6.9` -> `8.6.11`](https://renovatebot.com/diffs/npm/@storybook%2faddon-mdx-gfm/8.6.9/8.6.11) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@storybook%2faddon-mdx-gfm/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@storybook%2faddon-mdx-gfm/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@storybook%2faddon-mdx-gfm/8.6.9/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@storybook%2faddon-mdx-gfm/8.6.9/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch |
| [@storybook/react](https://redirect.github.com/storybookjs/storybook/tree/next/code/renderers/react) ([source](https://redirect.github.com/storybookjs/storybook/tree/HEAD/code/renderers/react)) | [`8.6.9` -> `8.6.11`](https://renovatebot.com/diffs/npm/@storybook%2freact/8.6.9/8.6.11) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@storybook%2freact/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@storybook%2freact/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@storybook%2freact/8.6.9/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@storybook%2freact/8.6.9/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch |
| [@storybook/react-vite](https://redirect.github.com/storybookjs/storybook/tree/next/code/frameworks/react-vite) ([source](https://redirect.github.com/storybookjs/storybook/tree/HEAD/code/frameworks/react-vite)) | [`8.6.9` -> `8.6.11`](https://renovatebot.com/diffs/npm/@storybook%2freact-vite/8.6.9/8.6.11) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@storybook%2freact-vite/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@storybook%2freact-vite/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@storybook%2freact-vite/8.6.9/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@storybook%2freact-vite/8.6.9/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch |
| [@types/mixpanel-browser](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/mixpanel-browser) ([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/mixpanel-browser)) | [`2.51.0` -> `2.54.0`](https://renovatebot.com/diffs/npm/@types%2fmixpanel-browser/2.51.0/2.54.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fmixpanel-browser/2.54.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fmixpanel-browser/2.54.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fmixpanel-browser/2.51.0/2.54.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fmixpanel-browser/2.51.0/2.54.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | minor |
| [@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node) ([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)) | [`22.13.13` -> `22.13.14`](https://renovatebot.com/diffs/npm/@types%2fnode/22.13.13/22.13.14) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/22.13.14?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fnode/22.13.14?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fnode/22.13.13/22.13.14?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/22.13.13/22.13.14?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | patch |
| [@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node) ([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)) | [`22.13.13` -> `22.13.14`](https://renovatebot.com/diffs/npm/@types%2fnode/22.13.13/22.13.14) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/22.13.14?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fnode/22.13.14?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fnode/22.13.13/22.13.14?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/22.13.13/22.13.14?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch |
| [@types/semver](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/semver) ([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/semver)) | [`7.5.8` -> `7.7.0`](https://renovatebot.com/diffs/npm/@types%2fsemver/7.5.8/7.7.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fsemver/7.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fsemver/7.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fsemver/7.5.8/7.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fsemver/7.5.8/7.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | minor |
| [ai](https://sdk.vercel.ai/docs) ([source](https://redirect.github.com/vercel/ai)) | [`4.2.5` -> `4.2.8`](https://renovatebot.com/diffs/npm/ai/4.2.5/4.2.8) | [![age](https://developer.mend.io/api/mc/badges/age/npm/ai/4.2.8?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/ai/4.2.8?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/ai/4.2.5/4.2.8?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/ai/4.2.5/4.2.8?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | patch |
| [apollographql/apollo-ios](https://redirect.github.com/apollographql/apollo-ios) | `from: "1.18.0"` -> `from: "1.19.0"` | [![age](https://developer.mend.io/api/mc/badges/age/git-tags/https:%2f%2fgithub.com%2fapollographql%2fapollo-ios.git/1.19.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/git-tags/https:%2f%2fgithub.com%2fapollographql%2fapollo-ios.git/1.19.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/git-tags/https:%2f%2fgithub.com%2fapollographql%2fapollo-ios.git/1.18.0/1.19.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/git-tags/https:%2f%2fgithub.com%2fapollographql%2fapollo-ios.git/1.18.0/1.19.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) |  | minor |
| [apollographql/apollo-ios](https://redirect.github.com/apollographql/apollo-ios) | `1.18.0` -> `1.19.0` | [![age](https://developer.mend.io/api/mc/badges/age/git-tags/https:%2f%2fgithub.com%2fapollographql%2fapollo-ios/1.19.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/git-tags/https:%2f%2fgithub.com%2fapollographql%2fapollo-ios/1.19.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/git-tags/https:%2f%2fgithub.com%2fapollographql%2fapollo-ios/1.18.0/1.19.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/git-tags/https:%2f%2fgithub.com%2fapollographql%2fapollo-ios/1.18.0/1.19.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) |  | minor |
| [bullmq](https://bullmq.io/) ([source](https://redirect.github.com/taskforcesh/bullmq)) | [`5.44.4` -> `5.45.0`](https://renovatebot.com/diffs/npm/bullmq/5.44.4/5.45.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/bullmq/5.45.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/bullmq/5.45.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/bullmq/5.44.4/5.45.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/bullmq/5.44.4/5.45.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | minor |
| [electron](https://redirect.github.com/electron/electron) | [`35.1.0` -> `35.1.2`](https://renovatebot.com/diffs/npm/electron/35.1.0/35.1.2) | [![age](https://developer.mend.io/api/mc/badges/age/npm/electron/35.1.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/electron/35.1.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/electron/35.1.0/35.1.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/electron/35.1.0/35.1.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch |
| [electron-log](https://redirect.github.com/megahertz/electron-log) | [`5.3.2` -> `5.3.3`](https://renovatebot.com/diffs/npm/electron-log/5.3.2/5.3.3) | [![age](https://developer.mend.io/api/mc/badges/age/npm/electron-log/5.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/electron-log/5.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/electron-log/5.3.2/5.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/electron-log/5.3.2/5.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch |
| [eventsource-parser](https://redirect.github.com/rexxars/eventsource-parser) | [`3.0.0` -> `3.0.1`](https://renovatebot.com/diffs/npm/eventsource-parser/3.0.0/3.0.1) | [![age](https://developer.mend.io/api/mc/badges/age/npm/eventsource-parser/3.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eventsource-parser/3.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eventsource-parser/3.0.0/3.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eventsource-parser/3.0.0/3.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | patch |
| [mixpanel-browser](https://redirect.github.com/mixpanel/mixpanel-js) | [`2.61.2` -> `2.62.0`](https://renovatebot.com/diffs/npm/mixpanel-browser/2.61.2/2.62.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/mixpanel-browser/2.62.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/mixpanel-browser/2.62.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/mixpanel-browser/2.61.2/2.62.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/mixpanel-browser/2.61.2/2.62.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | minor |
| [nestjs-cls](https://papooch.github.io/nestjs-cls/) ([source](https://redirect.github.com/Papooch/nestjs-cls)) | [`5.4.1` -> `5.4.2`](https://renovatebot.com/diffs/npm/nestjs-cls/5.4.1/5.4.2) | [![age](https://developer.mend.io/api/mc/badges/age/npm/nestjs-cls/5.4.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/nestjs-cls/5.4.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/nestjs-cls/5.4.1/5.4.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/nestjs-cls/5.4.1/5.4.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | patch |
| [once_cell](https://redirect.github.com/matklad/once_cell) | `1.21.1` -> `1.21.2` | [![age](https://developer.mend.io/api/mc/badges/age/crate/once_cell/1.21.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/crate/once_cell/1.21.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/crate/once_cell/1.21.1/1.21.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/crate/once_cell/1.21.1/1.21.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | workspace.dependencies | patch |
| [openai](https://redirect.github.com/openai/openai-node) | [`4.89.0` -> `4.90.0`](https://renovatebot.com/diffs/npm/openai/4.89.0/4.90.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/openai/4.90.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/openai/4.90.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/openai/4.89.0/4.90.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/openai/4.89.0/4.90.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | minor |
| [sonner](https://sonner.emilkowal.ski/) ([source](https://redirect.github.com/emilkowalski/sonner)) | [`2.0.1` -> `2.0.2`](https://renovatebot.com/diffs/npm/sonner/2.0.1/2.0.2) | [![age](https://developer.mend.io/api/mc/badges/age/npm/sonner/2.0.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/sonner/2.0.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/sonner/2.0.1/2.0.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/sonner/2.0.1/2.0.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | patch |
| [storybook](https://redirect.github.com/storybookjs/storybook/tree/next/code/lib/cli) ([source](https://redirect.github.com/storybookjs/storybook/tree/HEAD/code/lib/cli)) | [`8.6.9` -> `8.6.11`](https://renovatebot.com/diffs/npm/storybook/8.6.9/8.6.11) | [![age](https://developer.mend.io/api/mc/badges/age/npm/storybook/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/storybook/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/storybook/8.6.9/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/storybook/8.6.9/8.6.11?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch |
| [swiftlang/swift-cmark](https://redirect.github.com/swiftlang/swift-cmark) | `from: "0.4.0"` -> `from: "0.5.0"` | [![age](https://developer.mend.io/api/mc/badges/age/git-tags/https:%2f%2fgithub.com%2fswiftlang%2fswift-cmark/0.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/git-tags/https:%2f%2fgithub.com%2fswiftlang%2fswift-cmark/0.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/git-tags/https:%2f%2fgithub.com%2fswiftlang%2fswift-cmark/0.4.0/0.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/git-tags/https:%2f%2fgithub.com%2fswiftlang%2fswift-cmark/0.4.0/0.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) |  | minor |
| [undici](https://undici.nodejs.org) ([source](https://redirect.github.com/nodejs/undici)) | [`7.5.0` -> `7.6.0`](https://renovatebot.com/diffs/npm/undici/7.5.0/7.6.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/undici/7.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/undici/7.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/undici/7.5.0/7.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/undici/7.5.0/7.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | minor |
| [webm-muxer](https://redirect.github.com/Vanilagy/webm-muxer) | [`5.1.0` -> `5.1.1`](https://renovatebot.com/diffs/npm/webm-muxer/5.1.0/5.1.1) | [![age](https://developer.mend.io/api/mc/badges/age/npm/webm-muxer/5.1.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/webm-muxer/5.1.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/webm-muxer/5.1.0/5.1.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/webm-muxer/5.1.0/5.1.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | patch |
| [webpack-dev-server](https://redirect.github.com/webpack/webpack-dev-server) | [`5.2.0` -> `5.2.1`](https://renovatebot.com/diffs/npm/webpack-dev-server/5.2.0/5.2.1) | [![age](https://developer.mend.io/api/mc/badges/age/npm/webpack-dev-server/5.2.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/webpack-dev-server/5.2.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/webpack-dev-server/5.2.0/5.2.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/webpack-dev-server/5.2.0/5.2.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | patch |
| [yarn](https://redirect.github.com/yarnpkg/berry) ([source](https://redirect.github.com/yarnpkg/berry/tree/HEAD/packages/yarnpkg-cli)) | [`4.7.0` -> `4.8.0`](https://renovatebot.com/diffs/npm/yarn/4.7.0/4.8.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@yarnpkg%2fcli/4.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@yarnpkg%2fcli/4.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@yarnpkg%2fcli/4.7.0/4.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@yarnpkg%2fcli/4.7.0/4.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | packageManager | minor |

---

### Release Notes

<details>
<summary>aws/aws-sdk-js-v3 (@&#8203;aws-sdk/client-s3)</summary>

### [`v3.777.0`](https://redirect.github.com/aws/aws-sdk-js-v3/blob/HEAD/clients/client-s3/CHANGELOG.md#37770-2025-03-27)

[Compare Source](https://redirect.github.com/aws/aws-sdk-js-v3/compare/v3.775.0...v3.777.0)

**Note:** Version bump only for package [@&#8203;aws-sdk/client-s3](https://redirect.github.com/aws-sdk/client-s3)

</details>

<details>
<summary>dotansimha/graphql-code-generator (@&#8203;graphql-codegen/typescript)</summary>

### [`v4.1.6`](https://redirect.github.com/dotansimha/graphql-code-generator/blob/HEAD/packages/plugins/typescript/typescript/CHANGELOG.md#416)

[Compare Source](https://redirect.github.com/dotansimha/graphql-code-generator/compare/@graphql-codegen/typescript@4.1.5...@graphql-codegen/typescript@4.1.6)

##### Patch Changes

-   Updated dependencies \[[`f6909d1`](https://redirect.github.com/dotansimha/graphql-code-generator/commit/f6909d1797c15b79a0afb7ec089471763a485bfc)]:
    -   [@&#8203;graphql-codegen/visitor-plugin-common](https://redirect.github.com/graphql-codegen/visitor-plugin-common)[@&#8203;5](https://redirect.github.com/5).8.0

</details>

<details>
<summary>dotansimha/graphql-code-generator (@&#8203;graphql-codegen/typescript-operations)</summary>

### [`v4.6.0`](https://redirect.github.com/dotansimha/graphql-code-generator/blob/HEAD/packages/plugins/typescript/operations/CHANGELOG.md#460)

[Compare Source](https://redirect.github.com/dotansimha/graphql-code-generator/compare/@graphql-codegen/typescript-operations@4.5.1...@graphql-codegen/typescript-operations@4.6.0)

##### Minor Changes

-   [#&#8203;10323](https://redirect.github.com/dotansimha/graphql-code-generator/pull/10323) [`f3cf4df`](https://redirect.github.com/dotansimha/graphql-code-generator/commit/f3cf4df358a896c5df0a7d8909c2fbf192e10c01) Thanks [@&#8203;eddeee888](https://redirect.github.com/eddeee888)! - Add support for `nullability.errorHandlingClient`. This allows clients to get stronger types with [semantic nullability](https://redirect.github.com/graphql/graphql-wg/blob/main/rfcs/SemanticNullability.md)-enabled schemas.

##### Patch Changes

-   Updated dependencies \[[`f6909d1`](https://redirect.github.com/dotansimha/graphql-code-generator/commit/f6909d1797c15b79a0afb7ec089471763a485bfc)]:
    -   [@&#8203;graphql-codegen/visitor-plugin-common](https://redirect.github.com/graphql-codegen/visitor-plugin-common)[@&#8203;5](https://redirect.github.com/5).8.0
    -   [@&#8203;graphql-codegen/typescript](https://redirect.github.com/graphql-codegen/typescript)[@&#8203;4](https://redirect.github.com/4).1.6

</details>

<details>
<summary>getsentry/sentry-javascript-bundler-plugins (@&#8203;sentry/esbuild-plugin)</summary>

### [`v3.2.4`](https://redirect.github.com/getsentry/sentry-javascript-bundler-plugins/blob/HEAD/CHANGELOG.md#324)

[Compare Source](https://redirect.github.com/getsentry/sentry-javascript-bundler-plugins/compare/3.2.3...3.2.4)

-   Revert "feat(core): Use path instead of debug IDs as artifact names for debug ID upload ([#&#8203;700](https://redirect.github.com/getsentry/sentry-javascript-bundler-plugins/issues/700))" ([#&#8203;709](https://redirect.github.com/getsentry/sentry-javascript-bundler-plugins/issues/709))
-   ref: Remove deprecated use of `useArtifacBundles` ([#&#8203;707](https://redirect.github.com/getsentry/sentry-javascript-bundler-plugins/issues/707))

### [`v3.2.3`](https://redirect.github.com/getsentry/sentry-javascript-bundler-plugins/blob/HEAD/CHANGELOG.md#323)

[Compare Source](https://redirect.github.com/getsentry/sentry-javascript-bundler-plugins/compare/3.2.2...3.2.3)

-   feat(core): Use path instead of debug IDs as artifact names for debug ID upload ([#&#8203;700](https://redirect.github.com/getsentry/sentry-javascript-bundler-plugins/issues/700))
-   feat(webpack): Primarily use `contentHash` for debug ID hash ([#&#8203;702](https://redirect.github.com/getsentry/sentry-javascript-bundler-plugins/issues/702))
-   feat: Detect Vercel commits and env ([#&#8203;694](https://redirect.github.com/getsentry/sentry-javascript-bundler-plugins/issues/694))
-   feat: Default to automatically setting commits on release ([#&#8203;692](https://redirect.github.com/getsentry/sentry-javascript-bundler-plugins/issues/692))

</details>

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

### [`v9.10.0`](https://redirect.github.com/getsentry/sentry-javascript/releases/tag/9.10.0)

[Compare Source](https://redirect.github.com/getsentry/sentry-javascript/compare/9.9.0...9.10.0)

##### Important Changes

-   **feat: Add support for logs**

    -   feat(node): Add logging public APIs to Node SDKs ([#&#8203;15764](https://redirect.github.com/getsentry/sentry-javascript/pull/15764))
    -   feat(core): Add support for `beforeSendLog` ([#&#8203;15814](https://redirect.github.com/getsentry/sentry-javascript/pull/15814))
    -   feat(core): Add support for parameterizing logs ([#&#8203;15812](https://redirect.github.com/getsentry/sentry-javascript/pull/15812))
    -   fix: Remove critical log severity level ([#&#8203;15824](https://redirect.github.com/getsentry/sentry-javascript/pull/15824))

    All JavaScript SDKs other than `@sentry/cloudflare` and `@sentry/deno` now support sending logs via dedicated methods as part of Sentry's [upcoming logging product](https://redirect.github.com/getsentry/sentry/discussions/86804).

    Logging is gated by an experimental option, `_experiments.enableLogs`.

    ```js
    Sentry.init({
      dsn: 'PUBLIC_DSN',
      // `enableLogs` must be set to true to use the logging features
      _experiments: { enableLogs: true },
    });

    const { trace, debug, info, warn, error, fatal, fmt } = Sentry.logger;

    trace('Starting database connection', { database: 'users' });
    debug('Cache miss for user', { userId: 123 });
    error('Failed to process payment', { orderId: 'order_123', amount: 99.99 });
    fatal('Database connection pool exhausted', { database: 'users', activeConnections: 100 });

    // Structured logging via the `fmt` helper function. When you use `fmt`, the string template and parameters are sent separately so they can be queried independently in Sentry.

    info(fmt(`Updated profile for user ${userId}`));
    warn(fmt(`Rate limit approaching for endpoint ${endpoint}. Requests: ${requests}, Limit: ${limit}`));
    ```

    With server-side SDKs like `@sentry/node`, `@sentry/bun` or server-side of `@sentry/nextjs` or `@sentry/sveltekit`, you can do structured logging without needing the `fmt` helper function.

    ```js
    const { info, warn } = Sentry.logger;

    info('User %s logged in successfully', [123]);
    warn('Failed to load user %s data', [123], { errorCode: 404 });
    ```

    To filter logs, or update them before they are sent to Sentry, you can use the `_experiments.beforeSendLog` option.

-   **feat(browser): Add `diagnoseSdkConnectivity()` function to programmatically detect possible connectivity issues ([#&#8203;15821](https://redirect.github.com/getsentry/sentry-javascript/pull/15821))**

    The `diagnoseSdkConnectivity()` function can be used to programmatically detect possible connectivity issues with the Sentry SDK.

    ```js
    const result = await Sentry.diagnoseSdkConnectivity();
    ```

    The result will be an object with the following properties:

    -   `"no-client-active"`: There was no active client when the function was called. This possibly means that the SDK was not initialized yet.
    -   `"sentry-unreachable"`: The Sentry SaaS servers were not reachable. This likely means that there is an ad blocker active on the page or that there are other connection issues.
    -   `undefined`: The SDK is working as expected.

-   **SDK Tracing Performance Improvements for Node SDKs**

    -   feat: Stop using `dropUndefinedKeys` ([#&#8203;15796](https://redirect.github.com/getsentry/sentry-javascript/pull/15796))
    -   feat(node): Only add span listeners for instrumentation when used ([#&#8203;15802](https://redirect.github.com/getsentry/sentry-javascript/pull/15802))
    -   ref: Avoid `dropUndefinedKeys` for `spanToJSON` calls ([#&#8203;15792](https://redirect.github.com/getsentry/sentry-javascript/pull/15792))
    -   ref: Avoid using `SentryError` for PromiseBuffer control flow ([#&#8203;15822](https://redirect.github.com/getsentry/sentry-javascript/pull/15822))
    -   ref: Stop using `dropUndefinedKeys` in SpanExporter ([#&#8203;15794](https://redirect.github.com/getsentry/sentry-javascript/pull/15794))
    -   ref(core): Avoid using `SentryError` for event processing control flow ([#&#8203;15823](https://redirect.github.com/getsentry/sentry-javascript/pull/15823))
    -   ref(node): Avoid `dropUndefinedKeys` in Node SDK init ([#&#8203;15797](https://redirect.github.com/getsentry/sentry-javascript/pull/15797))
    -   ref(opentelemetry): Avoid sampling work for non-root spans ([#&#8203;15820](https://redirect.github.com/getsentry/sentry-javascript/pull/15820))

    We've been hard at work making performance improvements to the Sentry Node SDKs (`@sentry/node`, `@sentry/aws-serverless`, `@sentry/nestjs`, etc.). We've seen that upgrading from `9.7.0` to `9.10.0` leads to 30-40% improvement in request latency for HTTP web-server applications that use tracing with high sample rates. Non web-server applications and non-tracing applications will see smaller improvements.

##### Other Changes

-   chore(deps): Bump `rrweb` to `2.35.0` ([#&#8203;15825](https://redirect.github.com/getsentry/sentry-javascript/pull/15825))
-   deps: Bump bundler plugins to `3.2.3` ([#&#8203;15829](https://redirect.github.com/getsentry/sentry-javascript/pull/15829))
-   feat: Always truncate stored breadcrumb messages to 2kb ([#&#8203;15819](https://redirect.github.com/getsentry/sentry-javascript/pull/15819))
-   feat(nextjs): Disable server webpack-handling for static builds ([#&#8203;15751](https://redirect.github.com/getsentry/sentry-javascript/pull/15751))
-   fix(nuxt): Don't override Nuxt options if undefined ([#&#8203;15795](https://redirect.github.com/getsentry/sentry-javascript/pull/15795))

#### Bundle size 📦

| Path                                                             | Size              |
| ---------------------------------------------------------------- | ----------------- |
| [@&#8203;sentry/browser](https://redirect.github.com/sentry/browser)                                                  | 23.08 KB  |
| [@&#8203;sentry/browser](https://redirect.github.com/sentry/browser) - with treeshaking flags                         | 22.88 KB  |
| [@&#8203;sentry/browser](https://redirect.github.com/sentry/browser) (incl. Tracing)                                  | 36.49 KB  |
| [@&#8203;sentry/browser](https://redirect.github.com/sentry/browser) (incl. Tracing, Replay)                          | 73.65 KB  |
| [@&#8203;sentry/browser](https://redirect.github.com/sentry/browser) (incl. Tracing, Replay) - with treeshaking flags | 67 KB     |
| [@&#8203;sentry/browser](https://redirect.github.com/sentry/browser) (incl. Tracing, Replay with Canvas)              | 78.3 KB   |
| [@&#8203;sentry/browser](https://redirect.github.com/sentry/browser) (incl. Tracing, Replay, Feedback)                | 90.87 KB  |
| [@&#8203;sentry/browser](https://redirect.github.com/sentry/browser) (incl. Feedback)                                 | 40.21 KB  |
| [@&#8203;sentry/browser](https://redirect.github.com/sentry/browser) (incl. sendFeedback)                             | 27.71 KB  |
| [@&#8203;sentry/browser](https://redirect.github.com/sentry/browser) (incl. FeedbackAsync)                            | 32.5 KB   |
| [@&#8203;sentry/react](https://redirect.github.com/sentry/react)                                                    | 24.86 KB  |
| [@&#8203;sentry/react](https://redirect.github.com/sentry/react) (incl. Tracing)                                    | 38.39 KB  |
| [@&#8203;sentry/vue](https://redirect.github.com/sentry/vue)                                                      | 27.3 KB   |
| [@&#8203;sentry/vue](https://redirect.github.com/sentry/vue) (incl. Tracing)                                      | 38.18 KB  |
| [@&#8203;sentry/svelte](https://redirect.github.com/sentry/svelte)                                                   | 23.12 KB  |
| CDN Bundle                                                       | 24.33 KB  |
| CDN Bundle (incl. Tracing)                                       | 36.51 KB  |
| CDN Bundle (incl. Tracing, Replay)                               | 71.53 KB  |
| CDN Bundle (incl. Tracing, Replay, Feedback)                     | 76.71 KB  |
| CDN Bundle - uncompressed                                        | 70.93 KB  |
| CDN Bundle (incl. Tracing) - uncompressed                        | 108.11 KB |
| CDN Bundle (incl. Tracing, Replay) - uncompressed                | 219.4 KB  |
| CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed      | 231.97 KB |
| [@&#8203;sentry/nextjs](https://redirect.github.com/sentry/nextjs) (client)                                          | 39.68 KB  |
| [@&#8203;sentry/sveltekit](https://redirect.github.com/sentry/sveltekit) (client)                                       | 36.92 KB  |
| [@&#8203;sentry/node](https://redirect.github.com/sentry/node)                                                     | 142.91 KB |
| [@&#8203;sentry/node](https://redirect.github.com/sentry/node) - without tracing                                   | 96.12 KB  |
| [@&#8203;sentry/aws-serverless](https://redirect.github.com/sentry/aws-serverless)                                           | 120.46 KB |

</details>

<details>
<summary>slackapi/node-slack-sdk (@&#8203;slack/web-api)</summary>

### [`v7.9.1`](https://redirect.github.com/slackapi/node-slack-sdk/compare/@slack/web-api@7.9.0...@slack/web-api@7.9.1)

[Compare Source](https://redirect.github.com/slackapi/node-slack-sdk/compare/@slack/web-api@7.9.0...@slack/web-api@7.9.1)

</details>

<details>
<summary>storybookjs/storybook (@&#8203;storybook/addon-essentials)</summary>

### [`v8.6.11`](https://redirect.github.com/storybookjs/storybook/compare/v8.6.10...2afd30d75089f27a8029a1ac320d7698873b163f)

[Compare Source](https://redirect.github.com/storybookjs/storybook/compare/v8.6.10...v8.6.11)

### [`v8.6.10`](https://redirect.github.com/storybookjs/storybook/blob/HEAD/CHANGELOG.md#8610)

[Compare Source](https://redirect.github.com/storybookjs/storybook/compare/v8.6.9...v8.6.10)

-   Addon-docs: Fix non-string handling in Stories block - [#&#8203;30913](https://redirect.github.com/storybookjs/storybook/pull/30913), thanks [@&#8203;JamesIves](https://redirect.github.com/JamesIves)!
-   Nextjs: Fix styled-jsx optimize vite warnings - [#&#8203;30932](https://redirect.github.com/storybookjs/storybook/pull/30932), thanks [@&#8203;kasperpeulen](https://redirect.github.com/kasperpeulen)!
-   React: Fix actImplementation is not a function - [#&#8203;30929](https://redirect.github.com/storybookjs/storybook/pull/30929), thanks [@&#8203;kasperpeulen](https://redirect.github.com/kasperpeulen)!

</details>

<details>
<summary>storybookjs/storybook (@&#8203;storybook/addon-interactions)</summary>

### [`v8.6.11`](https://redirect.github.com/storybookjs/storybook/blob/HEAD/CHANGELOG.md#8611)

[Compare Source](https://redirect.github.com/storybookjs/storybook/compare/v8.6.10...v8.6.11)

-   Angular: Fix zone.js support for Angular libraries - [#&#8203;30941](https://redirect.github.com/storybookjs/storybook/pull/30941), thanks [@&#8203;valentinpalkovic](https://redirect.github.com/valentinpalkovic)!

### [`v8.6.10`](https://redirect.github.com/storybookjs/storybook/blob/HEAD/CHANGELOG.md#8610)

[Compare Source](https://redirect.github.com/storybookjs/storybook/compare/v8.6.9...v8.6.10)

-   Addon-docs: Fix non-string handling in Stories block - [#&#8203;30913](https://redirect.github.com/storybookjs/storybook/pull/30913), thanks [@&#8203;JamesIves](https://redirect.github.com/JamesIves)!
-   Nextjs: Fix styled-jsx optimize vite warnings - [#&#8203;30932](https://redirect.github.com/storybookjs/storybook/pull/30932), thanks [@&#8203;kasperpeulen](https://redirect.github.com/kasperpeulen)!
-   React: Fix actImplementation is not a function - [#&#8203;30929](https://redirect.github.com/storybookjs/storybook/pull/30929), thanks [@&#8203;kasperpeulen](https://redirect.github.com/kasperpeulen)!

</details>

<details>
<summary>vercel/ai (ai)</summary>

### [`v4.2.8`](https://redirect.github.com/vercel/ai/releases/tag/ai%404.2.8)

[Compare Source](https://redirect.github.com/vercel/ai/compare/ai@4.2.7...ai@4.2.8)

##### Patch Changes

-   [`65243ce`](https://redirect.github.com/vercel/ai/commit/65243ce): fix (ui): introduce step start parts
-   Updated dependencies \[[`65243ce`](https://redirect.github.com/vercel/ai/commit/65243ce)]
    -   [@&#8203;ai-sdk/ui-utils](https://redirect.github.com/ai-sdk/ui-utils)[@&#8203;1](https://redirect.github.com/1).2.2
    -   [@&#8203;ai-sdk/react](https://redirect.github.com/ai-sdk/react)[@&#8203;1](https://redirect.github.com/1).2.3

### [`v4.2.7`](https://redirect.github.com/vercel/ai/releases/tag/ai%404.2.7)

[Compare Source](https://redirect.github.com/vercel/ai/compare/ai@4.2.6...ai@4.2.7)

##### Patch Changes

-   [`e14c066`](https://redirect.github.com/vercel/ai/commit/e14c066): fix (ai/core): convert user ui messages with only parts (no content) to core messages

### [`v4.2.6`](https://redirect.github.com/vercel/ai/releases/tag/ai%404.2.6)

[Compare Source](https://redirect.github.com/vercel/ai/compare/ai@4.2.5...ai@4.2.6)

##### Patch Changes

-   [`625591b`](https://redirect.github.com/vercel/ai/commit/625591b): feat (ai/core): auto-complete for provider registry
-   [`6a1506f`](https://redirect.github.com/vercel/ai/commit/6a1506f): feat (ai/core): custom separator support for provider registry
-   [`ea3d998`](https://redirect.github.com/vercel/ai/commit/ea3d998): chore (ai/core): move provider registry to stable

</details>

<details>
<summary>apollographql/apollo-ios (apollographql/apollo-ios)</summary>

### [`v1.19.0`](https://redirect.github.com/apollographql/apollo-ios/blob/HEAD/CHANGELOG.md#v1190)

[Compare Source](https://redirect.github.com/apollographql/apollo-ios/compare/1.18.0...1.19.0)

##### New

-   **New function to mutate the properties of a local cache mutation fragment. ([#&#8203;3433](https://redirect.github.com/apollographql/apollo-ios/issues/3443)):** Removal of the setter for type conditions made it difficult to work with the properties on those types. A new `mutateIfFulfilled` function was added to facilitate that workflow while still preventing a fragment from being added or removed from an existing model. See PR [#&#8203;608](https://redirect.github.com/apollographql/apollo-ios-dev/pull/608).
-   **Configure `URLRequest` timeout interval ([#&#8203;3522](https://redirect.github.com/apollographql/apollo-ios/issues/3522)):** Added a request context specialization protocol (`RequestContextTimeoutConfigurable`) that specifies options for configuring the timeout interval of a `URLRequest`. See PR [#&#8203;618](https://redirect.github.com/apollographql/apollo-ios-dev/pull/618).

</details>

<details>
<summary>taskforcesh/bullmq (bullmq)</summary>

### [`v5.45.0`](https://redirect.github.com/taskforcesh/bullmq/releases/tag/v5.45.0)

[Compare Source](https://redirect.github.com/taskforcesh/bullmq/compare/v5.44.4...v5.45.0)

##### Features

-   add deduplicated job id to the deduplicated event ([0f21c10](https://redirect.github.com/taskforcesh/bullmq/commit/0f21c10bc9fd9a2290e8dde3c9b43bc366fcb15a))

</details>

<details>
<summary>electron/electron (electron)</summary>

### [`v35.1.2`](https://redirect.github.com/electron/electron/releases/tag/v35.1.2): electron v35.1.2

[Compare Source](https://redirect.github.com/electron/electron/compare/v35.1.1...v35.1.2)

### Release Notes for v35.1.2

#### Fixes

-   Fixed an issue where `navigationHistory.restore()` failed to restore the `userAgent` if it was overridden. [#&#8203;46300](https://redirect.github.com/electron/electron/pull/46300) <span style="font-size:small;">(Also in [34](https://redirect.github.com/electron/electron/pull/46298), [36](https://redirect.github.com/electron/electron/pull/46299))</span>

#### Other Changes

-   Security: backported fix for CVE-2025-2783. [#&#8203;46303](https://redirect.github.com/electron/electron/pull/46303)
-   Updated Chromium to 134.0.6998.178. [#&#8203;46287](https://redirect.github.com/electron/electron/pull/46287)

### [`v35.1.1`](https://redirect.github.com/electron/electron/releases/tag/v35.1.1): electron v35.1.1

[Compare Source](https://redirect.github.com/electron/electron/compare/v35.1.0...v35.1.1)

### Release Notes for v35.1.1

#### Fixes

-   Fixed build failure when building with printing disabled. [#&#8203;46285](https://redirect.github.com/electron/electron/pull/46285) <span style="font-size:small;">(Also in [34](https://redirect.github.com/electron/electron/pull/46286), [36](https://redirect.github.com/electron/electron/pull/46284))</span>

</details>

<details>
<summary>megahertz/electron-log (electron-log)</summary>

### [`v5.3.3`](https://redirect.github.com/megahertz/electron-log/compare/v5.3.2...v5.3.3)

[Compare Source](https://redirect.github.com/megahertz/electron-log/compare/v5.3.2...v5.3.3)

</details>

<details>
<summary>rexxars/eventsource-parser (eventsource-parser)</summary>

### [`v3.0.1`](https://redirect.github.com/rexxars/eventsource-parser/blob/HEAD/CHANGELOG.md#301-2025-03-27)

[Compare Source](https://redirect.github.com/rexxars/eventsource-parser/compare/v3.0.0...v3.0.1)

##### Bug Fixes

-   optimize `splitLines` function ([8952917](https://redirect.github.com/rexxars/eventsource-parser/commit/8952917a6f5b3d8c97175d00980538edc96b611d))
-   throw helpful error if passing function to `createParser()` ([4cd3a44](https://redirect.github.com/rexxars/eventsource-parser/commit/4cd3a443f21c441be29e524637a3a603d4425a12))

</details>

<details>
<summary>mixpanel/mixpanel-js (mixpanel-browser)</summary>

### [`v2.62.0`](https://redirect.github.com/mixpanel/mixpanel-js/compare/v2.61.2...3e3d5731642dd3e3ac543521155d3c51c8a37261)

[Compare Source](https://redirect.github.com/mixpanel/mixpanel-js/compare/v2.61.2...v2.62.0)

</details>

<details>
<summary>Papooch/nestjs-cls (nestjs-cls)</summary>

### [`v5.4.2`](https://redirect.github.com/Papooch/nestjs-cls/releases/tag/nestjs-cls%405.4.2)

[Compare Source](https://redirect.github.com/Papooch/nestjs-cls/compare/nestjs-cls@5.4.1...nestjs-cls@5.4.2)

##### Bug Fixes

-   **core**: un-deprecate wrongly deprecated parts of the plugin API ([#&#8203;228](https://redirect.github.com/Papooch/nestjs-cls/issues/228)) ([11ca429](https://redirect.github.com/Papooch/nestjs-cls/commits/11ca429))

</details>

<details>
<summary>matklad/once_cell (once_cell)</summary>

### [`v1.21.2`](https://redirect.github.com/matklad/once_cell/blob/HEAD/CHANGELOG.md#1212)

[Compare Source](https://redirect.github.com/matklad/once_cell/compare/v1.21.1...v1.21.2)

-   Relax success ordering from AcqRel to Release in `race`: [#&#8203;278](https://redirect.github.com/matklad/once_cell/pull/278).

</details>

<details>
<summary>openai/openai-node (openai)</summary>

### [`v4.90.0`](https://redirect.github.com/openai/openai-node/blob/HEAD/CHANGELOG.md#4900-2025-03-27)

[Compare Source](https://redirect.github.com/openai/openai-node/compare/v4.89.1...v4.90.0)

Full Changelog: [v4.89.1...v4.90.0](https://redirect.github.com/openai/openai-node/compare/v4.89.1...v4.90.0)

##### Features

-   **api:** add `get /chat/completions` endpoint ([2d6710a](https://redirect.github.com/openai/openai-node/commit/2d6710a1f9dd4f768d9c73e9c9f5f93c737cdc66))

##### Bug Fixes

-   **audio:** correctly handle transcription streaming ([2a9b603](https://redirect.github.com/openai/openai-node/commit/2a9b60336cd40a4d4fb9b898ece49170ad648fd0))
-   **internal:** work around [https://github.com/vercel/next.js/issues/76881](https://redirect.github.com/vercel/next.js/issues/76881) ([#&#8203;1427](https://redirect.github.com/openai/openai-node/issues/1427)) ([b467e94](https://redirect.github.com/openai/openai-node/commit/b467e949476621e8e92587a83c9de6fab35b2b9d))

##### Chores

-   add hash of OpenAPI spec/config inputs to .stats.yml ([45db35e](https://redirect.github.com/openai/openai-node/commit/45db35e34be560c75bf36224cc153c6d0e6e2a88))
-   **api:** updates to supported Voice IDs ([#&#8203;1424](https://redirect.github.com/openai/openai-node/issues/1424)) ([404f4db](https://redirect.github.com/openai/openai-node/commit/404f4db41a2ee651f5bfdaa7b8881e1bf015f058))
-   **client:** expose headers on some streaming errors ([#&#8203;1423](https://redirect.github.com/openai/openai-node/issues/1423)) ([b0783cc](https://redirect.github.com/openai/openai-node/commit/b0783cc6221b68f1738e759b393756a7d0e540a3))

### [`v4.89.1`](https://redirect.github.com/openai/openai-node/blob/HEAD/CHANGELOG.md#4891-2025-03-26)

[Compare Source](https://redirect.github.com/openai/openai-node/compare/v4.89.0...v4.89.1)

Full Changelog: [v4.89.0...v4.89.1](https://redirect.github.com/openai/openai-node/compare/v4.89.0...v4.89.1)

##### Bug Fixes

-   avoid type error in certain environments ([#&#8203;1413](https://redirect.github.com/openai/openai-node/issues/1413)) ([d3f6f8f](https://redirect.github.com/openai/openai-node/commit/d3f6f8f9c7511a98cc5795756fee49a30e44d485))
-   **client:** remove duplicate types ([#&#8203;1410](https://redirect.github.com/openai/openai-node/issues/1410)) ([338878b](https://redirect.github.com/openai/openai-node/commit/338878bf484dac5a4fadf50592b1f8d1045cd4b6))
-   **exports:** add missing type exports ([#&#8203;1417](https://redirect.github.com/openai/openai-node/issues/1417)) ([2d15ada](https://redirect.github.com/openai/openai-node/commit/2d15ada0e0d81a4e0d097dddbe99be2222c4c0ef))

##### Chores

-   **internal:** version bump ([#&#8203;1408](https://redirect.github.com/openai/openai-node/issues/1408)) ([9c0949a](https://redirect.github.com/openai/openai-node/commit/9c0949a93c3e181d327f820dbc2a4b0ad77258e9))

</details>

<details>
<summary>emilkowalski/sonner (sonner)</summary>

### [`v2.0.2`](https://redirect.github.com/emilkowalski/sonner/releases/tag/v2.0.2)

[Compare Source](https://redirect.github.com/emilkowalski/sonner/compare/v2.0.1...v2.0.2)

#### What's Changed

-   fix: isExtendedResult. Check if promiseData is an object and not a valid React Element by [@&#8203;diegotraid](https://redirect.github.com/diegotraid) in [https://github.com/emilkowalski/sonner/pull/595](https://redirect.github.com/emilkowalski/sonner/pull/595)
-   fix: toast.dismiss without an id doesn't dismiss by [@&#8203;emilkowalski](https://redirect.github.com/emilkowalski) in [https://github.com/emilkowalski/sonner/pull/609](https://redirect.github.com/emilkowalski/sonner/pull/609)
-   f

</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:eyJjcmVhdGVkSW5WZXIiOiIzOS4yMDcuMSIsInVwZGF0ZWRJblZlciI6IjM5LjIwNy4xIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->
2025-03-28 13:44:55 +00:00
forehalo 64c7fb1d66 chore(server): validate function not actually used (#11263) 2025-03-28 12:51:19 +00:00
pengx17 387f7211bf fix(electron): cannot enable meetings correctly (#11269) 2025-03-28 11:13:48 +00:00
doodlewind ebee11f573 refactor(editor): enable forceUpdate by default in viewport apis (#11264)
In this way, all downstream callers can be guaranteed by correct viewport fit result, instead of requiring them to set `forceUpdate: true` param explicitly to them. The resizing optimization is an internal exception.
2025-03-28 10:04:55 +00:00
LongYinan 85daea6fa8 chore: remove depracated packages 2025-03-28 17:41:37 +08:00
pengx17 6c125d9a38 feat(electron): audio capture permissions and settings (#11185)
fix AF-2420, AF-2391, AF-2265
2025-03-28 09:12:26 +00:00
forehalo 8c582122a8 chore: fix copilot cron test (#11262) 2025-03-28 08:42:22 +00:00
zzj3720 f5a91be53c fix(editor): support reactive readonly for table block (#11248)
fix: BS-2957
2025-03-28 08:19:46 +00:00
liuyi ca301f0dab chore(server): patch config system (#11260) 2025-03-28 08:19:04 +00:00
pengx17 dccd7c20aa feat(core): call real endpoint for audio transcription (#11139)
fix AF-2359
2025-03-28 07:59:35 +00:00
doouding c4032e1bc0 fix: youtube block style (#11235)
Fixes [BS-2687](https://linear.app/affine-design/issue/BS-2687/[bug]-video-block-缩放选区坏掉)
2025-03-28 07:46:07 +00:00
Saul-Mirone 205cd7a86d refactor(editor): rename block-std to std (#11250)
Closes: BS-2946
2025-03-28 07:20:34 +00:00
Flrande 4498676a96 fix(editor): update at menu width (#11257)
Close [BS-2952](https://linear.app/affine-design/issue/BS-2952/at面板长宽为280390)
2025-03-28 06:46:45 +00:00
liuyi e22f66f1cc fix(server): auto import config.json (#11255) 2025-03-28 06:12:56 +00:00
Lakr 08ee84e697 feat(ios): update dependencies to track upstream repository (#11143) 2025-03-28 14:12:06 +08:00
L-Sun af91a0217f refactor(editor): inner toolbar surface-ref block with extension (#11246)
This PR refactor `surface-ref` toolbar with `ToolbarExtension`
2025-03-28 05:48:24 +00:00
fengmk2 69f393fe2f refactor(server): change invitation request link to workspace members tab (#11191)
close CLOUD-184
2025-03-28 05:27:20 +00:00
fengmk2 bfa7e9a007 ci: install @types/affine__env on server build (#11252) 2025-03-28 05:01:47 +00:00
L-Sun e2c752d56f feat(editor): inner toolbar layout for block (#11243)
Close [BS-2808](https://linear.app/affine-design/issue/BS-2808/组件内-toolbar-重构)
2025-03-28 03:47:37 +00:00
donteatfriedrice 7193393a06 fix(editor): embed iframe block idle status selected style (#11239)
Close [BS-2936](https://linear.app/affine-design/issue/BS-2936/占位去掉描边-grabber选中时颜色加深即可)
2025-03-28 02:25:00 +00:00
donteatfriedrice a459a00b21 feat(editor): support convert edgeless bookmark to embed iframe block (#11237)
Close [BS-2941](https://linear.app/affine-design/issue/BS-2941/白板-surface-中-card-view-无法转为-embed-view)
2025-03-28 02:25:00 +00:00
fundon c0c0e5ea8f chore(editor): add event tracking to highlighter tool (#11232)
Closes: [BS-2947](https://linear.app/affine-design/issue/BS-2947/埋点相关)
2025-03-28 01:34:44 +00:00
Brooooooklyn 554a8d9fb8 ci: split jobs to speed (#11249) 2025-03-27 15:56:24 +00:00
Brooooooklyn de145cce7a fix(native): global recording cleanup (#11241) 2025-03-27 14:41:29 +00:00
doouding 367544bcc5 fix: mindmap connectors disappear (#11234)
Fixes [BS-2868](https://linear.app/affine-design/issue/BS-2868/mindmap-bug-布局四的线不见了)
2025-03-27 13:33:21 +00:00
Brooooooklyn 7ae0132da9 fix(native): audio capture volume (#11240) 2025-03-27 12:55:09 +00:00
forehalo 504a74d512 chore(server): add import config script (#11242) 2025-03-27 12:32:29 +00:00
forehalo 0ea38680fa refactor(server): config system (#11081) 2025-03-27 12:32:28 +00:00
EYHN 7091111f85 feat(nbstore): add upload function to blob frontend (#11247) 2025-03-27 12:11:30 +00:00
zzj3720 f2cdf67c2a refactor(editor): adjust database-block style (#11219)
close: BS-2904, BS-2905
2025-03-27 10:35:29 +00:00
darkskygit 3b9d64d74d feat(server): update trascript endpoint (#11196) 2025-03-27 10:18:49 +00:00
Flrande 3303684056 fix(editor): disable at menu member group for collaborator (#11208)
Close [BS-2893](https://linear.app/affine-design/issue/BS-2893/无邀请权限的member-时不需要显示invite入口)
Close [BS-2891](https://linear.app/affine-design/issue/BS-2891/mention-members-sention默认需显示3个人)
2025-03-27 09:45:14 +00:00
fengmk2 a189421360 ci: increase cloud E2E test shards from 3 to 6 (#11236)
Before 10m

![image.png](https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/hTwOityLamd4hitrae7M/e9698e8f-2220-475e-a6e3-21cca48398e3.png)

After 8m

![image.png](https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/hTwOityLamd4hitrae7M/e6e63736-dd03-4ee8-9ddc-652f71f15067.png)
2025-03-27 09:29:40 +00:00
forehalo 766383cb3a chore: disable http proxy middleware log in ci (#11238) 2025-03-27 09:11:54 +00:00
CatsJuice e855197acf feat(editor): responsive edgeless toolbar pen menu (#11150)
close BS-2855
2025-03-27 08:53:27 +00:00
fundon 2c4278058b feat(editor): add highlighter (#10573)
Closes: [BS-2909](https://linear.app/affine-design/issue/BS-2909/新增highlighter)

### What's Changed!

Currently the highlighter tool is very similar to brush, but for the future, it's a standalone module.

* Added `Highlighter` element model
* Added `Highlighter` tool
* Added `Highlighter` entry to the global toolbar
2025-03-27 08:53:26 +00:00
donteatfriedrice 676a8d653f fix(editor): reorder slash menu content & media group (#11233)
Close [BS-2935](https://linear.app/affine-design/issue/BS-2935/embed-在-slash-menu-中位置调整)
2025-03-27 08:36:40 +00:00
fundon 6ade2b7084 chore(editor): add event tracking to drawing tool (#11230)
Closes: [BS-2833](https://linear.app/affine-design/issue/BS-2833/考虑屏蔽或者降低brush-行为的采集密度)
2025-03-27 08:17:44 +00:00
fengmk2 4d6115bb00 fix(server): move avatar attachment before setting cid reference (#11231)
close CLOUD-187
2025-03-27 08:00:18 +00:00
fengmk2 5fcdc99f23 feat(server): add team user with team workspace in dev environment (#11228)
close CLOUD-186
2025-03-27 07:26:28 +00:00
JimmFly 57ebb6baba chore: adjust CSV template button style (#11226)
close AF-2396
2025-03-27 07:10:15 +00:00
JimmFly 55ac09b1b6 fix(core): wrong import path (#11225) 2025-03-27 06:55:03 +00:00
EYHN 9c939da6b5 fix(core): fix duplicate in all page (#11229) 2025-03-27 06:36:57 +00:00
Saul-Mirone d9d5aa407a fix: split view focus (#11217)
# After:

https://github.com/user-attachments/assets/990d500d-2da7-488e-ac32-dd7bd229f896

# Before:

https://github.com/user-attachments/assets/6676766a-c76a-414b-a35e-53d2cda10c24
2025-03-27 05:27:59 +00:00
EYHN 5f5c27fbdf fix(core): fix upgrade popup (#11227) 2025-03-27 05:08:42 +00:00
doodlewind bb1bbccd0f refactor(editor): rx state management in turbo renderer (#11200)
# Refactor Turbo Renderer State Management to Use RxJS

### TL;DR

Refactored the TurboRenderer state management to use RxJS observables instead of direct state mutations, improving state transitions and reactivity.

### What changed?

- Replaced the public `state` property with a private `state$` BehaviorSubject in `ViewportTurboRendererExtension`
- Added proper state transition logging using RxJS operators
- Combined multiple event subscriptions using `merge` operator for better organization
- Improved state transition logic in the `refresh()` method
- Updated the `zooming$` and `panning$` signals in the Viewport

### Why make this change?

This refactoring improves the codebase by:
1. Using a more consistent reactive programming model with RxJS
2. Making state transitions more explicit and traceable
3. Reducing potential bugs from manual state management
4. Improving code organization by combining related event streams
5. Ensuring proper cleanup of resources when components are disposed

The change maintains the same functionality while making the code more maintainable and the state management more robust.
2025-03-27 04:50:32 +00:00
akumatus 22ef32f5c2 feat(core): provide document title, tags, createTime and updateTime to llm (#11205)
Close [BS-2915](https://linear.app/affine-design/issue/BS-2915).
2025-03-27 04:34:45 +00:00
donteatfriedrice 0c73fde44a feat(editor): update embed iframe toolbar config (#11221)
part of [BS-2843](https://linear.app/affine-design/issue/BS-2843/iframe-embed-block-占位态)
2025-03-27 04:17:30 +00:00
donteatfriedrice e763061bd6 fix(editor): dragging area gets stuck when hovering some embed blocks (#11223)
Close [BS-2778](https://linear.app/affine-design/issue/BS-2778/[bug]-选区框选-html-block-卡顿)
2025-03-27 03:59:26 +00:00
JimmFly b00584c4cc fix(core): improve client-app navigation flow after team workspace upgrade (#11201) 2025-03-27 03:23:29 +00:00
JimmFly 5fbee7cc88 fix(core): close popup window when upgrade success (#11199) 2025-03-27 03:23:29 +00:00
Oleg ac600a5309 fix(editor): ui and edgeless bugs (#11087)
Co-authored-by: Mirone <Saul-Mirone@outlook.com>
2025-03-27 11:22:53 +08:00
JimmFly 4fddf0d000 fix(core): show SentRequestPage when invitation status is NeedMoreSeat (#11207) 2025-03-27 03:00:14 +00:00
darkskygit 2e5ce44e1b fix(server): make status optional (#11176) 2025-03-27 02:44:29 +00:00
EYHN e311d3d1cb feat(core): more notification type (#11209) 2025-03-27 02:10:49 +00:00
fengmk2 8f124c5070 fix(server): use client doc title when server title is empty (#11210)
close CLOUD-185
2025-03-27 00:41:23 +00:00
renovate abe67d86f5 chore: bump up apple-actions/import-codesign-certs action to v5 (#11216)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [apple-actions/import-codesign-certs](https://redirect.github.com/apple-actions/import-codesign-certs) | action | major | `v3` -> `v5` |

---

### Release Notes

<details>
<summary>apple-actions/import-codesign-certs (apple-actions/import-codesign-certs)</summary>

### [`v5`](https://redirect.github.com/apple-actions/import-codesign-certs/compare/v4...v5)

[Compare Source](https://redirect.github.com/apple-actions/import-codesign-certs/compare/v4...v5)

### [`v4`](https://redirect.github.com/apple-actions/import-codesign-certs/compare/v3...v4)

[Compare Source](https://redirect.github.com/apple-actions/import-codesign-certs/compare/v3...v4)

</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:eyJjcmVhdGVkSW5WZXIiOiIzOS4yMDcuMSIsInVwZGF0ZWRJblZlciI6IjM5LjIwNy4xIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->
2025-03-26 16:13:52 +00:00
renovate 261661c419 chore: bump up @googleapis/androidpublisher version to v26 (#11214)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [@googleapis/androidpublisher](https://redirect.github.com/googleapis/google-api-nodejs-client) | [`^24.0.0` -> `^26.0.0`](https://renovatebot.com/diffs/npm/@googleapis%2fandroidpublisher/24.0.0/26.0.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@googleapis%2fandroidpublisher/26.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@googleapis%2fandroidpublisher/26.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@googleapis%2fandroidpublisher/24.0.0/26.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@googleapis%2fandroidpublisher/24.0.0/26.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) |

---

### Release Notes

<details>
<summary>googleapis/google-api-nodejs-client (@&#8203;googleapis/androidpublisher)</summary>

### [`v26.0.0`](https://redirect.github.com/googleapis/google-api-nodejs-client/blob/HEAD/CHANGELOG.md#12600-2023-08-17)

[Compare Source](https://redirect.github.com/googleapis/google-api-nodejs-client/compare/v25.0.0...v26.0.0)

##### ⚠ BREAKING CHANGES

-   **vmmigration:** This release has breaking changes.
-   **contentwarehouse:** This release has breaking changes.
-   **assuredworkloads:** This release has breaking changes.
-   **aiplatform:** This release has breaking changes.

##### Features

-   **admin:** update the API ([ebfb777](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/ebfb7776843472e0d7ebda50cfdf4532aedfddc1))
-   **aiplatform:** update the API ([146712c](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/146712c48eada981c15b6fff9b07040a7575d47c))
-   **androidpublisher:** update the API ([2d7c2b4](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/2d7c2b424776c93c6d423fe9b3f3a01eeeaa9d1f))
-   **assuredworkloads:** update the API ([6547ea1](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/6547ea1ef1dfa62352e276d4f394350cb7521f68))
-   **contactcenterinsights:** update the API ([1f2e6eb](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/1f2e6eb4ab01a7ce17c7891988da4654d5f2e6a6))
-   **containeranalysis:** update the API ([7acf09f](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/7acf09fc5393dfeaa6e6f068f3e1dd6b36dd293c))
-   **contentwarehouse:** update the API ([c44aeaf](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/c44aeafdd35f1b80e919cd1e8d176bea2b63e5ca))
-   **discoveryengine:** update the API ([bca2665](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/bca26655ef4a6eaaf8a827cfdc69c8c1f6214928))
-   regenerate index files ([751227d](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/751227d3926c946b5db5edb58f0086e074a61169))
-   **serviceconsumermanagement:** update the API ([336b645](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/336b645dbb2e745c45dd56dce74ba6e0dac2d2c0))
-   **serviceusage:** update the API ([6f08362](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/6f0836293aaeb2da119c41fe6c1f5782d8087e25))
-   **testing:** update the API ([9c06a45](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/9c06a45890548f296edcf35d6858651a1ad334cd))
-   **vmmigration:** update the API ([75cbb15](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/75cbb1513e9ea7b1d69b82c2fb24d8fbdde69554))

##### Bug Fixes

-   **contactcenteraiplatform:** update the API ([e4bfff0](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/e4bfff0b61696b2744eef4a97f9e22ee2338d46c))
-   **content:** update the API ([6e9f31f](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/6e9f31fdffc1c1993ca77ef3d3dd408d887478d8))
-   **dns:** update the API ([2e49df0](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/2e49df07079fa5e0281341361a28542cb07551cc))
-   **eventarc:** update the API ([b7a0e5a](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/b7a0e5a26eabdd757468ae12c6b1ba444f3a10dd))
-   **gameservices:** update the API ([8733a48](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/8733a48c00fdc2488e9b9804f156384ed24ed5bb))
-   **metastore:** update the API ([26f97a2](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/26f97a259edb0a04efd068f29e0d7f561ad84560))
-   **privateca:** update the API ([b50c176](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/b50c1766564ba321cbea8b7d3970620528820562))
-   **recommendationengine:** update the API ([fd203b4](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/fd203b411fbe838ab69ab21c141b4e7162c85eeb))
-   **vision:** update the API ([2593341](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/2593341f5bd65213067e4d23f834ce26442a3633))
-   **vpcaccess:** update the API ([b740cac](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/b740cacf6fc152ed22fb20d9ab35919f8206c3c1))

### [`v25.0.0`](https://redirect.github.com/googleapis/google-api-nodejs-client/blob/HEAD/CHANGELOG.md#12500-2023-08-15)

##### ⚠ BREAKING CHANGES

-   **gkehub:** This release has breaking changes.
-   **contentwarehouse:** This release has breaking changes.
-   **bigquery:** This release has breaking changes.
-   **beyondcorp:** This release has breaking changes.
-   **assuredworkloads:** This release has breaking changes.

##### Features

-   **analyticsadmin:** update the API ([3bed127](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/3bed127d4e98071cd1d4c635337f7312d9015f56))
-   **appengine:** update the API ([a8d4c48](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/a8d4c48bd10c5f49866e7f5b9121e9312bb2dcdf))
-   **artifactregistry:** update the API ([2d1257d](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/2d1257d9ac16efd6be322dbced3ec2bd45bffd0c))
-   **assuredworkloads:** update the API ([f58a85a](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/f58a85a1ace5abe94f714ca76b04619cbbc3e760))
-   **beyondcorp:** update the API ([270693a](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/270693ad48fdd92ef619b11f1a014e034de9016e))
-   **bigquery:** update the API ([b0bc1f1](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/b0bc1f15a8f644186903efa94dde0c3fe48bc8d5))
-   **binaryauthorization:** update the API ([2175fab](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/2175fab3e4445c49f80dc71d59919a529ca45e47))
-   **cloudbuild:** update the API ([2413746](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/2413746386f9f709dd330804f9b2ac5521e59696))
-   **composer:** update the API ([d2322c2](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/d2322c2a50244aa0a485a7eb0b3fffef2f4cf881))
-   **container:** update the API ([3ab84ca](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/3ab84caea95c0501f4f95d265c86408bc7a9405a))
-   **contentwarehouse:** update the API ([73f5d69](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/73f5d69b1d203331145755865b3b59bd648163ca))
-   **dataform:** update the API ([1f0c739](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/1f0c739684bb2864de83c51d61582e401fe77e69))
-   **dataproc:** update the API ([1fc81ab](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/1fc81abff84da94dba4cac7efab50dddb907f3e7))
-   **dialogflow:** update the API ([6aba841](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/6aba84130236c64c6b5c13da9fe2522ae088fe93))
-   **discoveryengine:** update the API ([57a6bdd](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/57a6bdd926fa941af952eefed93eff64ded1eecb))
-   **documentai:** update the API ([ae0e266](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/ae0e2664ae46c364a61b044c8fb473006ba788ad))
-   **firebaseappcheck:** update the API ([13f8c86](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/13f8c865f8fdc33370f422a6024b95e96284f727))
-   **gkehub:** update the API ([7c7c561](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/7c7c5611a631fbbbc7252fba133de7f3bd254cdf))
-   **healthcare:** update the API ([9dc7235](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/9dc723542dadac52e3c9a363f212c552932a69ab))
-   **identitytoolkit:** update the API ([f15458e](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/f15458e8135bcd2a628c30b937ea3333caca2836))
-   **migrationcenter:** update the API ([43d3a7e](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/43d3a7e3511107e5effd1d42a1f71bcae11b5bf4))
-   **monitoring:** update the API ([d6ab1de](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/d6ab1de97ab104effa28a2e87db1946b840aff3f))
-   **networkmanagement:** update the API ([b00b4c3](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/b00b4c39b0415a1b3e0f85dd3f4094d8abd47e65))
-   **paymentsresellersubscription:** update the API ([fa9bc92](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/fa9bc92c284d6097a6d44d9b3a691cba60213a36))
-   **redis:** update the API ([633a71b](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/633a71b75e4968ca4f1b55d7096d828921073283))
-   regenerate index files ([1b979cb](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/1b979cb4bd885a50628386356c96eb891ebbd661))
-   **run:** update the API ([2dc654e](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/2dc654e314747dba4c41304c464faff7edbf9c33))
-   **vmmigration:** update the API ([433922a](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/433922ae8112bcc926d12e855a2c5a1ce5ea35de))

##### Bug Fixes

-   **accesscontextmanager:** update the API ([37483a5](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/37483a53c37eeb9549cf03f25a543f2dd4acae0e))
-   **advisorynotifications:** update the API ([5d47fbd](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/5d47fbd05f937c4b94222b8ee76ccf417dc545c7))
-   **analyticsdata:** update the API ([fcd31de](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/fcd31debbcdd0bbfe3a22b84c1737234198c8dd3))
-   **analyticshub:** update the API ([028a8f2](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/028a8f2845da02c62a7c213cfac0580432d72c28))
-   **androidmanagement:** update the API ([b6e3344](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/b6e33442cb67aeedd83f16bfa398a1da2ff24adb))
-   **apigateway:** update the API ([28a0c2b](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/28a0c2b909400dc17f8ea45a68417e9557815af9))
-   **apigeeregistry:** update the API ([f4b44ce](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/f4b44ce7ff1cf01ec76f8ae79e4800a8eaa104e8))
-   **batch:** update the API ([c0f6c8e](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/c0f6c8ebae4dafa763abf2748d42d98e5da3ca43))
-   **bigqueryconnection:** update the API ([238464d](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/238464d37eccfedead275dc0f12d51bf9fbfc00d))
-   **chat:** update the API ([9bebe9d](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/9bebe9d01af0166a60f3b01b9d3795df79a8a8bf))
-   **cloudbilling:** update the API ([0a0d5e9](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/0a0d5e9f35d4e18a45ac1b1b5327661e0a2b31f4))
-   **clouddeploy:** update the API ([8efff9d](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/8efff9d26e52aa9c388072ba25342f64b3dddcd2))
-   **cloudidentity:** update the API ([01762af](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/01762affc9f7ac2b5dc2db7bfac75d1988941245))
-   **cloudkms:** update the API ([3499c39](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/3499c393ef41f5071efaa03270be37f860a4b5ab))
-   **cloudsearch:** update the API ([25771c7](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/25771c752c1162aa0d6af3c819627a3bb64894e8))
-   **cloudshell:** update the API ([dd761cd](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/dd761cdec6dbc10bf7b9bab9690182ae8af05098))
-   **connectors:** update the API ([2a03080](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/2a03080ff223667bd3c18997ec2386bc722509a2))
-   **containeranalysis:** update the API ([4de5705](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/4de5705559170300a8a2d14df945afd4835e9eca))
-   **datacatalog:** update the API ([c823e38](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/c823e3831574adccc47767ced24b842600235211))
-   **datamigration:** update the API ([0b476bb](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/0b476bb46fc71cc4fe0ee18571bb9725048179aa))
-   **dataplex:** update the API ([07737a9](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/07737a9c0be1e39659da7700f4f3687abd443895))
-   **datastore:** update the API ([f5f7e0e](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/f5f7e0e81bc891e679d848602ddfb81f9ade6bfa))
-   **datastream:** update the API ([d1efe13](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/d1efe137eeb71944e1b850fa3eb652431a8547d8))
-   **deps:** update dependency [@&#8203;google-cloud/local-auth](https://redirect.github.com/google-cloud/local-auth) to v3 ([b9e0f13](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/b9e0f133df88bd86e784d4bf836b1aec8037abb9))
-   **dlp:** update the API ([66720df](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/66720df28639cb38139658231f93e1cb6badad86))
-   **eventarc:** update the API ([2a475fa](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/2a475faaef31b3ee3024c89c338179a23b9c42c6))
-   **file:** update the API ([16d1c38](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/16d1c381e4003d3d13aef706556ca2a21f1b711e))
-   **firestore:** update the API ([25dd82f](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/25dd82f85cecf9e26161c61687927404f6ad6408))
-   **iam:** update the API ([df42895](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/df428953ea84e659b154cfb93f7d773954b70194))
-   **language:** update the API ([86d4072](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/86d4072801d2f4feb3534bc3c506ef779a967d22))
-   **logging:** update the API ([5ce9916](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/5ce99164a42297d9c1bc76862fe57873d8319b0d))
-   **memcache:** update the API ([1c738c4](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/1c738c4e5f70598e51eb2163a2e01ad9c6da38db))
-   **metastore:** update the API ([3045ac9](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/3045ac90773e2e4bdafeeb420be349be1ffbba16))
-   **networkconnectivity:** update the API ([db2c560](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/db2c5609b8b6cef85b04d58a493fafe59de65a33))
-   **networkservices:** update the API ([c2ca6b5](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/c2ca6b5b297a7d234ab303da9562099c4a860b0c))
-   **ondemandscanning:** update the API ([b5da2fb](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/b5da2fbde7acbff7f08255b2de0ba2597c8614b6))
-   **osconfig:** update the API ([926f83d](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/926f83d5711be9b30b4dfe9a70530e761a075e76))
-   **policysimulator:** update the API ([337d6d9](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/337d6d9bc255bc13cc6ae33c68a662c45c375f4f))
-   **prod_tt_sasportal:** update the API ([cad4560](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/cad45600a11cc3f9752607f1641c6c9ad6c73036))
-   **pubsublite:** update the API ([383264c](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/383264cadb0134a9f133b0f84f387d96bd68e65f))
-   **pubsub:** update the API ([6c41abf](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/6c41abf474c9b4447f76ad4d73ff7c59eabaa2d7))
-   **recommender:** update the API ([b7e0460](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/b7e04605e76dee6162fcb9b6ff412c7449b166d5))
-   **sasportal:** update the API ([cd8a38c](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/cd8a38c7507d2ef109ee98fbe555081d48cd1505))
-   **script:** update the API ([09d1558](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/09d1558a81ecba58aab099623ff9b1264a734576))
-   **secretmanager:** update the API ([fe01e40](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/fe01e40054da2b5318e5ecff57b52ec5bf113d8d))
-   **securitycenter:** update the API ([0d66358](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/0d66358f766a762a8d0cdc6c5f79bfcd5f332dcc))
-   **servicecontrol:** update the API ([ceadea7](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/ceadea74b346965c7a0eccd611186e36a556af11))
-   **servicedirectory:** update the API ([c52f8c3](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/c52f8c338618e1a3eb09f4479769396e97a6df24))
-   **servicemanagement:** update the API ([c5c135d](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/c5c135da55575a8548610557104818740febb6f0))
-   **sheets:** update the API ([19e06a7](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/19e06a7c922dbb495c0861188329cc93a0abf0c3))
-   **speech:** update the API ([b75b27e](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/b75b27e0adccdc6fed87fde047ca0d41b9b2332d))
-   **storagetransfer:** update the API ([29b6593](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/29b6593955478b2a17600718054eed981056e72f))
-   **tpu:** update the API ([e396d7e](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/e396d7e10def66cd3d9eb424c448e61e1a016b2b))
-   **translate:** update the API ([5789f48](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/5789f485eae7d8b17c353e7f24185b0b31b6b80d))
-   **vault:** update the API ([6f14118](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/6f1411871ca5bc99087cbc97d6e9c28dbc0f78ad))
-   **vision:** update the API ([8fd1995](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/8fd19953a1bb295b46fb1584d0bae62774a55ab0))
-   **vpcaccess:** update the API ([6641889](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/66418891464fa6aa5bdc4ab384b0e1db9e980754))
-   **workflows:** update the API ([5e9374a](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/5e9374afdc240b9423bd034e56a9b08c1ea52083))
-   **workstations:** update the API ([fefd54a](https://redirect.github.com/googleapis/google-api-nodejs-client/commit/fefd54ada1f3cde6066289b2b8a7e046566df19c))

</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:eyJjcmVhdGVkSW5WZXIiOiIzOS4yMDcuMSIsInVwZGF0ZWRJblZlciI6IjM5LjIwNy4xIiwidGFyZ2V0QnJhbmNoIjoiY2FuYXJ5IiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==-->
2025-03-26 13:48:55 +00:00
1712 changed files with 24991 additions and 51968 deletions
+900
View File
@@ -0,0 +1,900 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "AFFiNE Application Configuration",
"type": "object",
"properties": {
"redis": {
"type": "object",
"description": "Configuration for redis module",
"properties": {
"db": {
"type": "number",
"description": "The database index of redis server to be used(Must be less than 10).\n@default 0\n@environment `REDIS_DATABASE`",
"default": 0
},
"host": {
"type": "string",
"description": "The host of the redis server.\n@default \"localhost\"\n@environment `REDIS_HOST`",
"default": "localhost"
},
"port": {
"type": "number",
"description": "The port of the redis server.\n@default 6379\n@environment `REDIS_PORT`",
"default": 6379
},
"username": {
"type": "string",
"description": "The username of the redis server.\n@default \"\"\n@environment `REDIS_USERNAME`",
"default": ""
},
"password": {
"type": "string",
"description": "The password of the redis server.\n@default \"\"\n@environment `REDIS_PASSWORD`",
"default": ""
},
"ioredis": {
"type": "object",
"description": "The config for the ioredis client.\n@default {}\n@link https://github.com/luin/ioredis",
"default": {}
}
}
},
"metrics": {
"type": "object",
"description": "Configuration for metrics module",
"properties": {
"enabled": {
"type": "boolean",
"description": "Enable metric and tracing collection\n@default false",
"default": false
}
}
},
"graphql": {
"type": "object",
"description": "Configuration for graphql module",
"properties": {
"apolloDriverConfig": {
"type": "object",
"description": "The config for underlying nestjs GraphQL and apollo driver engine.\n@default {\"buildSchemaOptions\":{\"numberScalarMode\":\"integer\"},\"useGlobalPrefix\":true,\"playground\":true,\"introspection\":true,\"sortSchema\":true}\n@link https://docs.nestjs.com/graphql/quick-start",
"default": {
"buildSchemaOptions": {
"numberScalarMode": "integer"
},
"useGlobalPrefix": true,
"playground": true,
"introspection": true,
"sortSchema": true
}
}
}
},
"crypto": {
"type": "object",
"description": "Configuration for crypto module",
"properties": {
"privateKey": {
"type": "string",
"description": "The private key for used by the crypto module to create signed tokens or encrypt data.\n@default \"\"\n@environment `AFFINE_PRIVATE_KEY`",
"default": ""
}
}
},
"job": {
"type": "object",
"description": "Configuration for job module",
"properties": {
"queue": {
"type": "object",
"description": "The config for job queues\n@default {\"prefix\":\"affine_job\",\"defaultJobOptions\":{\"attempts\":5,\"removeOnComplete\":true,\"removeOnFail\":{\"age\":86400,\"count\":500}}}\n@link https://api.docs.bullmq.io/interfaces/v5.QueueOptions.html",
"default": {
"prefix": "affine_job",
"defaultJobOptions": {
"attempts": 5,
"removeOnComplete": true,
"removeOnFail": {
"age": 86400,
"count": 500
}
}
}
},
"worker": {
"type": "object",
"description": "The config for job workers\n@default {\"defaultWorkerOptions\":{}}\n@link https://api.docs.bullmq.io/interfaces/v5.WorkerOptions.html",
"default": {
"defaultWorkerOptions": {}
}
},
"queues.copilot": {
"type": "object",
"description": "The config for copilot job queue\n@default {\"concurrency\":1}",
"properties": {
"concurrency": {
"type": "number"
}
},
"default": {
"concurrency": 1
}
},
"queues.doc": {
"type": "object",
"description": "The config for doc job queue\n@default {\"concurrency\":1}",
"properties": {
"concurrency": {
"type": "number"
}
},
"default": {
"concurrency": 1
}
},
"queues.notification": {
"type": "object",
"description": "The config for notification job queue\n@default {\"concurrency\":10}",
"properties": {
"concurrency": {
"type": "number"
}
},
"default": {
"concurrency": 10
}
},
"queues.nightly": {
"type": "object",
"description": "The config for nightly job queue\n@default {\"concurrency\":1}",
"properties": {
"concurrency": {
"type": "number"
}
},
"default": {
"concurrency": 1
}
}
}
},
"throttle": {
"type": "object",
"description": "Configuration for throttle module",
"properties": {
"enabled": {
"type": "boolean",
"description": "Whether the throttler is enabled.\n@default true",
"default": true
},
"throttlers.default": {
"type": "object",
"description": "The config for the default throttler.\n@default {\"ttl\":60,\"limit\":120}",
"default": {
"ttl": 60,
"limit": 120
}
},
"throttlers.strict": {
"type": "object",
"description": "The config for the strict throttler.\n@default {\"ttl\":60,\"limit\":20}",
"default": {
"ttl": 60,
"limit": 20
}
}
}
},
"websocket": {
"type": "object",
"description": "Configuration for websocket module",
"properties": {
"transports": {
"type": "array",
"description": "The enabled transports for accepting websocket traffics.\n@default [\"websocket\",\"polling\"]\n@link https://docs.nestjs.com/websockets/gateways#transports",
"items": {
"type": "string",
"enum": [
"websocket",
"polling"
]
},
"default": [
"websocket",
"polling"
]
},
"maxHttpBufferSize": {
"type": "number",
"description": "How many bytes or characters a message can be, before closing the session (to avoid DoS).\n@default 100000000",
"default": 100000000
}
}
},
"db": {
"type": "object",
"description": "Configuration for db module",
"properties": {
"datasourceUrl": {
"type": "string",
"description": "The datasource url for the prisma client.\n@default \"postgresql://localhost:5432/affine\"\n@environment `DATABASE_URL`",
"default": "postgresql://localhost:5432/affine"
},
"prisma": {
"type": "object",
"description": "The config for the prisma client.\n@default {}\n@link https://www.prisma.io/docs/reference/api-reference/prisma-client-reference",
"default": {}
}
}
},
"auth": {
"type": "object",
"description": "Configuration for auth module",
"properties": {
"allowSignup": {
"type": "boolean",
"description": "Whether allow new registrations.\n@default true",
"default": true
},
"requireEmailDomainVerification": {
"type": "boolean",
"description": "Whether require email domain record verification before accessing restricted resources.\n@default false",
"default": false
},
"requireEmailVerification": {
"type": "boolean",
"description": "Whether require email verification before accessing restricted resources(not implemented).\n@default true",
"default": true
},
"passwordRequirements": {
"type": "object",
"description": "The password strength requirements when set new password.\n@default {\"min\":8,\"max\":32}",
"properties": {
"min": {
"type": "number"
},
"max": {
"type": "number"
}
},
"default": {
"min": 8,
"max": 32
}
},
"session.ttl": {
"type": "number",
"description": "Application auth expiration time in seconds.\n@default 1296000",
"default": 1296000
},
"session.ttr": {
"type": "number",
"description": "Application auth time to refresh in seconds.\n@default 604800",
"default": 604800
}
}
},
"mailer": {
"type": "object",
"description": "Configuration for mailer module",
"properties": {
"enabled": {
"type": "boolean",
"description": "Whether enabled mail service.\n@default false",
"default": false
},
"SMTP.host": {
"type": "string",
"description": "Host of the email server (e.g. smtp.gmail.com)\n@default \"\"\n@environment `MAILER_HOST`",
"default": ""
},
"SMTP.port": {
"type": "number",
"description": "Port of the email server (they commonly are 25, 465 or 587)\n@default 465\n@environment `MAILER_PORT`",
"default": 465
},
"SMTP.username": {
"type": "string",
"description": "Username used to authenticate the email server\n@default \"\"\n@environment `MAILER_USER`",
"default": ""
},
"SMTP.password": {
"type": "string",
"description": "Password used to authenticate the email server\n@default \"\"\n@environment `MAILER_PASSWORD`",
"default": ""
},
"SMTP.sender": {
"type": "string",
"description": "Sender of all the emails (e.g. \"AFFiNE Team <noreply@affine.pro>\")\n@default \"\"\n@environment `MAILER_SENDER`",
"default": ""
},
"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`",
"default": false
}
}
},
"doc": {
"type": "object",
"description": "Configuration for doc module",
"properties": {
"experimental.yocto": {
"type": "boolean",
"description": "Use `y-octo` to merge updates at the same time when merging using Yjs.\n@default false",
"default": false
},
"history.interval": {
"type": "number",
"description": "The minimum time interval in milliseconds of creating a new history snapshot when doc get updated.\n@default 600000",
"default": 600000
}
}
},
"storages": {
"type": "object",
"description": "Configuration for storages module",
"properties": {
"avatar.publicPath": {
"type": "string",
"description": "The public accessible path prefix for user avatars.\n@default \"/api/avatars/\"",
"default": "/api/avatars/"
},
"avatar.storage": {
"type": "object",
"description": "The config of storage for user avatars.\n@default {\"provider\":\"fs\",\"bucket\":\"avatars\",\"config\":{\"path\":\"~/.affine/storage\"}}",
"oneOf": [
{
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
"fs"
]
},
"bucket": {
"type": "string"
},
"config": {
"type": "object",
"properties": {
"path": {
"type": "string"
}
}
}
}
},
{
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
"aws-s3"
]
},
"bucket": {
"type": "string"
},
"config": {
"type": "object",
"description": "The config for the s3 compatible storage provider. directly passed to aws-sdk client.\n@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html",
"properties": {
"credentials": {
"type": "object",
"description": "The credentials for the s3 compatible storage provider.",
"properties": {
"accessKeyId": {
"type": "string"
},
"secretAccessKey": {
"type": "string"
}
}
}
}
}
}
},
{
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
"cloudflare-r2"
]
},
"bucket": {
"type": "string"
},
"config": {
"type": "object",
"description": "The config for the s3 compatible storage provider. directly passed to aws-sdk client.\n@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html",
"properties": {
"credentials": {
"type": "object",
"description": "The credentials for the s3 compatible storage provider.",
"properties": {
"accessKeyId": {
"type": "string"
},
"secretAccessKey": {
"type": "string"
}
}
},
"accountId": {
"type": "string",
"description": "The account id for the cloudflare r2 storage provider."
}
}
}
}
}
],
"default": {
"provider": "fs",
"bucket": "avatars",
"config": {
"path": "~/.affine/storage"
}
}
},
"blob.storage": {
"type": "object",
"description": "The config of storage for all uploaded blobs(images, videos, etc.).\n@default {\"provider\":\"fs\",\"bucket\":\"blobs\",\"config\":{\"path\":\"~/.affine/storage\"}}",
"oneOf": [
{
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
"fs"
]
},
"bucket": {
"type": "string"
},
"config": {
"type": "object",
"properties": {
"path": {
"type": "string"
}
}
}
}
},
{
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
"aws-s3"
]
},
"bucket": {
"type": "string"
},
"config": {
"type": "object",
"description": "The config for the s3 compatible storage provider. directly passed to aws-sdk client.\n@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html",
"properties": {
"credentials": {
"type": "object",
"description": "The credentials for the s3 compatible storage provider.",
"properties": {
"accessKeyId": {
"type": "string"
},
"secretAccessKey": {
"type": "string"
}
}
}
}
}
}
},
{
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
"cloudflare-r2"
]
},
"bucket": {
"type": "string"
},
"config": {
"type": "object",
"description": "The config for the s3 compatible storage provider. directly passed to aws-sdk client.\n@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html",
"properties": {
"credentials": {
"type": "object",
"description": "The credentials for the s3 compatible storage provider.",
"properties": {
"accessKeyId": {
"type": "string"
},
"secretAccessKey": {
"type": "string"
}
}
},
"accountId": {
"type": "string",
"description": "The account id for the cloudflare r2 storage provider."
}
}
}
}
}
],
"default": {
"provider": "fs",
"bucket": "blobs",
"config": {
"path": "~/.affine/storage"
}
}
}
}
},
"server": {
"type": "object",
"description": "Configuration for server module",
"properties": {
"name": {
"type": "string",
"description": "A recognizable name for the server. Will be shown when connected with AFFiNE Desktop.\n@default \"AFFiNE Cloud\"",
"default": "AFFiNE Cloud"
},
"externalUrl": {
"type": "string",
"description": "Base url of AFFiNE server, used for generating external urls.\nDefault to be `[server.protocol]://[server.host][:server.port]` if not specified.\n \n@default \"http://localhost:3010\"\n@environment `AFFINE_SERVER_EXTERNAL_URL`",
"default": "http://localhost:3010"
},
"https": {
"type": "boolean",
"description": "Whether the server is hosted on a ssl enabled domain (https://).\n@default false\n@environment `AFFINE_SERVER_HTTPS`",
"default": false
},
"host": {
"type": "string",
"description": "Where the server get deployed(FQDN).\n@default \"localhost\"\n@environment `AFFINE_SERVER_HOST`",
"default": "localhost"
},
"port": {
"type": "number",
"description": "Which port the server will listen on.\n@default 3010\n@environment `AFFINE_SERVER_PORT`",
"default": 3010
},
"path": {
"type": "string",
"description": "Subpath where the server get deployed if there is.\n@default \"\"\n@environment `AFFINE_SERVER_SUB_PATH`",
"default": ""
}
}
},
"flags": {
"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
}
}
},
"client": {
"type": "object",
"description": "Configuration for client module",
"properties": {
"versionControl.enabled": {
"type": "boolean",
"description": "Whether check version of client before accessing the server.\n@default false",
"default": false
},
"versionControl.requiredVersion": {
"type": "string",
"description": "Allowed version range of the app that allowed to access the server. Requires 'client/versionControl.enabled' to be true to take effect.\n@default \">=0.20.0\"",
"default": ">=0.20.0"
}
}
},
"captcha": {
"type": "object",
"description": "Configuration for captcha module",
"properties": {
"enabled": {
"type": "boolean",
"description": "Check captcha challenge when user authenticating the app.\n@default false",
"default": false
},
"config": {
"type": "object",
"description": "The config for the captcha plugin.\n@default {\"turnstile\":{\"secret\":\"\"},\"challenge\":{\"bits\":20}}",
"default": {
"turnstile": {
"secret": ""
},
"challenge": {
"bits": 20
}
}
}
}
},
"copilot": {
"type": "object",
"description": "Configuration for copilot module",
"properties": {
"enabled": {
"type": "boolean",
"description": "Whether to enable the copilot plugin.\n@default false",
"default": false
},
"providers.openai": {
"type": "object",
"description": "The config for the openai provider.\n@default {\"apiKey\":\"\"}\n@link https://github.com/openai/openai-node",
"default": {
"apiKey": ""
}
},
"providers.fal": {
"type": "object",
"description": "The config for the fal provider.\n@default {\"apiKey\":\"\"}",
"default": {
"apiKey": ""
}
},
"providers.gemini": {
"type": "object",
"description": "The config for the gemini provider.\n@default {\"apiKey\":\"\"}",
"default": {
"apiKey": ""
}
},
"providers.perplexity": {
"type": "object",
"description": "The config for the perplexity provider.\n@default {\"apiKey\":\"\"}",
"default": {
"apiKey": ""
}
},
"unsplash": {
"type": "object",
"description": "The config for the unsplash key.\n@default {\"key\":\"\"}",
"default": {
"key": ""
}
},
"storage": {
"type": "object",
"description": "The config for the storage provider.\n@default {\"provider\":\"fs\",\"bucket\":\"copilot\",\"config\":{\"path\":\"~/.affine/storage\"}}",
"oneOf": [
{
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
"fs"
]
},
"bucket": {
"type": "string"
},
"config": {
"type": "object",
"properties": {
"path": {
"type": "string"
}
}
}
}
},
{
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
"aws-s3"
]
},
"bucket": {
"type": "string"
},
"config": {
"type": "object",
"description": "The config for the s3 compatible storage provider. directly passed to aws-sdk client.\n@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html",
"properties": {
"credentials": {
"type": "object",
"description": "The credentials for the s3 compatible storage provider.",
"properties": {
"accessKeyId": {
"type": "string"
},
"secretAccessKey": {
"type": "string"
}
}
}
}
}
}
},
{
"type": "object",
"properties": {
"provider": {
"type": "string",
"enum": [
"cloudflare-r2"
]
},
"bucket": {
"type": "string"
},
"config": {
"type": "object",
"description": "The config for the s3 compatible storage provider. directly passed to aws-sdk client.\n@link https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html",
"properties": {
"credentials": {
"type": "object",
"description": "The credentials for the s3 compatible storage provider.",
"properties": {
"accessKeyId": {
"type": "string"
},
"secretAccessKey": {
"type": "string"
}
}
},
"accountId": {
"type": "string",
"description": "The account id for the cloudflare r2 storage provider."
}
}
}
}
}
],
"default": {
"provider": "fs",
"bucket": "copilot",
"config": {
"path": "~/.affine/storage"
}
}
}
}
},
"customerIo": {
"type": "object",
"description": "Configuration for customerIo module",
"properties": {
"enabled": {
"type": "boolean",
"description": "Enable customer.io integration\n@default false",
"default": false
},
"token": {
"type": "string",
"description": "Customer.io token\n@default \"\"",
"default": ""
}
}
},
"oauth": {
"type": "object",
"description": "Configuration for oauth module",
"properties": {
"providers.google": {
"type": "object",
"description": "Google OAuth provider config\n@default {\"clientId\":\"\",\"clientSecret\":\"\"}\n@link https://developers.google.com/identity/protocols/oauth2/web-server",
"properties": {
"clientId": {
"type": "string"
},
"clientSecret": {
"type": "string"
},
"args": {
"type": "object"
}
},
"default": {
"clientId": "",
"clientSecret": ""
}
},
"providers.github": {
"type": "object",
"description": "GitHub OAuth provider config\n@default {\"clientId\":\"\",\"clientSecret\":\"\"}\n@link https://docs.github.com/en/apps/oauth-apps",
"properties": {
"clientId": {
"type": "string"
},
"clientSecret": {
"type": "string"
},
"args": {
"type": "object"
}
},
"default": {
"clientId": "",
"clientSecret": ""
}
},
"providers.oidc": {
"type": "object",
"description": "OIDC OAuth provider config\n@default {\"clientId\":\"\",\"clientSecret\":\"\",\"issuer\":\"\",\"args\":{}}",
"default": {
"clientId": "",
"clientSecret": "",
"issuer": "",
"args": {}
}
}
}
},
"payment": {
"type": "object",
"description": "Configuration for payment module",
"properties": {
"enabled": {
"type": "boolean",
"description": "Whether enable payment plugin\n@default false",
"default": false
},
"showLifetimePrice": {
"type": "boolean",
"description": "Whether enable lifetime price and allow user to pay for it.\n@default true",
"default": true
},
"apiKey": {
"type": "string",
"description": "Stripe API key to enable payment service.\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`",
"default": ""
},
"stripe": {
"type": "object",
"description": "Stripe API keys\n@default {}\n@link https://docs.stripe.com/api",
"default": {}
}
}
},
"worker": {
"type": "object",
"description": "Configuration for worker module",
"properties": {
"allowedOrigin": {
"type": "array",
"description": "Allowed origin\n@default [\"localhost\",\"127.0.0.1\"]",
"default": [
"localhost",
"127.0.0.1"
]
}
}
}
}
}
-19
View File
@@ -5,35 +5,16 @@ inputs:
description: 'Script to run'
default: 'yarn affine @affine-test/affine-cloud-copilot e2e --forbid-only'
required: false
openai-key:
description: 'OpenAI secret key'
required: true
google-key:
description: 'Google secret key'
required: true
fal-key:
description: 'Fal secret key'
required: true
perplexity-key:
description: 'Perplexity secret key'
required: true
runs:
using: 'composite'
steps:
- name: Prepare Server Test Environment
uses: ./.github/actions/server-test-env
- name: Server Copilot E2E Test
shell: bash
run: ${{ inputs.script }}
env:
COPILOT: true
DEV_SERVER_URL: http://localhost:8080
COPILOT_OPENAI_API_KEY: ${{ inputs.openai-key }}
COPILOT_GOOGLE_API_KEY: ${{ inputs.google-key }}
COPILOT_FAL_API_KEY: ${{ inputs.fal-key }}
COPILOT_PERPLEXITY_API_KEY: ${{ inputs.perplexity-key }}
- name: Upload test results
if: ${{ failure() }}
+8 -57
View File
@@ -10,29 +10,10 @@ const {
DATABASE_USERNAME,
DATABASE_PASSWORD,
DATABASE_NAME,
R2_ACCOUNT_ID,
R2_ACCESS_KEY_ID,
R2_SECRET_ACCESS_KEY,
CAPTCHA_TURNSTILE_SECRET,
METRICS_CUSTOMER_IO_TOKEN,
COPILOT_OPENAI_API_KEY,
COPILOT_FAL_API_KEY,
COPILOT_GOOGLE_API_KEY,
COPILOT_PERPLEXITY_API_KEY,
COPILOT_UNSPLASH_API_KEY,
MAILER_SENDER,
MAILER_USER,
MAILER_PASSWORD,
AFFINE_GOOGLE_CLIENT_ID,
AFFINE_GOOGLE_CLIENT_SECRET,
CLOUD_SQL_IAM_ACCOUNT,
APP_IAM_ACCOUNT,
GCLOUD_CONNECTION_NAME,
GCLOUD_CLOUD_SQL_INTERNAL_ENDPOINT,
REDIS_HOST,
REDIS_PASSWORD,
STRIPE_API_KEY,
STRIPE_WEBHOOK_KEY,
REDIS_SERVER_HOST,
REDIS_SERVER_PASSWORD,
STATIC_IP_NAME,
} = process.env;
@@ -89,15 +70,13 @@ const createHelmCommand = ({ isDryRun }) => {
const redisAndPostgres =
isProduction || isBeta || isInternal
? [
`--set-string global.database.url=${DATABASE_URL}`,
`--set cloud-sql-proxy.enabled=true`,
`--set-string global.database.host=${DATABASE_URL}`,
`--set-string global.database.user=${DATABASE_USERNAME}`,
`--set-string global.database.password=${DATABASE_PASSWORD}`,
`--set-string global.database.name=${DATABASE_NAME}`,
`--set global.database.gcloud.enabled=true`,
`--set-string global.database.gcloud.connectionName="${GCLOUD_CONNECTION_NAME}"`,
`--set-string global.database.gcloud.cloudSqlInternal="${GCLOUD_CLOUD_SQL_INTERNAL_ENDPOINT}"`,
`--set-string global.redis.host="${REDIS_HOST}"`,
`--set-string global.redis.password="${REDIS_PASSWORD}"`,
`--set-string global.redis.host="${REDIS_SERVER_HOST}"`,
`--set-string global.redis.password="${REDIS_SERVER_PASSWORD}"`,
]
: [];
const serviceAnnotations = [
@@ -141,14 +120,12 @@ const createHelmCommand = ({ isDryRun }) => {
const deployCommand = [
`helm upgrade --install affine .github/helm/affine`,
`--namespace ${namespace}`,
`--set-string global.deployment.type="affine"`,
`--set-string global.deployment.platform="gcp"`,
`--set-string global.app.buildType="${buildType}"`,
`--set global.ingress.enabled=true`,
`--set-json global.ingress.annotations="{ \\"kubernetes.io/ingress.class\\": \\"gce\\", \\"kubernetes.io/ingress.allow-http\\": \\"true\\", \\"kubernetes.io/ingress.global-static-ip-name\\": \\"${STATIC_IP_NAME}\\" }"`,
`--set-string global.ingress.host="${host}"`,
`--set global.objectStorage.r2.enabled=true`,
`--set-string global.objectStorage.r2.accountId="${R2_ACCOUNT_ID}"`,
`--set-string global.objectStorage.r2.accessKeyId="${R2_ACCESS_KEY_ID}"`,
`--set-string global.objectStorage.r2.secretAccessKey="${R2_SECRET_ACCESS_KEY}"`,
`--set-string global.version="${APP_VERSION}"`,
...redisAndPostgres,
`--set web.replicaCount=${replica.web}`,
@@ -156,27 +133,6 @@ const createHelmCommand = ({ isDryRun }) => {
`--set graphql.replicaCount=${replica.graphql}`,
`--set-string graphql.image.tag="${imageTag}"`,
`--set graphql.app.host=${host}`,
`--set graphql.app.captcha.enabled=true`,
`--set-string graphql.app.captcha.turnstile.secret="${CAPTCHA_TURNSTILE_SECRET}"`,
`--set graphql.app.copilot.enabled=true`,
`--set-string graphql.app.copilot.openai.key="${COPILOT_OPENAI_API_KEY}"`,
`--set-string graphql.app.copilot.fal.key="${COPILOT_FAL_API_KEY}"`,
`--set-string graphql.app.copilot.google.key="${COPILOT_GOOGLE_API_KEY}"`,
`--set-string graphql.app.copilot.perplexity.key="${COPILOT_PERPLEXITY_API_KEY}"`,
`--set-string graphql.app.copilot.unsplash.key="${COPILOT_UNSPLASH_API_KEY}"`,
`--set-string graphql.app.mailer.sender="${MAILER_SENDER}"`,
`--set-string graphql.app.mailer.user="${MAILER_USER}"`,
`--set-string graphql.app.mailer.password="${MAILER_PASSWORD}"`,
`--set-string graphql.app.oauth.google.enabled=true`,
`--set-string graphql.app.oauth.google.clientId="${AFFINE_GOOGLE_CLIENT_ID}"`,
`--set-string graphql.app.oauth.google.clientSecret="${AFFINE_GOOGLE_CLIENT_SECRET}"`,
`--set-string graphql.app.payment.stripe.apiKey="${STRIPE_API_KEY}"`,
`--set-string graphql.app.payment.stripe.webhookKey="${STRIPE_WEBHOOK_KEY}"`,
`--set graphql.app.metrics.enabled=true`,
`--set-string graphql.app.metrics.customerIo.token="${METRICS_CUSTOMER_IO_TOKEN}"`,
`--set graphql.app.experimental.enableJwstCodec=${namespace === 'dev'}`,
`--set graphql.app.features.earlyAccessPreview=false`,
`--set graphql.app.features.syncClientVersionCheck=true`,
`--set sync.replicaCount=${replica.sync}`,
`--set-string sync.image.tag="${imageTag}"`,
`--set-string renderer.image.tag="${imageTag}"`,
@@ -184,11 +140,6 @@ const createHelmCommand = ({ isDryRun }) => {
`--set renderer.replicaCount=${replica.renderer}`,
`--set-string doc.image.tag="${imageTag}"`,
`--set doc.app.host=${host}`,
`--set doc.app.copilot.enabled=true`,
`--set-string doc.app.copilot.openai.key="${COPILOT_OPENAI_API_KEY}"`,
`--set-string doc.app.copilot.fal.key="${COPILOT_FAL_API_KEY}"`,
`--set-string doc.app.copilot.perplexity.key="${COPILOT_PERPLEXITY_API_KEY}"`,
`--set-string doc.app.copilot.unsplash.key="${COPILOT_UNSPLASH_API_KEY}"`,
`--set doc.replicaCount=${replica.doc}`,
...serviceAnnotations,
...resources,
@@ -21,3 +21,11 @@ runs:
yarn affine @affine/server prisma generate
yarn affine @affine/server prisma migrate deploy
yarn affine @affine/server data-migration run
- name: Import config
shell: bash
run: |
printf '{"copilot":{"enabled":true,"providers.fal":{"apiKey":"%s"},"providers.gemini":{"apiKey":"%s"},"providers.openai":{"apiKey":"%s"},"providers.perplexity":{"apiKey":"%s"}}}' \
"$COPILOT_FAL_API_KEY" \
"$COPILOT_GOOGLE_API_KEY" \
"$COPILOT_OPENAI_API_KEY" \
"$COPILOT_PERPLEXITY_API_KEY" > ./packages/backend/server/config.json
@@ -40,7 +40,9 @@ spec:
- name: NO_COLOR
value: "1"
- name: DEPLOYMENT_TYPE
value: "affine"
value: "{{ .Values.global.deployment.type }}"
- name: DEPLOYMENT_PLATFORM
value: "{{ .Values.global.deployment.platform }}"
- name: SERVER_FLAVOR
value: "doc"
- name: AFFINE_ENV
@@ -51,7 +53,7 @@ spec:
name: pg-postgresql
key: postgres-password
- name: DATABASE_URL
value: postgres://{{ .Values.global.database.user }}:$(DATABASE_PASSWORD)@{{ .Values.global.database.url }}:{{ .Values.global.database.port }}/{{ .Values.global.database.name }}
value: postgres://{{ .Values.global.database.user }}:$(DATABASE_PASSWORD)@{{ .Values.global.database.host }}:{{ .Values.global.database.port }}/{{ .Values.global.database.name }}
- name: REDIS_SERVER_ENABLED
value: "true"
- name: REDIS_SERVER_HOST
@@ -75,45 +77,6 @@ spec:
value: "{{ .Values.app.host }}"
- name: AFFINE_SERVER_HTTPS
value: "{{ .Values.app.https }}"
{{ if .Values.global.objectStorage.r2.enabled }}
- name: R2_OBJECT_STORAGE_ACCOUNT_ID
valueFrom:
secretKeyRef:
name: "{{ .Values.global.objectStorage.r2.secretName }}"
key: accountId
- name: R2_OBJECT_STORAGE_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: "{{ .Values.global.objectStorage.r2.secretName }}"
key: accessKeyId
- name: R2_OBJECT_STORAGE_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: "{{ .Values.global.objectStorage.r2.secretName }}"
key: secretAccessKey
{{ end }}
{{ if .Values.app.copilot.enabled }}
- name: COPILOT_OPENAI_API_KEY
valueFrom:
secretKeyRef:
name: "{{ .Values.app.copilot.secretName }}"
key: openaiSecret
- name: COPILOT_FAL_API_KEY
valueFrom:
secretKeyRef:
name: "{{ .Values.app.copilot.secretName }}"
key: falSecret
- name: COPILOT_PERPLEXITY_API_KEY
valueFrom:
secretKeyRef:
name: "{{ .Values.app.copilot.secretName }}"
key: perplexitySecret
- name: COPILOT_UNSPLASH_API_KEY
valueFrom:
secretKeyRef:
name: "{{ .Values.app.copilot.secretName }}"
key: unsplashSecret
{{ end }}
ports:
- name: http
containerPort: {{ .Values.global.docService.port }}
@@ -1,4 +1,4 @@
{{- if .Values.global.database.gcloud.enabled -}}
{{- if .Values.enabled -}}
1. Get the application URL by running these commands:
{{- if contains "NodePort" .Values.service.type }}
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "gcloud-sql-proxy.fullname" . }})
@@ -1,4 +1,4 @@
{{- if .Values.global.database.gcloud.enabled -}}
{{- if .Values.enabled -}}
apiVersion: apps/v1
kind: Deployment
metadata:
@@ -42,7 +42,7 @@ spec:
- "0.0.0.0"
- "--structured-logs"
- "--auto-iam-authn"
- "{{ .Values.global.database.gcloud.connectionName }}"
- "{{ .Values.database.connectionName }}"
env:
# Enable HTTP healthchecks on port 9801. This enables /liveness,
# /readiness and /startup health check endpoints. Allow connections
@@ -56,7 +56,7 @@ spec:
value: 0.0.0.0
ports:
- name: cloud-sql-proxy
containerPort: {{ .Values.global.database.gcloud.proxyPort }}
containerPort: {{ .Values.service.port }}
protocol: TCP
- containerPort: 9801
protocol: TCP
@@ -1,4 +1,4 @@
{{- if .Values.global.database.gcloud.enabled -}}
{{- if .Values.enabled -}}
apiVersion: v1
kind: Service
metadata:
@@ -1,4 +1,4 @@
{{- if .Values.global.database.gcloud.enabled -}}
{{- if .Values.enabled -}}
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
@@ -1,4 +1,4 @@
{{- if .Values.global.database.gcloud.enabled -}}
{{- if .Values.enabled -}}
apiVersion: v1
kind: Pod
metadata:
@@ -1,4 +1,5 @@
replicaCount: 3
enabled: false
image:
# the tag is defined as chart appVersion.
@@ -1,9 +0,0 @@
{{- if .Values.app.captcha.enabled -}}
apiVersion: v1
kind: Secret
metadata:
name: "{{ .Values.app.captcha.secretName }}"
type: Opaque
data:
turnstileSecret: {{ .Values.app.captcha.turnstile.secret | b64enc }}
{{- end }}
@@ -1,13 +0,0 @@
{{- if .Values.app.copilot.enabled -}}
apiVersion: v1
kind: Secret
metadata:
name: "{{ .Values.app.copilot.secretName }}"
type: Opaque
data:
openaiSecret: {{ .Values.app.copilot.openai.key | b64enc }}
falSecret: {{ .Values.app.copilot.fal.key | b64enc }}
googleSecret: {{ .Values.app.copilot.google.key | b64enc }}
perplexitySecret: {{ .Values.app.copilot.perplexity.key | b64enc }}
unsplashSecret: {{ .Values.app.copilot.unsplash.key | b64enc }}
{{- end }}
@@ -40,7 +40,9 @@ spec:
- name: NO_COLOR
value: "1"
- name: DEPLOYMENT_TYPE
value: "affine"
value: "{{ .Values.global.deployment.type }}"
- name: DEPLOYMENT_PLATFORM
value: "{{ .Values.global.deployment.platform }}"
- name: SERVER_FLAVOR
value: "graphql"
- name: AFFINE_ENV
@@ -51,9 +53,7 @@ spec:
name: pg-postgresql
key: postgres-password
- name: DATABASE_URL
value: postgres://{{ .Values.global.database.user }}:$(DATABASE_PASSWORD)@{{ .Values.global.database.url }}:{{ .Values.global.database.port }}/{{ .Values.global.database.name }}
- name: REDIS_SERVER_ENABLED
value: "true"
value: postgres://{{ .Values.global.database.user }}:$(DATABASE_PASSWORD)@{{ .Values.global.database.host }}:{{ .Values.global.database.port }}/{{ .Values.global.database.name }}
- name: REDIS_SERVER_HOST
value: "{{ .Values.global.redis.host }}"
- name: REDIS_SERVER_PORT
@@ -75,130 +75,8 @@ spec:
value: "{{ .Values.app.host }}"
- name: AFFINE_SERVER_HTTPS
value: "{{ .Values.app.https }}"
- name: ENABLE_R2_OBJECT_STORAGE
value: "{{ .Values.global.objectStorage.r2.enabled }}"
- name: FEATURES_SYNC_CLIENT_VERSION_CHECK
value: "{{ .Values.app.features.syncClientVersionCheck }}"
- name: MAILER_HOST
valueFrom:
secretKeyRef:
name: "{{ .Values.app.mailer.secretName }}"
key: host
- name: MAILER_PORT
valueFrom:
secretKeyRef:
name: "{{ .Values.app.mailer.secretName }}"
key: port
- name: MAILER_USER
valueFrom:
secretKeyRef:
name: "{{ .Values.app.mailer.secretName }}"
key: user
- name: MAILER_PASSWORD
valueFrom:
secretKeyRef:
name: "{{ .Values.app.mailer.secretName }}"
key: password
- name: MAILER_SENDER
valueFrom:
secretKeyRef:
name: "{{ .Values.app.mailer.secretName }}"
key: sender
- name: STRIPE_API_KEY
valueFrom:
secretKeyRef:
name: "{{ .Values.app.payment.stripe.secretName }}"
key: stripeAPIKey
- name: STRIPE_WEBHOOK_KEY
valueFrom:
secretKeyRef:
name: "{{ .Values.app.payment.stripe.secretName }}"
key: stripeWebhookKey
- name: DOC_SERVICE_ENDPOINT
value: "http://{{ .Values.global.docService.name }}:{{ .Values.global.docService.port }}"
{{ if .Values.app.experimental.enableJwstCodec }}
- name: DOC_MERGE_USE_JWST_CODEC
value: "true"
{{ end }}
{{ if .Values.global.objectStorage.r2.enabled }}
- name: R2_OBJECT_STORAGE_ACCOUNT_ID
valueFrom:
secretKeyRef:
name: "{{ .Values.global.objectStorage.r2.secretName }}"
key: accountId
- name: R2_OBJECT_STORAGE_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: "{{ .Values.global.objectStorage.r2.secretName }}"
key: accessKeyId
- name: R2_OBJECT_STORAGE_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: "{{ .Values.global.objectStorage.r2.secretName }}"
key: secretAccessKey
{{ end }}
{{ if .Values.app.captcha.enabled }}
- name: CAPTCHA_TURNSTILE_SECRET
valueFrom:
secretKeyRef:
name: "{{ .Values.app.captcha.secretName }}"
key: turnstileSecret
{{ end }}
{{ if .Values.app.copilot.enabled }}
- name: COPILOT_OPENAI_API_KEY
valueFrom:
secretKeyRef:
name: "{{ .Values.app.copilot.secretName }}"
key: openaiSecret
- name: COPILOT_FAL_API_KEY
valueFrom:
secretKeyRef:
name: "{{ .Values.app.copilot.secretName }}"
key: falSecret
- name: COPILOT_PERPLEXITY_API_KEY
valueFrom:
secretKeyRef:
name: "{{ .Values.app.copilot.secretName }}"
key: perplexitySecret
- name: COPILOT_UNSPLASH_API_KEY
valueFrom:
secretKeyRef:
name: "{{ .Values.app.copilot.secretName }}"
key: unsplashSecret
{{ end }}
{{ if .Values.app.oauth.google.enabled }}
- name: OAUTH_GOOGLE_ENABLED
value: "true"
- name: OAUTH_GOOGLE_CLIENT_ID
valueFrom:
secretKeyRef:
name: "{{ .Values.app.oauth.google.secretName }}"
key: clientId
- name: OAUTH_GOOGLE_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: "{{ .Values.app.oauth.google.secretName }}"
key: clientSecret
{{ end }}
{{ if .Values.app.oauth.github.enabled }}
- name: OAUTH_GITHUB_CLIENT_ID
valueFrom:
secretKeyRef:
name: "{{ .Values.app.oauth.github.secretName }}"
key: clientId
- name: OAUTH_GITHUB_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: "{{ .Values.app.oauth.github.secretName }}"
key: clientSecret
{{ end }}
{{ if .Values.app.metrics.enabled }}
- name: METRICS_CUSTOMER_IO_TOKEN
valueFrom:
secretKeyRef:
name: "{{ .Values.app.metrics.secretName }}"
key: customerIoSecret
{{ end }}
ports:
- name: http
containerPort: {{ .Values.service.port }}
@@ -1,13 +0,0 @@
{{- if .Values.app.mailer.secretName -}}
apiVersion: v1
kind: Secret
metadata:
name: "{{ .Values.app.mailer.secretName }}"
type: Opaque
data:
host: "{{ .Values.app.mailer.host | b64enc }}"
port: "{{ .Values.app.mailer.port | b64enc }}"
user: "{{ .Values.app.mailer.user | b64enc }}"
password: "{{ .Values.app.mailer.password | b64enc }}"
sender: "{{ .Values.app.mailer.sender | b64enc }}"
{{- end }}
@@ -1,9 +0,0 @@
{{- if .Values.app.metrics.enabled -}}
apiVersion: v1
kind: Secret
metadata:
name: "{{ .Values.app.metrics.secretName }}"
type: Opaque
data:
customerIoSecret: {{ .Values.app.metrics.customerIo.token | b64enc }}
{{- end }}
@@ -23,37 +23,27 @@ spec:
- name: AFFINE_ENV
value: "{{ .Release.Namespace }}"
- name: DEPLOYMENT_TYPE
value: "affine"
value: "{{ .Values.global.deployment.type }}"
- name: DEPLOYMENT_PLATFORM
value: "{{ .Values.global.deployment.platform }}"
- name: DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: pg-postgresql
key: postgres-password
{{ if not .Values.global.database.gcloud.enabled }}
- name: DATABASE_URL
value: postgres://{{ .Values.global.database.user }}:$(DATABASE_PASSWORD)@{{ .Values.global.database.url }}:{{ .Values.global.database.port }}/{{ .Values.global.database.name }}
{{ end }}
{{ if .Values.global.database.gcloud.enabled }}
- name: DATABASE_URL
value: postgres://{{ .Values.global.database.user }}:$(DATABASE_PASSWORD)@{{ .Values.global.database.gcloud.cloudSqlInternal }}:{{ .Values.global.database.port }}/{{ .Values.global.database.name }}
{{ end }}
{{ if .Values.global.objectStorage.r2.enabled }}
- name: R2_OBJECT_STORAGE_ACCOUNT_ID
value: postgres://{{ .Values.global.database.user }}:$(DATABASE_PASSWORD)@{{ .Values.global.database.host }}:{{ .Values.global.database.port }}/{{ .Values.global.database.name }}
- name: REDIS_SERVER_HOST
value: "{{ .Values.global.redis.host }}"
- name: REDIS_SERVER_PORT
value: "{{ .Values.global.redis.port }}"
- name: REDIS_SERVER_USER
value: "{{ .Values.global.redis.username }}"
- name: REDIS_SERVER_PASSWORD
valueFrom:
secretKeyRef:
name: "{{ .Values.global.objectStorage.r2.secretName }}"
key: accountId
- name: R2_OBJECT_STORAGE_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: "{{ .Values.global.objectStorage.r2.secretName }}"
key: accessKeyId
- name: R2_OBJECT_STORAGE_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: "{{ .Values.global.objectStorage.r2.secretName }}"
key: secretAccessKey
{{ end }}
name: redis
key: redis-password
resources:
requests:
cpu: '100m'
@@ -1,21 +0,0 @@
{{- if .Values.app.oauth.google.enabled -}}
apiVersion: v1
kind: Secret
metadata:
name: "{{ .Values.app.oauth.google.secretName }}"
type: Opaque
data:
clientId: "{{ .Values.app.oauth.google.clientId | b64enc }}"
clientSecret: "{{ .Values.app.oauth.google.clientSecret | b64enc }}"
{{- end }}
---
{{- if .Values.app.oauth.github.enabled -}}
apiVersion: v1
kind: Secret
metadata:
name: "{{ .Values.app.oauth.github.secretName }}"
type: Opaque
data:
clientId: "{{ .Values.app.oauth.github.clientId | b64enc }}"
clientSecret: "{{ .Values.app.oauth.github.clientSecret | b64enc }}"
{{- end }}
@@ -1,8 +0,0 @@
apiVersion: v1
kind: Secret
metadata:
name: "{{ .Values.app.payment.stripe.secretName }}"
type: Opaque
data:
stripeAPIKey: "{{ .Values.app.payment.stripe.apiKey | b64enc }}"
stripeWebhookKey: "{{ .Values.app.payment.stripe.webhookKey | b64enc }}"
+1 -44
View File
@@ -10,55 +10,12 @@ fullnameOverride: ''
# map to NODE_ENV environment variable
env: 'production'
app:
experimental:
enableJwstCodec: true
# AFFINE_SERVER_SUB_PATH
path: ''
# AFFINE_SERVER_HOST
host: '0.0.0.0'
https: true
captcha:
enabled: false
secretName: captcha
turnstile:
secret: ''
copilot:
enabled: false
secretName: copilot
openai:
key: ''
oauth:
google:
enabled: false
secretName: oauth-google
clientId: ''
clientSecret: ''
github:
enabled: false
secretName: oauth-github
clientId: ''
clientSecret: ''
mailer:
secretName: 'mailer'
host: 'smtp.gmail.com'
port: '465'
user: ''
password: ''
sender: 'noreply@toeverything.info'
metrics:
enabled: false
secretName: 'metrics'
customerIo:
token: ''
payment:
stripe:
secretName: 'stripe'
apiKey: ''
webhookKey: ''
features:
earlyAccessPreview: false
syncClientVersionCheck: false
serviceAccount:
create: true
annotations: {}
@@ -40,7 +40,9 @@ spec:
- name: NO_COLOR
value: "1"
- name: DEPLOYMENT_TYPE
value: "affine"
value: "{{ .Values.global.deployment.type }}"
- name: DEPLOYMENT_PLATFORM
value: "{{ .Values.global.deployment.platform }}"
- name: SERVER_FLAVOR
value: "renderer"
- name: AFFINE_ENV
@@ -51,7 +53,7 @@ spec:
name: pg-postgresql
key: postgres-password
- name: DATABASE_URL
value: postgres://{{ .Values.global.database.user }}:$(DATABASE_PASSWORD)@{{ .Values.global.database.url }}:{{ .Values.global.database.port }}/{{ .Values.global.database.name }}
value: postgres://{{ .Values.global.database.user }}:$(DATABASE_PASSWORD)@{{ .Values.global.database.host }}:{{ .Values.global.database.port }}/{{ .Values.global.database.name }}
- name: REDIS_SERVER_ENABLED
value: "true"
- name: REDIS_SERVER_HOST
@@ -75,25 +77,6 @@ spec:
value: "{{ .Values.app.host }}"
- name: AFFINE_SERVER_HTTPS
value: "{{ .Values.app.https }}"
- name: ENABLE_R2_OBJECT_STORAGE
value: "{{ .Values.global.objectStorage.r2.enabled }}"
{{ if .Values.global.objectStorage.r2.enabled }}
- name: R2_OBJECT_STORAGE_ACCOUNT_ID
valueFrom:
secretKeyRef:
name: "{{ .Values.global.objectStorage.r2.secretName }}"
key: accountId
- name: R2_OBJECT_STORAGE_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: "{{ .Values.global.objectStorage.r2.secretName }}"
key: accessKeyId
- name: R2_OBJECT_STORAGE_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: "{{ .Values.global.objectStorage.r2.secretName }}"
key: secretAccessKey
{{ end }}
- name: DOC_SERVICE_ENDPOINT
value: "http://{{ .Values.global.docService.name }}:{{ .Values.global.docService.port }}"
ports:
@@ -42,7 +42,9 @@ spec:
- name: NO_COLOR
value: "1"
- name: DEPLOYMENT_TYPE
value: "affine"
value: "{{ .Values.global.deployment.type }}"
- name: DEPLOYMENT_PLATFORM
value: "{{ .Values.global.deployment.platform }}"
- name: SERVER_FLAVOR
value: "sync"
- name: AFFINE_ENV
@@ -53,9 +55,7 @@ spec:
name: pg-postgresql
key: postgres-password
- name: DATABASE_URL
value: postgres://{{ .Values.global.database.user }}:$(DATABASE_PASSWORD)@{{ .Values.global.database.url }}:{{ .Values.global.database.port }}/{{ .Values.global.database.name }}
- name: REDIS_SERVER_ENABLED
value: "true"
value: postgres://{{ .Values.global.database.user }}:$(DATABASE_PASSWORD)@{{ .Values.global.database.host }}:{{ .Values.global.database.port }}/{{ .Values.global.database.name }}
- name: REDIS_SERVER_HOST
value: "{{ .Values.global.redis.host }}"
- name: REDIS_SERVER_PORT
@@ -1,11 +0,0 @@
{{- if .Values.global.objectStorage.r2.enabled -}}
apiVersion: v1
kind: Secret
metadata:
name: "{{ .Values.global.objectStorage.r2.secretName }}"
type: Opaque
data:
accountId: {{ .Values.global.objectStorage.r2.accountId | b64enc }}
accessKeyId: {{ .Values.global.objectStorage.r2.accessKeyId | b64enc }}
secretAccessKey: {{ .Values.global.objectStorage.r2.secretAccessKey | b64enc }}
{{- end }}
+5 -19
View File
@@ -11,37 +11,23 @@ global:
privateKey: ''
database:
user: 'postgres'
url: 'pg-postgresql'
host: 'pg-postgresql'
port: '5432'
name: 'affine'
password: ''
gcloud:
enabled: false
# use for migration
cloudSqlInternal: ''
connectionName: ''
serviceAccount: ''
cloudProxyReplicas: 3
proxyPort: '5432'
redis:
enabled: true
host: 'redis-master'
port: '6379'
username: ''
password: ''
database: 0
objectStorage:
r2:
enabled: false
secretName: r2
accountId: ''
accessKeyId: ''
secretAccessKey: ''
gke:
enabled: true
docService:
name: 'affine-doc'
port: 3020
deployment:
# change to 'selfhosted' and 'unknown' if this chart is ready to be used for selfhosted deployment
type: 'affine'
platform: 'gcp'
graphql:
service:
+1 -1
View File
@@ -25,7 +25,7 @@ jobs:
uses: ./.github/actions/setup-node
with:
electron-install: false
extra-flags: workspaces focus @affine/server
extra-flags: workspaces focus @affine/server @types/affine__env
- name: Build Server
run: |
find packages/backend/server/src -type d -name "__tests__" -exec rm -rf {} +
+186 -63
View File
@@ -42,6 +42,8 @@ jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
env:
NODE_OPTIONS: --max-old-space-size=14384
needs: optimize_ci
if: needs.optimize_ci.outputs.skip == 'false'
permissions:
@@ -53,44 +55,30 @@ jobs:
fail-fast: false
matrix:
language: ['javascript', 'typescript']
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
project: ['affine', 'blocksuite']
steps:
- name: Checkout repository
uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
source-root: ${{ matrix.project == 'affine' && '.' || 'blocksuite' }}
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
- name: Delete blocksuite before codeql analysis
if: ${{ matrix.project == 'affine' }}
run: rm -rf blocksuite
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v3
# ️ Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
# If the Autobuild fails above, remove it and uncomment the following three lines.
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
# - run: |
# echo "Run, Build Application using script"
# ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
lint:
name: Lint
runs-on: ubuntu-latest
runs-on: ubuntu-24.04-arm
needs: optimize_ci
if: needs.optimize_ci.outputs.skip == 'false'
@@ -115,6 +103,23 @@ jobs:
yarn lint:prettier
- name: Yarn Dedupe
run: yarn dedupe --check
typecheck:
name: Typecheck
runs-on: ubuntu-24.04-arm
needs: optimize_ci
if: needs.optimize_ci.outputs.skip == 'false'
env:
NODE_OPTIONS: --max-old-space-size=14384
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: ./.github/actions/setup-node
with:
electron-install: false
full-cache: true
- name: Run i18n codegen
run: yarn affine @affine/i18n build
- name: Run Type Check
run: yarn typecheck
- name: Run BS Docs Build
@@ -219,12 +224,13 @@ jobs:
e2e-test:
name: E2E Test
runs-on: ubuntu-latest
runs-on: ubuntu-24.04-arm
needs: optimize_ci
if: needs.optimize_ci.outputs.skip == 'false'
env:
DISTRIBUTION: web
IN_CI_TEST: true
NODE_OPTIONS: --max-old-space-size=14384
strategy:
fail-fast: false
matrix:
@@ -334,21 +340,11 @@ jobs:
matrix:
spec:
- { os: ubuntu-latest, target: x86_64-unknown-linux-gnu }
- { os: windows-latest, target: x86_64-pc-windows-msvc }
- { os: macos-latest, target: x86_64-apple-darwin }
- { os: macos-latest, target: aarch64-apple-darwin }
steps:
- uses: actions/checkout@v4
- uses: samypr100/setup-dev-drive@v3
if: ${{ matrix.spec.os == 'windows-latest' }}
with:
workspace-copy: true
drive-size: 8GB
drive-format: NTFS
env-mapping: |
CARGO_HOME,{{ DEV_DRIVE }}/.cargo
RUSTUP_HOME,{{ DEV_DRIVE }}/.rustup
- name: Setup Node.js
uses: ./.github/actions/setup-node
with:
@@ -356,7 +352,7 @@ jobs:
electron-install: false
- name: Setup filename
id: filename
working-directory: ${{ env.DEV_DRIVE_WORKSPACE || github.workspace }}
working-directory: ${{ github.workspace }}
shell: bash
run: |
export PLATFORM_ARCH_ABI=$(node -e "console.log(require('@napi-rs/cli').parseTriple('${{ matrix.spec.target }}').platformArchABI)")
@@ -371,7 +367,58 @@ jobs:
if: always()
with:
name: ${{ steps.filename.outputs.filename }}
path: ${{ env.DEV_DRIVE_WORKSPACE || github.workspace }}/packages/frontend/native/${{ steps.filename.outputs.filename }}
path: ${{ github.workspace }}/packages/frontend/native/${{ steps.filename.outputs.filename }}
if-no-files-found: error
# Split Windows build because it's too slow
# and other ci jobs required linux native
build-windows-native:
name: Build AFFiNE native (${{ matrix.spec.target }})
runs-on: ${{ matrix.spec.os }}
needs: optimize_ci
if: needs.optimize_ci.outputs.skip == 'false'
env:
CARGO_PROFILE_RELEASE_DEBUG: '1'
strategy:
fail-fast: false
matrix:
spec:
- { os: windows-latest, target: x86_64-pc-windows-msvc }
- { os: windows-latest, target: aarch64-pc-windows-msvc }
steps:
- uses: actions/checkout@v4
- uses: samypr100/setup-dev-drive@v3
with:
workspace-copy: true
drive-size: 8GB
drive-format: NTFS
env-mapping: |
CARGO_HOME,{{ DEV_DRIVE }}/.cargo
RUSTUP_HOME,{{ DEV_DRIVE }}/.rustup
- name: Setup Node.js
uses: ./.github/actions/setup-node
with:
extra-flags: workspaces focus @affine/native
electron-install: false
- name: Setup filename
id: filename
working-directory: ${{ env.DEV_DRIVE_WORKSPACE }}
shell: bash
run: |
export PLATFORM_ARCH_ABI=$(node -e "console.log(require('@napi-rs/cli').parseTriple('${{ matrix.spec.target }}').platformArchABI)")
echo "filename=affine.$PLATFORM_ARCH_ABI.node" >> "$GITHUB_OUTPUT"
- name: Build AFFiNE native
uses: ./.github/actions/build-rust
with:
target: ${{ matrix.spec.target }}
package: '@affine/native'
- name: Upload ${{ steps.filename.outputs.filename }}
uses: actions/upload-artifact@v4
if: always()
with:
name: ${{ steps.filename.outputs.filename }}
path: ${{ env.DEV_DRIVE_WORKSPACE }}/packages/frontend/native/${{ steps.filename.outputs.filename }}
if-no-files-found: error
build-server-native:
@@ -508,8 +555,6 @@ jobs:
run: yarn affine @affine/server test:coverage --forbid-only
env:
CARGO_TARGET_DIR: '${{ github.workspace }}/target'
COPILOT_OPENAI_API_KEY: 'use_fake_openai_api_key'
COPILOT_GOOGLE_API_KEY: 'use_fake_google_api_key'
CI_NODE_INDEX: ${{ matrix.node_index }}
CI_NODE_TOTAL: ${{ matrix.total_nodes }}
@@ -570,8 +615,6 @@ jobs:
- name: Run server tests
run: yarn affine @affine/server e2e:coverage --forbid-only
env:
COPILOT_OPENAI_API_KEY: 'use_fake_openai_api_key'
- name: Upload server test coverage results
uses: codecov/codecov-action@v5
@@ -674,6 +717,11 @@ jobs:
- name: Prepare Server Test Environment
if: ${{ steps.check-blocksuite-update.outputs.skip != 'true' || steps.apifilter.outputs.changed == 'true' }}
env:
COPILOT_OPENAI_API_KEY: ${{ secrets.COPILOT_OPENAI_API_KEY }}
COPILOT_GOOGLE_API_KEY: ${{ secrets.COPILOT_GOOGLE_API_KEY }}
COPILOT_FAL_API_KEY: ${{ secrets.COPILOT_FAL_API_KEY }}
COPILOT_PERPLEXITY_API_KEY: ${{ secrets.COPILOT_PERPLEXITY_API_KEY }}
uses: ./.github/actions/server-test-env
- name: Run server tests
@@ -681,10 +729,6 @@ jobs:
run: yarn affine @affine/server test:copilot:coverage --forbid-only
env:
CARGO_TARGET_DIR: '${{ github.workspace }}/target'
COPILOT_OPENAI_API_KEY: ${{ secrets.COPILOT_OPENAI_API_KEY }}
COPILOT_GOOGLE_API_KEY: ${{ secrets.COPILOT_GOOGLE_API_KEY }}
COPILOT_FAL_API_KEY: ${{ secrets.COPILOT_FAL_API_KEY }}
COPILOT_PERPLEXITY_API_KEY: ${{ secrets.COPILOT_PERPLEXITY_API_KEY }}
- name: Upload server test coverage results
if: ${{ steps.check-blocksuite-update.outputs.skip != 'true' || steps.apifilter.outputs.changed == 'true' }}
@@ -766,15 +810,20 @@ jobs:
name: server-native.node
path: ./packages/backend/server
- name: Prepare Server Test Environment
if: ${{ steps.check-blocksuite-update.outputs.skip != 'true' || steps.e2efilter.outputs.changed == 'true' }}
env:
COPILOT_OPENAI_API_KEY: ${{ secrets.COPILOT_OPENAI_API_KEY }}
COPILOT_GOOGLE_API_KEY: ${{ secrets.COPILOT_GOOGLE_API_KEY }}
COPILOT_FAL_API_KEY: ${{ secrets.COPILOT_FAL_API_KEY }}
COPILOT_PERPLEXITY_API_KEY: ${{ secrets.COPILOT_PERPLEXITY_API_KEY }}
uses: ./.github/actions/server-test-env
- name: Run Copilot E2E Test ${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
if: ${{ steps.check-blocksuite-update.outputs.skip != 'true' || steps.e2efilter.outputs.changed == 'true' }}
uses: ./.github/actions/copilot-test
with:
script: yarn affine @affine-test/affine-cloud-copilot e2e --forbid-only --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
openai-key: ${{ secrets.COPILOT_OPENAI_API_KEY }}
google-key: ${{ secrets.COPILOT_GOOGLE_API_KEY }}
fal-key: ${{ secrets.COPILOT_FAL_API_KEY }}
perplexity-key: ${{ secrets.COPILOT_PERPLEXITY_API_KEY }}
cloud-e2e-test:
name: ${{ matrix.tests.name }}
@@ -793,15 +842,24 @@ jobs:
fail-fast: false
matrix:
tests:
- name: 'Cloud E2E Test 1/3'
- name: 'Cloud E2E Test 1/6'
shard: 1
script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=1/3
- name: 'Cloud E2E Test 2/3'
script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=1/6
- name: 'Cloud E2E Test 2/6'
shard: 2
script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=2/3
- name: 'Cloud E2E Test 3/3'
script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=2/6
- name: 'Cloud E2E Test 3/6'
shard: 3
script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=3/3
script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=3/6
- name: 'Cloud E2E Test 4/6'
shard: 4
script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=4/6
- name: 'Cloud E2E Test 5/6'
shard: 5
script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=5/6
- name: 'Cloud E2E Test 6/6'
shard: 6
script: yarn affine @affine-test/affine-cloud e2e --forbid-only --shard=6/6
- name: 'Cloud Desktop E2E Test'
shard: desktop
script: |
@@ -861,9 +919,6 @@ jobs:
${{ matrix.tests.script }}
env:
DEV_SERVER_URL: http://localhost:8080
COPILOT_OPENAI_API_KEY: 1
COPILOT_FAL_API_KEY: 1
COPILOT_PERPLEXITY_API_KEY: 1
- name: Upload test results
if: always()
@@ -963,6 +1018,79 @@ jobs:
if: ${{ matrix.spec.test && matrix.spec.os != 'ubuntu-latest' }}
run: yarn affine @affine-test/affine-desktop e2e
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results-e2e-${{ matrix.spec.os }}-${{ matrix.spec.arch }}
path: ./test-results
if-no-files-found: ignore
desktop-bundle-check:
name: Desktop bundle check (${{ matrix.spec.os }}, ${{ matrix.spec.platform }}, ${{ matrix.spec.arch }}, ${{ matrix.spec.target }}, ${{ matrix.spec.test }})
runs-on: ${{ matrix.spec.os }}
needs:
- optimize_ci
- build-electron-renderer
- build-native
if: needs.optimize_ci.outputs.skip == 'false'
strategy:
fail-fast: false
matrix:
spec:
- {
os: macos-latest,
platform: macos,
arch: x64,
target: x86_64-apple-darwin,
test: false,
}
- {
os: macos-latest,
platform: macos,
arch: arm64,
target: aarch64-apple-darwin,
test: true,
}
- {
os: ubuntu-latest,
platform: linux,
arch: x64,
target: x86_64-unknown-linux-gnu,
test: true,
}
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: ./.github/actions/setup-node
timeout-minutes: 10
with:
extra-flags: workspaces focus @affine/electron @affine/monorepo @affine-test/affine-desktop @affine/nbstore @toeverything/infra
playwright-install: true
hard-link-nm: false
enableScripts: false
- name: Setup filename
id: filename
shell: bash
run: |
export PLATFORM_ARCH_ABI=$(node -e "console.log(require('@napi-rs/cli').parseTriple('${{ matrix.spec.target }}').platformArchABI)")
echo "filename=affine.$PLATFORM_ARCH_ABI.node" >> "$GITHUB_OUTPUT"
- name: Download ${{ steps.filename.outputs.filename }}
uses: actions/download-artifact@v4
with:
name: ${{ steps.filename.outputs.filename }}
path: ./packages/frontend/native
- name: Download web artifact
uses: ./.github/actions/download-web
with:
path: packages/frontend/apps/electron/resources/web-static
- name: Build Desktop Layers
run: yarn affine @affine/electron build
- name: Make bundle (macOS)
if: ${{ matrix.spec.target == 'aarch64-apple-darwin' }}
env:
@@ -986,18 +1114,10 @@ jobs:
HOIST_NODE_MODULES: 1
- name: Output check
if: ${{ matrix.spec.os == 'macos-14' && matrix.spec.arch == 'arm64' }}
if: ${{ matrix.spec.os == 'macos-latest' && matrix.spec.arch == 'arm64' }}
run: |
yarn affine @affine/electron node ./scripts/macos-arm64-output-check.ts
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results-e2e-${{ matrix.spec.os }}-${{ matrix.spec.arch }}
path: ./test-results
if-no-files-found: ignore
test-build-mobile-app:
uses: ./.github/workflows/release-mobile.yml
needs: optimize_ci
@@ -1013,6 +1133,7 @@ jobs:
needs:
- analyze
- lint
- typecheck
- lint-rust
- check-git-status
- check-yarn-binary
@@ -1021,6 +1142,7 @@ jobs:
- e2e-mobile-test
- unit-test
- build-native
- build-windows-native
- build-server-native
- build-electron-renderer
- native-unit-test
@@ -1030,6 +1152,7 @@ jobs:
- copilot-api-test
- copilot-e2e-test
- desktop-test
- desktop-bundle-check
- cloud-e2e-test
- test-build-mobile-app
if: always()
+13 -8
View File
@@ -76,16 +76,17 @@ jobs:
path: ./packages/backend/server
- name: Prepare Server Test Environment
env:
COPILOT_OPENAI_API_KEY: ${{ secrets.COPILOT_OPENAI_API_KEY }}
COPILOT_FAL_API_KEY: ${{ secrets.COPILOT_FAL_API_KEY }}
COPILOT_GOOGLE_API_KEY: ${{ secrets.COPILOT_GOOGLE_API_KEY }}
COPILOT_PERPLEXITY_API_KEY: ${{ secrets.COPILOT_PERPLEXITY_API_KEY }}
uses: ./.github/actions/server-test-env
- name: Run server tests
run: yarn affine @affine/server test:copilot:coverage --forbid-only
env:
CARGO_TARGET_DIR: '${{ github.workspace }}/target'
COPILOT_OPENAI_API_KEY: ${{ secrets.COPILOT_OPENAI_API_KEY }}
COPILOT_FAL_API_KEY: ${{ secrets.COPILOT_FAL_API_KEY }}
COPILOT_GOOGLE_API_KEY: ${{ secrets.COPILOT_GOOGLE_API_KEY }}
COPILOT_PERPLEXITY_API_KEY: ${{ secrets.COPILOT_PERPLEXITY_API_KEY }}
- name: Upload server test coverage results
uses: codecov/codecov-action@v5
@@ -143,14 +144,18 @@ jobs:
name: server-native.node
path: ./packages/backend/server
- name: Prepare Server Test Environment
env:
COPILOT_OPENAI_API_KEY: ${{ secrets.COPILOT_OPENAI_API_KEY }}
COPILOT_FAL_API_KEY: ${{ secrets.COPILOT_FAL_API_KEY }}
COPILOT_GOOGLE_API_KEY: ${{ secrets.COPILOT_GOOGLE_API_KEY }}
COPILOT_PERPLEXITY_API_KEY: ${{ secrets.COPILOT_PERPLEXITY_API_KEY }}
uses: ./.github/actions/server-test-env
- name: Run Copilot E2E Test ${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
uses: ./.github/actions/copilot-test
with:
script: yarn affine @affine-test/affine-cloud-copilot e2e --forbid-only --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
openai-key: ${{ secrets.COPILOT_OPENAI_API_KEY }}
google-key: ${{ secrets.COPILOT_GOOGLE_API_KEY }}
fal-key: ${{ secrets.COPILOT_FAL_API_KEY }}
perplexity-key: ${{ secrets.COPILOT_PERPLEXITY_API_KEY }}
test-done:
needs:
+2 -2
View File
@@ -114,8 +114,8 @@ jobs:
DATABASE_NAME: ${{ secrets.DATABASE_NAME }}
GCLOUD_CONNECTION_NAME: ${{ secrets.GCLOUD_CONNECTION_NAME }}
GCLOUD_CLOUD_SQL_INTERNAL_ENDPOINT: ${{ secrets.GCLOUD_CLOUD_SQL_INTERNAL_ENDPOINT }}
REDIS_HOST: ${{ secrets.REDIS_HOST }}
REDIS_PASSWORD: ${{ secrets.REDIS_PASSWORD }}
REDIS_SERVER_HOST: ${{ secrets.REDIS_SERVER_HOST }}
REDIS_SERVER_PASSWORD: ${{ secrets.REDIS_SERVER_PASSWORD }}
CLOUD_SQL_IAM_ACCOUNT: ${{ secrets.CLOUD_SQL_IAM_ACCOUNT }}
APP_IAM_ACCOUNT: ${{ secrets.APP_IAM_ACCOUNT }}
STRIPE_API_KEY: ${{ secrets.STRIPE_API_KEY }}
+3 -3
View File
@@ -73,11 +73,11 @@ jobs:
fail-fast: false
matrix:
spec:
- runner: macos-14
- runner: macos-latest
platform: darwin
arch: x64
target: x86_64-apple-darwin
- runner: macos-14
- runner: macos-latest
platform: darwin
arch: arm64
target: aarch64-apple-darwin
@@ -127,7 +127,7 @@ jobs:
- name: Signing By Apple Developer ID
if: ${{ matrix.spec.platform == 'darwin' }}
uses: apple-actions/import-codesign-certs@v3
uses: apple-actions/import-codesign-certs@v5
with:
p12-file-base64: ${{ secrets.CERTIFICATES_P12 }}
p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }}
+5 -5
View File
@@ -54,7 +54,7 @@ jobs:
build-ios-web:
needs:
- output-env
runs-on: ubuntu-latest
runs-on: ubuntu-24.04-arm
environment: ${{ needs.output-env.outputs.ENVIRONMENT }}
outputs:
RELEASE_VERSION: ${{ steps.version.outputs.APP_VERSION }}
@@ -85,7 +85,7 @@ jobs:
path: packages/frontend/apps/ios/dist
build-android-web:
runs-on: ubuntu-latest
runs-on: ubuntu-24.04-arm
needs:
- output-env
environment: ${{ needs.output-env.outputs.ENVIRONMENT }}
@@ -118,7 +118,7 @@ jobs:
path: packages/frontend/apps/android/dist
ios:
runs-on: macos-latest
runs-on: namespace-profile-macos
needs:
- build-ios-web
steps:
@@ -139,13 +139,13 @@ jobs:
enableScripts: false
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: 16.1
xcode-version: 16.2
- name: Install Swiftformat
run: brew install swiftformat
- name: Cap sync
run: yarn workspace @affine/ios sync
- name: Signing By Apple Developer ID
uses: apple-actions/import-codesign-certs@v3
uses: apple-actions/import-codesign-certs@v5
id: import-codesign-certs
with:
p12-file-base64: ${{ secrets.CERTIFICATES_P12_MOBILE }}
+1
View File
@@ -37,3 +37,4 @@ packages/frontend/apps/android/App/**
packages/frontend/apps/ios/App/**
tests/blocksuite/snapshots
blocksuite/docs/api/**
packages/frontend/admin/src/config.json
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -12,4 +12,4 @@ npmPublishAccess: public
npmPublishRegistry: "https://registry.npmjs.org"
yarnPath: .yarn/releases/yarn-4.7.0.cjs
yarnPath: .yarn/releases/yarn-4.8.0.cjs
Generated
+2 -2
View File
@@ -2501,9 +2501,9 @@ dependencies = [
[[package]]
name = "once_cell"
version = "1.21.1"
version = "1.21.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc"
checksum = "c2806eaa3524762875e21c3dcd057bc4b7bfa01ce4da8d46be1cd43649e1cc6b"
[[package]]
name = "oorandom"
+5 -5
View File
@@ -58,9 +58,9 @@
"@blocksuite/affine-widget-scroll-anchoring": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/affine-widget-toolbar": "workspace:*",
"@blocksuite/block-std": "workspace:*",
"@blocksuite/data-view": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@blocksuite/sync": "workspace:*",
"rxjs": "^7.8.1"
@@ -68,10 +68,10 @@
"exports": {
".": "./src/index.ts",
"./effects": "./src/effects.ts",
"./block-std": "./src/block-std/index.ts",
"./block-std/gfx": "./src/block-std/gfx.ts",
"./block-std/inline": "./src/block-std/inline.ts",
"./block-std/effects": "./src/block-std/effects.ts",
"./std": "./src/std/index.ts",
"./std/gfx": "./src/std/gfx.ts",
"./std/inline": "./src/std/inline.ts",
"./std/effects": "./src/std/effects.ts",
"./global": "./src/global/index.ts",
"./global/utils": "./src/global/utils.ts",
"./global/env": "./src/global/env.ts",
@@ -1 +0,0 @@
export * from '@blocksuite/block-std/effects';
@@ -1 +0,0 @@
export * from '@blocksuite/block-std/gfx';
@@ -1 +0,0 @@
export * from '@blocksuite/block-std';
@@ -1 +0,0 @@
export * from '@blocksuite/block-std/inline';
+1 -1
View File
@@ -59,8 +59,8 @@ import { effects as widgetRemoteSelectionEffects } from '@blocksuite/affine-widg
import { effects as widgetScrollAnchoringEffects } from '@blocksuite/affine-widget-scroll-anchoring/effects';
import { effects as widgetSlashMenuEffects } from '@blocksuite/affine-widget-slash-menu/effects';
import { effects as widgetToolbarEffects } from '@blocksuite/affine-widget-toolbar/effects';
import { effects as stdEffects } from '@blocksuite/block-std/effects';
import { effects as dataViewEffects } from '@blocksuite/data-view/effects';
import { effects as stdEffects } from '@blocksuite/std/effects';
import { registerSpecs } from './extensions/register.js';
@@ -47,7 +47,7 @@ import {
CursorSelectionExtension,
SurfaceSelectionExtension,
TextSelectionExtension,
} from '@blocksuite/block-std';
} from '@blocksuite/std';
import type { ExtensionType } from '@blocksuite/store';
import {
+1
View File
@@ -0,0 +1 @@
export * from '@blocksuite/std/effects';
+1
View File
@@ -0,0 +1 @@
export * from '@blocksuite/std/gfx';
+1
View File
@@ -0,0 +1 @@
export * from '@blocksuite/std';
+1
View File
@@ -0,0 +1 @@
export * from '@blocksuite/std/inline';
+1 -1
View File
@@ -55,9 +55,9 @@
{ "path": "../widgets/widget-scroll-anchoring" },
{ "path": "../widgets/widget-slash-menu" },
{ "path": "../widgets/widget-toolbar" },
{ "path": "../../framework/block-std" },
{ "path": "../data-view" },
{ "path": "../../framework/global" },
{ "path": "../../framework/std" },
{ "path": "../../framework/store" },
{ "path": "../../framework/sync" }
]
@@ -16,9 +16,9 @@
"@blocksuite/affine-model": "workspace:*",
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/block-std": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.8",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
"@lit/context": "^1.1.2",
@@ -15,7 +15,7 @@ import {
ThemeProvider,
} from '@blocksuite/affine-shared/services';
import { humanFileSize } from '@blocksuite/affine-shared/utils';
import { BlockSelection } from '@blocksuite/block-std';
import { BlockSelection } from '@blocksuite/std';
import { Slice } from '@blocksuite/store';
import { html } from 'lit';
import { property } from 'lit/decorators.js';
@@ -4,7 +4,7 @@ import {
EMBED_CARD_HEIGHT,
EMBED_CARD_WIDTH,
} from '@blocksuite/affine-shared/consts';
import { toGfxBlockComponent } from '@blocksuite/block-std';
import { toGfxBlockComponent } from '@blocksuite/std';
import { styleMap } from 'lit/directives/style-map.js';
import { AttachmentBlockComponent } from './attachment-block.js';
@@ -9,7 +9,7 @@ import {
isInsideEdgelessEditor,
matchModels,
} from '@blocksuite/affine-shared/utils';
import { GfxControllerIdentifier } from '@blocksuite/block-std/gfx';
import { GfxControllerIdentifier } from '@blocksuite/std/gfx';
import { addAttachments, addSiblingAttachmentBlocks } from './utils.js';
@@ -1,6 +1,6 @@
import { AttachmentBlockSchema } from '@blocksuite/affine-model';
import { SlashMenuConfigExtension } from '@blocksuite/affine-widget-slash-menu';
import { BlockViewExtension, FlavourExtension } from '@blocksuite/block-std';
import { BlockViewExtension, FlavourExtension } from '@blocksuite/std';
import type { ExtensionType } from '@blocksuite/store';
import { literal } from 'lit/static-html.js';
@@ -1,7 +1,7 @@
import { ConfirmIcon } from '@blocksuite/affine-components/icons';
import { toast } from '@blocksuite/affine-components/toast';
import type { AttachmentBlockModel } from '@blocksuite/affine-model';
import type { EditorHost } from '@blocksuite/block-std';
import type { EditorHost } from '@blocksuite/std';
import { html } from 'lit';
import { createRef, ref } from 'lit/directives/ref.js';
@@ -15,7 +15,6 @@ import {
type ToolbarModuleConfig,
ToolbarModuleExtension,
} from '@blocksuite/affine-shared/services';
import { BlockFlavourIdentifier } from '@blocksuite/block-std';
import { Bound } from '@blocksuite/global/gfx';
import {
CaptionIcon,
@@ -26,6 +25,7 @@ import {
EditIcon,
ResetIcon,
} from '@blocksuite/icons/lit';
import { BlockFlavourIdentifier } from '@blocksuite/std';
import type { ExtensionType } from '@blocksuite/store';
import { flip, offset } from '@floating-ui/dom';
import { computed } from '@preact/signals-core';
@@ -9,10 +9,10 @@ import {
transformModel,
withTempBlobData,
} from '@blocksuite/affine-shared/utils';
import { type BlockStdScope, StdIdentifier } from '@blocksuite/block-std';
import type { Container } from '@blocksuite/global/di';
import { createIdentifier } from '@blocksuite/global/di';
import { Bound } from '@blocksuite/global/gfx';
import { type BlockStdScope, StdIdentifier } from '@blocksuite/std';
import type { ExtensionType } from '@blocksuite/store';
import { Extension } from '@blocksuite/store';
import type { TemplateResult } from 'lit';
@@ -13,9 +13,9 @@ import {
TelemetryProvider,
} from '@blocksuite/affine-shared/services';
import { humanFileSize } from '@blocksuite/affine-shared/utils';
import type { BlockStdScope, EditorHost } from '@blocksuite/block-std';
import { GfxControllerIdentifier } from '@blocksuite/block-std/gfx';
import { Bound, type IVec, Point, Vec } from '@blocksuite/global/gfx';
import type { BlockStdScope, EditorHost } from '@blocksuite/std';
import { GfxControllerIdentifier } from '@blocksuite/std/gfx';
import type { BlockModel } from '@blocksuite/store';
import type { AttachmentBlockComponent } from './attachment-block.js';
@@ -13,8 +13,8 @@
{ "path": "../../model" },
{ "path": "../../shared" },
{ "path": "../../widgets/widget-slash-menu" },
{ "path": "../../../framework/block-std" },
{ "path": "../../../framework/global" },
{ "path": "../../../framework/std" },
{ "path": "../../../framework/store" }
]
}
@@ -16,9 +16,9 @@
"@blocksuite/affine-model": "workspace:*",
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/block-std": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.8",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@lit/context": "^1.1.2",
"@preact/signals-core": "^1.8.0",
@@ -2,7 +2,7 @@ import {
EMBED_CARD_HEIGHT,
EMBED_CARD_WIDTH,
} from '@blocksuite/affine-shared/consts';
import { toGfxBlockComponent } from '@blocksuite/block-std';
import { toGfxBlockComponent } from '@blocksuite/std';
import { type StyleInfo, styleMap } from 'lit/directives/style-map.js';
import { BookmarkBlockComponent } from './bookmark-block.js';
@@ -1,5 +1,5 @@
import { BookmarkBlockSchema } from '@blocksuite/affine-model';
import { BlockViewExtension, FlavourExtension } from '@blocksuite/block-std';
import { BlockViewExtension, FlavourExtension } from '@blocksuite/std';
import type { ExtensionType } from '@blocksuite/store';
import { literal } from 'lit/static-html.js';
@@ -3,7 +3,7 @@ import '@blocksuite/affine-block-embed/effects';
import { insertEmbedCard } from '@blocksuite/affine-block-embed';
import type { EmbedCardStyle } from '@blocksuite/affine-model';
import { EmbedOptionProvider } from '@blocksuite/affine-shared/services';
import type { Command } from '@blocksuite/block-std';
import type { Command } from '@blocksuite/std';
export const insertBookmarkCommand: Command<
{ url: string },
@@ -8,7 +8,7 @@ import {
FeatureFlagService,
QuickSearchProvider,
} from '@blocksuite/affine-shared/services';
import type { Command } from '@blocksuite/block-std';
import type { Command } from '@blocksuite/std';
import { insertBookmarkCommand } from './insert-bookmark';
@@ -2,9 +2,9 @@ import { getEmbedCardIcons } from '@blocksuite/affine-block-embed';
import { WebIcon16 } from '@blocksuite/affine-components/icons';
import { ThemeProvider } from '@blocksuite/affine-shared/services';
import { getHostName } from '@blocksuite/affine-shared/utils';
import { BlockSelection, ShadowlessElement } from '@blocksuite/block-std';
import { WithDisposable } from '@blocksuite/global/lit';
import { OpenInNewIcon } from '@blocksuite/icons/lit';
import { BlockSelection, ShadowlessElement } from '@blocksuite/std';
import { html } from 'lit';
import { property } from 'lit/decorators.js';
import { classMap } from 'lit/directives/class-map.js';
@@ -125,10 +125,15 @@ export class BookmarkCard extends WithDisposable(ShadowlessElement) {
<div class="affine-bookmark-content-description">
${descriptionText}
</div>
<div class="affine-bookmark-content-url" @click=${this.bookmark.open}>
<span>${getHostName(url)}</span>
<div class="affine-bookmark-content-url-icon">
${OpenInNewIcon({ width: '12', height: '12' })}
<div
class="affine-bookmark-content-url-wrapper"
@click=${this.bookmark.open}
>
<div class="affine-bookmark-content-url">
<span>${getHostName(url)}</span>
<div class="affine-bookmark-content-url-icon">
${OpenInNewIcon({ width: '12', height: '12' })}
</div>
</div>
</div>
</div>
@@ -1,3 +1,8 @@
import {
canEmbedAsIframe,
EMBED_IFRAME_DEFAULT_HEIGHT_IN_SURFACE,
EMBED_IFRAME_DEFAULT_WIDTH_IN_SURFACE,
} from '@blocksuite/affine-block-embed';
import { reassociateConnectorsCommand } from '@blocksuite/affine-block-surface';
import { toast } from '@blocksuite/affine-components/toast';
import {
@@ -13,7 +18,6 @@ import {
ActionPlacement,
EmbedIframeService,
EmbedOptionProvider,
FeatureFlagService,
type LinkEventType,
type ToolbarAction,
type ToolbarActionGroup,
@@ -22,7 +26,6 @@ import {
ToolbarModuleExtension,
} from '@blocksuite/affine-shared/services';
import { getBlockProps } from '@blocksuite/affine-shared/utils';
import { BlockFlavourIdentifier, BlockSelection } from '@blocksuite/block-std';
import { Bound } from '@blocksuite/global/gfx';
import {
CaptionIcon,
@@ -31,6 +34,7 @@ import {
DuplicateIcon,
ResetIcon,
} from '@blocksuite/icons/lit';
import { BlockFlavourIdentifier, BlockSelection } from '@blocksuite/std';
import { type ExtensionType, Slice, Text } from '@blocksuite/store';
import { computed, signal } from '@preact/signals-core';
import { html } from 'lit';
@@ -145,26 +149,20 @@ const builtinToolbarConfig = {
if (!model) return true;
const url = model.props.url;
// check if the url can be embedded as iframe block
const featureFlag = ctx.std.get(FeatureFlagService);
const embedIframeService = ctx.std.get(EmbedIframeService);
const isEmbedIframeEnabled = featureFlag.getFlag(
'enable_embed_iframe_block'
);
const canEmbedAsIframe =
isEmbedIframeEnabled && embedIframeService.canEmbed(url);
// check if the url can be embedded as iframe block or other embed blocks
const options = ctx.std
.get(EmbedOptionProvider)
.getEmbedBlockOptions(url);
return !canEmbedAsIframe && options?.viewType !== 'embed';
return (
!canEmbedAsIframe(ctx.std, url) && options?.viewType !== 'embed'
);
},
run(ctx) {
const model = ctx.getCurrentModelByType(BookmarkBlockModel);
if (!model) return;
const { caption, url, style } = model.props;
const { caption, url, title, description, style } = model.props;
const { parent } = model;
const index = parent?.children.indexOf(model);
if (!parent) return;
@@ -172,14 +170,10 @@ const builtinToolbarConfig = {
let blockId: string | undefined;
// first try to embed as iframe block
const featureFlag = ctx.std.get(FeatureFlagService);
const isEmbedIframeEnabled = featureFlag.getFlag(
'enable_embed_iframe_block'
);
const embedIframeService = ctx.std.get(EmbedIframeService);
if (isEmbedIframeEnabled && embedIframeService.canEmbed(url)) {
if (canEmbedAsIframe(ctx.std, url)) {
const embedIframeService = ctx.std.get(EmbedIframeService);
blockId = embedIframeService.addEmbedIframeBlock(
{ url, caption },
{ url, caption, title, description },
parent.id,
index
);
@@ -201,6 +195,8 @@ const builtinToolbarConfig = {
{
url,
caption,
title,
description,
style: newStyle,
},
parent,
@@ -379,30 +375,62 @@ const builtinSurfaceToolbarConfig = {
if (!model) return;
const { id: oldId, xywh, parent } = model;
const { url, caption } = model.props;
const options = ctx.std
.get(EmbedOptionProvider)
.getEmbedBlockOptions(url);
const { url, caption, title, description } = model.props;
if (options?.viewType !== 'embed') return;
let newId: string | undefined;
const { flavour, styles } = options;
let { style } = model.props;
// first try to embed as iframe block
if (canEmbedAsIframe(ctx.std, url)) {
const embedIframeService = ctx.std.get(EmbedIframeService);
const config = embedIframeService.getConfig(url);
if (!config) {
return;
}
if (!styles.includes(style)) {
style = styles[0];
const bound = Bound.deserialize(xywh);
const options = config.options;
const { widthInSurface, heightInSurface } = options ?? {};
bound.w = widthInSurface ?? EMBED_IFRAME_DEFAULT_WIDTH_IN_SURFACE;
bound.h =
heightInSurface ?? EMBED_IFRAME_DEFAULT_HEIGHT_IN_SURFACE;
newId = ctx.store.addBlock(
'affine:embed-iframe',
{ url, caption, title, description, xywh: bound.serialize() },
parent
);
} else {
const options = ctx.std
.get(EmbedOptionProvider)
.getEmbedBlockOptions(url);
if (options?.viewType !== 'embed') return;
const { flavour, styles } = options;
let { style } = model.props;
if (!styles.includes(style)) {
style = styles[0];
}
const bound = Bound.deserialize(xywh);
bound.w = EMBED_CARD_WIDTH[style];
bound.h = EMBED_CARD_HEIGHT[style];
newId = ctx.store.addBlock(
flavour,
{
url,
caption,
title,
description,
style,
xywh: bound.serialize(),
},
parent
);
}
const bounds = Bound.deserialize(xywh);
bounds.w = EMBED_CARD_WIDTH[style];
bounds.h = EMBED_CARD_HEIGHT[style];
const newId = ctx.store.addBlock(
flavour,
{ url, caption, style, xywh: bounds.serialize() },
parent
);
ctx.command.exec(reassociateConnectorsCommand, { oldId, newId });
ctx.store.deleteBlock(model);
@@ -427,7 +455,7 @@ const builtinSurfaceToolbarConfig = {
.get(EmbedOptionProvider)
.getEmbedBlockOptions(url);
return options?.viewType === 'embed';
return canEmbedAsIframe(ctx.std, url) || options?.viewType === 'embed';
},
content(ctx) {
const model = ctx.getCurrentModelByType(BookmarkBlockModel);
@@ -108,7 +108,6 @@ export const styles = css`
gap: 4px;
width: max-content;
max-width: 100%;
cursor: pointer;
}
.affine-bookmark-content-url > span {
@@ -226,9 +225,12 @@ export const styles = css`
max-height: 120px;
}
.affine-bookmark-content-url {
flex-grow: 1;
.affine-bookmark-content-url-wrapper {
max-width: fit-content;
display: flex;
align-items: flex-end;
flex-grow: 1;
cursor: pointer;
}
.affine-bookmark-banner {
@@ -13,8 +13,8 @@
{ "path": "../../model" },
{ "path": "../../shared" },
{ "path": "../../widgets/widget-slash-menu" },
{ "path": "../../../framework/block-std" },
{ "path": "../../../framework/global" },
{ "path": "../../../framework/std" },
{ "path": "../../../framework/store" }
]
}
@@ -16,9 +16,9 @@
"@blocksuite/affine-rich-text": "workspace:*",
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/block-std": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.8",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@emoji-mart/data": "^1.2.1",
"@floating-ui/dom": "^1.6.10",
@@ -8,7 +8,7 @@ import {
ThemeProvider,
} from '@blocksuite/affine-shared/services';
import { unsafeCSSVarV2 } from '@blocksuite/affine-shared/theme';
import type { BlockComponent } from '@blocksuite/block-std';
import type { BlockComponent } from '@blocksuite/std';
import { flip, offset } from '@floating-ui/dom';
import { css, html } from 'lit';
import { query } from 'lit/decorators.js';
@@ -4,7 +4,7 @@ import {
BlockSelection,
KeymapExtension,
TextSelection,
} from '@blocksuite/block-std';
} from '@blocksuite/std';
export const CalloutKeymapExtension = KeymapExtension(std => {
return {
@@ -1,5 +1,5 @@
import { SlashMenuConfigExtension } from '@blocksuite/affine-widget-slash-menu';
import { BlockViewExtension, FlavourExtension } from '@blocksuite/block-std';
import { BlockViewExtension, FlavourExtension } from '@blocksuite/std';
import type { ExtensionType } from '@blocksuite/store';
import { literal } from 'lit/static-html.js';
@@ -13,8 +13,8 @@
{ "path": "../../rich-text" },
{ "path": "../../shared" },
{ "path": "../../widgets/widget-slash-menu" },
{ "path": "../../../framework/block-std" },
{ "path": "../../../framework/global" },
{ "path": "../../../framework/std" },
{ "path": "../../../framework/store" }
]
}
@@ -18,9 +18,9 @@
"@blocksuite/affine-rich-text": "workspace:*",
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/block-std": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.8",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
"@lit/context": "^1.1.2",
@@ -1,4 +1,4 @@
import { ConfigExtensionFactory } from '@blocksuite/block-std';
import { ConfigExtensionFactory } from '@blocksuite/std';
import type { BundledLanguageInfo, ThemeInput } from 'shiki';
export interface CodeBlockConfig {
@@ -13,7 +13,7 @@ import type { AffineTextAttributes } from '@blocksuite/affine-shared/types';
import {
InlineManagerExtension,
InlineSpecExtension,
} from '@blocksuite/block-std/inline';
} from '@blocksuite/std/inline';
import { html } from 'lit';
import { z } from 'zod';
@@ -1,6 +1,6 @@
import { ColorScheme } from '@blocksuite/affine-model';
import { ThemeProvider } from '@blocksuite/affine-shared/services';
import { LifeCycleWatcher } from '@blocksuite/block-std';
import { LifeCycleWatcher } from '@blocksuite/std';
import { type Signal, signal } from '@preact/signals-core';
import {
createHighlighterCore,
@@ -3,7 +3,7 @@ import {
BlockViewExtension,
FlavourExtension,
WidgetViewExtension,
} from '@blocksuite/block-std';
} from '@blocksuite/std';
import type { ExtensionType } from '@blocksuite/store';
import { literal, unsafeStatic } from 'lit/static-html.js';
@@ -7,17 +7,17 @@ import {
NotificationProvider,
} from '@blocksuite/affine-shared/services';
import { getViewportElement } from '@blocksuite/affine-shared/utils';
import type { BlockComponent } from '@blocksuite/block-std';
import { BlockSelection, TextSelection } from '@blocksuite/block-std';
import { IS_MAC, IS_MOBILE } from '@blocksuite/global/env';
import { noop } from '@blocksuite/global/utils';
import type { BlockComponent } from '@blocksuite/std';
import { BlockSelection, TextSelection } from '@blocksuite/std';
import {
getInlineRangeProvider,
INLINE_ROOT_ATTR,
type InlineRangeProvider,
type InlineRootElement,
type VLine,
} from '@blocksuite/block-std/inline';
import { IS_MAC, IS_MOBILE } from '@blocksuite/global/env';
import { noop } from '@blocksuite/global/utils';
} from '@blocksuite/std/inline';
import { Slice } from '@blocksuite/store';
import { computed, effect, type Signal, signal } from '@preact/signals-core';
import { html, nothing, type TemplateResult } from 'lit';
@@ -1,6 +1,6 @@
import { textKeymap } from '@blocksuite/affine-inline-preset';
import { CodeBlockSchema } from '@blocksuite/affine-model';
import { KeymapExtension } from '@blocksuite/block-std';
import { KeymapExtension } from '@blocksuite/std';
export const CodeKeymapExtension = KeymapExtension(textKeymap, {
flavour: CodeBlockSchema.model.flavour,
@@ -8,8 +8,8 @@ import {
} from '@blocksuite/affine-components/icons';
import type { MenuItemGroup } from '@blocksuite/affine-components/toolbar';
import { isInsidePageEditor } from '@blocksuite/affine-shared/utils';
import { BlockSelection } from '@blocksuite/block-std';
import { noop, sleep } from '@blocksuite/global/utils';
import { BlockSelection } from '@blocksuite/std';
import { html } from 'lit';
import { ifDefined } from 'lit/directives/if-defined.js';
@@ -12,7 +12,7 @@ import {
BlockSelection,
TextSelection,
WidgetComponent,
} from '@blocksuite/block-std';
} from '@blocksuite/std';
import { limitShift, shift, size } from '@floating-ui/dom';
import { html } from 'lit';
@@ -1,7 +1,7 @@
import { affineTextStyles } from '@blocksuite/affine-shared/styles';
import type { AffineTextAttributes } from '@blocksuite/affine-shared/types';
import { ShadowlessElement } from '@blocksuite/block-std';
import { ZERO_WIDTH_SPACE } from '@blocksuite/block-std/inline';
import { ShadowlessElement } from '@blocksuite/std';
import { ZERO_WIDTH_SPACE } from '@blocksuite/std/inline';
import type { DeltaInsert } from '@blocksuite/store';
import { html } from 'lit';
import { property } from 'lit/decorators.js';
@@ -15,8 +15,8 @@
{ "path": "../../rich-text" },
{ "path": "../../shared" },
{ "path": "../../widgets/widget-slash-menu" },
{ "path": "../../../framework/block-std" },
{ "path": "../../../framework/global" },
{ "path": "../../../framework/std" },
{ "path": "../../../framework/store" }
]
}
@@ -15,10 +15,10 @@
"@blocksuite/affine-model": "workspace:*",
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/block-std": "workspace:*",
"@blocksuite/data-view": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.8",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
"@lit/context": "^1.1.2",
@@ -7,10 +7,10 @@ import {
insertPositionToIndex,
type InsertToPosition,
} from '@blocksuite/affine-shared/utils';
import type { EditorHost } from '@blocksuite/block-std';
import { DataSourceBase, type PropertyMetaConfig } from '@blocksuite/data-view';
import { propertyPresets } from '@blocksuite/data-view/property-presets';
import { BlockSuiteError } from '@blocksuite/global/exceptions';
import type { EditorHost } from '@blocksuite/std';
import type { Block, Store } from '@blocksuite/store';
import { Subject } from 'rxjs';
@@ -19,8 +19,6 @@ import {
type TelemetryEventMap,
TelemetryProvider,
} from '@blocksuite/affine-shared/services';
import { type BlockComponent } from '@blocksuite/block-std';
import { RANGE_SYNC_EXCLUDE_ATTR } from '@blocksuite/block-std/inline';
import {
createRecordDetail,
createUniComponentFromWebComponent,
@@ -37,6 +35,8 @@ import {
} from '@blocksuite/data-view';
import { widgetPresets } from '@blocksuite/data-view/widget-presets';
import { MoreHorizontalIcon } from '@blocksuite/icons/lit';
import { type BlockComponent } from '@blocksuite/std';
import { RANGE_SYNC_EXCLUDE_ATTR } from '@blocksuite/std/inline';
import { Slice } from '@blocksuite/store';
import { computed, signal } from '@preact/signals-core';
import { css, nothing, unsafeCSS } from 'lit';
@@ -1,4 +1,4 @@
import { BlockViewExtension, FlavourExtension } from '@blocksuite/block-std';
import { BlockViewExtension, FlavourExtension } from '@blocksuite/std';
import type { ExtensionType } from '@blocksuite/store';
import { literal } from 'lit/static-html.js';
@@ -12,9 +12,9 @@
{ "path": "../../model" },
{ "path": "../../shared" },
{ "path": "../../widgets/widget-slash-menu" },
{ "path": "../../../framework/block-std" },
{ "path": "../../data-view" },
{ "path": "../../../framework/global" },
{ "path": "../../../framework/std" },
{ "path": "../../../framework/store" }
]
}
@@ -18,10 +18,10 @@
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/affine-widget-drag-handle": "workspace:*",
"@blocksuite/affine-widget-slash-menu": "workspace:*",
"@blocksuite/block-std": "workspace:*",
"@blocksuite/data-view": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/icons": "^2.2.8",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
"@lit/context": "^1.1.2",
@@ -1,5 +1,5 @@
import type { DatabaseBlockModel } from '@blocksuite/affine-model';
import type { Command } from '@blocksuite/block-std';
import type { Command } from '@blocksuite/std';
import type { BlockModel, Store } from '@blocksuite/store';
import {
@@ -1,6 +1,6 @@
import { createModal } from '@blocksuite/affine-components/context-menu';
import { ShadowlessElement } from '@blocksuite/block-std';
import { CloseIcon } from '@blocksuite/icons/lit';
import { ShadowlessElement } from '@blocksuite/std';
import { css, html, type TemplateResult } from 'lit';
import { property } from 'lit/decorators.js';
@@ -1,6 +1,6 @@
import { stopPropagation } from '@blocksuite/affine-shared/utils';
import { ShadowlessElement } from '@blocksuite/block-std';
import { WithDisposable } from '@blocksuite/global/lit';
import { ShadowlessElement } from '@blocksuite/std';
import type { Text } from '@blocksuite/store';
import { css, html } from 'lit';
import { property, query, state } from 'lit/decorators.js';
@@ -1,6 +1,6 @@
import type { MenuOptions } from '@blocksuite/affine-components/context-menu';
import { type DatabaseBlockModel } from '@blocksuite/affine-model';
import { ConfigExtensionFactory } from '@blocksuite/block-std';
import { ConfigExtensionFactory } from '@blocksuite/std';
export interface DatabaseOptionsConfig {
configure: (model: DatabaseBlockModel, options: MenuOptions) => MenuOptions;
@@ -1,5 +1,5 @@
import type { EditorHost } from '@blocksuite/block-std';
import { createContextKey } from '@blocksuite/data-view';
import type { EditorHost } from '@blocksuite/std';
export const HostContextKey = createContextKey<EditorHost | undefined>(
'editor-host',
@@ -9,7 +9,6 @@ import {
insertPositionToIndex,
type InsertToPosition,
} from '@blocksuite/affine-shared/utils';
import type { EditorHost } from '@blocksuite/block-std';
import {
type DatabaseFlags,
DataSourceBase,
@@ -23,6 +22,7 @@ import {
import { propertyPresets } from '@blocksuite/data-view/property-presets';
import { IS_MOBILE } from '@blocksuite/global/env';
import { BlockSuiteError, ErrorCode } from '@blocksuite/global/exceptions';
import type { EditorHost } from '@blocksuite/std';
import { type BlockModel } from '@blocksuite/store';
import { computed, type ReadonlySignal, signal } from '@preact/signals-core';
@@ -16,8 +16,6 @@ import {
TelemetryProvider,
} from '@blocksuite/affine-shared/services';
import { getDropResult } from '@blocksuite/affine-widget-drag-handle';
import { type BlockComponent } from '@blocksuite/block-std';
import { RANGE_SYNC_EXCLUDE_ATTR } from '@blocksuite/block-std/inline';
import {
createRecordDetail,
createUniComponentFromWebComponent,
@@ -40,6 +38,8 @@ import {
DeleteIcon,
MoreHorizontalIcon,
} from '@blocksuite/icons/lit';
import { type BlockComponent } from '@blocksuite/std';
import { RANGE_SYNC_EXCLUDE_ATTR } from '@blocksuite/std/inline';
import { Slice } from '@blocksuite/store';
import { autoUpdate } from '@floating-ui/dom';
import { computed, signal } from '@preact/signals-core';
@@ -1,7 +1,7 @@
import type { DatabaseBlockModel } from '@blocksuite/affine-model';
import { unsafeCSSVarV2 } from '@blocksuite/affine-shared/theme';
import { BlockComponent } from '@blocksuite/block-std';
import { DatabaseListViewIcon } from '@blocksuite/icons/lit';
import { BlockComponent } from '@blocksuite/std';
import { css, html } from 'lit';
export class DatabaseDndPreviewBlockComponent extends BlockComponent<DatabaseBlockModel> {
@@ -1,5 +1,5 @@
import { SlashMenuConfigExtension } from '@blocksuite/affine-widget-slash-menu';
import { BlockViewExtension, FlavourExtension } from '@blocksuite/block-std';
import { BlockViewExtension, FlavourExtension } from '@blocksuite/std';
import type { ExtensionType } from '@blocksuite/store';
import { literal } from 'lit/static-html.js';
@@ -1,12 +1,12 @@
import { DefaultInlineManagerExtension } from '@blocksuite/affine-inline-preset';
import type { EditorHost } from '@blocksuite/block-std';
import { ShadowlessElement } from '@blocksuite/block-std';
import type { DetailSlotProps } from '@blocksuite/data-view';
import type {
KanbanSingleView,
TableSingleView,
} from '@blocksuite/data-view/view-presets';
import { WithDisposable } from '@blocksuite/global/lit';
import type { EditorHost } from '@blocksuite/std';
import { ShadowlessElement } from '@blocksuite/std';
import { cssVarV2 } from '@toeverything/theme/v2';
import { css, html, unsafeCSS } from 'lit';
import { property } from 'lit/decorators.js';
@@ -9,9 +9,9 @@ import { REFERENCE_NODE } from '@blocksuite/affine-shared/consts';
import { TelemetryProvider } from '@blocksuite/affine-shared/services';
import type { AffineTextAttributes } from '@blocksuite/affine-shared/types';
import { createDefaultDoc, matchModels } from '@blocksuite/affine-shared/utils';
import { type EditorHost, ShadowlessElement } from '@blocksuite/block-std';
import type { DetailSlotProps, SingleView } from '@blocksuite/data-view';
import { SignalWatcher, WithDisposable } from '@blocksuite/global/lit';
import { type EditorHost, ShadowlessElement } from '@blocksuite/std';
import type { BaseTextAttributes } from '@blocksuite/store';
import { computed } from '@preact/signals-core';
import { cssVarV2 } from '@toeverything/theme/v2';
@@ -16,9 +16,9 @@
{ "path": "../../shared" },
{ "path": "../../widgets/widget-drag-handle" },
{ "path": "../../widgets/widget-slash-menu" },
{ "path": "../../../framework/block-std" },
{ "path": "../../data-view" },
{ "path": "../../../framework/global" },
{ "path": "../../../framework/std" },
{ "path": "../../../framework/store" }
]
}
@@ -13,8 +13,8 @@
"@blocksuite/affine-components": "workspace:*",
"@blocksuite/affine-model": "workspace:*",
"@blocksuite/affine-shared": "workspace:*",
"@blocksuite/block-std": "workspace:*",
"@blocksuite/global": "workspace:*",
"@blocksuite/std": "workspace:*",
"@blocksuite/store": "workspace:*",
"@floating-ui/dom": "^1.6.13",
"@lit/context": "^1.1.2",

Some files were not shown because too many files have changed in this diff Show More