From 728e02cab70ac8eb79892e7a32a88313c61011db Mon Sep 17 00:00:00 2001 From: DarkSky <25152247+darkskygit@users.noreply.github.com> Date: Mon, 16 Feb 2026 13:52:08 +0800 Subject: [PATCH] feat: bump eslint & oxlint (#14452) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### PR Dependency Tree * **PR #14452** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) ## Summary by CodeRabbit * **Bug Fixes** * Improved null-safety, dependency tracking, upload validation, and error logging for more reliable uploads, clipboard, calendar linking, telemetry, PDF/theme printing, and preview/zoom behavior. * Tightened handling of all-day calendar events (missing date now reported). * **Deprecations** * Removed deprecated RadioButton and RadioButtonGroup; use RadioGroup. * **Chores** * Unified and upgraded linting/config, reorganized imports, and standardized binary handling for more consistent builds and tooling. --- oxlint.json => .oxlintrc.json | 77 ++ .vscode/settings.template.json | 2 +- .../data-view/src/core/utils/auto-scroll.ts | 2 +- .../table/pc-virtual/table-view-ui-logic.ts | 6 +- .../affine/ext-loader/src/base-provider.ts | 3 +- .../gfx/connector/src/connector-manager.ts | 2 +- .../template/src/toolbar/builtin-templates.ts | 1 + .../src/adapters/markdown/delta-converter.ts | 2 +- .../affine/shared/src/adapters/pdf/pdf.ts | 2 +- .../affine/shared/src/utils/print-to-pdf.ts | 9 +- .../edgeless-zoom-toolbar/src/zoom-toolbar.ts | 2 +- .../keyboard-toolbar/src/keyboard-toolbar.ts | 2 +- .../linked-doc/src/transformers/docx.ts | 2 +- .../linked-doc/src/transformers/markdown.ts | 2 +- .../linked-doc/src/transformers/utils.ts | 8 +- .../linked-doc/src/transformers/zip.ts | 4 +- .../framework/std/src/clipboard/clipboard.ts | 2 +- .../std/src/extension/service-manager.ts | 2 +- blocksuite/framework/std/src/utils/tree.ts | 5 +- .../std/src/view/element/lit-host.ts | 4 +- .../src/__tests__/collection.unit.spec.ts | 1 + .../framework/store/src/schema/schema.ts | 2 +- .../framework/store/src/transformer/slice.ts | 9 +- .../store/src/transformer/transformer.ts | 13 +- eslint.config.mjs | 102 +- package.json | 32 +- packages/backend/native/benchmark/index.js | 2 +- .../__tests__/e2e/storage/r2-proxy.spec.ts | 1 - .../server/src/__tests__/worker.e2e.ts | 4 +- .../backend/server/src/base/helpers/crypto.ts | 4 +- .../server/src/base/utils/request-tracker.ts | 17 +- .../backend/server/src/base/utils/ssrf.ts | 2 +- .../src/core/doc-renderer/controller.ts | 6 +- .../backend/server/src/core/mail/config.ts | 4 +- .../server/src/core/telemetry/controller.ts | 8 +- .../server/src/models/calendar-account.ts | 4 +- .../server/src/models/copilot-session.ts | 2 +- .../src/plugins/calendar/providers/caldav.ts | 4 +- .../src/plugins/calendar/providers/def.ts | 7 +- .../src/plugins/calendar/providers/factory.ts | 20 +- .../src/plugins/calendar/providers/google.ts | 4 +- .../src/plugins/calendar/providers/index.ts | 3 +- .../server/src/plugins/calendar/service.ts | 15 +- .../src/plugins/copilot/context/resolver.ts | 2 +- .../src/plugins/copilot/context/service.ts | 3 +- .../src/plugins/copilot/context/session.ts | 2 +- .../server/src/plugins/copilot/controller.ts | 10 +- .../src/plugins/copilot/embedding/client.ts | 8 +- .../src/plugins/copilot/mcp/provider.ts | 2 +- .../src/plugins/copilot/prompt/chat-prompt.ts | 6 +- .../src/plugins/copilot/prompt/prompts.ts | 2 +- .../src/plugins/copilot/prompt/service.ts | 2 +- .../src/plugins/copilot/providers/provider.ts | 4 +- .../server/src/plugins/copilot/resolver.ts | 4 +- .../server/src/plugins/copilot/session.ts | 13 +- .../src/plugins/copilot/tools/blob-read.ts | 3 +- .../plugins/copilot/tools/code-artifact.ts | 4 +- .../copilot/tools/conversation-summary.ts | 3 +- .../src/plugins/copilot/tools/doc-compose.ts | 3 +- .../src/plugins/copilot/tools/doc-edit.ts | 7 +- .../copilot/tools/doc-keyword-search.ts | 2 +- .../src/plugins/copilot/tools/doc-read.ts | 2 +- .../copilot/tools/doc-semantic-search.ts | 8 +- .../src/plugins/copilot/tools/doc-write.ts | 2 +- .../src/plugins/copilot/tools/section-edit.ts | 3 +- .../server/src/plugins/copilot/tools/types.ts | 5 + .../plugins/copilot/transcript/resolver.ts | 1 + .../src/plugins/copilot/transcript/service.ts | 14 +- .../server/src/plugins/copilot/types.ts | 4 +- .../server/src/plugins/copilot/utils.ts | 2 +- .../src/plugins/copilot/workflow/node.ts | 2 +- .../src/plugins/copilot/workflow/service.ts | 2 +- .../src/plugins/copilot/workflow/workflow.ts | 2 +- .../src/plugins/oauth/providers/apple.ts | 3 +- .../common/nbstore/src/impls/cloud/blob.ts | 54 +- .../common/nbstore/src/impls/cloud/indexer.ts | 4 +- .../nbstore/src/impls/idb/indexer/index.ts | 2 +- .../nbstore/src/impls/sqlite/indexer/index.ts | 7 +- .../nbstore/src/storage/dummy/indexer.ts | 4 +- .../common/nbstore/src/sync/blob/index.ts | 1 + .../common/nbstore/src/telemetry/manager.ts | 4 +- packages/common/s3-compat/src/index.ts | 14 +- .../src/components/shared/data-table.tsx | 1 + .../admin/src/modules/accounts/index.tsx | 2 +- .../src/modules/accounts/use-user-list.ts | 3 +- .../components/data-table-toolbar.tsx | 3 +- .../workspaces/components/workspace-panel.tsx | 2 +- .../admin/src/modules/workspaces/index.tsx | 3 +- .../modules/workspaces/use-workspace-list.ts | 18 +- .../component/src/hooks/use-disposable.ts | 4 +- .../component/src/hooks/use-ref-effect.ts | 4 +- .../frontend/component/src/ui/button/index.ts | 1 - .../component/src/ui/button/radio.tsx | 60 - .../component/src/ui/button/styles.css.ts | 56 +- .../src/ui/date-picker/calendar/calendar.tsx | 2 +- .../component/src/ui/dnd/draggable.ts | 2 +- .../component/src/ui/dnd/drop-target.ts | 2 +- .../frontend/component/src/ui/dnd/monitor.tsx | 2 +- .../component/src/ui/editable/inline-edit.tsx | 8 +- .../component/src/ui/input/row-input.tsx | 2 +- .../apply-model/apply-patch-to-doc.spec.ts | 1 - .../__tests__/pan-tool-middle-mouse.spec.ts | 6 +- .../ai/components/ai-tools/doc-compose.ts | 2 +- .../ai/components/page-editor-block-specs.ts | 22 + .../blocksuite/ai/components/text-renderer.ts | 19 +- .../blocksuite/attachment-viewer/index.tsx | 5 +- .../block-suite-editor/blocksuite-editor.tsx | 1 + .../database-block/properties/file/view.tsx | 8 +- .../member/multi-member-select/index.tsx | 6 +- .../database-block/properties/member/view.tsx | 6 +- .../core/src/components/guard/use-guard.tsx | 6 +- .../components/hooks/affine-async-hooks.ts | 4 +- .../components/hooks/use-catch-event-hook.ts | 13 +- .../components/page-list/operation-cell.tsx | 2 +- .../src/components/tags/tag-edit-menu.tsx | 8 +- .../core/src/components/tags/tags-editor.tsx | 1 + .../workspace-property-types/text.tsx | 4 +- .../account-setting/integrations-panel.tsx | 5 +- .../setting/general-setting/backup/index.tsx | 3 +- .../integration/calendar/setting-panel.tsx | 1 + .../license/self-host-team-card.tsx | 1 + .../src/desktop/pages/subscribe/index.tsx | 11 +- .../desktop/pages/workspace/chat/index.tsx | 2 +- .../pages/workspace/detail-page/tabs/chat.tsx | 2 +- .../src/desktop/pages/workspace/index.tsx | 28 +- .../src/mobile/pages/workspace/layout.tsx | 28 +- .../comment/services/snapshot-helper.ts | 5 +- .../doc-database-backlink-info.tsx | 2 +- .../frontend/core/src/modules/doc/index.ts | 3 +- .../core/src/modules/doc/services/docs.ts | 2 +- .../import-template/services/import.ts | 3 +- .../modules/integration/entities/readwise.ts | 2 +- .../media/entities/audio-attachment-block.ts | 3 +- .../src/modules/media/entities/audio-media.ts | 3 +- .../core/src/modules/pdf/entities/pdf.ts | 3 +- .../modules/peek-view/entities/peek-view.ts | 2 +- .../core/src/modules/peek-view/index.ts | 2 +- .../view/doc-preview/doc-peek-view.tsx | 2 +- .../peek-view/view/modal-container.tsx | 1 - .../peek-view/view/peek-view-controls.tsx | 2 +- .../core/src/modules/permissions/index.ts | 2 +- .../modules/workspace-engine/impls/cloud.ts | 11 +- .../modules/workspace-engine/impls/local.ts | 9 +- .../workspace-engine/utils/buffer-to-blob.ts | 10 +- .../modules/workspace/entities/workspace.ts | 5 +- .../frontend/core/src/utils/array-buffer.ts | 33 + .../frontend/core/src/utils/opus-encoding.ts | 15 +- .../track/src/__tests__/tracker.spec.ts | 2 +- packages/frontend/track/src/auto.ts | 1 + packages/frontend/track/src/telemetry.ts | 4 +- packages/frontend/track/src/tracker.ts | 2 +- tools/cli/src/init.ts | 4 +- tools/doc-diff/src/index.ts | 6 +- tools/doc-diff/src/rootdoc.ts | 3 +- tools/doc-diff/src/table.ts | 3 +- yarn.lock | 1156 ++++++++++------- 156 files changed, 1230 insertions(+), 1066 deletions(-) rename oxlint.json => .oxlintrc.json (78%) create mode 100644 packages/backend/server/src/plugins/copilot/tools/types.ts delete mode 100644 packages/frontend/component/src/ui/button/radio.tsx create mode 100644 packages/frontend/core/src/blocksuite/ai/components/page-editor-block-specs.ts create mode 100644 packages/frontend/core/src/utils/array-buffer.ts diff --git a/oxlint.json b/.oxlintrc.json similarity index 78% rename from oxlint.json rename to .oxlintrc.json index 2145806bc1..ecd026bb77 100644 --- a/oxlint.json +++ b/.oxlintrc.json @@ -5,6 +5,10 @@ "correctness": "error", "perf": "error" }, + "env": { + "builtin": true, + "es2026": true + }, "ignorePatterns": [ "**/node_modules", ".yarn", @@ -44,6 +48,34 @@ "**/test-blocks.json" ], "rules": { + "no-empty-static-block": "error", + "no-misleading-character-class": "error", + "no-new-native-nonconstructor": "error", + "no-unused-private-class-members": "error", + "no-useless-backreference": "error", + "react/display-name": "error", + "react/rules-of-hooks": "error", + "react/exhaustive-deps": "warn", + "@typescript-eslint/prefer-for-of": "error", + "@typescript-eslint/no-unsafe-function-type": "error", + "@typescript-eslint/no-wrapper-object-types": "error", + "no-restricted-imports": [ + "error", + { + "patterns": [ + { + "group": ["**/dist"], + "message": "Don't import from dist", + "allowTypeImports": false + }, + { + "group": ["**/src"], + "message": "Don't import from src", + "allowTypeImports": false + } + ] + } + ], "no-await-in-loop": "allow", "no-redeclare": "allow", "promise/no-callback-in-promise": "allow", @@ -70,6 +102,14 @@ "no-func-assign": "error", "no-global-assign": "error", "no-unused-vars": "error", + "no-unused-expressions": [ + "error", + { + "allowShortCircuit": true, + "allowTernary": true, + "allowTaggedTemplates": true + } + ], "no-ex-assign": "error", "no-loss-of-precision": "error", "no-fallthrough": "error", @@ -126,6 +166,7 @@ "react/no-render-return-value": "error", "react/jsx-no-target-blank": "error", "react/jsx-no-comment-textnodes": "error", + "react/no-array-index-key": "off", "typescript/consistent-type-imports": "error", "typescript/no-non-null-assertion": "error", "typescript/triple-slash-reference": "error", @@ -241,6 +282,42 @@ "typescript/consistent-type-imports": "off", "import/no-cycle": "off" } + }, + { + "files": [ + "packages/**/*.{ts,tsx}", + "tools/**/*.{ts,tsx}", + "blocksuite/**/*.{ts,tsx}" + ], + "rules": { + "react/exhaustive-deps": [ + "warn", + { + "additionalHooks": "(useAsyncCallback|useCatchEventCallback|useDraggable|useDropTarget|useRefEffect)" + } + ] + } + }, + { + "files": [ + "**/__tests__/**/*", + "**/*.stories.tsx", + "**/*.spec.ts", + "**/tests/**/*", + "scripts/**/*", + "**/benchmark/**/*", + "**/__debug__/**/*", + "**/e2e/**/*" + ], + "rules": { + "no-restricted-imports": "off" + } + }, + { + "files": ["**/*.{ts,js,mjs}"], + "rules": { + "react/rules-of-hooks": "off" + } } ] } diff --git a/.vscode/settings.template.json b/.vscode/settings.template.json index 7a1b4a2ef0..0bff7d69b9 100644 --- a/.vscode/settings.template.json +++ b/.vscode/settings.template.json @@ -17,7 +17,7 @@ "explorer.fileNesting.enabled": true, "explorer.fileNesting.patterns": { "*.js": "${capture}.js.map, ${capture}.min.js, ${capture}.d.ts, ${capture}.d.ts.map", - "package.json": ".browserslist*, .circleci*, .codecov, .commitlint*, .cz-config.js, .czrc, .dlint.json, .dprint.json, .editorconfig, .eslint*, eslint.*, .firebase*, .flowconfig, .github*, .gitlab*, .gitpod*, .huskyrc*, .jslint*, .lighthouserc.*, .lintstagedrc*, .markdownlint*, .mocha*, .node-version, .nodemon*, .npm*, .nvmrc, .pm2*, .pnp.*, .pnpm*, .prettier*, .releaserc*, .sentry*, .stackblitz*, .styleci*, .stylelint*, .tazerc*, .textlint*, .tool-versions, .travis*, .versionrc*, .vscode*, .watchman*, .xo-config*, .yamllint*, .yarnrc*, Procfile, api-extractor.json, apollo.config.*, appveyor*, ava.config.*, azure-pipelines*, bower.json, build.config.*, commitlint*, dangerfile*, dlint.json, dprint.json, firebase.json, grunt*, gulp*, histoire.config.*, jasmine.*, jenkins*, jest.config.*, jsconfig.*, karma*, lerna*, lighthouserc.*, lint-staged*, nest-cli.*, netlify*, nodemon*, nx.*, package-lock.json, package.nls*.json, phpcs.xml, playwright.config.*, pm2.*, pnpm*, prettier*, pullapprove*, puppeteer.config.*, pyrightconfig.json, release-tasks.sh, renovate*, rollup.config.*, stylelint*, tsconfig.*, tsdoc.*, tslint*, tsup.config.*, turbo*, typedoc*, unlighthouse*, vercel*, vetur.config.*, vitest.*, webpack*, workspace.json, xo.config.*, yarn*, babel.*, .babelrc, project.json, oxlint.json, nyc.config.*", + "package.json": ".browserslist*, .circleci*, .codecov, .commitlint*, .cz-config.js, .czrc, .dlint.json, .dprint.json, .editorconfig, .eslint*, eslint.*, .firebase*, .flowconfig, .github*, .gitlab*, .gitpod*, .huskyrc*, .jslint*, .lighthouserc.*, .lintstagedrc*, .markdownlint*, .mocha*, .node-version, .nodemon*, .npm*, .nvmrc, .pm2*, .pnp.*, .pnpm*, .prettier*, .releaserc*, .sentry*, .stackblitz*, .styleci*, .stylelint*, .tazerc*, .textlint*, .tool-versions, .travis*, .versionrc*, .vscode*, .watchman*, .xo-config*, .yamllint*, .yarnrc*, Procfile, api-extractor.json, apollo.config.*, appveyor*, ava.config.*, azure-pipelines*, bower.json, build.config.*, commitlint*, dangerfile*, dlint.json, dprint.json, firebase.json, grunt*, gulp*, histoire.config.*, jasmine.*, jenkins*, jest.config.*, jsconfig.*, karma*, lerna*, lighthouserc.*, lint-staged*, nest-cli.*, netlify*, nodemon*, nx.*, package-lock.json, package.nls*.json, phpcs.xml, playwright.config.*, pm2.*, pnpm*, prettier*, pullapprove*, puppeteer.config.*, pyrightconfig.json, release-tasks.sh, renovate*, rollup.config.*, stylelint*, tsconfig.*, tsdoc.*, tslint*, tsup.config.*, turbo*, typedoc*, unlighthouse*, vercel*, vetur.config.*, vitest.*, webpack*, workspace.json, xo.config.*, yarn*, babel.*, .babelrc, project.json, .oxlintrc.json, oxlint.json, nyc.config.*", "Cargo.toml": "Cargo.lock, rust-toolchain*, rustfmt.toml, .taplo.toml", "README.md": "LICENSE*, CHANGELOG.md, CODE_OF_CONDUCT.md, CONTRIBUTING.md, SECURITY.md, README.*", ".gitignore": ".gitattributes, .dockerignore, .eslintignore, .prettierignore, .stylelintignore, .tslintignore, .yarnignore" diff --git a/blocksuite/affine/data-view/src/core/utils/auto-scroll.ts b/blocksuite/affine/data-view/src/core/utils/auto-scroll.ts index f02dc1abf1..b3061f223d 100644 --- a/blocksuite/affine/data-view/src/core/utils/auto-scroll.ts +++ b/blocksuite/affine/data-view/src/core/utils/auto-scroll.ts @@ -67,7 +67,7 @@ export const autoScrollOnBoundary = ( }; const cancelBoxListen = effect(() => { - box.value; + void box.value; startUpdate(); }); diff --git a/blocksuite/affine/data-view/src/view-presets/table/pc-virtual/table-view-ui-logic.ts b/blocksuite/affine/data-view/src/view-presets/table/pc-virtual/table-view-ui-logic.ts index ff59f3f2cd..6389d0f818 100644 --- a/blocksuite/affine/data-view/src/view-presets/table/pc-virtual/table-view-ui-logic.ts +++ b/blocksuite/affine/data-view/src/view-presets/table/pc-virtual/table-view-ui-logic.ts @@ -24,12 +24,12 @@ import { DataViewUIBase, DataViewUILogicBase, } from '../../../core/view/data-view-base.js'; +import { LEFT_TOOL_BAR_WIDTH } from '../consts.js'; import { - type TableSingleView, TableViewRowSelection, type TableViewSelectionWithType, -} from '../../index.js'; -import { LEFT_TOOL_BAR_WIDTH } from '../consts.js'; +} from '../selection.js'; +import type { TableSingleView } from '../table-view-manager.js'; import { TableClipboardController } from './controller/clipboard.js'; import { TableDragController } from './controller/drag.js'; import { TableHotkeysController } from './controller/hotkeys.js'; diff --git a/blocksuite/affine/ext-loader/src/base-provider.ts b/blocksuite/affine/ext-loader/src/base-provider.ts index adcc9bd5b5..fc008b52df 100644 --- a/blocksuite/affine/ext-loader/src/base-provider.ts +++ b/blocksuite/affine/ext-loader/src/base-provider.ts @@ -60,10 +60,9 @@ export class BaseExtensionProvider< * @param context - The context object containing scope and registration function * @param option - Optional configuration options for the provider */ - setup(context: Context, option?: Options) { + setup(_context: Context, option?: Options) { if (option) { this.schema.parse(option); } - context; } } diff --git a/blocksuite/affine/gfx/connector/src/connector-manager.ts b/blocksuite/affine/gfx/connector/src/connector-manager.ts index 55ed2bc233..f93f167fa4 100644 --- a/blocksuite/affine/gfx/connector/src/connector-manager.ts +++ b/blocksuite/affine/gfx/connector/src/connector-manager.ts @@ -884,7 +884,7 @@ export class ConnectionOverlay extends Overlay { private _setupThemeListener(): void { const themeService = this.gfx.std.get(ThemeProvider); this._themeDisposer = effect(() => { - themeService.theme$; + void themeService.theme$.value; this._emphasisColor = this._getEmphasisColor(); }); } diff --git a/blocksuite/affine/gfx/template/src/toolbar/builtin-templates.ts b/blocksuite/affine/gfx/template/src/toolbar/builtin-templates.ts index 30f555ac03..ae5dc428a2 100644 --- a/blocksuite/affine/gfx/template/src/toolbar/builtin-templates.ts +++ b/blocksuite/affine/gfx/template/src/toolbar/builtin-templates.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/await-thenable */ import type { Template, TemplateCategory, diff --git a/blocksuite/affine/shared/src/adapters/markdown/delta-converter.ts b/blocksuite/affine/shared/src/adapters/markdown/delta-converter.ts index 284e7f6135..6d1b6180af 100644 --- a/blocksuite/affine/shared/src/adapters/markdown/delta-converter.ts +++ b/blocksuite/affine/shared/src/adapters/markdown/delta-converter.ts @@ -9,7 +9,7 @@ import rehypeParse from 'rehype-parse'; import { unified } from 'unified'; import type { AffineTextAttributes } from '../../types/index.js'; -import { HtmlDeltaConverter } from '../html/delta-converter.js'; +import type { HtmlDeltaConverter } from '../html/delta-converter.js'; import { rehypeInlineToBlock, rehypeWrapInlineElements, diff --git a/blocksuite/affine/shared/src/adapters/pdf/pdf.ts b/blocksuite/affine/shared/src/adapters/pdf/pdf.ts index f16f32372b..6861252485 100644 --- a/blocksuite/affine/shared/src/adapters/pdf/pdf.ts +++ b/blocksuite/affine/shared/src/adapters/pdf/pdf.ts @@ -873,7 +873,7 @@ export class PdfAdapter extends BaseAdapter { return { table: { headerRows: 0, - widths: Array(sortedColumns.length).fill('*'), + widths: Array.from({ length: sortedColumns.length }, () => '*'), body: tableBody, }, margin: [0, 5, 0, 5], diff --git a/blocksuite/affine/shared/src/utils/print-to-pdf.ts b/blocksuite/affine/shared/src/utils/print-to-pdf.ts index 17d825d5b8..b3acb536cd 100644 --- a/blocksuite/affine/shared/src/utils/print-to-pdf.ts +++ b/blocksuite/affine/shared/src/utils/print-to-pdf.ts @@ -115,12 +115,9 @@ export async function printToPdf( ) as HTMLDivElement; // force light theme in print iframe - iframe.contentWindow.document.documentElement.setAttribute( - 'data-theme', - 'light' - ); - iframe.contentWindow.document.body.setAttribute('data-theme', 'light'); - importedRoot.setAttribute('data-theme', 'light'); + iframe.contentWindow.document.documentElement.dataset.theme = 'light'; + iframe.contentWindow.document.body.dataset.theme = 'light'; + importedRoot.dataset.theme = 'light'; // draw saved canvas image to canvas const allImportedCanvas = importedRoot.getElementsByTagName('canvas'); diff --git a/blocksuite/affine/widgets/edgeless-zoom-toolbar/src/zoom-toolbar.ts b/blocksuite/affine/widgets/edgeless-zoom-toolbar/src/zoom-toolbar.ts index 8286eb298f..f863979c9a 100644 --- a/blocksuite/affine/widgets/edgeless-zoom-toolbar/src/zoom-toolbar.ts +++ b/blocksuite/affine/widgets/edgeless-zoom-toolbar/src/zoom-toolbar.ts @@ -126,7 +126,7 @@ export class EdgelessZoomToolbar extends WithDisposable(LitElement) { this.disposables.add( effect(() => { - this.gfx.tool.currentToolName$.value; + void this.gfx.tool.currentToolName$.value; this.requestUpdate(); }) ); diff --git a/blocksuite/affine/widgets/keyboard-toolbar/src/keyboard-toolbar.ts b/blocksuite/affine/widgets/keyboard-toolbar/src/keyboard-toolbar.ts index 06720f88c7..11b85387e4 100644 --- a/blocksuite/affine/widgets/keyboard-toolbar/src/keyboard-toolbar.ts +++ b/blocksuite/affine/widgets/keyboard-toolbar/src/keyboard-toolbar.ts @@ -289,7 +289,7 @@ export class AffineKeyboardToolbar extends SignalWatcher( this.disposables.add( effect(() => { const std = this.rootComponent.std; - std.selection.value; + void std.selection.value; // wait cursor updated requestAnimationFrame(() => { this._scrollCurrentBlockIntoView(); diff --git a/blocksuite/affine/widgets/linked-doc/src/transformers/docx.ts b/blocksuite/affine/widgets/linked-doc/src/transformers/docx.ts index 7cc67c752d..94c45acb5d 100644 --- a/blocksuite/affine/widgets/linked-doc/src/transformers/docx.ts +++ b/blocksuite/affine/widgets/linked-doc/src/transformers/docx.ts @@ -1,5 +1,5 @@ import type { ExtensionType, Schema, Workspace } from '@blocksuite/store'; -// @ts-ignore +// @ts-expect-error -- mammoth.browser has no compatible type declaration for this subpath. import { convertToHtml } from 'mammoth/mammoth.browser'; import { HtmlTransformer } from './html'; diff --git a/blocksuite/affine/widgets/linked-doc/src/transformers/markdown.ts b/blocksuite/affine/widgets/linked-doc/src/transformers/markdown.ts index b0129e1496..bdb3477151 100644 --- a/blocksuite/affine/widgets/linked-doc/src/transformers/markdown.ts +++ b/blocksuite/affine/widgets/linked-doc/src/transformers/markdown.ts @@ -10,12 +10,12 @@ import { Container } from '@blocksuite/global/di'; import { BlockSuiteError, ErrorCode } from '@blocksuite/global/exceptions'; import { sha } from '@blocksuite/global/utils'; import type { + DocMeta, ExtensionType, Schema, Store, Workspace, } from '@blocksuite/store'; -import type { DocMeta } from '@blocksuite/store'; import { extMimeMap, Transformer } from '@blocksuite/store'; import type { AssetMap, ImportedFileEntry, PathBlobIdMap } from './type.js'; diff --git a/blocksuite/affine/widgets/linked-doc/src/transformers/utils.ts b/blocksuite/affine/widgets/linked-doc/src/transformers/utils.ts index e59b726ff9..a7f66ea82d 100644 --- a/blocksuite/affine/widgets/linked-doc/src/transformers/utils.ts +++ b/blocksuite/affine/widgets/linked-doc/src/transformers/utils.ts @@ -171,9 +171,11 @@ export class Unzip { const fileExt = fileName.lastIndexOf('.') === -1 ? '' : fileName.split('.').at(-1); const mime = extMimeMap.get(fileExt ?? ''); - const content = new File([this.unzipped![path]], fileName, { - type: mime ?? '', - }) as Blob; + const content = new File( + [new Uint8Array(this.unzipped![path]).buffer], + fileName, + mime ? { type: mime } : undefined + ) as Blob; const fixedPath = this.fixFileNameEncoding(path); diff --git a/blocksuite/affine/widgets/linked-doc/src/transformers/zip.ts b/blocksuite/affine/widgets/linked-doc/src/transformers/zip.ts index 224fd1c3a2..5aaf225752 100644 --- a/blocksuite/affine/widgets/linked-doc/src/transformers/zip.ts +++ b/blocksuite/affine/widgets/linked-doc/src/transformers/zip.ts @@ -27,10 +27,10 @@ async function exportDocs( titleMiddleware(collection.meta.docMetas), ], }); - const snapshots = await Promise.all(docs.map(job.docToSnapshot)); await Promise.all( - snapshots + docs + .map(job.docToSnapshot) .filter((snapshot): snapshot is DocSnapshot => !!snapshot) .map(async snapshot => { // Use the title and id as the snapshot file name diff --git a/blocksuite/framework/std/src/clipboard/clipboard.ts b/blocksuite/framework/std/src/clipboard/clipboard.ts index 1dc789dd17..e1a8ecfc7e 100644 --- a/blocksuite/framework/std/src/clipboard/clipboard.ts +++ b/blocksuite/framework/std/src/clipboard/clipboard.ts @@ -190,7 +190,7 @@ export class Clipboard extends LifeCycleWatcher { ); } return slice; - } catch (error) { + } catch { const getDataByType = this._getDataByType(data); const slice = await this._getSnapshotByPriority( type => getDataByType(type), diff --git a/blocksuite/framework/std/src/extension/service-manager.ts b/blocksuite/framework/std/src/extension/service-manager.ts index a598750785..36d8232607 100644 --- a/blocksuite/framework/std/src/extension/service-manager.ts +++ b/blocksuite/framework/std/src/extension/service-manager.ts @@ -1,5 +1,5 @@ -import { LifeCycleWatcher } from '../extension/index.js'; import { BlockServiceIdentifier } from '../identifier.js'; +import { LifeCycleWatcher } from './lifecycle-watcher.js'; export class ServiceManager extends LifeCycleWatcher { static override readonly key = 'serviceManager'; diff --git a/blocksuite/framework/std/src/utils/tree.ts b/blocksuite/framework/std/src/utils/tree.ts index 94506b7a53..d2bde4fd45 100644 --- a/blocksuite/framework/std/src/utils/tree.ts +++ b/blocksuite/framework/std/src/utils/tree.ts @@ -87,6 +87,7 @@ export function batchRemoveChildren( } uniqueElements.forEach(element => { + // oxlint-disable-next-line unicorn/prefer-dom-node-remove container.removeChild(element); }); } @@ -114,7 +115,9 @@ function traverse( }); } - postCallBack && postCallBack(element); + if (postCallBack) { + postCallBack(element); + } }; innerTraverse(element); diff --git a/blocksuite/framework/std/src/view/element/lit-host.ts b/blocksuite/framework/std/src/view/element/lit-host.ts index 8c06f097eb..5aea4086f4 100644 --- a/blocksuite/framework/std/src/view/element/lit-host.ts +++ b/blocksuite/framework/std/src/view/element/lit-host.ts @@ -170,10 +170,10 @@ export class EditorHost extends SignalWatcher( ...Object.values(widgetTags), ]; await Promise.all( - elementsTags.map(tag => { + elementsTags.map(async tag => { const element = this.renderRoot.querySelector(tag._$litStatic$); if (element instanceof LitElement) { - return element.updateComplete; + return await element.updateComplete; } return null; }) diff --git a/blocksuite/framework/store/src/__tests__/collection.unit.spec.ts b/blocksuite/framework/store/src/__tests__/collection.unit.spec.ts index 4eaebda6ed..b0f9b41712 100644 --- a/blocksuite/framework/store/src/__tests__/collection.unit.spec.ts +++ b/blocksuite/framework/store/src/__tests__/collection.unit.spec.ts @@ -382,6 +382,7 @@ describe('addBlock', () => { const doc0 = collection.createDoc('doc:home'); const doc1 = collection.createDoc('space:doc1'); + // eslint-disable-next-line @typescript-eslint/await-thenable await Promise.all([doc0.load(), doc1.load()]); assert.equal(collection.docs.size, 2); const store0 = doc0.getStore({ diff --git a/blocksuite/framework/store/src/schema/schema.ts b/blocksuite/framework/store/src/schema/schema.ts index a35df93eec..86061218ea 100644 --- a/blocksuite/framework/store/src/schema/schema.ts +++ b/blocksuite/framework/store/src/schema/schema.ts @@ -1,7 +1,7 @@ import { minimatch } from 'minimatch'; import { SCHEMA_NOT_FOUND_MESSAGE } from '../consts.js'; -import { BlockSchema, type BlockSchemaType } from '../model/index.js'; +import { BlockSchema, type BlockSchemaType } from '../model/block/zod.js'; import { SchemaValidateError } from './error.js'; /** diff --git a/blocksuite/framework/store/src/transformer/slice.ts b/blocksuite/framework/store/src/transformer/slice.ts index 48905c7749..2e409a2df6 100644 --- a/blocksuite/framework/store/src/transformer/slice.ts +++ b/blocksuite/framework/store/src/transformer/slice.ts @@ -1,9 +1,6 @@ -import { - BlockModel, - type DraftModel, - type Store, - toDraftModel, -} from '../model/index'; +import { BlockModel } from '../model/block/block-model.js'; +import { type DraftModel, toDraftModel } from '../model/block/draft.js'; +import type { Store } from '../model/store/store.js'; type SliceData = { content: DraftModel[]; diff --git a/blocksuite/framework/store/src/transformer/transformer.ts b/blocksuite/framework/store/src/transformer/transformer.ts index 54cefa6e2b..e30ce5407d 100644 --- a/blocksuite/framework/store/src/transformer/transformer.ts +++ b/blocksuite/framework/store/src/transformer/transformer.ts @@ -3,14 +3,11 @@ import { BlockSuiteError, ErrorCode } from '@blocksuite/global/exceptions'; import { nextTick } from '@blocksuite/global/utils'; import { Subject } from 'rxjs'; -import { - BlockModel, - type BlockSchemaType, - type DraftModel, - type Store, - toDraftModel, -} from '../model/index.js'; -import type { Schema } from '../schema/index.js'; +import { BlockModel } from '../model/block/block-model.js'; +import { type DraftModel, toDraftModel } from '../model/block/draft.js'; +import type { BlockSchemaType } from '../model/block/zod.js'; +import type { Store } from '../model/store/store.js'; +import type { Schema } from '../schema/schema.js'; import { AssetsManager } from './assets.js'; import { BaseBlockTransformer } from './base.js'; import type { diff --git a/eslint.config.mjs b/eslint.config.mjs index e6b9aced6a..48795357b7 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -5,6 +5,7 @@ import eslint from '@eslint/js'; import tsParser from '@typescript-eslint/parser'; import eslintConfigPrettier from 'eslint-config-prettier'; import importX from 'eslint-plugin-import-x'; +import oxlint from 'eslint-plugin-oxlint'; import react from 'eslint-plugin-react'; import reactHooks from 'eslint-plugin-react-hooks'; import simpleImportSort from 'eslint-plugin-simple-import-sort'; @@ -16,7 +17,10 @@ const __require = createRequire(import.meta.url); const rxjs = __require('@smarttools/eslint-plugin-rxjs'); -const ignoreList = readFileSync('.prettierignore', 'utf-8') +const ignoreList = readFileSync( + new URL('.prettierignore', import.meta.url), + 'utf-8' +) .split('\n') .filter(line => line.trim() && !line.startsWith('#')); @@ -60,105 +64,51 @@ export default tseslint.config( 'simple-import-sort': simpleImportSort, rxjs, unicorn, + oxlint, }, rules: { ...eslint.configs.recommended.rules, ...react.configs.recommended.rules, ...react.configs['jsx-runtime'].rules, ...reactHooks.configs.recommended.rules, + ...oxlint.configs.recommended.rules, // covered by TypeScript 'no-dupe-args': 'off', // the following rules are disabled because they are covered by oxlint 'array-callback-return': 'off', - 'constructor-super': 'off', eqeqeq: 'off', 'getter-return': 'off', - 'for-direction': 'off', - 'require-yield': 'off', - 'use-isnan': 'off', - 'valid-typeof': 'off', 'no-self-compare': 'off', 'no-empty': 'off', - 'no-constant-binary-expression': 'off', 'no-constructor-return': 'off', - 'no-func-assign': 'off', - 'no-global-assign': 'off', - 'no-ex-assign': 'off', 'no-fallthrough': 'off', - 'no-irregular-whitespace': 'off', - 'no-control-regex': 'off', - 'no-with': 'off', - 'no-debugger': 'off', - 'no-const-assign': 'off', - 'no-import-assign': 'off', - 'no-setter-return': 'off', - 'no-obj-calls': 'off', - 'no-unsafe-negation': 'off', - 'no-dupe-class-members': 'off', - 'no-dupe-keys': 'off', - 'no-this-before-super': 'off', - 'no-empty-character-class': 'off', - 'no-useless-catch': 'off', - 'no-async-promise-executor': 'off', 'no-unreachable': 'off', - 'no-duplicate-case': 'off', - 'no-empty-pattern': 'off', - 'no-unused-labels': 'off', - 'no-sparse-arrays': 'off', - 'no-delete-var': 'off', - 'no-compare-neg-zero': 'off', 'no-redeclare': 'off', 'no-case-declarations': 'off', - 'no-class-assign': 'off', 'no-var': 'off', - 'no-self-assign': 'off', 'no-inner-declarations': 'off', - 'no-dupe-else-if': 'off', - 'no-invalid-regexp': 'off', - 'no-unsafe-finally': 'off', 'no-prototype-builtins': 'off', - 'no-shadow-restricted-names': 'off', - 'no-nonoctal-decimal-escape': 'off', - 'no-constant-condition': 'off', - 'no-useless-escape': 'off', - 'no-unsafe-optional-chaining': 'off', - 'no-extra-boolean-cast': 'off', 'no-regex-spaces': 'off', 'no-unused-vars': 'off', 'no-undef': 'off', - 'no-cond-assign': 'off', 'react/jsx-no-useless-fragment': 'off', 'react/no-unknown-property': 'off', - 'react/no-string-refs': 'off', - 'react/no-direct-mutation-state': 'off', 'react/require-render-return': 'off', - 'react/jsx-no-undef': 'off', - 'react/jsx-no-duplicate-props': 'off', - 'react/jsx-key': 'off', - 'react/no-danger-with-children': 'off', 'react/no-unescaped-entities': 'off', - 'react/no-is-mounted': 'off', - 'react/no-find-dom-node': 'off', - 'react/no-children-prop': 'off', - 'react/no-render-return-value': 'off', 'react/jsx-no-target-blank': 'off', 'react/jsx-no-comment-textnodes': 'off', 'react/prop-types': 'off', + 'react-hooks/immutability': 'off', + 'react-hooks/refs': 'off', + 'react-hooks/set-state-in-effect': 'off', + 'react-hooks/static-components': 'off', + 'react-hooks/use-memo': 'off', 'sonarjs/no-useless-catch': 'off', '@typescript-eslint/consistent-type-imports': 'off', '@typescript-eslint/no-unused-vars': 'off', '@typescript-eslint/no-non-null-assertion': 'off', - '@typescript-eslint/no-loss-of-precision': 'off', '@typescript-eslint/ban-ts-comment': 'off', - '@typescript-eslint/triple-slash-reference': 'off', - '@typescript-eslint/no-non-null-asserted-optional-chain': 'off', - '@typescript-eslint/no-duplicate-enum-values': 'off', - '@typescript-eslint/no-extra-non-null-assertion': 'off', - '@typescript-eslint/no-misused-new': 'off', '@typescript-eslint/prefer-for-of': 'error', - '@typescript-eslint/no-unsafe-declaration-merging': 'off', - '@typescript-eslint/no-this-alias': 'off', - '@typescript-eslint/prefer-as-const': 'off', '@typescript-eslint/no-var-requires': 'off', '@typescript-eslint/no-namespace': 'off', '@typescript-eslint/no-unnecessary-type-constraint': 'off', @@ -167,30 +117,13 @@ export default tseslint.config( '@typescript-eslint/no-empty-function': 'off', // rules that are not supported by oxlint + 'no-unreachable-loop': 'error', '@typescript-eslint/no-unsafe-function-type': 'error', - '@typescript-eslint/no-wrapper-object-types': 'error', '@typescript-eslint/unified-signatures': 'error', '@typescript-eslint/return-await': [ 'error', 'error-handling-correctness-only', ], - '@typescript-eslint/no-restricted-imports': [ - 'error', - { - patterns: [ - { - group: ['**/dist'], - message: "Don't import from dist", - allowTypeImports: false, - }, - { - group: ['**/src'], - message: "Don't import from src", - allowTypeImports: false, - }, - ], - }, - ], 'sonarjs/no-all-duplicated-branches': 'error', 'sonarjs/no-element-overwrite': 'error', 'sonarjs/no-empty-collection': 'error', @@ -198,7 +131,6 @@ export default tseslint.config( 'sonarjs/no-identical-conditions': 'error', 'sonarjs/no-identical-expressions': 'error', 'sonarjs/no-ignored-return': 'error', - 'sonarjs/no-one-iteration-loop': 'error', 'sonarjs/no-use-of-empty-return-value': 'error', 'sonarjs/non-existent-operator': 'error', 'sonarjs/no-collapsible-if': 'error', @@ -234,13 +166,6 @@ export default tseslint.config( 'error', { includeInternal: true }, ], - 'react-hooks/exhaustive-deps': [ - 'warn', - { - additionalHooks: - '(useAsyncCallback|useCatchEventCallback|useDraggable|useDropTarget|useRefEffect)', - }, - ], 'rxjs/finnish': [ 'error', { @@ -304,7 +229,6 @@ export default tseslint.config( { ignoreVoid: true }, ], '@typescript-eslint/no-misused-promises': 0, - '@typescript-eslint/no-restricted-imports': 0, }, }, { diff --git a/package.json b/package.json index 9febb92b57..31865c36d2 100644 --- a/package.json +++ b/package.json @@ -26,9 +26,10 @@ "lint:eslint:fix": "yarn lint:eslint --fix --fix-type problem,suggestion,layout", "lint:prettier": "prettier --ignore-unknown --cache --check .", "lint:prettier:fix": "prettier --ignore-unknown --cache --write .", - "lint:ox": "oxlint -c oxlint.json --deny-warnings", - "lint": "yarn lint:eslint && yarn lint:prettier", - "lint:fix": "yarn lint:eslint:fix && yarn lint:prettier:fix", + "lint:ox": "oxlint --deny-warnings", + "lint:ox:fix": "yarn lint:ox --fix", + "lint": "yarn lint:ox && yarn lint:eslint && yarn lint:prettier", + "lint:fix": "yarn lint:ox:fix && yarn lint:eslint:fix && yarn lint:prettier:fix", "test": "vitest --run", "test:ui": "vitest --ui", "test:coverage": "vitest run --coverage", @@ -51,7 +52,7 @@ "devDependencies": { "@affine-tools/cli": "workspace:*", "@capacitor/cli": "^7.0.0", - "@eslint/js": "^9.16.0", + "@eslint/js": "^9.39.2", "@faker-js/faker": "^10.1.0", "@istanbuljs/schema": "^0.1.3", "@magic-works/i18n-codegen": "^0.6.1", @@ -61,32 +62,33 @@ "@toeverything/infra": "workspace:*", "@types/eslint": "^9.6.1", "@types/node": "^22.0.0", - "@typescript-eslint/parser": "^8.18.0", + "@typescript-eslint/parser": "^8.55.0", "@vanilla-extract/vite-plugin": "^5.0.0", "@vitest/browser": "^3.2.4", "@vitest/coverage-istanbul": "^3.2.4", "@vitest/ui": "^3.2.4", "cross-env": "^10.1.0", "electron": "^39.0.0", - "eslint": "^9.16.0", - "eslint-config-prettier": "^10.0.0", - "eslint-import-resolver-typescript": "^4.0.0", - "eslint-plugin-import-x": "^4.5.0", - "eslint-plugin-react": "^7.37.2", - "eslint-plugin-react-hooks": "^5.1.0", + "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", + "eslint-import-resolver-typescript": "^4.4.4", + "eslint-plugin-import-x": "^4.16.1", + "eslint-plugin-oxlint": "^1.46.0", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-simple-import-sort": "^12.1.1", - "eslint-plugin-sonarjs": "^3.0.1", - "eslint-plugin-unicorn": "^59.0.0", + "eslint-plugin-sonarjs": "^3.0.7", + "eslint-plugin-unicorn": "^63.0.0", "happy-dom": "^20.0.0", "husky": "^9.1.7", "lint-staged": "^16.0.0", "msw": "^2.12.4", - "oxlint": "~1.18.0", + "oxlint": "^1.47.0", "prettier": "^3.7.4", "semver": "^7.7.3", "serve": "^14.2.4", "typescript": "^5.7.2", - "typescript-eslint": "^8.18.0", + "typescript-eslint": "^8.55.0", "unplugin-swc": "^1.5.9", "vite": "^7.2.7", "vitest": "^3.2.4" diff --git a/packages/backend/native/benchmark/index.js b/packages/backend/native/benchmark/index.js index 179a70ffc6..2938600305 100644 --- a/packages/backend/native/benchmark/index.js +++ b/packages/backend/native/benchmark/index.js @@ -31,7 +31,7 @@ assert.strictEqual( bench .add('tiktoken', () => { const encoder = encoding_for_model('gpt-4o'); - encoder.encode_ordinary(FIXTURE).length; + void encoder.encode_ordinary(FIXTURE).length; }) .add('native', () => { fromModelName('gpt-4o').count(FIXTURE); diff --git a/packages/backend/server/src/__tests__/e2e/storage/r2-proxy.spec.ts b/packages/backend/server/src/__tests__/e2e/storage/r2-proxy.spec.ts index 69adc91eb1..8f98fbc733 100644 --- a/packages/backend/server/src/__tests__/e2e/storage/r2-proxy.spec.ts +++ b/packages/backend/server/src/__tests__/e2e/storage/r2-proxy.spec.ts @@ -43,7 +43,6 @@ class MockR2Provider extends R2StorageProvider { destroy() {} - // @ts-ignore expect override override async proxyPutObject( key: string, body: any, diff --git a/packages/backend/server/src/__tests__/worker.e2e.ts b/packages/backend/server/src/__tests__/worker.e2e.ts index 125c322f34..1ebe09006e 100644 --- a/packages/backend/server/src/__tests__/worker.e2e.ts +++ b/packages/backend/server/src/__tests__/worker.e2e.ts @@ -1,6 +1,7 @@ +import { LookupAddress } from 'node:dns'; + import type { ExecutionContext, TestFn } from 'ava'; import ava from 'ava'; -import { LookupAddress } from 'dns'; import Sinon from 'sinon'; import type { Response } from 'supertest'; @@ -14,7 +15,6 @@ import { createTestingApp, TestingApp } from './utils'; type TestContext = { app: TestingApp; }; - const test = ava as TestFn; const LookupAddressStub = (async (_hostname, options) => { diff --git a/packages/backend/server/src/base/helpers/crypto.ts b/packages/backend/server/src/base/helpers/crypto.ts index 9ea6ec29e2..59b3359716 100644 --- a/packages/backend/server/src/base/helpers/crypto.ts +++ b/packages/backend/server/src/base/helpers/crypto.ts @@ -51,10 +51,10 @@ function parseKey(privateKey: string) { let priv: KeyObject; try { priv = createPrivateKey({ key: keyBuf, format: 'pem', type: 'pkcs8' }); - } catch (e1) { + } catch { try { priv = createPrivateKey({ key: keyBuf, format: 'pem', type: 'sec1' }); - } catch (e2) { + } catch { // As a last resort rely on auto-detection priv = createPrivateKey(keyBuf); } diff --git a/packages/backend/server/src/base/utils/request-tracker.ts b/packages/backend/server/src/base/utils/request-tracker.ts index 8fae68f420..d60216245c 100644 --- a/packages/backend/server/src/base/utils/request-tracker.ts +++ b/packages/backend/server/src/base/utils/request-tracker.ts @@ -22,12 +22,14 @@ function firstNonEmpty(...values: Array) { } export function getRequestClientIp(req: Request) { - return firstNonEmpty( - req.get('CF-Connecting-IP'), - firstForwardedForIp(req.get('X-Forwarded-For')), - req.get('X-Real-IP'), - req.ip - )!; + return ( + firstNonEmpty( + req.get('CF-Connecting-IP'), + firstForwardedForIp(req.get('X-Forwarded-For')), + req.get('X-Real-IP'), + req.ip + ) ?? '' + ); } export function getRequestTrackerId(req: Request) { @@ -39,6 +41,7 @@ export function getRequestTrackerId(req: Request) { req.get('X-Real-IP'), req.get('CF-Ray'), req.ip - )! + ) ?? + '' ); } diff --git a/packages/backend/server/src/base/utils/ssrf.ts b/packages/backend/server/src/base/utils/ssrf.ts index 374103ec70..276e1d4943 100644 --- a/packages/backend/server/src/base/utils/ssrf.ts +++ b/packages/backend/server/src/base/utils/ssrf.ts @@ -180,7 +180,7 @@ export async function assertSsrFSafeUrl( let addresses: string[]; try { addresses = await resolveHostAddresses(hostname); - } catch (error) { + } catch { throw createSsrfBlockedError('unresolvable_hostname', { url: url.toString(), hostname, diff --git a/packages/backend/server/src/core/doc-renderer/controller.ts b/packages/backend/server/src/core/doc-renderer/controller.ts index 6cc3cc8bc3..662e83c86d 100644 --- a/packages/backend/server/src/core/doc-renderer/controller.ts +++ b/packages/backend/server/src/core/doc-renderer/controller.ts @@ -44,11 +44,11 @@ const staticPaths = new Set([ 'trash', ]); -const markdownType = [ +const markdownType = new Set([ 'text/markdown', 'application/markdown', 'text/x-markdown', -]; +]); @Controller('/workspace') export class DocRendererController { @@ -109,7 +109,7 @@ export class DocRendererController { if ( isDocPath && - req.accepts().some(t => markdownType.includes(t.toLowerCase())) + req.accepts().some(t => markdownType.has(t.toLowerCase())) ) { try { const allowPreview = await this.allowDocPreview(workspaceId, sub); diff --git a/packages/backend/server/src/core/mail/config.ts b/packages/backend/server/src/core/mail/config.ts index 73669eb5d5..88b73b5050 100644 --- a/packages/backend/server/src/core/mail/config.ts +++ b/packages/backend/server/src/core/mail/config.ts @@ -56,7 +56,7 @@ defineModuleConfig('mailer', { env: 'MAILER_PASSWORD', }, 'SMTP.sender': { - desc: 'Sender of all the emails (e.g. "AFFiNE Self Hosted \")', + desc: 'Sender of all the emails (e.g. "AFFiNE Self Hosted ")', default: 'AFFiNE Self Hosted ', env: 'MAILER_SENDER', }, @@ -92,7 +92,7 @@ defineModuleConfig('mailer', { default: '', }, 'fallbackSMTP.sender': { - desc: 'Sender of all the emails (e.g. "AFFiNE Self Hosted \")', + desc: 'Sender of all the emails (e.g. "AFFiNE Self Hosted ")', default: '', }, 'fallbackSMTP.ignoreTLS': { diff --git a/packages/backend/server/src/core/telemetry/controller.ts b/packages/backend/server/src/core/telemetry/controller.ts index 73e13b3d3d..5eb25e166f 100644 --- a/packages/backend/server/src/core/telemetry/controller.ts +++ b/packages/backend/server/src/core/telemetry/controller.ts @@ -2,9 +2,11 @@ import { Body, Controller, Options, Post, Req, Res } from '@nestjs/common'; import type { Request, Response } from 'express'; import { BadRequest, Throttle, UseNamedGuard } from '../../base'; -import type { CurrentUser as CurrentUserType } from '../auth'; -import { Public } from '../auth'; -import { CurrentUser } from '../auth'; +import { + CurrentUser, + type CurrentUser as CurrentUserType, + Public, +} from '../auth'; import { TelemetryService } from './service'; import { TelemetryAck, type TelemetryBatch } from './types'; diff --git a/packages/backend/server/src/models/calendar-account.ts b/packages/backend/server/src/models/calendar-account.ts index 09993b0568..b526545bff 100644 --- a/packages/backend/server/src/models/calendar-account.ts +++ b/packages/backend/server/src/models/calendar-account.ts @@ -110,10 +110,10 @@ export class CalendarAccountModel extends BaseModel { refreshIntervalMinutes: data.refreshIntervalMinutes, }; - if (!!accessToken) { + if (accessToken) { updateData.accessToken = accessToken; } - if (!!refreshToken) { + if (refreshToken) { updateData.refreshToken = refreshToken; } diff --git a/packages/backend/server/src/models/copilot-session.ts b/packages/backend/server/src/models/copilot-session.ts index 4ba6a21403..0cc1ee9b4a 100644 --- a/packages/backend/server/src/models/copilot-session.ts +++ b/packages/backend/server/src/models/copilot-session.ts @@ -117,7 +117,7 @@ export class CopilotSessionModel extends BaseModel { if (typeof value !== 'string') { return value; } - return value.replace(/\u0000/g, '') as T; + return value.replaceAll('\0', '') as T; } private sanitizeJsonValue(value: T): T { diff --git a/packages/backend/server/src/plugins/calendar/providers/caldav.ts b/packages/backend/server/src/plugins/calendar/providers/caldav.ts index dc9c305c0f..e42348d4da 100644 --- a/packages/backend/server/src/plugins/calendar/providers/caldav.ts +++ b/packages/backend/server/src/plugins/calendar/providers/caldav.ts @@ -22,8 +22,8 @@ import { CalendarProviderListCalendarsParams, CalendarProviderListEventsParams, CalendarProviderListEventsResult, - CalendarProviderName, } from './def'; +import { CalendarProviderName } from './factory'; import { CalendarSyncTokenInvalid } from './google'; const XML_PARSER = new XMLParser({ @@ -113,7 +113,7 @@ const isRedirectStatus = (status: number) => const splitHeaderTokens = (value: string) => value - .split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/) + .split(/,(?=(?:[^"]*"[^"]*")*[^"]*$)/) .map(token => token.trim()) .filter(Boolean); diff --git a/packages/backend/server/src/plugins/calendar/providers/def.ts b/packages/backend/server/src/plugins/calendar/providers/def.ts index d20995dfe9..a9089d2ab6 100644 --- a/packages/backend/server/src/plugins/calendar/providers/def.ts +++ b/packages/backend/server/src/plugins/calendar/providers/def.ts @@ -2,12 +2,7 @@ import { Inject, Injectable, Logger } from '@nestjs/common'; import type { CalendarAccount } from '@prisma/client'; import { CalendarProviderRequestError, Config, OnEvent } from '../../../base'; -import { CalendarProviderFactory } from './factory'; - -export enum CalendarProviderName { - Google = 'google', - CalDAV = 'caldav', -} +import { CalendarProviderFactory, CalendarProviderName } from './factory'; export interface CalendarProviderTokens { accessToken: string; diff --git a/packages/backend/server/src/plugins/calendar/providers/factory.ts b/packages/backend/server/src/plugins/calendar/providers/factory.ts index b17f697d8f..8c51771b03 100644 --- a/packages/backend/server/src/plugins/calendar/providers/factory.ts +++ b/packages/backend/server/src/plugins/calendar/providers/factory.ts @@ -1,12 +1,20 @@ import { Injectable, Logger } from '@nestjs/common'; -import type { CalendarProvider } from './def'; -import { CalendarProviderName } from './def'; +export enum CalendarProviderName { + Google = 'google', + CalDAV = 'caldav', +} + +export interface CalendarProviderRef { + provider: CalendarProviderName; +} @Injectable() -export class CalendarProviderFactory { +export class CalendarProviderFactory< + TProvider extends CalendarProviderRef = CalendarProviderRef, +> { private readonly logger = new Logger(CalendarProviderFactory.name); - readonly #providers = new Map(); + readonly #providers = new Map(); get providers() { return Array.from(this.#providers.keys()); @@ -16,12 +24,12 @@ export class CalendarProviderFactory { return this.#providers.get(name); } - register(provider: CalendarProvider) { + register(provider: TProvider) { this.#providers.set(provider.provider, provider); this.logger.log(`Calendar provider [${provider.provider}] registered.`); } - unregister(provider: CalendarProvider) { + unregister(provider: TProvider) { this.#providers.delete(provider.provider); this.logger.log(`Calendar provider [${provider.provider}] unregistered.`); } diff --git a/packages/backend/server/src/plugins/calendar/providers/google.ts b/packages/backend/server/src/plugins/calendar/providers/google.ts index 3e387544c5..475f55e060 100644 --- a/packages/backend/server/src/plugins/calendar/providers/google.ts +++ b/packages/backend/server/src/plugins/calendar/providers/google.ts @@ -1,17 +1,17 @@ import { Injectable } from '@nestjs/common'; import { CalendarProviderRequestError } from '../../../base'; -import { CalendarProvider } from './def'; import { + CalendarProvider, CalendarProviderEvent, CalendarProviderListCalendarsParams, CalendarProviderListEventsParams, CalendarProviderListEventsResult, - CalendarProviderName, CalendarProviderTokens, CalendarProviderWatchParams, CalendarProviderWatchResult, } from './def'; +import { CalendarProviderName } from './factory'; export class CalendarSyncTokenInvalid extends Error { readonly code = 'calendar_sync_token_invalid'; diff --git a/packages/backend/server/src/plugins/calendar/providers/index.ts b/packages/backend/server/src/plugins/calendar/providers/index.ts index 0300c1c754..134b5eed7a 100644 --- a/packages/backend/server/src/plugins/calendar/providers/index.ts +++ b/packages/backend/server/src/plugins/calendar/providers/index.ts @@ -14,9 +14,8 @@ export type { CalendarProviderWatchParams, CalendarProviderWatchResult, } from './def'; -export { CalendarProviderName } from './def'; export { CalendarProvider } from './def'; -export { CalendarProviderFactory } from './factory'; +export { CalendarProviderFactory, CalendarProviderName } from './factory'; export { CalendarSyncTokenInvalid, GoogleCalendarProvider } from './google'; export const CalendarProviders = [GoogleCalendarProvider, CalDAVProvider]; diff --git a/packages/backend/server/src/plugins/calendar/service.ts b/packages/backend/server/src/plugins/calendar/service.ts index 6c4fdd687f..f73746114d 100644 --- a/packages/backend/server/src/plugins/calendar/service.ts +++ b/packages/backend/server/src/plugins/calendar/service.ts @@ -18,10 +18,10 @@ import { CalendarProvider, CalendarProviderEvent, CalendarProviderEventTime, + CalendarProviderFactory, CalendarProviderName, CalendarSyncTokenInvalid, } from './providers'; -import { CalendarProviderFactory } from './providers'; import type { LinkCalDAVAccountInput } from './types'; const TOKEN_REFRESH_SKEW_MS = 60 * 1000; @@ -35,7 +35,7 @@ export class CalendarService { constructor( private readonly models: Models, - private readonly providerFactory: CalendarProviderFactory, + private readonly providerFactory: CalendarProviderFactory, private readonly mutex: Mutex, private readonly config: Config, private readonly url: URLHelper @@ -105,11 +105,11 @@ export class CalendarService { const accessToken = accountTokens.accessToken; if (accessToken) { await Promise.allSettled( - needToStopChannel.map(s => { + needToStopChannel.map(async s => { if (!s.customChannelId || !s.customResourceId) { - return Promise.resolve(); + return; } - return provider.stopChannel?.({ + return await provider.stopChannel?.({ accessToken, channelId: s.customChannelId, resourceId: s.customResourceId, @@ -654,8 +654,11 @@ export class CalendarService { } const zone = time.timeZone ?? fallbackTimezone ?? 'UTC'; + if (!time.date) { + throw new Error('Calendar provider returned all-day event without date'); + } return { - date: this.convertDateToUtc(time.date!, zone), + date: this.convertDateToUtc(time.date, zone), allDay: true, }; } diff --git a/packages/backend/server/src/plugins/copilot/context/resolver.ts b/packages/backend/server/src/plugins/copilot/context/resolver.ts index a0bab86b1a..9296219b99 100644 --- a/packages/backend/server/src/plugins/copilot/context/resolver.ts +++ b/packages/backend/server/src/plugins/copilot/context/resolver.ts @@ -49,7 +49,7 @@ import { FileChunkSimilarity, Models, } from '../../../models'; -import { CopilotEmbeddingJob } from '../embedding'; +import { CopilotEmbeddingJob } from '../embedding/job'; import { COPILOT_LOCKER, CopilotType } from '../resolver'; import { ChatSessionService } from '../session'; import { CopilotStorage } from '../storage'; diff --git a/packages/backend/server/src/plugins/copilot/context/service.ts b/packages/backend/server/src/plugins/copilot/context/service.ts index 3572112e6a..be65d7963e 100644 --- a/packages/backend/server/src/plugins/copilot/context/service.ts +++ b/packages/backend/server/src/plugins/copilot/context/service.ts @@ -15,7 +15,8 @@ import { ContextFile, Models, } from '../../../models'; -import { type EmbeddingClient, getEmbeddingClient } from '../embedding'; +import { getEmbeddingClient } from '../embedding/client'; +import type { EmbeddingClient } from '../embedding/types'; import { ContextSession } from './session'; const CONTEXT_SESSION_KEY = 'context-session'; diff --git a/packages/backend/server/src/plugins/copilot/context/session.ts b/packages/backend/server/src/plugins/copilot/context/session.ts index 9db0dc3eab..7ac14abf58 100644 --- a/packages/backend/server/src/plugins/copilot/context/session.ts +++ b/packages/backend/server/src/plugins/copilot/context/session.ts @@ -11,7 +11,7 @@ import { FileChunkSimilarity, Models, } from '../../../models'; -import { EmbeddingClient } from '../embedding'; +import { EmbeddingClient } from '../embedding/types'; export class ContextSession implements AsyncDisposable { constructor( diff --git a/packages/backend/server/src/plugins/copilot/controller.ts b/packages/backend/server/src/plugins/copilot/controller.ts index a9885c8f34..921e50a088 100644 --- a/packages/backend/server/src/plugins/copilot/controller.ts +++ b/packages/backend/server/src/plugins/copilot/controller.ts @@ -47,14 +47,14 @@ import { } from '../../base'; import { ServerFeature, ServerService } from '../../core'; import { CurrentUser, Public } from '../../core/auth'; -import { CopilotContextService } from './context'; +import { CopilotContextService } from './context/service'; +import { CopilotProviderFactory } from './providers/factory'; +import type { CopilotProvider } from './providers/provider'; import { - CopilotProvider, - CopilotProviderFactory, ModelInputType, ModelOutputType, - StreamObject, -} from './providers'; + type StreamObject, +} from './providers/types'; import { StreamObjectParser } from './providers/utils'; import { ChatSession, ChatSessionService } from './session'; import { CopilotStorage } from './storage'; diff --git a/packages/backend/server/src/plugins/copilot/embedding/client.ts b/packages/backend/server/src/plugins/copilot/embedding/client.ts index fb689029e0..8268cae01e 100644 --- a/packages/backend/server/src/plugins/copilot/embedding/client.ts +++ b/packages/backend/server/src/plugins/copilot/embedding/client.ts @@ -12,14 +12,14 @@ import { Embedding, EMBEDDING_DIMENSIONS, } from '../../../models'; -import { PromptService } from '../prompt'; +import { PromptService } from '../prompt/service'; +import { CopilotProviderFactory } from '../providers/factory'; +import type { CopilotProvider } from '../providers/provider'; import { - type CopilotProvider, - CopilotProviderFactory, type ModelFullConditions, ModelInputType, ModelOutputType, -} from '../providers'; +} from '../providers/types'; import { EmbeddingClient, type ReRankResult } from './types'; const EMBEDDING_MODEL = 'gemini-embedding-001'; diff --git a/packages/backend/server/src/plugins/copilot/mcp/provider.ts b/packages/backend/server/src/plugins/copilot/mcp/provider.ts index 536e77cdb3..bd15acc6cc 100644 --- a/packages/backend/server/src/plugins/copilot/mcp/provider.ts +++ b/packages/backend/server/src/plugins/copilot/mcp/provider.ts @@ -8,7 +8,7 @@ import { DocReader, DocWriter } from '../../../core/doc'; import { AccessController } from '../../../core/permission'; import { clearEmbeddingChunk } from '../../../models'; import { IndexerService } from '../../indexer'; -import { CopilotContextService } from '../context'; +import { CopilotContextService } from '../context/service'; @Injectable() export class WorkspaceMcpProvider { diff --git a/packages/backend/server/src/plugins/copilot/prompt/chat-prompt.ts b/packages/backend/server/src/plugins/copilot/prompt/chat-prompt.ts index a2ceefd2b9..c6a9b11df1 100644 --- a/packages/backend/server/src/plugins/copilot/prompt/chat-prompt.ts +++ b/packages/backend/server/src/plugins/copilot/prompt/chat-prompt.ts @@ -4,7 +4,11 @@ import { AiPrompt } from '@prisma/client'; import Mustache from 'mustache'; import { getTokenEncoder } from '../../../native'; -import { PromptConfig, PromptMessage, PromptParams } from '../providers'; +import type { + PromptConfig, + PromptMessage, + PromptParams, +} from '../providers/types'; // disable escaping Mustache.escape = (text: string) => text; diff --git a/packages/backend/server/src/plugins/copilot/prompt/prompts.ts b/packages/backend/server/src/plugins/copilot/prompt/prompts.ts index 59396c0802..74d4acb911 100644 --- a/packages/backend/server/src/plugins/copilot/prompt/prompts.ts +++ b/packages/backend/server/src/plugins/copilot/prompt/prompts.ts @@ -1,7 +1,7 @@ import { Logger } from '@nestjs/common'; import { AiPrompt, PrismaClient } from '@prisma/client'; -import { PromptConfig, PromptMessage } from '../providers'; +import type { PromptConfig, PromptMessage } from '../providers/types'; type Prompt = Omit< AiPrompt, diff --git a/packages/backend/server/src/plugins/copilot/prompt/service.ts b/packages/backend/server/src/plugins/copilot/prompt/service.ts index cc894f2c35..789c1722a8 100644 --- a/packages/backend/server/src/plugins/copilot/prompt/service.ts +++ b/packages/backend/server/src/plugins/copilot/prompt/service.ts @@ -8,7 +8,7 @@ import { PromptConfigSchema, PromptMessage, PromptMessageSchema, -} from '../providers'; +} from '../providers/types'; import { ChatPrompt } from './chat-prompt'; import { CopilotPromptScenario, diff --git a/packages/backend/server/src/plugins/copilot/providers/provider.ts b/packages/backend/server/src/plugins/copilot/providers/provider.ts index a7dc7d289f..b021854959 100644 --- a/packages/backend/server/src/plugins/copilot/providers/provider.ts +++ b/packages/backend/server/src/plugins/copilot/providers/provider.ts @@ -13,8 +13,8 @@ import { DocReader, DocWriter } from '../../../core/doc'; import { AccessController } from '../../../core/permission'; import { Models } from '../../../models'; import { IndexerService } from '../../indexer'; -import { CopilotContextService } from '../context'; -import { PromptService } from '../prompt'; +import { CopilotContextService } from '../context/service'; +import { PromptService } from '../prompt/service'; import { buildBlobContentGetter, buildContentGetter, diff --git a/packages/backend/server/src/plugins/copilot/resolver.ts b/packages/backend/server/src/plugins/copilot/resolver.ts index 580fe75098..2dc036610c 100644 --- a/packages/backend/server/src/plugins/copilot/resolver.ts +++ b/packages/backend/server/src/plugins/copilot/resolver.ts @@ -42,9 +42,9 @@ import { AccessController, DocAction } from '../../core/permission'; import { UserType } from '../../core/user'; import type { ListSessionOptions, UpdateChatSession } from '../../models'; import { CopilotCronJobs } from './cron'; -import { PromptService } from './prompt'; -import { PromptMessage, StreamObject } from './providers'; +import { PromptService } from './prompt/service'; import { CopilotProviderFactory } from './providers/factory'; +import type { PromptMessage, StreamObject } from './providers/types'; import { ChatSessionService } from './session'; import { CopilotStorage } from './storage'; import { type ChatHistory, type ChatMessage, SubmittedMessage } from './types'; diff --git a/packages/backend/server/src/plugins/copilot/session.ts b/packages/backend/server/src/plugins/copilot/session.ts index ab8afefa0a..9014620421 100644 --- a/packages/backend/server/src/plugins/copilot/session.ts +++ b/packages/backend/server/src/plugins/copilot/session.ts @@ -28,13 +28,14 @@ import { import { SubscriptionService } from '../payment/service'; import { SubscriptionPlan, SubscriptionStatus } from '../payment/types'; import { ChatMessageCache } from './message'; -import { ChatPrompt, PromptService } from './prompt'; +import { ChatPrompt } from './prompt/chat-prompt'; +import { PromptService } from './prompt/service'; +import { CopilotProviderFactory } from './providers/factory'; import { - CopilotProviderFactory, ModelOutputType, - PromptMessage, - PromptParams, -} from './providers'; + type PromptMessage, + type PromptParams, +} from './providers/types'; import { type ChatHistory, type ChatMessage, @@ -322,7 +323,7 @@ export class ChatSessionService { private stripNullBytes(value?: string | null): string { if (!value) return ''; - return value.replace(/\u0000/g, ''); + return value.replaceAll('\0', ''); } private isNullByteError(error: unknown): boolean { diff --git a/packages/backend/server/src/plugins/copilot/tools/blob-read.ts b/packages/backend/server/src/plugins/copilot/tools/blob-read.ts index 23c8ac27ee..1a556010c3 100644 --- a/packages/backend/server/src/plugins/copilot/tools/blob-read.ts +++ b/packages/backend/server/src/plugins/copilot/tools/blob-read.ts @@ -3,9 +3,8 @@ import { tool } from 'ai'; import { z } from 'zod'; import { AccessController } from '../../../core/permission'; -import type { ContextSession } from '../context/session'; -import type { CopilotChatOptions } from '../providers'; import { toolError } from './error'; +import type { ContextSession, CopilotChatOptions } from './types'; const logger = new Logger('ContextBlobReadTool'); diff --git a/packages/backend/server/src/plugins/copilot/tools/code-artifact.ts b/packages/backend/server/src/plugins/copilot/tools/code-artifact.ts index 9058448fba..d46b88f448 100644 --- a/packages/backend/server/src/plugins/copilot/tools/code-artifact.ts +++ b/packages/backend/server/src/plugins/copilot/tools/code-artifact.ts @@ -2,9 +2,9 @@ import { Logger } from '@nestjs/common'; import { tool } from 'ai'; import { z } from 'zod'; -import type { PromptService } from '../prompt'; -import type { CopilotProviderFactory } from '../providers'; import { toolError } from './error'; +import type { CopilotProviderFactory, PromptService } from './types'; + const logger = new Logger('CodeArtifactTool'); /** * A copilot tool that produces a completely self-contained HTML artifact. diff --git a/packages/backend/server/src/plugins/copilot/tools/conversation-summary.ts b/packages/backend/server/src/plugins/copilot/tools/conversation-summary.ts index 89270ddb84..047c38316a 100644 --- a/packages/backend/server/src/plugins/copilot/tools/conversation-summary.ts +++ b/packages/backend/server/src/plugins/copilot/tools/conversation-summary.ts @@ -2,9 +2,8 @@ import { Logger } from '@nestjs/common'; import { tool } from 'ai'; import { z } from 'zod'; -import type { PromptService } from '../prompt'; -import type { CopilotProviderFactory } from '../providers'; import { toolError } from './error'; +import type { CopilotProviderFactory, PromptService } from './types'; const logger = new Logger('ConversationSummaryTool'); diff --git a/packages/backend/server/src/plugins/copilot/tools/doc-compose.ts b/packages/backend/server/src/plugins/copilot/tools/doc-compose.ts index 5b244e3140..f5c09e4761 100644 --- a/packages/backend/server/src/plugins/copilot/tools/doc-compose.ts +++ b/packages/backend/server/src/plugins/copilot/tools/doc-compose.ts @@ -2,9 +2,8 @@ import { Logger } from '@nestjs/common'; import { tool } from 'ai'; import { z } from 'zod'; -import type { PromptService } from '../prompt'; -import type { CopilotProviderFactory } from '../providers'; import { toolError } from './error'; +import type { CopilotProviderFactory, PromptService } from './types'; const logger = new Logger('DocComposeTool'); diff --git a/packages/backend/server/src/plugins/copilot/tools/doc-edit.ts b/packages/backend/server/src/plugins/copilot/tools/doc-edit.ts index 9e3f699ce9..22106f0045 100644 --- a/packages/backend/server/src/plugins/copilot/tools/doc-edit.ts +++ b/packages/backend/server/src/plugins/copilot/tools/doc-edit.ts @@ -3,8 +3,11 @@ import { z } from 'zod'; import { DocReader } from '../../../core/doc'; import { AccessController } from '../../../core/permission'; -import { type PromptService } from '../prompt'; -import type { CopilotChatOptions, CopilotProviderFactory } from '../providers'; +import type { + CopilotChatOptions, + CopilotProviderFactory, + PromptService, +} from './types'; const CodeEditSchema = z .array( diff --git a/packages/backend/server/src/plugins/copilot/tools/doc-keyword-search.ts b/packages/backend/server/src/plugins/copilot/tools/doc-keyword-search.ts index 0de7b85517..924b5d3862 100644 --- a/packages/backend/server/src/plugins/copilot/tools/doc-keyword-search.ts +++ b/packages/backend/server/src/plugins/copilot/tools/doc-keyword-search.ts @@ -3,8 +3,8 @@ import { z } from 'zod'; import type { AccessController } from '../../../core/permission'; import type { IndexerService, SearchDoc } from '../../indexer'; -import type { CopilotChatOptions } from '../providers'; import { toolError } from './error'; +import type { CopilotChatOptions } from './types'; export const buildDocKeywordSearchGetter = ( ac: AccessController, diff --git a/packages/backend/server/src/plugins/copilot/tools/doc-read.ts b/packages/backend/server/src/plugins/copilot/tools/doc-read.ts index fdd74e9d6d..2c16ee5d47 100644 --- a/packages/backend/server/src/plugins/copilot/tools/doc-read.ts +++ b/packages/backend/server/src/plugins/copilot/tools/doc-read.ts @@ -5,8 +5,8 @@ import { z } from 'zod'; import { DocReader } from '../../../core/doc'; import { AccessController } from '../../../core/permission'; import { Models, publicUserSelect } from '../../../models'; -import type { CopilotChatOptions } from '../providers'; import { toolError } from './error'; +import type { CopilotChatOptions } from './types'; const logger = new Logger('DocReadTool'); diff --git a/packages/backend/server/src/plugins/copilot/tools/doc-semantic-search.ts b/packages/backend/server/src/plugins/copilot/tools/doc-semantic-search.ts index 204a34df8c..e5d6a43e7b 100644 --- a/packages/backend/server/src/plugins/copilot/tools/doc-semantic-search.ts +++ b/packages/backend/server/src/plugins/copilot/tools/doc-semantic-search.ts @@ -8,10 +8,12 @@ import { clearEmbeddingChunk, type Models, } from '../../../models'; -import type { CopilotContextService } from '../context'; -import type { ContextSession } from '../context/session'; -import type { CopilotChatOptions } from '../providers'; import { toolError } from './error'; +import type { + ContextSession, + CopilotChatOptions, + CopilotContextService, +} from './types'; export const buildDocSearchGetter = ( ac: AccessController, diff --git a/packages/backend/server/src/plugins/copilot/tools/doc-write.ts b/packages/backend/server/src/plugins/copilot/tools/doc-write.ts index 73b03fd845..0a7405a9f3 100644 --- a/packages/backend/server/src/plugins/copilot/tools/doc-write.ts +++ b/packages/backend/server/src/plugins/copilot/tools/doc-write.ts @@ -4,8 +4,8 @@ import { z } from 'zod'; import { DocWriter } from '../../../core/doc'; import { AccessController } from '../../../core/permission'; -import type { CopilotChatOptions } from '../providers'; import { toolError } from './error'; +import type { CopilotChatOptions } from './types'; const logger = new Logger('DocWriteTool'); diff --git a/packages/backend/server/src/plugins/copilot/tools/section-edit.ts b/packages/backend/server/src/plugins/copilot/tools/section-edit.ts index 8c90848263..65572d8d9f 100644 --- a/packages/backend/server/src/plugins/copilot/tools/section-edit.ts +++ b/packages/backend/server/src/plugins/copilot/tools/section-edit.ts @@ -2,9 +2,8 @@ import { Logger } from '@nestjs/common'; import { tool } from 'ai'; import { z } from 'zod'; -import type { PromptService } from '../prompt'; -import type { CopilotProviderFactory } from '../providers'; import { toolError } from './error'; +import type { CopilotProviderFactory, PromptService } from './types'; const logger = new Logger('SectionEditTool'); diff --git a/packages/backend/server/src/plugins/copilot/tools/types.ts b/packages/backend/server/src/plugins/copilot/tools/types.ts new file mode 100644 index 0000000000..4955ad1fa6 --- /dev/null +++ b/packages/backend/server/src/plugins/copilot/tools/types.ts @@ -0,0 +1,5 @@ +export type { CopilotContextService } from '../context/service'; +export type { ContextSession } from '../context/session'; +export type { PromptService } from '../prompt/service'; +export type { CopilotProviderFactory } from '../providers/factory'; +export type { CopilotChatOptions } from '../providers/types'; diff --git a/packages/backend/server/src/plugins/copilot/transcript/resolver.ts b/packages/backend/server/src/plugins/copilot/transcript/resolver.ts index 8f8dbb8963..f29d078c93 100644 --- a/packages/backend/server/src/plugins/copilot/transcript/resolver.ts +++ b/packages/backend/server/src/plugins/copilot/transcript/resolver.ts @@ -125,6 +125,7 @@ export class CopilotTranscriptionResolver { user.id, workspaceId, blobId, + // eslint-disable-next-line @typescript-eslint/await-thenable await Promise.all(allBlobs) ); diff --git a/packages/backend/server/src/plugins/copilot/transcript/service.ts b/packages/backend/server/src/plugins/copilot/transcript/service.ts index 11fa30d905..e8716613d2 100644 --- a/packages/backend/server/src/plugins/copilot/transcript/service.ts +++ b/packages/backend/server/src/plugins/copilot/transcript/service.ts @@ -15,14 +15,10 @@ import { sniffMime, } from '../../../base'; import { Models } from '../../../models'; -import { PromptService } from '../prompt'; -import { - CopilotProvider, - CopilotProviderFactory, - CopilotProviderType, - ModelOutputType, - PromptMessage, -} from '../providers'; +import { PromptService } from '../prompt/service'; +import type { CopilotProvider, PromptMessage } from '../providers'; +import { CopilotProviderFactory } from '../providers/factory'; +import { CopilotProviderType, ModelOutputType } from '../providers/types'; import { CopilotStorage } from '../storage'; import { AudioBlobInfos, @@ -171,7 +167,7 @@ export class CopilotTranscriptionService { if (payload.success) { let { url, mimeType, infos } = payload.data; infos = infos || []; - if (url && mimeType && !infos.find(i => i.url === url)) { + if (url && mimeType && !infos.some(i => i.url === url)) { infos.push({ url, mimeType }); } diff --git a/packages/backend/server/src/plugins/copilot/types.ts b/packages/backend/server/src/plugins/copilot/types.ts index 71487152f9..fcb526a89b 100644 --- a/packages/backend/server/src/plugins/copilot/types.ts +++ b/packages/backend/server/src/plugins/copilot/types.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; -import type { ChatPrompt } from './prompt'; -import { PromptMessageSchema, PureMessageSchema } from './providers'; +import type { ChatPrompt } from './prompt/chat-prompt'; +import { PromptMessageSchema, PureMessageSchema } from './providers/types'; const takeFirst = (v: unknown) => (Array.isArray(v) ? v[0] : v); diff --git a/packages/backend/server/src/plugins/copilot/utils.ts b/packages/backend/server/src/plugins/copilot/utils.ts index 735285a119..c905c710fb 100644 --- a/packages/backend/server/src/plugins/copilot/utils.ts +++ b/packages/backend/server/src/plugins/copilot/utils.ts @@ -3,7 +3,7 @@ import { Readable } from 'node:stream'; import type { Request } from 'express'; import { OneMB, readBufferWithLimit } from '../../base'; -import type { PromptTools } from './providers'; +import type { PromptTools } from './providers/types'; import type { ToolsConfig } from './types'; export const MAX_EMBEDDABLE_SIZE = 50 * OneMB; diff --git a/packages/backend/server/src/plugins/copilot/workflow/node.ts b/packages/backend/server/src/plugins/copilot/workflow/node.ts index 45384060b6..4c0512449b 100644 --- a/packages/backend/server/src/plugins/copilot/workflow/node.ts +++ b/packages/backend/server/src/plugins/copilot/workflow/node.ts @@ -4,7 +4,7 @@ import { fileURLToPath } from 'node:url'; import { Logger } from '@nestjs/common'; import Piscina from 'piscina'; -import { CopilotChatOptions } from '../providers'; +import type { CopilotChatOptions } from '../providers/types'; import type { NodeExecuteResult, NodeExecutor } from './executor'; import { getWorkflowExecutor, NodeExecuteState } from './executor'; import type { diff --git a/packages/backend/server/src/plugins/copilot/workflow/service.ts b/packages/backend/server/src/plugins/copilot/workflow/service.ts index e58c893fef..c7a6870659 100644 --- a/packages/backend/server/src/plugins/copilot/workflow/service.ts +++ b/packages/backend/server/src/plugins/copilot/workflow/service.ts @@ -1,6 +1,6 @@ import { Injectable, Logger } from '@nestjs/common'; -import { CopilotChatOptions } from '../providers'; +import type { CopilotChatOptions } from '../providers/types'; import { WorkflowGraphList } from './graph'; import { WorkflowNode } from './node'; import type { WorkflowGraph, WorkflowGraphInstances } from './types'; diff --git a/packages/backend/server/src/plugins/copilot/workflow/workflow.ts b/packages/backend/server/src/plugins/copilot/workflow/workflow.ts index 03ee47b721..e67f22bea5 100644 --- a/packages/backend/server/src/plugins/copilot/workflow/workflow.ts +++ b/packages/backend/server/src/plugins/copilot/workflow/workflow.ts @@ -1,6 +1,6 @@ import { Logger } from '@nestjs/common'; -import { CopilotChatOptions } from '../providers'; +import type { CopilotChatOptions } from '../providers/types'; import { NodeExecuteState } from './executor'; import { WorkflowNode } from './node'; import type { WorkflowGraphInstances, WorkflowNodeState } from './types'; diff --git a/packages/backend/server/src/plugins/oauth/providers/apple.ts b/packages/backend/server/src/plugins/oauth/providers/apple.ts index 175b61df62..7ddde0d9f3 100644 --- a/packages/backend/server/src/plugins/oauth/providers/apple.ts +++ b/packages/backend/server/src/plugins/oauth/providers/apple.ts @@ -132,10 +132,11 @@ export class AppleOAuthProvider extends OAuthProvider { { method: 'GET' }, { treatServerErrorAsInvalid: true } ); + const idToken = tokens.idToken; const payload = await new Promise((resolve, reject) => { jwt.verify( - tokens.idToken!, + idToken, (header, callback) => { const key = keys.find(key => key.kid === header.kid); if (!key) { diff --git a/packages/common/nbstore/src/impls/cloud/blob.ts b/packages/common/nbstore/src/impls/cloud/blob.ts index 58d5170d96..d95318cf9a 100644 --- a/packages/common/nbstore/src/impls/cloud/blob.ts +++ b/packages/common/nbstore/src/impls/cloud/blob.ts @@ -29,6 +29,36 @@ const SHOULD_MANUAL_REDIRECT = BUILD_CONFIG.isAndroid || BUILD_CONFIG.isIOS || BUILD_CONFIG.isElectron; const UPLOAD_REQUEST_TIMEOUT = 0; +function toStrictArrayBuffer( + data: ArrayBuffer | ArrayBufferLike | ArrayBufferView +): ArrayBuffer { + if (data instanceof ArrayBuffer) { + return data; + } + + if (ArrayBuffer.isView(data)) { + if (data.buffer instanceof ArrayBuffer) { + if (data.byteOffset === 0 && data.byteLength === data.buffer.byteLength) { + return data.buffer; + } + return data.buffer.slice( + data.byteOffset, + data.byteOffset + data.byteLength + ); + } + + const bytes = new Uint8Array(data.buffer, data.byteOffset, data.byteLength); + const copy = new Uint8Array(bytes.byteLength); + copy.set(bytes); + return copy.buffer; + } + + const bytes = new Uint8Array(data); + const copy = new Uint8Array(bytes.byteLength); + copy.set(bytes); + return copy.buffer; +} + export class CloudBlobStorage extends BlobStorageBase { static readonly identifier = 'CloudBlobStorage'; override readonly isReadonly = false; @@ -127,8 +157,11 @@ export class CloudBlobStorage extends BlobStorageBase { if (upload.method === BlobUploadMethod.PRESIGNED) { try { + if (!upload.uploadUrl) { + throw new Error('Missing upload URL for presigned upload.'); + } await this.uploadViaPresigned( - upload.uploadUrl!, + upload.uploadUrl, upload.headers, blob.data, signal @@ -143,15 +176,20 @@ export class CloudBlobStorage extends BlobStorageBase { if (upload.method === BlobUploadMethod.MULTIPART) { try { + if (!upload.uploadId || !upload.partSize) { + throw new Error( + 'Missing upload ID or part size for multipart upload.' + ); + } const parts = await this.uploadViaMultipart( blob.key, - upload.uploadId!, - upload.partSize!, + upload.uploadId, + upload.partSize, blob.data, upload.uploadedParts, signal ); - await this.completeUpload(blob.key, upload.uploadId!, parts, signal); + await this.completeUpload(blob.key, upload.uploadId, parts, signal); return; } catch { if (upload.uploadId) { @@ -216,7 +254,9 @@ export class CloudBlobStorage extends BlobStorageBase { query: setBlobMutation, variables: { workspaceId: this.options.id, - blob: new File([blob.data], blob.key, { type: blob.mime }), + blob: new File([toStrictArrayBuffer(blob.data)], blob.key, { + type: blob.mime, + }), }, context: { signal }, timeout: UPLOAD_REQUEST_TIMEOUT, @@ -232,7 +272,7 @@ export class CloudBlobStorage extends BlobStorageBase { const res = await this.fetchWithTimeout(uploadUrl, { method: 'PUT', headers: headers ?? undefined, - body: data, + body: toStrictArrayBuffer(data), signal, timeout: UPLOAD_REQUEST_TIMEOUT, }); @@ -275,7 +315,7 @@ export class CloudBlobStorage extends BlobStorageBase { { method: 'PUT', headers: part.workspace.blobUploadPartUrl.headers ?? undefined, - body: chunk, + body: toStrictArrayBuffer(chunk), signal, timeout: UPLOAD_REQUEST_TIMEOUT, } diff --git a/packages/common/nbstore/src/impls/cloud/indexer.ts b/packages/common/nbstore/src/impls/cloud/indexer.ts index 5016da553b..a2fae5fabe 100644 --- a/packages/common/nbstore/src/impls/cloud/indexer.ts +++ b/packages/common/nbstore/src/impls/cloud/indexer.ts @@ -141,10 +141,10 @@ export class CloudIndexerStorage extends IndexerStorageBase { } override async refreshIfNeed(): Promise { - return Promise.resolve(); + return; } override async indexVersion(): Promise { - return Promise.resolve(1); + return 1; } } diff --git a/packages/common/nbstore/src/impls/idb/indexer/index.ts b/packages/common/nbstore/src/impls/idb/indexer/index.ts index f0413c6117..84f3a014e0 100644 --- a/packages/common/nbstore/src/impls/idb/indexer/index.ts +++ b/packages/common/nbstore/src/impls/idb/indexer/index.ts @@ -222,6 +222,6 @@ export class IndexedDBIndexerStorage extends IndexerStorageBase { // Get the current indexer version // increase this number to re-index all docs async indexVersion(): Promise { - return Promise.resolve(1); + return 1; } } diff --git a/packages/common/nbstore/src/impls/sqlite/indexer/index.ts b/packages/common/nbstore/src/impls/sqlite/indexer/index.ts index 4a374c5a4d..3c883aa682 100644 --- a/packages/common/nbstore/src/impls/sqlite/indexer/index.ts +++ b/packages/common/nbstore/src/impls/sqlite/indexer/index.ts @@ -1,4 +1,5 @@ -import { merge, Observable, of, Subject } from 'rxjs'; +import type { Observable } from 'rxjs'; +import { merge, of, Subject } from 'rxjs'; import { filter, throttleTime } from 'rxjs/operators'; import { share } from '../../../connection'; @@ -194,9 +195,9 @@ export class SqliteIndexerStorage extends IndexerStorageBase { const schema = IndexerSchema[table]; for (const [field, values] of document.fields) { const fieldSchema = schema[field]; - // @ts-expect-error + // @ts-expect-error -- IndexerSchema uses runtime-keyed fields from each table schema. const shouldIndex = fieldSchema.index !== false; - // @ts-expect-error + // @ts-expect-error -- IndexerSchema uses runtime-keyed fields from each table schema. const shouldStore = fieldSchema.store !== false; if (!shouldStore && !shouldIndex) continue; diff --git a/packages/common/nbstore/src/storage/dummy/indexer.ts b/packages/common/nbstore/src/storage/dummy/indexer.ts index 8df5ad9675..e2d9b14e1f 100644 --- a/packages/common/nbstore/src/storage/dummy/indexer.ts +++ b/packages/common/nbstore/src/storage/dummy/indexer.ts @@ -86,9 +86,9 @@ export class DummyIndexerStorage extends IndexerStorageBase { return Promise.resolve(); } override async refreshIfNeed(): Promise { - return Promise.resolve(); + return; } override async indexVersion(): Promise { - return Promise.resolve(0); + return 0; } } diff --git a/packages/common/nbstore/src/sync/blob/index.ts b/packages/common/nbstore/src/sync/blob/index.ts index 78736d3d46..c2a99f26dd 100644 --- a/packages/common/nbstore/src/sync/blob/index.ts +++ b/packages/common/nbstore/src/sync/blob/index.ts @@ -190,6 +190,7 @@ export class BlobSyncImpl implements BlobSync { ): Promise { return Promise.race([ Promise.all( + // eslint-disable-next-line @typescript-eslint/await-thenable peerId ? [this.fullDownloadPeer(peerId)] : this.peers.map(p => this.fullDownloadPeer(p.peerId)) diff --git a/packages/common/nbstore/src/telemetry/manager.ts b/packages/common/nbstore/src/telemetry/manager.ts index d556184049..7a413ae0bb 100644 --- a/packages/common/nbstore/src/telemetry/manager.ts +++ b/packages/common/nbstore/src/telemetry/manager.ts @@ -125,8 +125,8 @@ export class TelemetryManager { private mergeContext(event: TelemetryEvent): TelemetryEvent { const mergedUserProps = { - ...(this.context.userProperties ?? {}), - ...(event.userProperties ?? {}), + ...this.context.userProperties, + ...event.userProperties, }; const mergedContext = { diff --git a/packages/common/s3-compat/src/index.ts b/packages/common/s3-compat/src/index.ts index 1dc78d29a5..2ce17adea7 100644 --- a/packages/common/s3-compat/src/index.ts +++ b/packages/common/s3-compat/src/index.ts @@ -1,6 +1,6 @@ -import { Buffer } from 'node:buffer'; +import type { Buffer } from 'node:buffer'; import { stringify as stringifyQuery } from 'node:querystring'; -import { Readable } from 'node:stream'; +import type { Readable } from 'node:stream'; import aws4 from 'aws4'; import { XMLParser } from 'fast-xml-parser'; @@ -180,16 +180,16 @@ export function parseListPartsXml(xml: string): ParsedListParts { function buildEndpoint(config: S3CompatConfig) { const url = new URL(config.endpoint); if (config.forcePathStyle) { - const segments = url.pathname.split('/').filter(Boolean); - if (segments[0] !== config.bucket) { + const firstSegment = url.pathname.split('/').find(Boolean); + if (firstSegment !== config.bucket) { url.pathname = joinPath(url.pathname, config.bucket); } return url; } - const pathSegments = url.pathname.split('/').filter(Boolean); + const firstSegment = url.pathname.split('/').find(Boolean); const hostHasBucket = url.hostname.startsWith(`${config.bucket}.`); - const pathHasBucket = pathSegments[0] === config.bucket; + const pathHasBucket = firstSegment === config.bucket; if (!hostHasBucket && !pathHasBucket) { url.hostname = `${config.bucket}.${url.hostname}`; } @@ -297,7 +297,7 @@ export class S3Compat implements S3CompatClient { const expiresInSeconds = this.presignConfig.expiresInSeconds; const path = this.buildObjectPath(key); const queryString = buildQuery({ - ...(query ?? {}), + ...query, 'X-Amz-Expires': expiresInSeconds, }); const requestPath = queryString ? `${path}?${queryString}` : path; diff --git a/packages/frontend/admin/src/components/shared/data-table.tsx b/packages/frontend/admin/src/components/shared/data-table.tsx index d11d43e521..8906cf5165 100644 --- a/packages/frontend/admin/src/components/shared/data-table.tsx +++ b/packages/frontend/admin/src/components/shared/data-table.tsx @@ -66,6 +66,7 @@ export function SharedDataTable({ setColumnFilters([]); }, [resetFiltersDeps]); + // eslint-disable-next-line react-hooks/incompatible-library const table = useReactTable({ data, columns, diff --git a/packages/frontend/admin/src/modules/accounts/index.tsx b/packages/frontend/admin/src/modules/accounts/index.tsx index e31fce6059..5e65bc170a 100644 --- a/packages/frontend/admin/src/modules/accounts/index.tsx +++ b/packages/frontend/admin/src/modules/accounts/index.tsx @@ -1,4 +1,4 @@ -import { FeatureType } from '@affine/graphql'; +import type { FeatureType } from '@affine/graphql'; import { useEffect, useMemo, useState } from 'react'; import { Header } from '../header'; diff --git a/packages/frontend/admin/src/modules/accounts/use-user-list.ts b/packages/frontend/admin/src/modules/accounts/use-user-list.ts index 5e0c531237..8bd307e88b 100644 --- a/packages/frontend/admin/src/modules/accounts/use-user-list.ts +++ b/packages/frontend/admin/src/modules/accounts/use-user-list.ts @@ -1,5 +1,6 @@ import { useQuery } from '@affine/admin/use-query'; -import { FeatureType, listUsersQuery } from '@affine/graphql'; +import type { FeatureType } from '@affine/graphql'; +import { listUsersQuery } from '@affine/graphql'; import { useEffect, useMemo, useState } from 'react'; export const useUserList = (filter?: { diff --git a/packages/frontend/admin/src/modules/workspaces/components/data-table-toolbar.tsx b/packages/frontend/admin/src/modules/workspaces/components/data-table-toolbar.tsx index 65c4a46b18..ac3cc62fa5 100644 --- a/packages/frontend/admin/src/modules/workspaces/components/data-table-toolbar.tsx +++ b/packages/frontend/admin/src/modules/workspaces/components/data-table-toolbar.tsx @@ -1,6 +1,7 @@ import { Button } from '@affine/admin/components/ui/button'; import { Input } from '@affine/admin/components/ui/input'; -import { AdminWorkspaceSort, FeatureType } from '@affine/graphql'; +import type { FeatureType } from '@affine/graphql'; +import { AdminWorkspaceSort } from '@affine/graphql'; import type { Table } from '@tanstack/react-table'; import { type ChangeEvent, diff --git a/packages/frontend/admin/src/modules/workspaces/components/workspace-panel.tsx b/packages/frontend/admin/src/modules/workspaces/components/workspace-panel.tsx index 77b18befd4..cbfd4db6dc 100644 --- a/packages/frontend/admin/src/modules/workspaces/components/workspace-panel.tsx +++ b/packages/frontend/admin/src/modules/workspaces/components/workspace-panel.tsx @@ -7,11 +7,11 @@ import { Input } from '@affine/admin/components/ui/input'; import { Label } from '@affine/admin/components/ui/label'; import { Separator } from '@affine/admin/components/ui/separator'; import { Switch } from '@affine/admin/components/ui/switch'; +import type { FeatureType } from '@affine/graphql'; import { adminUpdateWorkspaceMutation, adminWorkspaceQuery, adminWorkspacesQuery, - FeatureType, } from '@affine/graphql'; import { AccountIcon } from '@blocksuite/icons/rc'; import { cssVarV2 } from '@toeverything/theme/v2'; diff --git a/packages/frontend/admin/src/modules/workspaces/index.tsx b/packages/frontend/admin/src/modules/workspaces/index.tsx index 6431e01c0d..5d789d38d9 100644 --- a/packages/frontend/admin/src/modules/workspaces/index.tsx +++ b/packages/frontend/admin/src/modules/workspaces/index.tsx @@ -1,4 +1,5 @@ -import { AdminWorkspaceSort, FeatureType } from '@affine/graphql'; +import type { FeatureType } from '@affine/graphql'; +import { AdminWorkspaceSort } from '@affine/graphql'; import { useState } from 'react'; import { Header } from '../header'; diff --git a/packages/frontend/admin/src/modules/workspaces/use-workspace-list.ts b/packages/frontend/admin/src/modules/workspaces/use-workspace-list.ts index 39e1561e27..265453051f 100644 --- a/packages/frontend/admin/src/modules/workspaces/use-workspace-list.ts +++ b/packages/frontend/admin/src/modules/workspaces/use-workspace-list.ts @@ -1,9 +1,8 @@ import { useQuery } from '@affine/admin/use-query'; +import type { AdminWorkspaceSort, FeatureType } from '@affine/graphql'; import { adminWorkspacesCountQuery, - AdminWorkspaceSort, adminWorkspacesQuery, - FeatureType, } from '@affine/graphql'; import { useEffect, useMemo, useState } from 'react'; @@ -27,7 +26,7 @@ export const useWorkspaceList = (filter?: { .join(',')}-${filter?.orderBy ?? ''}-${JSON.stringify( filter?.flags ?? {} )}`, - [filter?.features, filter?.flags, filter?.keyword, filter?.orderBy] + [filter] ); useEffect(() => { @@ -52,18 +51,7 @@ export const useWorkspaceList = (filter?: { enableDocEmbedding: filter?.flags?.enableDocEmbedding, }, }), - [ - filter?.features, - filter?.flags?.enableAi, - filter?.flags?.enableDocEmbedding, - filter?.flags?.enableSharing, - filter?.flags?.enableUrlPreview, - filter?.flags?.public, - filter?.keyword, - filter?.orderBy, - pagination.pageIndex, - pagination.pageSize, - ] + [filter, pagination.pageIndex, pagination.pageSize] ); const { data: listData, isValidating: isListValidating } = useQuery( diff --git a/packages/frontend/component/src/hooks/use-disposable.ts b/packages/frontend/component/src/hooks/use-disposable.ts index 08b929d693..e1b7cf31e5 100644 --- a/packages/frontend/component/src/hooks/use-disposable.ts +++ b/packages/frontend/component/src/hooks/use-disposable.ts @@ -24,7 +24,7 @@ export function useDisposable( error: null, }); - // oxlint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react/exhaustive-deps useEffect(() => { const abortController = new AbortController(); let _data: T | null = null; @@ -54,7 +54,7 @@ export function useDisposable( } } }; - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react/exhaustive-deps }, deps || []); return state; diff --git a/packages/frontend/component/src/hooks/use-ref-effect.ts b/packages/frontend/component/src/hooks/use-ref-effect.ts index 447c2f2b6d..b1ebec054d 100644 --- a/packages/frontend/component/src/hooks/use-ref-effect.ts +++ b/packages/frontend/component/src/hooks/use-ref-effect.ts @@ -3,9 +3,6 @@ */ import { useDebugValue, useEffect, useState } from 'react'; -// internalRef is used as a reference and therefore save to be used inside an effect -/* eslint-disable react-hooks/exhaustive-deps */ - // the `process.env.NODE_ENV !== 'production'` condition is resolved by the build tool const noop: (...args: any[]) => any = () => {}; @@ -84,6 +81,7 @@ export const useRefEffect = ( } }; }, // Keep a ref to the latest dependencies + // oxlint-disable-next-line react/exhaustive-deps (internalRef.dependencies_ = dependencies) ); diff --git a/packages/frontend/component/src/ui/button/index.ts b/packages/frontend/component/src/ui/button/index.ts index a8957d85da..cd829bd05b 100644 --- a/packages/frontend/component/src/ui/button/index.ts +++ b/packages/frontend/component/src/ui/button/index.ts @@ -1,4 +1,3 @@ export * from './button'; export * from './dropdown-button'; export * from './icon-button'; -export * from './radio'; diff --git a/packages/frontend/component/src/ui/button/radio.tsx b/packages/frontend/component/src/ui/button/radio.tsx deleted file mode 100644 index f365836d8b..0000000000 --- a/packages/frontend/component/src/ui/button/radio.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import type { - RadioGroupItemProps, - RadioGroupProps, -} from '@radix-ui/react-radio-group'; -import * as RadixRadioGroup from '@radix-ui/react-radio-group'; -import clsx from 'clsx'; -import type { CSSProperties } from 'react'; -import { forwardRef } from 'react'; - -import { RadioGroup } from '../radio'; -import * as styles from './styles.css'; - -// for reference -RadioGroup; - -/** - * @deprecated - * use {@link RadioGroup } instead - */ -export const RadioButton = forwardRef< - HTMLButtonElement, - RadioGroupItemProps & { spanStyle?: string } ->(({ children, className, spanStyle, ...props }, ref) => { - return ( - - - {children} - - - {children} - - - ); -}); -RadioButton.displayName = 'RadioButton'; - -/** - * @deprecated - * use {@link RadioGroup} instead - */ -export const RadioButtonGroup = forwardRef< - HTMLDivElement, - RadioGroupProps & { width?: CSSProperties['width'] } ->(({ className, style, width, ...props }, ref) => { - return ( - - ); -}); -RadioButtonGroup.displayName = 'RadioButtonGroup'; diff --git a/packages/frontend/component/src/ui/button/styles.css.ts b/packages/frontend/component/src/ui/button/styles.css.ts index 43d7432e9f..0cdc9c51cb 100644 --- a/packages/frontend/component/src/ui/button/styles.css.ts +++ b/packages/frontend/component/src/ui/button/styles.css.ts @@ -1,5 +1,6 @@ import { cssVar } from '@toeverything/theme'; import { style } from '@vanilla-extract/css'; + export const dropdownBtn = style({ display: 'inline-flex', alignItems: 'center', @@ -30,6 +31,7 @@ export const dropdownBtn = style({ }, }, }); + export const divider = style({ width: '0.5px', height: '16px', @@ -38,6 +40,7 @@ export const divider = style({ margin: '0 4px', marginRight: 0, }); + export const dropdownWrapper = style({ width: '100%', height: '100%', @@ -47,6 +50,7 @@ export const dropdownWrapper = style({ paddingLeft: '4px', paddingRight: '10px', }); + export const dropdownIcon = style({ borderRadius: '4px', selectors: { @@ -55,55 +59,3 @@ export const dropdownIcon = style({ }, }, }); -export const radioButton = style({ - flexGrow: 1, - flex: 1, - selectors: { - '&:not(:last-of-type)': { - marginRight: '4px', - }, - }, -}); -export const radioButtonContent = style({ - fontSize: cssVar('fontXs'), - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - height: '28px', - padding: '4px 8px', - borderRadius: '8px', - filter: 'drop-shadow(0px 0px 4px rgba(0, 0, 0, 0.1))', - whiteSpace: 'nowrap', - userSelect: 'none', - fontWeight: 600, - selectors: { - '&:hover': { - background: cssVar('hoverColor'), - }, - '&[data-state="checked"]': { - background: cssVar('white'), - }, - }, -}); -export const radioUncheckedButton = style([ - radioButtonContent, - { - color: cssVar('textSecondaryColor'), - filter: 'none', - selectors: { - '[data-state="checked"] > &': { - display: 'none', - }, - }, - }, -]); -export const radioButtonGroup = style({ - display: 'inline-flex', - justifyContent: 'space-between', - alignItems: 'center', - background: cssVar('hoverColorFilled'), - borderRadius: '10px', - padding: '2px', - // @ts-expect-error - fix electron drag - WebkitAppRegion: 'no-drag', -}); diff --git a/packages/frontend/component/src/ui/date-picker/calendar/calendar.tsx b/packages/frontend/component/src/ui/date-picker/calendar/calendar.tsx index 03e2b96846..70016d3a1f 100644 --- a/packages/frontend/component/src/ui/date-picker/calendar/calendar.tsx +++ b/packages/frontend/component/src/ui/date-picker/calendar/calendar.tsx @@ -46,7 +46,7 @@ export const DatePicker = (props: DatePickerProps) => { setCursor(dayjs(v)); onChange?.(v); }, - [onChange] + [setMode, onChange] ); const onCursorChange = useCallback( diff --git a/packages/frontend/component/src/ui/dnd/draggable.ts b/packages/frontend/component/src/ui/dnd/draggable.ts index 354f60afcd..811c1df640 100644 --- a/packages/frontend/component/src/ui/dnd/draggable.ts +++ b/packages/frontend/component/src/ui/dnd/draggable.ts @@ -83,7 +83,7 @@ export const useDraggable = ( } : undefined, }; - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react/exhaustive-deps }, [...deps, getOptions, context.toExternalData]); useEffect(() => { diff --git a/packages/frontend/component/src/ui/dnd/drop-target.ts b/packages/frontend/component/src/ui/dnd/drop-target.ts index 0a4e3d5b47..7600867e2a 100644 --- a/packages/frontend/component/src/ui/dnd/drop-target.ts +++ b/packages/frontend/component/src/ui/dnd/drop-target.ts @@ -206,7 +206,7 @@ export const useDropTarget = ( (dropTargetContext.fromExternalData as fromExternalData)) : undefined, }; - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react/exhaustive-deps }, [...deps, getOptions, dropTargetContext.fromExternalData]); const getDropTargetOptions = useCallback(() => { diff --git a/packages/frontend/component/src/ui/dnd/monitor.tsx b/packages/frontend/component/src/ui/dnd/monitor.tsx index 1a0d618ff0..f2dc0a8684 100644 --- a/packages/frontend/component/src/ui/dnd/monitor.tsx +++ b/packages/frontend/component/src/ui/dnd/monitor.tsx @@ -94,7 +94,7 @@ export const useDndMonitor = ( (dropTargetContext.fromExternalData as fromExternalData)) : undefined, }; - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react/exhaustive-deps }, [...deps, getOptions, dropTargetContext.fromExternalData]); const monitorOptions = useMemo(() => { diff --git a/packages/frontend/component/src/ui/editable/inline-edit.tsx b/packages/frontend/component/src/ui/editable/inline-edit.tsx index 4b76d8311e..b739a3fdbe 100644 --- a/packages/frontend/component/src/ui/editable/inline-edit.tsx +++ b/packages/frontend/component/src/ui/editable/inline-edit.tsx @@ -93,15 +93,15 @@ export const InlineEdit = ({ const [editingValue, setEditingValue] = useState(value); const inputRef = useRef(null); - useImperativeHandle(handleRef, () => ({ - triggerEdit, - })); - const triggerEdit = useCallback(() => { if (!editable) return; setEditing(true); }, [editable]); + useImperativeHandle(handleRef, () => ({ + triggerEdit, + })); + const onDoubleClick = useCallback(() => { if (trigger !== 'doubleClick') return; triggerEdit(); diff --git a/packages/frontend/component/src/ui/input/row-input.tsx b/packages/frontend/component/src/ui/input/row-input.tsx index e4bb1073b1..c73104ae37 100644 --- a/packages/frontend/component/src/ui/input/row-input.tsx +++ b/packages/frontend/component/src/ui/input/row-input.tsx @@ -69,7 +69,7 @@ export const RowInput = forwardRef( if (!onBlur) return; selectRef.current?.addEventListener('blur', onBlur as any); return () => { - // oxlint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react/exhaustive-deps selectRef.current?.removeEventListener('blur', onBlur as any); }; }, [onBlur, selectRef]); diff --git a/packages/frontend/core/src/__tests__/ai/utils/apply-model/apply-patch-to-doc.spec.ts b/packages/frontend/core/src/__tests__/ai/utils/apply-model/apply-patch-to-doc.spec.ts index b8301bc3bf..7c395f8724 100644 --- a/packages/frontend/core/src/__tests__/ai/utils/apply-model/apply-patch-to-doc.spec.ts +++ b/packages/frontend/core/src/__tests__/ai/utils/apply-model/apply-patch-to-doc.spec.ts @@ -1,7 +1,6 @@ /** * @vitest-environment happy-dom */ -import '@blocksuite/affine-shared/test-utils'; import { getInternalStoreExtensions } from '@blocksuite/affine/extensions/store'; import { StoreExtensionManager } from '@blocksuite/affine-ext-loader'; diff --git a/packages/frontend/core/src/blocksuite/__tests__/pan-tool-middle-mouse.spec.ts b/packages/frontend/core/src/blocksuite/__tests__/pan-tool-middle-mouse.spec.ts index 80a5d17ce0..4c5dfd633a 100644 --- a/packages/frontend/core/src/blocksuite/__tests__/pan-tool-middle-mouse.spec.ts +++ b/packages/frontend/core/src/blocksuite/__tests__/pan-tool-middle-mouse.spec.ts @@ -3,7 +3,7 @@ import { PanTool } from '@blocksuite/affine-gfx-pointer'; import { on } from '@blocksuite/affine-shared/utils'; import type { PointerEventState } from '@blocksuite/std'; import { - BaseTool, + type BaseTool, MouseButton, type ToolOptionWithType, type ToolType, @@ -21,9 +21,7 @@ const pointerUpHandlers: unknown[] = []; const pointerUpDisposers: Array> = []; vi.mock('@blocksuite/affine-shared/utils', async () => { - const actual = await vi.importActual< - typeof import('@blocksuite/affine-shared/utils') - >('@blocksuite/affine-shared/utils'); + const actual = await vi.importActual('@blocksuite/affine-shared/utils'); return { ...actual, diff --git a/packages/frontend/core/src/blocksuite/ai/components/ai-tools/doc-compose.ts b/packages/frontend/core/src/blocksuite/ai/components/ai-tools/doc-compose.ts index ad0de21718..f43ed28c7a 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/ai-tools/doc-compose.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/ai-tools/doc-compose.ts @@ -11,7 +11,7 @@ import type { BlockStdScope } from '@blocksuite/std'; import { css, html } from 'lit'; import { property } from 'lit/decorators.js'; -import { getCustomPageEditorBlockSpecs } from '../text-renderer'; +import { getCustomPageEditorBlockSpecs } from '../page-editor-block-specs'; import { ArtifactTool } from './artifact-tool'; import type { ToolError } from './type'; diff --git a/packages/frontend/core/src/blocksuite/ai/components/page-editor-block-specs.ts b/packages/frontend/core/src/blocksuite/ai/components/page-editor-block-specs.ts new file mode 100644 index 0000000000..39957c60d2 --- /dev/null +++ b/packages/frontend/core/src/blocksuite/ai/components/page-editor-block-specs.ts @@ -0,0 +1,22 @@ +import { ViewExtensionManager } from '@blocksuite/affine/ext-loader'; +import { getInternalViewExtensions } from '@blocksuite/affine/extensions/view'; +import { BlockViewIdentifier } from '@blocksuite/affine/std'; +import type { ExtensionType } from '@blocksuite/affine/store'; +import { literal } from 'lit/static-html.js'; + +const manager = new ViewExtensionManager([...getInternalViewExtensions()]); +const customPageEditorBlockSpecs: ExtensionType[] = [ + ...manager.get('page'), + { + setup: di => { + di.override( + BlockViewIdentifier('affine:page'), + () => literal`affine-page-root` + ); + }, + }, +]; + +export const getCustomPageEditorBlockSpecs = () => { + return customPageEditorBlockSpecs; +}; diff --git a/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts b/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts index 22a78b0110..ccf2a6e464 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts @@ -1,5 +1,4 @@ import { createReactComponentFromLit } from '@affine/component'; -import { getViewManager } from '@affine/core/blocksuite/manager/view'; import type { FeatureFlagService } from '@affine/core/modules/feature-flag'; import { PeekViewProvider } from '@blocksuite/affine/components/peek'; import { SignalWatcher, WithDisposable } from '@blocksuite/affine/global/lit'; @@ -13,7 +12,6 @@ import { import { unsafeCSSVarV2 } from '@blocksuite/affine/shared/theme'; import { BlockStdScope, - BlockViewIdentifier, type EditorHost, ShadowlessElement, } from '@blocksuite/affine/std'; @@ -32,27 +30,12 @@ import { css, html, nothing, type PropertyValues, unsafeCSS } from 'lit'; import { property, query } from 'lit/decorators.js'; import { classMap } from 'lit/directives/class-map.js'; import { keyed } from 'lit/directives/keyed.js'; -import { literal } from 'lit/static-html.js'; import React from 'react'; import { filter } from 'rxjs/operators'; import { markDownToDoc } from '../../utils'; import type { AffineAIPanelState } from '../widgets/ai-panel/type'; - -export const getCustomPageEditorBlockSpecs: () => ExtensionType[] = () => { - const manager = getViewManager().config.init().value; - return [ - ...manager.get('page'), - { - setup: di => { - di.override( - BlockViewIdentifier('affine:page'), - () => literal`affine-page-root` - ); - }, - }, - ]; -}; +import { getCustomPageEditorBlockSpecs } from './page-editor-block-specs'; const customHeadingStyles = css` .custom-heading { diff --git a/packages/frontend/core/src/blocksuite/attachment-viewer/index.tsx b/packages/frontend/core/src/blocksuite/attachment-viewer/index.tsx index 35c18b855f..d08d9005bf 100644 --- a/packages/frontend/core/src/blocksuite/attachment-viewer/index.tsx +++ b/packages/frontend/core/src/blocksuite/attachment-viewer/index.tsx @@ -1,4 +1,7 @@ -import { ViewBody, ViewHeader } from '@affine/core/modules/workbench'; +import { + ViewBody, + ViewHeader, +} from '@affine/core/modules/workbench/view/view-islands'; import { AttachmentFallback, AttachmentPreviewErrorBoundary } from './error'; import { PDFViewer } from './pdf/pdf-viewer'; diff --git a/packages/frontend/core/src/blocksuite/block-suite-editor/blocksuite-editor.tsx b/packages/frontend/core/src/blocksuite/block-suite-editor/blocksuite-editor.tsx index 3c1a20b9d7..5dc83a3aee 100644 --- a/packages/frontend/core/src/blocksuite/block-suite-editor/blocksuite-editor.tsx +++ b/packages/frontend/core/src/blocksuite/block-suite-editor/blocksuite-editor.tsx @@ -280,6 +280,7 @@ const BlockSuiteEditorImpl = ({ export const BlockSuiteEditor = (props: EditorProps) => { const [isLoading, setIsLoading] = useState(true); const [longerLoading, setLongerLoading] = useState(false); + // eslint-disable-next-line react-hooks/purity const [loadStartTime] = useState(Date.now()); const workspaceService = useService(WorkspaceService); diff --git a/packages/frontend/core/src/blocksuite/database-block/properties/file/view.tsx b/packages/frontend/core/src/blocksuite/database-block/properties/file/view.tsx index dd6c177a3c..55fba7b825 100644 --- a/packages/frontend/core/src/blocksuite/database-block/properties/file/view.tsx +++ b/packages/frontend/core/src/blocksuite/database-block/properties/file/view.tsx @@ -1,7 +1,7 @@ import { Popover, uniReactRoot } from '@affine/component'; import { Button } from '@affine/component/ui/button'; import { Menu, MenuItem } from '@affine/component/ui/menu'; -import { PeekViewService } from '@affine/core/modules/peek-view'; +import { PeekViewService } from '@affine/core/modules/peek-view/services/peek-view'; import { type Cell, type CellRenderProps, @@ -361,8 +361,10 @@ const FileCellComponent: ForwardRefRenderFunction< CellRenderProps<{}, FileCellRawValueType, FileCellJsonValueType> > = (props, ref): ReactNode => { const peekView = useService(PeekViewService); - // eslint-disable-next-line react-hooks/exhaustive-deps - const manager = useMemo(() => new FileCellManager(props, peekView), []); + const manager = useMemo( + () => new FileCellManager(props, peekView), // eslint-disable-line react-hooks/preserve-manual-memoization + [] // oxlint-disable-line react/exhaustive-deps + ); useEffect(() => { return () => { diff --git a/packages/frontend/core/src/blocksuite/database-block/properties/member/multi-member-select/index.tsx b/packages/frontend/core/src/blocksuite/database-block/properties/member/multi-member-select/index.tsx index 840c96d5df..769554b4e0 100644 --- a/packages/frontend/core/src/blocksuite/database-block/properties/member/multi-member-select/index.tsx +++ b/packages/frontend/core/src/blocksuite/database-block/properties/member/multi-member-select/index.tsx @@ -260,8 +260,10 @@ export const MemberPreview = ({ export const MultiMemberSelect: React.FC = props => { const inputRef = useRef(null); const memberListRef = useRef(null); - // eslint-disable-next-line react-hooks/exhaustive-deps - const memberManager = useMemo(() => new MemberManager(props), []); + const memberManager = useMemo( + () => new MemberManager(props), // eslint-disable-line react-hooks/preserve-manual-memoization + [] // oxlint-disable-line react/exhaustive-deps + ); const isLoading = useSignalValue(memberManager.userListService.isLoading$); const selectedMembers = useSignalValue(memberManager.selectedMembers); diff --git a/packages/frontend/core/src/blocksuite/database-block/properties/member/view.tsx b/packages/frontend/core/src/blocksuite/database-block/properties/member/view.tsx index 3d9b599a23..c8a79e6180 100644 --- a/packages/frontend/core/src/blocksuite/database-block/properties/member/view.tsx +++ b/packages/frontend/core/src/blocksuite/database-block/properties/member/view.tsx @@ -69,8 +69,10 @@ const MemberCellComponent: ForwardRefRenderFunction< DataViewCellLifeCycle, CellRenderProps<{}, MemberCellRawValueType, MemberCellJsonValueType> > = (props, ref): ReactNode => { - // eslint-disable-next-line react-hooks/exhaustive-deps - const manager = useMemo(() => new MemberManager(props), []); + const manager = useMemo( + () => new MemberManager(props), // eslint-disable-line react-hooks/preserve-manual-memoization + [] // oxlint-disable-line react/exhaustive-deps + ); useImperativeHandle( ref, diff --git a/packages/frontend/core/src/components/guard/use-guard.tsx b/packages/frontend/core/src/components/guard/use-guard.tsx index ff67c339b2..79f4019a84 100644 --- a/packages/frontend/core/src/components/guard/use-guard.tsx +++ b/packages/frontend/core/src/components/guard/use-guard.tsx @@ -14,17 +14,15 @@ export const useGuard = < ) => { const guardService = useService(GuardService); useEffect(() => { - // oxlint-disable-next-line exhaustive-deps guardService.revalidateCan(action, ...args); - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react/exhaustive-deps }, [action, guardService, ...args]); const livedata$ = useMemo( () => { - // oxlint-disable-next-line exhaustive-deps return guardService.can$(action, ...args); }, - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react/exhaustive-deps [action, guardService, ...args] ); diff --git a/packages/frontend/core/src/components/hooks/affine-async-hooks.ts b/packages/frontend/core/src/components/hooks/affine-async-hooks.ts index a5e9ba64a1..444461e171 100644 --- a/packages/frontend/core/src/components/hooks/affine-async-hooks.ts +++ b/packages/frontend/core/src/components/hooks/affine-async-hooks.ts @@ -22,9 +22,9 @@ export function useAsyncCallback( const handleAsyncError = React.useContext(AsyncCallbackContext); return React.useCallback( (...args: any) => { - // oxlint-disable-next-line exhaustive-deps + // oxlint-disable-next-line react/exhaustive-deps callback(...args).catch(e => handleAsyncError(e)); }, - [...deps] // eslint-disable-line react-hooks/exhaustive-deps + [...deps] // oxlint-disable-line react/exhaustive-deps ); } diff --git a/packages/frontend/core/src/components/hooks/use-catch-event-hook.ts b/packages/frontend/core/src/components/hooks/use-catch-event-hook.ts index 3040e72ce9..bde9c4e4b9 100644 --- a/packages/frontend/core/src/components/hooks/use-catch-event-hook.ts +++ b/packages/frontend/core/src/components/hooks/use-catch-event-hook.ts @@ -9,12 +9,9 @@ export const useCatchEventCallback = < cb: (e: E, ...args: Args) => void | Promise, deps: DependencyList ) => { - return useAsyncCallback( - async (e: E, ...args: Args) => { - e.stopPropagation(); - await cb(e, ...args); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - deps - ); + return useAsyncCallback(async (e: E, ...args: Args) => { + e.stopPropagation(); + await cb(e, ...args); + // oxlint-disable-next-line react/exhaustive-deps + }, deps); }; diff --git a/packages/frontend/core/src/components/page-list/operation-cell.tsx b/packages/frontend/core/src/components/page-list/operation-cell.tsx index 943f552d74..524237b5d2 100644 --- a/packages/frontend/core/src/components/page-list/operation-cell.tsx +++ b/packages/frontend/core/src/components/page-list/operation-cell.tsx @@ -89,7 +89,7 @@ const PageOperationCellMenuItem = ({ track.$.docInfoPanel.$.open(); workspaceDialogService.open('doc-info', { docId: blocksuiteDoc.id }); } - }, [blocksuiteDoc?.id, workspaceDialogService]); + }, [blocksuiteDoc, workspaceDialogService]); const onDisablePublicSharing = useCallback(() => { // TODO(@EYHN): implement disable public sharing diff --git a/packages/frontend/core/src/components/tags/tag-edit-menu.tsx b/packages/frontend/core/src/components/tags/tag-edit-menu.tsx index 8c4e43336e..260c9cadc3 100644 --- a/packages/frontend/core/src/components/tags/tag-edit-menu.tsx +++ b/packages/frontend/core/src/components/tags/tag-edit-menu.tsx @@ -68,9 +68,7 @@ const DesktopTagEditMenu = ({ } type="danger" - onClick={() => { - tag?.id ? onTagDelete(tag.id) : null; - }} + onClick={() => onTagDelete(tag.id)} > {t['Delete']()} @@ -203,9 +201,7 @@ const MobileTagEditMenu = ({ { - onTagDelete(tag.id); - }} + onClick={() => onTagDelete(tag.id)} > {t['Delete']()} diff --git a/packages/frontend/core/src/components/tags/tags-editor.tsx b/packages/frontend/core/src/components/tags/tags-editor.tsx index b327eeeacf..248a18443f 100644 --- a/packages/frontend/core/src/components/tags/tags-editor.tsx +++ b/packages/frontend/core/src/components/tags/tags-editor.tsx @@ -150,6 +150,7 @@ export const TagsEditor = ({ const idx = tagColors.findIndex(c => c.value === color); return tagColors[(idx + 1) % tagColors.length].value; }, + // eslint-disable-next-line react-hooks/purity tagColors[Math.floor(Math.random() * tagColors.length)].value ); diff --git a/packages/frontend/core/src/components/workspace-property-types/text.tsx b/packages/frontend/core/src/components/workspace-property-types/text.tsx index 0170df3760..c804acaf1e 100644 --- a/packages/frontend/core/src/components/workspace-property-types/text.tsx +++ b/packages/frontend/core/src/components/workspace-property-types/text.tsx @@ -41,7 +41,7 @@ const DesktopTextValue = ({ useEffect(() => { ref.current?.addEventListener('blur', handleBlur); return () => { - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react/exhaustive-deps ref.current?.removeEventListener('blur', handleBlur); }; }, [handleBlur]); @@ -108,7 +108,7 @@ const MobileTextValue = ({ useEffect(() => { ref.current?.addEventListener('blur', handleBlur); return () => { - // eslint-disable-next-line react-hooks/exhaustive-deps + // oxlint-disable-next-line react/exhaustive-deps ref.current?.removeEventListener('blur', handleBlur); }; }, [handleBlur]); diff --git a/packages/frontend/core/src/desktop/dialogs/setting/account-setting/integrations-panel.tsx b/packages/frontend/core/src/desktop/dialogs/setting/account-setting/integrations-panel.tsx index f1f261bad3..8aa5238a88 100644 --- a/packages/frontend/core/src/desktop/dialogs/setting/account-setting/integrations-panel.tsx +++ b/packages/frontend/core/src/desktop/dialogs/setting/account-setting/integrations-panel.tsx @@ -157,14 +157,13 @@ const CalDAVLinkDialog = ({ setErrors(nextErrors); return; } - setSubmitting(true); try { await gqlService.gql({ query: linkCalDavAccountMutation, variables: { input: { - providerPresetId: selectedProvider!.id, + providerPresetId: selectedProvider.id, username: username.trim(), password, displayName: displayName.trim() || null, @@ -416,6 +415,7 @@ export const IntegrationsPanel = () => { urlService.openExternal(data.linkCalendarAccount); setOpenedExternalWindow(true); } catch (error) { + console.error('Failed to link calendar account', error); notify.error({ title: t['com.affine.integration.calendar.auth.start-error'](), }); @@ -456,6 +456,7 @@ export const IntegrationsPanel = () => { } ); } catch (error) { + console.error('Failed to unlink calendar account', error); notify.error({ title: t['com.affine.integration.calendar.account.unlink-error'](), }); diff --git a/packages/frontend/core/src/desktop/dialogs/setting/general-setting/backup/index.tsx b/packages/frontend/core/src/desktop/dialogs/setting/general-setting/backup/index.tsx index 7f93c52efc..3d9ba3165f 100644 --- a/packages/frontend/core/src/desktop/dialogs/setting/general-setting/backup/index.tsx +++ b/packages/frontend/core/src/desktop/dialogs/setting/general-setting/backup/index.tsx @@ -15,6 +15,7 @@ import { Avatar } from '@affine/component/ui/avatar'; import { useAsyncCallback } from '@affine/core/components/hooks/affine-async-hooks'; import { useNavigateHelper } from '@affine/core/components/hooks/use-navigate-helper'; import { BackupService } from '@affine/core/modules/backup/services'; +import { toArrayBuffer } from '@affine/core/utils/array-buffer'; import { i18nTime, useI18n } from '@affine/i18n'; import track from '@affine/track'; import { @@ -47,7 +48,7 @@ const BlobAvatar = ({ const [url, setUrl] = useState(null); useEffect(() => { if (!blob) return; - const url = URL.createObjectURL(new Blob([blob])); + const url = URL.createObjectURL(new Blob([toArrayBuffer(blob)])); setUrl(url); return () => { URL.revokeObjectURL(url); diff --git a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/calendar/setting-panel.tsx b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/calendar/setting-panel.tsx index b79bce93af..e382a3296c 100644 --- a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/calendar/setting-panel.tsx +++ b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/integration/calendar/setting-panel.tsx @@ -75,6 +75,7 @@ export const CalendarSettingPanel = () => { })); await calendar.updateWorkspaceCalendars(items); } catch (error) { + console.error('Failed to save calendar settings', error); notify.error({ title: t['com.affine.integration.calendar.save-error'](), }); diff --git a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/license/self-host-team-card.tsx b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/license/self-host-team-card.tsx index a86fdb4631..e91f375812 100644 --- a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/license/self-host-team-card.tsx +++ b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/license/self-host-team-card.tsx @@ -73,6 +73,7 @@ export const SelfHostTeamCard = () => { license?.expiredAt || 0 ).toLocaleDateString(), leftDays: Math.floor( + // eslint-disable-next-line react-hooks/purity (new Date(license?.expiredAt || 0).getTime() - Date.now()) / (1000 * 60 * 60 * 24) ).toLocaleString(), diff --git a/packages/frontend/core/src/desktop/pages/subscribe/index.tsx b/packages/frontend/core/src/desktop/pages/subscribe/index.tsx index 35f67a7ed7..9c2a183f19 100644 --- a/packages/frontend/core/src/desktop/pages/subscribe/index.tsx +++ b/packages/frontend/core/src/desktop/pages/subscribe/index.tsx @@ -104,7 +104,7 @@ export const Component = () => { const [searchParams] = useSearchParams(); const [message, setMessage] = useState(''); const [error, setError] = useState(''); - const [retryKey, setRetryKey] = useState(0); + const [retryCount, setRetryCount] = useState(0); const { jumpToSignIn, jumpToIndex } = useNavigateHelper(); const idempotencyKey = useMemo(() => nanoid(), []); @@ -115,9 +115,10 @@ export const Component = () => { const call = effect( switchMap(() => { return fromPromise(async signal => { - retryKey; // TODO(@eyhn): i18n - setMessage('Checking account status...'); + setMessage( + `Checking account status...${retryCount > 0 ? ` (retry ${retryCount})` : ''}` + ); setError(''); await authService.session.waitForRevalidation(signal); const loggedIn = @@ -179,7 +180,7 @@ export const Component = () => { plan, jumpToIndex, recurring, - retryKey, + retryCount, variant, coupon, urlService, @@ -197,7 +198,7 @@ export const Component = () => { <> {error}
- diff --git a/packages/frontend/core/src/desktop/pages/workspace/chat/index.tsx b/packages/frontend/core/src/desktop/pages/workspace/chat/index.tsx index f687fab2b8..2f1c07f282 100644 --- a/packages/frontend/core/src/desktop/pages/workspace/chat/index.tsx +++ b/packages/frontend/core/src/desktop/pages/workspace/chat/index.tsx @@ -5,8 +5,8 @@ import { type ChatContextValue, } from '@affine/core/blocksuite/ai/components/ai-chat-content'; import type { ChatStatus } from '@affine/core/blocksuite/ai/components/ai-chat-messages'; +import type { AIChatToolbar } from '@affine/core/blocksuite/ai/components/ai-chat-toolbar'; import { - AIChatToolbar, configureAIChatToolbar, getOrCreateAIChatToolbar, } from '@affine/core/blocksuite/ai/components/ai-chat-toolbar'; diff --git a/packages/frontend/core/src/desktop/pages/workspace/detail-page/tabs/chat.tsx b/packages/frontend/core/src/desktop/pages/workspace/detail-page/tabs/chat.tsx index 6fe34d7eb0..ecc229353b 100644 --- a/packages/frontend/core/src/desktop/pages/workspace/detail-page/tabs/chat.tsx +++ b/packages/frontend/core/src/desktop/pages/workspace/detail-page/tabs/chat.tsx @@ -6,8 +6,8 @@ import { type ChatContextValue, } from '@affine/core/blocksuite/ai/components/ai-chat-content'; import type { ChatStatus } from '@affine/core/blocksuite/ai/components/ai-chat-messages'; +import type { AIChatToolbar } from '@affine/core/blocksuite/ai/components/ai-chat-toolbar'; import { - AIChatToolbar, configureAIChatToolbar, getOrCreateAIChatToolbar, } from '@affine/core/blocksuite/ai/components/ai-chat-toolbar'; diff --git a/packages/frontend/core/src/desktop/pages/workspace/index.tsx b/packages/frontend/core/src/desktop/pages/workspace/index.tsx index 5edb78885b..75e31da8ff 100644 --- a/packages/frontend/core/src/desktop/pages/workspace/index.tsx +++ b/packages/frontend/core/src/desktop/pages/workspace/index.tsx @@ -253,21 +253,19 @@ const WorkspacePage = ({ meta }: { meta: WorkspaceMetadata }) => { }; }, [meta, workspacesService]); - const isRootDocReady = - useLiveData( - useMemo( - () => - workspace - ? LiveData.from( - workspace.engine.doc - .docState$(workspace.id) - .pipe(map(v => v.ready)), - false - ) - : null, - [workspace] - ) - ) ?? false; + const rootDocReady$ = useMemo( + () => + workspace + ? LiveData.from( + workspace.engine.doc + .docState$(workspace.id) + .pipe(map(v => v.ready)), + false + ) + : null, + [workspace] + ); + const isRootDocReady = useLiveData(rootDocReady$) ?? false; useEffect(() => { if (workspace) { diff --git a/packages/frontend/core/src/mobile/pages/workspace/layout.tsx b/packages/frontend/core/src/mobile/pages/workspace/layout.tsx index af75e19720..c570120de0 100644 --- a/packages/frontend/core/src/mobile/pages/workspace/layout.tsx +++ b/packages/frontend/core/src/mobile/pages/workspace/layout.tsx @@ -109,21 +109,19 @@ export const WorkspaceLayout = ({ workspaceServer, ]); - const isRootDocReady = - useLiveData( - useMemo( - () => - workspace - ? LiveData.from( - workspace.engine.doc - .docState$(workspace.id) - .pipe(map(v => v.ready)), - false - ) - : null, - [workspace] - ) - ) ?? false; + const rootDocReady$ = useMemo( + () => + workspace + ? LiveData.from( + workspace.engine.doc + .docState$(workspace.id) + .pipe(map(v => v.ready)), + false + ) + : null, + [workspace] + ); + const isRootDocReady = useLiveData(rootDocReady$) ?? false; if (!workspace) { return null; // skip this, workspace will be set in layout effect diff --git a/packages/frontend/core/src/modules/comment/services/snapshot-helper.ts b/packages/frontend/core/src/modules/comment/services/snapshot-helper.ts index d281870d75..06954b1353 100644 --- a/packages/frontend/core/src/modules/comment/services/snapshot-helper.ts +++ b/packages/frontend/core/src/modules/comment/services/snapshot-helper.ts @@ -1,4 +1,5 @@ import { getStoreManager } from '@affine/core/blocksuite/manager/store'; +import { toArrayBuffer } from '@affine/core/utils/array-buffer'; import { Container } from '@blocksuite/affine/global/di'; import { customImageProxyMiddleware, @@ -46,7 +47,9 @@ export class SnapshotHelper extends Service { get: async key => { const record = await this.workspaceService.workspace.engine.blob.get(key); - return record ? new Blob([record.data], { type: record.mime }) : null; + return record + ? new Blob([toArrayBuffer(record.data)], { type: record.mime }) + : null; }, set() { return Promise.resolve(''); diff --git a/packages/frontend/core/src/modules/doc-info/views/database-properties/doc-database-backlink-info.tsx b/packages/frontend/core/src/modules/doc-info/views/database-properties/doc-database-backlink-info.tsx index baa3d57c8c..0972b59510 100644 --- a/packages/frontend/core/src/modules/doc-info/views/database-properties/doc-database-backlink-info.tsx +++ b/packages/frontend/core/src/modules/doc-info/views/database-properties/doc-database-backlink-info.tsx @@ -112,7 +112,7 @@ const DatabaseBacklinkRow = ({ useMemo( () => row?.docId ? templateDocService.list.isTemplate$(row.docId) : undefined, - [row?.docId, templateDocService.list] + [row, templateDocService.list] ) ); diff --git a/packages/frontend/core/src/modules/doc/index.ts b/packages/frontend/core/src/modules/doc/index.ts index 3f09737bd7..fc51e6ed05 100644 --- a/packages/frontend/core/src/modules/doc/index.ts +++ b/packages/frontend/core/src/modules/doc/index.ts @@ -9,7 +9,8 @@ export { DocsService } from './services/docs'; import type { Framework } from '@toeverything/infra'; import { WorkspaceDBService } from '../db/services/db'; -import { WorkspaceScope, WorkspaceService } from '../workspace'; +import { WorkspaceScope } from '../workspace/scopes/workspace'; +import { WorkspaceService } from '../workspace/services/workspace'; import { Doc } from './entities/doc'; import { DocRecord } from './entities/record'; import { DocRecordList } from './entities/record-list'; diff --git a/packages/frontend/core/src/modules/doc/services/docs.ts b/packages/frontend/core/src/modules/doc/services/docs.ts index e1971d0b22..abb78b06ac 100644 --- a/packages/frontend/core/src/modules/doc/services/docs.ts +++ b/packages/frontend/core/src/modules/doc/services/docs.ts @@ -8,7 +8,7 @@ import { ObjectPool, Service } from '@toeverything/infra'; import { combineLatest, map } from 'rxjs'; import { initDocFromProps } from '../../../blocksuite/initialization'; -import { getAFFiNEWorkspaceSchema } from '../../workspace'; +import { getAFFiNEWorkspaceSchema } from '../../workspace/global-schema'; import type { Doc } from '../entities/doc'; import { DocRecordList } from '../entities/record-list'; import { DocCreated, DocInitialized } from '../events'; diff --git a/packages/frontend/core/src/modules/import-template/services/import.ts b/packages/frontend/core/src/modules/import-template/services/import.ts index 45920729a1..53e069f71d 100644 --- a/packages/frontend/core/src/modules/import-template/services/import.ts +++ b/packages/frontend/core/src/modules/import-template/services/import.ts @@ -1,3 +1,4 @@ +import { toArrayBuffer } from '@affine/core/utils/array-buffer'; import type { DocMode } from '@blocksuite/affine/model'; import { ZipTransformer } from '@blocksuite/affine/widgets/linked-doc'; import { Service } from '@toeverything/infra'; @@ -27,7 +28,7 @@ export class ImportTemplateService extends Service { const [importedDoc] = await ZipTransformer.importDocs( workspace.docCollection, getAFFiNEWorkspaceSchema(), - new Blob([docBinary], { + new Blob([toArrayBuffer(docBinary)], { type: 'application/zip', }) ); diff --git a/packages/frontend/core/src/modules/integration/entities/readwise.ts b/packages/frontend/core/src/modules/integration/entities/readwise.ts index ba6825397b..75c87b90eb 100644 --- a/packages/frontend/core/src/modules/integration/entities/readwise.ts +++ b/packages/frontend/core/src/modules/integration/entities/readwise.ts @@ -234,7 +234,7 @@ export class ReadwiseIntegration extends Entity<{ writer: IntegrationWriter }> { async deleteAll() { const refs = await this.getRefs(); await Promise.all( - refs.map(ref => { + refs.map(async ref => { const doc = this.docsService.list.doc$(ref.id).value; if (doc) { doc.moveToTrash(); diff --git a/packages/frontend/core/src/modules/media/entities/audio-attachment-block.ts b/packages/frontend/core/src/modules/media/entities/audio-attachment-block.ts index 5e4c8c972b..d187d7b269 100644 --- a/packages/frontend/core/src/modules/media/entities/audio-attachment-block.ts +++ b/packages/frontend/core/src/modules/media/entities/audio-attachment-block.ts @@ -3,6 +3,7 @@ import { type TranscriptionBlockModel, } from '@affine/core/blocksuite/ai/blocks/transcription-block/model'; import { insertFromMarkdown } from '@affine/core/blocksuite/utils'; +import { toArrayBuffer } from '@affine/core/utils/array-buffer'; import { encodeAudioBlobToOpusSlices } from '@affine/core/utils/opus-encoding'; import { DebugLogger } from '@affine/debug'; import { AiJobStatus } from '@affine/graphql'; @@ -137,7 +138,7 @@ export class AudioAttachmentBlock extends Entity { } const slices = await encodeAudioBlobToOpusSlices(buffer, 64000); const files = slices.map((slice, index) => { - const blob = new Blob([slice], { type: 'audio/opus' }); + const blob = new Blob([toArrayBuffer(slice)], { type: 'audio/opus' }); return new File([blob], this.props.props.name + `-${index}.opus`, { type: 'audio/opus', }); diff --git a/packages/frontend/core/src/modules/media/entities/audio-media.ts b/packages/frontend/core/src/modules/media/entities/audio-media.ts index fae2492e2c..d629f08ede 100644 --- a/packages/frontend/core/src/modules/media/entities/audio-media.ts +++ b/packages/frontend/core/src/modules/media/entities/audio-media.ts @@ -1,3 +1,4 @@ +import { toArrayBuffer } from '@affine/core/utils/array-buffer'; import { DebugLogger } from '@affine/debug'; import { catchErrorInto, @@ -170,7 +171,7 @@ export class AudioMedia extends Entity { private async loadAudioBuffer() { const uint8Array = await this.getBuffer(); - return new Blob([uint8Array]); + return new Blob([toArrayBuffer(uint8Array)]); } readonly revalidateBuffer = effect( diff --git a/packages/frontend/core/src/modules/pdf/entities/pdf.ts b/packages/frontend/core/src/modules/pdf/entities/pdf.ts index 0b7a93b992..ad11355155 100644 --- a/packages/frontend/core/src/modules/pdf/entities/pdf.ts +++ b/packages/frontend/core/src/modules/pdf/entities/pdf.ts @@ -1,3 +1,4 @@ +import { toArrayBuffer } from '@affine/core/utils/array-buffer'; import { Entity, LiveData, ObjectPool } from '@toeverything/infra'; import { catchError, from, map, of, startWith, switchMap } from 'rxjs'; @@ -41,7 +42,7 @@ export class PDF extends Entity<{ blobId: string }> { .then(blobRecord => { if (blobRecord) { const { data, mime: type } = blobRecord; - const blob = new Blob([data], { type }); + const blob = new Blob([toArrayBuffer(data)], { type }); return blob.arrayBuffer(); } diff --git a/packages/frontend/core/src/modules/peek-view/entities/peek-view.ts b/packages/frontend/core/src/modules/peek-view/entities/peek-view.ts index 52e828c2bd..2314a653e2 100644 --- a/packages/frontend/core/src/modules/peek-view/entities/peek-view.ts +++ b/packages/frontend/core/src/modules/peek-view/entities/peek-view.ts @@ -16,7 +16,7 @@ import { firstValueFrom, map, race } from 'rxjs'; import type { AIChatBlockModel } from '../../../blocksuite/ai/blocks'; import { resolveLinkToDoc } from '../../navigation'; -import type { WorkbenchService } from '../../workbench'; +import type { WorkbenchService } from '../../workbench/services/workbench'; import type { ImagePreviewData } from '../view/image-preview'; export type DocReferenceInfo = { diff --git a/packages/frontend/core/src/modules/peek-view/index.ts b/packages/frontend/core/src/modules/peek-view/index.ts index ad170c5961..47841ffc2c 100644 --- a/packages/frontend/core/src/modules/peek-view/index.ts +++ b/packages/frontend/core/src/modules/peek-view/index.ts @@ -1,6 +1,6 @@ import { type Framework } from '@toeverything/infra'; -import { WorkbenchService } from '../workbench'; +import { WorkbenchService } from '../workbench/services/workbench'; import { WorkspaceScope } from '../workspace'; import { PeekViewEntity } from './entities/peek-view'; import { PeekViewService } from './services/peek-view'; diff --git a/packages/frontend/core/src/modules/peek-view/view/doc-preview/doc-peek-view.tsx b/packages/frontend/core/src/modules/peek-view/view/doc-preview/doc-peek-view.tsx index b19193445a..edea2098cb 100644 --- a/packages/frontend/core/src/modules/peek-view/view/doc-preview/doc-peek-view.tsx +++ b/packages/frontend/core/src/modules/peek-view/view/doc-preview/doc-peek-view.tsx @@ -22,7 +22,7 @@ import clsx from 'clsx'; import { lazy, Suspense, useCallback, useEffect } from 'react'; import type { Subscription } from 'rxjs'; -import { WorkbenchService } from '../../../workbench'; +import { WorkbenchService } from '../../../workbench/services/workbench'; import type { DocReferenceInfo } from '../../entities/peek-view'; import { PeekViewService } from '../../services/peek-view'; import { useEditor } from '../utils'; diff --git a/packages/frontend/core/src/modules/peek-view/view/modal-container.tsx b/packages/frontend/core/src/modules/peek-view/view/modal-container.tsx index 415cc411c6..40bf383c50 100644 --- a/packages/frontend/core/src/modules/peek-view/view/modal-container.tsx +++ b/packages/frontend/core/src/modules/peek-view/view/modal-container.tsx @@ -153,7 +153,6 @@ export const PeekViewModalContainer = forwardRef< !target.getBoundingClientRect().width && iteration < 10 ) { - // eslint-disable-next-line react-hooks/exhaustive-deps target = target.parentElement || undefined; iteration++; } diff --git a/packages/frontend/core/src/modules/peek-view/view/peek-view-controls.tsx b/packages/frontend/core/src/modules/peek-view/view/peek-view-controls.tsx index ba5a4f1ae0..03cadac890 100644 --- a/packages/frontend/core/src/modules/peek-view/view/peek-view-controls.tsx +++ b/packages/frontend/core/src/modules/peek-view/view/peek-view-controls.tsx @@ -27,7 +27,7 @@ import { ServerService } from '../../cloud'; import { WorkspaceDialogService } from '../../dialogs'; import { DocsService } from '../../doc/services/docs'; import { toDocSearchParams } from '../../navigation'; -import { WorkbenchService } from '../../workbench'; +import { WorkbenchService } from '../../workbench/services/workbench'; import type { AttachmentPeekViewInfo, DocReferenceInfo, diff --git a/packages/frontend/core/src/modules/permissions/index.ts b/packages/frontend/core/src/modules/permissions/index.ts index 1d359161e8..0205d98800 100644 --- a/packages/frontend/core/src/modules/permissions/index.ts +++ b/packages/frontend/core/src/modules/permissions/index.ts @@ -14,7 +14,7 @@ export { import { type Framework } from '@toeverything/infra'; -import { WorkspaceServerService } from '../cloud'; +import { WorkspaceServerService } from '../cloud/services/workspace-server'; import { DocScope, DocService } from '../doc'; import { WorkspaceLocalState, diff --git a/packages/frontend/core/src/modules/workspace-engine/impls/cloud.ts b/packages/frontend/core/src/modules/workspace-engine/impls/cloud.ts index 08d58c4674..e98650c003 100644 --- a/packages/frontend/core/src/modules/workspace-engine/impls/cloud.ts +++ b/packages/frontend/core/src/modules/workspace-engine/impls/cloud.ts @@ -1,3 +1,4 @@ +import { toArrayBuffer } from '@affine/core/utils/array-buffer'; import { DebugLogger } from '@affine/debug'; import { createWorkspaceMutation, @@ -192,7 +193,9 @@ class CloudWorkspaceFlavourProvider implements WorkspaceFlavourProvider { blobSource: { get: async key => { const record = await blobStorage.get(key); - return record ? new Blob([record.data], { type: record.mime }) : null; + return record + ? new Blob([toArrayBuffer(record.data)], { type: record.mime }) + : null; }, delete: async () => { return; @@ -391,7 +394,9 @@ class CloudWorkspaceFlavourProvider implements WorkspaceFlavourProvider { storage.connection.disconnect(); if (localBlob) { - return new Blob([localBlob.data], { type: localBlob.mime }); + return new Blob([toArrayBuffer(localBlob.data)], { + type: localBlob.mime, + }); } const cloudBlob = await new CloudBlobStorage({ @@ -401,7 +406,7 @@ class CloudWorkspaceFlavourProvider implements WorkspaceFlavourProvider { if (!cloudBlob) { return null; } - return new Blob([cloudBlob.data], { type: cloudBlob.mime }); + return new Blob([toArrayBuffer(cloudBlob.data)], { type: cloudBlob.mime }); } async listBlobs(id: string): Promise { diff --git a/packages/frontend/core/src/modules/workspace-engine/impls/local.ts b/packages/frontend/core/src/modules/workspace-engine/impls/local.ts index 9ec7e30e4a..21104b760b 100644 --- a/packages/frontend/core/src/modules/workspace-engine/impls/local.ts +++ b/packages/frontend/core/src/modules/workspace-engine/impls/local.ts @@ -1,3 +1,4 @@ +import { toArrayBuffer } from '@affine/core/utils/array-buffer'; import { DebugLogger } from '@affine/debug'; import { type BlobStorage, @@ -266,7 +267,9 @@ class LocalWorkspaceFlavourProvider implements WorkspaceFlavourProvider { blobSource: { get: async key => { const record = await blobStorage.get(key); - return record ? new Blob([record.data], { type: record.mime }) : null; + return record + ? new Blob([toArrayBuffer(record.data)], { type: record.mime }) + : null; }, delete: async () => { return; @@ -394,7 +397,9 @@ class LocalWorkspaceFlavourProvider implements WorkspaceFlavourProvider { storage.connection.connect(); await storage.connection.waitForConnected(); const blob = await storage.get(blobKey); - return blob ? new Blob([blob.data], { type: blob.mime }) : null; + return blob + ? new Blob([toArrayBuffer(blob.data)], { type: blob.mime }) + : null; } async listBlobs(id: string): Promise { diff --git a/packages/frontend/core/src/modules/workspace-engine/utils/buffer-to-blob.ts b/packages/frontend/core/src/modules/workspace-engine/utils/buffer-to-blob.ts index 2d642233fb..525e819e80 100644 --- a/packages/frontend/core/src/modules/workspace-engine/utils/buffer-to-blob.ts +++ b/packages/frontend/core/src/modules/workspace-engine/utils/buffer-to-blob.ts @@ -1,3 +1,4 @@ +import { toArrayBuffer } from '@affine/core/utils/array-buffer'; import isSvg from 'is-svg'; function fastCheckIsNotSvg(buffer: Uint8Array) { @@ -49,11 +50,10 @@ export function isSvgBuffer(buffer: Uint8Array) { } export function bufferToBlob(buffer: Uint8Array | ArrayBuffer) { - const isSVG = isSvgBuffer( - buffer instanceof ArrayBuffer ? new Uint8Array(buffer) : buffer - ); + const arrayBuffer = toArrayBuffer(buffer); + const isSVG = isSvgBuffer(new Uint8Array(arrayBuffer)); // for svg blob, we need to explicitly set the type to image/svg+xml return isSVG - ? new Blob([buffer], { type: 'image/svg+xml' }) - : new Blob([buffer]); + ? new Blob([arrayBuffer], { type: 'image/svg+xml' }) + : new Blob([arrayBuffer]); } diff --git a/packages/frontend/core/src/modules/workspace/entities/workspace.ts b/packages/frontend/core/src/modules/workspace/entities/workspace.ts index 535735d3ea..47a2d94ed3 100644 --- a/packages/frontend/core/src/modules/workspace/entities/workspace.ts +++ b/packages/frontend/core/src/modules/workspace/entities/workspace.ts @@ -1,10 +1,11 @@ import type { FeatureFlagService } from '@affine/core/modules/feature-flag'; +import { toArrayBuffer } from '@affine/core/utils/array-buffer'; import type { Workspace as WorkspaceInterface } from '@blocksuite/affine/store'; import { Entity, LiveData, yjsGetPath } from '@toeverything/infra'; import type { Observable } from 'rxjs'; import { Doc as YDoc, transact } from 'yjs'; -import { DocsService } from '../../doc'; +import { DocsService } from '../../doc/services/docs'; import { WorkspaceImpl } from '../impls/workspace'; import type { WorkspaceScope } from '../scopes/workspace'; import { WorkspaceEngineService } from '../services/engine'; @@ -39,7 +40,7 @@ export class Workspace extends Entity { get: async key => { const record = await this.engine.blob.get(key); return record - ? new Blob([record.data], { type: record.mime }) + ? new Blob([toArrayBuffer(record.data)], { type: record.mime }) : null; }, delete: async () => { diff --git a/packages/frontend/core/src/utils/array-buffer.ts b/packages/frontend/core/src/utils/array-buffer.ts new file mode 100644 index 0000000000..e947747a05 --- /dev/null +++ b/packages/frontend/core/src/utils/array-buffer.ts @@ -0,0 +1,33 @@ +/** + * Convert binary data to a strict ArrayBuffer for DOM APIs whose types + * require ArrayBuffer-backed views (not ArrayBufferLike). + */ +export function toArrayBuffer( + data: ArrayBuffer | ArrayBufferLike | ArrayBufferView +): ArrayBuffer { + if (data instanceof ArrayBuffer) { + return data; + } + + if (ArrayBuffer.isView(data)) { + if (data.buffer instanceof ArrayBuffer) { + if (data.byteOffset === 0 && data.byteLength === data.buffer.byteLength) { + return data.buffer; + } + return data.buffer.slice( + data.byteOffset, + data.byteOffset + data.byteLength + ); + } + + const bytes = new Uint8Array(data.buffer, data.byteOffset, data.byteLength); + const copy = new Uint8Array(bytes.byteLength); + copy.set(bytes); + return copy.buffer; + } + + const bytes = new Uint8Array(data); + const copy = new Uint8Array(bytes.byteLength); + copy.set(bytes); + return copy.buffer; +} diff --git a/packages/frontend/core/src/utils/opus-encoding.ts b/packages/frontend/core/src/utils/opus-encoding.ts index abfea31b01..c40ca40d22 100644 --- a/packages/frontend/core/src/utils/opus-encoding.ts +++ b/packages/frontend/core/src/utils/opus-encoding.ts @@ -3,6 +3,7 @@ import { apis } from '@affine/electron-api'; import { ArrayBufferTarget, Muxer } from 'mp4-muxer'; import { isLink } from '../modules/navigation/utils'; +import { toArrayBuffer } from './array-buffer'; interface AudioEncodingConfig { sampleRate: number; @@ -38,16 +39,6 @@ async function blobToArrayBuffer( return toArrayBuffer(blob); } -function toArrayBuffer(data: ArrayBuffer | ArrayBufferView): ArrayBuffer { - if (data instanceof ArrayBuffer) { - return data; - } - return data.buffer.slice( - data.byteOffset, - data.byteOffset + data.byteLength - ) as ArrayBuffer; -} - function getRecordingFileUrl(filepath: string): URL { const base = typeof location !== 'undefined' && location.protocol === 'assets:' @@ -175,7 +166,7 @@ async function encodeAudioFrames({ numberOfFrames: chunk.length / numberOfChannels, numberOfChannels, timestamp: (offset * 1000000) / sampleRate, - data: chunk, + data: toArrayBuffer(chunk), }); encoder.encode(frame); @@ -448,7 +439,7 @@ export const createStreamEncoder = ( numberOfFrames: buffer.length / BYTES_PER_SAMPLE / codecs.numberOfChannels, timestamp: 0, - data: buffer, + data: toArrayBuffer(buffer), }); }; diff --git a/packages/frontend/track/src/__tests__/tracker.spec.ts b/packages/frontend/track/src/__tests__/tracker.spec.ts index 10ff7ba72a..2c4faee39d 100644 --- a/packages/frontend/track/src/__tests__/tracker.spec.ts +++ b/packages/frontend/track/src/__tests__/tracker.spec.ts @@ -79,6 +79,6 @@ describe('tracker session signals', () => { const sessionStart = events.find( event => event.eventName === 'session_start' ); - expect((sessionStart?.params as any).session_number).toBe(2); + expect(sessionStart?.params?.session_number).toBe(2); }); }); diff --git a/packages/frontend/track/src/auto.ts b/packages/frontend/track/src/auto.ts index 6f2a56bca1..5bea71bfb1 100644 --- a/packages/frontend/track/src/auto.ts +++ b/packages/frontend/track/src/auto.ts @@ -116,6 +116,7 @@ export function enableAutoTrack(root: HTMLElement, trackFn: TrackFn) { declare module 'react' { // we have to declare `T` but it's actually not used + // oxlint-disable-next-line no-unused-vars interface HTMLAttributes { 'data-event-props'?: EventsUnion; 'data-event-arg'?: string; diff --git a/packages/frontend/track/src/telemetry.ts b/packages/frontend/track/src/telemetry.ts index 61a764c573..4771cf4cd4 100644 --- a/packages/frontend/track/src/telemetry.ts +++ b/packages/frontend/track/src/telemetry.ts @@ -94,8 +94,8 @@ export function setTelemetryContext( const nextUserProps = options.replaceUserProperties ? (update.userProperties ?? {}) : { - ...(context.userProperties ?? {}), - ...(update.userProperties ?? {}), + ...context.userProperties, + ...update.userProperties, }; context = { diff --git a/packages/frontend/track/src/tracker.ts b/packages/frontend/track/src/tracker.ts index 5f32c4458b..1fba9cb4d1 100644 --- a/packages/frontend/track/src/tracker.ts +++ b/packages/frontend/track/src/tracker.ts @@ -241,7 +241,7 @@ function mergeSessionParams( engagementMs: number ) { const merged: Record = { - ...(params ?? {}), + ...params, }; if (Number.isFinite(nextSessionId) && nextSessionId > 0) { merged.session_id = nextSessionId; diff --git a/tools/cli/src/init.ts b/tools/cli/src/init.ts index 710c6ac4c2..0915045948 100755 --- a/tools/cli/src/init.ts +++ b/tools/cli/src/init.ts @@ -35,7 +35,7 @@ export class InitCommand extends Command { this.genWorkspaceInfo, 'typescript', ], - [this.workspace.join('oxlint.json'), this.genOxlintConfig, 'json'], + [this.workspace.join('.oxlintrc.json'), this.genOxlintConfig, 'json'], ...this.workspace.packages .filter(p => p.isTsProject) .map( @@ -68,7 +68,7 @@ export class InitCommand extends Command { genOxlintConfig = () => { const json = JSON.parse( - readFileSync(this.workspace.join('oxlint.json').value, 'utf-8') + readFileSync(this.workspace.join('.oxlintrc.json').value, 'utf-8') ); const ignoreList = readFileSync( diff --git a/tools/doc-diff/src/index.ts b/tools/doc-diff/src/index.ts index 379b87480b..9ab76cff01 100644 --- a/tools/doc-diff/src/index.ts +++ b/tools/doc-diff/src/index.ts @@ -95,7 +95,7 @@ const docs = resolvedFiles.map(filePath => { return readYjsDocFromFile(filePath); } catch (error) { const details = error instanceof Error ? error.message : String(error); - fail(`Failed to read/parse snapshot file "${filePath}": ${details}`); + return fail(`Failed to read/parse snapshot file "${filePath}": ${details}`); } }); @@ -137,7 +137,7 @@ switch (mode) { break; } default: { - mode satisfies never; - fail(`Unknown mode: ${mode}`); + const unreachableMode: never = mode; + fail(`Unknown mode: ${unreachableMode}`); } } diff --git a/tools/doc-diff/src/rootdoc.ts b/tools/doc-diff/src/rootdoc.ts index 26ea92fde8..a498df81f3 100644 --- a/tools/doc-diff/src/rootdoc.ts +++ b/tools/doc-diff/src/rootdoc.ts @@ -1,4 +1,5 @@ -import { Array as YArray, Doc, Map as YMap } from 'yjs'; +import type { Doc } from 'yjs'; +import { Array as YArray, Map as YMap } from 'yjs'; import { diffKeyedRecords, type KeyedRecord } from './diff'; import { formatValue, toPlain } from './plain'; diff --git a/tools/doc-diff/src/table.ts b/tools/doc-diff/src/table.ts index 021e7f3a59..3e2c8d9c58 100644 --- a/tools/doc-diff/src/table.ts +++ b/tools/doc-diff/src/table.ts @@ -1,4 +1,5 @@ -import { Doc, Map as YMap } from 'yjs'; +import type { Doc } from 'yjs'; +import { Map as YMap } from 'yjs'; import { diffKeyedRecords, type KeyedRecord } from './diff'; import { formatValue, toPlain } from './plain'; diff --git a/yarn.lock b/yarn.lock index 295c1f043e..4715128046 100644 --- a/yarn.lock +++ b/yarn.lock @@ -792,7 +792,7 @@ __metadata: dependencies: "@affine-tools/cli": "workspace:*" "@capacitor/cli": "npm:^7.0.0" - "@eslint/js": "npm:^9.16.0" + "@eslint/js": "npm:^9.39.2" "@faker-js/faker": "npm:^10.1.0" "@istanbuljs/schema": "npm:^0.1.3" "@magic-works/i18n-codegen": "npm:^0.6.1" @@ -802,32 +802,33 @@ __metadata: "@toeverything/infra": "workspace:*" "@types/eslint": "npm:^9.6.1" "@types/node": "npm:^22.0.0" - "@typescript-eslint/parser": "npm:^8.18.0" + "@typescript-eslint/parser": "npm:^8.55.0" "@vanilla-extract/vite-plugin": "npm:^5.0.0" "@vitest/browser": "npm:^3.2.4" "@vitest/coverage-istanbul": "npm:^3.2.4" "@vitest/ui": "npm:^3.2.4" cross-env: "npm:^10.1.0" electron: "npm:^39.0.0" - eslint: "npm:^9.16.0" - eslint-config-prettier: "npm:^10.0.0" - eslint-import-resolver-typescript: "npm:^4.0.0" - eslint-plugin-import-x: "npm:^4.5.0" - eslint-plugin-react: "npm:^7.37.2" - eslint-plugin-react-hooks: "npm:^5.1.0" + eslint: "npm:^9.39.2" + eslint-config-prettier: "npm:^10.1.8" + eslint-import-resolver-typescript: "npm:^4.4.4" + eslint-plugin-import-x: "npm:^4.16.1" + eslint-plugin-oxlint: "npm:^1.46.0" + eslint-plugin-react: "npm:^7.37.5" + eslint-plugin-react-hooks: "npm:^7.0.1" eslint-plugin-simple-import-sort: "npm:^12.1.1" - eslint-plugin-sonarjs: "npm:^3.0.1" - eslint-plugin-unicorn: "npm:^59.0.0" + eslint-plugin-sonarjs: "npm:^3.0.7" + eslint-plugin-unicorn: "npm:^63.0.0" happy-dom: "npm:^20.0.0" husky: "npm:^9.1.7" lint-staged: "npm:^16.0.0" msw: "npm:^2.12.4" - oxlint: "npm:~1.18.0" + oxlint: "npm:^1.47.0" prettier: "npm:^3.7.4" semver: "npm:^7.7.3" serve: "npm:^14.2.4" typescript: "npm:^5.7.2" - typescript-eslint: "npm:^8.18.0" + typescript-eslint: "npm:^8.55.0" unplugin-swc: "npm:^1.5.9" vite: "npm:^7.2.7" vitest: "npm:^3.2.4" @@ -1586,7 +1587,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.12.3, @babel/core@npm:^7.18.5, @babel/core@npm:^7.23.9, @babel/core@npm:^7.26.10, @babel/core@npm:^7.28.0, @babel/core@npm:^7.28.5": +"@babel/core@npm:^7.12.3, @babel/core@npm:^7.18.5, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.4, @babel/core@npm:^7.26.10, @babel/core@npm:^7.28.0, @babel/core@npm:^7.28.5": version: 7.29.0 resolution: "@babel/core@npm:7.29.0" dependencies: @@ -1679,7 +1680,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.25.9, @babel/helper-validator-identifier@npm:^7.28.5": +"@babel/helper-validator-identifier@npm:^7.28.5": version: 7.28.5 resolution: "@babel/helper-validator-identifier@npm:7.28.5" checksum: 10/8e5d9b0133702cfacc7f368bf792f0f8ac0483794877c6dca5fcb73810ee138e27527701826fb58a40a004f3a5ec0a2f3c3dd5e326d262530b119918f3132ba7 @@ -1703,7 +1704,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.26.10, @babel/parser@npm:^7.27.0, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.4, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.26.10, @babel/parser@npm:^7.27.0, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": version: 7.29.0 resolution: "@babel/parser@npm:7.29.0" dependencies: @@ -4904,7 +4905,7 @@ __metadata: languageName: node linkType: hard -"@emnapi/core@npm:^1.4.0, @emnapi/core@npm:^1.5.0, @emnapi/core@npm:^1.7.1": +"@emnapi/core@npm:^1.4.3, @emnapi/core@npm:^1.5.0, @emnapi/core@npm:^1.7.1": version: 1.8.1 resolution: "@emnapi/core@npm:1.8.1" dependencies: @@ -4914,12 +4915,12 @@ __metadata: languageName: node linkType: hard -"@emnapi/runtime@npm:^1.2.0, @emnapi/runtime@npm:^1.4.0, @emnapi/runtime@npm:^1.5.0, @emnapi/runtime@npm:^1.7.1": - version: 1.7.1 - resolution: "@emnapi/runtime@npm:1.7.1" +"@emnapi/runtime@npm:^1.2.0, @emnapi/runtime@npm:^1.4.3, @emnapi/runtime@npm:^1.5.0, @emnapi/runtime@npm:^1.7.1": + version: 1.8.1 + resolution: "@emnapi/runtime@npm:1.8.1" dependencies: tslib: "npm:^2.4.0" - checksum: 10/6fc83f938e3c70e32e84c1fbe5cab6cb9340b8107cee4048384ad5b8f2998a06502b4bed342acaf6e44f473f2c14c4ab1e3fd5083bd7823fc63abfca9eff0175 + checksum: 10/26725e202d4baefdc4a6ba770f703dfc80825a27c27a08c22bac1e1ce6f8f75c47b4fe9424d9b63239463c33ef20b650f08d710da18dfa1164a95e5acb865dba languageName: node linkType: hard @@ -5515,48 +5516,50 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.5.1, @eslint-community/eslint-utils@npm:^4.7.0": - version: 4.7.0 - resolution: "@eslint-community/eslint-utils@npm:4.7.0" +"@eslint-community/eslint-utils@npm:^4.8.0, @eslint-community/eslint-utils@npm:^4.9.0, @eslint-community/eslint-utils@npm:^4.9.1": + version: 4.9.1 + resolution: "@eslint-community/eslint-utils@npm:4.9.1" dependencies: eslint-visitor-keys: "npm:^3.4.3" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10/43ed5d391526d9f5bbe452aef336389a473026fca92057cf97c576db11401ce9bcf8ef0bf72625bbaf6207ed8ba6bf0dcf4d7e809c24f08faa68a28533c491a7 + checksum: 10/863b5467868551c9ae34d03eefe634633d08f623fc7b19d860f8f26eb6f303c1a5934253124163bee96181e45ed22bf27473dccc295937c3078493a4a8c9eddd languageName: node linkType: hard -"@eslint-community/regexpp@npm:4.12.1, @eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1, @eslint-community/regexpp@npm:^4.8.0": - version: 4.12.1 - resolution: "@eslint-community/regexpp@npm:4.12.1" - checksum: 10/c08f1dd7dd18fbb60bdd0d85820656d1374dd898af9be7f82cb00451313402a22d5e30569c150315b4385907cdbca78c22389b2a72ab78883b3173be317620cc +"@eslint-community/regexpp@npm:4.12.2, @eslint-community/regexpp@npm:^4.12.1, @eslint-community/regexpp@npm:^4.12.2, @eslint-community/regexpp@npm:^4.8.0": + version: 4.12.2 + resolution: "@eslint-community/regexpp@npm:4.12.2" + checksum: 10/049b280fddf71dd325514e0a520024969431dc3a8b02fa77476e6820e9122f28ab4c9168c11821f91a27982d2453bcd7a66193356ea84e84fb7c8d793be1ba0c languageName: node linkType: hard -"@eslint/config-array@npm:^0.20.0": - version: 0.20.0 - resolution: "@eslint/config-array@npm:0.20.0" +"@eslint/config-array@npm:^0.21.1": + version: 0.21.1 + resolution: "@eslint/config-array@npm:0.21.1" dependencies: - "@eslint/object-schema": "npm:^2.1.6" + "@eslint/object-schema": "npm:^2.1.7" debug: "npm:^4.3.1" minimatch: "npm:^3.1.2" - checksum: 10/9db7f6cbb5363f2f98ee4805ce09d1a95c4349e86f3f456f2c23a0849b7a6aa8d2be4c25e376ee182af062762e15a101844881c89b566eea0856c481ffcb2090 + checksum: 10/6eaa0435972f735ce52d581f355a0b616e50a9b8a73304a7015398096e252798b9b3b968a67b524eefb0fdeacc57c4d960f0ec6432abe1c1e24be815b88c5d18 languageName: node linkType: hard -"@eslint/config-helpers@npm:^0.2.1": - version: 0.2.2 - resolution: "@eslint/config-helpers@npm:0.2.2" - checksum: 10/55dbb0b8d63c4cb28fa2a5fd5f16c785f6bd87eb0f50d2f42ec3f7d06b5c6201e2e170846a4360ca00105578b034fba132ed54e4ee3215be240c4a43e7839189 +"@eslint/config-helpers@npm:^0.4.2": + version: 0.4.2 + resolution: "@eslint/config-helpers@npm:0.4.2" + dependencies: + "@eslint/core": "npm:^0.17.0" + checksum: 10/3f2b4712d8e391c36ec98bc200f7dea423dfe518e42956569666831b89ede83b33120c761dfd3ab6347d8e8894a6d4af47254a18d464a71c6046fd88065f6daf languageName: node linkType: hard -"@eslint/core@npm:^0.13.0": - version: 0.13.0 - resolution: "@eslint/core@npm:0.13.0" +"@eslint/core@npm:^0.17.0": + version: 0.17.0 + resolution: "@eslint/core@npm:0.17.0" dependencies: "@types/json-schema": "npm:^7.0.15" - checksum: 10/737fd1c237405b62592e8daa4b7e25b45ab22108bfec65258cabd091d5717b7c9573acea1f27c4ee7198cefc5a0874f5caefe3d9636851227b1f12d28ef52cf2 + checksum: 10/f9a428cc651ec15fb60d7d60c2a7bacad4666e12508320eafa98258e976fafaa77d7be7be91519e75f801f15f830105420b14a458d4aab121a2b0a59bc43517b languageName: node linkType: hard @@ -5577,34 +5580,27 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.26.0": - version: 9.26.0 - resolution: "@eslint/js@npm:9.26.0" - checksum: 10/863d35df8f6675250bb5a917037e0f6833965437eba4c4649633fd0b55a93e8d727bcd36e9b5cc82047898ee9348cb40363e196f333914ae3a6bb36159495212 +"@eslint/js@npm:9.39.2, @eslint/js@npm:^9.39.2": + version: 9.39.2 + resolution: "@eslint/js@npm:9.39.2" + checksum: 10/6b7f676746f3111b5d1b23715319212ab9297868a0fa9980d483c3da8965d5841673aada2d5653e85a3f7156edee0893a7ae7035211b4efdcb2848154bb947f2 languageName: node linkType: hard -"@eslint/js@npm:^9.16.0": - version: 9.27.0 - resolution: "@eslint/js@npm:9.27.0" - checksum: 10/cdbe380fd31bb325b9ec65ae310fb92a57efb796d3cc5d8bc9dafef447d634c64e497bedade6a49e0cf44a5b14560ab6ac9ed9da5a38e2415b31ae01ae5b758e +"@eslint/object-schema@npm:^2.1.7": + version: 2.1.7 + resolution: "@eslint/object-schema@npm:2.1.7" + checksum: 10/946ef5d6235b4d1c0907c6c6e6429c8895f535380c562b7705c131f63f2e961b06e8785043c86a293da48e0a60c6286d98ba395b8b32ea55561fe6e4417cb7e4 languageName: node linkType: hard -"@eslint/object-schema@npm:^2.1.6": - version: 2.1.6 - resolution: "@eslint/object-schema@npm:2.1.6" - checksum: 10/266085c8d3fa6cd99457fb6350dffb8ee39db9c6baf28dc2b86576657373c92a568aec4bae7d142978e798b74c271696672e103202d47a0c148da39154351ed6 - languageName: node - linkType: hard - -"@eslint/plugin-kit@npm:^0.2.7, @eslint/plugin-kit@npm:^0.2.8": - version: 0.2.8 - resolution: "@eslint/plugin-kit@npm:0.2.8" +"@eslint/plugin-kit@npm:^0.4.1": + version: 0.4.1 + resolution: "@eslint/plugin-kit@npm:0.4.1" dependencies: - "@eslint/core": "npm:^0.13.0" + "@eslint/core": "npm:^0.17.0" levn: "npm:^0.4.1" - checksum: 10/2e7fe7a88ebdbbf805e9e7265347b7dcfb6bf50beec314def997572b2e8ae4a7b9504fb67b1698a70c348a0dd87251d1e9028292a96fd49b58cb5277d88bdea7 + checksum: 10/c5947d0ffeddca77d996ac1b886a66060c1a15ed1d5e425d0c7e7d7044a4bd3813fc968892d03950a7831c9b89368a2f7b281e45dd3c74a048962b74bf3a1cb4 languageName: node linkType: hard @@ -7826,12 +7822,12 @@ __metadata: languageName: node linkType: hard -"@isaacs/brace-expansion@npm:^5.0.0": - version: 5.0.0 - resolution: "@isaacs/brace-expansion@npm:5.0.0" +"@isaacs/brace-expansion@npm:^5.0.1": + version: 5.0.1 + resolution: "@isaacs/brace-expansion@npm:5.0.1" dependencies: "@isaacs/balanced-match": "npm:^4.0.1" - checksum: 10/cf3b7f206aff12128214a1df764ac8cdbc517c110db85249b945282407e3dfc5c6e66286383a7c9391a059fc8e6e6a8ca82262fc9d2590bd615376141fbebd2d + checksum: 10/aec226065bc4285436a27379e08cc35bf94ef59f5098ac1c026495c9ba4ab33d851964082d3648d56d63eb90f2642867bd15a3e1b810b98beb1a8c14efce6a94 languageName: node linkType: hard @@ -8219,7 +8215,7 @@ __metadata: languageName: node linkType: hard -"@modelcontextprotocol/sdk@npm:^1.26.0, @modelcontextprotocol/sdk@npm:^1.8.0": +"@modelcontextprotocol/sdk@npm:^1.26.0": version: 1.26.0 resolution: "@modelcontextprotocol/sdk@npm:1.26.0" dependencies: @@ -9202,14 +9198,14 @@ __metadata: languageName: node linkType: hard -"@napi-rs/wasm-runtime@npm:^0.2.5, @napi-rs/wasm-runtime@npm:^0.2.9": - version: 0.2.9 - resolution: "@napi-rs/wasm-runtime@npm:0.2.9" +"@napi-rs/wasm-runtime@npm:^0.2.11, @napi-rs/wasm-runtime@npm:^0.2.5": + version: 0.2.12 + resolution: "@napi-rs/wasm-runtime@npm:0.2.12" dependencies: - "@emnapi/core": "npm:^1.4.0" - "@emnapi/runtime": "npm:^1.4.0" - "@tybys/wasm-util": "npm:^0.9.0" - checksum: 10/8ebc7d85e11e1b8d71908d5615ff24b27ef7af8287d087fb5cff5a3e545915c7545998d976a9cd6a4315dab4ba0f609439fbe6408fec3afebd288efb0dbdc135 + "@emnapi/core": "npm:^1.4.3" + "@emnapi/runtime": "npm:^1.4.3" + "@tybys/wasm-util": "npm:^0.10.0" + checksum: 10/5fd518182427980c28bc724adf06c5f32f9a8915763ef560b5f7d73607d30cd15ac86d0cbd2eb80d4cfab23fc80d0876d89ca36a9daadcb864bc00917c94187c languageName: node linkType: hard @@ -11219,58 +11215,135 @@ __metadata: languageName: node linkType: hard -"@oxlint/darwin-arm64@npm:1.18.0": - version: 1.18.0 - resolution: "@oxlint/darwin-arm64@npm:1.18.0" +"@oxlint/binding-android-arm-eabi@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-android-arm-eabi@npm:1.47.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@oxlint/binding-android-arm64@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-android-arm64@npm:1.47.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@oxlint/binding-darwin-arm64@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-darwin-arm64@npm:1.47.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@oxlint/darwin-x64@npm:1.18.0": - version: 1.18.0 - resolution: "@oxlint/darwin-x64@npm:1.18.0" +"@oxlint/binding-darwin-x64@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-darwin-x64@npm:1.47.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@oxlint/linux-arm64-gnu@npm:1.18.0": - version: 1.18.0 - resolution: "@oxlint/linux-arm64-gnu@npm:1.18.0" +"@oxlint/binding-freebsd-x64@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-freebsd-x64@npm:1.47.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@oxlint/binding-linux-arm-gnueabihf@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-linux-arm-gnueabihf@npm:1.47.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxlint/binding-linux-arm-musleabihf@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-linux-arm-musleabihf@npm:1.47.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxlint/binding-linux-arm64-gnu@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-linux-arm64-gnu@npm:1.47.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@oxlint/linux-arm64-musl@npm:1.18.0": - version: 1.18.0 - resolution: "@oxlint/linux-arm64-musl@npm:1.18.0" +"@oxlint/binding-linux-arm64-musl@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-linux-arm64-musl@npm:1.47.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@oxlint/linux-x64-gnu@npm:1.18.0": - version: 1.18.0 - resolution: "@oxlint/linux-x64-gnu@npm:1.18.0" +"@oxlint/binding-linux-ppc64-gnu@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-linux-ppc64-gnu@npm:1.47.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@oxlint/binding-linux-riscv64-gnu@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-linux-riscv64-gnu@npm:1.47.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@oxlint/binding-linux-riscv64-musl@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-linux-riscv64-musl@npm:1.47.0" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@oxlint/binding-linux-s390x-gnu@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-linux-s390x-gnu@npm:1.47.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@oxlint/binding-linux-x64-gnu@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-linux-x64-gnu@npm:1.47.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@oxlint/linux-x64-musl@npm:1.18.0": - version: 1.18.0 - resolution: "@oxlint/linux-x64-musl@npm:1.18.0" +"@oxlint/binding-linux-x64-musl@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-linux-x64-musl@npm:1.47.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@oxlint/win32-arm64@npm:1.18.0": - version: 1.18.0 - resolution: "@oxlint/win32-arm64@npm:1.18.0" +"@oxlint/binding-openharmony-arm64@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-openharmony-arm64@npm:1.47.0" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@oxlint/binding-win32-arm64-msvc@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-win32-arm64-msvc@npm:1.47.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@oxlint/win32-x64@npm:1.18.0": - version: 1.18.0 - resolution: "@oxlint/win32-x64@npm:1.18.0" +"@oxlint/binding-win32-ia32-msvc@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-win32-ia32-msvc@npm:1.47.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@oxlint/binding-win32-x64-msvc@npm:1.47.0": + version: 1.47.0 + resolution: "@oxlint/binding-win32-x64-msvc@npm:1.47.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -16690,7 +16763,7 @@ __metadata: languageName: node linkType: hard -"@tybys/wasm-util@npm:^0.10.1": +"@tybys/wasm-util@npm:^0.10.0, @tybys/wasm-util@npm:^0.10.1": version: 0.10.1 resolution: "@tybys/wasm-util@npm:0.10.1" dependencies: @@ -16699,15 +16772,6 @@ __metadata: languageName: node linkType: hard -"@tybys/wasm-util@npm:^0.9.0": - version: 0.9.0 - resolution: "@tybys/wasm-util@npm:0.9.0" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10/aa58e64753a420ad1eefaf7bacef3dda61d74f9336925943d9244132d5b48d9242f734f1e707fd5ccfa6dd1d8ec8e6debc234b4dedb3a5b0d8486d1f373350b2 - languageName: node - linkType: hard - "@types/accepts@npm:*": version: 1.3.7 resolution: "@types/accepts@npm:1.3.7" @@ -18045,115 +18109,138 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.32.1": - version: 8.32.1 - resolution: "@typescript-eslint/eslint-plugin@npm:8.32.1" +"@typescript-eslint/eslint-plugin@npm:8.55.0": + version: 8.55.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.55.0" dependencies: - "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.32.1" - "@typescript-eslint/type-utils": "npm:8.32.1" - "@typescript-eslint/utils": "npm:8.32.1" - "@typescript-eslint/visitor-keys": "npm:8.32.1" - graphemer: "npm:^1.4.0" - ignore: "npm:^7.0.0" + "@eslint-community/regexpp": "npm:^4.12.2" + "@typescript-eslint/scope-manager": "npm:8.55.0" + "@typescript-eslint/type-utils": "npm:8.55.0" + "@typescript-eslint/utils": "npm:8.55.0" + "@typescript-eslint/visitor-keys": "npm:8.55.0" + ignore: "npm:^7.0.5" natural-compare: "npm:^1.4.0" - ts-api-utils: "npm:^2.1.0" + ts-api-utils: "npm:^2.4.0" peerDependencies: - "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + "@typescript-eslint/parser": ^8.55.0 eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10/442205dd4e9fe016cf4f3edf292f5dba696c9e7d6c32c785a8bff0833974149513feab6c30d21e2f3c509bd2b2833edfb3175c0ee220661a02da59fd79100bb4 + typescript: ">=4.8.4 <6.0.0" + checksum: 10/b654130700b45077c6892f703c14e964d1facb76e1816e38d0707501e7f331ff0acf2b0b88daa2c5f4fffeabd2f04a5a723e1a28ff4e88bc267e60515584ce3a languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.32.1, @typescript-eslint/parser@npm:^8.18.0": - version: 8.32.1 - resolution: "@typescript-eslint/parser@npm:8.32.1" +"@typescript-eslint/parser@npm:8.55.0, @typescript-eslint/parser@npm:^8.55.0": + version: 8.55.0 + resolution: "@typescript-eslint/parser@npm:8.55.0" dependencies: - "@typescript-eslint/scope-manager": "npm:8.32.1" - "@typescript-eslint/types": "npm:8.32.1" - "@typescript-eslint/typescript-estree": "npm:8.32.1" - "@typescript-eslint/visitor-keys": "npm:8.32.1" - debug: "npm:^4.3.4" + "@typescript-eslint/scope-manager": "npm:8.55.0" + "@typescript-eslint/types": "npm:8.55.0" + "@typescript-eslint/typescript-estree": "npm:8.55.0" + "@typescript-eslint/visitor-keys": "npm:8.55.0" + debug: "npm:^4.4.3" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10/3c2ab90fec0aaaa57f883bf3963030e74402de82a73b8e47a19109accf18ee1441878bcba73bb9584890eedb56215000d6652196d9bfde05272c043d1c9c529d + typescript: ">=4.8.4 <6.0.0" + checksum: 10/f6140b163ce1fd460fbcc51c79fdaf2825d95764741c2d73271416e13d2302c25fa578fc1e46cb0f4a78867264f7df5ed424c500737cc49084fe0af8ad33c541 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.32.1": - version: 8.32.1 - resolution: "@typescript-eslint/scope-manager@npm:8.32.1" +"@typescript-eslint/project-service@npm:8.55.0": + version: 8.55.0 + resolution: "@typescript-eslint/project-service@npm:8.55.0" dependencies: - "@typescript-eslint/types": "npm:8.32.1" - "@typescript-eslint/visitor-keys": "npm:8.32.1" - checksum: 10/f81f71bd88e6bed90c9a42ed3cd26a360f8f7ca53186cea33b872194bf724a4635dd3aead5002b18de6cc5d1df9840445af1f7fc4d117f452705ccebdb6c0b0f + "@typescript-eslint/tsconfig-utils": "npm:^8.55.0" + "@typescript-eslint/types": "npm:^8.55.0" + debug: "npm:^4.4.3" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10/50f5b65b2c7901c78cf5c3353e46cf84710d304c9b0211b8484e67345158660a50b492d4b774a07aac9b74a4289cb9ff3b637ae37619bbd5ccace5d20806688e languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.32.1": - version: 8.32.1 - resolution: "@typescript-eslint/type-utils@npm:8.32.1" +"@typescript-eslint/scope-manager@npm:8.55.0": + version: 8.55.0 + resolution: "@typescript-eslint/scope-manager@npm:8.55.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.32.1" - "@typescript-eslint/utils": "npm:8.32.1" - debug: "npm:^4.3.4" - ts-api-utils: "npm:^2.1.0" + "@typescript-eslint/types": "npm:8.55.0" + "@typescript-eslint/visitor-keys": "npm:8.55.0" + checksum: 10/6da96d6459f6c53a5337071ac71e78ce7922928c00f3d1dafe2a8eafcac194bca815d178c0ca1b69f89ca9c5a24d6c0e9131ed4447d64a6511295909553e3960 + languageName: node + linkType: hard + +"@typescript-eslint/tsconfig-utils@npm:8.55.0, @typescript-eslint/tsconfig-utils@npm:^8.55.0": + version: 8.55.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.55.0" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10/281764b85f6bcae6de9865b5133b7be313f212bffe63cb3b5f09f94a2b7c7bfc83319935ed044de4b95f9043a16553d027107de6cb6f0c6e75fba900e26eb831 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:8.55.0": + version: 8.55.0 + resolution: "@typescript-eslint/type-utils@npm:8.55.0" + dependencies: + "@typescript-eslint/types": "npm:8.55.0" + "@typescript-eslint/typescript-estree": "npm:8.55.0" + "@typescript-eslint/utils": "npm:8.55.0" + debug: "npm:^4.4.3" + ts-api-utils: "npm:^2.4.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10/e50a6f2a16ccd916ed32a4d0b6c1011b8c177d1f789dfa629942efbd6cd3b1f5b9dc42c67b64e8c377338b34906e0191b9165caa4302d92979f13cd06d1b4234 + typescript: ">=4.8.4 <6.0.0" + checksum: 10/0d13b5eedfae55feb3ea4e16d20a20ba79b3126d7ad526016967fa16062415b048c1aa1ee6255a34d4752d683cef2e47c7411bcb4495b9f00e1f3435804c0589 languageName: node linkType: hard -"@typescript-eslint/types@npm:8.32.1": - version: 8.32.1 - resolution: "@typescript-eslint/types@npm:8.32.1" - checksum: 10/3a310e4bafa8dd6ddc83cd8627048ebe54660982348531bbbeee3d0fb06ffdacce6ac14200159166774bd8797664686f5d0bf19d3dd33216daccbc0e48cd3e51 +"@typescript-eslint/types@npm:8.55.0, @typescript-eslint/types@npm:^8.35.0, @typescript-eslint/types@npm:^8.55.0": + version: 8.55.0 + resolution: "@typescript-eslint/types@npm:8.55.0" + checksum: 10/4069e8691d0651e298ec78908401cc792a11e29809da3e5f3eeba0e76509a2b394563ee0932a7c5d8cad19accc4f7d835dcd8b4faa4372e6af013df322a3bd58 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.32.1": - version: 8.32.1 - resolution: "@typescript-eslint/typescript-estree@npm:8.32.1" +"@typescript-eslint/typescript-estree@npm:8.55.0": + version: 8.55.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.55.0" dependencies: - "@typescript-eslint/types": "npm:8.32.1" - "@typescript-eslint/visitor-keys": "npm:8.32.1" - debug: "npm:^4.3.4" - fast-glob: "npm:^3.3.2" - is-glob: "npm:^4.0.3" - minimatch: "npm:^9.0.4" - semver: "npm:^7.6.0" - ts-api-utils: "npm:^2.1.0" + "@typescript-eslint/project-service": "npm:8.55.0" + "@typescript-eslint/tsconfig-utils": "npm:8.55.0" + "@typescript-eslint/types": "npm:8.55.0" + "@typescript-eslint/visitor-keys": "npm:8.55.0" + debug: "npm:^4.4.3" + minimatch: "npm:^9.0.5" + semver: "npm:^7.7.3" + tinyglobby: "npm:^0.2.15" + ts-api-utils: "npm:^2.4.0" peerDependencies: - typescript: ">=4.8.4 <5.9.0" - checksum: 10/8b956ce05bf64d412e33b7d564db9d5620a7c2600ab04f2c6bb7561bcf46593f14b77ca9c895a4480869a323565a140985a4f4760f9df58f71114c4f502b3c78 + typescript: ">=4.8.4 <6.0.0" + checksum: 10/219468b2bfc5abd3ee057ac6bc6bf5cb58da4accd5455dbf6f1cdce150c794a13677b1f82adb6f80b2488c8df40d4c0730c42df9f7e924ce122d9a6b933055c3 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.32.1, @typescript-eslint/utils@npm:^8.23.0, @typescript-eslint/utils@npm:^8.31.0": - version: 8.32.1 - resolution: "@typescript-eslint/utils@npm:8.32.1" +"@typescript-eslint/utils@npm:8.55.0, @typescript-eslint/utils@npm:^8.23.0": + version: 8.55.0 + resolution: "@typescript-eslint/utils@npm:8.55.0" dependencies: - "@eslint-community/eslint-utils": "npm:^4.7.0" - "@typescript-eslint/scope-manager": "npm:8.32.1" - "@typescript-eslint/types": "npm:8.32.1" - "@typescript-eslint/typescript-estree": "npm:8.32.1" + "@eslint-community/eslint-utils": "npm:^4.9.1" + "@typescript-eslint/scope-manager": "npm:8.55.0" + "@typescript-eslint/types": "npm:8.55.0" + "@typescript-eslint/typescript-estree": "npm:8.55.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10/9383cea185f3b54124a639f806d627f686637460e2eea431ccb9eeb6452dcd5a893856e051eb5925510f8aeb9317f8b7d23d9f39ca8fa80c46f2b797dae77d9c + typescript: ">=4.8.4 <6.0.0" + checksum: 10/a2218103328905977a67735b55b30dc851084bd086e7f469355f8056577ec79eb30fc42cec16f1881803c764a0ee60aeb62fe0caa4c407bdba3fd72f67c2d114 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.32.1": - version: 8.32.1 - resolution: "@typescript-eslint/visitor-keys@npm:8.32.1" +"@typescript-eslint/visitor-keys@npm:8.55.0": + version: 8.55.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.55.0" dependencies: - "@typescript-eslint/types": "npm:8.32.1" - eslint-visitor-keys: "npm:^4.2.0" - checksum: 10/a1cbfbdac89d443dfc2718673e2cc1e884fc942678b3d1c3149cdab8123c71685473e362d794fcee1e975ceb45d16f44025a3f0bebe9b09a6bf8679f060d6817 + "@typescript-eslint/types": "npm:8.55.0" + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10/c35f2b1b69d103edb78dca5ba28acb2454c2eb75a97e4c90a205059df73790185627326c8816b671d5734f1d966196ece605cf592dfa10d323ec6530b3260140 languageName: node linkType: hard @@ -18164,123 +18251,137 @@ __metadata: languageName: node linkType: hard -"@unrs/resolver-binding-darwin-arm64@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.7.2" +"@unrs/resolver-binding-android-arm-eabi@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-android-arm-eabi@npm:1.11.1" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-android-arm64@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-android-arm64@npm:1.11.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-darwin-arm64@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.11.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@unrs/resolver-binding-darwin-x64@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-darwin-x64@npm:1.7.2" +"@unrs/resolver-binding-darwin-x64@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-darwin-x64@npm:1.11.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@unrs/resolver-binding-freebsd-x64@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.7.2" +"@unrs/resolver-binding-freebsd-x64@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.11.1" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.7.2" +"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.11.1" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.7.2" +"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.11.1" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@unrs/resolver-binding-linux-arm64-gnu@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.7.2" +"@unrs/resolver-binding-linux-arm64-gnu@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.11.1" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-arm64-musl@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.7.2" +"@unrs/resolver-binding-linux-arm64-musl@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.11.1" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.7.2" +"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.11.1" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-riscv64-gnu@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.7.2" +"@unrs/resolver-binding-linux-riscv64-gnu@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.11.1" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-riscv64-musl@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.7.2" +"@unrs/resolver-binding-linux-riscv64-musl@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.11.1" conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@unrs/resolver-binding-linux-s390x-gnu@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.7.2" +"@unrs/resolver-binding-linux-s390x-gnu@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.11.1" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-x64-gnu@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.7.2" +"@unrs/resolver-binding-linux-x64-gnu@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.11.1" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-x64-musl@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.7.2" +"@unrs/resolver-binding-linux-x64-musl@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.11.1" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@unrs/resolver-binding-wasm32-wasi@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.7.2" +"@unrs/resolver-binding-wasm32-wasi@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.11.1" dependencies: - "@napi-rs/wasm-runtime": "npm:^0.2.9" + "@napi-rs/wasm-runtime": "npm:^0.2.11" conditions: cpu=wasm32 languageName: node linkType: hard -"@unrs/resolver-binding-win32-arm64-msvc@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.7.2" +"@unrs/resolver-binding-win32-arm64-msvc@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.11.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@unrs/resolver-binding-win32-ia32-msvc@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.7.2" +"@unrs/resolver-binding-win32-ia32-msvc@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.11.1" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@unrs/resolver-binding-win32-x64-msvc@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.7.2" +"@unrs/resolver-binding-win32-x64-msvc@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.11.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -20488,6 +20589,13 @@ __metadata: languageName: node linkType: hard +"change-case@npm:^5.4.4": + version: 5.4.4 + resolution: "change-case@npm:5.4.4" + checksum: 10/446e5573f3c854290a91292afef92b957d2e43a928260c91989b482aa860caaa29711b6725fc40c200af68061cbab357b033446d16a17bc5c553636994074e92 + languageName: node + linkType: hard + "changelogen@npm:0.5.7": version: 0.5.7 resolution: "changelogen@npm:0.5.7" @@ -20732,10 +20840,10 @@ __metadata: languageName: node linkType: hard -"ci-info@npm:^4.2.0, ci-info@npm:^4.3.0": - version: 4.3.1 - resolution: "ci-info@npm:4.3.1" - checksum: 10/9dc952bef67e665ccde2e7a552d42d5d095529d21829ece060a00925ede2dfa136160c70ef2471ea6ed6c9b133218b47c007f56955c0f1734a2e57f240aa7445 +"ci-info@npm:^4.2.0, ci-info@npm:^4.3.0, ci-info@npm:^4.3.1": + version: 4.4.0 + resolution: "ci-info@npm:4.4.0" + checksum: 10/dfded0c630267d89660c8abb988ac8395a382bdfefedcc03e3e2858523312c5207db777c239c34774e3fcff11f015477c19d2ac8a58ea58aa476614a2e64f434 languageName: node linkType: hard @@ -21535,12 +21643,12 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.41.0": - version: 3.42.0 - resolution: "core-js-compat@npm:3.42.0" +"core-js-compat@npm:^3.46.0": + version: 3.48.0 + resolution: "core-js-compat@npm:3.48.0" dependencies: - browserslist: "npm:^4.24.4" - checksum: 10/2052c73e500e95420d948a0595f4055e40ca6a208cc15c7981b7f202efa851bfae3de59a13009dc367cc5fbaeb8ff84a64c7c0bfc37de4b3bd2cf6b0e14290bd + browserslist: "npm:^4.28.1" + checksum: 10/83c326dcfef5e174fd3f8f33c892c66e06d567ce27f323a1197a6c280c0178fe18d3e9c5fb95b00c18b98d6c53fba5c646def5fedaa77310a4297d16dfbe2029 languageName: node linkType: hard @@ -22469,15 +22577,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.2.7": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: "npm:^2.1.1" - checksum: 10/d86fd7be2b85462297ea16f1934dc219335e802f629ca9a69b63ed8ed041dda492389bb2ee039217c02e5b54792b1c51aa96ae954cf28634d363a2360c7a1639 - languageName: node - linkType: hard - "debug@npm:~4.3.1, debug@npm:~4.3.2, debug@npm:~4.3.4": version: 4.3.7 resolution: "debug@npm:4.3.7" @@ -23778,38 +23877,43 @@ __metadata: languageName: node linkType: hard -"eslint-config-prettier@npm:^10.0.0": - version: 10.1.5 - resolution: "eslint-config-prettier@npm:10.1.5" +"eslint-config-prettier@npm:^10.1.8": + version: 10.1.8 + resolution: "eslint-config-prettier@npm:10.1.8" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: 10/bc192e703e595c886c33703ebb9a8381a18179ce2ec14a24f671cb675a96b8ba1b4a862c5763680e1c918131007759afb3c874788c7d61706740147ae77f249a + checksum: 10/03f8e6ea1a6a9b8f9eeaf7c8c52a96499ec4b275b9ded33331a6cc738ed1d56de734097dbd0091f136f0e84bc197388bd8ec22a52a4658105883f8c8b7d8921a languageName: node linkType: hard -"eslint-import-resolver-node@npm:^0.3.9": - version: 0.3.9 - resolution: "eslint-import-resolver-node@npm:0.3.9" +"eslint-import-context@npm:^0.1.8, eslint-import-context@npm:^0.1.9": + version: 0.1.9 + resolution: "eslint-import-context@npm:0.1.9" dependencies: - debug: "npm:^3.2.7" - is-core-module: "npm:^2.13.0" - resolve: "npm:^1.22.4" - checksum: 10/d52e08e1d96cf630957272e4f2644dcfb531e49dcfd1edd2e07e43369eb2ec7a7d4423d417beee613201206ff2efa4eb9a582b5825ee28802fc7c71fcd53ca83 + get-tsconfig: "npm:^4.10.1" + stable-hash-x: "npm:^0.2.0" + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true + checksum: 10/f0778126bb3aae57c8c68946c71c4418927e9d39f72099b799d9c47a3b5712d6c9166b63ee8be58a020961dcc9216df09c856b825336af375ccbbdeedfc82a99 languageName: node linkType: hard -"eslint-import-resolver-typescript@npm:^4.0.0": - version: 4.3.4 - resolution: "eslint-import-resolver-typescript@npm:4.3.4" +"eslint-import-resolver-typescript@npm:^4.4.4": + version: 4.4.4 + resolution: "eslint-import-resolver-typescript@npm:4.4.4" dependencies: - debug: "npm:^4.4.0" - get-tsconfig: "npm:^4.10.0" + debug: "npm:^4.4.1" + eslint-import-context: "npm:^0.1.8" + get-tsconfig: "npm:^4.10.1" is-bun-module: "npm:^2.0.0" - stable-hash: "npm:^0.0.5" - tinyglobby: "npm:^0.2.13" - unrs-resolver: "npm:^1.6.3" + stable-hash-x: "npm:^0.2.0" + tinyglobby: "npm:^0.2.14" + unrs-resolver: "npm:^1.7.11" peerDependencies: eslint: "*" eslint-plugin-import: "*" @@ -23819,41 +23923,61 @@ __metadata: optional: true eslint-plugin-import-x: optional: true - checksum: 10/3620479c17bfbe7d40706c06e15a559a0a626af16bec3fe3046644ca84a5b49d5b8996753e5caf1b4f3de2140dbde5dc852aa3ea5fc4f459c080400b23af9e7e + checksum: 10/4f871f6d1a04c55c2087c5ff1030f783a29abb59901b354d7ef58a0fc687d379dcbd08cf377cddeb7e19f26dd380d32d85ee4760e9410a059639d2b3df7d1ff3 languageName: node linkType: hard -"eslint-plugin-import-x@npm:^4.5.0": - version: 4.11.1 - resolution: "eslint-plugin-import-x@npm:4.11.1" +"eslint-plugin-import-x@npm:^4.16.1": + version: 4.16.1 + resolution: "eslint-plugin-import-x@npm:4.16.1" dependencies: - "@typescript-eslint/utils": "npm:^8.31.0" + "@typescript-eslint/types": "npm:^8.35.0" comment-parser: "npm:^1.4.1" - debug: "npm:^4.4.0" - eslint-import-resolver-node: "npm:^0.3.9" - get-tsconfig: "npm:^4.10.0" + debug: "npm:^4.4.1" + eslint-import-context: "npm:^0.1.9" is-glob: "npm:^4.0.3" minimatch: "npm:^9.0.3 || ^10.0.1" - semver: "npm:^7.7.1" - stable-hash: "npm:^0.0.5" - tslib: "npm:^2.8.1" - unrs-resolver: "npm:^1.7.0" + semver: "npm:^7.7.2" + stable-hash-x: "npm:^0.2.0" + unrs-resolver: "npm:^1.9.2" peerDependencies: + "@typescript-eslint/utils": ^8.0.0 eslint: ^8.57.0 || ^9.0.0 - checksum: 10/98e7f4a92f3d3c830d0776aa2da66e4f3628c6a73b18edbfbd70c6091b82149aa8966fd7db6884b4490aceeb4bc906e82988a755b66351a1bbfb89111e8d72b0 + eslint-import-resolver-node: "*" + peerDependenciesMeta: + "@typescript-eslint/utils": + optional: true + eslint-import-resolver-node: + optional: true + checksum: 10/d1390d49499b613c1334e48fe8b104221584a1473fbec8974584002561aacef5347c4450c559df6fe24c3abe3b0d167eefdc5510e794e96a4ea4f9cb1d501515 languageName: node linkType: hard -"eslint-plugin-react-hooks@npm:^5.1.0": - version: 5.2.0 - resolution: "eslint-plugin-react-hooks@npm:5.2.0" +"eslint-plugin-oxlint@npm:^1.46.0": + version: 1.46.0 + resolution: "eslint-plugin-oxlint@npm:1.46.0" + dependencies: + jsonc-parser: "npm:^3.3.1" + checksum: 10/385f537a380d9e227be4a9eb31e331cad06560ddabbbd369c00010f795648ecb9dd9f003615d37f5d42be16a6f076a449e27feaf267ba56ca5114822e05b4d10 + languageName: node + linkType: hard + +"eslint-plugin-react-hooks@npm:^7.0.1": + version: 7.0.1 + resolution: "eslint-plugin-react-hooks@npm:7.0.1" + dependencies: + "@babel/core": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" + hermes-parser: "npm:^0.25.1" + zod: "npm:^3.25.0 || ^4.0.0" + zod-validation-error: "npm:^3.5.0 || ^4.0.0" peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - checksum: 10/ebb79e9cf69ae06e3a7876536653c5e556b5fd8cd9dc49577f10a6e728360e7b6f5ce91f4339b33e93b26e3bb23805418f8b5e75db80baddd617b1dffe73bed1 + checksum: 10/12e96c68d58c6588305fd17d660524a1ef1e872650ec591d5b138f059431290831c373d4b1c9ae8991fb25f96c43935497d2149678c027e65d0417d3d99ecc85 languageName: node linkType: hard -"eslint-plugin-react@npm:^7.37.2": +"eslint-plugin-react@npm:^7.37.5": version: 7.37.5 resolution: "eslint-plugin-react@npm:7.37.5" dependencies: @@ -23890,49 +24014,49 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-sonarjs@npm:^3.0.1": - version: 3.0.2 - resolution: "eslint-plugin-sonarjs@npm:3.0.2" +"eslint-plugin-sonarjs@npm:^3.0.7": + version: 3.0.7 + resolution: "eslint-plugin-sonarjs@npm:3.0.7" dependencies: - "@eslint-community/regexpp": "npm:4.12.1" + "@eslint-community/regexpp": "npm:4.12.2" builtin-modules: "npm:3.3.0" bytes: "npm:3.1.2" functional-red-black-tree: "npm:1.0.1" - jsx-ast-utils: "npm:3.3.5" - minimatch: "npm:9.0.5" + jsx-ast-utils-x: "npm:0.1.0" + lodash.merge: "npm:4.6.2" + minimatch: "npm:10.1.2" scslre: "npm:0.3.0" - semver: "npm:7.7.1" - typescript: "npm:^5" + semver: "npm:7.7.4" + typescript: "npm:>=5" peerDependencies: eslint: ^8.0.0 || ^9.0.0 - checksum: 10/971ed06ff2a7f24c561f9be212f89764cec9e279f6d18157df69f7f49fff56b5f7259ea00cbfb16ad261d1ed0f1eb179dd46ba760f78f95cc2c95bff37737974 + checksum: 10/1e457c16fe200f36361595f96ef46681b1c7797c81471093edccb944a29d96434650d3800de9962707579a9f357586d090e56694e72060024a2bd80d56b537a9 languageName: node linkType: hard -"eslint-plugin-unicorn@npm:^59.0.0": - version: 59.0.1 - resolution: "eslint-plugin-unicorn@npm:59.0.1" +"eslint-plugin-unicorn@npm:^63.0.0": + version: 63.0.0 + resolution: "eslint-plugin-unicorn@npm:63.0.0" dependencies: - "@babel/helper-validator-identifier": "npm:^7.25.9" - "@eslint-community/eslint-utils": "npm:^4.5.1" - "@eslint/plugin-kit": "npm:^0.2.7" - ci-info: "npm:^4.2.0" + "@babel/helper-validator-identifier": "npm:^7.28.5" + "@eslint-community/eslint-utils": "npm:^4.9.0" + change-case: "npm:^5.4.4" + ci-info: "npm:^4.3.1" clean-regexp: "npm:^1.0.0" - core-js-compat: "npm:^3.41.0" - esquery: "npm:^1.6.0" + core-js-compat: "npm:^3.46.0" find-up-simple: "npm:^1.0.1" - globals: "npm:^16.0.0" + globals: "npm:^16.4.0" indent-string: "npm:^5.0.0" is-builtin-module: "npm:^5.0.0" jsesc: "npm:^3.1.0" pluralize: "npm:^8.0.0" regexp-tree: "npm:^0.1.27" - regjsparser: "npm:^0.12.0" - semver: "npm:^7.7.1" - strip-indent: "npm:^4.0.0" + regjsparser: "npm:^0.13.0" + semver: "npm:^7.7.3" + strip-indent: "npm:^4.1.1" peerDependencies: - eslint: ">=9.22.0" - checksum: 10/df3e695a0eaf4cd82ccaab97494bbf2aa67b1278bae3a3b87c38129c00142e40f03fe16cdeac83717fdd9923d4ca32d55897a33556c4951abd36fa59fd8e77d0 + eslint: ">=9.38.0" + checksum: 10/bfcaf383e8e244c13311900d4e152b1a4134f844ddc8514d86aca7da932a4663b144fceca7a32a796faaf53a84a203dcd3052ef846c05990dd285c19ed6c9f17 languageName: node linkType: hard @@ -23946,13 +24070,13 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^8.3.0": - version: 8.3.0 - resolution: "eslint-scope@npm:8.3.0" +"eslint-scope@npm:^8.4.0": + version: 8.4.0 + resolution: "eslint-scope@npm:8.4.0" dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10/ee1ff009e949423639a8b53453c0cb189967d9142c5d94dc3752bed9880140a0760007148ac6b0bd03557d70ede9cd7c3b1e66f9a7f3427b2dbeca2a5be22c91 + checksum: 10/e8e611701f65375e034c62123946e628894f0b54aa8cb11abe224816389abe5cd74cf16b62b72baa36504f22d1a958b9b8b0169b82397fe2e7997674c0d09b06 languageName: node linkType: hard @@ -23963,39 +24087,37 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^4.2.0": - version: 4.2.0 - resolution: "eslint-visitor-keys@npm:4.2.0" - checksum: 10/9651b3356b01760e586b4c631c5268c0e1a85236e3292bf754f0472f465bf9a856c0ddc261fceace155334118c0151778effafbab981413dbf9288349343fa25 +"eslint-visitor-keys@npm:^4.2.1": + version: 4.2.1 + resolution: "eslint-visitor-keys@npm:4.2.1" + checksum: 10/3ee00fc6a7002d4b0ffd9dc99e13a6a7882c557329e6c25ab254220d71e5c9c4f89dca4695352949ea678eb1f3ba912a18ef8aac0a7fe094196fd92f441bfce2 languageName: node linkType: hard -"eslint@npm:^9.16.0": - version: 9.26.0 - resolution: "eslint@npm:9.26.0" +"eslint@npm:^9.39.2": + version: 9.39.2 + resolution: "eslint@npm:9.39.2" dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/eslint-utils": "npm:^4.8.0" "@eslint-community/regexpp": "npm:^4.12.1" - "@eslint/config-array": "npm:^0.20.0" - "@eslint/config-helpers": "npm:^0.2.1" - "@eslint/core": "npm:^0.13.0" + "@eslint/config-array": "npm:^0.21.1" + "@eslint/config-helpers": "npm:^0.4.2" + "@eslint/core": "npm:^0.17.0" "@eslint/eslintrc": "npm:^3.3.1" - "@eslint/js": "npm:9.26.0" - "@eslint/plugin-kit": "npm:^0.2.8" + "@eslint/js": "npm:9.39.2" + "@eslint/plugin-kit": "npm:^0.4.1" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" "@humanwhocodes/retry": "npm:^0.4.2" - "@modelcontextprotocol/sdk": "npm:^1.8.0" "@types/estree": "npm:^1.0.6" - "@types/json-schema": "npm:^7.0.15" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" cross-spawn: "npm:^7.0.6" debug: "npm:^4.3.2" escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^8.3.0" - eslint-visitor-keys: "npm:^4.2.0" - espree: "npm:^10.3.0" + eslint-scope: "npm:^8.4.0" + eslint-visitor-keys: "npm:^4.2.1" + espree: "npm:^10.4.0" esquery: "npm:^1.5.0" esutils: "npm:^2.0.2" fast-deep-equal: "npm:^3.1.3" @@ -24010,7 +24132,6 @@ __metadata: minimatch: "npm:^3.1.2" natural-compare: "npm:^1.4.0" optionator: "npm:^0.9.3" - zod: "npm:^3.24.2" peerDependencies: jiti: "*" peerDependenciesMeta: @@ -24018,18 +24139,18 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10/b87092cb7e87f1d0963475c1a1e15e551842ea122925cf13231e742fae565bf3582029a5b0b4aecf793f25c26ee0be3ee1f32190bc361e0c3f3633b9cbace948 + checksum: 10/53ff0e9c8264e7e8d40d50fdc0c0df0b701cfc5289beedfb686c214e3e7b199702f894bbd1bb48653727bb1ecbd1147cf5f555a4ae71e1daf35020cdc9072d9f languageName: node linkType: hard -"espree@npm:^10.0.1, espree@npm:^10.3.0": - version: 10.3.0 - resolution: "espree@npm:10.3.0" +"espree@npm:^10.0.1, espree@npm:^10.3.0, espree@npm:^10.4.0": + version: 10.4.0 + resolution: "espree@npm:10.4.0" dependencies: - acorn: "npm:^8.14.0" + acorn: "npm:^8.15.0" acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^4.2.0" - checksum: 10/3412d44d4204c9e29d6b5dd0277400cfa0cd68495dc09eae1b9ce79d0c8985c1c5cc09cb9ba32a1cd963f48a49b0c46bdb7736afe395a300aa6bb1c0d86837e8 + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10/9b355b32dbd1cc9f57121d5ee3be258fab87ebeb7c83fc6c02e5af1a74fc8c5ba79fe8c663e69ea112c3e84a1b95e6a2067ac4443ee7813bb85ac7581acb8bf9 languageName: node linkType: hard @@ -24043,7 +24164,7 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.5.0, esquery@npm:^1.6.0": +"esquery@npm:^1.5.0": version: 1.6.0 resolution: "esquery@npm:1.6.0" dependencies: @@ -24470,7 +24591,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:3.3.3, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.2, fast-glob@npm:^3.3.3": +"fast-glob@npm:3.3.3, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.3": version: 3.3.3 resolution: "fast-glob@npm:3.3.3" dependencies: @@ -25353,12 +25474,12 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.10.0, get-tsconfig@npm:^4.7.5": - version: 4.10.0 - resolution: "get-tsconfig@npm:4.10.0" +"get-tsconfig@npm:^4.10.1, get-tsconfig@npm:^4.7.5": + version: 4.13.6 + resolution: "get-tsconfig@npm:4.13.6" dependencies: resolve-pkg-maps: "npm:^1.0.0" - checksum: 10/5259b5c99a1957114337d9d0603b4a305ec9e29fa6cac7d2fbf634ba6754a0cc88bfd281a02416ce64e604b637d3cb239185381a79a5842b17fb55c097b38c4b + checksum: 10/5cd1c1f273e9f1cd9f1ebeaaea281a3b7b71562fc9614ee0cf0575463b0435de68831354434a5a1a564e1049062d597d0dae8ef33f489a6d12afccee032f6784 languageName: node linkType: hard @@ -25538,10 +25659,10 @@ __metadata: languageName: node linkType: hard -"globals@npm:^16.0.0": - version: 16.1.0 - resolution: "globals@npm:16.1.0" - checksum: 10/b24fa86c9d9e7f452572977105cefa66529ac166faf1d81abe6618e0ccce98cdd32f8cbc25d37ed6c2dbe7936b00d442696fd0c96da4c90567490488ecefb8fa +"globals@npm:^16.4.0": + version: 16.5.0 + resolution: "globals@npm:16.5.0" + checksum: 10/f9e8a2a13f50222c127030a619e283e7bbfe32966316bdde0715af1d15a7e40cb9c24ff52cad59671f97762ed8b515353c2f8674f560c63d9385f19ee26735a6 languageName: node linkType: hard @@ -25984,6 +26105,22 @@ __metadata: languageName: node linkType: hard +"hermes-estree@npm:0.25.1": + version: 0.25.1 + resolution: "hermes-estree@npm:0.25.1" + checksum: 10/7b1eca98b264a25632064cffa5771360d30cf452e77db1e191f9913ee45cf78c292b2dbca707e92fb71b0870abb97e94b506a5ab80abd96ba237fee169b601fe + languageName: node + linkType: hard + +"hermes-parser@npm:^0.25.1": + version: 0.25.1 + resolution: "hermes-parser@npm:0.25.1" + dependencies: + hermes-estree: "npm:0.25.1" + checksum: 10/805efc05691420f236654349872c70731121791fa54de521c7ee51059eae34f84dd19f22ee846741dcb60372f8fb5335719b96b4ecb010d2aed7d872f2eff9cc + languageName: node + linkType: hard + "history@npm:^5.3.0": version: 5.3.0 resolution: "history@npm:5.3.0" @@ -26504,10 +26641,10 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^7.0.0, ignore@npm:^7.0.3": - version: 7.0.4 - resolution: "ignore@npm:7.0.4" - checksum: 10/01ee59df2ffd14b0844efc17f5ab3642c848e45efdb7cc757928da5e076cb74313748f77f5ffe362a6407c5e7cc71f10fad5e8eb9d91c1a17c4e7ef2c1f8e40e +"ignore@npm:^7.0.3, ignore@npm:^7.0.5": + version: 7.0.5 + resolution: "ignore@npm:7.0.5" + checksum: 10/f134b96a4de0af419196f52c529d5c6120c4456ff8a6b5a14ceaaa399f883e15d58d2ce651c9b69b9388491d4669dda47285d307e827de9304a53a1824801bc6 languageName: node linkType: hard @@ -27574,7 +27711,7 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^3.0.2, jsesc@npm:^3.1.0": +"jsesc@npm:^3.0.2, jsesc@npm:^3.1.0, jsesc@npm:~3.1.0": version: 3.1.0 resolution: "jsesc@npm:3.1.0" bin: @@ -27583,15 +27720,6 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:~3.0.2": - version: 3.0.2 - resolution: "jsesc@npm:3.0.2" - bin: - jsesc: bin/jsesc - checksum: 10/8e5a7de6b70a8bd71f9cb0b5a7ade6a73ae6ab55e697c74cc997cede97417a3a65ed86c36f7dd6125fe49766e8386c845023d9e213916ca92c9dfdd56e2babf3 - languageName: node - linkType: hard - "json-bigint@npm:^1.0.0": version: 1.0.0 resolution: "json-bigint@npm:1.0.0" @@ -27747,7 +27875,14 @@ __metadata: languageName: node linkType: hard -"jsx-ast-utils@npm:3.3.5, jsx-ast-utils@npm:^2.4.1 || ^3.0.0": +"jsx-ast-utils-x@npm:0.1.0": + version: 0.1.0 + resolution: "jsx-ast-utils-x@npm:0.1.0" + checksum: 10/ca28d2f2c9cf7e1c971f4a21d1f73197bb528659a9da50ab84065cdeedad422dacdf835e83cbc4264da4d84d41303f0c8fcca78d430d3fdbf22e10b7c7bf4724 + languageName: node + linkType: hard + +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" dependencies: @@ -28471,7 +28606,7 @@ __metadata: languageName: node linkType: hard -"lodash.merge@npm:^4.6.2": +"lodash.merge@npm:4.6.2, lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" checksum: 10/d0ea2dd0097e6201be083865d50c3fb54fbfbdb247d9cc5950e086c991f448b7ab0cdab0d57eacccb43473d3f2acd21e134db39f22dac2d6c9ba6bf26978e3d6 @@ -29833,7 +29968,7 @@ __metadata: languageName: node linkType: hard -"min-indent@npm:^1.0.0, min-indent@npm:^1.0.1": +"min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" checksum: 10/bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 @@ -29859,6 +29994,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:10.1.2, minimatch@npm:^10.0.3, minimatch@npm:^10.1.1, minimatch@npm:^9.0.3 || ^10.0.1": + version: 10.1.2 + resolution: "minimatch@npm:10.1.2" + dependencies: + "@isaacs/brace-expansion": "npm:^5.0.1" + checksum: 10/6f0ef975463739207144e411bdd54f7205ce38770b162fa3bc4c9be4987a16cb20d0962a82f26c2372598cfba90faa97b327239d303b529b774f17681c163b46 + languageName: node + linkType: hard + "minimatch@npm:3.1.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -29868,24 +30012,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:9.0.5, minimatch@npm:^9.0.0, minimatch@npm:^9.0.3, minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10/dd6a8927b063aca6d910b119e1f2df6d2ce7d36eab91de83167dd136bb85e1ebff97b0d3de1cb08bd1f7e018ca170b4962479fefab5b2a69e2ae12cb2edc8348 - languageName: node - linkType: hard - -"minimatch@npm:^10.0.3, minimatch@npm:^10.1.1, minimatch@npm:^9.0.3 || ^10.0.1": - version: 10.1.1 - resolution: "minimatch@npm:10.1.1" - dependencies: - "@isaacs/brace-expansion": "npm:^5.0.0" - checksum: 10/110f38921ea527022e90f7a5f43721838ac740d0a0c26881c03b57c261354fb9a0430e40b2c56dfcea2ef3c773768f27210d1106f1f2be19cde3eea93f26f45e - languageName: node - linkType: hard - "minimatch@npm:^5.0.1, minimatch@npm:^5.1.1": version: 5.1.6 resolution: "minimatch@npm:5.1.6" @@ -29904,6 +30030,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.0, minimatch@npm:^9.0.3, minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/dd6a8927b063aca6d910b119e1f2df6d2ce7d36eab91de83167dd136bb85e1ebff97b0d3de1cb08bd1f7e018ca170b4962479fefab5b2a69e2ae12cb2edc8348 + languageName: node + linkType: hard + "minimist@npm:^1.1.3, minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.7, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -30321,12 +30456,12 @@ __metadata: languageName: node linkType: hard -"napi-postinstall@npm:^0.2.2": - version: 0.2.3 - resolution: "napi-postinstall@npm:0.2.3" +"napi-postinstall@npm:^0.3.0": + version: 0.3.4 + resolution: "napi-postinstall@npm:0.3.4" bin: napi-postinstall: lib/cli.js - checksum: 10/168525a8b80610c9f7dfe18feb40a86a6dc473d939c805eaa53a74bb1645ad9c3784904e41901f5f956f0147069d30a0b44e1bca5d73e94d8bbc112f36ae6eb7 + checksum: 10/5541381508f9e1051ff3518701c7130ebac779abb3a1ffe9391fcc3cab4cc0569b0ba0952357db3f6b12909c3bb508359a7a60261ffd795feebbdab967175832 languageName: node linkType: hard @@ -31120,44 +31255,76 @@ __metadata: languageName: node linkType: hard -"oxlint@npm:~1.18.0": - version: 1.18.0 - resolution: "oxlint@npm:1.18.0" +"oxlint@npm:^1.47.0": + version: 1.47.0 + resolution: "oxlint@npm:1.47.0" dependencies: - "@oxlint/darwin-arm64": "npm:1.18.0" - "@oxlint/darwin-x64": "npm:1.18.0" - "@oxlint/linux-arm64-gnu": "npm:1.18.0" - "@oxlint/linux-arm64-musl": "npm:1.18.0" - "@oxlint/linux-x64-gnu": "npm:1.18.0" - "@oxlint/linux-x64-musl": "npm:1.18.0" - "@oxlint/win32-arm64": "npm:1.18.0" - "@oxlint/win32-x64": "npm:1.18.0" + "@oxlint/binding-android-arm-eabi": "npm:1.47.0" + "@oxlint/binding-android-arm64": "npm:1.47.0" + "@oxlint/binding-darwin-arm64": "npm:1.47.0" + "@oxlint/binding-darwin-x64": "npm:1.47.0" + "@oxlint/binding-freebsd-x64": "npm:1.47.0" + "@oxlint/binding-linux-arm-gnueabihf": "npm:1.47.0" + "@oxlint/binding-linux-arm-musleabihf": "npm:1.47.0" + "@oxlint/binding-linux-arm64-gnu": "npm:1.47.0" + "@oxlint/binding-linux-arm64-musl": "npm:1.47.0" + "@oxlint/binding-linux-ppc64-gnu": "npm:1.47.0" + "@oxlint/binding-linux-riscv64-gnu": "npm:1.47.0" + "@oxlint/binding-linux-riscv64-musl": "npm:1.47.0" + "@oxlint/binding-linux-s390x-gnu": "npm:1.47.0" + "@oxlint/binding-linux-x64-gnu": "npm:1.47.0" + "@oxlint/binding-linux-x64-musl": "npm:1.47.0" + "@oxlint/binding-openharmony-arm64": "npm:1.47.0" + "@oxlint/binding-win32-arm64-msvc": "npm:1.47.0" + "@oxlint/binding-win32-ia32-msvc": "npm:1.47.0" + "@oxlint/binding-win32-x64-msvc": "npm:1.47.0" peerDependencies: - oxlint-tsgolint: ">=0.2.0" + oxlint-tsgolint: ">=0.11.2" dependenciesMeta: - "@oxlint/darwin-arm64": + "@oxlint/binding-android-arm-eabi": optional: true - "@oxlint/darwin-x64": + "@oxlint/binding-android-arm64": optional: true - "@oxlint/linux-arm64-gnu": + "@oxlint/binding-darwin-arm64": optional: true - "@oxlint/linux-arm64-musl": + "@oxlint/binding-darwin-x64": optional: true - "@oxlint/linux-x64-gnu": + "@oxlint/binding-freebsd-x64": optional: true - "@oxlint/linux-x64-musl": + "@oxlint/binding-linux-arm-gnueabihf": optional: true - "@oxlint/win32-arm64": + "@oxlint/binding-linux-arm-musleabihf": optional: true - "@oxlint/win32-x64": + "@oxlint/binding-linux-arm64-gnu": + optional: true + "@oxlint/binding-linux-arm64-musl": + optional: true + "@oxlint/binding-linux-ppc64-gnu": + optional: true + "@oxlint/binding-linux-riscv64-gnu": + optional: true + "@oxlint/binding-linux-riscv64-musl": + optional: true + "@oxlint/binding-linux-s390x-gnu": + optional: true + "@oxlint/binding-linux-x64-gnu": + optional: true + "@oxlint/binding-linux-x64-musl": + optional: true + "@oxlint/binding-openharmony-arm64": + optional: true + "@oxlint/binding-win32-arm64-msvc": + optional: true + "@oxlint/binding-win32-ia32-msvc": + optional: true + "@oxlint/binding-win32-x64-msvc": optional: true peerDependenciesMeta: oxlint-tsgolint: optional: true bin: - oxc_language_server: bin/oxc_language_server oxlint: bin/oxlint - checksum: 10/79118edfc90df62011b467a273819f00977208e6aed3a98784e15707fb87612ddf609573fd8f438a75986eaf56768bc0de3f1f2b863c2572c191a0944aa6d619 + checksum: 10/c3bd7f11ecf52f8682ca026578a7e96f343b7b08a910978049cf835d0b033ff7624ad66c71fdcb93b55eb0d14a626ed037e77478d8f083bc415018290a6ccf7a languageName: node linkType: hard @@ -33630,14 +33797,14 @@ __metadata: languageName: node linkType: hard -"regjsparser@npm:^0.12.0": - version: 0.12.0 - resolution: "regjsparser@npm:0.12.0" +"regjsparser@npm:^0.13.0": + version: 0.13.0 + resolution: "regjsparser@npm:0.13.0" dependencies: - jsesc: "npm:~3.0.2" + jsesc: "npm:~3.1.0" bin: regjsparser: bin/parser - checksum: 10/c2d6506b3308679de5223a8916984198e0493649a67b477c66bdb875357e3785abbf3bedf7c5c2cf8967d3b3a7bdf08b7cbd39e65a70f9e1ffad584aecf5f06a + checksum: 10/eeaabd3454f59394cbb3bfeb15fd789e638040f37d0bee9071a9b0b85524ddc52b5f7aaaaa4847304c36fa37429e53d109c4dbf6b878cb5ffa4f4198c1042fb7 languageName: node linkType: hard @@ -33863,7 +34030,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8": +"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.8": version: 1.22.10 resolution: "resolve@npm:1.22.10" dependencies: @@ -33889,7 +34056,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": version: 1.22.10 resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" dependencies: @@ -34337,15 +34504,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.7.1": - version: 7.7.1 - resolution: "semver@npm:7.7.1" - bin: - semver: bin/semver.js - checksum: 10/4cfa1eb91ef3751e20fc52e47a935a0118d56d6f15a837ab814da0c150778ba2ca4f1a4d9068b33070ea4273629e615066664c2cfcd7c272caf7a8a0f6518b2c - languageName: node - linkType: hard - "semver@npm:7.7.2": version: 7.7.2 resolution: "semver@npm:7.7.2" @@ -34355,6 +34513,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:7.7.4, 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.4 + resolution: "semver@npm:7.7.4" + bin: + semver: bin/semver.js + checksum: 10/26bdc6d58b29528f4142d29afb8526bc335f4fc04c4a10f2b98b217f277a031c66736bf82d3d3bb354a2f6a3ae50f18fd62b053c4ac3f294a3d10a61f5075b75 + languageName: node + linkType: hard + "semver@npm:^6.0.0, semver@npm:^6.2.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -34364,15 +34531,6 @@ __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.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: - semver: bin/semver.js - checksum: 10/8dbc3168e057a38fc322af909c7f5617483c50caddba135439ff09a754b20bdd6482a5123ff543dad4affa488ecf46ec5fb56d61312ad20bb140199b88dfaea9 - languageName: node - linkType: hard - "send@npm:^1.1.0, send@npm:^1.2.0": version: 1.2.0 resolution: "send@npm:1.2.0" @@ -35269,10 +35427,10 @@ __metadata: languageName: node linkType: hard -"stable-hash@npm:^0.0.5": - version: 0.0.5 - resolution: "stable-hash@npm:0.0.5" - checksum: 10/9222ea2c558e37c4a576cb4e406966b9e6aa05b93f5c4f09ef4aaabe3577439b9b8fbff407b16840b63e2ae83de74290c7b1c2da7360d571e480e46a4aec0a56 +"stable-hash-x@npm:^0.2.0": + version: 0.2.0 + resolution: "stable-hash-x@npm:0.2.0" + checksum: 10/136f05d0e4d441876012b423541476ff5b695c93b56d1959560be858b9e324ea6de6c16ecbd735a040ee8396427dd867bed0bf90b2cdb1fc422566747b91a0e5 languageName: node linkType: hard @@ -35588,12 +35746,10 @@ __metadata: languageName: node linkType: hard -"strip-indent@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-indent@npm:4.0.0" - dependencies: - min-indent: "npm:^1.0.1" - checksum: 10/06cbcd93da721c46bc13caeb1c00af93a9b18146a1c95927672d2decab6a25ad83662772417cea9317a2507fb143253ecc23c4415b64f5828cef9b638a744598 +"strip-indent@npm:^4.0.0, strip-indent@npm:^4.1.1": + version: 4.1.1 + resolution: "strip-indent@npm:4.1.1" + checksum: 10/d322bfdc59855006791a4aebe2a66e0892eab7004a5c064d74b86a0c6ecff2818974c9a5eda54b16d8af6aadbc90a6c02635ffcbec11ab33dd8979b1a6346fc0 languageName: node linkType: hard @@ -36194,7 +36350,7 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.13, tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.15": +"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.15": version: 0.2.15 resolution: "tinyglobby@npm:0.2.15" dependencies: @@ -36433,12 +36589,12 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^2.0.1, ts-api-utils@npm:^2.1.0": - version: 2.1.0 - resolution: "ts-api-utils@npm:2.1.0" +"ts-api-utils@npm:^2.0.1, ts-api-utils@npm:^2.4.0": + version: 2.4.0 + resolution: "ts-api-utils@npm:2.4.0" peerDependencies: typescript: ">=4.8.4" - checksum: 10/02e55b49d9617c6eebf8aadfa08d3ca03ca0cd2f0586ad34117fdfc7aa3cd25d95051843fde9df86665ad907f99baed179e7a117b11021417f379e4d2614eacd + checksum: 10/d6b2b3b6caad8d2f4ddc0c3785d22bb1a6041773335a1c71d73a5d67d11d993763fe8e4faefc4a4d03bb42b26c6126bbcf2e34826baed1def5369d0ebad358fa languageName: node linkType: hard @@ -36686,27 +36842,28 @@ __metadata: languageName: node linkType: hard -"typescript-eslint@npm:^8.18.0": - version: 8.32.1 - resolution: "typescript-eslint@npm:8.32.1" +"typescript-eslint@npm:^8.55.0": + version: 8.55.0 + resolution: "typescript-eslint@npm:8.55.0" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.32.1" - "@typescript-eslint/parser": "npm:8.32.1" - "@typescript-eslint/utils": "npm:8.32.1" + "@typescript-eslint/eslint-plugin": "npm:8.55.0" + "@typescript-eslint/parser": "npm:8.55.0" + "@typescript-eslint/typescript-estree": "npm:8.55.0" + "@typescript-eslint/utils": "npm:8.55.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10/4a042815f73825b510954579938a26c8664c2134e9663b0ac6f771f5f7338d4d41d78e5ded685ab42c1c6410117d955bac2c01fcc7e8ad3ef06c5e7dc2c95a7d + typescript: ">=4.8.4 <6.0.0" + checksum: 10/60f8c9a57a5ce2b1ce74a4287ce03171440a911c451755a5c8192a2f0770e89b629836e6ab455ffbf165e64c18e254926156627ff314bcd8e4fd3d7badfc40be languageName: node linkType: hard -"typescript@npm:^5, typescript@npm:^5.3.3, typescript@npm:^5.5.4, typescript@npm:^5.7.2": - version: 5.8.3 - resolution: "typescript@npm:5.8.3" +"typescript@npm:>=5, typescript@npm:^5.3.3, typescript@npm:^5.5.4, typescript@npm:^5.7.2": + version: 5.9.3 + resolution: "typescript@npm:5.9.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/65c40944c51b513b0172c6710ee62e951b70af6f75d5a5da745cb7fab132c09ae27ffdf7838996e3ed603bb015dadd099006658046941bd0ba30340cc563ae92 + checksum: 10/c089d9d3da2729fd4ac517f9b0e0485914c4b3c26f80dc0cffcb5de1719a17951e92425d55db59515c1a7ddab65808466debb864d0d56dcf43f27007d0709594 languageName: node linkType: hard @@ -36720,13 +36877,13 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5#optional!builtin, typescript@patch:typescript@npm%3A^5.3.3#optional!builtin, typescript@patch:typescript@npm%3A^5.5.4#optional!builtin, typescript@patch:typescript@npm%3A^5.7.2#optional!builtin": - version: 5.8.3 - resolution: "typescript@patch:typescript@npm%3A5.8.3#optional!builtin::version=5.8.3&hash=5786d5" +"typescript@patch:typescript@npm%3A>=5#optional!builtin, typescript@patch:typescript@npm%3A^5.3.3#optional!builtin, typescript@patch:typescript@npm%3A^5.5.4#optional!builtin, typescript@patch:typescript@npm%3A^5.7.2#optional!builtin": + version: 5.9.3 + resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/b9b1e73dabac5dc730c041325dbd9c99467c1b0d239f1b74ec3b90d831384af3e2ba973946232df670519147eb51a2c20f6f96163cea2b359f03de1e2091cc4f + checksum: 10/696e1b017bc2635f4e0c94eb4435357701008e2f272f553d06e35b494b8ddc60aa221145e286c28ace0c89ee32827a28c2040e3a69bdc108b1a5dc8fb40b72e3 languageName: node linkType: hard @@ -37038,29 +37195,35 @@ __metadata: languageName: node linkType: hard -"unrs-resolver@npm:^1.6.3, unrs-resolver@npm:^1.7.0": - version: 1.7.2 - resolution: "unrs-resolver@npm:1.7.2" +"unrs-resolver@npm:^1.7.11, unrs-resolver@npm:^1.9.2": + version: 1.11.1 + resolution: "unrs-resolver@npm:1.11.1" dependencies: - "@unrs/resolver-binding-darwin-arm64": "npm:1.7.2" - "@unrs/resolver-binding-darwin-x64": "npm:1.7.2" - "@unrs/resolver-binding-freebsd-x64": "npm:1.7.2" - "@unrs/resolver-binding-linux-arm-gnueabihf": "npm:1.7.2" - "@unrs/resolver-binding-linux-arm-musleabihf": "npm:1.7.2" - "@unrs/resolver-binding-linux-arm64-gnu": "npm:1.7.2" - "@unrs/resolver-binding-linux-arm64-musl": "npm:1.7.2" - "@unrs/resolver-binding-linux-ppc64-gnu": "npm:1.7.2" - "@unrs/resolver-binding-linux-riscv64-gnu": "npm:1.7.2" - "@unrs/resolver-binding-linux-riscv64-musl": "npm:1.7.2" - "@unrs/resolver-binding-linux-s390x-gnu": "npm:1.7.2" - "@unrs/resolver-binding-linux-x64-gnu": "npm:1.7.2" - "@unrs/resolver-binding-linux-x64-musl": "npm:1.7.2" - "@unrs/resolver-binding-wasm32-wasi": "npm:1.7.2" - "@unrs/resolver-binding-win32-arm64-msvc": "npm:1.7.2" - "@unrs/resolver-binding-win32-ia32-msvc": "npm:1.7.2" - "@unrs/resolver-binding-win32-x64-msvc": "npm:1.7.2" - napi-postinstall: "npm:^0.2.2" + "@unrs/resolver-binding-android-arm-eabi": "npm:1.11.1" + "@unrs/resolver-binding-android-arm64": "npm:1.11.1" + "@unrs/resolver-binding-darwin-arm64": "npm:1.11.1" + "@unrs/resolver-binding-darwin-x64": "npm:1.11.1" + "@unrs/resolver-binding-freebsd-x64": "npm:1.11.1" + "@unrs/resolver-binding-linux-arm-gnueabihf": "npm:1.11.1" + "@unrs/resolver-binding-linux-arm-musleabihf": "npm:1.11.1" + "@unrs/resolver-binding-linux-arm64-gnu": "npm:1.11.1" + "@unrs/resolver-binding-linux-arm64-musl": "npm:1.11.1" + "@unrs/resolver-binding-linux-ppc64-gnu": "npm:1.11.1" + "@unrs/resolver-binding-linux-riscv64-gnu": "npm:1.11.1" + "@unrs/resolver-binding-linux-riscv64-musl": "npm:1.11.1" + "@unrs/resolver-binding-linux-s390x-gnu": "npm:1.11.1" + "@unrs/resolver-binding-linux-x64-gnu": "npm:1.11.1" + "@unrs/resolver-binding-linux-x64-musl": "npm:1.11.1" + "@unrs/resolver-binding-wasm32-wasi": "npm:1.11.1" + "@unrs/resolver-binding-win32-arm64-msvc": "npm:1.11.1" + "@unrs/resolver-binding-win32-ia32-msvc": "npm:1.11.1" + "@unrs/resolver-binding-win32-x64-msvc": "npm:1.11.1" + napi-postinstall: "npm:^0.3.0" dependenciesMeta: + "@unrs/resolver-binding-android-arm-eabi": + optional: true + "@unrs/resolver-binding-android-arm64": + optional: true "@unrs/resolver-binding-darwin-arm64": optional: true "@unrs/resolver-binding-darwin-x64": @@ -37095,7 +37258,7 @@ __metadata: optional: true "@unrs/resolver-binding-win32-x64-msvc": optional: true - checksum: 10/58daa4c659dec7d4ae7b9731d541b9faf1b702dec3d612f260b546dfd78de81c87ad3cd0eb362e364f9e86ccb3a6a42d05dc07936c39e82af58f5536c9b7de1c + checksum: 10/4de653508cbaae47883a896bd5cdfef0e5e87b428d62620d16fd35cd534beaebf08ebf0cf2f8b4922aa947b2fe745180facf6cc3f39ba364f7ce0f974cb06a70 languageName: node linkType: hard @@ -38429,6 +38592,15 @@ __metadata: languageName: node linkType: hard +"zod-validation-error@npm:^3.5.0 || ^4.0.0": + version: 4.0.2 + resolution: "zod-validation-error@npm:4.0.2" + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + checksum: 10/5e35ca8ebb4602dcb526e122d7e9fca695c4a479bd97535f3400a732d49160f24f7213a9ed64986fc9dc3a2e8a6c4e1241ec0c4d8a4e3e69ea91a0328ded2192 + languageName: node + linkType: hard + "zod@npm:^3.24.2, zod@npm:^3.25.76": version: 3.25.76 resolution: "zod@npm:3.25.76" @@ -38436,10 +38608,10 @@ __metadata: languageName: node linkType: hard -"zod@npm:^3.25 || ^4.0": - version: 4.1.13 - resolution: "zod@npm:4.1.13" - checksum: 10/0679190318928f69fcb07751063719de232c663b13955fcdb55db59839569d39f3f29b955cb0cba7af0b724233f88c06b3e84c550397ad4e68f8088fa6799d88 +"zod@npm:^3.25 || ^4.0, zod@npm:^3.25.0 || ^4.0.0": + version: 4.3.6 + resolution: "zod@npm:4.3.6" + checksum: 10/25fc0f62e01b557b4644bf0b393bbaf47542ab30877c37837ea8caf314a8713d220c7d7fe51f68ffa72f0e1018ddfa34d96f1973d23033f5a2a5a9b6b9d9da01 languageName: node linkType: hard