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 e380fc39a0..97e09a2abc 100644 Binary files a/packages/backend/server/src/__tests__/e2e/doc-service/__snapshots__/controller.spec.ts.snap and b/packages/backend/server/src/__tests__/e2e/doc-service/__snapshots__/controller.spec.ts.snap differ 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 3095228f2c..e0bf7a8463 100644 Binary files a/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-database.spec.ts.snap and b/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-database.spec.ts.snap differ diff --git a/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-rpc.spec.ts.md b/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-rpc.spec.ts.md index 50b408e834..3edbc40983 100644 --- a/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-rpc.spec.ts.md +++ b/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-rpc.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-rpc.spec.ts.snap b/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-rpc.spec.ts.snap index 3095228f2c..e0bf7a8463 100644 Binary files a/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-rpc.spec.ts.snap and b/packages/backend/server/src/core/doc/__tests__/__snapshots__/reader-from-rpc.spec.ts.snap differ diff --git a/packages/backend/server/src/core/doc/reader.ts b/packages/backend/server/src/core/doc/reader.ts index f7cf85e249..f8b70226e5 100644 --- a/packages/backend/server/src/core/doc/reader.ts +++ b/packages/backend/server/src/core/doc/reader.ts @@ -192,12 +192,7 @@ export class DatabaseDocReader extends DocReader { if (!doc) { return null; } - return parseDocToMarkdownFromDocSnapshot( - workspaceId, - docId, - doc.bin, - aiEditable - ); + return parseDocToMarkdownFromDocSnapshot(docId, doc.bin, aiEditable); } async getDocDiff( diff --git a/packages/backend/server/src/core/utils/__tests__/__snapshots__/blocksute.spec.ts.md b/packages/backend/server/src/core/utils/__tests__/__snapshots__/blocksute.spec.ts.md index e2a48d5a1a..608a8d4db9 100644 --- a/packages/backend/server/src/core/utils/__tests__/__snapshots__/blocksute.spec.ts.md +++ b/packages/backend/server/src/core/utils/__tests__/__snapshots__/blocksute.spec.ts.md @@ -21,372 +21,374 @@ Generated by [AVA](https://avajs.dev). { additional: { displayMode: 'edgeless', - noteBlockId: undefined, }, blockId: 'TnUgtVg7Eu', - content: 'Write, Draw, Plan all at Once.', + content: [ + 'Write, Draw, Plan all at Once.', + ], docId: 'doc-0', flavour: 'affine:page', + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'RX4CG2zsBk', }, blockId: 'FoPQcAyV_m', - content: '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. ', + content: [ + '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. ', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'RX4CG2zsBk', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'RX4CG2zsBk', }, blockId: 'oz48nn_zp8', - content: '', + content: [ + '', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'RX4CG2zsBk', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'RX4CG2zsBk', }, blockId: 'g8a-D9-jXS', - content: 'You own your data, with no compromises', + content: [ + 'You own your data, with no compromises', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'RX4CG2zsBk', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'RX4CG2zsBk', }, blockId: 'J8lHN1GR_5', - content: 'Local-first & Real-time collaborative', + content: [ + 'Local-first & Real-time collaborative', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'RX4CG2zsBk', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'RX4CG2zsBk', }, blockId: 'xCuWdM0VLz', - content: '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.', + content: [ + '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.', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'RX4CG2zsBk', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'RX4CG2zsBk', }, blockId: 'zElMi0tViK', - content: '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.', + content: [ + '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.', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'RX4CG2zsBk', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'RX4CG2zsBk', }, blockId: 'Z4rK0OF9Wk', - content: '', + content: [ + '', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'RX4CG2zsBk', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'S1mkc8zUoU', }, blockId: 'DQ0Ryb-SpW', - content: 'Blocks that assemble your next docs, tasks kanban or whiteboard', + content: [ + 'Blocks that assemble your next docs, tasks kanban or whiteboard', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'S1mkc8zUoU', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'yGlBdshAqN', }, blockId: 'HAZC3URZp_', - content: '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. ', + content: [ + '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. ', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'yGlBdshAqN', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'yGlBdshAqN', }, blockId: '0H87ypiuv8', - content: '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.', + content: [ + '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.', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'yGlBdshAqN', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'yGlBdshAqN', }, blockId: 'Sp4G1KD0Wn', - content: 'If you want to learn more about the product design of AFFiNE, here goes the concepts:', + content: [ + 'If you want to learn more about the product design of AFFiNE, here goes the concepts:', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'yGlBdshAqN', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'yGlBdshAqN', }, blockId: 'RsUhDuEqXa', - content: '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.', + content: [ + '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.', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'yGlBdshAqN', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'Z2HibKzAr-', - content: 'A true canvas for blocks in any form', + content: [ + 'A true canvas for blocks in any form', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'UwvWddamzM', - content: '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. ', + content: [ + '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. ', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'g9xKUjhJj1', - content: '', + content: [ + '', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'wDTn4YJ4pm', - content: '"We shape our tools and thereafter our tools shape us”. A lot of pioneers have inspired us a long the way, e.g.:', + content: [ + '"We shape our tools and thereafter our tools shape us”. A lot of pioneers have inspired us a long the way, e.g.:', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'xFrrdiP3-V', - content: 'Quip & Notion with their great concept of "everything is a block"', + content: [ + 'Quip & Notion with their great concept of "everything is a block"', + ], docId: 'doc-0', flavour: 'affine:list', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'Tp9xyN4Okl', - content: 'Trello with their Kanban', + content: [ + 'Trello with their Kanban', + ], docId: 'doc-0', flavour: 'affine:list', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'K_4hUzKZFQ', - content: 'Airtable & Miro with their no-code programable datasheets', + content: [ + 'Airtable & Miro with their no-code programable datasheets', + ], docId: 'doc-0', flavour: 'affine:list', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'QwMzON2s7x', - content: 'Miro & Whimiscal with their edgeless visual whiteboard', + content: [ + 'Miro & Whimiscal with their edgeless visual whiteboard', + ], docId: 'doc-0', flavour: 'affine:list', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'FFVmit6u1T', - content: 'Remnote & Capacities with their object-based tag system', + content: [ + 'Remnote & Capacities with their object-based tag system', + ], docId: 'doc-0', flavour: 'affine:list', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'cauvaHOQmh', }, blockId: 'YqnG5O6AE6', - content: 'For more details, please refer to our RoadMap', + content: [ + 'For more details, please refer to our RoadMap', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'cauvaHOQmh', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'cauvaHOQmh', }, blockId: 'sbDTmZMZcq', - content: 'Self Host', + content: [ + 'Self Host', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'cauvaHOQmh', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'cauvaHOQmh', }, blockId: 'QVvitesfbj', - content: 'Self host AFFiNE', + content: [ + 'Self host AFFiNE', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'cauvaHOQmh', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { @@ -405,6 +407,9 @@ Generated by [AVA](https://avajs.dev). ], docId: 'doc-0', flavour: 'affine:database', + parentBlockId: '2jwCeO8Yot', + parentFlavour: 'affine:note', + ref: undefined, }, { additional: { @@ -413,13 +418,14 @@ Generated by [AVA](https://avajs.dev). noteBlockId: '2jwCeO8Yot', }, blockId: 'tpyOZbPc1P', - content: 'Affine Development', + content: [ + 'Affine Development', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'U_GoHFD9At', parentFlavour: 'affine:database', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { @@ -428,13 +434,14 @@ Generated by [AVA](https://avajs.dev). noteBlockId: '2jwCeO8Yot', }, blockId: 'VMx9lHw3TR', - content: 'For developers or installations guides, please go to AFFiNE Doc', + content: [ + 'For developers or installations guides, please go to AFFiNE Doc', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'U_GoHFD9At', parentFlavour: 'affine:database', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { @@ -443,13 +450,14 @@ Generated by [AVA](https://avajs.dev). noteBlockId: '2jwCeO8Yot', }, blockId: 'Q6LnVyKoGS', - content: 'Quip & Notion with their great concept of "everything is a block"', + content: [ + 'Quip & Notion with their great concept of "everything is a block"', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'U_GoHFD9At', parentFlavour: 'affine:database', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { @@ -458,13 +466,14 @@ Generated by [AVA](https://avajs.dev). noteBlockId: '2jwCeO8Yot', }, blockId: 'EkFHpB-mJi', - content: 'Trello with their Kanban', + content: [ + 'Trello with their Kanban', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'U_GoHFD9At', parentFlavour: 'affine:database', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { @@ -473,13 +482,14 @@ Generated by [AVA](https://avajs.dev). noteBlockId: '2jwCeO8Yot', }, blockId: '3aMlphe2lp', - content: 'Airtable & Miro with their no-code programable datasheets', + content: [ + 'Airtable & Miro with their no-code programable datasheets', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'U_GoHFD9At', parentFlavour: 'affine:database', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { @@ -488,13 +498,14 @@ Generated by [AVA](https://avajs.dev). noteBlockId: '2jwCeO8Yot', }, blockId: 'MiZtUig-fL', - content: 'Miro & Whimiscal with their edgeless visual whiteboard', + content: [ + 'Miro & Whimiscal with their edgeless visual whiteboard', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'U_GoHFD9At', parentFlavour: 'affine:database', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { @@ -503,143 +514,154 @@ Generated by [AVA](https://avajs.dev). noteBlockId: '2jwCeO8Yot', }, blockId: 'erYE2C7cc5', - content: 'Remnote & Capacities with their object-based tag system', + content: [ + 'Remnote & Capacities with their object-based tag system', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'U_GoHFD9At', parentFlavour: 'affine:database', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'c9MF_JiRgx', }, blockId: 'NyHXrMX3R1', - content: 'Affine Development', + content: [ + 'Affine Development', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'c9MF_JiRgx', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'c9MF_JiRgx', }, blockId: '9-K49otbCv', - content: 'For developer or installation guides, please go to AFFiNE Development', + content: [ + 'For developer or installation guides, please go to AFFiNE Development', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'c9MF_JiRgx', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'c9MF_JiRgx', }, blockId: 'faFteK9eG-', - content: '', + content: [ + '', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'c9MF_JiRgx', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { displayMode: 'edgeless', - noteBlockId: undefined, }, blockId: '6x7ALjUDjj', content: [ - 'What is AFFiNE', - 'Related Articles', - ' ', - 'Self-host', '', + ' ', 'AFFiNE ', - 'Development', - 'You can check these URLs to learn about AFFiNE', 'Database Reference', + 'Development', + 'Related Articles', + 'Self-host', + 'What is AFFiNE', + 'You can check these URLs to learn about AFFiNE', ], docId: 'doc-0', flavour: 'affine:surface', parentBlockId: 'TnUgtVg7Eu', parentFlavour: 'affine:page', + ref: undefined, }, { additional: { displayMode: 'edgeless', - noteBlockId: undefined, }, blockId: 'ECrtbvW6xx', docId: 'doc-0', flavour: 'affine:bookmark', + parentBlockId: '6x7ALjUDjj', + parentFlavour: 'affine:surface', + ref: undefined, }, { additional: { displayMode: 'edgeless', - noteBlockId: undefined, }, blockId: '5W--UQLN11', docId: 'doc-0', flavour: 'affine:bookmark', + parentBlockId: '6x7ALjUDjj', + parentFlavour: 'affine:surface', + ref: undefined, }, { additional: { displayMode: 'edgeless', - noteBlockId: undefined, }, blob: [ 'BFZk3c2ERp-sliRvA7MQ_p3NdkdCLt2Ze0DQ9i21dpA=', ], blockId: 'lcZphIJe63', - content: '', + content: [ + '', + ], docId: 'doc-0', flavour: 'affine:image', parentBlockId: '6x7ALjUDjj', parentFlavour: 'affine:surface', + ref: undefined, }, { additional: { displayMode: 'edgeless', - noteBlockId: undefined, }, blob: [ 'HWvCItS78DzPGbwcuaGcfkpVDUvL98IvH5SIK8-AcL8=', ], blockId: 'JlgVJdWU12', - content: '', + content: [ + '', + ], docId: 'doc-0', flavour: 'affine:image', parentBlockId: '6x7ALjUDjj', parentFlavour: 'affine:surface', + ref: undefined, }, { additional: { displayMode: 'edgeless', - noteBlockId: undefined, }, blob: [ 'ZRKpsBoC88qEMmeiXKXqywfA1rLvWoLa5rpEh9x9Oj0=', ], blockId: 'lht7AqBqnF', - content: '', + content: [ + '', + ], docId: 'doc-0', flavour: 'affine:image', parentBlockId: '6x7ALjUDjj', parentFlavour: 'affine:surface', + ref: undefined, }, ], summary: '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 compromisesLocal-first & Real-time collaborativeWe 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 whiteboardThere 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. ', @@ -657,19 +679,11 @@ Generated by [AVA](https://avajs.dev). displayMode: 'edgeless', }, blockId: '4YHKIhPzAK', - content: 'index file name', + content: [ + 'index file name', + ], docId: 'doc-0', flavour: 'affine:page', - yblock: { - 'prop:title': 'index file name', - 'sys:children': [ - 'WypcCGdupE', - 'hZ1-cdLW5e', - ], - 'sys:flavour': 'affine:page', - 'sys:id': '4YHKIhPzAK', - 'sys:version': 2, - }, }, { additional: { @@ -681,16 +695,6 @@ Generated by [AVA](https://avajs.dev). flavour: 'affine:surface', parentBlockId: '4YHKIhPzAK', parentFlavour: 'affine:page', - yblock: { - 'prop:elements': { - type: '$blocksuite:internal:native$', - value: {}, - }, - 'sys:children': [], - 'sys:flavour': 'affine:surface', - 'sys:id': 'WypcCGdupE', - 'sys:version': 5, - }, }, { additional: { @@ -701,32 +705,13 @@ Generated by [AVA](https://avajs.dev). 'ldZMrM4PDlsNG4Q4YvCsz623h6TKu4qI9_FpTqIypfw=', ], blockId: 'tfz1yFZdnn', - content: 'test file name here.txt', + content: [ + 'test file name here.txt', + ], docId: 'doc-0', flavour: 'affine:attachment', parentBlockId: 'hZ1-cdLW5e', parentFlavour: 'affine:note', - yblock: { - 'prop:embed': false, - 'prop:footnoteIdentifier': null, - 'prop:index': 'a0', - 'prop:lockedBySelf': false, - 'prop:meta:createdAt': 1750036953927, - 'prop:meta:createdBy': '46ce597c-098a-4c61-a106-ce79827ec1de', - 'prop:meta:updatedAt': 1750036953928, - 'prop:meta:updatedBy': '46ce597c-098a-4c61-a106-ce79827ec1de', - 'prop:name': 'test file name here.txt', - 'prop:rotate': 0, - 'prop:size': 3, - 'prop:sourceId': 'ldZMrM4PDlsNG4Q4YvCsz623h6TKu4qI9_FpTqIypfw=', - 'prop:style': 'horizontalThin', - 'prop:type': 'text/plain', - 'prop:xywh': '[0,0,0,0]', - 'sys:children': [], - 'sys:flavour': 'affine:attachment', - 'sys:id': 'tfz1yFZdnn', - 'sys:version': 1, - }, }, ], summary: '', @@ -742,372 +727,374 @@ Generated by [AVA](https://avajs.dev). { additional: { displayMode: 'edgeless', - noteBlockId: undefined, }, blockId: 'TnUgtVg7Eu', - content: 'Write, Draw, Plan all at Once.', + content: [ + 'Write, Draw, Plan all at Once.', + ], docId: 'doc-0', flavour: 'affine:page', + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'RX4CG2zsBk', }, blockId: 'FoPQcAyV_m', - content: '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. ', + content: [ + '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. ', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'RX4CG2zsBk', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'RX4CG2zsBk', }, blockId: 'oz48nn_zp8', - content: '', + content: [ + '', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'RX4CG2zsBk', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'RX4CG2zsBk', }, blockId: 'g8a-D9-jXS', - content: 'You own your data, with no compromises', + content: [ + 'You own your data, with no compromises', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'RX4CG2zsBk', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'RX4CG2zsBk', }, blockId: 'J8lHN1GR_5', - content: 'Local-first & Real-time collaborative', + content: [ + 'Local-first & Real-time collaborative', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'RX4CG2zsBk', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'RX4CG2zsBk', }, blockId: 'xCuWdM0VLz', - content: '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.', + content: [ + '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.', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'RX4CG2zsBk', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'RX4CG2zsBk', }, blockId: 'zElMi0tViK', - content: '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.', + content: [ + '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.', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'RX4CG2zsBk', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'RX4CG2zsBk', }, blockId: 'Z4rK0OF9Wk', - content: '', + content: [ + '', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'RX4CG2zsBk', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'S1mkc8zUoU', }, blockId: 'DQ0Ryb-SpW', - content: 'Blocks that assemble your next docs, tasks kanban or whiteboard', + content: [ + 'Blocks that assemble your next docs, tasks kanban or whiteboard', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'S1mkc8zUoU', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'yGlBdshAqN', }, blockId: 'HAZC3URZp_', - content: '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. ', + content: [ + '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. ', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'yGlBdshAqN', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'yGlBdshAqN', }, blockId: '0H87ypiuv8', - content: '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.', + content: [ + '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.', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'yGlBdshAqN', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'yGlBdshAqN', }, blockId: 'Sp4G1KD0Wn', - content: 'If you want to learn more about the product design of AFFiNE, here goes the concepts:', + content: [ + 'If you want to learn more about the product design of AFFiNE, here goes the concepts:', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'yGlBdshAqN', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'yGlBdshAqN', }, blockId: 'RsUhDuEqXa', - content: '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.', + content: [ + '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.', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'yGlBdshAqN', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'Z2HibKzAr-', - content: 'A true canvas for blocks in any form', + content: [ + 'A true canvas for blocks in any form', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'UwvWddamzM', - content: '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. ', + content: [ + '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. ', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'g9xKUjhJj1', - content: '', + content: [ + '', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'wDTn4YJ4pm', - content: '"We shape our tools and thereafter our tools shape us”. A lot of pioneers have inspired us a long the way, e.g.:', + content: [ + '"We shape our tools and thereafter our tools shape us”. A lot of pioneers have inspired us a long the way, e.g.:', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'xFrrdiP3-V', - content: 'Quip & Notion with their great concept of "everything is a block"', + content: [ + 'Quip & Notion with their great concept of "everything is a block"', + ], docId: 'doc-0', flavour: 'affine:list', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'Tp9xyN4Okl', - content: 'Trello with their Kanban', + content: [ + 'Trello with their Kanban', + ], docId: 'doc-0', flavour: 'affine:list', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'K_4hUzKZFQ', - content: 'Airtable & Miro with their no-code programable datasheets', + content: [ + 'Airtable & Miro with their no-code programable datasheets', + ], docId: 'doc-0', flavour: 'affine:list', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'QwMzON2s7x', - content: 'Miro & Whimiscal with their edgeless visual whiteboard', + content: [ + 'Miro & Whimiscal with their edgeless visual whiteboard', + ], docId: 'doc-0', flavour: 'affine:list', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: '6lDiuDqZGL', }, blockId: 'FFVmit6u1T', - content: 'Remnote & Capacities with their object-based tag system', + content: [ + 'Remnote & Capacities with their object-based tag system', + ], docId: 'doc-0', flavour: 'affine:list', parentBlockId: '6lDiuDqZGL', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'cauvaHOQmh', }, blockId: 'YqnG5O6AE6', - content: 'For more details, please refer to our RoadMap', + content: [ + 'For more details, please refer to our RoadMap', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'cauvaHOQmh', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'cauvaHOQmh', }, blockId: 'sbDTmZMZcq', - content: 'Self Host', + content: [ + 'Self Host', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'cauvaHOQmh', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'cauvaHOQmh', }, blockId: 'QVvitesfbj', - content: 'Self host AFFiNE', + content: [ + 'Self host AFFiNE', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'cauvaHOQmh', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { @@ -1126,6 +1113,9 @@ Generated by [AVA](https://avajs.dev). ], docId: 'doc-0', flavour: 'affine:database', + parentBlockId: '2jwCeO8Yot', + parentFlavour: 'affine:note', + ref: undefined, }, { additional: { @@ -1134,13 +1124,14 @@ Generated by [AVA](https://avajs.dev). noteBlockId: '2jwCeO8Yot', }, blockId: 'tpyOZbPc1P', - content: 'Affine Development', + content: [ + 'Affine Development', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'U_GoHFD9At', parentFlavour: 'affine:database', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { @@ -1149,13 +1140,14 @@ Generated by [AVA](https://avajs.dev). noteBlockId: '2jwCeO8Yot', }, blockId: 'VMx9lHw3TR', - content: 'For developers or installations guides, please go to AFFiNE Doc', + content: [ + 'For developers or installations guides, please go to AFFiNE Doc', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'U_GoHFD9At', parentFlavour: 'affine:database', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { @@ -1164,13 +1156,14 @@ Generated by [AVA](https://avajs.dev). noteBlockId: '2jwCeO8Yot', }, blockId: 'Q6LnVyKoGS', - content: 'Quip & Notion with their great concept of "everything is a block"', + content: [ + 'Quip & Notion with their great concept of "everything is a block"', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'U_GoHFD9At', parentFlavour: 'affine:database', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { @@ -1179,13 +1172,14 @@ Generated by [AVA](https://avajs.dev). noteBlockId: '2jwCeO8Yot', }, blockId: 'EkFHpB-mJi', - content: 'Trello with their Kanban', + content: [ + 'Trello with their Kanban', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'U_GoHFD9At', parentFlavour: 'affine:database', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { @@ -1194,13 +1188,14 @@ Generated by [AVA](https://avajs.dev). noteBlockId: '2jwCeO8Yot', }, blockId: '3aMlphe2lp', - content: 'Airtable & Miro with their no-code programable datasheets', + content: [ + 'Airtable & Miro with their no-code programable datasheets', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'U_GoHFD9At', parentFlavour: 'affine:database', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { @@ -1209,13 +1204,14 @@ Generated by [AVA](https://avajs.dev). noteBlockId: '2jwCeO8Yot', }, blockId: 'MiZtUig-fL', - content: 'Miro & Whimiscal with their edgeless visual whiteboard', + content: [ + 'Miro & Whimiscal with their edgeless visual whiteboard', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'U_GoHFD9At', parentFlavour: 'affine:database', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { @@ -1224,143 +1220,154 @@ Generated by [AVA](https://avajs.dev). noteBlockId: '2jwCeO8Yot', }, blockId: 'erYE2C7cc5', - content: 'Remnote & Capacities with their object-based tag system', + content: [ + 'Remnote & Capacities with their object-based tag system', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'U_GoHFD9At', parentFlavour: 'affine:database', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'c9MF_JiRgx', }, blockId: 'NyHXrMX3R1', - content: 'Affine Development', + content: [ + 'Affine Development', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'c9MF_JiRgx', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'c9MF_JiRgx', }, blockId: '9-K49otbCv', - content: 'For developer or installation guides, please go to AFFiNE Development', + content: [ + 'For developer or installation guides, please go to AFFiNE Development', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'c9MF_JiRgx', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { - databaseName: undefined, displayMode: 'page', noteBlockId: 'c9MF_JiRgx', }, blockId: 'faFteK9eG-', - content: '', + content: [ + '', + ], docId: 'doc-0', flavour: 'affine:paragraph', parentBlockId: 'c9MF_JiRgx', parentFlavour: 'affine:note', - ref: [], - refDocId: [], + ref: undefined, }, { additional: { displayMode: 'edgeless', - noteBlockId: undefined, }, blockId: '6x7ALjUDjj', content: [ - 'What is AFFiNE', - 'Related Articles', - ' ', - 'Self-host', '', + ' ', 'AFFiNE ', - 'Development', - 'You can check these URLs to learn about AFFiNE', 'Database Reference', + 'Development', + 'Related Articles', + 'Self-host', + 'What is AFFiNE', + 'You can check these URLs to learn about AFFiNE', ], docId: 'doc-0', flavour: 'affine:surface', parentBlockId: 'TnUgtVg7Eu', parentFlavour: 'affine:page', + ref: undefined, }, { additional: { displayMode: 'edgeless', - noteBlockId: undefined, }, blockId: 'ECrtbvW6xx', docId: 'doc-0', flavour: 'affine:bookmark', + parentBlockId: '6x7ALjUDjj', + parentFlavour: 'affine:surface', + ref: undefined, }, { additional: { displayMode: 'edgeless', - noteBlockId: undefined, }, blockId: '5W--UQLN11', docId: 'doc-0', flavour: 'affine:bookmark', + parentBlockId: '6x7ALjUDjj', + parentFlavour: 'affine:surface', + ref: undefined, }, { additional: { displayMode: 'edgeless', - noteBlockId: undefined, }, blob: [ 'BFZk3c2ERp-sliRvA7MQ_p3NdkdCLt2Ze0DQ9i21dpA=', ], blockId: 'lcZphIJe63', - content: '', + content: [ + '', + ], docId: 'doc-0', flavour: 'affine:image', parentBlockId: '6x7ALjUDjj', parentFlavour: 'affine:surface', + ref: undefined, }, { additional: { displayMode: 'edgeless', - noteBlockId: undefined, }, blob: [ 'HWvCItS78DzPGbwcuaGcfkpVDUvL98IvH5SIK8-AcL8=', ], blockId: 'JlgVJdWU12', - content: '', + content: [ + '', + ], docId: 'doc-0', flavour: 'affine:image', parentBlockId: '6x7ALjUDjj', parentFlavour: 'affine:surface', + ref: undefined, }, { additional: { displayMode: 'edgeless', - noteBlockId: undefined, }, blob: [ 'ZRKpsBoC88qEMmeiXKXqywfA1rLvWoLa5rpEh9x9Oj0=', ], blockId: 'lht7AqBqnF', - content: '', + content: [ + '', + ], docId: 'doc-0', flavour: 'affine:image', parentBlockId: '6x7ALjUDjj', parentFlavour: 'affine:surface', + ref: undefined, }, ], summary: '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 compromisesLocal-first & Real-time collaborativeWe 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 whiteboardThere 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. ', @@ -1372,64 +1379,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.', @@ -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 8670a36042..1b99242ee5 100644 Binary files a/packages/backend/server/src/core/utils/__tests__/__snapshots__/blocksute.spec.ts.snap and b/packages/backend/server/src/core/utils/__tests__/__snapshots__/blocksute.spec.ts.snap differ 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"