From 844b9d9592e42e852060a584387fcfa092f9bbe7 Mon Sep 17 00:00:00 2001 From: DarkSky <25152247+darkskygit@users.noreply.github.com> Date: Sun, 14 Dec 2025 00:28:43 +0800 Subject: [PATCH] feat(server): impl native reader for server (#14100) --- .devcontainer/build.sh | 1 - .github/actions/server-test-env/action.yml | 5 - .github/workflows/build-images.yml | 2 - .github/workflows/build-test.yml | 5 - .../src/__tests__/adapters/pdf.unit.spec.ts | 10 +- docs/developing-server.md | 6 - packages/backend/native/Cargo.toml | 28 +- packages/backend/native/index.d.ts | 29 + packages/backend/native/src/doc.rs | 93 ++ packages/backend/native/src/lib.rs | 1 + packages/backend/server/package.json | 1 - .../__snapshots__/controller.spec.ts.md | 55 +- .../__snapshots__/controller.spec.ts.snap | Bin 1845 -> 1651 bytes .../reader-from-database.spec.ts.md | 55 +- .../reader-from-database.spec.ts.snap | Bin 1703 -> 1505 bytes .../__snapshots__/reader-from-rpc.spec.ts.md | 55 +- .../reader-from-rpc.spec.ts.snap | Bin 1703 -> 1505 bytes .../backend/server/src/core/doc/reader.ts | 7 +- .../__snapshots__/blocksute.spec.ts.md | 819 ++++++++--------- .../__snapshots__/blocksute.spec.ts.snap | Bin 13070 -> 7330 bytes .../core/utils/__tests__/blocksute.spec.ts | 21 +- .../server/src/core/utils/blocksuite.ts | 89 +- packages/backend/server/src/native.ts | 4 + .../server/src/plugins/indexer/service.ts | 12 +- packages/backend/server/tsconfig.json | 1 - packages/common/native/src/doc_parser.rs | 332 +++++++ tools/utils/src/workspace.gen.ts | 1 - yarn.lock | 854 ++++++++---------- 28 files changed, 1333 insertions(+), 1153 deletions(-) create mode 100644 packages/backend/native/src/doc.rs diff --git a/.devcontainer/build.sh b/.devcontainer/build.sh index 4a19252cbb..9642696b66 100644 --- a/.devcontainer/build.sh +++ b/.devcontainer/build.sh @@ -6,7 +6,6 @@ yarn install # Build Server Dependencies yarn affine @affine/server-native build -yarn affine @affine/reader build # Create database yarn affine @affine/server prisma migrate reset -f diff --git a/.github/actions/server-test-env/action.yml b/.github/actions/server-test-env/action.yml index 789465e65a..50b3a6bc2b 100644 --- a/.github/actions/server-test-env/action.yml +++ b/.github/actions/server-test-env/action.yml @@ -4,11 +4,6 @@ description: 'Prepare Server Test Environment' runs: using: 'composite' steps: - - name: Bundle @affine/reader - shell: bash - run: | - yarn affine @affine/reader build - - name: Initialize database shell: bash run: | diff --git a/.github/workflows/build-images.yml b/.github/workflows/build-images.yml index 1ff7622a92..1df80bcd67 100644 --- a/.github/workflows/build-images.yml +++ b/.github/workflows/build-images.yml @@ -187,8 +187,6 @@ jobs: path: ./packages/backend/native - name: List server-native files run: ls -alh ./packages/backend/native - - name: Build @affine/reader - run: yarn workspace @affine/reader build - name: Build Server run: yarn workspace @affine/server build - name: Upload server dist diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 3ba10309da..be7feca525 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -152,11 +152,6 @@ jobs: name: server-native.node path: ./packages/backend/native - - name: Bundle @affine/reader - shell: bash - run: | - yarn workspace @affine/reader build - - name: Run Check run: | yarn affine init diff --git a/blocksuite/affine/all/src/__tests__/adapters/pdf.unit.spec.ts b/blocksuite/affine/all/src/__tests__/adapters/pdf.unit.spec.ts index 185885ba4c..49f69873a9 100644 --- a/blocksuite/affine/all/src/__tests__/adapters/pdf.unit.spec.ts +++ b/blocksuite/affine/all/src/__tests__/adapters/pdf.unit.spec.ts @@ -438,7 +438,7 @@ describe('snapshot to pdf', () => { expect(definition.styles?.code).toBeDefined(); expect(definition.defaultStyle).toBeDefined(); - expect(definition.defaultStyle?.font).toBe('Roboto'); + expect(definition.defaultStyle?.font).toBe('SarasaGothicCL'); }); describe('inline text styling', () => { @@ -650,7 +650,7 @@ describe('snapshot to pdf', () => { const codeText = textContent.text.find( (t: any) => typeof t === 'object' && - t.font === 'Roboto' && + t.font === 'Inter' && t.background === '#f5f5f5' ); expect(codeText).toBeDefined(); @@ -837,11 +837,7 @@ describe('snapshot to pdf', () => { if (Array.isArray(textContent.text)) { const refText = textContent.text.find( - (t: any) => - typeof t === 'object' && - t.text === 'Page not found' && - Array.isArray(t.decoration) && - t.decoration.includes('lineThrough') + (t: any) => typeof t === 'object' && t.text === 'Page not found' ); expect(refText).toBeDefined(); } diff --git a/docs/developing-server.md b/docs/developing-server.md index 3aa89e8fa6..e85420a258 100644 --- a/docs/developing-server.md +++ b/docs/developing-server.md @@ -35,12 +35,6 @@ Server also requires native packages to be built, you can build them by running yarn affine @affine/server-native build ``` -## Build @affine/reader package - -```sh -yarn affine @affine/reader build -``` - ## Prepare dev environment ```sh diff --git a/packages/backend/native/Cargo.toml b/packages/backend/native/Cargo.toml index 57668a4821..4f32224e3d 100644 --- a/packages/backend/native/Cargo.toml +++ b/packages/backend/native/Cargo.toml @@ -8,18 +8,22 @@ version = "1.0.0" crate-type = ["cdylib"] [dependencies] -affine_common = { workspace = true, features = ["doc-loader", "hashcash"] } -chrono = { workspace = true } -file-format = { workspace = true } -infer = { workspace = true } -mp4parse = { workspace = true } -napi = { workspace = true, features = ["async"] } -napi-derive = { workspace = true } -rand = { workspace = true } -sha3 = { workspace = true } -tiktoken-rs = { workspace = true } -v_htmlescape = { workspace = true } -y-octo = { workspace = true, features = ["large_refs"] } +affine_common = { workspace = true, features = [ + "doc-loader", + "hashcash", + "ydoc-loader", +] } +chrono = { workspace = true } +file-format = { workspace = true } +infer = { workspace = true } +mp4parse = { workspace = true } +napi = { workspace = true, features = ["async"] } +napi-derive = { workspace = true } +rand = { workspace = true } +sha3 = { workspace = true } +tiktoken-rs = { workspace = true } +v_htmlescape = { workspace = true } +y-octo = { workspace = true, features = ["large_refs"] } [target.'cfg(not(target_os = "linux"))'.dependencies] mimalloc = { workspace = true } diff --git a/packages/backend/native/index.d.ts b/packages/backend/native/index.d.ts index 12bbd6e85a..024db8eaea 100644 --- a/packages/backend/native/index.d.ts +++ b/packages/backend/native/index.d.ts @@ -27,6 +27,29 @@ export declare function mergeUpdatesInApplyWay(updates: Array): Buffer export declare function mintChallengeResponse(resource: string, bits?: number | undefined | null): Promise +export interface NativeBlockInfo { + blockId: string + flavour: string + content?: Array + blob?: Array + refDocId?: Array + refInfo?: Array + parentFlavour?: string + parentBlockId?: string + additional?: string +} + +export interface NativeCrawlResult { + blocks: Array + title: string + summary: string +} + +export interface NativeMarkdownResult { + title: string + markdown: string +} + export interface ParsedDoc { name: string chunks: Array @@ -34,4 +57,10 @@ export interface ParsedDoc { export declare function parseDoc(filePath: string, doc: Buffer): Promise +export declare function parseDocFromBinary(docBin: Buffer, docId: string): NativeCrawlResult + +export declare function parseDocToMarkdown(docBin: Buffer, docId: string, aiEditable?: boolean | undefined | null): NativeMarkdownResult + +export declare function readAllDocIdsFromRootDoc(docBin: Buffer, includeTrash?: boolean | undefined | null): Array + export declare function verifyChallengeResponse(response: string, bits: number, resource: string): Promise diff --git a/packages/backend/native/src/doc.rs b/packages/backend/native/src/doc.rs new file mode 100644 index 0000000000..c5da3c83b1 --- /dev/null +++ b/packages/backend/native/src/doc.rs @@ -0,0 +1,93 @@ +use affine_common::doc_parser::{self, BlockInfo, CrawlResult, MarkdownResult}; +use napi::bindgen_prelude::*; +use napi_derive::napi; + +#[napi(object)] +pub struct NativeMarkdownResult { + pub title: String, + pub markdown: String, +} + +impl From for NativeMarkdownResult { + fn from(result: MarkdownResult) -> Self { + Self { + title: result.title, + markdown: result.markdown, + } + } +} + +#[napi(object)] +pub struct NativeBlockInfo { + pub block_id: String, + pub flavour: String, + pub content: Option>, + pub blob: Option>, + pub ref_doc_id: Option>, + pub ref_info: Option>, + pub parent_flavour: Option, + pub parent_block_id: Option, + pub additional: Option, +} + +impl From for NativeBlockInfo { + fn from(info: BlockInfo) -> Self { + Self { + block_id: info.block_id, + flavour: info.flavour, + content: info.content, + blob: info.blob, + ref_doc_id: info.ref_doc_id, + ref_info: info.ref_info, + parent_flavour: info.parent_flavour, + parent_block_id: info.parent_block_id, + additional: info.additional, + } + } +} + +#[napi(object)] +pub struct NativeCrawlResult { + pub blocks: Vec, + pub title: String, + pub summary: String, +} + +impl From for NativeCrawlResult { + fn from(result: CrawlResult) -> Self { + Self { + blocks: result.blocks.into_iter().map(Into::into).collect(), + title: result.title, + summary: result.summary, + } + } +} + +#[napi] +pub fn parse_doc_from_binary(doc_bin: Buffer, doc_id: String) -> Result { + let result = doc_parser::parse_doc_from_binary(doc_bin.into(), doc_id) + .map_err(|e| Error::new(Status::GenericFailure, e.to_string()))?; + Ok(result.into()) +} + +#[napi] +pub fn parse_doc_to_markdown( + doc_bin: Buffer, + doc_id: String, + ai_editable: Option, +) -> Result { + let result = + doc_parser::parse_doc_to_markdown(doc_bin.into(), doc_id, ai_editable.unwrap_or(false)) + .map_err(|e| Error::new(Status::GenericFailure, e.to_string()))?; + Ok(result.into()) +} + +#[napi] +pub fn read_all_doc_ids_from_root_doc( + doc_bin: Buffer, + include_trash: Option, +) -> Result> { + let result = doc_parser::get_doc_ids_from_binary(doc_bin.into(), include_trash.unwrap_or(false)) + .map_err(|e| Error::new(Status::GenericFailure, e.to_string()))?; + Ok(result) +} diff --git a/packages/backend/native/src/lib.rs b/packages/backend/native/src/lib.rs index ff27317723..c6740387bc 100644 --- a/packages/backend/native/src/lib.rs +++ b/packages/backend/native/src/lib.rs @@ -2,6 +2,7 @@ mod utils; +pub mod doc; pub mod doc_loader; pub mod file_type; pub mod hashcash; diff --git a/packages/backend/server/package.json b/packages/backend/server/package.json index 9be2e63ec0..93c1c076b6 100644 --- a/packages/backend/server/package.json +++ b/packages/backend/server/package.json @@ -26,7 +26,6 @@ "postinstall": "prisma generate" }, "dependencies": { - "@affine/reader": "workspace:*", "@affine/server-native": "workspace:*", "@ai-sdk/anthropic": "^2.0.54", "@ai-sdk/google": "^2.0.45", diff --git a/packages/backend/server/src/__tests__/e2e/doc-service/__snapshots__/controller.spec.ts.md b/packages/backend/server/src/__tests__/e2e/doc-service/__snapshots__/controller.spec.ts.md index 70274c72c9..19b5633f8c 100644 --- a/packages/backend/server/src/__tests__/e2e/doc-service/__snapshots__/controller.spec.ts.md +++ b/packages/backend/server/src/__tests__/e2e/doc-service/__snapshots__/controller.spec.ts.md @@ -9,64 +9,43 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 { - markdown: `AFFiNE is an open source all in one workspace, an operating system for all the building blocks of your team wiki, knowledge management and digital assets and a better alternative to Notion and Miro.␊ - ␊ - ␊ + markdown: `AFFiNE is an open source all in one workspace, an operating system for all the building blocks of your team wiki, knowledge management and digital assets and a better alternative to Notion and Miro. ␊ ␊ # You own your data, with no compromises␊ - ␊ ## Local-first & Real-time collaborative␊ - ␊ We love the idea proposed by Ink & Switch in the famous article about you owning your data, despite the cloud. Furthermore, AFFiNE is the first all-in-one workspace that keeps your data ownership with no compromises on real-time collaboration and editing experience.␊ - ␊ AFFiNE is a local-first application upon CRDTs with real-time collaboration support. Your data is always stored locally while multiple nodes remain synced in real-time.␊ ␊ - ␊ - ␊ ### Blocks that assemble your next docs, tasks kanban or whiteboard␊ - ␊ - There is a large overlap of their atomic "building blocks" between these apps. They are neither open source nor have a plugin system like VS Code for contributors to customize. We want to have something that contains all the features we love and goes one step further.␊ - ␊ + There is a large overlap of their atomic "building blocks" between these apps. They are neither open source nor have a plugin system like VS Code for contributors to customize. We want to have something that contains all the features we love and goes one step further. ␊ We are building AFFiNE to be a fundamental open source platform that contains all the building blocks for docs, task management and visual collaboration, hoping you can shape your next workflow with us that can make your life better and also connect others, too.␊ - ␊ If you want to learn more about the product design of AFFiNE, here goes the concepts:␊ - ␊ To Shape, not to adapt. AFFiNE is built for individuals & teams who care about their data, who refuse vendor lock-in, and who want to have control over their essential tools.␊ - ␊ ## A true canvas for blocks in any form␊ - ␊ - [Many editor apps](http://notion.so) claimed to be a canvas for productivity. Since _the Mother of All Demos,_ Douglas Engelbart, a creative and programable digital workspace has been a pursuit and an ultimate mission for generations of tool makers.␊ - ␊ - ␊ + Many editor apps claimed to be a canvas for productivity. Since the Mother of All Demos, Douglas Engelbart, a creative and programable digital workspace has been a pursuit and an ultimate mission for generations of tool makers. ␊ ␊ "We shape our tools and thereafter our tools shape us”. A lot of pioneers have inspired us a long the way, e.g.:␊ - ␊ - * Quip & Notion with their great concept of "everything is a block"␊ - * Trello with their Kanban␊ - * Airtable & Miro with their no-code programable datasheets␊ - * Miro & Whimiscal with their edgeless visual whiteboard␊ - * Remnote & Capacities with their object-based tag system␊ - For more details, please refer to our [RoadMap](https://docs.affine.pro/docs/core-concepts/roadmap)␊ - ␊ + - Quip & Notion with their great concept of "everything is a block"␊ + - Trello with their Kanban␊ + - Airtable & Miro with their no-code programable datasheets␊ + - Miro & Whimiscal with their edgeless visual whiteboard␊ + - Remnote & Capacities with their object-based tag system␊ + For more details, please refer to our RoadMap␊ ## Self Host␊ - ␊ Self host AFFiNE␊ ␊ + ### Learning From␊ ||Title|Tag|␊ |---|---|---|␊ - |Affine Development|Affine Development|AFFiNE|␊ - |For developers or installations guides, please go to AFFiNE Doc|For developers or installations guides, please go to AFFiNE Doc|Developers|␊ - |Quip & Notion with their great concept of "everything is a block"|Quip & Notion with their great concept of "everything is a block"|Reference|␊ - |Trello with their Kanban|Trello with their Kanban|Reference|␊ - |Airtable & Miro with their no-code programable datasheets|Airtable & Miro with their no-code programable datasheets|Reference|␊ - |Miro & Whimiscal with their edgeless visual whiteboard|Miro & Whimiscal with their edgeless visual whiteboard|Reference|␊ + |Affine Development|Affine Development||␊ + |For developers or installations guides, please go to AFFiNE Doc|For developers or installations guides, please go to AFFiNE Doc||␊ + |Quip & Notion with their great concept of "everything is a block"|Quip & Notion with their great concept of "everything is a block"||␊ + |Trello with their Kanban|Trello with their Kanban||␊ + |Airtable & Miro with their no-code programable datasheets|Airtable & Miro with their no-code programable datasheets||␊ + |Miro & Whimiscal with their edgeless visual whiteboard|Miro & Whimiscal with their edgeless visual whiteboard||␊ |Remnote & Capacities with their object-based tag system|Remnote & Capacities with their object-based tag system||␊ - ␊ ## Affine Development␊ - ␊ - For developer or installation guides, please go to [AFFiNE Development](https://docs.affine.pro/docs/development/quick-start)␊ - ␊ - ␊ + For developer or installation guides, please go to AFFiNE Development␊ ␊ `, title: 'Write, Draw, Plan all at Once.', diff --git a/packages/backend/server/src/__tests__/e2e/doc-service/__snapshots__/controller.spec.ts.snap b/packages/backend/server/src/__tests__/e2e/doc-service/__snapshots__/controller.spec.ts.snap index e380fc39a00ccfb7c18cfb3e19c50917bc617c1a..97e09a2abc138ffff2e928ec9fa95b7ca46df4a8 100644 GIT binary patch literal 1651 zcmV-(28{VZRzV0 zv{VR)cpr-h00000000B6SIurC#}OXxpY6#SS=%`~1qslJt<(2zMQM0F+9Ts!MM@1w*c&X}-r2uzTR4_tq4>Z|B*; z%Zu5S^t;}-hjiX^h*PcCkgvwID_jdmaTatX)B+ zV!zvIn&-#I$MEZ(dkGpPQ#-fRqvPmp5}k}8qAUa!=;q4lpj${rBU7gOA zRAtSA;P;pCl1oYwE7-+g=3V3t&Ek8S!ZpDPUDVYSOSq-jXkG~e^+e-jr_zcr zc7X&|1I4xOH79NmNF)zc&&DaJ3^e)OQ3ozWhPh^4b*@C!Fxp!O^A=;pp}i-C!$zSe zyeZ6KYgiiT(B3A}7#jA2te`*#(xBh3vx=m$yz1%L4TMn378iq|H5Ki8j5ZuADi-Ic zh`@?~X2d+rzet^IhqEON4pgjz&h=0}aM=}6)op60bm_qwLt<1yI4Pc8K|ado`4z*Z zracD7DK3`i<8)8|3RFz+7+0F5DLb?RC#j2^W0w!wr#i|vBEwwcE5iKdK`#zAGSt`^~K7p%1*7Cmdm#Git6F4;? zChShqWZk!MJSnsp-9i{6N<$PSpY#qVaNU^JNTImjIP1W-B(jzAUb~&Z1+|W&?)efu z7A6{!eP>QzHIq5&@Qt|r^2pCP^b#y7qOmdtZwZBz_ex?;_+K!VuhA=cFUeN$8=~yCKJJ71`Oi4GH*Q{v|@}F_>&iFf0@ibk1wojj42NP)wvw*8H{MMpN zp9L7`S@w_Ye_p1Z9-QfkQfT||!5fZn#+@qJH;44%@wu=U3mJ xoqzpic3|~PBF0YA+CRzVD6W>W`{h_nv#s zsha*~JhEI&(;HT_fginlJ#z8pY*PL zzjrn3UH`cE;c~6TgDd6D-Ti%Y@DPjuI$%!@gxgRMptWEeup^jpn25)M`insUqj43; zTp~3v=8#6mnqbr#Tk5;6Xy7r-xeX8r8BGeF%u-nqH0ZFRhFk=6C6uNz5iOty zMM;kkMie7y{7AuJG*g1eaKO>9OGBQRz{5Px^V{&8TTmd=ii%txW+v9)7z%ED;Km3^ zp5ML=zv2SzU~Ga!*oGrQJBX$sDA-yYaY!rW`7;8`x@1jYN<#2~JqwjEn!{r^fo(XR znOM{cl@1zX!>s^@XbMY!BW|PSqj@PT8>y8f-o!3;VYw}bu-}GQQ)oC)AJ&~ofm5nz z?ZCLfxu!s@F~Wq%%R0QSM?q@iFM|NsLAb2u1*TM*)L=UG6b!k7hIzih6tElcq4(Al z-Q?D@g9k@@C(dc5B!<%xYr^n$||+ErH{b1Ohc^ z9LU@iR4VwZl{zlmz74QBC3#{K#*3O6$C4>|q8Nx|TbHG60$Y__(sm*bK8m9yZ z-nLaLEs4vT3Bgy#@PJE7N-NmKU`B1^AS#8T70u!gG=ygaGjvg(rdYxa#ai=9Am~gq zPF7+a6UH`>z-&Qt?R~|G9|RJ~!?nN)o30kM_U1H34;Sw>_Y5Xl@DCDMO2BK$|+wuwEB=Jl^{;CXIGGq zaxc$M7>+gZJ~&Q+u|yw-8!n(w#RQOXrJ0(tMJuqKtW{uEGZeU)g;{xE%@AnZ3c-|I z$w8$x85q}3wd(70v`GwOo9Mm>L?Yy(L8~BG872?ig&0~=B&XPQZqY=eE;83AO`gAa zqSxvux=na5Uw>N1=f%&WCVpTtVO zE$mUl(tini+*TF^9=eL`2t({^xIo?3q4oN}Rlo+-4whTa+DvN{7^!p-d>f=S9rMtE z8c>6gpfMt9Vwzn=jyfKuy-v|dvpTP)qbB?$?oaFl)I(3#5 z(OBt&w}e8f2&Fft2D~_8ET5q7xGDE`cGQH1I362ELmxQZ?-U$puoUf1U@RN-caj*6 z$&TR>OU(0hS+m52c=P=1>_m@#XD3*l+c&F~ z1GLKdK(dmxoUuAN=mksvg-^Yd%u0>oIO!^6T{d`WNpx z!MApqcbNH}OME*seA{X7xwyA9?6;nG)}2ZI$2#-;oF84Zqs!gs#nO(}alU11DAyx* ze&3p6GLVQN-qBOQg#~9&Ie|Igv8vN{aUkw7q zHaKvt)oznZZ}kjGr$*u>UlV%Y-T0bt<9?Q9ds&vf%ChXQS(g1H%d&rE-}+_Y`h}XV zsjQYa-#Oq2``o(n!l(}#62WRU@T0v&uH#DvUvt=OggiWXxqtZdVDG}H8xk?Ll5VeE j`AhF&kU00NAm2NBczpQu=)uF6t7!iPhnJoSo)G{5A4il+ diff --git a/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-database.spec.ts.md b/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-database.spec.ts.md index 47ef7705d6..d5e57a9f14 100644 --- a/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-database.spec.ts.md +++ b/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-database.spec.ts.md @@ -9,64 +9,43 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 { - markdown: `AFFiNE is an open source all in one workspace, an operating system for all the building blocks of your team wiki, knowledge management and digital assets and a better alternative to Notion and Miro.␊ - ␊ - ␊ + markdown: `AFFiNE is an open source all in one workspace, an operating system for all the building blocks of your team wiki, knowledge management and digital assets and a better alternative to Notion and Miro. ␊ ␊ # You own your data, with no compromises␊ - ␊ ## Local-first & Real-time collaborative␊ - ␊ We love the idea proposed by Ink & Switch in the famous article about you owning your data, despite the cloud. Furthermore, AFFiNE is the first all-in-one workspace that keeps your data ownership with no compromises on real-time collaboration and editing experience.␊ - ␊ AFFiNE is a local-first application upon CRDTs with real-time collaboration support. Your data is always stored locally while multiple nodes remain synced in real-time.␊ ␊ - ␊ - ␊ ### Blocks that assemble your next docs, tasks kanban or whiteboard␊ - ␊ - There is a large overlap of their atomic "building blocks" between these apps. They are neither open source nor have a plugin system like VS Code for contributors to customize. We want to have something that contains all the features we love and goes one step further.␊ - ␊ + There is a large overlap of their atomic "building blocks" between these apps. They are neither open source nor have a plugin system like VS Code for contributors to customize. We want to have something that contains all the features we love and goes one step further. ␊ We are building AFFiNE to be a fundamental open source platform that contains all the building blocks for docs, task management and visual collaboration, hoping you can shape your next workflow with us that can make your life better and also connect others, too.␊ - ␊ If you want to learn more about the product design of AFFiNE, here goes the concepts:␊ - ␊ To Shape, not to adapt. AFFiNE is built for individuals & teams who care about their data, who refuse vendor lock-in, and who want to have control over their essential tools.␊ - ␊ ## A true canvas for blocks in any form␊ - ␊ - [Many editor apps](http://notion.so) claimed to be a canvas for productivity. Since _the Mother of All Demos,_ Douglas Engelbart, a creative and programable digital workspace has been a pursuit and an ultimate mission for generations of tool makers.␊ - ␊ - ␊ + Many editor apps claimed to be a canvas for productivity. Since the Mother of All Demos, Douglas Engelbart, a creative and programable digital workspace has been a pursuit and an ultimate mission for generations of tool makers. ␊ ␊ "We shape our tools and thereafter our tools shape us”. A lot of pioneers have inspired us a long the way, e.g.:␊ - ␊ - * Quip & Notion with their great concept of "everything is a block"␊ - * Trello with their Kanban␊ - * Airtable & Miro with their no-code programable datasheets␊ - * Miro & Whimiscal with their edgeless visual whiteboard␊ - * Remnote & Capacities with their object-based tag system␊ - For more details, please refer to our [RoadMap](https://docs.affine.pro/docs/core-concepts/roadmap)␊ - ␊ + - Quip & Notion with their great concept of "everything is a block"␊ + - Trello with their Kanban␊ + - Airtable & Miro with their no-code programable datasheets␊ + - Miro & Whimiscal with their edgeless visual whiteboard␊ + - Remnote & Capacities with their object-based tag system␊ + For more details, please refer to our RoadMap␊ ## Self Host␊ - ␊ Self host AFFiNE␊ ␊ + ### Learning From␊ ||Title|Tag|␊ |---|---|---|␊ - |Affine Development|Affine Development|AFFiNE|␊ - |For developers or installations guides, please go to AFFiNE Doc|For developers or installations guides, please go to AFFiNE Doc|Developers|␊ - |Quip & Notion with their great concept of "everything is a block"|Quip & Notion with their great concept of "everything is a block"|Reference|␊ - |Trello with their Kanban|Trello with their Kanban|Reference|␊ - |Airtable & Miro with their no-code programable datasheets|Airtable & Miro with their no-code programable datasheets|Reference|␊ - |Miro & Whimiscal with their edgeless visual whiteboard|Miro & Whimiscal with their edgeless visual whiteboard|Reference|␊ + |Affine Development|Affine Development||␊ + |For developers or installations guides, please go to AFFiNE Doc|For developers or installations guides, please go to AFFiNE Doc||␊ + |Quip & Notion with their great concept of "everything is a block"|Quip & Notion with their great concept of "everything is a block"||␊ + |Trello with their Kanban|Trello with their Kanban||␊ + |Airtable & Miro with their no-code programable datasheets|Airtable & Miro with their no-code programable datasheets||␊ + |Miro & Whimiscal with their edgeless visual whiteboard|Miro & Whimiscal with their edgeless visual whiteboard||␊ |Remnote & Capacities with their object-based tag system|Remnote & Capacities with their object-based tag system||␊ - ␊ ## Affine Development␊ - ␊ - For developer or installation guides, please go to [AFFiNE Development](https://docs.affine.pro/docs/development/quick-start)␊ - ␊ - ␊ + For developer or installation guides, please go to AFFiNE Development␊ ␊ `, title: 'Write, Draw, Plan all at Once.', diff --git a/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-database.spec.ts.snap b/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-database.spec.ts.snap index 3095228f2c6bf40a0a7ad4e6c8028ac77ef330de..e0bf7a84636bf02e62e9ca8e802df245134393b7 100644 GIT binary patch literal 1505 zcmV<71s?iARzV=S}@Uw=~` z{H%hcjUS5$00000000B6S50puMH20v5iBarY6rm?g>1>E?mp~k#mzg$0>QvCwy-!x zS4CCjc2-6zBdU8E)d7A82lxm4CGPx(Rb-XhZSM>R50)%-XJvfki}zku|5C3#mmB%% zS5l{*UY|(Iy{{mV_9;NcC3KiJ74HH_UzQ}|Bw&=5Ret)Vs!;L!XMa4M{cUD{^AF}v z|2dn@{xzG;etR~XeKddn!}^N;CVo8f>Q$ls20ojXE2Q{a> zTU&y4?|fy?#&ZMLu;)I35_Yh28@GT>;GL(cA?Pq*LmdSL3>8$aaf%*LgjDhp!kSdc z@++l)>b3;R@HMOBkhi>aiC0h*r|>=ZU^wQ22HXO6PFn~JC3i7#=Y*s^&Y+m8#sfjozt>4oNQB#9rps5 z)Rmq9*W9ahV_g|0M~zh^(dn4G^xRh~xa^a*lsZndfV;8e#JN-Se(A#U-b6rKRM-$j zxl3>LC`s$$n*aa~klu9U2~etBo-VzPlpKYUR>cuZz#oB!F?v^yv3=wKFJ4_-%UJbo zHKdP`ldf!DQ@@ti?{F_5%89D6hTp@kb)KN>y}IZL0#_uEs6!V(_MxQ8us>8<6~*c4 zDg1lnUWUfV)U7>@=mdJLCOTPwqHF{<7}mz=WTlkWjHxQFTS_z?7E?pOTS^|Iu~}Pk z2~fFnC7e8<`-#zYN0jLxWbnueu3OpzCW1iDCVWq3ffKa2B|wP2Z}Pdas=V6}e0K#e zxS}kvl7l9J_s(wb2FL;|~s;x_k& zGdBoCDMCH6aRnv=YyNQ5i3`fGwyx_wRA?GTfA3(?qt=|dx3uukDC~rHgL!BTTPHpG z`$Sqm%W;wwlo&u-jK^~}k<^}dBOUvR5Vo_!&9u?GnhqXghU3M=5(1S9YzSCK%&X#y z>|_U=Jz)x9Vx4quhl+`-zEo4UYl6{b1Zx4AQ5oT^cn&2+l~0RnhAV4(0fBQ~tT5{8 zNdE?uW_Vnv+}2e+dV#a-r~B1tP)E?g>P39N- zO!g@eiBM37-XQR@GVeSGO+6WmTO7wWP0*Qr>}{nhUfL%!61y5=6evBqj;aG|j>0F< z+}7!S1y?SVqb|8N%ldwb6{Oyf$ zXO}GstWBT@u}{*wkzW|VJf=e>=$wf8l=aq7ppk9)Dl-%^d6L+bb8GBn45an#v zH(_m@x_dBg?B(|#e_p{kcvj089S5Q$;|N@k=*<86(P*=PP22kg(5hK|S}ft)-bFaO zy#X_|$6+;w!Y#Ed_X%w&?MENTW|jwaQY_&*k@tKY{AKpRVhQIiX~ym>->k=b0xwH5 zqk9OWqO?RR#c~WdgPYcMPD;c5F4!)7Pa?NcKC;^-yrM3!TFn<2v2^N4j)OVB)hyR& zm#^aOn@4fUX_R0^iq6Xdq9+tG-W!QIeqE*wo zitajZ*xH`tf5GKD#}CEu&XoBJG7QD=HrBoUf#LjEKE6ZbPz;Zw@?*n>VtAwk9vwGi zFaJNr7We4(kZpfXwxcY?gC8F6bKcr zv?xjF#vh9a00000000BMSY2xz$rYWk+0D|h*vsZQTt*;PVtN$v0g2f)DApRAjqOBI zqBtfjce?L%m#4aJZQbe_P0&O3hvZ@NL-J$tGx8K}b2t zW>d?>T)zJYMH4Muj-=++mJlem!9mFdG#KV3FC9o*6eMEAp_iJYeE&mPV#JsC{(X1w zqk;YmKN;Tr*Pu98m2Y1SQ$B!SI=U;;nKnLu}fp8lN0<;#419k*U4s-EX(70a|FdA2Z ztRzwcGY)BWtO=&Av8BH2`UalCirWB@uz{tSn=#BCFD;c7L4yt}YRE-ES3+qj6VU>S zP?YotVM;NQ#*Y*nMzbJ@49__lc4^5o6L^wkS+)l+xdjC>WmM$Gur#p-$53$N12;xU zvTSb;e#-^gd}e|~*oRX>n@7_S6l^U{IiyTkc0piSQ`Q8gBm^JWvrq}s6+Crw*oU*F ziAAkY>7p4n+zMcbrmzG!TF{RR^0n??YV8|6T$+8`$fZc%)y|W#FPm`l?dm#Sk?>$?p9$o9#}I3nzcf(AXjow zY0Y!v#;I3*eT_DWVQdrK`#>Z@E*i87f|W_~&|`?9B}H<9-Q@Zq8g-GCK54S-)ieF9 zj-tne_wtu7>KOflqa&A0d?I`Rg+~*T?F3-X-&sGbf5;* zU?gaah?BopnsF;iFYZzlhsfnUwhuwyKxTsBI zq)_CyoApj$Nn|ba9WOqFQ)(PX&G`sD7A6{!-OZdXKKT^&aE`dXoMewVbm}ZAqOmdt zZwZA|5lU}P19)}HSUyAFaZ?@~9jOUTa5giJCO&ZbepGOvd@b6ez*siu50V(p$j;yi zOU$zLv1WRfMsSLaw=WmkEgZ+^3@)l%Gsys zrbi33EqygQzC5G+mp{LJ{ijj)yjznOY&m>2T44AhUvH0C<=(jY!RTRE<(EgA;^9?x zrI3|fZslDv9EoUc&-1D^C2fJMSW)bK>V%8;-v3U${`7VI>+1RP7ccF*^~wQVMF*pY zC!5N)9ly6={tpq}sp}`z6Zz)FAD%w{^SgCDwXODis$AD=+_vSn>HF<3K5&7zcA59s z`GH%!of+PC+Xrs$mWF-neOKL` Snapshot 1 { - markdown: `AFFiNE is an open source all in one workspace, an operating system for all the building blocks of your team wiki, knowledge management and digital assets and a better alternative to Notion and Miro.␊ - ␊ - ␊ + markdown: `AFFiNE is an open source all in one workspace, an operating system for all the building blocks of your team wiki, knowledge management and digital assets and a better alternative to Notion and Miro. ␊ ␊ # You own your data, with no compromises␊ - ␊ ## Local-first & Real-time collaborative␊ - ␊ We love the idea proposed by Ink & Switch in the famous article about you owning your data, despite the cloud. Furthermore, AFFiNE is the first all-in-one workspace that keeps your data ownership with no compromises on real-time collaboration and editing experience.␊ - ␊ AFFiNE is a local-first application upon CRDTs with real-time collaboration support. Your data is always stored locally while multiple nodes remain synced in real-time.␊ ␊ - ␊ - ␊ ### Blocks that assemble your next docs, tasks kanban or whiteboard␊ - ␊ - There is a large overlap of their atomic "building blocks" between these apps. They are neither open source nor have a plugin system like VS Code for contributors to customize. We want to have something that contains all the features we love and goes one step further.␊ - ␊ + There is a large overlap of their atomic "building blocks" between these apps. They are neither open source nor have a plugin system like VS Code for contributors to customize. We want to have something that contains all the features we love and goes one step further. ␊ We are building AFFiNE to be a fundamental open source platform that contains all the building blocks for docs, task management and visual collaboration, hoping you can shape your next workflow with us that can make your life better and also connect others, too.␊ - ␊ If you want to learn more about the product design of AFFiNE, here goes the concepts:␊ - ␊ To Shape, not to adapt. AFFiNE is built for individuals & teams who care about their data, who refuse vendor lock-in, and who want to have control over their essential tools.␊ - ␊ ## A true canvas for blocks in any form␊ - ␊ - [Many editor apps](http://notion.so) claimed to be a canvas for productivity. Since _the Mother of All Demos,_ Douglas Engelbart, a creative and programable digital workspace has been a pursuit and an ultimate mission for generations of tool makers.␊ - ␊ - ␊ + Many editor apps claimed to be a canvas for productivity. Since the Mother of All Demos, Douglas Engelbart, a creative and programable digital workspace has been a pursuit and an ultimate mission for generations of tool makers. ␊ ␊ "We shape our tools and thereafter our tools shape us”. A lot of pioneers have inspired us a long the way, e.g.:␊ - ␊ - * Quip & Notion with their great concept of "everything is a block"␊ - * Trello with their Kanban␊ - * Airtable & Miro with their no-code programable datasheets␊ - * Miro & Whimiscal with their edgeless visual whiteboard␊ - * Remnote & Capacities with their object-based tag system␊ - For more details, please refer to our [RoadMap](https://docs.affine.pro/docs/core-concepts/roadmap)␊ - ␊ + - Quip & Notion with their great concept of "everything is a block"␊ + - Trello with their Kanban␊ + - Airtable & Miro with their no-code programable datasheets␊ + - Miro & Whimiscal with their edgeless visual whiteboard␊ + - Remnote & Capacities with their object-based tag system␊ + For more details, please refer to our RoadMap␊ ## Self Host␊ - ␊ Self host AFFiNE␊ ␊ + ### Learning From␊ ||Title|Tag|␊ |---|---|---|␊ - |Affine Development|Affine Development|AFFiNE|␊ - |For developers or installations guides, please go to AFFiNE Doc|For developers or installations guides, please go to AFFiNE Doc|Developers|␊ - |Quip & Notion with their great concept of "everything is a block"|Quip & Notion with their great concept of "everything is a block"|Reference|␊ - |Trello with their Kanban|Trello with their Kanban|Reference|␊ - |Airtable & Miro with their no-code programable datasheets|Airtable & Miro with their no-code programable datasheets|Reference|␊ - |Miro & Whimiscal with their edgeless visual whiteboard|Miro & Whimiscal with their edgeless visual whiteboard|Reference|␊ + |Affine Development|Affine Development||␊ + |For developers or installations guides, please go to AFFiNE Doc|For developers or installations guides, please go to AFFiNE Doc||␊ + |Quip & Notion with their great concept of "everything is a block"|Quip & Notion with their great concept of "everything is a block"||␊ + |Trello with their Kanban|Trello with their Kanban||␊ + |Airtable & Miro with their no-code programable datasheets|Airtable & Miro with their no-code programable datasheets||␊ + |Miro & Whimiscal with their edgeless visual whiteboard|Miro & Whimiscal with their edgeless visual whiteboard||␊ |Remnote & Capacities with their object-based tag system|Remnote & Capacities with their object-based tag system||␊ - ␊ ## Affine Development␊ - ␊ - For developer or installation guides, please go to [AFFiNE Development](https://docs.affine.pro/docs/development/quick-start)␊ - ␊ - ␊ + For developer or installation guides, please go to AFFiNE Development␊ ␊ `, title: 'Write, Draw, Plan all at Once.', diff --git a/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-rpc.spec.ts.snap b/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-rpc.spec.ts.snap index 3095228f2c6bf40a0a7ad4e6c8028ac77ef330de..e0bf7a84636bf02e62e9ca8e802df245134393b7 100644 GIT binary patch literal 1505 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 Snapshot 1 { - markdown: `AFFiNE is an open source all in one workspace, an operating system for all the building blocks of your team wiki, knowledge management and digital assets and a better alternative to Notion and Miro.␊ - ␊ - ␊ + markdown: `AFFiNE is an open source all in one workspace, an operating system for all the building blocks of your team wiki, knowledge management and digital assets and a better alternative to Notion and Miro. ␊ ␊ # You own your data, with no compromises␊ - ␊ ## Local-first & Real-time collaborative␊ - ␊ We love the idea proposed by Ink & Switch in the famous article about you owning your data, despite the cloud. Furthermore, AFFiNE is the first all-in-one workspace that keeps your data ownership with no compromises on real-time collaboration and editing experience.␊ - ␊ AFFiNE is a local-first application upon CRDTs with real-time collaboration support. Your data is always stored locally while multiple nodes remain synced in real-time.␊ ␊ - ␊ - ␊ ### Blocks that assemble your next docs, tasks kanban or whiteboard␊ - ␊ - There is a large overlap of their atomic "building blocks" between these apps. They are neither open source nor have a plugin system like VS Code for contributors to customize. We want to have something that contains all the features we love and goes one step further.␊ - ␊ + There is a large overlap of their atomic "building blocks" between these apps. They are neither open source nor have a plugin system like VS Code for contributors to customize. We want to have something that contains all the features we love and goes one step further. ␊ We are building AFFiNE to be a fundamental open source platform that contains all the building blocks for docs, task management and visual collaboration, hoping you can shape your next workflow with us that can make your life better and also connect others, too.␊ - ␊ If you want to learn more about the product design of AFFiNE, here goes the concepts:␊ - ␊ To Shape, not to adapt. AFFiNE is built for individuals & teams who care about their data, who refuse vendor lock-in, and who want to have control over their essential tools.␊ - ␊ ## A true canvas for blocks in any form␊ - ␊ - [Many editor apps](http://notion.so) claimed to be a canvas for productivity. Since _the Mother of All Demos,_ Douglas Engelbart, a creative and programable digital workspace has been a pursuit and an ultimate mission for generations of tool makers.␊ - ␊ - ␊ + Many editor apps claimed to be a canvas for productivity. Since the Mother of All Demos, Douglas Engelbart, a creative and programable digital workspace has been a pursuit and an ultimate mission for generations of tool makers. ␊ ␊ "We shape our tools and thereafter our tools shape us”. A lot of pioneers have inspired us a long the way, e.g.:␊ - ␊ - * Quip & Notion with their great concept of "everything is a block"␊ - * Trello with their Kanban␊ - * Airtable & Miro with their no-code programable datasheets␊ - * Miro & Whimiscal with their edgeless visual whiteboard␊ - * Remnote & Capacities with their object-based tag system␊ - For more details, please refer to our [RoadMap](https://docs.affine.pro/docs/core-concepts/roadmap)␊ - ␊ + - Quip & Notion with their great concept of "everything is a block"␊ + - Trello with their Kanban␊ + - Airtable & Miro with their no-code programable datasheets␊ + - Miro & Whimiscal with their edgeless visual whiteboard␊ + - Remnote & Capacities with their object-based tag system␊ + For more details, please refer to our RoadMap␊ ## Self Host␊ - ␊ Self host AFFiNE␊ ␊ + ### Learning From␊ ||Title|Tag|␊ |---|---|---|␊ - |Affine Development|Affine Development|AFFiNE|␊ - |For developers or installations guides, please go to AFFiNE Doc|For developers or installations guides, please go to AFFiNE Doc|Developers|␊ - |Quip & Notion with their great concept of "everything is a block"|Quip & Notion with their great concept of "everything is a block"|Reference|␊ - |Trello with their Kanban|Trello with their Kanban|Reference|␊ - |Airtable & Miro with their no-code programable datasheets|Airtable & Miro with their no-code programable datasheets|Reference|␊ - |Miro & Whimiscal with their edgeless visual whiteboard|Miro & Whimiscal with their edgeless visual whiteboard|Reference|␊ + |Affine Development|Affine Development||␊ + |For developers or installations guides, please go to AFFiNE Doc|For developers or installations guides, please go to AFFiNE Doc||␊ + |Quip & Notion with their great concept of "everything is a block"|Quip & Notion with their great concept of "everything is a block"||␊ + |Trello with their Kanban|Trello with their Kanban||␊ + |Airtable & Miro with their no-code programable datasheets|Airtable & Miro with their no-code programable datasheets||␊ + |Miro & Whimiscal with their edgeless visual whiteboard|Miro & Whimiscal with their edgeless visual whiteboard||␊ |Remnote & Capacities with their object-based tag system|Remnote & Capacities with their object-based tag system||␊ - ␊ ## Affine Development␊ - ␊ - For developer or installation guides, please go to [AFFiNE Development](https://docs.affine.pro/docs/development/quick-start)␊ - ␊ - ␊ + For developer or installation guides, please go to AFFiNE Development␊ ␊ `, title: 'Write, Draw, Plan all at Once.', @@ -1440,83 +1426,52 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 { - markdown: `␊ - AFFiNE is an open source all in one workspace, an operating system for all the building blocks of your team wiki, knowledge management and digital assets and a better alternative to Notion and Miro.␊ + markdown: `␊ + AFFiNE is an open source all in one workspace, an operating system for all the building blocks of your team wiki, knowledge management and digital assets and a better alternative to Notion and Miro. ␊ ␊ - ␊ - ␊ - ␊ - ␊ # You own your data, with no compromises␊ - ␊ - ␊ ## Local-first & Real-time collaborative␊ - ␊ - ␊ We love the idea proposed by Ink & Switch in the famous article about you owning your data, despite the cloud. Furthermore, AFFiNE is the first all-in-one workspace that keeps your data ownership with no compromises on real-time collaboration and editing experience.␊ - ␊ - ␊ AFFiNE is a local-first application upon CRDTs with real-time collaboration support. Your data is always stored locally while multiple nodes remain synced in real-time.␊ ␊ - ␊ - ␊ - ␊ - ␊ + ␊ ### Blocks that assemble your next docs, tasks kanban or whiteboard␊ - ␊ - ␊ - There is a large overlap of their atomic "building blocks" between these apps. They are neither open source nor have a plugin system like VS Code for contributors to customize. We want to have something that contains all the features we love and goes one step further.␊ - ␊ - ␊ + ␊ + There is a large overlap of their atomic "building blocks" between these apps. They are neither open source nor have a plugin system like VS Code for contributors to customize. We want to have something that contains all the features we love and goes one step further. ␊ We are building AFFiNE to be a fundamental open source platform that contains all the building blocks for docs, task management and visual collaboration, hoping you can shape your next workflow with us that can make your life better and also connect others, too.␊ - ␊ - ␊ If you want to learn more about the product design of AFFiNE, here goes the concepts:␊ - ␊ - ␊ To Shape, not to adapt. AFFiNE is built for individuals & teams who care about their data, who refuse vendor lock-in, and who want to have control over their essential tools.␊ - ␊ - ␊ + ␊ ## A true canvas for blocks in any form␊ + Many editor apps claimed to be a canvas for productivity. Since the Mother of All Demos, Douglas Engelbart, a creative and programable digital workspace has been a pursuit and an ultimate mission for generations of tool makers. ␊ ␊ - ␊ - [Many editor apps](http://notion.so) claimed to be a canvas for productivity. Since _the Mother of All Demos,_ Douglas Engelbart, a creative and programable digital workspace has been a pursuit and an ultimate mission for generations of tool makers.␊ - ␊ - ␊ - ␊ - ␊ - ␊ "We shape our tools and thereafter our tools shape us”. A lot of pioneers have inspired us a long the way, e.g.:␊ - ␊ - ␊ - * Quip & Notion with their great concept of "everything is a block"␊ - ␊ - * Trello with their Kanban␊ - ␊ - * Airtable & Miro with their no-code programable datasheets␊ - ␊ - * Miro & Whimiscal with their edgeless visual whiteboard␊ - ␊ - * Remnote & Capacities with their object-based tag system␊ - ␊ - For more details, please refer to our [RoadMap](https://docs.affine.pro/docs/core-concepts/roadmap)␊ - ␊ - ␊ + - Quip & Notion with their great concept of "everything is a block"␊ + - Trello with their Kanban␊ + - Airtable & Miro with their no-code programable datasheets␊ + - Miro & Whimiscal with their edgeless visual whiteboard␊ + - Remnote & Capacities with their object-based tag system␊ + ␊ + For more details, please refer to our RoadMap␊ ## Self Host␊ - ␊ - ␊ Self host AFFiNE␊ + ␊ ␊ - ␊ - ␊ + ### Learning From␊ + ||Title|Tag|␊ + |---|---|---|␊ + |Affine Development|Affine Development||␊ + |For developers or installations guides, please go to AFFiNE Doc|For developers or installations guides, please go to AFFiNE Doc||␊ + |Quip & Notion with their great concept of "everything is a block"|Quip & Notion with their great concept of "everything is a block"||␊ + |Trello with their Kanban|Trello with their Kanban||␊ + |Airtable & Miro with their no-code programable datasheets|Airtable & Miro with their no-code programable datasheets||␊ + |Miro & Whimiscal with their edgeless visual whiteboard|Miro & Whimiscal with their edgeless visual whiteboard||␊ + |Remnote & Capacities with their object-based tag system|Remnote & Capacities with their object-based tag system||␊ + ␊ ## Affine Development␊ + For developer or installation guides, please go to AFFiNE Development␊ ␊ - ␊ - For developer or installation guides, please go to [AFFiNE Development](https://docs.affine.pro/docs/development/quick-start)␊ - ␊ - ␊ - ␊ - ␊ + ␊ `, title: 'Write, Draw, Plan all at Once.', } diff --git a/packages/backend/server/src/core/utils/__tests__/__snapshots__/blocksute.spec.ts.snap b/packages/backend/server/src/core/utils/__tests__/__snapshots__/blocksute.spec.ts.snap index 8670a36042df284dd20372566097284b8081f854..1b99242ee5f7f776d17d8e8c6f8822b79929bbf4 100644 GIT binary patch literal 7330 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 literal 13070 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 OSV745(!buJy!aob%lPg9 diff --git a/packages/backend/server/src/core/utils/__tests__/blocksute.spec.ts b/packages/backend/server/src/core/utils/__tests__/blocksute.spec.ts index e337a07ce5..f7a126d4cc 100644 --- a/packages/backend/server/src/core/utils/__tests__/blocksute.spec.ts +++ b/packages/backend/server/src/core/utils/__tests__/blocksute.spec.ts @@ -44,12 +44,7 @@ test('can read all blocks from doc snapshot', async t => { const doc = await models.doc.get(workspace.id, docSnapshot.id); t.truthy(doc); - const result = await readAllBlocksFromDocSnapshot( - workspace.id, - 'doc-0', - docSnapshot.blob, - rootDoc!.blob - ); + const result = await readAllBlocksFromDocSnapshot('doc-0', docSnapshot.blob); t.snapshot({ ...result, @@ -64,11 +59,7 @@ test('can read blob filename from doc snapshot', async t => { snapshotFile: 'test-doc-with-blob.snapshot.bin', }); - const result = await readAllBlocksFromDocSnapshot( - workspace.id, - 'doc-0', - docSnapshot.blob - ); + const result = await readAllBlocksFromDocSnapshot('doc-0', docSnapshot.blob); // NOTE: avoid snapshot result directly, because it will cause hanging t.snapshot(JSON.parse(JSON.stringify(result))); @@ -78,11 +69,7 @@ test('can read all blocks from doc snapshot without workspace snapshot', async t const doc = await models.doc.get(workspace.id, docSnapshot.id); t.truthy(doc); - const result = await readAllBlocksFromDocSnapshot( - workspace.id, - 'doc-0', - docSnapshot.blob - ); + const result = await readAllBlocksFromDocSnapshot('doc-0', docSnapshot.blob); t.snapshot({ ...result, @@ -92,7 +79,6 @@ test('can read all blocks from doc snapshot without workspace snapshot', async t test('can parse doc to markdown from doc snapshot', async t => { const result = parseDocToMarkdownFromDocSnapshot( - workspace.id, docSnapshot.id, docSnapshot.blob ); @@ -102,7 +88,6 @@ test('can parse doc to markdown from doc snapshot', async t => { test('can parse doc to markdown from doc snapshot with ai editable', async t => { const result = parseDocToMarkdownFromDocSnapshot( - workspace.id, docSnapshot.id, docSnapshot.blob, true diff --git a/packages/backend/server/src/core/utils/blocksuite.ts b/packages/backend/server/src/core/utils/blocksuite.ts index d522660dac..fd12fedf33 100644 --- a/packages/backend/server/src/core/utils/blocksuite.ts +++ b/packages/backend/server/src/core/utils/blocksuite.ts @@ -1,18 +1,10 @@ -// TODO(@forehalo): -// Because of the `@affine/server` package can't import directly from workspace packages, -// this is a temporary solution to get the block suite data(title, description) from given yjs binary or yjs doc. -// The logic is mainly copied from -// - packages/frontend/core/src/modules/docs-search/worker/in-worker.ts -// - packages/frontend/core/src/components/page-list/use-block-suite-page-preview.ts -// and it's better to be provided by blocksuite +import { Array as YArray, Doc as YDoc, Map as YMap } from 'yjs'; -// eslint-disable-next-line @typescript-eslint/no-restricted-imports -- import from bundle import { - parsePageDoc as parseDocToMarkdown, - readAllBlocksFromDoc, + parseYDocFromBinary, + parseYDocToMarkdown, readAllDocIdsFromRootDoc, -} from '@affine/reader/dist'; -import { applyUpdate, Array as YArray, Doc as YDoc, Map as YMap } from 'yjs'; +} from '../../native'; export interface PageDocContent { title: string; @@ -165,64 +157,49 @@ export function parsePageDoc( } export function readAllDocIdsFromWorkspaceSnapshot(snapshot: Uint8Array) { - const rootDoc = new YDoc(); - applyUpdate(rootDoc, snapshot); - return readAllDocIdsFromRootDoc(rootDoc, { - includeTrash: false, - }); + return readAllDocIdsFromRootDoc(Buffer.from(snapshot), false); +} + +function safeParseJson(str: string): T | undefined { + try { + return JSON.parse(str) as T; + } catch { + return undefined; + } } export async function readAllBlocksFromDocSnapshot( - workspaceId: string, docId: string, - docSnapshot: Uint8Array, - workspaceSnapshot?: Uint8Array, - maxSummaryLength?: number + docSnapshot: Uint8Array ) { - let rootYDoc: YDoc | undefined; - if (workspaceSnapshot) { - rootYDoc = new YDoc({ - guid: workspaceId, - }); - applyUpdate(rootYDoc, workspaceSnapshot); - } - const ydoc = new YDoc({ - guid: docId, - }); - applyUpdate(ydoc, docSnapshot); - return await readAllBlocksFromDoc({ - ydoc, - rootYDoc, - spaceId: workspaceId, - maxSummaryLength, - }); + const result = parseYDocFromBinary(Buffer.from(docSnapshot), docId); + + return { + ...result, + blocks: result.blocks.map(block => ({ + ...block, + docId, + ref: block.refInfo, + additional: block.additional + ? safeParseJson(block.additional) + : undefined, + })), + }; } export function parseDocToMarkdownFromDocSnapshot( - workspaceId: string, docId: string, docSnapshot: Uint8Array, aiEditable = false ) { - const ydoc = new YDoc({ - guid: docId, - }); - applyUpdate(ydoc, docSnapshot); - - const parsed = parseDocToMarkdown({ - workspaceId, - doc: ydoc, - buildBlobUrl: (blobId: string) => { - return `/${workspaceId}/blobs/${blobId}`; - }, - buildDocUrl: (docId: string) => { - return `/workspace/${workspaceId}/${docId}`; - }, - aiEditable, - }); + const parsed = parseYDocToMarkdown( + Buffer.from(docSnapshot), + docId, + aiEditable + ); return { title: parsed.title, - markdown: parsed.md, + markdown: parsed.markdown, }; } diff --git a/packages/backend/server/src/native.ts b/packages/backend/server/src/native.ts index 9506cc7e09..b4b961e095 100644 --- a/packages/backend/server/src/native.ts +++ b/packages/backend/server/src/native.ts @@ -40,6 +40,10 @@ export function getTokenEncoder(model?: string | null): Tokenizer | null { export const getMime = serverNativeModule.getMime; export const parseDoc = serverNativeModule.parseDoc; export const htmlSanitize = serverNativeModule.htmlSanitize; +export const parseYDocFromBinary = serverNativeModule.parseDocFromBinary; +export const parseYDocToMarkdown = serverNativeModule.parseDocToMarkdown; +export const readAllDocIdsFromRootDoc = + serverNativeModule.readAllDocIdsFromRootDoc; export const AFFINE_PRO_PUBLIC_KEY = serverNativeModule.AFFINE_PRO_PUBLIC_KEY; export const AFFINE_PRO_LICENSE_AES_KEY = serverNativeModule.AFFINE_PRO_LICENSE_AES_KEY; diff --git a/packages/backend/server/src/plugins/indexer/service.ts b/packages/backend/server/src/plugins/indexer/service.ts index 52a2e0ac8a..09974bb2c9 100644 --- a/packages/backend/server/src/plugins/indexer/service.ts +++ b/packages/backend/server/src/plugins/indexer/service.ts @@ -227,15 +227,7 @@ export class IndexerService { this.logger.debug(`doc ${workspaceId}/${docId} is empty, skip indexing`); return; } - const MAX_WORKSPACE_SNAPSHOT_SIZE = 1024 * 1024 * 10; // 10MB - const result = await readAllBlocksFromDocSnapshot( - workspaceId, - docId, - docSnapshot.blob, - workspaceSnapshot.blob.length < MAX_WORKSPACE_SNAPSHOT_SIZE - ? workspaceSnapshot.blob - : undefined - ); + const result = await readAllBlocksFromDocSnapshot(docId, docSnapshot.blob); if (!result) { this.logger.warn( `parse doc ${workspaceId}/${docId} failed, workspaceSnapshot size: ${workspaceSnapshot.blob.length}, docSnapshot size: ${docSnapshot.blob.length}` @@ -277,7 +269,7 @@ export class IndexerService { additional: block.additional ? JSON.stringify(block.additional) : undefined, - markdownPreview: block.markdownPreview, + markdownPreview: undefined, createdByUserId: docSnapshot.createdBy ?? '', updatedByUserId: docSnapshot.updatedBy ?? '', createdAt: docSnapshot.createdAt, diff --git a/packages/backend/server/tsconfig.json b/packages/backend/server/tsconfig.json index fec2cae0e5..6997a939f7 100644 --- a/packages/backend/server/tsconfig.json +++ b/packages/backend/server/tsconfig.json @@ -12,7 +12,6 @@ }, "include": ["./src"], "references": [ - { "path": "../../common/reader" }, { "path": "../native" }, { "path": "../../../tools/cli" }, { "path": "../../../tools/utils" }, diff --git a/packages/common/native/src/doc_parser.rs b/packages/common/native/src/doc_parser.rs index 35ff68a397..699fa76f98 100644 --- a/packages/common/native/src/doc_parser.rs +++ b/packages/common/native/src/doc_parser.rs @@ -79,6 +79,245 @@ impl From for ParseError { } } +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MarkdownResult { + pub title: String, + pub markdown: String, +} + +pub fn parse_doc_to_markdown( + doc_bin: Vec, + doc_id: String, + ai_editable: bool, +) -> Result { + if doc_bin.is_empty() || doc_bin == [0, 0] { + return Err(ParseError::InvalidBinary); + } + + let mut doc = DocOptions::new().with_guid(doc_id.clone()).build(); + doc + .apply_update_from_binary_v1(&doc_bin) + .map_err(|_| ParseError::InvalidBinary)?; + + let blocks_map = doc.get_map("blocks")?; + if blocks_map.is_empty() { + return Ok(MarkdownResult { + title: "".into(), + markdown: "".into(), + }); + } + + let mut block_pool: HashMap = HashMap::new(); + let mut parent_lookup: HashMap = HashMap::new(); + + for (_, value) in blocks_map.iter() { + if let Some(block_map) = value.to_map() { + if let Some(block_id) = get_block_id(&block_map) { + for child_id in collect_child_ids(&block_map) { + parent_lookup.insert(child_id, block_id.clone()); + } + block_pool.insert(block_id, block_map); + } + } + } + + let root_block_id = block_pool + .iter() + .find_map(|(id, block)| { + get_flavour(block) + .filter(|flavour| flavour == PAGE_FLAVOUR) + .map(|_| id.clone()) + }) + .ok_or_else(|| ParseError::ParserError("root block not found".into()))?; + + let mut queue: Vec<(Option, String)> = vec![(None, root_block_id.clone())]; + let mut visited: HashSet = HashSet::from([root_block_id.clone()]); + let mut doc_title = String::from("Untitled"); + let mut markdown = String::new(); + + while let Some((parent_block_id, block_id)) = queue.pop() { + let block = match block_pool.get(&block_id) { + Some(block) => block, + None => continue, + }; + + let flavour = match get_flavour(block) { + Some(flavour) => flavour, + None => continue, + }; + + let parent_id = parent_lookup.get(&block_id); + let parent_flavour = parent_id + .and_then(|id| block_pool.get(id)) + .and_then(get_flavour); + + if parent_flavour.as_deref() == Some("affine:database") { + continue; + } + + // enqueue children first to keep traversal order similar to JS implementation + let mut child_ids = collect_child_ids(block); + for child_id in child_ids.drain(..).rev() { + if visited.insert(child_id.clone()) { + queue.push((Some(block_id.clone()), child_id)); + } + } + + if flavour == PAGE_FLAVOUR { + let title = get_string(block, "prop:title").unwrap_or_default(); + doc_title = title.clone(); + continue; + } + + if flavour == "affine:database" { + let title = get_string(block, "prop:title").unwrap_or_default(); + markdown.push_str(&format!("\n### {}\n", title)); + + let columns_array = block.get("prop:columns").and_then(|v| v.to_array()); + let cells_map = block.get("prop:cells").and_then(|v| v.to_map()); + + if let (Some(columns_array), Some(cells_map)) = (columns_array, cells_map) { + let mut columns = Vec::new(); + for col_val in columns_array.iter() { + if let Some(col_map) = col_val.to_map() { + let id = get_string(&col_map, "id").unwrap_or_default(); + let name = get_string(&col_map, "name").unwrap_or_default(); + let type_ = get_string(&col_map, "type").unwrap_or_default(); + let data = col_map.get("data").and_then(|v| v.to_map()); + columns.push((id, name, type_, data)); + } + } + + let escape_table = |s: &str| s.replace('|', "\\|").replace('\n', "
"); + + markdown.push('|'); + for (_, name, _, _) in &columns { + markdown.push_str(&escape_table(name)); + markdown.push('|'); + } + markdown.push('\n'); + + markdown.push('|'); + for _ in &columns { + markdown.push_str("---|"); + } + markdown.push('\n'); + + let child_ids = collect_child_ids(block); + for child_id in child_ids { + markdown.push('|'); + let row_cells = cells_map.get(&child_id).and_then(|v| v.to_map()); + + for (col_id, _, col_type, col_data) in &columns { + let mut cell_text = String::new(); + if col_type == "title" { + if let Some(child_block) = block_pool.get(&child_id) { + if let Some((text, _)) = text_content(child_block, "prop:text") { + cell_text = text; + } + } + } else if let Some(row_cells) = &row_cells { + if let Some(cell_val) = row_cells.get(col_id).and_then(|v| v.to_map()) { + if let Some(value) = cell_val.get("value").and_then(|v| v.to_any()) { + cell_text = format_cell_value(&value, col_type, col_data.as_ref()); + } + } + } + markdown.push_str(&escape_table(&cell_text)); + markdown.push('|'); + } + markdown.push('\n'); + } + } + continue; + } + + if flavour == "affine:table" { + let contents = gather_table_contents(block); + markdown.push_str(&contents.join("|")); + markdown.push('\n'); + continue; + } + + if ai_editable && parent_block_id.as_ref() == Some(&root_block_id) { + markdown.push_str(&format!( + "\n", + block_id, flavour + )); + } + + if flavour == "affine:paragraph" { + if let Some((text, _)) = text_content(block, "prop:text") { + let type_ = get_string(block, "prop:type").unwrap_or_default(); + let prefix = match type_.as_str() { + "h1" => "# ", + "h2" => "## ", + "h3" => "### ", + "h4" => "#### ", + "h5" => "##### ", + "h6" => "###### ", + "quote" => "> ", + _ => "", + }; + markdown.push_str(prefix); + markdown.push_str(&text); + markdown.push('\n'); + } + continue; + } + + if flavour == "affine:list" { + if let Some((text, _)) = text_content(block, "prop:text") { + let depth = get_list_depth(&block_id, &parent_lookup, &block_pool); + let indent = " ".repeat(depth); + markdown.push_str(&indent); + markdown.push_str("- "); + markdown.push_str(&text); + markdown.push('\n'); + } + continue; + } + + if flavour == "affine:code" { + if let Some((text, _)) = text_content(block, "prop:text") { + let lang = get_string(block, "prop:language").unwrap_or_default(); + markdown.push_str("```"); + markdown.push_str(&lang); + markdown.push('\n'); + markdown.push_str(&text); + markdown.push_str("\n```\n"); + } + continue; + } + } + + Ok(MarkdownResult { + title: doc_title, + markdown, + }) +} + +fn get_list_depth( + block_id: &str, + parent_lookup: &HashMap, + blocks: &HashMap, +) -> usize { + let mut depth = 0; + let mut current_id = block_id.to_string(); + + while let Some(parent_id) = parent_lookup.get(¤t_id) { + if let Some(parent_block) = blocks.get(parent_id) { + if get_flavour(parent_block).as_deref() == Some("affine:list") { + depth += 1; + current_id = parent_id.clone(); + continue; + } + } + break; + } + depth +} + pub fn parse_doc_from_binary(doc_bin: Vec, doc_id: String) -> Result { if doc_bin.is_empty() || doc_bin == [0, 0] { return Err(ParseError::InvalidBinary); @@ -284,6 +523,49 @@ pub fn parse_doc_from_binary(doc_bin: Vec, doc_id: String) -> Result, + include_trash: bool, +) -> Result, ParseError> { + if doc_bin.is_empty() || doc_bin == [0, 0] { + return Err(ParseError::InvalidBinary); + } + + let mut doc = DocOptions::new().build(); + doc + .apply_update_from_binary_v1(&doc_bin) + .map_err(|_| ParseError::InvalidBinary)?; + + let meta = doc.get_map("meta")?; + let pages = match meta.get("pages").and_then(|v| v.to_array()) { + Some(arr) => arr, + None => return Ok(vec![]), + }; + + let mut doc_ids = Vec::new(); + for page_val in pages.iter() { + if let Some(page) = page_val.to_map() { + let id = get_string(&page, "id"); + if let Some(id) = id { + let trash = page + .get("trash") + .and_then(|v| match v.to_any() { + Some(Any::True) => Some(true), + Some(Any::False) => Some(false), + _ => None, + }) + .unwrap_or(false); + + if include_trash || !trash { + doc_ids.push(id); + } + } + } + } + + Ok(doc_ids) +} + fn collect_child_ids(block: &Map) -> Vec { block .get("sys:children") @@ -454,6 +736,56 @@ fn gather_table_contents(block: &Map) -> Vec { contents } +fn format_cell_value(value: &Any, col_type: &str, col_data: Option<&Map>) -> String { + match col_type { + "select" => { + if let Any::String(id) = value { + if let Some(options) = col_data + .and_then(|d| d.get("options")) + .and_then(|v| v.to_array()) + { + for opt in options.iter() { + if let Some(opt_map) = opt.to_map() { + if let Some(opt_id) = get_string(&opt_map, "id") { + if opt_id == *id { + return get_string(&opt_map, "value").unwrap_or_default(); + } + } + } + } + } + } + String::new() + } + "multi-select" => { + if let Any::Array(ids) = value { + let mut selected = Vec::new(); + if let Some(options) = col_data + .and_then(|d| d.get("options")) + .and_then(|v| v.to_array()) + { + for id_val in ids.iter() { + if let Any::String(id) = id_val { + for opt in options.iter() { + if let Some(opt_map) = opt.to_map() { + if let Some(opt_id) = get_string(&opt_map, "id") { + if opt_id == *id { + selected.push(get_string(&opt_map, "value").unwrap_or_default()); + } + } + } + } + } + } + } + return selected.join(", "); + } + String::new() + } + _ => any_to_string(value).unwrap_or_default(), + } +} + fn value_to_string(value: &Value) -> Option { if let Some(text) = value.to_text() { return Some(text.to_string()); diff --git a/tools/utils/src/workspace.gen.ts b/tools/utils/src/workspace.gen.ts index 34ce1e32fb..15c99b4f05 100644 --- a/tools/utils/src/workspace.gen.ts +++ b/tools/utils/src/workspace.gen.ts @@ -1166,7 +1166,6 @@ export const PackageList = [ location: 'packages/backend/server', name: '@affine/server', workspaceDependencies: [ - 'packages/common/reader', 'packages/backend/native', 'tools/cli', 'tools/utils', diff --git a/yarn.lock b/yarn.lock index f7092c1bf3..39b6ef4db1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -913,7 +913,6 @@ __metadata: "@affine-tools/cli": "workspace:*" "@affine-tools/utils": "workspace:*" "@affine/graphql": "workspace:*" - "@affine/reader": "workspace:*" "@affine/server-native": "workspace:*" "@ai-sdk/anthropic": "npm:^2.0.54" "@ai-sdk/google": "npm:^2.0.45" @@ -1231,6 +1230,24 @@ __metadata: languageName: node linkType: hard +"@apm-js-collab/code-transformer@npm:^0.8.0": + version: 0.8.2 + resolution: "@apm-js-collab/code-transformer@npm:0.8.2" + checksum: 10/ff4b8fea9a27ef4e82a0a022bececfa9966e5e2a4ae1e6ca0b31f4a2bbc6d79f5bd1257f281ed8a90900d693e1a88a79c42982eabe7ca999b267d5d69c57393f + languageName: node + linkType: hard + +"@apm-js-collab/tracing-hooks@npm:^0.3.1": + version: 0.3.1 + resolution: "@apm-js-collab/tracing-hooks@npm:0.3.1" + dependencies: + "@apm-js-collab/code-transformer": "npm:^0.8.0" + debug: "npm:^4.4.1" + module-details-from-path: "npm:^1.0.4" + checksum: 10/0af2220168d4fc2700ec577632eac066f756c3aaa34ef2e833ea4725abb80f7486c1a585a93e8f0d8304c51192f63c53e7ddd70290abac489a734f9693359f7f + languageName: node + linkType: hard + "@apollo/cache-control-types@npm:^1.0.3": version: 1.0.3 resolution: "@apollo/cache-control-types@npm:1.0.3" @@ -10602,65 +10619,65 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.5.4": - version: 15.5.4 - resolution: "@next/env@npm:15.5.4" - checksum: 10/0727ef6dbb15c04d85119e3d4b28e000ca0a4dbb8bce46b2657181776545912181c74dd370e75ea8157bffbaf33bc687bd34c49b33e0b3a598c22295892ae1d9 +"@next/env@npm:15.5.9": + version: 15.5.9 + resolution: "@next/env@npm:15.5.9" + checksum: 10/962329701343c2617c85ae99ef35adfd9e8f7b58d9c0316f2f0857f82875a91ef3151ef0743c50964b0066aa3d1214c5193cf229f7757d7c9329f7fb95605a4a languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.5.4": - version: 15.5.4 - resolution: "@next/swc-darwin-arm64@npm:15.5.4" +"@next/swc-darwin-arm64@npm:15.5.7": + version: 15.5.7 + resolution: "@next/swc-darwin-arm64@npm:15.5.7" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.5.4": - version: 15.5.4 - resolution: "@next/swc-darwin-x64@npm:15.5.4" +"@next/swc-darwin-x64@npm:15.5.7": + version: 15.5.7 + resolution: "@next/swc-darwin-x64@npm:15.5.7" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.5.4": - version: 15.5.4 - resolution: "@next/swc-linux-arm64-gnu@npm:15.5.4" +"@next/swc-linux-arm64-gnu@npm:15.5.7": + version: 15.5.7 + resolution: "@next/swc-linux-arm64-gnu@npm:15.5.7" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.5.4": - version: 15.5.4 - resolution: "@next/swc-linux-arm64-musl@npm:15.5.4" +"@next/swc-linux-arm64-musl@npm:15.5.7": + version: 15.5.7 + resolution: "@next/swc-linux-arm64-musl@npm:15.5.7" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.5.4": - version: 15.5.4 - resolution: "@next/swc-linux-x64-gnu@npm:15.5.4" +"@next/swc-linux-x64-gnu@npm:15.5.7": + version: 15.5.7 + resolution: "@next/swc-linux-x64-gnu@npm:15.5.7" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.5.4": - version: 15.5.4 - resolution: "@next/swc-linux-x64-musl@npm:15.5.4" +"@next/swc-linux-x64-musl@npm:15.5.7": + version: 15.5.7 + resolution: "@next/swc-linux-x64-musl@npm:15.5.7" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.5.4": - version: 15.5.4 - resolution: "@next/swc-win32-arm64-msvc@npm:15.5.4" +"@next/swc-win32-arm64-msvc@npm:15.5.7": + version: 15.5.7 + resolution: "@next/swc-win32-arm64-msvc@npm:15.5.7" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.5.4": - version: 15.5.4 - resolution: "@next/swc-win32-x64-msvc@npm:15.5.4" +"@next/swc-win32-x64-msvc@npm:15.5.7": + version: 15.5.7 + resolution: "@next/swc-win32-x64-msvc@npm:15.5.7" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -11216,15 +11233,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/api-logs@npm:0.204.0": - version: 0.204.0 - resolution: "@opentelemetry/api-logs@npm:0.204.0" - dependencies: - "@opentelemetry/api": "npm:^1.3.0" - checksum: 10/698d04b3fc014ec68b5571ef5bebb9c276e290035f060aae6c2554410115d42d41ad41255a809bde4ca26e32bc833dba413c1d90dcda624c6c0307c309ba9d08 - languageName: node - linkType: hard - "@opentelemetry/api-logs@npm:0.208.0": version: 0.208.0 resolution: "@opentelemetry/api-logs@npm:0.208.0" @@ -11234,15 +11242,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/api-logs@npm:0.57.2": - version: 0.57.2 - resolution: "@opentelemetry/api-logs@npm:0.57.2" - dependencies: - "@opentelemetry/api": "npm:^1.3.0" - checksum: 10/8e3bac962e8f1fc93bfee6b433121bd2e07e8a8d1b86ef0d9d4a2c54d1759b64c74cf5da400f82f5ab5a4fe0da481726d8635fd1b15d123cf43090fa0adb8ea8 - languageName: node - linkType: hard - "@opentelemetry/api@npm:1.9.0, @opentelemetry/api@npm:^1.3.0, @opentelemetry/api@npm:^1.9.0": version: 1.9.0 resolution: "@opentelemetry/api@npm:1.9.0" @@ -11250,7 +11249,7 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/context-async-hooks@npm:2.2.0, @opentelemetry/context-async-hooks@npm:^2.1.0": +"@opentelemetry/context-async-hooks@npm:2.2.0, @opentelemetry/context-async-hooks@npm:^2.2.0": version: 2.2.0 resolution: "@opentelemetry/context-async-hooks@npm:2.2.0" peerDependencies: @@ -11259,18 +11258,7 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/core@npm:2.1.0": - version: 2.1.0 - resolution: "@opentelemetry/core@npm:2.1.0" - dependencies: - "@opentelemetry/semantic-conventions": "npm:^1.29.0" - peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.10.0" - checksum: 10/735bd1fe8a099c3aa3d7640875a5b30ab304f7e3b13efd622daabe47ff5470e9c453ad9fc119a5a0c0458ec2c7753f9a066afa32a269745b06b429ba7db90516 - languageName: node - linkType: hard - -"@opentelemetry/core@npm:2.2.0, @opentelemetry/core@npm:^2.0.0, @opentelemetry/core@npm:^2.1.0, @opentelemetry/core@npm:^2.2.0": +"@opentelemetry/core@npm:2.2.0, @opentelemetry/core@npm:^2.0.0, @opentelemetry/core@npm:^2.2.0": version: 2.2.0 resolution: "@opentelemetry/core@npm:2.2.0" dependencies: @@ -11463,92 +11451,80 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/instrumentation-amqplib@npm:0.51.0": - version: 0.51.0 - resolution: "@opentelemetry/instrumentation-amqplib@npm:0.51.0" +"@opentelemetry/instrumentation-amqplib@npm:0.55.0": + version: 0.55.0 + resolution: "@opentelemetry/instrumentation-amqplib@npm:0.55.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.204.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/be46037ebe797cff15785bf95ce93b8a95984b4cfd2329401d9c5ee0f3a488a9601ee259ca5e104a73a8677639fa8658d9111a356c45ada6b0f35a9271314167 + checksum: 10/03e028c4dfe9a8a9372f6ef6d4c4520343a3ec571e2e04dcd29e684cf25d212f6331be268656006220b476f6b46748aba2d142b7b4c62efd24baebf6a3f1b77b languageName: node linkType: hard -"@opentelemetry/instrumentation-connect@npm:0.48.0": - version: 0.48.0 - resolution: "@opentelemetry/instrumentation-connect@npm:0.48.0" +"@opentelemetry/instrumentation-connect@npm:0.52.0": + version: 0.52.0 + resolution: "@opentelemetry/instrumentation-connect@npm:0.52.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.204.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.27.0" "@types/connect": "npm:3.4.38" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/289edf6d1108f1fb7e9937d0be62fbf44879716c53addd226862c1ae4dedfe030961f8052248485177ae950382046b7c00cc50512f3a195a1c285f4c455dca81 + checksum: 10/c526768a10a4f6c76b791e382edeae2217a7b3c448b1a3458ef34ca46a645b6cf67eeec79bae119e2005f5d766c8eabc03b16058da6e94300110d029157e7e95 languageName: node linkType: hard -"@opentelemetry/instrumentation-dataloader@npm:0.22.0": - version: 0.22.0 - resolution: "@opentelemetry/instrumentation-dataloader@npm:0.22.0" +"@opentelemetry/instrumentation-dataloader@npm:0.26.0": + version: 0.26.0 + resolution: "@opentelemetry/instrumentation-dataloader@npm:0.26.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.204.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/8e15a6c5e5720819fccf406cc847c104d0364ad85a1561f8f96087cd13b5555b33b6c07403a83ef7fd02de29f090b6e7171efded1dd52583b6d6567f047f62ab + checksum: 10/e3efde5515698fc25437d4e347cc829da1f82df95c0523149913030b53e4a359577ee988b66d5b0a3bd8230697cd785e983176c0b4bb14d001c64c8948d46c10 languageName: node linkType: hard -"@opentelemetry/instrumentation-express@npm:0.53.0": - version: 0.53.0 - resolution: "@opentelemetry/instrumentation-express@npm:0.53.0" +"@opentelemetry/instrumentation-express@npm:0.57.0": + version: 0.57.0 + resolution: "@opentelemetry/instrumentation-express@npm:0.57.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.204.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.27.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/30a354dde6c498ac82ee5423965a03e2f31e7ae82687b4135bbb20d967e066eb1accd6ca8a60da1e4cf2be8dfe6d07c413ead7fd89e166c36e7da92645e4493c + checksum: 10/66c10e878433d0e90bbf88dfbf28b23ecdbc3777326f46548c16c5062118b37c623011cef390a5ed3de2855f67f91587703581846f4e1e702ff3a068404f3e89 languageName: node linkType: hard -"@opentelemetry/instrumentation-fs@npm:0.24.0": - version: 0.24.0 - resolution: "@opentelemetry/instrumentation-fs@npm:0.24.0" +"@opentelemetry/instrumentation-fs@npm:0.28.0": + version: 0.28.0 + resolution: "@opentelemetry/instrumentation-fs@npm:0.28.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.204.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/9ccb9b9bb79bb8a372a42b8544e84f9e18dab5a1b128b891857e3186da67668493666b551c7909d27479003b73979ad85060f1d67cf1e5b1b01dc3810e47ea83 + checksum: 10/f62c1256e3c47d958b296b57f8ab1d0b8b8851e9c3d6ad8691af514a33a2341ec1a9345d57a705a420a7a5757a297e03cc04c497a5701ac027a98b63b1a90ab1 languageName: node linkType: hard -"@opentelemetry/instrumentation-generic-pool@npm:0.48.0": - version: 0.48.0 - resolution: "@opentelemetry/instrumentation-generic-pool@npm:0.48.0" - dependencies: - "@opentelemetry/instrumentation": "npm:^0.204.0" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/4827243b033e70fd8e62e8453b0932302dc6e2638123a47968661c8cab94a87e6149fe81160f75940bf3ab4e45b400fb3e61babd1e52fea219fa502668da220c - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-graphql@npm:0.52.0": +"@opentelemetry/instrumentation-generic-pool@npm:0.52.0": version: 0.52.0 - resolution: "@opentelemetry/instrumentation-graphql@npm:0.52.0" + resolution: "@opentelemetry/instrumentation-generic-pool@npm:0.52.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.204.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/8f4226237a492928d48750110d548f40c3fa2e2ecb42fcf977bc6cc188afbbb646fad673b3ecb2d21eab28415ee31b1d23afe27e5e2ebdaf17e89b6bf44aff0f + checksum: 10/f94b27d84a4172f95f7a33fa967f2ad562d4dba3182b1e8b6658b4eceb8a26a678b407a232858378a034dd8ffdb4e66bd98b4a8861fe042be59af3e4b400244f languageName: node linkType: hard -"@opentelemetry/instrumentation-graphql@npm:^0.56.0": +"@opentelemetry/instrumentation-graphql@npm:0.56.0, @opentelemetry/instrumentation-graphql@npm:^0.56.0": version: 0.56.0 resolution: "@opentelemetry/instrumentation-graphql@npm:0.56.0" dependencies: @@ -11559,34 +11535,20 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/instrumentation-hapi@npm:0.51.0": - version: 0.51.0 - resolution: "@opentelemetry/instrumentation-hapi@npm:0.51.0" +"@opentelemetry/instrumentation-hapi@npm:0.55.0": + version: 0.55.0 + resolution: "@opentelemetry/instrumentation-hapi@npm:0.55.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.204.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.27.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/e098437a63807ec288c9e139554ac866909aac2c5da483a9d981f6f2bec33b4b28f73a1b04a2a069870998c2c32eaf68572c6bce3992de0f0b6c09a7e6da1b23 + checksum: 10/575c059a2dbcd77256acfca897d2cc08968b4e7e9e41449dfd5de2ca761fa2a544aaa6f2a8213f7374a42026e1f0b7e612ce01337e43108631e20e19fec01c81 languageName: node linkType: hard -"@opentelemetry/instrumentation-http@npm:0.204.0": - version: 0.204.0 - resolution: "@opentelemetry/instrumentation-http@npm:0.204.0" - dependencies: - "@opentelemetry/core": "npm:2.1.0" - "@opentelemetry/instrumentation": "npm:0.204.0" - "@opentelemetry/semantic-conventions": "npm:^1.29.0" - forwarded-parse: "npm:2.1.2" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/ce62b8a829293b9e584ecee317d5639f621588f7740b7fc21140d7aa831e7ea298d00e6cc87b95c63d80294387a7f236eb9d4e57124f12b28437c8dd4e82e944 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-http@npm:^0.208.0": +"@opentelemetry/instrumentation-http@npm:0.208.0, @opentelemetry/instrumentation-http@npm:^0.208.0": version: 0.208.0 resolution: "@opentelemetry/instrumentation-http@npm:0.208.0" dependencies: @@ -11600,20 +11562,7 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/instrumentation-ioredis@npm:0.52.0": - version: 0.52.0 - resolution: "@opentelemetry/instrumentation-ioredis@npm:0.52.0" - dependencies: - "@opentelemetry/instrumentation": "npm:^0.204.0" - "@opentelemetry/redis-common": "npm:^0.38.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/65eb7aa6db4b84b460f264e2ee4c0cdbd3701a818e11c08b2bccf498795bea8e8be4bbf9519c8e7b8043563fd2f3699f57875854bc27be3236f326de3792a292 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-ioredis@npm:^0.56.0": +"@opentelemetry/instrumentation-ioredis@npm:0.56.0, @opentelemetry/instrumentation-ioredis@npm:^0.56.0": version: 0.56.0 resolution: "@opentelemetry/instrumentation-ioredis@npm:0.56.0" dependencies: @@ -11625,102 +11574,99 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/instrumentation-kafkajs@npm:0.14.0": - version: 0.14.0 - resolution: "@opentelemetry/instrumentation-kafkajs@npm:0.14.0" +"@opentelemetry/instrumentation-kafkajs@npm:0.18.0": + version: 0.18.0 + resolution: "@opentelemetry/instrumentation-kafkajs@npm:0.18.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.204.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.30.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/488b0e7f42392a47dfbce3d1e728b34873793ee239c2646f9dffe1ecc9b1e2ea4337145cb5e4bcaa77a81899062ef586a6b3f391b4b4b49249529f29b871b053 + checksum: 10/e3b998d905dc6c87b542e6b7004e12eeac19903872fe3e7d4c17771f69843b721dd73d0b136b2f21207d4dec7e53fd17d5042cf27a0028ec3c3074c0861654fe languageName: node linkType: hard -"@opentelemetry/instrumentation-knex@npm:0.49.0": - version: 0.49.0 - resolution: "@opentelemetry/instrumentation-knex@npm:0.49.0" +"@opentelemetry/instrumentation-knex@npm:0.53.0": + version: 0.53.0 + resolution: "@opentelemetry/instrumentation-knex@npm:0.53.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.204.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.33.1" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/d4802b024dd2e49e63a65567fe3d6b8a6048c5cd70fb78a78134c56568496c8fc10ef867039f9525cabb5f9c06bb7e8ff07651bb5a15b89bdc0fb70a4cc5c96c + checksum: 10/70506c24957374276ef63a18d103fb74a37888ffeb9c1c6b6419a3abcf970d4c8dfed3129ca840f71f1207e246c7bc337d3bc4ab249b1a1c67dfc854dd7da7fd languageName: node linkType: hard -"@opentelemetry/instrumentation-koa@npm:0.52.0": - version: 0.52.0 - resolution: "@opentelemetry/instrumentation-koa@npm:0.52.0" - dependencies: - "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.204.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/88a444bd92c3e1906167820e63e40bfe6531f54c28a8aacec51e2d527465818c002a5dfe72fbc1709cac6f6b4f5a0d01e798c4089731b0ec1b28fe94b9a729de - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-lru-memoizer@npm:0.49.0": - version: 0.49.0 - resolution: "@opentelemetry/instrumentation-lru-memoizer@npm:0.49.0" - dependencies: - "@opentelemetry/instrumentation": "npm:^0.204.0" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/8aaad4a276ab9a754ceca28767261c930be98de728e9fab68ff304b2e6839b6d32c8e48984ff868499bf34765da76ee2e44bb98c54317fc904aed3480fecfd4b - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-mongodb@npm:0.57.0": +"@opentelemetry/instrumentation-koa@npm:0.57.0": version: 0.57.0 - resolution: "@opentelemetry/instrumentation-mongodb@npm:0.57.0" - dependencies: - "@opentelemetry/instrumentation": "npm:^0.204.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/f6e20ee84c83cb2f9752e198f106c5b7008b4e530c0207863723967008d9741987862cf8cc2a6d8853041c99f029d0d4d80fdf20ed6048eb782ec502bb730888 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation-mongoose@npm:0.51.0": - version: 0.51.0 - resolution: "@opentelemetry/instrumentation-mongoose@npm:0.51.0" + resolution: "@opentelemetry/instrumentation-koa@npm:0.57.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.204.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" + "@opentelemetry/semantic-conventions": "npm:^1.36.0" peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/1c6d99a58cbedc8efa921411db62a8f756dd730cd5d0419b4073336c2b2f04d8e230665d5e54be200130caa7f0d55d37ba6514acbfafcc74f95c0035906a4556 + "@opentelemetry/api": ^1.9.0 + checksum: 10/7df972b4a5c6c8cad6e1fe6ab3a6ea391d4db09f0d3e2b0b46f0ffa0289df88fe2446e06c08744d65293aeaff2f28628d51f8dea5d97404907a49f9e567f50f6 languageName: node linkType: hard -"@opentelemetry/instrumentation-mysql2@npm:0.51.0": - version: 0.51.0 - resolution: "@opentelemetry/instrumentation-mysql2@npm:0.51.0" +"@opentelemetry/instrumentation-lru-memoizer@npm:0.53.0": + version: 0.53.0 + resolution: "@opentelemetry/instrumentation-lru-memoizer@npm:0.53.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.204.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" - "@opentelemetry/sql-common": "npm:^0.41.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/dab850b1a7a6f0a90e319c16a657218f366d9d06d8a78b1678f78b663db121a723276fe649e41cd67b3f36ff516efe5df8b13f684d989f1df94bf7137c05635d + checksum: 10/6f83abdb58e83fe87ce926236c54fbaaf49f64f8149e455b1dc1f33d735faf575e6f6d4df36b8eadf176a74d01cd05c6f3a3babff56a5a7448744e0cba39df5e languageName: node linkType: hard -"@opentelemetry/instrumentation-mysql@npm:0.50.0": - version: 0.50.0 - resolution: "@opentelemetry/instrumentation-mysql@npm:0.50.0" +"@opentelemetry/instrumentation-mongodb@npm:0.61.0": + version: 0.61.0 + resolution: "@opentelemetry/instrumentation-mongodb@npm:0.61.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.204.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/fe5eb79c8924aa268c863af4a5878c47ba5730622cb861899802144a4dfe7431e7af6e9b568dd205fdedfd77fbbfe95539cdcf35e6b326ba695eeaadd61240ed + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-mongoose@npm:0.55.0": + version: 0.55.0 + resolution: "@opentelemetry/instrumentation-mongoose@npm:0.55.0" + dependencies: + "@opentelemetry/core": "npm:^2.0.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/5ee25946b7a6a50178ff6b50d5a88b8a189f0ba6effc45ee07e6026c353b1cad605f51cb9c61f9200e066833a7f3b588ede02582dc7dbbce4a9d715ec312cea6 + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-mysql2@npm:0.55.0": + version: 0.55.0 + resolution: "@opentelemetry/instrumentation-mysql2@npm:0.55.0" + dependencies: + "@opentelemetry/instrumentation": "npm:^0.208.0" + "@opentelemetry/semantic-conventions": "npm:^1.33.0" + "@opentelemetry/sql-common": "npm:^0.41.2" + peerDependencies: + "@opentelemetry/api": ^1.3.0 + checksum: 10/ca5bb6c99bd8fd3590341955aeece3c69982e07b2df520998ea282ac9135311f8fc37ba55fb66adf07a80adcf98d42892b698422c9817667231064cc251e626d + languageName: node + linkType: hard + +"@opentelemetry/instrumentation-mysql@npm:0.54.0": + version: 0.54.0 + resolution: "@opentelemetry/instrumentation-mysql@npm:0.54.0" + dependencies: + "@opentelemetry/instrumentation": "npm:^0.208.0" "@types/mysql": "npm:2.15.27" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/c615b692e86e51d15f5e0c10669019e0d9cb728a175bda7d2e3ab7df07cb65f872f63f9c01843b3dc5a630379a2ccfaafc3a7c0396f09de7b025a891d5794ce4 + checksum: 10/d4756b4d72c0232f92fc00fd8fb03d02fe27d9108c8c74ae1d8aa50800207f7e6dc10aa8f5a636d9b6c8865b10e10a79741242c08af4d4f0599977182b7508ae languageName: node linkType: hard @@ -11736,32 +11682,32 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/instrumentation-pg@npm:0.57.0": - version: 0.57.0 - resolution: "@opentelemetry/instrumentation-pg@npm:0.57.0" +"@opentelemetry/instrumentation-pg@npm:0.61.0": + version: 0.61.0 + resolution: "@opentelemetry/instrumentation-pg@npm:0.61.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.204.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@opentelemetry/semantic-conventions": "npm:^1.34.0" - "@opentelemetry/sql-common": "npm:^0.41.0" - "@types/pg": "npm:8.15.5" + "@opentelemetry/sql-common": "npm:^0.41.2" + "@types/pg": "npm:8.15.6" "@types/pg-pool": "npm:2.0.6" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/7ebaa287c1da8b6c0183e42f7bdc05fda99ad0e046208361fba173da8831ce0645b245c3c4c9ffdc234cc4c96c04622424e91f2cf18ff2d29b7d0f9ce3b7fc6e + checksum: 10/84825695303d79720a87622bfb0bcbc6c46463a595a36d7fb611684bfb23df9645ff17780b60a00cc97a78e70ef109603fc473b2cefd91a7099b14d2d93fdb56 languageName: node linkType: hard -"@opentelemetry/instrumentation-redis@npm:0.53.0": - version: 0.53.0 - resolution: "@opentelemetry/instrumentation-redis@npm:0.53.0" +"@opentelemetry/instrumentation-redis@npm:0.57.0": + version: 0.57.0 + resolution: "@opentelemetry/instrumentation-redis@npm:0.57.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.204.0" - "@opentelemetry/redis-common": "npm:^0.38.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" + "@opentelemetry/redis-common": "npm:^0.38.2" "@opentelemetry/semantic-conventions": "npm:^1.27.0" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/606c8877819c99d62266a106fa15703316fb703a60dd82e4995ebf33d892fecea35e6f4457a56f218b29adac8f573bf5a5437feeb406fb65002e65ed70ee178a + checksum: 10/171f5e57d0141088f8e4cdb8f744226d7999ca045842708e65c8b784f53a41e25a7248f22382bf1b4a80b6fa1cc4c41658502bb15340b3fa2c22f2e9db8b76e0 languageName: node linkType: hard @@ -11776,45 +11722,32 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/instrumentation-tedious@npm:0.23.0": - version: 0.23.0 - resolution: "@opentelemetry/instrumentation-tedious@npm:0.23.0" +"@opentelemetry/instrumentation-tedious@npm:0.27.0": + version: 0.27.0 + resolution: "@opentelemetry/instrumentation-tedious@npm:0.27.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.204.0" - "@opentelemetry/semantic-conventions": "npm:^1.27.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" "@types/tedious": "npm:^4.0.14" peerDependencies: "@opentelemetry/api": ^1.3.0 - checksum: 10/00d922782c709dbc6e9fdaa77197423f76707904a71a920d60642f669e496f37b64a6376609bfafcda4d0778cdab15b161a56426a20fb1a5c24a131c9d2db8a5 + checksum: 10/453492b72cf16b855da1a4ba38b9619261ef77ed4afe8ae551c0abc529c81c8640d816934aae197fa719e8e79591613d2398a8a7f3b77c82de41bf51db3eebfc languageName: node linkType: hard -"@opentelemetry/instrumentation-undici@npm:0.15.0": - version: 0.15.0 - resolution: "@opentelemetry/instrumentation-undici@npm:0.15.0" +"@opentelemetry/instrumentation-undici@npm:0.19.0": + version: 0.19.0 + resolution: "@opentelemetry/instrumentation-undici@npm:0.19.0" dependencies: "@opentelemetry/core": "npm:^2.0.0" - "@opentelemetry/instrumentation": "npm:^0.204.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" + "@opentelemetry/semantic-conventions": "npm:^1.24.0" peerDependencies: "@opentelemetry/api": ^1.7.0 - checksum: 10/5190d2e08785e05c92815e2b1db5d85d7427fc1c7c4529ffb7a076793e8ac71117b8f9007f42ddd22565147dfee5b2d2d3b0e8237d46f2b83d48dd1a353e2c11 + checksum: 10/862ea5e49c2cf38c7a135f5ea6a95f1b8ca009620f9b0e4d6c7ffb69e8e1d4e7d4169e4cf0cd2af4ce574864b37ea3f7c039b0e6600d3e490f3c263a8647325e languageName: node linkType: hard -"@opentelemetry/instrumentation@npm:0.204.0, @opentelemetry/instrumentation@npm:^0.204.0": - version: 0.204.0 - resolution: "@opentelemetry/instrumentation@npm:0.204.0" - dependencies: - "@opentelemetry/api-logs": "npm:0.204.0" - import-in-the-middle: "npm:^1.8.1" - require-in-the-middle: "npm:^7.1.1" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/a32b93e714e555dc1fca6c212bde565342370f0f62c1421e02cb307193ced1f8167223b3b70adc6e4539bf8508424f56b7249ecb527995406944434b29b73066 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation@npm:0.208.0, @opentelemetry/instrumentation@npm:^0.208.0": +"@opentelemetry/instrumentation@npm:0.208.0, @opentelemetry/instrumentation@npm:>=0.52.0 <1, @opentelemetry/instrumentation@npm:^0.208.0": version: 0.208.0 resolution: "@opentelemetry/instrumentation@npm:0.208.0" dependencies: @@ -11827,22 +11760,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/instrumentation@npm:^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0": - version: 0.57.2 - resolution: "@opentelemetry/instrumentation@npm:0.57.2" - dependencies: - "@opentelemetry/api-logs": "npm:0.57.2" - "@types/shimmer": "npm:^1.2.0" - import-in-the-middle: "npm:^1.8.1" - require-in-the-middle: "npm:^7.1.1" - semver: "npm:^7.5.2" - shimmer: "npm:^1.2.1" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10/b66b840e87976a5edf551a7011a395df8df5985571ac0506412943d07b4309fcc78fe71d3f55217a00f44384fbf61f59f1e54d544ab12f5490f6a7a56b71e02a - languageName: node - linkType: hard - "@opentelemetry/otlp-exporter-base@npm:0.208.0": version: 0.208.0 resolution: "@opentelemetry/otlp-exporter-base@npm:0.208.0" @@ -11908,14 +11825,14 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/redis-common@npm:^0.38.0, @opentelemetry/redis-common@npm:^0.38.2": +"@opentelemetry/redis-common@npm:^0.38.2": version: 0.38.2 resolution: "@opentelemetry/redis-common@npm:0.38.2" checksum: 10/2a4f992572b1990a407ac92c7db941aecb6e8d71f034f4ea0b00b2b1739ad07c22767198a6759ab634cbbe9eebfbea062e2b79a25484289c226c665558041503 languageName: node linkType: hard -"@opentelemetry/resources@npm:2.2.0, @opentelemetry/resources@npm:^2.1.0, @opentelemetry/resources@npm:^2.2.0": +"@opentelemetry/resources@npm:2.2.0, @opentelemetry/resources@npm:^2.2.0": version: 2.2.0 resolution: "@opentelemetry/resources@npm:2.2.0" dependencies: @@ -11984,7 +11901,7 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sdk-trace-base@npm:2.2.0, @opentelemetry/sdk-trace-base@npm:^2.1.0": +"@opentelemetry/sdk-trace-base@npm:2.2.0, @opentelemetry/sdk-trace-base@npm:^2.2.0": version: 2.2.0 resolution: "@opentelemetry/sdk-trace-base@npm:2.2.0" dependencies: @@ -12010,14 +11927,14 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/semantic-conventions@npm:^1.22.0, @opentelemetry/semantic-conventions@npm:^1.27.0, @opentelemetry/semantic-conventions@npm:^1.29.0, @opentelemetry/semantic-conventions@npm:^1.30.0, @opentelemetry/semantic-conventions@npm:^1.33.1, @opentelemetry/semantic-conventions@npm:^1.34.0, @opentelemetry/semantic-conventions@npm:^1.37.0, @opentelemetry/semantic-conventions@npm:^1.38.0": +"@opentelemetry/semantic-conventions@npm:^1.22.0, @opentelemetry/semantic-conventions@npm:^1.24.0, @opentelemetry/semantic-conventions@npm:^1.27.0, @opentelemetry/semantic-conventions@npm:^1.29.0, @opentelemetry/semantic-conventions@npm:^1.30.0, @opentelemetry/semantic-conventions@npm:^1.33.0, @opentelemetry/semantic-conventions@npm:^1.33.1, @opentelemetry/semantic-conventions@npm:^1.34.0, @opentelemetry/semantic-conventions@npm:^1.36.0, @opentelemetry/semantic-conventions@npm:^1.37.0, @opentelemetry/semantic-conventions@npm:^1.38.0": version: 1.38.0 resolution: "@opentelemetry/semantic-conventions@npm:1.38.0" checksum: 10/9d549f4896e900f644d5e70dd7142505daff88ed83c1cb7bcd976ac55e9496d4ddd686bb2815dd68655c739950514394c3b73ff51e53b2e4ff2d54a7f6d22521 languageName: node linkType: hard -"@opentelemetry/sql-common@npm:^0.41.0": +"@opentelemetry/sql-common@npm:^0.41.2": version: 0.41.2 resolution: "@opentelemetry/sql-common@npm:0.41.2" dependencies: @@ -12304,14 +12221,14 @@ __metadata: languageName: node linkType: hard -"@prisma/instrumentation@npm:6.15.0, @prisma/instrumentation@npm:^6.7.0": - version: 6.15.0 - resolution: "@prisma/instrumentation@npm:6.15.0" +"@prisma/instrumentation@npm:6.19.0, @prisma/instrumentation@npm:^6.7.0": + version: 6.19.0 + resolution: "@prisma/instrumentation@npm:6.19.0" dependencies: - "@opentelemetry/instrumentation": "npm:^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0" + "@opentelemetry/instrumentation": "npm:>=0.52.0 <1" peerDependencies: "@opentelemetry/api": ^1.8 - checksum: 10/25f69e3ea581b0cfa058c80acde5e5382d3b5d48e213654c011ab61909dd6311c17235dd26fa36c4e91d620f8ab49f1190732d6a48bbeec545e0664e1e1f86dc + checksum: 10/9d63362f4a4cd52f956d672e32bc8ad54619675e14cd33271d225c7848a685f137316dc98bab40dc5c5032b86efeb21fe60b6e6bb840608696d61f251d6f0e75 languageName: node linkType: hard @@ -14054,12 +13971,12 @@ __metadata: languageName: node linkType: hard -"@sentry-internal/browser-utils@npm:10.17.0": - version: 10.17.0 - resolution: "@sentry-internal/browser-utils@npm:10.17.0" +"@sentry-internal/browser-utils@npm:10.29.0": + version: 10.29.0 + resolution: "@sentry-internal/browser-utils@npm:10.29.0" dependencies: - "@sentry/core": "npm:10.17.0" - checksum: 10/328851bbbbd563837105e1b6205130aa1eccbd679b84d54c4a657af47339e63ac868415d37e80b493005e9d7543dc61a5e47e52a17ebc5af1790f4c7cf09467e + "@sentry/core": "npm:10.29.0" + checksum: 10/eacb0b4d08a732370b9d70a53f1348fe80463abb39d70aa2935cc1bd611f034d0cd6c1e7b783b654856a24e7a525524f9d305ec9133d0574abb09e1412ea8237 languageName: node linkType: hard @@ -14072,12 +13989,12 @@ __metadata: languageName: node linkType: hard -"@sentry-internal/feedback@npm:10.17.0": - version: 10.17.0 - resolution: "@sentry-internal/feedback@npm:10.17.0" +"@sentry-internal/feedback@npm:10.29.0": + version: 10.29.0 + resolution: "@sentry-internal/feedback@npm:10.29.0" dependencies: - "@sentry/core": "npm:10.17.0" - checksum: 10/f6753f11b06809109a5d5189720370a78a66859738a1e8c9285db4fd7871030927458e92909e9729a6cd94c216de3d578b3bb836f39cbd697da972922960b57a + "@sentry/core": "npm:10.29.0" + checksum: 10/3b19a1f8d0ecce20b67bee4aa866d10338bad968461b772944ced96413c650c655f5345f9cab193716f381e354ae08c4e055d356d108953e6411c5be51c85550 languageName: node linkType: hard @@ -14090,13 +14007,13 @@ __metadata: languageName: node linkType: hard -"@sentry-internal/replay-canvas@npm:10.17.0": - version: 10.17.0 - resolution: "@sentry-internal/replay-canvas@npm:10.17.0" +"@sentry-internal/replay-canvas@npm:10.29.0": + version: 10.29.0 + resolution: "@sentry-internal/replay-canvas@npm:10.29.0" dependencies: - "@sentry-internal/replay": "npm:10.17.0" - "@sentry/core": "npm:10.17.0" - checksum: 10/9dbfb29385fc82d0985dda5f5d981635778cb0c141faf863c6dc6d17ab22b7ad1666a824b0f3000d0165ddc3814b8c9b35393959b18a0f148d2c12adc37ebadc + "@sentry-internal/replay": "npm:10.29.0" + "@sentry/core": "npm:10.29.0" + checksum: 10/af5cea43b144eefd565c2af48515bf9f8ed120ed6671a86a671e04c1930e5d0532f64e3b618c7d72b0881e0caa812692c02d6af7207388a07170835521164e38 languageName: node linkType: hard @@ -14110,13 +14027,13 @@ __metadata: languageName: node linkType: hard -"@sentry-internal/replay@npm:10.17.0": - version: 10.17.0 - resolution: "@sentry-internal/replay@npm:10.17.0" +"@sentry-internal/replay@npm:10.29.0": + version: 10.29.0 + resolution: "@sentry-internal/replay@npm:10.29.0" dependencies: - "@sentry-internal/browser-utils": "npm:10.17.0" - "@sentry/core": "npm:10.17.0" - checksum: 10/b9cce490dd0840f6284f9fecd1ec00f77c7e7a39daeffc8da25622ae4006ceaa20bd1dbb94756db20438dd2e60f341dbb3f5348a4839fcde59f508d13e5c097a + "@sentry-internal/browser-utils": "npm:10.29.0" + "@sentry/core": "npm:10.29.0" + checksum: 10/2314d9d6da1e57a830732351a7a57bca44e2f75a79b52e9998da20666fe3a15b6e64844758256d1281f8c9f9f07e71d84d05e5648792268cfe61762965484e7e languageName: node linkType: hard @@ -14130,23 +14047,23 @@ __metadata: languageName: node linkType: hard -"@sentry/babel-plugin-component-annotate@npm:3.5.0": - version: 3.5.0 - resolution: "@sentry/babel-plugin-component-annotate@npm:3.5.0" - checksum: 10/da8b356a00445b6dd711b59fbfa5b9e2f808dcf1e364d6a37b1d4931ce53e87734b1178cee14af59f9e36ffa1e9a6eb8081caa455c4e803800f10aad80b5bb58 +"@sentry/babel-plugin-component-annotate@npm:3.6.1": + version: 3.6.1 + resolution: "@sentry/babel-plugin-component-annotate@npm:3.6.1" + checksum: 10/b65732b1be4123a0da37875b608b66fa3bef50698df90dc4d3236cd182f21708aeb50a94f9108d2cf6d199d76a55c698c52d9cb4bbdc2f859108b4d46321a15a languageName: node linkType: hard -"@sentry/browser@npm:10.17.0": - version: 10.17.0 - resolution: "@sentry/browser@npm:10.17.0" +"@sentry/browser@npm:10.29.0": + version: 10.29.0 + resolution: "@sentry/browser@npm:10.29.0" dependencies: - "@sentry-internal/browser-utils": "npm:10.17.0" - "@sentry-internal/feedback": "npm:10.17.0" - "@sentry-internal/replay": "npm:10.17.0" - "@sentry-internal/replay-canvas": "npm:10.17.0" - "@sentry/core": "npm:10.17.0" - checksum: 10/6bfc8ae92d988b79a4f2ced0be438f389fbf8d7d0ee82cbce1cbac02693b02a9a76df8375582bfca7578ec856c025d074f49de2c3e1f75a2185f9d52d2a61f65 + "@sentry-internal/browser-utils": "npm:10.29.0" + "@sentry-internal/feedback": "npm:10.29.0" + "@sentry-internal/replay": "npm:10.29.0" + "@sentry-internal/replay-canvas": "npm:10.29.0" + "@sentry/core": "npm:10.29.0" + checksum: 10/b1ab4f7a9a0304174134be4e432b6cf03d7cf91402107549648996d541336ff5846004d5c5bea34769bdd2c46d62a5e00e3f0ba317f25fb8ec4c5d6321d74ce8 languageName: node linkType: hard @@ -14163,82 +14080,90 @@ __metadata: languageName: node linkType: hard -"@sentry/bundler-plugin-core@npm:3.5.0": - version: 3.5.0 - resolution: "@sentry/bundler-plugin-core@npm:3.5.0" +"@sentry/bundler-plugin-core@npm:3.6.1": + version: 3.6.1 + resolution: "@sentry/bundler-plugin-core@npm:3.6.1" dependencies: "@babel/core": "npm:^7.18.5" - "@sentry/babel-plugin-component-annotate": "npm:3.5.0" - "@sentry/cli": "npm:2.42.2" + "@sentry/babel-plugin-component-annotate": "npm:3.6.1" + "@sentry/cli": "npm:^2.49.0" dotenv: "npm:^16.3.1" find-up: "npm:^5.0.0" glob: "npm:^9.3.2" magic-string: "npm:0.30.8" unplugin: "npm:1.0.1" - checksum: 10/335715545a311d84d5c7adfa12d7204b7472d42d80af7e7f1fab6e3ca33bcf9169433cae3ee7bb2e6e55e0222c71d77393c30cd05b9265bb5135518bd870607e + checksum: 10/6445bda6a963acc8fedd857c3783a21aa2ca147f8c5dced5b064d8d5756e87903346ce113a1f792f47f908184332917f8e413f52441dd33d0fb0eb197d638dc1 languageName: node linkType: hard -"@sentry/cli-darwin@npm:2.42.2": - version: 2.42.2 - resolution: "@sentry/cli-darwin@npm:2.42.2" +"@sentry/cli-darwin@npm:2.58.4": + version: 2.58.4 + resolution: "@sentry/cli-darwin@npm:2.58.4" conditions: os=darwin languageName: node linkType: hard -"@sentry/cli-linux-arm64@npm:2.42.2": - version: 2.42.2 - resolution: "@sentry/cli-linux-arm64@npm:2.42.2" - conditions: (os=linux | os=freebsd) & cpu=arm64 +"@sentry/cli-linux-arm64@npm:2.58.4": + version: 2.58.4 + resolution: "@sentry/cli-linux-arm64@npm:2.58.4" + conditions: (os=linux | os=freebsd | os=android) & cpu=arm64 languageName: node linkType: hard -"@sentry/cli-linux-arm@npm:2.42.2": - version: 2.42.2 - resolution: "@sentry/cli-linux-arm@npm:2.42.2" - conditions: (os=linux | os=freebsd) & cpu=arm +"@sentry/cli-linux-arm@npm:2.58.4": + version: 2.58.4 + resolution: "@sentry/cli-linux-arm@npm:2.58.4" + conditions: (os=linux | os=freebsd | os=android) & cpu=arm languageName: node linkType: hard -"@sentry/cli-linux-i686@npm:2.42.2": - version: 2.42.2 - resolution: "@sentry/cli-linux-i686@npm:2.42.2" - conditions: (os=linux | os=freebsd) & (cpu=x86 | cpu=ia32) +"@sentry/cli-linux-i686@npm:2.58.4": + version: 2.58.4 + resolution: "@sentry/cli-linux-i686@npm:2.58.4" + conditions: (os=linux | os=freebsd | os=android) & (cpu=x86 | cpu=ia32) languageName: node linkType: hard -"@sentry/cli-linux-x64@npm:2.42.2": - version: 2.42.2 - resolution: "@sentry/cli-linux-x64@npm:2.42.2" - conditions: (os=linux | os=freebsd) & cpu=x64 +"@sentry/cli-linux-x64@npm:2.58.4": + version: 2.58.4 + resolution: "@sentry/cli-linux-x64@npm:2.58.4" + conditions: (os=linux | os=freebsd | os=android) & cpu=x64 languageName: node linkType: hard -"@sentry/cli-win32-i686@npm:2.42.2": - version: 2.42.2 - resolution: "@sentry/cli-win32-i686@npm:2.42.2" +"@sentry/cli-win32-arm64@npm:2.58.4": + version: 2.58.4 + resolution: "@sentry/cli-win32-arm64@npm:2.58.4" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@sentry/cli-win32-i686@npm:2.58.4": + version: 2.58.4 + resolution: "@sentry/cli-win32-i686@npm:2.58.4" conditions: os=win32 & (cpu=x86 | cpu=ia32) languageName: node linkType: hard -"@sentry/cli-win32-x64@npm:2.42.2": - version: 2.42.2 - resolution: "@sentry/cli-win32-x64@npm:2.42.2" +"@sentry/cli-win32-x64@npm:2.58.4": + version: 2.58.4 + resolution: "@sentry/cli-win32-x64@npm:2.58.4" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@sentry/cli@npm:2.42.2": - version: 2.42.2 - resolution: "@sentry/cli@npm:2.42.2" +"@sentry/cli@npm:^2.49.0": + version: 2.58.4 + resolution: "@sentry/cli@npm:2.58.4" dependencies: - "@sentry/cli-darwin": "npm:2.42.2" - "@sentry/cli-linux-arm": "npm:2.42.2" - "@sentry/cli-linux-arm64": "npm:2.42.2" - "@sentry/cli-linux-i686": "npm:2.42.2" - "@sentry/cli-linux-x64": "npm:2.42.2" - "@sentry/cli-win32-i686": "npm:2.42.2" - "@sentry/cli-win32-x64": "npm:2.42.2" + "@sentry/cli-darwin": "npm:2.58.4" + "@sentry/cli-linux-arm": "npm:2.58.4" + "@sentry/cli-linux-arm64": "npm:2.58.4" + "@sentry/cli-linux-i686": "npm:2.58.4" + "@sentry/cli-linux-x64": "npm:2.58.4" + "@sentry/cli-win32-arm64": "npm:2.58.4" + "@sentry/cli-win32-i686": "npm:2.58.4" + "@sentry/cli-win32-x64": "npm:2.58.4" https-proxy-agent: "npm:^5.0.0" node-fetch: "npm:^2.6.7" progress: "npm:^2.0.3" @@ -14255,20 +14180,22 @@ __metadata: optional: true "@sentry/cli-linux-x64": optional: true + "@sentry/cli-win32-arm64": + optional: true "@sentry/cli-win32-i686": optional: true "@sentry/cli-win32-x64": optional: true bin: sentry-cli: bin/sentry-cli - checksum: 10/f92800b54a88c2f9f1d7a2604bb6b4a17c429a836871df2b966595af7d382bdac490586b19e5ab81d278d38d498207fcdbd94ceba0a50acec2ab77f1a6a4f3af + checksum: 10/cf5df020ed96c05e74f742c80b4c5f16750ee82a6b6f3619c0edb964c5b02b4dfca5688eb8a5278274fce38f9cd2b770e20d9365253bb86e9f24ceb309f9f6eb languageName: node linkType: hard -"@sentry/core@npm:10.17.0": - version: 10.17.0 - resolution: "@sentry/core@npm:10.17.0" - checksum: 10/556eaedf23402fe9f9b8a8cd577d61e71b42b9ef3e72bc22ee70705fc0050d1bf8a08dff44434f8a2ad1415e177b2e09d12f4d7ef51e2553c067ff805b3030e2 +"@sentry/core@npm:10.29.0": + version: 10.29.0 + resolution: "@sentry/core@npm:10.29.0" + checksum: 10/aa7a233a8c6327c5f60321cd65e2704e46945f5140da55e6016d949ad97529e362b3e2885c16e5defc53e5de0f870074aa94defd8376e50931bdf677c73c66fa languageName: node linkType: hard @@ -14280,106 +14207,107 @@ __metadata: linkType: hard "@sentry/electron@npm:^7.0.0": - version: 7.2.0 - resolution: "@sentry/electron@npm:7.2.0" + version: 7.5.0 + resolution: "@sentry/electron@npm:7.5.0" dependencies: - "@sentry/browser": "npm:10.17.0" - "@sentry/core": "npm:10.17.0" - "@sentry/node": "npm:10.17.0" + "@sentry/browser": "npm:10.29.0" + "@sentry/core": "npm:10.29.0" + "@sentry/node": "npm:10.29.0" peerDependencies: - "@sentry/node-native": 10.17.0 + "@sentry/node-native": 10.29.0 peerDependenciesMeta: "@sentry/node-native": optional: true - checksum: 10/0d95dff9cf2d3f86bc1244720a00cc06ae05e63fd82b310964333fe2cb0c1686a23207f11fb7f27df336b630495fc50ef276d09116c5f00a319c241d8110d2bd + checksum: 10/b5d5a512fa6dd748a393b8574b6d975a6b0e213c0081aa2e7c1305e9fb55221b1af956c88617cb2fc7b097c560ccbedf2903c8d7cd40bafc49294939a70ec85a languageName: node linkType: hard "@sentry/esbuild-plugin@npm:^3.0.0": - version: 3.5.0 - resolution: "@sentry/esbuild-plugin@npm:3.5.0" + version: 3.6.1 + resolution: "@sentry/esbuild-plugin@npm:3.6.1" dependencies: - "@sentry/bundler-plugin-core": "npm:3.5.0" + "@sentry/bundler-plugin-core": "npm:3.6.1" unplugin: "npm:1.0.1" uuid: "npm:^9.0.0" - checksum: 10/66a1f1a88d7c8a4ff79d7207d4a42998f8db7edc60138be2966bd54113eea6dc2979e7969c3262fea9c13597e40c988615c42c4149f3a6911b168d02a090d952 + checksum: 10/b2b64e404d13589d98ff5ebc57a7e0a7cb9c3bada8aab20f9eb1beefb375deabf61658c96659f3a4f2a5dbd69e44ddf69fd1b5a17f31830a97ddbee8f589473a languageName: node linkType: hard -"@sentry/node-core@npm:10.17.0": - version: 10.17.0 - resolution: "@sentry/node-core@npm:10.17.0" +"@sentry/node-core@npm:10.29.0": + version: 10.29.0 + resolution: "@sentry/node-core@npm:10.29.0" dependencies: - "@sentry/core": "npm:10.17.0" - "@sentry/opentelemetry": "npm:10.17.0" - import-in-the-middle: "npm:^1.14.2" + "@apm-js-collab/tracing-hooks": "npm:^0.3.1" + "@sentry/core": "npm:10.29.0" + "@sentry/opentelemetry": "npm:10.29.0" + import-in-the-middle: "npm:^2" peerDependencies: "@opentelemetry/api": ^1.9.0 - "@opentelemetry/context-async-hooks": ^1.30.1 || ^2.1.0 - "@opentelemetry/core": ^1.30.1 || ^2.1.0 + "@opentelemetry/context-async-hooks": ^1.30.1 || ^2.1.0 || ^2.2.0 + "@opentelemetry/core": ^1.30.1 || ^2.1.0 || ^2.2.0 "@opentelemetry/instrumentation": ">=0.57.1 <1" - "@opentelemetry/resources": ^1.30.1 || ^2.1.0 - "@opentelemetry/sdk-trace-base": ^1.30.1 || ^2.1.0 + "@opentelemetry/resources": ^1.30.1 || ^2.1.0 || ^2.2.0 + "@opentelemetry/sdk-trace-base": ^1.30.1 || ^2.1.0 || ^2.2.0 "@opentelemetry/semantic-conventions": ^1.37.0 - checksum: 10/9881e8803ce74c4759692b89b058049b8c024b9486fb989fc90da5d0c8a4e6e49924681b80f013c7d4dc3e49c30158f965c5d4092c228b91a8bc316192e6f278 + checksum: 10/5a5c307b5719f50fdbbc7e0f9c38c37814de1ec8552786cdf8d9ae302c8b3fa2f7521550958d49514035ee0ab293b4dd729c3eb371e730fde5e93aea379ce10f languageName: node linkType: hard -"@sentry/node@npm:10.17.0": - version: 10.17.0 - resolution: "@sentry/node@npm:10.17.0" +"@sentry/node@npm:10.29.0": + version: 10.29.0 + resolution: "@sentry/node@npm:10.29.0" dependencies: "@opentelemetry/api": "npm:^1.9.0" - "@opentelemetry/context-async-hooks": "npm:^2.1.0" - "@opentelemetry/core": "npm:^2.1.0" - "@opentelemetry/instrumentation": "npm:^0.204.0" - "@opentelemetry/instrumentation-amqplib": "npm:0.51.0" - "@opentelemetry/instrumentation-connect": "npm:0.48.0" - "@opentelemetry/instrumentation-dataloader": "npm:0.22.0" - "@opentelemetry/instrumentation-express": "npm:0.53.0" - "@opentelemetry/instrumentation-fs": "npm:0.24.0" - "@opentelemetry/instrumentation-generic-pool": "npm:0.48.0" - "@opentelemetry/instrumentation-graphql": "npm:0.52.0" - "@opentelemetry/instrumentation-hapi": "npm:0.51.0" - "@opentelemetry/instrumentation-http": "npm:0.204.0" - "@opentelemetry/instrumentation-ioredis": "npm:0.52.0" - "@opentelemetry/instrumentation-kafkajs": "npm:0.14.0" - "@opentelemetry/instrumentation-knex": "npm:0.49.0" - "@opentelemetry/instrumentation-koa": "npm:0.52.0" - "@opentelemetry/instrumentation-lru-memoizer": "npm:0.49.0" - "@opentelemetry/instrumentation-mongodb": "npm:0.57.0" - "@opentelemetry/instrumentation-mongoose": "npm:0.51.0" - "@opentelemetry/instrumentation-mysql": "npm:0.50.0" - "@opentelemetry/instrumentation-mysql2": "npm:0.51.0" - "@opentelemetry/instrumentation-pg": "npm:0.57.0" - "@opentelemetry/instrumentation-redis": "npm:0.53.0" - "@opentelemetry/instrumentation-tedious": "npm:0.23.0" - "@opentelemetry/instrumentation-undici": "npm:0.15.0" - "@opentelemetry/resources": "npm:^2.1.0" - "@opentelemetry/sdk-trace-base": "npm:^2.1.0" + "@opentelemetry/context-async-hooks": "npm:^2.2.0" + "@opentelemetry/core": "npm:^2.2.0" + "@opentelemetry/instrumentation": "npm:^0.208.0" + "@opentelemetry/instrumentation-amqplib": "npm:0.55.0" + "@opentelemetry/instrumentation-connect": "npm:0.52.0" + "@opentelemetry/instrumentation-dataloader": "npm:0.26.0" + "@opentelemetry/instrumentation-express": "npm:0.57.0" + "@opentelemetry/instrumentation-fs": "npm:0.28.0" + "@opentelemetry/instrumentation-generic-pool": "npm:0.52.0" + "@opentelemetry/instrumentation-graphql": "npm:0.56.0" + "@opentelemetry/instrumentation-hapi": "npm:0.55.0" + "@opentelemetry/instrumentation-http": "npm:0.208.0" + "@opentelemetry/instrumentation-ioredis": "npm:0.56.0" + "@opentelemetry/instrumentation-kafkajs": "npm:0.18.0" + "@opentelemetry/instrumentation-knex": "npm:0.53.0" + "@opentelemetry/instrumentation-koa": "npm:0.57.0" + "@opentelemetry/instrumentation-lru-memoizer": "npm:0.53.0" + "@opentelemetry/instrumentation-mongodb": "npm:0.61.0" + "@opentelemetry/instrumentation-mongoose": "npm:0.55.0" + "@opentelemetry/instrumentation-mysql": "npm:0.54.0" + "@opentelemetry/instrumentation-mysql2": "npm:0.55.0" + "@opentelemetry/instrumentation-pg": "npm:0.61.0" + "@opentelemetry/instrumentation-redis": "npm:0.57.0" + "@opentelemetry/instrumentation-tedious": "npm:0.27.0" + "@opentelemetry/instrumentation-undici": "npm:0.19.0" + "@opentelemetry/resources": "npm:^2.2.0" + "@opentelemetry/sdk-trace-base": "npm:^2.2.0" "@opentelemetry/semantic-conventions": "npm:^1.37.0" - "@prisma/instrumentation": "npm:6.15.0" - "@sentry/core": "npm:10.17.0" - "@sentry/node-core": "npm:10.17.0" - "@sentry/opentelemetry": "npm:10.17.0" - import-in-the-middle: "npm:^1.14.2" + "@prisma/instrumentation": "npm:6.19.0" + "@sentry/core": "npm:10.29.0" + "@sentry/node-core": "npm:10.29.0" + "@sentry/opentelemetry": "npm:10.29.0" + import-in-the-middle: "npm:^2" minimatch: "npm:^9.0.0" - checksum: 10/085078c391f2c3bbedfb63f85c70ac46e155d3ff21c74b6a58f1c82418655369d6970782d924c2e914fed80c3cd587f2e88545f99b23ecf15498c6256b5b4f0d + checksum: 10/76fb7e83a16db29b37b7520800053ffe3418993fc58ff43e178477eae1c247a8a3968151534289bb764a81fa64b3d6d2c1f1cb10b59d240691e04316bbc95556 languageName: node linkType: hard -"@sentry/opentelemetry@npm:10.17.0": - version: 10.17.0 - resolution: "@sentry/opentelemetry@npm:10.17.0" +"@sentry/opentelemetry@npm:10.29.0": + version: 10.29.0 + resolution: "@sentry/opentelemetry@npm:10.29.0" dependencies: - "@sentry/core": "npm:10.17.0" + "@sentry/core": "npm:10.29.0" peerDependencies: "@opentelemetry/api": ^1.9.0 - "@opentelemetry/context-async-hooks": ^1.30.1 || ^2.1.0 - "@opentelemetry/core": ^1.30.1 || ^2.1.0 - "@opentelemetry/sdk-trace-base": ^1.30.1 || ^2.1.0 + "@opentelemetry/context-async-hooks": ^1.30.1 || ^2.1.0 || ^2.2.0 + "@opentelemetry/core": ^1.30.1 || ^2.1.0 || ^2.2.0 + "@opentelemetry/sdk-trace-base": ^1.30.1 || ^2.1.0 || ^2.2.0 "@opentelemetry/semantic-conventions": ^1.37.0 - checksum: 10/8a5b575612cbe342f4267beca0b7793e0008373ee61bcd89b1723029f612a6936f3d248199868af002167d6f7d3cc35c0b263609273a6103721f3f5602be0286 + checksum: 10/5937847cbca24980b2f14557bc21bae9f69561b4668897843456026564047d9f07b49f20efcea0b229355a4ffc5f0c1eaa379cfd188b627020a22d121b8e4c65 languageName: node linkType: hard @@ -14397,15 +14325,15 @@ __metadata: linkType: hard "@sentry/webpack-plugin@npm:^3.0.0": - version: 3.5.0 - resolution: "@sentry/webpack-plugin@npm:3.5.0" + version: 3.6.1 + resolution: "@sentry/webpack-plugin@npm:3.6.1" dependencies: - "@sentry/bundler-plugin-core": "npm:3.5.0" + "@sentry/bundler-plugin-core": "npm:3.6.1" unplugin: "npm:1.0.1" uuid: "npm:^9.0.0" peerDependencies: webpack: ">=4.40.0" - checksum: 10/adde407b5ba5215e33fcf58bcf62b3df79f1e55345579ed0b846b4a3a24134d347a35b099d1f1a8b2f6e1ad1af3cfdb674c3a132ee345aa95b5c9ff26fa56826 + checksum: 10/2d3fbb2688398f58e859d36058a88b3668583741fc3be036ba5f09dc6ad9703ddcad486ba4f76e5fa257a8473dc66d7f0e47407e60d6b4943f8952615752d3fd languageName: node linkType: hard @@ -17002,14 +16930,14 @@ __metadata: languageName: node linkType: hard -"@types/pg@npm:*, @types/pg@npm:8.15.5": - version: 8.15.5 - resolution: "@types/pg@npm:8.15.5" +"@types/pg@npm:*, @types/pg@npm:8.15.6": + version: 8.15.6 + resolution: "@types/pg@npm:8.15.6" dependencies: "@types/node": "npm:*" pg-protocol: "npm:*" pg-types: "npm:^2.2.0" - checksum: 10/31bae283d044cd87a62fcbf1dc4d5a431783f4b19cad769bf5ad23794ccff969ae6fe7915c352a7b78a7159bc8b945560a5f76e74091e283c089618d1aacfff5 + checksum: 10/4bc1bb274e0fc105be93e3a9cc8c9aa57fc50b78ed78a56348468157332daaecd71fcab762ee620c766510ffbc7018b56ca394787d6d41ff1726b152770aa532 languageName: node linkType: hard @@ -17138,13 +17066,6 @@ __metadata: languageName: node linkType: hard -"@types/shimmer@npm:^1.2.0": - version: 1.2.0 - resolution: "@types/shimmer@npm:1.2.0" - checksum: 10/f081a31d826ce7bfe8cc7ba8129d2b1dffae44fd580eba4fcf741237646c4c2494ae6de2cada4b7713d138f35f4bc512dbf01311d813dee82020f97d7d8c491c - languageName: node - linkType: hard - "@types/sinon@npm:^17.0.3": version: 17.0.4 resolution: "@types/sinon@npm:17.0.4" @@ -25745,19 +25666,7 @@ __metadata: languageName: node linkType: hard -"import-in-the-middle@npm:^1.14.2, import-in-the-middle@npm:^1.8.1": - version: 1.15.0 - resolution: "import-in-the-middle@npm:1.15.0" - dependencies: - acorn: "npm:^8.14.0" - acorn-import-attributes: "npm:^1.9.5" - cjs-module-lexer: "npm:^1.2.2" - module-details-from-path: "npm:^1.0.3" - checksum: 10/a1ff65ea557ffe67e63dd67b411255fedd8622b324ff22ba99f4436b8fcf74da0333e62b4e8142f447e5db64a42ec9e65f926d50fa55e89c4e4d64626d8cf5f8 - languageName: node - linkType: hard - -"import-in-the-middle@npm:^2.0.0": +"import-in-the-middle@npm:^2, import-in-the-middle@npm:^2.0.0": version: 2.0.0 resolution: "import-in-the-middle@npm:2.0.0" dependencies: @@ -26702,7 +26611,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:4.1.0, js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": +"js-yaml@npm:4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" dependencies: @@ -26714,14 +26623,25 @@ __metadata: linkType: hard "js-yaml@npm:^3.13.1, js-yaml@npm:^3.14.1": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" + version: 3.14.2 + resolution: "js-yaml@npm:3.14.2" dependencies: argparse: "npm:^1.0.7" esprima: "npm:^4.0.0" bin: js-yaml: bin/js-yaml.js - checksum: 10/9e22d80b4d0105b9899135365f746d47466ed53ef4223c529b3c0f7a39907743fdbd3c4379f94f1106f02755b5e90b2faaf84801a891135544e1ea475d1a1379 + checksum: 10/172e0b6007b0bf0fc8d2469c94424f7dd765c64a047d2b790831fecef2204a4054eabf4d911eb73ab8c9a3256ab8ba1ee8d655b789bf24bf059c772acc2075a1 + languageName: node + linkType: hard + +"js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": + version: 4.1.1 + resolution: "js-yaml@npm:4.1.1" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10/a52d0519f0f4ef5b4adc1cde466cb54c50d56e2b4a983b9d5c9c0f2f99462047007a6274d7e95617a21d3c91fde3ee6115536ed70991cd645ba8521058b78f77 languageName: node linkType: hard @@ -29244,7 +29164,7 @@ __metadata: languageName: node linkType: hard -"module-details-from-path@npm:^1.0.3": +"module-details-from-path@npm:^1.0.3, module-details-from-path@npm:^1.0.4": version: 1.0.4 resolution: "module-details-from-path@npm:1.0.4" checksum: 10/2ebfada5358492f6ab496b70f70a1042f2ee7a4c79d29467f59ed6704f741fb4461d7cecb5082144ed39a05fec4d19e9ff38b731c76228151be97227240a05b2 @@ -29599,18 +29519,18 @@ __metadata: linkType: hard "next@npm:^15.3.1": - version: 15.5.4 - resolution: "next@npm:15.5.4" + version: 15.5.9 + resolution: "next@npm:15.5.9" dependencies: - "@next/env": "npm:15.5.4" - "@next/swc-darwin-arm64": "npm:15.5.4" - "@next/swc-darwin-x64": "npm:15.5.4" - "@next/swc-linux-arm64-gnu": "npm:15.5.4" - "@next/swc-linux-arm64-musl": "npm:15.5.4" - "@next/swc-linux-x64-gnu": "npm:15.5.4" - "@next/swc-linux-x64-musl": "npm:15.5.4" - "@next/swc-win32-arm64-msvc": "npm:15.5.4" - "@next/swc-win32-x64-msvc": "npm:15.5.4" + "@next/env": "npm:15.5.9" + "@next/swc-darwin-arm64": "npm:15.5.7" + "@next/swc-darwin-x64": "npm:15.5.7" + "@next/swc-linux-arm64-gnu": "npm:15.5.7" + "@next/swc-linux-arm64-musl": "npm:15.5.7" + "@next/swc-linux-x64-gnu": "npm:15.5.7" + "@next/swc-linux-x64-musl": "npm:15.5.7" + "@next/swc-win32-arm64-msvc": "npm:15.5.7" + "@next/swc-win32-x64-msvc": "npm:15.5.7" "@swc/helpers": "npm:0.5.15" caniuse-lite: "npm:^1.0.30001579" postcss: "npm:8.4.31" @@ -29653,7 +29573,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10/6cc933dd0e829e122e0232776b6fda5d9ff1a3c9c5f423163bb5962c524c479e0ad21cd8a6556ac028a17758b56e3988af4e11c5792ad986c973a370e42d1689 + checksum: 10/ac27b82de08c9720e8e99cd64102af5e30306a8c861630d50da347a02c288cc441273ada64875c47e7a4d5991ff69cc92b23e906ce3271f9835a7911a0f060cc languageName: node linkType: hard @@ -32673,17 +32593,6 @@ __metadata: languageName: node linkType: hard -"require-in-the-middle@npm:^7.1.1": - version: 7.5.2 - resolution: "require-in-the-middle@npm:7.5.2" - dependencies: - debug: "npm:^4.3.5" - module-details-from-path: "npm:^1.0.3" - resolve: "npm:^1.22.8" - checksum: 10/d8f137d72eec1c53987647d19cd3bd2c64d5417bcd06b9ac8f7a14e83924c1e7636e327df7d96066a2b446b41f50d0bc1856a521388d5e90ba5c3b18dd5ab4e8 - languageName: node - linkType: hard - "require-in-the-middle@npm:^8.0.0": version: 8.0.1 resolution: "require-in-the-middle@npm:8.0.1" @@ -33291,7 +33200,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2, semver@npm:^7.6.3, semver@npm:^7.7.1, semver@npm:^7.7.2, semver@npm:^7.7.3": +"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2, semver@npm:^7.6.3, semver@npm:^7.7.1, semver@npm:^7.7.2, semver@npm:^7.7.3": version: 7.7.3 resolution: "semver@npm:7.7.3" bin: @@ -33734,13 +33643,6 @@ __metadata: languageName: node linkType: hard -"shimmer@npm:^1.2.1": - version: 1.2.1 - resolution: "shimmer@npm:1.2.1" - checksum: 10/aa0d6252ad1c682a4fdfda69e541be987f7a265ac7b00b1208e5e48cc68dc55f293955346ea4c71a169b7324b82c70f8400b3d3d2d60b2a7519f0a3522423250 - languageName: node - linkType: hard - "side-channel@npm:@nolyfill/side-channel@^1": version: 1.0.44 resolution: "@nolyfill/side-channel@npm:1.0.44"